+static void wl1251_convert_filters(struct wl1251 *wl,
+ unsigned int mac80211_filters)
+{
+ wl->rx_config = WL1251_DEFAULT_RX_CONFIG;
+ wl->rx_filter = WL1251_DEFAULT_RX_FILTER;
+
+ if (mac80211_filters & FIF_PROMISC_IN_BSS) {
+ wl->rx_config |= CFG_BSSID_FILTER_EN;
+ wl->rx_config &= ~CFG_UNI_FILTER_EN;
+ }
+ if (mac80211_filters & FIF_ALLMULTI)
+ /*
+ * CFG_MC_FILTER_EN in rx_config needs to be 0 to receive
+ * all multicast frames
+ */
+ wl->rx_config &= ~CFG_MC_FILTER_EN;
+ if (mac80211_filters & FIF_FCSFAIL)
+ wl->rx_filter |= CFG_RX_FCS_ERROR;
+ if (mac80211_filters & FIF_BCN_PRBRESP_PROMISC) {
+ wl->rx_config &= ~CFG_BSSID_FILTER_EN;
+ wl->rx_config &= ~CFG_SSID_FILTER_EN;
+ }
+ if (mac80211_filters & FIF_CONTROL)
+ wl->rx_filter |= CFG_RX_CTL_EN;
+ if (mac80211_filters & FIF_OTHER_BSS)
+ wl->rx_config &= ~CFG_BSSID_FILTER_EN;
+ if (mac80211_filters & FIF_PROBE_REQ)
+ wl->rx_filter |= CFG_RX_PREQ_EN;
+
+ /*
+ * If we have no associated BSSID, the filter must be disabled
+ * or else association will break
+ */
+ if (is_zero_ether_addr(wl->bssid))
+ wl->rx_config &= ~CFG_BSSID_FILTER_EN;
+
+ wl1251_debug(DEBUG_FILTERS, "rx_config %04x, rx_filter %04x",
+ wl->rx_config, wl->rx_filter);
+}
+