ath9k: Configure Power control register appropriately for h/w with 4k eeprom
[safe/jmp/linux-2.6] / drivers / net / wireless / ath9k / beacon.c
index 139bba7..18bda36 100644 (file)
 */
 static int ath_beaconq_config(struct ath_softc *sc)
 {
-       struct ath_hal *ah = sc->sc_ah;
+       struct ath_hw *ah = sc->sc_ah;
        struct ath9k_tx_queue_info qi;
 
        ath9k_hw_get_txq_props(ah, sc->beacon.beaconq, &qi);
-       if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) {
+       if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) {
                /* Always burst out beacon and CAB traffic. */
                qi.tqi_aifs = 1;
                qi.tqi_cwmin = 0;
@@ -66,7 +66,7 @@ static void ath_beacon_setup(struct ath_softc *sc,
                             struct ath_vif *avp, struct ath_buf *bf)
 {
        struct sk_buff *skb = (struct sk_buff *)bf->bf_mpdu;
-       struct ath_hal *ah = sc->sc_ah;
+       struct ath_hw *ah = sc->sc_ah;
        struct ath_desc *ds;
        struct ath9k_11n_rate_series series[4];
        struct ath_rate_table *rt;
@@ -82,8 +82,8 @@ static void ath_beacon_setup(struct ath_softc *sc,
 
        flags = ATH9K_TXDESC_NOACK;
 
-       if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_ADHOC &&
-           (ah->ah_caps.hw_caps & ATH9K_HW_CAP_VEOL)) {
+       if (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC &&
+           (ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) {
                ds->ds_link = bf->bf_daddr; /* self-linked */
                flags |= ATH9K_TXDESC_VEOL;
                /* Let hardware handle antenna switching. */
@@ -248,7 +248,7 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id)
 static void ath_beacon_start_adhoc(struct ath_softc *sc, int if_id)
 {
        struct ieee80211_vif *vif;
-       struct ath_hal *ah = sc->sc_ah;
+       struct ath_hw *ah = sc->sc_ah;
        struct ath_buf *bf;
        struct ath_vif *avp;
        struct sk_buff *skb;
@@ -276,7 +276,7 @@ static void ath_beacon_start_adhoc(struct ath_softc *sc, int if_id)
                sc->beacon.beaconq, ito64(bf->bf_daddr), bf->bf_desc);
 }
 
-int ath_beaconq_setup(struct ath_hal *ah)
+int ath_beaconq_setup(struct ath_hw *ah)
 {
        struct ath9k_tx_queue_info qi;
 
@@ -310,8 +310,8 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id)
                                                 struct ath_buf, list);
                list_del(&avp->av_bcbuf->list);
 
-               if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP ||
-                   !(sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_VEOL)) {
+               if (sc->sc_ah->opmode == NL80211_IFTYPE_AP ||
+                   !(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) {
                        int slot;
                        /*
                         * Assign the vif to a beacon xmit slot. As
@@ -444,7 +444,7 @@ void ath_beacon_return(struct ath_softc *sc, struct ath_vif *avp)
 void ath9k_beacon_tasklet(unsigned long data)
 {
        struct ath_softc *sc = (struct ath_softc *)data;
-       struct ath_hal *ah = sc->sc_ah;
+       struct ath_hw *ah = sc->sc_ah;
        struct ath_buf *bf = NULL;
        int slot, if_id;
        u32 bfaddr;
@@ -619,7 +619,7 @@ void ath9k_beacon_tasklet(unsigned long data)
 void ath_beacon_config(struct ath_softc *sc, int if_id)
 {
        struct ieee80211_vif *vif;
-       struct ath_hal *ah = sc->sc_ah;
+       struct ath_hw *ah = sc->sc_ah;
        struct ath_beacon_config conf;
        struct ath_vif *avp;
        enum nl80211_iftype opmode;
@@ -631,7 +631,7 @@ void ath_beacon_config(struct ath_softc *sc, int if_id)
                avp = (void *)vif->drv_priv;
                opmode = avp->av_opmode;
        } else {
-               opmode = sc->sc_ah->ah_opmode;
+               opmode = sc->sc_ah->opmode;
        }
 
        memset(&conf, 0, sizeof(struct ath_beacon_config));
@@ -647,7 +647,7 @@ void ath_beacon_config(struct ath_softc *sc, int if_id)
        nexttbtt = TSF_TO_TU(sc->beacon.bc_tstamp >> 32, sc->beacon.bc_tstamp);
 
        /* XXX conditionalize multi-bss support? */
-       if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) {
+       if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) {
                /*
                 * For multi-bss ap support beacons are either staggered
                 * evenly over N slots or burst together.  For the former
@@ -670,7 +670,7 @@ void ath_beacon_config(struct ath_softc *sc, int if_id)
                nexttbtt, intval, conf.beacon_interval);
 
        /* Check for NL80211_IFTYPE_AP and sc_nostabeacons for WDS client */
-       if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_STATION) {
+       if (sc->sc_ah->opmode == NL80211_IFTYPE_STATION) {
                struct ath9k_beacon_state bs;
                u64 tsf;
                u32 tsftu;
@@ -753,6 +753,9 @@ void ath_beacon_config(struct ath_softc *sc, int if_id)
                if (bs.bs_sleepduration > bs.bs_dtimperiod)
                        bs.bs_sleepduration = bs.bs_dtimperiod;
 
+               /* TSF out of range threshold fixed at 1 second */
+               bs.bs_tsfoor_threshold = ATH9K_TSFOOR_THRESHOLD;
+
                DPRINTF(sc, ATH_DBG_BEACON,
                        "tsf %llu "
                        "tsf:tu %u "
@@ -787,9 +790,7 @@ void ath_beacon_config(struct ath_softc *sc, int if_id)
                u64 tsf;
                u32 tsftu;
                ath9k_hw_set_interrupts(ah, 0);
-               if (nexttbtt == intval)
-                       intval |= ATH9K_BEACON_RESET_TSF;
-               if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_ADHOC) {
+               if (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) {
                        /*
                         * Pull nexttbtt forward to reflect the current
                         * TSF
@@ -818,10 +819,13 @@ void ath_beacon_config(struct ath_softc *sc, int if_id)
                         * deal with things.
                         */
                        intval |= ATH9K_BEACON_ENA;
-                       if (!(ah->ah_caps.hw_caps & ATH9K_HW_CAP_VEOL))
+                       if (!(ah->caps.hw_caps & ATH9K_HW_CAP_VEOL))
                                sc->imask |= ATH9K_INT_SWBA;
                        ath_beaconq_config(sc);
-               } else if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) {
+               } else if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) {
+                       if (nexttbtt == intval)
+                               intval |= ATH9K_BEACON_RESET_TSF;
+
                        /*
                         * In AP mode we enable the beacon timers and
                         * SWBA interrupts to prepare beacon frames.
@@ -837,8 +841,8 @@ void ath_beacon_config(struct ath_softc *sc, int if_id)
                 * When using a self-linked beacon descriptor in
                 * ibss mode load it once here.
                 */
-               if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_ADHOC &&
-                   (ah->ah_caps.hw_caps & ATH9K_HW_CAP_VEOL))
+               if (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC &&
+                   (ah->caps.hw_caps & ATH9K_HW_CAP_VEOL))
                        ath_beacon_start_adhoc(sc, 0);
        }
 }