diff options
98 files changed, 4514 insertions, 1501 deletions
diff --git a/drivers/net/wireless/ath5k/pcu.c b/drivers/net/wireless/ath5k/pcu.c index dabe42219e2a..0cac05c6a9ce 100644 --- a/drivers/net/wireless/ath5k/pcu.c +++ b/drivers/net/wireless/ath5k/pcu.c | |||
@@ -1099,9 +1099,9 @@ int ath5k_hw_set_key(struct ath5k_hw *ah, u16 entry, | |||
1099 | 1099 | ||
1100 | if (ah->ah_combined_mic) { | 1100 | if (ah->ah_combined_mic) { |
1101 | key_v[0] = rxmic[0]; | 1101 | key_v[0] = rxmic[0]; |
1102 | key_v[1] = (txmic[0] >> 16) & 0xffff; | 1102 | key_v[1] = cpu_to_le32(le32_to_cpu(txmic[0]) >> 16); |
1103 | key_v[2] = rxmic[1]; | 1103 | key_v[2] = rxmic[1]; |
1104 | key_v[3] = txmic[0] & 0xffff; | 1104 | key_v[3] = cpu_to_le32(le32_to_cpu(txmic[0]) & 0xffff); |
1105 | key_v[4] = txmic[1]; | 1105 | key_v[4] = txmic[1]; |
1106 | } else { | 1106 | } else { |
1107 | key_v[0] = rxmic[0]; | 1107 | key_v[0] = rxmic[0]; |
diff --git a/drivers/net/wireless/ath9k/ath9k.h b/drivers/net/wireless/ath9k/ath9k.h index 9520aa0898e3..d27813502953 100644 --- a/drivers/net/wireless/ath9k/ath9k.h +++ b/drivers/net/wireless/ath9k/ath9k.h | |||
@@ -26,6 +26,7 @@ | |||
26 | #define AR9160_DEVID_PCI 0x0027 | 26 | #define AR9160_DEVID_PCI 0x0027 |
27 | #define AR9280_DEVID_PCI 0x0029 | 27 | #define AR9280_DEVID_PCI 0x0029 |
28 | #define AR9280_DEVID_PCIE 0x002a | 28 | #define AR9280_DEVID_PCIE 0x002a |
29 | #define AR9285_DEVID_PCIE 0x002b | ||
29 | 30 | ||
30 | #define AR5416_AR9100_DEVID 0x000b | 31 | #define AR5416_AR9100_DEVID 0x000b |
31 | 32 | ||
diff --git a/drivers/net/wireless/ath9k/beacon.c b/drivers/net/wireless/ath9k/beacon.c index 507299bf0136..3ab0b43aaf93 100644 --- a/drivers/net/wireless/ath9k/beacon.c +++ b/drivers/net/wireless/ath9k/beacon.c | |||
@@ -26,7 +26,7 @@ static int ath_beaconq_config(struct ath_softc *sc) | |||
26 | struct ath_hal *ah = sc->sc_ah; | 26 | struct ath_hal *ah = sc->sc_ah; |
27 | struct ath9k_tx_queue_info qi; | 27 | struct ath9k_tx_queue_info qi; |
28 | 28 | ||
29 | ath9k_hw_get_txq_props(ah, sc->sc_bhalq, &qi); | 29 | ath9k_hw_get_txq_props(ah, sc->beacon.beaconq, &qi); |
30 | if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) { | 30 | if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) { |
31 | /* Always burst out beacon and CAB traffic. */ | 31 | /* Always burst out beacon and CAB traffic. */ |
32 | qi.tqi_aifs = 1; | 32 | qi.tqi_aifs = 1; |
@@ -34,17 +34,17 @@ static int ath_beaconq_config(struct ath_softc *sc) | |||
34 | qi.tqi_cwmax = 0; | 34 | qi.tqi_cwmax = 0; |
35 | } else { | 35 | } else { |
36 | /* Adhoc mode; important thing is to use 2x cwmin. */ | 36 | /* Adhoc mode; important thing is to use 2x cwmin. */ |
37 | qi.tqi_aifs = sc->sc_beacon_qi.tqi_aifs; | 37 | qi.tqi_aifs = sc->beacon.beacon_qi.tqi_aifs; |
38 | qi.tqi_cwmin = 2*sc->sc_beacon_qi.tqi_cwmin; | 38 | qi.tqi_cwmin = 2*sc->beacon.beacon_qi.tqi_cwmin; |
39 | qi.tqi_cwmax = sc->sc_beacon_qi.tqi_cwmax; | 39 | qi.tqi_cwmax = sc->beacon.beacon_qi.tqi_cwmax; |
40 | } | 40 | } |
41 | 41 | ||
42 | if (!ath9k_hw_set_txq_props(ah, sc->sc_bhalq, &qi)) { | 42 | if (!ath9k_hw_set_txq_props(ah, sc->beacon.beaconq, &qi)) { |
43 | DPRINTF(sc, ATH_DBG_FATAL, | 43 | DPRINTF(sc, ATH_DBG_FATAL, |
44 | "unable to update h/w beacon queue parameters\n"); | 44 | "unable to update h/w beacon queue parameters\n"); |
45 | return 0; | 45 | return 0; |
46 | } else { | 46 | } else { |
47 | ath9k_hw_resettxqueue(ah, sc->sc_bhalq); /* push to h/w */ | 47 | ath9k_hw_resettxqueue(ah, sc->beacon.beaconq); /* push to h/w */ |
48 | return 1; | 48 | return 1; |
49 | } | 49 | } |
50 | } | 50 | } |
@@ -53,7 +53,7 @@ static void ath_bstuck_process(struct ath_softc *sc) | |||
53 | { | 53 | { |
54 | DPRINTF(sc, ATH_DBG_BEACON, | 54 | DPRINTF(sc, ATH_DBG_BEACON, |
55 | "stuck beacon; resetting (bmiss count %u)\n", | 55 | "stuck beacon; resetting (bmiss count %u)\n", |
56 | sc->sc_bmisscount); | 56 | sc->beacon.bmisscnt); |
57 | ath_reset(sc, false); | 57 | ath_reset(sc, false); |
58 | } | 58 | } |
59 | 59 | ||
@@ -96,7 +96,7 @@ static void ath_beacon_setup(struct ath_softc *sc, | |||
96 | * SWBA's | 96 | * SWBA's |
97 | * XXX assumes two antenna | 97 | * XXX assumes two antenna |
98 | */ | 98 | */ |
99 | antenna = ((sc->ast_be_xmit / sc->sc_nbcnvaps) & 1 ? 2 : 1); | 99 | antenna = ((sc->beacon.ast_be_xmit / sc->sc_nbcnvaps) & 1 ? 2 : 1); |
100 | } | 100 | } |
101 | 101 | ||
102 | ds->ds_data = bf->bf_buf_addr; | 102 | ds->ds_data = bf->bf_buf_addr; |
@@ -106,7 +106,7 @@ static void ath_beacon_setup(struct ath_softc *sc, | |||
106 | * XXX everything at min xmit rate | 106 | * XXX everything at min xmit rate |
107 | */ | 107 | */ |
108 | rix = 0; | 108 | rix = 0; |
109 | rt = sc->hw_rate_table[sc->sc_curmode]; | 109 | rt = sc->cur_rate_table; |
110 | rate = rt->info[rix].ratecode; | 110 | rate = rt->info[rix].ratecode; |
111 | if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) | 111 | if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) |
112 | rate |= rt->info[rix].short_preamble; | 112 | rate |= rt->info[rix].short_preamble; |
@@ -153,7 +153,7 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id) | |||
153 | ASSERT(vif); | 153 | ASSERT(vif); |
154 | 154 | ||
155 | avp = (void *)vif->drv_priv; | 155 | avp = (void *)vif->drv_priv; |
156 | cabq = sc->sc_cabq; | 156 | cabq = sc->beacon.cabq; |
157 | 157 | ||
158 | if (avp->av_bcbuf == NULL) { | 158 | if (avp->av_bcbuf == NULL) { |
159 | DPRINTF(sc, ATH_DBG_BEACON, "avp=%p av_bcbuf=%p\n", | 159 | DPRINTF(sc, ATH_DBG_BEACON, "avp=%p av_bcbuf=%p\n", |
@@ -167,6 +167,7 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id) | |||
167 | pci_unmap_single(sc->pdev, bf->bf_dmacontext, | 167 | pci_unmap_single(sc->pdev, bf->bf_dmacontext, |
168 | skb->len, | 168 | skb->len, |
169 | PCI_DMA_TODEVICE); | 169 | PCI_DMA_TODEVICE); |
170 | dev_kfree_skb_any(skb); | ||
170 | } | 171 | } |
171 | 172 | ||
172 | skb = ieee80211_beacon_get(sc->hw, vif); | 173 | skb = ieee80211_beacon_get(sc->hw, vif); |
@@ -181,9 +182,9 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id) | |||
181 | * TX frames) | 182 | * TX frames) |
182 | */ | 183 | */ |
183 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 184 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
184 | sc->seq_no += 0x10; | 185 | sc->tx.seq_no += 0x10; |
185 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | 186 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); |
186 | hdr->seq_ctrl |= cpu_to_le16(sc->seq_no); | 187 | hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no); |
187 | } | 188 | } |
188 | 189 | ||
189 | bf->bf_buf_addr = bf->bf_dmacontext = | 190 | bf->bf_buf_addr = bf->bf_dmacontext = |
@@ -269,10 +270,10 @@ static void ath_beacon_start_adhoc(struct ath_softc *sc, int if_id) | |||
269 | ath_beacon_setup(sc, avp, bf); | 270 | ath_beacon_setup(sc, avp, bf); |
270 | 271 | ||
271 | /* NB: caller is known to have already stopped tx dma */ | 272 | /* NB: caller is known to have already stopped tx dma */ |
272 | ath9k_hw_puttxbuf(ah, sc->sc_bhalq, bf->bf_daddr); | 273 | ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr); |
273 | ath9k_hw_txstart(ah, sc->sc_bhalq); | 274 | ath9k_hw_txstart(ah, sc->beacon.beaconq); |
274 | DPRINTF(sc, ATH_DBG_BEACON, "TXDP%u = %llx (%p)\n", | 275 | DPRINTF(sc, ATH_DBG_BEACON, "TXDP%u = %llx (%p)\n", |
275 | sc->sc_bhalq, ito64(bf->bf_daddr), bf->bf_desc); | 276 | sc->beacon.beaconq, ito64(bf->bf_daddr), bf->bf_desc); |
276 | } | 277 | } |
277 | 278 | ||
278 | int ath_beaconq_setup(struct ath_hal *ah) | 279 | int ath_beaconq_setup(struct ath_hal *ah) |
@@ -305,7 +306,7 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id) | |||
305 | if (!avp->av_bcbuf) { | 306 | if (!avp->av_bcbuf) { |
306 | /* Allocate beacon state for hostap/ibss. We know | 307 | /* Allocate beacon state for hostap/ibss. We know |
307 | * a buffer is available. */ | 308 | * a buffer is available. */ |
308 | avp->av_bcbuf = list_first_entry(&sc->sc_bbuf, | 309 | avp->av_bcbuf = list_first_entry(&sc->beacon.bbuf, |
309 | struct ath_buf, list); | 310 | struct ath_buf, list); |
310 | list_del(&avp->av_bcbuf->list); | 311 | list_del(&avp->av_bcbuf->list); |
311 | 312 | ||
@@ -318,13 +319,13 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id) | |||
318 | */ | 319 | */ |
319 | avp->av_bslot = 0; | 320 | avp->av_bslot = 0; |
320 | for (slot = 0; slot < ATH_BCBUF; slot++) | 321 | for (slot = 0; slot < ATH_BCBUF; slot++) |
321 | if (sc->sc_bslot[slot] == ATH_IF_ID_ANY) { | 322 | if (sc->beacon.bslot[slot] == ATH_IF_ID_ANY) { |
322 | /* | 323 | /* |
323 | * XXX hack, space out slots to better | 324 | * XXX hack, space out slots to better |
324 | * deal with misses | 325 | * deal with misses |
325 | */ | 326 | */ |
326 | if (slot+1 < ATH_BCBUF && | 327 | if (slot+1 < ATH_BCBUF && |
327 | sc->sc_bslot[slot+1] == | 328 | sc->beacon.bslot[slot+1] == |
328 | ATH_IF_ID_ANY) { | 329 | ATH_IF_ID_ANY) { |
329 | avp->av_bslot = slot+1; | 330 | avp->av_bslot = slot+1; |
330 | break; | 331 | break; |
@@ -332,8 +333,8 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id) | |||
332 | avp->av_bslot = slot; | 333 | avp->av_bslot = slot; |
333 | /* NB: keep looking for a double slot */ | 334 | /* NB: keep looking for a double slot */ |
334 | } | 335 | } |
335 | BUG_ON(sc->sc_bslot[avp->av_bslot] != ATH_IF_ID_ANY); | 336 | BUG_ON(sc->beacon.bslot[avp->av_bslot] != ATH_IF_ID_ANY); |
336 | sc->sc_bslot[avp->av_bslot] = if_id; | 337 | sc->beacon.bslot[avp->av_bslot] = if_id; |
337 | sc->sc_nbcnvaps++; | 338 | sc->sc_nbcnvaps++; |
338 | } | 339 | } |
339 | } | 340 | } |
@@ -361,7 +362,7 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id) | |||
361 | } | 362 | } |
362 | 363 | ||
363 | tstamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp; | 364 | tstamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp; |
364 | sc->bc_tstamp = le64_to_cpu(tstamp); | 365 | sc->beacon.bc_tstamp = le64_to_cpu(tstamp); |
365 | 366 | ||
366 | /* | 367 | /* |
367 | * Calculate a TSF adjustment factor required for | 368 | * Calculate a TSF adjustment factor required for |
@@ -421,7 +422,7 @@ void ath_beacon_return(struct ath_softc *sc, struct ath_vap *avp) | |||
421 | struct ath_buf *bf; | 422 | struct ath_buf *bf; |
422 | 423 | ||
423 | if (avp->av_bslot != -1) { | 424 | if (avp->av_bslot != -1) { |
424 | sc->sc_bslot[avp->av_bslot] = ATH_IF_ID_ANY; | 425 | sc->beacon.bslot[avp->av_bslot] = ATH_IF_ID_ANY; |
425 | sc->sc_nbcnvaps--; | 426 | sc->sc_nbcnvaps--; |
426 | } | 427 | } |
427 | 428 | ||
@@ -434,7 +435,7 @@ void ath_beacon_return(struct ath_softc *sc, struct ath_vap *avp) | |||
434 | dev_kfree_skb_any(skb); | 435 | dev_kfree_skb_any(skb); |
435 | bf->bf_mpdu = NULL; | 436 | bf->bf_mpdu = NULL; |
436 | } | 437 | } |
437 | list_add_tail(&bf->list, &sc->sc_bbuf); | 438 | list_add_tail(&bf->list, &sc->beacon.bbuf); |
438 | 439 | ||
439 | avp->av_bcbuf = NULL; | 440 | avp->av_bcbuf = NULL; |
440 | } | 441 | } |
@@ -468,18 +469,18 @@ void ath9k_beacon_tasklet(unsigned long data) | |||
468 | * | 469 | * |
469 | * FIXME: Clean up this mess !! | 470 | * FIXME: Clean up this mess !! |
470 | */ | 471 | */ |
471 | if (ath9k_hw_numtxpending(ah, sc->sc_bhalq) != 0) { | 472 | if (ath9k_hw_numtxpending(ah, sc->beacon.beaconq) != 0) { |
472 | sc->sc_bmisscount++; | 473 | sc->beacon.bmisscnt++; |
473 | /* XXX: doth needs the chanchange IE countdown decremented. | 474 | /* XXX: doth needs the chanchange IE countdown decremented. |
474 | * We should consider adding a mac80211 call to indicate | 475 | * We should consider adding a mac80211 call to indicate |
475 | * a beacon miss so appropriate action could be taken | 476 | * a beacon miss so appropriate action could be taken |
476 | * (in that layer). | 477 | * (in that layer). |
477 | */ | 478 | */ |
478 | if (sc->sc_bmisscount < BSTUCK_THRESH) { | 479 | if (sc->beacon.bmisscnt < BSTUCK_THRESH) { |
479 | if (sc->sc_flags & SC_OP_NO_RESET) { | 480 | if (sc->sc_flags & SC_OP_NO_RESET) { |
480 | DPRINTF(sc, ATH_DBG_BEACON, | 481 | DPRINTF(sc, ATH_DBG_BEACON, |
481 | "missed %u consecutive beacons\n", | 482 | "missed %u consecutive beacons\n", |
482 | sc->sc_bmisscount); | 483 | sc->beacon.bmisscnt); |
483 | if (show_cycles) { | 484 | if (show_cycles) { |
484 | /* | 485 | /* |
485 | * Display cycle counter stats from HW | 486 | * Display cycle counter stats from HW |
@@ -498,11 +499,11 @@ void ath9k_beacon_tasklet(unsigned long data) | |||
498 | } else { | 499 | } else { |
499 | DPRINTF(sc, ATH_DBG_BEACON, | 500 | DPRINTF(sc, ATH_DBG_BEACON, |
500 | "missed %u consecutive beacons\n", | 501 | "missed %u consecutive beacons\n", |
501 | sc->sc_bmisscount); | 502 | sc->beacon.bmisscnt); |
502 | } | 503 | } |
503 | } else if (sc->sc_bmisscount >= BSTUCK_THRESH) { | 504 | } else if (sc->beacon.bmisscnt >= BSTUCK_THRESH) { |
504 | if (sc->sc_flags & SC_OP_NO_RESET) { | 505 | if (sc->sc_flags & SC_OP_NO_RESET) { |
505 | if (sc->sc_bmisscount == BSTUCK_THRESH) { | 506 | if (sc->beacon.bmisscnt == BSTUCK_THRESH) { |
506 | DPRINTF(sc, ATH_DBG_BEACON, | 507 | DPRINTF(sc, ATH_DBG_BEACON, |
507 | "beacon is officially " | 508 | "beacon is officially " |
508 | "stuck\n"); | 509 | "stuck\n"); |
@@ -516,17 +517,17 @@ void ath9k_beacon_tasklet(unsigned long data) | |||
516 | return; | 517 | return; |
517 | } | 518 | } |
518 | 519 | ||
519 | if (sc->sc_bmisscount != 0) { | 520 | if (sc->beacon.bmisscnt != 0) { |
520 | if (sc->sc_flags & SC_OP_NO_RESET) { | 521 | if (sc->sc_flags & SC_OP_NO_RESET) { |
521 | DPRINTF(sc, ATH_DBG_BEACON, | 522 | DPRINTF(sc, ATH_DBG_BEACON, |
522 | "resume beacon xmit after %u misses\n", | 523 | "resume beacon xmit after %u misses\n", |
523 | sc->sc_bmisscount); | 524 | sc->beacon.bmisscnt); |
524 | } else { | 525 | } else { |
525 | DPRINTF(sc, ATH_DBG_BEACON, | 526 | DPRINTF(sc, ATH_DBG_BEACON, |
526 | "resume beacon xmit after %u misses\n", | 527 | "resume beacon xmit after %u misses\n", |
527 | sc->sc_bmisscount); | 528 | sc->beacon.bmisscnt); |
528 | } | 529 | } |
529 | sc->sc_bmisscount = 0; | 530 | sc->beacon.bmisscnt = 0; |
530 | } | 531 | } |
531 | 532 | ||
532 | /* | 533 | /* |
@@ -541,7 +542,7 @@ void ath9k_beacon_tasklet(unsigned long data) | |||
541 | tsf = ath9k_hw_gettsf64(ah); | 542 | tsf = ath9k_hw_gettsf64(ah); |
542 | tsftu = TSF_TO_TU(tsf>>32, tsf); | 543 | tsftu = TSF_TO_TU(tsf>>32, tsf); |
543 | slot = ((tsftu % intval) * ATH_BCBUF) / intval; | 544 | slot = ((tsftu % intval) * ATH_BCBUF) / intval; |
544 | if_id = sc->sc_bslot[(slot + 1) % ATH_BCBUF]; | 545 | if_id = sc->beacon.bslot[(slot + 1) % ATH_BCBUF]; |
545 | 546 | ||
546 | DPRINTF(sc, ATH_DBG_BEACON, | 547 | DPRINTF(sc, ATH_DBG_BEACON, |
547 | "slot %d [tsf %llu tsftu %u intval %u] if_id %d\n", | 548 | "slot %d [tsf %llu tsftu %u intval %u] if_id %d\n", |
@@ -573,12 +574,12 @@ void ath9k_beacon_tasklet(unsigned long data) | |||
573 | * set to ATH_BCBUF so this check is a noop. | 574 | * set to ATH_BCBUF so this check is a noop. |
574 | */ | 575 | */ |
575 | /* XXX locking */ | 576 | /* XXX locking */ |
576 | if (sc->sc_updateslot == UPDATE) { | 577 | if (sc->beacon.updateslot == UPDATE) { |
577 | sc->sc_updateslot = COMMIT; /* commit next beacon */ | 578 | sc->beacon.updateslot = COMMIT; /* commit next beacon */ |
578 | sc->sc_slotupdate = slot; | 579 | sc->beacon.slotupdate = slot; |
579 | } else if (sc->sc_updateslot == COMMIT && sc->sc_slotupdate == slot) { | 580 | } else if (sc->beacon.updateslot == COMMIT && sc->beacon.slotupdate == slot) { |
580 | ath9k_hw_setslottime(sc->sc_ah, sc->sc_slottime); | 581 | ath9k_hw_setslottime(sc->sc_ah, sc->beacon.slottime); |
581 | sc->sc_updateslot = OK; | 582 | sc->beacon.updateslot = OK; |
582 | } | 583 | } |
583 | if (bfaddr != 0) { | 584 | if (bfaddr != 0) { |
584 | /* | 585 | /* |
@@ -586,17 +587,17 @@ void ath9k_beacon_tasklet(unsigned long data) | |||
586 | * This should never fail since we check above that no frames | 587 | * This should never fail since we check above that no frames |
587 | * are still pending on the queue. | 588 | * are still pending on the queue. |
588 | */ | 589 | */ |
589 | if (!ath9k_hw_stoptxdma(ah, sc->sc_bhalq)) { | 590 | if (!ath9k_hw_stoptxdma(ah, sc->beacon.beaconq)) { |
590 | DPRINTF(sc, ATH_DBG_FATAL, | 591 | DPRINTF(sc, ATH_DBG_FATAL, |
591 | "beacon queue %u did not stop?\n", sc->sc_bhalq); | 592 | "beacon queue %u did not stop?\n", sc->beacon.beaconq); |
592 | /* NB: the HAL still stops DMA, so proceed */ | 593 | /* NB: the HAL still stops DMA, so proceed */ |
593 | } | 594 | } |
594 | 595 | ||
595 | /* NB: cabq traffic should already be queued and primed */ | 596 | /* NB: cabq traffic should already be queued and primed */ |
596 | ath9k_hw_puttxbuf(ah, sc->sc_bhalq, bfaddr); | 597 | ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bfaddr); |
597 | ath9k_hw_txstart(ah, sc->sc_bhalq); | 598 | ath9k_hw_txstart(ah, sc->beacon.beaconq); |
598 | 599 | ||
599 | sc->ast_be_xmit += bc; /* XXX per-vap? */ | 600 | sc->beacon.ast_be_xmit += bc; /* XXX per-vap? */ |
600 | } | 601 | } |
601 | } | 602 | } |
602 | 603 | ||
@@ -643,7 +644,7 @@ void ath_beacon_config(struct ath_softc *sc, int if_id) | |||
643 | conf.bmiss_timeout = ATH_DEFAULT_BMISS_LIMIT * conf.beacon_interval; | 644 | conf.bmiss_timeout = ATH_DEFAULT_BMISS_LIMIT * conf.beacon_interval; |
644 | 645 | ||
645 | /* extract tstamp from last beacon and convert to TU */ | 646 | /* extract tstamp from last beacon and convert to TU */ |
646 | nexttbtt = TSF_TO_TU(sc->bc_tstamp >> 32, sc->bc_tstamp); | 647 | nexttbtt = TSF_TO_TU(sc->beacon.bc_tstamp >> 32, sc->beacon.bc_tstamp); |
647 | 648 | ||
648 | /* XXX conditionalize multi-bss support? */ | 649 | /* XXX conditionalize multi-bss support? */ |
649 | if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) { | 650 | if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) { |
@@ -830,7 +831,7 @@ void ath_beacon_config(struct ath_softc *sc, int if_id) | |||
830 | ath_beaconq_config(sc); | 831 | ath_beaconq_config(sc); |
831 | } | 832 | } |
832 | ath9k_hw_beaconinit(ah, nexttbtt, intval); | 833 | ath9k_hw_beaconinit(ah, nexttbtt, intval); |
833 | sc->sc_bmisscount = 0; | 834 | sc->beacon.bmisscnt = 0; |
834 | ath9k_hw_set_interrupts(ah, sc->sc_imask); | 835 | ath9k_hw_set_interrupts(ah, sc->sc_imask); |
835 | /* | 836 | /* |
836 | * When using a self-linked beacon descriptor in | 837 | * When using a self-linked beacon descriptor in |
diff --git a/drivers/net/wireless/ath9k/calib.c b/drivers/net/wireless/ath9k/calib.c index 51c8a3ce4e60..3c7454fc51bd 100644 --- a/drivers/net/wireless/ath9k/calib.c +++ b/drivers/net/wireless/ath9k/calib.c | |||
@@ -818,6 +818,101 @@ bool ath9k_hw_calibrate(struct ath_hal *ah, struct ath9k_channel *chan, | |||
818 | return true; | 818 | return true; |
819 | } | 819 | } |
820 | 820 | ||
821 | static inline void ath9k_hw_9285_pa_cal(struct ath_hal *ah) | ||
822 | { | ||
823 | |||
824 | u32 regVal; | ||
825 | int i, offset, offs_6_1, offs_0; | ||
826 | u32 ccomp_org, reg_field; | ||
827 | u32 regList[][2] = { | ||
828 | { 0x786c, 0 }, | ||
829 | { 0x7854, 0 }, | ||
830 | { 0x7820, 0 }, | ||
831 | { 0x7824, 0 }, | ||
832 | { 0x7868, 0 }, | ||
833 | { 0x783c, 0 }, | ||
834 | { 0x7838, 0 }, | ||
835 | }; | ||
836 | |||
837 | if (AR_SREV_9285_11(ah)) { | ||
838 | REG_WRITE(ah, AR9285_AN_TOP4, (AR9285_AN_TOP4_DEFAULT | 0x14)); | ||
839 | udelay(10); | ||
840 | } | ||
841 | |||
842 | for (i = 0; i < ARRAY_SIZE(regList); i++) | ||
843 | regList[i][1] = REG_READ(ah, regList[i][0]); | ||
844 | |||
845 | regVal = REG_READ(ah, 0x7834); | ||
846 | regVal &= (~(0x1)); | ||
847 | REG_WRITE(ah, 0x7834, regVal); | ||
848 | regVal = REG_READ(ah, 0x9808); | ||
849 | regVal |= (0x1 << 27); | ||
850 | REG_WRITE(ah, 0x9808, regVal); | ||
851 | |||
852 | REG_RMW_FIELD(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC, 1); | ||
853 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1, 1); | ||
854 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I, 1); | ||
855 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF, 1); | ||
856 | REG_RMW_FIELD(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL, 0); | ||
857 | REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB, 0); | ||
858 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL, 0); | ||
859 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1, 1); | ||
860 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2, 0); | ||
861 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT, 0); | ||
862 | REG_RMW_FIELD(ah, AR9285_AN_RF2G8, AR9285_AN_RF2G8_PADRVGN2TAB0, 7); | ||
863 | REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0); | ||
864 | ccomp_org = MS(REG_READ(ah, AR9285_AN_RF2G6), AR9285_AN_RF2G6_CCOMP); | ||
865 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_CCOMP, 7); | ||
866 | |||
867 | REG_WRITE(ah, AR9285_AN_TOP2, 0xca0358a0); | ||
868 | udelay(30); | ||
869 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_OFFS, 0); | ||
870 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, 0); | ||
871 | |||
872 | for (i = 6; i > 0; i--) { | ||
873 | regVal = REG_READ(ah, 0x7834); | ||
874 | regVal |= (1 << (19 + i)); | ||
875 | REG_WRITE(ah, 0x7834, regVal); | ||
876 | udelay(1); | ||
877 | regVal = REG_READ(ah, 0x7834); | ||
878 | regVal &= (~(0x1 << (19 + i))); | ||
879 | reg_field = MS(REG_READ(ah, 0x7840), AR9285_AN_RXTXBB1_SPARE9); | ||
880 | regVal |= (reg_field << (19 + i)); | ||
881 | REG_WRITE(ah, 0x7834, regVal); | ||
882 | } | ||
883 | |||
884 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, 1); | ||
885 | udelay(1); | ||
886 | reg_field = MS(REG_READ(ah, AR9285_AN_RF2G9), AR9285_AN_RXTXBB1_SPARE9); | ||
887 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, reg_field); | ||
888 | offs_6_1 = MS(REG_READ(ah, AR9285_AN_RF2G6), AR9285_AN_RF2G6_OFFS); | ||
889 | offs_0 = MS(REG_READ(ah, AR9285_AN_RF2G3), AR9285_AN_RF2G3_PDVCCOMP); | ||
890 | |||
891 | offset = (offs_6_1<<1) | offs_0; | ||
892 | offset = offset - 0; | ||
893 | offs_6_1 = offset>>1; | ||
894 | offs_0 = offset & 1; | ||
895 | |||
896 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_OFFS, offs_6_1); | ||
897 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, offs_0); | ||
898 | |||
899 | regVal = REG_READ(ah, 0x7834); | ||
900 | regVal |= 0x1; | ||
901 | REG_WRITE(ah, 0x7834, regVal); | ||
902 | regVal = REG_READ(ah, 0x9808); | ||
903 | regVal &= (~(0x1 << 27)); | ||
904 | REG_WRITE(ah, 0x9808, regVal); | ||
905 | |||
906 | for (i = 0; i < ARRAY_SIZE(regList); i++) | ||
907 | REG_WRITE(ah, regList[i][0], regList[i][1]); | ||
908 | |||
909 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_CCOMP, ccomp_org); | ||
910 | |||
911 | if (AR_SREV_9285_11(ah)) | ||
912 | REG_WRITE(ah, AR9285_AN_TOP4, AR9285_AN_TOP4_DEFAULT); | ||
913 | |||
914 | } | ||
915 | |||
821 | bool ath9k_hw_init_cal(struct ath_hal *ah, | 916 | bool ath9k_hw_init_cal(struct ath_hal *ah, |
822 | struct ath9k_channel *chan) | 917 | struct ath9k_channel *chan) |
823 | { | 918 | { |
@@ -835,6 +930,9 @@ bool ath9k_hw_init_cal(struct ath_hal *ah, | |||
835 | return false; | 930 | return false; |
836 | } | 931 | } |
837 | 932 | ||
933 | if (AR_SREV_9285(ah) && AR_SREV_9285_11_OR_LATER(ah)) | ||
934 | ath9k_hw_9285_pa_cal(ah); | ||
935 | |||
838 | REG_WRITE(ah, AR_PHY_AGC_CONTROL, | 936 | REG_WRITE(ah, AR_PHY_AGC_CONTROL, |
839 | REG_READ(ah, AR_PHY_AGC_CONTROL) | | 937 | REG_READ(ah, AR_PHY_AGC_CONTROL) | |
840 | AR_PHY_AGC_CONTROL_NF); | 938 | AR_PHY_AGC_CONTROL_NF); |
diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h index a500d1770534..e38f0331cfd5 100644 --- a/drivers/net/wireless/ath9k/core.h +++ b/drivers/net/wireless/ath9k/core.h | |||
@@ -61,7 +61,7 @@ struct ath_node; | |||
61 | #define TSF_TO_TU(_h,_l) \ | 61 | #define TSF_TO_TU(_h,_l) \ |
62 | ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10)) | 62 | ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10)) |
63 | 63 | ||
64 | #define ATH_TXQ_SETUP(sc, i) ((sc)->sc_txqsetup & (1<<i)) | 64 | #define ATH_TXQ_SETUP(sc, i) ((sc)->tx.txqsetup & (1<<i)) |
65 | 65 | ||
66 | static const u8 ath_bcast_mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; | 66 | static const u8 ath_bcast_mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; |
67 | 67 | ||
@@ -88,16 +88,66 @@ enum ATH_DEBUG { | |||
88 | 88 | ||
89 | #ifdef CONFIG_ATH9K_DEBUG | 89 | #ifdef CONFIG_ATH9K_DEBUG |
90 | 90 | ||
91 | /** | ||
92 | * struct ath_interrupt_stats - Contains statistics about interrupts | ||
93 | * @total: Total no. of interrupts generated so far | ||
94 | * @rxok: RX with no errors | ||
95 | * @rxeol: RX with no more RXDESC available | ||
96 | * @rxorn: RX FIFO overrun | ||
97 | * @txok: TX completed at the requested rate | ||
98 | * @txurn: TX FIFO underrun | ||
99 | * @mib: MIB regs reaching its threshold | ||
100 | * @rxphyerr: RX with phy errors | ||
101 | * @rx_keycache_miss: RX with key cache misses | ||
102 | * @swba: Software Beacon Alert | ||
103 | * @bmiss: Beacon Miss | ||
104 | * @bnr: Beacon Not Ready | ||
105 | * @cst: Carrier Sense TImeout | ||
106 | * @gtt: Global TX Timeout | ||
107 | * @tim: RX beacon TIM occurrence | ||
108 | * @cabend: RX End of CAB traffic | ||
109 | * @dtimsync: DTIM sync lossage | ||
110 | * @dtim: RX Beacon with DTIM | ||
111 | */ | ||
112 | struct ath_interrupt_stats { | ||
113 | u32 total; | ||
114 | u32 rxok; | ||
115 | u32 rxeol; | ||
116 | u32 rxorn; | ||
117 | u32 txok; | ||
118 | u32 txeol; | ||
119 | u32 txurn; | ||
120 | u32 mib; | ||
121 | u32 rxphyerr; | ||
122 | u32 rx_keycache_miss; | ||
123 | u32 swba; | ||
124 | u32 bmiss; | ||
125 | u32 bnr; | ||
126 | u32 cst; | ||
127 | u32 gtt; | ||
128 | u32 tim; | ||
129 | u32 cabend; | ||
130 | u32 dtimsync; | ||
131 | u32 dtim; | ||
132 | }; | ||
133 | |||
134 | struct ath_stats { | ||
135 | struct ath_interrupt_stats istats; | ||
136 | }; | ||
137 | |||
91 | struct ath9k_debug { | 138 | struct ath9k_debug { |
92 | int debug_mask; | 139 | int debug_mask; |
93 | struct dentry *debugfs_root; | 140 | struct dentry *debugfs_root; |
94 | struct dentry *debugfs_phy; | 141 | struct dentry *debugfs_phy; |
95 | struct dentry *debugfs_dma; | 142 | struct dentry *debugfs_dma; |
143 | struct dentry *debugfs_interrupt; | ||
144 | struct ath_stats stats; | ||
96 | }; | 145 | }; |
97 | 146 | ||
98 | void DPRINTF(struct ath_softc *sc, int dbg_mask, const char *fmt, ...); | 147 | void DPRINTF(struct ath_softc *sc, int dbg_mask, const char *fmt, ...); |
99 | int ath9k_init_debug(struct ath_softc *sc); | 148 | int ath9k_init_debug(struct ath_softc *sc); |
100 | void ath9k_exit_debug(struct ath_softc *sc); | 149 | void ath9k_exit_debug(struct ath_softc *sc); |
150 | void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status); | ||
101 | 151 | ||
102 | #else | 152 | #else |
103 | 153 | ||
@@ -115,6 +165,11 @@ static inline void ath9k_exit_debug(struct ath_softc *sc) | |||
115 | { | 165 | { |
116 | } | 166 | } |
117 | 167 | ||
168 | static inline void ath_debug_stat_interrupt(struct ath_softc *sc, | ||
169 | enum ath9k_int status) | ||
170 | { | ||
171 | } | ||
172 | |||
118 | #endif /* CONFIG_ATH9K_DEBUG */ | 173 | #endif /* CONFIG_ATH9K_DEBUG */ |
119 | 174 | ||
120 | struct ath_config { | 175 | struct ath_config { |
@@ -235,18 +290,9 @@ void ath_descdma_cleanup(struct ath_softc *sc, struct ath_descdma *dd, | |||
235 | /* RX / TX */ | 290 | /* RX / TX */ |
236 | /***********/ | 291 | /***********/ |
237 | 292 | ||
238 | #define ATH_MAX_ANTENNA 3 | 293 | #define ATH_MAX_ANTENNA 3 |
239 | #define ATH_RXBUF 512 | 294 | #define ATH_RXBUF 512 |
240 | #define WME_NUM_TID 16 | 295 | #define WME_NUM_TID 16 |
241 | |||
242 | int ath_startrecv(struct ath_softc *sc); | ||
243 | bool ath_stoprecv(struct ath_softc *sc); | ||
244 | void ath_flushrecv(struct ath_softc *sc); | ||
245 | u32 ath_calcrxfilter(struct ath_softc *sc); | ||
246 | int ath_rx_init(struct ath_softc *sc, int nbufs); | ||
247 | void ath_rx_cleanup(struct ath_softc *sc); | ||
248 | int ath_rx_tasklet(struct ath_softc *sc, int flush); | ||
249 | |||
250 | #define ATH_TXBUF 512 | 296 | #define ATH_TXBUF 512 |
251 | #define ATH_TXMAXTRY 13 | 297 | #define ATH_TXMAXTRY 13 |
252 | #define ATH_11N_TXMAXTRY 10 | 298 | #define ATH_11N_TXMAXTRY 10 |
@@ -254,19 +300,61 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush); | |||
254 | #define WME_BA_BMP_SIZE 64 | 300 | #define WME_BA_BMP_SIZE 64 |
255 | #define WME_MAX_BA WME_BA_BMP_SIZE | 301 | #define WME_MAX_BA WME_BA_BMP_SIZE |
256 | #define ATH_TID_MAX_BUFS (2 * WME_MAX_BA) | 302 | #define ATH_TID_MAX_BUFS (2 * WME_MAX_BA) |
303 | |||
257 | #define TID_TO_WME_AC(_tid) \ | 304 | #define TID_TO_WME_AC(_tid) \ |
258 | ((((_tid) == 0) || ((_tid) == 3)) ? WME_AC_BE : \ | 305 | ((((_tid) == 0) || ((_tid) == 3)) ? WME_AC_BE : \ |
259 | (((_tid) == 1) || ((_tid) == 2)) ? WME_AC_BK : \ | 306 | (((_tid) == 1) || ((_tid) == 2)) ? WME_AC_BK : \ |
260 | (((_tid) == 4) || ((_tid) == 5)) ? WME_AC_VI : \ | 307 | (((_tid) == 4) || ((_tid) == 5)) ? WME_AC_VI : \ |
261 | WME_AC_VO) | 308 | WME_AC_VO) |
262 | 309 | ||
263 | |||
264 | #define WME_AC_BE 0 | 310 | #define WME_AC_BE 0 |
265 | #define WME_AC_BK 1 | 311 | #define WME_AC_BK 1 |
266 | #define WME_AC_VI 2 | 312 | #define WME_AC_VI 2 |
267 | #define WME_AC_VO 3 | 313 | #define WME_AC_VO 3 |
268 | #define WME_NUM_AC 4 | 314 | #define WME_NUM_AC 4 |
269 | 315 | ||
316 | #define ADDBA_EXCHANGE_ATTEMPTS 10 | ||
317 | #define ATH_AGGR_DELIM_SZ 4 | ||
318 | #define ATH_AGGR_MINPLEN 256 /* in bytes, minimum packet length */ | ||
319 | /* number of delimiters for encryption padding */ | ||
320 | #define ATH_AGGR_ENCRYPTDELIM 10 | ||
321 | /* minimum h/w qdepth to be sustained to maximize aggregation */ | ||
322 | #define ATH_AGGR_MIN_QDEPTH 2 | ||
323 | #define ATH_AMPDU_SUBFRAME_DEFAULT 32 | ||
324 | #define IEEE80211_SEQ_SEQ_SHIFT 4 | ||
325 | #define IEEE80211_SEQ_MAX 4096 | ||
326 | #define IEEE80211_MIN_AMPDU_BUF 0x8 | ||
327 | #define IEEE80211_HTCAP_MAXRXAMPDU_FACTOR 13 | ||
328 | |||
329 | /* return whether a bit at index _n in bitmap _bm is set | ||
330 | * _sz is the size of the bitmap */ | ||
331 | #define ATH_BA_ISSET(_bm, _n) (((_n) < (WME_BA_BMP_SIZE)) && \ | ||
332 | ((_bm)[(_n) >> 5] & (1 << ((_n) & 31)))) | ||
333 | |||
334 | /* return block-ack bitmap index given sequence and starting sequence */ | ||
335 | #define ATH_BA_INDEX(_st, _seq) (((_seq) - (_st)) & (IEEE80211_SEQ_MAX - 1)) | ||
336 | |||
337 | /* returns delimiter padding required given the packet length */ | ||
338 | #define ATH_AGGR_GET_NDELIM(_len) \ | ||
339 | (((((_len) + ATH_AGGR_DELIM_SZ) < ATH_AGGR_MINPLEN) ? \ | ||
340 | (ATH_AGGR_MINPLEN - (_len) - ATH_AGGR_DELIM_SZ) : 0) >> 2) | ||
341 | |||
342 | #define BAW_WITHIN(_start, _bawsz, _seqno) \ | ||
343 | ((((_seqno) - (_start)) & 4095) < (_bawsz)) | ||
344 | |||
345 | #define ATH_DS_BA_SEQ(_ds) ((_ds)->ds_us.tx.ts_seqnum) | ||
346 | #define ATH_DS_BA_BITMAP(_ds) (&(_ds)->ds_us.tx.ba_low) | ||
347 | #define ATH_DS_TX_BA(_ds) ((_ds)->ds_us.tx.ts_flags & ATH9K_TX_BA) | ||
348 | #define ATH_AN_2_TID(_an, _tidno) (&(_an)->tid[(_tidno)]) | ||
349 | |||
350 | enum ATH_AGGR_STATUS { | ||
351 | ATH_AGGR_DONE, | ||
352 | ATH_AGGR_BAW_CLOSED, | ||
353 | ATH_AGGR_LIMITED, | ||
354 | ATH_AGGR_SHORTPKT, | ||
355 | ATH_AGGR_8K_LIMITED, | ||
356 | }; | ||
357 | |||
270 | struct ath_txq { | 358 | struct ath_txq { |
271 | u32 axq_qnum; /* hardware q number */ | 359 | u32 axq_qnum; /* hardware q number */ |
272 | u32 *axq_link; /* link ptr in last TX desc */ | 360 | u32 *axq_link; /* link ptr in last TX desc */ |
@@ -276,7 +364,6 @@ struct ath_txq { | |||
276 | u32 axq_depth; /* queue depth */ | 364 | u32 axq_depth; /* queue depth */ |
277 | u8 axq_aggr_depth; /* aggregates queued */ | 365 | u8 axq_aggr_depth; /* aggregates queued */ |
278 | u32 axq_totalqueued; /* total ever queued */ | 366 | u32 axq_totalqueued; /* total ever queued */ |
279 | |||
280 | bool stopped; /* Is mac80211 queue stopped ? */ | 367 | bool stopped; /* Is mac80211 queue stopped ? */ |
281 | struct ath_buf *axq_linkbuf; /* virtual addr of last buffer*/ | 368 | struct ath_buf *axq_linkbuf; /* virtual addr of last buffer*/ |
282 | 369 | ||
@@ -322,12 +409,6 @@ struct ath_atx_ac { | |||
322 | struct list_head tid_q; /* queue of TIDs with buffers */ | 409 | struct list_head tid_q; /* queue of TIDs with buffers */ |
323 | }; | 410 | }; |
324 | 411 | ||
325 | /* per dest tx state */ | ||
326 | struct ath_atx { | ||
327 | struct ath_atx_tid tid[WME_NUM_TID]; | ||
328 | struct ath_atx_ac ac[WME_NUM_AC]; | ||
329 | }; | ||
330 | |||
331 | /* per-frame tx control block */ | 412 | /* per-frame tx control block */ |
332 | struct ath_tx_control { | 413 | struct ath_tx_control { |
333 | struct ath_txq *txq; | 414 | struct ath_txq *txq; |
@@ -353,13 +434,54 @@ struct ath_tx_stat { | |||
353 | int rateKbps; | 434 | int rateKbps; |
354 | int ratecode; | 435 | int ratecode; |
355 | int flags; | 436 | int flags; |
356 | /* if any of ctl,extn chain rssis are valid */ | ||
357 | #define ATH_TX_CHAIN_RSSI_VALID 0x01 | ||
358 | /* if extn chain rssis are valid */ | ||
359 | #define ATH_TX_RSSI_EXTN_VALID 0x02 | ||
360 | u32 airtime; /* time on air per final tx rate */ | 437 | u32 airtime; /* time on air per final tx rate */ |
361 | }; | 438 | }; |
362 | 439 | ||
440 | struct aggr_rifs_param { | ||
441 | int param_max_frames; | ||
442 | int param_max_len; | ||
443 | int param_rl; | ||
444 | int param_al; | ||
445 | struct ath_rc_series *param_rcs; | ||
446 | }; | ||
447 | |||
448 | struct ath_node { | ||
449 | struct ath_softc *an_sc; | ||
450 | struct ath_atx_tid tid[WME_NUM_TID]; | ||
451 | struct ath_atx_ac ac[WME_NUM_AC]; | ||
452 | u16 maxampdu; | ||
453 | u8 mpdudensity; | ||
454 | }; | ||
455 | |||
456 | struct ath_tx { | ||
457 | u16 seq_no; | ||
458 | u32 txqsetup; | ||
459 | int hwq_map[ATH9K_WME_AC_VO+1]; | ||
460 | spinlock_t txbuflock; | ||
461 | struct list_head txbuf; | ||
462 | struct ath_txq txq[ATH9K_NUM_TX_QUEUES]; | ||
463 | struct ath_descdma txdma; | ||
464 | }; | ||
465 | |||
466 | struct ath_rx { | ||
467 | u8 defant; | ||
468 | u8 rxotherant; | ||
469 | u32 *rxlink; | ||
470 | int bufsize; | ||
471 | unsigned int rxfilter; | ||
472 | spinlock_t rxflushlock; | ||
473 | spinlock_t rxbuflock; | ||
474 | struct list_head rxbuf; | ||
475 | struct ath_descdma rxdma; | ||
476 | }; | ||
477 | |||
478 | int ath_startrecv(struct ath_softc *sc); | ||
479 | bool ath_stoprecv(struct ath_softc *sc); | ||
480 | void ath_flushrecv(struct ath_softc *sc); | ||
481 | u32 ath_calcrxfilter(struct ath_softc *sc); | ||
482 | int ath_rx_init(struct ath_softc *sc, int nbufs); | ||
483 | void ath_rx_cleanup(struct ath_softc *sc); | ||
484 | int ath_rx_tasklet(struct ath_softc *sc, int flush); | ||
363 | struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype); | 485 | struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype); |
364 | void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq); | 486 | void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq); |
365 | int ath_tx_setup(struct ath_softc *sc, int haltype); | 487 | int ath_tx_setup(struct ath_softc *sc, int haltype); |
@@ -382,73 +504,6 @@ void ath_tx_tasklet(struct ath_softc *sc); | |||
382 | u32 ath_txq_depth(struct ath_softc *sc, int qnum); | 504 | u32 ath_txq_depth(struct ath_softc *sc, int qnum); |
383 | u32 ath_txq_aggr_depth(struct ath_softc *sc, int qnum); | 505 | u32 ath_txq_aggr_depth(struct ath_softc *sc, int qnum); |
384 | void ath_tx_cabq(struct ath_softc *sc, struct sk_buff *skb); | 506 | void ath_tx_cabq(struct ath_softc *sc, struct sk_buff *skb); |
385 | |||
386 | /**********************/ | ||
387 | /* Node / Aggregation */ | ||
388 | /**********************/ | ||
389 | |||
390 | #define ADDBA_EXCHANGE_ATTEMPTS 10 | ||
391 | #define ATH_AGGR_DELIM_SZ 4 | ||
392 | #define ATH_AGGR_MINPLEN 256 /* in bytes, minimum packet length */ | ||
393 | /* number of delimiters for encryption padding */ | ||
394 | #define ATH_AGGR_ENCRYPTDELIM 10 | ||
395 | /* minimum h/w qdepth to be sustained to maximize aggregation */ | ||
396 | #define ATH_AGGR_MIN_QDEPTH 2 | ||
397 | #define ATH_AMPDU_SUBFRAME_DEFAULT 32 | ||
398 | #define IEEE80211_SEQ_SEQ_SHIFT 4 | ||
399 | #define IEEE80211_SEQ_MAX 4096 | ||
400 | #define IEEE80211_MIN_AMPDU_BUF 0x8 | ||
401 | #define IEEE80211_HTCAP_MAXRXAMPDU_FACTOR 13 | ||
402 | |||
403 | /* return whether a bit at index _n in bitmap _bm is set | ||
404 | * _sz is the size of the bitmap */ | ||
405 | #define ATH_BA_ISSET(_bm, _n) (((_n) < (WME_BA_BMP_SIZE)) && \ | ||
406 | ((_bm)[(_n) >> 5] & (1 << ((_n) & 31)))) | ||
407 | |||
408 | /* return block-ack bitmap index given sequence and starting sequence */ | ||
409 | #define ATH_BA_INDEX(_st, _seq) (((_seq) - (_st)) & (IEEE80211_SEQ_MAX - 1)) | ||
410 | |||
411 | /* returns delimiter padding required given the packet length */ | ||
412 | #define ATH_AGGR_GET_NDELIM(_len) \ | ||
413 | (((((_len) + ATH_AGGR_DELIM_SZ) < ATH_AGGR_MINPLEN) ? \ | ||
414 | (ATH_AGGR_MINPLEN - (_len) - ATH_AGGR_DELIM_SZ) : 0) >> 2) | ||
415 | |||
416 | #define BAW_WITHIN(_start, _bawsz, _seqno) \ | ||
417 | ((((_seqno) - (_start)) & 4095) < (_bawsz)) | ||
418 | |||
419 | #define ATH_DS_BA_SEQ(_ds) ((_ds)->ds_us.tx.ts_seqnum) | ||
420 | #define ATH_DS_BA_BITMAP(_ds) (&(_ds)->ds_us.tx.ba_low) | ||
421 | #define ATH_DS_TX_BA(_ds) ((_ds)->ds_us.tx.ts_flags & ATH9K_TX_BA) | ||
422 | #define ATH_AN_2_TID(_an, _tidno) (&(_an)->an_aggr.tx.tid[(_tidno)]) | ||
423 | |||
424 | enum ATH_AGGR_STATUS { | ||
425 | ATH_AGGR_DONE, | ||
426 | ATH_AGGR_BAW_CLOSED, | ||
427 | ATH_AGGR_LIMITED, | ||
428 | ATH_AGGR_SHORTPKT, | ||
429 | ATH_AGGR_8K_LIMITED, | ||
430 | }; | ||
431 | |||
432 | struct aggr_rifs_param { | ||
433 | int param_max_frames; | ||
434 | int param_max_len; | ||
435 | int param_rl; | ||
436 | int param_al; | ||
437 | struct ath_rc_series *param_rcs; | ||
438 | }; | ||
439 | |||
440 | /* Per-node aggregation state */ | ||
441 | struct ath_node_aggr { | ||
442 | struct ath_atx tx; | ||
443 | }; | ||
444 | |||
445 | struct ath_node { | ||
446 | struct ath_softc *an_sc; | ||
447 | struct ath_node_aggr an_aggr; | ||
448 | u16 maxampdu; | ||
449 | u8 mpdudensity; | ||
450 | }; | ||
451 | |||
452 | void ath_tx_resume_tid(struct ath_softc *sc, struct ath_atx_tid *tid); | 507 | void ath_tx_resume_tid(struct ath_softc *sc, struct ath_atx_tid *tid); |
453 | bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno); | 508 | bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno); |
454 | void ath_tx_aggr_teardown(struct ath_softc *sc, struct ath_node *an, u8 tidno); | 509 | void ath_tx_aggr_teardown(struct ath_softc *sc, struct ath_node *an, u8 tidno); |
@@ -489,7 +544,7 @@ struct ath_vap { | |||
489 | * number of beacon intervals, the game's up. | 544 | * number of beacon intervals, the game's up. |
490 | */ | 545 | */ |
491 | #define BSTUCK_THRESH (9 * ATH_BCBUF) | 546 | #define BSTUCK_THRESH (9 * ATH_BCBUF) |
492 | #define ATH_BCBUF 4 | 547 | #define ATH_BCBUF 1 |
493 | #define ATH_DEFAULT_BINTVAL 100 /* TU */ | 548 | #define ATH_DEFAULT_BINTVAL 100 /* TU */ |
494 | #define ATH_DEFAULT_BMISS_LIMIT 10 | 549 | #define ATH_DEFAULT_BMISS_LIMIT 10 |
495 | #define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024) | 550 | #define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024) |
@@ -507,6 +562,26 @@ struct ath_beacon_config { | |||
507 | } u; /* last received beacon/probe response timestamp of this BSS. */ | 562 | } u; /* last received beacon/probe response timestamp of this BSS. */ |
508 | }; | 563 | }; |
509 | 564 | ||
565 | struct ath_beacon { | ||
566 | enum { | ||
567 | OK, /* no change needed */ | ||
568 | UPDATE, /* update pending */ | ||
569 | COMMIT /* beacon sent, commit change */ | ||
570 | } updateslot; /* slot time update fsm */ | ||
571 | |||
572 | u32 beaconq; | ||
573 | u32 bmisscnt; | ||
574 | u32 ast_be_xmit; | ||
575 | u64 bc_tstamp; | ||
576 | int bslot[ATH_BCBUF]; | ||
577 | int slottime; | ||
578 | int slotupdate; | ||
579 | struct ath9k_tx_queue_info beacon_qi; | ||
580 | struct ath_descdma bdma; | ||
581 | struct ath_txq *cabq; | ||
582 | struct list_head bbuf; | ||
583 | }; | ||
584 | |||
510 | void ath9k_beacon_tasklet(unsigned long data); | 585 | void ath9k_beacon_tasklet(unsigned long data); |
511 | void ath_beacon_config(struct ath_softc *sc, int if_id); | 586 | void ath_beacon_config(struct ath_softc *sc, int if_id); |
512 | int ath_beaconq_setup(struct ath_hal *ah); | 587 | int ath_beaconq_setup(struct ath_hal *ah); |
@@ -577,7 +652,7 @@ struct ath_rfkill { | |||
577 | #define DEFAULT_CACHELINE 32 | 652 | #define DEFAULT_CACHELINE 32 |
578 | #define ATH_DEFAULT_NOISE_FLOOR -95 | 653 | #define ATH_DEFAULT_NOISE_FLOOR -95 |
579 | #define ATH_REGCLASSIDS_MAX 10 | 654 | #define ATH_REGCLASSIDS_MAX 10 |
580 | #define ATH_CABQ_READY_TIME 80 /* % of beacon interval */ | 655 | #define ATH_CABQ_READY_TIME 80 /* % of beacon interval */ |
581 | #define ATH_MAX_SW_RETRIES 10 | 656 | #define ATH_MAX_SW_RETRIES 10 |
582 | #define ATH_CHAN_MAX 255 | 657 | #define ATH_CHAN_MAX 255 |
583 | #define IEEE80211_WEP_NKID 4 /* number of key ids */ | 658 | #define IEEE80211_WEP_NKID 4 /* number of key ids */ |
@@ -590,7 +665,7 @@ struct ath_rfkill { | |||
590 | * Different parts have different size key caches. We handle | 665 | * Different parts have different size key caches. We handle |
591 | * up to ATH_KEYMAX entries (could dynamically allocate state). | 666 | * up to ATH_KEYMAX entries (could dynamically allocate state). |
592 | */ | 667 | */ |
593 | #define ATH_KEYMAX 128 /* max key cache size we handle */ | 668 | #define ATH_KEYMAX 128 /* max key cache size we handle */ |
594 | 669 | ||
595 | #define ATH_IF_ID_ANY 0xff | 670 | #define ATH_IF_ID_ANY 0xff |
596 | #define ATH_TXPOWER_MAX 100 /* .5 dBm units */ | 671 | #define ATH_TXPOWER_MAX 100 /* .5 dBm units */ |
@@ -623,108 +698,51 @@ struct ath_softc { | |||
623 | struct pci_dev *pdev; | 698 | struct pci_dev *pdev; |
624 | struct tasklet_struct intr_tq; | 699 | struct tasklet_struct intr_tq; |
625 | struct tasklet_struct bcon_tasklet; | 700 | struct tasklet_struct bcon_tasklet; |
626 | struct ath_config sc_config; | ||
627 | struct ath_hal *sc_ah; | 701 | struct ath_hal *sc_ah; |
628 | void __iomem *mem; | 702 | void __iomem *mem; |
703 | spinlock_t sc_resetlock; | ||
629 | 704 | ||
630 | u8 sc_curbssid[ETH_ALEN]; | 705 | u8 sc_curbssid[ETH_ALEN]; |
631 | u8 sc_myaddr[ETH_ALEN]; | 706 | u8 sc_myaddr[ETH_ALEN]; |
632 | u8 sc_bssidmask[ETH_ALEN]; | 707 | u8 sc_bssidmask[ETH_ALEN]; |
633 | |||
634 | #ifdef CONFIG_ATH9K_DEBUG | ||
635 | struct ath9k_debug sc_debug; | ||
636 | #endif | ||
637 | u32 sc_intrstatus; | 708 | u32 sc_intrstatus; |
638 | u32 sc_flags; /* SC_OP_* */ | 709 | u32 sc_flags; /* SC_OP_* */ |
639 | unsigned int rx_filter; | ||
640 | u16 sc_curtxpow; | 710 | u16 sc_curtxpow; |
641 | u16 sc_curaid; | 711 | u16 sc_curaid; |
642 | u16 sc_cachelsz; | 712 | u16 sc_cachelsz; |
643 | int sc_slotupdate; /* slot to next advance fsm */ | 713 | u8 sc_nbcnvaps; |
644 | int sc_slottime; | 714 | u16 sc_nvaps; |
645 | int sc_bslot[ATH_BCBUF]; | ||
646 | u8 sc_tx_chainmask; | 715 | u8 sc_tx_chainmask; |
647 | u8 sc_rx_chainmask; | 716 | u8 sc_rx_chainmask; |
717 | u32 sc_keymax; | ||
718 | DECLARE_BITMAP(sc_keymap, ATH_KEYMAX); | ||
719 | u8 sc_splitmic; | ||
720 | u8 sc_protrix; | ||
648 | enum ath9k_int sc_imask; | 721 | enum ath9k_int sc_imask; |
649 | enum wireless_mode sc_curmode; | ||
650 | enum PROT_MODE sc_protmode; | 722 | enum PROT_MODE sc_protmode; |
651 | |||
652 | u8 sc_nbcnvaps; | ||
653 | u16 sc_nvaps; | ||
654 | struct ieee80211_vif *sc_vaps[ATH_BCBUF]; | ||
655 | |||
656 | u8 sc_mcastantenna; | ||
657 | u8 sc_defant; | ||
658 | u8 sc_rxotherant; | ||
659 | |||
660 | struct ath9k_node_stats sc_halstats; | ||
661 | enum ath9k_ht_extprotspacing sc_ht_extprotspacing; | 723 | enum ath9k_ht_extprotspacing sc_ht_extprotspacing; |
662 | enum ath9k_ht_macmode tx_chan_width; | 724 | enum ath9k_ht_macmode tx_chan_width; |
663 | 725 | ||
664 | #ifdef CONFIG_SLOW_ANT_DIV | 726 | struct ath_config sc_config; |
665 | struct ath_antdiv sc_antdiv; | 727 | struct ath_rx rx; |
666 | #endif | 728 | struct ath_tx tx; |
667 | enum { | 729 | struct ath_beacon beacon; |
668 | OK, /* no change needed */ | 730 | struct ieee80211_vif *sc_vaps[ATH_BCBUF]; |
669 | UPDATE, /* update pending */ | ||
670 | COMMIT /* beacon sent, commit change */ | ||
671 | } sc_updateslot; /* slot time update fsm */ | ||
672 | |||
673 | /* Crypto */ | ||
674 | u32 sc_keymax; | ||
675 | DECLARE_BITMAP(sc_keymap, ATH_KEYMAX); | ||
676 | u8 sc_splitmic; /* split TKIP MIC keys */ | ||
677 | |||
678 | /* RX */ | ||
679 | struct list_head sc_rxbuf; | ||
680 | struct ath_descdma sc_rxdma; | ||
681 | int sc_rxbufsize; | ||
682 | u32 *sc_rxlink; | ||
683 | |||
684 | /* TX */ | ||
685 | struct list_head sc_txbuf; | ||
686 | struct ath_txq sc_txq[ATH9K_NUM_TX_QUEUES]; | ||
687 | struct ath_descdma sc_txdma; | ||
688 | u32 sc_txqsetup; | ||
689 | int sc_haltype2q[ATH9K_WME_AC_VO+1]; | ||
690 | u16 seq_no; /* TX sequence number */ | ||
691 | |||
692 | /* Beacon */ | ||
693 | struct ath9k_tx_queue_info sc_beacon_qi; | ||
694 | struct ath_descdma sc_bdma; | ||
695 | struct ath_txq *sc_cabq; | ||
696 | struct list_head sc_bbuf; | ||
697 | u32 sc_bhalq; | ||
698 | u32 sc_bmisscount; | ||
699 | u32 ast_be_xmit; | ||
700 | u64 bc_tstamp; | ||
701 | |||
702 | /* Rate */ | ||
703 | struct ieee80211_rate rates[IEEE80211_NUM_BANDS][ATH_RATE_MAX]; | 731 | struct ieee80211_rate rates[IEEE80211_NUM_BANDS][ATH_RATE_MAX]; |
704 | struct ath_rate_table *hw_rate_table[ATH9K_MODE_MAX]; | 732 | struct ath_rate_table *hw_rate_table[ATH9K_MODE_MAX]; |
705 | u8 sc_protrix; | 733 | struct ath_rate_table *cur_rate_table; |
706 | |||
707 | /* Channel, Band */ | ||
708 | struct ieee80211_channel channels[IEEE80211_NUM_BANDS][ATH_CHAN_MAX]; | 734 | struct ieee80211_channel channels[IEEE80211_NUM_BANDS][ATH_CHAN_MAX]; |
709 | struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; | 735 | struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; |
710 | |||
711 | /* Locks */ | ||
712 | spinlock_t sc_rxflushlock; | ||
713 | spinlock_t sc_rxbuflock; | ||
714 | spinlock_t sc_txbuflock; | ||
715 | spinlock_t sc_resetlock; | ||
716 | |||
717 | /* LEDs */ | ||
718 | struct ath_led radio_led; | 736 | struct ath_led radio_led; |
719 | struct ath_led assoc_led; | 737 | struct ath_led assoc_led; |
720 | struct ath_led tx_led; | 738 | struct ath_led tx_led; |
721 | struct ath_led rx_led; | 739 | struct ath_led rx_led; |
722 | |||
723 | /* Rfkill */ | ||
724 | struct ath_rfkill rf_kill; | 740 | struct ath_rfkill rf_kill; |
725 | |||
726 | /* ANI */ | ||
727 | struct ath_ani sc_ani; | 741 | struct ath_ani sc_ani; |
742 | struct ath9k_node_stats sc_halstats; | ||
743 | #ifdef CONFIG_ATH9K_DEBUG | ||
744 | struct ath9k_debug sc_debug; | ||
745 | #endif | ||
728 | }; | 746 | }; |
729 | 747 | ||
730 | int ath_reset(struct ath_softc *sc, bool retry_tx); | 748 | int ath_reset(struct ath_softc *sc, bool retry_tx); |
diff --git a/drivers/net/wireless/ath9k/debug.c b/drivers/net/wireless/ath9k/debug.c index da52812c3a94..a80ed576830f 100644 --- a/drivers/net/wireless/ath9k/debug.c +++ b/drivers/net/wireless/ath9k/debug.c | |||
@@ -128,6 +128,100 @@ static const struct file_operations fops_dma = { | |||
128 | .owner = THIS_MODULE | 128 | .owner = THIS_MODULE |
129 | }; | 129 | }; |
130 | 130 | ||
131 | |||
132 | void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status) | ||
133 | { | ||
134 | if (status) | ||
135 | sc->sc_debug.stats.istats.total++; | ||
136 | if (status & ATH9K_INT_RX) | ||
137 | sc->sc_debug.stats.istats.rxok++; | ||
138 | if (status & ATH9K_INT_RXEOL) | ||
139 | sc->sc_debug.stats.istats.rxeol++; | ||
140 | if (status & ATH9K_INT_RXORN) | ||
141 | sc->sc_debug.stats.istats.rxorn++; | ||
142 | if (status & ATH9K_INT_TX) | ||
143 | sc->sc_debug.stats.istats.txok++; | ||
144 | if (status & ATH9K_INT_TXURN) | ||
145 | sc->sc_debug.stats.istats.txurn++; | ||
146 | if (status & ATH9K_INT_MIB) | ||
147 | sc->sc_debug.stats.istats.mib++; | ||
148 | if (status & ATH9K_INT_RXPHY) | ||
149 | sc->sc_debug.stats.istats.rxphyerr++; | ||
150 | if (status & ATH9K_INT_RXKCM) | ||
151 | sc->sc_debug.stats.istats.rx_keycache_miss++; | ||
152 | if (status & ATH9K_INT_SWBA) | ||
153 | sc->sc_debug.stats.istats.swba++; | ||
154 | if (status & ATH9K_INT_BMISS) | ||
155 | sc->sc_debug.stats.istats.bmiss++; | ||
156 | if (status & ATH9K_INT_BNR) | ||
157 | sc->sc_debug.stats.istats.bnr++; | ||
158 | if (status & ATH9K_INT_CST) | ||
159 | sc->sc_debug.stats.istats.cst++; | ||
160 | if (status & ATH9K_INT_GTT) | ||
161 | sc->sc_debug.stats.istats.gtt++; | ||
162 | if (status & ATH9K_INT_TIM) | ||
163 | sc->sc_debug.stats.istats.tim++; | ||
164 | if (status & ATH9K_INT_CABEND) | ||
165 | sc->sc_debug.stats.istats.cabend++; | ||
166 | if (status & ATH9K_INT_DTIMSYNC) | ||
167 | sc->sc_debug.stats.istats.dtimsync++; | ||
168 | if (status & ATH9K_INT_DTIM) | ||
169 | sc->sc_debug.stats.istats.dtim++; | ||
170 | } | ||
171 | |||
172 | static ssize_t read_file_interrupt(struct file *file, char __user *user_buf, | ||
173 | size_t count, loff_t *ppos) | ||
174 | { | ||
175 | struct ath_softc *sc = file->private_data; | ||
176 | char buf[512]; | ||
177 | unsigned int len = 0; | ||
178 | |||
179 | len += snprintf(buf + len, sizeof(buf) - len, | ||
180 | "%8s: %10u\n", "RX", sc->sc_debug.stats.istats.rxok); | ||
181 | len += snprintf(buf + len, sizeof(buf) - len, | ||
182 | "%8s: %10u\n", "RXEOL", sc->sc_debug.stats.istats.rxeol); | ||
183 | len += snprintf(buf + len, sizeof(buf) - len, | ||
184 | "%8s: %10u\n", "RXORN", sc->sc_debug.stats.istats.rxorn); | ||
185 | len += snprintf(buf + len, sizeof(buf) - len, | ||
186 | "%8s: %10u\n", "TX", sc->sc_debug.stats.istats.txok); | ||
187 | len += snprintf(buf + len, sizeof(buf) - len, | ||
188 | "%8s: %10u\n", "TXURN", sc->sc_debug.stats.istats.txurn); | ||
189 | len += snprintf(buf + len, sizeof(buf) - len, | ||
190 | "%8s: %10u\n", "MIB", sc->sc_debug.stats.istats.mib); | ||
191 | len += snprintf(buf + len, sizeof(buf) - len, | ||
192 | "%8s: %10u\n", "RXPHY", sc->sc_debug.stats.istats.rxphyerr); | ||
193 | len += snprintf(buf + len, sizeof(buf) - len, | ||
194 | "%8s: %10u\n", "RXKCM", sc->sc_debug.stats.istats.rx_keycache_miss); | ||
195 | len += snprintf(buf + len, sizeof(buf) - len, | ||
196 | "%8s: %10u\n", "SWBA", sc->sc_debug.stats.istats.swba); | ||
197 | len += snprintf(buf + len, sizeof(buf) - len, | ||
198 | "%8s: %10u\n", "BMISS", sc->sc_debug.stats.istats.bmiss); | ||
199 | len += snprintf(buf + len, sizeof(buf) - len, | ||
200 | "%8s: %10u\n", "BNR", sc->sc_debug.stats.istats.bnr); | ||
201 | len += snprintf(buf + len, sizeof(buf) - len, | ||
202 | "%8s: %10u\n", "CST", sc->sc_debug.stats.istats.cst); | ||
203 | len += snprintf(buf + len, sizeof(buf) - len, | ||
204 | "%8s: %10u\n", "GTT", sc->sc_debug.stats.istats.gtt); | ||
205 | len += snprintf(buf + len, sizeof(buf) - len, | ||
206 | "%8s: %10u\n", "TIM", sc->sc_debug.stats.istats.tim); | ||
207 | len += snprintf(buf + len, sizeof(buf) - len, | ||
208 | "%8s: %10u\n", "CABEND", sc->sc_debug.stats.istats.cabend); | ||
209 | len += snprintf(buf + len, sizeof(buf) - len, | ||
210 | "%8s: %10u\n", "DTIMSYNC", sc->sc_debug.stats.istats.dtimsync); | ||
211 | len += snprintf(buf + len, sizeof(buf) - len, | ||
212 | "%8s: %10u\n", "DTIM", sc->sc_debug.stats.istats.dtim); | ||
213 | len += snprintf(buf + len, sizeof(buf) - len, | ||
214 | "%8s: %10u\n", "TOTAL", sc->sc_debug.stats.istats.total); | ||
215 | |||
216 | return simple_read_from_buffer(user_buf, count, ppos, buf, len); | ||
217 | } | ||
218 | |||
219 | static const struct file_operations fops_interrupt = { | ||
220 | .read = read_file_interrupt, | ||
221 | .open = ath9k_debugfs_open, | ||
222 | .owner = THIS_MODULE | ||
223 | }; | ||
224 | |||
131 | int ath9k_init_debug(struct ath_softc *sc) | 225 | int ath9k_init_debug(struct ath_softc *sc) |
132 | { | 226 | { |
133 | sc->sc_debug.debug_mask = ath9k_debug; | 227 | sc->sc_debug.debug_mask = ath9k_debug; |
@@ -146,6 +240,13 @@ int ath9k_init_debug(struct ath_softc *sc) | |||
146 | if (!sc->sc_debug.debugfs_dma) | 240 | if (!sc->sc_debug.debugfs_dma) |
147 | goto err; | 241 | goto err; |
148 | 242 | ||
243 | sc->sc_debug.debugfs_interrupt = debugfs_create_file("interrupt", | ||
244 | S_IRUGO, | ||
245 | sc->sc_debug.debugfs_phy, | ||
246 | sc, &fops_interrupt); | ||
247 | if (!sc->sc_debug.debugfs_interrupt) | ||
248 | goto err; | ||
249 | |||
149 | return 0; | 250 | return 0; |
150 | err: | 251 | err: |
151 | ath9k_exit_debug(sc); | 252 | ath9k_exit_debug(sc); |
@@ -154,6 +255,7 @@ err: | |||
154 | 255 | ||
155 | void ath9k_exit_debug(struct ath_softc *sc) | 256 | void ath9k_exit_debug(struct ath_softc *sc) |
156 | { | 257 | { |
258 | debugfs_remove(sc->sc_debug.debugfs_interrupt); | ||
157 | debugfs_remove(sc->sc_debug.debugfs_dma); | 259 | debugfs_remove(sc->sc_debug.debugfs_dma); |
158 | debugfs_remove(sc->sc_debug.debugfs_phy); | 260 | debugfs_remove(sc->sc_debug.debugfs_phy); |
159 | debugfs_remove(sc->sc_debug.debugfs_root); | 261 | debugfs_remove(sc->sc_debug.debugfs_root); |
diff --git a/drivers/net/wireless/ath9k/eeprom.c b/drivers/net/wireless/ath9k/eeprom.c index e180c9043df6..14f8d40c1427 100644 --- a/drivers/net/wireless/ath9k/eeprom.c +++ b/drivers/net/wireless/ath9k/eeprom.c | |||
@@ -140,61 +140,97 @@ static inline bool ath9k_hw_nvram_read(struct ath_hal *ah, u32 off, u16 *data) | |||
140 | return ath9k_hw_eeprom_read(ah, off, data); | 140 | return ath9k_hw_eeprom_read(ah, off, data); |
141 | } | 141 | } |
142 | 142 | ||
143 | static bool ath9k_hw_fill_eeprom(struct ath_hal *ah) | 143 | static bool ath9k_hw_fill_4k_eeprom(struct ath_hal *ah) |
144 | { | 144 | { |
145 | #define SIZE_EEPROM_4K (sizeof(struct ar5416_eeprom_4k) / sizeof(u16)) | ||
145 | struct ath_hal_5416 *ahp = AH5416(ah); | 146 | struct ath_hal_5416 *ahp = AH5416(ah); |
146 | struct ar5416_eeprom *eep = &ahp->ah_eeprom; | 147 | struct ar5416_eeprom_4k *eep = &ahp->ah_eeprom.map4k; |
147 | u16 *eep_data; | 148 | u16 *eep_data; |
148 | int addr, ar5416_eep_start_loc = 0; | 149 | int addr, eep_start_loc = 0; |
150 | |||
151 | eep_start_loc = 64; | ||
149 | 152 | ||
150 | if (!ath9k_hw_use_flash(ah)) { | 153 | if (!ath9k_hw_use_flash(ah)) { |
151 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | 154 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, |
152 | "Reading from EEPROM, not flash\n"); | 155 | "Reading from EEPROM, not flash\n"); |
153 | ar5416_eep_start_loc = 256; | ||
154 | } | 156 | } |
155 | 157 | ||
156 | if (AR_SREV_9100(ah)) | 158 | eep_data = (u16 *)eep; |
157 | ar5416_eep_start_loc = 256; | 159 | |
160 | for (addr = 0; addr < SIZE_EEPROM_4K; addr++) { | ||
161 | if (!ath9k_hw_nvram_read(ah, addr + eep_start_loc, eep_data)) { | ||
162 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
163 | "Unable to read eeprom region \n"); | ||
164 | return false; | ||
165 | } | ||
166 | eep_data++; | ||
167 | } | ||
168 | return true; | ||
169 | #undef SIZE_EEPROM_4K | ||
170 | } | ||
171 | |||
172 | static bool ath9k_hw_fill_def_eeprom(struct ath_hal *ah) | ||
173 | { | ||
174 | #define SIZE_EEPROM_DEF (sizeof(struct ar5416_eeprom_def) / sizeof(u16)) | ||
175 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
176 | struct ar5416_eeprom_def *eep = &ahp->ah_eeprom.def; | ||
177 | u16 *eep_data; | ||
178 | int addr, ar5416_eep_start_loc = 0x100; | ||
158 | 179 | ||
159 | eep_data = (u16 *)eep; | 180 | eep_data = (u16 *)eep; |
160 | 181 | ||
161 | for (addr = 0; addr < sizeof(struct ar5416_eeprom) / sizeof(u16); addr++) { | 182 | for (addr = 0; addr < SIZE_EEPROM_DEF; addr++) { |
162 | if (!ath9k_hw_nvram_read(ah, addr + ar5416_eep_start_loc, | 183 | if (!ath9k_hw_nvram_read(ah, addr + ar5416_eep_start_loc, |
163 | eep_data)) { | 184 | eep_data)) { |
164 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | 185 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, |
165 | "Unable to read eeprom region \n"); | 186 | "Unable to read eeprom region\n"); |
166 | return false; | 187 | return false; |
167 | } | 188 | } |
168 | eep_data++; | 189 | eep_data++; |
169 | } | 190 | } |
170 | return true; | 191 | return true; |
192 | #undef SIZE_EEPROM_DEF | ||
193 | } | ||
194 | |||
195 | bool (*ath9k_fill_eeprom[]) (struct ath_hal *) = { | ||
196 | ath9k_hw_fill_def_eeprom, | ||
197 | ath9k_hw_fill_4k_eeprom | ||
198 | }; | ||
199 | |||
200 | static inline bool ath9k_hw_fill_eeprom(struct ath_hal *ah) | ||
201 | { | ||
202 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
203 | |||
204 | return ath9k_fill_eeprom[ahp->ah_eep_map](ah); | ||
171 | } | 205 | } |
172 | 206 | ||
173 | static int ath9k_hw_check_eeprom(struct ath_hal *ah) | 207 | static int ath9k_hw_check_def_eeprom(struct ath_hal *ah) |
174 | { | 208 | { |
175 | struct ath_hal_5416 *ahp = AH5416(ah); | 209 | struct ath_hal_5416 *ahp = AH5416(ah); |
176 | struct ar5416_eeprom *eep = | 210 | struct ar5416_eeprom_def *eep = |
177 | (struct ar5416_eeprom *) &ahp->ah_eeprom; | 211 | (struct ar5416_eeprom_def *) &ahp->ah_eeprom.def; |
178 | u16 *eepdata, temp, magic, magic2; | 212 | u16 *eepdata, temp, magic, magic2; |
179 | u32 sum = 0, el; | 213 | u32 sum = 0, el; |
180 | bool need_swap = false; | 214 | bool need_swap = false; |
181 | int i, addr, size; | 215 | int i, addr, size; |
182 | 216 | ||
217 | if (!ath9k_hw_nvram_read(ah, AR5416_EEPROM_MAGIC_OFFSET, | ||
218 | &magic)) { | ||
219 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
220 | "Reading Magic # failed\n"); | ||
221 | return false; | ||
222 | } | ||
223 | |||
183 | if (!ath9k_hw_use_flash(ah)) { | 224 | if (!ath9k_hw_use_flash(ah)) { |
184 | if (!ath9k_hw_nvram_read(ah, AR5416_EEPROM_MAGIC_OFFSET, | ||
185 | &magic)) { | ||
186 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
187 | "Reading Magic # failed\n"); | ||
188 | return false; | ||
189 | } | ||
190 | 225 | ||
191 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, "Read Magic = 0x%04X\n", magic); | 226 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, |
227 | "Read Magic = 0x%04X\n", magic); | ||
192 | 228 | ||
193 | if (magic != AR5416_EEPROM_MAGIC) { | 229 | if (magic != AR5416_EEPROM_MAGIC) { |
194 | magic2 = swab16(magic); | 230 | magic2 = swab16(magic); |
195 | 231 | ||
196 | if (magic2 == AR5416_EEPROM_MAGIC) { | 232 | if (magic2 == AR5416_EEPROM_MAGIC) { |
197 | size = sizeof(struct ar5416_eeprom); | 233 | size = sizeof(struct ar5416_eeprom_def); |
198 | need_swap = true; | 234 | need_swap = true; |
199 | eepdata = (u16 *) (&ahp->ah_eeprom); | 235 | eepdata = (u16 *) (&ahp->ah_eeprom); |
200 | 236 | ||
@@ -223,12 +259,12 @@ static int ath9k_hw_check_eeprom(struct ath_hal *ah) | |||
223 | need_swap ? "True" : "False"); | 259 | need_swap ? "True" : "False"); |
224 | 260 | ||
225 | if (need_swap) | 261 | if (need_swap) |
226 | el = swab16(ahp->ah_eeprom.baseEepHeader.length); | 262 | el = swab16(ahp->ah_eeprom.def.baseEepHeader.length); |
227 | else | 263 | else |
228 | el = ahp->ah_eeprom.baseEepHeader.length; | 264 | el = ahp->ah_eeprom.def.baseEepHeader.length; |
229 | 265 | ||
230 | if (el > sizeof(struct ar5416_eeprom)) | 266 | if (el > sizeof(struct ar5416_eeprom_def)) |
231 | el = sizeof(struct ar5416_eeprom) / sizeof(u16); | 267 | el = sizeof(struct ar5416_eeprom_def) / sizeof(u16); |
232 | else | 268 | else |
233 | el = el / sizeof(u16); | 269 | el = el / sizeof(u16); |
234 | 270 | ||
@@ -297,6 +333,145 @@ static int ath9k_hw_check_eeprom(struct ath_hal *ah) | |||
297 | return 0; | 333 | return 0; |
298 | } | 334 | } |
299 | 335 | ||
336 | static int ath9k_hw_check_4k_eeprom(struct ath_hal *ah) | ||
337 | { | ||
338 | #define EEPROM_4K_SIZE (sizeof(struct ar5416_eeprom_4k) / sizeof(u16)) | ||
339 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
340 | struct ar5416_eeprom_4k *eep = | ||
341 | (struct ar5416_eeprom_4k *) &ahp->ah_eeprom.map4k; | ||
342 | u16 *eepdata, temp, magic, magic2; | ||
343 | u32 sum = 0, el; | ||
344 | bool need_swap = false; | ||
345 | int i, addr; | ||
346 | |||
347 | |||
348 | if (!ath9k_hw_use_flash(ah)) { | ||
349 | |||
350 | if (!ath9k_hw_nvram_read(ah, AR5416_EEPROM_MAGIC_OFFSET, | ||
351 | &magic)) { | ||
352 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
353 | "Reading Magic # failed\n"); | ||
354 | return false; | ||
355 | } | ||
356 | |||
357 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
358 | "Read Magic = 0x%04X\n", magic); | ||
359 | |||
360 | if (magic != AR5416_EEPROM_MAGIC) { | ||
361 | magic2 = swab16(magic); | ||
362 | |||
363 | if (magic2 == AR5416_EEPROM_MAGIC) { | ||
364 | need_swap = true; | ||
365 | eepdata = (u16 *) (&ahp->ah_eeprom); | ||
366 | |||
367 | for (addr = 0; addr < EEPROM_4K_SIZE; addr++) { | ||
368 | temp = swab16(*eepdata); | ||
369 | *eepdata = temp; | ||
370 | eepdata++; | ||
371 | |||
372 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
373 | "0x%04X ", *eepdata); | ||
374 | |||
375 | if (((addr + 1) % 6) == 0) | ||
376 | DPRINTF(ah->ah_sc, | ||
377 | ATH_DBG_EEPROM, "\n"); | ||
378 | } | ||
379 | } else { | ||
380 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
381 | "Invalid EEPROM Magic. " | ||
382 | "endianness mismatch.\n"); | ||
383 | return -EINVAL; | ||
384 | } | ||
385 | } | ||
386 | } | ||
387 | |||
388 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, "need_swap = %s.\n", | ||
389 | need_swap ? "True" : "False"); | ||
390 | |||
391 | if (need_swap) | ||
392 | el = swab16(ahp->ah_eeprom.map4k.baseEepHeader.length); | ||
393 | else | ||
394 | el = ahp->ah_eeprom.map4k.baseEepHeader.length; | ||
395 | |||
396 | if (el > sizeof(struct ar5416_eeprom_def)) | ||
397 | el = sizeof(struct ar5416_eeprom_4k) / sizeof(u16); | ||
398 | else | ||
399 | el = el / sizeof(u16); | ||
400 | |||
401 | eepdata = (u16 *)(&ahp->ah_eeprom); | ||
402 | |||
403 | for (i = 0; i < el; i++) | ||
404 | sum ^= *eepdata++; | ||
405 | |||
406 | if (need_swap) { | ||
407 | u32 integer; | ||
408 | u16 word; | ||
409 | |||
410 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
411 | "EEPROM Endianness is not native.. Changing \n"); | ||
412 | |||
413 | word = swab16(eep->baseEepHeader.length); | ||
414 | eep->baseEepHeader.length = word; | ||
415 | |||
416 | word = swab16(eep->baseEepHeader.checksum); | ||
417 | eep->baseEepHeader.checksum = word; | ||
418 | |||
419 | word = swab16(eep->baseEepHeader.version); | ||
420 | eep->baseEepHeader.version = word; | ||
421 | |||
422 | word = swab16(eep->baseEepHeader.regDmn[0]); | ||
423 | eep->baseEepHeader.regDmn[0] = word; | ||
424 | |||
425 | word = swab16(eep->baseEepHeader.regDmn[1]); | ||
426 | eep->baseEepHeader.regDmn[1] = word; | ||
427 | |||
428 | word = swab16(eep->baseEepHeader.rfSilent); | ||
429 | eep->baseEepHeader.rfSilent = word; | ||
430 | |||
431 | word = swab16(eep->baseEepHeader.blueToothOptions); | ||
432 | eep->baseEepHeader.blueToothOptions = word; | ||
433 | |||
434 | word = swab16(eep->baseEepHeader.deviceCap); | ||
435 | eep->baseEepHeader.deviceCap = word; | ||
436 | |||
437 | integer = swab32(eep->modalHeader.antCtrlCommon); | ||
438 | eep->modalHeader.antCtrlCommon = integer; | ||
439 | |||
440 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { | ||
441 | integer = swab32(eep->modalHeader.antCtrlChain[i]); | ||
442 | eep->modalHeader.antCtrlChain[i] = integer; | ||
443 | } | ||
444 | |||
445 | for (i = 0; i < AR5416_EEPROM_MODAL_SPURS; i++) { | ||
446 | word = swab16(eep->modalHeader.spurChans[i].spurChan); | ||
447 | eep->modalHeader.spurChans[i].spurChan = word; | ||
448 | } | ||
449 | } | ||
450 | |||
451 | if (sum != 0xffff || ar5416_get_eep4k_ver(ahp) != AR5416_EEP_VER || | ||
452 | ar5416_get_eep4k_rev(ahp) < AR5416_EEP_NO_BACK_VER) { | ||
453 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
454 | "Bad EEPROM checksum 0x%x or revision 0x%04x\n", | ||
455 | sum, ar5416_get_eep4k_ver(ahp)); | ||
456 | return -EINVAL; | ||
457 | } | ||
458 | |||
459 | return 0; | ||
460 | #undef EEPROM_4K_SIZE | ||
461 | } | ||
462 | |||
463 | int (*ath9k_check_eeprom[]) (struct ath_hal *) = { | ||
464 | ath9k_hw_check_def_eeprom, | ||
465 | ath9k_hw_check_4k_eeprom | ||
466 | }; | ||
467 | |||
468 | static inline int ath9k_hw_check_eeprom(struct ath_hal *ah) | ||
469 | { | ||
470 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
471 | |||
472 | return ath9k_check_eeprom[ahp->ah_eep_map](ah); | ||
473 | } | ||
474 | |||
300 | static inline bool ath9k_hw_fill_vpd_table(u8 pwrMin, u8 pwrMax, u8 *pPwrList, | 475 | static inline bool ath9k_hw_fill_vpd_table(u8 pwrMin, u8 pwrMax, u8 *pPwrList, |
301 | u8 *pVpdList, u16 numIntercepts, | 476 | u8 *pVpdList, u16 numIntercepts, |
302 | u8 *pRetVpdList) | 477 | u8 *pRetVpdList) |
@@ -326,7 +501,175 @@ static inline bool ath9k_hw_fill_vpd_table(u8 pwrMin, u8 pwrMax, u8 *pPwrList, | |||
326 | return true; | 501 | return true; |
327 | } | 502 | } |
328 | 503 | ||
329 | static void ath9k_hw_get_gain_boundaries_pdadcs(struct ath_hal *ah, | 504 | static void ath9k_hw_get_4k_gain_boundaries_pdadcs(struct ath_hal *ah, |
505 | struct ath9k_channel *chan, | ||
506 | struct cal_data_per_freq_4k *pRawDataSet, | ||
507 | u8 *bChans, u16 availPiers, | ||
508 | u16 tPdGainOverlap, int16_t *pMinCalPower, | ||
509 | u16 *pPdGainBoundaries, u8 *pPDADCValues, | ||
510 | u16 numXpdGains) | ||
511 | { | ||
512 | #define TMP_VAL_VPD_TABLE \ | ||
513 | ((vpdTableI[i][sizeCurrVpdTable - 1] + (ss - maxIndex + 1) * vpdStep)); | ||
514 | int i, j, k; | ||
515 | int16_t ss; | ||
516 | u16 idxL = 0, idxR = 0, numPiers; | ||
517 | static u8 vpdTableL[AR5416_EEP4K_NUM_PD_GAINS] | ||
518 | [AR5416_MAX_PWR_RANGE_IN_HALF_DB]; | ||
519 | static u8 vpdTableR[AR5416_EEP4K_NUM_PD_GAINS] | ||
520 | [AR5416_MAX_PWR_RANGE_IN_HALF_DB]; | ||
521 | static u8 vpdTableI[AR5416_EEP4K_NUM_PD_GAINS] | ||
522 | [AR5416_MAX_PWR_RANGE_IN_HALF_DB]; | ||
523 | |||
524 | u8 *pVpdL, *pVpdR, *pPwrL, *pPwrR; | ||
525 | u8 minPwrT4[AR5416_EEP4K_NUM_PD_GAINS]; | ||
526 | u8 maxPwrT4[AR5416_EEP4K_NUM_PD_GAINS]; | ||
527 | int16_t vpdStep; | ||
528 | int16_t tmpVal; | ||
529 | u16 sizeCurrVpdTable, maxIndex, tgtIndex; | ||
530 | bool match; | ||
531 | int16_t minDelta = 0; | ||
532 | struct chan_centers centers; | ||
533 | #define PD_GAIN_BOUNDARY_DEFAULT 58; | ||
534 | |||
535 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
536 | |||
537 | for (numPiers = 0; numPiers < availPiers; numPiers++) { | ||
538 | if (bChans[numPiers] == AR5416_BCHAN_UNUSED) | ||
539 | break; | ||
540 | } | ||
541 | |||
542 | match = ath9k_hw_get_lower_upper_index( | ||
543 | (u8)FREQ2FBIN(centers.synth_center, | ||
544 | IS_CHAN_2GHZ(chan)), bChans, numPiers, | ||
545 | &idxL, &idxR); | ||
546 | |||
547 | if (match) { | ||
548 | for (i = 0; i < numXpdGains; i++) { | ||
549 | minPwrT4[i] = pRawDataSet[idxL].pwrPdg[i][0]; | ||
550 | maxPwrT4[i] = pRawDataSet[idxL].pwrPdg[i][4]; | ||
551 | ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], | ||
552 | pRawDataSet[idxL].pwrPdg[i], | ||
553 | pRawDataSet[idxL].vpdPdg[i], | ||
554 | AR5416_EEP4K_PD_GAIN_ICEPTS, | ||
555 | vpdTableI[i]); | ||
556 | } | ||
557 | } else { | ||
558 | for (i = 0; i < numXpdGains; i++) { | ||
559 | pVpdL = pRawDataSet[idxL].vpdPdg[i]; | ||
560 | pPwrL = pRawDataSet[idxL].pwrPdg[i]; | ||
561 | pVpdR = pRawDataSet[idxR].vpdPdg[i]; | ||
562 | pPwrR = pRawDataSet[idxR].pwrPdg[i]; | ||
563 | |||
564 | minPwrT4[i] = max(pPwrL[0], pPwrR[0]); | ||
565 | |||
566 | maxPwrT4[i] = | ||
567 | min(pPwrL[AR5416_EEP4K_PD_GAIN_ICEPTS - 1], | ||
568 | pPwrR[AR5416_EEP4K_PD_GAIN_ICEPTS - 1]); | ||
569 | |||
570 | |||
571 | ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], | ||
572 | pPwrL, pVpdL, | ||
573 | AR5416_EEP4K_PD_GAIN_ICEPTS, | ||
574 | vpdTableL[i]); | ||
575 | ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], | ||
576 | pPwrR, pVpdR, | ||
577 | AR5416_EEP4K_PD_GAIN_ICEPTS, | ||
578 | vpdTableR[i]); | ||
579 | |||
580 | for (j = 0; j <= (maxPwrT4[i] - minPwrT4[i]) / 2; j++) { | ||
581 | vpdTableI[i][j] = | ||
582 | (u8)(ath9k_hw_interpolate((u16) | ||
583 | FREQ2FBIN(centers. | ||
584 | synth_center, | ||
585 | IS_CHAN_2GHZ | ||
586 | (chan)), | ||
587 | bChans[idxL], bChans[idxR], | ||
588 | vpdTableL[i][j], vpdTableR[i][j])); | ||
589 | } | ||
590 | } | ||
591 | } | ||
592 | |||
593 | *pMinCalPower = (int16_t)(minPwrT4[0] / 2); | ||
594 | |||
595 | k = 0; | ||
596 | |||
597 | for (i = 0; i < numXpdGains; i++) { | ||
598 | if (i == (numXpdGains - 1)) | ||
599 | pPdGainBoundaries[i] = | ||
600 | (u16)(maxPwrT4[i] / 2); | ||
601 | else | ||
602 | pPdGainBoundaries[i] = | ||
603 | (u16)((maxPwrT4[i] + minPwrT4[i + 1]) / 4); | ||
604 | |||
605 | pPdGainBoundaries[i] = | ||
606 | min((u16)AR5416_MAX_RATE_POWER, pPdGainBoundaries[i]); | ||
607 | |||
608 | if ((i == 0) && !AR_SREV_5416_V20_OR_LATER(ah)) { | ||
609 | minDelta = pPdGainBoundaries[0] - 23; | ||
610 | pPdGainBoundaries[0] = 23; | ||
611 | } else { | ||
612 | minDelta = 0; | ||
613 | } | ||
614 | |||
615 | if (i == 0) { | ||
616 | if (AR_SREV_9280_10_OR_LATER(ah)) | ||
617 | ss = (int16_t)(0 - (minPwrT4[i] / 2)); | ||
618 | else | ||
619 | ss = 0; | ||
620 | } else { | ||
621 | ss = (int16_t)((pPdGainBoundaries[i - 1] - | ||
622 | (minPwrT4[i] / 2)) - | ||
623 | tPdGainOverlap + 1 + minDelta); | ||
624 | } | ||
625 | vpdStep = (int16_t)(vpdTableI[i][1] - vpdTableI[i][0]); | ||
626 | vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); | ||
627 | |||
628 | while ((ss < 0) && (k < (AR5416_NUM_PDADC_VALUES - 1))) { | ||
629 | tmpVal = (int16_t)(vpdTableI[i][0] + ss * vpdStep); | ||
630 | pPDADCValues[k++] = (u8)((tmpVal < 0) ? 0 : tmpVal); | ||
631 | ss++; | ||
632 | } | ||
633 | |||
634 | sizeCurrVpdTable = (u8) ((maxPwrT4[i] - minPwrT4[i]) / 2 + 1); | ||
635 | tgtIndex = (u8)(pPdGainBoundaries[i] + tPdGainOverlap - | ||
636 | (minPwrT4[i] / 2)); | ||
637 | maxIndex = (tgtIndex < sizeCurrVpdTable) ? | ||
638 | tgtIndex : sizeCurrVpdTable; | ||
639 | |||
640 | while ((ss < maxIndex) && (k < (AR5416_NUM_PDADC_VALUES - 1))) | ||
641 | pPDADCValues[k++] = vpdTableI[i][ss++]; | ||
642 | |||
643 | vpdStep = (int16_t)(vpdTableI[i][sizeCurrVpdTable - 1] - | ||
644 | vpdTableI[i][sizeCurrVpdTable - 2]); | ||
645 | vpdStep = (int16_t)((vpdStep < 1) ? 1 : vpdStep); | ||
646 | |||
647 | if (tgtIndex > maxIndex) { | ||
648 | while ((ss <= tgtIndex) && | ||
649 | (k < (AR5416_NUM_PDADC_VALUES - 1))) { | ||
650 | tmpVal = (int16_t) TMP_VAL_VPD_TABLE; | ||
651 | pPDADCValues[k++] = (u8)((tmpVal > 255) ? | ||
652 | 255 : tmpVal); | ||
653 | ss++; | ||
654 | } | ||
655 | } | ||
656 | } | ||
657 | |||
658 | while (i < AR5416_EEP4K_PD_GAINS_IN_MASK) { | ||
659 | pPdGainBoundaries[i] = PD_GAIN_BOUNDARY_DEFAULT; | ||
660 | i++; | ||
661 | } | ||
662 | |||
663 | while (k < AR5416_NUM_PDADC_VALUES) { | ||
664 | pPDADCValues[k] = pPDADCValues[k - 1]; | ||
665 | k++; | ||
666 | } | ||
667 | |||
668 | return; | ||
669 | #undef TMP_VAL_VPD_TABLE | ||
670 | } | ||
671 | |||
672 | static void ath9k_hw_get_def_gain_boundaries_pdadcs(struct ath_hal *ah, | ||
330 | struct ath9k_channel *chan, | 673 | struct ath9k_channel *chan, |
331 | struct cal_data_per_freq *pRawDataSet, | 674 | struct cal_data_per_freq *pRawDataSet, |
332 | u8 *bChans, u16 availPiers, | 675 | u8 *bChans, u16 availPiers, |
@@ -603,12 +946,12 @@ static void ath9k_hw_get_target_powers(struct ath_hal *ah, | |||
603 | 946 | ||
604 | static u16 ath9k_hw_get_max_edge_power(u16 freq, | 947 | static u16 ath9k_hw_get_max_edge_power(u16 freq, |
605 | struct cal_ctl_edges *pRdEdgesPower, | 948 | struct cal_ctl_edges *pRdEdgesPower, |
606 | bool is2GHz) | 949 | bool is2GHz, int num_band_edges) |
607 | { | 950 | { |
608 | u16 twiceMaxEdgePower = AR5416_MAX_RATE_POWER; | 951 | u16 twiceMaxEdgePower = AR5416_MAX_RATE_POWER; |
609 | int i; | 952 | int i; |
610 | 953 | ||
611 | for (i = 0; (i < AR5416_NUM_BAND_EDGES) && | 954 | for (i = 0; (i < num_band_edges) && |
612 | (pRdEdgesPower[i].bChannel != AR5416_BCHAN_UNUSED); i++) { | 955 | (pRdEdgesPower[i].bChannel != AR5416_BCHAN_UNUSED); i++) { |
613 | if (freq == ath9k_hw_fbin2freq(pRdEdgesPower[i].bChannel, is2GHz)) { | 956 | if (freq == ath9k_hw_fbin2freq(pRdEdgesPower[i].bChannel, is2GHz)) { |
614 | twiceMaxEdgePower = pRdEdgesPower[i].tPower; | 957 | twiceMaxEdgePower = pRdEdgesPower[i].tPower; |
@@ -629,207 +972,269 @@ static u16 ath9k_hw_get_max_edge_power(u16 freq, | |||
629 | return twiceMaxEdgePower; | 972 | return twiceMaxEdgePower; |
630 | } | 973 | } |
631 | 974 | ||
632 | int ath9k_hw_set_txpower(struct ath_hal *ah, | 975 | static bool ath9k_hw_set_def_power_cal_table(struct ath_hal *ah, |
633 | struct ath9k_channel *chan, | 976 | struct ath9k_channel *chan, |
634 | u16 cfgCtl, | 977 | int16_t *pTxPowerIndexOffset) |
635 | u8 twiceAntennaReduction, | ||
636 | u8 twiceMaxRegulatoryPower, | ||
637 | u8 powerLimit) | ||
638 | { | 978 | { |
639 | struct ath_hal_5416 *ahp = AH5416(ah); | 979 | struct ath_hal_5416 *ahp = AH5416(ah); |
640 | struct ar5416_eeprom *pEepData = &ahp->ah_eeprom; | 980 | struct ar5416_eeprom_def *pEepData = &ahp->ah_eeprom.def; |
641 | struct modal_eep_header *pModal = | 981 | struct cal_data_per_freq *pRawDataset; |
642 | &(pEepData->modalHeader[IS_CHAN_2GHZ(chan)]); | 982 | u8 *pCalBChans = NULL; |
643 | int16_t ratesArray[Ar5416RateSize]; | 983 | u16 pdGainOverlap_t2; |
644 | int16_t txPowerIndexOffset = 0; | 984 | static u8 pdadcValues[AR5416_NUM_PDADC_VALUES]; |
645 | u8 ht40PowerIncForPdadc = 2; | 985 | u16 gainBoundaries[AR5416_PD_GAINS_IN_MASK]; |
646 | int i; | 986 | u16 numPiers, i, j; |
987 | int16_t tMinCalPower; | ||
988 | u16 numXpdGain, xpdMask; | ||
989 | u16 xpdGainValues[AR5416_NUM_PD_GAINS] = { 0, 0, 0, 0 }; | ||
990 | u32 reg32, regOffset, regChainOffset; | ||
991 | int16_t modalIdx; | ||
647 | 992 | ||
648 | memset(ratesArray, 0, sizeof(ratesArray)); | 993 | modalIdx = IS_CHAN_2GHZ(chan) ? 1 : 0; |
994 | xpdMask = pEepData->modalHeader[modalIdx].xpdGain; | ||
649 | 995 | ||
650 | if ((pEepData->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >= | 996 | if ((pEepData->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >= |
651 | AR5416_EEP_MINOR_VER_2) { | 997 | AR5416_EEP_MINOR_VER_2) { |
652 | ht40PowerIncForPdadc = pModal->ht40PowerIncForPdadc; | 998 | pdGainOverlap_t2 = |
653 | } | 999 | pEepData->modalHeader[modalIdx].pdGainOverlap; |
654 | 1000 | } else { | |
655 | if (!ath9k_hw_set_power_per_rate_table(ah, chan, | 1001 | pdGainOverlap_t2 = (u16)(MS(REG_READ(ah, AR_PHY_TPCRG5), |
656 | &ratesArray[0], cfgCtl, | 1002 | AR_PHY_TPCRG5_PD_GAIN_OVERLAP)); |
657 | twiceAntennaReduction, | ||
658 | twiceMaxRegulatoryPower, | ||
659 | powerLimit)) { | ||
660 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
661 | "ath9k_hw_set_txpower: unable to set " | ||
662 | "tx power per rate table\n"); | ||
663 | return -EIO; | ||
664 | } | 1003 | } |
665 | 1004 | ||
666 | if (!ath9k_hw_set_power_cal_table(ah, chan, &txPowerIndexOffset)) { | 1005 | if (IS_CHAN_2GHZ(chan)) { |
667 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | 1006 | pCalBChans = pEepData->calFreqPier2G; |
668 | "ath9k_hw_set_txpower: unable to set power table\n"); | 1007 | numPiers = AR5416_NUM_2G_CAL_PIERS; |
669 | return -EIO; | 1008 | } else { |
1009 | pCalBChans = pEepData->calFreqPier5G; | ||
1010 | numPiers = AR5416_NUM_5G_CAL_PIERS; | ||
670 | } | 1011 | } |
671 | 1012 | ||
672 | for (i = 0; i < ARRAY_SIZE(ratesArray); i++) { | 1013 | numXpdGain = 0; |
673 | ratesArray[i] = (int16_t)(txPowerIndexOffset + ratesArray[i]); | ||
674 | if (ratesArray[i] > AR5416_MAX_RATE_POWER) | ||
675 | ratesArray[i] = AR5416_MAX_RATE_POWER; | ||
676 | } | ||
677 | 1014 | ||
678 | if (AR_SREV_9280_10_OR_LATER(ah)) { | 1015 | for (i = 1; i <= AR5416_PD_GAINS_IN_MASK; i++) { |
679 | for (i = 0; i < Ar5416RateSize; i++) | 1016 | if ((xpdMask >> (AR5416_PD_GAINS_IN_MASK - i)) & 1) { |
680 | ratesArray[i] -= AR5416_PWR_TABLE_OFFSET * 2; | 1017 | if (numXpdGain >= AR5416_NUM_PD_GAINS) |
1018 | break; | ||
1019 | xpdGainValues[numXpdGain] = | ||
1020 | (u16)(AR5416_PD_GAINS_IN_MASK - i); | ||
1021 | numXpdGain++; | ||
1022 | } | ||
681 | } | 1023 | } |
682 | 1024 | ||
683 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE1, | 1025 | REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_NUM_PD_GAIN, |
684 | ATH9K_POW_SM(ratesArray[rate18mb], 24) | 1026 | (numXpdGain - 1) & 0x3); |
685 | | ATH9K_POW_SM(ratesArray[rate12mb], 16) | 1027 | REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_1, |
686 | | ATH9K_POW_SM(ratesArray[rate9mb], 8) | 1028 | xpdGainValues[0]); |
687 | | ATH9K_POW_SM(ratesArray[rate6mb], 0)); | 1029 | REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_2, |
688 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE2, | 1030 | xpdGainValues[1]); |
689 | ATH9K_POW_SM(ratesArray[rate54mb], 24) | 1031 | REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_3, |
690 | | ATH9K_POW_SM(ratesArray[rate48mb], 16) | 1032 | xpdGainValues[2]); |
691 | | ATH9K_POW_SM(ratesArray[rate36mb], 8) | ||
692 | | ATH9K_POW_SM(ratesArray[rate24mb], 0)); | ||
693 | 1033 | ||
694 | if (IS_CHAN_2GHZ(chan)) { | 1034 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { |
695 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE3, | 1035 | if (AR_SREV_5416_V20_OR_LATER(ah) && |
696 | ATH9K_POW_SM(ratesArray[rate2s], 24) | 1036 | (ahp->ah_rxchainmask == 5 || ahp->ah_txchainmask == 5) && |
697 | | ATH9K_POW_SM(ratesArray[rate2l], 16) | 1037 | (i != 0)) { |
698 | | ATH9K_POW_SM(ratesArray[rateXr], 8) | 1038 | regChainOffset = (i == 1) ? 0x2000 : 0x1000; |
699 | | ATH9K_POW_SM(ratesArray[rate1l], 0)); | 1039 | } else |
700 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE4, | 1040 | regChainOffset = i * 0x1000; |
701 | ATH9K_POW_SM(ratesArray[rate11s], 24) | ||
702 | | ATH9K_POW_SM(ratesArray[rate11l], 16) | ||
703 | | ATH9K_POW_SM(ratesArray[rate5_5s], 8) | ||
704 | | ATH9K_POW_SM(ratesArray[rate5_5l], 0)); | ||
705 | } | ||
706 | 1041 | ||
707 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE5, | 1042 | if (pEepData->baseEepHeader.txMask & (1 << i)) { |
708 | ATH9K_POW_SM(ratesArray[rateHt20_3], 24) | 1043 | if (IS_CHAN_2GHZ(chan)) |
709 | | ATH9K_POW_SM(ratesArray[rateHt20_2], 16) | 1044 | pRawDataset = pEepData->calPierData2G[i]; |
710 | | ATH9K_POW_SM(ratesArray[rateHt20_1], 8) | 1045 | else |
711 | | ATH9K_POW_SM(ratesArray[rateHt20_0], 0)); | 1046 | pRawDataset = pEepData->calPierData5G[i]; |
712 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE6, | ||
713 | ATH9K_POW_SM(ratesArray[rateHt20_7], 24) | ||
714 | | ATH9K_POW_SM(ratesArray[rateHt20_6], 16) | ||
715 | | ATH9K_POW_SM(ratesArray[rateHt20_5], 8) | ||
716 | | ATH9K_POW_SM(ratesArray[rateHt20_4], 0)); | ||
717 | 1047 | ||
718 | if (IS_CHAN_HT40(chan)) { | 1048 | ath9k_hw_get_def_gain_boundaries_pdadcs(ah, chan, |
719 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE7, | 1049 | pRawDataset, pCalBChans, |
720 | ATH9K_POW_SM(ratesArray[rateHt40_3] + | 1050 | numPiers, pdGainOverlap_t2, |
721 | ht40PowerIncForPdadc, 24) | 1051 | &tMinCalPower, gainBoundaries, |
722 | | ATH9K_POW_SM(ratesArray[rateHt40_2] + | 1052 | pdadcValues, numXpdGain); |
723 | ht40PowerIncForPdadc, 16) | ||
724 | | ATH9K_POW_SM(ratesArray[rateHt40_1] + | ||
725 | ht40PowerIncForPdadc, 8) | ||
726 | | ATH9K_POW_SM(ratesArray[rateHt40_0] + | ||
727 | ht40PowerIncForPdadc, 0)); | ||
728 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE8, | ||
729 | ATH9K_POW_SM(ratesArray[rateHt40_7] + | ||
730 | ht40PowerIncForPdadc, 24) | ||
731 | | ATH9K_POW_SM(ratesArray[rateHt40_6] + | ||
732 | ht40PowerIncForPdadc, 16) | ||
733 | | ATH9K_POW_SM(ratesArray[rateHt40_5] + | ||
734 | ht40PowerIncForPdadc, 8) | ||
735 | | ATH9K_POW_SM(ratesArray[rateHt40_4] + | ||
736 | ht40PowerIncForPdadc, 0)); | ||
737 | 1053 | ||
738 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE9, | 1054 | if ((i == 0) || AR_SREV_5416_V20_OR_LATER(ah)) { |
739 | ATH9K_POW_SM(ratesArray[rateExtOfdm], 24) | 1055 | REG_WRITE(ah, |
740 | | ATH9K_POW_SM(ratesArray[rateExtCck], 16) | 1056 | AR_PHY_TPCRG5 + regChainOffset, |
741 | | ATH9K_POW_SM(ratesArray[rateDupOfdm], 8) | 1057 | SM(pdGainOverlap_t2, |
742 | | ATH9K_POW_SM(ratesArray[rateDupCck], 0)); | 1058 | AR_PHY_TPCRG5_PD_GAIN_OVERLAP) |
743 | } | 1059 | | SM(gainBoundaries[0], |
1060 | AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1) | ||
1061 | | SM(gainBoundaries[1], | ||
1062 | AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2) | ||
1063 | | SM(gainBoundaries[2], | ||
1064 | AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3) | ||
1065 | | SM(gainBoundaries[3], | ||
1066 | AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4)); | ||
1067 | } | ||
744 | 1068 | ||
745 | REG_WRITE(ah, AR_PHY_POWER_TX_SUB, | 1069 | regOffset = AR_PHY_BASE + (672 << 2) + regChainOffset; |
746 | ATH9K_POW_SM(pModal->pwrDecreaseFor3Chain, 6) | 1070 | for (j = 0; j < 32; j++) { |
747 | | ATH9K_POW_SM(pModal->pwrDecreaseFor2Chain, 0)); | 1071 | reg32 = ((pdadcValues[4 * j + 0] & 0xFF) << 0) | |
1072 | ((pdadcValues[4 * j + 1] & 0xFF) << 8) | | ||
1073 | ((pdadcValues[4 * j + 2] & 0xFF) << 16)| | ||
1074 | ((pdadcValues[4 * j + 3] & 0xFF) << 24); | ||
1075 | REG_WRITE(ah, regOffset, reg32); | ||
748 | 1076 | ||
749 | i = rate6mb; | 1077 | DPRINTF(ah->ah_sc, ATH_DBG_REG_IO, |
1078 | "PDADC (%d,%4x): %4.4x %8.8x\n", | ||
1079 | i, regChainOffset, regOffset, | ||
1080 | reg32); | ||
1081 | DPRINTF(ah->ah_sc, ATH_DBG_REG_IO, | ||
1082 | "PDADC: Chain %d | PDADC %3d " | ||
1083 | "Value %3d | PDADC %3d Value %3d | " | ||
1084 | "PDADC %3d Value %3d | PDADC %3d " | ||
1085 | "Value %3d |\n", | ||
1086 | i, 4 * j, pdadcValues[4 * j], | ||
1087 | 4 * j + 1, pdadcValues[4 * j + 1], | ||
1088 | 4 * j + 2, pdadcValues[4 * j + 2], | ||
1089 | 4 * j + 3, | ||
1090 | pdadcValues[4 * j + 3]); | ||
750 | 1091 | ||
751 | if (IS_CHAN_HT40(chan)) | 1092 | regOffset += 4; |
752 | i = rateHt40_0; | 1093 | } |
753 | else if (IS_CHAN_HT20(chan)) | 1094 | } |
754 | i = rateHt20_0; | 1095 | } |
755 | 1096 | ||
756 | if (AR_SREV_9280_10_OR_LATER(ah)) | 1097 | *pTxPowerIndexOffset = 0; |
757 | ah->ah_maxPowerLevel = | ||
758 | ratesArray[i] + AR5416_PWR_TABLE_OFFSET * 2; | ||
759 | else | ||
760 | ah->ah_maxPowerLevel = ratesArray[i]; | ||
761 | 1098 | ||
762 | return 0; | 1099 | return true; |
763 | } | 1100 | } |
764 | 1101 | ||
765 | void ath9k_hw_set_addac(struct ath_hal *ah, struct ath9k_channel *chan) | 1102 | static bool ath9k_hw_set_4k_power_cal_table(struct ath_hal *ah, |
1103 | struct ath9k_channel *chan, | ||
1104 | int16_t *pTxPowerIndexOffset) | ||
766 | { | 1105 | { |
767 | struct modal_eep_header *pModal; | ||
768 | struct ath_hal_5416 *ahp = AH5416(ah); | 1106 | struct ath_hal_5416 *ahp = AH5416(ah); |
769 | struct ar5416_eeprom *eep = &ahp->ah_eeprom; | 1107 | struct ar5416_eeprom_4k *pEepData = &ahp->ah_eeprom.map4k; |
770 | u8 biaslevel; | 1108 | struct cal_data_per_freq_4k *pRawDataset; |
1109 | u8 *pCalBChans = NULL; | ||
1110 | u16 pdGainOverlap_t2; | ||
1111 | static u8 pdadcValues[AR5416_NUM_PDADC_VALUES]; | ||
1112 | u16 gainBoundaries[AR5416_PD_GAINS_IN_MASK]; | ||
1113 | u16 numPiers, i, j; | ||
1114 | int16_t tMinCalPower; | ||
1115 | u16 numXpdGain, xpdMask; | ||
1116 | u16 xpdGainValues[AR5416_NUM_PD_GAINS] = { 0, 0, 0, 0 }; | ||
1117 | u32 reg32, regOffset, regChainOffset; | ||
771 | 1118 | ||
772 | if (ah->ah_macVersion != AR_SREV_VERSION_9160) | 1119 | xpdMask = pEepData->modalHeader.xpdGain; |
773 | return; | ||
774 | 1120 | ||
775 | if (ar5416_get_eep_rev(ahp) < AR5416_EEP_MINOR_VER_7) | 1121 | if ((pEepData->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >= |
776 | return; | 1122 | AR5416_EEP_MINOR_VER_2) { |
1123 | pdGainOverlap_t2 = | ||
1124 | pEepData->modalHeader.pdGainOverlap; | ||
1125 | } else { | ||
1126 | pdGainOverlap_t2 = (u16)(MS(REG_READ(ah, AR_PHY_TPCRG5), | ||
1127 | AR_PHY_TPCRG5_PD_GAIN_OVERLAP)); | ||
1128 | } | ||
777 | 1129 | ||
778 | pModal = &(eep->modalHeader[IS_CHAN_2GHZ(chan)]); | 1130 | pCalBChans = pEepData->calFreqPier2G; |
1131 | numPiers = AR5416_NUM_2G_CAL_PIERS; | ||
779 | 1132 | ||
780 | if (pModal->xpaBiasLvl != 0xff) { | 1133 | numXpdGain = 0; |
781 | biaslevel = pModal->xpaBiasLvl; | ||
782 | } else { | ||
783 | u16 resetFreqBin, freqBin, freqCount = 0; | ||
784 | struct chan_centers centers; | ||
785 | 1134 | ||
786 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | 1135 | for (i = 1; i <= AR5416_PD_GAINS_IN_MASK; i++) { |
1136 | if ((xpdMask >> (AR5416_PD_GAINS_IN_MASK - i)) & 1) { | ||
1137 | if (numXpdGain >= AR5416_NUM_PD_GAINS) | ||
1138 | break; | ||
1139 | xpdGainValues[numXpdGain] = | ||
1140 | (u16)(AR5416_PD_GAINS_IN_MASK - i); | ||
1141 | numXpdGain++; | ||
1142 | } | ||
1143 | } | ||
787 | 1144 | ||
788 | resetFreqBin = FREQ2FBIN(centers.synth_center, IS_CHAN_2GHZ(chan)); | 1145 | REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_NUM_PD_GAIN, |
789 | freqBin = pModal->xpaBiasLvlFreq[0] & 0xff; | 1146 | (numXpdGain - 1) & 0x3); |
790 | biaslevel = (u8) (pModal->xpaBiasLvlFreq[0] >> 14); | 1147 | REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_1, |
1148 | xpdGainValues[0]); | ||
1149 | REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_2, | ||
1150 | xpdGainValues[1]); | ||
1151 | REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_3, | ||
1152 | xpdGainValues[2]); | ||
791 | 1153 | ||
792 | freqCount++; | 1154 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { |
1155 | if (AR_SREV_5416_V20_OR_LATER(ah) && | ||
1156 | (ahp->ah_rxchainmask == 5 || ahp->ah_txchainmask == 5) && | ||
1157 | (i != 0)) { | ||
1158 | regChainOffset = (i == 1) ? 0x2000 : 0x1000; | ||
1159 | } else | ||
1160 | regChainOffset = i * 0x1000; | ||
793 | 1161 | ||
794 | while (freqCount < 3) { | 1162 | if (pEepData->baseEepHeader.txMask & (1 << i)) { |
795 | if (pModal->xpaBiasLvlFreq[freqCount] == 0x0) | 1163 | pRawDataset = pEepData->calPierData2G[i]; |
796 | break; | ||
797 | 1164 | ||
798 | freqBin = pModal->xpaBiasLvlFreq[freqCount] & 0xff; | 1165 | ath9k_hw_get_4k_gain_boundaries_pdadcs(ah, chan, |
799 | if (resetFreqBin >= freqBin) { | 1166 | pRawDataset, pCalBChans, |
800 | biaslevel = (u8)(pModal->xpaBiasLvlFreq[freqCount] >> 14); | 1167 | numPiers, pdGainOverlap_t2, |
801 | } else { | 1168 | &tMinCalPower, gainBoundaries, |
802 | break; | 1169 | pdadcValues, numXpdGain); |
1170 | |||
1171 | if ((i == 0) || AR_SREV_5416_V20_OR_LATER(ah)) { | ||
1172 | REG_WRITE(ah, AR_PHY_TPCRG5 + regChainOffset, | ||
1173 | SM(pdGainOverlap_t2, | ||
1174 | AR_PHY_TPCRG5_PD_GAIN_OVERLAP) | ||
1175 | | SM(gainBoundaries[0], | ||
1176 | AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1) | ||
1177 | | SM(gainBoundaries[1], | ||
1178 | AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2) | ||
1179 | | SM(gainBoundaries[2], | ||
1180 | AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3) | ||
1181 | | SM(gainBoundaries[3], | ||
1182 | AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4)); | ||
1183 | } | ||
1184 | |||
1185 | regOffset = AR_PHY_BASE + (672 << 2) + regChainOffset; | ||
1186 | for (j = 0; j < 32; j++) { | ||
1187 | reg32 = ((pdadcValues[4 * j + 0] & 0xFF) << 0) | | ||
1188 | ((pdadcValues[4 * j + 1] & 0xFF) << 8) | | ||
1189 | ((pdadcValues[4 * j + 2] & 0xFF) << 16)| | ||
1190 | ((pdadcValues[4 * j + 3] & 0xFF) << 24); | ||
1191 | REG_WRITE(ah, regOffset, reg32); | ||
1192 | |||
1193 | DPRINTF(ah->ah_sc, ATH_DBG_REG_IO, | ||
1194 | "PDADC (%d,%4x): %4.4x %8.8x\n", | ||
1195 | i, regChainOffset, regOffset, | ||
1196 | reg32); | ||
1197 | DPRINTF(ah->ah_sc, ATH_DBG_REG_IO, | ||
1198 | "PDADC: Chain %d | " | ||
1199 | "PDADC %3d Value %3d | " | ||
1200 | "PDADC %3d Value %3d | " | ||
1201 | "PDADC %3d Value %3d | " | ||
1202 | "PDADC %3d Value %3d |\n", | ||
1203 | i, 4 * j, pdadcValues[4 * j], | ||
1204 | 4 * j + 1, pdadcValues[4 * j + 1], | ||
1205 | 4 * j + 2, pdadcValues[4 * j + 2], | ||
1206 | 4 * j + 3, | ||
1207 | pdadcValues[4 * j + 3]); | ||
1208 | |||
1209 | regOffset += 4; | ||
803 | } | 1210 | } |
804 | freqCount++; | ||
805 | } | 1211 | } |
806 | } | 1212 | } |
807 | 1213 | ||
808 | if (IS_CHAN_2GHZ(chan)) { | 1214 | *pTxPowerIndexOffset = 0; |
809 | INI_RA(&ahp->ah_iniAddac, 7, 1) = | 1215 | |
810 | (INI_RA(&ahp->ah_iniAddac, 7, 1) & (~0x18)) | biaslevel << 3; | 1216 | return true; |
811 | } else { | ||
812 | INI_RA(&ahp->ah_iniAddac, 6, 1) = | ||
813 | (INI_RA(&ahp->ah_iniAddac, 6, 1) & (~0xc0)) | biaslevel << 6; | ||
814 | } | ||
815 | } | 1217 | } |
816 | 1218 | ||
817 | bool ath9k_hw_set_power_per_rate_table(struct ath_hal *ah, | 1219 | bool ath9k_hw_set_def_power_per_rate_table(struct ath_hal *ah, |
818 | struct ath9k_channel *chan, | 1220 | struct ath9k_channel *chan, |
819 | int16_t *ratesArray, | 1221 | int16_t *ratesArray, |
820 | u16 cfgCtl, | 1222 | u16 cfgCtl, |
821 | u8 AntennaReduction, | 1223 | u16 AntennaReduction, |
822 | u8 twiceMaxRegulatoryPower, | 1224 | u16 twiceMaxRegulatoryPower, |
823 | u8 powerLimit) | 1225 | u16 powerLimit) |
824 | { | 1226 | { |
1227 | #define REDUCE_SCALED_POWER_BY_TWO_CHAIN 6 /* 10*log10(2)*2 */ | ||
1228 | #define REDUCE_SCALED_POWER_BY_THREE_CHAIN 10 /* 10*log10(3)*2 */ | ||
1229 | |||
825 | struct ath_hal_5416 *ahp = AH5416(ah); | 1230 | struct ath_hal_5416 *ahp = AH5416(ah); |
826 | struct ar5416_eeprom *pEepData = &ahp->ah_eeprom; | 1231 | struct ar5416_eeprom_def *pEepData = &ahp->ah_eeprom.def; |
827 | u8 twiceMaxEdgePower = AR5416_MAX_RATE_POWER; | 1232 | u16 twiceMaxEdgePower = AR5416_MAX_RATE_POWER; |
828 | static const u16 tpScaleReductionTable[5] = | 1233 | static const u16 tpScaleReductionTable[5] = |
829 | { 0, 3, 6, 9, AR5416_MAX_RATE_POWER }; | 1234 | { 0, 3, 6, 9, AR5416_MAX_RATE_POWER }; |
830 | 1235 | ||
831 | int i; | 1236 | int i; |
832 | int8_t twiceLargestAntenna; | 1237 | int16_t twiceLargestAntenna; |
833 | struct cal_ctl_data *rep; | 1238 | struct cal_ctl_data *rep; |
834 | struct cal_target_power_leg targetPowerOfdm, targetPowerCck = { | 1239 | struct cal_target_power_leg targetPowerOfdm, targetPowerCck = { |
835 | 0, { 0, 0, 0, 0} | 1240 | 0, { 0, 0, 0, 0} |
@@ -841,7 +1246,7 @@ bool ath9k_hw_set_power_per_rate_table(struct ath_hal *ah, | |||
841 | struct cal_target_power_ht targetPowerHt20, targetPowerHt40 = { | 1246 | struct cal_target_power_ht targetPowerHt20, targetPowerHt40 = { |
842 | 0, {0, 0, 0, 0} | 1247 | 0, {0, 0, 0, 0} |
843 | }; | 1248 | }; |
844 | u8 scaledPower = 0, minCtlPower, maxRegAllowedPower; | 1249 | u16 scaledPower = 0, minCtlPower, maxRegAllowedPower; |
845 | u16 ctlModesFor11a[] = | 1250 | u16 ctlModesFor11a[] = |
846 | { CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40 }; | 1251 | { CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40 }; |
847 | u16 ctlModesFor11g[] = | 1252 | u16 ctlModesFor11g[] = |
@@ -851,7 +1256,7 @@ bool ath9k_hw_set_power_per_rate_table(struct ath_hal *ah, | |||
851 | u16 numCtlModes, *pCtlMode, ctlMode, freq; | 1256 | u16 numCtlModes, *pCtlMode, ctlMode, freq; |
852 | struct chan_centers centers; | 1257 | struct chan_centers centers; |
853 | int tx_chainmask; | 1258 | int tx_chainmask; |
854 | u8 twiceMinEdgePower; | 1259 | u16 twiceMinEdgePower; |
855 | 1260 | ||
856 | tx_chainmask = ahp->ah_txchainmask; | 1261 | tx_chainmask = ahp->ah_txchainmask; |
857 | 1262 | ||
@@ -867,7 +1272,8 @@ bool ath9k_hw_set_power_per_rate_table(struct ath_hal *ah, | |||
867 | pEepData->modalHeader | 1272 | pEepData->modalHeader |
868 | [IS_CHAN_2GHZ(chan)].antennaGainCh[2]); | 1273 | [IS_CHAN_2GHZ(chan)].antennaGainCh[2]); |
869 | 1274 | ||
870 | twiceLargestAntenna = (int8_t)min(AntennaReduction - twiceLargestAntenna, 0); | 1275 | twiceLargestAntenna = (int16_t)min(AntennaReduction - |
1276 | twiceLargestAntenna, 0); | ||
871 | 1277 | ||
872 | maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna; | 1278 | maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna; |
873 | 1279 | ||
@@ -882,16 +1288,14 @@ bool ath9k_hw_set_power_per_rate_table(struct ath_hal *ah, | |||
882 | case 1: | 1288 | case 1: |
883 | break; | 1289 | break; |
884 | case 2: | 1290 | case 2: |
885 | scaledPower -= | 1291 | scaledPower -= REDUCE_SCALED_POWER_BY_TWO_CHAIN; |
886 | pEepData->modalHeader[IS_CHAN_2GHZ(chan)].pwrDecreaseFor2Chain; | ||
887 | break; | 1292 | break; |
888 | case 3: | 1293 | case 3: |
889 | scaledPower -= | 1294 | scaledPower -= REDUCE_SCALED_POWER_BY_THREE_CHAIN; |
890 | pEepData->modalHeader[IS_CHAN_2GHZ(chan)].pwrDecreaseFor3Chain; | ||
891 | break; | 1295 | break; |
892 | } | 1296 | } |
893 | 1297 | ||
894 | scaledPower = max(0, (int32_t) scaledPower); | 1298 | scaledPower = max((u16)0, scaledPower); |
895 | 1299 | ||
896 | if (IS_CHAN_2GHZ(chan)) { | 1300 | if (IS_CHAN_2GHZ(chan)) { |
897 | numCtlModes = ARRAY_SIZE(ctlModesFor11g) - | 1301 | numCtlModes = ARRAY_SIZE(ctlModesFor11g) - |
@@ -990,7 +1394,7 @@ bool ath9k_hw_set_power_per_rate_table(struct ath_hal *ah, | |||
990 | 1394 | ||
991 | twiceMinEdgePower = ath9k_hw_get_max_edge_power(freq, | 1395 | twiceMinEdgePower = ath9k_hw_get_max_edge_power(freq, |
992 | rep->ctlEdges[ar5416_get_ntxchains(tx_chainmask) - 1], | 1396 | rep->ctlEdges[ar5416_get_ntxchains(tx_chainmask) - 1], |
993 | IS_CHAN_2GHZ(chan)); | 1397 | IS_CHAN_2GHZ(chan), AR5416_NUM_BAND_EDGES); |
994 | 1398 | ||
995 | DPRINTF(ah->ah_sc, ATH_DBG_POWER_MGMT, | 1399 | DPRINTF(ah->ah_sc, ATH_DBG_POWER_MGMT, |
996 | " MATCH-EE_IDX %d: ch %d is2 %d " | 1400 | " MATCH-EE_IDX %d: ch %d is2 %d " |
@@ -1021,7 +1425,7 @@ bool ath9k_hw_set_power_per_rate_table(struct ath_hal *ah, | |||
1021 | case CTL_11B: | 1425 | case CTL_11B: |
1022 | for (i = 0; i < ARRAY_SIZE(targetPowerCck.tPow2x); i++) { | 1426 | for (i = 0; i < ARRAY_SIZE(targetPowerCck.tPow2x); i++) { |
1023 | targetPowerCck.tPow2x[i] = | 1427 | targetPowerCck.tPow2x[i] = |
1024 | min(targetPowerCck.tPow2x[i], | 1428 | min((u16)targetPowerCck.tPow2x[i], |
1025 | minCtlPower); | 1429 | minCtlPower); |
1026 | } | 1430 | } |
1027 | break; | 1431 | break; |
@@ -1029,7 +1433,7 @@ bool ath9k_hw_set_power_per_rate_table(struct ath_hal *ah, | |||
1029 | case CTL_11G: | 1433 | case CTL_11G: |
1030 | for (i = 0; i < ARRAY_SIZE(targetPowerOfdm.tPow2x); i++) { | 1434 | for (i = 0; i < ARRAY_SIZE(targetPowerOfdm.tPow2x); i++) { |
1031 | targetPowerOfdm.tPow2x[i] = | 1435 | targetPowerOfdm.tPow2x[i] = |
1032 | min(targetPowerOfdm.tPow2x[i], | 1436 | min((u16)targetPowerOfdm.tPow2x[i], |
1033 | minCtlPower); | 1437 | minCtlPower); |
1034 | } | 1438 | } |
1035 | break; | 1439 | break; |
@@ -1037,24 +1441,26 @@ bool ath9k_hw_set_power_per_rate_table(struct ath_hal *ah, | |||
1037 | case CTL_2GHT20: | 1441 | case CTL_2GHT20: |
1038 | for (i = 0; i < ARRAY_SIZE(targetPowerHt20.tPow2x); i++) { | 1442 | for (i = 0; i < ARRAY_SIZE(targetPowerHt20.tPow2x); i++) { |
1039 | targetPowerHt20.tPow2x[i] = | 1443 | targetPowerHt20.tPow2x[i] = |
1040 | min(targetPowerHt20.tPow2x[i], | 1444 | min((u16)targetPowerHt20.tPow2x[i], |
1041 | minCtlPower); | 1445 | minCtlPower); |
1042 | } | 1446 | } |
1043 | break; | 1447 | break; |
1044 | case CTL_11B_EXT: | 1448 | case CTL_11B_EXT: |
1045 | targetPowerCckExt.tPow2x[0] = | 1449 | targetPowerCckExt.tPow2x[0] = min((u16) |
1046 | min(targetPowerCckExt.tPow2x[0], minCtlPower); | 1450 | targetPowerCckExt.tPow2x[0], |
1451 | minCtlPower); | ||
1047 | break; | 1452 | break; |
1048 | case CTL_11A_EXT: | 1453 | case CTL_11A_EXT: |
1049 | case CTL_11G_EXT: | 1454 | case CTL_11G_EXT: |
1050 | targetPowerOfdmExt.tPow2x[0] = | 1455 | targetPowerOfdmExt.tPow2x[0] = min((u16) |
1051 | min(targetPowerOfdmExt.tPow2x[0], minCtlPower); | 1456 | targetPowerOfdmExt.tPow2x[0], |
1457 | minCtlPower); | ||
1052 | break; | 1458 | break; |
1053 | case CTL_5GHT40: | 1459 | case CTL_5GHT40: |
1054 | case CTL_2GHT40: | 1460 | case CTL_2GHT40: |
1055 | for (i = 0; i < ARRAY_SIZE(targetPowerHt40.tPow2x); i++) { | 1461 | for (i = 0; i < ARRAY_SIZE(targetPowerHt40.tPow2x); i++) { |
1056 | targetPowerHt40.tPow2x[i] = | 1462 | targetPowerHt40.tPow2x[i] = |
1057 | min(targetPowerHt40.tPow2x[i], | 1463 | min((u16)targetPowerHt40.tPow2x[i], |
1058 | minCtlPower); | 1464 | minCtlPower); |
1059 | } | 1465 | } |
1060 | break; | 1466 | break; |
@@ -1101,139 +1507,623 @@ bool ath9k_hw_set_power_per_rate_table(struct ath_hal *ah, | |||
1101 | return true; | 1507 | return true; |
1102 | } | 1508 | } |
1103 | 1509 | ||
1104 | bool ath9k_hw_set_power_cal_table(struct ath_hal *ah, | 1510 | bool ath9k_hw_set_4k_power_per_rate_table(struct ath_hal *ah, |
1105 | struct ath9k_channel *chan, | 1511 | struct ath9k_channel *chan, |
1106 | int16_t *pTxPowerIndexOffset) | 1512 | int16_t *ratesArray, |
1513 | u16 cfgCtl, | ||
1514 | u16 AntennaReduction, | ||
1515 | u16 twiceMaxRegulatoryPower, | ||
1516 | u16 powerLimit) | ||
1107 | { | 1517 | { |
1108 | struct ath_hal_5416 *ahp = AH5416(ah); | 1518 | struct ath_hal_5416 *ahp = AH5416(ah); |
1109 | struct ar5416_eeprom *pEepData = &ahp->ah_eeprom; | 1519 | struct ar5416_eeprom_4k *pEepData = &ahp->ah_eeprom.map4k; |
1110 | struct cal_data_per_freq *pRawDataset; | 1520 | u16 twiceMaxEdgePower = AR5416_MAX_RATE_POWER; |
1111 | u8 *pCalBChans = NULL; | 1521 | static const u16 tpScaleReductionTable[5] = |
1112 | u16 pdGainOverlap_t2; | 1522 | { 0, 3, 6, 9, AR5416_MAX_RATE_POWER }; |
1113 | static u8 pdadcValues[AR5416_NUM_PDADC_VALUES]; | ||
1114 | u16 gainBoundaries[AR5416_PD_GAINS_IN_MASK]; | ||
1115 | u16 numPiers, i, j; | ||
1116 | int16_t tMinCalPower; | ||
1117 | u16 numXpdGain, xpdMask; | ||
1118 | u16 xpdGainValues[AR5416_NUM_PD_GAINS] = { 0, 0, 0, 0 }; | ||
1119 | u32 reg32, regOffset, regChainOffset; | ||
1120 | int16_t modalIdx; | ||
1121 | 1523 | ||
1122 | modalIdx = IS_CHAN_2GHZ(chan) ? 1 : 0; | 1524 | int i; |
1123 | xpdMask = pEepData->modalHeader[modalIdx].xpdGain; | 1525 | int16_t twiceLargestAntenna; |
1526 | struct cal_ctl_data_4k *rep; | ||
1527 | struct cal_target_power_leg targetPowerOfdm, targetPowerCck = { | ||
1528 | 0, { 0, 0, 0, 0} | ||
1529 | }; | ||
1530 | struct cal_target_power_leg targetPowerOfdmExt = { | ||
1531 | 0, { 0, 0, 0, 0} }, targetPowerCckExt = { | ||
1532 | 0, { 0, 0, 0, 0 } | ||
1533 | }; | ||
1534 | struct cal_target_power_ht targetPowerHt20, targetPowerHt40 = { | ||
1535 | 0, {0, 0, 0, 0} | ||
1536 | }; | ||
1537 | u16 scaledPower = 0, minCtlPower, maxRegAllowedPower; | ||
1538 | u16 ctlModesFor11g[] = | ||
1539 | { CTL_11B, CTL_11G, CTL_2GHT20, CTL_11B_EXT, CTL_11G_EXT, | ||
1540 | CTL_2GHT40 | ||
1541 | }; | ||
1542 | u16 numCtlModes, *pCtlMode, ctlMode, freq; | ||
1543 | struct chan_centers centers; | ||
1544 | int tx_chainmask; | ||
1545 | u16 twiceMinEdgePower; | ||
1546 | |||
1547 | tx_chainmask = ahp->ah_txchainmask; | ||
1548 | |||
1549 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
1550 | |||
1551 | twiceLargestAntenna = pEepData->modalHeader.antennaGainCh[0]; | ||
1552 | |||
1553 | twiceLargestAntenna = (int16_t)min(AntennaReduction - | ||
1554 | twiceLargestAntenna, 0); | ||
1555 | |||
1556 | maxRegAllowedPower = twiceMaxRegulatoryPower + twiceLargestAntenna; | ||
1557 | |||
1558 | if (ah->ah_tpScale != ATH9K_TP_SCALE_MAX) { | ||
1559 | maxRegAllowedPower -= | ||
1560 | (tpScaleReductionTable[(ah->ah_tpScale)] * 2); | ||
1561 | } | ||
1562 | |||
1563 | scaledPower = min(powerLimit, maxRegAllowedPower); | ||
1564 | scaledPower = max((u16)0, scaledPower); | ||
1565 | |||
1566 | numCtlModes = ARRAY_SIZE(ctlModesFor11g) - SUB_NUM_CTL_MODES_AT_2G_40; | ||
1567 | pCtlMode = ctlModesFor11g; | ||
1568 | |||
1569 | ath9k_hw_get_legacy_target_powers(ah, chan, | ||
1570 | pEepData->calTargetPowerCck, | ||
1571 | AR5416_NUM_2G_CCK_TARGET_POWERS, | ||
1572 | &targetPowerCck, 4, false); | ||
1573 | ath9k_hw_get_legacy_target_powers(ah, chan, | ||
1574 | pEepData->calTargetPower2G, | ||
1575 | AR5416_NUM_2G_20_TARGET_POWERS, | ||
1576 | &targetPowerOfdm, 4, false); | ||
1577 | ath9k_hw_get_target_powers(ah, chan, | ||
1578 | pEepData->calTargetPower2GHT20, | ||
1579 | AR5416_NUM_2G_20_TARGET_POWERS, | ||
1580 | &targetPowerHt20, 8, false); | ||
1581 | |||
1582 | if (IS_CHAN_HT40(chan)) { | ||
1583 | numCtlModes = ARRAY_SIZE(ctlModesFor11g); | ||
1584 | ath9k_hw_get_target_powers(ah, chan, | ||
1585 | pEepData->calTargetPower2GHT40, | ||
1586 | AR5416_NUM_2G_40_TARGET_POWERS, | ||
1587 | &targetPowerHt40, 8, true); | ||
1588 | ath9k_hw_get_legacy_target_powers(ah, chan, | ||
1589 | pEepData->calTargetPowerCck, | ||
1590 | AR5416_NUM_2G_CCK_TARGET_POWERS, | ||
1591 | &targetPowerCckExt, 4, true); | ||
1592 | ath9k_hw_get_legacy_target_powers(ah, chan, | ||
1593 | pEepData->calTargetPower2G, | ||
1594 | AR5416_NUM_2G_20_TARGET_POWERS, | ||
1595 | &targetPowerOfdmExt, 4, true); | ||
1596 | } | ||
1597 | |||
1598 | for (ctlMode = 0; ctlMode < numCtlModes; ctlMode++) { | ||
1599 | bool isHt40CtlMode = (pCtlMode[ctlMode] == CTL_5GHT40) || | ||
1600 | (pCtlMode[ctlMode] == CTL_2GHT40); | ||
1601 | if (isHt40CtlMode) | ||
1602 | freq = centers.synth_center; | ||
1603 | else if (pCtlMode[ctlMode] & EXT_ADDITIVE) | ||
1604 | freq = centers.ext_center; | ||
1605 | else | ||
1606 | freq = centers.ctl_center; | ||
1607 | |||
1608 | if (ar5416_get_eep_ver(ahp) == 14 && | ||
1609 | ar5416_get_eep_rev(ahp) <= 2) | ||
1610 | twiceMaxEdgePower = AR5416_MAX_RATE_POWER; | ||
1611 | |||
1612 | DPRINTF(ah->ah_sc, ATH_DBG_POWER_MGMT, | ||
1613 | "LOOP-Mode ctlMode %d < %d, isHt40CtlMode %d, " | ||
1614 | "EXT_ADDITIVE %d\n", | ||
1615 | ctlMode, numCtlModes, isHt40CtlMode, | ||
1616 | (pCtlMode[ctlMode] & EXT_ADDITIVE)); | ||
1617 | |||
1618 | for (i = 0; (i < AR5416_NUM_CTLS) && | ||
1619 | pEepData->ctlIndex[i]; i++) { | ||
1620 | DPRINTF(ah->ah_sc, ATH_DBG_POWER_MGMT, | ||
1621 | " LOOP-Ctlidx %d: cfgCtl 0x%2.2x " | ||
1622 | "pCtlMode 0x%2.2x ctlIndex 0x%2.2x " | ||
1623 | "chan %d\n", | ||
1624 | i, cfgCtl, pCtlMode[ctlMode], | ||
1625 | pEepData->ctlIndex[i], chan->channel); | ||
1626 | |||
1627 | if ((((cfgCtl & ~CTL_MODE_M) | | ||
1628 | (pCtlMode[ctlMode] & CTL_MODE_M)) == | ||
1629 | pEepData->ctlIndex[i]) || | ||
1630 | (((cfgCtl & ~CTL_MODE_M) | | ||
1631 | (pCtlMode[ctlMode] & CTL_MODE_M)) == | ||
1632 | ((pEepData->ctlIndex[i] & CTL_MODE_M) | | ||
1633 | SD_NO_CTL))) { | ||
1634 | rep = &(pEepData->ctlData[i]); | ||
1635 | |||
1636 | twiceMinEdgePower = | ||
1637 | ath9k_hw_get_max_edge_power(freq, | ||
1638 | rep->ctlEdges[ar5416_get_ntxchains | ||
1639 | (tx_chainmask) - 1], | ||
1640 | IS_CHAN_2GHZ(chan), | ||
1641 | AR5416_EEP4K_NUM_BAND_EDGES); | ||
1642 | |||
1643 | DPRINTF(ah->ah_sc, ATH_DBG_POWER_MGMT, | ||
1644 | " MATCH-EE_IDX %d: ch %d is2 %d " | ||
1645 | "2xMinEdge %d chainmask %d chains %d\n", | ||
1646 | i, freq, IS_CHAN_2GHZ(chan), | ||
1647 | twiceMinEdgePower, tx_chainmask, | ||
1648 | ar5416_get_ntxchains | ||
1649 | (tx_chainmask)); | ||
1650 | if ((cfgCtl & ~CTL_MODE_M) == SD_NO_CTL) { | ||
1651 | twiceMaxEdgePower = | ||
1652 | min(twiceMaxEdgePower, | ||
1653 | twiceMinEdgePower); | ||
1654 | } else { | ||
1655 | twiceMaxEdgePower = twiceMinEdgePower; | ||
1656 | break; | ||
1657 | } | ||
1658 | } | ||
1659 | } | ||
1660 | |||
1661 | minCtlPower = (u8)min(twiceMaxEdgePower, scaledPower); | ||
1662 | |||
1663 | DPRINTF(ah->ah_sc, ATH_DBG_POWER_MGMT, | ||
1664 | " SEL-Min ctlMode %d pCtlMode %d " | ||
1665 | "2xMaxEdge %d sP %d minCtlPwr %d\n", | ||
1666 | ctlMode, pCtlMode[ctlMode], twiceMaxEdgePower, | ||
1667 | scaledPower, minCtlPower); | ||
1668 | |||
1669 | switch (pCtlMode[ctlMode]) { | ||
1670 | case CTL_11B: | ||
1671 | for (i = 0; i < ARRAY_SIZE(targetPowerCck.tPow2x); | ||
1672 | i++) { | ||
1673 | targetPowerCck.tPow2x[i] = | ||
1674 | min((u16)targetPowerCck.tPow2x[i], | ||
1675 | minCtlPower); | ||
1676 | } | ||
1677 | break; | ||
1678 | case CTL_11G: | ||
1679 | for (i = 0; i < ARRAY_SIZE(targetPowerOfdm.tPow2x); | ||
1680 | i++) { | ||
1681 | targetPowerOfdm.tPow2x[i] = | ||
1682 | min((u16)targetPowerOfdm.tPow2x[i], | ||
1683 | minCtlPower); | ||
1684 | } | ||
1685 | break; | ||
1686 | case CTL_2GHT20: | ||
1687 | for (i = 0; i < ARRAY_SIZE(targetPowerHt20.tPow2x); | ||
1688 | i++) { | ||
1689 | targetPowerHt20.tPow2x[i] = | ||
1690 | min((u16)targetPowerHt20.tPow2x[i], | ||
1691 | minCtlPower); | ||
1692 | } | ||
1693 | break; | ||
1694 | case CTL_11B_EXT: | ||
1695 | targetPowerCckExt.tPow2x[0] = min((u16) | ||
1696 | targetPowerCckExt.tPow2x[0], | ||
1697 | minCtlPower); | ||
1698 | break; | ||
1699 | case CTL_11G_EXT: | ||
1700 | targetPowerOfdmExt.tPow2x[0] = min((u16) | ||
1701 | targetPowerOfdmExt.tPow2x[0], | ||
1702 | minCtlPower); | ||
1703 | break; | ||
1704 | case CTL_2GHT40: | ||
1705 | for (i = 0; i < ARRAY_SIZE(targetPowerHt40.tPow2x); | ||
1706 | i++) { | ||
1707 | targetPowerHt40.tPow2x[i] = | ||
1708 | min((u16)targetPowerHt40.tPow2x[i], | ||
1709 | minCtlPower); | ||
1710 | } | ||
1711 | break; | ||
1712 | default: | ||
1713 | break; | ||
1714 | } | ||
1715 | } | ||
1716 | |||
1717 | ratesArray[rate6mb] = ratesArray[rate9mb] = ratesArray[rate12mb] = | ||
1718 | ratesArray[rate18mb] = ratesArray[rate24mb] = | ||
1719 | targetPowerOfdm.tPow2x[0]; | ||
1720 | ratesArray[rate36mb] = targetPowerOfdm.tPow2x[1]; | ||
1721 | ratesArray[rate48mb] = targetPowerOfdm.tPow2x[2]; | ||
1722 | ratesArray[rate54mb] = targetPowerOfdm.tPow2x[3]; | ||
1723 | ratesArray[rateXr] = targetPowerOfdm.tPow2x[0]; | ||
1724 | |||
1725 | for (i = 0; i < ARRAY_SIZE(targetPowerHt20.tPow2x); i++) | ||
1726 | ratesArray[rateHt20_0 + i] = targetPowerHt20.tPow2x[i]; | ||
1727 | |||
1728 | ratesArray[rate1l] = targetPowerCck.tPow2x[0]; | ||
1729 | ratesArray[rate2s] = ratesArray[rate2l] = targetPowerCck.tPow2x[1]; | ||
1730 | ratesArray[rate5_5s] = ratesArray[rate5_5l] = targetPowerCck.tPow2x[2]; | ||
1731 | ratesArray[rate11s] = ratesArray[rate11l] = targetPowerCck.tPow2x[3]; | ||
1732 | |||
1733 | if (IS_CHAN_HT40(chan)) { | ||
1734 | for (i = 0; i < ARRAY_SIZE(targetPowerHt40.tPow2x); i++) { | ||
1735 | ratesArray[rateHt40_0 + i] = | ||
1736 | targetPowerHt40.tPow2x[i]; | ||
1737 | } | ||
1738 | ratesArray[rateDupOfdm] = targetPowerHt40.tPow2x[0]; | ||
1739 | ratesArray[rateDupCck] = targetPowerHt40.tPow2x[0]; | ||
1740 | ratesArray[rateExtOfdm] = targetPowerOfdmExt.tPow2x[0]; | ||
1741 | ratesArray[rateExtCck] = targetPowerCckExt.tPow2x[0]; | ||
1742 | } | ||
1743 | return true; | ||
1744 | } | ||
1745 | |||
1746 | static int ath9k_hw_def_set_txpower(struct ath_hal *ah, | ||
1747 | struct ath9k_channel *chan, | ||
1748 | u16 cfgCtl, | ||
1749 | u8 twiceAntennaReduction, | ||
1750 | u8 twiceMaxRegulatoryPower, | ||
1751 | u8 powerLimit) | ||
1752 | { | ||
1753 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
1754 | struct ar5416_eeprom_def *pEepData = &ahp->ah_eeprom.def; | ||
1755 | struct modal_eep_header *pModal = | ||
1756 | &(pEepData->modalHeader[IS_CHAN_2GHZ(chan)]); | ||
1757 | int16_t ratesArray[Ar5416RateSize]; | ||
1758 | int16_t txPowerIndexOffset = 0; | ||
1759 | u8 ht40PowerIncForPdadc = 2; | ||
1760 | int i; | ||
1761 | |||
1762 | memset(ratesArray, 0, sizeof(ratesArray)); | ||
1124 | 1763 | ||
1125 | if ((pEepData->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >= | 1764 | if ((pEepData->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >= |
1126 | AR5416_EEP_MINOR_VER_2) { | 1765 | AR5416_EEP_MINOR_VER_2) { |
1127 | pdGainOverlap_t2 = | 1766 | ht40PowerIncForPdadc = pModal->ht40PowerIncForPdadc; |
1128 | pEepData->modalHeader[modalIdx].pdGainOverlap; | 1767 | } |
1129 | } else { | 1768 | |
1130 | pdGainOverlap_t2 = (u16)(MS(REG_READ(ah, AR_PHY_TPCRG5), | 1769 | if (!ath9k_hw_set_def_power_per_rate_table(ah, chan, |
1131 | AR_PHY_TPCRG5_PD_GAIN_OVERLAP)); | 1770 | &ratesArray[0], cfgCtl, |
1771 | twiceAntennaReduction, | ||
1772 | twiceMaxRegulatoryPower, | ||
1773 | powerLimit)) { | ||
1774 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
1775 | "ath9k_hw_set_txpower: unable to set " | ||
1776 | "tx power per rate table\n"); | ||
1777 | return -EIO; | ||
1778 | } | ||
1779 | |||
1780 | if (!ath9k_hw_set_def_power_cal_table(ah, chan, &txPowerIndexOffset)) { | ||
1781 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
1782 | "ath9k_hw_set_txpower: unable to set power table\n"); | ||
1783 | return -EIO; | ||
1784 | } | ||
1785 | |||
1786 | for (i = 0; i < ARRAY_SIZE(ratesArray); i++) { | ||
1787 | ratesArray[i] = (int16_t)(txPowerIndexOffset + ratesArray[i]); | ||
1788 | if (ratesArray[i] > AR5416_MAX_RATE_POWER) | ||
1789 | ratesArray[i] = AR5416_MAX_RATE_POWER; | ||
1132 | } | 1790 | } |
1133 | 1791 | ||
1792 | if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
1793 | for (i = 0; i < Ar5416RateSize; i++) | ||
1794 | ratesArray[i] -= AR5416_PWR_TABLE_OFFSET * 2; | ||
1795 | } | ||
1796 | |||
1797 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE1, | ||
1798 | ATH9K_POW_SM(ratesArray[rate18mb], 24) | ||
1799 | | ATH9K_POW_SM(ratesArray[rate12mb], 16) | ||
1800 | | ATH9K_POW_SM(ratesArray[rate9mb], 8) | ||
1801 | | ATH9K_POW_SM(ratesArray[rate6mb], 0)); | ||
1802 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE2, | ||
1803 | ATH9K_POW_SM(ratesArray[rate54mb], 24) | ||
1804 | | ATH9K_POW_SM(ratesArray[rate48mb], 16) | ||
1805 | | ATH9K_POW_SM(ratesArray[rate36mb], 8) | ||
1806 | | ATH9K_POW_SM(ratesArray[rate24mb], 0)); | ||
1807 | |||
1134 | if (IS_CHAN_2GHZ(chan)) { | 1808 | if (IS_CHAN_2GHZ(chan)) { |
1135 | pCalBChans = pEepData->calFreqPier2G; | 1809 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE3, |
1136 | numPiers = AR5416_NUM_2G_CAL_PIERS; | 1810 | ATH9K_POW_SM(ratesArray[rate2s], 24) |
1137 | } else { | 1811 | | ATH9K_POW_SM(ratesArray[rate2l], 16) |
1138 | pCalBChans = pEepData->calFreqPier5G; | 1812 | | ATH9K_POW_SM(ratesArray[rateXr], 8) |
1139 | numPiers = AR5416_NUM_5G_CAL_PIERS; | 1813 | | ATH9K_POW_SM(ratesArray[rate1l], 0)); |
1814 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE4, | ||
1815 | ATH9K_POW_SM(ratesArray[rate11s], 24) | ||
1816 | | ATH9K_POW_SM(ratesArray[rate11l], 16) | ||
1817 | | ATH9K_POW_SM(ratesArray[rate5_5s], 8) | ||
1818 | | ATH9K_POW_SM(ratesArray[rate5_5l], 0)); | ||
1140 | } | 1819 | } |
1141 | 1820 | ||
1142 | numXpdGain = 0; | 1821 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE5, |
1822 | ATH9K_POW_SM(ratesArray[rateHt20_3], 24) | ||
1823 | | ATH9K_POW_SM(ratesArray[rateHt20_2], 16) | ||
1824 | | ATH9K_POW_SM(ratesArray[rateHt20_1], 8) | ||
1825 | | ATH9K_POW_SM(ratesArray[rateHt20_0], 0)); | ||
1826 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE6, | ||
1827 | ATH9K_POW_SM(ratesArray[rateHt20_7], 24) | ||
1828 | | ATH9K_POW_SM(ratesArray[rateHt20_6], 16) | ||
1829 | | ATH9K_POW_SM(ratesArray[rateHt20_5], 8) | ||
1830 | | ATH9K_POW_SM(ratesArray[rateHt20_4], 0)); | ||
1143 | 1831 | ||
1144 | for (i = 1; i <= AR5416_PD_GAINS_IN_MASK; i++) { | 1832 | if (IS_CHAN_HT40(chan)) { |
1145 | if ((xpdMask >> (AR5416_PD_GAINS_IN_MASK - i)) & 1) { | 1833 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE7, |
1146 | if (numXpdGain >= AR5416_NUM_PD_GAINS) | 1834 | ATH9K_POW_SM(ratesArray[rateHt40_3] + |
1147 | break; | 1835 | ht40PowerIncForPdadc, 24) |
1148 | xpdGainValues[numXpdGain] = | 1836 | | ATH9K_POW_SM(ratesArray[rateHt40_2] + |
1149 | (u16)(AR5416_PD_GAINS_IN_MASK - i); | 1837 | ht40PowerIncForPdadc, 16) |
1150 | numXpdGain++; | 1838 | | ATH9K_POW_SM(ratesArray[rateHt40_1] + |
1151 | } | 1839 | ht40PowerIncForPdadc, 8) |
1840 | | ATH9K_POW_SM(ratesArray[rateHt40_0] + | ||
1841 | ht40PowerIncForPdadc, 0)); | ||
1842 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE8, | ||
1843 | ATH9K_POW_SM(ratesArray[rateHt40_7] + | ||
1844 | ht40PowerIncForPdadc, 24) | ||
1845 | | ATH9K_POW_SM(ratesArray[rateHt40_6] + | ||
1846 | ht40PowerIncForPdadc, 16) | ||
1847 | | ATH9K_POW_SM(ratesArray[rateHt40_5] + | ||
1848 | ht40PowerIncForPdadc, 8) | ||
1849 | | ATH9K_POW_SM(ratesArray[rateHt40_4] + | ||
1850 | ht40PowerIncForPdadc, 0)); | ||
1851 | |||
1852 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE9, | ||
1853 | ATH9K_POW_SM(ratesArray[rateExtOfdm], 24) | ||
1854 | | ATH9K_POW_SM(ratesArray[rateExtCck], 16) | ||
1855 | | ATH9K_POW_SM(ratesArray[rateDupOfdm], 8) | ||
1856 | | ATH9K_POW_SM(ratesArray[rateDupCck], 0)); | ||
1152 | } | 1857 | } |
1153 | 1858 | ||
1154 | REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_NUM_PD_GAIN, | 1859 | REG_WRITE(ah, AR_PHY_POWER_TX_SUB, |
1155 | (numXpdGain - 1) & 0x3); | 1860 | ATH9K_POW_SM(pModal->pwrDecreaseFor3Chain, 6) |
1156 | REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_1, | 1861 | | ATH9K_POW_SM(pModal->pwrDecreaseFor2Chain, 0)); |
1157 | xpdGainValues[0]); | ||
1158 | REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_2, | ||
1159 | xpdGainValues[1]); | ||
1160 | REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_3, | ||
1161 | xpdGainValues[2]); | ||
1162 | 1862 | ||
1163 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { | 1863 | i = rate6mb; |
1164 | if (AR_SREV_5416_V20_OR_LATER(ah) && | ||
1165 | (ahp->ah_rxchainmask == 5 || ahp->ah_txchainmask == 5) && | ||
1166 | (i != 0)) { | ||
1167 | regChainOffset = (i == 1) ? 0x2000 : 0x1000; | ||
1168 | } else | ||
1169 | regChainOffset = i * 0x1000; | ||
1170 | 1864 | ||
1171 | if (pEepData->baseEepHeader.txMask & (1 << i)) { | 1865 | if (IS_CHAN_HT40(chan)) |
1172 | if (IS_CHAN_2GHZ(chan)) | 1866 | i = rateHt40_0; |
1173 | pRawDataset = pEepData->calPierData2G[i]; | 1867 | else if (IS_CHAN_HT20(chan)) |
1174 | else | 1868 | i = rateHt20_0; |
1175 | pRawDataset = pEepData->calPierData5G[i]; | ||
1176 | 1869 | ||
1177 | ath9k_hw_get_gain_boundaries_pdadcs(ah, chan, | 1870 | if (AR_SREV_9280_10_OR_LATER(ah)) |
1178 | pRawDataset, pCalBChans, | 1871 | ah->ah_maxPowerLevel = |
1179 | numPiers, pdGainOverlap_t2, | 1872 | ratesArray[i] + AR5416_PWR_TABLE_OFFSET * 2; |
1180 | &tMinCalPower, gainBoundaries, | 1873 | else |
1181 | pdadcValues, numXpdGain); | 1874 | ah->ah_maxPowerLevel = ratesArray[i]; |
1182 | 1875 | ||
1183 | if ((i == 0) || AR_SREV_5416_V20_OR_LATER(ah)) { | 1876 | return 0; |
1184 | REG_WRITE(ah, | 1877 | } |
1185 | AR_PHY_TPCRG5 + regChainOffset, | ||
1186 | SM(pdGainOverlap_t2, | ||
1187 | AR_PHY_TPCRG5_PD_GAIN_OVERLAP) | ||
1188 | | SM(gainBoundaries[0], | ||
1189 | AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1) | ||
1190 | | SM(gainBoundaries[1], | ||
1191 | AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2) | ||
1192 | | SM(gainBoundaries[2], | ||
1193 | AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3) | ||
1194 | | SM(gainBoundaries[3], | ||
1195 | AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4)); | ||
1196 | } | ||
1197 | 1878 | ||
1198 | regOffset = AR_PHY_BASE + (672 << 2) + regChainOffset; | 1879 | static int ath9k_hw_4k_set_txpower(struct ath_hal *ah, |
1199 | for (j = 0; j < 32; j++) { | 1880 | struct ath9k_channel *chan, |
1200 | reg32 = ((pdadcValues[4 * j + 0] & 0xFF) << 0) | | 1881 | u16 cfgCtl, |
1201 | ((pdadcValues[4 * j + 1] & 0xFF) << 8) | | 1882 | u8 twiceAntennaReduction, |
1202 | ((pdadcValues[4 * j + 2] & 0xFF) << 16) | | 1883 | u8 twiceMaxRegulatoryPower, |
1203 | ((pdadcValues[4 * j + 3] & 0xFF) << 24); | 1884 | u8 powerLimit) |
1204 | REG_WRITE(ah, regOffset, reg32); | 1885 | { |
1886 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
1887 | struct ar5416_eeprom_4k *pEepData = &ahp->ah_eeprom.map4k; | ||
1888 | struct modal_eep_4k_header *pModal = &pEepData->modalHeader; | ||
1889 | int16_t ratesArray[Ar5416RateSize]; | ||
1890 | int16_t txPowerIndexOffset = 0; | ||
1891 | u8 ht40PowerIncForPdadc = 2; | ||
1892 | int i; | ||
1205 | 1893 | ||
1206 | DPRINTF(ah->ah_sc, ATH_DBG_REG_IO, | 1894 | memset(ratesArray, 0, sizeof(ratesArray)); |
1207 | "PDADC (%d,%4x): %4.4x %8.8x\n", | ||
1208 | i, regChainOffset, regOffset, | ||
1209 | reg32); | ||
1210 | DPRINTF(ah->ah_sc, ATH_DBG_REG_IO, | ||
1211 | "PDADC: Chain %d | PDADC %3d Value %3d | " | ||
1212 | "PDADC %3d Value %3d | PDADC %3d Value %3d | " | ||
1213 | "PDADC %3d Value %3d |\n", | ||
1214 | i, 4 * j, pdadcValues[4 * j], | ||
1215 | 4 * j + 1, pdadcValues[4 * j + 1], | ||
1216 | 4 * j + 2, pdadcValues[4 * j + 2], | ||
1217 | 4 * j + 3, | ||
1218 | pdadcValues[4 * j + 3]); | ||
1219 | 1895 | ||
1220 | regOffset += 4; | 1896 | if ((pEepData->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >= |
1221 | } | 1897 | AR5416_EEP_MINOR_VER_2) { |
1898 | ht40PowerIncForPdadc = pModal->ht40PowerIncForPdadc; | ||
1899 | } | ||
1900 | |||
1901 | if (!ath9k_hw_set_4k_power_per_rate_table(ah, chan, | ||
1902 | &ratesArray[0], cfgCtl, | ||
1903 | twiceAntennaReduction, | ||
1904 | twiceMaxRegulatoryPower, | ||
1905 | powerLimit)) { | ||
1906 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
1907 | "ath9k_hw_set_txpower: unable to set " | ||
1908 | "tx power per rate table\n"); | ||
1909 | return -EIO; | ||
1910 | } | ||
1911 | |||
1912 | if (!ath9k_hw_set_4k_power_cal_table(ah, chan, &txPowerIndexOffset)) { | ||
1913 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
1914 | "ath9k_hw_set_txpower: unable to set power table\n"); | ||
1915 | return -EIO; | ||
1916 | } | ||
1917 | |||
1918 | for (i = 0; i < ARRAY_SIZE(ratesArray); i++) { | ||
1919 | ratesArray[i] = (int16_t)(txPowerIndexOffset + ratesArray[i]); | ||
1920 | if (ratesArray[i] > AR5416_MAX_RATE_POWER) | ||
1921 | ratesArray[i] = AR5416_MAX_RATE_POWER; | ||
1922 | } | ||
1923 | |||
1924 | if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
1925 | for (i = 0; i < Ar5416RateSize; i++) | ||
1926 | ratesArray[i] -= AR5416_PWR_TABLE_OFFSET * 2; | ||
1927 | } | ||
1928 | |||
1929 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE1, | ||
1930 | ATH9K_POW_SM(ratesArray[rate18mb], 24) | ||
1931 | | ATH9K_POW_SM(ratesArray[rate12mb], 16) | ||
1932 | | ATH9K_POW_SM(ratesArray[rate9mb], 8) | ||
1933 | | ATH9K_POW_SM(ratesArray[rate6mb], 0)); | ||
1934 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE2, | ||
1935 | ATH9K_POW_SM(ratesArray[rate54mb], 24) | ||
1936 | | ATH9K_POW_SM(ratesArray[rate48mb], 16) | ||
1937 | | ATH9K_POW_SM(ratesArray[rate36mb], 8) | ||
1938 | | ATH9K_POW_SM(ratesArray[rate24mb], 0)); | ||
1939 | |||
1940 | if (IS_CHAN_2GHZ(chan)) { | ||
1941 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE3, | ||
1942 | ATH9K_POW_SM(ratesArray[rate2s], 24) | ||
1943 | | ATH9K_POW_SM(ratesArray[rate2l], 16) | ||
1944 | | ATH9K_POW_SM(ratesArray[rateXr], 8) | ||
1945 | | ATH9K_POW_SM(ratesArray[rate1l], 0)); | ||
1946 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE4, | ||
1947 | ATH9K_POW_SM(ratesArray[rate11s], 24) | ||
1948 | | ATH9K_POW_SM(ratesArray[rate11l], 16) | ||
1949 | | ATH9K_POW_SM(ratesArray[rate5_5s], 8) | ||
1950 | | ATH9K_POW_SM(ratesArray[rate5_5l], 0)); | ||
1951 | } | ||
1952 | |||
1953 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE5, | ||
1954 | ATH9K_POW_SM(ratesArray[rateHt20_3], 24) | ||
1955 | | ATH9K_POW_SM(ratesArray[rateHt20_2], 16) | ||
1956 | | ATH9K_POW_SM(ratesArray[rateHt20_1], 8) | ||
1957 | | ATH9K_POW_SM(ratesArray[rateHt20_0], 0)); | ||
1958 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE6, | ||
1959 | ATH9K_POW_SM(ratesArray[rateHt20_7], 24) | ||
1960 | | ATH9K_POW_SM(ratesArray[rateHt20_6], 16) | ||
1961 | | ATH9K_POW_SM(ratesArray[rateHt20_5], 8) | ||
1962 | | ATH9K_POW_SM(ratesArray[rateHt20_4], 0)); | ||
1963 | |||
1964 | if (IS_CHAN_HT40(chan)) { | ||
1965 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE7, | ||
1966 | ATH9K_POW_SM(ratesArray[rateHt40_3] + | ||
1967 | ht40PowerIncForPdadc, 24) | ||
1968 | | ATH9K_POW_SM(ratesArray[rateHt40_2] + | ||
1969 | ht40PowerIncForPdadc, 16) | ||
1970 | | ATH9K_POW_SM(ratesArray[rateHt40_1] + | ||
1971 | ht40PowerIncForPdadc, 8) | ||
1972 | | ATH9K_POW_SM(ratesArray[rateHt40_0] + | ||
1973 | ht40PowerIncForPdadc, 0)); | ||
1974 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE8, | ||
1975 | ATH9K_POW_SM(ratesArray[rateHt40_7] + | ||
1976 | ht40PowerIncForPdadc, 24) | ||
1977 | | ATH9K_POW_SM(ratesArray[rateHt40_6] + | ||
1978 | ht40PowerIncForPdadc, 16) | ||
1979 | | ATH9K_POW_SM(ratesArray[rateHt40_5] + | ||
1980 | ht40PowerIncForPdadc, 8) | ||
1981 | | ATH9K_POW_SM(ratesArray[rateHt40_4] + | ||
1982 | ht40PowerIncForPdadc, 0)); | ||
1983 | |||
1984 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE9, | ||
1985 | ATH9K_POW_SM(ratesArray[rateExtOfdm], 24) | ||
1986 | | ATH9K_POW_SM(ratesArray[rateExtCck], 16) | ||
1987 | | ATH9K_POW_SM(ratesArray[rateDupOfdm], 8) | ||
1988 | | ATH9K_POW_SM(ratesArray[rateDupCck], 0)); | ||
1989 | } | ||
1990 | |||
1991 | i = rate6mb; | ||
1992 | |||
1993 | if (IS_CHAN_HT40(chan)) | ||
1994 | i = rateHt40_0; | ||
1995 | else if (IS_CHAN_HT20(chan)) | ||
1996 | i = rateHt20_0; | ||
1997 | |||
1998 | if (AR_SREV_9280_10_OR_LATER(ah)) | ||
1999 | ah->ah_maxPowerLevel = | ||
2000 | ratesArray[i] + AR5416_PWR_TABLE_OFFSET * 2; | ||
2001 | else | ||
2002 | ah->ah_maxPowerLevel = ratesArray[i]; | ||
2003 | |||
2004 | return 0; | ||
2005 | } | ||
2006 | |||
2007 | int (*ath9k_set_txpower[]) (struct ath_hal *, | ||
2008 | struct ath9k_channel *, | ||
2009 | u16, u8, u8, u8) = { | ||
2010 | ath9k_hw_def_set_txpower, | ||
2011 | ath9k_hw_4k_set_txpower | ||
2012 | }; | ||
2013 | |||
2014 | int ath9k_hw_set_txpower(struct ath_hal *ah, | ||
2015 | struct ath9k_channel *chan, | ||
2016 | u16 cfgCtl, | ||
2017 | u8 twiceAntennaReduction, | ||
2018 | u8 twiceMaxRegulatoryPower, | ||
2019 | u8 powerLimit) | ||
2020 | { | ||
2021 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
2022 | |||
2023 | return ath9k_set_txpower[ahp->ah_eep_map](ah, chan, cfgCtl, | ||
2024 | twiceAntennaReduction, twiceMaxRegulatoryPower, | ||
2025 | powerLimit); | ||
2026 | } | ||
2027 | |||
2028 | static void ath9k_hw_set_def_addac(struct ath_hal *ah, | ||
2029 | struct ath9k_channel *chan) | ||
2030 | { | ||
2031 | #define XPA_LVL_FREQ(cnt) (pModal->xpaBiasLvlFreq[cnt]) | ||
2032 | struct modal_eep_header *pModal; | ||
2033 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
2034 | struct ar5416_eeprom_def *eep = &ahp->ah_eeprom.def; | ||
2035 | u8 biaslevel; | ||
2036 | |||
2037 | if (ah->ah_macVersion != AR_SREV_VERSION_9160) | ||
2038 | return; | ||
2039 | |||
2040 | if (ar5416_get_eep_rev(ahp) < AR5416_EEP_MINOR_VER_7) | ||
2041 | return; | ||
2042 | |||
2043 | pModal = &(eep->modalHeader[IS_CHAN_2GHZ(chan)]); | ||
2044 | |||
2045 | if (pModal->xpaBiasLvl != 0xff) { | ||
2046 | biaslevel = pModal->xpaBiasLvl; | ||
2047 | } else { | ||
2048 | u16 resetFreqBin, freqBin, freqCount = 0; | ||
2049 | struct chan_centers centers; | ||
2050 | |||
2051 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
2052 | |||
2053 | resetFreqBin = FREQ2FBIN(centers.synth_center, | ||
2054 | IS_CHAN_2GHZ(chan)); | ||
2055 | freqBin = XPA_LVL_FREQ(0) & 0xff; | ||
2056 | biaslevel = (u8) (XPA_LVL_FREQ(0) >> 14); | ||
2057 | |||
2058 | freqCount++; | ||
2059 | |||
2060 | while (freqCount < 3) { | ||
2061 | if (XPA_LVL_FREQ(freqCount) == 0x0) | ||
2062 | break; | ||
2063 | |||
2064 | freqBin = XPA_LVL_FREQ(freqCount) & 0xff; | ||
2065 | if (resetFreqBin >= freqBin) | ||
2066 | biaslevel = (u8)(XPA_LVL_FREQ(freqCount) >> 14); | ||
2067 | else | ||
2068 | break; | ||
2069 | freqCount++; | ||
1222 | } | 2070 | } |
1223 | } | 2071 | } |
1224 | 2072 | ||
1225 | *pTxPowerIndexOffset = 0; | 2073 | if (IS_CHAN_2GHZ(chan)) { |
2074 | INI_RA(&ahp->ah_iniAddac, 7, 1) = (INI_RA(&ahp->ah_iniAddac, | ||
2075 | 7, 1) & (~0x18)) | biaslevel << 3; | ||
2076 | } else { | ||
2077 | INI_RA(&ahp->ah_iniAddac, 6, 1) = (INI_RA(&ahp->ah_iniAddac, | ||
2078 | 6, 1) & (~0xc0)) | biaslevel << 6; | ||
2079 | } | ||
2080 | #undef XPA_LVL_FREQ | ||
2081 | } | ||
1226 | 2082 | ||
1227 | return true; | 2083 | static void ath9k_hw_set_4k_addac(struct ath_hal *ah, |
2084 | struct ath9k_channel *chan) | ||
2085 | { | ||
2086 | struct modal_eep_4k_header *pModal; | ||
2087 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
2088 | struct ar5416_eeprom_4k *eep = &ahp->ah_eeprom.map4k; | ||
2089 | u8 biaslevel; | ||
2090 | |||
2091 | if (ah->ah_macVersion != AR_SREV_VERSION_9160) | ||
2092 | return; | ||
2093 | |||
2094 | if (ar5416_get_eep_rev(ahp) < AR5416_EEP_MINOR_VER_7) | ||
2095 | return; | ||
2096 | |||
2097 | pModal = &eep->modalHeader; | ||
2098 | |||
2099 | if (pModal->xpaBiasLvl != 0xff) { | ||
2100 | biaslevel = pModal->xpaBiasLvl; | ||
2101 | INI_RA(&ahp->ah_iniAddac, 7, 1) = | ||
2102 | (INI_RA(&ahp->ah_iniAddac, 7, 1) & (~0x18)) | biaslevel << 3; | ||
2103 | } | ||
2104 | } | ||
2105 | |||
2106 | void (*ath9k_set_addac[]) (struct ath_hal *, struct ath9k_channel *) = { | ||
2107 | ath9k_hw_set_def_addac, | ||
2108 | ath9k_hw_set_4k_addac | ||
2109 | }; | ||
2110 | |||
2111 | void ath9k_hw_set_addac(struct ath_hal *ah, struct ath9k_channel *chan) | ||
2112 | { | ||
2113 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
2114 | |||
2115 | ath9k_set_addac[ahp->ah_eep_map](ah, chan); | ||
1228 | } | 2116 | } |
1229 | 2117 | ||
2118 | |||
2119 | |||
1230 | /* XXX: Clean me up, make me more legible */ | 2120 | /* XXX: Clean me up, make me more legible */ |
1231 | bool ath9k_hw_eeprom_set_board_values(struct ath_hal *ah, | 2121 | static bool ath9k_hw_eeprom_set_def_board_values(struct ath_hal *ah, |
1232 | struct ath9k_channel *chan) | 2122 | struct ath9k_channel *chan) |
1233 | { | 2123 | { |
1234 | struct modal_eep_header *pModal; | 2124 | struct modal_eep_header *pModal; |
1235 | struct ath_hal_5416 *ahp = AH5416(ah); | 2125 | struct ath_hal_5416 *ahp = AH5416(ah); |
1236 | struct ar5416_eeprom *eep = &ahp->ah_eeprom; | 2126 | struct ar5416_eeprom_def *eep = &ahp->ah_eeprom.def; |
1237 | int i, regChainOffset; | 2127 | int i, regChainOffset; |
1238 | u8 txRxAttenLocal; | 2128 | u8 txRxAttenLocal; |
1239 | u16 ant_config; | 2129 | u16 ant_config; |
@@ -1462,12 +2352,214 @@ bool ath9k_hw_eeprom_set_board_values(struct ath_hal *ah, | |||
1462 | return true; | 2352 | return true; |
1463 | } | 2353 | } |
1464 | 2354 | ||
1465 | int ath9k_hw_get_eeprom_antenna_cfg(struct ath_hal *ah, | 2355 | static bool ath9k_hw_eeprom_set_4k_board_values(struct ath_hal *ah, |
2356 | struct ath9k_channel *chan) | ||
2357 | { | ||
2358 | struct modal_eep_4k_header *pModal; | ||
2359 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
2360 | struct ar5416_eeprom_4k *eep = &ahp->ah_eeprom.map4k; | ||
2361 | int regChainOffset; | ||
2362 | u8 txRxAttenLocal; | ||
2363 | u16 ant_config = 0; | ||
2364 | u8 ob[5], db1[5], db2[5]; | ||
2365 | u8 ant_div_control1, ant_div_control2; | ||
2366 | u32 regVal; | ||
2367 | |||
2368 | |||
2369 | pModal = &eep->modalHeader; | ||
2370 | |||
2371 | txRxAttenLocal = 23; | ||
2372 | |||
2373 | ath9k_hw_get_eeprom_antenna_cfg(ah, chan, 0, &ant_config); | ||
2374 | REG_WRITE(ah, AR_PHY_SWITCH_COM, ant_config); | ||
2375 | |||
2376 | regChainOffset = 0; | ||
2377 | REG_WRITE(ah, AR_PHY_SWITCH_CHAIN_0 + regChainOffset, | ||
2378 | pModal->antCtrlChain[0]); | ||
2379 | |||
2380 | REG_WRITE(ah, AR_PHY_TIMING_CTRL4(0) + regChainOffset, | ||
2381 | (REG_READ(ah, AR_PHY_TIMING_CTRL4(0) + regChainOffset) & | ||
2382 | ~(AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF | | ||
2383 | AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF)) | | ||
2384 | SM(pModal->iqCalICh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF) | | ||
2385 | SM(pModal->iqCalQCh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF)); | ||
2386 | |||
2387 | if ((eep->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >= | ||
2388 | AR5416_EEP_MINOR_VER_3) { | ||
2389 | txRxAttenLocal = pModal->txRxAttenCh[0]; | ||
2390 | REG_RMW_FIELD(ah, AR_PHY_GAIN_2GHZ + regChainOffset, | ||
2391 | AR_PHY_GAIN_2GHZ_XATTEN1_MARGIN, pModal->bswMargin[0]); | ||
2392 | REG_RMW_FIELD(ah, AR_PHY_GAIN_2GHZ + regChainOffset, | ||
2393 | AR_PHY_GAIN_2GHZ_XATTEN1_DB, pModal->bswAtten[0]); | ||
2394 | REG_RMW_FIELD(ah, AR_PHY_GAIN_2GHZ + regChainOffset, | ||
2395 | AR_PHY_GAIN_2GHZ_XATTEN2_MARGIN, | ||
2396 | pModal->xatten2Margin[0]); | ||
2397 | REG_RMW_FIELD(ah, AR_PHY_GAIN_2GHZ + regChainOffset, | ||
2398 | AR_PHY_GAIN_2GHZ_XATTEN2_DB, pModal->xatten2Db[0]); | ||
2399 | } | ||
2400 | |||
2401 | REG_RMW_FIELD(ah, AR_PHY_RXGAIN + regChainOffset, | ||
2402 | AR9280_PHY_RXGAIN_TXRX_ATTEN, txRxAttenLocal); | ||
2403 | REG_RMW_FIELD(ah, AR_PHY_RXGAIN + regChainOffset, | ||
2404 | AR9280_PHY_RXGAIN_TXRX_MARGIN, pModal->rxTxMarginCh[0]); | ||
2405 | |||
2406 | if (AR_SREV_9285_11(ah)) | ||
2407 | REG_WRITE(ah, AR9285_AN_TOP4, (AR9285_AN_TOP4_DEFAULT | 0x14)); | ||
2408 | |||
2409 | /* Initialize Ant Diversity settings from EEPROM */ | ||
2410 | if (pModal->version == 3) { | ||
2411 | ant_div_control1 = ((pModal->ob_234 >> 12) & 0xf); | ||
2412 | ant_div_control2 = ((pModal->db1_234 >> 12) & 0xf); | ||
2413 | regVal = REG_READ(ah, 0x99ac); | ||
2414 | regVal &= (~(0x7f000000)); | ||
2415 | regVal |= ((ant_div_control1 & 0x1) << 24); | ||
2416 | regVal |= (((ant_div_control1 >> 1) & 0x1) << 29); | ||
2417 | regVal |= (((ant_div_control1 >> 2) & 0x1) << 30); | ||
2418 | regVal |= ((ant_div_control2 & 0x3) << 25); | ||
2419 | regVal |= (((ant_div_control2 >> 2) & 0x3) << 27); | ||
2420 | REG_WRITE(ah, 0x99ac, regVal); | ||
2421 | regVal = REG_READ(ah, 0x99ac); | ||
2422 | regVal = REG_READ(ah, 0xa208); | ||
2423 | regVal &= (~(0x1 << 13)); | ||
2424 | regVal |= (((ant_div_control1 >> 3) & 0x1) << 13); | ||
2425 | REG_WRITE(ah, 0xa208, regVal); | ||
2426 | regVal = REG_READ(ah, 0xa208); | ||
2427 | } | ||
2428 | |||
2429 | if (pModal->version >= 2) { | ||
2430 | ob[0] = (pModal->ob_01 & 0xf); | ||
2431 | ob[1] = (pModal->ob_01 >> 4) & 0xf; | ||
2432 | ob[2] = (pModal->ob_234 & 0xf); | ||
2433 | ob[3] = ((pModal->ob_234 >> 4) & 0xf); | ||
2434 | ob[4] = ((pModal->ob_234 >> 8) & 0xf); | ||
2435 | |||
2436 | db1[0] = (pModal->db1_01 & 0xf); | ||
2437 | db1[1] = ((pModal->db1_01 >> 4) & 0xf); | ||
2438 | db1[2] = (pModal->db1_234 & 0xf); | ||
2439 | db1[3] = ((pModal->db1_234 >> 4) & 0xf); | ||
2440 | db1[4] = ((pModal->db1_234 >> 8) & 0xf); | ||
2441 | |||
2442 | db2[0] = (pModal->db2_01 & 0xf); | ||
2443 | db2[1] = ((pModal->db2_01 >> 4) & 0xf); | ||
2444 | db2[2] = (pModal->db2_234 & 0xf); | ||
2445 | db2[3] = ((pModal->db2_234 >> 4) & 0xf); | ||
2446 | db2[4] = ((pModal->db2_234 >> 8) & 0xf); | ||
2447 | |||
2448 | } else if (pModal->version == 1) { | ||
2449 | |||
2450 | DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, | ||
2451 | "EEPROM Model version is set to 1 \n"); | ||
2452 | ob[0] = (pModal->ob_01 & 0xf); | ||
2453 | ob[1] = ob[2] = ob[3] = ob[4] = (pModal->ob_01 >> 4) & 0xf; | ||
2454 | db1[0] = (pModal->db1_01 & 0xf); | ||
2455 | db1[1] = db1[2] = db1[3] = | ||
2456 | db1[4] = ((pModal->db1_01 >> 4) & 0xf); | ||
2457 | db2[0] = (pModal->db2_01 & 0xf); | ||
2458 | db2[1] = db2[2] = db2[3] = | ||
2459 | db2[4] = ((pModal->db2_01 >> 4) & 0xf); | ||
2460 | } else { | ||
2461 | int i; | ||
2462 | for (i = 0; i < 5; i++) { | ||
2463 | ob[i] = pModal->ob_01; | ||
2464 | db1[i] = pModal->db1_01; | ||
2465 | db2[i] = pModal->db1_01; | ||
2466 | } | ||
2467 | } | ||
2468 | |||
2469 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G3, | ||
2470 | AR9285_AN_RF2G3_OB_0, AR9285_AN_RF2G3_OB_0_S, ob[0]); | ||
2471 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G3, | ||
2472 | AR9285_AN_RF2G3_OB_1, AR9285_AN_RF2G3_OB_1_S, ob[1]); | ||
2473 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G3, | ||
2474 | AR9285_AN_RF2G3_OB_2, AR9285_AN_RF2G3_OB_2_S, ob[2]); | ||
2475 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G3, | ||
2476 | AR9285_AN_RF2G3_OB_3, AR9285_AN_RF2G3_OB_3_S, ob[3]); | ||
2477 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G3, | ||
2478 | AR9285_AN_RF2G3_OB_4, AR9285_AN_RF2G3_OB_4_S, ob[4]); | ||
2479 | |||
2480 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G3, | ||
2481 | AR9285_AN_RF2G3_DB1_0, AR9285_AN_RF2G3_DB1_0_S, db1[0]); | ||
2482 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G3, | ||
2483 | AR9285_AN_RF2G3_DB1_1, AR9285_AN_RF2G3_DB1_1_S, db1[1]); | ||
2484 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G3, | ||
2485 | AR9285_AN_RF2G3_DB1_2, AR9285_AN_RF2G3_DB1_2_S, db1[2]); | ||
2486 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G4, | ||
2487 | AR9285_AN_RF2G4_DB1_3, AR9285_AN_RF2G4_DB1_3_S, db1[3]); | ||
2488 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G4, | ||
2489 | AR9285_AN_RF2G4_DB1_4, AR9285_AN_RF2G4_DB1_4_S, db1[4]); | ||
2490 | |||
2491 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G4, | ||
2492 | AR9285_AN_RF2G4_DB2_0, AR9285_AN_RF2G4_DB2_0_S, db2[0]); | ||
2493 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G4, | ||
2494 | AR9285_AN_RF2G4_DB2_1, AR9285_AN_RF2G4_DB2_1_S, db2[1]); | ||
2495 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G4, | ||
2496 | AR9285_AN_RF2G4_DB2_2, AR9285_AN_RF2G4_DB2_2_S, db2[2]); | ||
2497 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G4, | ||
2498 | AR9285_AN_RF2G4_DB2_3, AR9285_AN_RF2G4_DB2_3_S, db2[3]); | ||
2499 | ath9k_hw_analog_shift_rmw(ah, AR9285_AN_RF2G4, | ||
2500 | AR9285_AN_RF2G4_DB2_4, AR9285_AN_RF2G4_DB2_4_S, db2[4]); | ||
2501 | |||
2502 | |||
2503 | if (AR_SREV_9285_11(ah)) | ||
2504 | REG_WRITE(ah, AR9285_AN_TOP4, AR9285_AN_TOP4_DEFAULT); | ||
2505 | |||
2506 | REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_SWITCH, | ||
2507 | pModal->switchSettling); | ||
2508 | REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, AR_PHY_DESIRED_SZ_ADC, | ||
2509 | pModal->adcDesiredSize); | ||
2510 | |||
2511 | REG_WRITE(ah, AR_PHY_RF_CTL4, | ||
2512 | SM(pModal->txEndToXpaOff, AR_PHY_RF_CTL4_TX_END_XPAA_OFF) | | ||
2513 | SM(pModal->txEndToXpaOff, AR_PHY_RF_CTL4_TX_END_XPAB_OFF) | | ||
2514 | SM(pModal->txFrameToXpaOn, AR_PHY_RF_CTL4_FRAME_XPAA_ON) | | ||
2515 | SM(pModal->txFrameToXpaOn, AR_PHY_RF_CTL4_FRAME_XPAB_ON)); | ||
2516 | |||
2517 | REG_RMW_FIELD(ah, AR_PHY_RF_CTL3, AR_PHY_TX_END_TO_A2_RX_ON, | ||
2518 | pModal->txEndToRxOn); | ||
2519 | REG_RMW_FIELD(ah, AR_PHY_CCA, AR9280_PHY_CCA_THRESH62, | ||
2520 | pModal->thresh62); | ||
2521 | REG_RMW_FIELD(ah, AR_PHY_EXT_CCA0, AR_PHY_EXT_CCA0_THRESH62, | ||
2522 | pModal->thresh62); | ||
2523 | |||
2524 | if ((eep->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >= | ||
2525 | AR5416_EEP_MINOR_VER_2) { | ||
2526 | REG_RMW_FIELD(ah, AR_PHY_RF_CTL2, AR_PHY_TX_END_DATA_START, | ||
2527 | pModal->txFrameToDataStart); | ||
2528 | REG_RMW_FIELD(ah, AR_PHY_RF_CTL2, AR_PHY_TX_END_PA_ON, | ||
2529 | pModal->txFrameToPaOn); | ||
2530 | } | ||
2531 | |||
2532 | if ((eep->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >= | ||
2533 | AR5416_EEP_MINOR_VER_3) { | ||
2534 | if (IS_CHAN_HT40(chan)) | ||
2535 | REG_RMW_FIELD(ah, AR_PHY_SETTLING, | ||
2536 | AR_PHY_SETTLING_SWITCH, | ||
2537 | pModal->swSettleHt40); | ||
2538 | } | ||
2539 | |||
2540 | return true; | ||
2541 | } | ||
2542 | |||
2543 | bool (*ath9k_eeprom_set_board_values[])(struct ath_hal *, | ||
2544 | struct ath9k_channel *) = { | ||
2545 | ath9k_hw_eeprom_set_def_board_values, | ||
2546 | ath9k_hw_eeprom_set_4k_board_values | ||
2547 | }; | ||
2548 | |||
2549 | bool ath9k_hw_eeprom_set_board_values(struct ath_hal *ah, | ||
2550 | struct ath9k_channel *chan) | ||
2551 | { | ||
2552 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
2553 | |||
2554 | return ath9k_eeprom_set_board_values[ahp->ah_eep_map](ah, chan); | ||
2555 | } | ||
2556 | |||
2557 | static int ath9k_hw_get_def_eeprom_antenna_cfg(struct ath_hal *ah, | ||
1466 | struct ath9k_channel *chan, | 2558 | struct ath9k_channel *chan, |
1467 | u8 index, u16 *config) | 2559 | u8 index, u16 *config) |
1468 | { | 2560 | { |
1469 | struct ath_hal_5416 *ahp = AH5416(ah); | 2561 | struct ath_hal_5416 *ahp = AH5416(ah); |
1470 | struct ar5416_eeprom *eep = &ahp->ah_eeprom; | 2562 | struct ar5416_eeprom_def *eep = &ahp->ah_eeprom.def; |
1471 | struct modal_eep_header *pModal = | 2563 | struct modal_eep_header *pModal = |
1472 | &(eep->modalHeader[IS_CHAN_2GHZ(chan)]); | 2564 | &(eep->modalHeader[IS_CHAN_2GHZ(chan)]); |
1473 | struct base_eep_header *pBase = &eep->baseEepHeader; | 2565 | struct base_eep_header *pBase = &eep->baseEepHeader; |
@@ -1492,13 +2584,54 @@ int ath9k_hw_get_eeprom_antenna_cfg(struct ath_hal *ah, | |||
1492 | return -EINVAL; | 2584 | return -EINVAL; |
1493 | } | 2585 | } |
1494 | 2586 | ||
1495 | u8 ath9k_hw_get_num_ant_config(struct ath_hal *ah, | 2587 | static int ath9k_hw_get_4k_eeprom_antenna_cfg(struct ath_hal *ah, |
2588 | struct ath9k_channel *chan, | ||
2589 | u8 index, u16 *config) | ||
2590 | { | ||
2591 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
2592 | struct ar5416_eeprom_4k *eep = &ahp->ah_eeprom.map4k; | ||
2593 | struct modal_eep_4k_header *pModal = &eep->modalHeader; | ||
2594 | |||
2595 | switch (index) { | ||
2596 | case 0: | ||
2597 | *config = pModal->antCtrlCommon & 0xFFFF; | ||
2598 | return 0; | ||
2599 | default: | ||
2600 | break; | ||
2601 | } | ||
2602 | |||
2603 | return -EINVAL; | ||
2604 | } | ||
2605 | |||
2606 | int (*ath9k_get_eeprom_antenna_cfg[])(struct ath_hal *, struct ath9k_channel *, | ||
2607 | u8, u16 *) = { | ||
2608 | ath9k_hw_get_def_eeprom_antenna_cfg, | ||
2609 | ath9k_hw_get_4k_eeprom_antenna_cfg | ||
2610 | }; | ||
2611 | |||
2612 | int ath9k_hw_get_eeprom_antenna_cfg(struct ath_hal *ah, | ||
2613 | struct ath9k_channel *chan, | ||
2614 | u8 index, u16 *config) | ||
2615 | { | ||
2616 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
2617 | |||
2618 | return ath9k_get_eeprom_antenna_cfg[ahp->ah_eep_map](ah, chan, | ||
2619 | index, config); | ||
2620 | } | ||
2621 | |||
2622 | u8 ath9k_hw_get_4k_num_ant_config(struct ath_hal *ah, | ||
2623 | enum ieee80211_band freq_band) | ||
2624 | { | ||
2625 | return 1; | ||
2626 | } | ||
2627 | |||
2628 | u8 ath9k_hw_get_def_num_ant_config(struct ath_hal *ah, | ||
1496 | enum ieee80211_band freq_band) | 2629 | enum ieee80211_band freq_band) |
1497 | { | 2630 | { |
1498 | struct ath_hal_5416 *ahp = AH5416(ah); | 2631 | struct ath_hal_5416 *ahp = AH5416(ah); |
1499 | struct ar5416_eeprom *eep = &ahp->ah_eeprom; | 2632 | struct ar5416_eeprom_def *eep = &ahp->ah_eeprom.def; |
1500 | struct modal_eep_header *pModal = | 2633 | struct modal_eep_header *pModal = |
1501 | &(eep->modalHeader[IEEE80211_BAND_5GHZ == freq_band]); | 2634 | &(eep->modalHeader[ATH9K_HAL_FREQ_BAND_2GHZ == freq_band]); |
1502 | struct base_eep_header *pBase = &eep->baseEepHeader; | 2635 | struct base_eep_header *pBase = &eep->baseEepHeader; |
1503 | u8 num_ant_config; | 2636 | u8 num_ant_config; |
1504 | 2637 | ||
@@ -1511,11 +2644,26 @@ u8 ath9k_hw_get_num_ant_config(struct ath_hal *ah, | |||
1511 | return num_ant_config; | 2644 | return num_ant_config; |
1512 | } | 2645 | } |
1513 | 2646 | ||
2647 | u8 (*ath9k_get_num_ant_config[])(struct ath_hal *, enum ieee80211_band) = { | ||
2648 | ath9k_hw_get_def_num_ant_config, | ||
2649 | ath9k_hw_get_4k_num_ant_config | ||
2650 | }; | ||
2651 | |||
2652 | u8 ath9k_hw_get_num_ant_config(struct ath_hal *ah, | ||
2653 | enum ieee80211_band freq_band) | ||
2654 | { | ||
2655 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
2656 | |||
2657 | return ath9k_get_num_ant_config[ahp->ah_eep_map](ah, freq_band); | ||
2658 | } | ||
2659 | |||
1514 | u16 ath9k_hw_eeprom_get_spur_chan(struct ath_hal *ah, u16 i, bool is2GHz) | 2660 | u16 ath9k_hw_eeprom_get_spur_chan(struct ath_hal *ah, u16 i, bool is2GHz) |
1515 | { | 2661 | { |
2662 | #define EEP_MAP4K_SPURCHAN \ | ||
2663 | (ahp->ah_eeprom.map4k.modalHeader.spurChans[i].spurChan) | ||
2664 | #define EEP_DEF_SPURCHAN \ | ||
2665 | (ahp->ah_eeprom.def.modalHeader[is2GHz].spurChans[i].spurChan) | ||
1516 | struct ath_hal_5416 *ahp = AH5416(ah); | 2666 | struct ath_hal_5416 *ahp = AH5416(ah); |
1517 | struct ar5416_eeprom *eep = | ||
1518 | (struct ar5416_eeprom *) &ahp->ah_eeprom; | ||
1519 | u16 spur_val = AR_NO_SPUR; | 2667 | u16 spur_val = AR_NO_SPUR; |
1520 | 2668 | ||
1521 | DPRINTF(ah->ah_sc, ATH_DBG_ANI, | 2669 | DPRINTF(ah->ah_sc, ATH_DBG_ANI, |
@@ -1531,19 +2679,66 @@ u16 ath9k_hw_eeprom_get_spur_chan(struct ath_hal *ah, u16 i, bool is2GHz) | |||
1531 | "Getting spur val from new loc. %d\n", spur_val); | 2679 | "Getting spur val from new loc. %d\n", spur_val); |
1532 | break; | 2680 | break; |
1533 | case SPUR_ENABLE_EEPROM: | 2681 | case SPUR_ENABLE_EEPROM: |
1534 | spur_val = eep->modalHeader[is2GHz].spurChans[i].spurChan; | 2682 | if (ahp->ah_eep_map == EEP_MAP_4KBITS) |
2683 | spur_val = EEP_MAP4K_SPURCHAN; | ||
2684 | else | ||
2685 | spur_val = EEP_DEF_SPURCHAN; | ||
1535 | break; | 2686 | break; |
1536 | 2687 | ||
1537 | } | 2688 | } |
1538 | 2689 | ||
1539 | return spur_val; | 2690 | return spur_val; |
2691 | #undef EEP_DEF_SPURCHAN | ||
2692 | #undef EEP_MAP4K_SPURCHAN | ||
1540 | } | 2693 | } |
1541 | 2694 | ||
1542 | u32 ath9k_hw_get_eeprom(struct ath_hal *ah, | 2695 | static u32 ath9k_hw_get_eeprom_4k(struct ath_hal *ah, |
1543 | enum eeprom_param param) | 2696 | enum eeprom_param param) |
2697 | { | ||
2698 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
2699 | struct ar5416_eeprom_4k *eep = &ahp->ah_eeprom.map4k; | ||
2700 | struct modal_eep_4k_header *pModal = &eep->modalHeader; | ||
2701 | struct base_eep_header_4k *pBase = &eep->baseEepHeader; | ||
2702 | |||
2703 | switch (param) { | ||
2704 | case EEP_NFTHRESH_2: | ||
2705 | return pModal[1].noiseFloorThreshCh[0]; | ||
2706 | case AR_EEPROM_MAC(0): | ||
2707 | return pBase->macAddr[0] << 8 | pBase->macAddr[1]; | ||
2708 | case AR_EEPROM_MAC(1): | ||
2709 | return pBase->macAddr[2] << 8 | pBase->macAddr[3]; | ||
2710 | case AR_EEPROM_MAC(2): | ||
2711 | return pBase->macAddr[4] << 8 | pBase->macAddr[5]; | ||
2712 | case EEP_REG_0: | ||
2713 | return pBase->regDmn[0]; | ||
2714 | case EEP_REG_1: | ||
2715 | return pBase->regDmn[1]; | ||
2716 | case EEP_OP_CAP: | ||
2717 | return pBase->deviceCap; | ||
2718 | case EEP_OP_MODE: | ||
2719 | return pBase->opCapFlags; | ||
2720 | case EEP_RF_SILENT: | ||
2721 | return pBase->rfSilent; | ||
2722 | case EEP_OB_2: | ||
2723 | return pModal->ob_01; | ||
2724 | case EEP_DB_2: | ||
2725 | return pModal->db1_01; | ||
2726 | case EEP_MINOR_REV: | ||
2727 | return pBase->version & AR5416_EEP_VER_MINOR_MASK; | ||
2728 | case EEP_TX_MASK: | ||
2729 | return pBase->txMask; | ||
2730 | case EEP_RX_MASK: | ||
2731 | return pBase->rxMask; | ||
2732 | default: | ||
2733 | return 0; | ||
2734 | } | ||
2735 | } | ||
2736 | |||
2737 | static u32 ath9k_hw_get_eeprom_def(struct ath_hal *ah, | ||
2738 | enum eeprom_param param) | ||
1544 | { | 2739 | { |
1545 | struct ath_hal_5416 *ahp = AH5416(ah); | 2740 | struct ath_hal_5416 *ahp = AH5416(ah); |
1546 | struct ar5416_eeprom *eep = &ahp->ah_eeprom; | 2741 | struct ar5416_eeprom_def *eep = &ahp->ah_eeprom.def; |
1547 | struct modal_eep_header *pModal = eep->modalHeader; | 2742 | struct modal_eep_header *pModal = eep->modalHeader; |
1548 | struct base_eep_header *pBase = &eep->baseEepHeader; | 2743 | struct base_eep_header *pBase = &eep->baseEepHeader; |
1549 | 2744 | ||
@@ -1592,13 +2787,32 @@ u32 ath9k_hw_get_eeprom(struct ath_hal *ah, | |||
1592 | } | 2787 | } |
1593 | } | 2788 | } |
1594 | 2789 | ||
2790 | u32 (*ath9k_get_eeprom[])(struct ath_hal *, enum eeprom_param) = { | ||
2791 | ath9k_hw_get_eeprom_def, | ||
2792 | ath9k_hw_get_eeprom_4k | ||
2793 | }; | ||
2794 | |||
2795 | u32 ath9k_hw_get_eeprom(struct ath_hal *ah, | ||
2796 | enum eeprom_param param) | ||
2797 | { | ||
2798 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
2799 | |||
2800 | return ath9k_get_eeprom[ahp->ah_eep_map](ah, param); | ||
2801 | } | ||
2802 | |||
1595 | int ath9k_hw_eeprom_attach(struct ath_hal *ah) | 2803 | int ath9k_hw_eeprom_attach(struct ath_hal *ah) |
1596 | { | 2804 | { |
1597 | int status; | 2805 | int status; |
2806 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
1598 | 2807 | ||
1599 | if (ath9k_hw_use_flash(ah)) | 2808 | if (ath9k_hw_use_flash(ah)) |
1600 | ath9k_hw_flash_map(ah); | 2809 | ath9k_hw_flash_map(ah); |
1601 | 2810 | ||
2811 | if (AR_SREV_9285(ah)) | ||
2812 | ahp->ah_eep_map = EEP_MAP_4KBITS; | ||
2813 | else | ||
2814 | ahp->ah_eep_map = EEP_MAP_DEFAULT; | ||
2815 | |||
1602 | if (!ath9k_hw_fill_eeprom(ah)) | 2816 | if (!ath9k_hw_fill_eeprom(ah)) |
1603 | return -EIO; | 2817 | return -EIO; |
1604 | 2818 | ||
diff --git a/drivers/net/wireless/ath9k/hw.c b/drivers/net/wireless/ath9k/hw.c index 668865dce533..34474edefc97 100644 --- a/drivers/net/wireless/ath9k/hw.c +++ b/drivers/net/wireless/ath9k/hw.c | |||
@@ -37,7 +37,7 @@ static bool ath9k_hw_set_reset_reg(struct ath_hal *ah, u32 type); | |||
37 | static void ath9k_hw_set_regs(struct ath_hal *ah, struct ath9k_channel *chan, | 37 | static void ath9k_hw_set_regs(struct ath_hal *ah, struct ath9k_channel *chan, |
38 | enum ath9k_ht_macmode macmode); | 38 | enum ath9k_ht_macmode macmode); |
39 | static u32 ath9k_hw_ini_fixup(struct ath_hal *ah, | 39 | static u32 ath9k_hw_ini_fixup(struct ath_hal *ah, |
40 | struct ar5416_eeprom *pEepData, | 40 | struct ar5416_eeprom_def *pEepData, |
41 | u32 reg, u32 value); | 41 | u32 reg, u32 value); |
42 | static void ath9k_hw_9280_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *chan); | 42 | static void ath9k_hw_9280_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *chan); |
43 | static void ath9k_hw_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *chan); | 43 | static void ath9k_hw_spur_mitigate(struct ath_hal *ah, struct ath9k_channel *chan); |
@@ -392,6 +392,8 @@ static const char *ath9k_hw_devname(u16 devid) | |||
392 | case AR9280_DEVID_PCI: | 392 | case AR9280_DEVID_PCI: |
393 | case AR9280_DEVID_PCIE: | 393 | case AR9280_DEVID_PCIE: |
394 | return "Atheros 9280"; | 394 | return "Atheros 9280"; |
395 | case AR9285_DEVID_PCIE: | ||
396 | return "Atheros 9285"; | ||
395 | } | 397 | } |
396 | 398 | ||
397 | return NULL; | 399 | return NULL; |
@@ -640,10 +642,7 @@ static struct ath_hal *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc, | |||
640 | struct ath_hal_5416 *ahp; | 642 | struct ath_hal_5416 *ahp; |
641 | struct ath_hal *ah; | 643 | struct ath_hal *ah; |
642 | int ecode; | 644 | int ecode; |
643 | #ifndef CONFIG_SLOW_ANT_DIV | 645 | u32 i, j; |
644 | u32 i; | ||
645 | u32 j; | ||
646 | #endif | ||
647 | 646 | ||
648 | ahp = ath9k_hw_newstate(devid, sc, mem, status); | 647 | ahp = ath9k_hw_newstate(devid, sc, mem, status); |
649 | if (ahp == NULL) | 648 | if (ahp == NULL) |
@@ -685,7 +684,7 @@ static struct ath_hal *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc, | |||
685 | if ((ah->ah_macVersion != AR_SREV_VERSION_5416_PCI) && | 684 | if ((ah->ah_macVersion != AR_SREV_VERSION_5416_PCI) && |
686 | (ah->ah_macVersion != AR_SREV_VERSION_5416_PCIE) && | 685 | (ah->ah_macVersion != AR_SREV_VERSION_5416_PCIE) && |
687 | (ah->ah_macVersion != AR_SREV_VERSION_9160) && | 686 | (ah->ah_macVersion != AR_SREV_VERSION_9160) && |
688 | (!AR_SREV_9100(ah)) && (!AR_SREV_9280(ah))) { | 687 | (!AR_SREV_9100(ah)) && (!AR_SREV_9280(ah)) && (!AR_SREV_9285(ah))) { |
689 | DPRINTF(ah->ah_sc, ATH_DBG_RESET, | 688 | DPRINTF(ah->ah_sc, ATH_DBG_RESET, |
690 | "Mac Chip Rev 0x%02x.%x is not supported by " | 689 | "Mac Chip Rev 0x%02x.%x is not supported by " |
691 | "this driver\n", ah->ah_macVersion, ah->ah_macRev); | 690 | "this driver\n", ah->ah_macVersion, ah->ah_macRev); |
@@ -736,7 +735,38 @@ static struct ath_hal *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc, | |||
736 | "This Mac Chip Rev 0x%02x.%x is \n", | 735 | "This Mac Chip Rev 0x%02x.%x is \n", |
737 | ah->ah_macVersion, ah->ah_macRev); | 736 | ah->ah_macVersion, ah->ah_macRev); |
738 | 737 | ||
739 | if (AR_SREV_9280_20_OR_LATER(ah)) { | 738 | if (AR_SREV_9285_12_OR_LATER(ah)) { |
739 | INIT_INI_ARRAY(&ahp->ah_iniModes, ar9285Modes_9285_1_2, | ||
740 | ARRAY_SIZE(ar9285Modes_9285_1_2), 6); | ||
741 | INIT_INI_ARRAY(&ahp->ah_iniCommon, ar9285Common_9285_1_2, | ||
742 | ARRAY_SIZE(ar9285Common_9285_1_2), 2); | ||
743 | |||
744 | if (ah->ah_config.pcie_clock_req) { | ||
745 | INIT_INI_ARRAY(&ahp->ah_iniPcieSerdes, | ||
746 | ar9285PciePhy_clkreq_off_L1_9285_1_2, | ||
747 | ARRAY_SIZE(ar9285PciePhy_clkreq_off_L1_9285_1_2), 2); | ||
748 | } else { | ||
749 | INIT_INI_ARRAY(&ahp->ah_iniPcieSerdes, | ||
750 | ar9285PciePhy_clkreq_always_on_L1_9285_1_2, | ||
751 | ARRAY_SIZE(ar9285PciePhy_clkreq_always_on_L1_9285_1_2), | ||
752 | 2); | ||
753 | } | ||
754 | } else if (AR_SREV_9285_10_OR_LATER(ah)) { | ||
755 | INIT_INI_ARRAY(&ahp->ah_iniModes, ar9285Modes_9285, | ||
756 | ARRAY_SIZE(ar9285Modes_9285), 6); | ||
757 | INIT_INI_ARRAY(&ahp->ah_iniCommon, ar9285Common_9285, | ||
758 | ARRAY_SIZE(ar9285Common_9285), 2); | ||
759 | |||
760 | if (ah->ah_config.pcie_clock_req) { | ||
761 | INIT_INI_ARRAY(&ahp->ah_iniPcieSerdes, | ||
762 | ar9285PciePhy_clkreq_off_L1_9285, | ||
763 | ARRAY_SIZE(ar9285PciePhy_clkreq_off_L1_9285), 2); | ||
764 | } else { | ||
765 | INIT_INI_ARRAY(&ahp->ah_iniPcieSerdes, | ||
766 | ar9285PciePhy_clkreq_always_on_L1_9285, | ||
767 | ARRAY_SIZE(ar9285PciePhy_clkreq_always_on_L1_9285), 2); | ||
768 | } | ||
769 | } else if (AR_SREV_9280_20_OR_LATER(ah)) { | ||
740 | INIT_INI_ARRAY(&ahp->ah_iniModes, ar9280Modes_9280_2, | 770 | INIT_INI_ARRAY(&ahp->ah_iniModes, ar9280Modes_9280_2, |
741 | ARRAY_SIZE(ar9280Modes_9280_2), 6); | 771 | ARRAY_SIZE(ar9280Modes_9280_2), 6); |
742 | INIT_INI_ARRAY(&ahp->ah_iniCommon, ar9280Common_9280_2, | 772 | INIT_INI_ARRAY(&ahp->ah_iniCommon, ar9280Common_9280_2, |
@@ -846,14 +876,13 @@ static struct ath_hal *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc, | |||
846 | goto bad; | 876 | goto bad; |
847 | 877 | ||
848 | /* rxgain table */ | 878 | /* rxgain table */ |
849 | if (AR_SREV_9280_20_OR_LATER(ah)) | 879 | if (AR_SREV_9280_20(ah)) |
850 | ath9k_hw_init_rxgain_ini(ah); | 880 | ath9k_hw_init_rxgain_ini(ah); |
851 | 881 | ||
852 | /* txgain table */ | 882 | /* txgain table */ |
853 | if (AR_SREV_9280_20_OR_LATER(ah)) | 883 | if (AR_SREV_9280_20(ah)) |
854 | ath9k_hw_init_txgain_ini(ah); | 884 | ath9k_hw_init_txgain_ini(ah); |
855 | 885 | ||
856 | #ifndef CONFIG_SLOW_ANT_DIV | ||
857 | if (ah->ah_devid == AR9280_DEVID_PCI) { | 886 | if (ah->ah_devid == AR9280_DEVID_PCI) { |
858 | for (i = 0; i < ahp->ah_iniModes.ia_rows; i++) { | 887 | for (i = 0; i < ahp->ah_iniModes.ia_rows; i++) { |
859 | u32 reg = INI_RA(&ahp->ah_iniModes, i, 0); | 888 | u32 reg = INI_RA(&ahp->ah_iniModes, i, 0); |
@@ -862,12 +891,13 @@ static struct ath_hal *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc, | |||
862 | u32 val = INI_RA(&ahp->ah_iniModes, i, j); | 891 | u32 val = INI_RA(&ahp->ah_iniModes, i, j); |
863 | 892 | ||
864 | INI_RA(&ahp->ah_iniModes, i, j) = | 893 | INI_RA(&ahp->ah_iniModes, i, j) = |
865 | ath9k_hw_ini_fixup(ah, &ahp->ah_eeprom, | 894 | ath9k_hw_ini_fixup(ah, |
895 | &ahp->ah_eeprom.def, | ||
866 | reg, val); | 896 | reg, val); |
867 | } | 897 | } |
868 | } | 898 | } |
869 | } | 899 | } |
870 | #endif | 900 | |
871 | if (!ath9k_hw_fill_cap_info(ah)) { | 901 | if (!ath9k_hw_fill_cap_info(ah)) { |
872 | DPRINTF(ah->ah_sc, ATH_DBG_RESET, | 902 | DPRINTF(ah->ah_sc, ATH_DBG_RESET, |
873 | "failed ath9k_hw_fill_cap_info\n"); | 903 | "failed ath9k_hw_fill_cap_info\n"); |
@@ -1020,8 +1050,6 @@ static void ath9k_hw_init_chain_masks(struct ath_hal *ah) | |||
1020 | } | 1050 | } |
1021 | case 0x1: | 1051 | case 0x1: |
1022 | case 0x2: | 1052 | case 0x2: |
1023 | if (!AR_SREV_9280(ah)) | ||
1024 | break; | ||
1025 | case 0x7: | 1053 | case 0x7: |
1026 | REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx_chainmask); | 1054 | REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx_chainmask); |
1027 | REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx_chainmask); | 1055 | REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx_chainmask); |
@@ -1166,12 +1194,10 @@ struct ath_hal *ath9k_hw_attach(u16 devid, struct ath_softc *sc, | |||
1166 | case AR9160_DEVID_PCI: | 1194 | case AR9160_DEVID_PCI: |
1167 | case AR9280_DEVID_PCI: | 1195 | case AR9280_DEVID_PCI: |
1168 | case AR9280_DEVID_PCIE: | 1196 | case AR9280_DEVID_PCIE: |
1197 | case AR9285_DEVID_PCIE: | ||
1169 | ah = ath9k_hw_do_attach(devid, sc, mem, error); | 1198 | ah = ath9k_hw_do_attach(devid, sc, mem, error); |
1170 | break; | 1199 | break; |
1171 | default: | 1200 | default: |
1172 | DPRINTF(ah->ah_sc, ATH_DBG_ANY, | ||
1173 | "devid=0x%x not supported.\n", devid); | ||
1174 | ah = NULL; | ||
1175 | *error = -ENXIO; | 1201 | *error = -ENXIO; |
1176 | break; | 1202 | break; |
1177 | } | 1203 | } |
@@ -1186,6 +1212,14 @@ struct ath_hal *ath9k_hw_attach(u16 devid, struct ath_softc *sc, | |||
1186 | static void ath9k_hw_override_ini(struct ath_hal *ah, | 1212 | static void ath9k_hw_override_ini(struct ath_hal *ah, |
1187 | struct ath9k_channel *chan) | 1213 | struct ath9k_channel *chan) |
1188 | { | 1214 | { |
1215 | /* | ||
1216 | * Set the RX_ABORT and RX_DIS and clear if off only after | ||
1217 | * RXE is set for MAC. This prevents frames with corrupted | ||
1218 | * descriptor status. | ||
1219 | */ | ||
1220 | REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); | ||
1221 | |||
1222 | |||
1189 | if (!AR_SREV_5416_V20_OR_LATER(ah) || | 1223 | if (!AR_SREV_5416_V20_OR_LATER(ah) || |
1190 | AR_SREV_9280_10_OR_LATER(ah)) | 1224 | AR_SREV_9280_10_OR_LATER(ah)) |
1191 | return; | 1225 | return; |
@@ -1193,8 +1227,8 @@ static void ath9k_hw_override_ini(struct ath_hal *ah, | |||
1193 | REG_WRITE(ah, 0x9800 + (651 << 2), 0x11); | 1227 | REG_WRITE(ah, 0x9800 + (651 << 2), 0x11); |
1194 | } | 1228 | } |
1195 | 1229 | ||
1196 | static u32 ath9k_hw_ini_fixup(struct ath_hal *ah, | 1230 | static u32 ath9k_hw_def_ini_fixup(struct ath_hal *ah, |
1197 | struct ar5416_eeprom *pEepData, | 1231 | struct ar5416_eeprom_def *pEepData, |
1198 | u32 reg, u32 value) | 1232 | u32 reg, u32 value) |
1199 | { | 1233 | { |
1200 | struct base_eep_header *pBase = &(pEepData->baseEepHeader); | 1234 | struct base_eep_header *pBase = &(pEepData->baseEepHeader); |
@@ -1227,6 +1261,18 @@ static u32 ath9k_hw_ini_fixup(struct ath_hal *ah, | |||
1227 | return value; | 1261 | return value; |
1228 | } | 1262 | } |
1229 | 1263 | ||
1264 | static u32 ath9k_hw_ini_fixup(struct ath_hal *ah, | ||
1265 | struct ar5416_eeprom_def *pEepData, | ||
1266 | u32 reg, u32 value) | ||
1267 | { | ||
1268 | struct ath_hal_5416 *ahp = AH5416(ah); | ||
1269 | |||
1270 | if (ahp->ah_eep_map == EEP_MAP_4KBITS) | ||
1271 | return value; | ||
1272 | else | ||
1273 | return ath9k_hw_def_ini_fixup(ah, pEepData, reg, value); | ||
1274 | } | ||
1275 | |||
1230 | static int ath9k_hw_process_ini(struct ath_hal *ah, | 1276 | static int ath9k_hw_process_ini(struct ath_hal *ah, |
1231 | struct ath9k_channel *chan, | 1277 | struct ath9k_channel *chan, |
1232 | enum ath9k_ht_macmode macmode) | 1278 | enum ath9k_ht_macmode macmode) |
@@ -1294,11 +1340,6 @@ static int ath9k_hw_process_ini(struct ath_hal *ah, | |||
1294 | u32 reg = INI_RA(&ahp->ah_iniModes, i, 0); | 1340 | u32 reg = INI_RA(&ahp->ah_iniModes, i, 0); |
1295 | u32 val = INI_RA(&ahp->ah_iniModes, i, modesIndex); | 1341 | u32 val = INI_RA(&ahp->ah_iniModes, i, modesIndex); |
1296 | 1342 | ||
1297 | #ifdef CONFIG_SLOW_ANT_DIV | ||
1298 | if (ah->ah_devid == AR9280_DEVID_PCI) | ||
1299 | val = ath9k_hw_ini_fixup(ah, &ahp->ah_eeprom, reg, val); | ||
1300 | #endif | ||
1301 | |||
1302 | REG_WRITE(ah, reg, val); | 1343 | REG_WRITE(ah, reg, val); |
1303 | 1344 | ||
1304 | if (reg >= 0x7800 && reg < 0x78a0 | 1345 | if (reg >= 0x7800 && reg < 0x78a0 |
@@ -1309,10 +1350,10 @@ static int ath9k_hw_process_ini(struct ath_hal *ah, | |||
1309 | DO_DELAY(regWrites); | 1350 | DO_DELAY(regWrites); |
1310 | } | 1351 | } |
1311 | 1352 | ||
1312 | if (AR_SREV_9280_20_OR_LATER(ah)) | 1353 | if (AR_SREV_9280(ah)) |
1313 | REG_WRITE_ARRAY(&ahp->ah_iniModesRxGain, modesIndex, regWrites); | 1354 | REG_WRITE_ARRAY(&ahp->ah_iniModesRxGain, modesIndex, regWrites); |
1314 | 1355 | ||
1315 | if (AR_SREV_9280_20_OR_LATER(ah)) | 1356 | if (AR_SREV_9280(ah)) |
1316 | REG_WRITE_ARRAY(&ahp->ah_iniModesTxGain, modesIndex, regWrites); | 1357 | REG_WRITE_ARRAY(&ahp->ah_iniModesTxGain, modesIndex, regWrites); |
1317 | 1358 | ||
1318 | for (i = 0; i < ahp->ah_iniCommon.ia_rows; i++) { | 1359 | for (i = 0; i < ahp->ah_iniCommon.ia_rows; i++) { |
@@ -1585,10 +1626,15 @@ static void ath9k_hw_set_regs(struct ath_hal *ah, struct ath9k_channel *chan, | |||
1585 | enum ath9k_ht_macmode macmode) | 1626 | enum ath9k_ht_macmode macmode) |
1586 | { | 1627 | { |
1587 | u32 phymode; | 1628 | u32 phymode; |
1629 | u32 enableDacFifo = 0; | ||
1588 | struct ath_hal_5416 *ahp = AH5416(ah); | 1630 | struct ath_hal_5416 *ahp = AH5416(ah); |
1589 | 1631 | ||
1632 | if (AR_SREV_9285_10_OR_LATER(ah)) | ||
1633 | enableDacFifo = (REG_READ(ah, AR_PHY_TURBO) & | ||
1634 | AR_PHY_FC_ENABLE_DAC_FIFO); | ||
1635 | |||
1590 | phymode = AR_PHY_FC_HT_EN | AR_PHY_FC_SHORT_GI_40 | 1636 | phymode = AR_PHY_FC_HT_EN | AR_PHY_FC_SHORT_GI_40 |
1591 | | AR_PHY_FC_SINGLE_HT_LTF1 | AR_PHY_FC_WALSH; | 1637 | | AR_PHY_FC_SINGLE_HT_LTF1 | AR_PHY_FC_WALSH | enableDacFifo; |
1592 | 1638 | ||
1593 | if (IS_CHAN_HT40(chan)) { | 1639 | if (IS_CHAN_HT40(chan)) { |
1594 | phymode |= AR_PHY_FC_DYN2040_EN; | 1640 | phymode |= AR_PHY_FC_DYN2040_EN; |
@@ -2771,11 +2817,14 @@ void ath9k_hw_configpcipowersave(struct ath_hal *ah, int restore) | |||
2771 | if (ah->ah_config.pcie_waen) { | 2817 | if (ah->ah_config.pcie_waen) { |
2772 | REG_WRITE(ah, AR_WA, ah->ah_config.pcie_waen); | 2818 | REG_WRITE(ah, AR_WA, ah->ah_config.pcie_waen); |
2773 | } else { | 2819 | } else { |
2774 | if (AR_SREV_9280(ah)) | 2820 | if (AR_SREV_9285(ah)) |
2775 | REG_WRITE(ah, AR_WA, 0x0040073f); | 2821 | REG_WRITE(ah, AR_WA, AR9285_WA_DEFAULT); |
2822 | else if (AR_SREV_9280(ah)) | ||
2823 | REG_WRITE(ah, AR_WA, AR9280_WA_DEFAULT); | ||
2776 | else | 2824 | else |
2777 | REG_WRITE(ah, AR_WA, 0x0000073f); | 2825 | REG_WRITE(ah, AR_WA, AR_WA_DEFAULT); |
2778 | } | 2826 | } |
2827 | |||
2779 | } | 2828 | } |
2780 | 2829 | ||
2781 | /**********************/ | 2830 | /**********************/ |
@@ -3326,7 +3375,7 @@ bool ath9k_hw_fill_cap_info(struct ath_hal *ah) | |||
3326 | else | 3375 | else |
3327 | pCap->hw_caps |= ATH9K_HW_CAP_AUTOSLEEP; | 3376 | pCap->hw_caps |= ATH9K_HW_CAP_AUTOSLEEP; |
3328 | 3377 | ||
3329 | if (AR_SREV_9280(ah)) | 3378 | if (AR_SREV_9280(ah) || AR_SREV_9285(ah)) |
3330 | pCap->hw_caps &= ~ATH9K_HW_CAP_4KB_SPLITTRANS; | 3379 | pCap->hw_caps &= ~ATH9K_HW_CAP_4KB_SPLITTRANS; |
3331 | else | 3380 | else |
3332 | pCap->hw_caps |= ATH9K_HW_CAP_4KB_SPLITTRANS; | 3381 | pCap->hw_caps |= ATH9K_HW_CAP_4KB_SPLITTRANS; |
@@ -3346,9 +3395,9 @@ bool ath9k_hw_fill_cap_info(struct ath_hal *ah) | |||
3346 | pCap->reg_cap |= AR_EEPROM_EEREGCAP_EN_FCC_MIDBAND; | 3395 | pCap->reg_cap |= AR_EEPROM_EEREGCAP_EN_FCC_MIDBAND; |
3347 | 3396 | ||
3348 | pCap->num_antcfg_5ghz = | 3397 | pCap->num_antcfg_5ghz = |
3349 | ath9k_hw_get_num_ant_config(ah, IEEE80211_BAND_5GHZ); | 3398 | ath9k_hw_get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_5GHZ); |
3350 | pCap->num_antcfg_2ghz = | 3399 | pCap->num_antcfg_2ghz = |
3351 | ath9k_hw_get_num_ant_config(ah, IEEE80211_BAND_2GHZ); | 3400 | ath9k_hw_get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_2GHZ); |
3352 | 3401 | ||
3353 | return true; | 3402 | return true; |
3354 | } | 3403 | } |
diff --git a/drivers/net/wireless/ath9k/hw.h b/drivers/net/wireless/ath9k/hw.h index 02256c3ec076..91d8f594af81 100644 --- a/drivers/net/wireless/ath9k/hw.h +++ b/drivers/net/wireless/ath9k/hw.h | |||
@@ -448,6 +448,17 @@ struct ar5416Stats { | |||
448 | #define AR5416_EEP_TXGAIN_ORIGINAL 0 | 448 | #define AR5416_EEP_TXGAIN_ORIGINAL 0 |
449 | #define AR5416_EEP_TXGAIN_HIGH_POWER 1 | 449 | #define AR5416_EEP_TXGAIN_HIGH_POWER 1 |
450 | 450 | ||
451 | #define AR5416_EEP4K_START_LOC 64 | ||
452 | #define AR5416_EEP4K_NUM_2G_CAL_PIERS 3 | ||
453 | #define AR5416_EEP4K_NUM_2G_CCK_TARGET_POWERS 3 | ||
454 | #define AR5416_EEP4K_NUM_2G_20_TARGET_POWERS 3 | ||
455 | #define AR5416_EEP4K_NUM_2G_40_TARGET_POWERS 3 | ||
456 | #define AR5416_EEP4K_NUM_CTLS 12 | ||
457 | #define AR5416_EEP4K_NUM_BAND_EDGES 4 | ||
458 | #define AR5416_EEP4K_NUM_PD_GAINS 2 | ||
459 | #define AR5416_EEP4K_PD_GAINS_IN_MASK 4 | ||
460 | #define AR5416_EEP4K_PD_GAIN_ICEPTS 5 | ||
461 | #define AR5416_EEP4K_MAX_CHAINS 1 | ||
451 | 462 | ||
452 | enum eeprom_param { | 463 | enum eeprom_param { |
453 | EEP_NFTHRESH_5, | 464 | EEP_NFTHRESH_5, |
@@ -484,6 +495,11 @@ enum ar5416_rates { | |||
484 | Ar5416RateSize | 495 | Ar5416RateSize |
485 | }; | 496 | }; |
486 | 497 | ||
498 | enum ath9k_hal_freq_band { | ||
499 | ATH9K_HAL_FREQ_BAND_5GHZ = 0, | ||
500 | ATH9K_HAL_FREQ_BAND_2GHZ = 1 | ||
501 | }; | ||
502 | |||
487 | struct base_eep_header { | 503 | struct base_eep_header { |
488 | u16 length; | 504 | u16 length; |
489 | u16 checksum; | 505 | u16 checksum; |
@@ -507,6 +523,25 @@ struct base_eep_header { | |||
507 | u8 futureBase_3[25]; | 523 | u8 futureBase_3[25]; |
508 | } __packed; | 524 | } __packed; |
509 | 525 | ||
526 | struct base_eep_header_4k { | ||
527 | u16 length; | ||
528 | u16 checksum; | ||
529 | u16 version; | ||
530 | u8 opCapFlags; | ||
531 | u8 eepMisc; | ||
532 | u16 regDmn[2]; | ||
533 | u8 macAddr[6]; | ||
534 | u8 rxMask; | ||
535 | u8 txMask; | ||
536 | u16 rfSilent; | ||
537 | u16 blueToothOptions; | ||
538 | u16 deviceCap; | ||
539 | u32 binBuildNumber; | ||
540 | u8 deviceType; | ||
541 | u8 futureBase[1]; | ||
542 | } __packed; | ||
543 | |||
544 | |||
510 | struct spur_chan { | 545 | struct spur_chan { |
511 | u16 spurChan; | 546 | u16 spurChan; |
512 | u8 spurRangeLow; | 547 | u8 spurRangeLow; |
@@ -559,11 +594,58 @@ struct modal_eep_header { | |||
559 | struct spur_chan spurChans[AR5416_EEPROM_MODAL_SPURS]; | 594 | struct spur_chan spurChans[AR5416_EEPROM_MODAL_SPURS]; |
560 | } __packed; | 595 | } __packed; |
561 | 596 | ||
597 | struct modal_eep_4k_header { | ||
598 | u32 antCtrlChain[AR5416_EEP4K_MAX_CHAINS]; | ||
599 | u32 antCtrlCommon; | ||
600 | u8 antennaGainCh[AR5416_EEP4K_MAX_CHAINS]; | ||
601 | u8 switchSettling; | ||
602 | u8 txRxAttenCh[AR5416_EEP4K_MAX_CHAINS]; | ||
603 | u8 rxTxMarginCh[AR5416_EEP4K_MAX_CHAINS]; | ||
604 | u8 adcDesiredSize; | ||
605 | u8 pgaDesiredSize; | ||
606 | u8 xlnaGainCh[AR5416_EEP4K_MAX_CHAINS]; | ||
607 | u8 txEndToXpaOff; | ||
608 | u8 txEndToRxOn; | ||
609 | u8 txFrameToXpaOn; | ||
610 | u8 thresh62; | ||
611 | u8 noiseFloorThreshCh[AR5416_EEP4K_MAX_CHAINS]; | ||
612 | u8 xpdGain; | ||
613 | u8 xpd; | ||
614 | u8 iqCalICh[AR5416_EEP4K_MAX_CHAINS]; | ||
615 | u8 iqCalQCh[AR5416_EEP4K_MAX_CHAINS]; | ||
616 | u8 pdGainOverlap; | ||
617 | u8 ob_01; | ||
618 | u8 db1_01; | ||
619 | u8 xpaBiasLvl; | ||
620 | u8 txFrameToDataStart; | ||
621 | u8 txFrameToPaOn; | ||
622 | u8 ht40PowerIncForPdadc; | ||
623 | u8 bswAtten[AR5416_EEP4K_MAX_CHAINS]; | ||
624 | u8 bswMargin[AR5416_EEP4K_MAX_CHAINS]; | ||
625 | u8 swSettleHt40; | ||
626 | u8 xatten2Db[AR5416_EEP4K_MAX_CHAINS]; | ||
627 | u8 xatten2Margin[AR5416_EEP4K_MAX_CHAINS]; | ||
628 | u8 db2_01; | ||
629 | u8 version; | ||
630 | u16 ob_234; | ||
631 | u16 db1_234; | ||
632 | u16 db2_234; | ||
633 | u8 futureModal[4]; | ||
634 | |||
635 | struct spur_chan spurChans[AR5416_EEPROM_MODAL_SPURS]; | ||
636 | } __packed; | ||
637 | |||
638 | |||
562 | struct cal_data_per_freq { | 639 | struct cal_data_per_freq { |
563 | u8 pwrPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS]; | 640 | u8 pwrPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS]; |
564 | u8 vpdPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS]; | 641 | u8 vpdPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS]; |
565 | } __packed; | 642 | } __packed; |
566 | 643 | ||
644 | struct cal_data_per_freq_4k { | ||
645 | u8 pwrPdg[AR5416_EEP4K_NUM_PD_GAINS][AR5416_EEP4K_PD_GAIN_ICEPTS]; | ||
646 | u8 vpdPdg[AR5416_EEP4K_NUM_PD_GAINS][AR5416_EEP4K_PD_GAIN_ICEPTS]; | ||
647 | } __packed; | ||
648 | |||
567 | struct cal_target_power_leg { | 649 | struct cal_target_power_leg { |
568 | u8 bChannel; | 650 | u8 bChannel; |
569 | u8 tPow2x[4]; | 651 | u8 tPow2x[4]; |
@@ -574,6 +656,7 @@ struct cal_target_power_ht { | |||
574 | u8 tPow2x[8]; | 656 | u8 tPow2x[8]; |
575 | } __packed; | 657 | } __packed; |
576 | 658 | ||
659 | |||
577 | #ifdef __BIG_ENDIAN_BITFIELD | 660 | #ifdef __BIG_ENDIAN_BITFIELD |
578 | struct cal_ctl_edges { | 661 | struct cal_ctl_edges { |
579 | u8 bChannel; | 662 | u8 bChannel; |
@@ -588,10 +671,15 @@ struct cal_ctl_edges { | |||
588 | 671 | ||
589 | struct cal_ctl_data { | 672 | struct cal_ctl_data { |
590 | struct cal_ctl_edges | 673 | struct cal_ctl_edges |
591 | ctlEdges[AR5416_MAX_CHAINS][AR5416_NUM_BAND_EDGES]; | 674 | ctlEdges[AR5416_MAX_CHAINS][AR5416_NUM_BAND_EDGES]; |
675 | } __packed; | ||
676 | |||
677 | struct cal_ctl_data_4k { | ||
678 | struct cal_ctl_edges | ||
679 | ctlEdges[AR5416_EEP4K_MAX_CHAINS][AR5416_EEP4K_NUM_BAND_EDGES]; | ||
592 | } __packed; | 680 | } __packed; |
593 | 681 | ||
594 | struct ar5416_eeprom { | 682 | struct ar5416_eeprom_def { |
595 | struct base_eep_header baseEepHeader; | 683 | struct base_eep_header baseEepHeader; |
596 | u8 custData[64]; | 684 | u8 custData[64]; |
597 | struct modal_eep_header modalHeader[2]; | 685 | struct modal_eep_header modalHeader[2]; |
@@ -620,6 +708,26 @@ struct ar5416_eeprom { | |||
620 | u8 padding; | 708 | u8 padding; |
621 | } __packed; | 709 | } __packed; |
622 | 710 | ||
711 | struct ar5416_eeprom_4k { | ||
712 | struct base_eep_header_4k baseEepHeader; | ||
713 | u8 custData[20]; | ||
714 | struct modal_eep_4k_header modalHeader; | ||
715 | u8 calFreqPier2G[AR5416_EEP4K_NUM_2G_CAL_PIERS]; | ||
716 | struct cal_data_per_freq_4k | ||
717 | calPierData2G[AR5416_EEP4K_MAX_CHAINS][AR5416_EEP4K_NUM_2G_CAL_PIERS]; | ||
718 | struct cal_target_power_leg | ||
719 | calTargetPowerCck[AR5416_EEP4K_NUM_2G_CCK_TARGET_POWERS]; | ||
720 | struct cal_target_power_leg | ||
721 | calTargetPower2G[AR5416_EEP4K_NUM_2G_20_TARGET_POWERS]; | ||
722 | struct cal_target_power_ht | ||
723 | calTargetPower2GHT20[AR5416_EEP4K_NUM_2G_20_TARGET_POWERS]; | ||
724 | struct cal_target_power_ht | ||
725 | calTargetPower2GHT40[AR5416_EEP4K_NUM_2G_40_TARGET_POWERS]; | ||
726 | u8 ctlIndex[AR5416_EEP4K_NUM_CTLS]; | ||
727 | struct cal_ctl_data_4k ctlData[AR5416_EEP4K_NUM_CTLS]; | ||
728 | u8 padding; | ||
729 | } __packed; | ||
730 | |||
623 | struct ar5416IniArray { | 731 | struct ar5416IniArray { |
624 | u32 *ia_array; | 732 | u32 *ia_array; |
625 | u32 ia_rows; | 733 | u32 ia_rows; |
@@ -687,9 +795,22 @@ struct hal_cal_list { | |||
687 | struct hal_cal_list *calNext; | 795 | struct hal_cal_list *calNext; |
688 | }; | 796 | }; |
689 | 797 | ||
798 | /* | ||
799 | * Enum to indentify the eeprom mappings | ||
800 | */ | ||
801 | enum hal_eep_map { | ||
802 | EEP_MAP_DEFAULT = 0x0, | ||
803 | EEP_MAP_4KBITS, | ||
804 | EEP_MAP_MAX | ||
805 | }; | ||
806 | |||
807 | |||
690 | struct ath_hal_5416 { | 808 | struct ath_hal_5416 { |
691 | struct ath_hal ah; | 809 | struct ath_hal ah; |
692 | struct ar5416_eeprom ah_eeprom; | 810 | union { |
811 | struct ar5416_eeprom_def def; | ||
812 | struct ar5416_eeprom_4k map4k; | ||
813 | } ah_eeprom; | ||
693 | struct ar5416Stats ah_stats; | 814 | struct ar5416Stats ah_stats; |
694 | struct ath9k_tx_queue_info ah_txq[ATH9K_NUM_TX_QUEUES]; | 815 | struct ath9k_tx_queue_info ah_txq[ATH9K_NUM_TX_QUEUES]; |
695 | void __iomem *ah_cal_mem; | 816 | void __iomem *ah_cal_mem; |
@@ -813,6 +934,8 @@ struct ath_hal_5416 { | |||
813 | struct ar5416IniArray ah_iniModesAdditional; | 934 | struct ar5416IniArray ah_iniModesAdditional; |
814 | struct ar5416IniArray ah_iniModesRxGain; | 935 | struct ar5416IniArray ah_iniModesRxGain; |
815 | struct ar5416IniArray ah_iniModesTxGain; | 936 | struct ar5416IniArray ah_iniModesTxGain; |
937 | /* To indicate EEPROM mapping used */ | ||
938 | enum hal_eep_map ah_eep_map; | ||
816 | }; | 939 | }; |
817 | #define AH5416(_ah) ((struct ath_hal_5416 *)(_ah)) | 940 | #define AH5416(_ah) ((struct ath_hal_5416 *)(_ah)) |
818 | 941 | ||
@@ -854,13 +977,20 @@ struct ath_hal_5416 { | |||
854 | (AR_SREV_9100(ah)) ? 0x1fff1000 : 0x503f1200 | 977 | (AR_SREV_9100(ah)) ? 0x1fff1000 : 0x503f1200 |
855 | #define AR5416_EEPROM_MAX 0xae0 | 978 | #define AR5416_EEPROM_MAX 0xae0 |
856 | #define ar5416_get_eep_ver(_ahp) \ | 979 | #define ar5416_get_eep_ver(_ahp) \ |
857 | (((_ahp)->ah_eeprom.baseEepHeader.version >> 12) & 0xF) | 980 | (((_ahp)->ah_eeprom.def.baseEepHeader.version >> 12) & 0xF) |
858 | #define ar5416_get_eep_rev(_ahp) \ | 981 | #define ar5416_get_eep_rev(_ahp) \ |
859 | (((_ahp)->ah_eeprom.baseEepHeader.version) & 0xFFF) | 982 | (((_ahp)->ah_eeprom.def.baseEepHeader.version) & 0xFFF) |
860 | #define ar5416_get_ntxchains(_txchainmask) \ | 983 | #define ar5416_get_ntxchains(_txchainmask) \ |
861 | (((_txchainmask >> 2) & 1) + \ | 984 | (((_txchainmask >> 2) & 1) + \ |
862 | ((_txchainmask >> 1) & 1) + (_txchainmask & 1)) | 985 | ((_txchainmask >> 1) & 1) + (_txchainmask & 1)) |
863 | 986 | ||
987 | /* EEPROM 4K bit map definations */ | ||
988 | #define ar5416_get_eep4k_ver(_ahp) \ | ||
989 | (((_ahp)->ah_eeprom.map4k.baseEepHeader.version >> 12) & 0xF) | ||
990 | #define ar5416_get_eep4k_rev(_ahp) \ | ||
991 | (((_ahp)->ah_eeprom.map4k.baseEepHeader.version) & 0xFFF) | ||
992 | |||
993 | |||
864 | #ifdef __BIG_ENDIAN | 994 | #ifdef __BIG_ENDIAN |
865 | #define AR5416_EEPROM_MAGIC 0x5aa5 | 995 | #define AR5416_EEPROM_MAGIC 0x5aa5 |
866 | #else | 996 | #else |
diff --git a/drivers/net/wireless/ath9k/initvals.h b/drivers/net/wireless/ath9k/initvals.h index 1b08b54b31d7..f3cfa16525e4 100644 --- a/drivers/net/wireless/ath9k/initvals.h +++ b/drivers/net/wireless/ath9k/initvals.h | |||
@@ -3437,3 +3437,1366 @@ static const u32 ar9280PciePhy_clkreq_always_on_L1_9280[][2] = { | |||
3437 | {0x00004040, 0x00043007 }, | 3437 | {0x00004040, 0x00043007 }, |
3438 | {0x00004044, 0x00000000 }, | 3438 | {0x00004044, 0x00000000 }, |
3439 | }; | 3439 | }; |
3440 | |||
3441 | /* AR9285 */ | ||
3442 | static const u_int32_t ar9285Modes_9285[][6] = { | ||
3443 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, | ||
3444 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, | ||
3445 | { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, | ||
3446 | { 0x000010f0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008 }, | ||
3447 | { 0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00, 0x06e006e0 }, | ||
3448 | { 0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b, 0x0988004f }, | ||
3449 | { 0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440, 0x00006880 }, | ||
3450 | { 0x00009804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0x00000303 }, | ||
3451 | { 0x00009820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200 }, | ||
3452 | { 0x00009824, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
3453 | { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, | ||
3454 | { 0x00009834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
3455 | { 0x00009838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0x00000007 }, | ||
3456 | { 0x00009840, 0x206a012e, 0x206a012e, 0x206a012e, 0x206a012e, 0x206a012e }, | ||
3457 | { 0x00009844, 0x0372161e, 0x0372161e, 0x03720020, 0x03720020, 0x037216a0 }, | ||
3458 | { 0x00009848, 0x00001066, 0x00001066, 0x0000004e, 0x0000004e, 0x00001059 }, | ||
3459 | { 0x00009850, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2 }, | ||
3460 | { 0x00009858, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e }, | ||
3461 | { 0x0000985c, 0x3139605e, 0x3139605e, 0x3136605e, 0x3136605e, 0x3139605e }, | ||
3462 | { 0x00009860, 0x00058d18, 0x00058d18, 0x00058d20, 0x00058d20, 0x00058d18 }, | ||
3463 | { 0x00009864, 0x0000fe00, 0x0000fe00, 0x0001ce00, 0x0001ce00, 0x0001ce00 }, | ||
3464 | { 0x00009868, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0 }, | ||
3465 | { 0x0000986c, 0x06903081, 0x06903081, 0x06903881, 0x06903881, 0x06903881 }, | ||
3466 | { 0x00009914, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898, 0x000007d0 }, | ||
3467 | { 0x00009918, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b, 0x00000016 }, | ||
3468 | { 0x00009924, 0xd00a8007, 0xd00a8007, 0xd00a800d, 0xd00a800d, 0xd00a800d }, | ||
3469 | { 0x00009944, 0xdfbc1010, 0xdfbc1010, 0xdfbc1020, 0xdfbc1020, 0xdfbc1010 }, | ||
3470 | { 0x00009960, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
3471 | { 0x00009964, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
3472 | { 0x000099b8, 0x00cf4d1c, 0x00cf4d1c, 0x00cf4d1c, 0x00cf4d1c, 0x00cf4d1c }, | ||
3473 | { 0x000099bc, 0x00000600, 0x00000600, 0x00000c00, 0x00000c00, 0x00000c00 }, | ||
3474 | { 0x000099c0, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4 }, | ||
3475 | { 0x000099c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77 }, | ||
3476 | { 0x000099c8, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329 }, | ||
3477 | { 0x000099cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8 }, | ||
3478 | { 0x000099d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0x00046384 }, | ||
3479 | { 0x000099d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
3480 | { 0x000099d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
3481 | { 0x00009a00, 0x00000000, 0x00000000, 0x00068084, 0x00068084, 0x00000000 }, | ||
3482 | { 0x00009a04, 0x00000000, 0x00000000, 0x00068088, 0x00068088, 0x00000000 }, | ||
3483 | { 0x00009a08, 0x00000000, 0x00000000, 0x0006808c, 0x0006808c, 0x00000000 }, | ||
3484 | { 0x00009a0c, 0x00000000, 0x00000000, 0x00068100, 0x00068100, 0x00000000 }, | ||
3485 | { 0x00009a10, 0x00000000, 0x00000000, 0x00068104, 0x00068104, 0x00000000 }, | ||
3486 | { 0x00009a14, 0x00000000, 0x00000000, 0x00068108, 0x00068108, 0x00000000 }, | ||
3487 | { 0x00009a18, 0x00000000, 0x00000000, 0x0006810c, 0x0006810c, 0x00000000 }, | ||
3488 | { 0x00009a1c, 0x00000000, 0x00000000, 0x00068110, 0x00068110, 0x00000000 }, | ||
3489 | { 0x00009a20, 0x00000000, 0x00000000, 0x00068114, 0x00068114, 0x00000000 }, | ||
3490 | { 0x00009a24, 0x00000000, 0x00000000, 0x00068180, 0x00068180, 0x00000000 }, | ||
3491 | { 0x00009a28, 0x00000000, 0x00000000, 0x00068184, 0x00068184, 0x00000000 }, | ||
3492 | { 0x00009a2c, 0x00000000, 0x00000000, 0x00068188, 0x00068188, 0x00000000 }, | ||
3493 | { 0x00009a30, 0x00000000, 0x00000000, 0x0006818c, 0x0006818c, 0x00000000 }, | ||
3494 | { 0x00009a34, 0x00000000, 0x00000000, 0x00068190, 0x00068190, 0x00000000 }, | ||
3495 | { 0x00009a38, 0x00000000, 0x00000000, 0x00068194, 0x00068194, 0x00000000 }, | ||
3496 | { 0x00009a3c, 0x00000000, 0x00000000, 0x000681a0, 0x000681a0, 0x00000000 }, | ||
3497 | { 0x00009a40, 0x00000000, 0x00000000, 0x0006820c, 0x0006820c, 0x00000000 }, | ||
3498 | { 0x00009a44, 0x00000000, 0x00000000, 0x000681a8, 0x000681a8, 0x00000000 }, | ||
3499 | { 0x00009a48, 0x00000000, 0x00000000, 0x00068284, 0x00068284, 0x00000000 }, | ||
3500 | { 0x00009a4c, 0x00000000, 0x00000000, 0x00068288, 0x00068288, 0x00000000 }, | ||
3501 | { 0x00009a50, 0x00000000, 0x00000000, 0x00068220, 0x00068220, 0x00000000 }, | ||
3502 | { 0x00009a54, 0x00000000, 0x00000000, 0x00068290, 0x00068290, 0x00000000 }, | ||
3503 | { 0x00009a58, 0x00000000, 0x00000000, 0x00068300, 0x00068300, 0x00000000 }, | ||
3504 | { 0x00009a5c, 0x00000000, 0x00000000, 0x00068304, 0x00068304, 0x00000000 }, | ||
3505 | { 0x00009a60, 0x00000000, 0x00000000, 0x00068308, 0x00068308, 0x00000000 }, | ||
3506 | { 0x00009a64, 0x00000000, 0x00000000, 0x0006830c, 0x0006830c, 0x00000000 }, | ||
3507 | { 0x00009a68, 0x00000000, 0x00000000, 0x00068380, 0x00068380, 0x00000000 }, | ||
3508 | { 0x00009a6c, 0x00000000, 0x00000000, 0x00068384, 0x00068384, 0x00000000 }, | ||
3509 | { 0x00009a70, 0x00000000, 0x00000000, 0x00068700, 0x00068700, 0x00000000 }, | ||
3510 | { 0x00009a74, 0x00000000, 0x00000000, 0x00068704, 0x00068704, 0x00000000 }, | ||
3511 | { 0x00009a78, 0x00000000, 0x00000000, 0x00068708, 0x00068708, 0x00000000 }, | ||
3512 | { 0x00009a7c, 0x00000000, 0x00000000, 0x0006870c, 0x0006870c, 0x00000000 }, | ||
3513 | { 0x00009a80, 0x00000000, 0x00000000, 0x00068780, 0x00068780, 0x00000000 }, | ||
3514 | { 0x00009a84, 0x00000000, 0x00000000, 0x00068784, 0x00068784, 0x00000000 }, | ||
3515 | { 0x00009a88, 0x00000000, 0x00000000, 0x00068b04, 0x00068b04, 0x00000000 }, | ||
3516 | { 0x00009a8c, 0x00000000, 0x00000000, 0x00068b08, 0x00068b08, 0x00000000 }, | ||
3517 | { 0x00009a90, 0x00000000, 0x00000000, 0x00068b08, 0x00068b08, 0x00000000 }, | ||
3518 | { 0x00009a94, 0x00000000, 0x00000000, 0x00068b0c, 0x00068b0c, 0x00000000 }, | ||
3519 | { 0x00009a98, 0x00000000, 0x00000000, 0x00068b80, 0x00068b80, 0x00000000 }, | ||
3520 | { 0x00009a9c, 0x00000000, 0x00000000, 0x00068b84, 0x00068b84, 0x00000000 }, | ||
3521 | { 0x00009aa0, 0x00000000, 0x00000000, 0x00068b88, 0x00068b88, 0x00000000 }, | ||
3522 | { 0x00009aa4, 0x00000000, 0x00000000, 0x00068b8c, 0x00068b8c, 0x00000000 }, | ||
3523 | { 0x00009aa8, 0x00000000, 0x00000000, 0x000b8b90, 0x000b8b90, 0x00000000 }, | ||
3524 | { 0x00009aac, 0x00000000, 0x00000000, 0x000b8f80, 0x000b8f80, 0x00000000 }, | ||
3525 | { 0x00009ab0, 0x00000000, 0x00000000, 0x000b8f84, 0x000b8f84, 0x00000000 }, | ||
3526 | { 0x00009ab4, 0x00000000, 0x00000000, 0x000b8f88, 0x000b8f88, 0x00000000 }, | ||
3527 | { 0x00009ab8, 0x00000000, 0x00000000, 0x000b8f8c, 0x000b8f8c, 0x00000000 }, | ||
3528 | { 0x00009abc, 0x00000000, 0x00000000, 0x000b8f90, 0x000b8f90, 0x00000000 }, | ||
3529 | { 0x00009ac0, 0x00000000, 0x00000000, 0x000bb30c, 0x000bb30c, 0x00000000 }, | ||
3530 | { 0x00009ac4, 0x00000000, 0x00000000, 0x000bb310, 0x000bb310, 0x00000000 }, | ||
3531 | { 0x00009ac8, 0x00000000, 0x00000000, 0x000bb384, 0x000bb384, 0x00000000 }, | ||
3532 | { 0x00009acc, 0x00000000, 0x00000000, 0x000bb388, 0x000bb388, 0x00000000 }, | ||
3533 | { 0x00009ad0, 0x00000000, 0x00000000, 0x000bb324, 0x000bb324, 0x00000000 }, | ||
3534 | { 0x00009ad4, 0x00000000, 0x00000000, 0x000bb704, 0x000bb704, 0x00000000 }, | ||
3535 | { 0x00009ad8, 0x00000000, 0x00000000, 0x000f96a4, 0x000f96a4, 0x00000000 }, | ||
3536 | { 0x00009adc, 0x00000000, 0x00000000, 0x000f96a8, 0x000f96a8, 0x00000000 }, | ||
3537 | { 0x00009ae0, 0x00000000, 0x00000000, 0x000f9710, 0x000f9710, 0x00000000 }, | ||
3538 | { 0x00009ae4, 0x00000000, 0x00000000, 0x000f9714, 0x000f9714, 0x00000000 }, | ||
3539 | { 0x00009ae8, 0x00000000, 0x00000000, 0x000f9720, 0x000f9720, 0x00000000 }, | ||
3540 | { 0x00009aec, 0x00000000, 0x00000000, 0x000f9724, 0x000f9724, 0x00000000 }, | ||
3541 | { 0x00009af0, 0x00000000, 0x00000000, 0x000f9728, 0x000f9728, 0x00000000 }, | ||
3542 | { 0x00009af4, 0x00000000, 0x00000000, 0x000f972c, 0x000f972c, 0x00000000 }, | ||
3543 | { 0x00009af8, 0x00000000, 0x00000000, 0x000f97a0, 0x000f97a0, 0x00000000 }, | ||
3544 | { 0x00009afc, 0x00000000, 0x00000000, 0x000f97a4, 0x000f97a4, 0x00000000 }, | ||
3545 | { 0x00009b00, 0x00000000, 0x00000000, 0x000fb7a8, 0x000fb7a8, 0x00000000 }, | ||
3546 | { 0x00009b04, 0x00000000, 0x00000000, 0x000fb7b0, 0x000fb7b0, 0x00000000 }, | ||
3547 | { 0x00009b08, 0x00000000, 0x00000000, 0x000fb7b4, 0x000fb7b4, 0x00000000 }, | ||
3548 | { 0x00009b0c, 0x00000000, 0x00000000, 0x000fb7b8, 0x000fb7b8, 0x00000000 }, | ||
3549 | { 0x00009b10, 0x00000000, 0x00000000, 0x000fb7a5, 0x000fb7a5, 0x00000000 }, | ||
3550 | { 0x00009b14, 0x00000000, 0x00000000, 0x000fb7a9, 0x000fb7a9, 0x00000000 }, | ||
3551 | { 0x00009b18, 0x00000000, 0x00000000, 0x000fb7ad, 0x000fb7ad, 0x00000000 }, | ||
3552 | { 0x00009b1c, 0x00000000, 0x00000000, 0x000fb7b1, 0x000fb7b1, 0x00000000 }, | ||
3553 | { 0x00009b20, 0x00000000, 0x00000000, 0x000fb7b5, 0x000fb7b5, 0x00000000 }, | ||
3554 | { 0x00009b24, 0x00000000, 0x00000000, 0x000fb7b9, 0x000fb7b9, 0x00000000 }, | ||
3555 | { 0x00009b28, 0x00000000, 0x00000000, 0x000fb7c5, 0x000fb7c5, 0x00000000 }, | ||
3556 | { 0x00009b2c, 0x00000000, 0x00000000, 0x000fb7c9, 0x000fb7c9, 0x00000000 }, | ||
3557 | { 0x00009b30, 0x00000000, 0x00000000, 0x000fb7d1, 0x000fb7d1, 0x00000000 }, | ||
3558 | { 0x00009b34, 0x00000000, 0x00000000, 0x000fb7d5, 0x000fb7d5, 0x00000000 }, | ||
3559 | { 0x00009b38, 0x00000000, 0x00000000, 0x000fb7d9, 0x000fb7d9, 0x00000000 }, | ||
3560 | { 0x00009b3c, 0x00000000, 0x00000000, 0x000fb7c6, 0x000fb7c6, 0x00000000 }, | ||
3561 | { 0x00009b40, 0x00000000, 0x00000000, 0x000fb7ca, 0x000fb7ca, 0x00000000 }, | ||
3562 | { 0x00009b44, 0x00000000, 0x00000000, 0x000fb7ce, 0x000fb7ce, 0x00000000 }, | ||
3563 | { 0x00009b48, 0x00000000, 0x00000000, 0x000fb7d2, 0x000fb7d2, 0x00000000 }, | ||
3564 | { 0x00009b4c, 0x00000000, 0x00000000, 0x000fb7d6, 0x000fb7d6, 0x00000000 }, | ||
3565 | { 0x00009b50, 0x00000000, 0x00000000, 0x000fb7c3, 0x000fb7c3, 0x00000000 }, | ||
3566 | { 0x00009b54, 0x00000000, 0x00000000, 0x000fb7c7, 0x000fb7c7, 0x00000000 }, | ||
3567 | { 0x00009b58, 0x00000000, 0x00000000, 0x000fb7cb, 0x000fb7cb, 0x00000000 }, | ||
3568 | { 0x00009b5c, 0x00000000, 0x00000000, 0x000fb7cf, 0x000fb7cf, 0x00000000 }, | ||
3569 | { 0x00009b60, 0x00000000, 0x00000000, 0x000fb7d7, 0x000fb7d7, 0x00000000 }, | ||
3570 | { 0x00009b64, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3571 | { 0x00009b68, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3572 | { 0x00009b6c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3573 | { 0x00009b70, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3574 | { 0x00009b74, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3575 | { 0x00009b78, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3576 | { 0x00009b7c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3577 | { 0x00009b80, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3578 | { 0x00009b84, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3579 | { 0x00009b88, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3580 | { 0x00009b8c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3581 | { 0x00009b90, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3582 | { 0x00009b94, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3583 | { 0x00009b98, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3584 | { 0x00009b9c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3585 | { 0x00009ba0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3586 | { 0x00009ba4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3587 | { 0x00009ba8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3588 | { 0x00009bac, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3589 | { 0x00009bb0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3590 | { 0x00009bb4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3591 | { 0x00009bb8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3592 | { 0x00009bbc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3593 | { 0x00009bc0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3594 | { 0x00009bc4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3595 | { 0x00009bc8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3596 | { 0x00009bcc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3597 | { 0x00009bd0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3598 | { 0x00009bd4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3599 | { 0x00009bd8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3600 | { 0x00009bdc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3601 | { 0x00009be0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3602 | { 0x00009be4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3603 | { 0x00009be8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3604 | { 0x00009bec, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3605 | { 0x00009bf0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3606 | { 0x00009bf4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3607 | { 0x00009bf8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3608 | { 0x00009bfc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
3609 | { 0x0000aa00, 0x00000000, 0x00000000, 0x0006801c, 0x0006801c, 0x00000000 }, | ||
3610 | { 0x0000aa04, 0x00000000, 0x00000000, 0x00068080, 0x00068080, 0x00000000 }, | ||
3611 | { 0x0000aa08, 0x00000000, 0x00000000, 0x00068084, 0x00068084, 0x00000000 }, | ||
3612 | { 0x0000aa0c, 0x00000000, 0x00000000, 0x00068088, 0x00068088, 0x00000000 }, | ||
3613 | { 0x0000aa10, 0x00000000, 0x00000000, 0x0006808c, 0x0006808c, 0x00000000 }, | ||
3614 | { 0x0000aa14, 0x00000000, 0x00000000, 0x00068100, 0x00068100, 0x00000000 }, | ||
3615 | { 0x0000aa18, 0x00000000, 0x00000000, 0x00068104, 0x00068104, 0x00000000 }, | ||
3616 | { 0x0000aa1c, 0x00000000, 0x00000000, 0x00068108, 0x00068108, 0x00000000 }, | ||
3617 | { 0x0000aa20, 0x00000000, 0x00000000, 0x0006810c, 0x0006810c, 0x00000000 }, | ||
3618 | { 0x0000aa24, 0x00000000, 0x00000000, 0x00068110, 0x00068110, 0x00000000 }, | ||
3619 | { 0x0000aa28, 0x00000000, 0x00000000, 0x00068110, 0x00068110, 0x00000000 }, | ||
3620 | { 0x0000aa2c, 0x00000000, 0x00000000, 0x00068180, 0x00068180, 0x00000000 }, | ||
3621 | { 0x0000aa30, 0x00000000, 0x00000000, 0x00068184, 0x00068184, 0x00000000 }, | ||
3622 | { 0x0000aa34, 0x00000000, 0x00000000, 0x00068188, 0x00068188, 0x00000000 }, | ||
3623 | { 0x0000aa38, 0x00000000, 0x00000000, 0x0006818c, 0x0006818c, 0x00000000 }, | ||
3624 | { 0x0000aa3c, 0x00000000, 0x00000000, 0x00068190, 0x00068190, 0x00000000 }, | ||
3625 | { 0x0000aa40, 0x00000000, 0x00000000, 0x00068194, 0x00068194, 0x00000000 }, | ||
3626 | { 0x0000aa44, 0x00000000, 0x00000000, 0x000681a0, 0x000681a0, 0x00000000 }, | ||
3627 | { 0x0000aa48, 0x00000000, 0x00000000, 0x0006820c, 0x0006820c, 0x00000000 }, | ||
3628 | { 0x0000aa4c, 0x00000000, 0x00000000, 0x000681a8, 0x000681a8, 0x00000000 }, | ||
3629 | { 0x0000aa50, 0x00000000, 0x00000000, 0x000681ac, 0x000681ac, 0x00000000 }, | ||
3630 | { 0x0000aa54, 0x00000000, 0x00000000, 0x0006821c, 0x0006821c, 0x00000000 }, | ||
3631 | { 0x0000aa58, 0x00000000, 0x00000000, 0x00068224, 0x00068224, 0x00000000 }, | ||
3632 | { 0x0000aa5c, 0x00000000, 0x00000000, 0x00068290, 0x00068290, 0x00000000 }, | ||
3633 | { 0x0000aa60, 0x00000000, 0x00000000, 0x00068300, 0x00068300, 0x00000000 }, | ||
3634 | { 0x0000aa64, 0x00000000, 0x00000000, 0x00068308, 0x00068308, 0x00000000 }, | ||
3635 | { 0x0000aa68, 0x00000000, 0x00000000, 0x0006830c, 0x0006830c, 0x00000000 }, | ||
3636 | { 0x0000aa6c, 0x00000000, 0x00000000, 0x00068310, 0x00068310, 0x00000000 }, | ||
3637 | { 0x0000aa70, 0x00000000, 0x00000000, 0x00068788, 0x00068788, 0x00000000 }, | ||
3638 | { 0x0000aa74, 0x00000000, 0x00000000, 0x0006878c, 0x0006878c, 0x00000000 }, | ||
3639 | { 0x0000aa78, 0x00000000, 0x00000000, 0x00068790, 0x00068790, 0x00000000 }, | ||
3640 | { 0x0000aa7c, 0x00000000, 0x00000000, 0x00068794, 0x00068794, 0x00000000 }, | ||
3641 | { 0x0000aa80, 0x00000000, 0x00000000, 0x00068798, 0x00068798, 0x00000000 }, | ||
3642 | { 0x0000aa84, 0x00000000, 0x00000000, 0x0006879c, 0x0006879c, 0x00000000 }, | ||
3643 | { 0x0000aa88, 0x00000000, 0x00000000, 0x00068b89, 0x00068b89, 0x00000000 }, | ||
3644 | { 0x0000aa8c, 0x00000000, 0x00000000, 0x00068b8d, 0x00068b8d, 0x00000000 }, | ||
3645 | { 0x0000aa90, 0x00000000, 0x00000000, 0x00068b91, 0x00068b91, 0x00000000 }, | ||
3646 | { 0x0000aa94, 0x00000000, 0x00000000, 0x00068b95, 0x00068b95, 0x00000000 }, | ||
3647 | { 0x0000aa98, 0x00000000, 0x00000000, 0x00068b99, 0x00068b99, 0x00000000 }, | ||
3648 | { 0x0000aa9c, 0x00000000, 0x00000000, 0x00068ba5, 0x00068ba5, 0x00000000 }, | ||
3649 | { 0x0000aaa0, 0x00000000, 0x00000000, 0x00068ba9, 0x00068ba9, 0x00000000 }, | ||
3650 | { 0x0000aaa4, 0x00000000, 0x00000000, 0x00068bad, 0x00068bad, 0x00000000 }, | ||
3651 | { 0x0000aaa8, 0x00000000, 0x00000000, 0x000b8b0c, 0x000b8b0c, 0x00000000 }, | ||
3652 | { 0x0000aaac, 0x00000000, 0x00000000, 0x000b8f10, 0x000b8f10, 0x00000000 }, | ||
3653 | { 0x0000aab0, 0x00000000, 0x00000000, 0x000b8f14, 0x000b8f14, 0x00000000 }, | ||
3654 | { 0x0000aab4, 0x00000000, 0x00000000, 0x000b8f84, 0x000b8f84, 0x00000000 }, | ||
3655 | { 0x0000aab8, 0x00000000, 0x00000000, 0x000b8f84, 0x000b8f84, 0x00000000 }, | ||
3656 | { 0x0000aabc, 0x00000000, 0x00000000, 0x000b8f88, 0x000b8f88, 0x00000000 }, | ||
3657 | { 0x0000aac0, 0x00000000, 0x00000000, 0x000bb380, 0x000bb380, 0x00000000 }, | ||
3658 | { 0x0000aac4, 0x00000000, 0x00000000, 0x000bb384, 0x000bb384, 0x00000000 }, | ||
3659 | { 0x0000aac8, 0x00000000, 0x00000000, 0x000bb388, 0x000bb388, 0x00000000 }, | ||
3660 | { 0x0000aacc, 0x00000000, 0x00000000, 0x000bb38c, 0x000bb38c, 0x00000000 }, | ||
3661 | { 0x0000aad0, 0x00000000, 0x00000000, 0x000bb394, 0x000bb394, 0x00000000 }, | ||
3662 | { 0x0000aad4, 0x00000000, 0x00000000, 0x000bb798, 0x000bb798, 0x00000000 }, | ||
3663 | { 0x0000aad8, 0x00000000, 0x00000000, 0x000f970c, 0x000f970c, 0x00000000 }, | ||
3664 | { 0x0000aadc, 0x00000000, 0x00000000, 0x000f9710, 0x000f9710, 0x00000000 }, | ||
3665 | { 0x0000aae0, 0x00000000, 0x00000000, 0x000f9714, 0x000f9714, 0x00000000 }, | ||
3666 | { 0x0000aae4, 0x00000000, 0x00000000, 0x000f9718, 0x000f9718, 0x00000000 }, | ||
3667 | { 0x0000aae8, 0x00000000, 0x00000000, 0x000f9705, 0x000f9705, 0x00000000 }, | ||
3668 | { 0x0000aaec, 0x00000000, 0x00000000, 0x000f9709, 0x000f9709, 0x00000000 }, | ||
3669 | { 0x0000aaf0, 0x00000000, 0x00000000, 0x000f970d, 0x000f970d, 0x00000000 }, | ||
3670 | { 0x0000aaf4, 0x00000000, 0x00000000, 0x000f9711, 0x000f9711, 0x00000000 }, | ||
3671 | { 0x0000aaf8, 0x00000000, 0x00000000, 0x000f9715, 0x000f9715, 0x00000000 }, | ||
3672 | { 0x0000aafc, 0x00000000, 0x00000000, 0x000f9719, 0x000f9719, 0x00000000 }, | ||
3673 | { 0x0000ab00, 0x00000000, 0x00000000, 0x000fb7a4, 0x000fb7a4, 0x00000000 }, | ||
3674 | { 0x0000ab04, 0x00000000, 0x00000000, 0x000fb7a8, 0x000fb7a8, 0x00000000 }, | ||
3675 | { 0x0000ab08, 0x00000000, 0x00000000, 0x000fb7ac, 0x000fb7ac, 0x00000000 }, | ||
3676 | { 0x0000ab0c, 0x00000000, 0x00000000, 0x000fb7ac, 0x000fb7ac, 0x00000000 }, | ||
3677 | { 0x0000ab10, 0x00000000, 0x00000000, 0x000fb7b0, 0x000fb7b0, 0x00000000 }, | ||
3678 | { 0x0000ab14, 0x00000000, 0x00000000, 0x000fb7b8, 0x000fb7b8, 0x00000000 }, | ||
3679 | { 0x0000ab18, 0x00000000, 0x00000000, 0x000fb7bc, 0x000fb7bc, 0x00000000 }, | ||
3680 | { 0x0000ab1c, 0x00000000, 0x00000000, 0x000fb7a1, 0x000fb7a1, 0x00000000 }, | ||
3681 | { 0x0000ab20, 0x00000000, 0x00000000, 0x000fb7a5, 0x000fb7a5, 0x00000000 }, | ||
3682 | { 0x0000ab24, 0x00000000, 0x00000000, 0x000fb7a9, 0x000fb7a9, 0x00000000 }, | ||
3683 | { 0x0000ab28, 0x00000000, 0x00000000, 0x000fb7b1, 0x000fb7b1, 0x00000000 }, | ||
3684 | { 0x0000ab2c, 0x00000000, 0x00000000, 0x000fb7b5, 0x000fb7b5, 0x00000000 }, | ||
3685 | { 0x0000ab30, 0x00000000, 0x00000000, 0x000fb7bd, 0x000fb7bd, 0x00000000 }, | ||
3686 | { 0x0000ab34, 0x00000000, 0x00000000, 0x000fb7c9, 0x000fb7c9, 0x00000000 }, | ||
3687 | { 0x0000ab38, 0x00000000, 0x00000000, 0x000fb7cd, 0x000fb7cd, 0x00000000 }, | ||
3688 | { 0x0000ab3c, 0x00000000, 0x00000000, 0x000fb7d1, 0x000fb7d1, 0x00000000 }, | ||
3689 | { 0x0000ab40, 0x00000000, 0x00000000, 0x000fb7d9, 0x000fb7d9, 0x00000000 }, | ||
3690 | { 0x0000ab44, 0x00000000, 0x00000000, 0x000fb7c2, 0x000fb7c2, 0x00000000 }, | ||
3691 | { 0x0000ab48, 0x00000000, 0x00000000, 0x000fb7c6, 0x000fb7c6, 0x00000000 }, | ||
3692 | { 0x0000ab4c, 0x00000000, 0x00000000, 0x000fb7ca, 0x000fb7ca, 0x00000000 }, | ||
3693 | { 0x0000ab50, 0x00000000, 0x00000000, 0x000fb7ce, 0x000fb7ce, 0x00000000 }, | ||
3694 | { 0x0000ab54, 0x00000000, 0x00000000, 0x000fb7d2, 0x000fb7d2, 0x00000000 }, | ||
3695 | { 0x0000ab58, 0x00000000, 0x00000000, 0x000fb7d6, 0x000fb7d6, 0x00000000 }, | ||
3696 | { 0x0000ab5c, 0x00000000, 0x00000000, 0x000fb7c3, 0x000fb7c3, 0x00000000 }, | ||
3697 | { 0x0000ab60, 0x00000000, 0x00000000, 0x000fb7cb, 0x000fb7cb, 0x00000000 }, | ||
3698 | { 0x0000ab64, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3699 | { 0x0000ab68, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3700 | { 0x0000ab6c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3701 | { 0x0000ab70, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3702 | { 0x0000ab74, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3703 | { 0x0000ab78, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3704 | { 0x0000ab7c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3705 | { 0x0000ab80, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3706 | { 0x0000ab84, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3707 | { 0x0000ab88, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3708 | { 0x0000ab8c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3709 | { 0x0000ab90, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3710 | { 0x0000ab94, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3711 | { 0x0000ab98, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3712 | { 0x0000ab9c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3713 | { 0x0000aba0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3714 | { 0x0000aba4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3715 | { 0x0000aba8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3716 | { 0x0000abac, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3717 | { 0x0000abb0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3718 | { 0x0000abb4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3719 | { 0x0000abb8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3720 | { 0x0000abbc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3721 | { 0x0000abc0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3722 | { 0x0000abc4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3723 | { 0x0000abc8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3724 | { 0x0000abcc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3725 | { 0x0000abd0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3726 | { 0x0000abd4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3727 | { 0x0000abd8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3728 | { 0x0000abdc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3729 | { 0x0000abe0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3730 | { 0x0000abe4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3731 | { 0x0000abe8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3732 | { 0x0000abec, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3733 | { 0x0000abf0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3734 | { 0x0000abf4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3735 | { 0x0000abf8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3736 | { 0x0000abfc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
3737 | { 0x0000a204, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004 }, | ||
3738 | { 0x0000a20c, 0x00000014, 0x00000014, 0x00000000, 0x00000000, 0x0001f000 }, | ||
3739 | { 0x0000a21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a }, | ||
3740 | { 0x0000a230, 0x00000000, 0x00000000, 0x00000210, 0x00000108, 0x00000000 }, | ||
3741 | { 0x0000a250, 0x001ff000, 0x001ff000, 0x001ca000, 0x001ca000, 0x001da000 }, | ||
3742 | { 0x0000a274, 0x0a81c652, 0x0a81c652, 0x0a820652, 0x0a820652, 0x0a82a652 }, | ||
3743 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
3744 | { 0x0000a304, 0x00000000, 0x00000000, 0x00007201, 0x00007201, 0x00000000 }, | ||
3745 | { 0x0000a308, 0x00000000, 0x00000000, 0x00010408, 0x00010408, 0x00000000 }, | ||
3746 | { 0x0000a30c, 0x00000000, 0x00000000, 0x0001860a, 0x0001860a, 0x00000000 }, | ||
3747 | { 0x0000a310, 0x00000000, 0x00000000, 0x00020818, 0x00020818, 0x00000000 }, | ||
3748 | { 0x0000a314, 0x00000000, 0x00000000, 0x00024858, 0x00024858, 0x00000000 }, | ||
3749 | { 0x0000a318, 0x00000000, 0x00000000, 0x00026859, 0x00026859, 0x00000000 }, | ||
3750 | { 0x0000a31c, 0x00000000, 0x00000000, 0x0002985b, 0x0002985b, 0x00000000 }, | ||
3751 | { 0x0000a320, 0x00000000, 0x00000000, 0x0002c89a, 0x0002c89a, 0x00000000 }, | ||
3752 | { 0x0000a324, 0x00000000, 0x00000000, 0x0002e89b, 0x0002e89b, 0x00000000 }, | ||
3753 | { 0x0000a328, 0x00000000, 0x00000000, 0x0003089c, 0x0003089c, 0x00000000 }, | ||
3754 | { 0x0000a32c, 0x00000000, 0x00000000, 0x0003289d, 0x0003289d, 0x00000000 }, | ||
3755 | { 0x0000a330, 0x00000000, 0x00000000, 0x0003489e, 0x0003489e, 0x00000000 }, | ||
3756 | { 0x0000a334, 0x00000000, 0x00000000, 0x000388de, 0x000388de, 0x00000000 }, | ||
3757 | { 0x0000a338, 0x00000000, 0x00000000, 0x0003b91e, 0x0003b91e, 0x00000000 }, | ||
3758 | { 0x0000a33c, 0x00000000, 0x00000000, 0x0003d95e, 0x0003d95e, 0x00000000 }, | ||
3759 | { 0x0000a340, 0x00000000, 0x00000000, 0x000419df, 0x000419df, 0x00000000 }, | ||
3760 | { 0x0000a344, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, | ||
3761 | { 0x0000a358, 0x7999aa02, 0x7999aa02, 0x7999aa0e, 0x7999aa0e, 0x7999aa0e }, | ||
3762 | }; | ||
3763 | |||
3764 | static const u_int32_t ar9285Common_9285[][2] = { | ||
3765 | { 0x0000000c, 0x00000000 }, | ||
3766 | { 0x00000030, 0x00020045 }, | ||
3767 | { 0x00000034, 0x00000005 }, | ||
3768 | { 0x00000040, 0x00000000 }, | ||
3769 | { 0x00000044, 0x00000008 }, | ||
3770 | { 0x00000048, 0x00000008 }, | ||
3771 | { 0x0000004c, 0x00000010 }, | ||
3772 | { 0x00000050, 0x00000000 }, | ||
3773 | { 0x00000054, 0x0000001f }, | ||
3774 | { 0x00000800, 0x00000000 }, | ||
3775 | { 0x00000804, 0x00000000 }, | ||
3776 | { 0x00000808, 0x00000000 }, | ||
3777 | { 0x0000080c, 0x00000000 }, | ||
3778 | { 0x00000810, 0x00000000 }, | ||
3779 | { 0x00000814, 0x00000000 }, | ||
3780 | { 0x00000818, 0x00000000 }, | ||
3781 | { 0x0000081c, 0x00000000 }, | ||
3782 | { 0x00000820, 0x00000000 }, | ||
3783 | { 0x00000824, 0x00000000 }, | ||
3784 | { 0x00001040, 0x002ffc0f }, | ||
3785 | { 0x00001044, 0x002ffc0f }, | ||
3786 | { 0x00001048, 0x002ffc0f }, | ||
3787 | { 0x0000104c, 0x002ffc0f }, | ||
3788 | { 0x00001050, 0x002ffc0f }, | ||
3789 | { 0x00001054, 0x002ffc0f }, | ||
3790 | { 0x00001058, 0x002ffc0f }, | ||
3791 | { 0x0000105c, 0x002ffc0f }, | ||
3792 | { 0x00001060, 0x002ffc0f }, | ||
3793 | { 0x00001064, 0x002ffc0f }, | ||
3794 | { 0x00001230, 0x00000000 }, | ||
3795 | { 0x00001270, 0x00000000 }, | ||
3796 | { 0x00001038, 0x00000000 }, | ||
3797 | { 0x00001078, 0x00000000 }, | ||
3798 | { 0x000010b8, 0x00000000 }, | ||
3799 | { 0x000010f8, 0x00000000 }, | ||
3800 | { 0x00001138, 0x00000000 }, | ||
3801 | { 0x00001178, 0x00000000 }, | ||
3802 | { 0x000011b8, 0x00000000 }, | ||
3803 | { 0x000011f8, 0x00000000 }, | ||
3804 | { 0x00001238, 0x00000000 }, | ||
3805 | { 0x00001278, 0x00000000 }, | ||
3806 | { 0x000012b8, 0x00000000 }, | ||
3807 | { 0x000012f8, 0x00000000 }, | ||
3808 | { 0x00001338, 0x00000000 }, | ||
3809 | { 0x00001378, 0x00000000 }, | ||
3810 | { 0x000013b8, 0x00000000 }, | ||
3811 | { 0x000013f8, 0x00000000 }, | ||
3812 | { 0x00001438, 0x00000000 }, | ||
3813 | { 0x00001478, 0x00000000 }, | ||
3814 | { 0x000014b8, 0x00000000 }, | ||
3815 | { 0x000014f8, 0x00000000 }, | ||
3816 | { 0x00001538, 0x00000000 }, | ||
3817 | { 0x00001578, 0x00000000 }, | ||
3818 | { 0x000015b8, 0x00000000 }, | ||
3819 | { 0x000015f8, 0x00000000 }, | ||
3820 | { 0x00001638, 0x00000000 }, | ||
3821 | { 0x00001678, 0x00000000 }, | ||
3822 | { 0x000016b8, 0x00000000 }, | ||
3823 | { 0x000016f8, 0x00000000 }, | ||
3824 | { 0x00001738, 0x00000000 }, | ||
3825 | { 0x00001778, 0x00000000 }, | ||
3826 | { 0x000017b8, 0x00000000 }, | ||
3827 | { 0x000017f8, 0x00000000 }, | ||
3828 | { 0x0000103c, 0x00000000 }, | ||
3829 | { 0x0000107c, 0x00000000 }, | ||
3830 | { 0x000010bc, 0x00000000 }, | ||
3831 | { 0x000010fc, 0x00000000 }, | ||
3832 | { 0x0000113c, 0x00000000 }, | ||
3833 | { 0x0000117c, 0x00000000 }, | ||
3834 | { 0x000011bc, 0x00000000 }, | ||
3835 | { 0x000011fc, 0x00000000 }, | ||
3836 | { 0x0000123c, 0x00000000 }, | ||
3837 | { 0x0000127c, 0x00000000 }, | ||
3838 | { 0x000012bc, 0x00000000 }, | ||
3839 | { 0x000012fc, 0x00000000 }, | ||
3840 | { 0x0000133c, 0x00000000 }, | ||
3841 | { 0x0000137c, 0x00000000 }, | ||
3842 | { 0x000013bc, 0x00000000 }, | ||
3843 | { 0x000013fc, 0x00000000 }, | ||
3844 | { 0x0000143c, 0x00000000 }, | ||
3845 | { 0x0000147c, 0x00000000 }, | ||
3846 | { 0x00004030, 0x00000002 }, | ||
3847 | { 0x0000403c, 0x00000002 }, | ||
3848 | { 0x00004024, 0x0000001f }, | ||
3849 | { 0x00004060, 0x00000000 }, | ||
3850 | { 0x00004064, 0x00000000 }, | ||
3851 | { 0x00007010, 0x00000031 }, | ||
3852 | { 0x00007034, 0x00000002 }, | ||
3853 | { 0x00007038, 0x000004c2 }, | ||
3854 | { 0x00008004, 0x00000000 }, | ||
3855 | { 0x00008008, 0x00000000 }, | ||
3856 | { 0x0000800c, 0x00000000 }, | ||
3857 | { 0x00008018, 0x00000700 }, | ||
3858 | { 0x00008020, 0x00000000 }, | ||
3859 | { 0x00008038, 0x00000000 }, | ||
3860 | { 0x0000803c, 0x00000000 }, | ||
3861 | { 0x00008048, 0x00000000 }, | ||
3862 | { 0x00008054, 0x00000000 }, | ||
3863 | { 0x00008058, 0x00000000 }, | ||
3864 | { 0x0000805c, 0x000fc78f }, | ||
3865 | { 0x00008060, 0x0000000f }, | ||
3866 | { 0x00008064, 0x00000000 }, | ||
3867 | { 0x00008070, 0x00000000 }, | ||
3868 | { 0x000080c0, 0x2a80001a }, | ||
3869 | { 0x000080c4, 0x05dc01e0 }, | ||
3870 | { 0x000080c8, 0x1f402710 }, | ||
3871 | { 0x000080cc, 0x01f40000 }, | ||
3872 | { 0x000080d0, 0x00001e00 }, | ||
3873 | { 0x000080d4, 0x00000000 }, | ||
3874 | { 0x000080d8, 0x00400000 }, | ||
3875 | { 0x000080e0, 0xffffffff }, | ||
3876 | { 0x000080e4, 0x0000ffff }, | ||
3877 | { 0x000080e8, 0x003f3f3f }, | ||
3878 | { 0x000080ec, 0x00000000 }, | ||
3879 | { 0x000080f0, 0x00000000 }, | ||
3880 | { 0x000080f4, 0x00000000 }, | ||
3881 | { 0x000080f8, 0x00000000 }, | ||
3882 | { 0x000080fc, 0x00020000 }, | ||
3883 | { 0x00008100, 0x00020000 }, | ||
3884 | { 0x00008104, 0x00000001 }, | ||
3885 | { 0x00008108, 0x00000052 }, | ||
3886 | { 0x0000810c, 0x00000000 }, | ||
3887 | { 0x00008110, 0x00000168 }, | ||
3888 | { 0x00008118, 0x000100aa }, | ||
3889 | { 0x0000811c, 0x00003210 }, | ||
3890 | { 0x00008120, 0x08f04800 }, | ||
3891 | { 0x00008124, 0x00000000 }, | ||
3892 | { 0x00008128, 0x00000000 }, | ||
3893 | { 0x0000812c, 0x00000000 }, | ||
3894 | { 0x00008130, 0x00000000 }, | ||
3895 | { 0x00008134, 0x00000000 }, | ||
3896 | { 0x00008138, 0x00000000 }, | ||
3897 | { 0x0000813c, 0x00000000 }, | ||
3898 | { 0x00008144, 0x00000000 }, | ||
3899 | { 0x00008168, 0x00000000 }, | ||
3900 | { 0x0000816c, 0x00000000 }, | ||
3901 | { 0x00008170, 0x32143320 }, | ||
3902 | { 0x00008174, 0xfaa4fa50 }, | ||
3903 | { 0x00008178, 0x00000100 }, | ||
3904 | { 0x0000817c, 0x00000000 }, | ||
3905 | { 0x000081c0, 0x00000000 }, | ||
3906 | { 0x000081d0, 0x00003210 }, | ||
3907 | { 0x000081ec, 0x00000000 }, | ||
3908 | { 0x000081f0, 0x00000000 }, | ||
3909 | { 0x000081f4, 0x00000000 }, | ||
3910 | { 0x000081f8, 0x00000000 }, | ||
3911 | { 0x000081fc, 0x00000000 }, | ||
3912 | { 0x00008200, 0x00000000 }, | ||
3913 | { 0x00008204, 0x00000000 }, | ||
3914 | { 0x00008208, 0x00000000 }, | ||
3915 | { 0x0000820c, 0x00000000 }, | ||
3916 | { 0x00008210, 0x00000000 }, | ||
3917 | { 0x00008214, 0x00000000 }, | ||
3918 | { 0x00008218, 0x00000000 }, | ||
3919 | { 0x0000821c, 0x00000000 }, | ||
3920 | { 0x00008220, 0x00000000 }, | ||
3921 | { 0x00008224, 0x00000000 }, | ||
3922 | { 0x00008228, 0x00000000 }, | ||
3923 | { 0x0000822c, 0x00000000 }, | ||
3924 | { 0x00008230, 0x00000000 }, | ||
3925 | { 0x00008234, 0x00000000 }, | ||
3926 | { 0x00008238, 0x00000000 }, | ||
3927 | { 0x0000823c, 0x00000000 }, | ||
3928 | { 0x00008240, 0x00100000 }, | ||
3929 | { 0x00008244, 0x0010f400 }, | ||
3930 | { 0x00008248, 0x00000100 }, | ||
3931 | { 0x0000824c, 0x0001e800 }, | ||
3932 | { 0x00008250, 0x00000000 }, | ||
3933 | { 0x00008254, 0x00000000 }, | ||
3934 | { 0x00008258, 0x00000000 }, | ||
3935 | { 0x0000825c, 0x400000ff }, | ||
3936 | { 0x00008260, 0x00080922 }, | ||
3937 | { 0x00008264, 0xa8a00010 }, | ||
3938 | { 0x00008270, 0x00000000 }, | ||
3939 | { 0x00008274, 0x40000000 }, | ||
3940 | { 0x00008278, 0x003e4180 }, | ||
3941 | { 0x0000827c, 0x00000000 }, | ||
3942 | { 0x00008284, 0x0000002c }, | ||
3943 | { 0x00008288, 0x0000002c }, | ||
3944 | { 0x0000828c, 0x00000000 }, | ||
3945 | { 0x00008294, 0x00000000 }, | ||
3946 | { 0x00008298, 0x00000000 }, | ||
3947 | { 0x0000829c, 0x00000000 }, | ||
3948 | { 0x00008300, 0x00000040 }, | ||
3949 | { 0x00008314, 0x00000000 }, | ||
3950 | { 0x00008328, 0x00000000 }, | ||
3951 | { 0x0000832c, 0x00000001 }, | ||
3952 | { 0x00008330, 0x00000302 }, | ||
3953 | { 0x00008334, 0x00000e00 }, | ||
3954 | { 0x00008338, 0x00000000 }, | ||
3955 | { 0x0000833c, 0x00000000 }, | ||
3956 | { 0x00008340, 0x00010380 }, | ||
3957 | { 0x00008344, 0x00581043 }, | ||
3958 | { 0x00009808, 0x00000000 }, | ||
3959 | { 0x0000980c, 0xafe68e30 }, | ||
3960 | { 0x00009810, 0xfd14e000 }, | ||
3961 | { 0x00009814, 0x9c0a9f6b }, | ||
3962 | { 0x0000981c, 0x00000000 }, | ||
3963 | { 0x0000982c, 0x0000a000 }, | ||
3964 | { 0x00009830, 0x00000000 }, | ||
3965 | { 0x0000983c, 0x00200400 }, | ||
3966 | { 0x0000984c, 0x0040233c }, | ||
3967 | { 0x00009854, 0x00000044 }, | ||
3968 | { 0x00009900, 0x00000000 }, | ||
3969 | { 0x00009904, 0x00000000 }, | ||
3970 | { 0x00009908, 0x00000000 }, | ||
3971 | { 0x0000990c, 0x00000000 }, | ||
3972 | { 0x00009910, 0x01002310 }, | ||
3973 | { 0x0000991c, 0x10000fff }, | ||
3974 | { 0x00009920, 0x04900000 }, | ||
3975 | { 0x00009928, 0x00000001 }, | ||
3976 | { 0x0000992c, 0x00000004 }, | ||
3977 | { 0x00009934, 0x1e1f2022 }, | ||
3978 | { 0x00009938, 0x0a0b0c0d }, | ||
3979 | { 0x0000993c, 0x00000000 }, | ||
3980 | { 0x00009940, 0x14750604 }, | ||
3981 | { 0x00009948, 0x9280c00a }, | ||
3982 | { 0x0000994c, 0x00020028 }, | ||
3983 | { 0x00009954, 0x5f3ca3de }, | ||
3984 | { 0x00009958, 0x2108ecff }, | ||
3985 | { 0x00009968, 0x000003ce }, | ||
3986 | { 0x00009970, 0x1927b515 }, | ||
3987 | { 0x00009974, 0x00000000 }, | ||
3988 | { 0x00009978, 0x00000001 }, | ||
3989 | { 0x0000997c, 0x00000000 }, | ||
3990 | { 0x00009980, 0x00000000 }, | ||
3991 | { 0x00009984, 0x00000000 }, | ||
3992 | { 0x00009988, 0x00000000 }, | ||
3993 | { 0x0000998c, 0x00000000 }, | ||
3994 | { 0x00009990, 0x00000000 }, | ||
3995 | { 0x00009994, 0x00000000 }, | ||
3996 | { 0x00009998, 0x00000000 }, | ||
3997 | { 0x0000999c, 0x00000000 }, | ||
3998 | { 0x000099a0, 0x00000000 }, | ||
3999 | { 0x000099a4, 0x00000001 }, | ||
4000 | { 0x000099a8, 0x201fff00 }, | ||
4001 | { 0x000099ac, 0x2def0a00 }, | ||
4002 | { 0x000099b0, 0x03051000 }, | ||
4003 | { 0x000099b4, 0x00000820 }, | ||
4004 | { 0x000099dc, 0x00000000 }, | ||
4005 | { 0x000099e0, 0x00000000 }, | ||
4006 | { 0x000099e4, 0xaaaaaaaa }, | ||
4007 | { 0x000099e8, 0x3c466478 }, | ||
4008 | { 0x000099ec, 0x0cc80caa }, | ||
4009 | { 0x000099f0, 0x00000000 }, | ||
4010 | { 0x0000a208, 0x803e6788 }, | ||
4011 | { 0x0000a210, 0x4080a333 }, | ||
4012 | { 0x0000a214, 0x00206c10 }, | ||
4013 | { 0x0000a218, 0x009c4060 }, | ||
4014 | { 0x0000a220, 0x01834061 }, | ||
4015 | { 0x0000a224, 0x00000400 }, | ||
4016 | { 0x0000a228, 0x000003b5 }, | ||
4017 | { 0x0000a22c, 0x00000000 }, | ||
4018 | { 0x0000a234, 0x20202020 }, | ||
4019 | { 0x0000a238, 0x20202020 }, | ||
4020 | { 0x0000a244, 0x00000000 }, | ||
4021 | { 0x0000a248, 0xfffffffc }, | ||
4022 | { 0x0000a24c, 0x00000000 }, | ||
4023 | { 0x0000a254, 0x00000000 }, | ||
4024 | { 0x0000a258, 0x0ccb5380 }, | ||
4025 | { 0x0000a25c, 0x15151501 }, | ||
4026 | { 0x0000a260, 0xdfa90f01 }, | ||
4027 | { 0x0000a268, 0x00000000 }, | ||
4028 | { 0x0000a26c, 0x0ebae9e6 }, | ||
4029 | { 0x0000d270, 0x0d820820 }, | ||
4030 | { 0x0000a278, 0x39ce739c }, | ||
4031 | { 0x0000a27c, 0x050e039c }, | ||
4032 | { 0x0000d35c, 0x07ffffef }, | ||
4033 | { 0x0000d360, 0x0fffffe7 }, | ||
4034 | { 0x0000d364, 0x17ffffe5 }, | ||
4035 | { 0x0000d368, 0x1fffffe4 }, | ||
4036 | { 0x0000d36c, 0x37ffffe3 }, | ||
4037 | { 0x0000d370, 0x3fffffe3 }, | ||
4038 | { 0x0000d374, 0x57ffffe3 }, | ||
4039 | { 0x0000d378, 0x5fffffe2 }, | ||
4040 | { 0x0000d37c, 0x7fffffe2 }, | ||
4041 | { 0x0000d380, 0x7f3c7bba }, | ||
4042 | { 0x0000d384, 0xf3307ff0 }, | ||
4043 | { 0x0000a388, 0x0c000000 }, | ||
4044 | { 0x0000a38c, 0x20202020 }, | ||
4045 | { 0x0000a390, 0x20202020 }, | ||
4046 | { 0x0000a394, 0x39ce739c }, | ||
4047 | { 0x0000a398, 0x0000039c }, | ||
4048 | { 0x0000a39c, 0x00000001 }, | ||
4049 | { 0x0000a3a0, 0x00000000 }, | ||
4050 | { 0x0000a3a4, 0x00000000 }, | ||
4051 | { 0x0000a3a8, 0x00000000 }, | ||
4052 | { 0x0000a3ac, 0x00000000 }, | ||
4053 | { 0x0000a3b0, 0x00000000 }, | ||
4054 | { 0x0000a3b4, 0x00000000 }, | ||
4055 | { 0x0000a3b8, 0x00000000 }, | ||
4056 | { 0x0000a3bc, 0x00000000 }, | ||
4057 | { 0x0000a3c0, 0x00000000 }, | ||
4058 | { 0x0000a3c4, 0x00000000 }, | ||
4059 | { 0x0000a3cc, 0x20202020 }, | ||
4060 | { 0x0000a3d0, 0x20202020 }, | ||
4061 | { 0x0000a3d4, 0x20202020 }, | ||
4062 | { 0x0000a3dc, 0x39ce739c }, | ||
4063 | { 0x0000a3e0, 0x0000039c }, | ||
4064 | { 0x0000a3e4, 0x00000000 }, | ||
4065 | { 0x0000a3e8, 0x18c43433 }, | ||
4066 | { 0x0000a3ec, 0x00f70081 }, | ||
4067 | { 0x00007800, 0x00140000 }, | ||
4068 | { 0x00007804, 0x0e4548d8 }, | ||
4069 | { 0x00007808, 0x54214514 }, | ||
4070 | { 0x0000780c, 0x02025820 }, | ||
4071 | { 0x00007810, 0x71c0d388 }, | ||
4072 | { 0x00007814, 0x924934a8 }, | ||
4073 | { 0x0000781c, 0x00000000 }, | ||
4074 | { 0x00007820, 0x00000c04 }, | ||
4075 | { 0x00007824, 0x00d86fff }, | ||
4076 | { 0x00007828, 0x26d2491b }, | ||
4077 | { 0x0000782c, 0x6e36d97b }, | ||
4078 | { 0x00007830, 0xedb6d96c }, | ||
4079 | { 0x00007834, 0x71400086 }, | ||
4080 | { 0x00007838, 0xfac68800 }, | ||
4081 | { 0x0000783c, 0x0001fffe }, | ||
4082 | { 0x00007840, 0xffeb1a20 }, | ||
4083 | { 0x00007844, 0x000c0db6 }, | ||
4084 | { 0x00007848, 0x6db61b6f }, | ||
4085 | { 0x0000784c, 0x6d9b66db }, | ||
4086 | { 0x00007850, 0x6d8c6dba }, | ||
4087 | { 0x00007854, 0x00040000 }, | ||
4088 | { 0x00007858, 0xdb003012 }, | ||
4089 | { 0x0000785c, 0x04924914 }, | ||
4090 | { 0x00007860, 0x21084210 }, | ||
4091 | { 0x00007864, 0xf7d7ffde }, | ||
4092 | { 0x00007868, 0xc2034080 }, | ||
4093 | { 0x0000786c, 0x48609eb4 }, | ||
4094 | { 0x00007870, 0x10142c00 }, | ||
4095 | }; | ||
4096 | |||
4097 | static const u_int32_t ar9285PciePhy_clkreq_always_on_L1_9285[][2] = { | ||
4098 | {0x00004040, 0x9248fd00 }, | ||
4099 | {0x00004040, 0x24924924 }, | ||
4100 | {0x00004040, 0xa8000019 }, | ||
4101 | {0x00004040, 0x13160820 }, | ||
4102 | {0x00004040, 0xe5980560 }, | ||
4103 | {0x00004040, 0xc01dcffd }, | ||
4104 | {0x00004040, 0x1aaabe41 }, | ||
4105 | {0x00004040, 0xbe105554 }, | ||
4106 | {0x00004040, 0x00043007 }, | ||
4107 | {0x00004044, 0x00000000 }, | ||
4108 | }; | ||
4109 | |||
4110 | static const u_int32_t ar9285PciePhy_clkreq_off_L1_9285[][2] = { | ||
4111 | {0x00004040, 0x9248fd00 }, | ||
4112 | {0x00004040, 0x24924924 }, | ||
4113 | {0x00004040, 0xa8000019 }, | ||
4114 | {0x00004040, 0x13160820 }, | ||
4115 | {0x00004040, 0xe5980560 }, | ||
4116 | {0x00004040, 0xc01dcffc }, | ||
4117 | {0x00004040, 0x1aaabe41 }, | ||
4118 | {0x00004040, 0xbe105554 }, | ||
4119 | {0x00004040, 0x00043007 }, | ||
4120 | {0x00004044, 0x00000000 }, | ||
4121 | }; | ||
4122 | |||
4123 | static const u_int32_t ar9285Modes_9285_1_2[][6] = { | ||
4124 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, | ||
4125 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, | ||
4126 | { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, | ||
4127 | { 0x000010f0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000008 }, | ||
4128 | { 0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00, 0x06e006e0 }, | ||
4129 | { 0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b, 0x0988004f }, | ||
4130 | { 0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440, 0x00006880 }, | ||
4131 | { 0x00009804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0x00000303 }, | ||
4132 | { 0x00009820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200 }, | ||
4133 | { 0x00009824, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
4134 | { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, | ||
4135 | { 0x00009834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
4136 | { 0x00009838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0x00000007 }, | ||
4137 | { 0x00009840, 0x206a012e, 0x206a012e, 0x206a012e, 0x206a012e, 0x206a012e }, | ||
4138 | { 0x00009844, 0x0372161e, 0x0372161e, 0x03720020, 0x03720020, 0x037216a0 }, | ||
4139 | { 0x00009848, 0x00001066, 0x00001066, 0x00000057, 0x00000057, 0x00001059 }, | ||
4140 | { 0x00009850, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2 }, | ||
4141 | { 0x00009858, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e }, | ||
4142 | { 0x0000985c, 0x3139605e, 0x3139605e, 0x3136605e, 0x3136605e, 0x3139605e }, | ||
4143 | { 0x00009860, 0x00058d18, 0x00058d18, 0x00058d20, 0x00058d20, 0x00058d18 }, | ||
4144 | { 0x00009864, 0x0000fe00, 0x0000fe00, 0x0001ce00, 0x0001ce00, 0x0001ce00 }, | ||
4145 | { 0x00009868, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0 }, | ||
4146 | { 0x0000986c, 0x06903081, 0x06903081, 0x06903881, 0x06903881, 0x06903881 }, | ||
4147 | { 0x00009914, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898, 0x000007d0 }, | ||
4148 | { 0x00009918, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b, 0x00000016 }, | ||
4149 | { 0x00009924, 0xd00a8007, 0xd00a8007, 0xd00a800d, 0xd00a800d, 0xd00a800d }, | ||
4150 | { 0x00009944, 0xffbc1010, 0xffbc1010, 0xffbc1020, 0xffbc1020, 0xffbc1010 }, | ||
4151 | { 0x00009960, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
4152 | { 0x00009964, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
4153 | { 0x000099b8, 0x0000421c, 0x0000421c, 0x0000421c, 0x0000421c, 0x0000421c }, | ||
4154 | { 0x000099bc, 0x00000600, 0x00000600, 0x00000c00, 0x00000c00, 0x00000c00 }, | ||
4155 | { 0x000099c0, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4 }, | ||
4156 | { 0x000099c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77 }, | ||
4157 | { 0x000099c8, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329 }, | ||
4158 | { 0x000099cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8 }, | ||
4159 | { 0x000099d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0x00046384 }, | ||
4160 | { 0x000099d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
4161 | { 0x000099d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
4162 | { 0x00009a00, 0x00000000, 0x00000000, 0x00068084, 0x00068084, 0x00000000 }, | ||
4163 | { 0x00009a04, 0x00000000, 0x00000000, 0x00068088, 0x00068088, 0x00000000 }, | ||
4164 | { 0x00009a08, 0x00000000, 0x00000000, 0x0006808c, 0x0006808c, 0x00000000 }, | ||
4165 | { 0x00009a0c, 0x00000000, 0x00000000, 0x00068100, 0x00068100, 0x00000000 }, | ||
4166 | { 0x00009a10, 0x00000000, 0x00000000, 0x00068104, 0x00068104, 0x00000000 }, | ||
4167 | { 0x00009a14, 0x00000000, 0x00000000, 0x00068108, 0x00068108, 0x00000000 }, | ||
4168 | { 0x00009a18, 0x00000000, 0x00000000, 0x0006810c, 0x0006810c, 0x00000000 }, | ||
4169 | { 0x00009a1c, 0x00000000, 0x00000000, 0x00068110, 0x00068110, 0x00000000 }, | ||
4170 | { 0x00009a20, 0x00000000, 0x00000000, 0x00068114, 0x00068114, 0x00000000 }, | ||
4171 | { 0x00009a24, 0x00000000, 0x00000000, 0x00068180, 0x00068180, 0x00000000 }, | ||
4172 | { 0x00009a28, 0x00000000, 0x00000000, 0x00068184, 0x00068184, 0x00000000 }, | ||
4173 | { 0x00009a2c, 0x00000000, 0x00000000, 0x00068188, 0x00068188, 0x00000000 }, | ||
4174 | { 0x00009a30, 0x00000000, 0x00000000, 0x0006818c, 0x0006818c, 0x00000000 }, | ||
4175 | { 0x00009a34, 0x00000000, 0x00000000, 0x00068190, 0x00068190, 0x00000000 }, | ||
4176 | { 0x00009a38, 0x00000000, 0x00000000, 0x00068194, 0x00068194, 0x00000000 }, | ||
4177 | { 0x00009a3c, 0x00000000, 0x00000000, 0x000681a0, 0x000681a0, 0x00000000 }, | ||
4178 | { 0x00009a40, 0x00000000, 0x00000000, 0x0006820c, 0x0006820c, 0x00000000 }, | ||
4179 | { 0x00009a44, 0x00000000, 0x00000000, 0x000681a8, 0x000681a8, 0x00000000 }, | ||
4180 | { 0x00009a48, 0x00000000, 0x00000000, 0x00068284, 0x00068284, 0x00000000 }, | ||
4181 | { 0x00009a4c, 0x00000000, 0x00000000, 0x00068288, 0x00068288, 0x00000000 }, | ||
4182 | { 0x00009a50, 0x00000000, 0x00000000, 0x00068220, 0x00068220, 0x00000000 }, | ||
4183 | { 0x00009a54, 0x00000000, 0x00000000, 0x00068290, 0x00068290, 0x00000000 }, | ||
4184 | { 0x00009a58, 0x00000000, 0x00000000, 0x00068300, 0x00068300, 0x00000000 }, | ||
4185 | { 0x00009a5c, 0x00000000, 0x00000000, 0x00068304, 0x00068304, 0x00000000 }, | ||
4186 | { 0x00009a60, 0x00000000, 0x00000000, 0x00068308, 0x00068308, 0x00000000 }, | ||
4187 | { 0x00009a64, 0x00000000, 0x00000000, 0x0006830c, 0x0006830c, 0x00000000 }, | ||
4188 | { 0x00009a68, 0x00000000, 0x00000000, 0x00068380, 0x00068380, 0x00000000 }, | ||
4189 | { 0x00009a6c, 0x00000000, 0x00000000, 0x00068384, 0x00068384, 0x00000000 }, | ||
4190 | { 0x00009a70, 0x00000000, 0x00000000, 0x00068700, 0x00068700, 0x00000000 }, | ||
4191 | { 0x00009a74, 0x00000000, 0x00000000, 0x00068704, 0x00068704, 0x00000000 }, | ||
4192 | { 0x00009a78, 0x00000000, 0x00000000, 0x00068708, 0x00068708, 0x00000000 }, | ||
4193 | { 0x00009a7c, 0x00000000, 0x00000000, 0x0006870c, 0x0006870c, 0x00000000 }, | ||
4194 | { 0x00009a80, 0x00000000, 0x00000000, 0x00068780, 0x00068780, 0x00000000 }, | ||
4195 | { 0x00009a84, 0x00000000, 0x00000000, 0x00068784, 0x00068784, 0x00000000 }, | ||
4196 | { 0x00009a88, 0x00000000, 0x00000000, 0x00068b04, 0x00068b04, 0x00000000 }, | ||
4197 | { 0x00009a8c, 0x00000000, 0x00000000, 0x00068b08, 0x00068b08, 0x00000000 }, | ||
4198 | { 0x00009a90, 0x00000000, 0x00000000, 0x00068b08, 0x00068b08, 0x00000000 }, | ||
4199 | { 0x00009a94, 0x00000000, 0x00000000, 0x00068b0c, 0x00068b0c, 0x00000000 }, | ||
4200 | { 0x00009a98, 0x00000000, 0x00000000, 0x00068b80, 0x00068b80, 0x00000000 }, | ||
4201 | { 0x00009a9c, 0x00000000, 0x00000000, 0x00068b84, 0x00068b84, 0x00000000 }, | ||
4202 | { 0x00009aa0, 0x00000000, 0x00000000, 0x00068b88, 0x00068b88, 0x00000000 }, | ||
4203 | { 0x00009aa4, 0x00000000, 0x00000000, 0x00068b8c, 0x00068b8c, 0x00000000 }, | ||
4204 | { 0x00009aa8, 0x00000000, 0x00000000, 0x000b8b90, 0x000b8b90, 0x00000000 }, | ||
4205 | { 0x00009aac, 0x00000000, 0x00000000, 0x000b8f80, 0x000b8f80, 0x00000000 }, | ||
4206 | { 0x00009ab0, 0x00000000, 0x00000000, 0x000b8f84, 0x000b8f84, 0x00000000 }, | ||
4207 | { 0x00009ab4, 0x00000000, 0x00000000, 0x000b8f88, 0x000b8f88, 0x00000000 }, | ||
4208 | { 0x00009ab8, 0x00000000, 0x00000000, 0x000b8f8c, 0x000b8f8c, 0x00000000 }, | ||
4209 | { 0x00009abc, 0x00000000, 0x00000000, 0x000b8f90, 0x000b8f90, 0x00000000 }, | ||
4210 | { 0x00009ac0, 0x00000000, 0x00000000, 0x000bb30c, 0x000bb30c, 0x00000000 }, | ||
4211 | { 0x00009ac4, 0x00000000, 0x00000000, 0x000bb310, 0x000bb310, 0x00000000 }, | ||
4212 | { 0x00009ac8, 0x00000000, 0x00000000, 0x000bb384, 0x000bb384, 0x00000000 }, | ||
4213 | { 0x00009acc, 0x00000000, 0x00000000, 0x000bb388, 0x000bb388, 0x00000000 }, | ||
4214 | { 0x00009ad0, 0x00000000, 0x00000000, 0x000bb324, 0x000bb324, 0x00000000 }, | ||
4215 | { 0x00009ad4, 0x00000000, 0x00000000, 0x000bb704, 0x000bb704, 0x00000000 }, | ||
4216 | { 0x00009ad8, 0x00000000, 0x00000000, 0x000f96a4, 0x000f96a4, 0x00000000 }, | ||
4217 | { 0x00009adc, 0x00000000, 0x00000000, 0x000f96a8, 0x000f96a8, 0x00000000 }, | ||
4218 | { 0x00009ae0, 0x00000000, 0x00000000, 0x000f9710, 0x000f9710, 0x00000000 }, | ||
4219 | { 0x00009ae4, 0x00000000, 0x00000000, 0x000f9714, 0x000f9714, 0x00000000 }, | ||
4220 | { 0x00009ae8, 0x00000000, 0x00000000, 0x000f9720, 0x000f9720, 0x00000000 }, | ||
4221 | { 0x00009aec, 0x00000000, 0x00000000, 0x000f9724, 0x000f9724, 0x00000000 }, | ||
4222 | { 0x00009af0, 0x00000000, 0x00000000, 0x000f9728, 0x000f9728, 0x00000000 }, | ||
4223 | { 0x00009af4, 0x00000000, 0x00000000, 0x000f972c, 0x000f972c, 0x00000000 }, | ||
4224 | { 0x00009af8, 0x00000000, 0x00000000, 0x000f97a0, 0x000f97a0, 0x00000000 }, | ||
4225 | { 0x00009afc, 0x00000000, 0x00000000, 0x000f97a4, 0x000f97a4, 0x00000000 }, | ||
4226 | { 0x00009b00, 0x00000000, 0x00000000, 0x000fb7a8, 0x000fb7a8, 0x00000000 }, | ||
4227 | { 0x00009b04, 0x00000000, 0x00000000, 0x000fb7b0, 0x000fb7b0, 0x00000000 }, | ||
4228 | { 0x00009b08, 0x00000000, 0x00000000, 0x000fb7b4, 0x000fb7b4, 0x00000000 }, | ||
4229 | { 0x00009b0c, 0x00000000, 0x00000000, 0x000fb7b8, 0x000fb7b8, 0x00000000 }, | ||
4230 | { 0x00009b10, 0x00000000, 0x00000000, 0x000fb7a5, 0x000fb7a5, 0x00000000 }, | ||
4231 | { 0x00009b14, 0x00000000, 0x00000000, 0x000fb7a9, 0x000fb7a9, 0x00000000 }, | ||
4232 | { 0x00009b18, 0x00000000, 0x00000000, 0x000fb7ad, 0x000fb7ad, 0x00000000 }, | ||
4233 | { 0x00009b1c, 0x00000000, 0x00000000, 0x000fb7b1, 0x000fb7b1, 0x00000000 }, | ||
4234 | { 0x00009b20, 0x00000000, 0x00000000, 0x000fb7b5, 0x000fb7b5, 0x00000000 }, | ||
4235 | { 0x00009b24, 0x00000000, 0x00000000, 0x000fb7b9, 0x000fb7b9, 0x00000000 }, | ||
4236 | { 0x00009b28, 0x00000000, 0x00000000, 0x000fb7c5, 0x000fb7c5, 0x00000000 }, | ||
4237 | { 0x00009b2c, 0x00000000, 0x00000000, 0x000fb7c9, 0x000fb7c9, 0x00000000 }, | ||
4238 | { 0x00009b30, 0x00000000, 0x00000000, 0x000fb7d1, 0x000fb7d1, 0x00000000 }, | ||
4239 | { 0x00009b34, 0x00000000, 0x00000000, 0x000fb7d5, 0x000fb7d5, 0x00000000 }, | ||
4240 | { 0x00009b38, 0x00000000, 0x00000000, 0x000fb7d9, 0x000fb7d9, 0x00000000 }, | ||
4241 | { 0x00009b3c, 0x00000000, 0x00000000, 0x000fb7c6, 0x000fb7c6, 0x00000000 }, | ||
4242 | { 0x00009b40, 0x00000000, 0x00000000, 0x000fb7ca, 0x000fb7ca, 0x00000000 }, | ||
4243 | { 0x00009b44, 0x00000000, 0x00000000, 0x000fb7ce, 0x000fb7ce, 0x00000000 }, | ||
4244 | { 0x00009b48, 0x00000000, 0x00000000, 0x000fb7d2, 0x000fb7d2, 0x00000000 }, | ||
4245 | { 0x00009b4c, 0x00000000, 0x00000000, 0x000fb7d6, 0x000fb7d6, 0x00000000 }, | ||
4246 | { 0x00009b50, 0x00000000, 0x00000000, 0x000fb7c3, 0x000fb7c3, 0x00000000 }, | ||
4247 | { 0x00009b54, 0x00000000, 0x00000000, 0x000fb7c7, 0x000fb7c7, 0x00000000 }, | ||
4248 | { 0x00009b58, 0x00000000, 0x00000000, 0x000fb7cb, 0x000fb7cb, 0x00000000 }, | ||
4249 | { 0x00009b5c, 0x00000000, 0x00000000, 0x000fb7cf, 0x000fb7cf, 0x00000000 }, | ||
4250 | { 0x00009b60, 0x00000000, 0x00000000, 0x000fb7d7, 0x000fb7d7, 0x00000000 }, | ||
4251 | { 0x00009b64, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4252 | { 0x00009b68, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4253 | { 0x00009b6c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4254 | { 0x00009b70, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4255 | { 0x00009b74, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4256 | { 0x00009b78, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4257 | { 0x00009b7c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4258 | { 0x00009b80, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4259 | { 0x00009b84, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4260 | { 0x00009b88, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4261 | { 0x00009b8c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4262 | { 0x00009b90, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4263 | { 0x00009b94, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4264 | { 0x00009b98, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4265 | { 0x00009b9c, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4266 | { 0x00009ba0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4267 | { 0x00009ba4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4268 | { 0x00009ba8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4269 | { 0x00009bac, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4270 | { 0x00009bb0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4271 | { 0x00009bb4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4272 | { 0x00009bb8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4273 | { 0x00009bbc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4274 | { 0x00009bc0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4275 | { 0x00009bc4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4276 | { 0x00009bc8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4277 | { 0x00009bcc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4278 | { 0x00009bd0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4279 | { 0x00009bd4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4280 | { 0x00009bd8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4281 | { 0x00009bdc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4282 | { 0x00009be0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4283 | { 0x00009be4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4284 | { 0x00009be8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4285 | { 0x00009bec, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4286 | { 0x00009bf0, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4287 | { 0x00009bf4, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4288 | { 0x00009bf8, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4289 | { 0x00009bfc, 0x00000000, 0x00000000, 0x000fb7db, 0x000fb7db, 0x00000000 }, | ||
4290 | { 0x0000aa00, 0x00000000, 0x00000000, 0x0006801c, 0x0006801c, 0x00000000 }, | ||
4291 | { 0x0000aa04, 0x00000000, 0x00000000, 0x0006801c, 0x0006801c, 0x00000000 }, | ||
4292 | { 0x0000aa08, 0x00000000, 0x00000000, 0x0006801c, 0x0006801c, 0x00000000 }, | ||
4293 | { 0x0000aa0c, 0x00000000, 0x00000000, 0x00068080, 0x00068080, 0x00000000 }, | ||
4294 | { 0x0000aa10, 0x00000000, 0x00000000, 0x00068084, 0x00068084, 0x00000000 }, | ||
4295 | { 0x0000aa14, 0x00000000, 0x00000000, 0x00068088, 0x00068088, 0x00000000 }, | ||
4296 | { 0x0000aa18, 0x00000000, 0x00000000, 0x0006808c, 0x0006808c, 0x00000000 }, | ||
4297 | { 0x0000aa1c, 0x00000000, 0x00000000, 0x00068100, 0x00068100, 0x00000000 }, | ||
4298 | { 0x0000aa20, 0x00000000, 0x00000000, 0x00068104, 0x00068104, 0x00000000 }, | ||
4299 | { 0x0000aa24, 0x00000000, 0x00000000, 0x00068108, 0x00068108, 0x00000000 }, | ||
4300 | { 0x0000aa28, 0x00000000, 0x00000000, 0x0006810c, 0x0006810c, 0x00000000 }, | ||
4301 | { 0x0000aa2c, 0x00000000, 0x00000000, 0x00068110, 0x00068110, 0x00000000 }, | ||
4302 | { 0x0000aa30, 0x00000000, 0x00000000, 0x00068110, 0x00068110, 0x00000000 }, | ||
4303 | { 0x0000aa34, 0x00000000, 0x00000000, 0x00068180, 0x00068180, 0x00000000 }, | ||
4304 | { 0x0000aa38, 0x00000000, 0x00000000, 0x00068184, 0x00068184, 0x00000000 }, | ||
4305 | { 0x0000aa3c, 0x00000000, 0x00000000, 0x00068188, 0x00068188, 0x00000000 }, | ||
4306 | { 0x0000aa40, 0x00000000, 0x00000000, 0x0006818c, 0x0006818c, 0x00000000 }, | ||
4307 | { 0x0000aa44, 0x00000000, 0x00000000, 0x00068190, 0x00068190, 0x00000000 }, | ||
4308 | { 0x0000aa48, 0x00000000, 0x00000000, 0x00068194, 0x00068194, 0x00000000 }, | ||
4309 | { 0x0000aa4c, 0x00000000, 0x00000000, 0x000681a0, 0x000681a0, 0x00000000 }, | ||
4310 | { 0x0000aa50, 0x00000000, 0x00000000, 0x0006820c, 0x0006820c, 0x00000000 }, | ||
4311 | { 0x0000aa54, 0x00000000, 0x00000000, 0x000681a8, 0x000681a8, 0x00000000 }, | ||
4312 | { 0x0000aa58, 0x00000000, 0x00000000, 0x000681ac, 0x000681ac, 0x00000000 }, | ||
4313 | { 0x0000aa5c, 0x00000000, 0x00000000, 0x0006821c, 0x0006821c, 0x00000000 }, | ||
4314 | { 0x0000aa60, 0x00000000, 0x00000000, 0x00068224, 0x00068224, 0x00000000 }, | ||
4315 | { 0x0000aa64, 0x00000000, 0x00000000, 0x00068290, 0x00068290, 0x00000000 }, | ||
4316 | { 0x0000aa68, 0x00000000, 0x00000000, 0x00068300, 0x00068300, 0x00000000 }, | ||
4317 | { 0x0000aa6c, 0x00000000, 0x00000000, 0x00068308, 0x00068308, 0x00000000 }, | ||
4318 | { 0x0000aa70, 0x00000000, 0x00000000, 0x0006830c, 0x0006830c, 0x00000000 }, | ||
4319 | { 0x0000aa74, 0x00000000, 0x00000000, 0x00068310, 0x00068310, 0x00000000 }, | ||
4320 | { 0x0000aa78, 0x00000000, 0x00000000, 0x00068788, 0x00068788, 0x00000000 }, | ||
4321 | { 0x0000aa7c, 0x00000000, 0x00000000, 0x0006878c, 0x0006878c, 0x00000000 }, | ||
4322 | { 0x0000aa80, 0x00000000, 0x00000000, 0x00068790, 0x00068790, 0x00000000 }, | ||
4323 | { 0x0000aa84, 0x00000000, 0x00000000, 0x00068794, 0x00068794, 0x00000000 }, | ||
4324 | { 0x0000aa88, 0x00000000, 0x00000000, 0x00068798, 0x00068798, 0x00000000 }, | ||
4325 | { 0x0000aa8c, 0x00000000, 0x00000000, 0x0006879c, 0x0006879c, 0x00000000 }, | ||
4326 | { 0x0000aa90, 0x00000000, 0x00000000, 0x00068b89, 0x00068b89, 0x00000000 }, | ||
4327 | { 0x0000aa94, 0x00000000, 0x00000000, 0x00068b8d, 0x00068b8d, 0x00000000 }, | ||
4328 | { 0x0000aa98, 0x00000000, 0x00000000, 0x00068b91, 0x00068b91, 0x00000000 }, | ||
4329 | { 0x0000aa9c, 0x00000000, 0x00000000, 0x00068b95, 0x00068b95, 0x00000000 }, | ||
4330 | { 0x0000aaa0, 0x00000000, 0x00000000, 0x00068b99, 0x00068b99, 0x00000000 }, | ||
4331 | { 0x0000aaa4, 0x00000000, 0x00000000, 0x00068ba5, 0x00068ba5, 0x00000000 }, | ||
4332 | { 0x0000aaa8, 0x00000000, 0x00000000, 0x00068ba9, 0x00068ba9, 0x00000000 }, | ||
4333 | { 0x0000aaac, 0x00000000, 0x00000000, 0x00068bad, 0x00068bad, 0x00000000 }, | ||
4334 | { 0x0000aab0, 0x00000000, 0x00000000, 0x000b8b0c, 0x000b8b0c, 0x00000000 }, | ||
4335 | { 0x0000aab4, 0x00000000, 0x00000000, 0x000b8f10, 0x000b8f10, 0x00000000 }, | ||
4336 | { 0x0000aab8, 0x00000000, 0x00000000, 0x000b8f14, 0x000b8f14, 0x00000000 }, | ||
4337 | { 0x0000aabc, 0x00000000, 0x00000000, 0x000b8f84, 0x000b8f84, 0x00000000 }, | ||
4338 | { 0x0000aac0, 0x00000000, 0x00000000, 0x000b8f84, 0x000b8f84, 0x00000000 }, | ||
4339 | { 0x0000aac4, 0x00000000, 0x00000000, 0x000b8f88, 0x000b8f88, 0x00000000 }, | ||
4340 | { 0x0000aac8, 0x00000000, 0x00000000, 0x000bb380, 0x000bb380, 0x00000000 }, | ||
4341 | { 0x0000aacc, 0x00000000, 0x00000000, 0x000bb384, 0x000bb384, 0x00000000 }, | ||
4342 | { 0x0000aad0, 0x00000000, 0x00000000, 0x000bb388, 0x000bb388, 0x00000000 }, | ||
4343 | { 0x0000aad4, 0x00000000, 0x00000000, 0x000bb38c, 0x000bb38c, 0x00000000 }, | ||
4344 | { 0x0000aad8, 0x00000000, 0x00000000, 0x000bb394, 0x000bb394, 0x00000000 }, | ||
4345 | { 0x0000aadc, 0x00000000, 0x00000000, 0x000bb798, 0x000bb798, 0x00000000 }, | ||
4346 | { 0x0000aae0, 0x00000000, 0x00000000, 0x000f970c, 0x000f970c, 0x00000000 }, | ||
4347 | { 0x0000aae4, 0x00000000, 0x00000000, 0x000f9710, 0x000f9710, 0x00000000 }, | ||
4348 | { 0x0000aae8, 0x00000000, 0x00000000, 0x000f9714, 0x000f9714, 0x00000000 }, | ||
4349 | { 0x0000aaec, 0x00000000, 0x00000000, 0x000f9718, 0x000f9718, 0x00000000 }, | ||
4350 | { 0x0000aaf0, 0x00000000, 0x00000000, 0x000f9705, 0x000f9705, 0x00000000 }, | ||
4351 | { 0x0000aaf4, 0x00000000, 0x00000000, 0x000f9709, 0x000f9709, 0x00000000 }, | ||
4352 | { 0x0000aaf8, 0x00000000, 0x00000000, 0x000f970d, 0x000f970d, 0x00000000 }, | ||
4353 | { 0x0000aafc, 0x00000000, 0x00000000, 0x000f9711, 0x000f9711, 0x00000000 }, | ||
4354 | { 0x0000ab00, 0x00000000, 0x00000000, 0x000f9715, 0x000f9715, 0x00000000 }, | ||
4355 | { 0x0000ab04, 0x00000000, 0x00000000, 0x000f9719, 0x000f9719, 0x00000000 }, | ||
4356 | { 0x0000ab08, 0x00000000, 0x00000000, 0x000fb7a4, 0x000fb7a4, 0x00000000 }, | ||
4357 | { 0x0000ab0c, 0x00000000, 0x00000000, 0x000fb7a8, 0x000fb7a8, 0x00000000 }, | ||
4358 | { 0x0000ab10, 0x00000000, 0x00000000, 0x000fb7ac, 0x000fb7ac, 0x00000000 }, | ||
4359 | { 0x0000ab14, 0x00000000, 0x00000000, 0x000fb7ac, 0x000fb7ac, 0x00000000 }, | ||
4360 | { 0x0000ab18, 0x00000000, 0x00000000, 0x000fb7b0, 0x000fb7b0, 0x00000000 }, | ||
4361 | { 0x0000ab1c, 0x00000000, 0x00000000, 0x000fb7b8, 0x000fb7b8, 0x00000000 }, | ||
4362 | { 0x0000ab20, 0x00000000, 0x00000000, 0x000fb7bc, 0x000fb7bc, 0x00000000 }, | ||
4363 | { 0x0000ab24, 0x00000000, 0x00000000, 0x000fb7a1, 0x000fb7a1, 0x00000000 }, | ||
4364 | { 0x0000ab28, 0x00000000, 0x00000000, 0x000fb7a5, 0x000fb7a5, 0x00000000 }, | ||
4365 | { 0x0000ab2c, 0x00000000, 0x00000000, 0x000fb7a9, 0x000fb7a9, 0x00000000 }, | ||
4366 | { 0x0000ab30, 0x00000000, 0x00000000, 0x000fb7b1, 0x000fb7b1, 0x00000000 }, | ||
4367 | { 0x0000ab34, 0x00000000, 0x00000000, 0x000fb7b5, 0x000fb7b5, 0x00000000 }, | ||
4368 | { 0x0000ab38, 0x00000000, 0x00000000, 0x000fb7bd, 0x000fb7bd, 0x00000000 }, | ||
4369 | { 0x0000ab3c, 0x00000000, 0x00000000, 0x000fb7c9, 0x000fb7c9, 0x00000000 }, | ||
4370 | { 0x0000ab40, 0x00000000, 0x00000000, 0x000fb7cd, 0x000fb7cd, 0x00000000 }, | ||
4371 | { 0x0000ab44, 0x00000000, 0x00000000, 0x000fb7d1, 0x000fb7d1, 0x00000000 }, | ||
4372 | { 0x0000ab48, 0x00000000, 0x00000000, 0x000fb7d9, 0x000fb7d9, 0x00000000 }, | ||
4373 | { 0x0000ab4c, 0x00000000, 0x00000000, 0x000fb7c2, 0x000fb7c2, 0x00000000 }, | ||
4374 | { 0x0000ab50, 0x00000000, 0x00000000, 0x000fb7c6, 0x000fb7c6, 0x00000000 }, | ||
4375 | { 0x0000ab54, 0x00000000, 0x00000000, 0x000fb7ca, 0x000fb7ca, 0x00000000 }, | ||
4376 | { 0x0000ab58, 0x00000000, 0x00000000, 0x000fb7ce, 0x000fb7ce, 0x00000000 }, | ||
4377 | { 0x0000ab5c, 0x00000000, 0x00000000, 0x000fb7d2, 0x000fb7d2, 0x00000000 }, | ||
4378 | { 0x0000ab60, 0x00000000, 0x00000000, 0x000fb7d6, 0x000fb7d6, 0x00000000 }, | ||
4379 | { 0x0000ab64, 0x00000000, 0x00000000, 0x000fb7c3, 0x000fb7c3, 0x00000000 }, | ||
4380 | { 0x0000ab68, 0x00000000, 0x00000000, 0x000fb7cb, 0x000fb7cb, 0x00000000 }, | ||
4381 | { 0x0000ab6c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4382 | { 0x0000ab70, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4383 | { 0x0000ab74, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4384 | { 0x0000ab78, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4385 | { 0x0000ab7c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4386 | { 0x0000ab80, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4387 | { 0x0000ab84, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4388 | { 0x0000ab88, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4389 | { 0x0000ab8c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4390 | { 0x0000ab90, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4391 | { 0x0000ab94, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4392 | { 0x0000ab98, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4393 | { 0x0000ab9c, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4394 | { 0x0000aba0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4395 | { 0x0000aba4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4396 | { 0x0000aba8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4397 | { 0x0000abac, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4398 | { 0x0000abb0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4399 | { 0x0000abb4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4400 | { 0x0000abb8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4401 | { 0x0000abbc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4402 | { 0x0000abc0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4403 | { 0x0000abc4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4404 | { 0x0000abc8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4405 | { 0x0000abcc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4406 | { 0x0000abd0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4407 | { 0x0000abd4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4408 | { 0x0000abd8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4409 | { 0x0000abdc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4410 | { 0x0000abe0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4411 | { 0x0000abe4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4412 | { 0x0000abe8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4413 | { 0x0000abec, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4414 | { 0x0000abf0, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4415 | { 0x0000abf4, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4416 | { 0x0000abf8, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4417 | { 0x0000abfc, 0x00000000, 0x00000000, 0x000fb7d3, 0x000fb7d3, 0x00000000 }, | ||
4418 | { 0x0000a204, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0x00000004 }, | ||
4419 | { 0x0000a20c, 0x00000014, 0x00000014, 0x00000000, 0x00000000, 0x0001f000 }, | ||
4420 | { 0x0000a21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a }, | ||
4421 | { 0x0000a230, 0x00000000, 0x00000000, 0x00000210, 0x00000108, 0x00000000 }, | ||
4422 | { 0x0000a250, 0x0004f000, 0x0004f000, 0x0004a000, 0x0004a000, 0x0004a000 }, | ||
4423 | { 0x0000a274, 0x0a81c652, 0x0a81c652, 0x0a820652, 0x0a820652, 0x0a82a652 }, | ||
4424 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
4425 | { 0x0000a304, 0x00000000, 0x00000000, 0x00007201, 0x00007201, 0x00000000 }, | ||
4426 | { 0x0000a308, 0x00000000, 0x00000000, 0x00010408, 0x00010408, 0x00000000 }, | ||
4427 | { 0x0000a30c, 0x00000000, 0x00000000, 0x0001860a, 0x0001860a, 0x00000000 }, | ||
4428 | { 0x0000a310, 0x00000000, 0x00000000, 0x00020818, 0x00020818, 0x00000000 }, | ||
4429 | { 0x0000a314, 0x00000000, 0x00000000, 0x00024858, 0x00024858, 0x00000000 }, | ||
4430 | { 0x0000a318, 0x00000000, 0x00000000, 0x00026859, 0x00026859, 0x00000000 }, | ||
4431 | { 0x0000a31c, 0x00000000, 0x00000000, 0x0002985b, 0x0002985b, 0x00000000 }, | ||
4432 | { 0x0000a320, 0x00000000, 0x00000000, 0x0002b89a, 0x0002b89a, 0x00000000 }, | ||
4433 | { 0x0000a324, 0x00000000, 0x00000000, 0x0002d89b, 0x0002d89b, 0x00000000 }, | ||
4434 | { 0x0000a328, 0x00000000, 0x00000000, 0x0002f89c, 0x0002f89c, 0x00000000 }, | ||
4435 | { 0x0000a32c, 0x00000000, 0x00000000, 0x0003189d, 0x0003189d, 0x00000000 }, | ||
4436 | { 0x0000a330, 0x00000000, 0x00000000, 0x0003389e, 0x0003389e, 0x00000000 }, | ||
4437 | { 0x0000a334, 0x00000000, 0x00000000, 0x000368de, 0x000368de, 0x00000000 }, | ||
4438 | { 0x0000a338, 0x00000000, 0x00000000, 0x0003891e, 0x0003891e, 0x00000000 }, | ||
4439 | { 0x0000a33c, 0x00000000, 0x00000000, 0x0003a95e, 0x0003a95e, 0x00000000 }, | ||
4440 | { 0x0000a340, 0x00000000, 0x00000000, 0x0003e9df, 0x0003e9df, 0x00000000 }, | ||
4441 | { 0x0000a344, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x0003e9df, 0x00000000 }, | ||
4442 | { 0x0000a358, 0x7999aa02, 0x7999aa02, 0x7999aa0e, 0x7999aa0e, 0x7999aa0e }, | ||
4443 | }; | ||
4444 | |||
4445 | static const u_int32_t ar9285Common_9285_1_2[][2] = { | ||
4446 | { 0x0000000c, 0x00000000 }, | ||
4447 | { 0x00000030, 0x00020045 }, | ||
4448 | { 0x00000034, 0x00000005 }, | ||
4449 | { 0x00000040, 0x00000000 }, | ||
4450 | { 0x00000044, 0x00000008 }, | ||
4451 | { 0x00000048, 0x00000008 }, | ||
4452 | { 0x0000004c, 0x00000010 }, | ||
4453 | { 0x00000050, 0x00000000 }, | ||
4454 | { 0x00000054, 0x0000001f }, | ||
4455 | { 0x00000800, 0x00000000 }, | ||
4456 | { 0x00000804, 0x00000000 }, | ||
4457 | { 0x00000808, 0x00000000 }, | ||
4458 | { 0x0000080c, 0x00000000 }, | ||
4459 | { 0x00000810, 0x00000000 }, | ||
4460 | { 0x00000814, 0x00000000 }, | ||
4461 | { 0x00000818, 0x00000000 }, | ||
4462 | { 0x0000081c, 0x00000000 }, | ||
4463 | { 0x00000820, 0x00000000 }, | ||
4464 | { 0x00000824, 0x00000000 }, | ||
4465 | { 0x00001040, 0x002ffc0f }, | ||
4466 | { 0x00001044, 0x002ffc0f }, | ||
4467 | { 0x00001048, 0x002ffc0f }, | ||
4468 | { 0x0000104c, 0x002ffc0f }, | ||
4469 | { 0x00001050, 0x002ffc0f }, | ||
4470 | { 0x00001054, 0x002ffc0f }, | ||
4471 | { 0x00001058, 0x002ffc0f }, | ||
4472 | { 0x0000105c, 0x002ffc0f }, | ||
4473 | { 0x00001060, 0x002ffc0f }, | ||
4474 | { 0x00001064, 0x002ffc0f }, | ||
4475 | { 0x00001230, 0x00000000 }, | ||
4476 | { 0x00001270, 0x00000000 }, | ||
4477 | { 0x00001038, 0x00000000 }, | ||
4478 | { 0x00001078, 0x00000000 }, | ||
4479 | { 0x000010b8, 0x00000000 }, | ||
4480 | { 0x000010f8, 0x00000000 }, | ||
4481 | { 0x00001138, 0x00000000 }, | ||
4482 | { 0x00001178, 0x00000000 }, | ||
4483 | { 0x000011b8, 0x00000000 }, | ||
4484 | { 0x000011f8, 0x00000000 }, | ||
4485 | { 0x00001238, 0x00000000 }, | ||
4486 | { 0x00001278, 0x00000000 }, | ||
4487 | { 0x000012b8, 0x00000000 }, | ||
4488 | { 0x000012f8, 0x00000000 }, | ||
4489 | { 0x00001338, 0x00000000 }, | ||
4490 | { 0x00001378, 0x00000000 }, | ||
4491 | { 0x000013b8, 0x00000000 }, | ||
4492 | { 0x000013f8, 0x00000000 }, | ||
4493 | { 0x00001438, 0x00000000 }, | ||
4494 | { 0x00001478, 0x00000000 }, | ||
4495 | { 0x000014b8, 0x00000000 }, | ||
4496 | { 0x000014f8, 0x00000000 }, | ||
4497 | { 0x00001538, 0x00000000 }, | ||
4498 | { 0x00001578, 0x00000000 }, | ||
4499 | { 0x000015b8, 0x00000000 }, | ||
4500 | { 0x000015f8, 0x00000000 }, | ||
4501 | { 0x00001638, 0x00000000 }, | ||
4502 | { 0x00001678, 0x00000000 }, | ||
4503 | { 0x000016b8, 0x00000000 }, | ||
4504 | { 0x000016f8, 0x00000000 }, | ||
4505 | { 0x00001738, 0x00000000 }, | ||
4506 | { 0x00001778, 0x00000000 }, | ||
4507 | { 0x000017b8, 0x00000000 }, | ||
4508 | { 0x000017f8, 0x00000000 }, | ||
4509 | { 0x0000103c, 0x00000000 }, | ||
4510 | { 0x0000107c, 0x00000000 }, | ||
4511 | { 0x000010bc, 0x00000000 }, | ||
4512 | { 0x000010fc, 0x00000000 }, | ||
4513 | { 0x0000113c, 0x00000000 }, | ||
4514 | { 0x0000117c, 0x00000000 }, | ||
4515 | { 0x000011bc, 0x00000000 }, | ||
4516 | { 0x000011fc, 0x00000000 }, | ||
4517 | { 0x0000123c, 0x00000000 }, | ||
4518 | { 0x0000127c, 0x00000000 }, | ||
4519 | { 0x000012bc, 0x00000000 }, | ||
4520 | { 0x000012fc, 0x00000000 }, | ||
4521 | { 0x0000133c, 0x00000000 }, | ||
4522 | { 0x0000137c, 0x00000000 }, | ||
4523 | { 0x000013bc, 0x00000000 }, | ||
4524 | { 0x000013fc, 0x00000000 }, | ||
4525 | { 0x0000143c, 0x00000000 }, | ||
4526 | { 0x0000147c, 0x00000000 }, | ||
4527 | { 0x00004030, 0x00000002 }, | ||
4528 | { 0x0000403c, 0x00000002 }, | ||
4529 | { 0x00004024, 0x0000001f }, | ||
4530 | { 0x00004060, 0x00000000 }, | ||
4531 | { 0x00004064, 0x00000000 }, | ||
4532 | { 0x00007010, 0x00000031 }, | ||
4533 | { 0x00007034, 0x00000002 }, | ||
4534 | { 0x00007038, 0x000004c2 }, | ||
4535 | { 0x00008004, 0x00000000 }, | ||
4536 | { 0x00008008, 0x00000000 }, | ||
4537 | { 0x0000800c, 0x00000000 }, | ||
4538 | { 0x00008018, 0x00000700 }, | ||
4539 | { 0x00008020, 0x00000000 }, | ||
4540 | { 0x00008038, 0x00000000 }, | ||
4541 | { 0x0000803c, 0x00000000 }, | ||
4542 | { 0x00008048, 0x00000000 }, | ||
4543 | { 0x00008054, 0x00000000 }, | ||
4544 | { 0x00008058, 0x00000000 }, | ||
4545 | { 0x0000805c, 0x000fc78f }, | ||
4546 | { 0x00008060, 0x0000000f }, | ||
4547 | { 0x00008064, 0x00000000 }, | ||
4548 | { 0x00008070, 0x00000000 }, | ||
4549 | { 0x000080c0, 0x2a80001a }, | ||
4550 | { 0x000080c4, 0x05dc01e0 }, | ||
4551 | { 0x000080c8, 0x1f402710 }, | ||
4552 | { 0x000080cc, 0x01f40000 }, | ||
4553 | { 0x000080d0, 0x00001e00 }, | ||
4554 | { 0x000080d4, 0x00000000 }, | ||
4555 | { 0x000080d8, 0x00400000 }, | ||
4556 | { 0x000080e0, 0xffffffff }, | ||
4557 | { 0x000080e4, 0x0000ffff }, | ||
4558 | { 0x000080e8, 0x003f3f3f }, | ||
4559 | { 0x000080ec, 0x00000000 }, | ||
4560 | { 0x000080f0, 0x00000000 }, | ||
4561 | { 0x000080f4, 0x00000000 }, | ||
4562 | { 0x000080f8, 0x00000000 }, | ||
4563 | { 0x000080fc, 0x00020000 }, | ||
4564 | { 0x00008100, 0x00020000 }, | ||
4565 | { 0x00008104, 0x00000001 }, | ||
4566 | { 0x00008108, 0x00000052 }, | ||
4567 | { 0x0000810c, 0x00000000 }, | ||
4568 | { 0x00008110, 0x00000168 }, | ||
4569 | { 0x00008118, 0x000100aa }, | ||
4570 | { 0x0000811c, 0x00003210 }, | ||
4571 | { 0x00008120, 0x08f04800 }, | ||
4572 | { 0x00008124, 0x00000000 }, | ||
4573 | { 0x00008128, 0x00000000 }, | ||
4574 | { 0x0000812c, 0x00000000 }, | ||
4575 | { 0x00008130, 0x00000000 }, | ||
4576 | { 0x00008134, 0x00000000 }, | ||
4577 | { 0x00008138, 0x00000000 }, | ||
4578 | { 0x0000813c, 0x00000000 }, | ||
4579 | { 0x00008144, 0xffffffff }, | ||
4580 | { 0x00008168, 0x00000000 }, | ||
4581 | { 0x0000816c, 0x00000000 }, | ||
4582 | { 0x00008170, 0x32143320 }, | ||
4583 | { 0x00008174, 0xfaa4fa50 }, | ||
4584 | { 0x00008178, 0x00000100 }, | ||
4585 | { 0x0000817c, 0x00000000 }, | ||
4586 | { 0x000081c0, 0x00000000 }, | ||
4587 | { 0x000081d0, 0x00003210 }, | ||
4588 | { 0x000081ec, 0x00000000 }, | ||
4589 | { 0x000081f0, 0x00000000 }, | ||
4590 | { 0x000081f4, 0x00000000 }, | ||
4591 | { 0x000081f8, 0x00000000 }, | ||
4592 | { 0x000081fc, 0x00000000 }, | ||
4593 | { 0x00008200, 0x00000000 }, | ||
4594 | { 0x00008204, 0x00000000 }, | ||
4595 | { 0x00008208, 0x00000000 }, | ||
4596 | { 0x0000820c, 0x00000000 }, | ||
4597 | { 0x00008210, 0x00000000 }, | ||
4598 | { 0x00008214, 0x00000000 }, | ||
4599 | { 0x00008218, 0x00000000 }, | ||
4600 | { 0x0000821c, 0x00000000 }, | ||
4601 | { 0x00008220, 0x00000000 }, | ||
4602 | { 0x00008224, 0x00000000 }, | ||
4603 | { 0x00008228, 0x00000000 }, | ||
4604 | { 0x0000822c, 0x00000000 }, | ||
4605 | { 0x00008230, 0x00000000 }, | ||
4606 | { 0x00008234, 0x00000000 }, | ||
4607 | { 0x00008238, 0x00000000 }, | ||
4608 | { 0x0000823c, 0x00000000 }, | ||
4609 | { 0x00008240, 0x00100000 }, | ||
4610 | { 0x00008244, 0x0010f400 }, | ||
4611 | { 0x00008248, 0x00000100 }, | ||
4612 | { 0x0000824c, 0x0001e800 }, | ||
4613 | { 0x00008250, 0x00000000 }, | ||
4614 | { 0x00008254, 0x00000000 }, | ||
4615 | { 0x00008258, 0x00000000 }, | ||
4616 | { 0x0000825c, 0x400000ff }, | ||
4617 | { 0x00008260, 0x00080922 }, | ||
4618 | { 0x00008264, 0xa8a00010 }, | ||
4619 | { 0x00008270, 0x00000000 }, | ||
4620 | { 0x00008274, 0x40000000 }, | ||
4621 | { 0x00008278, 0x003e4180 }, | ||
4622 | { 0x0000827c, 0x00000000 }, | ||
4623 | { 0x00008284, 0x0000002c }, | ||
4624 | { 0x00008288, 0x0000002c }, | ||
4625 | { 0x0000828c, 0x00000000 }, | ||
4626 | { 0x00008294, 0x00000000 }, | ||
4627 | { 0x00008298, 0x00000000 }, | ||
4628 | { 0x0000829c, 0x00000000 }, | ||
4629 | { 0x00008300, 0x00000040 }, | ||
4630 | { 0x00008314, 0x00000000 }, | ||
4631 | { 0x00008328, 0x00000000 }, | ||
4632 | { 0x0000832c, 0x00000001 }, | ||
4633 | { 0x00008330, 0x00000302 }, | ||
4634 | { 0x00008334, 0x00000e00 }, | ||
4635 | { 0x00008338, 0x00ff0000 }, | ||
4636 | { 0x0000833c, 0x00000000 }, | ||
4637 | { 0x00008340, 0x00010380 }, | ||
4638 | { 0x00008344, 0x00581043 }, | ||
4639 | { 0x00009808, 0x00000000 }, | ||
4640 | { 0x0000980c, 0xafe68e30 }, | ||
4641 | { 0x00009810, 0xfd14e000 }, | ||
4642 | { 0x00009814, 0x9c0a9f6b }, | ||
4643 | { 0x0000981c, 0x00000000 }, | ||
4644 | { 0x0000982c, 0x0000a000 }, | ||
4645 | { 0x00009830, 0x00000000 }, | ||
4646 | { 0x0000983c, 0x00200400 }, | ||
4647 | { 0x0000984c, 0x0040233c }, | ||
4648 | { 0x00009854, 0x00000044 }, | ||
4649 | { 0x00009900, 0x00000000 }, | ||
4650 | { 0x00009904, 0x00000000 }, | ||
4651 | { 0x00009908, 0x00000000 }, | ||
4652 | { 0x0000990c, 0x00000000 }, | ||
4653 | { 0x00009910, 0x01002310 }, | ||
4654 | { 0x0000991c, 0x10000fff }, | ||
4655 | { 0x00009920, 0x04900000 }, | ||
4656 | { 0x00009928, 0x00000001 }, | ||
4657 | { 0x0000992c, 0x00000004 }, | ||
4658 | { 0x00009934, 0x1e1f2022 }, | ||
4659 | { 0x00009938, 0x0a0b0c0d }, | ||
4660 | { 0x0000993c, 0x00000000 }, | ||
4661 | { 0x00009940, 0x14750604 }, | ||
4662 | { 0x00009948, 0x9280c00a }, | ||
4663 | { 0x0000994c, 0x00020028 }, | ||
4664 | { 0x00009954, 0x5f3ca3de }, | ||
4665 | { 0x00009958, 0x2108ecff }, | ||
4666 | { 0x00009968, 0x000003ce }, | ||
4667 | { 0x00009970, 0x192bb515 }, | ||
4668 | { 0x00009974, 0x00000000 }, | ||
4669 | { 0x00009978, 0x00000001 }, | ||
4670 | { 0x0000997c, 0x00000000 }, | ||
4671 | { 0x00009980, 0x00000000 }, | ||
4672 | { 0x00009984, 0x00000000 }, | ||
4673 | { 0x00009988, 0x00000000 }, | ||
4674 | { 0x0000998c, 0x00000000 }, | ||
4675 | { 0x00009990, 0x00000000 }, | ||
4676 | { 0x00009994, 0x00000000 }, | ||
4677 | { 0x00009998, 0x00000000 }, | ||
4678 | { 0x0000999c, 0x00000000 }, | ||
4679 | { 0x000099a0, 0x00000000 }, | ||
4680 | { 0x000099a4, 0x00000001 }, | ||
4681 | { 0x000099a8, 0x201fff00 }, | ||
4682 | { 0x000099ac, 0x2def1000 }, | ||
4683 | { 0x000099b0, 0x03051000 }, | ||
4684 | { 0x000099b4, 0x00000820 }, | ||
4685 | { 0x000099dc, 0x00000000 }, | ||
4686 | { 0x000099e0, 0x00000000 }, | ||
4687 | { 0x000099e4, 0xaaaaaaaa }, | ||
4688 | { 0x000099e8, 0x3c466478 }, | ||
4689 | { 0x000099ec, 0x0cc80caa }, | ||
4690 | { 0x000099f0, 0x00000000 }, | ||
4691 | { 0x0000a208, 0x803e6788 }, | ||
4692 | { 0x0000a210, 0x4080a333 }, | ||
4693 | { 0x0000a214, 0x00206c10 }, | ||
4694 | { 0x0000a218, 0x009c4060 }, | ||
4695 | { 0x0000a220, 0x01834061 }, | ||
4696 | { 0x0000a224, 0x00000400 }, | ||
4697 | { 0x0000a228, 0x000003b5 }, | ||
4698 | { 0x0000a22c, 0x00000000 }, | ||
4699 | { 0x0000a234, 0x20202020 }, | ||
4700 | { 0x0000a238, 0x20202020 }, | ||
4701 | { 0x0000a244, 0x00000000 }, | ||
4702 | { 0x0000a248, 0xfffffffc }, | ||
4703 | { 0x0000a24c, 0x00000000 }, | ||
4704 | { 0x0000a254, 0x00000000 }, | ||
4705 | { 0x0000a258, 0x0ccb5380 }, | ||
4706 | { 0x0000a25c, 0x15151501 }, | ||
4707 | { 0x0000a260, 0xdfa90f01 }, | ||
4708 | { 0x0000a268, 0x00000000 }, | ||
4709 | { 0x0000a26c, 0x0ebae9e6 }, | ||
4710 | { 0x0000d270, 0x0d820820 }, | ||
4711 | { 0x0000a278, 0x318c6318 }, | ||
4712 | { 0x0000a27c, 0x050c0318 }, | ||
4713 | { 0x0000d35c, 0x07ffffef }, | ||
4714 | { 0x0000d360, 0x0fffffe7 }, | ||
4715 | { 0x0000d364, 0x17ffffe5 }, | ||
4716 | { 0x0000d368, 0x1fffffe4 }, | ||
4717 | { 0x0000d36c, 0x37ffffe3 }, | ||
4718 | { 0x0000d370, 0x3fffffe3 }, | ||
4719 | { 0x0000d374, 0x57ffffe3 }, | ||
4720 | { 0x0000d378, 0x5fffffe2 }, | ||
4721 | { 0x0000d37c, 0x7fffffe2 }, | ||
4722 | { 0x0000d380, 0x7f3c7bba }, | ||
4723 | { 0x0000d384, 0xf3307ff0 }, | ||
4724 | { 0x0000a388, 0x0c000000 }, | ||
4725 | { 0x0000a38c, 0x20202020 }, | ||
4726 | { 0x0000a390, 0x20202020 }, | ||
4727 | { 0x0000a394, 0x318c6318 }, | ||
4728 | { 0x0000a398, 0x00000318 }, | ||
4729 | { 0x0000a39c, 0x00000001 }, | ||
4730 | { 0x0000a3a0, 0x00000000 }, | ||
4731 | { 0x0000a3a4, 0x00000000 }, | ||
4732 | { 0x0000a3a8, 0x00000000 }, | ||
4733 | { 0x0000a3ac, 0x00000000 }, | ||
4734 | { 0x0000a3b0, 0x00000000 }, | ||
4735 | { 0x0000a3b4, 0x00000000 }, | ||
4736 | { 0x0000a3b8, 0x00000000 }, | ||
4737 | { 0x0000a3bc, 0x00000000 }, | ||
4738 | { 0x0000a3c0, 0x00000000 }, | ||
4739 | { 0x0000a3c4, 0x00000000 }, | ||
4740 | { 0x0000a3cc, 0x20202020 }, | ||
4741 | { 0x0000a3d0, 0x20202020 }, | ||
4742 | { 0x0000a3d4, 0x20202020 }, | ||
4743 | { 0x0000a3dc, 0x318c6318 }, | ||
4744 | { 0x0000a3e0, 0x00000318 }, | ||
4745 | { 0x0000a3e4, 0x00000000 }, | ||
4746 | { 0x0000a3e8, 0x18c43433 }, | ||
4747 | { 0x0000a3ec, 0x00f70081 }, | ||
4748 | { 0x00007800, 0x00140000 }, | ||
4749 | { 0x00007804, 0x0e4548d8 }, | ||
4750 | { 0x00007808, 0x54214514 }, | ||
4751 | { 0x0000780c, 0x02025820 }, | ||
4752 | { 0x00007810, 0x71c0d388 }, | ||
4753 | { 0x00007814, 0x924934a8 }, | ||
4754 | { 0x0000781c, 0x00000000 }, | ||
4755 | { 0x00007820, 0x00000c04 }, | ||
4756 | { 0x00007824, 0x00d86fff }, | ||
4757 | { 0x00007828, 0x26d2491b }, | ||
4758 | { 0x0000782c, 0x6e36d97b }, | ||
4759 | { 0x00007830, 0xedb6d96e }, | ||
4760 | { 0x00007834, 0x71400087 }, | ||
4761 | { 0x00007838, 0xfac68801 }, | ||
4762 | { 0x0000783c, 0x0001fffe }, | ||
4763 | { 0x00007840, 0xffeb1a20 }, | ||
4764 | { 0x00007844, 0x000c0db6 }, | ||
4765 | { 0x00007848, 0x6db61b6f }, | ||
4766 | { 0x0000784c, 0x6d9b66db }, | ||
4767 | { 0x00007850, 0x6d8c6dba }, | ||
4768 | { 0x00007854, 0x00040000 }, | ||
4769 | { 0x00007858, 0xdb003012 }, | ||
4770 | { 0x0000785c, 0x04924914 }, | ||
4771 | { 0x00007860, 0x21084210 }, | ||
4772 | { 0x00007864, 0xf7d7ffde }, | ||
4773 | { 0x00007868, 0xc2034080 }, | ||
4774 | { 0x0000786c, 0x48609eb4 }, | ||
4775 | { 0x00007870, 0x10142c00 }, | ||
4776 | }; | ||
4777 | |||
4778 | static const u_int32_t ar9285PciePhy_clkreq_always_on_L1_9285_1_2[][2] = { | ||
4779 | {0x00004040, 0x9248fd00 }, | ||
4780 | {0x00004040, 0x24924924 }, | ||
4781 | {0x00004040, 0xa8000019 }, | ||
4782 | {0x00004040, 0x13160820 }, | ||
4783 | {0x00004040, 0xe5980560 }, | ||
4784 | {0x00004040, 0xc01dcffd }, | ||
4785 | {0x00004040, 0x1aaabe41 }, | ||
4786 | {0x00004040, 0xbe105554 }, | ||
4787 | {0x00004040, 0x00043007 }, | ||
4788 | {0x00004044, 0x00000000 }, | ||
4789 | }; | ||
4790 | |||
4791 | static const u_int32_t ar9285PciePhy_clkreq_off_L1_9285_1_2[][2] = { | ||
4792 | {0x00004040, 0x9248fd00 }, | ||
4793 | {0x00004040, 0x24924924 }, | ||
4794 | {0x00004040, 0xa8000019 }, | ||
4795 | {0x00004040, 0x13160820 }, | ||
4796 | {0x00004040, 0xe5980560 }, | ||
4797 | {0x00004040, 0xc01dcffc }, | ||
4798 | {0x00004040, 0x1aaabe41 }, | ||
4799 | {0x00004040, 0xbe105554 }, | ||
4800 | {0x00004040, 0x00043007 }, | ||
4801 | {0x00004044, 0x00000000 }, | ||
4802 | }; | ||
diff --git a/drivers/net/wireless/ath9k/mac.c b/drivers/net/wireless/ath9k/mac.c index a4e98986dbcd..af32d091dc38 100644 --- a/drivers/net/wireless/ath9k/mac.c +++ b/drivers/net/wireless/ath9k/mac.c | |||
@@ -916,12 +916,11 @@ void ath9k_hw_rxena(struct ath_hal *ah) | |||
916 | 916 | ||
917 | void ath9k_hw_startpcureceive(struct ath_hal *ah) | 917 | void ath9k_hw_startpcureceive(struct ath_hal *ah) |
918 | { | 918 | { |
919 | REG_CLR_BIT(ah, AR_DIAG_SW, | ||
920 | (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); | ||
921 | |||
922 | ath9k_enable_mib_counters(ah); | 919 | ath9k_enable_mib_counters(ah); |
923 | 920 | ||
924 | ath9k_ani_reset(ah); | 921 | ath9k_ani_reset(ah); |
922 | |||
923 | REG_CLR_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); | ||
925 | } | 924 | } |
926 | 925 | ||
927 | void ath9k_hw_stoppcurecv(struct ath_hal *ah) | 926 | void ath9k_hw_stoppcurecv(struct ath_hal *ah) |
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c index 26c47577e183..02e1771bb274 100644 --- a/drivers/net/wireless/ath9k/main.c +++ b/drivers/net/wireless/ath9k/main.c | |||
@@ -34,6 +34,7 @@ static struct pci_device_id ath_pci_id_table[] __devinitdata = { | |||
34 | { PCI_VDEVICE(ATHEROS, 0x0027) }, /* PCI */ | 34 | { PCI_VDEVICE(ATHEROS, 0x0027) }, /* PCI */ |
35 | { PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI */ | 35 | { PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI */ |
36 | { PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */ | 36 | { PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */ |
37 | { PCI_VDEVICE(ATHEROS, 0x002B) }, /* PCI-E */ | ||
37 | { 0 } | 38 | { 0 } |
38 | }; | 39 | }; |
39 | 40 | ||
@@ -60,7 +61,8 @@ static void bus_read_cachesize(struct ath_softc *sc, int *csz) | |||
60 | 61 | ||
61 | static void ath_setcurmode(struct ath_softc *sc, enum wireless_mode mode) | 62 | static void ath_setcurmode(struct ath_softc *sc, enum wireless_mode mode) |
62 | { | 63 | { |
63 | sc->sc_curmode = mode; | 64 | if (!sc->sc_curaid) |
65 | sc->cur_rate_table = sc->hw_rate_table[mode]; | ||
64 | /* | 66 | /* |
65 | * All protection frames are transmited at 2Mb/s for | 67 | * All protection frames are transmited at 2Mb/s for |
66 | * 11g, otherwise at 1Mb/s. | 68 | * 11g, otherwise at 1Mb/s. |
@@ -346,7 +348,7 @@ static void ath_ani_calibrate(unsigned long data) | |||
346 | * don't calibrate when we're scanning. | 348 | * don't calibrate when we're scanning. |
347 | * we are most likely not on our home channel. | 349 | * we are most likely not on our home channel. |
348 | */ | 350 | */ |
349 | if (sc->rx_filter & FIF_BCN_PRBRESP_PROMISC) | 351 | if (sc->rx.rxfilter & FIF_BCN_PRBRESP_PROMISC) |
350 | return; | 352 | return; |
351 | 353 | ||
352 | /* Long calibration runs independently of short calibration. */ | 354 | /* Long calibration runs independently of short calibration. */ |
@@ -485,9 +487,9 @@ static void ath9k_tasklet(unsigned long data) | |||
485 | 487 | ||
486 | if (status & | 488 | if (status & |
487 | (ATH9K_INT_RX | ATH9K_INT_RXEOL | ATH9K_INT_RXORN)) { | 489 | (ATH9K_INT_RX | ATH9K_INT_RXEOL | ATH9K_INT_RXORN)) { |
488 | spin_lock_bh(&sc->sc_rxflushlock); | 490 | spin_lock_bh(&sc->rx.rxflushlock); |
489 | ath_rx_tasklet(sc, 0); | 491 | ath_rx_tasklet(sc, 0); |
490 | spin_unlock_bh(&sc->sc_rxflushlock); | 492 | spin_unlock_bh(&sc->rx.rxflushlock); |
491 | } | 493 | } |
492 | /* XXX: optimize this */ | 494 | /* XXX: optimize this */ |
493 | if (status & ATH9K_INT_TX) | 495 | if (status & ATH9K_INT_TX) |
@@ -597,6 +599,8 @@ static irqreturn_t ath_isr(int irq, void *dev) | |||
597 | } | 599 | } |
598 | } while (0); | 600 | } while (0); |
599 | 601 | ||
602 | ath_debug_stat_interrupt(sc, status); | ||
603 | |||
600 | if (sched) { | 604 | if (sched) { |
601 | /* turn off every interrupt except SWBA */ | 605 | /* turn off every interrupt except SWBA */ |
602 | ath9k_hw_set_interrupts(ah, (sc->sc_imask & ATH9K_INT_SWBA)); | 606 | ath9k_hw_set_interrupts(ah, (sc->sc_imask & ATH9K_INT_SWBA)); |
@@ -1302,7 +1306,7 @@ static void ath_detach(struct ath_softc *sc) | |||
1302 | /* cleanup tx queues */ | 1306 | /* cleanup tx queues */ |
1303 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) | 1307 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) |
1304 | if (ATH_TXQ_SETUP(sc, i)) | 1308 | if (ATH_TXQ_SETUP(sc, i)) |
1305 | ath_tx_cleanupq(sc, &sc->sc_txq[i]); | 1309 | ath_tx_cleanupq(sc, &sc->tx.txq[i]); |
1306 | 1310 | ||
1307 | ath9k_hw_detach(sc->sc_ah); | 1311 | ath9k_hw_detach(sc->sc_ah); |
1308 | ath9k_exit_debug(sc); | 1312 | ath9k_exit_debug(sc); |
@@ -1393,15 +1397,15 @@ static int ath_init(u16 devid, struct ath_softc *sc) | |||
1393 | * priority. Note that the hal handles reseting | 1397 | * priority. Note that the hal handles reseting |
1394 | * these queues at the needed time. | 1398 | * these queues at the needed time. |
1395 | */ | 1399 | */ |
1396 | sc->sc_bhalq = ath_beaconq_setup(ah); | 1400 | sc->beacon.beaconq = ath_beaconq_setup(ah); |
1397 | if (sc->sc_bhalq == -1) { | 1401 | if (sc->beacon.beaconq == -1) { |
1398 | DPRINTF(sc, ATH_DBG_FATAL, | 1402 | DPRINTF(sc, ATH_DBG_FATAL, |
1399 | "Unable to setup a beacon xmit queue\n"); | 1403 | "Unable to setup a beacon xmit queue\n"); |
1400 | error = -EIO; | 1404 | error = -EIO; |
1401 | goto bad2; | 1405 | goto bad2; |
1402 | } | 1406 | } |
1403 | sc->sc_cabq = ath_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0); | 1407 | sc->beacon.cabq = ath_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0); |
1404 | if (sc->sc_cabq == NULL) { | 1408 | if (sc->beacon.cabq == NULL) { |
1405 | DPRINTF(sc, ATH_DBG_FATAL, | 1409 | DPRINTF(sc, ATH_DBG_FATAL, |
1406 | "Unable to setup CAB xmit queue\n"); | 1410 | "Unable to setup CAB xmit queue\n"); |
1407 | error = -EIO; | 1411 | error = -EIO; |
@@ -1411,8 +1415,8 @@ static int ath_init(u16 devid, struct ath_softc *sc) | |||
1411 | sc->sc_config.cabqReadytime = ATH_CABQ_READY_TIME; | 1415 | sc->sc_config.cabqReadytime = ATH_CABQ_READY_TIME; |
1412 | ath_cabq_update(sc); | 1416 | ath_cabq_update(sc); |
1413 | 1417 | ||
1414 | for (i = 0; i < ARRAY_SIZE(sc->sc_haltype2q); i++) | 1418 | for (i = 0; i < ARRAY_SIZE(sc->tx.hwq_map); i++) |
1415 | sc->sc_haltype2q[i] = -1; | 1419 | sc->tx.hwq_map[i] = -1; |
1416 | 1420 | ||
1417 | /* Setup data queues */ | 1421 | /* Setup data queues */ |
1418 | /* NB: ensure BK queue is the lowest priority h/w queue */ | 1422 | /* NB: ensure BK queue is the lowest priority h/w queue */ |
@@ -1492,7 +1496,7 @@ static int ath_init(u16 devid, struct ath_softc *sc) | |||
1492 | sc->sc_rx_chainmask = ah->ah_caps.rx_chainmask; | 1496 | sc->sc_rx_chainmask = ah->ah_caps.rx_chainmask; |
1493 | 1497 | ||
1494 | ath9k_hw_setcapability(ah, ATH9K_CAP_DIVERSITY, 1, true, NULL); | 1498 | ath9k_hw_setcapability(ah, ATH9K_CAP_DIVERSITY, 1, true, NULL); |
1495 | sc->sc_defant = ath9k_hw_getdefantenna(ah); | 1499 | sc->rx.defant = ath9k_hw_getdefantenna(ah); |
1496 | 1500 | ||
1497 | ath9k_hw_getmac(ah, sc->sc_myaddr); | 1501 | ath9k_hw_getmac(ah, sc->sc_myaddr); |
1498 | if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK) { | 1502 | if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK) { |
@@ -1501,20 +1505,15 @@ static int ath_init(u16 devid, struct ath_softc *sc) | |||
1501 | ath9k_hw_setbssidmask(ah, sc->sc_bssidmask); | 1505 | ath9k_hw_setbssidmask(ah, sc->sc_bssidmask); |
1502 | } | 1506 | } |
1503 | 1507 | ||
1504 | sc->sc_slottime = ATH9K_SLOT_TIME_9; /* default to short slot time */ | 1508 | sc->beacon.slottime = ATH9K_SLOT_TIME_9; /* default to short slot time */ |
1505 | 1509 | ||
1506 | /* initialize beacon slots */ | 1510 | /* initialize beacon slots */ |
1507 | for (i = 0; i < ARRAY_SIZE(sc->sc_bslot); i++) | 1511 | for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) |
1508 | sc->sc_bslot[i] = ATH_IF_ID_ANY; | 1512 | sc->beacon.bslot[i] = ATH_IF_ID_ANY; |
1509 | 1513 | ||
1510 | /* save MISC configurations */ | 1514 | /* save MISC configurations */ |
1511 | sc->sc_config.swBeaconProcess = 1; | 1515 | sc->sc_config.swBeaconProcess = 1; |
1512 | 1516 | ||
1513 | #ifdef CONFIG_SLOW_ANT_DIV | ||
1514 | /* range is 40 - 255, we use something in the middle */ | ||
1515 | ath_slow_ant_div_init(&sc->sc_antdiv, sc, 0x127); | ||
1516 | #endif | ||
1517 | |||
1518 | /* setup channels and rates */ | 1517 | /* setup channels and rates */ |
1519 | 1518 | ||
1520 | sc->sbands[IEEE80211_BAND_2GHZ].channels = | 1519 | sc->sbands[IEEE80211_BAND_2GHZ].channels = |
@@ -1536,7 +1535,7 @@ bad2: | |||
1536 | /* cleanup tx queues */ | 1535 | /* cleanup tx queues */ |
1537 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) | 1536 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) |
1538 | if (ATH_TXQ_SETUP(sc, i)) | 1537 | if (ATH_TXQ_SETUP(sc, i)) |
1539 | ath_tx_cleanupq(sc, &sc->sc_txq[i]); | 1538 | ath_tx_cleanupq(sc, &sc->tx.txq[i]); |
1540 | bad: | 1539 | bad: |
1541 | if (ah) | 1540 | if (ah) |
1542 | ath9k_hw_detach(ah); | 1541 | ath9k_hw_detach(ah); |
@@ -1674,9 +1673,9 @@ int ath_reset(struct ath_softc *sc, bool retry_tx) | |||
1674 | int i; | 1673 | int i; |
1675 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { | 1674 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { |
1676 | if (ATH_TXQ_SETUP(sc, i)) { | 1675 | if (ATH_TXQ_SETUP(sc, i)) { |
1677 | spin_lock_bh(&sc->sc_txq[i].axq_lock); | 1676 | spin_lock_bh(&sc->tx.txq[i].axq_lock); |
1678 | ath_txq_schedule(sc, &sc->sc_txq[i]); | 1677 | ath_txq_schedule(sc, &sc->tx.txq[i]); |
1679 | spin_unlock_bh(&sc->sc_txq[i].axq_lock); | 1678 | spin_unlock_bh(&sc->tx.txq[i].axq_lock); |
1680 | } | 1679 | } |
1681 | } | 1680 | } |
1682 | } | 1681 | } |
@@ -1811,19 +1810,19 @@ int ath_get_hal_qnum(u16 queue, struct ath_softc *sc) | |||
1811 | 1810 | ||
1812 | switch (queue) { | 1811 | switch (queue) { |
1813 | case 0: | 1812 | case 0: |
1814 | qnum = sc->sc_haltype2q[ATH9K_WME_AC_VO]; | 1813 | qnum = sc->tx.hwq_map[ATH9K_WME_AC_VO]; |
1815 | break; | 1814 | break; |
1816 | case 1: | 1815 | case 1: |
1817 | qnum = sc->sc_haltype2q[ATH9K_WME_AC_VI]; | 1816 | qnum = sc->tx.hwq_map[ATH9K_WME_AC_VI]; |
1818 | break; | 1817 | break; |
1819 | case 2: | 1818 | case 2: |
1820 | qnum = sc->sc_haltype2q[ATH9K_WME_AC_BE]; | 1819 | qnum = sc->tx.hwq_map[ATH9K_WME_AC_BE]; |
1821 | break; | 1820 | break; |
1822 | case 3: | 1821 | case 3: |
1823 | qnum = sc->sc_haltype2q[ATH9K_WME_AC_BK]; | 1822 | qnum = sc->tx.hwq_map[ATH9K_WME_AC_BK]; |
1824 | break; | 1823 | break; |
1825 | default: | 1824 | default: |
1826 | qnum = sc->sc_haltype2q[ATH9K_WME_AC_BE]; | 1825 | qnum = sc->tx.hwq_map[ATH9K_WME_AC_BE]; |
1827 | break; | 1826 | break; |
1828 | } | 1827 | } |
1829 | 1828 | ||
@@ -1994,9 +1993,9 @@ static int ath9k_tx(struct ieee80211_hw *hw, | |||
1994 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { | 1993 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { |
1995 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 1994 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; |
1996 | if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) | 1995 | if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) |
1997 | sc->seq_no += 0x10; | 1996 | sc->tx.seq_no += 0x10; |
1998 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | 1997 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); |
1999 | hdr->seq_ctrl |= cpu_to_le16(sc->seq_no); | 1998 | hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no); |
2000 | } | 1999 | } |
2001 | 2000 | ||
2002 | /* Add the padding after the header if this is not already done */ | 2001 | /* Add the padding after the header if this is not already done */ |
@@ -2050,7 +2049,7 @@ static void ath9k_stop(struct ieee80211_hw *hw) | |||
2050 | ath_stoprecv(sc); | 2049 | ath_stoprecv(sc); |
2051 | ath9k_hw_phy_disable(sc->sc_ah); | 2050 | ath9k_hw_phy_disable(sc->sc_ah); |
2052 | } else | 2051 | } else |
2053 | sc->sc_rxlink = NULL; | 2052 | sc->rx.rxlink = NULL; |
2054 | 2053 | ||
2055 | #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) | 2054 | #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) |
2056 | if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_RFSILENT) | 2055 | if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_RFSILENT) |
@@ -2126,16 +2125,13 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw, | |||
2126 | 2125 | ||
2127 | DPRINTF(sc, ATH_DBG_CONFIG, "Detach Interface\n"); | 2126 | DPRINTF(sc, ATH_DBG_CONFIG, "Detach Interface\n"); |
2128 | 2127 | ||
2129 | #ifdef CONFIG_SLOW_ANT_DIV | ||
2130 | ath_slow_ant_div_stop(&sc->sc_antdiv); | ||
2131 | #endif | ||
2132 | /* Stop ANI */ | 2128 | /* Stop ANI */ |
2133 | del_timer_sync(&sc->sc_ani.timer); | 2129 | del_timer_sync(&sc->sc_ani.timer); |
2134 | 2130 | ||
2135 | /* Reclaim beacon resources */ | 2131 | /* Reclaim beacon resources */ |
2136 | if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP || | 2132 | if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP || |
2137 | sc->sc_ah->ah_opmode == NL80211_IFTYPE_ADHOC) { | 2133 | sc->sc_ah->ah_opmode == NL80211_IFTYPE_ADHOC) { |
2138 | ath9k_hw_stoptxdma(sc->sc_ah, sc->sc_bhalq); | 2134 | ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); |
2139 | ath_beacon_return(sc, avp); | 2135 | ath_beacon_return(sc, avp); |
2140 | } | 2136 | } |
2141 | 2137 | ||
@@ -2254,7 +2250,7 @@ static int ath9k_config_interface(struct ieee80211_hw *hw, | |||
2254 | * causes reconfiguration; we may be called | 2250 | * causes reconfiguration; we may be called |
2255 | * with beacon transmission active. | 2251 | * with beacon transmission active. |
2256 | */ | 2252 | */ |
2257 | ath9k_hw_stoptxdma(sc->sc_ah, sc->sc_bhalq); | 2253 | ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); |
2258 | 2254 | ||
2259 | error = ath_beacon_alloc(sc, 0); | 2255 | error = ath_beacon_alloc(sc, 0); |
2260 | if (error != 0) | 2256 | if (error != 0) |
@@ -2300,7 +2296,7 @@ static void ath9k_configure_filter(struct ieee80211_hw *hw, | |||
2300 | changed_flags &= SUPPORTED_FILTERS; | 2296 | changed_flags &= SUPPORTED_FILTERS; |
2301 | *total_flags &= SUPPORTED_FILTERS; | 2297 | *total_flags &= SUPPORTED_FILTERS; |
2302 | 2298 | ||
2303 | sc->rx_filter = *total_flags; | 2299 | sc->rx.rxfilter = *total_flags; |
2304 | rfilt = ath_calcrxfilter(sc); | 2300 | rfilt = ath_calcrxfilter(sc); |
2305 | ath9k_hw_setrxfilter(sc->sc_ah, rfilt); | 2301 | ath9k_hw_setrxfilter(sc->sc_ah, rfilt); |
2306 | 2302 | ||
@@ -2309,7 +2305,7 @@ static void ath9k_configure_filter(struct ieee80211_hw *hw, | |||
2309 | ath9k_hw_write_associd(sc->sc_ah, ath_bcast_mac, 0); | 2305 | ath9k_hw_write_associd(sc->sc_ah, ath_bcast_mac, 0); |
2310 | } | 2306 | } |
2311 | 2307 | ||
2312 | DPRINTF(sc, ATH_DBG_CONFIG, "Set HW RX filter: 0x%x\n", sc->rx_filter); | 2308 | DPRINTF(sc, ATH_DBG_CONFIG, "Set HW RX filter: 0x%x\n", sc->rx.rxfilter); |
2313 | } | 2309 | } |
2314 | 2310 | ||
2315 | static void ath9k_sta_notify(struct ieee80211_hw *hw, | 2311 | static void ath9k_sta_notify(struct ieee80211_hw *hw, |
@@ -2491,11 +2487,6 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw, | |||
2491 | return ret; | 2487 | return ret; |
2492 | } | 2488 | } |
2493 | 2489 | ||
2494 | static int ath9k_no_fragmentation(struct ieee80211_hw *hw, u32 value) | ||
2495 | { | ||
2496 | return -EOPNOTSUPP; | ||
2497 | } | ||
2498 | |||
2499 | static struct ieee80211_ops ath9k_ops = { | 2490 | static struct ieee80211_ops ath9k_ops = { |
2500 | .tx = ath9k_tx, | 2491 | .tx = ath9k_tx, |
2501 | .start = ath9k_start, | 2492 | .start = ath9k_start, |
@@ -2512,7 +2503,6 @@ static struct ieee80211_ops ath9k_ops = { | |||
2512 | .get_tsf = ath9k_get_tsf, | 2503 | .get_tsf = ath9k_get_tsf, |
2513 | .reset_tsf = ath9k_reset_tsf, | 2504 | .reset_tsf = ath9k_reset_tsf, |
2514 | .ampdu_action = ath9k_ampdu_action, | 2505 | .ampdu_action = ath9k_ampdu_action, |
2515 | .set_frag_threshold = ath9k_no_fragmentation, | ||
2516 | }; | 2506 | }; |
2517 | 2507 | ||
2518 | static struct { | 2508 | static struct { |
diff --git a/drivers/net/wireless/ath9k/phy.h b/drivers/net/wireless/ath9k/phy.h index 14702344448b..3a406a5c0593 100644 --- a/drivers/net/wireless/ath9k/phy.h +++ b/drivers/net/wireless/ath9k/phy.h | |||
@@ -50,6 +50,9 @@ bool ath9k_hw_init_rf(struct ath_hal *ah, | |||
50 | #define AR_PHY_FC_SHORT_GI_40 0x00000080 | 50 | #define AR_PHY_FC_SHORT_GI_40 0x00000080 |
51 | #define AR_PHY_FC_WALSH 0x00000100 | 51 | #define AR_PHY_FC_WALSH 0x00000100 |
52 | #define AR_PHY_FC_SINGLE_HT_LTF1 0x00000200 | 52 | #define AR_PHY_FC_SINGLE_HT_LTF1 0x00000200 |
53 | #define AR_PHY_FC_ENABLE_DAC_FIFO 0x00000800 | ||
54 | |||
55 | #define AR_PHY_TEST2 0x9808 | ||
53 | 56 | ||
54 | #define AR_PHY_TIMING2 0x9810 | 57 | #define AR_PHY_TIMING2 0x9810 |
55 | #define AR_PHY_TIMING3 0x9814 | 58 | #define AR_PHY_TIMING3 0x9814 |
@@ -100,6 +103,8 @@ bool ath9k_hw_init_rf(struct ath_hal *ah, | |||
100 | #define AR_PHY_RF_CTL4_FRAME_XPAA_ON 0x000000FF | 103 | #define AR_PHY_RF_CTL4_FRAME_XPAA_ON 0x000000FF |
101 | #define AR_PHY_RF_CTL4_FRAME_XPAA_ON_S 0 | 104 | #define AR_PHY_RF_CTL4_FRAME_XPAA_ON_S 0 |
102 | 105 | ||
106 | #define AR_PHY_TSTDAC_CONST 0x983c | ||
107 | |||
103 | #define AR_PHY_SETTLING 0x9844 | 108 | #define AR_PHY_SETTLING 0x9844 |
104 | #define AR_PHY_SETTLING_SWITCH 0x00003F80 | 109 | #define AR_PHY_SETTLING_SWITCH 0x00003F80 |
105 | #define AR_PHY_SETTLING_SWITCH_S 7 | 110 | #define AR_PHY_SETTLING_SWITCH_S 7 |
diff --git a/drivers/net/wireless/ath9k/rc.c b/drivers/net/wireless/ath9k/rc.c index 76acd2b75fcd..0ae5988e0b65 100644 --- a/drivers/net/wireless/ath9k/rc.c +++ b/drivers/net/wireless/ath9k/rc.c | |||
@@ -817,7 +817,7 @@ static void ath_rc_ratefind(struct ath_softc *sc, | |||
817 | struct ath_rate_table *rate_table; | 817 | struct ath_rate_table *rate_table; |
818 | struct ieee80211_tx_rate *rates = tx_info->control.rates; | 818 | struct ieee80211_tx_rate *rates = tx_info->control.rates; |
819 | 819 | ||
820 | rate_table = sc->hw_rate_table[sc->sc_curmode]; | 820 | rate_table = sc->cur_rate_table; |
821 | rix = ath_rc_ratefind_ht(sc, ath_rc_priv, rate_table, 1, | 821 | rix = ath_rc_ratefind_ht(sc, ath_rc_priv, rate_table, 1, |
822 | is_probe, is_retry); | 822 | is_probe, is_retry); |
823 | nrix = rix; | 823 | nrix = rix; |
@@ -874,10 +874,9 @@ static void ath_rc_ratefind(struct ath_softc *sc, | |||
874 | * So, set fourth rate in series to be same as third one for | 874 | * So, set fourth rate in series to be same as third one for |
875 | * above conditions. | 875 | * above conditions. |
876 | */ | 876 | */ |
877 | if ((sc->sc_curmode == ATH9K_MODE_11NG_HT20) || | 877 | if ((sc->hw->conf.channel->band == IEEE80211_BAND_2GHZ) && |
878 | (sc->sc_curmode == ATH9K_MODE_11NG_HT40PLUS) || | 878 | (sc->hw->conf.ht.enabled)) { |
879 | (sc->sc_curmode == ATH9K_MODE_11NG_HT40MINUS)) { | 879 | u8 dot11rate = rate_table->info[rix].dot11rate; |
880 | u8 dot11rate = rate_table->info[rix].dot11rate; | ||
881 | u8 phy = rate_table->info[rix].phy; | 880 | u8 phy = rate_table->info[rix].phy; |
882 | if (i == 4 && | 881 | if (i == 4 && |
883 | ((dot11rate == 2 && phy == WLAN_RC_PHY_HT_40_SS) || | 882 | ((dot11rate == 2 && phy == WLAN_RC_PHY_HT_40_SS) || |
@@ -1094,7 +1093,7 @@ static void ath_rc_update_ht(struct ath_softc *sc, | |||
1094 | int rate; | 1093 | int rate; |
1095 | u8 last_per; | 1094 | u8 last_per; |
1096 | bool state_change = false; | 1095 | bool state_change = false; |
1097 | struct ath_rate_table *rate_table = sc->hw_rate_table[sc->sc_curmode]; | 1096 | struct ath_rate_table *rate_table = sc->cur_rate_table; |
1098 | int size = ath_rc_priv->rate_table_size; | 1097 | int size = ath_rc_priv->rate_table_size; |
1099 | 1098 | ||
1100 | if ((tx_rate < 0) || (tx_rate > rate_table->rate_cnt)) | 1099 | if ((tx_rate < 0) || (tx_rate > rate_table->rate_cnt)) |
@@ -1254,7 +1253,7 @@ static void ath_rc_tx_status(struct ath_softc *sc, | |||
1254 | u8 flags; | 1253 | u8 flags; |
1255 | u32 i = 0, rix; | 1254 | u32 i = 0, rix; |
1256 | 1255 | ||
1257 | rate_table = sc->hw_rate_table[sc->sc_curmode]; | 1256 | rate_table = sc->cur_rate_table; |
1258 | 1257 | ||
1259 | /* | 1258 | /* |
1260 | * If the first rate is not the final index, there | 1259 | * If the first rate is not the final index, there |
@@ -1354,8 +1353,8 @@ static void ath_rc_init(struct ath_softc *sc, | |||
1354 | sta->ht_cap.ht_supported, | 1353 | sta->ht_cap.ht_supported, |
1355 | is_cw_40); | 1354 | is_cw_40); |
1356 | } else if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) { | 1355 | } else if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) { |
1357 | /* sc_curmode would be set on init through config() */ | 1356 | /* cur_rate_table would be set on init through config() */ |
1358 | rate_table = sc->hw_rate_table[sc->sc_curmode]; | 1357 | rate_table = sc->cur_rate_table; |
1359 | } | 1358 | } |
1360 | 1359 | ||
1361 | if (!rate_table) { | 1360 | if (!rate_table) { |
@@ -1432,6 +1431,7 @@ static void ath_rc_init(struct ath_softc *sc, | |||
1432 | ath_rc_priv->max_valid_rate = k; | 1431 | ath_rc_priv->max_valid_rate = k; |
1433 | ath_rc_sort_validrates(rate_table, ath_rc_priv); | 1432 | ath_rc_sort_validrates(rate_table, ath_rc_priv); |
1434 | ath_rc_priv->rate_max_phy = ath_rc_priv->valid_rate_index[k-4]; | 1433 | ath_rc_priv->rate_max_phy = ath_rc_priv->valid_rate_index[k-4]; |
1434 | sc->cur_rate_table = rate_table; | ||
1435 | } | 1435 | } |
1436 | 1436 | ||
1437 | /* Rate Control callbacks */ | 1437 | /* Rate Control callbacks */ |
diff --git a/drivers/net/wireless/ath9k/recv.c b/drivers/net/wireless/ath9k/recv.c index 7a455468823b..f2327d8e9c28 100644 --- a/drivers/net/wireless/ath9k/recv.c +++ b/drivers/net/wireless/ath9k/recv.c | |||
@@ -41,20 +41,19 @@ static void ath_rx_buf_link(struct ath_softc *sc, struct ath_buf *bf) | |||
41 | ASSERT(skb != NULL); | 41 | ASSERT(skb != NULL); |
42 | ds->ds_vdata = skb->data; | 42 | ds->ds_vdata = skb->data; |
43 | 43 | ||
44 | /* setup rx descriptors. The sc_rxbufsize here tells the harware | 44 | /* setup rx descriptors. The rx.bufsize here tells the harware |
45 | * how much data it can DMA to us and that we are prepared | 45 | * how much data it can DMA to us and that we are prepared |
46 | * to process */ | 46 | * to process */ |
47 | ath9k_hw_setuprxdesc(ah, | 47 | ath9k_hw_setuprxdesc(ah, ds, |
48 | ds, | 48 | sc->rx.bufsize, |
49 | sc->sc_rxbufsize, | ||
50 | 0); | 49 | 0); |
51 | 50 | ||
52 | if (sc->sc_rxlink == NULL) | 51 | if (sc->rx.rxlink == NULL) |
53 | ath9k_hw_putrxbuf(ah, bf->bf_daddr); | 52 | ath9k_hw_putrxbuf(ah, bf->bf_daddr); |
54 | else | 53 | else |
55 | *sc->sc_rxlink = bf->bf_daddr; | 54 | *sc->rx.rxlink = bf->bf_daddr; |
56 | 55 | ||
57 | sc->sc_rxlink = &ds->ds_link; | 56 | sc->rx.rxlink = &ds->ds_link; |
58 | ath9k_hw_rxena(ah); | 57 | ath9k_hw_rxena(ah); |
59 | } | 58 | } |
60 | 59 | ||
@@ -62,8 +61,8 @@ static void ath_setdefantenna(struct ath_softc *sc, u32 antenna) | |||
62 | { | 61 | { |
63 | /* XXX block beacon interrupts */ | 62 | /* XXX block beacon interrupts */ |
64 | ath9k_hw_setantenna(sc->sc_ah, antenna); | 63 | ath9k_hw_setantenna(sc->sc_ah, antenna); |
65 | sc->sc_defant = antenna; | 64 | sc->rx.defant = antenna; |
66 | sc->sc_rxotherant = 0; | 65 | sc->rx.rxotherant = 0; |
67 | } | 66 | } |
68 | 67 | ||
69 | /* | 68 | /* |
@@ -148,7 +147,7 @@ static int ath_rx_prepare(struct sk_buff *skb, struct ath_desc *ds, | |||
148 | struct ieee80211_rx_status *rx_status, bool *decrypt_error, | 147 | struct ieee80211_rx_status *rx_status, bool *decrypt_error, |
149 | struct ath_softc *sc) | 148 | struct ath_softc *sc) |
150 | { | 149 | { |
151 | struct ath_rate_table *rate_table = sc->hw_rate_table[sc->sc_curmode]; | 150 | struct ath_rate_table *rate_table = sc->cur_rate_table; |
152 | struct ieee80211_hdr *hdr; | 151 | struct ieee80211_hdr *hdr; |
153 | int ratekbps, rix; | 152 | int ratekbps, rix; |
154 | u8 ratecode; | 153 | u8 ratecode; |
@@ -272,20 +271,20 @@ int ath_rx_init(struct ath_softc *sc, int nbufs) | |||
272 | int error = 0; | 271 | int error = 0; |
273 | 272 | ||
274 | do { | 273 | do { |
275 | spin_lock_init(&sc->sc_rxflushlock); | 274 | spin_lock_init(&sc->rx.rxflushlock); |
276 | sc->sc_flags &= ~SC_OP_RXFLUSH; | 275 | sc->sc_flags &= ~SC_OP_RXFLUSH; |
277 | spin_lock_init(&sc->sc_rxbuflock); | 276 | spin_lock_init(&sc->rx.rxbuflock); |
278 | 277 | ||
279 | sc->sc_rxbufsize = roundup(IEEE80211_MAX_MPDU_LEN, | 278 | sc->rx.bufsize = roundup(IEEE80211_MAX_MPDU_LEN, |
280 | min(sc->sc_cachelsz, | 279 | min(sc->sc_cachelsz, |
281 | (u16)64)); | 280 | (u16)64)); |
282 | 281 | ||
283 | DPRINTF(sc, ATH_DBG_CONFIG, "cachelsz %u rxbufsize %u\n", | 282 | DPRINTF(sc, ATH_DBG_CONFIG, "cachelsz %u rxbufsize %u\n", |
284 | sc->sc_cachelsz, sc->sc_rxbufsize); | 283 | sc->sc_cachelsz, sc->rx.bufsize); |
285 | 284 | ||
286 | /* Initialize rx descriptors */ | 285 | /* Initialize rx descriptors */ |
287 | 286 | ||
288 | error = ath_descdma_setup(sc, &sc->sc_rxdma, &sc->sc_rxbuf, | 287 | error = ath_descdma_setup(sc, &sc->rx.rxdma, &sc->rx.rxbuf, |
289 | "rx", nbufs, 1); | 288 | "rx", nbufs, 1); |
290 | if (error != 0) { | 289 | if (error != 0) { |
291 | DPRINTF(sc, ATH_DBG_FATAL, | 290 | DPRINTF(sc, ATH_DBG_FATAL, |
@@ -293,8 +292,8 @@ int ath_rx_init(struct ath_softc *sc, int nbufs) | |||
293 | break; | 292 | break; |
294 | } | 293 | } |
295 | 294 | ||
296 | list_for_each_entry(bf, &sc->sc_rxbuf, list) { | 295 | list_for_each_entry(bf, &sc->rx.rxbuf, list) { |
297 | skb = ath_rxbuf_alloc(sc, sc->sc_rxbufsize); | 296 | skb = ath_rxbuf_alloc(sc, sc->rx.bufsize); |
298 | if (skb == NULL) { | 297 | if (skb == NULL) { |
299 | error = -ENOMEM; | 298 | error = -ENOMEM; |
300 | break; | 299 | break; |
@@ -302,8 +301,8 @@ int ath_rx_init(struct ath_softc *sc, int nbufs) | |||
302 | 301 | ||
303 | bf->bf_mpdu = skb; | 302 | bf->bf_mpdu = skb; |
304 | bf->bf_buf_addr = pci_map_single(sc->pdev, skb->data, | 303 | bf->bf_buf_addr = pci_map_single(sc->pdev, skb->data, |
305 | sc->sc_rxbufsize, | 304 | sc->rx.bufsize, |
306 | PCI_DMA_FROMDEVICE); | 305 | PCI_DMA_FROMDEVICE); |
307 | if (unlikely(pci_dma_mapping_error(sc->pdev, | 306 | if (unlikely(pci_dma_mapping_error(sc->pdev, |
308 | bf->bf_buf_addr))) { | 307 | bf->bf_buf_addr))) { |
309 | dev_kfree_skb_any(skb); | 308 | dev_kfree_skb_any(skb); |
@@ -315,7 +314,7 @@ int ath_rx_init(struct ath_softc *sc, int nbufs) | |||
315 | } | 314 | } |
316 | bf->bf_dmacontext = bf->bf_buf_addr; | 315 | bf->bf_dmacontext = bf->bf_buf_addr; |
317 | } | 316 | } |
318 | sc->sc_rxlink = NULL; | 317 | sc->rx.rxlink = NULL; |
319 | 318 | ||
320 | } while (0); | 319 | } while (0); |
321 | 320 | ||
@@ -330,14 +329,14 @@ void ath_rx_cleanup(struct ath_softc *sc) | |||
330 | struct sk_buff *skb; | 329 | struct sk_buff *skb; |
331 | struct ath_buf *bf; | 330 | struct ath_buf *bf; |
332 | 331 | ||
333 | list_for_each_entry(bf, &sc->sc_rxbuf, list) { | 332 | list_for_each_entry(bf, &sc->rx.rxbuf, list) { |
334 | skb = bf->bf_mpdu; | 333 | skb = bf->bf_mpdu; |
335 | if (skb) | 334 | if (skb) |
336 | dev_kfree_skb(skb); | 335 | dev_kfree_skb(skb); |
337 | } | 336 | } |
338 | 337 | ||
339 | if (sc->sc_rxdma.dd_desc_len != 0) | 338 | if (sc->rx.rxdma.dd_desc_len != 0) |
340 | ath_descdma_cleanup(sc, &sc->sc_rxdma, &sc->sc_rxbuf); | 339 | ath_descdma_cleanup(sc, &sc->rx.rxdma, &sc->rx.rxbuf); |
341 | } | 340 | } |
342 | 341 | ||
343 | /* | 342 | /* |
@@ -375,7 +374,7 @@ u32 ath_calcrxfilter(struct ath_softc *sc) | |||
375 | 374 | ||
376 | /* Can't set HOSTAP into promiscous mode */ | 375 | /* Can't set HOSTAP into promiscous mode */ |
377 | if (((sc->sc_ah->ah_opmode != NL80211_IFTYPE_AP) && | 376 | if (((sc->sc_ah->ah_opmode != NL80211_IFTYPE_AP) && |
378 | (sc->rx_filter & FIF_PROMISC_IN_BSS)) || | 377 | (sc->rx.rxfilter & FIF_PROMISC_IN_BSS)) || |
379 | (sc->sc_ah->ah_opmode == NL80211_IFTYPE_MONITOR)) { | 378 | (sc->sc_ah->ah_opmode == NL80211_IFTYPE_MONITOR)) { |
380 | rfilt |= ATH9K_RX_FILTER_PROM; | 379 | rfilt |= ATH9K_RX_FILTER_PROM; |
381 | /* ??? To prevent from sending ACK */ | 380 | /* ??? To prevent from sending ACK */ |
@@ -401,25 +400,25 @@ int ath_startrecv(struct ath_softc *sc) | |||
401 | struct ath_hal *ah = sc->sc_ah; | 400 | struct ath_hal *ah = sc->sc_ah; |
402 | struct ath_buf *bf, *tbf; | 401 | struct ath_buf *bf, *tbf; |
403 | 402 | ||
404 | spin_lock_bh(&sc->sc_rxbuflock); | 403 | spin_lock_bh(&sc->rx.rxbuflock); |
405 | if (list_empty(&sc->sc_rxbuf)) | 404 | if (list_empty(&sc->rx.rxbuf)) |
406 | goto start_recv; | 405 | goto start_recv; |
407 | 406 | ||
408 | sc->sc_rxlink = NULL; | 407 | sc->rx.rxlink = NULL; |
409 | list_for_each_entry_safe(bf, tbf, &sc->sc_rxbuf, list) { | 408 | list_for_each_entry_safe(bf, tbf, &sc->rx.rxbuf, list) { |
410 | ath_rx_buf_link(sc, bf); | 409 | ath_rx_buf_link(sc, bf); |
411 | } | 410 | } |
412 | 411 | ||
413 | /* We could have deleted elements so the list may be empty now */ | 412 | /* We could have deleted elements so the list may be empty now */ |
414 | if (list_empty(&sc->sc_rxbuf)) | 413 | if (list_empty(&sc->rx.rxbuf)) |
415 | goto start_recv; | 414 | goto start_recv; |
416 | 415 | ||
417 | bf = list_first_entry(&sc->sc_rxbuf, struct ath_buf, list); | 416 | bf = list_first_entry(&sc->rx.rxbuf, struct ath_buf, list); |
418 | ath9k_hw_putrxbuf(ah, bf->bf_daddr); | 417 | ath9k_hw_putrxbuf(ah, bf->bf_daddr); |
419 | ath9k_hw_rxena(ah); | 418 | ath9k_hw_rxena(ah); |
420 | 419 | ||
421 | start_recv: | 420 | start_recv: |
422 | spin_unlock_bh(&sc->sc_rxbuflock); | 421 | spin_unlock_bh(&sc->rx.rxbuflock); |
423 | ath_opmode_init(sc); | 422 | ath_opmode_init(sc); |
424 | ath9k_hw_startpcureceive(ah); | 423 | ath9k_hw_startpcureceive(ah); |
425 | 424 | ||
@@ -435,25 +434,25 @@ bool ath_stoprecv(struct ath_softc *sc) | |||
435 | ath9k_hw_setrxfilter(ah, 0); | 434 | ath9k_hw_setrxfilter(ah, 0); |
436 | stopped = ath9k_hw_stopdmarecv(ah); | 435 | stopped = ath9k_hw_stopdmarecv(ah); |
437 | mdelay(3); /* 3ms is long enough for 1 frame */ | 436 | mdelay(3); /* 3ms is long enough for 1 frame */ |
438 | sc->sc_rxlink = NULL; | 437 | sc->rx.rxlink = NULL; |
439 | 438 | ||
440 | return stopped; | 439 | return stopped; |
441 | } | 440 | } |
442 | 441 | ||
443 | void ath_flushrecv(struct ath_softc *sc) | 442 | void ath_flushrecv(struct ath_softc *sc) |
444 | { | 443 | { |
445 | spin_lock_bh(&sc->sc_rxflushlock); | 444 | spin_lock_bh(&sc->rx.rxflushlock); |
446 | sc->sc_flags |= SC_OP_RXFLUSH; | 445 | sc->sc_flags |= SC_OP_RXFLUSH; |
447 | ath_rx_tasklet(sc, 1); | 446 | ath_rx_tasklet(sc, 1); |
448 | sc->sc_flags &= ~SC_OP_RXFLUSH; | 447 | sc->sc_flags &= ~SC_OP_RXFLUSH; |
449 | spin_unlock_bh(&sc->sc_rxflushlock); | 448 | spin_unlock_bh(&sc->rx.rxflushlock); |
450 | } | 449 | } |
451 | 450 | ||
452 | int ath_rx_tasklet(struct ath_softc *sc, int flush) | 451 | int ath_rx_tasklet(struct ath_softc *sc, int flush) |
453 | { | 452 | { |
454 | #define PA2DESC(_sc, _pa) \ | 453 | #define PA2DESC(_sc, _pa) \ |
455 | ((struct ath_desc *)((caddr_t)(_sc)->sc_rxdma.dd_desc + \ | 454 | ((struct ath_desc *)((caddr_t)(_sc)->rx.rxdma.dd_desc + \ |
456 | ((_pa) - (_sc)->sc_rxdma.dd_desc_paddr))) | 455 | ((_pa) - (_sc)->rx.rxdma.dd_desc_paddr))) |
457 | 456 | ||
458 | struct ath_buf *bf; | 457 | struct ath_buf *bf; |
459 | struct ath_desc *ds; | 458 | struct ath_desc *ds; |
@@ -465,19 +464,19 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
465 | bool decrypt_error = false; | 464 | bool decrypt_error = false; |
466 | u8 keyix; | 465 | u8 keyix; |
467 | 466 | ||
468 | spin_lock_bh(&sc->sc_rxbuflock); | 467 | spin_lock_bh(&sc->rx.rxbuflock); |
469 | 468 | ||
470 | do { | 469 | do { |
471 | /* If handling rx interrupt and flush is in progress => exit */ | 470 | /* If handling rx interrupt and flush is in progress => exit */ |
472 | if ((sc->sc_flags & SC_OP_RXFLUSH) && (flush == 0)) | 471 | if ((sc->sc_flags & SC_OP_RXFLUSH) && (flush == 0)) |
473 | break; | 472 | break; |
474 | 473 | ||
475 | if (list_empty(&sc->sc_rxbuf)) { | 474 | if (list_empty(&sc->rx.rxbuf)) { |
476 | sc->sc_rxlink = NULL; | 475 | sc->rx.rxlink = NULL; |
477 | break; | 476 | break; |
478 | } | 477 | } |
479 | 478 | ||
480 | bf = list_first_entry(&sc->sc_rxbuf, struct ath_buf, list); | 479 | bf = list_first_entry(&sc->rx.rxbuf, struct ath_buf, list); |
481 | ds = bf->bf_desc; | 480 | ds = bf->bf_desc; |
482 | 481 | ||
483 | /* | 482 | /* |
@@ -499,8 +498,8 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
499 | struct ath_buf *tbf; | 498 | struct ath_buf *tbf; |
500 | struct ath_desc *tds; | 499 | struct ath_desc *tds; |
501 | 500 | ||
502 | if (list_is_last(&bf->list, &sc->sc_rxbuf)) { | 501 | if (list_is_last(&bf->list, &sc->rx.rxbuf)) { |
503 | sc->sc_rxlink = NULL; | 502 | sc->rx.rxlink = NULL; |
504 | break; | 503 | break; |
505 | } | 504 | } |
506 | 505 | ||
@@ -540,7 +539,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
540 | goto requeue; | 539 | goto requeue; |
541 | 540 | ||
542 | /* The status portion of the descriptor could get corrupted. */ | 541 | /* The status portion of the descriptor could get corrupted. */ |
543 | if (sc->sc_rxbufsize < ds->ds_rxstat.rs_datalen) | 542 | if (sc->rx.bufsize < ds->ds_rxstat.rs_datalen) |
544 | goto requeue; | 543 | goto requeue; |
545 | 544 | ||
546 | if (!ath_rx_prepare(skb, ds, &rx_status, &decrypt_error, sc)) | 545 | if (!ath_rx_prepare(skb, ds, &rx_status, &decrypt_error, sc)) |
@@ -548,21 +547,21 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
548 | 547 | ||
549 | /* Ensure we always have an skb to requeue once we are done | 548 | /* Ensure we always have an skb to requeue once we are done |
550 | * processing the current buffer's skb */ | 549 | * processing the current buffer's skb */ |
551 | requeue_skb = ath_rxbuf_alloc(sc, sc->sc_rxbufsize); | 550 | requeue_skb = ath_rxbuf_alloc(sc, sc->rx.bufsize); |
552 | 551 | ||
553 | /* If there is no memory we ignore the current RX'd frame, | 552 | /* If there is no memory we ignore the current RX'd frame, |
554 | * tell hardware it can give us a new frame using the old | 553 | * tell hardware it can give us a new frame using the old |
555 | * skb and put it at the tail of the sc->sc_rxbuf list for | 554 | * skb and put it at the tail of the sc->rx.rxbuf list for |
556 | * processing. */ | 555 | * processing. */ |
557 | if (!requeue_skb) | 556 | if (!requeue_skb) |
558 | goto requeue; | 557 | goto requeue; |
559 | 558 | ||
560 | pci_dma_sync_single_for_cpu(sc->pdev, | 559 | /* Sync and unmap the frame */ |
561 | bf->bf_buf_addr, | 560 | pci_dma_sync_single_for_cpu(sc->pdev, bf->bf_buf_addr, |
562 | sc->sc_rxbufsize, | 561 | sc->rx.bufsize, |
563 | PCI_DMA_FROMDEVICE); | 562 | PCI_DMA_FROMDEVICE); |
564 | pci_unmap_single(sc->pdev, bf->bf_buf_addr, | 563 | pci_unmap_single(sc->pdev, bf->bf_buf_addr, |
565 | sc->sc_rxbufsize, | 564 | sc->rx.bufsize, |
566 | PCI_DMA_FROMDEVICE); | 565 | PCI_DMA_FROMDEVICE); |
567 | 566 | ||
568 | skb_put(skb, ds->ds_rxstat.rs_datalen); | 567 | skb_put(skb, ds->ds_rxstat.rs_datalen); |
@@ -572,8 +571,16 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
572 | hdr = (struct ieee80211_hdr *)skb->data; | 571 | hdr = (struct ieee80211_hdr *)skb->data; |
573 | hdrlen = ieee80211_get_hdrlen_from_skb(skb); | 572 | hdrlen = ieee80211_get_hdrlen_from_skb(skb); |
574 | 573 | ||
575 | if (hdrlen & 3) { | 574 | /* The MAC header is padded to have 32-bit boundary if the |
576 | padsize = hdrlen % 4; | 575 | * packet payload is non-zero. The general calculation for |
576 | * padsize would take into account odd header lengths: | ||
577 | * padsize = (4 - hdrlen % 4) % 4; However, since only | ||
578 | * even-length headers are used, padding can only be 0 or 2 | ||
579 | * bytes and we can optimize this a bit. In addition, we must | ||
580 | * not try to remove padding from short control frames that do | ||
581 | * not have payload. */ | ||
582 | padsize = hdrlen & 3; | ||
583 | if (padsize && hdrlen >= 24) { | ||
577 | memmove(skb->data + padsize, skb->data, hdrlen); | 584 | memmove(skb->data + padsize, skb->data, hdrlen); |
578 | skb_pull(skb, padsize); | 585 | skb_pull(skb, padsize); |
579 | } | 586 | } |
@@ -596,7 +603,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
596 | /* We will now give hardware our shiny new allocated skb */ | 603 | /* We will now give hardware our shiny new allocated skb */ |
597 | bf->bf_mpdu = requeue_skb; | 604 | bf->bf_mpdu = requeue_skb; |
598 | bf->bf_buf_addr = pci_map_single(sc->pdev, requeue_skb->data, | 605 | bf->bf_buf_addr = pci_map_single(sc->pdev, requeue_skb->data, |
599 | sc->sc_rxbufsize, | 606 | sc->rx.bufsize, |
600 | PCI_DMA_FROMDEVICE); | 607 | PCI_DMA_FROMDEVICE); |
601 | if (unlikely(pci_dma_mapping_error(sc->pdev, | 608 | if (unlikely(pci_dma_mapping_error(sc->pdev, |
602 | bf->bf_buf_addr))) { | 609 | bf->bf_buf_addr))) { |
@@ -612,18 +619,18 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
612 | * change the default rx antenna if rx diversity chooses the | 619 | * change the default rx antenna if rx diversity chooses the |
613 | * other antenna 3 times in a row. | 620 | * other antenna 3 times in a row. |
614 | */ | 621 | */ |
615 | if (sc->sc_defant != ds->ds_rxstat.rs_antenna) { | 622 | if (sc->rx.defant != ds->ds_rxstat.rs_antenna) { |
616 | if (++sc->sc_rxotherant >= 3) | 623 | if (++sc->rx.rxotherant >= 3) |
617 | ath_setdefantenna(sc, ds->ds_rxstat.rs_antenna); | 624 | ath_setdefantenna(sc, ds->ds_rxstat.rs_antenna); |
618 | } else { | 625 | } else { |
619 | sc->sc_rxotherant = 0; | 626 | sc->rx.rxotherant = 0; |
620 | } | 627 | } |
621 | requeue: | 628 | requeue: |
622 | list_move_tail(&bf->list, &sc->sc_rxbuf); | 629 | list_move_tail(&bf->list, &sc->rx.rxbuf); |
623 | ath_rx_buf_link(sc, bf); | 630 | ath_rx_buf_link(sc, bf); |
624 | } while (1); | 631 | } while (1); |
625 | 632 | ||
626 | spin_unlock_bh(&sc->sc_rxbuflock); | 633 | spin_unlock_bh(&sc->rx.rxbuflock); |
627 | 634 | ||
628 | return 0; | 635 | return 0; |
629 | #undef PA2DESC | 636 | #undef PA2DESC |
diff --git a/drivers/net/wireless/ath9k/reg.h b/drivers/net/wireless/ath9k/reg.h index 60617ae66209..9fedb4911bc3 100644 --- a/drivers/net/wireless/ath9k/reg.h +++ b/drivers/net/wireless/ath9k/reg.h | |||
@@ -671,7 +671,11 @@ | |||
671 | #define AR_RC_APB 0x00000002 | 671 | #define AR_RC_APB 0x00000002 |
672 | #define AR_RC_HOSTIF 0x00000100 | 672 | #define AR_RC_HOSTIF 0x00000100 |
673 | 673 | ||
674 | #define AR_WA 0x4004 | 674 | #define AR_WA 0x4004 |
675 | #define AR9285_WA_DEFAULT 0x004a05cb | ||
676 | #define AR9280_WA_DEFAULT 0x0040073f | ||
677 | #define AR_WA_DEFAULT 0x0000073f | ||
678 | |||
675 | 679 | ||
676 | #define AR_PM_STATE 0x4008 | 680 | #define AR_PM_STATE 0x4008 |
677 | #define AR_PM_STATE_PME_D3COLD_VAUX 0x00100000 | 681 | #define AR_PM_STATE_PME_D3COLD_VAUX 0x00100000 |
@@ -738,6 +742,8 @@ | |||
738 | #define AR_SREV_REVISION_9280_21 2 | 742 | #define AR_SREV_REVISION_9280_21 2 |
739 | #define AR_SREV_VERSION_9285 0xC0 | 743 | #define AR_SREV_VERSION_9285 0xC0 |
740 | #define AR_SREV_REVISION_9285_10 0 | 744 | #define AR_SREV_REVISION_9285_10 0 |
745 | #define AR_SREV_REVISION_9285_11 1 | ||
746 | #define AR_SREV_REVISION_9285_12 2 | ||
741 | 747 | ||
742 | #define AR_SREV_9100_OR_LATER(_ah) \ | 748 | #define AR_SREV_9100_OR_LATER(_ah) \ |
743 | (((_ah)->ah_macVersion >= AR_SREV_VERSION_5416_PCIE)) | 749 | (((_ah)->ah_macVersion >= AR_SREV_VERSION_5416_PCIE)) |
@@ -768,6 +774,16 @@ | |||
768 | #define AR_SREV_9285(_ah) (((_ah)->ah_macVersion == AR_SREV_VERSION_9285)) | 774 | #define AR_SREV_9285(_ah) (((_ah)->ah_macVersion == AR_SREV_VERSION_9285)) |
769 | #define AR_SREV_9285_10_OR_LATER(_ah) \ | 775 | #define AR_SREV_9285_10_OR_LATER(_ah) \ |
770 | (((_ah)->ah_macVersion >= AR_SREV_VERSION_9285)) | 776 | (((_ah)->ah_macVersion >= AR_SREV_VERSION_9285)) |
777 | #define AR_SREV_9285_11(_ah) \ | ||
778 | (AR_SREV_9280(ah) && ((_ah)->ah_macRev == AR_SREV_REVISION_9285_11)) | ||
779 | #define AR_SREV_9285_11_OR_LATER(_ah) \ | ||
780 | (((_ah)->ah_macVersion > AR_SREV_VERSION_9285) || \ | ||
781 | (AR_SREV_9285(ah) && ((_ah)->ah_macRev >= AR_SREV_REVISION_9285_11))) | ||
782 | #define AR_SREV_9285_12(_ah) \ | ||
783 | (AR_SREV_9280(ah) && ((_ah)->ah_macRev == AR_SREV_REVISION_9285_12)) | ||
784 | #define AR_SREV_9285_12_OR_LATER(_ah) \ | ||
785 | (((_ah)->ah_macVersion > AR_SREV_VERSION_9285) || \ | ||
786 | (AR_SREV_9285(ah) && ((_ah)->ah_macRev >= AR_SREV_REVISION_9285_12))) | ||
771 | 787 | ||
772 | #define AR_RADIO_SREV_MAJOR 0xf0 | 788 | #define AR_RADIO_SREV_MAJOR 0xf0 |
773 | #define AR_RAD5133_SREV_MAJOR 0xc0 | 789 | #define AR_RAD5133_SREV_MAJOR 0xc0 |
@@ -1017,6 +1033,97 @@ enum { | |||
1017 | #define AR_AN_SYNTH9_REFDIVA 0xf8000000 | 1033 | #define AR_AN_SYNTH9_REFDIVA 0xf8000000 |
1018 | #define AR_AN_SYNTH9_REFDIVA_S 27 | 1034 | #define AR_AN_SYNTH9_REFDIVA_S 27 |
1019 | 1035 | ||
1036 | #define AR9285_AN_RF2G1 0x7820 | ||
1037 | #define AR9285_AN_RF2G1_ENPACAL 0x00000800 | ||
1038 | #define AR9285_AN_RF2G1_ENPACAL_S 11 | ||
1039 | #define AR9285_AN_RF2G1_PDPADRV1 0x02000000 | ||
1040 | #define AR9285_AN_RF2G1_PDPADRV1_S 25 | ||
1041 | #define AR9285_AN_RF2G1_PDPADRV2 0x01000000 | ||
1042 | #define AR9285_AN_RF2G1_PDPADRV2_S 24 | ||
1043 | #define AR9285_AN_RF2G1_PDPAOUT 0x00800000 | ||
1044 | #define AR9285_AN_RF2G1_PDPAOUT_S 23 | ||
1045 | |||
1046 | |||
1047 | #define AR9285_AN_RF2G2 0x7824 | ||
1048 | #define AR9285_AN_RF2G2_OFFCAL 0x00001000 | ||
1049 | #define AR9285_AN_RF2G2_OFFCAL_S 12 | ||
1050 | |||
1051 | #define AR9285_AN_RF2G3 0x7828 | ||
1052 | #define AR9285_AN_RF2G3_PDVCCOMP 0x02000000 | ||
1053 | #define AR9285_AN_RF2G3_PDVCCOMP_S 25 | ||
1054 | #define AR9285_AN_RF2G3_OB_0 0x00E00000 | ||
1055 | #define AR9285_AN_RF2G3_OB_0_S 21 | ||
1056 | #define AR9285_AN_RF2G3_OB_1 0x001C0000 | ||
1057 | #define AR9285_AN_RF2G3_OB_1_S 18 | ||
1058 | #define AR9285_AN_RF2G3_OB_2 0x00038000 | ||
1059 | #define AR9285_AN_RF2G3_OB_2_S 15 | ||
1060 | #define AR9285_AN_RF2G3_OB_3 0x00007000 | ||
1061 | #define AR9285_AN_RF2G3_OB_3_S 12 | ||
1062 | #define AR9285_AN_RF2G3_OB_4 0x00000E00 | ||
1063 | #define AR9285_AN_RF2G3_OB_4_S 9 | ||
1064 | |||
1065 | #define AR9285_AN_RF2G3_DB1_0 0x000001C0 | ||
1066 | #define AR9285_AN_RF2G3_DB1_0_S 6 | ||
1067 | #define AR9285_AN_RF2G3_DB1_1 0x00000038 | ||
1068 | #define AR9285_AN_RF2G3_DB1_1_S 3 | ||
1069 | #define AR9285_AN_RF2G3_DB1_2 0x00000007 | ||
1070 | #define AR9285_AN_RF2G3_DB1_2_S 0 | ||
1071 | #define AR9285_AN_RF2G4 0x782C | ||
1072 | #define AR9285_AN_RF2G4_DB1_3 0xE0000000 | ||
1073 | #define AR9285_AN_RF2G4_DB1_3_S 29 | ||
1074 | #define AR9285_AN_RF2G4_DB1_4 0x1C000000 | ||
1075 | #define AR9285_AN_RF2G4_DB1_4_S 26 | ||
1076 | |||
1077 | #define AR9285_AN_RF2G4_DB2_0 0x03800000 | ||
1078 | #define AR9285_AN_RF2G4_DB2_0_S 23 | ||
1079 | #define AR9285_AN_RF2G4_DB2_1 0x00700000 | ||
1080 | #define AR9285_AN_RF2G4_DB2_1_S 20 | ||
1081 | #define AR9285_AN_RF2G4_DB2_2 0x000E0000 | ||
1082 | #define AR9285_AN_RF2G4_DB2_2_S 17 | ||
1083 | #define AR9285_AN_RF2G4_DB2_3 0x0001C000 | ||
1084 | #define AR9285_AN_RF2G4_DB2_3_S 14 | ||
1085 | #define AR9285_AN_RF2G4_DB2_4 0x00003800 | ||
1086 | #define AR9285_AN_RF2G4_DB2_4_S 11 | ||
1087 | |||
1088 | #define AR9285_AN_RF2G6 0x7834 | ||
1089 | #define AR9285_AN_RF2G6_CCOMP 0x00007800 | ||
1090 | #define AR9285_AN_RF2G6_CCOMP_S 11 | ||
1091 | #define AR9285_AN_RF2G6_OFFS 0x03f00000 | ||
1092 | #define AR9285_AN_RF2G6_OFFS_S 20 | ||
1093 | |||
1094 | #define AR9285_AN_RF2G7 0x7838 | ||
1095 | #define AR9285_AN_RF2G7_PWDDB 0x00000002 | ||
1096 | #define AR9285_AN_RF2G7_PWDDB_S 1 | ||
1097 | #define AR9285_AN_RF2G7_PADRVGN2TAB0 0xE0000000 | ||
1098 | #define AR9285_AN_RF2G7_PADRVGN2TAB0_S 29 | ||
1099 | |||
1100 | #define AR9285_AN_RF2G8 0x783C | ||
1101 | #define AR9285_AN_RF2G8_PADRVGN2TAB0 0x0001C000 | ||
1102 | #define AR9285_AN_RF2G8_PADRVGN2TAB0_S 14 | ||
1103 | |||
1104 | |||
1105 | #define AR9285_AN_RF2G9 0x7840 | ||
1106 | #define AR9285_AN_RXTXBB1 0x7854 | ||
1107 | #define AR9285_AN_RXTXBB1_PDRXTXBB1 0x00000020 | ||
1108 | #define AR9285_AN_RXTXBB1_PDRXTXBB1_S 5 | ||
1109 | #define AR9285_AN_RXTXBB1_PDV2I 0x00000080 | ||
1110 | #define AR9285_AN_RXTXBB1_PDV2I_S 7 | ||
1111 | #define AR9285_AN_RXTXBB1_PDDACIF 0x00000100 | ||
1112 | #define AR9285_AN_RXTXBB1_PDDACIF_S 8 | ||
1113 | #define AR9285_AN_RXTXBB1_SPARE9 0x00000001 | ||
1114 | #define AR9285_AN_RXTXBB1_SPARE9_S 0 | ||
1115 | |||
1116 | #define AR9285_AN_TOP2 0x7868 | ||
1117 | |||
1118 | #define AR9285_AN_TOP3 0x786c | ||
1119 | #define AR9285_AN_TOP3_XPABIAS_LVL 0x0000000C | ||
1120 | #define AR9285_AN_TOP3_XPABIAS_LVL_S 2 | ||
1121 | #define AR9285_AN_TOP3_PWDDAC 0x00800000 | ||
1122 | #define AR9285_AN_TOP3_PWDDAC_S 23 | ||
1123 | |||
1124 | #define AR9285_AN_TOP4 0x7870 | ||
1125 | #define AR9285_AN_TOP4_DEFAULT 0x10142c00 | ||
1126 | |||
1020 | #define AR_STA_ID0 0x8000 | 1127 | #define AR_STA_ID0 0x8000 |
1021 | #define AR_STA_ID1 0x8004 | 1128 | #define AR_STA_ID1 0x8004 |
1022 | #define AR_STA_ID1_SADH_MASK 0x0000FFFF | 1129 | #define AR_STA_ID1_SADH_MASK 0x0000FFFF |
diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c index 9de27c681b86..f9c309ed3a2d 100644 --- a/drivers/net/wireless/ath9k/xmit.c +++ b/drivers/net/wireless/ath9k/xmit.c | |||
@@ -286,17 +286,17 @@ static struct ath_buf *ath_tx_get_buffer(struct ath_softc *sc) | |||
286 | { | 286 | { |
287 | struct ath_buf *bf = NULL; | 287 | struct ath_buf *bf = NULL; |
288 | 288 | ||
289 | spin_lock_bh(&sc->sc_txbuflock); | 289 | spin_lock_bh(&sc->tx.txbuflock); |
290 | 290 | ||
291 | if (unlikely(list_empty(&sc->sc_txbuf))) { | 291 | if (unlikely(list_empty(&sc->tx.txbuf))) { |
292 | spin_unlock_bh(&sc->sc_txbuflock); | 292 | spin_unlock_bh(&sc->tx.txbuflock); |
293 | return NULL; | 293 | return NULL; |
294 | } | 294 | } |
295 | 295 | ||
296 | bf = list_first_entry(&sc->sc_txbuf, struct ath_buf, list); | 296 | bf = list_first_entry(&sc->tx.txbuf, struct ath_buf, list); |
297 | list_del(&bf->list); | 297 | list_del(&bf->list); |
298 | 298 | ||
299 | spin_unlock_bh(&sc->sc_txbuflock); | 299 | spin_unlock_bh(&sc->tx.txbuflock); |
300 | 300 | ||
301 | return bf; | 301 | return bf; |
302 | } | 302 | } |
@@ -310,6 +310,7 @@ static void ath_tx_complete_buf(struct ath_softc *sc, | |||
310 | { | 310 | { |
311 | struct sk_buff *skb = bf->bf_mpdu; | 311 | struct sk_buff *skb = bf->bf_mpdu; |
312 | struct ath_xmit_status tx_status; | 312 | struct ath_xmit_status tx_status; |
313 | unsigned long flags; | ||
313 | 314 | ||
314 | /* | 315 | /* |
315 | * Set retry information. | 316 | * Set retry information. |
@@ -340,9 +341,9 @@ static void ath_tx_complete_buf(struct ath_softc *sc, | |||
340 | /* | 341 | /* |
341 | * Return the list of ath_buf of this mpdu to free queue | 342 | * Return the list of ath_buf of this mpdu to free queue |
342 | */ | 343 | */ |
343 | spin_lock_bh(&sc->sc_txbuflock); | 344 | spin_lock_irqsave(&sc->tx.txbuflock, flags); |
344 | list_splice_tail_init(bf_q, &sc->sc_txbuf); | 345 | list_splice_tail_init(bf_q, &sc->tx.txbuf); |
345 | spin_unlock_bh(&sc->sc_txbuflock); | 346 | spin_unlock_irqrestore(&sc->tx.txbuflock, flags); |
346 | } | 347 | } |
347 | 348 | ||
348 | /* | 349 | /* |
@@ -383,7 +384,7 @@ static void ath_tx_queue_tid(struct ath_txq *txq, struct ath_atx_tid *tid) | |||
383 | 384 | ||
384 | static void ath_tx_pause_tid(struct ath_softc *sc, struct ath_atx_tid *tid) | 385 | static void ath_tx_pause_tid(struct ath_softc *sc, struct ath_atx_tid *tid) |
385 | { | 386 | { |
386 | struct ath_txq *txq = &sc->sc_txq[tid->ac->qnum]; | 387 | struct ath_txq *txq = &sc->tx.txq[tid->ac->qnum]; |
387 | 388 | ||
388 | spin_lock_bh(&txq->axq_lock); | 389 | spin_lock_bh(&txq->axq_lock); |
389 | 390 | ||
@@ -396,7 +397,7 @@ static void ath_tx_pause_tid(struct ath_softc *sc, struct ath_atx_tid *tid) | |||
396 | 397 | ||
397 | void ath_tx_resume_tid(struct ath_softc *sc, struct ath_atx_tid *tid) | 398 | void ath_tx_resume_tid(struct ath_softc *sc, struct ath_atx_tid *tid) |
398 | { | 399 | { |
399 | struct ath_txq *txq = &sc->sc_txq[tid->ac->qnum]; | 400 | struct ath_txq *txq = &sc->tx.txq[tid->ac->qnum]; |
400 | 401 | ||
401 | ASSERT(tid->paused > 0); | 402 | ASSERT(tid->paused > 0); |
402 | spin_lock_bh(&txq->axq_lock); | 403 | spin_lock_bh(&txq->axq_lock); |
@@ -493,7 +494,7 @@ static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, | |||
493 | static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, struct ath_buf *bf, | 494 | static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, struct ath_buf *bf, |
494 | int width, int half_gi, bool shortPreamble) | 495 | int width, int half_gi, bool shortPreamble) |
495 | { | 496 | { |
496 | struct ath_rate_table *rate_table = sc->hw_rate_table[sc->sc_curmode]; | 497 | struct ath_rate_table *rate_table = sc->cur_rate_table; |
497 | u32 nbits, nsymbits, duration, nsymbols; | 498 | u32 nbits, nsymbits, duration, nsymbols; |
498 | u8 rc; | 499 | u8 rc; |
499 | int streams, pktlen; | 500 | int streams, pktlen; |
@@ -557,7 +558,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf) | |||
557 | } | 558 | } |
558 | 559 | ||
559 | /* get the cix for the lowest valid rix */ | 560 | /* get the cix for the lowest valid rix */ |
560 | rt = sc->hw_rate_table[sc->sc_curmode]; | 561 | rt = sc->cur_rate_table; |
561 | for (i = 3; i >= 0; i--) { | 562 | for (i = 3; i >= 0; i--) { |
562 | if (rates[i].count && (rates[i].idx >= 0)) { | 563 | if (rates[i].count && (rates[i].idx >= 0)) { |
563 | rix = rates[i].idx; | 564 | rix = rates[i].idx; |
@@ -685,7 +686,7 @@ static int ath_tx_send_normal(struct ath_softc *sc, | |||
685 | 686 | ||
686 | static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) | 687 | static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) |
687 | { | 688 | { |
688 | struct ath_txq *txq = &sc->sc_txq[tid->ac->qnum]; | 689 | struct ath_txq *txq = &sc->tx.txq[tid->ac->qnum]; |
689 | struct ath_buf *bf; | 690 | struct ath_buf *bf; |
690 | struct list_head bf_head; | 691 | struct list_head bf_head; |
691 | INIT_LIST_HEAD(&bf_head); | 692 | INIT_LIST_HEAD(&bf_head); |
@@ -860,12 +861,12 @@ static void ath_tx_complete_aggr_rifs(struct ath_softc *sc, | |||
860 | struct ath_buf *tbf; | 861 | struct ath_buf *tbf; |
861 | 862 | ||
862 | /* allocate new descriptor */ | 863 | /* allocate new descriptor */ |
863 | spin_lock_bh(&sc->sc_txbuflock); | 864 | spin_lock_bh(&sc->tx.txbuflock); |
864 | ASSERT(!list_empty((&sc->sc_txbuf))); | 865 | ASSERT(!list_empty((&sc->tx.txbuf))); |
865 | tbf = list_first_entry(&sc->sc_txbuf, | 866 | tbf = list_first_entry(&sc->tx.txbuf, |
866 | struct ath_buf, list); | 867 | struct ath_buf, list); |
867 | list_del(&tbf->list); | 868 | list_del(&tbf->list); |
868 | spin_unlock_bh(&sc->sc_txbuflock); | 869 | spin_unlock_bh(&sc->tx.txbuflock); |
869 | 870 | ||
870 | ATH_TXBUF_RESET(tbf); | 871 | ATH_TXBUF_RESET(tbf); |
871 | 872 | ||
@@ -1057,9 +1058,9 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq) | |||
1057 | 1058 | ||
1058 | if (bf_held) { | 1059 | if (bf_held) { |
1059 | list_del(&bf_held->list); | 1060 | list_del(&bf_held->list); |
1060 | spin_lock_bh(&sc->sc_txbuflock); | 1061 | spin_lock_bh(&sc->tx.txbuflock); |
1061 | list_add_tail(&bf_held->list, &sc->sc_txbuf); | 1062 | list_add_tail(&bf_held->list, &sc->tx.txbuf); |
1062 | spin_unlock_bh(&sc->sc_txbuflock); | 1063 | spin_unlock_bh(&sc->tx.txbuflock); |
1063 | } | 1064 | } |
1064 | 1065 | ||
1065 | if (!bf_isampdu(bf)) { | 1066 | if (!bf_isampdu(bf)) { |
@@ -1128,11 +1129,11 @@ static void ath_drain_txdataq(struct ath_softc *sc, bool retry_tx) | |||
1128 | if (!(sc->sc_flags & SC_OP_INVALID)) { | 1129 | if (!(sc->sc_flags & SC_OP_INVALID)) { |
1129 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { | 1130 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { |
1130 | if (ATH_TXQ_SETUP(sc, i)) { | 1131 | if (ATH_TXQ_SETUP(sc, i)) { |
1131 | ath_tx_stopdma(sc, &sc->sc_txq[i]); | 1132 | ath_tx_stopdma(sc, &sc->tx.txq[i]); |
1132 | /* The TxDMA may not really be stopped. | 1133 | /* The TxDMA may not really be stopped. |
1133 | * Double check the hal tx pending count */ | 1134 | * Double check the hal tx pending count */ |
1134 | npend += ath9k_hw_numtxpending(ah, | 1135 | npend += ath9k_hw_numtxpending(ah, |
1135 | sc->sc_txq[i].axq_qnum); | 1136 | sc->tx.txq[i].axq_qnum); |
1136 | } | 1137 | } |
1137 | } | 1138 | } |
1138 | } | 1139 | } |
@@ -1157,7 +1158,7 @@ static void ath_drain_txdataq(struct ath_softc *sc, bool retry_tx) | |||
1157 | 1158 | ||
1158 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { | 1159 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { |
1159 | if (ATH_TXQ_SETUP(sc, i)) | 1160 | if (ATH_TXQ_SETUP(sc, i)) |
1160 | ath_tx_draintxq(sc, &sc->sc_txq[i], retry_tx); | 1161 | ath_tx_draintxq(sc, &sc->tx.txq[i], retry_tx); |
1161 | } | 1162 | } |
1162 | } | 1163 | } |
1163 | 1164 | ||
@@ -1240,7 +1241,7 @@ static u32 ath_lookup_rate(struct ath_softc *sc, | |||
1240 | struct ath_buf *bf, | 1241 | struct ath_buf *bf, |
1241 | struct ath_atx_tid *tid) | 1242 | struct ath_atx_tid *tid) |
1242 | { | 1243 | { |
1243 | struct ath_rate_table *rate_table = sc->hw_rate_table[sc->sc_curmode]; | 1244 | struct ath_rate_table *rate_table = sc->cur_rate_table; |
1244 | struct sk_buff *skb; | 1245 | struct sk_buff *skb; |
1245 | struct ieee80211_tx_info *tx_info; | 1246 | struct ieee80211_tx_info *tx_info; |
1246 | struct ieee80211_tx_rate *rates; | 1247 | struct ieee80211_tx_rate *rates; |
@@ -1308,7 +1309,7 @@ static int ath_compute_num_delims(struct ath_softc *sc, | |||
1308 | struct ath_buf *bf, | 1309 | struct ath_buf *bf, |
1309 | u16 frmlen) | 1310 | u16 frmlen) |
1310 | { | 1311 | { |
1311 | struct ath_rate_table *rt = sc->hw_rate_table[sc->sc_curmode]; | 1312 | struct ath_rate_table *rt = sc->cur_rate_table; |
1312 | struct sk_buff *skb = bf->bf_mpdu; | 1313 | struct sk_buff *skb = bf->bf_mpdu; |
1313 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); | 1314 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); |
1314 | u32 nsymbits, nsymbols, mpdudensity; | 1315 | u32 nsymbits, nsymbols, mpdudensity; |
@@ -1819,9 +1820,9 @@ int ath_tx_start(struct ath_softc *sc, struct sk_buff *skb, | |||
1819 | } | 1820 | } |
1820 | spin_unlock_bh(&txq->axq_lock); | 1821 | spin_unlock_bh(&txq->axq_lock); |
1821 | 1822 | ||
1822 | spin_lock_bh(&sc->sc_txbuflock); | 1823 | spin_lock_bh(&sc->tx.txbuflock); |
1823 | list_add_tail(&bf->list, &sc->sc_txbuf); | 1824 | list_add_tail(&bf->list, &sc->tx.txbuf); |
1824 | spin_unlock_bh(&sc->sc_txbuflock); | 1825 | spin_unlock_bh(&sc->tx.txbuflock); |
1825 | 1826 | ||
1826 | return r; | 1827 | return r; |
1827 | } | 1828 | } |
@@ -1838,10 +1839,10 @@ int ath_tx_init(struct ath_softc *sc, int nbufs) | |||
1838 | int error = 0; | 1839 | int error = 0; |
1839 | 1840 | ||
1840 | do { | 1841 | do { |
1841 | spin_lock_init(&sc->sc_txbuflock); | 1842 | spin_lock_init(&sc->tx.txbuflock); |
1842 | 1843 | ||
1843 | /* Setup tx descriptors */ | 1844 | /* Setup tx descriptors */ |
1844 | error = ath_descdma_setup(sc, &sc->sc_txdma, &sc->sc_txbuf, | 1845 | error = ath_descdma_setup(sc, &sc->tx.txdma, &sc->tx.txbuf, |
1845 | "tx", nbufs, 1); | 1846 | "tx", nbufs, 1); |
1846 | if (error != 0) { | 1847 | if (error != 0) { |
1847 | DPRINTF(sc, ATH_DBG_FATAL, | 1848 | DPRINTF(sc, ATH_DBG_FATAL, |
@@ -1851,7 +1852,7 @@ int ath_tx_init(struct ath_softc *sc, int nbufs) | |||
1851 | } | 1852 | } |
1852 | 1853 | ||
1853 | /* XXX allocate beacon state together with vap */ | 1854 | /* XXX allocate beacon state together with vap */ |
1854 | error = ath_descdma_setup(sc, &sc->sc_bdma, &sc->sc_bbuf, | 1855 | error = ath_descdma_setup(sc, &sc->beacon.bdma, &sc->beacon.bbuf, |
1855 | "beacon", ATH_BCBUF, 1); | 1856 | "beacon", ATH_BCBUF, 1); |
1856 | if (error != 0) { | 1857 | if (error != 0) { |
1857 | DPRINTF(sc, ATH_DBG_FATAL, | 1858 | DPRINTF(sc, ATH_DBG_FATAL, |
@@ -1873,12 +1874,12 @@ int ath_tx_init(struct ath_softc *sc, int nbufs) | |||
1873 | int ath_tx_cleanup(struct ath_softc *sc) | 1874 | int ath_tx_cleanup(struct ath_softc *sc) |
1874 | { | 1875 | { |
1875 | /* cleanup beacon descriptors */ | 1876 | /* cleanup beacon descriptors */ |
1876 | if (sc->sc_bdma.dd_desc_len != 0) | 1877 | if (sc->beacon.bdma.dd_desc_len != 0) |
1877 | ath_descdma_cleanup(sc, &sc->sc_bdma, &sc->sc_bbuf); | 1878 | ath_descdma_cleanup(sc, &sc->beacon.bdma, &sc->beacon.bbuf); |
1878 | 1879 | ||
1879 | /* cleanup tx descriptors */ | 1880 | /* cleanup tx descriptors */ |
1880 | if (sc->sc_txdma.dd_desc_len != 0) | 1881 | if (sc->tx.txdma.dd_desc_len != 0) |
1881 | ath_descdma_cleanup(sc, &sc->sc_txdma, &sc->sc_txbuf); | 1882 | ath_descdma_cleanup(sc, &sc->tx.txdma, &sc->tx.txbuf); |
1882 | 1883 | ||
1883 | return 0; | 1884 | return 0; |
1884 | } | 1885 | } |
@@ -1926,15 +1927,15 @@ struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype) | |||
1926 | */ | 1927 | */ |
1927 | return NULL; | 1928 | return NULL; |
1928 | } | 1929 | } |
1929 | if (qnum >= ARRAY_SIZE(sc->sc_txq)) { | 1930 | if (qnum >= ARRAY_SIZE(sc->tx.txq)) { |
1930 | DPRINTF(sc, ATH_DBG_FATAL, | 1931 | DPRINTF(sc, ATH_DBG_FATAL, |
1931 | "qnum %u out of range, max %u!\n", | 1932 | "qnum %u out of range, max %u!\n", |
1932 | qnum, (unsigned int)ARRAY_SIZE(sc->sc_txq)); | 1933 | qnum, (unsigned int)ARRAY_SIZE(sc->tx.txq)); |
1933 | ath9k_hw_releasetxqueue(ah, qnum); | 1934 | ath9k_hw_releasetxqueue(ah, qnum); |
1934 | return NULL; | 1935 | return NULL; |
1935 | } | 1936 | } |
1936 | if (!ATH_TXQ_SETUP(sc, qnum)) { | 1937 | if (!ATH_TXQ_SETUP(sc, qnum)) { |
1937 | struct ath_txq *txq = &sc->sc_txq[qnum]; | 1938 | struct ath_txq *txq = &sc->tx.txq[qnum]; |
1938 | 1939 | ||
1939 | txq->axq_qnum = qnum; | 1940 | txq->axq_qnum = qnum; |
1940 | txq->axq_link = NULL; | 1941 | txq->axq_link = NULL; |
@@ -1945,9 +1946,9 @@ struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype) | |||
1945 | txq->axq_aggr_depth = 0; | 1946 | txq->axq_aggr_depth = 0; |
1946 | txq->axq_totalqueued = 0; | 1947 | txq->axq_totalqueued = 0; |
1947 | txq->axq_linkbuf = NULL; | 1948 | txq->axq_linkbuf = NULL; |
1948 | sc->sc_txqsetup |= 1<<qnum; | 1949 | sc->tx.txqsetup |= 1<<qnum; |
1949 | } | 1950 | } |
1950 | return &sc->sc_txq[qnum]; | 1951 | return &sc->tx.txq[qnum]; |
1951 | } | 1952 | } |
1952 | 1953 | ||
1953 | /* Reclaim resources for a setup queue */ | 1954 | /* Reclaim resources for a setup queue */ |
@@ -1955,7 +1956,7 @@ struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype) | |||
1955 | void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq) | 1956 | void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq) |
1956 | { | 1957 | { |
1957 | ath9k_hw_releasetxqueue(sc->sc_ah, txq->axq_qnum); | 1958 | ath9k_hw_releasetxqueue(sc->sc_ah, txq->axq_qnum); |
1958 | sc->sc_txqsetup &= ~(1<<txq->axq_qnum); | 1959 | sc->tx.txqsetup &= ~(1<<txq->axq_qnum); |
1959 | } | 1960 | } |
1960 | 1961 | ||
1961 | /* | 1962 | /* |
@@ -1972,15 +1973,15 @@ int ath_tx_setup(struct ath_softc *sc, int haltype) | |||
1972 | { | 1973 | { |
1973 | struct ath_txq *txq; | 1974 | struct ath_txq *txq; |
1974 | 1975 | ||
1975 | if (haltype >= ARRAY_SIZE(sc->sc_haltype2q)) { | 1976 | if (haltype >= ARRAY_SIZE(sc->tx.hwq_map)) { |
1976 | DPRINTF(sc, ATH_DBG_FATAL, | 1977 | DPRINTF(sc, ATH_DBG_FATAL, |
1977 | "HAL AC %u out of range, max %zu!\n", | 1978 | "HAL AC %u out of range, max %zu!\n", |
1978 | haltype, ARRAY_SIZE(sc->sc_haltype2q)); | 1979 | haltype, ARRAY_SIZE(sc->tx.hwq_map)); |
1979 | return 0; | 1980 | return 0; |
1980 | } | 1981 | } |
1981 | txq = ath_txq_setup(sc, ATH9K_TX_QUEUE_DATA, haltype); | 1982 | txq = ath_txq_setup(sc, ATH9K_TX_QUEUE_DATA, haltype); |
1982 | if (txq != NULL) { | 1983 | if (txq != NULL) { |
1983 | sc->sc_haltype2q[haltype] = txq->axq_qnum; | 1984 | sc->tx.hwq_map[haltype] = txq->axq_qnum; |
1984 | return 1; | 1985 | return 1; |
1985 | } else | 1986 | } else |
1986 | return 0; | 1987 | return 0; |
@@ -1992,19 +1993,19 @@ int ath_tx_get_qnum(struct ath_softc *sc, int qtype, int haltype) | |||
1992 | 1993 | ||
1993 | switch (qtype) { | 1994 | switch (qtype) { |
1994 | case ATH9K_TX_QUEUE_DATA: | 1995 | case ATH9K_TX_QUEUE_DATA: |
1995 | if (haltype >= ARRAY_SIZE(sc->sc_haltype2q)) { | 1996 | if (haltype >= ARRAY_SIZE(sc->tx.hwq_map)) { |
1996 | DPRINTF(sc, ATH_DBG_FATAL, | 1997 | DPRINTF(sc, ATH_DBG_FATAL, |
1997 | "HAL AC %u out of range, max %zu!\n", | 1998 | "HAL AC %u out of range, max %zu!\n", |
1998 | haltype, ARRAY_SIZE(sc->sc_haltype2q)); | 1999 | haltype, ARRAY_SIZE(sc->tx.hwq_map)); |
1999 | return -1; | 2000 | return -1; |
2000 | } | 2001 | } |
2001 | qnum = sc->sc_haltype2q[haltype]; | 2002 | qnum = sc->tx.hwq_map[haltype]; |
2002 | break; | 2003 | break; |
2003 | case ATH9K_TX_QUEUE_BEACON: | 2004 | case ATH9K_TX_QUEUE_BEACON: |
2004 | qnum = sc->sc_bhalq; | 2005 | qnum = sc->beacon.beaconq; |
2005 | break; | 2006 | break; |
2006 | case ATH9K_TX_QUEUE_CAB: | 2007 | case ATH9K_TX_QUEUE_CAB: |
2007 | qnum = sc->sc_cabq->axq_qnum; | 2008 | qnum = sc->beacon.cabq->axq_qnum; |
2008 | break; | 2009 | break; |
2009 | default: | 2010 | default: |
2010 | qnum = -1; | 2011 | qnum = -1; |
@@ -2020,7 +2021,7 @@ struct ath_txq *ath_test_get_txq(struct ath_softc *sc, struct sk_buff *skb) | |||
2020 | int qnum; | 2021 | int qnum; |
2021 | 2022 | ||
2022 | qnum = ath_get_hal_qnum(skb_get_queue_mapping(skb), sc); | 2023 | qnum = ath_get_hal_qnum(skb_get_queue_mapping(skb), sc); |
2023 | txq = &sc->sc_txq[qnum]; | 2024 | txq = &sc->tx.txq[qnum]; |
2024 | 2025 | ||
2025 | spin_lock_bh(&txq->axq_lock); | 2026 | spin_lock_bh(&txq->axq_lock); |
2026 | 2027 | ||
@@ -2049,17 +2050,17 @@ int ath_txq_update(struct ath_softc *sc, int qnum, | |||
2049 | int error = 0; | 2050 | int error = 0; |
2050 | struct ath9k_tx_queue_info qi; | 2051 | struct ath9k_tx_queue_info qi; |
2051 | 2052 | ||
2052 | if (qnum == sc->sc_bhalq) { | 2053 | if (qnum == sc->beacon.beaconq) { |
2053 | /* | 2054 | /* |
2054 | * XXX: for beacon queue, we just save the parameter. | 2055 | * XXX: for beacon queue, we just save the parameter. |
2055 | * It will be picked up by ath_beaconq_config when | 2056 | * It will be picked up by ath_beaconq_config when |
2056 | * it's necessary. | 2057 | * it's necessary. |
2057 | */ | 2058 | */ |
2058 | sc->sc_beacon_qi = *qinfo; | 2059 | sc->beacon.beacon_qi = *qinfo; |
2059 | return 0; | 2060 | return 0; |
2060 | } | 2061 | } |
2061 | 2062 | ||
2062 | ASSERT(sc->sc_txq[qnum].axq_qnum == qnum); | 2063 | ASSERT(sc->tx.txq[qnum].axq_qnum == qnum); |
2063 | 2064 | ||
2064 | ath9k_hw_get_txq_props(ah, qnum, &qi); | 2065 | ath9k_hw_get_txq_props(ah, qnum, &qi); |
2065 | qi.tqi_aifs = qinfo->tqi_aifs; | 2066 | qi.tqi_aifs = qinfo->tqi_aifs; |
@@ -2082,7 +2083,7 @@ int ath_txq_update(struct ath_softc *sc, int qnum, | |||
2082 | int ath_cabq_update(struct ath_softc *sc) | 2083 | int ath_cabq_update(struct ath_softc *sc) |
2083 | { | 2084 | { |
2084 | struct ath9k_tx_queue_info qi; | 2085 | struct ath9k_tx_queue_info qi; |
2085 | int qnum = sc->sc_cabq->axq_qnum; | 2086 | int qnum = sc->beacon.cabq->axq_qnum; |
2086 | struct ath_beacon_config conf; | 2087 | struct ath_beacon_config conf; |
2087 | 2088 | ||
2088 | ath9k_hw_get_txq_props(sc->sc_ah, qnum, &qi); | 2089 | ath9k_hw_get_txq_props(sc->sc_ah, qnum, &qi); |
@@ -2116,7 +2117,7 @@ void ath_tx_tasklet(struct ath_softc *sc) | |||
2116 | */ | 2117 | */ |
2117 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { | 2118 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { |
2118 | if (ATH_TXQ_SETUP(sc, i) && (qcumask & (1 << i))) | 2119 | if (ATH_TXQ_SETUP(sc, i) && (qcumask & (1 << i))) |
2119 | ath_tx_processq(sc, &sc->sc_txq[i]); | 2120 | ath_tx_processq(sc, &sc->tx.txq[i]); |
2120 | } | 2121 | } |
2121 | } | 2122 | } |
2122 | 2123 | ||
@@ -2148,9 +2149,9 @@ void ath_tx_draintxq(struct ath_softc *sc, | |||
2148 | list_del(&bf->list); | 2149 | list_del(&bf->list); |
2149 | spin_unlock_bh(&txq->axq_lock); | 2150 | spin_unlock_bh(&txq->axq_lock); |
2150 | 2151 | ||
2151 | spin_lock_bh(&sc->sc_txbuflock); | 2152 | spin_lock_bh(&sc->tx.txbuflock); |
2152 | list_add_tail(&bf->list, &sc->sc_txbuf); | 2153 | list_add_tail(&bf->list, &sc->tx.txbuf); |
2153 | spin_unlock_bh(&sc->sc_txbuflock); | 2154 | spin_unlock_bh(&sc->tx.txbuflock); |
2154 | continue; | 2155 | continue; |
2155 | } | 2156 | } |
2156 | 2157 | ||
@@ -2188,9 +2189,9 @@ void ath_draintxq(struct ath_softc *sc, bool retry_tx) | |||
2188 | /* stop beacon queue. The beacon will be freed when | 2189 | /* stop beacon queue. The beacon will be freed when |
2189 | * we go to INIT state */ | 2190 | * we go to INIT state */ |
2190 | if (!(sc->sc_flags & SC_OP_INVALID)) { | 2191 | if (!(sc->sc_flags & SC_OP_INVALID)) { |
2191 | (void) ath9k_hw_stoptxdma(sc->sc_ah, sc->sc_bhalq); | 2192 | (void) ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq); |
2192 | DPRINTF(sc, ATH_DBG_XMIT, "beacon queue %x\n", | 2193 | DPRINTF(sc, ATH_DBG_XMIT, "beacon queue %x\n", |
2193 | ath9k_hw_gettxbuf(sc->sc_ah, sc->sc_bhalq)); | 2194 | ath9k_hw_gettxbuf(sc->sc_ah, sc->beacon.beaconq)); |
2194 | } | 2195 | } |
2195 | 2196 | ||
2196 | ath_drain_txdataq(sc, retry_tx); | 2197 | ath_drain_txdataq(sc, retry_tx); |
@@ -2198,12 +2199,12 @@ void ath_draintxq(struct ath_softc *sc, bool retry_tx) | |||
2198 | 2199 | ||
2199 | u32 ath_txq_depth(struct ath_softc *sc, int qnum) | 2200 | u32 ath_txq_depth(struct ath_softc *sc, int qnum) |
2200 | { | 2201 | { |
2201 | return sc->sc_txq[qnum].axq_depth; | 2202 | return sc->tx.txq[qnum].axq_depth; |
2202 | } | 2203 | } |
2203 | 2204 | ||
2204 | u32 ath_txq_aggr_depth(struct ath_softc *sc, int qnum) | 2205 | u32 ath_txq_aggr_depth(struct ath_softc *sc, int qnum) |
2205 | { | 2206 | { |
2206 | return sc->sc_txq[qnum].axq_aggr_depth; | 2207 | return sc->tx.txq[qnum].axq_aggr_depth; |
2207 | } | 2208 | } |
2208 | 2209 | ||
2209 | bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno) | 2210 | bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno) |
@@ -2284,7 +2285,7 @@ void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid | |||
2284 | void ath_tx_aggr_teardown(struct ath_softc *sc, struct ath_node *an, u8 tid) | 2285 | void ath_tx_aggr_teardown(struct ath_softc *sc, struct ath_node *an, u8 tid) |
2285 | { | 2286 | { |
2286 | struct ath_atx_tid *txtid = ATH_AN_2_TID(an, tid); | 2287 | struct ath_atx_tid *txtid = ATH_AN_2_TID(an, tid); |
2287 | struct ath_txq *txq = &sc->sc_txq[txtid->ac->qnum]; | 2288 | struct ath_txq *txq = &sc->tx.txq[txtid->ac->qnum]; |
2288 | struct ath_buf *bf; | 2289 | struct ath_buf *bf; |
2289 | struct list_head bf_head; | 2290 | struct list_head bf_head; |
2290 | INIT_LIST_HEAD(&bf_head); | 2291 | INIT_LIST_HEAD(&bf_head); |
@@ -2405,7 +2406,7 @@ void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an) | |||
2405 | /* | 2406 | /* |
2406 | * Init per tid tx state | 2407 | * Init per tid tx state |
2407 | */ | 2408 | */ |
2408 | for (tidno = 0, tid = &an->an_aggr.tx.tid[tidno]; | 2409 | for (tidno = 0, tid = &an->tid[tidno]; |
2409 | tidno < WME_NUM_TID; | 2410 | tidno < WME_NUM_TID; |
2410 | tidno++, tid++) { | 2411 | tidno++, tid++) { |
2411 | tid->an = an; | 2412 | tid->an = an; |
@@ -2419,7 +2420,7 @@ void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an) | |||
2419 | INIT_LIST_HEAD(&tid->buf_q); | 2420 | INIT_LIST_HEAD(&tid->buf_q); |
2420 | 2421 | ||
2421 | acno = TID_TO_WME_AC(tidno); | 2422 | acno = TID_TO_WME_AC(tidno); |
2422 | tid->ac = &an->an_aggr.tx.ac[acno]; | 2423 | tid->ac = &an->ac[acno]; |
2423 | 2424 | ||
2424 | /* ADDBA state */ | 2425 | /* ADDBA state */ |
2425 | tid->state &= ~AGGR_ADDBA_COMPLETE; | 2426 | tid->state &= ~AGGR_ADDBA_COMPLETE; |
@@ -2430,7 +2431,7 @@ void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an) | |||
2430 | /* | 2431 | /* |
2431 | * Init per ac tx state | 2432 | * Init per ac tx state |
2432 | */ | 2433 | */ |
2433 | for (acno = 0, ac = &an->an_aggr.tx.ac[acno]; | 2434 | for (acno = 0, ac = &an->ac[acno]; |
2434 | acno < WME_NUM_AC; acno++, ac++) { | 2435 | acno < WME_NUM_AC; acno++, ac++) { |
2435 | ac->sched = false; | 2436 | ac->sched = false; |
2436 | INIT_LIST_HEAD(&ac->tid_q); | 2437 | INIT_LIST_HEAD(&ac->tid_q); |
@@ -2466,7 +2467,7 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an) | |||
2466 | struct ath_txq *txq; | 2467 | struct ath_txq *txq; |
2467 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { | 2468 | for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { |
2468 | if (ATH_TXQ_SETUP(sc, i)) { | 2469 | if (ATH_TXQ_SETUP(sc, i)) { |
2469 | txq = &sc->sc_txq[i]; | 2470 | txq = &sc->tx.txq[i]; |
2470 | 2471 | ||
2471 | spin_lock(&txq->axq_lock); | 2472 | spin_lock(&txq->axq_lock); |
2472 | 2473 | ||
@@ -2511,9 +2512,9 @@ void ath_tx_cabq(struct ath_softc *sc, struct sk_buff *skb) | |||
2511 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { | 2512 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { |
2512 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 2513 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; |
2513 | if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) | 2514 | if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) |
2514 | sc->seq_no += 0x10; | 2515 | sc->tx.seq_no += 0x10; |
2515 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | 2516 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); |
2516 | hdr->seq_ctrl |= cpu_to_le16(sc->seq_no); | 2517 | hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no); |
2517 | } | 2518 | } |
2518 | 2519 | ||
2519 | /* Add the padding after the header if this is not already done */ | 2520 | /* Add the padding after the header if this is not already done */ |
@@ -2529,7 +2530,7 @@ void ath_tx_cabq(struct ath_softc *sc, struct sk_buff *skb) | |||
2529 | memmove(skb->data, skb->data + padsize, hdrlen); | 2530 | memmove(skb->data, skb->data + padsize, hdrlen); |
2530 | } | 2531 | } |
2531 | 2532 | ||
2532 | txctl.txq = sc->sc_cabq; | 2533 | txctl.txq = sc->beacon.cabq; |
2533 | 2534 | ||
2534 | DPRINTF(sc, ATH_DBG_XMIT, "transmitting CABQ packet, skb: %p\n", skb); | 2535 | DPRINTF(sc, ATH_DBG_XMIT, "transmitting CABQ packet, skb: %p\n", skb); |
2535 | 2536 | ||
diff --git a/drivers/net/wireless/b43legacy/debugfs.c b/drivers/net/wireless/b43legacy/debugfs.c index 03ce0821a60e..1f85ac569fec 100644 --- a/drivers/net/wireless/b43legacy/debugfs.c +++ b/drivers/net/wireless/b43legacy/debugfs.c | |||
@@ -211,7 +211,7 @@ static ssize_t b43legacy_debugfs_read(struct file *file, char __user *userbuf, | |||
211 | struct b43legacy_dfs_file *dfile; | 211 | struct b43legacy_dfs_file *dfile; |
212 | ssize_t uninitialized_var(ret); | 212 | ssize_t uninitialized_var(ret); |
213 | char *buf; | 213 | char *buf; |
214 | const size_t bufsize = 1024 * 128; | 214 | const size_t bufsize = 1024 * 16; /* 16 KiB buffer */ |
215 | const size_t buforder = get_order(bufsize); | 215 | const size_t buforder = get_order(bufsize); |
216 | int err = 0; | 216 | int err = 0; |
217 | 217 | ||
diff --git a/drivers/net/wireless/b43legacy/phy.c b/drivers/net/wireless/b43legacy/phy.c index 4c9442b16f3f..11319ec2d64a 100644 --- a/drivers/net/wireless/b43legacy/phy.c +++ b/drivers/net/wireless/b43legacy/phy.c | |||
@@ -1296,12 +1296,10 @@ void b43legacy_lo_write(struct b43legacy_wldev *dev, | |||
1296 | /* Sanity check. */ | 1296 | /* Sanity check. */ |
1297 | if (pair->low < -8 || pair->low > 8 || | 1297 | if (pair->low < -8 || pair->low > 8 || |
1298 | pair->high < -8 || pair->high > 8) { | 1298 | pair->high < -8 || pair->high > 8) { |
1299 | struct b43legacy_phy *phy = &dev->phy; | ||
1300 | b43legacydbg(dev->wl, | 1299 | b43legacydbg(dev->wl, |
1301 | "WARNING: Writing invalid LOpair " | 1300 | "WARNING: Writing invalid LOpair " |
1302 | "(low: %d, high: %d, index: %lu)\n", | 1301 | "(low: %d, high: %d)\n", |
1303 | pair->low, pair->high, | 1302 | pair->low, pair->high); |
1304 | (unsigned long)(pair - phy->_lo_pairs)); | ||
1305 | dump_stack(); | 1303 | dump_stack(); |
1306 | } | 1304 | } |
1307 | #endif | 1305 | #endif |
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 23728eb6110a..625f2cf99fa9 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c | |||
@@ -4345,7 +4345,8 @@ static void ipw_handle_missed_beacon(struct ipw_priv *priv, | |||
4345 | return; | 4345 | return; |
4346 | } | 4346 | } |
4347 | 4347 | ||
4348 | if (priv->status & STATUS_SCANNING) { | 4348 | if (priv->status & STATUS_SCANNING && |
4349 | missed_count > IPW_MB_SCAN_CANCEL_THRESHOLD) { | ||
4349 | /* Stop scan to keep fw from getting | 4350 | /* Stop scan to keep fw from getting |
4350 | * stuck (only if we aren't roaming -- | 4351 | * stuck (only if we aren't roaming -- |
4351 | * otherwise we'll never scan more than 2 or 3 | 4352 | * otherwise we'll never scan more than 2 or 3 |
@@ -6271,6 +6272,20 @@ static void ipw_add_scan_channels(struct ipw_priv *priv, | |||
6271 | } | 6272 | } |
6272 | } | 6273 | } |
6273 | 6274 | ||
6275 | static int ipw_passive_dwell_time(struct ipw_priv *priv) | ||
6276 | { | ||
6277 | /* staying on passive channels longer than the DTIM interval during a | ||
6278 | * scan, while associated, causes the firmware to cancel the scan | ||
6279 | * without notification. Hence, don't stay on passive channels longer | ||
6280 | * than the beacon interval. | ||
6281 | */ | ||
6282 | if (priv->status & STATUS_ASSOCIATED | ||
6283 | && priv->assoc_network->beacon_interval > 10) | ||
6284 | return priv->assoc_network->beacon_interval - 10; | ||
6285 | else | ||
6286 | return 120; | ||
6287 | } | ||
6288 | |||
6274 | static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct) | 6289 | static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct) |
6275 | { | 6290 | { |
6276 | struct ipw_scan_request_ext scan; | 6291 | struct ipw_scan_request_ext scan; |
@@ -6314,16 +6329,16 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct) | |||
6314 | scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee)); | 6329 | scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee)); |
6315 | 6330 | ||
6316 | if (type == IW_SCAN_TYPE_PASSIVE) { | 6331 | if (type == IW_SCAN_TYPE_PASSIVE) { |
6317 | IPW_DEBUG_WX("use passive scanning\n"); | 6332 | IPW_DEBUG_WX("use passive scanning\n"); |
6318 | scan_type = IPW_SCAN_PASSIVE_FULL_DWELL_SCAN; | 6333 | scan_type = IPW_SCAN_PASSIVE_FULL_DWELL_SCAN; |
6319 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = | 6334 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = |
6320 | cpu_to_le16(120); | 6335 | cpu_to_le16(ipw_passive_dwell_time(priv)); |
6321 | ipw_add_scan_channels(priv, &scan, scan_type); | 6336 | ipw_add_scan_channels(priv, &scan, scan_type); |
6322 | goto send_request; | 6337 | goto send_request; |
6323 | } | 6338 | } |
6324 | 6339 | ||
6325 | /* Use active scan by default. */ | 6340 | /* Use active scan by default. */ |
6326 | if (priv->config & CFG_SPEED_SCAN) | 6341 | if (priv->config & CFG_SPEED_SCAN) |
6327 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] = | 6342 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] = |
6328 | cpu_to_le16(30); | 6343 | cpu_to_le16(30); |
6329 | else | 6344 | else |
@@ -6333,7 +6348,8 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct) | |||
6333 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] = | 6348 | scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] = |
6334 | cpu_to_le16(20); | 6349 | cpu_to_le16(20); |
6335 | 6350 | ||
6336 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120); | 6351 | scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = |
6352 | cpu_to_le16(ipw_passive_dwell_time(priv)); | ||
6337 | scan.dwell_time[IPW_SCAN_ACTIVE_DIRECT_SCAN] = cpu_to_le16(20); | 6353 | scan.dwell_time[IPW_SCAN_ACTIVE_DIRECT_SCAN] = cpu_to_le16(20); |
6338 | 6354 | ||
6339 | #ifdef CONFIG_IPW2200_MONITOR | 6355 | #ifdef CONFIG_IPW2200_MONITOR |
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.h b/drivers/net/wireless/ipw2x00/ipw2200.h index 0a84d52147bd..277b274d4be5 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.h +++ b/drivers/net/wireless/ipw2x00/ipw2200.h | |||
@@ -245,6 +245,7 @@ enum connection_manager_assoc_states { | |||
245 | #define HOST_NOTIFICATION_S36_MEASUREMENT_REFUSED 31 | 245 | #define HOST_NOTIFICATION_S36_MEASUREMENT_REFUSED 31 |
246 | 246 | ||
247 | #define HOST_NOTIFICATION_STATUS_BEACON_MISSING 1 | 247 | #define HOST_NOTIFICATION_STATUS_BEACON_MISSING 1 |
248 | #define IPW_MB_SCAN_CANCEL_THRESHOLD 3 | ||
248 | #define IPW_MB_ROAMING_THRESHOLD_MIN 1 | 249 | #define IPW_MB_ROAMING_THRESHOLD_MIN 1 |
249 | #define IPW_MB_ROAMING_THRESHOLD_DEFAULT 8 | 250 | #define IPW_MB_ROAMING_THRESHOLD_DEFAULT 8 |
250 | #define IPW_MB_ROAMING_THRESHOLD_MAX 30 | 251 | #define IPW_MB_ROAMING_THRESHOLD_MAX 30 |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-commands.h b/drivers/net/wireless/iwlwifi/iwl-3945-commands.h index daf99ea88e90..c6f4eb54a2b1 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-commands.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-core.h b/drivers/net/wireless/iwlwifi/iwl-3945-core.h index edac6c6a9110..6f463555402c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-core.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * Tomas Winkler <tomas.winkler@intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-debug.h b/drivers/net/wireless/iwlwifi/iwl-3945-debug.h index 33016fb5e9b3..85eb778f9df1 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-debug.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-debug.h | |||
@@ -21,7 +21,7 @@ | |||
21 | * file called LICENSE. | 21 | * file called LICENSE. |
22 | * | 22 | * |
23 | * Contact Information: | 23 | * Contact Information: |
24 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 24 | * Intel Linux Wireless <ilw@linux.intel.com> |
25 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 25 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
26 | * | 26 | * |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-hw.h b/drivers/net/wireless/iwlwifi/iwl-3945-hw.h index 644bd9e08052..94ea0e60c410 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-hw.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-hw.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
@@ -103,7 +103,6 @@ | |||
103 | * Driver reads 16-bit value from bits 31-16 of CSR_EEPROM_REG. | 103 | * Driver reads 16-bit value from bits 31-16 of CSR_EEPROM_REG. |
104 | */ | 104 | */ |
105 | #define IWL_EEPROM_ACCESS_TIMEOUT 5000 /* uSec */ | 105 | #define IWL_EEPROM_ACCESS_TIMEOUT 5000 /* uSec */ |
106 | #define IWL_EEPROM_ACCESS_DELAY 10 /* uSec */ | ||
107 | 106 | ||
108 | /* | 107 | /* |
109 | * Regulatory channel usage flags in EEPROM struct iwl_eeprom_channel.flags. | 108 | * Regulatory channel usage flags in EEPROM struct iwl_eeprom_channel.flags. |
@@ -321,6 +320,7 @@ struct iwl3945_eeprom { | |||
321 | /* RSSR */ | 320 | /* RSSR */ |
322 | #define FH_RSSR_CTRL (FH_RSSR_TABLE+0x000) | 321 | #define FH_RSSR_CTRL (FH_RSSR_TABLE+0x000) |
323 | #define FH_RSSR_STATUS (FH_RSSR_TABLE+0x004) | 322 | #define FH_RSSR_STATUS (FH_RSSR_TABLE+0x004) |
323 | #define FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE (0x01000000) | ||
324 | /* TCSR */ | 324 | /* TCSR */ |
325 | #define FH_TCSR(_channel) (FH_TCSR_TABLE+(_channel)*0x20) | 325 | #define FH_TCSR(_channel) (FH_TCSR_TABLE+(_channel)*0x20) |
326 | #define FH_TCSR_CONFIG(_channel) (FH_TCSR(_channel)+0x00) | 326 | #define FH_TCSR_CONFIG(_channel) (FH_TCSR(_channel)+0x00) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-io.h b/drivers/net/wireless/iwlwifi/iwl-3945-io.h index 7dea1552a906..2440fd664dd5 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-io.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-io.h | |||
@@ -21,7 +21,7 @@ | |||
21 | * file called LICENSE. | 21 | * file called LICENSE. |
22 | * | 22 | * |
23 | * Contact Information: | 23 | * Contact Information: |
24 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 24 | * Intel Linux Wireless <ilw@linux.intel.com> |
25 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 25 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
26 | * | 26 | * |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
@@ -93,7 +93,7 @@ static inline int _iwl3945_poll_bit(struct iwl3945_priv *priv, u32 addr, | |||
93 | do { | 93 | do { |
94 | if ((_iwl3945_read32(priv, addr) & mask) == (bits & mask)) | 94 | if ((_iwl3945_read32(priv, addr) & mask) == (bits & mask)) |
95 | return i; | 95 | return i; |
96 | mdelay(10); | 96 | udelay(10); |
97 | i += 10; | 97 | i += 10; |
98 | } while (i < timeout); | 98 | } while (i < timeout); |
99 | 99 | ||
@@ -271,16 +271,7 @@ static inline void iwl3945_write_reg_buf(struct iwl3945_priv *priv, | |||
271 | static inline int _iwl3945_poll_direct_bit(struct iwl3945_priv *priv, | 271 | static inline int _iwl3945_poll_direct_bit(struct iwl3945_priv *priv, |
272 | u32 addr, u32 mask, int timeout) | 272 | u32 addr, u32 mask, int timeout) |
273 | { | 273 | { |
274 | int i = 0; | 274 | return _iwl3945_poll_bit(priv, addr, mask, mask, timeout); |
275 | |||
276 | do { | ||
277 | if ((_iwl3945_read_direct32(priv, addr) & mask) == mask) | ||
278 | return i; | ||
279 | mdelay(10); | ||
280 | i += 10; | ||
281 | } while (i < timeout); | ||
282 | |||
283 | return -ETIMEDOUT; | ||
284 | } | 275 | } |
285 | 276 | ||
286 | #ifdef CONFIG_IWL3945_DEBUG | 277 | #ifdef CONFIG_IWL3945_DEBUG |
@@ -307,6 +298,7 @@ static inline int __iwl3945_poll_direct_bit(const char *f, u32 l, | |||
307 | static inline u32 _iwl3945_read_prph(struct iwl3945_priv *priv, u32 reg) | 298 | static inline u32 _iwl3945_read_prph(struct iwl3945_priv *priv, u32 reg) |
308 | { | 299 | { |
309 | _iwl3945_write_direct32(priv, HBUS_TARG_PRPH_RADDR, reg | (3 << 24)); | 300 | _iwl3945_write_direct32(priv, HBUS_TARG_PRPH_RADDR, reg | (3 << 24)); |
301 | rmb(); | ||
310 | return _iwl3945_read_direct32(priv, HBUS_TARG_PRPH_RDAT); | 302 | return _iwl3945_read_direct32(priv, HBUS_TARG_PRPH_RDAT); |
311 | } | 303 | } |
312 | #ifdef CONFIG_IWL3945_DEBUG | 304 | #ifdef CONFIG_IWL3945_DEBUG |
@@ -328,6 +320,7 @@ static inline void _iwl3945_write_prph(struct iwl3945_priv *priv, | |||
328 | { | 320 | { |
329 | _iwl3945_write_direct32(priv, HBUS_TARG_PRPH_WADDR, | 321 | _iwl3945_write_direct32(priv, HBUS_TARG_PRPH_WADDR, |
330 | ((addr & 0x0000FFFF) | (3 << 24))); | 322 | ((addr & 0x0000FFFF) | (3 << 24))); |
323 | wmb(); | ||
331 | _iwl3945_write_direct32(priv, HBUS_TARG_PRPH_WDAT, val); | 324 | _iwl3945_write_direct32(priv, HBUS_TARG_PRPH_WDAT, val); |
332 | } | 325 | } |
333 | #ifdef CONFIG_IWL3945_DEBUG | 326 | #ifdef CONFIG_IWL3945_DEBUG |
@@ -389,12 +382,14 @@ static inline void iwl3945_clear_bits_prph(struct iwl3945_priv | |||
389 | static inline u32 iwl3945_read_targ_mem(struct iwl3945_priv *priv, u32 addr) | 382 | static inline u32 iwl3945_read_targ_mem(struct iwl3945_priv *priv, u32 addr) |
390 | { | 383 | { |
391 | iwl3945_write_direct32(priv, HBUS_TARG_MEM_RADDR, addr); | 384 | iwl3945_write_direct32(priv, HBUS_TARG_MEM_RADDR, addr); |
385 | rmb(); | ||
392 | return iwl3945_read_direct32(priv, HBUS_TARG_MEM_RDAT); | 386 | return iwl3945_read_direct32(priv, HBUS_TARG_MEM_RDAT); |
393 | } | 387 | } |
394 | 388 | ||
395 | static inline void iwl3945_write_targ_mem(struct iwl3945_priv *priv, u32 addr, u32 val) | 389 | static inline void iwl3945_write_targ_mem(struct iwl3945_priv *priv, u32 addr, u32 val) |
396 | { | 390 | { |
397 | iwl3945_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); | 391 | iwl3945_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); |
392 | wmb(); | ||
398 | iwl3945_write_direct32(priv, HBUS_TARG_MEM_WDAT, val); | 393 | iwl3945_write_direct32(priv, HBUS_TARG_MEM_WDAT, val); |
399 | } | 394 | } |
400 | 395 | ||
@@ -402,6 +397,7 @@ static inline void iwl3945_write_targ_mem_buf(struct iwl3945_priv *priv, u32 add | |||
402 | u32 len, u32 *values) | 397 | u32 len, u32 *values) |
403 | { | 398 | { |
404 | iwl3945_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); | 399 | iwl3945_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); |
400 | wmb(); | ||
405 | for (; 0 < len; len -= sizeof(u32), values++) | 401 | for (; 0 < len; len -= sizeof(u32), values++) |
406 | iwl3945_write_direct32(priv, HBUS_TARG_MEM_WDAT, *values); | 402 | iwl3945_write_direct32(priv, HBUS_TARG_MEM_WDAT, *values); |
407 | } | 403 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-led.c b/drivers/net/wireless/iwlwifi/iwl-3945-led.c index 705c65bed9fd..4c638909a7db 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-led.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945-led.c | |||
@@ -19,7 +19,7 @@ | |||
19 | * file called LICENSE. | 19 | * file called LICENSE. |
20 | * | 20 | * |
21 | * Contact Information: | 21 | * Contact Information: |
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 22 | * Intel Linux Wireless <ilw@linux.intel.com> |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-led.h b/drivers/net/wireless/iwlwifi/iwl-3945-led.h index 2fbd126c1347..749ac035fd6a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-led.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-led.h | |||
@@ -19,7 +19,7 @@ | |||
19 | * file called LICENSE. | 19 | * file called LICENSE. |
20 | * | 20 | * |
21 | * Contact Information: | 21 | * Contact Information: |
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 22 | * Intel Linux Wireless <ilw@linux.intel.com> |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c index b03dd06ceabf..9b60a0c5de5f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c | |||
@@ -19,7 +19,7 @@ | |||
19 | * file called LICENSE. | 19 | * file called LICENSE. |
20 | * | 20 | * |
21 | * Contact Information: | 21 | * Contact Information: |
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 22 | * Intel Linux Wireless <ilw@linux.intel.com> |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
@@ -335,10 +335,11 @@ static void iwl3945_collect_tx_data(struct iwl3945_rs_sta *rs_sta, | |||
335 | 335 | ||
336 | } | 336 | } |
337 | 337 | ||
338 | static void rs_rate_init(void *priv, struct ieee80211_supported_band *sband, | 338 | static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband, |
339 | struct ieee80211_sta *sta, void *priv_sta) | 339 | struct ieee80211_sta *sta, void *priv_sta) |
340 | { | 340 | { |
341 | struct iwl3945_rs_sta *rs_sta = priv_sta; | 341 | struct iwl3945_rs_sta *rs_sta = priv_sta; |
342 | struct iwl3945_priv *priv = (struct iwl3945_priv *)priv_r; | ||
342 | int i; | 343 | int i; |
343 | 344 | ||
344 | IWL_DEBUG_RATE("enter\n"); | 345 | IWL_DEBUG_RATE("enter\n"); |
@@ -348,16 +349,21 @@ static void rs_rate_init(void *priv, struct ieee80211_supported_band *sband, | |||
348 | * previous packets? Need to have IEEE 802.1X auth succeed immediately | 349 | * previous packets? Need to have IEEE 802.1X auth succeed immediately |
349 | * after assoc.. */ | 350 | * after assoc.. */ |
350 | 351 | ||
351 | for (i = IWL_RATE_COUNT - 1; i >= 0; i--) { | 352 | for (i = sband->n_bitrates - 1; i >= 0; i--) { |
352 | if (sta->supp_rates[sband->band] & (1 << i)) { | 353 | if (sta->supp_rates[sband->band] & (1 << i)) { |
353 | rs_sta->last_txrate_idx = i; | 354 | rs_sta->last_txrate_idx = i; |
354 | break; | 355 | break; |
355 | } | 356 | } |
356 | } | 357 | } |
357 | 358 | ||
359 | priv->sta_supp_rates = sta->supp_rates[sband->band]; | ||
358 | /* For 5 GHz band it start at IWL_FIRST_OFDM_RATE */ | 360 | /* For 5 GHz band it start at IWL_FIRST_OFDM_RATE */ |
359 | if (sband->band == IEEE80211_BAND_5GHZ) | 361 | if (sband->band == IEEE80211_BAND_5GHZ) { |
360 | rs_sta->last_txrate_idx += IWL_FIRST_OFDM_RATE; | 362 | rs_sta->last_txrate_idx += IWL_FIRST_OFDM_RATE; |
363 | priv->sta_supp_rates = priv->sta_supp_rates << | ||
364 | IWL_FIRST_OFDM_RATE; | ||
365 | } | ||
366 | |||
361 | 367 | ||
362 | IWL_DEBUG_RATE("leave\n"); | 368 | IWL_DEBUG_RATE("leave\n"); |
363 | } | 369 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-rs.h b/drivers/net/wireless/iwlwifi/iwl-3945-rs.h index 98b17ae6ef24..b5a66135dedd 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-rs.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-rs.h | |||
@@ -19,7 +19,7 @@ | |||
19 | * file called LICENSE. | 19 | * file called LICENSE. |
20 | * | 20 | * |
21 | * Contact Information: | 21 | * Contact Information: |
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 22 | * Intel Linux Wireless <ilw@linux.intel.com> |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index 4e6b7154c223..d0c9bdcf393a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -19,7 +19,7 @@ | |||
19 | * file called LICENSE. | 19 | * file called LICENSE. |
20 | * | 20 | * |
21 | * Contact Information: | 21 | * Contact Information: |
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 22 | * Intel Linux Wireless <ilw@linux.intel.com> |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
@@ -277,12 +277,14 @@ int iwl3945_rs_next_rate(struct iwl3945_priv *priv, int rate) | |||
277 | else if (rate == IWL_RATE_6M_INDEX) | 277 | else if (rate == IWL_RATE_6M_INDEX) |
278 | next_rate = IWL_RATE_6M_INDEX; | 278 | next_rate = IWL_RATE_6M_INDEX; |
279 | break; | 279 | break; |
280 | /* XXX cannot be invoked in current mac80211 so not a regression | 280 | case IEEE80211_BAND_2GHZ: |
281 | case MODE_IEEE80211B: | 281 | if (!(priv->sta_supp_rates & IWL_OFDM_RATES_MASK) && |
282 | if (rate == IWL_RATE_11M_INDEX_TABLE) | 282 | iwl3945_is_associated(priv)) { |
283 | next_rate = IWL_RATE_5M_INDEX_TABLE; | 283 | if (rate == IWL_RATE_11M_INDEX) |
284 | next_rate = IWL_RATE_5M_INDEX; | ||
285 | } | ||
284 | break; | 286 | break; |
285 | */ | 287 | |
286 | default: | 288 | default: |
287 | break; | 289 | break; |
288 | } | 290 | } |
@@ -1101,9 +1103,8 @@ int iwl3945_hw_nic_init(struct iwl3945_priv *priv) | |||
1101 | CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX); | 1103 | CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX); |
1102 | 1104 | ||
1103 | iwl3945_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | 1105 | iwl3945_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); |
1104 | rc = iwl3945_poll_bit(priv, CSR_GP_CNTRL, | 1106 | rc = iwl3945_poll_direct_bit(priv, CSR_GP_CNTRL, |
1105 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | 1107 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); |
1106 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); | ||
1107 | if (rc < 0) { | 1108 | if (rc < 0) { |
1108 | spin_unlock_irqrestore(&priv->lock, flags); | 1109 | spin_unlock_irqrestore(&priv->lock, flags); |
1109 | IWL_DEBUG_INFO("Failed to init the card\n"); | 1110 | IWL_DEBUG_INFO("Failed to init the card\n"); |
@@ -1284,8 +1285,7 @@ int iwl3945_hw_nic_stop_master(struct iwl3945_priv *priv) | |||
1284 | IWL_DEBUG_INFO("Card in power save, master is already " | 1285 | IWL_DEBUG_INFO("Card in power save, master is already " |
1285 | "stopped\n"); | 1286 | "stopped\n"); |
1286 | else { | 1287 | else { |
1287 | rc = iwl3945_poll_bit(priv, CSR_RESET, | 1288 | rc = iwl3945_poll_direct_bit(priv, CSR_RESET, |
1288 | CSR_RESET_REG_FLAG_MASTER_DISABLED, | ||
1289 | CSR_RESET_REG_FLAG_MASTER_DISABLED, 100); | 1289 | CSR_RESET_REG_FLAG_MASTER_DISABLED, 100); |
1290 | if (rc < 0) { | 1290 | if (rc < 0) { |
1291 | spin_unlock_irqrestore(&priv->lock, flags); | 1291 | spin_unlock_irqrestore(&priv->lock, flags); |
@@ -1310,9 +1310,8 @@ int iwl3945_hw_nic_reset(struct iwl3945_priv *priv) | |||
1310 | 1310 | ||
1311 | iwl3945_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET); | 1311 | iwl3945_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET); |
1312 | 1312 | ||
1313 | rc = iwl3945_poll_bit(priv, CSR_GP_CNTRL, | 1313 | iwl3945_poll_direct_bit(priv, CSR_GP_CNTRL, |
1314 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | 1314 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); |
1315 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); | ||
1316 | 1315 | ||
1317 | rc = iwl3945_grab_nic_access(priv); | 1316 | rc = iwl3945_grab_nic_access(priv); |
1318 | if (!rc) { | 1317 | if (!rc) { |
@@ -2309,7 +2308,8 @@ int iwl3945_hw_rxq_stop(struct iwl3945_priv *priv) | |||
2309 | } | 2308 | } |
2310 | 2309 | ||
2311 | iwl3945_write_direct32(priv, FH_RCSR_CONFIG(0), 0); | 2310 | iwl3945_write_direct32(priv, FH_RCSR_CONFIG(0), 0); |
2312 | rc = iwl3945_poll_direct_bit(priv, FH_RSSR_STATUS, (1 << 24), 1000); | 2311 | rc = iwl3945_poll_direct_bit(priv, FH_RSSR_STATUS, |
2312 | FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE, 1000); | ||
2313 | if (rc < 0) | 2313 | if (rc < 0) |
2314 | IWL_ERROR("Can't stop Rx DMA.\n"); | 2314 | IWL_ERROR("Can't stop Rx DMA.\n"); |
2315 | 2315 | ||
@@ -2378,7 +2378,8 @@ int iwl3945_init_hw_rate_table(struct iwl3945_priv *priv) | |||
2378 | iwl3945_hw_set_rate_n_flags(iwl3945_rates[i].plcp, 0); | 2378 | iwl3945_hw_set_rate_n_flags(iwl3945_rates[i].plcp, 0); |
2379 | table[index].try_cnt = priv->retry_rate; | 2379 | table[index].try_cnt = priv->retry_rate; |
2380 | prev_index = iwl3945_get_prev_ieee_rate(i); | 2380 | prev_index = iwl3945_get_prev_ieee_rate(i); |
2381 | table[index].next_rate_index = iwl3945_rates[prev_index].table_rs_index; | 2381 | table[index].next_rate_index = |
2382 | iwl3945_rates[prev_index].table_rs_index; | ||
2382 | } | 2383 | } |
2383 | 2384 | ||
2384 | switch (priv->band) { | 2385 | switch (priv->band) { |
@@ -2386,11 +2387,14 @@ int iwl3945_init_hw_rate_table(struct iwl3945_priv *priv) | |||
2386 | IWL_DEBUG_RATE("Select A mode rate scale\n"); | 2387 | IWL_DEBUG_RATE("Select A mode rate scale\n"); |
2387 | /* If one of the following CCK rates is used, | 2388 | /* If one of the following CCK rates is used, |
2388 | * have it fall back to the 6M OFDM rate */ | 2389 | * have it fall back to the 6M OFDM rate */ |
2389 | for (i = IWL_RATE_1M_INDEX_TABLE; i <= IWL_RATE_11M_INDEX_TABLE; i++) | 2390 | for (i = IWL_RATE_1M_INDEX_TABLE; |
2390 | table[i].next_rate_index = iwl3945_rates[IWL_FIRST_OFDM_RATE].table_rs_index; | 2391 | i <= IWL_RATE_11M_INDEX_TABLE; i++) |
2392 | table[i].next_rate_index = | ||
2393 | iwl3945_rates[IWL_FIRST_OFDM_RATE].table_rs_index; | ||
2391 | 2394 | ||
2392 | /* Don't fall back to CCK rates */ | 2395 | /* Don't fall back to CCK rates */ |
2393 | table[IWL_RATE_12M_INDEX_TABLE].next_rate_index = IWL_RATE_9M_INDEX_TABLE; | 2396 | table[IWL_RATE_12M_INDEX_TABLE].next_rate_index = |
2397 | IWL_RATE_9M_INDEX_TABLE; | ||
2394 | 2398 | ||
2395 | /* Don't drop out of OFDM rates */ | 2399 | /* Don't drop out of OFDM rates */ |
2396 | table[IWL_RATE_6M_INDEX_TABLE].next_rate_index = | 2400 | table[IWL_RATE_6M_INDEX_TABLE].next_rate_index = |
@@ -2401,11 +2405,20 @@ int iwl3945_init_hw_rate_table(struct iwl3945_priv *priv) | |||
2401 | IWL_DEBUG_RATE("Select B/G mode rate scale\n"); | 2405 | IWL_DEBUG_RATE("Select B/G mode rate scale\n"); |
2402 | /* If an OFDM rate is used, have it fall back to the | 2406 | /* If an OFDM rate is used, have it fall back to the |
2403 | * 1M CCK rates */ | 2407 | * 1M CCK rates */ |
2404 | for (i = IWL_RATE_6M_INDEX_TABLE; i <= IWL_RATE_54M_INDEX_TABLE; i++) | ||
2405 | table[i].next_rate_index = iwl3945_rates[IWL_FIRST_CCK_RATE].table_rs_index; | ||
2406 | 2408 | ||
2407 | /* CCK shouldn't fall back to OFDM... */ | 2409 | if (!(priv->sta_supp_rates & IWL_OFDM_RATES_MASK) && |
2408 | table[IWL_RATE_11M_INDEX_TABLE].next_rate_index = IWL_RATE_5M_INDEX_TABLE; | 2410 | iwl3945_is_associated(priv)) { |
2411 | |||
2412 | index = IWL_FIRST_CCK_RATE; | ||
2413 | for (i = IWL_RATE_6M_INDEX_TABLE; | ||
2414 | i <= IWL_RATE_54M_INDEX_TABLE; i++) | ||
2415 | table[i].next_rate_index = | ||
2416 | iwl3945_rates[index].table_rs_index; | ||
2417 | |||
2418 | index = IWL_RATE_11M_INDEX_TABLE; | ||
2419 | /* CCK shouldn't fall back to OFDM... */ | ||
2420 | table[index].next_rate_index = IWL_RATE_5M_INDEX_TABLE; | ||
2421 | } | ||
2409 | break; | 2422 | break; |
2410 | 2423 | ||
2411 | default: | 2424 | default: |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h b/drivers/net/wireless/iwlwifi/iwl-3945.h index 5c2c15e65a63..ec6084c8fd13 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945.h | |||
@@ -19,7 +19,7 @@ | |||
19 | * file called LICENSE. | 19 | * file called LICENSE. |
20 | * | 20 | * |
21 | * Contact Information: | 21 | * Contact Information: |
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 22 | * Intel Linux Wireless <ilw@linux.intel.com> |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
@@ -476,7 +476,6 @@ union iwl3945_qos_capabity { | |||
476 | 476 | ||
477 | /* QoS structures */ | 477 | /* QoS structures */ |
478 | struct iwl3945_qos_info { | 478 | struct iwl3945_qos_info { |
479 | int qos_enable; | ||
480 | int qos_active; | 479 | int qos_active; |
481 | union iwl3945_qos_capabity qos_cap; | 480 | union iwl3945_qos_capabity qos_cap; |
482 | struct iwl3945_qosparam_cmd def_qos_parm; | 481 | struct iwl3945_qosparam_cmd def_qos_parm; |
@@ -810,6 +809,8 @@ struct iwl3945_priv { | |||
810 | u16 active_rate; | 809 | u16 active_rate; |
811 | u16 active_rate_basic; | 810 | u16 active_rate_basic; |
812 | 811 | ||
812 | u32 sta_supp_rates; | ||
813 | |||
813 | u8 call_post_assoc_from_beacon; | 814 | u8 call_post_assoc_from_beacon; |
814 | /* Rate scaling data */ | 815 | /* Rate scaling data */ |
815 | s8 data_retry_limit; | 816 | s8 data_retry_limit; |
@@ -906,9 +907,6 @@ struct iwl3945_priv { | |||
906 | s8 user_txpower_limit; | 907 | s8 user_txpower_limit; |
907 | s8 max_channel_txpower_limit; | 908 | s8 max_channel_txpower_limit; |
908 | 909 | ||
909 | #ifdef CONFIG_PM | ||
910 | u32 pm_state[16]; | ||
911 | #endif | ||
912 | 910 | ||
913 | #ifdef CONFIG_IWL3945_DEBUG | 911 | #ifdef CONFIG_IWL3945_DEBUG |
914 | /* debugging info */ | 912 | /* debugging info */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-hw.h b/drivers/net/wireless/iwlwifi/iwl-4965-hw.h index fb0fd773960f..6649f7b55650 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-hw.h +++ b/drivers/net/wireless/iwlwifi/iwl-4965-hw.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
@@ -84,12 +84,6 @@ | |||
84 | #define IWL_CMD_FIFO_NUM 4 | 84 | #define IWL_CMD_FIFO_NUM 4 |
85 | #define IWL49_FIRST_AMPDU_QUEUE 7 | 85 | #define IWL49_FIRST_AMPDU_QUEUE 7 |
86 | 86 | ||
87 | /* Tx rates */ | ||
88 | #define IWL_CCK_RATES 4 | ||
89 | #define IWL_OFDM_RATES 8 | ||
90 | #define IWL_HT_RATES 16 | ||
91 | #define IWL_MAX_RATES (IWL_CCK_RATES+IWL_OFDM_RATES+IWL_HT_RATES) | ||
92 | |||
93 | /* Time constants */ | 87 | /* Time constants */ |
94 | #define SHORT_SLOT_TIME 9 | 88 | #define SHORT_SLOT_TIME 9 |
95 | #define LONG_SLOT_TIME 20 | 89 | #define LONG_SLOT_TIME 20 |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index 87c7bb0d5044..a7e6e32bd489 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -19,7 +19,7 @@ | |||
19 | * file called LICENSE. | 19 | * file called LICENSE. |
20 | * | 20 | * |
21 | * Contact Information: | 21 | * Contact Information: |
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 22 | * Intel Linux Wireless <ilw@linux.intel.com> |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
@@ -63,7 +63,6 @@ static int iwl4965_hw_get_temperature(const struct iwl_priv *priv); | |||
63 | static struct iwl_mod_params iwl4965_mod_params = { | 63 | static struct iwl_mod_params iwl4965_mod_params = { |
64 | .num_of_queues = IWL49_NUM_QUEUES, | 64 | .num_of_queues = IWL49_NUM_QUEUES, |
65 | .num_of_ampdu_queues = IWL49_NUM_AMPDU_QUEUES, | 65 | .num_of_ampdu_queues = IWL49_NUM_AMPDU_QUEUES, |
66 | .enable_qos = 1, | ||
67 | .amsdu_size_8K = 1, | 66 | .amsdu_size_8K = 1, |
68 | .restart_fw = 1, | 67 | .restart_fw = 1, |
69 | /* the rest are 0 by default */ | 68 | /* the rest are 0 by default */ |
@@ -352,9 +351,8 @@ static int iwl4965_apm_init(struct iwl_priv *priv) | |||
352 | iwl_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | 351 | iwl_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); |
353 | 352 | ||
354 | /* wait for clock stabilization */ | 353 | /* wait for clock stabilization */ |
355 | ret = iwl_poll_bit(priv, CSR_GP_CNTRL, | 354 | ret = iwl_poll_direct_bit(priv, CSR_GP_CNTRL, |
356 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | 355 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); |
357 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); | ||
358 | if (ret < 0) { | 356 | if (ret < 0) { |
359 | IWL_DEBUG_INFO("Failed to init the card\n"); | 357 | IWL_DEBUG_INFO("Failed to init the card\n"); |
360 | goto out; | 358 | goto out; |
@@ -436,9 +434,8 @@ static int iwl4965_apm_stop_master(struct iwl_priv *priv) | |||
436 | /* set stop master bit */ | 434 | /* set stop master bit */ |
437 | iwl_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER); | 435 | iwl_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER); |
438 | 436 | ||
439 | ret = iwl_poll_bit(priv, CSR_RESET, | 437 | ret = iwl_poll_direct_bit(priv, CSR_RESET, |
440 | CSR_RESET_REG_FLAG_MASTER_DISABLED, | 438 | CSR_RESET_REG_FLAG_MASTER_DISABLED, 100); |
441 | CSR_RESET_REG_FLAG_MASTER_DISABLED, 100); | ||
442 | if (ret < 0) | 439 | if (ret < 0) |
443 | goto out; | 440 | goto out; |
444 | 441 | ||
@@ -482,11 +479,9 @@ static int iwl4965_apm_reset(struct iwl_priv *priv) | |||
482 | 479 | ||
483 | iwl_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | 480 | iwl_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); |
484 | 481 | ||
485 | ret = iwl_poll_bit(priv, CSR_RESET, | 482 | ret = iwl_poll_direct_bit(priv, CSR_GP_CNTRL, |
486 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | 483 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); |
487 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25); | 484 | if (ret < 0) |
488 | |||
489 | if (ret) | ||
490 | goto out; | 485 | goto out; |
491 | 486 | ||
492 | udelay(10); | 487 | udelay(10); |
@@ -2367,9 +2362,6 @@ MODULE_PARM_DESC(disable_hw_scan, "disable hardware scanning (default 0)"); | |||
2367 | 2362 | ||
2368 | module_param_named(queues_num, iwl4965_mod_params.num_of_queues, int, 0444); | 2363 | module_param_named(queues_num, iwl4965_mod_params.num_of_queues, int, 0444); |
2369 | MODULE_PARM_DESC(queues_num, "number of hw queues."); | 2364 | MODULE_PARM_DESC(queues_num, "number of hw queues."); |
2370 | /* QoS */ | ||
2371 | module_param_named(qos_enable, iwl4965_mod_params.enable_qos, int, 0444); | ||
2372 | MODULE_PARM_DESC(qos_enable, "enable all QoS functionality"); | ||
2373 | /* 11n */ | 2365 | /* 11n */ |
2374 | module_param_named(11n_disable, iwl4965_mod_params.disable_11n, int, 0444); | 2366 | module_param_named(11n_disable, iwl4965_mod_params.disable_11n, int, 0444); |
2375 | MODULE_PARM_DESC(11n_disable, "disable 11n functionality"); | 2367 | MODULE_PARM_DESC(11n_disable, "disable 11n functionality"); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000-hw.h b/drivers/net/wireless/iwlwifi/iwl-5000-hw.h index c6595e8b4405..82c3859ce0f8 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000-hw.h +++ b/drivers/net/wireless/iwlwifi/iwl-5000-hw.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index 438e4bd0a9a8..2344de945974 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
@@ -81,8 +81,7 @@ static int iwl5000_apm_stop_master(struct iwl_priv *priv) | |||
81 | /* set stop master bit */ | 81 | /* set stop master bit */ |
82 | iwl_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER); | 82 | iwl_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER); |
83 | 83 | ||
84 | ret = iwl_poll_bit(priv, CSR_RESET, | 84 | ret = iwl_poll_direct_bit(priv, CSR_RESET, |
85 | CSR_RESET_REG_FLAG_MASTER_DISABLED, | ||
86 | CSR_RESET_REG_FLAG_MASTER_DISABLED, 100); | 85 | CSR_RESET_REG_FLAG_MASTER_DISABLED, 100); |
87 | if (ret < 0) | 86 | if (ret < 0) |
88 | goto out; | 87 | goto out; |
@@ -120,9 +119,8 @@ static int iwl5000_apm_init(struct iwl_priv *priv) | |||
120 | iwl_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | 119 | iwl_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); |
121 | 120 | ||
122 | /* wait for clock stabilization */ | 121 | /* wait for clock stabilization */ |
123 | ret = iwl_poll_bit(priv, CSR_GP_CNTRL, | 122 | ret = iwl_poll_direct_bit(priv, CSR_GP_CNTRL, |
124 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | 123 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); |
125 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); | ||
126 | if (ret < 0) { | 124 | if (ret < 0) { |
127 | IWL_DEBUG_INFO("Failed to init the card\n"); | 125 | IWL_DEBUG_INFO("Failed to init the card\n"); |
128 | return ret; | 126 | return ret; |
@@ -189,9 +187,8 @@ static int iwl5000_apm_reset(struct iwl_priv *priv) | |||
189 | iwl_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | 187 | iwl_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); |
190 | 188 | ||
191 | /* wait for clock stabilization */ | 189 | /* wait for clock stabilization */ |
192 | ret = iwl_poll_bit(priv, CSR_GP_CNTRL, | 190 | ret = iwl_poll_direct_bit(priv, CSR_GP_CNTRL, |
193 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | 191 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); |
194 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); | ||
195 | if (ret < 0) { | 192 | if (ret < 0) { |
196 | IWL_DEBUG_INFO("Failed to init the card\n"); | 193 | IWL_DEBUG_INFO("Failed to init the card\n"); |
197 | goto out; | 194 | goto out; |
@@ -1533,7 +1530,6 @@ static struct iwl_ops iwl5000_ops = { | |||
1533 | static struct iwl_mod_params iwl50_mod_params = { | 1530 | static struct iwl_mod_params iwl50_mod_params = { |
1534 | .num_of_queues = IWL50_NUM_QUEUES, | 1531 | .num_of_queues = IWL50_NUM_QUEUES, |
1535 | .num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES, | 1532 | .num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES, |
1536 | .enable_qos = 1, | ||
1537 | .amsdu_size_8K = 1, | 1533 | .amsdu_size_8K = 1, |
1538 | .restart_fw = 1, | 1534 | .restart_fw = 1, |
1539 | /* the rest are 0 by default */ | 1535 | /* the rest are 0 by default */ |
@@ -1631,8 +1627,6 @@ module_param_named(debug50, iwl50_mod_params.debug, int, 0444); | |||
1631 | MODULE_PARM_DESC(debug50, "50XX debug output mask"); | 1627 | MODULE_PARM_DESC(debug50, "50XX debug output mask"); |
1632 | module_param_named(queues_num50, iwl50_mod_params.num_of_queues, int, 0444); | 1628 | module_param_named(queues_num50, iwl50_mod_params.num_of_queues, int, 0444); |
1633 | MODULE_PARM_DESC(queues_num50, "number of hw queues in 50xx series"); | 1629 | MODULE_PARM_DESC(queues_num50, "number of hw queues in 50xx series"); |
1634 | module_param_named(qos_enable50, iwl50_mod_params.enable_qos, int, 0444); | ||
1635 | MODULE_PARM_DESC(qos_enable50, "enable all 50XX QoS functionality"); | ||
1636 | module_param_named(11n_disable50, iwl50_mod_params.disable_11n, int, 0444); | 1630 | module_param_named(11n_disable50, iwl50_mod_params.disable_11n, int, 0444); |
1637 | MODULE_PARM_DESC(11n_disable50, "disable 50XX 11n functionality"); | 1631 | MODULE_PARM_DESC(11n_disable50, "disable 50XX 11n functionality"); |
1638 | module_param_named(amsdu_size_8K50, iwl50_mod_params.amsdu_size_8K, int, 0444); | 1632 | module_param_named(amsdu_size_8K50, iwl50_mod_params.amsdu_size_8K, int, 0444); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd-check.c b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd-check.c index c50494a74f67..b8137eeae1db 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd-check.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd-check.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * in the file called LICENSE.GPL. | 22 | * in the file called LICENSE.GPL. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * Tomas Winkler <tomas.winkler@intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
28 | 28 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index 3a2b81291d86..37b892044a18 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
@@ -19,7 +19,7 @@ | |||
19 | * file called LICENSE. | 19 | * file called LICENSE. |
20 | * | 20 | * |
21 | * Contact Information: | 21 | * Contact Information: |
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 22 | * Intel Linux Wireless <ilw@linux.intel.com> |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
@@ -38,7 +38,6 @@ | |||
38 | #include "iwl-dev.h" | 38 | #include "iwl-dev.h" |
39 | #include "iwl-sta.h" | 39 | #include "iwl-sta.h" |
40 | #include "iwl-core.h" | 40 | #include "iwl-core.h" |
41 | #include "iwl-helpers.h" | ||
42 | 41 | ||
43 | #define RS_NAME "iwl-agn-rs" | 42 | #define RS_NAME "iwl-agn-rs" |
44 | 43 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.h b/drivers/net/wireless/iwlwifi/iwl-agn-rs.h index adcbf538ed54..78ee83adf742 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.h +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.h | |||
@@ -19,7 +19,7 @@ | |||
19 | * file called LICENSE. | 19 | * file called LICENSE. |
20 | * | 20 | * |
21 | * Contact Information: | 21 | * Contact Information: |
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 22 | * Intel Linux Wireless <ilw@linux.intel.com> |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index b3c263d2724f..2f5e86e12916 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * file called LICENSE. | 22 | * file called LICENSE. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | * | 27 | * |
28 | *****************************************************************************/ | 28 | *****************************************************************************/ |
@@ -83,7 +83,7 @@ | |||
83 | 83 | ||
84 | MODULE_DESCRIPTION(DRV_DESCRIPTION); | 84 | MODULE_DESCRIPTION(DRV_DESCRIPTION); |
85 | MODULE_VERSION(DRV_VERSION); | 85 | MODULE_VERSION(DRV_VERSION); |
86 | MODULE_AUTHOR(DRV_COPYRIGHT); | 86 | MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR); |
87 | MODULE_LICENSE("GPL"); | 87 | MODULE_LICENSE("GPL"); |
88 | MODULE_ALIAS("iwl4965"); | 88 | MODULE_ALIAS("iwl4965"); |
89 | 89 | ||
@@ -310,7 +310,7 @@ void iwl_update_chain_flags(struct iwl_priv *priv) | |||
310 | 310 | ||
311 | static int iwl_send_bt_config(struct iwl_priv *priv) | 311 | static int iwl_send_bt_config(struct iwl_priv *priv) |
312 | { | 312 | { |
313 | struct iwl4965_bt_cmd bt_cmd = { | 313 | struct iwl_bt_cmd bt_cmd = { |
314 | .flags = 3, | 314 | .flags = 3, |
315 | .lead_time = 0xAA, | 315 | .lead_time = 0xAA, |
316 | .max_kill = 1, | 316 | .max_kill = 1, |
@@ -319,7 +319,7 @@ static int iwl_send_bt_config(struct iwl_priv *priv) | |||
319 | }; | 319 | }; |
320 | 320 | ||
321 | return iwl_send_cmd_pdu(priv, REPLY_BT_CONFIG, | 321 | return iwl_send_cmd_pdu(priv, REPLY_BT_CONFIG, |
322 | sizeof(struct iwl4965_bt_cmd), &bt_cmd); | 322 | sizeof(struct iwl_bt_cmd), &bt_cmd); |
323 | } | 323 | } |
324 | 324 | ||
325 | static void iwl_clear_free_frames(struct iwl_priv *priv) | 325 | static void iwl_clear_free_frames(struct iwl_priv *priv) |
@@ -546,9 +546,6 @@ static void iwl_activate_qos(struct iwl_priv *priv, u8 force) | |||
546 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 546 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
547 | return; | 547 | return; |
548 | 548 | ||
549 | if (!priv->qos_data.qos_enable) | ||
550 | return; | ||
551 | |||
552 | priv->qos_data.def_qos_parm.qos_flags = 0; | 549 | priv->qos_data.def_qos_parm.qos_flags = 0; |
553 | 550 | ||
554 | if (priv->qos_data.qos_cap.q_AP.queue_request && | 551 | if (priv->qos_data.qos_cap.q_AP.queue_request && |
@@ -860,7 +857,7 @@ static void iwl_rx_csa(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb) | |||
860 | { | 857 | { |
861 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; | 858 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; |
862 | struct iwl_rxon_cmd *rxon = (void *)&priv->active_rxon; | 859 | struct iwl_rxon_cmd *rxon = (void *)&priv->active_rxon; |
863 | struct iwl4965_csa_notification *csa = &(pkt->u.csa_notif); | 860 | struct iwl_csa_notification *csa = &(pkt->u.csa_notif); |
864 | IWL_DEBUG_11H("CSA notif: channel %d, status %d\n", | 861 | IWL_DEBUG_11H("CSA notif: channel %d, status %d\n", |
865 | le16_to_cpu(csa->channel), le32_to_cpu(csa->status)); | 862 | le16_to_cpu(csa->channel), le32_to_cpu(csa->status)); |
866 | rxon->channel = csa->channel; | 863 | rxon->channel = csa->channel; |
@@ -872,7 +869,7 @@ static void iwl_rx_pm_sleep_notif(struct iwl_priv *priv, | |||
872 | { | 869 | { |
873 | #ifdef CONFIG_IWLWIFI_DEBUG | 870 | #ifdef CONFIG_IWLWIFI_DEBUG |
874 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; | 871 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; |
875 | struct iwl4965_sleep_notification *sleep = &(pkt->u.sleep_notif); | 872 | struct iwl_sleep_notification *sleep = &(pkt->u.sleep_notif); |
876 | IWL_DEBUG_RX("sleep mode: %d, src: %d\n", | 873 | IWL_DEBUG_RX("sleep mode: %d, src: %d\n", |
877 | sleep->pm_sleep_mode, sleep->pm_wakeup_src); | 874 | sleep->pm_sleep_mode, sleep->pm_wakeup_src); |
878 | #endif | 875 | #endif |
@@ -942,7 +939,8 @@ static void iwl_rx_beacon_notif(struct iwl_priv *priv, | |||
942 | { | 939 | { |
943 | #ifdef CONFIG_IWLWIFI_DEBUG | 940 | #ifdef CONFIG_IWLWIFI_DEBUG |
944 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; | 941 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; |
945 | struct iwl4965_beacon_notif *beacon = &(pkt->u.beacon_status); | 942 | struct iwl4965_beacon_notif *beacon = |
943 | (struct iwl4965_beacon_notif *)pkt->u.raw; | ||
946 | u8 rate = iwl_hw_get_rate(beacon->beacon_notify_hdr.rate_n_flags); | 944 | u8 rate = iwl_hw_get_rate(beacon->beacon_notify_hdr.rate_n_flags); |
947 | 945 | ||
948 | IWL_DEBUG_RX("beacon status %x retries %d iss %d " | 946 | IWL_DEBUG_RX("beacon status %x retries %d iss %d " |
@@ -1405,8 +1403,11 @@ static void iwl_irq_tasklet(struct iwl_priv *priv) | |||
1405 | * the driver as well won't allow loading if RFKILL is set | 1403 | * the driver as well won't allow loading if RFKILL is set |
1406 | * therefore no need to restart the driver from this handler | 1404 | * therefore no need to restart the driver from this handler |
1407 | */ | 1405 | */ |
1408 | if (!hw_rf_kill && !test_bit(STATUS_ALIVE, &priv->status)) | 1406 | if (!hw_rf_kill && !test_bit(STATUS_ALIVE, &priv->status)) { |
1409 | clear_bit(STATUS_RF_KILL_HW, &priv->status); | 1407 | clear_bit(STATUS_RF_KILL_HW, &priv->status); |
1408 | if (priv->is_open && !iwl_is_rfkill(priv)) | ||
1409 | queue_work(priv->workqueue, &priv->up); | ||
1410 | } | ||
1410 | 1411 | ||
1411 | handled |= CSR_INT_BIT_RF_KILL; | 1412 | handled |= CSR_INT_BIT_RF_KILL; |
1412 | } | 1413 | } |
@@ -2963,12 +2964,6 @@ static int iwl_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t ssid_len) | |||
2963 | goto out_unlock; | 2964 | goto out_unlock; |
2964 | } | 2965 | } |
2965 | 2966 | ||
2966 | if (priv->iw_mode == NL80211_IFTYPE_AP) { /* APs don't scan */ | ||
2967 | ret = -EIO; | ||
2968 | IWL_ERROR("ERROR: APs don't scan\n"); | ||
2969 | goto out_unlock; | ||
2970 | } | ||
2971 | |||
2972 | /* We don't schedule scan within next_scan_jiffies period. | 2967 | /* We don't schedule scan within next_scan_jiffies period. |
2973 | * Avoid scanning during possible EAPOL exchange, return | 2968 | * Avoid scanning during possible EAPOL exchange, return |
2974 | * success immediately. | 2969 | * success immediately. |
@@ -3112,11 +3107,6 @@ static int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue, | |||
3112 | return 0; | 3107 | return 0; |
3113 | } | 3108 | } |
3114 | 3109 | ||
3115 | if (!priv->qos_data.qos_enable) { | ||
3116 | priv->qos_data.qos_active = 0; | ||
3117 | IWL_DEBUG_MAC80211("leave - qos not enabled\n"); | ||
3118 | return 0; | ||
3119 | } | ||
3120 | q = AC_NUM - 1 - queue; | 3110 | q = AC_NUM - 1 - queue; |
3121 | 3111 | ||
3122 | spin_lock_irqsave(&priv->lock, flags); | 3112 | spin_lock_irqsave(&priv->lock, flags); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-calib.c b/drivers/net/wireless/iwlwifi/iwl-calib.c index 25f4658f1a76..7956e0873614 100644 --- a/drivers/net/wireless/iwlwifi/iwl-calib.c +++ b/drivers/net/wireless/iwlwifi/iwl-calib.c | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * Tomas Winkler <tomas.winkler@intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
diff --git a/drivers/net/wireless/iwlwifi/iwl-calib.h b/drivers/net/wireless/iwlwifi/iwl-calib.h index 94c8e316382a..1abe84bb74ad 100644 --- a/drivers/net/wireless/iwlwifi/iwl-calib.h +++ b/drivers/net/wireless/iwlwifi/iwl-calib.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * Tomas Winkler <tomas.winkler@intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index 528bcab49d13..60e79d9bd725 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
@@ -94,6 +94,7 @@ enum { | |||
94 | REPLY_WEPKEY = 0x20, | 94 | REPLY_WEPKEY = 0x20, |
95 | 95 | ||
96 | /* RX, TX, LEDs */ | 96 | /* RX, TX, LEDs */ |
97 | REPLY_3945_RX = 0x1b, /* 3945 only */ | ||
97 | REPLY_TX = 0x1c, | 98 | REPLY_TX = 0x1c, |
98 | REPLY_RATE_SCALE = 0x47, /* 3945 only */ | 99 | REPLY_RATE_SCALE = 0x47, /* 3945 only */ |
99 | REPLY_LEDS_CMD = 0x48, | 100 | REPLY_LEDS_CMD = 0x48, |
@@ -701,7 +702,7 @@ struct iwl_rxon_time_cmd { | |||
701 | /* | 702 | /* |
702 | * REPLY_CHANNEL_SWITCH = 0x72 (command, has simple generic response) | 703 | * REPLY_CHANNEL_SWITCH = 0x72 (command, has simple generic response) |
703 | */ | 704 | */ |
704 | struct iwl4965_channel_switch_cmd { | 705 | struct iwl_channel_switch_cmd { |
705 | u8 band; | 706 | u8 band; |
706 | u8 expect_beacon; | 707 | u8 expect_beacon; |
707 | __le16 channel; | 708 | __le16 channel; |
@@ -714,7 +715,7 @@ struct iwl4965_channel_switch_cmd { | |||
714 | /* | 715 | /* |
715 | * CHANNEL_SWITCH_NOTIFICATION = 0x73 (notification only, not a command) | 716 | * CHANNEL_SWITCH_NOTIFICATION = 0x73 (notification only, not a command) |
716 | */ | 717 | */ |
717 | struct iwl4965_csa_notification { | 718 | struct iwl_csa_notification { |
718 | __le16 band; | 719 | __le16 band; |
719 | __le16 channel; | 720 | __le16 channel; |
720 | __le32 status; /* 0 - OK, 1 - fail */ | 721 | __le32 status; /* 0 - OK, 1 - fail */ |
@@ -1023,25 +1024,6 @@ struct iwl_wep_cmd { | |||
1023 | * | 1024 | * |
1024 | *****************************************************************************/ | 1025 | *****************************************************************************/ |
1025 | 1026 | ||
1026 | struct iwl4965_rx_frame_stats { | ||
1027 | u8 phy_count; | ||
1028 | u8 id; | ||
1029 | u8 rssi; | ||
1030 | u8 agc; | ||
1031 | __le16 sig_avg; | ||
1032 | __le16 noise_diff; | ||
1033 | u8 payload[0]; | ||
1034 | } __attribute__ ((packed)); | ||
1035 | |||
1036 | struct iwl4965_rx_frame_hdr { | ||
1037 | __le16 channel; | ||
1038 | __le16 phy_flags; | ||
1039 | u8 reserved1; | ||
1040 | u8 rate; | ||
1041 | __le16 len; | ||
1042 | u8 payload[0]; | ||
1043 | } __attribute__ ((packed)); | ||
1044 | |||
1045 | #define RX_RES_STATUS_NO_CRC32_ERROR cpu_to_le32(1 << 0) | 1027 | #define RX_RES_STATUS_NO_CRC32_ERROR cpu_to_le32(1 << 0) |
1046 | #define RX_RES_STATUS_NO_RXE_OVERFLOW cpu_to_le32(1 << 1) | 1028 | #define RX_RES_STATUS_NO_RXE_OVERFLOW cpu_to_le32(1 << 1) |
1047 | 1029 | ||
@@ -1072,26 +1054,6 @@ struct iwl4965_rx_frame_hdr { | |||
1072 | #define RX_MPDU_RES_STATUS_TTAK_OK (1 << 7) | 1054 | #define RX_MPDU_RES_STATUS_TTAK_OK (1 << 7) |
1073 | #define RX_MPDU_RES_STATUS_DEC_DONE_MSK (0x800) | 1055 | #define RX_MPDU_RES_STATUS_DEC_DONE_MSK (0x800) |
1074 | 1056 | ||
1075 | struct iwl4965_rx_frame_end { | ||
1076 | __le32 status; | ||
1077 | __le64 timestamp; | ||
1078 | __le32 beacon_timestamp; | ||
1079 | } __attribute__ ((packed)); | ||
1080 | |||
1081 | /* | ||
1082 | * REPLY_3945_RX = 0x1b (response only, not a command) | ||
1083 | * | ||
1084 | * NOTE: DO NOT dereference from casts to this structure | ||
1085 | * It is provided only for calculating minimum data set size. | ||
1086 | * The actual offsets of the hdr and end are dynamic based on | ||
1087 | * stats.phy_count | ||
1088 | */ | ||
1089 | struct iwl4965_rx_frame { | ||
1090 | struct iwl4965_rx_frame_stats stats; | ||
1091 | struct iwl4965_rx_frame_hdr hdr; | ||
1092 | struct iwl4965_rx_frame_end end; | ||
1093 | } __attribute__ ((packed)); | ||
1094 | |||
1095 | /* Fixed (non-configurable) rx data from phy */ | 1057 | /* Fixed (non-configurable) rx data from phy */ |
1096 | 1058 | ||
1097 | #define IWL49_RX_RES_PHY_CNT 14 | 1059 | #define IWL49_RX_RES_PHY_CNT 14 |
@@ -1276,7 +1238,7 @@ struct iwl4965_rx_mpdu_res_start { | |||
1276 | * Used for managing Tx retries when expecting block-acks. | 1238 | * Used for managing Tx retries when expecting block-acks. |
1277 | * Driver should set these fields to 0. | 1239 | * Driver should set these fields to 0. |
1278 | */ | 1240 | */ |
1279 | struct iwl4965_dram_scratch { | 1241 | struct iwl_dram_scratch { |
1280 | u8 try_cnt; /* Tx attempts */ | 1242 | u8 try_cnt; /* Tx attempts */ |
1281 | u8 bt_kill_cnt; /* Tx attempts blocked by Bluetooth device */ | 1243 | u8 bt_kill_cnt; /* Tx attempts blocked by Bluetooth device */ |
1282 | __le16 reserved; | 1244 | __le16 reserved; |
@@ -1307,9 +1269,9 @@ struct iwl_tx_cmd { | |||
1307 | 1269 | ||
1308 | __le32 tx_flags; /* TX_CMD_FLG_* */ | 1270 | __le32 tx_flags; /* TX_CMD_FLG_* */ |
1309 | 1271 | ||
1310 | /* 4965's uCode may modify this field of the Tx command (in host DRAM!). | 1272 | /* uCode may modify this field of the Tx command (in host DRAM!). |
1311 | * Driver must also set dram_lsb_ptr and dram_msb_ptr in this cmd. */ | 1273 | * Driver must also set dram_lsb_ptr and dram_msb_ptr in this cmd. */ |
1312 | struct iwl4965_dram_scratch scratch; | 1274 | struct iwl_dram_scratch scratch; |
1313 | 1275 | ||
1314 | /* Rate for *all* Tx attempts, if TX_CMD_FLG_STA_RATE_MSK is cleared. */ | 1276 | /* Rate for *all* Tx attempts, if TX_CMD_FLG_STA_RATE_MSK is cleared. */ |
1315 | __le32 rate_n_flags; /* RATE_MCS_* */ | 1277 | __le32 rate_n_flags; /* RATE_MCS_* */ |
@@ -1917,7 +1879,7 @@ struct iwl_link_quality_cmd { | |||
1917 | * same platform. Bluetooth device alerts wireless device when it will Tx; | 1879 | * same platform. Bluetooth device alerts wireless device when it will Tx; |
1918 | * wireless device can delay or kill its own Tx to accommodate. | 1880 | * wireless device can delay or kill its own Tx to accommodate. |
1919 | */ | 1881 | */ |
1920 | struct iwl4965_bt_cmd { | 1882 | struct iwl_bt_cmd { |
1921 | u8 flags; | 1883 | u8 flags; |
1922 | u8 lead_time; | 1884 | u8 lead_time; |
1923 | u8 max_kill; | 1885 | u8 max_kill; |
@@ -1943,18 +1905,18 @@ struct iwl4965_bt_cmd { | |||
1943 | RXON_FILTER_ASSOC_MSK | \ | 1905 | RXON_FILTER_ASSOC_MSK | \ |
1944 | RXON_FILTER_BCON_AWARE_MSK) | 1906 | RXON_FILTER_BCON_AWARE_MSK) |
1945 | 1907 | ||
1946 | struct iwl4965_measure_channel { | 1908 | struct iwl_measure_channel { |
1947 | __le32 duration; /* measurement duration in extended beacon | 1909 | __le32 duration; /* measurement duration in extended beacon |
1948 | * format */ | 1910 | * format */ |
1949 | u8 channel; /* channel to measure */ | 1911 | u8 channel; /* channel to measure */ |
1950 | u8 type; /* see enum iwl4965_measure_type */ | 1912 | u8 type; /* see enum iwl_measure_type */ |
1951 | __le16 reserved; | 1913 | __le16 reserved; |
1952 | } __attribute__ ((packed)); | 1914 | } __attribute__ ((packed)); |
1953 | 1915 | ||
1954 | /* | 1916 | /* |
1955 | * REPLY_SPECTRUM_MEASUREMENT_CMD = 0x74 (command) | 1917 | * REPLY_SPECTRUM_MEASUREMENT_CMD = 0x74 (command) |
1956 | */ | 1918 | */ |
1957 | struct iwl4965_spectrum_cmd { | 1919 | struct iwl_spectrum_cmd { |
1958 | __le16 len; /* number of bytes starting from token */ | 1920 | __le16 len; /* number of bytes starting from token */ |
1959 | u8 token; /* token id */ | 1921 | u8 token; /* token id */ |
1960 | u8 id; /* measurement id -- 0 or 1 */ | 1922 | u8 id; /* measurement id -- 0 or 1 */ |
@@ -1967,13 +1929,13 @@ struct iwl4965_spectrum_cmd { | |||
1967 | __le32 filter_flags; /* rxon filter flags */ | 1929 | __le32 filter_flags; /* rxon filter flags */ |
1968 | __le16 channel_count; /* minimum 1, maximum 10 */ | 1930 | __le16 channel_count; /* minimum 1, maximum 10 */ |
1969 | __le16 reserved3; | 1931 | __le16 reserved3; |
1970 | struct iwl4965_measure_channel channels[10]; | 1932 | struct iwl_measure_channel channels[10]; |
1971 | } __attribute__ ((packed)); | 1933 | } __attribute__ ((packed)); |
1972 | 1934 | ||
1973 | /* | 1935 | /* |
1974 | * REPLY_SPECTRUM_MEASUREMENT_CMD = 0x74 (response) | 1936 | * REPLY_SPECTRUM_MEASUREMENT_CMD = 0x74 (response) |
1975 | */ | 1937 | */ |
1976 | struct iwl4965_spectrum_resp { | 1938 | struct iwl_spectrum_resp { |
1977 | u8 token; | 1939 | u8 token; |
1978 | u8 id; /* id of the prior command replaced, or 0xff */ | 1940 | u8 id; /* id of the prior command replaced, or 0xff */ |
1979 | __le16 status; /* 0 - command will be handled | 1941 | __le16 status; /* 0 - command will be handled |
@@ -1981,12 +1943,12 @@ struct iwl4965_spectrum_resp { | |||
1981 | * measurement) */ | 1943 | * measurement) */ |
1982 | } __attribute__ ((packed)); | 1944 | } __attribute__ ((packed)); |
1983 | 1945 | ||
1984 | enum iwl4965_measurement_state { | 1946 | enum iwl_measurement_state { |
1985 | IWL_MEASUREMENT_START = 0, | 1947 | IWL_MEASUREMENT_START = 0, |
1986 | IWL_MEASUREMENT_STOP = 1, | 1948 | IWL_MEASUREMENT_STOP = 1, |
1987 | }; | 1949 | }; |
1988 | 1950 | ||
1989 | enum iwl4965_measurement_status { | 1951 | enum iwl_measurement_status { |
1990 | IWL_MEASUREMENT_OK = 0, | 1952 | IWL_MEASUREMENT_OK = 0, |
1991 | IWL_MEASUREMENT_CONCURRENT = 1, | 1953 | IWL_MEASUREMENT_CONCURRENT = 1, |
1992 | IWL_MEASUREMENT_CSA_CONFLICT = 2, | 1954 | IWL_MEASUREMENT_CSA_CONFLICT = 2, |
@@ -1999,18 +1961,18 @@ enum iwl4965_measurement_status { | |||
1999 | 1961 | ||
2000 | #define NUM_ELEMENTS_IN_HISTOGRAM 8 | 1962 | #define NUM_ELEMENTS_IN_HISTOGRAM 8 |
2001 | 1963 | ||
2002 | struct iwl4965_measurement_histogram { | 1964 | struct iwl_measurement_histogram { |
2003 | __le32 ofdm[NUM_ELEMENTS_IN_HISTOGRAM]; /* in 0.8usec counts */ | 1965 | __le32 ofdm[NUM_ELEMENTS_IN_HISTOGRAM]; /* in 0.8usec counts */ |
2004 | __le32 cck[NUM_ELEMENTS_IN_HISTOGRAM]; /* in 1usec counts */ | 1966 | __le32 cck[NUM_ELEMENTS_IN_HISTOGRAM]; /* in 1usec counts */ |
2005 | } __attribute__ ((packed)); | 1967 | } __attribute__ ((packed)); |
2006 | 1968 | ||
2007 | /* clear channel availability counters */ | 1969 | /* clear channel availability counters */ |
2008 | struct iwl4965_measurement_cca_counters { | 1970 | struct iwl_measurement_cca_counters { |
2009 | __le32 ofdm; | 1971 | __le32 ofdm; |
2010 | __le32 cck; | 1972 | __le32 cck; |
2011 | } __attribute__ ((packed)); | 1973 | } __attribute__ ((packed)); |
2012 | 1974 | ||
2013 | enum iwl4965_measure_type { | 1975 | enum iwl_measure_type { |
2014 | IWL_MEASURE_BASIC = (1 << 0), | 1976 | IWL_MEASURE_BASIC = (1 << 0), |
2015 | IWL_MEASURE_CHANNEL_LOAD = (1 << 1), | 1977 | IWL_MEASURE_CHANNEL_LOAD = (1 << 1), |
2016 | IWL_MEASURE_HISTOGRAM_RPI = (1 << 2), | 1978 | IWL_MEASURE_HISTOGRAM_RPI = (1 << 2), |
@@ -2023,7 +1985,7 @@ enum iwl4965_measure_type { | |||
2023 | /* | 1985 | /* |
2024 | * SPECTRUM_MEASURE_NOTIFICATION = 0x75 (notification only, not a command) | 1986 | * SPECTRUM_MEASURE_NOTIFICATION = 0x75 (notification only, not a command) |
2025 | */ | 1987 | */ |
2026 | struct iwl4965_spectrum_notification { | 1988 | struct iwl_spectrum_notification { |
2027 | u8 id; /* measurement id -- 0 or 1 */ | 1989 | u8 id; /* measurement id -- 0 or 1 */ |
2028 | u8 token; | 1990 | u8 token; |
2029 | u8 channel_index; /* index in measurement channel list */ | 1991 | u8 channel_index; /* index in measurement channel list */ |
@@ -2031,7 +1993,7 @@ struct iwl4965_spectrum_notification { | |||
2031 | __le32 start_time; /* lower 32-bits of TSF */ | 1993 | __le32 start_time; /* lower 32-bits of TSF */ |
2032 | u8 band; /* 0 - 5.2GHz, 1 - 2.4GHz */ | 1994 | u8 band; /* 0 - 5.2GHz, 1 - 2.4GHz */ |
2033 | u8 channel; | 1995 | u8 channel; |
2034 | u8 type; /* see enum iwl4965_measurement_type */ | 1996 | u8 type; /* see enum iwl_measurement_type */ |
2035 | u8 reserved1; | 1997 | u8 reserved1; |
2036 | /* NOTE: cca_ofdm, cca_cck, basic_type, and histogram are only only | 1998 | /* NOTE: cca_ofdm, cca_cck, basic_type, and histogram are only only |
2037 | * valid if applicable for measurement type requested. */ | 1999 | * valid if applicable for measurement type requested. */ |
@@ -2041,9 +2003,9 @@ struct iwl4965_spectrum_notification { | |||
2041 | u8 basic_type; /* 0 - bss, 1 - ofdm preamble, 2 - | 2003 | u8 basic_type; /* 0 - bss, 1 - ofdm preamble, 2 - |
2042 | * unidentified */ | 2004 | * unidentified */ |
2043 | u8 reserved2[3]; | 2005 | u8 reserved2[3]; |
2044 | struct iwl4965_measurement_histogram histogram; | 2006 | struct iwl_measurement_histogram histogram; |
2045 | __le32 stop_time; /* lower 32-bits of TSF */ | 2007 | __le32 stop_time; /* lower 32-bits of TSF */ |
2046 | __le32 status; /* see iwl4965_measurement_status */ | 2008 | __le32 status; /* see iwl_measurement_status */ |
2047 | } __attribute__ ((packed)); | 2009 | } __attribute__ ((packed)); |
2048 | 2010 | ||
2049 | /****************************************************************************** | 2011 | /****************************************************************************** |
@@ -2101,7 +2063,7 @@ struct iwl_powertable_cmd { | |||
2101 | * PM_SLEEP_NOTIFICATION = 0x7A (notification only, not a command) | 2063 | * PM_SLEEP_NOTIFICATION = 0x7A (notification only, not a command) |
2102 | * 3945 and 4965 identical. | 2064 | * 3945 and 4965 identical. |
2103 | */ | 2065 | */ |
2104 | struct iwl4965_sleep_notification { | 2066 | struct iwl_sleep_notification { |
2105 | u8 pm_sleep_mode; | 2067 | u8 pm_sleep_mode; |
2106 | u8 pm_wakeup_src; | 2068 | u8 pm_wakeup_src; |
2107 | __le16 reserved; | 2069 | __le16 reserved; |
@@ -2131,14 +2093,14 @@ enum { | |||
2131 | #define CARD_STATE_CMD_DISABLE 0x00 /* Put card to sleep */ | 2093 | #define CARD_STATE_CMD_DISABLE 0x00 /* Put card to sleep */ |
2132 | #define CARD_STATE_CMD_ENABLE 0x01 /* Wake up card */ | 2094 | #define CARD_STATE_CMD_ENABLE 0x01 /* Wake up card */ |
2133 | #define CARD_STATE_CMD_HALT 0x02 /* Power down permanently */ | 2095 | #define CARD_STATE_CMD_HALT 0x02 /* Power down permanently */ |
2134 | struct iwl4965_card_state_cmd { | 2096 | struct iwl_card_state_cmd { |
2135 | __le32 status; /* CARD_STATE_CMD_* request new power state */ | 2097 | __le32 status; /* CARD_STATE_CMD_* request new power state */ |
2136 | } __attribute__ ((packed)); | 2098 | } __attribute__ ((packed)); |
2137 | 2099 | ||
2138 | /* | 2100 | /* |
2139 | * CARD_STATE_NOTIFICATION = 0xa1 (notification only, not a command) | 2101 | * CARD_STATE_NOTIFICATION = 0xa1 (notification only, not a command) |
2140 | */ | 2102 | */ |
2141 | struct iwl4965_card_state_notif { | 2103 | struct iwl_card_state_notif { |
2142 | __le32 flags; | 2104 | __le32 flags; |
2143 | } __attribute__ ((packed)); | 2105 | } __attribute__ ((packed)); |
2144 | 2106 | ||
@@ -2201,7 +2163,7 @@ struct iwl_scan_channel { | |||
2201 | * struct iwl_ssid_ie - directed scan network information element | 2163 | * struct iwl_ssid_ie - directed scan network information element |
2202 | * | 2164 | * |
2203 | * Up to 4 of these may appear in REPLY_SCAN_CMD, selected by "type" field | 2165 | * Up to 4 of these may appear in REPLY_SCAN_CMD, selected by "type" field |
2204 | * in struct iwl4965_scan_channel; each channel may select different ssids from | 2166 | * in struct iwl_scan_channel; each channel may select different ssids from |
2205 | * among the 4 entries. SSID IEs get transmitted in reverse order of entry. | 2167 | * among the 4 entries. SSID IEs get transmitted in reverse order of entry. |
2206 | */ | 2168 | */ |
2207 | struct iwl_ssid_ie { | 2169 | struct iwl_ssid_ie { |
@@ -2301,7 +2263,7 @@ struct iwl_scan_cmd { | |||
2301 | * Number of channels in list is specified by channel_count. | 2263 | * Number of channels in list is specified by channel_count. |
2302 | * Each channel in list is of type: | 2264 | * Each channel in list is of type: |
2303 | * | 2265 | * |
2304 | * struct iwl4965_scan_channel channels[0]; | 2266 | * struct iwl_scan_channel channels[0]; |
2305 | * | 2267 | * |
2306 | * NOTE: Only one band of channels can be scanned per pass. You | 2268 | * NOTE: Only one band of channels can be scanned per pass. You |
2307 | * must not mix 2.4GHz channels and 5.2GHz channels, and you must wait | 2269 | * must not mix 2.4GHz channels and 5.2GHz channels, and you must wait |
@@ -2612,7 +2574,7 @@ struct iwl_notif_statistics { | |||
2612 | * then this notification will be sent. */ | 2574 | * then this notification will be sent. */ |
2613 | #define CONSECUTIVE_MISSED_BCONS_TH 20 | 2575 | #define CONSECUTIVE_MISSED_BCONS_TH 20 |
2614 | 2576 | ||
2615 | struct iwl4965_missed_beacon_notif { | 2577 | struct iwl_missed_beacon_notif { |
2616 | __le32 consequtive_missed_beacons; | 2578 | __le32 consequtive_missed_beacons; |
2617 | __le32 total_missed_becons; | 2579 | __le32 total_missed_becons; |
2618 | __le32 num_expected_beacons; | 2580 | __le32 num_expected_beacons; |
@@ -3049,27 +3011,22 @@ struct iwl_rx_packet { | |||
3049 | struct iwl_cmd_header hdr; | 3011 | struct iwl_cmd_header hdr; |
3050 | union { | 3012 | union { |
3051 | struct iwl_alive_resp alive_frame; | 3013 | struct iwl_alive_resp alive_frame; |
3052 | struct iwl4965_rx_frame rx_frame; | 3014 | struct iwl_spectrum_notification spectrum_notif; |
3053 | struct iwl4965_tx_resp tx_resp; | 3015 | struct iwl_csa_notification csa_notif; |
3054 | struct iwl4965_spectrum_notification spectrum_notif; | ||
3055 | struct iwl4965_csa_notification csa_notif; | ||
3056 | struct iwl_error_resp err_resp; | 3016 | struct iwl_error_resp err_resp; |
3057 | struct iwl4965_card_state_notif card_state_notif; | 3017 | struct iwl_card_state_notif card_state_notif; |
3058 | struct iwl4965_beacon_notif beacon_status; | ||
3059 | struct iwl_add_sta_resp add_sta; | 3018 | struct iwl_add_sta_resp add_sta; |
3060 | struct iwl_rem_sta_resp rem_sta; | 3019 | struct iwl_rem_sta_resp rem_sta; |
3061 | struct iwl4965_sleep_notification sleep_notif; | 3020 | struct iwl_sleep_notification sleep_notif; |
3062 | struct iwl4965_spectrum_resp spectrum; | 3021 | struct iwl_spectrum_resp spectrum; |
3063 | struct iwl_notif_statistics stats; | 3022 | struct iwl_notif_statistics stats; |
3064 | struct iwl_compressed_ba_resp compressed_ba; | 3023 | struct iwl_compressed_ba_resp compressed_ba; |
3065 | struct iwl4965_missed_beacon_notif missed_beacon; | 3024 | struct iwl_missed_beacon_notif missed_beacon; |
3066 | __le32 status; | 3025 | __le32 status; |
3067 | u8 raw[0]; | 3026 | u8 raw[0]; |
3068 | } u; | 3027 | } u; |
3069 | } __attribute__ ((packed)); | 3028 | } __attribute__ ((packed)); |
3070 | 3029 | ||
3071 | #define IWL_RX_FRAME_SIZE (4 + sizeof(struct iwl4965_rx_frame)) | ||
3072 | |||
3073 | int iwl_agn_check_rxon_cmd(struct iwl_rxon_cmd *rxon); | 3030 | int iwl_agn_check_rxon_cmd(struct iwl_rxon_cmd *rxon); |
3074 | 3031 | ||
3075 | #endif /* __iwl_commands_h__ */ | 3032 | #endif /* __iwl_commands_h__ */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index d00dfe4edc3b..73d7973707eb 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * in the file called LICENSE.GPL. | 22 | * in the file called LICENSE.GPL. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * Tomas Winkler <tomas.winkler@intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
28 | 28 | ||
@@ -42,7 +42,7 @@ | |||
42 | 42 | ||
43 | MODULE_DESCRIPTION("iwl core"); | 43 | MODULE_DESCRIPTION("iwl core"); |
44 | MODULE_VERSION(IWLWIFI_VERSION); | 44 | MODULE_VERSION(IWLWIFI_VERSION); |
45 | MODULE_AUTHOR(DRV_COPYRIGHT); | 45 | MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR); |
46 | MODULE_LICENSE("GPL"); | 46 | MODULE_LICENSE("GPL"); |
47 | 47 | ||
48 | #define IWL_DECLARE_RATE_INFO(r, s, ip, in, rp, rn, pp, np) \ | 48 | #define IWL_DECLARE_RATE_INFO(r, s, ip, in, rp, rn, pp, np) \ |
@@ -243,24 +243,25 @@ void iwl_reset_qos(struct iwl_priv *priv) | |||
243 | u16 cw_min = 15; | 243 | u16 cw_min = 15; |
244 | u16 cw_max = 1023; | 244 | u16 cw_max = 1023; |
245 | u8 aifs = 2; | 245 | u8 aifs = 2; |
246 | u8 is_legacy = 0; | 246 | bool is_legacy = false; |
247 | unsigned long flags; | 247 | unsigned long flags; |
248 | int i; | 248 | int i; |
249 | 249 | ||
250 | spin_lock_irqsave(&priv->lock, flags); | 250 | spin_lock_irqsave(&priv->lock, flags); |
251 | priv->qos_data.qos_active = 0; | 251 | /* QoS always active in AP and ADHOC mode |
252 | * In STA mode wait for association | ||
253 | */ | ||
254 | if (priv->iw_mode == NL80211_IFTYPE_ADHOC || | ||
255 | priv->iw_mode == NL80211_IFTYPE_AP) | ||
256 | priv->qos_data.qos_active = 1; | ||
257 | else | ||
258 | priv->qos_data.qos_active = 0; | ||
252 | 259 | ||
253 | if (priv->iw_mode == NL80211_IFTYPE_ADHOC) { | 260 | /* check for legacy mode */ |
254 | if (priv->qos_data.qos_enable) | 261 | if ((priv->iw_mode == NL80211_IFTYPE_ADHOC && |
255 | priv->qos_data.qos_active = 1; | 262 | (priv->active_rate & IWL_OFDM_RATES_MASK) == 0) || |
256 | if (!(priv->active_rate & 0xfff0)) { | 263 | (priv->iw_mode == NL80211_IFTYPE_STATION && |
257 | cw_min = 31; | 264 | (priv->staging_rxon.flags & RXON_FLG_SHORT_SLOT_MSK) == 0)) { |
258 | is_legacy = 1; | ||
259 | } | ||
260 | } else if (priv->iw_mode == NL80211_IFTYPE_AP) { | ||
261 | if (priv->qos_data.qos_enable) | ||
262 | priv->qos_data.qos_active = 1; | ||
263 | } else if (!(priv->staging_rxon.flags & RXON_FLG_SHORT_SLOT_MSK)) { | ||
264 | cw_min = 31; | 265 | cw_min = 31; |
265 | is_legacy = 1; | 266 | is_legacy = 1; |
266 | } | 267 | } |
@@ -890,9 +891,6 @@ int iwl_init_drv(struct iwl_priv *priv) | |||
890 | iwl_set_rxon_chain(priv); | 891 | iwl_set_rxon_chain(priv); |
891 | iwl_init_scan_params(priv); | 892 | iwl_init_scan_params(priv); |
892 | 893 | ||
893 | if (priv->cfg->mod_params->enable_qos) | ||
894 | priv->qos_data.qos_enable = 1; | ||
895 | |||
896 | iwl_reset_qos(priv); | 894 | iwl_reset_qos(priv); |
897 | 895 | ||
898 | priv->qos_data.qos_active = 0; | 896 | priv->qos_data.qos_active = 0; |
@@ -1448,6 +1446,16 @@ int iwl_radio_kill_sw_enable_radio(struct iwl_priv *priv) | |||
1448 | return 0; | 1446 | return 0; |
1449 | } | 1447 | } |
1450 | 1448 | ||
1449 | /* when driver is up while rfkill is on, it wont receive | ||
1450 | * any CARD_STATE_NOTIFICATION notifications so we have to | ||
1451 | * restart it in here | ||
1452 | */ | ||
1453 | if (priv->is_open && !test_bit(STATUS_ALIVE, &priv->status)) { | ||
1454 | clear_bit(STATUS_RF_KILL_SW, &priv->status); | ||
1455 | if (!iwl_is_rfkill(priv)) | ||
1456 | queue_work(priv->workqueue, &priv->up); | ||
1457 | } | ||
1458 | |||
1451 | /* If the driver is already loaded, it will receive | 1459 | /* If the driver is already loaded, it will receive |
1452 | * CARD_STATE_NOTIFICATION notifications and the handler will | 1460 | * CARD_STATE_NOTIFICATION notifications and the handler will |
1453 | * call restart to reload the driver. | 1461 | * call restart to reload the driver. |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index 81ddca077175..08b842f85768 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * Tomas Winkler <tomas.winkler@intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
@@ -72,6 +72,7 @@ struct iwl_cmd; | |||
72 | 72 | ||
73 | #define IWLWIFI_VERSION "1.3.27k" | 73 | #define IWLWIFI_VERSION "1.3.27k" |
74 | #define DRV_COPYRIGHT "Copyright(c) 2003-2008 Intel Corporation" | 74 | #define DRV_COPYRIGHT "Copyright(c) 2003-2008 Intel Corporation" |
75 | #define DRV_AUTHOR "<ilw@linux.intel.com>" | ||
75 | 76 | ||
76 | #define IWL_PCI_DEVICE(dev, subdev, cfg) \ | 77 | #define IWL_PCI_DEVICE(dev, subdev, cfg) \ |
77 | .vendor = PCI_VENDOR_ID_INTEL, .device = (dev), \ | 78 | .vendor = PCI_VENDOR_ID_INTEL, .device = (dev), \ |
@@ -157,7 +158,6 @@ struct iwl_mod_params { | |||
157 | int disable_hw_scan; /* def: 0 = use h/w scan */ | 158 | int disable_hw_scan; /* def: 0 = use h/w scan */ |
158 | int num_of_queues; /* def: HW dependent */ | 159 | int num_of_queues; /* def: HW dependent */ |
159 | int num_of_ampdu_queues;/* def: HW dependent */ | 160 | int num_of_ampdu_queues;/* def: HW dependent */ |
160 | int enable_qos; /* def: 1 = use quality of service */ | ||
161 | int disable_11n; /* def: 0 = disable 11n capabilities */ | 161 | int disable_11n; /* def: 0 = disable 11n capabilities */ |
162 | int amsdu_size_8K; /* def: 1 = enable 8K amsdu size */ | 162 | int amsdu_size_8K; /* def: 1 = enable 8K amsdu size */ |
163 | int antenna; /* def: 0 = both antennas (use diversity) */ | 163 | int antenna; /* def: 0 = both antennas (use diversity) */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-csr.h b/drivers/net/wireless/iwlwifi/iwl-csr.h index 84f56a21770d..f34ede44ed10 100644 --- a/drivers/net/wireless/iwlwifi/iwl-csr.h +++ b/drivers/net/wireless/iwlwifi/iwl-csr.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
@@ -216,6 +216,8 @@ | |||
216 | /* EEPROM REG */ | 216 | /* EEPROM REG */ |
217 | #define CSR_EEPROM_REG_READ_VALID_MSK (0x00000001) | 217 | #define CSR_EEPROM_REG_READ_VALID_MSK (0x00000001) |
218 | #define CSR_EEPROM_REG_BIT_CMD (0x00000002) | 218 | #define CSR_EEPROM_REG_BIT_CMD (0x00000002) |
219 | #define CSR_EEPROM_REG_MSK_ADDR (0x0000FFFC) | ||
220 | #define CSR_EEPROM_REG_MSK_DATA (0xFFFF0000) | ||
219 | 221 | ||
220 | /* EEPROM GP */ | 222 | /* EEPROM GP */ |
221 | #define CSR_EEPROM_GP_VALID_MSK (0x00000006) | 223 | #define CSR_EEPROM_GP_VALID_MSK (0x00000006) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-debug.h b/drivers/net/wireless/iwlwifi/iwl-debug.h index a115dc64f6a6..e4c264b4f7b0 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debug.h +++ b/drivers/net/wireless/iwlwifi/iwl-debug.h | |||
@@ -21,7 +21,7 @@ | |||
21 | * file called LICENSE. | 21 | * file called LICENSE. |
22 | * | 22 | * |
23 | * Contact Information: | 23 | * Contact Information: |
24 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 24 | * Intel Linux Wireless <ilw@linux.intel.com> |
25 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 25 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
26 | * | 26 | * |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c index 370b66c444b3..d5253a179dec 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * in the file called LICENSE.GPL. | 22 | * in the file called LICENSE.GPL. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * Tomas Winkler <tomas.winkler@intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
28 | 28 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index a19fbb5eaae4..eaf0c9cc33a5 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -19,7 +19,7 @@ | |||
19 | * file called LICENSE. | 19 | * file called LICENSE. |
20 | * | 20 | * |
21 | * Contact Information: | 21 | * Contact Information: |
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 22 | * Intel Linux Wireless <ilw@linux.intel.com> |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
@@ -186,12 +186,6 @@ struct iwl_channel_info { | |||
186 | u8 fat_extension_channel; /* HT_IE_EXT_CHANNEL_* */ | 186 | u8 fat_extension_channel; /* HT_IE_EXT_CHANNEL_* */ |
187 | }; | 187 | }; |
188 | 188 | ||
189 | struct iwl4965_clip_group { | ||
190 | /* maximum power level to prevent clipping for each rate, derived by | ||
191 | * us from this band's saturation power in EEPROM */ | ||
192 | const s8 clip_powers[IWL_MAX_RATES]; | ||
193 | }; | ||
194 | |||
195 | 189 | ||
196 | #define IWL_TX_FIFO_AC0 0 | 190 | #define IWL_TX_FIFO_AC0 0 |
197 | #define IWL_TX_FIFO_AC1 1 | 191 | #define IWL_TX_FIFO_AC1 1 |
@@ -436,7 +430,6 @@ union iwl_qos_capabity { | |||
436 | 430 | ||
437 | /* QoS structures */ | 431 | /* QoS structures */ |
438 | struct iwl_qos_info { | 432 | struct iwl_qos_info { |
439 | int qos_enable; | ||
440 | int qos_active; | 433 | int qos_active; |
441 | union iwl_qos_capabity qos_cap; | 434 | union iwl_qos_capabity qos_cap; |
442 | struct iwl_qosparam_cmd def_qos_parm; | 435 | struct iwl_qosparam_cmd def_qos_parm; |
@@ -505,6 +498,10 @@ struct iwl_sensitivity_ranges { | |||
505 | 498 | ||
506 | #define IWL_FAT_CHANNEL_52 BIT(IEEE80211_BAND_5GHZ) | 499 | #define IWL_FAT_CHANNEL_52 BIT(IEEE80211_BAND_5GHZ) |
507 | 500 | ||
501 | #define KELVIN_TO_CELSIUS(x) ((x)-273) | ||
502 | #define CELSIUS_TO_KELVIN(x) ((x)+273) | ||
503 | |||
504 | |||
508 | /** | 505 | /** |
509 | * struct iwl_hw_params | 506 | * struct iwl_hw_params |
510 | * @max_txq_num: Max # Tx queues supported | 507 | * @max_txq_num: Max # Tx queues supported |
@@ -553,15 +550,6 @@ struct iwl_hw_params { | |||
553 | #define HT_SHORT_GI_40MHZ (1 << 1) | 550 | #define HT_SHORT_GI_40MHZ (1 << 1) |
554 | 551 | ||
555 | 552 | ||
556 | #define IWL_RX_HDR(x) ((struct iwl4965_rx_frame_hdr *)(\ | ||
557 | x->u.rx_frame.stats.payload + \ | ||
558 | x->u.rx_frame.stats.phy_count)) | ||
559 | #define IWL_RX_END(x) ((struct iwl4965_rx_frame_end *)(\ | ||
560 | IWL_RX_HDR(x)->payload + \ | ||
561 | le16_to_cpu(IWL_RX_HDR(x)->len))) | ||
562 | #define IWL_RX_STATS(x) (&x->u.rx_frame.stats) | ||
563 | #define IWL_RX_DATA(x) (IWL_RX_HDR(x)->payload) | ||
564 | |||
565 | /****************************************************************************** | 553 | /****************************************************************************** |
566 | * | 554 | * |
567 | * Functions implemented in core module which are forward declared here | 555 | * Functions implemented in core module which are forward declared here |
@@ -792,7 +780,7 @@ struct iwl_priv { | |||
792 | 780 | ||
793 | #ifdef CONFIG_IWLAGN_SPECTRUM_MEASUREMENT | 781 | #ifdef CONFIG_IWLAGN_SPECTRUM_MEASUREMENT |
794 | /* spectrum measurement report caching */ | 782 | /* spectrum measurement report caching */ |
795 | struct iwl4965_spectrum_notification measure_report; | 783 | struct iwl_spectrum_notification measure_report; |
796 | u8 measurement_status; | 784 | u8 measurement_status; |
797 | #endif | 785 | #endif |
798 | /* ucode beacon time */ | 786 | /* ucode beacon time */ |
@@ -803,10 +791,6 @@ struct iwl_priv { | |||
803 | struct iwl_channel_info *channel_info; /* channel info array */ | 791 | struct iwl_channel_info *channel_info; /* channel info array */ |
804 | u8 channel_count; /* # of channels */ | 792 | u8 channel_count; /* # of channels */ |
805 | 793 | ||
806 | /* each calibration channel group in the EEPROM has a derived | ||
807 | * clip setting for each rate. */ | ||
808 | const struct iwl4965_clip_group clip_groups[5]; | ||
809 | |||
810 | /* thermal calibration */ | 794 | /* thermal calibration */ |
811 | s32 temperature; /* degrees Kelvin */ | 795 | s32 temperature; /* degrees Kelvin */ |
812 | s32 last_temperature; | 796 | s32 last_temperature; |
@@ -1003,9 +987,6 @@ struct iwl_priv { | |||
1003 | s8 tx_power_user_lmt; | 987 | s8 tx_power_user_lmt; |
1004 | s8 tx_power_channel_lmt; | 988 | s8 tx_power_channel_lmt; |
1005 | 989 | ||
1006 | #ifdef CONFIG_PM | ||
1007 | u32 pm_state[16]; | ||
1008 | #endif | ||
1009 | 990 | ||
1010 | #ifdef CONFIG_IWLWIFI_DEBUG | 991 | #ifdef CONFIG_IWLWIFI_DEBUG |
1011 | /* debugging info */ | 992 | /* debugging info */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c index 792a3c15f172..ce2f47306cea 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * Tomas Winkler <tomas.winkler@intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
@@ -169,10 +169,9 @@ int iwlcore_eeprom_acquire_semaphore(struct iwl_priv *priv) | |||
169 | CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM); | 169 | CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM); |
170 | 170 | ||
171 | /* See if we got it */ | 171 | /* See if we got it */ |
172 | ret = iwl_poll_bit(priv, CSR_HW_IF_CONFIG_REG, | 172 | ret = iwl_poll_direct_bit(priv, CSR_HW_IF_CONFIG_REG, |
173 | CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM, | 173 | CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM, |
174 | CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM, | 174 | EEPROM_SEM_TIMEOUT); |
175 | EEPROM_SEM_TIMEOUT); | ||
176 | if (ret >= 0) { | 175 | if (ret >= 0) { |
177 | IWL_DEBUG_IO("Acquired semaphore after %d tries.\n", | 176 | IWL_DEBUG_IO("Acquired semaphore after %d tries.\n", |
178 | count+1); | 177 | count+1); |
@@ -210,10 +209,8 @@ int iwl_eeprom_init(struct iwl_priv *priv) | |||
210 | { | 209 | { |
211 | u16 *e; | 210 | u16 *e; |
212 | u32 gp = iwl_read32(priv, CSR_EEPROM_GP); | 211 | u32 gp = iwl_read32(priv, CSR_EEPROM_GP); |
213 | u32 r; | ||
214 | int sz = priv->cfg->eeprom_size; | 212 | int sz = priv->cfg->eeprom_size; |
215 | int ret; | 213 | int ret; |
216 | int i; | ||
217 | u16 addr; | 214 | u16 addr; |
218 | 215 | ||
219 | /* allocate eeprom */ | 216 | /* allocate eeprom */ |
@@ -241,22 +238,19 @@ int iwl_eeprom_init(struct iwl_priv *priv) | |||
241 | 238 | ||
242 | /* eeprom is an array of 16bit values */ | 239 | /* eeprom is an array of 16bit values */ |
243 | for (addr = 0; addr < sz; addr += sizeof(u16)) { | 240 | for (addr = 0; addr < sz; addr += sizeof(u16)) { |
244 | _iwl_write32(priv, CSR_EEPROM_REG, addr << 1); | 241 | u32 r; |
245 | _iwl_clear_bit(priv, CSR_EEPROM_REG, CSR_EEPROM_REG_BIT_CMD); | 242 | |
246 | 243 | _iwl_write32(priv, CSR_EEPROM_REG, | |
247 | for (i = 0; i < IWL_EEPROM_ACCESS_TIMEOUT; | 244 | CSR_EEPROM_REG_MSK_ADDR & (addr << 1)); |
248 | i += IWL_EEPROM_ACCESS_DELAY) { | ||
249 | r = _iwl_read_direct32(priv, CSR_EEPROM_REG); | ||
250 | if (r & CSR_EEPROM_REG_READ_VALID_MSK) | ||
251 | break; | ||
252 | udelay(IWL_EEPROM_ACCESS_DELAY); | ||
253 | } | ||
254 | 245 | ||
255 | if (!(r & CSR_EEPROM_REG_READ_VALID_MSK)) { | 246 | ret = iwl_poll_direct_bit(priv, CSR_EEPROM_REG, |
247 | CSR_EEPROM_REG_READ_VALID_MSK, | ||
248 | IWL_EEPROM_ACCESS_TIMEOUT); | ||
249 | if (ret < 0) { | ||
256 | IWL_ERROR("Time out reading EEPROM[%d]\n", addr); | 250 | IWL_ERROR("Time out reading EEPROM[%d]\n", addr); |
257 | ret = -ETIMEDOUT; | ||
258 | goto done; | 251 | goto done; |
259 | } | 252 | } |
253 | r = _iwl_read_direct32(priv, CSR_EEPROM_REG); | ||
260 | e[addr / 2] = le16_to_cpu((__force __le16)(r >> 16)); | 254 | e[addr / 2] = le16_to_cpu((__force __le16)(r >> 16)); |
261 | } | 255 | } |
262 | ret = 0; | 256 | ret = 0; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h index 8f6b05fa2330..603c84bed630 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * Tomas Winkler <tomas.winkler@intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
@@ -68,17 +68,14 @@ struct iwl_priv; | |||
68 | /* | 68 | /* |
69 | * EEPROM access time values: | 69 | * EEPROM access time values: |
70 | * | 70 | * |
71 | * Driver initiates EEPROM read by writing byte address << 1 to CSR_EEPROM_REG, | 71 | * Driver initiates EEPROM read by writing byte address << 1 to CSR_EEPROM_REG. |
72 | * then clearing (with subsequent read/modify/write) CSR_EEPROM_REG bit | ||
73 | * CSR_EEPROM_REG_BIT_CMD (0x2). | ||
74 | * Driver then polls CSR_EEPROM_REG for CSR_EEPROM_REG_READ_VALID_MSK (0x1). | 72 | * Driver then polls CSR_EEPROM_REG for CSR_EEPROM_REG_READ_VALID_MSK (0x1). |
75 | * When polling, wait 10 uSec between polling loops, up to a maximum 5000 uSec. | 73 | * When polling, wait 10 uSec between polling loops, up to a maximum 5000 uSec. |
76 | * Driver reads 16-bit value from bits 31-16 of CSR_EEPROM_REG. | 74 | * Driver reads 16-bit value from bits 31-16 of CSR_EEPROM_REG. |
77 | */ | 75 | */ |
78 | #define IWL_EEPROM_ACCESS_TIMEOUT 5000 /* uSec */ | 76 | #define IWL_EEPROM_ACCESS_TIMEOUT 5000 /* uSec */ |
79 | #define IWL_EEPROM_ACCESS_DELAY 10 /* uSec */ | ||
80 | 77 | ||
81 | #define IWL_EEPROM_SEM_TIMEOUT 10 /* milliseconds */ | 78 | #define IWL_EEPROM_SEM_TIMEOUT 10 /* microseconds */ |
82 | #define IWL_EEPROM_SEM_RETRY_LIMIT 1000 /* number of attempts (not time) */ | 79 | #define IWL_EEPROM_SEM_RETRY_LIMIT 1000 /* number of attempts (not time) */ |
83 | 80 | ||
84 | 81 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-fh.h b/drivers/net/wireless/iwlwifi/iwl-fh.h index c3dadb03701c..d7da19864550 100644 --- a/drivers/net/wireless/iwlwifi/iwl-fh.h +++ b/drivers/net/wireless/iwlwifi/iwl-fh.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
@@ -266,11 +266,8 @@ | |||
266 | #define FH_RCSR_CHNL0_RX_CONFIG_IRQ_DEST_NO_INT_VAL (0x00000000) | 266 | #define FH_RCSR_CHNL0_RX_CONFIG_IRQ_DEST_NO_INT_VAL (0x00000000) |
267 | #define FH_RCSR_CHNL0_RX_CONFIG_IRQ_DEST_INT_HOST_VAL (0x00001000) | 267 | #define FH_RCSR_CHNL0_RX_CONFIG_IRQ_DEST_INT_HOST_VAL (0x00001000) |
268 | 268 | ||
269 | #define FH_RCSR_CHNL0_RX_CONFIG_SINGLE_FRAME (0x00008000) | ||
270 | |||
271 | #define FH_RSCSR_FRAME_SIZE_MSK (0x00003FFF) /* bits 0-13 */ | 269 | #define FH_RSCSR_FRAME_SIZE_MSK (0x00003FFF) /* bits 0-13 */ |
272 | 270 | ||
273 | |||
274 | /** | 271 | /** |
275 | * Rx Shared Status Registers (RSSR) | 272 | * Rx Shared Status Registers (RSSR) |
276 | * | 273 | * |
diff --git a/drivers/net/wireless/iwlwifi/iwl-hcmd.c b/drivers/net/wireless/iwlwifi/iwl-hcmd.c index 0008a35232b0..01a2169cecec 100644 --- a/drivers/net/wireless/iwlwifi/iwl-hcmd.c +++ b/drivers/net/wireless/iwlwifi/iwl-hcmd.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * in the file called LICENSE.GPL. | 22 | * in the file called LICENSE.GPL. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * Tomas Winkler <tomas.winkler@intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
28 | 28 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-helpers.h b/drivers/net/wireless/iwlwifi/iwl-helpers.h index 4f0fa215d32e..ca4f638ab9d0 100644 --- a/drivers/net/wireless/iwlwifi/iwl-helpers.h +++ b/drivers/net/wireless/iwlwifi/iwl-helpers.h | |||
@@ -22,7 +22,7 @@ | |||
22 | * file called LICENSE. | 22 | * file called LICENSE. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | * | 27 | * |
28 | *****************************************************************************/ | 28 | *****************************************************************************/ |
@@ -32,8 +32,6 @@ | |||
32 | 32 | ||
33 | #include <linux/ctype.h> | 33 | #include <linux/ctype.h> |
34 | 34 | ||
35 | #define KELVIN_TO_CELSIUS(x) ((x)-273) | ||
36 | #define CELSIUS_TO_KELVIN(x) ((x)+273) | ||
37 | #define IWL_MASK(lo, hi) ((1 << (hi)) | ((1 << (hi)) - (1 << (lo)))) | 35 | #define IWL_MASK(lo, hi) ((1 << (hi)) | ((1 << (hi)) - (1 << (lo)))) |
38 | 36 | ||
39 | 37 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-io.h b/drivers/net/wireless/iwlwifi/iwl-io.h index bc10435d96e5..998ac1971696 100644 --- a/drivers/net/wireless/iwlwifi/iwl-io.h +++ b/drivers/net/wireless/iwlwifi/iwl-io.h | |||
@@ -21,7 +21,7 @@ | |||
21 | * file called LICENSE. | 21 | * file called LICENSE. |
22 | * | 22 | * |
23 | * Contact Information: | 23 | * Contact Information: |
24 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 24 | * Intel Linux Wireless <ilw@linux.intel.com> |
25 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 25 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
26 | * | 26 | * |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
@@ -95,7 +95,7 @@ static inline int _iwl_poll_bit(struct iwl_priv *priv, u32 addr, | |||
95 | do { | 95 | do { |
96 | if ((_iwl_read32(priv, addr) & mask) == (bits & mask)) | 96 | if ((_iwl_read32(priv, addr) & mask) == (bits & mask)) |
97 | return i; | 97 | return i; |
98 | mdelay(10); | 98 | udelay(10); |
99 | i += 10; | 99 | i += 10; |
100 | } while (i < timeout); | 100 | } while (i < timeout); |
101 | 101 | ||
@@ -269,19 +269,10 @@ static inline void iwl_write_reg_buf(struct iwl_priv *priv, | |||
269 | } | 269 | } |
270 | } | 270 | } |
271 | 271 | ||
272 | static inline int _iwl_poll_direct_bit(struct iwl_priv *priv, | 272 | static inline int _iwl_poll_direct_bit(struct iwl_priv *priv, u32 addr, |
273 | u32 addr, u32 mask, int timeout) | 273 | u32 mask, int timeout) |
274 | { | 274 | { |
275 | int i = 0; | 275 | return _iwl_poll_bit(priv, addr, mask, mask, timeout); |
276 | |||
277 | do { | ||
278 | if ((_iwl_read_direct32(priv, addr) & mask) == mask) | ||
279 | return i; | ||
280 | mdelay(10); | ||
281 | i += 10; | ||
282 | } while (i < timeout); | ||
283 | |||
284 | return -ETIMEDOUT; | ||
285 | } | 276 | } |
286 | 277 | ||
287 | #ifdef CONFIG_IWLWIFI_DEBUG | 278 | #ifdef CONFIG_IWLWIFI_DEBUG |
@@ -308,6 +299,7 @@ static inline int __iwl_poll_direct_bit(const char *f, u32 l, | |||
308 | static inline u32 _iwl_read_prph(struct iwl_priv *priv, u32 reg) | 299 | static inline u32 _iwl_read_prph(struct iwl_priv *priv, u32 reg) |
309 | { | 300 | { |
310 | _iwl_write_direct32(priv, HBUS_TARG_PRPH_RADDR, reg | (3 << 24)); | 301 | _iwl_write_direct32(priv, HBUS_TARG_PRPH_RADDR, reg | (3 << 24)); |
302 | rmb(); | ||
311 | return _iwl_read_direct32(priv, HBUS_TARG_PRPH_RDAT); | 303 | return _iwl_read_direct32(priv, HBUS_TARG_PRPH_RDAT); |
312 | } | 304 | } |
313 | #ifdef CONFIG_IWLWIFI_DEBUG | 305 | #ifdef CONFIG_IWLWIFI_DEBUG |
@@ -330,6 +322,7 @@ static inline void _iwl_write_prph(struct iwl_priv *priv, | |||
330 | { | 322 | { |
331 | _iwl_write_direct32(priv, HBUS_TARG_PRPH_WADDR, | 323 | _iwl_write_direct32(priv, HBUS_TARG_PRPH_WADDR, |
332 | ((addr & 0x0000FFFF) | (3 << 24))); | 324 | ((addr & 0x0000FFFF) | (3 << 24))); |
325 | wmb(); | ||
333 | _iwl_write_direct32(priv, HBUS_TARG_PRPH_WDAT, val); | 326 | _iwl_write_direct32(priv, HBUS_TARG_PRPH_WDAT, val); |
334 | } | 327 | } |
335 | #ifdef CONFIG_IWLWIFI_DEBUG | 328 | #ifdef CONFIG_IWLWIFI_DEBUG |
@@ -392,12 +385,14 @@ static inline void iwl_clear_bits_prph(struct iwl_priv | |||
392 | static inline u32 iwl_read_targ_mem(struct iwl_priv *priv, u32 addr) | 385 | static inline u32 iwl_read_targ_mem(struct iwl_priv *priv, u32 addr) |
393 | { | 386 | { |
394 | iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR, addr); | 387 | iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR, addr); |
388 | rmb(); | ||
395 | return iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT); | 389 | return iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT); |
396 | } | 390 | } |
397 | 391 | ||
398 | static inline void iwl_write_targ_mem(struct iwl_priv *priv, u32 addr, u32 val) | 392 | static inline void iwl_write_targ_mem(struct iwl_priv *priv, u32 addr, u32 val) |
399 | { | 393 | { |
400 | iwl_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); | 394 | iwl_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); |
395 | wmb(); | ||
401 | iwl_write_direct32(priv, HBUS_TARG_MEM_WDAT, val); | 396 | iwl_write_direct32(priv, HBUS_TARG_MEM_WDAT, val); |
402 | } | 397 | } |
403 | 398 | ||
@@ -405,6 +400,7 @@ static inline void iwl_write_targ_mem_buf(struct iwl_priv *priv, u32 addr, | |||
405 | u32 len, u32 *values) | 400 | u32 len, u32 *values) |
406 | { | 401 | { |
407 | iwl_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); | 402 | iwl_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); |
403 | wmb(); | ||
408 | for (; 0 < len; len -= sizeof(u32), values++) | 404 | for (; 0 < len; len -= sizeof(u32), values++) |
409 | iwl_write_direct32(priv, HBUS_TARG_MEM_WDAT, *values); | 405 | iwl_write_direct32(priv, HBUS_TARG_MEM_WDAT, *values); |
410 | } | 406 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-led.c b/drivers/net/wireless/iwlwifi/iwl-led.c index ffb428a7dd6d..dce32ff8dec1 100644 --- a/drivers/net/wireless/iwlwifi/iwl-led.c +++ b/drivers/net/wireless/iwlwifi/iwl-led.c | |||
@@ -19,7 +19,7 @@ | |||
19 | * file called LICENSE. | 19 | * file called LICENSE. |
20 | * | 20 | * |
21 | * Contact Information: | 21 | * Contact Information: |
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 22 | * Intel Linux Wireless <ilw@linux.intel.com> |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
@@ -41,7 +41,6 @@ | |||
41 | #include "iwl-dev.h" | 41 | #include "iwl-dev.h" |
42 | #include "iwl-core.h" | 42 | #include "iwl-core.h" |
43 | #include "iwl-io.h" | 43 | #include "iwl-io.h" |
44 | #include "iwl-helpers.h" | ||
45 | 44 | ||
46 | #ifdef CONFIG_IWLWIFI_DEBUG | 45 | #ifdef CONFIG_IWLWIFI_DEBUG |
47 | static const char *led_type_str[] = { | 46 | static const char *led_type_str[] = { |
diff --git a/drivers/net/wireless/iwlwifi/iwl-led.h b/drivers/net/wireless/iwlwifi/iwl-led.h index 588c9ad20e83..021e00bcd1be 100644 --- a/drivers/net/wireless/iwlwifi/iwl-led.h +++ b/drivers/net/wireless/iwlwifi/iwl-led.h | |||
@@ -19,7 +19,7 @@ | |||
19 | * file called LICENSE. | 19 | * file called LICENSE. |
20 | * | 20 | * |
21 | * Contact Information: | 21 | * Contact Information: |
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 22 | * Intel Linux Wireless <ilw@linux.intel.com> |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
24 | * | 24 | * |
25 | *****************************************************************************/ | 25 | *****************************************************************************/ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-power.c b/drivers/net/wireless/iwlwifi/iwl-power.c index b429daa5a2bc..75ca6a542174 100644 --- a/drivers/net/wireless/iwlwifi/iwl-power.c +++ b/drivers/net/wireless/iwlwifi/iwl-power.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * file called LICENSE. | 22 | * file called LICENSE. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
28 | 28 | ||
@@ -39,7 +39,6 @@ | |||
39 | #include "iwl-commands.h" | 39 | #include "iwl-commands.h" |
40 | #include "iwl-debug.h" | 40 | #include "iwl-debug.h" |
41 | #include "iwl-power.h" | 41 | #include "iwl-power.h" |
42 | #include "iwl-helpers.h" | ||
43 | 42 | ||
44 | /* | 43 | /* |
45 | * Setting power level allow the card to go to sleep when not busy | 44 | * Setting power level allow the card to go to sleep when not busy |
diff --git a/drivers/net/wireless/iwlwifi/iwl-power.h b/drivers/net/wireless/iwlwifi/iwl-power.h index df484a90ae64..fa098d8975ce 100644 --- a/drivers/net/wireless/iwlwifi/iwl-power.h +++ b/drivers/net/wireless/iwlwifi/iwl-power.h | |||
@@ -22,7 +22,7 @@ | |||
22 | * file called LICENSE. | 22 | * file called LICENSE. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
28 | #ifndef __iwl_power_setting_h__ | 28 | #ifndef __iwl_power_setting_h__ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h index b0ffb8919d3b..b7a5f23351c3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-prph.h +++ b/drivers/net/wireless/iwlwifi/iwl-prph.h | |||
@@ -25,7 +25,7 @@ | |||
25 | * in the file called LICENSE.GPL. | 25 | * in the file called LICENSE.GPL. |
26 | * | 26 | * |
27 | * Contact Information: | 27 | * Contact Information: |
28 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 28 | * Intel Linux Wireless <ilw@linux.intel.com> |
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
30 | * | 30 | * |
31 | * BSD LICENSE | 31 | * BSD LICENSE |
diff --git a/drivers/net/wireless/iwlwifi/iwl-rfkill.c b/drivers/net/wireless/iwlwifi/iwl-rfkill.c index 618841a53b90..4b69da30665c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rfkill.c +++ b/drivers/net/wireless/iwlwifi/iwl-rfkill.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * file called LICENSE. | 22 | * file called LICENSE. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
28 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
@@ -34,8 +34,6 @@ | |||
34 | #include "iwl-eeprom.h" | 34 | #include "iwl-eeprom.h" |
35 | #include "iwl-dev.h" | 35 | #include "iwl-dev.h" |
36 | #include "iwl-core.h" | 36 | #include "iwl-core.h" |
37 | #include "iwl-helpers.h" | ||
38 | |||
39 | 37 | ||
40 | /* software rf-kill from user */ | 38 | /* software rf-kill from user */ |
41 | static int iwl_rfkill_soft_rf_kill(void *data, enum rfkill_state state) | 39 | static int iwl_rfkill_soft_rf_kill(void *data, enum rfkill_state state) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-rfkill.h b/drivers/net/wireless/iwlwifi/iwl-rfkill.h index 402fd4c781da..86dc055a2e94 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rfkill.h +++ b/drivers/net/wireless/iwlwifi/iwl-rfkill.h | |||
@@ -22,7 +22,7 @@ | |||
22 | * file called LICENSE. | 22 | * file called LICENSE. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
28 | #ifndef __iwl_rf_kill_h__ | 28 | #ifndef __iwl_rf_kill_h__ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index 8d2b73e194da..919a775121e4 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * file called LICENSE. | 22 | * file called LICENSE. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | * | 27 | * |
28 | *****************************************************************************/ | 28 | *****************************************************************************/ |
@@ -439,7 +439,7 @@ int iwl_rx_init(struct iwl_priv *priv, struct iwl_rx_queue *rxq) | |||
439 | FH_RCSR_RX_CONFIG_CHNL_EN_ENABLE_VAL | | 439 | FH_RCSR_RX_CONFIG_CHNL_EN_ENABLE_VAL | |
440 | FH_RCSR_CHNL0_RX_IGNORE_RXF_EMPTY | | 440 | FH_RCSR_CHNL0_RX_IGNORE_RXF_EMPTY | |
441 | FH_RCSR_CHNL0_RX_CONFIG_IRQ_DEST_INT_HOST_VAL | | 441 | FH_RCSR_CHNL0_RX_CONFIG_IRQ_DEST_INT_HOST_VAL | |
442 | FH_RCSR_CHNL0_RX_CONFIG_SINGLE_FRAME | | 442 | FH_RCSR_CHNL0_RX_CONFIG_SINGLE_FRAME_MSK | |
443 | rb_size| | 443 | rb_size| |
444 | (rb_timeout << FH_RCSR_RX_CONFIG_REG_IRQ_RBTH_POS)| | 444 | (rb_timeout << FH_RCSR_RX_CONFIG_REG_IRQ_RBTH_POS)| |
445 | (rfdnlog << FH_RCSR_RX_CONFIG_RBDCB_SIZE_POS)); | 445 | (rfdnlog << FH_RCSR_RX_CONFIG_RBDCB_SIZE_POS)); |
@@ -467,10 +467,8 @@ int iwl_rxq_stop(struct iwl_priv *priv) | |||
467 | 467 | ||
468 | /* stop Rx DMA */ | 468 | /* stop Rx DMA */ |
469 | iwl_write_direct32(priv, FH_MEM_RCSR_CHNL0_CONFIG_REG, 0); | 469 | iwl_write_direct32(priv, FH_MEM_RCSR_CHNL0_CONFIG_REG, 0); |
470 | ret = iwl_poll_direct_bit(priv, FH_MEM_RSSR_RX_STATUS_REG, | 470 | iwl_poll_direct_bit(priv, FH_MEM_RSSR_RX_STATUS_REG, |
471 | (1 << 24), 1000); | 471 | FH_RSSR_CHNL0_RX_STATUS_CHNL_IDLE, 1000); |
472 | if (ret < 0) | ||
473 | IWL_ERROR("Can't stop Rx DMA.\n"); | ||
474 | 472 | ||
475 | iwl_release_nic_access(priv); | 473 | iwl_release_nic_access(priv); |
476 | spin_unlock_irqrestore(&priv->lock, flags); | 474 | spin_unlock_irqrestore(&priv->lock, flags); |
@@ -484,7 +482,7 @@ void iwl_rx_missed_beacon_notif(struct iwl_priv *priv, | |||
484 | 482 | ||
485 | { | 483 | { |
486 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; | 484 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; |
487 | struct iwl4965_missed_beacon_notif *missed_beacon; | 485 | struct iwl_missed_beacon_notif *missed_beacon; |
488 | 486 | ||
489 | missed_beacon = &pkt->u.missed_beacon; | 487 | missed_beacon = &pkt->u.missed_beacon; |
490 | if (le32_to_cpu(missed_beacon->consequtive_missed_beacons) > 5) { | 488 | if (le32_to_cpu(missed_beacon->consequtive_missed_beacons) > 5) { |
@@ -622,20 +620,24 @@ static int iwl_calc_sig_qual(int rssi_dbm, int noise_dbm) | |||
622 | return sig_qual; | 620 | return sig_qual; |
623 | } | 621 | } |
624 | 622 | ||
625 | #ifdef CONFIG_IWLWIFI_DEBUG | 623 | /* Calc max signal level (dBm) among 3 possible receivers */ |
624 | static inline int iwl_calc_rssi(struct iwl_priv *priv, | ||
625 | struct iwl_rx_phy_res *rx_resp) | ||
626 | { | ||
627 | return priv->cfg->ops->utils->calc_rssi(priv, rx_resp); | ||
628 | } | ||
626 | 629 | ||
630 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
627 | /** | 631 | /** |
628 | * iwl_dbg_report_frame - dump frame to syslog during debug sessions | 632 | * iwl_dbg_report_frame - dump frame to syslog during debug sessions |
629 | * | 633 | * |
630 | * You may hack this function to show different aspects of received frames, | 634 | * You may hack this function to show different aspects of received frames, |
631 | * including selective frame dumps. | 635 | * including selective frame dumps. |
632 | * group100 parameter selects whether to show 1 out of 100 good frames. | 636 | * group100 parameter selects whether to show 1 out of 100 good data frames. |
633 | * | 637 | * All beacon and probe response frames are printed. |
634 | * TODO: This was originally written for 3945, need to audit for | ||
635 | * proper operation with 4965. | ||
636 | */ | 638 | */ |
637 | static void iwl_dbg_report_frame(struct iwl_priv *priv, | 639 | static void iwl_dbg_report_frame(struct iwl_priv *priv, |
638 | struct iwl_rx_packet *pkt, | 640 | struct iwl_rx_phy_res *phy_res, u16 length, |
639 | struct ieee80211_hdr *header, int group100) | 641 | struct ieee80211_hdr *header, int group100) |
640 | { | 642 | { |
641 | u32 to_us; | 643 | u32 to_us; |
@@ -647,20 +649,9 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv, | |||
647 | u16 seq_ctl; | 649 | u16 seq_ctl; |
648 | u16 channel; | 650 | u16 channel; |
649 | u16 phy_flags; | 651 | u16 phy_flags; |
650 | int rate_sym; | 652 | u32 rate_n_flags; |
651 | u16 length; | ||
652 | u16 status; | ||
653 | u16 bcn_tmr; | ||
654 | u32 tsf_low; | 653 | u32 tsf_low; |
655 | u64 tsf; | 654 | int rssi; |
656 | u8 rssi; | ||
657 | u8 agc; | ||
658 | u16 sig_avg; | ||
659 | u16 noise_diff; | ||
660 | struct iwl4965_rx_frame_stats *rx_stats = IWL_RX_STATS(pkt); | ||
661 | struct iwl4965_rx_frame_hdr *rx_hdr = IWL_RX_HDR(pkt); | ||
662 | struct iwl4965_rx_frame_end *rx_end = IWL_RX_END(pkt); | ||
663 | u8 *data = IWL_RX_DATA(pkt); | ||
664 | 655 | ||
665 | if (likely(!(priv->debug_level & IWL_DL_RX))) | 656 | if (likely(!(priv->debug_level & IWL_DL_RX))) |
666 | return; | 657 | return; |
@@ -670,22 +661,13 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv, | |||
670 | seq_ctl = le16_to_cpu(header->seq_ctrl); | 661 | seq_ctl = le16_to_cpu(header->seq_ctrl); |
671 | 662 | ||
672 | /* metadata */ | 663 | /* metadata */ |
673 | channel = le16_to_cpu(rx_hdr->channel); | 664 | channel = le16_to_cpu(phy_res->channel); |
674 | phy_flags = le16_to_cpu(rx_hdr->phy_flags); | 665 | phy_flags = le16_to_cpu(phy_res->phy_flags); |
675 | rate_sym = rx_hdr->rate; | 666 | rate_n_flags = le32_to_cpu(phy_res->rate_n_flags); |
676 | length = le16_to_cpu(rx_hdr->len); | ||
677 | |||
678 | /* end-of-frame status and timestamp */ | ||
679 | status = le32_to_cpu(rx_end->status); | ||
680 | bcn_tmr = le32_to_cpu(rx_end->beacon_timestamp); | ||
681 | tsf_low = le64_to_cpu(rx_end->timestamp) & 0x0ffffffff; | ||
682 | tsf = le64_to_cpu(rx_end->timestamp); | ||
683 | 667 | ||
684 | /* signal statistics */ | 668 | /* signal statistics */ |
685 | rssi = rx_stats->rssi; | 669 | rssi = iwl_calc_rssi(priv, phy_res); |
686 | agc = rx_stats->agc; | 670 | tsf_low = le64_to_cpu(phy_res->timestamp) & 0x0ffffffff; |
687 | sig_avg = le16_to_cpu(rx_stats->sig_avg); | ||
688 | noise_diff = le16_to_cpu(rx_stats->noise_diff); | ||
689 | 671 | ||
690 | to_us = !compare_ether_addr(header->addr1, priv->mac_addr); | 672 | to_us = !compare_ether_addr(header->addr1, priv->mac_addr); |
691 | 673 | ||
@@ -739,11 +721,13 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv, | |||
739 | else | 721 | else |
740 | title = "Frame"; | 722 | title = "Frame"; |
741 | 723 | ||
742 | rate_idx = iwl_hwrate_to_plcp_idx(rate_sym); | 724 | rate_idx = iwl_hwrate_to_plcp_idx(rate_n_flags); |
743 | if (unlikely(rate_idx == -1)) | 725 | if (unlikely((rate_idx < 0) || (rate_idx >= IWL_RATE_COUNT))) { |
744 | bitrate = 0; | 726 | bitrate = 0; |
745 | else | 727 | WARN_ON_ONCE(1); |
728 | } else { | ||
746 | bitrate = iwl_rates[rate_idx].ieee / 2; | 729 | bitrate = iwl_rates[rate_idx].ieee / 2; |
730 | } | ||
747 | 731 | ||
748 | /* print frame summary. | 732 | /* print frame summary. |
749 | * MAC addresses show just the last byte (for brevity), | 733 | * MAC addresses show just the last byte (for brevity), |
@@ -755,24 +739,17 @@ static void iwl_dbg_report_frame(struct iwl_priv *priv, | |||
755 | length, rssi, channel, bitrate); | 739 | length, rssi, channel, bitrate); |
756 | else { | 740 | else { |
757 | /* src/dst addresses assume managed mode */ | 741 | /* src/dst addresses assume managed mode */ |
758 | IWL_DEBUG_RX("%s: 0x%04x, dst=0x%02x, " | 742 | IWL_DEBUG_RX("%s: 0x%04x, dst=0x%02x, src=0x%02x, " |
759 | "src=0x%02x, rssi=%u, tim=%lu usec, " | 743 | "len=%u, rssi=%d, tim=%lu usec, " |
760 | "phy=0x%02x, chnl=%d\n", | 744 | "phy=0x%02x, chnl=%d\n", |
761 | title, le16_to_cpu(fc), header->addr1[5], | 745 | title, le16_to_cpu(fc), header->addr1[5], |
762 | header->addr3[5], rssi, | 746 | header->addr3[5], length, rssi, |
763 | tsf_low - priv->scan_start_tsf, | 747 | tsf_low - priv->scan_start_tsf, |
764 | phy_flags, channel); | 748 | phy_flags, channel); |
765 | } | 749 | } |
766 | } | 750 | } |
767 | if (print_dump) | 751 | if (print_dump) |
768 | iwl_print_hex_dump(priv, IWL_DL_RX, data, length); | 752 | iwl_print_hex_dump(priv, IWL_DL_RX, header, length); |
769 | } | ||
770 | #else | ||
771 | static inline void iwl_dbg_report_frame(struct iwl_priv *priv, | ||
772 | struct iwl_rx_packet *pkt, | ||
773 | struct ieee80211_hdr *header, | ||
774 | int group100) | ||
775 | { | ||
776 | } | 753 | } |
777 | #endif | 754 | #endif |
778 | 755 | ||
@@ -966,14 +943,6 @@ static void iwl_pass_packet_to_mac80211(struct iwl_priv *priv, | |||
966 | rxb->skb = NULL; | 943 | rxb->skb = NULL; |
967 | } | 944 | } |
968 | 945 | ||
969 | /* Calc max signal level (dBm) among 3 possible receivers */ | ||
970 | static inline int iwl_calc_rssi(struct iwl_priv *priv, | ||
971 | struct iwl_rx_phy_res *rx_resp) | ||
972 | { | ||
973 | return priv->cfg->ops->utils->calc_rssi(priv, rx_resp); | ||
974 | } | ||
975 | |||
976 | |||
977 | /* This is necessary only for a number of statistics, see the caller. */ | 946 | /* This is necessary only for a number of statistics, see the caller. */ |
978 | static int iwl_is_network_packet(struct iwl_priv *priv, | 947 | static int iwl_is_network_packet(struct iwl_priv *priv, |
979 | struct ieee80211_hdr *header) | 948 | struct ieee80211_hdr *header) |
@@ -1096,9 +1065,10 @@ void iwl_rx_reply_rx(struct iwl_priv *priv, | |||
1096 | priv->last_rx_noise = IWL_NOISE_MEAS_NOT_AVAILABLE; | 1065 | priv->last_rx_noise = IWL_NOISE_MEAS_NOT_AVAILABLE; |
1097 | 1066 | ||
1098 | /* Set "1" to report good data frames in groups of 100 */ | 1067 | /* Set "1" to report good data frames in groups of 100 */ |
1099 | /* FIXME: need to optimize the call: */ | 1068 | #ifdef CONFIG_IWLWIFI_DEBUG |
1100 | iwl_dbg_report_frame(priv, pkt, header, 1); | 1069 | if (unlikely(priv->debug_level & IWL_DL_RX)) |
1101 | 1070 | iwl_dbg_report_frame(priv, rx_start, len, header, 1); | |
1071 | #endif | ||
1102 | IWL_DEBUG_STATS_LIMIT("Rssi %d, noise %d, qual %d, TSF %llu\n", | 1072 | IWL_DEBUG_STATS_LIMIT("Rssi %d, noise %d, qual %d, TSF %llu\n", |
1103 | rx_status.signal, rx_status.noise, rx_status.signal, | 1073 | rx_status.signal, rx_status.noise, rx_status.signal, |
1104 | (unsigned long long)rx_status.mactime); | 1074 | (unsigned long long)rx_status.mactime); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index c4b90301e9a1..3c803f6922ef 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * in the file called LICENSE.GPL. | 22 | * in the file called LICENSE.GPL. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * Tomas Winkler <tomas.winkler@intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
28 | #include <linux/types.h> | 28 | #include <linux/types.h> |
diff --git a/drivers/net/wireless/iwlwifi/iwl-spectrum.c b/drivers/net/wireless/iwlwifi/iwl-spectrum.c index ad319a178a90..836c3c80b69e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-spectrum.c +++ b/drivers/net/wireless/iwlwifi/iwl-spectrum.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * file called LICENSE. | 22 | * file called LICENSE. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * Intel Linux Wireless <ilw@linux.intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | * | 27 | * |
28 | *****************************************************************************/ | 28 | *****************************************************************************/ |
@@ -178,7 +178,7 @@ static void iwl_rx_spectrum_measure_notif(struct iwl_priv *priv, | |||
178 | struct iwl_rx_mem_buffer *rxb) | 178 | struct iwl_rx_mem_buffer *rxb) |
179 | { | 179 | { |
180 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; | 180 | struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; |
181 | struct iwl4965_spectrum_notification *report = &(pkt->u.spectrum_notif); | 181 | struct iwl_spectrum_notification *report = &(pkt->u.spectrum_notif); |
182 | 182 | ||
183 | if (!report->state) { | 183 | if (!report->state) { |
184 | IWL_DEBUG(IWL_DL_11H, | 184 | IWL_DEBUG(IWL_DL_11H, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-spectrum.h b/drivers/net/wireless/iwlwifi/iwl-spectrum.h index fa990a102515..b7d7943e476b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-spectrum.h +++ b/drivers/net/wireless/iwlwifi/iwl-spectrum.h | |||
@@ -21,7 +21,7 @@ | |||
21 | * file called LICENSE. | 21 | * file called LICENSE. |
22 | * | 22 | * |
23 | * Contact Information: | 23 | * Contact Information: |
24 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 24 | * Intel Linux Wireless <ilw@linux.intel.com> |
25 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 25 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
26 | * | 26 | * |
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c index 4a2479a1622a..412f66bac1af 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * file called LICENSE. | 22 | * file called LICENSE. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | * | 27 | * |
28 | *****************************************************************************/ | 28 | *****************************************************************************/ |
@@ -33,8 +33,6 @@ | |||
33 | #include "iwl-dev.h" | 33 | #include "iwl-dev.h" |
34 | #include "iwl-core.h" | 34 | #include "iwl-core.h" |
35 | #include "iwl-sta.h" | 35 | #include "iwl-sta.h" |
36 | #include "iwl-helpers.h" | ||
37 | |||
38 | 36 | ||
39 | #define IWL_STA_DRIVER_ACTIVE BIT(0) /* driver entry is active */ | 37 | #define IWL_STA_DRIVER_ACTIVE BIT(0) /* driver entry is active */ |
40 | #define IWL_STA_UCODE_ACTIVE BIT(1) /* ucode entry is active */ | 38 | #define IWL_STA_UCODE_ACTIVE BIT(1) /* ucode entry is active */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.h b/drivers/net/wireless/iwlwifi/iwl-sta.h index 7b98ea4dfbc0..9bb7cefc1f3c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.h +++ b/drivers/net/wireless/iwlwifi/iwl-sta.h | |||
@@ -22,7 +22,7 @@ | |||
22 | * file called LICENSE. | 22 | * file called LICENSE. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | * | 27 | * |
28 | *****************************************************************************/ | 28 | *****************************************************************************/ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index 18d6cf67d9b7..1e7cd8d9039e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * file called LICENSE. | 22 | * file called LICENSE. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | * | 27 | * |
28 | *****************************************************************************/ | 28 | *****************************************************************************/ |
@@ -628,7 +628,7 @@ void iwl_txq_ctx_stop(struct iwl_priv *priv) | |||
628 | iwl_write_direct32(priv, FH_TCSR_CHNL_TX_CONFIG_REG(ch), 0x0); | 628 | iwl_write_direct32(priv, FH_TCSR_CHNL_TX_CONFIG_REG(ch), 0x0); |
629 | iwl_poll_direct_bit(priv, FH_TSSR_TX_STATUS_REG, | 629 | iwl_poll_direct_bit(priv, FH_TSSR_TX_STATUS_REG, |
630 | FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(ch), | 630 | FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(ch), |
631 | 200); | 631 | 1000); |
632 | } | 632 | } |
633 | iwl_release_nic_access(priv); | 633 | iwl_release_nic_access(priv); |
634 | spin_unlock_irqrestore(&priv->lock, flags); | 634 | spin_unlock_irqrestore(&priv->lock, flags); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 1a411c2d83e6..352ccac7187b 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * file called LICENSE. | 22 | * file called LICENSE. |
23 | * | 23 | * |
24 | * Contact Information: | 24 | * Contact Information: |
25 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 25 | * Intel Linux Wireless <ilw@linux.intel.com> |
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 |
27 | * | 27 | * |
28 | *****************************************************************************/ | 28 | *****************************************************************************/ |
@@ -69,7 +69,6 @@ static int iwl3945_param_debug; /* def: 0 = minimal debug log messages */ | |||
69 | static int iwl3945_param_disable; /* def: 0 = enable radio */ | 69 | static int iwl3945_param_disable; /* def: 0 = enable radio */ |
70 | static int iwl3945_param_antenna; /* def: 0 = both antennas (use diversity) */ | 70 | static int iwl3945_param_antenna; /* def: 0 = both antennas (use diversity) */ |
71 | int iwl3945_param_hwcrypto; /* def: 0 = use software encryption */ | 71 | int iwl3945_param_hwcrypto; /* def: 0 = use software encryption */ |
72 | static int iwl3945_param_qos_enable = 1; /* def: 1 = use quality of service */ | ||
73 | int iwl3945_param_queues_num = IWL39_MAX_NUM_QUEUES; /* def: 8 Tx queues */ | 72 | int iwl3945_param_queues_num = IWL39_MAX_NUM_QUEUES; /* def: 8 Tx queues */ |
74 | 73 | ||
75 | /* | 74 | /* |
@@ -94,12 +93,13 @@ int iwl3945_param_queues_num = IWL39_MAX_NUM_QUEUES; /* def: 8 Tx queues */ | |||
94 | 93 | ||
95 | #define IWLWIFI_VERSION "1.2.26k" VD VS | 94 | #define IWLWIFI_VERSION "1.2.26k" VD VS |
96 | #define DRV_COPYRIGHT "Copyright(c) 2003-2008 Intel Corporation" | 95 | #define DRV_COPYRIGHT "Copyright(c) 2003-2008 Intel Corporation" |
96 | #define DRV_AUTHOR "<ilw@linux.intel.com>" | ||
97 | #define DRV_VERSION IWLWIFI_VERSION | 97 | #define DRV_VERSION IWLWIFI_VERSION |
98 | 98 | ||
99 | 99 | ||
100 | MODULE_DESCRIPTION(DRV_DESCRIPTION); | 100 | MODULE_DESCRIPTION(DRV_DESCRIPTION); |
101 | MODULE_VERSION(DRV_VERSION); | 101 | MODULE_VERSION(DRV_VERSION); |
102 | MODULE_AUTHOR(DRV_COPYRIGHT); | 102 | MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR); |
103 | MODULE_LICENSE("GPL"); | 103 | MODULE_LICENSE("GPL"); |
104 | 104 | ||
105 | static const struct ieee80211_supported_band *iwl3945_get_band( | 105 | static const struct ieee80211_supported_band *iwl3945_get_band( |
@@ -1505,10 +1505,8 @@ int iwl3945_eeprom_init(struct iwl3945_priv *priv) | |||
1505 | { | 1505 | { |
1506 | u16 *e = (u16 *)&priv->eeprom; | 1506 | u16 *e = (u16 *)&priv->eeprom; |
1507 | u32 gp = iwl3945_read32(priv, CSR_EEPROM_GP); | 1507 | u32 gp = iwl3945_read32(priv, CSR_EEPROM_GP); |
1508 | u32 r; | ||
1509 | int sz = sizeof(priv->eeprom); | 1508 | int sz = sizeof(priv->eeprom); |
1510 | int rc; | 1509 | int ret; |
1511 | int i; | ||
1512 | u16 addr; | 1510 | u16 addr; |
1513 | 1511 | ||
1514 | /* The EEPROM structure has several padding buffers within it | 1512 | /* The EEPROM structure has several padding buffers within it |
@@ -1523,29 +1521,28 @@ int iwl3945_eeprom_init(struct iwl3945_priv *priv) | |||
1523 | } | 1521 | } |
1524 | 1522 | ||
1525 | /* Make sure driver (instead of uCode) is allowed to read EEPROM */ | 1523 | /* Make sure driver (instead of uCode) is allowed to read EEPROM */ |
1526 | rc = iwl3945_eeprom_acquire_semaphore(priv); | 1524 | ret = iwl3945_eeprom_acquire_semaphore(priv); |
1527 | if (rc < 0) { | 1525 | if (ret < 0) { |
1528 | IWL_ERROR("Failed to acquire EEPROM semaphore.\n"); | 1526 | IWL_ERROR("Failed to acquire EEPROM semaphore.\n"); |
1529 | return -ENOENT; | 1527 | return -ENOENT; |
1530 | } | 1528 | } |
1531 | 1529 | ||
1532 | /* eeprom is an array of 16bit values */ | 1530 | /* eeprom is an array of 16bit values */ |
1533 | for (addr = 0; addr < sz; addr += sizeof(u16)) { | 1531 | for (addr = 0; addr < sz; addr += sizeof(u16)) { |
1534 | _iwl3945_write32(priv, CSR_EEPROM_REG, addr << 1); | 1532 | u32 r; |
1535 | _iwl3945_clear_bit(priv, CSR_EEPROM_REG, CSR_EEPROM_REG_BIT_CMD); | ||
1536 | |||
1537 | for (i = 0; i < IWL_EEPROM_ACCESS_TIMEOUT; | ||
1538 | i += IWL_EEPROM_ACCESS_DELAY) { | ||
1539 | r = _iwl3945_read_direct32(priv, CSR_EEPROM_REG); | ||
1540 | if (r & CSR_EEPROM_REG_READ_VALID_MSK) | ||
1541 | break; | ||
1542 | udelay(IWL_EEPROM_ACCESS_DELAY); | ||
1543 | } | ||
1544 | 1533 | ||
1545 | if (!(r & CSR_EEPROM_REG_READ_VALID_MSK)) { | 1534 | _iwl3945_write32(priv, CSR_EEPROM_REG, |
1535 | CSR_EEPROM_REG_MSK_ADDR & (addr << 1)); | ||
1536 | _iwl3945_clear_bit(priv, CSR_EEPROM_REG, CSR_EEPROM_REG_BIT_CMD); | ||
1537 | ret = iwl3945_poll_direct_bit(priv, CSR_EEPROM_REG, | ||
1538 | CSR_EEPROM_REG_READ_VALID_MSK, | ||
1539 | IWL_EEPROM_ACCESS_TIMEOUT); | ||
1540 | if (ret < 0) { | ||
1546 | IWL_ERROR("Time out reading EEPROM[%d]\n", addr); | 1541 | IWL_ERROR("Time out reading EEPROM[%d]\n", addr); |
1547 | return -ETIMEDOUT; | 1542 | return ret; |
1548 | } | 1543 | } |
1544 | |||
1545 | r = _iwl3945_read_direct32(priv, CSR_EEPROM_REG); | ||
1549 | e[addr / 2] = le16_to_cpu((__force __le16)(r >> 16)); | 1546 | e[addr / 2] = le16_to_cpu((__force __le16)(r >> 16)); |
1550 | } | 1547 | } |
1551 | 1548 | ||
@@ -1693,17 +1690,21 @@ static void iwl3945_reset_qos(struct iwl3945_priv *priv) | |||
1693 | spin_lock_irqsave(&priv->lock, flags); | 1690 | spin_lock_irqsave(&priv->lock, flags); |
1694 | priv->qos_data.qos_active = 0; | 1691 | priv->qos_data.qos_active = 0; |
1695 | 1692 | ||
1696 | if (priv->iw_mode == NL80211_IFTYPE_ADHOC) { | 1693 | /* QoS always active in AP and ADHOC mode |
1697 | if (priv->qos_data.qos_enable) | 1694 | * In STA mode wait for association |
1698 | priv->qos_data.qos_active = 1; | 1695 | */ |
1699 | if (!(priv->active_rate & 0xfff0)) { | 1696 | if (priv->iw_mode == NL80211_IFTYPE_ADHOC || |
1700 | cw_min = 31; | 1697 | priv->iw_mode == NL80211_IFTYPE_AP) |
1701 | is_legacy = 1; | 1698 | priv->qos_data.qos_active = 1; |
1702 | } | 1699 | else |
1703 | } else if (priv->iw_mode == NL80211_IFTYPE_AP) { | 1700 | priv->qos_data.qos_active = 0; |
1704 | if (priv->qos_data.qos_enable) | 1701 | |
1705 | priv->qos_data.qos_active = 1; | 1702 | |
1706 | } else if (!(priv->staging_rxon.flags & RXON_FLG_SHORT_SLOT_MSK)) { | 1703 | /* check for legacy mode */ |
1704 | if ((priv->iw_mode == NL80211_IFTYPE_ADHOC && | ||
1705 | (priv->active_rate & IWL_OFDM_RATES_MASK) == 0) || | ||
1706 | (priv->iw_mode == NL80211_IFTYPE_STATION && | ||
1707 | (priv->staging_rxon.flags & RXON_FLG_SHORT_SLOT_MSK) == 0)) { | ||
1707 | cw_min = 31; | 1708 | cw_min = 31; |
1708 | is_legacy = 1; | 1709 | is_legacy = 1; |
1709 | } | 1710 | } |
@@ -1775,9 +1776,6 @@ static void iwl3945_activate_qos(struct iwl3945_priv *priv, u8 force) | |||
1775 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 1776 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
1776 | return; | 1777 | return; |
1777 | 1778 | ||
1778 | if (!priv->qos_data.qos_enable) | ||
1779 | return; | ||
1780 | |||
1781 | spin_lock_irqsave(&priv->lock, flags); | 1779 | spin_lock_irqsave(&priv->lock, flags); |
1782 | priv->qos_data.def_qos_parm.qos_flags = 0; | 1780 | priv->qos_data.def_qos_parm.qos_flags = 0; |
1783 | 1781 | ||
@@ -2103,11 +2101,6 @@ static void iwl3945_setup_rxon_timing(struct iwl3945_priv *priv) | |||
2103 | 2101 | ||
2104 | static int iwl3945_scan_initiate(struct iwl3945_priv *priv) | 2102 | static int iwl3945_scan_initiate(struct iwl3945_priv *priv) |
2105 | { | 2103 | { |
2106 | if (priv->iw_mode == NL80211_IFTYPE_AP) { | ||
2107 | IWL_ERROR("APs don't scan.\n"); | ||
2108 | return 0; | ||
2109 | } | ||
2110 | |||
2111 | if (!iwl3945_is_ready_rf(priv)) { | 2104 | if (!iwl3945_is_ready_rf(priv)) { |
2112 | IWL_DEBUG_SCAN("Aborting scan due to not ready.\n"); | 2105 | IWL_DEBUG_SCAN("Aborting scan due to not ready.\n"); |
2113 | return -EIO; | 2106 | return -EIO; |
@@ -6976,12 +6969,6 @@ static int iwl3945_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len) | |||
6976 | goto out_unlock; | 6969 | goto out_unlock; |
6977 | } | 6970 | } |
6978 | 6971 | ||
6979 | if (priv->iw_mode == NL80211_IFTYPE_AP) { /* APs don't scan */ | ||
6980 | rc = -EIO; | ||
6981 | IWL_ERROR("ERROR: APs don't scan\n"); | ||
6982 | goto out_unlock; | ||
6983 | } | ||
6984 | |||
6985 | /* we don't schedule scan within next_scan_jiffies period */ | 6972 | /* we don't schedule scan within next_scan_jiffies period */ |
6986 | if (priv->next_scan_jiffies && | 6973 | if (priv->next_scan_jiffies && |
6987 | time_after(priv->next_scan_jiffies, jiffies)) { | 6974 | time_after(priv->next_scan_jiffies, jiffies)) { |
@@ -7095,11 +7082,6 @@ static int iwl3945_mac_conf_tx(struct ieee80211_hw *hw, u16 queue, | |||
7095 | return 0; | 7082 | return 0; |
7096 | } | 7083 | } |
7097 | 7084 | ||
7098 | if (!priv->qos_data.qos_enable) { | ||
7099 | priv->qos_data.qos_active = 0; | ||
7100 | IWL_DEBUG_MAC80211("leave - qos not enabled\n"); | ||
7101 | return 0; | ||
7102 | } | ||
7103 | q = AC_NUM - 1 - queue; | 7085 | q = AC_NUM - 1 - queue; |
7104 | 7086 | ||
7105 | spin_lock_irqsave(&priv->lock, flags); | 7087 | spin_lock_irqsave(&priv->lock, flags); |
@@ -7925,9 +7907,8 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
7925 | CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER); | 7907 | CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER); |
7926 | 7908 | ||
7927 | iwl3945_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | 7909 | iwl3945_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); |
7928 | err = iwl3945_poll_bit(priv, CSR_GP_CNTRL, | 7910 | err = iwl3945_poll_direct_bit(priv, CSR_GP_CNTRL, |
7929 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | 7911 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); |
7930 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); | ||
7931 | if (err < 0) { | 7912 | if (err < 0) { |
7932 | IWL_DEBUG_INFO("Failed to init the card\n"); | 7913 | IWL_DEBUG_INFO("Failed to init the card\n"); |
7933 | goto out_remove_sysfs; | 7914 | goto out_remove_sysfs; |
@@ -7980,9 +7961,6 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
7980 | 7961 | ||
7981 | priv->iw_mode = NL80211_IFTYPE_STATION; | 7962 | priv->iw_mode = NL80211_IFTYPE_STATION; |
7982 | 7963 | ||
7983 | if (iwl3945_param_qos_enable) | ||
7984 | priv->qos_data.qos_enable = 1; | ||
7985 | |||
7986 | iwl3945_reset_qos(priv); | 7964 | iwl3945_reset_qos(priv); |
7987 | 7965 | ||
7988 | priv->qos_data.qos_active = 0; | 7966 | priv->qos_data.qos_active = 0; |
@@ -8373,9 +8351,5 @@ MODULE_PARM_DESC(disable_hw_scan, "disable hardware scanning (default 0)"); | |||
8373 | module_param_named(queues_num, iwl3945_param_queues_num, int, 0444); | 8351 | module_param_named(queues_num, iwl3945_param_queues_num, int, 0444); |
8374 | MODULE_PARM_DESC(queues_num, "number of hw queues."); | 8352 | MODULE_PARM_DESC(queues_num, "number of hw queues."); |
8375 | 8353 | ||
8376 | /* QoS */ | ||
8377 | module_param_named(qos_enable, iwl3945_param_qos_enable, int, 0444); | ||
8378 | MODULE_PARM_DESC(qos_enable, "enable all QoS functionality"); | ||
8379 | |||
8380 | module_exit(iwl3945_exit); | 8354 | module_exit(iwl3945_exit); |
8381 | module_init(iwl3945_init); | 8355 | module_init(iwl3945_init); |
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h index a17b778c172c..277ff1975bde 100644 --- a/drivers/net/wireless/libertas/host.h +++ b/drivers/net/wireless/libertas/host.h | |||
@@ -245,6 +245,7 @@ enum cmd_mesh_access_opts { | |||
245 | CMD_ACT_MESH_GET_ROUTE_EXP, | 245 | CMD_ACT_MESH_GET_ROUTE_EXP, |
246 | CMD_ACT_MESH_SET_AUTOSTART_ENABLED, | 246 | CMD_ACT_MESH_SET_AUTOSTART_ENABLED, |
247 | CMD_ACT_MESH_GET_AUTOSTART_ENABLED, | 247 | CMD_ACT_MESH_GET_AUTOSTART_ENABLED, |
248 | CMD_ACT_MESH_SET_GET_PRB_RSP_LIMIT = 17, | ||
248 | }; | 249 | }; |
249 | 250 | ||
250 | /* Define actions and types for CMD_MESH_CONFIG */ | 251 | /* Define actions and types for CMD_MESH_CONFIG */ |
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index 241af7fe44bb..3dba83679444 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c | |||
@@ -257,6 +257,58 @@ static ssize_t lbs_anycast_set(struct device *dev, | |||
257 | return strlen(buf); | 257 | return strlen(buf); |
258 | } | 258 | } |
259 | 259 | ||
260 | /** | ||
261 | * @brief Get function for sysfs attribute prb_rsp_limit | ||
262 | */ | ||
263 | static ssize_t lbs_prb_rsp_limit_get(struct device *dev, | ||
264 | struct device_attribute *attr, char *buf) | ||
265 | { | ||
266 | struct lbs_private *priv = netdev_priv(to_net_dev(dev)); | ||
267 | struct cmd_ds_mesh_access mesh_access; | ||
268 | int ret; | ||
269 | u32 retry_limit; | ||
270 | |||
271 | memset(&mesh_access, 0, sizeof(mesh_access)); | ||
272 | mesh_access.data[0] = cpu_to_le32(CMD_ACT_GET); | ||
273 | |||
274 | ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_GET_PRB_RSP_LIMIT, | ||
275 | &mesh_access); | ||
276 | if (ret) | ||
277 | return ret; | ||
278 | |||
279 | retry_limit = le32_to_cpu(mesh_access.data[1]); | ||
280 | return snprintf(buf, 10, "%d\n", retry_limit); | ||
281 | } | ||
282 | |||
283 | /** | ||
284 | * @brief Set function for sysfs attribute prb_rsp_limit | ||
285 | */ | ||
286 | static ssize_t lbs_prb_rsp_limit_set(struct device *dev, | ||
287 | struct device_attribute *attr, const char *buf, size_t count) | ||
288 | { | ||
289 | struct lbs_private *priv = netdev_priv(to_net_dev(dev)); | ||
290 | struct cmd_ds_mesh_access mesh_access; | ||
291 | int ret; | ||
292 | unsigned long retry_limit; | ||
293 | |||
294 | memset(&mesh_access, 0, sizeof(mesh_access)); | ||
295 | mesh_access.data[0] = cpu_to_le32(CMD_ACT_SET); | ||
296 | |||
297 | if (!strict_strtoul(buf, 10, &retry_limit)) | ||
298 | return -ENOTSUPP; | ||
299 | if (retry_limit > 15) | ||
300 | return -ENOTSUPP; | ||
301 | |||
302 | mesh_access.data[1] = cpu_to_le32(retry_limit); | ||
303 | |||
304 | ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_GET_PRB_RSP_LIMIT, | ||
305 | &mesh_access); | ||
306 | if (ret) | ||
307 | return ret; | ||
308 | |||
309 | return strlen(buf); | ||
310 | } | ||
311 | |||
260 | static int lbs_add_rtap(struct lbs_private *priv); | 312 | static int lbs_add_rtap(struct lbs_private *priv); |
261 | static void lbs_remove_rtap(struct lbs_private *priv); | 313 | static void lbs_remove_rtap(struct lbs_private *priv); |
262 | static int lbs_add_mesh(struct lbs_private *priv); | 314 | static int lbs_add_mesh(struct lbs_private *priv); |
@@ -375,8 +427,16 @@ static DEVICE_ATTR(lbs_mesh, 0644, lbs_mesh_get, lbs_mesh_set); | |||
375 | */ | 427 | */ |
376 | static DEVICE_ATTR(anycast_mask, 0644, lbs_anycast_get, lbs_anycast_set); | 428 | static DEVICE_ATTR(anycast_mask, 0644, lbs_anycast_get, lbs_anycast_set); |
377 | 429 | ||
430 | /** | ||
431 | * prb_rsp_limit attribute to be exported per mshX interface | ||
432 | * through sysfs (/sys/class/net/mshX/prb_rsp_limit) | ||
433 | */ | ||
434 | static DEVICE_ATTR(prb_rsp_limit, 0644, lbs_prb_rsp_limit_get, | ||
435 | lbs_prb_rsp_limit_set); | ||
436 | |||
378 | static struct attribute *lbs_mesh_sysfs_entries[] = { | 437 | static struct attribute *lbs_mesh_sysfs_entries[] = { |
379 | &dev_attr_anycast_mask.attr, | 438 | &dev_attr_anycast_mask.attr, |
439 | &dev_attr_prb_rsp_limit.attr, | ||
380 | NULL, | 440 | NULL, |
381 | }; | 441 | }; |
382 | 442 | ||
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c index 530648b39935..fd5a537ac51d 100644 --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c | |||
@@ -522,6 +522,10 @@ static void mac80211_hwsim_sta_notify(struct ieee80211_hw *hw, | |||
522 | case STA_NOTIFY_REMOVE: | 522 | case STA_NOTIFY_REMOVE: |
523 | hwsim_clear_sta_magic(sta); | 523 | hwsim_clear_sta_magic(sta); |
524 | break; | 524 | break; |
525 | case STA_NOTIFY_SLEEP: | ||
526 | case STA_NOTIFY_AWAKE: | ||
527 | /* TODO: make good use of these flags */ | ||
528 | break; | ||
525 | } | 529 | } |
526 | } | 530 | } |
527 | 531 | ||
diff --git a/drivers/net/wireless/orinoco/airport.c b/drivers/net/wireless/orinoco/airport.c index ce03a2e865fa..28f1cae48439 100644 --- a/drivers/net/wireless/orinoco/airport.c +++ b/drivers/net/wireless/orinoco/airport.c | |||
@@ -279,7 +279,7 @@ init_airport(void) | |||
279 | static void __exit | 279 | static void __exit |
280 | exit_airport(void) | 280 | exit_airport(void) |
281 | { | 281 | { |
282 | return macio_unregister_driver(&airport_driver); | 282 | macio_unregister_driver(&airport_driver); |
283 | } | 283 | } |
284 | 284 | ||
285 | module_init(init_airport); | 285 | module_init(init_airport); |
diff --git a/drivers/net/wireless/orinoco/orinoco.c b/drivers/net/wireless/orinoco/orinoco.c index 171bfa03868e..bc84e2792f8a 100644 --- a/drivers/net/wireless/orinoco/orinoco.c +++ b/drivers/net/wireless/orinoco/orinoco.c | |||
@@ -1750,7 +1750,7 @@ static void orinoco_send_bssid_wevent(struct orinoco_private *priv) | |||
1750 | union iwreq_data wrqu; | 1750 | union iwreq_data wrqu; |
1751 | int err; | 1751 | int err; |
1752 | 1752 | ||
1753 | err = hermes_read_ltv(hw, IRQ_BAP, HERMES_RID_CURRENTBSSID, | 1753 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENTBSSID, |
1754 | ETH_ALEN, NULL, wrqu.ap_addr.sa_data); | 1754 | ETH_ALEN, NULL, wrqu.ap_addr.sa_data); |
1755 | if (err != 0) | 1755 | if (err != 0) |
1756 | return; | 1756 | return; |
@@ -1773,7 +1773,7 @@ static void orinoco_send_assocreqie_wevent(struct orinoco_private *priv) | |||
1773 | if (!priv->has_wpa) | 1773 | if (!priv->has_wpa) |
1774 | return; | 1774 | return; |
1775 | 1775 | ||
1776 | err = hermes_read_ltv(hw, IRQ_BAP, HERMES_RID_CURRENT_ASSOC_REQ_INFO, | 1776 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_ASSOC_REQ_INFO, |
1777 | sizeof(buf), NULL, &buf); | 1777 | sizeof(buf), NULL, &buf); |
1778 | if (err != 0) | 1778 | if (err != 0) |
1779 | return; | 1779 | return; |
@@ -1803,7 +1803,7 @@ static void orinoco_send_assocrespie_wevent(struct orinoco_private *priv) | |||
1803 | if (!priv->has_wpa) | 1803 | if (!priv->has_wpa) |
1804 | return; | 1804 | return; |
1805 | 1805 | ||
1806 | err = hermes_read_ltv(hw, IRQ_BAP, HERMES_RID_CURRENT_ASSOC_RESP_INFO, | 1806 | err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_ASSOC_RESP_INFO, |
1807 | sizeof(buf), NULL, &buf); | 1807 | sizeof(buf), NULL, &buf); |
1808 | if (err != 0) | 1808 | if (err != 0) |
1809 | return; | 1809 | return; |
diff --git a/drivers/net/wireless/orinoco/orinoco_cs.c b/drivers/net/wireless/orinoco/orinoco_cs.c index bf6a51da3b29..f127602670ec 100644 --- a/drivers/net/wireless/orinoco/orinoco_cs.c +++ b/drivers/net/wireless/orinoco/orinoco_cs.c | |||
@@ -178,13 +178,17 @@ static int orinoco_cs_config_check(struct pcmcia_device *p_dev, | |||
178 | /* Note that the CIS values need to be rescaled */ | 178 | /* Note that the CIS values need to be rescaled */ |
179 | if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) { | 179 | if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) { |
180 | if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) { | 180 | if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) { |
181 | DEBUG(2, "spectrum_cs_config: Vcc mismatch (vcc = %d, CIS = %d)\n", vcc, cfg->vcc.param[CISTPL_POWER_VNOM] / 10000); | 181 | DEBUG(2, "%s: Vcc mismatch (vcc = %d, CIS = %d)\n", |
182 | __func__, vcc, | ||
183 | cfg->vcc.param[CISTPL_POWER_VNOM] / 10000); | ||
182 | if (!ignore_cis_vcc) | 184 | if (!ignore_cis_vcc) |
183 | goto next_entry; | 185 | goto next_entry; |
184 | } | 186 | } |
185 | } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) { | 187 | } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) { |
186 | if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000) { | 188 | if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000) { |
187 | DEBUG(2, "spectrum_cs_config: Vcc mismatch (vcc = %d, CIS = %d)\n", vcc, dflt->vcc.param[CISTPL_POWER_VNOM] / 10000); | 189 | DEBUG(2, "%s: Vcc mismatch (vcc = %d, CIS = %d)\n", |
190 | __func__, vcc, | ||
191 | dflt->vcc.param[CISTPL_POWER_VNOM] / 10000); | ||
188 | if (!ignore_cis_vcc) | 192 | if (!ignore_cis_vcc) |
189 | goto next_entry; | 193 | goto next_entry; |
190 | } | 194 | } |
diff --git a/drivers/net/wireless/orinoco/spectrum_cs.c b/drivers/net/wireless/orinoco/spectrum_cs.c index a2764764c1c0..b2ca2e39c2cb 100644 --- a/drivers/net/wireless/orinoco/spectrum_cs.c +++ b/drivers/net/wireless/orinoco/spectrum_cs.c | |||
@@ -248,13 +248,17 @@ static int spectrum_cs_config_check(struct pcmcia_device *p_dev, | |||
248 | /* Note that the CIS values need to be rescaled */ | 248 | /* Note that the CIS values need to be rescaled */ |
249 | if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) { | 249 | if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) { |
250 | if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) { | 250 | if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) { |
251 | DEBUG(2, "spectrum_cs_config: Vcc mismatch (vcc = %d, CIS = %d)\n", vcc, cfg->vcc.param[CISTPL_POWER_VNOM] / 10000); | 251 | DEBUG(2, "%s: Vcc mismatch (vcc = %d, CIS = %d)\n", |
252 | __func__, vcc, | ||
253 | cfg->vcc.param[CISTPL_POWER_VNOM] / 10000); | ||
252 | if (!ignore_cis_vcc) | 254 | if (!ignore_cis_vcc) |
253 | goto next_entry; | 255 | goto next_entry; |
254 | } | 256 | } |
255 | } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) { | 257 | } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) { |
256 | if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000) { | 258 | if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000) { |
257 | DEBUG(2, "spectrum_cs_config: Vcc mismatch (vcc = %d, CIS = %d)\n", vcc, dflt->vcc.param[CISTPL_POWER_VNOM] / 10000); | 259 | DEBUG(2, "%s: Vcc mismatch (vcc = %d, CIS = %d)\n", |
260 | __func__, vcc, | ||
261 | dflt->vcc.param[CISTPL_POWER_VNOM] / 10000); | ||
258 | if (!ignore_cis_vcc) | 262 | if (!ignore_cis_vcc) |
259 | goto next_entry; | 263 | goto next_entry; |
260 | } | 264 | } |
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index 89968a5bff84..a4e99b02af02 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c | |||
@@ -540,6 +540,14 @@ static int p54_rx_data(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
540 | size_t header_len = sizeof(*hdr); | 540 | size_t header_len = sizeof(*hdr); |
541 | u32 tsf32; | 541 | u32 tsf32; |
542 | 542 | ||
543 | /* | ||
544 | * If the device is in a unspecified state we have to | ||
545 | * ignore all data frames. Else we could end up with a | ||
546 | * nasty crash. | ||
547 | */ | ||
548 | if (unlikely(priv->mode == NL80211_IFTYPE_UNSPECIFIED)) | ||
549 | return 0; | ||
550 | |||
543 | if (!(hdr->flags & cpu_to_le16(P54_HDR_FLAG_DATA_IN_FCS_GOOD))) { | 551 | if (!(hdr->flags & cpu_to_le16(P54_HDR_FLAG_DATA_IN_FCS_GOOD))) { |
544 | if (priv->filter_flags & FIF_FCSFAIL) | 552 | if (priv->filter_flags & FIF_FCSFAIL) |
545 | rx_status.flag |= RX_FLAG_FAILED_FCS_CRC; | 553 | rx_status.flag |= RX_FLAG_FAILED_FCS_CRC; |
@@ -608,6 +616,12 @@ void p54_free_skb(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
608 | if (unlikely(!skb || !dev || !skb_queue_len(&priv->tx_queue))) | 616 | if (unlikely(!skb || !dev || !skb_queue_len(&priv->tx_queue))) |
609 | return; | 617 | return; |
610 | 618 | ||
619 | /* | ||
620 | * don't try to free an already unlinked skb | ||
621 | */ | ||
622 | if (unlikely((!skb->next) || (!skb->prev))) | ||
623 | return; | ||
624 | |||
611 | spin_lock_irqsave(&priv->tx_queue.lock, flags); | 625 | spin_lock_irqsave(&priv->tx_queue.lock, flags); |
612 | info = IEEE80211_SKB_CB(skb); | 626 | info = IEEE80211_SKB_CB(skb); |
613 | range = (void *)info->rate_driver_data; | 627 | range = (void *)info->rate_driver_data; |
@@ -874,7 +888,27 @@ static int p54_assign_address(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
874 | return -EINVAL; | 888 | return -EINVAL; |
875 | 889 | ||
876 | spin_lock_irqsave(&priv->tx_queue.lock, flags); | 890 | spin_lock_irqsave(&priv->tx_queue.lock, flags); |
891 | |||
877 | left = skb_queue_len(&priv->tx_queue); | 892 | left = skb_queue_len(&priv->tx_queue); |
893 | if (unlikely(left >= 28)) { | ||
894 | /* | ||
895 | * The tx_queue is nearly full! | ||
896 | * We have throttle normal data traffic, because we must | ||
897 | * have a few spare slots for control frames left. | ||
898 | */ | ||
899 | ieee80211_stop_queues(dev); | ||
900 | |||
901 | if (unlikely(left == 32)) { | ||
902 | /* | ||
903 | * The tx_queue is now really full. | ||
904 | * | ||
905 | * TODO: check if the device has crashed and reset it. | ||
906 | */ | ||
907 | spin_unlock_irqrestore(&priv->tx_queue.lock, flags); | ||
908 | return -ENOSPC; | ||
909 | } | ||
910 | } | ||
911 | |||
878 | while (left--) { | 912 | while (left--) { |
879 | u32 hole_size; | 913 | u32 hole_size; |
880 | info = IEEE80211_SKB_CB(entry); | 914 | info = IEEE80211_SKB_CB(entry); |
@@ -903,7 +937,7 @@ static int p54_assign_address(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
903 | if (!target_skb) { | 937 | if (!target_skb) { |
904 | spin_unlock_irqrestore(&priv->tx_queue.lock, flags); | 938 | spin_unlock_irqrestore(&priv->tx_queue.lock, flags); |
905 | ieee80211_stop_queues(dev); | 939 | ieee80211_stop_queues(dev); |
906 | return -ENOMEM; | 940 | return -ENOSPC; |
907 | } | 941 | } |
908 | 942 | ||
909 | info = IEEE80211_SKB_CB(skb); | 943 | info = IEEE80211_SKB_CB(skb); |
@@ -1051,19 +1085,6 @@ static int p54_sta_unlock(struct ieee80211_hw *dev, u8 *addr) | |||
1051 | return 0; | 1085 | return 0; |
1052 | } | 1086 | } |
1053 | 1087 | ||
1054 | static void p54_sta_notify_ps(struct ieee80211_hw *dev, | ||
1055 | enum sta_notify_ps_cmd notify_cmd, | ||
1056 | struct ieee80211_sta *sta) | ||
1057 | { | ||
1058 | switch (notify_cmd) { | ||
1059 | case STA_NOTIFY_AWAKE: | ||
1060 | p54_sta_unlock(dev, sta->addr); | ||
1061 | break; | ||
1062 | default: | ||
1063 | break; | ||
1064 | } | ||
1065 | } | ||
1066 | |||
1067 | static void p54_sta_notify(struct ieee80211_hw *dev, struct ieee80211_vif *vif, | 1088 | static void p54_sta_notify(struct ieee80211_hw *dev, struct ieee80211_vif *vif, |
1068 | enum sta_notify_cmd notify_cmd, | 1089 | enum sta_notify_cmd notify_cmd, |
1069 | struct ieee80211_sta *sta) | 1090 | struct ieee80211_sta *sta) |
@@ -1078,6 +1099,10 @@ static void p54_sta_notify(struct ieee80211_hw *dev, struct ieee80211_vif *vif, | |||
1078 | 1099 | ||
1079 | p54_sta_unlock(dev, sta->addr); | 1100 | p54_sta_unlock(dev, sta->addr); |
1080 | break; | 1101 | break; |
1102 | case STA_NOTIFY_AWAKE: | ||
1103 | /* update the firmware's filter table */ | ||
1104 | p54_sta_unlock(dev, sta->addr); | ||
1105 | break; | ||
1081 | default: | 1106 | default: |
1082 | break; | 1107 | break; |
1083 | } | 1108 | } |
@@ -1684,19 +1709,18 @@ static void p54_stop(struct ieee80211_hw *dev) | |||
1684 | struct sk_buff *skb; | 1709 | struct sk_buff *skb; |
1685 | 1710 | ||
1686 | mutex_lock(&priv->conf_mutex); | 1711 | mutex_lock(&priv->conf_mutex); |
1712 | priv->mode = NL80211_IFTYPE_UNSPECIFIED; | ||
1687 | del_timer(&priv->stats_timer); | 1713 | del_timer(&priv->stats_timer); |
1688 | p54_free_skb(dev, priv->cached_stats); | 1714 | p54_free_skb(dev, priv->cached_stats); |
1689 | priv->cached_stats = NULL; | 1715 | priv->cached_stats = NULL; |
1690 | if (priv->cached_beacon) | 1716 | if (priv->cached_beacon) |
1691 | p54_tx_cancel(dev, priv->cached_beacon); | 1717 | p54_tx_cancel(dev, priv->cached_beacon); |
1692 | 1718 | ||
1719 | priv->stop(dev); | ||
1693 | while ((skb = skb_dequeue(&priv->tx_queue))) | 1720 | while ((skb = skb_dequeue(&priv->tx_queue))) |
1694 | kfree_skb(skb); | 1721 | kfree_skb(skb); |
1695 | |||
1696 | priv->cached_beacon = NULL; | 1722 | priv->cached_beacon = NULL; |
1697 | priv->stop(dev); | ||
1698 | priv->tsf_high32 = priv->tsf_low32 = 0; | 1723 | priv->tsf_high32 = priv->tsf_low32 = 0; |
1699 | priv->mode = NL80211_IFTYPE_UNSPECIFIED; | ||
1700 | mutex_unlock(&priv->conf_mutex); | 1724 | mutex_unlock(&priv->conf_mutex); |
1701 | } | 1725 | } |
1702 | 1726 | ||
@@ -2027,7 +2051,6 @@ static const struct ieee80211_ops p54_ops = { | |||
2027 | .add_interface = p54_add_interface, | 2051 | .add_interface = p54_add_interface, |
2028 | .remove_interface = p54_remove_interface, | 2052 | .remove_interface = p54_remove_interface, |
2029 | .set_tim = p54_set_tim, | 2053 | .set_tim = p54_set_tim, |
2030 | .sta_notify_ps = p54_sta_notify_ps, | ||
2031 | .sta_notify = p54_sta_notify, | 2054 | .sta_notify = p54_sta_notify, |
2032 | .set_key = p54_set_key, | 2055 | .set_key = p54_set_key, |
2033 | .config = p54_config, | 2056 | .config = p54_config, |
diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c index d21c509325fe..c28220e401b9 100644 --- a/drivers/net/wireless/p54/p54pci.c +++ b/drivers/net/wireless/p54/p54pci.c | |||
@@ -332,13 +332,6 @@ static void p54p_tx(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
332 | 332 | ||
333 | P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE)); | 333 | P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE)); |
334 | P54P_READ(dev_int); | 334 | P54P_READ(dev_int); |
335 | |||
336 | /* FIXME: unlikely to happen because the device usually runs out of | ||
337 | memory before we fill the ring up, but we can make it impossible */ | ||
338 | if (idx - device_idx > ARRAY_SIZE(ring_control->tx_data) - 2) { | ||
339 | p54_free_skb(dev, skb); | ||
340 | printk(KERN_INFO "%s: tx overflow.\n", wiphy_name(dev->wiphy)); | ||
341 | } | ||
342 | } | 335 | } |
343 | 336 | ||
344 | static void p54p_stop(struct ieee80211_hw *dev) | 337 | static void p54p_stop(struct ieee80211_hw *dev) |
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index 2dd3cd41d0fe..c2789e53b984 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c | |||
@@ -86,13 +86,13 @@ static void p54u_rx_cb(struct urb *urb) | |||
86 | struct ieee80211_hw *dev = info->dev; | 86 | struct ieee80211_hw *dev = info->dev; |
87 | struct p54u_priv *priv = dev->priv; | 87 | struct p54u_priv *priv = dev->priv; |
88 | 88 | ||
89 | skb_unlink(skb, &priv->rx_queue); | ||
90 | |||
89 | if (unlikely(urb->status)) { | 91 | if (unlikely(urb->status)) { |
90 | info->urb = NULL; | 92 | dev_kfree_skb_irq(skb); |
91 | usb_free_urb(urb); | ||
92 | return; | 93 | return; |
93 | } | 94 | } |
94 | 95 | ||
95 | skb_unlink(skb, &priv->rx_queue); | ||
96 | skb_put(skb, urb->actual_length); | 96 | skb_put(skb, urb->actual_length); |
97 | 97 | ||
98 | if (priv->hw_type == P54U_NET2280) | 98 | if (priv->hw_type == P54U_NET2280) |
@@ -105,7 +105,6 @@ static void p54u_rx_cb(struct urb *urb) | |||
105 | if (p54_rx(dev, skb)) { | 105 | if (p54_rx(dev, skb)) { |
106 | skb = dev_alloc_skb(priv->common.rx_mtu + 32); | 106 | skb = dev_alloc_skb(priv->common.rx_mtu + 32); |
107 | if (unlikely(!skb)) { | 107 | if (unlikely(!skb)) { |
108 | usb_free_urb(urb); | ||
109 | /* TODO check rx queue length and refill *somewhere* */ | 108 | /* TODO check rx queue length and refill *somewhere* */ |
110 | return; | 109 | return; |
111 | } | 110 | } |
@@ -115,7 +114,6 @@ static void p54u_rx_cb(struct urb *urb) | |||
115 | info->dev = dev; | 114 | info->dev = dev; |
116 | urb->transfer_buffer = skb_tail_pointer(skb); | 115 | urb->transfer_buffer = skb_tail_pointer(skb); |
117 | urb->context = skb; | 116 | urb->context = skb; |
118 | skb_queue_tail(&priv->rx_queue, skb); | ||
119 | } else { | 117 | } else { |
120 | if (priv->hw_type == P54U_NET2280) | 118 | if (priv->hw_type == P54U_NET2280) |
121 | skb_push(skb, priv->common.tx_hdr_len); | 119 | skb_push(skb, priv->common.tx_hdr_len); |
@@ -130,11 +128,14 @@ static void p54u_rx_cb(struct urb *urb) | |||
130 | WARN_ON(1); | 128 | WARN_ON(1); |
131 | urb->transfer_buffer = skb_tail_pointer(skb); | 129 | urb->transfer_buffer = skb_tail_pointer(skb); |
132 | } | 130 | } |
133 | |||
134 | skb_queue_tail(&priv->rx_queue, skb); | ||
135 | } | 131 | } |
136 | 132 | skb_queue_tail(&priv->rx_queue, skb); | |
137 | usb_submit_urb(urb, GFP_ATOMIC); | 133 | usb_anchor_urb(urb, &priv->submitted); |
134 | if (usb_submit_urb(urb, GFP_ATOMIC)) { | ||
135 | skb_unlink(skb, &priv->rx_queue); | ||
136 | usb_unanchor_urb(urb); | ||
137 | dev_kfree_skb_irq(skb); | ||
138 | } | ||
138 | } | 139 | } |
139 | 140 | ||
140 | static void p54u_tx_reuse_skb_cb(struct urb *urb) | 141 | static void p54u_tx_reuse_skb_cb(struct urb *urb) |
@@ -144,18 +145,6 @@ static void p54u_tx_reuse_skb_cb(struct urb *urb) | |||
144 | usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0)))->priv; | 145 | usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0)))->priv; |
145 | 146 | ||
146 | skb_pull(skb, priv->common.tx_hdr_len); | 147 | skb_pull(skb, priv->common.tx_hdr_len); |
147 | usb_free_urb(urb); | ||
148 | } | ||
149 | |||
150 | static void p54u_tx_cb(struct urb *urb) | ||
151 | { | ||
152 | usb_free_urb(urb); | ||
153 | } | ||
154 | |||
155 | static void p54u_tx_free_cb(struct urb *urb) | ||
156 | { | ||
157 | kfree(urb->transfer_buffer); | ||
158 | usb_free_urb(urb); | ||
159 | } | 148 | } |
160 | 149 | ||
161 | static void p54u_tx_free_skb_cb(struct urb *urb) | 150 | static void p54u_tx_free_skb_cb(struct urb *urb) |
@@ -165,25 +154,36 @@ static void p54u_tx_free_skb_cb(struct urb *urb) | |||
165 | usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0)); | 154 | usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0)); |
166 | 155 | ||
167 | p54_free_skb(dev, skb); | 156 | p54_free_skb(dev, skb); |
168 | usb_free_urb(urb); | 157 | } |
158 | |||
159 | static void p54u_tx_dummy_cb(struct urb *urb) { } | ||
160 | |||
161 | static void p54u_free_urbs(struct ieee80211_hw *dev) | ||
162 | { | ||
163 | struct p54u_priv *priv = dev->priv; | ||
164 | usb_kill_anchored_urbs(&priv->submitted); | ||
169 | } | 165 | } |
170 | 166 | ||
171 | static int p54u_init_urbs(struct ieee80211_hw *dev) | 167 | static int p54u_init_urbs(struct ieee80211_hw *dev) |
172 | { | 168 | { |
173 | struct p54u_priv *priv = dev->priv; | 169 | struct p54u_priv *priv = dev->priv; |
174 | struct urb *entry; | 170 | struct urb *entry = NULL; |
175 | struct sk_buff *skb; | 171 | struct sk_buff *skb; |
176 | struct p54u_rx_info *info; | 172 | struct p54u_rx_info *info; |
173 | int ret = 0; | ||
177 | 174 | ||
178 | while (skb_queue_len(&priv->rx_queue) < 32) { | 175 | while (skb_queue_len(&priv->rx_queue) < 32) { |
179 | skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL); | 176 | skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL); |
180 | if (!skb) | 177 | if (!skb) { |
181 | break; | 178 | ret = -ENOMEM; |
179 | goto err; | ||
180 | } | ||
182 | entry = usb_alloc_urb(0, GFP_KERNEL); | 181 | entry = usb_alloc_urb(0, GFP_KERNEL); |
183 | if (!entry) { | 182 | if (!entry) { |
184 | kfree_skb(skb); | 183 | ret = -ENOMEM; |
185 | break; | 184 | goto err; |
186 | } | 185 | } |
186 | |||
187 | usb_fill_bulk_urb(entry, priv->udev, | 187 | usb_fill_bulk_urb(entry, priv->udev, |
188 | usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), | 188 | usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), |
189 | skb_tail_pointer(skb), | 189 | skb_tail_pointer(skb), |
@@ -192,26 +192,25 @@ static int p54u_init_urbs(struct ieee80211_hw *dev) | |||
192 | info->urb = entry; | 192 | info->urb = entry; |
193 | info->dev = dev; | 193 | info->dev = dev; |
194 | skb_queue_tail(&priv->rx_queue, skb); | 194 | skb_queue_tail(&priv->rx_queue, skb); |
195 | usb_submit_urb(entry, GFP_KERNEL); | 195 | |
196 | usb_anchor_urb(entry, &priv->submitted); | ||
197 | ret = usb_submit_urb(entry, GFP_KERNEL); | ||
198 | if (ret) { | ||
199 | skb_unlink(skb, &priv->rx_queue); | ||
200 | usb_unanchor_urb(entry); | ||
201 | goto err; | ||
202 | } | ||
203 | usb_free_urb(entry); | ||
204 | entry = NULL; | ||
196 | } | 205 | } |
197 | 206 | ||
198 | return 0; | 207 | return 0; |
199 | } | ||
200 | 208 | ||
201 | static void p54u_free_urbs(struct ieee80211_hw *dev) | 209 | err: |
202 | { | 210 | usb_free_urb(entry); |
203 | struct p54u_priv *priv = dev->priv; | 211 | kfree_skb(skb); |
204 | struct p54u_rx_info *info; | 212 | p54u_free_urbs(dev); |
205 | struct sk_buff *skb; | 213 | return ret; |
206 | |||
207 | while ((skb = skb_dequeue(&priv->rx_queue))) { | ||
208 | info = (struct p54u_rx_info *) skb->cb; | ||
209 | if (!info->urb) | ||
210 | continue; | ||
211 | |||
212 | usb_kill_urb(info->urb); | ||
213 | kfree_skb(skb); | ||
214 | } | ||
215 | } | 214 | } |
216 | 215 | ||
217 | static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb, | 216 | static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb, |
@@ -219,6 +218,7 @@ static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
219 | { | 218 | { |
220 | struct p54u_priv *priv = dev->priv; | 219 | struct p54u_priv *priv = dev->priv; |
221 | struct urb *addr_urb, *data_urb; | 220 | struct urb *addr_urb, *data_urb; |
221 | int err = 0; | ||
222 | 222 | ||
223 | addr_urb = usb_alloc_urb(0, GFP_ATOMIC); | 223 | addr_urb = usb_alloc_urb(0, GFP_ATOMIC); |
224 | if (!addr_urb) | 224 | if (!addr_urb) |
@@ -233,15 +233,31 @@ static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
233 | usb_fill_bulk_urb(addr_urb, priv->udev, | 233 | usb_fill_bulk_urb(addr_urb, priv->udev, |
234 | usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), | 234 | usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), |
235 | &((struct p54_hdr *)skb->data)->req_id, 4, | 235 | &((struct p54_hdr *)skb->data)->req_id, 4, |
236 | p54u_tx_cb, dev); | 236 | p54u_tx_dummy_cb, dev); |
237 | usb_fill_bulk_urb(data_urb, priv->udev, | 237 | usb_fill_bulk_urb(data_urb, priv->udev, |
238 | usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), | 238 | usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), |
239 | skb->data, skb->len, | 239 | skb->data, skb->len, |
240 | free_on_tx ? p54u_tx_free_skb_cb : | 240 | free_on_tx ? p54u_tx_free_skb_cb : |
241 | p54u_tx_reuse_skb_cb, skb); | 241 | p54u_tx_reuse_skb_cb, skb); |
242 | 242 | ||
243 | usb_submit_urb(addr_urb, GFP_ATOMIC); | 243 | usb_anchor_urb(addr_urb, &priv->submitted); |
244 | usb_submit_urb(data_urb, GFP_ATOMIC); | 244 | err = usb_submit_urb(addr_urb, GFP_ATOMIC); |
245 | if (err) { | ||
246 | usb_unanchor_urb(addr_urb); | ||
247 | goto out; | ||
248 | } | ||
249 | |||
250 | usb_anchor_urb(addr_urb, &priv->submitted); | ||
251 | err = usb_submit_urb(data_urb, GFP_ATOMIC); | ||
252 | if (err) | ||
253 | usb_unanchor_urb(data_urb); | ||
254 | |||
255 | out: | ||
256 | usb_free_urb(addr_urb); | ||
257 | usb_free_urb(data_urb); | ||
258 | |||
259 | if (err) | ||
260 | p54_free_skb(dev, skb); | ||
245 | } | 261 | } |
246 | 262 | ||
247 | static __le32 p54u_lm87_chksum(const __le32 *data, size_t length) | 263 | static __le32 p54u_lm87_chksum(const __le32 *data, size_t length) |
@@ -281,7 +297,13 @@ static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
281 | free_on_tx ? p54u_tx_free_skb_cb : | 297 | free_on_tx ? p54u_tx_free_skb_cb : |
282 | p54u_tx_reuse_skb_cb, skb); | 298 | p54u_tx_reuse_skb_cb, skb); |
283 | 299 | ||
284 | usb_submit_urb(data_urb, GFP_ATOMIC); | 300 | usb_anchor_urb(data_urb, &priv->submitted); |
301 | if (usb_submit_urb(data_urb, GFP_ATOMIC)) { | ||
302 | usb_unanchor_urb(data_urb); | ||
303 | skb_pull(skb, sizeof(*hdr)); | ||
304 | p54_free_skb(dev, skb); | ||
305 | } | ||
306 | usb_free_urb(data_urb); | ||
285 | } | 307 | } |
286 | 308 | ||
287 | static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb, | 309 | static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb, |
@@ -291,6 +313,7 @@ static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
291 | struct urb *int_urb, *data_urb; | 313 | struct urb *int_urb, *data_urb; |
292 | struct net2280_tx_hdr *hdr; | 314 | struct net2280_tx_hdr *hdr; |
293 | struct net2280_reg_write *reg; | 315 | struct net2280_reg_write *reg; |
316 | int err = 0; | ||
294 | 317 | ||
295 | reg = kmalloc(sizeof(*reg), GFP_ATOMIC); | 318 | reg = kmalloc(sizeof(*reg), GFP_ATOMIC); |
296 | if (!reg) | 319 | if (!reg) |
@@ -320,15 +343,42 @@ static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
320 | 343 | ||
321 | usb_fill_bulk_urb(int_urb, priv->udev, | 344 | usb_fill_bulk_urb(int_urb, priv->udev, |
322 | usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg), | 345 | usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg), |
323 | p54u_tx_free_cb, dev); | 346 | p54u_tx_dummy_cb, dev); |
324 | usb_submit_urb(int_urb, GFP_ATOMIC); | 347 | |
348 | /* | ||
349 | * This flag triggers a code path in the USB subsystem that will | ||
350 | * free what's inside the transfer_buffer after the callback routine | ||
351 | * has completed. | ||
352 | */ | ||
353 | int_urb->transfer_flags |= URB_FREE_BUFFER; | ||
325 | 354 | ||
326 | usb_fill_bulk_urb(data_urb, priv->udev, | 355 | usb_fill_bulk_urb(data_urb, priv->udev, |
327 | usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), | 356 | usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), |
328 | skb->data, skb->len, | 357 | skb->data, skb->len, |
329 | free_on_tx ? p54u_tx_free_skb_cb : | 358 | free_on_tx ? p54u_tx_free_skb_cb : |
330 | p54u_tx_reuse_skb_cb, skb); | 359 | p54u_tx_reuse_skb_cb, skb); |
331 | usb_submit_urb(data_urb, GFP_ATOMIC); | 360 | |
361 | usb_anchor_urb(int_urb, &priv->submitted); | ||
362 | err = usb_submit_urb(int_urb, GFP_ATOMIC); | ||
363 | if (err) { | ||
364 | usb_unanchor_urb(int_urb); | ||
365 | goto out; | ||
366 | } | ||
367 | |||
368 | usb_anchor_urb(data_urb, &priv->submitted); | ||
369 | err = usb_submit_urb(data_urb, GFP_ATOMIC); | ||
370 | if (err) { | ||
371 | usb_unanchor_urb(data_urb); | ||
372 | goto out; | ||
373 | } | ||
374 | out: | ||
375 | usb_free_urb(int_urb); | ||
376 | usb_free_urb(data_urb); | ||
377 | |||
378 | if (err) { | ||
379 | skb_pull(skb, sizeof(*hdr)); | ||
380 | p54_free_skb(dev, skb); | ||
381 | } | ||
332 | } | 382 | } |
333 | 383 | ||
334 | static int p54u_write(struct p54u_priv *priv, | 384 | static int p54u_write(struct p54u_priv *priv, |
@@ -885,6 +935,7 @@ static int __devinit p54u_probe(struct usb_interface *intf, | |||
885 | goto err_free_dev; | 935 | goto err_free_dev; |
886 | 936 | ||
887 | skb_queue_head_init(&priv->rx_queue); | 937 | skb_queue_head_init(&priv->rx_queue); |
938 | init_usb_anchor(&priv->submitted); | ||
888 | 939 | ||
889 | p54u_open(dev); | 940 | p54u_open(dev); |
890 | err = p54_read_eeprom(dev); | 941 | err = p54_read_eeprom(dev); |
diff --git a/drivers/net/wireless/p54/p54usb.h b/drivers/net/wireless/p54/p54usb.h index 5b8fe91379c3..54ee738bf2af 100644 --- a/drivers/net/wireless/p54/p54usb.h +++ b/drivers/net/wireless/p54/p54usb.h | |||
@@ -133,6 +133,7 @@ struct p54u_priv { | |||
133 | 133 | ||
134 | spinlock_t lock; | 134 | spinlock_t lock; |
135 | struct sk_buff_head rx_queue; | 135 | struct sk_buff_head rx_queue; |
136 | struct usb_anchor submitted; | ||
136 | }; | 137 | }; |
137 | 138 | ||
138 | #endif /* P54USB_H */ | 139 | #endif /* P54USB_H */ |
diff --git a/drivers/net/wireless/rtl818x/rtl8187.h b/drivers/net/wireless/rtl818x/rtl8187.h index c385407a9941..3b1e1c2aad26 100644 --- a/drivers/net/wireless/rtl818x/rtl8187.h +++ b/drivers/net/wireless/rtl818x/rtl8187.h | |||
@@ -99,6 +99,7 @@ struct rtl8187_priv { | |||
99 | struct ieee80211_supported_band band; | 99 | struct ieee80211_supported_band band; |
100 | struct usb_device *udev; | 100 | struct usb_device *udev; |
101 | u32 rx_conf; | 101 | u32 rx_conf; |
102 | struct usb_anchor anchored; | ||
102 | u16 txpwr_base; | 103 | u16 txpwr_base; |
103 | u8 asic_rev; | 104 | u8 asic_rev; |
104 | u8 is_rtl8187b; | 105 | u8 is_rtl8187b; |
@@ -115,7 +116,6 @@ struct rtl8187_priv { | |||
115 | u8 aifsn[4]; | 116 | u8 aifsn[4]; |
116 | struct { | 117 | struct { |
117 | __le64 buf; | 118 | __le64 buf; |
118 | struct urb *urb; | ||
119 | struct sk_buff_head queue; | 119 | struct sk_buff_head queue; |
120 | } b_tx_status; | 120 | } b_tx_status; |
121 | }; | 121 | }; |
diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c index dbf52e8bbd7a..74f5449b7924 100644 --- a/drivers/net/wireless/rtl818x/rtl8187_dev.c +++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c | |||
@@ -99,7 +99,6 @@ static const struct ieee80211_channel rtl818x_channels[] = { | |||
99 | static void rtl8187_iowrite_async_cb(struct urb *urb) | 99 | static void rtl8187_iowrite_async_cb(struct urb *urb) |
100 | { | 100 | { |
101 | kfree(urb->context); | 101 | kfree(urb->context); |
102 | usb_free_urb(urb); | ||
103 | } | 102 | } |
104 | 103 | ||
105 | static void rtl8187_iowrite_async(struct rtl8187_priv *priv, __le16 addr, | 104 | static void rtl8187_iowrite_async(struct rtl8187_priv *priv, __le16 addr, |
@@ -136,11 +135,13 @@ static void rtl8187_iowrite_async(struct rtl8187_priv *priv, __le16 addr, | |||
136 | usb_fill_control_urb(urb, priv->udev, usb_sndctrlpipe(priv->udev, 0), | 135 | usb_fill_control_urb(urb, priv->udev, usb_sndctrlpipe(priv->udev, 0), |
137 | (unsigned char *)dr, buf, len, | 136 | (unsigned char *)dr, buf, len, |
138 | rtl8187_iowrite_async_cb, buf); | 137 | rtl8187_iowrite_async_cb, buf); |
138 | usb_anchor_urb(urb, &priv->anchored); | ||
139 | rc = usb_submit_urb(urb, GFP_ATOMIC); | 139 | rc = usb_submit_urb(urb, GFP_ATOMIC); |
140 | if (rc < 0) { | 140 | if (rc < 0) { |
141 | kfree(buf); | 141 | kfree(buf); |
142 | usb_free_urb(urb); | 142 | usb_unanchor_urb(urb); |
143 | } | 143 | } |
144 | usb_free_urb(urb); | ||
144 | } | 145 | } |
145 | 146 | ||
146 | static inline void rtl818x_iowrite32_async(struct rtl8187_priv *priv, | 147 | static inline void rtl818x_iowrite32_async(struct rtl8187_priv *priv, |
@@ -172,7 +173,6 @@ static void rtl8187_tx_cb(struct urb *urb) | |||
172 | struct ieee80211_hw *hw = info->rate_driver_data[0]; | 173 | struct ieee80211_hw *hw = info->rate_driver_data[0]; |
173 | struct rtl8187_priv *priv = hw->priv; | 174 | struct rtl8187_priv *priv = hw->priv; |
174 | 175 | ||
175 | usb_free_urb(info->rate_driver_data[1]); | ||
176 | skb_pull(skb, priv->is_rtl8187b ? sizeof(struct rtl8187b_tx_hdr) : | 176 | skb_pull(skb, priv->is_rtl8187b ? sizeof(struct rtl8187b_tx_hdr) : |
177 | sizeof(struct rtl8187_tx_hdr)); | 177 | sizeof(struct rtl8187_tx_hdr)); |
178 | ieee80211_tx_info_clear_status(info); | 178 | ieee80211_tx_info_clear_status(info); |
@@ -273,11 +273,13 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
273 | 273 | ||
274 | usb_fill_bulk_urb(urb, priv->udev, usb_sndbulkpipe(priv->udev, ep), | 274 | usb_fill_bulk_urb(urb, priv->udev, usb_sndbulkpipe(priv->udev, ep), |
275 | buf, skb->len, rtl8187_tx_cb, skb); | 275 | buf, skb->len, rtl8187_tx_cb, skb); |
276 | usb_anchor_urb(urb, &priv->anchored); | ||
276 | rc = usb_submit_urb(urb, GFP_ATOMIC); | 277 | rc = usb_submit_urb(urb, GFP_ATOMIC); |
277 | if (rc < 0) { | 278 | if (rc < 0) { |
278 | usb_free_urb(urb); | 279 | usb_unanchor_urb(urb); |
279 | kfree_skb(skb); | 280 | kfree_skb(skb); |
280 | } | 281 | } |
282 | usb_free_urb(urb); | ||
281 | 283 | ||
282 | return 0; | 284 | return 0; |
283 | } | 285 | } |
@@ -301,41 +303,25 @@ static void rtl8187_rx_cb(struct urb *urb) | |||
301 | return; | 303 | return; |
302 | } | 304 | } |
303 | spin_unlock(&priv->rx_queue.lock); | 305 | spin_unlock(&priv->rx_queue.lock); |
306 | skb_put(skb, urb->actual_length); | ||
304 | 307 | ||
305 | if (unlikely(urb->status)) { | 308 | if (unlikely(urb->status)) { |
306 | usb_free_urb(urb); | ||
307 | dev_kfree_skb_irq(skb); | 309 | dev_kfree_skb_irq(skb); |
308 | return; | 310 | return; |
309 | } | 311 | } |
310 | 312 | ||
311 | skb_put(skb, urb->actual_length); | ||
312 | if (!priv->is_rtl8187b) { | 313 | if (!priv->is_rtl8187b) { |
313 | struct rtl8187_rx_hdr *hdr = | 314 | struct rtl8187_rx_hdr *hdr = |
314 | (typeof(hdr))(skb_tail_pointer(skb) - sizeof(*hdr)); | 315 | (typeof(hdr))(skb_tail_pointer(skb) - sizeof(*hdr)); |
315 | flags = le32_to_cpu(hdr->flags); | 316 | flags = le32_to_cpu(hdr->flags); |
316 | signal = hdr->signal & 0x7f; | 317 | /* As with the RTL8187B below, the AGC is used to calculate |
318 | * signal strength and quality. In this case, the scaling | ||
319 | * constants are derived from the output of p54usb. | ||
320 | */ | ||
321 | quality = 130 - ((41 * hdr->agc) >> 6); | ||
322 | signal = -4 - ((27 * hdr->agc) >> 6); | ||
317 | rx_status.antenna = (hdr->signal >> 7) & 1; | 323 | rx_status.antenna = (hdr->signal >> 7) & 1; |
318 | rx_status.noise = hdr->noise; | ||
319 | rx_status.mactime = le64_to_cpu(hdr->mac_time); | 324 | rx_status.mactime = le64_to_cpu(hdr->mac_time); |
320 | priv->quality = signal; | ||
321 | rx_status.qual = priv->quality; | ||
322 | priv->noise = hdr->noise; | ||
323 | rate = (flags >> 20) & 0xF; | ||
324 | if (rate > 3) { /* OFDM rate */ | ||
325 | if (signal > 90) | ||
326 | signal = 90; | ||
327 | else if (signal < 25) | ||
328 | signal = 25; | ||
329 | signal = 90 - signal; | ||
330 | } else { /* CCK rate */ | ||
331 | if (signal > 95) | ||
332 | signal = 95; | ||
333 | else if (signal < 30) | ||
334 | signal = 30; | ||
335 | signal = 95 - signal; | ||
336 | } | ||
337 | rx_status.signal = signal; | ||
338 | priv->signal = signal; | ||
339 | } else { | 325 | } else { |
340 | struct rtl8187b_rx_hdr *hdr = | 326 | struct rtl8187b_rx_hdr *hdr = |
341 | (typeof(hdr))(skb_tail_pointer(skb) - sizeof(*hdr)); | 327 | (typeof(hdr))(skb_tail_pointer(skb) - sizeof(*hdr)); |
@@ -353,18 +339,18 @@ static void rtl8187_rx_cb(struct urb *urb) | |||
353 | */ | 339 | */ |
354 | flags = le32_to_cpu(hdr->flags); | 340 | flags = le32_to_cpu(hdr->flags); |
355 | quality = 170 - hdr->agc; | 341 | quality = 170 - hdr->agc; |
356 | if (quality > 100) | ||
357 | quality = 100; | ||
358 | signal = 14 - hdr->agc / 2; | 342 | signal = 14 - hdr->agc / 2; |
359 | rx_status.qual = quality; | ||
360 | priv->quality = quality; | ||
361 | rx_status.signal = signal; | ||
362 | priv->signal = signal; | ||
363 | rx_status.antenna = (hdr->rssi >> 7) & 1; | 343 | rx_status.antenna = (hdr->rssi >> 7) & 1; |
364 | rx_status.mactime = le64_to_cpu(hdr->mac_time); | 344 | rx_status.mactime = le64_to_cpu(hdr->mac_time); |
365 | rate = (flags >> 20) & 0xF; | ||
366 | } | 345 | } |
367 | 346 | ||
347 | if (quality > 100) | ||
348 | quality = 100; | ||
349 | rx_status.qual = quality; | ||
350 | priv->quality = quality; | ||
351 | rx_status.signal = signal; | ||
352 | priv->signal = signal; | ||
353 | rate = (flags >> 20) & 0xF; | ||
368 | skb_trim(skb, flags & 0x0FFF); | 354 | skb_trim(skb, flags & 0x0FFF); |
369 | rx_status.rate_idx = rate; | 355 | rx_status.rate_idx = rate; |
370 | rx_status.freq = dev->conf.channel->center_freq; | 356 | rx_status.freq = dev->conf.channel->center_freq; |
@@ -376,7 +362,6 @@ static void rtl8187_rx_cb(struct urb *urb) | |||
376 | 362 | ||
377 | skb = dev_alloc_skb(RTL8187_MAX_RX); | 363 | skb = dev_alloc_skb(RTL8187_MAX_RX); |
378 | if (unlikely(!skb)) { | 364 | if (unlikely(!skb)) { |
379 | usb_free_urb(urb); | ||
380 | /* TODO check rx queue length and refill *somewhere* */ | 365 | /* TODO check rx queue length and refill *somewhere* */ |
381 | return; | 366 | return; |
382 | } | 367 | } |
@@ -388,24 +373,32 @@ static void rtl8187_rx_cb(struct urb *urb) | |||
388 | urb->context = skb; | 373 | urb->context = skb; |
389 | skb_queue_tail(&priv->rx_queue, skb); | 374 | skb_queue_tail(&priv->rx_queue, skb); |
390 | 375 | ||
391 | usb_submit_urb(urb, GFP_ATOMIC); | 376 | usb_anchor_urb(urb, &priv->anchored); |
377 | if (usb_submit_urb(urb, GFP_ATOMIC)) { | ||
378 | usb_unanchor_urb(urb); | ||
379 | skb_unlink(skb, &priv->rx_queue); | ||
380 | dev_kfree_skb_irq(skb); | ||
381 | } | ||
392 | } | 382 | } |
393 | 383 | ||
394 | static int rtl8187_init_urbs(struct ieee80211_hw *dev) | 384 | static int rtl8187_init_urbs(struct ieee80211_hw *dev) |
395 | { | 385 | { |
396 | struct rtl8187_priv *priv = dev->priv; | 386 | struct rtl8187_priv *priv = dev->priv; |
397 | struct urb *entry; | 387 | struct urb *entry = NULL; |
398 | struct sk_buff *skb; | 388 | struct sk_buff *skb; |
399 | struct rtl8187_rx_info *info; | 389 | struct rtl8187_rx_info *info; |
390 | int ret = 0; | ||
400 | 391 | ||
401 | while (skb_queue_len(&priv->rx_queue) < 8) { | 392 | while (skb_queue_len(&priv->rx_queue) < 8) { |
402 | skb = __dev_alloc_skb(RTL8187_MAX_RX, GFP_KERNEL); | 393 | skb = __dev_alloc_skb(RTL8187_MAX_RX, GFP_KERNEL); |
403 | if (!skb) | 394 | if (!skb) { |
404 | break; | 395 | ret = -ENOMEM; |
396 | goto err; | ||
397 | } | ||
405 | entry = usb_alloc_urb(0, GFP_KERNEL); | 398 | entry = usb_alloc_urb(0, GFP_KERNEL); |
406 | if (!entry) { | 399 | if (!entry) { |
407 | kfree_skb(skb); | 400 | ret = -ENOMEM; |
408 | break; | 401 | goto err; |
409 | } | 402 | } |
410 | usb_fill_bulk_urb(entry, priv->udev, | 403 | usb_fill_bulk_urb(entry, priv->udev, |
411 | usb_rcvbulkpipe(priv->udev, | 404 | usb_rcvbulkpipe(priv->udev, |
@@ -416,10 +409,22 @@ static int rtl8187_init_urbs(struct ieee80211_hw *dev) | |||
416 | info->urb = entry; | 409 | info->urb = entry; |
417 | info->dev = dev; | 410 | info->dev = dev; |
418 | skb_queue_tail(&priv->rx_queue, skb); | 411 | skb_queue_tail(&priv->rx_queue, skb); |
419 | usb_submit_urb(entry, GFP_KERNEL); | 412 | usb_anchor_urb(entry, &priv->anchored); |
413 | ret = usb_submit_urb(entry, GFP_KERNEL); | ||
414 | if (ret) { | ||
415 | skb_unlink(skb, &priv->rx_queue); | ||
416 | usb_unanchor_urb(entry); | ||
417 | goto err; | ||
418 | } | ||
419 | usb_free_urb(entry); | ||
420 | } | 420 | } |
421 | return ret; | ||
421 | 422 | ||
422 | return 0; | 423 | err: |
424 | usb_free_urb(entry); | ||
425 | kfree_skb(skb); | ||
426 | usb_kill_anchored_urbs(&priv->anchored); | ||
427 | return ret; | ||
423 | } | 428 | } |
424 | 429 | ||
425 | static void rtl8187b_status_cb(struct urb *urb) | 430 | static void rtl8187b_status_cb(struct urb *urb) |
@@ -429,10 +434,8 @@ static void rtl8187b_status_cb(struct urb *urb) | |||
429 | u64 val; | 434 | u64 val; |
430 | unsigned int cmd_type; | 435 | unsigned int cmd_type; |
431 | 436 | ||
432 | if (unlikely(urb->status)) { | 437 | if (unlikely(urb->status)) |
433 | usb_free_urb(urb); | ||
434 | return; | 438 | return; |
435 | } | ||
436 | 439 | ||
437 | /* | 440 | /* |
438 | * Read from status buffer: | 441 | * Read from status buffer: |
@@ -503,26 +506,32 @@ static void rtl8187b_status_cb(struct urb *urb) | |||
503 | spin_unlock_irqrestore(&priv->b_tx_status.queue.lock, flags); | 506 | spin_unlock_irqrestore(&priv->b_tx_status.queue.lock, flags); |
504 | } | 507 | } |
505 | 508 | ||
506 | usb_submit_urb(urb, GFP_ATOMIC); | 509 | usb_anchor_urb(urb, &priv->anchored); |
510 | if (usb_submit_urb(urb, GFP_ATOMIC)) | ||
511 | usb_unanchor_urb(urb); | ||
507 | } | 512 | } |
508 | 513 | ||
509 | static int rtl8187b_init_status_urb(struct ieee80211_hw *dev) | 514 | static int rtl8187b_init_status_urb(struct ieee80211_hw *dev) |
510 | { | 515 | { |
511 | struct rtl8187_priv *priv = dev->priv; | 516 | struct rtl8187_priv *priv = dev->priv; |
512 | struct urb *entry; | 517 | struct urb *entry; |
518 | int ret = 0; | ||
513 | 519 | ||
514 | entry = usb_alloc_urb(0, GFP_KERNEL); | 520 | entry = usb_alloc_urb(0, GFP_KERNEL); |
515 | if (!entry) | 521 | if (!entry) |
516 | return -ENOMEM; | 522 | return -ENOMEM; |
517 | priv->b_tx_status.urb = entry; | ||
518 | 523 | ||
519 | usb_fill_bulk_urb(entry, priv->udev, usb_rcvbulkpipe(priv->udev, 9), | 524 | usb_fill_bulk_urb(entry, priv->udev, usb_rcvbulkpipe(priv->udev, 9), |
520 | &priv->b_tx_status.buf, sizeof(priv->b_tx_status.buf), | 525 | &priv->b_tx_status.buf, sizeof(priv->b_tx_status.buf), |
521 | rtl8187b_status_cb, dev); | 526 | rtl8187b_status_cb, dev); |
522 | 527 | ||
523 | usb_submit_urb(entry, GFP_KERNEL); | 528 | usb_anchor_urb(entry, &priv->anchored); |
529 | ret = usb_submit_urb(entry, GFP_KERNEL); | ||
530 | if (ret) | ||
531 | usb_unanchor_urb(entry); | ||
532 | usb_free_urb(entry); | ||
524 | 533 | ||
525 | return 0; | 534 | return ret; |
526 | } | 535 | } |
527 | 536 | ||
528 | static int rtl8187_cmd_reset(struct ieee80211_hw *dev) | 537 | static int rtl8187_cmd_reset(struct ieee80211_hw *dev) |
@@ -856,6 +865,9 @@ static int rtl8187_start(struct ieee80211_hw *dev) | |||
856 | return ret; | 865 | return ret; |
857 | 866 | ||
858 | mutex_lock(&priv->conf_mutex); | 867 | mutex_lock(&priv->conf_mutex); |
868 | |||
869 | init_usb_anchor(&priv->anchored); | ||
870 | |||
859 | if (priv->is_rtl8187b) { | 871 | if (priv->is_rtl8187b) { |
860 | reg = RTL818X_RX_CONF_MGMT | | 872 | reg = RTL818X_RX_CONF_MGMT | |
861 | RTL818X_RX_CONF_DATA | | 873 | RTL818X_RX_CONF_DATA | |
@@ -951,12 +963,12 @@ static void rtl8187_stop(struct ieee80211_hw *dev) | |||
951 | 963 | ||
952 | while ((skb = skb_dequeue(&priv->rx_queue))) { | 964 | while ((skb = skb_dequeue(&priv->rx_queue))) { |
953 | info = (struct rtl8187_rx_info *)skb->cb; | 965 | info = (struct rtl8187_rx_info *)skb->cb; |
954 | usb_kill_urb(info->urb); | ||
955 | kfree_skb(skb); | 966 | kfree_skb(skb); |
956 | } | 967 | } |
957 | while ((skb = skb_dequeue(&priv->b_tx_status.queue))) | 968 | while ((skb = skb_dequeue(&priv->b_tx_status.queue))) |
958 | dev_kfree_skb_any(skb); | 969 | dev_kfree_skb_any(skb); |
959 | usb_kill_urb(priv->b_tx_status.urb); | 970 | |
971 | usb_kill_anchored_urbs(&priv->anchored); | ||
960 | mutex_unlock(&priv->conf_mutex); | 972 | mutex_unlock(&priv->conf_mutex); |
961 | } | 973 | } |
962 | 974 | ||
@@ -1293,6 +1305,7 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
1293 | 1305 | ||
1294 | priv->mode = NL80211_IFTYPE_MONITOR; | 1306 | priv->mode = NL80211_IFTYPE_MONITOR; |
1295 | dev->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | | 1307 | dev->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | |
1308 | IEEE80211_HW_SIGNAL_DBM | | ||
1296 | IEEE80211_HW_RX_INCLUDES_FCS; | 1309 | IEEE80211_HW_RX_INCLUDES_FCS; |
1297 | 1310 | ||
1298 | eeprom.data = dev; | 1311 | eeprom.data = dev; |
@@ -1408,13 +1421,8 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
1408 | (*channel++).hw_value = txpwr >> 8; | 1421 | (*channel++).hw_value = txpwr >> 8; |
1409 | } | 1422 | } |
1410 | 1423 | ||
1411 | if (priv->is_rtl8187b) { | 1424 | if (priv->is_rtl8187b) |
1412 | printk(KERN_WARNING "rtl8187: 8187B chip detected.\n"); | 1425 | printk(KERN_WARNING "rtl8187: 8187B chip detected.\n"); |
1413 | dev->flags |= IEEE80211_HW_SIGNAL_DBM; | ||
1414 | } else { | ||
1415 | dev->flags |= IEEE80211_HW_SIGNAL_UNSPEC; | ||
1416 | dev->max_signal = 65; | ||
1417 | } | ||
1418 | 1426 | ||
1419 | /* | 1427 | /* |
1420 | * XXX: Once this driver supports anything that requires | 1428 | * XXX: Once this driver supports anything that requires |
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index a6ec928186ad..c4e6ca1a6306 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
@@ -836,7 +836,7 @@ struct ieee80211_ht_info { | |||
836 | /* Authentication algorithms */ | 836 | /* Authentication algorithms */ |
837 | #define WLAN_AUTH_OPEN 0 | 837 | #define WLAN_AUTH_OPEN 0 |
838 | #define WLAN_AUTH_SHARED_KEY 1 | 838 | #define WLAN_AUTH_SHARED_KEY 1 |
839 | #define WLAN_AUTH_LEAP 2 | 839 | #define WLAN_AUTH_LEAP 128 |
840 | 840 | ||
841 | #define WLAN_AUTH_CHALLENGE_LEN 128 | 841 | #define WLAN_AUTH_CHALLENGE_LEN 128 |
842 | 842 | ||
diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h index f376a93927f7..164332cbb77c 100644 --- a/include/linux/rfkill.h +++ b/include/linux/rfkill.h | |||
@@ -149,11 +149,4 @@ static inline char *rfkill_get_led_name(struct rfkill *rfkill) | |||
149 | #endif | 149 | #endif |
150 | } | 150 | } |
151 | 151 | ||
152 | /* rfkill notification chain */ | ||
153 | #define RFKILL_STATE_CHANGED 0x0001 /* state of a normal rfkill | ||
154 | switch has changed */ | ||
155 | |||
156 | int register_rfkill_notifier(struct notifier_block *nb); | ||
157 | int unregister_rfkill_notifier(struct notifier_block *nb); | ||
158 | |||
159 | #endif /* RFKILL_H */ | 152 | #endif /* RFKILL_H */ |
diff --git a/include/net/ieee80211.h b/include/net/ieee80211.h index 7ab3ed2bbccb..adb7cf31f781 100644 --- a/include/net/ieee80211.h +++ b/include/net/ieee80211.h | |||
@@ -385,9 +385,8 @@ struct ieee80211_device; | |||
385 | #define SCM_TEMPORAL_KEY_LENGTH 16 | 385 | #define SCM_TEMPORAL_KEY_LENGTH 16 |
386 | 386 | ||
387 | struct ieee80211_security { | 387 | struct ieee80211_security { |
388 | u16 active_key:2, | 388 | u16 active_key:2, enabled:1, unicast_uses_group:1, encrypt:1; |
389 | enabled:1, | 389 | u8 auth_mode; |
390 | auth_mode:2, auth_algo:4, unicast_uses_group:1, encrypt:1; | ||
391 | u8 encode_alg[WEP_KEYS]; | 390 | u8 encode_alg[WEP_KEYS]; |
392 | u8 key_sizes[WEP_KEYS]; | 391 | u8 key_sizes[WEP_KEYS]; |
393 | u8 keys[WEP_KEYS][SCM_KEY_LEN]; | 392 | u8 keys[WEP_KEYS][SCM_KEY_LEN]; |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index e84c922a1b16..046ce692a906 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -773,25 +773,16 @@ struct ieee80211_sta { | |||
773 | * enum sta_notify_cmd - sta notify command | 773 | * enum sta_notify_cmd - sta notify command |
774 | * | 774 | * |
775 | * Used with the sta_notify() callback in &struct ieee80211_ops, this | 775 | * Used with the sta_notify() callback in &struct ieee80211_ops, this |
776 | * indicates addition and removal of a station to station table. | 776 | * indicates addition and removal of a station to station table, |
777 | * or if a associated station made a power state transition. | ||
777 | * | 778 | * |
778 | * @STA_NOTIFY_ADD: a station was added to the station table | 779 | * @STA_NOTIFY_ADD: a station was added to the station table |
779 | * @STA_NOTIFY_REMOVE: a station being removed from the station table | 780 | * @STA_NOTIFY_REMOVE: a station being removed from the station table |
780 | */ | ||
781 | enum sta_notify_cmd { | ||
782 | STA_NOTIFY_ADD, STA_NOTIFY_REMOVE | ||
783 | }; | ||
784 | |||
785 | /** | ||
786 | * enum sta_notify_ps_cmd - sta power save notify command | ||
787 | * | ||
788 | * Used with the sta_notify_ps() callback in &struct ieee80211_ops to | ||
789 | * notify the driver if a station made a power state transition. | ||
790 | * | ||
791 | * @STA_NOTIFY_SLEEP: a station is now sleeping | 781 | * @STA_NOTIFY_SLEEP: a station is now sleeping |
792 | * @STA_NOTIFY_AWAKE: a sleeping station woke up | 782 | * @STA_NOTIFY_AWAKE: a sleeping station woke up |
793 | */ | 783 | */ |
794 | enum sta_notify_ps_cmd { | 784 | enum sta_notify_cmd { |
785 | STA_NOTIFY_ADD, STA_NOTIFY_REMOVE, | ||
795 | STA_NOTIFY_SLEEP, STA_NOTIFY_AWAKE, | 786 | STA_NOTIFY_SLEEP, STA_NOTIFY_AWAKE, |
796 | }; | 787 | }; |
797 | 788 | ||
@@ -1258,15 +1249,9 @@ enum ieee80211_ampdu_mlme_action { | |||
1258 | * | 1249 | * |
1259 | * @set_rts_threshold: Configuration of RTS threshold (if device needs it) | 1250 | * @set_rts_threshold: Configuration of RTS threshold (if device needs it) |
1260 | * | 1251 | * |
1261 | * @set_frag_threshold: Configuration of fragmentation threshold. Assign this if | 1252 | * @sta_notify: Notifies low level driver about addition, removal or power |
1262 | * the device does fragmentation by itself; if this method is assigned then | 1253 | * state transition of an associated station, AP, IBSS/WDS/mesh peer etc. |
1263 | * the stack will not do fragmentation. | 1254 | * Must be atomic. |
1264 | * | ||
1265 | * @sta_notify: Notifies low level driver about addition or removal | ||
1266 | * of associated station or AP. | ||
1267 | * | ||
1268 | * @sta_ps_notify: Notifies low level driver about the power state transition | ||
1269 | * of a associated station. Must be atomic. | ||
1270 | * | 1255 | * |
1271 | * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max), | 1256 | * @conf_tx: Configure TX queue parameters (EDCF (aifs, cw_min, cw_max), |
1272 | * bursting) for a hardware TX queue. | 1257 | * bursting) for a hardware TX queue. |
@@ -1331,11 +1316,8 @@ struct ieee80211_ops { | |||
1331 | void (*get_tkip_seq)(struct ieee80211_hw *hw, u8 hw_key_idx, | 1316 | void (*get_tkip_seq)(struct ieee80211_hw *hw, u8 hw_key_idx, |
1332 | u32 *iv32, u16 *iv16); | 1317 | u32 *iv32, u16 *iv16); |
1333 | int (*set_rts_threshold)(struct ieee80211_hw *hw, u32 value); | 1318 | int (*set_rts_threshold)(struct ieee80211_hw *hw, u32 value); |
1334 | int (*set_frag_threshold)(struct ieee80211_hw *hw, u32 value); | ||
1335 | void (*sta_notify)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 1319 | void (*sta_notify)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
1336 | enum sta_notify_cmd, struct ieee80211_sta *sta); | 1320 | enum sta_notify_cmd, struct ieee80211_sta *sta); |
1337 | void (*sta_notify_ps)(struct ieee80211_hw *hw, | ||
1338 | enum sta_notify_ps_cmd, struct ieee80211_sta *sta); | ||
1339 | int (*conf_tx)(struct ieee80211_hw *hw, u16 queue, | 1321 | int (*conf_tx)(struct ieee80211_hw *hw, u16 queue, |
1340 | const struct ieee80211_tx_queue_params *params); | 1322 | const struct ieee80211_tx_queue_params *params); |
1341 | int (*get_tx_stats)(struct ieee80211_hw *hw, | 1323 | int (*get_tx_stats)(struct ieee80211_hw *hw, |
diff --git a/net/mac80211/Makefile b/net/mac80211/Makefile index 31cfd1f89a72..7d4971aa443f 100644 --- a/net/mac80211/Makefile +++ b/net/mac80211/Makefile | |||
@@ -46,3 +46,5 @@ rc80211_minstrel-$(CONFIG_MAC80211_DEBUGFS) += rc80211_minstrel_debugfs.o | |||
46 | 46 | ||
47 | mac80211-$(CONFIG_MAC80211_RC_PID) += $(rc80211_pid-y) | 47 | mac80211-$(CONFIG_MAC80211_RC_PID) += $(rc80211_pid-y) |
48 | mac80211-$(CONFIG_MAC80211_RC_MINSTREL) += $(rc80211_minstrel-y) | 48 | mac80211-$(CONFIG_MAC80211_RC_MINSTREL) += $(rc80211_minstrel-y) |
49 | |||
50 | ccflags-y += -D__CHECK_ENDIAN__ | ||
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 7a7a6c176dc5..7912eb14eca0 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -396,8 +396,10 @@ static int ieee80211_config_beacon(struct ieee80211_sub_if_data *sdata, | |||
396 | */ | 396 | */ |
397 | if (params->interval) { | 397 | if (params->interval) { |
398 | sdata->local->hw.conf.beacon_int = params->interval; | 398 | sdata->local->hw.conf.beacon_int = params->interval; |
399 | ieee80211_hw_config(sdata->local, | 399 | err = ieee80211_hw_config(sdata->local, |
400 | IEEE80211_CONF_CHANGE_BEACON_INTERVAL); | 400 | IEEE80211_CONF_CHANGE_BEACON_INTERVAL); |
401 | if (err < 0) | ||
402 | return err; | ||
401 | /* | 403 | /* |
402 | * We updated some parameter so if below bails out | 404 | * We updated some parameter so if below bails out |
403 | * it's not an error. | 405 | * it's not an error. |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 527205f8c1a1..6f59e11d7b33 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -187,7 +187,6 @@ struct ieee80211_rx_data { | |||
187 | struct ieee80211_rx_status *status; | 187 | struct ieee80211_rx_status *status; |
188 | struct ieee80211_rate *rate; | 188 | struct ieee80211_rate *rate; |
189 | 189 | ||
190 | u16 ethertype; | ||
191 | unsigned int flags; | 190 | unsigned int flags; |
192 | int sent_ps_buffered; | 191 | int sent_ps_buffered; |
193 | int queue; | 192 | int queue; |
@@ -864,8 +863,7 @@ int ieee80211_sta_set_bssid(struct ieee80211_sub_if_data *sdata, u8 *bssid); | |||
864 | void ieee80211_sta_req_auth(struct ieee80211_sub_if_data *sdata, | 863 | void ieee80211_sta_req_auth(struct ieee80211_sub_if_data *sdata, |
865 | struct ieee80211_if_sta *ifsta); | 864 | struct ieee80211_if_sta *ifsta); |
866 | struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, | 865 | struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, |
867 | struct sk_buff *skb, u8 *bssid, | 866 | u8 *bssid, u8 *addr, u64 supp_rates); |
868 | u8 *addr, u64 supp_rates); | ||
869 | int ieee80211_sta_deauthenticate(struct ieee80211_sub_if_data *sdata, u16 reason); | 867 | int ieee80211_sta_deauthenticate(struct ieee80211_sub_if_data *sdata, u16 reason); |
870 | int ieee80211_sta_disassociate(struct ieee80211_sub_if_data *sdata, u16 reason); | 868 | int ieee80211_sta_disassociate(struct ieee80211_sub_if_data *sdata, u16 reason); |
871 | u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata); | 869 | u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata); |
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 29c3ecf7e914..6d8710327d14 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -243,10 +243,20 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed) | |||
243 | if (changed && local->open_count) { | 243 | if (changed && local->open_count) { |
244 | ret = local->ops->config(local_to_hw(local), changed); | 244 | ret = local->ops->config(local_to_hw(local), changed); |
245 | /* | 245 | /* |
246 | * Goal: | ||
246 | * HW reconfiguration should never fail, the driver has told | 247 | * HW reconfiguration should never fail, the driver has told |
247 | * us what it can support so it should live up to that promise. | 248 | * us what it can support so it should live up to that promise. |
249 | * | ||
250 | * Current status: | ||
251 | * rfkill is not integrated with mac80211 and a | ||
252 | * configuration command can thus fail if hardware rfkill | ||
253 | * is enabled | ||
254 | * | ||
255 | * FIXME: integrate rfkill with mac80211 and then add this | ||
256 | * WARN_ON() back | ||
257 | * | ||
248 | */ | 258 | */ |
249 | WARN_ON(ret); | 259 | /* WARN_ON(ret); */ |
250 | } | 260 | } |
251 | 261 | ||
252 | return ret; | 262 | return ret; |
@@ -876,12 +886,14 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | |||
876 | 886 | ||
877 | local->mdev->select_queue = ieee80211_select_queue; | 887 | local->mdev->select_queue = ieee80211_select_queue; |
878 | 888 | ||
879 | /* add one default STA interface */ | 889 | /* add one default STA interface if supported */ |
880 | result = ieee80211_if_add(local, "wlan%d", NULL, | 890 | if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION)) { |
881 | NL80211_IFTYPE_STATION, NULL); | 891 | result = ieee80211_if_add(local, "wlan%d", NULL, |
882 | if (result) | 892 | NL80211_IFTYPE_STATION, NULL); |
883 | printk(KERN_WARNING "%s: Failed to add default virtual iface\n", | 893 | if (result) |
884 | wiphy_name(local->hw.wiphy)); | 894 | printk(KERN_WARNING "%s: Failed to add default virtual iface\n", |
895 | wiphy_name(local->hw.wiphy)); | ||
896 | } | ||
885 | 897 | ||
886 | rtnl_unlock(); | 898 | rtnl_unlock(); |
887 | 899 | ||
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 87b2ac85d911..290b0017ef2e 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -1565,8 +1565,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
1565 | (unsigned long long) sta->sta.supp_rates[band]); | 1565 | (unsigned long long) sta->sta.supp_rates[band]); |
1566 | #endif | 1566 | #endif |
1567 | } else { | 1567 | } else { |
1568 | ieee80211_ibss_add_sta(sdata, NULL, mgmt->bssid, | 1568 | ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa, supp_rates); |
1569 | mgmt->sa, supp_rates); | ||
1570 | } | 1569 | } |
1571 | 1570 | ||
1572 | rcu_read_unlock(); | 1571 | rcu_read_unlock(); |
@@ -1638,9 +1637,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
1638 | sdata->dev->name, mgmt->bssid); | 1637 | sdata->dev->name, mgmt->bssid); |
1639 | #endif | 1638 | #endif |
1640 | ieee80211_sta_join_ibss(sdata, &sdata->u.sta, bss); | 1639 | ieee80211_sta_join_ibss(sdata, &sdata->u.sta, bss); |
1641 | ieee80211_ibss_add_sta(sdata, NULL, | 1640 | ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa, supp_rates); |
1642 | mgmt->bssid, mgmt->sa, | ||
1643 | supp_rates); | ||
1644 | } | 1641 | } |
1645 | } | 1642 | } |
1646 | 1643 | ||
@@ -2373,8 +2370,7 @@ void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) | |||
2373 | * must be callable in atomic context. | 2370 | * must be callable in atomic context. |
2374 | */ | 2371 | */ |
2375 | struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, | 2372 | struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, |
2376 | struct sk_buff *skb, u8 *bssid, | 2373 | u8 *bssid,u8 *addr, u64 supp_rates) |
2377 | u8 *addr, u64 supp_rates) | ||
2378 | { | 2374 | { |
2379 | struct ieee80211_local *local = sdata->local; | 2375 | struct ieee80211_local *local = sdata->local; |
2380 | struct sta_info *sta; | 2376 | struct sta_info *sta; |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 14be095b8528..73cf126cef49 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -658,9 +658,9 @@ static void ap_sta_ps_start(struct sta_info *sta) | |||
658 | 658 | ||
659 | atomic_inc(&sdata->bss->num_sta_ps); | 659 | atomic_inc(&sdata->bss->num_sta_ps); |
660 | set_and_clear_sta_flags(sta, WLAN_STA_PS, WLAN_STA_PSPOLL); | 660 | set_and_clear_sta_flags(sta, WLAN_STA_PS, WLAN_STA_PSPOLL); |
661 | if (local->ops->sta_notify_ps) | 661 | if (local->ops->sta_notify) |
662 | local->ops->sta_notify_ps(local_to_hw(local), STA_NOTIFY_SLEEP, | 662 | local->ops->sta_notify(local_to_hw(local), &sdata->vif, |
663 | &sta->sta); | 663 | STA_NOTIFY_SLEEP, &sta->sta); |
664 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG | 664 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG |
665 | printk(KERN_DEBUG "%s: STA %pM aid %d enters power save mode\n", | 665 | printk(KERN_DEBUG "%s: STA %pM aid %d enters power save mode\n", |
666 | sdata->dev->name, sta->sta.addr, sta->sta.aid); | 666 | sdata->dev->name, sta->sta.addr, sta->sta.aid); |
@@ -677,9 +677,9 @@ static int ap_sta_ps_end(struct sta_info *sta) | |||
677 | atomic_dec(&sdata->bss->num_sta_ps); | 677 | atomic_dec(&sdata->bss->num_sta_ps); |
678 | 678 | ||
679 | clear_sta_flags(sta, WLAN_STA_PS | WLAN_STA_PSPOLL); | 679 | clear_sta_flags(sta, WLAN_STA_PS | WLAN_STA_PSPOLL); |
680 | if (local->ops->sta_notify_ps) | 680 | if (local->ops->sta_notify) |
681 | local->ops->sta_notify_ps(local_to_hw(local), STA_NOTIFY_AWAKE, | 681 | local->ops->sta_notify(local_to_hw(local), &sdata->vif, |
682 | &sta->sta); | 682 | STA_NOTIFY_AWAKE, &sta->sta); |
683 | 683 | ||
684 | if (!skb_queue_empty(&sta->ps_tx_buf)) | 684 | if (!skb_queue_empty(&sta->ps_tx_buf)) |
685 | sta_info_clear_tim_bit(sta); | 685 | sta_info_clear_tim_bit(sta); |
@@ -1850,9 +1850,8 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata, | |||
1850 | return 0; | 1850 | return 0; |
1851 | rx->flags &= ~IEEE80211_RX_RA_MATCH; | 1851 | rx->flags &= ~IEEE80211_RX_RA_MATCH; |
1852 | } else if (!rx->sta) | 1852 | } else if (!rx->sta) |
1853 | rx->sta = ieee80211_ibss_add_sta(sdata, rx->skb, | 1853 | rx->sta = ieee80211_ibss_add_sta(sdata, bssid, hdr->addr2, |
1854 | bssid, hdr->addr2, | 1854 | BIT(rx->status->rate_idx)); |
1855 | BIT(rx->status->rate_idx)); | ||
1856 | break; | 1855 | break; |
1857 | case NL80211_IFTYPE_MESH_POINT: | 1856 | case NL80211_IFTYPE_MESH_POINT: |
1858 | if (!multicast && | 1857 | if (!multicast && |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index d7761e95e4cf..b098c58d216f 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1001,7 +1001,6 @@ __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
1001 | if (tx->flags & IEEE80211_TX_FRAGMENTED) { | 1001 | if (tx->flags & IEEE80211_TX_FRAGMENTED) { |
1002 | if ((tx->flags & IEEE80211_TX_UNICAST) && | 1002 | if ((tx->flags & IEEE80211_TX_UNICAST) && |
1003 | skb->len + FCS_LEN > local->fragmentation_threshold && | 1003 | skb->len + FCS_LEN > local->fragmentation_threshold && |
1004 | !local->ops->set_frag_threshold && | ||
1005 | !(info->flags & IEEE80211_TX_CTL_AMPDU)) | 1004 | !(info->flags & IEEE80211_TX_CTL_AMPDU)) |
1006 | tx->flags |= IEEE80211_TX_FRAGMENTED; | 1005 | tx->flags |= IEEE80211_TX_FRAGMENTED; |
1007 | else | 1006 | else |
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c index 4e1fdcfacb0c..15428048d01a 100644 --- a/net/mac80211/wext.c +++ b/net/mac80211/wext.c | |||
@@ -418,8 +418,7 @@ static int ieee80211_ioctl_siwscan(struct net_device *dev, | |||
418 | 418 | ||
419 | if (sdata->vif.type != NL80211_IFTYPE_STATION && | 419 | if (sdata->vif.type != NL80211_IFTYPE_STATION && |
420 | sdata->vif.type != NL80211_IFTYPE_ADHOC && | 420 | sdata->vif.type != NL80211_IFTYPE_ADHOC && |
421 | sdata->vif.type != NL80211_IFTYPE_MESH_POINT && | 421 | sdata->vif.type != NL80211_IFTYPE_MESH_POINT) |
422 | sdata->vif.type != NL80211_IFTYPE_AP) | ||
423 | return -EOPNOTSUPP; | 422 | return -EOPNOTSUPP; |
424 | 423 | ||
425 | /* if SSID was specified explicitly then use that */ | 424 | /* if SSID was specified explicitly then use that */ |
@@ -639,14 +638,6 @@ static int ieee80211_ioctl_siwfrag(struct net_device *dev, | |||
639 | local->fragmentation_threshold = frag->value & ~0x1; | 638 | local->fragmentation_threshold = frag->value & ~0x1; |
640 | } | 639 | } |
641 | 640 | ||
642 | /* If the wlan card performs fragmentation in hardware/firmware, | ||
643 | * configure it here */ | ||
644 | |||
645 | if (local->ops->set_frag_threshold) | ||
646 | return local->ops->set_frag_threshold( | ||
647 | local_to_hw(local), | ||
648 | local->fragmentation_threshold); | ||
649 | |||
650 | return 0; | 641 | return 0; |
651 | } | 642 | } |
652 | 643 | ||
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index 051d2c9ea66b..3c94f76d5525 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c | |||
@@ -53,51 +53,6 @@ static struct rfkill_gsw_state rfkill_global_states[RFKILL_TYPE_MAX]; | |||
53 | static unsigned long rfkill_states_lockdflt[BITS_TO_LONGS(RFKILL_TYPE_MAX)]; | 53 | static unsigned long rfkill_states_lockdflt[BITS_TO_LONGS(RFKILL_TYPE_MAX)]; |
54 | static bool rfkill_epo_lock_active; | 54 | static bool rfkill_epo_lock_active; |
55 | 55 | ||
56 | static BLOCKING_NOTIFIER_HEAD(rfkill_notifier_list); | ||
57 | |||
58 | |||
59 | /** | ||
60 | * register_rfkill_notifier - Add notifier to rfkill notifier chain | ||
61 | * @nb: pointer to the new entry to add to the chain | ||
62 | * | ||
63 | * See blocking_notifier_chain_register() for return value and further | ||
64 | * observations. | ||
65 | * | ||
66 | * Adds a notifier to the rfkill notifier chain. The chain will be | ||
67 | * called with a pointer to the relevant rfkill structure as a parameter, | ||
68 | * refer to include/linux/rfkill.h for the possible events. | ||
69 | * | ||
70 | * Notifiers added to this chain are to always return NOTIFY_DONE. This | ||
71 | * chain is a blocking notifier chain: notifiers can sleep. | ||
72 | * | ||
73 | * Calls to this chain may have been done through a workqueue. One must | ||
74 | * assume unordered asynchronous behaviour, there is no way to know if | ||
75 | * actions related to the event that generated the notification have been | ||
76 | * carried out already. | ||
77 | */ | ||
78 | int register_rfkill_notifier(struct notifier_block *nb) | ||
79 | { | ||
80 | BUG_ON(!nb); | ||
81 | return blocking_notifier_chain_register(&rfkill_notifier_list, nb); | ||
82 | } | ||
83 | EXPORT_SYMBOL_GPL(register_rfkill_notifier); | ||
84 | |||
85 | /** | ||
86 | * unregister_rfkill_notifier - remove notifier from rfkill notifier chain | ||
87 | * @nb: pointer to the entry to remove from the chain | ||
88 | * | ||
89 | * See blocking_notifier_chain_unregister() for return value and further | ||
90 | * observations. | ||
91 | * | ||
92 | * Removes a notifier from the rfkill notifier chain. | ||
93 | */ | ||
94 | int unregister_rfkill_notifier(struct notifier_block *nb) | ||
95 | { | ||
96 | BUG_ON(!nb); | ||
97 | return blocking_notifier_chain_unregister(&rfkill_notifier_list, nb); | ||
98 | } | ||
99 | EXPORT_SYMBOL_GPL(unregister_rfkill_notifier); | ||
100 | |||
101 | 56 | ||
102 | static void rfkill_led_trigger(struct rfkill *rfkill, | 57 | static void rfkill_led_trigger(struct rfkill *rfkill, |
103 | enum rfkill_state state) | 58 | enum rfkill_state state) |
@@ -124,12 +79,9 @@ static void rfkill_led_trigger_activate(struct led_classdev *led) | |||
124 | } | 79 | } |
125 | #endif /* CONFIG_RFKILL_LEDS */ | 80 | #endif /* CONFIG_RFKILL_LEDS */ |
126 | 81 | ||
127 | static void notify_rfkill_state_change(struct rfkill *rfkill) | 82 | static void rfkill_uevent(struct rfkill *rfkill) |
128 | { | 83 | { |
129 | rfkill_led_trigger(rfkill, rfkill->state); | 84 | kobject_uevent(&rfkill->dev.kobj, KOBJ_CHANGE); |
130 | blocking_notifier_call_chain(&rfkill_notifier_list, | ||
131 | RFKILL_STATE_CHANGED, | ||
132 | rfkill); | ||
133 | } | 85 | } |
134 | 86 | ||
135 | static void update_rfkill_state(struct rfkill *rfkill) | 87 | static void update_rfkill_state(struct rfkill *rfkill) |
@@ -142,7 +94,7 @@ static void update_rfkill_state(struct rfkill *rfkill) | |||
142 | oldstate = rfkill->state; | 94 | oldstate = rfkill->state; |
143 | rfkill->state = newstate; | 95 | rfkill->state = newstate; |
144 | if (oldstate != newstate) | 96 | if (oldstate != newstate) |
145 | notify_rfkill_state_change(rfkill); | 97 | rfkill_uevent(rfkill); |
146 | } | 98 | } |
147 | mutex_unlock(&rfkill->mutex); | 99 | mutex_unlock(&rfkill->mutex); |
148 | } | 100 | } |
@@ -220,7 +172,7 @@ static int rfkill_toggle_radio(struct rfkill *rfkill, | |||
220 | } | 172 | } |
221 | 173 | ||
222 | if (force || rfkill->state != oldstate) | 174 | if (force || rfkill->state != oldstate) |
223 | notify_rfkill_state_change(rfkill); | 175 | rfkill_uevent(rfkill); |
224 | 176 | ||
225 | return retval; | 177 | return retval; |
226 | } | 178 | } |
@@ -405,7 +357,7 @@ int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state) | |||
405 | rfkill->state = state; | 357 | rfkill->state = state; |
406 | 358 | ||
407 | if (state != oldstate) | 359 | if (state != oldstate) |
408 | notify_rfkill_state_change(rfkill); | 360 | rfkill_uevent(rfkill); |
409 | 361 | ||
410 | mutex_unlock(&rfkill->mutex); | 362 | mutex_unlock(&rfkill->mutex); |
411 | 363 | ||
@@ -618,28 +570,6 @@ static int rfkill_resume(struct device *dev) | |||
618 | #define rfkill_resume NULL | 570 | #define rfkill_resume NULL |
619 | #endif | 571 | #endif |
620 | 572 | ||
621 | static int rfkill_blocking_uevent_notifier(struct notifier_block *nb, | ||
622 | unsigned long eventid, | ||
623 | void *data) | ||
624 | { | ||
625 | struct rfkill *rfkill = (struct rfkill *)data; | ||
626 | |||
627 | switch (eventid) { | ||
628 | case RFKILL_STATE_CHANGED: | ||
629 | kobject_uevent(&rfkill->dev.kobj, KOBJ_CHANGE); | ||
630 | break; | ||
631 | default: | ||
632 | break; | ||
633 | } | ||
634 | |||
635 | return NOTIFY_DONE; | ||
636 | } | ||
637 | |||
638 | static struct notifier_block rfkill_blocking_uevent_nb = { | ||
639 | .notifier_call = rfkill_blocking_uevent_notifier, | ||
640 | .priority = 0, | ||
641 | }; | ||
642 | |||
643 | static int rfkill_dev_uevent(struct device *dev, struct kobj_uevent_env *env) | 573 | static int rfkill_dev_uevent(struct device *dev, struct kobj_uevent_env *env) |
644 | { | 574 | { |
645 | struct rfkill *rfkill = to_rfkill(dev); | 575 | struct rfkill *rfkill = to_rfkill(dev); |
@@ -942,14 +872,11 @@ static int __init rfkill_init(void) | |||
942 | return error; | 872 | return error; |
943 | } | 873 | } |
944 | 874 | ||
945 | register_rfkill_notifier(&rfkill_blocking_uevent_nb); | ||
946 | |||
947 | return 0; | 875 | return 0; |
948 | } | 876 | } |
949 | 877 | ||
950 | static void __exit rfkill_exit(void) | 878 | static void __exit rfkill_exit(void) |
951 | { | 879 | { |
952 | unregister_rfkill_notifier(&rfkill_blocking_uevent_nb); | ||
953 | class_unregister(&rfkill_class); | 880 | class_unregister(&rfkill_class); |
954 | } | 881 | } |
955 | 882 | ||
diff --git a/net/wireless/Makefile b/net/wireless/Makefile index 9bc412c83430..938a334c8dbc 100644 --- a/net/wireless/Makefile +++ b/net/wireless/Makefile | |||
@@ -8,3 +8,5 @@ obj-$(CONFIG_LIB80211_CRYPT_TKIP) += lib80211_crypt_tkip.o | |||
8 | cfg80211-y += core.o sysfs.o radiotap.o util.o reg.o | 8 | cfg80211-y += core.o sysfs.o radiotap.o util.o reg.o |
9 | cfg80211-$(CONFIG_WIRELESS_EXT) += wext-compat.o | 9 | cfg80211-$(CONFIG_WIRELESS_EXT) += wext-compat.o |
10 | cfg80211-$(CONFIG_NL80211) += nl80211.o | 10 | cfg80211-$(CONFIG_NL80211) += nl80211.o |
11 | |||
12 | ccflags-y += -D__CHECK_ENDIAN__ | ||
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 9caee6022e3f..4335f76be71f 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -365,6 +365,7 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) | |||
365 | enum nl80211_sec_chan_offset sec_chan_offset = | 365 | enum nl80211_sec_chan_offset sec_chan_offset = |
366 | NL80211_SEC_CHAN_NO_HT; | 366 | NL80211_SEC_CHAN_NO_HT; |
367 | struct ieee80211_channel *chan; | 367 | struct ieee80211_channel *chan; |
368 | struct ieee80211_sta_ht_cap *ht_cap; | ||
368 | u32 freq, sec_freq; | 369 | u32 freq, sec_freq; |
369 | 370 | ||
370 | if (!rdev->ops->set_channel) { | 371 | if (!rdev->ops->set_channel) { |
@@ -372,26 +373,25 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) | |||
372 | goto bad_res; | 373 | goto bad_res; |
373 | } | 374 | } |
374 | 375 | ||
376 | result = -EINVAL; | ||
377 | |||
375 | if (info->attrs[NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET]) { | 378 | if (info->attrs[NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET]) { |
376 | sec_chan_offset = nla_get_u32( | 379 | sec_chan_offset = nla_get_u32(info->attrs[ |
377 | info->attrs[ | ||
378 | NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET]); | 380 | NL80211_ATTR_WIPHY_SEC_CHAN_OFFSET]); |
379 | if (sec_chan_offset != NL80211_SEC_CHAN_NO_HT && | 381 | if (sec_chan_offset != NL80211_SEC_CHAN_NO_HT && |
380 | sec_chan_offset != NL80211_SEC_CHAN_DISABLED && | 382 | sec_chan_offset != NL80211_SEC_CHAN_DISABLED && |
381 | sec_chan_offset != NL80211_SEC_CHAN_BELOW && | 383 | sec_chan_offset != NL80211_SEC_CHAN_BELOW && |
382 | sec_chan_offset != NL80211_SEC_CHAN_ABOVE) { | 384 | sec_chan_offset != NL80211_SEC_CHAN_ABOVE) |
383 | result = -EINVAL; | ||
384 | goto bad_res; | 385 | goto bad_res; |
385 | } | ||
386 | } | 386 | } |
387 | 387 | ||
388 | freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]); | 388 | freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]); |
389 | chan = ieee80211_get_channel(&rdev->wiphy, freq); | 389 | chan = ieee80211_get_channel(&rdev->wiphy, freq); |
390 | if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) { | 390 | |
391 | /* Primary channel not allowed */ | 391 | /* Primary channel not allowed */ |
392 | result = -EINVAL; | 392 | if (!chan || chan->flags & IEEE80211_CHAN_DISABLED) |
393 | goto bad_res; | 393 | goto bad_res; |
394 | } | 394 | |
395 | if (sec_chan_offset == NL80211_SEC_CHAN_BELOW) | 395 | if (sec_chan_offset == NL80211_SEC_CHAN_BELOW) |
396 | sec_freq = freq - 20; | 396 | sec_freq = freq - 20; |
397 | else if (sec_chan_offset == NL80211_SEC_CHAN_ABOVE) | 397 | else if (sec_chan_offset == NL80211_SEC_CHAN_ABOVE) |
@@ -399,14 +399,26 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) | |||
399 | else | 399 | else |
400 | sec_freq = 0; | 400 | sec_freq = 0; |
401 | 401 | ||
402 | ht_cap = &rdev->wiphy.bands[chan->band]->ht_cap; | ||
403 | |||
404 | /* no HT capabilities */ | ||
405 | if (sec_chan_offset != NL80211_SEC_CHAN_NO_HT && | ||
406 | !ht_cap->ht_supported) | ||
407 | goto bad_res; | ||
408 | |||
402 | if (sec_freq) { | 409 | if (sec_freq) { |
403 | struct ieee80211_channel *schan; | 410 | struct ieee80211_channel *schan; |
411 | |||
412 | /* no 40 MHz capabilities */ | ||
413 | if (!(ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) || | ||
414 | (ht_cap->cap & IEEE80211_HT_CAP_40MHZ_INTOLERANT)) | ||
415 | goto bad_res; | ||
416 | |||
404 | schan = ieee80211_get_channel(&rdev->wiphy, sec_freq); | 417 | schan = ieee80211_get_channel(&rdev->wiphy, sec_freq); |
405 | if (!schan || schan->flags & IEEE80211_CHAN_DISABLED) { | 418 | |
406 | /* Secondary channel not allowed */ | 419 | /* Secondary channel not allowed */ |
407 | result = -EINVAL; | 420 | if (!schan || schan->flags & IEEE80211_CHAN_DISABLED) |
408 | goto bad_res; | 421 | goto bad_res; |
409 | } | ||
410 | } | 422 | } |
411 | 423 | ||
412 | result = rdev->ops->set_channel(&rdev->wiphy, chan, | 424 | result = rdev->ops->set_channel(&rdev->wiphy, chan, |
@@ -416,7 +428,7 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) | |||
416 | } | 428 | } |
417 | 429 | ||
418 | 430 | ||
419 | bad_res: | 431 | bad_res: |
420 | cfg80211_put_dev(rdev); | 432 | cfg80211_put_dev(rdev); |
421 | return result; | 433 | return result; |
422 | } | 434 | } |