diff options
author | David S. Miller <davem@davemloft.net> | 2010-02-26 02:26:21 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-02-26 02:26:21 -0500 |
commit | 19bc291c99f018bd4f2c38bbf69144086dca903f (patch) | |
tree | 9d3cf9bc0c5a78e363dc0547da8bcd1e7c394265 /drivers/net/wireless/ath | |
parent | 04488734806948624dabc4514f96f14cd75b9a50 (diff) | |
parent | 4a6967b88af02eebeedfbb91bc09160750225bb5 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
Conflicts:
drivers/net/wireless/iwlwifi/iwl-core.h
drivers/net/wireless/rt2x00/rt2800pci.c
Diffstat (limited to 'drivers/net/wireless/ath')
-rw-r--r-- | drivers/net/wireless/ath/ar9170/main.c | 70 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/beacon.c | 19 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/main.c | 35 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/rc.c | 15 |
4 files changed, 71 insertions, 68 deletions
diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c index 91797cb6e0e8..8a964f130367 100644 --- a/drivers/net/wireless/ath/ar9170/main.c +++ b/drivers/net/wireless/ath/ar9170/main.c | |||
@@ -2329,54 +2329,55 @@ out: | |||
2329 | return err; | 2329 | return err; |
2330 | } | 2330 | } |
2331 | 2331 | ||
2332 | static void ar9170_sta_notify(struct ieee80211_hw *hw, | 2332 | static int ar9170_sta_add(struct ieee80211_hw *hw, |
2333 | struct ieee80211_vif *vif, | 2333 | struct ieee80211_vif *vif, |
2334 | enum sta_notify_cmd cmd, | 2334 | struct ieee80211_sta *sta) |
2335 | struct ieee80211_sta *sta) | ||
2336 | { | 2335 | { |
2337 | struct ar9170 *ar = hw->priv; | 2336 | struct ar9170 *ar = hw->priv; |
2338 | struct ar9170_sta_info *sta_info = (void *) sta->drv_priv; | 2337 | struct ar9170_sta_info *sta_info = (void *) sta->drv_priv; |
2339 | unsigned int i; | 2338 | unsigned int i; |
2340 | 2339 | ||
2341 | switch (cmd) { | 2340 | memset(sta_info, 0, sizeof(*sta_info)); |
2342 | case STA_NOTIFY_ADD: | ||
2343 | memset(sta_info, 0, sizeof(*sta_info)); | ||
2344 | 2341 | ||
2345 | if (!sta->ht_cap.ht_supported) | 2342 | if (!sta->ht_cap.ht_supported) |
2346 | break; | 2343 | return 0; |
2347 | 2344 | ||
2348 | if (sta->ht_cap.ampdu_density > ar->global_ampdu_density) | 2345 | if (sta->ht_cap.ampdu_density > ar->global_ampdu_density) |
2349 | ar->global_ampdu_density = sta->ht_cap.ampdu_density; | 2346 | ar->global_ampdu_density = sta->ht_cap.ampdu_density; |
2350 | 2347 | ||
2351 | if (sta->ht_cap.ampdu_factor < ar->global_ampdu_factor) | 2348 | if (sta->ht_cap.ampdu_factor < ar->global_ampdu_factor) |
2352 | ar->global_ampdu_factor = sta->ht_cap.ampdu_factor; | 2349 | ar->global_ampdu_factor = sta->ht_cap.ampdu_factor; |
2353 | 2350 | ||
2354 | for (i = 0; i < AR9170_NUM_TID; i++) { | 2351 | for (i = 0; i < AR9170_NUM_TID; i++) { |
2355 | sta_info->agg[i].state = AR9170_TID_STATE_SHUTDOWN; | 2352 | sta_info->agg[i].state = AR9170_TID_STATE_SHUTDOWN; |
2356 | sta_info->agg[i].active = false; | 2353 | sta_info->agg[i].active = false; |
2357 | sta_info->agg[i].ssn = 0; | 2354 | sta_info->agg[i].ssn = 0; |
2358 | sta_info->agg[i].tid = i; | 2355 | sta_info->agg[i].tid = i; |
2359 | INIT_LIST_HEAD(&sta_info->agg[i].list); | 2356 | INIT_LIST_HEAD(&sta_info->agg[i].list); |
2360 | skb_queue_head_init(&sta_info->agg[i].queue); | 2357 | skb_queue_head_init(&sta_info->agg[i].queue); |
2361 | } | 2358 | } |
2362 | 2359 | ||
2363 | sta_info->ampdu_max_len = 1 << (3 + sta->ht_cap.ampdu_factor); | 2360 | sta_info->ampdu_max_len = 1 << (3 + sta->ht_cap.ampdu_factor); |
2364 | break; | ||
2365 | 2361 | ||
2366 | case STA_NOTIFY_REMOVE: | 2362 | return 0; |
2367 | if (!sta->ht_cap.ht_supported) | 2363 | } |
2368 | break; | ||
2369 | 2364 | ||
2370 | for (i = 0; i < AR9170_NUM_TID; i++) { | 2365 | static int ar9170_sta_remove(struct ieee80211_hw *hw, |
2371 | sta_info->agg[i].state = AR9170_TID_STATE_INVALID; | 2366 | struct ieee80211_vif *vif, |
2372 | skb_queue_purge(&sta_info->agg[i].queue); | 2367 | struct ieee80211_sta *sta) |
2373 | } | 2368 | { |
2369 | struct ar9170_sta_info *sta_info = (void *) sta->drv_priv; | ||
2370 | unsigned int i; | ||
2374 | 2371 | ||
2375 | break; | 2372 | if (!sta->ht_cap.ht_supported) |
2373 | return 0; | ||
2376 | 2374 | ||
2377 | default: | 2375 | for (i = 0; i < AR9170_NUM_TID; i++) { |
2378 | break; | 2376 | sta_info->agg[i].state = AR9170_TID_STATE_INVALID; |
2377 | skb_queue_purge(&sta_info->agg[i].queue); | ||
2379 | } | 2378 | } |
2379 | |||
2380 | return 0; | ||
2380 | } | 2381 | } |
2381 | 2382 | ||
2382 | static int ar9170_get_stats(struct ieee80211_hw *hw, | 2383 | static int ar9170_get_stats(struct ieee80211_hw *hw, |
@@ -2495,7 +2496,8 @@ static const struct ieee80211_ops ar9170_ops = { | |||
2495 | .bss_info_changed = ar9170_op_bss_info_changed, | 2496 | .bss_info_changed = ar9170_op_bss_info_changed, |
2496 | .get_tsf = ar9170_op_get_tsf, | 2497 | .get_tsf = ar9170_op_get_tsf, |
2497 | .set_key = ar9170_set_key, | 2498 | .set_key = ar9170_set_key, |
2498 | .sta_notify = ar9170_sta_notify, | 2499 | .sta_add = ar9170_sta_add, |
2500 | .sta_remove = ar9170_sta_remove, | ||
2499 | .get_stats = ar9170_get_stats, | 2501 | .get_stats = ar9170_get_stats, |
2500 | .ampdu_action = ar9170_ampdu_action, | 2502 | .ampdu_action = ar9170_ampdu_action, |
2501 | }; | 2503 | }; |
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c index d088ebfe63a6..b4a31a43a62c 100644 --- a/drivers/net/wireless/ath/ath9k/beacon.c +++ b/drivers/net/wireless/ath/ath9k/beacon.c | |||
@@ -62,7 +62,7 @@ int ath_beaconq_config(struct ath_softc *sc) | |||
62 | * Beacons are always sent out at the lowest rate, and are not retried. | 62 | * Beacons are always sent out at the lowest rate, and are not retried. |
63 | */ | 63 | */ |
64 | static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp, | 64 | static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp, |
65 | struct ath_buf *bf) | 65 | struct ath_buf *bf, int rateidx) |
66 | { | 66 | { |
67 | struct sk_buff *skb = bf->bf_mpdu; | 67 | struct sk_buff *skb = bf->bf_mpdu; |
68 | struct ath_hw *ah = sc->sc_ah; | 68 | struct ath_hw *ah = sc->sc_ah; |
@@ -96,9 +96,9 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp, | |||
96 | ds->ds_data = bf->bf_buf_addr; | 96 | ds->ds_data = bf->bf_buf_addr; |
97 | 97 | ||
98 | sband = &sc->sbands[common->hw->conf.channel->band]; | 98 | sband = &sc->sbands[common->hw->conf.channel->band]; |
99 | rate = sband->bitrates[0].hw_value; | 99 | rate = sband->bitrates[rateidx].hw_value; |
100 | if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) | 100 | if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) |
101 | rate |= sband->bitrates[0].hw_value_short; | 101 | rate |= sband->bitrates[rateidx].hw_value_short; |
102 | 102 | ||
103 | ath9k_hw_set11n_txdesc(ah, ds, skb->len + FCS_LEN, | 103 | ath9k_hw_set11n_txdesc(ah, ds, skb->len + FCS_LEN, |
104 | ATH9K_PKT_TYPE_BEACON, | 104 | ATH9K_PKT_TYPE_BEACON, |
@@ -206,7 +206,7 @@ static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw, | |||
206 | } | 206 | } |
207 | } | 207 | } |
208 | 208 | ||
209 | ath_beacon_setup(sc, avp, bf); | 209 | ath_beacon_setup(sc, avp, bf, info->control.rates[0].idx); |
210 | 210 | ||
211 | while (skb) { | 211 | while (skb) { |
212 | ath_tx_cabq(hw, skb); | 212 | ath_tx_cabq(hw, skb); |
@@ -237,7 +237,7 @@ static void ath_beacon_start_adhoc(struct ath_softc *sc, | |||
237 | bf = avp->av_bcbuf; | 237 | bf = avp->av_bcbuf; |
238 | skb = bf->bf_mpdu; | 238 | skb = bf->bf_mpdu; |
239 | 239 | ||
240 | ath_beacon_setup(sc, avp, bf); | 240 | ath_beacon_setup(sc, avp, bf, 0); |
241 | 241 | ||
242 | /* NB: caller is known to have already stopped tx dma */ | 242 | /* NB: caller is known to have already stopped tx dma */ |
243 | ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr); | 243 | ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr); |
@@ -526,16 +526,13 @@ static void ath_beacon_config_ap(struct ath_softc *sc, | |||
526 | { | 526 | { |
527 | u32 nexttbtt, intval; | 527 | u32 nexttbtt, intval; |
528 | 528 | ||
529 | /* Configure the timers only when the TSF has to be reset */ | ||
530 | |||
531 | if (!(sc->sc_flags & SC_OP_TSF_RESET)) | ||
532 | return; | ||
533 | |||
534 | /* NB: the beacon interval is kept internally in TU's */ | 529 | /* NB: the beacon interval is kept internally in TU's */ |
535 | intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; | 530 | intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; |
536 | intval /= ATH_BCBUF; /* for staggered beacons */ | 531 | intval /= ATH_BCBUF; /* for staggered beacons */ |
537 | nexttbtt = intval; | 532 | nexttbtt = intval; |
538 | intval |= ATH9K_BEACON_RESET_TSF; | 533 | |
534 | if (sc->sc_flags & SC_OP_TSF_RESET) | ||
535 | intval |= ATH9K_BEACON_RESET_TSF; | ||
539 | 536 | ||
540 | /* | 537 | /* |
541 | * In AP mode we enable the beacon timers and SWBA interrupts to | 538 | * In AP mode we enable the beacon timers and SWBA interrupts to |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 9c8f925c2093..67ca4e5a6017 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -1684,24 +1684,28 @@ static void ath9k_configure_filter(struct ieee80211_hw *hw, | |||
1684 | "Set HW RX filter: 0x%x\n", rfilt); | 1684 | "Set HW RX filter: 0x%x\n", rfilt); |
1685 | } | 1685 | } |
1686 | 1686 | ||
1687 | static void ath9k_sta_notify(struct ieee80211_hw *hw, | 1687 | static int ath9k_sta_add(struct ieee80211_hw *hw, |
1688 | struct ieee80211_vif *vif, | 1688 | struct ieee80211_vif *vif, |
1689 | enum sta_notify_cmd cmd, | 1689 | struct ieee80211_sta *sta) |
1690 | struct ieee80211_sta *sta) | ||
1691 | { | 1690 | { |
1692 | struct ath_wiphy *aphy = hw->priv; | 1691 | struct ath_wiphy *aphy = hw->priv; |
1693 | struct ath_softc *sc = aphy->sc; | 1692 | struct ath_softc *sc = aphy->sc; |
1694 | 1693 | ||
1695 | switch (cmd) { | 1694 | ath_node_attach(sc, sta); |
1696 | case STA_NOTIFY_ADD: | 1695 | |
1697 | ath_node_attach(sc, sta); | 1696 | return 0; |
1698 | break; | 1697 | } |
1699 | case STA_NOTIFY_REMOVE: | 1698 | |
1700 | ath_node_detach(sc, sta); | 1699 | static int ath9k_sta_remove(struct ieee80211_hw *hw, |
1701 | break; | 1700 | struct ieee80211_vif *vif, |
1702 | default: | 1701 | struct ieee80211_sta *sta) |
1703 | break; | 1702 | { |
1704 | } | 1703 | struct ath_wiphy *aphy = hw->priv; |
1704 | struct ath_softc *sc = aphy->sc; | ||
1705 | |||
1706 | ath_node_detach(sc, sta); | ||
1707 | |||
1708 | return 0; | ||
1705 | } | 1709 | } |
1706 | 1710 | ||
1707 | static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue, | 1711 | static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue, |
@@ -2045,7 +2049,8 @@ struct ieee80211_ops ath9k_ops = { | |||
2045 | .remove_interface = ath9k_remove_interface, | 2049 | .remove_interface = ath9k_remove_interface, |
2046 | .config = ath9k_config, | 2050 | .config = ath9k_config, |
2047 | .configure_filter = ath9k_configure_filter, | 2051 | .configure_filter = ath9k_configure_filter, |
2048 | .sta_notify = ath9k_sta_notify, | 2052 | .sta_add = ath9k_sta_add, |
2053 | .sta_remove = ath9k_sta_remove, | ||
2049 | .conf_tx = ath9k_conf_tx, | 2054 | .conf_tx = ath9k_conf_tx, |
2050 | .bss_info_changed = ath9k_bss_info_changed, | 2055 | .bss_info_changed = ath9k_bss_info_changed, |
2051 | .set_key = ath9k_set_key, | 2056 | .set_key = ath9k_set_key, |
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c index 11968843c773..ac34a055c713 100644 --- a/drivers/net/wireless/ath/ath9k/rc.c +++ b/drivers/net/wireless/ath/ath9k/rc.c | |||
@@ -668,7 +668,7 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta, | |||
668 | struct ieee80211_tx_rate *rates = tx_info->control.rates; | 668 | struct ieee80211_tx_rate *rates = tx_info->control.rates; |
669 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 669 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
670 | __le16 fc = hdr->frame_control; | 670 | __le16 fc = hdr->frame_control; |
671 | u8 try_per_rate, i = 0, rix, nrix; | 671 | u8 try_per_rate, i = 0, rix; |
672 | int is_probe = 0; | 672 | int is_probe = 0; |
673 | 673 | ||
674 | if (rate_control_send_low(sta, priv_sta, txrc)) | 674 | if (rate_control_send_low(sta, priv_sta, txrc)) |
@@ -688,26 +688,25 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta, | |||
688 | 688 | ||
689 | rate_table = sc->cur_rate_table; | 689 | rate_table = sc->cur_rate_table; |
690 | rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table, &is_probe); | 690 | rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table, &is_probe); |
691 | nrix = rix; | ||
692 | 691 | ||
693 | if (is_probe) { | 692 | if (is_probe) { |
694 | /* set one try for probe rates. For the | 693 | /* set one try for probe rates. For the |
695 | * probes don't enable rts */ | 694 | * probes don't enable rts */ |
696 | ath_rc_rate_set_series(rate_table, &rates[i++], txrc, | 695 | ath_rc_rate_set_series(rate_table, &rates[i++], txrc, |
697 | 1, nrix, 0); | 696 | 1, rix, 0); |
698 | 697 | ||
699 | /* Get the next tried/allowed rate. No RTS for the next series | 698 | /* Get the next tried/allowed rate. No RTS for the next series |
700 | * after the probe rate | 699 | * after the probe rate |
701 | */ | 700 | */ |
702 | ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &nrix); | 701 | ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix); |
703 | ath_rc_rate_set_series(rate_table, &rates[i++], txrc, | 702 | ath_rc_rate_set_series(rate_table, &rates[i++], txrc, |
704 | try_per_rate, nrix, 0); | 703 | try_per_rate, rix, 0); |
705 | 704 | ||
706 | tx_info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE; | 705 | tx_info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE; |
707 | } else { | 706 | } else { |
708 | /* Set the choosen rate. No RTS for first series entry. */ | 707 | /* Set the choosen rate. No RTS for first series entry. */ |
709 | ath_rc_rate_set_series(rate_table, &rates[i++], txrc, | 708 | ath_rc_rate_set_series(rate_table, &rates[i++], txrc, |
710 | try_per_rate, nrix, 0); | 709 | try_per_rate, rix, 0); |
711 | } | 710 | } |
712 | 711 | ||
713 | /* Fill in the other rates for multirate retry */ | 712 | /* Fill in the other rates for multirate retry */ |
@@ -716,10 +715,10 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta, | |||
716 | if (i + 1 == 4) | 715 | if (i + 1 == 4) |
717 | try_per_rate = 8; | 716 | try_per_rate = 8; |
718 | 717 | ||
719 | ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &nrix); | 718 | ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix); |
720 | /* All other rates in the series have RTS enabled */ | 719 | /* All other rates in the series have RTS enabled */ |
721 | ath_rc_rate_set_series(rate_table, &rates[i], txrc, | 720 | ath_rc_rate_set_series(rate_table, &rates[i], txrc, |
722 | try_per_rate, nrix, 1); | 721 | try_per_rate, rix, 1); |
723 | } | 722 | } |
724 | 723 | ||
725 | /* | 724 | /* |