ath9k: RX Filter cleanup
authorSujith <Sujith.Manoharan@atheros.com>
Mon, 11 Aug 2008 08:33:13 +0000 (14:03 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 29 Aug 2008 20:23:56 +0000 (16:23 -0400)
Signed-off-by: Sujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath9k/core.c
drivers/net/wireless/ath9k/core.h
drivers/net/wireless/ath9k/main.c
drivers/net/wireless/ath9k/recv.c

index 10f2729a8c4b2a7e62a76592023878f46c4e51ed..7f92d469ad0233ee9d10b4837dd40eabb53664bf 100644 (file)
@@ -21,9 +21,6 @@
 
 static int ath_outdoor;                /* enable outdoor use */
 
-static const u8 ath_bcast_mac[ETH_ALEN] =
-    { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
-
 static u32 ath_chainmask_sel_up_rssi_thres =
        ATH_CHAINMASK_SEL_UP_RSSI_THRES;
 static u32 ath_chainmask_sel_down_rssi_thres =
@@ -306,56 +303,6 @@ static int ath_stop(struct ath_softc *sc)
        return 0;
 }
 
-/*
- *  Start Scan
- *
- *  This function is called when starting a channel scan.  It will perform
- *  power save wakeup processing, set the filter for the scan, and get the
- *  chip ready to send broadcast packets out during the scan.
-*/
-
-void ath_scan_start(struct ath_softc *sc)
-{
-       struct ath_hal *ah = sc->sc_ah;
-       u32 rfilt;
-       u32 now = (u32) jiffies_to_msecs(get_timestamp());
-
-       sc->sc_scanning = 1;
-       rfilt = ath_calcrxfilter(sc);
-       ath9k_hw_setrxfilter(ah, rfilt);
-       ath9k_hw_write_associd(ah, ath_bcast_mac, 0);
-
-       /* Restore previous power management state. */
-
-       DPRINTF(sc, ATH_DBG_CONFIG, "%d.%03d | %s: RX filter 0x%x aid 0\n",
-               now / 1000, now % 1000, __func__, rfilt);
-}
-
-/*
- *  Scan End
- *
- *  This routine is called by the upper layer when the scan is completed.  This
- *  will set the filters back to normal operating mode, set the BSSID to the
- *  correct value, and restore the power save state.
-*/
-
-void ath_scan_end(struct ath_softc *sc)
-{
-       struct ath_hal *ah = sc->sc_ah;
-       u32 rfilt;
-       u32 now = (u32) jiffies_to_msecs(get_timestamp());
-
-       sc->sc_scanning = 0;
-       /* Request for a full reset due to rx packet filter changes */
-       sc->sc_full_reset = 1;
-       rfilt = ath_calcrxfilter(sc);
-       ath9k_hw_setrxfilter(ah, rfilt);
-       ath9k_hw_write_associd(ah, sc->sc_curbssid, sc->sc_curaid);
-
-       DPRINTF(sc, ATH_DBG_CONFIG, "%d.%03d | %s: RX filter 0x%x aid 0x%x\n",
-               now / 1000, now % 1000, __func__, rfilt, sc->sc_curaid);
-}
-
 /*
  * Set the current channel
  *
index ef8f63766d4346478767a4ddebcbd8a68245651c..07c958802b79c7edcfe6f03d2c51408bc82633f3 100644 (file)
@@ -95,6 +95,8 @@ static inline unsigned long get_timestamp(void)
        return ((jiffies / HZ) * 1000) + (jiffies % HZ) * (1000 / HZ);
 }
 
+static const u8 ath_bcast_mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+
 /*************/
 /* Debugging */
 /*************/
@@ -919,10 +921,9 @@ struct ath_softc {
        struct ath_rate_softc *sc_rc;   /* tx rate control support */
        u32 sc_intrstatus;
        enum ath9k_opmode sc_opmode;    /* current operating mode */
-
+       unsigned int rx_filter;
        u8 sc_invalid;                  /* being detached */
        u8 sc_beacons;                  /* beacons running */
-       u8 sc_scanning;                 /* scanning active */
        u8 sc_txaggr;                   /* enable 11n tx aggregation */
        u8 sc_rxaggr;                   /* enable 11n rx aggregation */
        u8 sc_update_chainmask;         /* change chain mask */
index 2888778040e43f28803bab54be3b82a8e8d02232..262fd7a8cd9aeacd6078d7fec8edfe09e73b5cac 100644 (file)
@@ -549,10 +549,6 @@ static int ath9k_config_interface(struct ieee80211_hw *hw,
                        /* Update ratectrl about the new state */
                        ath_rate_newstate(sc, avp);
 
-                       /* Set rx filter */
-                       rfilt = ath_calcrxfilter(sc);
-                       ath9k_hw_setrxfilter(sc->sc_ah, rfilt);
-
                        /* Set BSSID */
                        memcpy(sc->sc_curbssid, conf->bssid, ETH_ALEN);
                        sc->sc_curaid = 0;
@@ -636,8 +632,7 @@ static int ath9k_config_interface(struct ieee80211_hw *hw,
        FIF_BCN_PRBRESP_PROMISC |               \
        FIF_FCSFAIL)
 
-/* Accept unicast, bcast and mcast frames */
-
+/* FIXME: sc->sc_full_reset ? */
 static void ath9k_configure_filter(struct ieee80211_hw *hw,
                                   unsigned int changed_flags,
                                   unsigned int *total_flags,
@@ -645,16 +640,22 @@ static void ath9k_configure_filter(struct ieee80211_hw *hw,
                                   struct dev_mc_list *mclist)
 {
        struct ath_softc *sc = hw->priv;
+       u32 rfilt;
 
        changed_flags &= SUPPORTED_FILTERS;
        *total_flags &= SUPPORTED_FILTERS;
 
+       sc->rx_filter = *total_flags;
+       rfilt = ath_calcrxfilter(sc);
+       ath9k_hw_setrxfilter(sc->sc_ah, rfilt);
+
        if (changed_flags & FIF_BCN_PRBRESP_PROMISC) {
                if (*total_flags & FIF_BCN_PRBRESP_PROMISC)
-                       ath_scan_start(sc);
-               else
-                       ath_scan_end(sc);
+                       ath9k_hw_write_associd(sc->sc_ah, ath_bcast_mac, 0);
        }
+
+       DPRINTF(sc, ATH_DBG_CONFIG, "%s: Set HW RX filter: 0x%x\n",
+               __func__, sc->rx_filter);
 }
 
 static void ath9k_sta_notify(struct ieee80211_hw *hw,
index 838b656b9da4e861b13b0c0bf4ee41bcd470d881..a12584961d699896bd97e5fb9cf3b616b7868d05 100644 (file)
@@ -597,6 +597,7 @@ void ath_rx_cleanup(struct ath_softc *sc)
 u32 ath_calcrxfilter(struct ath_softc *sc)
 {
 #define        RX_FILTER_PRESERVE (ATH9K_RX_FILTER_PHYERR | ATH9K_RX_FILTER_PHYRADAR)
+
        u32 rfilt;
 
        rfilt = (ath9k_hw_getrxfilter(sc->sc_ah) & RX_FILTER_PRESERVE)
@@ -608,14 +609,17 @@ u32 ath_calcrxfilter(struct ath_softc *sc)
                rfilt |= ATH9K_RX_FILTER_PROBEREQ;
 
        /* Can't set HOSTAP into promiscous mode */
-       if (sc->sc_opmode == ATH9K_M_MONITOR) {
+       if (((sc->sc_opmode != ATH9K_M_HOSTAP) &&
+            (sc->rx_filter & FIF_PROMISC_IN_BSS)) ||
+           (sc->sc_opmode == ATH9K_M_MONITOR)) {
                rfilt |= ATH9K_RX_FILTER_PROM;
                /* ??? To prevent from sending ACK */
                rfilt &= ~ATH9K_RX_FILTER_UCAST;
        }
 
-       if (sc->sc_opmode == ATH9K_M_STA || sc->sc_opmode == ATH9K_M_IBSS ||
-           sc->sc_scanning)
+       if (((sc->sc_opmode == ATH9K_M_STA) &&
+            (sc->rx_filter & FIF_BCN_PRBRESP_PROMISC)) ||
+           (sc->sc_opmode == ATH9K_M_IBSS))
                rfilt |= ATH9K_RX_FILTER_BEACON;
 
        /* If in HOSTAP mode, want to enable reception of PSPOLL frames
@@ -623,6 +627,7 @@ u32 ath_calcrxfilter(struct ath_softc *sc)
        if (sc->sc_opmode == ATH9K_M_HOSTAP)
                rfilt |= (ATH9K_RX_FILTER_BEACON | ATH9K_RX_FILTER_PSPOLL);
        return rfilt;
+
 #undef RX_FILTER_PRESERVE
 }