diff options
author | David S. Miller <davem@davemloft.net> | 2010-02-14 20:45:59 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-02-14 20:45:59 -0500 |
commit | f6f223039c0d0683bdea1eabd35b309e10311a60 (patch) | |
tree | 890e07acf8c18ddc2994ebc0a0bdcdda38b0dcc6 /drivers/net/wireless/ath/ath9k | |
parent | b3b3f04fb587ecb61b5baa6c1c5f0e666fd12d73 (diff) | |
parent | 42c4568a4ace0adc27a9d6f02936e2047ba6fc7e (diff) |
Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
Diffstat (limited to 'drivers/net/wireless/ath/ath9k')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ath9k.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/beacon.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/init.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 25 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 7 |
6 files changed, 39 insertions, 16 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index 0ea340fd071..83c7ea4c007 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
@@ -267,6 +267,7 @@ void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, | |||
267 | u16 tid, u16 *ssn); | 267 | u16 tid, u16 *ssn); |
268 | void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); | 268 | void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); |
269 | void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); | 269 | void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); |
270 | void ath9k_enable_ps(struct ath_softc *sc); | ||
270 | 271 | ||
271 | /********/ | 272 | /********/ |
272 | /* VIFs */ | 273 | /* VIFs */ |
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c index 422454fe4ff..d088ebfe63a 100644 --- a/drivers/net/wireless/ath/ath9k/beacon.c +++ b/drivers/net/wireless/ath/ath9k/beacon.c | |||
@@ -577,6 +577,13 @@ static void ath_beacon_config_sta(struct ath_softc *sc, | |||
577 | u64 tsf; | 577 | u64 tsf; |
578 | int num_beacons, offset, dtim_dec_count, cfp_dec_count; | 578 | int num_beacons, offset, dtim_dec_count, cfp_dec_count; |
579 | 579 | ||
580 | /* No need to configure beacon if we are not associated */ | ||
581 | if (!common->curaid) { | ||
582 | ath_print(common, ATH_DBG_BEACON, | ||
583 | "STA is not yet associated..skipping beacon config\n"); | ||
584 | return; | ||
585 | } | ||
586 | |||
580 | memset(&bs, 0, sizeof(bs)); | 587 | memset(&bs, 0, sizeof(bs)); |
581 | intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; | 588 | intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; |
582 | 589 | ||
@@ -739,7 +746,6 @@ void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif) | |||
739 | enum nl80211_iftype iftype; | 746 | enum nl80211_iftype iftype; |
740 | 747 | ||
741 | /* Setup the beacon configuration parameters */ | 748 | /* Setup the beacon configuration parameters */ |
742 | |||
743 | if (vif) { | 749 | if (vif) { |
744 | struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; | 750 | struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; |
745 | 751 | ||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index f15fee76a4e..f00f5c744f4 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -1217,6 +1217,17 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah) | |||
1217 | /* As defined by IEEE 802.11-2007 17.3.8.6 */ | 1217 | /* As defined by IEEE 802.11-2007 17.3.8.6 */ |
1218 | slottime = ah->slottime + 3 * ah->coverage_class; | 1218 | slottime = ah->slottime + 3 * ah->coverage_class; |
1219 | acktimeout = slottime + sifstime; | 1219 | acktimeout = slottime + sifstime; |
1220 | |||
1221 | /* | ||
1222 | * Workaround for early ACK timeouts, add an offset to match the | ||
1223 | * initval's 64us ack timeout value. | ||
1224 | * This was initially only meant to work around an issue with delayed | ||
1225 | * BA frames in some implementations, but it has been found to fix ACK | ||
1226 | * timeout issues in other cases as well. | ||
1227 | */ | ||
1228 | if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ) | ||
1229 | acktimeout += 64 - sifstime - ah->slottime; | ||
1230 | |||
1220 | ath9k_hw_setslottime(ah, slottime); | 1231 | ath9k_hw_setslottime(ah, slottime); |
1221 | ath9k_hw_set_ack_timeout(ah, acktimeout); | 1232 | ath9k_hw_set_ack_timeout(ah, acktimeout); |
1222 | ath9k_hw_set_cts_timeout(ah, acktimeout); | 1233 | ath9k_hw_set_cts_timeout(ah, acktimeout); |
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index 4b5e5484868..623c2f88498 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
@@ -622,7 +622,8 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
622 | IEEE80211_HW_SIGNAL_DBM | | 622 | IEEE80211_HW_SIGNAL_DBM | |
623 | IEEE80211_HW_SUPPORTS_PS | | 623 | IEEE80211_HW_SUPPORTS_PS | |
624 | IEEE80211_HW_PS_NULLFUNC_STACK | | 624 | IEEE80211_HW_PS_NULLFUNC_STACK | |
625 | IEEE80211_HW_SPECTRUM_MGMT; | 625 | IEEE80211_HW_SPECTRUM_MGMT | |
626 | IEEE80211_HW_REPORTS_TX_ACK_STATUS; | ||
626 | 627 | ||
627 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) | 628 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) |
628 | hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION; | 629 | hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION; |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 6796d5cdc29..9c8f925c209 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -809,6 +809,7 @@ static void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf | |||
809 | 809 | ||
810 | clear_bit(key->hw_key_idx + 64, common->keymap); | 810 | clear_bit(key->hw_key_idx + 64, common->keymap); |
811 | if (common->splitmic) { | 811 | if (common->splitmic) { |
812 | ath9k_hw_keyreset(ah, key->hw_key_idx + 32); | ||
812 | clear_bit(key->hw_key_idx + 32, common->keymap); | 813 | clear_bit(key->hw_key_idx + 32, common->keymap); |
813 | clear_bit(key->hw_key_idx + 64 + 32, common->keymap); | 814 | clear_bit(key->hw_key_idx + 64 + 32, common->keymap); |
814 | } | 815 | } |
@@ -1492,6 +1493,19 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw, | |||
1492 | mutex_unlock(&sc->mutex); | 1493 | mutex_unlock(&sc->mutex); |
1493 | } | 1494 | } |
1494 | 1495 | ||
1496 | void ath9k_enable_ps(struct ath_softc *sc) | ||
1497 | { | ||
1498 | sc->ps_enabled = true; | ||
1499 | if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) { | ||
1500 | if ((sc->imask & ATH9K_INT_TIM_TIMER) == 0) { | ||
1501 | sc->imask |= ATH9K_INT_TIM_TIMER; | ||
1502 | ath9k_hw_set_interrupts(sc->sc_ah, | ||
1503 | sc->imask); | ||
1504 | } | ||
1505 | } | ||
1506 | ath9k_hw_setrxabort(sc->sc_ah, 1); | ||
1507 | } | ||
1508 | |||
1495 | static int ath9k_config(struct ieee80211_hw *hw, u32 changed) | 1509 | static int ath9k_config(struct ieee80211_hw *hw, u32 changed) |
1496 | { | 1510 | { |
1497 | struct ath_wiphy *aphy = hw->priv; | 1511 | struct ath_wiphy *aphy = hw->priv; |
@@ -1546,22 +1560,13 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed) | |||
1546 | if (changed & IEEE80211_CONF_CHANGE_PS) { | 1560 | if (changed & IEEE80211_CONF_CHANGE_PS) { |
1547 | if (conf->flags & IEEE80211_CONF_PS) { | 1561 | if (conf->flags & IEEE80211_CONF_PS) { |
1548 | sc->ps_flags |= PS_ENABLED; | 1562 | sc->ps_flags |= PS_ENABLED; |
1549 | if (!(ah->caps.hw_caps & | ||
1550 | ATH9K_HW_CAP_AUTOSLEEP)) { | ||
1551 | if ((sc->imask & ATH9K_INT_TIM_TIMER) == 0) { | ||
1552 | sc->imask |= ATH9K_INT_TIM_TIMER; | ||
1553 | ath9k_hw_set_interrupts(sc->sc_ah, | ||
1554 | sc->imask); | ||
1555 | } | ||
1556 | } | ||
1557 | /* | 1563 | /* |
1558 | * At this point we know hardware has received an ACK | 1564 | * At this point we know hardware has received an ACK |
1559 | * of a previously sent null data frame. | 1565 | * of a previously sent null data frame. |
1560 | */ | 1566 | */ |
1561 | if ((sc->ps_flags & PS_NULLFUNC_COMPLETED)) { | 1567 | if ((sc->ps_flags & PS_NULLFUNC_COMPLETED)) { |
1562 | sc->ps_flags &= ~PS_NULLFUNC_COMPLETED; | 1568 | sc->ps_flags &= ~PS_NULLFUNC_COMPLETED; |
1563 | sc->ps_enabled = true; | 1569 | ath9k_enable_ps(sc); |
1564 | ath9k_hw_setrxabort(sc->sc_ah, 1); | ||
1565 | } | 1570 | } |
1566 | } else { | 1571 | } else { |
1567 | sc->ps_enabled = false; | 1572 | sc->ps_enabled = false; |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 3c790a4f38f..f5cbbcb9a4a 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -2048,10 +2048,9 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq) | |||
2048 | */ | 2048 | */ |
2049 | if (bf->bf_isnullfunc && | 2049 | if (bf->bf_isnullfunc && |
2050 | (ds->ds_txstat.ts_status & ATH9K_TX_ACKED)) { | 2050 | (ds->ds_txstat.ts_status & ATH9K_TX_ACKED)) { |
2051 | if ((sc->ps_flags & PS_ENABLED)) { | 2051 | if ((sc->ps_flags & PS_ENABLED)) |
2052 | sc->ps_enabled = true; | 2052 | ath9k_enable_ps(sc); |
2053 | ath9k_hw_setrxabort(sc->sc_ah, 1); | 2053 | else |
2054 | } else | ||
2055 | sc->ps_flags |= PS_NULLFUNC_COMPLETED; | 2054 | sc->ps_flags |= PS_NULLFUNC_COMPLETED; |
2056 | } | 2055 | } |
2057 | 2056 | ||