wlcore: add RX filters driver state mgmt functions
authorEyal Shapira <eyal@wizery.com>
Wed, 14 Mar 2012 04:32:09 +0000 (06:32 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 15 May 2012 21:53:23 +0000 (17:53 -0400)
More prep work to support wowlan wakeup patterns.
Added some wrappers that also keep the current filters state
updated in the driver.

Signed-off-by: Eyal Shapira <eyal@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/ti/wlcore/rx.c
drivers/net/wireless/ti/wlcore/rx.h
drivers/net/wireless/ti/wlcore/wlcore.h

index 89bd938..1f1d948 100644 (file)
@@ -278,3 +278,39 @@ void wl12xx_rx(struct wl1271 *wl, struct wl_fw_status *status)
 
        wl12xx_rearm_rx_streaming(wl, active_hlids);
 }
+
+int wl1271_rx_filter_enable(struct wl1271 *wl,
+                           int index, bool enable,
+                           struct wl12xx_rx_filter *filter)
+{
+       int ret;
+
+       if (wl->rx_filter_enabled[index] == enable) {
+               wl1271_warning("Request to enable an already "
+                            "enabled rx filter %d", index);
+               return 0;
+       }
+
+       ret = wl1271_acx_set_rx_filter(wl, index, enable, filter);
+
+       if (ret) {
+               wl1271_error("Failed to %s rx data filter %d (err=%d)",
+                            enable ? "enable" : "disable", index, ret);
+               return ret;
+       }
+
+       wl->rx_filter_enabled[index] = enable;
+
+       return 0;
+}
+
+void wl1271_rx_filter_clear_all(struct wl1271 *wl)
+{
+       int i;
+
+       for (i = 0; i < WL1271_MAX_RX_FILTERS; i++) {
+               if (!wl->rx_filter_enabled[i])
+                       continue;
+               wl1271_rx_filter_enable(wl, i, 0, NULL);
+       }
+}
index 6e129e2..e9a162a 100644 (file)
@@ -138,5 +138,9 @@ struct wl1271_rx_descriptor {
 
 void wl12xx_rx(struct wl1271 *wl, struct wl_fw_status *status);
 u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band);
+int wl1271_rx_filter_enable(struct wl1271 *wl,
+                           int index, bool enable,
+                           struct wl12xx_rx_filter *filter);
+void wl1271_rx_filter_clear_all(struct wl1271 *wl);
 
 #endif
index 39f9fad..e4f7aa3 100644 (file)
@@ -349,6 +349,9 @@ struct wl1271 {
 
        /* size of the private FW status data */
        size_t fw_status_priv_len;
+
+       /* RX Data filter rule state - enabled/disabled */
+       bool rx_filter_enabled[WL1271_MAX_RX_FILTERS];
 };
 
 int __devinit wlcore_probe(struct wl1271 *wl, struct platform_device *pdev);