diff options
Diffstat (limited to 'drivers/net')
23 files changed, 367 insertions, 128 deletions
diff --git a/drivers/net/wireless/ath5k/ath5k.h b/drivers/net/wireless/ath5k/ath5k.h index 7134c40d6a69..53ea439aff48 100644 --- a/drivers/net/wireless/ath5k/ath5k.h +++ b/drivers/net/wireless/ath5k/ath5k.h | |||
@@ -431,7 +431,9 @@ struct ath5k_tx_status { | |||
431 | u16 ts_seqnum; | 431 | u16 ts_seqnum; |
432 | u16 ts_tstamp; | 432 | u16 ts_tstamp; |
433 | u8 ts_status; | 433 | u8 ts_status; |
434 | u8 ts_rate; | 434 | u8 ts_rate[4]; |
435 | u8 ts_retry[4]; | ||
436 | u8 ts_final_idx; | ||
435 | s8 ts_rssi; | 437 | s8 ts_rssi; |
436 | u8 ts_shortretry; | 438 | u8 ts_shortretry; |
437 | u8 ts_longretry; | 439 | u8 ts_longretry; |
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index c151588aa484..9b95c4049b31 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c | |||
@@ -541,6 +541,12 @@ ath5k_pci_probe(struct pci_dev *pdev, | |||
541 | goto err_irq; | 541 | goto err_irq; |
542 | } | 542 | } |
543 | 543 | ||
544 | /* set up multi-rate retry capabilities */ | ||
545 | if (sc->ah->ah_version == AR5K_AR5212) { | ||
546 | hw->max_altrates = 3; | ||
547 | hw->max_altrate_tries = 11; | ||
548 | } | ||
549 | |||
544 | /* Finish private driver data initialization */ | 550 | /* Finish private driver data initialization */ |
545 | ret = ath5k_attach(pdev, hw); | 551 | ret = ath5k_attach(pdev, hw); |
546 | if (ret) | 552 | if (ret) |
@@ -1173,7 +1179,9 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf) | |||
1173 | struct sk_buff *skb = bf->skb; | 1179 | struct sk_buff *skb = bf->skb; |
1174 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 1180 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1175 | unsigned int pktlen, flags, keyidx = AR5K_TXKEYIX_INVALID; | 1181 | unsigned int pktlen, flags, keyidx = AR5K_TXKEYIX_INVALID; |
1176 | int ret; | 1182 | struct ieee80211_rate *rate; |
1183 | unsigned int mrr_rate[3], mrr_tries[3]; | ||
1184 | int i, ret; | ||
1177 | 1185 | ||
1178 | flags = AR5K_TXDESC_INTREQ | AR5K_TXDESC_CLRDMASK; | 1186 | flags = AR5K_TXDESC_INTREQ | AR5K_TXDESC_CLRDMASK; |
1179 | 1187 | ||
@@ -1188,7 +1196,7 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf) | |||
1188 | 1196 | ||
1189 | if (info->control.hw_key) { | 1197 | if (info->control.hw_key) { |
1190 | keyidx = info->control.hw_key->hw_key_idx; | 1198 | keyidx = info->control.hw_key->hw_key_idx; |
1191 | pktlen += info->control.icv_len; | 1199 | pktlen += info->control.hw_key->icv_len; |
1192 | } | 1200 | } |
1193 | ret = ah->ah_setup_tx_desc(ah, ds, pktlen, | 1201 | ret = ah->ah_setup_tx_desc(ah, ds, pktlen, |
1194 | ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL, | 1202 | ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL, |
@@ -1198,6 +1206,22 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf) | |||
1198 | if (ret) | 1206 | if (ret) |
1199 | goto err_unmap; | 1207 | goto err_unmap; |
1200 | 1208 | ||
1209 | memset(mrr_rate, 0, sizeof(mrr_rate)); | ||
1210 | memset(mrr_tries, 0, sizeof(mrr_tries)); | ||
1211 | for (i = 0; i < 3; i++) { | ||
1212 | rate = ieee80211_get_alt_retry_rate(sc->hw, info, i); | ||
1213 | if (!rate) | ||
1214 | break; | ||
1215 | |||
1216 | mrr_rate[i] = rate->hw_value; | ||
1217 | mrr_tries[i] = info->control.retries[i].limit; | ||
1218 | } | ||
1219 | |||
1220 | ah->ah_setup_mrr_tx_desc(ah, ds, | ||
1221 | mrr_rate[0], mrr_tries[0], | ||
1222 | mrr_rate[1], mrr_tries[1], | ||
1223 | mrr_rate[2], mrr_tries[2]); | ||
1224 | |||
1201 | ds->ds_link = 0; | 1225 | ds->ds_link = 0; |
1202 | ds->ds_data = bf->skbaddr; | 1226 | ds->ds_data = bf->skbaddr; |
1203 | 1227 | ||
@@ -1814,7 +1838,7 @@ ath5k_tx_processq(struct ath5k_softc *sc, struct ath5k_txq *txq) | |||
1814 | struct ath5k_desc *ds; | 1838 | struct ath5k_desc *ds; |
1815 | struct sk_buff *skb; | 1839 | struct sk_buff *skb; |
1816 | struct ieee80211_tx_info *info; | 1840 | struct ieee80211_tx_info *info; |
1817 | int ret; | 1841 | int i, ret; |
1818 | 1842 | ||
1819 | spin_lock(&txq->lock); | 1843 | spin_lock(&txq->lock); |
1820 | list_for_each_entry_safe(bf, bf0, &txq->q, list) { | 1844 | list_for_each_entry_safe(bf, bf0, &txq->q, list) { |
@@ -1836,7 +1860,25 @@ ath5k_tx_processq(struct ath5k_softc *sc, struct ath5k_txq *txq) | |||
1836 | pci_unmap_single(sc->pdev, bf->skbaddr, skb->len, | 1860 | pci_unmap_single(sc->pdev, bf->skbaddr, skb->len, |
1837 | PCI_DMA_TODEVICE); | 1861 | PCI_DMA_TODEVICE); |
1838 | 1862 | ||
1839 | info->status.retry_count = ts.ts_shortretry + ts.ts_longretry / 6; | 1863 | memset(&info->status, 0, sizeof(info->status)); |
1864 | info->tx_rate_idx = ath5k_hw_to_driver_rix(sc, | ||
1865 | ts.ts_rate[ts.ts_final_idx]); | ||
1866 | info->status.retry_count = ts.ts_longretry; | ||
1867 | |||
1868 | for (i = 0; i < 4; i++) { | ||
1869 | struct ieee80211_tx_altrate *r = | ||
1870 | &info->status.retries[i]; | ||
1871 | |||
1872 | if (ts.ts_rate[i]) { | ||
1873 | r->rate_idx = ath5k_hw_to_driver_rix(sc, ts.ts_rate[i]); | ||
1874 | r->limit = ts.ts_retry[i]; | ||
1875 | } else { | ||
1876 | r->rate_idx = -1; | ||
1877 | r->limit = 0; | ||
1878 | } | ||
1879 | } | ||
1880 | |||
1881 | info->status.excessive_retries = 0; | ||
1840 | if (unlikely(ts.ts_status)) { | 1882 | if (unlikely(ts.ts_status)) { |
1841 | sc->ll_stats.dot11ACKFailureCount++; | 1883 | sc->ll_stats.dot11ACKFailureCount++; |
1842 | if (ts.ts_status & AR5K_TXERR_XRETRY) | 1884 | if (ts.ts_status & AR5K_TXERR_XRETRY) |
diff --git a/drivers/net/wireless/ath5k/desc.c b/drivers/net/wireless/ath5k/desc.c index d45b90a6e06c..dd1374052ba9 100644 --- a/drivers/net/wireless/ath5k/desc.c +++ b/drivers/net/wireless/ath5k/desc.c | |||
@@ -318,6 +318,15 @@ ath5k_hw_setup_mrr_tx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc, | |||
318 | return 0; | 318 | return 0; |
319 | } | 319 | } |
320 | 320 | ||
321 | /* no mrr support for cards older than 5212 */ | ||
322 | static int | ||
323 | ath5k_hw_setup_no_mrr(struct ath5k_hw *ah, struct ath5k_desc *desc, | ||
324 | unsigned int tx_rate1, u_int tx_tries1, u_int tx_rate2, | ||
325 | u_int tx_tries2, unsigned int tx_rate3, u_int tx_tries3) | ||
326 | { | ||
327 | return 0; | ||
328 | } | ||
329 | |||
321 | /* | 330 | /* |
322 | * Proccess the tx status descriptor on 5210/5211 | 331 | * Proccess the tx status descriptor on 5210/5211 |
323 | */ | 332 | */ |
@@ -352,8 +361,10 @@ static int ath5k_hw_proc_2word_tx_status(struct ath5k_hw *ah, | |||
352 | AR5K_DESC_TX_STATUS1_ACK_SIG_STRENGTH); | 361 | AR5K_DESC_TX_STATUS1_ACK_SIG_STRENGTH); |
353 | ts->ts_antenna = 1; | 362 | ts->ts_antenna = 1; |
354 | ts->ts_status = 0; | 363 | ts->ts_status = 0; |
355 | ts->ts_rate = AR5K_REG_MS(tx_ctl->tx_control_0, | 364 | ts->ts_rate[0] = AR5K_REG_MS(tx_ctl->tx_control_0, |
356 | AR5K_2W_TX_DESC_CTL0_XMIT_RATE); | 365 | AR5K_2W_TX_DESC_CTL0_XMIT_RATE); |
366 | ts->ts_retry[0] = ts->ts_longretry; | ||
367 | ts->ts_final_idx = 0; | ||
357 | 368 | ||
358 | if (!(tx_status->tx_status_0 & AR5K_DESC_TX_STATUS0_FRAME_XMIT_OK)) { | 369 | if (!(tx_status->tx_status_0 & AR5K_DESC_TX_STATUS0_FRAME_XMIT_OK)) { |
359 | if (tx_status->tx_status_0 & | 370 | if (tx_status->tx_status_0 & |
@@ -405,29 +416,43 @@ static int ath5k_hw_proc_4word_tx_status(struct ath5k_hw *ah, | |||
405 | AR5K_DESC_TX_STATUS1_XMIT_ANTENNA) ? 2 : 1; | 416 | AR5K_DESC_TX_STATUS1_XMIT_ANTENNA) ? 2 : 1; |
406 | ts->ts_status = 0; | 417 | ts->ts_status = 0; |
407 | 418 | ||
408 | switch (AR5K_REG_MS(tx_status->tx_status_1, | 419 | ts->ts_final_idx = AR5K_REG_MS(tx_status->tx_status_1, |
409 | AR5K_DESC_TX_STATUS1_FINAL_TS_INDEX)) { | 420 | AR5K_DESC_TX_STATUS1_FINAL_TS_INDEX); |
410 | case 0: | 421 | |
411 | ts->ts_rate = tx_ctl->tx_control_3 & | 422 | /* The longretry counter has the number of un-acked retries |
412 | AR5K_4W_TX_DESC_CTL3_XMIT_RATE0; | 423 | * for the final rate. To get the total number of retries |
413 | break; | 424 | * we have to add the retry counters for the other rates |
425 | * as well | ||
426 | */ | ||
427 | ts->ts_retry[ts->ts_final_idx] = ts->ts_longretry; | ||
428 | switch (ts->ts_final_idx) { | ||
429 | case 3: | ||
430 | ts->ts_rate[3] = AR5K_REG_MS(tx_ctl->tx_control_3, | ||
431 | AR5K_4W_TX_DESC_CTL3_XMIT_RATE3); | ||
432 | |||
433 | ts->ts_retry[2] = AR5K_REG_MS(tx_ctl->tx_control_2, | ||
434 | AR5K_4W_TX_DESC_CTL2_XMIT_TRIES2); | ||
435 | ts->ts_longretry += ts->ts_retry[2]; | ||
436 | /* fall through */ | ||
437 | case 2: | ||
438 | ts->ts_rate[2] = AR5K_REG_MS(tx_ctl->tx_control_3, | ||
439 | AR5K_4W_TX_DESC_CTL3_XMIT_RATE2); | ||
440 | |||
441 | ts->ts_retry[1] = AR5K_REG_MS(tx_ctl->tx_control_2, | ||
442 | AR5K_4W_TX_DESC_CTL2_XMIT_TRIES1); | ||
443 | ts->ts_longretry += ts->ts_retry[1]; | ||
444 | /* fall through */ | ||
414 | case 1: | 445 | case 1: |
415 | ts->ts_rate = AR5K_REG_MS(tx_ctl->tx_control_3, | 446 | ts->ts_rate[1] = AR5K_REG_MS(tx_ctl->tx_control_3, |
416 | AR5K_4W_TX_DESC_CTL3_XMIT_RATE1); | 447 | AR5K_4W_TX_DESC_CTL3_XMIT_RATE1); |
417 | ts->ts_longretry += AR5K_REG_MS(tx_ctl->tx_control_2, | 448 | |
449 | ts->ts_retry[0] = AR5K_REG_MS(tx_ctl->tx_control_2, | ||
418 | AR5K_4W_TX_DESC_CTL2_XMIT_TRIES1); | 450 | AR5K_4W_TX_DESC_CTL2_XMIT_TRIES1); |
419 | break; | 451 | ts->ts_longretry += ts->ts_retry[0]; |
420 | case 2: | 452 | /* fall through */ |
421 | ts->ts_rate = AR5K_REG_MS(tx_ctl->tx_control_3, | 453 | case 0: |
422 | AR5K_4W_TX_DESC_CTL3_XMIT_RATE2); | 454 | ts->ts_rate[0] = tx_ctl->tx_control_3 & |
423 | ts->ts_longretry += AR5K_REG_MS(tx_ctl->tx_control_2, | 455 | AR5K_4W_TX_DESC_CTL3_XMIT_RATE0; |
424 | AR5K_4W_TX_DESC_CTL2_XMIT_TRIES2); | ||
425 | break; | ||
426 | case 3: | ||
427 | ts->ts_rate = AR5K_REG_MS(tx_ctl->tx_control_3, | ||
428 | AR5K_4W_TX_DESC_CTL3_XMIT_RATE3); | ||
429 | ts->ts_longretry += AR5K_REG_MS(tx_ctl->tx_control_2, | ||
430 | AR5K_4W_TX_DESC_CTL2_XMIT_TRIES3); | ||
431 | break; | 456 | break; |
432 | } | 457 | } |
433 | 458 | ||
@@ -653,7 +678,7 @@ int ath5k_hw_init_desc_functions(struct ath5k_hw *ah) | |||
653 | } else { | 678 | } else { |
654 | ah->ah_setup_rx_desc = ath5k_hw_setup_rx_desc; | 679 | ah->ah_setup_rx_desc = ath5k_hw_setup_rx_desc; |
655 | ah->ah_setup_tx_desc = ath5k_hw_setup_2word_tx_desc; | 680 | ah->ah_setup_tx_desc = ath5k_hw_setup_2word_tx_desc; |
656 | ah->ah_setup_mrr_tx_desc = ath5k_hw_setup_mrr_tx_desc; | 681 | ah->ah_setup_mrr_tx_desc = ath5k_hw_setup_no_mrr; |
657 | ah->ah_proc_tx_desc = ath5k_hw_proc_2word_tx_status; | 682 | ah->ah_proc_tx_desc = ath5k_hw_proc_2word_tx_status; |
658 | } | 683 | } |
659 | 684 | ||
diff --git a/drivers/net/wireless/ath9k/ath9k.h b/drivers/net/wireless/ath9k/ath9k.h index 0e897c276858..accace5f7efb 100644 --- a/drivers/net/wireless/ath9k/ath9k.h +++ b/drivers/net/wireless/ath9k/ath9k.h | |||
@@ -854,7 +854,7 @@ bool ath9k_hw_calibrate(struct ath_hal *ah, | |||
854 | u8 rxchainmask, | 854 | u8 rxchainmask, |
855 | bool longcal, | 855 | bool longcal, |
856 | bool *isCalDone); | 856 | bool *isCalDone); |
857 | int16_t ath9k_hw_getchan_noise(struct ath_hal *ah, | 857 | s16 ath9k_hw_getchan_noise(struct ath_hal *ah, |
858 | struct ath9k_channel *chan); | 858 | struct ath9k_channel *chan); |
859 | void ath9k_hw_write_associd(struct ath_hal *ah, const u8 *bssid, | 859 | void ath9k_hw_write_associd(struct ath_hal *ah, const u8 *bssid, |
860 | u16 assocId); | 860 | u16 assocId); |
diff --git a/drivers/net/wireless/ath9k/beacon.c b/drivers/net/wireless/ath9k/beacon.c index eedb465d25d3..9e15c30bbc06 100644 --- a/drivers/net/wireless/ath9k/beacon.c +++ b/drivers/net/wireless/ath9k/beacon.c | |||
@@ -129,7 +129,7 @@ static void ath_beacon_setup(struct ath_softc *sc, | |||
129 | ds /* first descriptor */ | 129 | ds /* first descriptor */ |
130 | ); | 130 | ); |
131 | 131 | ||
132 | memzero(series, sizeof(struct ath9k_11n_rate_series) * 4); | 132 | memset(series, 0, sizeof(struct ath9k_11n_rate_series) * 4); |
133 | series[0].Tries = 1; | 133 | series[0].Tries = 1; |
134 | series[0].Rate = rate; | 134 | series[0].Rate = rate; |
135 | series[0].ChSel = sc->sc_tx_chainmask; | 135 | series[0].ChSel = sc->sc_tx_chainmask; |
@@ -282,7 +282,7 @@ int ath_beaconq_setup(struct ath_hal *ah) | |||
282 | { | 282 | { |
283 | struct ath9k_tx_queue_info qi; | 283 | struct ath9k_tx_queue_info qi; |
284 | 284 | ||
285 | memzero(&qi, sizeof(qi)); | 285 | memset(&qi, 0, sizeof(qi)); |
286 | qi.tqi_aifs = 1; | 286 | qi.tqi_aifs = 1; |
287 | qi.tqi_cwmin = 0; | 287 | qi.tqi_cwmin = 0; |
288 | qi.tqi_cwmax = 0; | 288 | qi.tqi_cwmax = 0; |
@@ -662,7 +662,7 @@ void ath_beacon_config(struct ath_softc *sc, int if_id) | |||
662 | else | 662 | else |
663 | av_opmode = sc->sc_ah->ah_opmode; | 663 | av_opmode = sc->sc_ah->ah_opmode; |
664 | 664 | ||
665 | memzero(&conf, sizeof(struct ath_beacon_config)); | 665 | memset(&conf, 0, sizeof(struct ath_beacon_config)); |
666 | 666 | ||
667 | conf.beacon_interval = sc->hw->conf.beacon_int ? | 667 | conf.beacon_interval = sc->hw->conf.beacon_int ? |
668 | sc->hw->conf.beacon_int : ATH_DEFAULT_BINTVAL; | 668 | sc->hw->conf.beacon_int : ATH_DEFAULT_BINTVAL; |
@@ -738,7 +738,7 @@ void ath_beacon_config(struct ath_softc *sc, int if_id) | |||
738 | } | 738 | } |
739 | } while (nexttbtt < tsftu); | 739 | } while (nexttbtt < tsftu); |
740 | #undef FUDGE | 740 | #undef FUDGE |
741 | memzero(&bs, sizeof(bs)); | 741 | memset(&bs, 0, sizeof(bs)); |
742 | bs.bs_intval = intval; | 742 | bs.bs_intval = intval; |
743 | bs.bs_nexttbtt = nexttbtt; | 743 | bs.bs_nexttbtt = nexttbtt; |
744 | bs.bs_dtimperiod = dtimperiod*intval; | 744 | bs.bs_dtimperiod = dtimperiod*intval; |
diff --git a/drivers/net/wireless/ath9k/core.c b/drivers/net/wireless/ath9k/core.c index 6c433a4d003e..c5033f6f42ac 100644 --- a/drivers/net/wireless/ath9k/core.c +++ b/drivers/net/wireless/ath9k/core.c | |||
@@ -65,7 +65,7 @@ static void ath_setcurmode(struct ath_softc *sc, enum wireless_mode mode) | |||
65 | for (i = 0; i < rt->rateCount; i++) | 65 | for (i = 0; i < rt->rateCount; i++) |
66 | sc->sc_rixmap[rt->info[i].rateCode] = (u8) i; | 66 | sc->sc_rixmap[rt->info[i].rateCode] = (u8) i; |
67 | 67 | ||
68 | memzero(sc->sc_hwmap, sizeof(sc->sc_hwmap)); | 68 | memset(sc->sc_hwmap, 0, sizeof(sc->sc_hwmap)); |
69 | for (i = 0; i < 256; i++) { | 69 | for (i = 0; i < 256; i++) { |
70 | u8 ix = rt->rateCodeToIndex[i]; | 70 | u8 ix = rt->rateCodeToIndex[i]; |
71 | 71 | ||
@@ -288,8 +288,6 @@ static int ath_stop(struct ath_softc *sc) | |||
288 | * hardware is gone (invalid). | 288 | * hardware is gone (invalid). |
289 | */ | 289 | */ |
290 | 290 | ||
291 | if (!(sc->sc_flags & SC_OP_INVALID)) | ||
292 | ath9k_hw_set_interrupts(ah, 0); | ||
293 | ath_draintxq(sc, false); | 291 | ath_draintxq(sc, false); |
294 | if (!(sc->sc_flags & SC_OP_INVALID)) { | 292 | if (!(sc->sc_flags & SC_OP_INVALID)) { |
295 | ath_stoprecv(sc); | 293 | ath_stoprecv(sc); |
@@ -419,7 +417,7 @@ static void ath_chainmask_sel_init(struct ath_softc *sc, struct ath_node *an) | |||
419 | { | 417 | { |
420 | struct ath_chainmask_sel *cm = &an->an_chainmask_sel; | 418 | struct ath_chainmask_sel *cm = &an->an_chainmask_sel; |
421 | 419 | ||
422 | memzero(cm, sizeof(struct ath_chainmask_sel)); | 420 | memset(cm, 0, sizeof(struct ath_chainmask_sel)); |
423 | 421 | ||
424 | cm->cur_tx_mask = sc->sc_tx_chainmask; | 422 | cm->cur_tx_mask = sc->sc_tx_chainmask; |
425 | cm->cur_rx_mask = sc->sc_rx_chainmask; | 423 | cm->cur_rx_mask = sc->sc_rx_chainmask; |
@@ -492,6 +490,122 @@ void ath_update_chainmask(struct ath_softc *sc, int is_ht) | |||
492 | __func__, sc->sc_tx_chainmask, sc->sc_rx_chainmask); | 490 | __func__, sc->sc_tx_chainmask, sc->sc_rx_chainmask); |
493 | } | 491 | } |
494 | 492 | ||
493 | /*******/ | ||
494 | /* ANI */ | ||
495 | /*******/ | ||
496 | |||
497 | /* | ||
498 | * This routine performs the periodic noise floor calibration function | ||
499 | * that is used to adjust and optimize the chip performance. This | ||
500 | * takes environmental changes (location, temperature) into account. | ||
501 | * When the task is complete, it reschedules itself depending on the | ||
502 | * appropriate interval that was calculated. | ||
503 | */ | ||
504 | |||
505 | static void ath_ani_calibrate(unsigned long data) | ||
506 | { | ||
507 | struct ath_softc *sc; | ||
508 | struct ath_hal *ah; | ||
509 | bool longcal = false; | ||
510 | bool shortcal = false; | ||
511 | bool aniflag = false; | ||
512 | unsigned int timestamp = jiffies_to_msecs(jiffies); | ||
513 | u32 cal_interval; | ||
514 | |||
515 | sc = (struct ath_softc *)data; | ||
516 | ah = sc->sc_ah; | ||
517 | |||
518 | /* | ||
519 | * don't calibrate when we're scanning. | ||
520 | * we are most likely not on our home channel. | ||
521 | */ | ||
522 | if (sc->rx_filter & FIF_BCN_PRBRESP_PROMISC) | ||
523 | return; | ||
524 | |||
525 | /* Long calibration runs independently of short calibration. */ | ||
526 | if ((timestamp - sc->sc_ani.sc_longcal_timer) >= ATH_LONG_CALINTERVAL) { | ||
527 | longcal = true; | ||
528 | DPRINTF(sc, ATH_DBG_ANI, "%s: longcal @%lu\n", | ||
529 | __func__, jiffies); | ||
530 | sc->sc_ani.sc_longcal_timer = timestamp; | ||
531 | } | ||
532 | |||
533 | /* Short calibration applies only while sc_caldone is false */ | ||
534 | if (!sc->sc_ani.sc_caldone) { | ||
535 | if ((timestamp - sc->sc_ani.sc_shortcal_timer) >= | ||
536 | ATH_SHORT_CALINTERVAL) { | ||
537 | shortcal = true; | ||
538 | DPRINTF(sc, ATH_DBG_ANI, "%s: shortcal @%lu\n", | ||
539 | __func__, jiffies); | ||
540 | sc->sc_ani.sc_shortcal_timer = timestamp; | ||
541 | sc->sc_ani.sc_resetcal_timer = timestamp; | ||
542 | } | ||
543 | } else { | ||
544 | if ((timestamp - sc->sc_ani.sc_resetcal_timer) >= | ||
545 | ATH_RESTART_CALINTERVAL) { | ||
546 | ath9k_hw_reset_calvalid(ah, ah->ah_curchan, | ||
547 | &sc->sc_ani.sc_caldone); | ||
548 | if (sc->sc_ani.sc_caldone) | ||
549 | sc->sc_ani.sc_resetcal_timer = timestamp; | ||
550 | } | ||
551 | } | ||
552 | |||
553 | /* Verify whether we must check ANI */ | ||
554 | if ((timestamp - sc->sc_ani.sc_checkani_timer) >= | ||
555 | ATH_ANI_POLLINTERVAL) { | ||
556 | aniflag = true; | ||
557 | sc->sc_ani.sc_checkani_timer = timestamp; | ||
558 | } | ||
559 | |||
560 | /* Skip all processing if there's nothing to do. */ | ||
561 | if (longcal || shortcal || aniflag) { | ||
562 | /* Call ANI routine if necessary */ | ||
563 | if (aniflag) | ||
564 | ath9k_hw_ani_monitor(ah, &sc->sc_halstats, | ||
565 | ah->ah_curchan); | ||
566 | |||
567 | /* Perform calibration if necessary */ | ||
568 | if (longcal || shortcal) { | ||
569 | bool iscaldone = false; | ||
570 | |||
571 | if (ath9k_hw_calibrate(ah, ah->ah_curchan, | ||
572 | sc->sc_rx_chainmask, longcal, | ||
573 | &iscaldone)) { | ||
574 | if (longcal) | ||
575 | sc->sc_ani.sc_noise_floor = | ||
576 | ath9k_hw_getchan_noise(ah, | ||
577 | ah->ah_curchan); | ||
578 | |||
579 | DPRINTF(sc, ATH_DBG_ANI, | ||
580 | "%s: calibrate chan %u/%x nf: %d\n", | ||
581 | __func__, | ||
582 | ah->ah_curchan->channel, | ||
583 | ah->ah_curchan->channelFlags, | ||
584 | sc->sc_ani.sc_noise_floor); | ||
585 | } else { | ||
586 | DPRINTF(sc, ATH_DBG_ANY, | ||
587 | "%s: calibrate chan %u/%x failed\n", | ||
588 | __func__, | ||
589 | ah->ah_curchan->channel, | ||
590 | ah->ah_curchan->channelFlags); | ||
591 | } | ||
592 | sc->sc_ani.sc_caldone = iscaldone; | ||
593 | } | ||
594 | } | ||
595 | |||
596 | /* | ||
597 | * Set timer interval based on previous results. | ||
598 | * The interval must be the shortest necessary to satisfy ANI, | ||
599 | * short calibration and long calibration. | ||
600 | */ | ||
601 | |||
602 | cal_interval = ATH_ANI_POLLINTERVAL; | ||
603 | if (!sc->sc_ani.sc_caldone) | ||
604 | cal_interval = min(cal_interval, (u32)ATH_SHORT_CALINTERVAL); | ||
605 | |||
606 | mod_timer(&sc->sc_ani.timer, jiffies + msecs_to_jiffies(cal_interval)); | ||
607 | } | ||
608 | |||
495 | /******************/ | 609 | /******************/ |
496 | /* VAP management */ | 610 | /* VAP management */ |
497 | /******************/ | 611 | /******************/ |
@@ -528,7 +642,7 @@ int ath_vap_attach(struct ath_softc *sc, | |||
528 | if (avp == NULL) | 642 | if (avp == NULL) |
529 | return -ENOMEM; | 643 | return -ENOMEM; |
530 | 644 | ||
531 | memzero(avp, sizeof(struct ath_vap)); | 645 | memset(avp, 0, sizeof(struct ath_vap)); |
532 | avp->av_if_data = if_data; | 646 | avp->av_if_data = if_data; |
533 | /* Set the VAP opmode */ | 647 | /* Set the VAP opmode */ |
534 | avp->av_opmode = opmode; | 648 | avp->av_opmode = opmode; |
@@ -678,12 +792,6 @@ int ath_open(struct ath_softc *sc, struct ath9k_channel *initial_chan) | |||
678 | if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) | 792 | if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) |
679 | sc->sc_imask |= ATH9K_INT_CST; | 793 | sc->sc_imask |= ATH9K_INT_CST; |
680 | 794 | ||
681 | /* Note: We disable MIB interrupts for now as we don't yet | ||
682 | * handle processing ANI, otherwise you will get an interrupt | ||
683 | * storm after about 7 hours of usage making the system unusable | ||
684 | * with huge latency. Once we do have ANI processing included | ||
685 | * we can re-enable this interrupt. */ | ||
686 | #if 0 | ||
687 | /* | 795 | /* |
688 | * Enable MIB interrupts when there are hardware phy counters. | 796 | * Enable MIB interrupts when there are hardware phy counters. |
689 | * Note we only do this (at the moment) for station mode. | 797 | * Note we only do this (at the moment) for station mode. |
@@ -692,7 +800,6 @@ int ath_open(struct ath_softc *sc, struct ath9k_channel *initial_chan) | |||
692 | ((sc->sc_ah->ah_opmode == ATH9K_M_STA) || | 800 | ((sc->sc_ah->ah_opmode == ATH9K_M_STA) || |
693 | (sc->sc_ah->ah_opmode == ATH9K_M_IBSS))) | 801 | (sc->sc_ah->ah_opmode == ATH9K_M_IBSS))) |
694 | sc->sc_imask |= ATH9K_INT_MIB; | 802 | sc->sc_imask |= ATH9K_INT_MIB; |
695 | #endif | ||
696 | /* | 803 | /* |
697 | * Some hardware processes the TIM IE and fires an | 804 | * Some hardware processes the TIM IE and fires an |
698 | * interrupt when the TIM bit is set. For hardware | 805 | * interrupt when the TIM bit is set. For hardware |
@@ -993,6 +1100,10 @@ int ath_init(u16 devid, struct ath_softc *sc) | |||
993 | } | 1100 | } |
994 | sc->sc_ah = ah; | 1101 | sc->sc_ah = ah; |
995 | 1102 | ||
1103 | /* Initializes the noise floor to a reasonable default value. | ||
1104 | * Later on this will be updated during ANI processing. */ | ||
1105 | sc->sc_ani.sc_noise_floor = ATH_DEFAULT_NOISE_FLOOR; | ||
1106 | |||
996 | /* Get the hardware key cache size. */ | 1107 | /* Get the hardware key cache size. */ |
997 | sc->sc_keymax = ah->ah_caps.keycache_size; | 1108 | sc->sc_keymax = ah->ah_caps.keycache_size; |
998 | if (sc->sc_keymax > ATH_KEYMAX) { | 1109 | if (sc->sc_keymax > ATH_KEYMAX) { |
@@ -1100,6 +1211,8 @@ int ath_init(u16 devid, struct ath_softc *sc) | |||
1100 | goto bad2; | 1211 | goto bad2; |
1101 | } | 1212 | } |
1102 | 1213 | ||
1214 | setup_timer(&sc->sc_ani.timer, ath_ani_calibrate, (unsigned long)sc); | ||
1215 | |||
1103 | sc->sc_rc = ath_rate_attach(ah); | 1216 | sc->sc_rc = ath_rate_attach(ah); |
1104 | if (sc->sc_rc == NULL) { | 1217 | if (sc->sc_rc == NULL) { |
1105 | error = -EIO; | 1218 | error = -EIO; |
@@ -1221,7 +1334,7 @@ struct ath_node *ath_node_attach(struct ath_softc *sc, u8 *addr, int if_id) | |||
1221 | an = kmalloc(sizeof(struct ath_node), GFP_ATOMIC); | 1334 | an = kmalloc(sizeof(struct ath_node), GFP_ATOMIC); |
1222 | if (an == NULL) | 1335 | if (an == NULL) |
1223 | return NULL; | 1336 | return NULL; |
1224 | memzero(an, sizeof(*an)); | 1337 | memset(an, 0, sizeof(*an)); |
1225 | 1338 | ||
1226 | an->an_sc = sc; | 1339 | an->an_sc = sc; |
1227 | memcpy(an->an_addr, addr, ETH_ALEN); | 1340 | memcpy(an->an_addr, addr, ETH_ALEN); |
@@ -1608,7 +1721,7 @@ int ath_descdma_setup(struct ath_softc *sc, | |||
1608 | error = -ENOMEM; | 1721 | error = -ENOMEM; |
1609 | goto fail2; | 1722 | goto fail2; |
1610 | } | 1723 | } |
1611 | memzero(bf, bsize); | 1724 | memset(bf, 0, bsize); |
1612 | dd->dd_bufptr = bf; | 1725 | dd->dd_bufptr = bf; |
1613 | 1726 | ||
1614 | INIT_LIST_HEAD(head); | 1727 | INIT_LIST_HEAD(head); |
@@ -1640,7 +1753,7 @@ fail2: | |||
1640 | pci_free_consistent(sc->pdev, | 1753 | pci_free_consistent(sc->pdev, |
1641 | dd->dd_desc_len, dd->dd_desc, dd->dd_desc_paddr); | 1754 | dd->dd_desc_len, dd->dd_desc, dd->dd_desc_paddr); |
1642 | fail: | 1755 | fail: |
1643 | memzero(dd, sizeof(*dd)); | 1756 | memset(dd, 0, sizeof(*dd)); |
1644 | return error; | 1757 | return error; |
1645 | #undef ATH_DESC_4KB_BOUND_CHECK | 1758 | #undef ATH_DESC_4KB_BOUND_CHECK |
1646 | #undef ATH_DESC_4KB_BOUND_NUM_SKIPPED | 1759 | #undef ATH_DESC_4KB_BOUND_NUM_SKIPPED |
@@ -1665,7 +1778,7 @@ void ath_descdma_cleanup(struct ath_softc *sc, | |||
1665 | 1778 | ||
1666 | INIT_LIST_HEAD(head); | 1779 | INIT_LIST_HEAD(head); |
1667 | kfree(dd->dd_bufptr); | 1780 | kfree(dd->dd_bufptr); |
1668 | memzero(dd, sizeof(*dd)); | 1781 | memset(dd, 0, sizeof(*dd)); |
1669 | } | 1782 | } |
1670 | 1783 | ||
1671 | /*************/ | 1784 | /*************/ |
diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h index 872f0c5a0b0e..cb3e61e57c4d 100644 --- a/drivers/net/wireless/ath9k/core.h +++ b/drivers/net/wireless/ath9k/core.h | |||
@@ -84,9 +84,6 @@ struct ath_node; | |||
84 | #define TSF_TO_TU(_h,_l) \ | 84 | #define TSF_TO_TU(_h,_l) \ |
85 | ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10)) | 85 | ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10)) |
86 | 86 | ||
87 | /* XXX: remove */ | ||
88 | #define memzero(_buf, _len) memset(_buf, 0, _len) | ||
89 | |||
90 | #define ATH9K_BH_STATUS_INTACT 0 | 87 | #define ATH9K_BH_STATUS_INTACT 0 |
91 | #define ATH9K_BH_STATUS_CHANGE 1 | 88 | #define ATH9K_BH_STATUS_CHANGE 1 |
92 | 89 | ||
@@ -184,7 +181,7 @@ void ath_update_chainmask(struct ath_softc *sc, int is_ht); | |||
184 | (_bf)->bf_lastbf = NULL; \ | 181 | (_bf)->bf_lastbf = NULL; \ |
185 | (_bf)->bf_lastfrm = NULL; \ | 182 | (_bf)->bf_lastfrm = NULL; \ |
186 | (_bf)->bf_next = NULL; \ | 183 | (_bf)->bf_next = NULL; \ |
187 | memzero(&((_bf)->bf_state), \ | 184 | memset(&((_bf)->bf_state), 0, \ |
188 | sizeof(struct ath_buf_state)); \ | 185 | sizeof(struct ath_buf_state)); \ |
189 | } while (0) | 186 | } while (0) |
190 | 187 | ||
@@ -312,7 +309,7 @@ void ath_descdma_cleanup(struct ath_softc *sc, | |||
312 | #define ATH_RX_TIMEOUT 40 /* 40 milliseconds */ | 309 | #define ATH_RX_TIMEOUT 40 /* 40 milliseconds */ |
313 | #define WME_NUM_TID 16 | 310 | #define WME_NUM_TID 16 |
314 | #define IEEE80211_BAR_CTL_TID_M 0xF000 /* tid mask */ | 311 | #define IEEE80211_BAR_CTL_TID_M 0xF000 /* tid mask */ |
315 | #define IEEE80211_BAR_CTL_TID_S 2 /* tid shift */ | 312 | #define IEEE80211_BAR_CTL_TID_S 12 /* tid shift */ |
316 | 313 | ||
317 | enum ATH_RX_TYPE { | 314 | enum ATH_RX_TYPE { |
318 | ATH_RX_NON_CONSUMED = 0, | 315 | ATH_RX_NON_CONSUMED = 0, |
@@ -803,6 +800,28 @@ void ath_slow_ant_div(struct ath_antdiv *antdiv, | |||
803 | struct ath_rx_status *rx_stats); | 800 | struct ath_rx_status *rx_stats); |
804 | void ath_setdefantenna(void *sc, u32 antenna); | 801 | void ath_setdefantenna(void *sc, u32 antenna); |
805 | 802 | ||
803 | /*******/ | ||
804 | /* ANI */ | ||
805 | /*******/ | ||
806 | |||
807 | /* ANI values for STA only. | ||
808 | FIXME: Add appropriate values for AP later */ | ||
809 | |||
810 | #define ATH_ANI_POLLINTERVAL 100 /* 100 milliseconds between ANI poll */ | ||
811 | #define ATH_SHORT_CALINTERVAL 1000 /* 1 second between calibrations */ | ||
812 | #define ATH_LONG_CALINTERVAL 30000 /* 30 seconds between calibrations */ | ||
813 | #define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes between calibrations */ | ||
814 | |||
815 | struct ath_ani { | ||
816 | bool sc_caldone; | ||
817 | int16_t sc_noise_floor; | ||
818 | unsigned int sc_longcal_timer; | ||
819 | unsigned int sc_shortcal_timer; | ||
820 | unsigned int sc_resetcal_timer; | ||
821 | unsigned int sc_checkani_timer; | ||
822 | struct timer_list timer; | ||
823 | }; | ||
824 | |||
806 | /********************/ | 825 | /********************/ |
807 | /* LED Control */ | 826 | /* LED Control */ |
808 | /********************/ | 827 | /********************/ |
@@ -1031,6 +1050,9 @@ struct ath_softc { | |||
1031 | 1050 | ||
1032 | /* Rfkill */ | 1051 | /* Rfkill */ |
1033 | struct ath_rfkill rf_kill; | 1052 | struct ath_rfkill rf_kill; |
1053 | |||
1054 | /* ANI */ | ||
1055 | struct ath_ani sc_ani; | ||
1034 | }; | 1056 | }; |
1035 | 1057 | ||
1036 | int ath_init(u16 devid, struct ath_softc *sc); | 1058 | int ath_init(u16 devid, struct ath_softc *sc); |
diff --git a/drivers/net/wireless/ath9k/hw.c b/drivers/net/wireless/ath9k/hw.c index 272c75816609..62e44a0ef996 100644 --- a/drivers/net/wireless/ath9k/hw.c +++ b/drivers/net/wireless/ath9k/hw.c | |||
@@ -329,7 +329,7 @@ static void ath9k_hw_set_defaults(struct ath_hal *ah) | |||
329 | ah->ah_config.ofdm_trig_high = 500; | 329 | ah->ah_config.ofdm_trig_high = 500; |
330 | ah->ah_config.cck_trig_high = 200; | 330 | ah->ah_config.cck_trig_high = 200; |
331 | ah->ah_config.cck_trig_low = 100; | 331 | ah->ah_config.cck_trig_low = 100; |
332 | ah->ah_config.enable_ani = 0; | 332 | ah->ah_config.enable_ani = 1; |
333 | ah->ah_config.noise_immunity_level = 4; | 333 | ah->ah_config.noise_immunity_level = 4; |
334 | ah->ah_config.ofdm_weaksignal_det = 1; | 334 | ah->ah_config.ofdm_weaksignal_det = 1; |
335 | ah->ah_config.cck_weaksignal_thr = 0; | 335 | ah->ah_config.cck_weaksignal_thr = 0; |
@@ -8405,23 +8405,48 @@ u32 ath9k_hw_mhz2ieee(struct ath_hal *ah, u32 freq, u32 flags) | |||
8405 | } | 8405 | } |
8406 | } | 8406 | } |
8407 | 8407 | ||
8408 | int16_t | 8408 | /* We can tune this as we go by monitoring really low values */ |
8409 | #define ATH9K_NF_TOO_LOW -60 | ||
8410 | |||
8411 | /* AR5416 may return very high value (like -31 dBm), in those cases the nf | ||
8412 | * is incorrect and we should use the static NF value. Later we can try to | ||
8413 | * find out why they are reporting these values */ | ||
8414 | static bool ath9k_hw_nf_in_range(struct ath_hal *ah, s16 nf) | ||
8415 | { | ||
8416 | if (nf > ATH9K_NF_TOO_LOW) { | ||
8417 | DPRINTF(ah->ah_sc, ATH_DBG_NF_CAL, | ||
8418 | "%s: noise floor value detected (%d) is " | ||
8419 | "lower than what we think is a " | ||
8420 | "reasonable value (%d)\n", | ||
8421 | __func__, nf, ATH9K_NF_TOO_LOW); | ||
8422 | return false; | ||
8423 | } | ||
8424 | return true; | ||
8425 | } | ||
8426 | |||
8427 | s16 | ||
8409 | ath9k_hw_getchan_noise(struct ath_hal *ah, struct ath9k_channel *chan) | 8428 | ath9k_hw_getchan_noise(struct ath_hal *ah, struct ath9k_channel *chan) |
8410 | { | 8429 | { |
8411 | struct ath9k_channel *ichan; | 8430 | struct ath9k_channel *ichan; |
8431 | s16 nf; | ||
8412 | 8432 | ||
8413 | ichan = ath9k_regd_check_channel(ah, chan); | 8433 | ichan = ath9k_regd_check_channel(ah, chan); |
8414 | if (ichan == NULL) { | 8434 | if (ichan == NULL) { |
8415 | DPRINTF(ah->ah_sc, ATH_DBG_NF_CAL, | 8435 | DPRINTF(ah->ah_sc, ATH_DBG_NF_CAL, |
8416 | "%s: invalid channel %u/0x%x; no mapping\n", | 8436 | "%s: invalid channel %u/0x%x; no mapping\n", |
8417 | __func__, chan->channel, chan->channelFlags); | 8437 | __func__, chan->channel, chan->channelFlags); |
8418 | return 0; | 8438 | return ATH_DEFAULT_NOISE_FLOOR; |
8419 | } | 8439 | } |
8420 | if (ichan->rawNoiseFloor == 0) { | 8440 | if (ichan->rawNoiseFloor == 0) { |
8421 | enum wireless_mode mode = ath9k_hw_chan2wmode(ah, chan); | 8441 | enum wireless_mode mode = ath9k_hw_chan2wmode(ah, chan); |
8422 | return NOISE_FLOOR[mode]; | 8442 | nf = NOISE_FLOOR[mode]; |
8423 | } else | 8443 | } else |
8424 | return ichan->rawNoiseFloor; | 8444 | nf = ichan->rawNoiseFloor; |
8445 | |||
8446 | if (!ath9k_hw_nf_in_range(ah, nf)) | ||
8447 | nf = ATH_DEFAULT_NOISE_FLOOR; | ||
8448 | |||
8449 | return nf; | ||
8425 | } | 8450 | } |
8426 | 8451 | ||
8427 | bool ath9k_hw_set_tsfadjust(struct ath_hal *ah, u32 setting) | 8452 | bool ath9k_hw_set_tsfadjust(struct ath_hal *ah, u32 setting) |
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c index 2caba4403167..74726990d59e 100644 --- a/drivers/net/wireless/ath9k/main.c +++ b/drivers/net/wireless/ath9k/main.c | |||
@@ -274,10 +274,12 @@ static void ath9k_rx_prepare(struct ath_softc *sc, | |||
274 | rx_status->mactime = status->tsf; | 274 | rx_status->mactime = status->tsf; |
275 | rx_status->band = curchan->band; | 275 | rx_status->band = curchan->band; |
276 | rx_status->freq = curchan->center_freq; | 276 | rx_status->freq = curchan->center_freq; |
277 | rx_status->noise = ATH_DEFAULT_NOISE_FLOOR; | 277 | rx_status->noise = sc->sc_ani.sc_noise_floor; |
278 | rx_status->signal = rx_status->noise + status->rssi; | 278 | rx_status->signal = rx_status->noise + status->rssi; |
279 | rx_status->rate_idx = ath_rate2idx(sc, (status->rateKbps / 100)); | 279 | rx_status->rate_idx = ath_rate2idx(sc, (status->rateKbps / 100)); |
280 | rx_status->antenna = status->antenna; | 280 | rx_status->antenna = status->antenna; |
281 | |||
282 | /* XXX Fix me, 64 cannot be the max rssi value, rigure it out */ | ||
281 | rx_status->qual = status->rssi * 100 / 64; | 283 | rx_status->qual = status->rssi * 100 / 64; |
282 | 284 | ||
283 | if (status->flags & ATH_RX_MIC_ERROR) | 285 | if (status->flags & ATH_RX_MIC_ERROR) |
@@ -427,6 +429,11 @@ static void ath9k_bss_assoc_info(struct ath_softc *sc, | |||
427 | ath_rate_newstate(sc, avp); | 429 | ath_rate_newstate(sc, avp); |
428 | /* Update ratectrl about the new state */ | 430 | /* Update ratectrl about the new state */ |
429 | ath_rc_node_update(hw, avp->rc_node); | 431 | ath_rc_node_update(hw, avp->rc_node); |
432 | |||
433 | /* Start ANI */ | ||
434 | mod_timer(&sc->sc_ani.timer, | ||
435 | jiffies + msecs_to_jiffies(ATH_ANI_POLLINTERVAL)); | ||
436 | |||
430 | } else { | 437 | } else { |
431 | DPRINTF(sc, ATH_DBG_CONFIG, | 438 | DPRINTF(sc, ATH_DBG_CONFIG, |
432 | "%s: Bss Info DISSOC\n", __func__); | 439 | "%s: Bss Info DISSOC\n", __func__); |
@@ -1173,6 +1180,13 @@ static int ath9k_add_interface(struct ieee80211_hw *hw, | |||
1173 | return error; | 1180 | return error; |
1174 | } | 1181 | } |
1175 | 1182 | ||
1183 | if (conf->type == NL80211_IFTYPE_AP) { | ||
1184 | /* TODO: is this a suitable place to start ANI for AP mode? */ | ||
1185 | /* Start ANI */ | ||
1186 | mod_timer(&sc->sc_ani.timer, | ||
1187 | jiffies + msecs_to_jiffies(ATH_ANI_POLLINTERVAL)); | ||
1188 | } | ||
1189 | |||
1176 | return 0; | 1190 | return 0; |
1177 | } | 1191 | } |
1178 | 1192 | ||
@@ -1195,6 +1209,8 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw, | |||
1195 | #ifdef CONFIG_SLOW_ANT_DIV | 1209 | #ifdef CONFIG_SLOW_ANT_DIV |
1196 | ath_slow_ant_div_stop(&sc->sc_antdiv); | 1210 | ath_slow_ant_div_stop(&sc->sc_antdiv); |
1197 | #endif | 1211 | #endif |
1212 | /* Stop ANI */ | ||
1213 | del_timer_sync(&sc->sc_ani.timer); | ||
1198 | 1214 | ||
1199 | /* Update ratectrl */ | 1215 | /* Update ratectrl */ |
1200 | ath_rate_newstate(sc, avp); | 1216 | ath_rate_newstate(sc, avp); |
diff --git a/drivers/net/wireless/ath9k/recv.c b/drivers/net/wireless/ath9k/recv.c index 498256309ab7..4983402af559 100644 --- a/drivers/net/wireless/ath9k/recv.c +++ b/drivers/net/wireless/ath9k/recv.c | |||
@@ -892,7 +892,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
892 | 892 | ||
893 | hdr = (struct ieee80211_hdr *)skb->data; | 893 | hdr = (struct ieee80211_hdr *)skb->data; |
894 | fc = hdr->frame_control; | 894 | fc = hdr->frame_control; |
895 | memzero(&rx_status, sizeof(struct ath_recv_status)); | 895 | memset(&rx_status, 0, sizeof(struct ath_recv_status)); |
896 | 896 | ||
897 | if (ds->ds_rxstat.rs_more) { | 897 | if (ds->ds_rxstat.rs_more) { |
898 | /* | 898 | /* |
@@ -999,20 +999,11 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
999 | rx_status.flags |= ATH_RX_SHORT_GI; | 999 | rx_status.flags |= ATH_RX_SHORT_GI; |
1000 | } | 1000 | } |
1001 | 1001 | ||
1002 | /* sc->sc_noise_floor is only available when the station | 1002 | /* sc_noise_floor is only available when the station |
1003 | attaches to an AP, so we use a default value | 1003 | attaches to an AP, so we use a default value |
1004 | if we are not yet attached. */ | 1004 | if we are not yet attached. */ |
1005 | |||
1006 | /* XXX we should use either sc->sc_noise_floor or | ||
1007 | * ath_hal_getChanNoise(ah, &sc->sc_curchan) | ||
1008 | * to calculate the noise floor. | ||
1009 | * However, the value returned by ath_hal_getChanNoise | ||
1010 | * seems to be incorrect (-31dBm on the last test), | ||
1011 | * so we will use a hard-coded value until we | ||
1012 | * figure out what is going on. | ||
1013 | */ | ||
1014 | rx_status.abs_rssi = | 1005 | rx_status.abs_rssi = |
1015 | ds->ds_rxstat.rs_rssi + ATH_DEFAULT_NOISE_FLOOR; | 1006 | ds->ds_rxstat.rs_rssi + sc->sc_ani.sc_noise_floor; |
1016 | 1007 | ||
1017 | pci_dma_sync_single_for_cpu(sc->pdev, | 1008 | pci_dma_sync_single_for_cpu(sc->pdev, |
1018 | bf->bf_buf_addr, | 1009 | bf->bf_buf_addr, |
@@ -1166,7 +1157,7 @@ int ath_rx_aggr_start(struct ath_softc *sc, | |||
1166 | } else { | 1157 | } else { |
1167 | /* Ensure the memory is zeroed out (all internal | 1158 | /* Ensure the memory is zeroed out (all internal |
1168 | * pointers are null) */ | 1159 | * pointers are null) */ |
1169 | memzero(rxtid->rxbuf, ATH_TID_MAX_BUFS * | 1160 | memset(rxtid->rxbuf, 0, ATH_TID_MAX_BUFS * |
1170 | sizeof(struct ath_rxbuf)); | 1161 | sizeof(struct ath_rxbuf)); |
1171 | DPRINTF(sc, ATH_DBG_AGGR, | 1162 | DPRINTF(sc, ATH_DBG_AGGR, |
1172 | "%s: Allocated @%p\n", __func__, rxtid->rxbuf); | 1163 | "%s: Allocated @%p\n", __func__, rxtid->rxbuf); |
diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c index 25929059c7dc..3a4757942b3f 100644 --- a/drivers/net/wireless/ath9k/xmit.c +++ b/drivers/net/wireless/ath9k/xmit.c | |||
@@ -237,7 +237,7 @@ static int ath_tx_prepare(struct ath_softc *sc, | |||
237 | 237 | ||
238 | if (tx_info->control.hw_key) { | 238 | if (tx_info->control.hw_key) { |
239 | txctl->keyix = tx_info->control.hw_key->hw_key_idx; | 239 | txctl->keyix = tx_info->control.hw_key->hw_key_idx; |
240 | txctl->frmlen += tx_info->control.icv_len; | 240 | txctl->frmlen += tx_info->control.hw_key->icv_len; |
241 | 241 | ||
242 | if (tx_info->control.hw_key->alg == ALG_WEP) | 242 | if (tx_info->control.hw_key->alg == ALG_WEP) |
243 | txctl->keytype = ATH9K_KEY_TYPE_WEP; | 243 | txctl->keytype = ATH9K_KEY_TYPE_WEP; |
@@ -729,7 +729,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf) | |||
729 | /* | 729 | /* |
730 | * Setup HAL rate series | 730 | * Setup HAL rate series |
731 | */ | 731 | */ |
732 | memzero(series, sizeof(struct ath9k_11n_rate_series) * 4); | 732 | memset(series, 0, sizeof(struct ath9k_11n_rate_series) * 4); |
733 | 733 | ||
734 | for (i = 0; i < 4; i++) { | 734 | for (i = 0; i < 4; i++) { |
735 | if (!bf->bf_rcs[i].tries) | 735 | if (!bf->bf_rcs[i].tries) |
@@ -817,7 +817,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf) | |||
817 | * Disable multi-rate retry when using RTS/CTS by clearing | 817 | * Disable multi-rate retry when using RTS/CTS by clearing |
818 | * series 1, 2 and 3. | 818 | * series 1, 2 and 3. |
819 | */ | 819 | */ |
820 | memzero(&series[1], sizeof(struct ath9k_11n_rate_series) * 3); | 820 | memset(&series[1], 0, sizeof(struct ath9k_11n_rate_series) * 3); |
821 | } | 821 | } |
822 | 822 | ||
823 | /* | 823 | /* |
@@ -930,7 +930,7 @@ static void ath_tx_complete_aggr_rifs(struct ath_softc *sc, | |||
930 | ATH_DS_BA_BITMAP(ds), | 930 | ATH_DS_BA_BITMAP(ds), |
931 | WME_BA_BMP_SIZE >> 3); | 931 | WME_BA_BMP_SIZE >> 3); |
932 | } else { | 932 | } else { |
933 | memzero(ba, WME_BA_BMP_SIZE >> 3); | 933 | memset(ba, 0, WME_BA_BMP_SIZE >> 3); |
934 | 934 | ||
935 | /* | 935 | /* |
936 | * AR5416 can become deaf/mute when BA | 936 | * AR5416 can become deaf/mute when BA |
@@ -943,7 +943,7 @@ static void ath_tx_complete_aggr_rifs(struct ath_softc *sc, | |||
943 | needreset = 1; | 943 | needreset = 1; |
944 | } | 944 | } |
945 | } else { | 945 | } else { |
946 | memzero(ba, WME_BA_BMP_SIZE >> 3); | 946 | memset(ba, 0, WME_BA_BMP_SIZE >> 3); |
947 | } | 947 | } |
948 | } | 948 | } |
949 | 949 | ||
@@ -2098,7 +2098,7 @@ struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype) | |||
2098 | struct ath9k_tx_queue_info qi; | 2098 | struct ath9k_tx_queue_info qi; |
2099 | int qnum; | 2099 | int qnum; |
2100 | 2100 | ||
2101 | memzero(&qi, sizeof(qi)); | 2101 | memset(&qi, 0, sizeof(qi)); |
2102 | qi.tqi_subtype = subtype; | 2102 | qi.tqi_subtype = subtype; |
2103 | qi.tqi_aifs = ATH9K_TXQ_USEDEFAULT; | 2103 | qi.tqi_aifs = ATH9K_TXQ_USEDEFAULT; |
2104 | qi.tqi_cwmin = ATH9K_TXQ_USEDEFAULT; | 2104 | qi.tqi_cwmin = ATH9K_TXQ_USEDEFAULT; |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 3bf74e236abc..14c44df584d0 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -4588,6 +4588,7 @@ static int b43_wireless_init(struct ssb_device *dev) | |||
4588 | BIT(NL80211_IFTYPE_ADHOC); | 4588 | BIT(NL80211_IFTYPE_ADHOC); |
4589 | 4589 | ||
4590 | hw->queues = b43_modparam_qos ? 4 : 1; | 4590 | hw->queues = b43_modparam_qos ? 4 : 1; |
4591 | hw->max_altrates = 1; | ||
4591 | SET_IEEE80211_DEV(hw, dev->dev); | 4592 | SET_IEEE80211_DEV(hw, dev->dev); |
4592 | if (is_valid_ether_addr(sprom->et1mac)) | 4593 | if (is_valid_ether_addr(sprom->et1mac)) |
4593 | SET_IEEE80211_PERM_ADDR(hw, sprom->et1mac); | 4594 | SET_IEEE80211_PERM_ADDR(hw, sprom->et1mac); |
diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c index 5e0b71c3ad02..2fabcf8f0474 100644 --- a/drivers/net/wireless/b43/xmit.c +++ b/drivers/net/wireless/b43/xmit.c | |||
@@ -208,7 +208,7 @@ int b43_generate_txhdr(struct b43_wldev *dev, | |||
208 | txrate = ieee80211_get_tx_rate(dev->wl->hw, info); | 208 | txrate = ieee80211_get_tx_rate(dev->wl->hw, info); |
209 | rate = txrate ? txrate->hw_value : B43_CCK_RATE_1MB; | 209 | rate = txrate ? txrate->hw_value : B43_CCK_RATE_1MB; |
210 | rate_ofdm = b43_is_ofdm_rate(rate); | 210 | rate_ofdm = b43_is_ofdm_rate(rate); |
211 | fbrate = ieee80211_get_alt_retry_rate(dev->wl->hw, info) ? : txrate; | 211 | fbrate = ieee80211_get_alt_retry_rate(dev->wl->hw, info, 0) ? : txrate; |
212 | rate_fb = fbrate->hw_value; | 212 | rate_fb = fbrate->hw_value; |
213 | rate_fb_ofdm = b43_is_ofdm_rate(rate_fb); | 213 | rate_fb_ofdm = b43_is_ofdm_rate(rate_fb); |
214 | 214 | ||
@@ -252,7 +252,7 @@ int b43_generate_txhdr(struct b43_wldev *dev, | |||
252 | } | 252 | } |
253 | 253 | ||
254 | /* Hardware appends ICV. */ | 254 | /* Hardware appends ICV. */ |
255 | plcp_fragment_len += info->control.icv_len; | 255 | plcp_fragment_len += info->control.hw_key->icv_len; |
256 | 256 | ||
257 | key_idx = b43_kidx_to_fw(dev, key_idx); | 257 | key_idx = b43_kidx_to_fw(dev, key_idx); |
258 | mac_ctl |= (key_idx << B43_TXH_MAC_KEYIDX_SHIFT) & | 258 | mac_ctl |= (key_idx << B43_TXH_MAC_KEYIDX_SHIFT) & |
@@ -260,7 +260,7 @@ int b43_generate_txhdr(struct b43_wldev *dev, | |||
260 | mac_ctl |= (key->algorithm << B43_TXH_MAC_KEYALG_SHIFT) & | 260 | mac_ctl |= (key->algorithm << B43_TXH_MAC_KEYALG_SHIFT) & |
261 | B43_TXH_MAC_KEYALG; | 261 | B43_TXH_MAC_KEYALG; |
262 | wlhdr_len = ieee80211_hdrlen(fctl); | 262 | wlhdr_len = ieee80211_hdrlen(fctl); |
263 | iv_len = min((size_t) info->control.iv_len, | 263 | iv_len = min((size_t) info->control.hw_key->iv_len, |
264 | ARRAY_SIZE(txhdr->iv)); | 264 | ARRAY_SIZE(txhdr->iv)); |
265 | memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len); | 265 | memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len); |
266 | } | 266 | } |
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c index 9fb1421cbec2..c66d57560e7c 100644 --- a/drivers/net/wireless/b43legacy/main.c +++ b/drivers/net/wireless/b43legacy/main.c | |||
@@ -3710,6 +3710,7 @@ static int b43legacy_wireless_init(struct ssb_device *dev) | |||
3710 | BIT(NL80211_IFTYPE_WDS) | | 3710 | BIT(NL80211_IFTYPE_WDS) | |
3711 | BIT(NL80211_IFTYPE_ADHOC); | 3711 | BIT(NL80211_IFTYPE_ADHOC); |
3712 | hw->queues = 1; /* FIXME: hardware has more queues */ | 3712 | hw->queues = 1; /* FIXME: hardware has more queues */ |
3713 | hw->max_altrates = 1; | ||
3713 | SET_IEEE80211_DEV(hw, dev->dev); | 3714 | SET_IEEE80211_DEV(hw, dev->dev); |
3714 | if (is_valid_ether_addr(sprom->et1mac)) | 3715 | if (is_valid_ether_addr(sprom->et1mac)) |
3715 | SET_IEEE80211_PERM_ADDR(hw, sprom->et1mac); | 3716 | SET_IEEE80211_PERM_ADDR(hw, sprom->et1mac); |
diff --git a/drivers/net/wireless/b43legacy/xmit.c b/drivers/net/wireless/b43legacy/xmit.c index 6835064758fb..65e833781608 100644 --- a/drivers/net/wireless/b43legacy/xmit.c +++ b/drivers/net/wireless/b43legacy/xmit.c | |||
@@ -210,7 +210,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, | |||
210 | 210 | ||
211 | rate = tx_rate->hw_value; | 211 | rate = tx_rate->hw_value; |
212 | rate_ofdm = b43legacy_is_ofdm_rate(rate); | 212 | rate_ofdm = b43legacy_is_ofdm_rate(rate); |
213 | rate_fb = ieee80211_get_alt_retry_rate(dev->wl->hw, info) ? : tx_rate; | 213 | rate_fb = ieee80211_get_alt_retry_rate(dev->wl->hw, info, 0) ? : tx_rate; |
214 | rate_fb_ofdm = b43legacy_is_ofdm_rate(rate_fb->hw_value); | 214 | rate_fb_ofdm = b43legacy_is_ofdm_rate(rate_fb->hw_value); |
215 | 215 | ||
216 | txhdr->mac_frame_ctl = wlhdr->frame_control; | 216 | txhdr->mac_frame_ctl = wlhdr->frame_control; |
@@ -243,7 +243,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, | |||
243 | 243 | ||
244 | if (key->enabled) { | 244 | if (key->enabled) { |
245 | /* Hardware appends ICV. */ | 245 | /* Hardware appends ICV. */ |
246 | plcp_fragment_len += info->control.icv_len; | 246 | plcp_fragment_len += info->control.hw_key->icv_len; |
247 | 247 | ||
248 | key_idx = b43legacy_kidx_to_fw(dev, key_idx); | 248 | key_idx = b43legacy_kidx_to_fw(dev, key_idx); |
249 | mac_ctl |= (key_idx << B43legacy_TX4_MAC_KEYIDX_SHIFT) & | 249 | mac_ctl |= (key_idx << B43legacy_TX4_MAC_KEYIDX_SHIFT) & |
@@ -252,7 +252,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, | |||
252 | B43legacy_TX4_MAC_KEYALG_SHIFT) & | 252 | B43legacy_TX4_MAC_KEYALG_SHIFT) & |
253 | B43legacy_TX4_MAC_KEYALG; | 253 | B43legacy_TX4_MAC_KEYALG; |
254 | wlhdr_len = ieee80211_hdrlen(wlhdr->frame_control); | 254 | wlhdr_len = ieee80211_hdrlen(wlhdr->frame_control); |
255 | iv_len = min((size_t)info->control.iv_len, | 255 | iv_len = min((size_t)info->control.hw_key->iv_len, |
256 | ARRAY_SIZE(txhdr->iv)); | 256 | ARRAY_SIZE(txhdr->iv)); |
257 | memcpy(txhdr->iv, ((u8 *)wlhdr) + wlhdr_len, iv_len); | 257 | memcpy(txhdr->iv, ((u8 *)wlhdr) + wlhdr_len, iv_len); |
258 | } else { | 258 | } else { |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 204abab76449..24a1aeb6448f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2569,30 +2569,6 @@ static void iwl4965_post_associate(struct iwl_priv *priv) | |||
2569 | 2569 | ||
2570 | } | 2570 | } |
2571 | 2571 | ||
2572 | static int iwl4965_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *conf); | ||
2573 | |||
2574 | static void iwl_bg_scan_completed(struct work_struct *work) | ||
2575 | { | ||
2576 | struct iwl_priv *priv = | ||
2577 | container_of(work, struct iwl_priv, scan_completed); | ||
2578 | |||
2579 | IWL_DEBUG_SCAN("SCAN complete scan\n"); | ||
2580 | |||
2581 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | ||
2582 | return; | ||
2583 | |||
2584 | if (test_bit(STATUS_CONF_PENDING, &priv->status)) | ||
2585 | iwl4965_mac_config(priv->hw, ieee80211_get_hw_conf(priv->hw)); | ||
2586 | |||
2587 | ieee80211_scan_completed(priv->hw); | ||
2588 | |||
2589 | /* Since setting the TXPOWER may have been deferred while | ||
2590 | * performing the scan, fire one off */ | ||
2591 | mutex_lock(&priv->mutex); | ||
2592 | iwl_set_tx_power(priv, priv->tx_power_user_lmt, true); | ||
2593 | mutex_unlock(&priv->mutex); | ||
2594 | } | ||
2595 | |||
2596 | /***************************************************************************** | 2572 | /***************************************************************************** |
2597 | * | 2573 | * |
2598 | * mac80211 entry point functions | 2574 | * mac80211 entry point functions |
@@ -2812,7 +2788,6 @@ static int iwl4965_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *co | |||
2812 | if (unlikely(!priv->cfg->mod_params->disable_hw_scan && | 2788 | if (unlikely(!priv->cfg->mod_params->disable_hw_scan && |
2813 | test_bit(STATUS_SCANNING, &priv->status))) { | 2789 | test_bit(STATUS_SCANNING, &priv->status))) { |
2814 | IWL_DEBUG_MAC80211("leave - scanning\n"); | 2790 | IWL_DEBUG_MAC80211("leave - scanning\n"); |
2815 | set_bit(STATUS_CONF_PENDING, &priv->status); | ||
2816 | mutex_unlock(&priv->mutex); | 2791 | mutex_unlock(&priv->mutex); |
2817 | return 0; | 2792 | return 0; |
2818 | } | 2793 | } |
@@ -2898,7 +2873,6 @@ static int iwl4965_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *co | |||
2898 | IWL_DEBUG_MAC80211("leave\n"); | 2873 | IWL_DEBUG_MAC80211("leave\n"); |
2899 | 2874 | ||
2900 | out: | 2875 | out: |
2901 | clear_bit(STATUS_CONF_PENDING, &priv->status); | ||
2902 | mutex_unlock(&priv->mutex); | 2876 | mutex_unlock(&priv->mutex); |
2903 | return ret; | 2877 | return ret; |
2904 | } | 2878 | } |
@@ -4117,8 +4091,6 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv) | |||
4117 | INIT_DELAYED_WORK(&priv->init_alive_start, iwl_bg_init_alive_start); | 4091 | INIT_DELAYED_WORK(&priv->init_alive_start, iwl_bg_init_alive_start); |
4118 | INIT_DELAYED_WORK(&priv->alive_start, iwl_bg_alive_start); | 4092 | INIT_DELAYED_WORK(&priv->alive_start, iwl_bg_alive_start); |
4119 | 4093 | ||
4120 | /* FIXME : remove when resolved PENDING */ | ||
4121 | INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed); | ||
4122 | iwl_setup_scan_deferred_work(priv); | 4094 | iwl_setup_scan_deferred_work(priv); |
4123 | iwl_setup_power_deferred_work(priv); | 4095 | iwl_setup_power_deferred_work(priv); |
4124 | 4096 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index 55a4b584ce07..288b6a800e03 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
@@ -333,8 +333,7 @@ void iwl_dump_nic_event_log(struct iwl_priv *priv); | |||
333 | #define STATUS_SCAN_HW 15 | 333 | #define STATUS_SCAN_HW 15 |
334 | #define STATUS_POWER_PMI 16 | 334 | #define STATUS_POWER_PMI 16 |
335 | #define STATUS_FW_ERROR 17 | 335 | #define STATUS_FW_ERROR 17 |
336 | #define STATUS_CONF_PENDING 18 | 336 | #define STATUS_MODE_PENDING 18 |
337 | #define STATUS_MODE_PENDING 19 | ||
338 | 337 | ||
339 | 338 | ||
340 | static inline int iwl_is_ready(struct iwl_priv *priv) | 339 | static inline int iwl_is_ready(struct iwl_priv *priv) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index bf855c35b0c1..3b0bee331a33 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
@@ -703,7 +703,7 @@ static void iwl_bg_request_scan(struct work_struct *data) | |||
703 | u16 cmd_len; | 703 | u16 cmd_len; |
704 | enum ieee80211_band band; | 704 | enum ieee80211_band band; |
705 | u8 n_probes = 2; | 705 | u8 n_probes = 2; |
706 | u8 rx_chain = 0x7; /* bitmap: ABC chains */ | 706 | u8 rx_chain = priv->hw_params.valid_rx_ant; |
707 | 707 | ||
708 | conf = ieee80211_get_hw_conf(priv->hw); | 708 | conf = ieee80211_get_hw_conf(priv->hw); |
709 | 709 | ||
@@ -843,7 +843,7 @@ static void iwl_bg_request_scan(struct work_struct *data) | |||
843 | 843 | ||
844 | /* Force use of chains B and C (0x6) for scan Rx for 4965 | 844 | /* Force use of chains B and C (0x6) for scan Rx for 4965 |
845 | * Avoid A (0x1) because of its off-channel reception on A-band. | 845 | * Avoid A (0x1) because of its off-channel reception on A-band. |
846 | * MIMO is not used here, but value is required */ | 846 | */ |
847 | if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_4965) | 847 | if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_4965) |
848 | rx_chain = 0x6; | 848 | rx_chain = 0x6; |
849 | } else { | 849 | } else { |
@@ -851,6 +851,7 @@ static void iwl_bg_request_scan(struct work_struct *data) | |||
851 | goto done; | 851 | goto done; |
852 | } | 852 | } |
853 | 853 | ||
854 | /* MIMO is not used here, but value is required */ | ||
854 | scan->rx_chain = RXON_RX_CHAIN_DRIVER_FORCE_MSK | | 855 | scan->rx_chain = RXON_RX_CHAIN_DRIVER_FORCE_MSK | |
855 | cpu_to_le16((0x7 << RXON_RX_CHAIN_VALID_POS) | | 856 | cpu_to_le16((0x7 << RXON_RX_CHAIN_VALID_POS) | |
856 | (rx_chain << RXON_RX_CHAIN_FORCE_SEL_POS) | | 857 | (rx_chain << RXON_RX_CHAIN_FORCE_SEL_POS) | |
@@ -915,10 +916,29 @@ static void iwl_bg_abort_scan(struct work_struct *work) | |||
915 | mutex_unlock(&priv->mutex); | 916 | mutex_unlock(&priv->mutex); |
916 | } | 917 | } |
917 | 918 | ||
919 | static void iwl_bg_scan_completed(struct work_struct *work) | ||
920 | { | ||
921 | struct iwl_priv *priv = | ||
922 | container_of(work, struct iwl_priv, scan_completed); | ||
923 | |||
924 | IWL_DEBUG_SCAN("SCAN complete scan\n"); | ||
925 | |||
926 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | ||
927 | return; | ||
928 | |||
929 | ieee80211_scan_completed(priv->hw); | ||
930 | |||
931 | /* Since setting the TXPOWER may have been deferred while | ||
932 | * performing the scan, fire one off */ | ||
933 | mutex_lock(&priv->mutex); | ||
934 | iwl_set_tx_power(priv, priv->tx_power_user_lmt, true); | ||
935 | mutex_unlock(&priv->mutex); | ||
936 | } | ||
937 | |||
938 | |||
918 | void iwl_setup_scan_deferred_work(struct iwl_priv *priv) | 939 | void iwl_setup_scan_deferred_work(struct iwl_priv *priv) |
919 | { | 940 | { |
920 | /* FIXME: move here when resolved PENDING | 941 | INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed); |
921 | * INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed); */ | ||
922 | INIT_WORK(&priv->request_scan, iwl_bg_request_scan); | 942 | INIT_WORK(&priv->request_scan, iwl_bg_request_scan); |
923 | INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan); | 943 | INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan); |
924 | INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check); | 944 | INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check); |
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index de5e8f44b202..1994aa199d37 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c | |||
@@ -507,9 +507,10 @@ static int p54_rx_data(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
507 | rx_status.noise = priv->noise; | 507 | rx_status.noise = priv->noise; |
508 | /* XX correct? */ | 508 | /* XX correct? */ |
509 | rx_status.qual = (100 * hdr->rssi) / 127; | 509 | rx_status.qual = (100 * hdr->rssi) / 127; |
510 | rx_status.rate_idx = hdr->rate & 0xf; | 510 | rx_status.rate_idx = (dev->conf.channel->band == IEEE80211_BAND_2GHZ ? |
511 | hdr->rate : (hdr->rate - 4)) & 0xf; | ||
511 | rx_status.freq = freq; | 512 | rx_status.freq = freq; |
512 | rx_status.band = IEEE80211_BAND_2GHZ; | 513 | rx_status.band = dev->conf.channel->band; |
513 | rx_status.antenna = hdr->antenna; | 514 | rx_status.antenna = hdr->antenna; |
514 | 515 | ||
515 | tsf32 = le32_to_cpu(hdr->tsf32); | 516 | tsf32 = le32_to_cpu(hdr->tsf32); |
diff --git a/drivers/net/wireless/rt2x00/rt2x00crypto.c b/drivers/net/wireless/rt2x00/rt2x00crypto.c index e1448cfa9444..5a858e5106c4 100644 --- a/drivers/net/wireless/rt2x00/rt2x00crypto.c +++ b/drivers/net/wireless/rt2x00/rt2x00crypto.c | |||
@@ -56,10 +56,10 @@ unsigned int rt2x00crypto_tx_overhead(struct ieee80211_tx_info *tx_info) | |||
56 | * note that these lengths should only be added when | 56 | * note that these lengths should only be added when |
57 | * mac80211 does not generate it. | 57 | * mac80211 does not generate it. |
58 | */ | 58 | */ |
59 | overhead += tx_info->control.icv_len; | 59 | overhead += key->icv_len; |
60 | 60 | ||
61 | if (!(key->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) | 61 | if (!(key->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) |
62 | overhead += tx_info->control.iv_len; | 62 | overhead += key->iv_len; |
63 | 63 | ||
64 | if (!(key->flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) { | 64 | if (!(key->flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) { |
65 | if (key->alg == ALG_TKIP) | 65 | if (key->alg == ALG_TKIP) |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index b7f4fe8fba6e..1676ac484790 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -374,7 +374,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb) | |||
374 | struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX); | 374 | struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX); |
375 | struct txentry_desc txdesc; | 375 | struct txentry_desc txdesc; |
376 | struct skb_frame_desc *skbdesc; | 376 | struct skb_frame_desc *skbdesc; |
377 | unsigned int iv_len = IEEE80211_SKB_CB(skb)->control.iv_len; | 377 | unsigned int iv_len; |
378 | 378 | ||
379 | if (unlikely(rt2x00queue_full(queue))) | 379 | if (unlikely(rt2x00queue_full(queue))) |
380 | return -EINVAL; | 380 | return -EINVAL; |
@@ -410,8 +410,11 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb) | |||
410 | * the frame so we can provide it to the driver seperately. | 410 | * the frame so we can provide it to the driver seperately. |
411 | */ | 411 | */ |
412 | if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc.flags) && | 412 | if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc.flags) && |
413 | !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags)) | 413 | !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags) && |
414 | (IEEE80211_SKB_CB(skb)->control.hw_key != NULL)) { | ||
415 | iv_len = IEEE80211_SKB_CB(skb)->control.hw_key->iv_len; | ||
414 | rt2x00crypto_tx_remove_iv(skb, iv_len); | 416 | rt2x00crypto_tx_remove_iv(skb, iv_len); |
417 | } | ||
415 | 418 | ||
416 | /* | 419 | /* |
417 | * It could be possible that the queue was corrupted and this | 420 | * It could be possible that the queue was corrupted and this |
diff --git a/drivers/net/wireless/rt2x00/rt2x00rfkill.c b/drivers/net/wireless/rt2x00/rt2x00rfkill.c index 55eff58f1889..c3f53a92180a 100644 --- a/drivers/net/wireless/rt2x00/rt2x00rfkill.c +++ b/drivers/net/wireless/rt2x00/rt2x00rfkill.c | |||
@@ -145,10 +145,15 @@ void rt2x00rfkill_allocate(struct rt2x00_dev *rt2x00dev) | |||
145 | 145 | ||
146 | rt2x00dev->rfkill->name = rt2x00dev->ops->name; | 146 | rt2x00dev->rfkill->name = rt2x00dev->ops->name; |
147 | rt2x00dev->rfkill->data = rt2x00dev; | 147 | rt2x00dev->rfkill->data = rt2x00dev; |
148 | rt2x00dev->rfkill->state = -1; | ||
149 | rt2x00dev->rfkill->toggle_radio = rt2x00rfkill_toggle_radio; | 148 | rt2x00dev->rfkill->toggle_radio = rt2x00rfkill_toggle_radio; |
150 | if (test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags)) | 149 | if (test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags)) { |
151 | rt2x00dev->rfkill->get_state = rt2x00rfkill_get_state; | 150 | rt2x00dev->rfkill->get_state = rt2x00rfkill_get_state; |
151 | rt2x00dev->rfkill->state = | ||
152 | rt2x00dev->ops->lib->rfkill_poll(rt2x00dev) ? | ||
153 | RFKILL_STATE_SOFT_BLOCKED : RFKILL_STATE_UNBLOCKED; | ||
154 | } else { | ||
155 | rt2x00dev->rfkill->state = RFKILL_STATE_UNBLOCKED; | ||
156 | } | ||
152 | 157 | ||
153 | INIT_DELAYED_WORK(&rt2x00dev->rfkill_work, rt2x00rfkill_poll); | 158 | INIT_DELAYED_WORK(&rt2x00dev->rfkill_work, rt2x00rfkill_poll); |
154 | 159 | ||
diff --git a/drivers/net/wireless/rtl8180_dev.c b/drivers/net/wireless/rtl8180_dev.c index abcd641c54be..df7e78ee8a88 100644 --- a/drivers/net/wireless/rtl8180_dev.c +++ b/drivers/net/wireless/rtl8180_dev.c | |||
@@ -292,8 +292,8 @@ static int rtl8180_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
292 | entry->plcp_len = cpu_to_le16(plcp_len); | 292 | entry->plcp_len = cpu_to_le16(plcp_len); |
293 | entry->tx_buf = cpu_to_le32(mapping); | 293 | entry->tx_buf = cpu_to_le32(mapping); |
294 | entry->frame_len = cpu_to_le32(skb->len); | 294 | entry->frame_len = cpu_to_le32(skb->len); |
295 | entry->flags2 = info->control.alt_retry_rate_idx >= 0 ? | 295 | entry->flags2 = info->control.retries[0].rate_idx >= 0 ? |
296 | ieee80211_get_alt_retry_rate(dev, info)->bitrate << 4 : 0; | 296 | ieee80211_get_alt_retry_rate(dev, info, 0)->bitrate << 4 : 0; |
297 | entry->retry_limit = info->control.retry_limit; | 297 | entry->retry_limit = info->control.retry_limit; |
298 | entry->flags = cpu_to_le32(tx_flags); | 298 | entry->flags = cpu_to_le32(tx_flags); |
299 | __skb_queue_tail(&ring->queue, skb); | 299 | __skb_queue_tail(&ring->queue, skb); |
@@ -855,6 +855,7 @@ static int __devinit rtl8180_probe(struct pci_dev *pdev, | |||
855 | priv = dev->priv; | 855 | priv = dev->priv; |
856 | priv->pdev = pdev; | 856 | priv->pdev = pdev; |
857 | 857 | ||
858 | dev->max_altrates = 1; | ||
858 | SET_IEEE80211_DEV(dev, &pdev->dev); | 859 | SET_IEEE80211_DEV(dev, &pdev->dev); |
859 | pci_set_drvdata(pdev, dev); | 860 | pci_set_drvdata(pdev, dev); |
860 | 861 | ||