diff options
author | Sujith <Sujith.Manoharan@atheros.com> | 2008-12-07 11:14:03 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-12-12 14:02:17 -0500 |
commit | b77f483fcf0579de28873828897f53371a33a0ea (patch) | |
tree | a08d0f942d4b5d0cd8a7893753f9b7554ebc89e4 /drivers/net/wireless/ath9k/beacon.c | |
parent | 59651e89187293e88863891b821c7379391ef75c (diff) |
ath9k: Refactor struct ath_softc
Split ath_softc into smaller structures for rx, tx and beacon
handling.
Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath9k/beacon.c')
-rw-r--r-- | drivers/net/wireless/ath9k/beacon.c | 94 |
1 files changed, 47 insertions, 47 deletions
diff --git a/drivers/net/wireless/ath9k/beacon.c b/drivers/net/wireless/ath9k/beacon.c index 9e5c0c0446b6..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; |
@@ -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", |
@@ -182,9 +182,9 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id) | |||
182 | * TX frames) | 182 | * TX frames) |
183 | */ | 183 | */ |
184 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | 184 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; |
185 | sc->seq_no += 0x10; | 185 | sc->tx.seq_no += 0x10; |
186 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | 186 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); |
187 | hdr->seq_ctrl |= cpu_to_le16(sc->seq_no); | 187 | hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no); |
188 | } | 188 | } |
189 | 189 | ||
190 | bf->bf_buf_addr = bf->bf_dmacontext = | 190 | bf->bf_buf_addr = bf->bf_dmacontext = |
@@ -270,10 +270,10 @@ static void ath_beacon_start_adhoc(struct ath_softc *sc, int if_id) | |||
270 | ath_beacon_setup(sc, avp, bf); | 270 | ath_beacon_setup(sc, avp, bf); |
271 | 271 | ||
272 | /* NB: caller is known to have already stopped tx dma */ | 272 | /* NB: caller is known to have already stopped tx dma */ |
273 | ath9k_hw_puttxbuf(ah, sc->sc_bhalq, bf->bf_daddr); | 273 | ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr); |
274 | ath9k_hw_txstart(ah, sc->sc_bhalq); | 274 | ath9k_hw_txstart(ah, sc->beacon.beaconq); |
275 | DPRINTF(sc, ATH_DBG_BEACON, "TXDP%u = %llx (%p)\n", | 275 | DPRINTF(sc, ATH_DBG_BEACON, "TXDP%u = %llx (%p)\n", |
276 | sc->sc_bhalq, ito64(bf->bf_daddr), bf->bf_desc); | 276 | sc->beacon.beaconq, ito64(bf->bf_daddr), bf->bf_desc); |
277 | } | 277 | } |
278 | 278 | ||
279 | int ath_beaconq_setup(struct ath_hal *ah) | 279 | int ath_beaconq_setup(struct ath_hal *ah) |
@@ -306,7 +306,7 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id) | |||
306 | if (!avp->av_bcbuf) { | 306 | if (!avp->av_bcbuf) { |
307 | /* Allocate beacon state for hostap/ibss. We know | 307 | /* Allocate beacon state for hostap/ibss. We know |
308 | * a buffer is available. */ | 308 | * a buffer is available. */ |
309 | avp->av_bcbuf = list_first_entry(&sc->sc_bbuf, | 309 | avp->av_bcbuf = list_first_entry(&sc->beacon.bbuf, |
310 | struct ath_buf, list); | 310 | struct ath_buf, list); |
311 | list_del(&avp->av_bcbuf->list); | 311 | list_del(&avp->av_bcbuf->list); |
312 | 312 | ||
@@ -319,13 +319,13 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id) | |||
319 | */ | 319 | */ |
320 | avp->av_bslot = 0; | 320 | avp->av_bslot = 0; |
321 | for (slot = 0; slot < ATH_BCBUF; slot++) | 321 | for (slot = 0; slot < ATH_BCBUF; slot++) |
322 | if (sc->sc_bslot[slot] == ATH_IF_ID_ANY) { | 322 | if (sc->beacon.bslot[slot] == ATH_IF_ID_ANY) { |
323 | /* | 323 | /* |
324 | * XXX hack, space out slots to better | 324 | * XXX hack, space out slots to better |
325 | * deal with misses | 325 | * deal with misses |
326 | */ | 326 | */ |
327 | if (slot+1 < ATH_BCBUF && | 327 | if (slot+1 < ATH_BCBUF && |
328 | sc->sc_bslot[slot+1] == | 328 | sc->beacon.bslot[slot+1] == |
329 | ATH_IF_ID_ANY) { | 329 | ATH_IF_ID_ANY) { |
330 | avp->av_bslot = slot+1; | 330 | avp->av_bslot = slot+1; |
331 | break; | 331 | break; |
@@ -333,8 +333,8 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id) | |||
333 | avp->av_bslot = slot; | 333 | avp->av_bslot = slot; |
334 | /* NB: keep looking for a double slot */ | 334 | /* NB: keep looking for a double slot */ |
335 | } | 335 | } |
336 | 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); |
337 | sc->sc_bslot[avp->av_bslot] = if_id; | 337 | sc->beacon.bslot[avp->av_bslot] = if_id; |
338 | sc->sc_nbcnvaps++; | 338 | sc->sc_nbcnvaps++; |
339 | } | 339 | } |
340 | } | 340 | } |
@@ -362,7 +362,7 @@ int ath_beacon_alloc(struct ath_softc *sc, int if_id) | |||
362 | } | 362 | } |
363 | 363 | ||
364 | tstamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp; | 364 | tstamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp; |
365 | sc->bc_tstamp = le64_to_cpu(tstamp); | 365 | sc->beacon.bc_tstamp = le64_to_cpu(tstamp); |
366 | 366 | ||
367 | /* | 367 | /* |
368 | * Calculate a TSF adjustment factor required for | 368 | * Calculate a TSF adjustment factor required for |
@@ -422,7 +422,7 @@ void ath_beacon_return(struct ath_softc *sc, struct ath_vap *avp) | |||
422 | struct ath_buf *bf; | 422 | struct ath_buf *bf; |
423 | 423 | ||
424 | if (avp->av_bslot != -1) { | 424 | if (avp->av_bslot != -1) { |
425 | sc->sc_bslot[avp->av_bslot] = ATH_IF_ID_ANY; | 425 | sc->beacon.bslot[avp->av_bslot] = ATH_IF_ID_ANY; |
426 | sc->sc_nbcnvaps--; | 426 | sc->sc_nbcnvaps--; |
427 | } | 427 | } |
428 | 428 | ||
@@ -435,7 +435,7 @@ void ath_beacon_return(struct ath_softc *sc, struct ath_vap *avp) | |||
435 | dev_kfree_skb_any(skb); | 435 | dev_kfree_skb_any(skb); |
436 | bf->bf_mpdu = NULL; | 436 | bf->bf_mpdu = NULL; |
437 | } | 437 | } |
438 | list_add_tail(&bf->list, &sc->sc_bbuf); | 438 | list_add_tail(&bf->list, &sc->beacon.bbuf); |
439 | 439 | ||
440 | avp->av_bcbuf = NULL; | 440 | avp->av_bcbuf = NULL; |
441 | } | 441 | } |
@@ -469,18 +469,18 @@ void ath9k_beacon_tasklet(unsigned long data) | |||
469 | * | 469 | * |
470 | * FIXME: Clean up this mess !! | 470 | * FIXME: Clean up this mess !! |
471 | */ | 471 | */ |
472 | if (ath9k_hw_numtxpending(ah, sc->sc_bhalq) != 0) { | 472 | if (ath9k_hw_numtxpending(ah, sc->beacon.beaconq) != 0) { |
473 | sc->sc_bmisscount++; | 473 | sc->beacon.bmisscnt++; |
474 | /* XXX: doth needs the chanchange IE countdown decremented. | 474 | /* XXX: doth needs the chanchange IE countdown decremented. |
475 | * We should consider adding a mac80211 call to indicate | 475 | * We should consider adding a mac80211 call to indicate |
476 | * a beacon miss so appropriate action could be taken | 476 | * a beacon miss so appropriate action could be taken |
477 | * (in that layer). | 477 | * (in that layer). |
478 | */ | 478 | */ |
479 | if (sc->sc_bmisscount < BSTUCK_THRESH) { | 479 | if (sc->beacon.bmisscnt < BSTUCK_THRESH) { |
480 | if (sc->sc_flags & SC_OP_NO_RESET) { | 480 | if (sc->sc_flags & SC_OP_NO_RESET) { |
481 | DPRINTF(sc, ATH_DBG_BEACON, | 481 | DPRINTF(sc, ATH_DBG_BEACON, |
482 | "missed %u consecutive beacons\n", | 482 | "missed %u consecutive beacons\n", |
483 | sc->sc_bmisscount); | 483 | sc->beacon.bmisscnt); |
484 | if (show_cycles) { | 484 | if (show_cycles) { |
485 | /* | 485 | /* |
486 | * Display cycle counter stats from HW | 486 | * Display cycle counter stats from HW |
@@ -499,11 +499,11 @@ void ath9k_beacon_tasklet(unsigned long data) | |||
499 | } else { | 499 | } else { |
500 | DPRINTF(sc, ATH_DBG_BEACON, | 500 | DPRINTF(sc, ATH_DBG_BEACON, |
501 | "missed %u consecutive beacons\n", | 501 | "missed %u consecutive beacons\n", |
502 | sc->sc_bmisscount); | 502 | sc->beacon.bmisscnt); |
503 | } | 503 | } |
504 | } else if (sc->sc_bmisscount >= BSTUCK_THRESH) { | 504 | } else if (sc->beacon.bmisscnt >= BSTUCK_THRESH) { |
505 | if (sc->sc_flags & SC_OP_NO_RESET) { | 505 | if (sc->sc_flags & SC_OP_NO_RESET) { |
506 | if (sc->sc_bmisscount == BSTUCK_THRESH) { | 506 | if (sc->beacon.bmisscnt == BSTUCK_THRESH) { |
507 | DPRINTF(sc, ATH_DBG_BEACON, | 507 | DPRINTF(sc, ATH_DBG_BEACON, |
508 | "beacon is officially " | 508 | "beacon is officially " |
509 | "stuck\n"); | 509 | "stuck\n"); |
@@ -517,17 +517,17 @@ void ath9k_beacon_tasklet(unsigned long data) | |||
517 | return; | 517 | return; |
518 | } | 518 | } |
519 | 519 | ||
520 | if (sc->sc_bmisscount != 0) { | 520 | if (sc->beacon.bmisscnt != 0) { |
521 | if (sc->sc_flags & SC_OP_NO_RESET) { | 521 | if (sc->sc_flags & SC_OP_NO_RESET) { |
522 | DPRINTF(sc, ATH_DBG_BEACON, | 522 | DPRINTF(sc, ATH_DBG_BEACON, |
523 | "resume beacon xmit after %u misses\n", | 523 | "resume beacon xmit after %u misses\n", |
524 | sc->sc_bmisscount); | 524 | sc->beacon.bmisscnt); |
525 | } else { | 525 | } else { |
526 | DPRINTF(sc, ATH_DBG_BEACON, | 526 | DPRINTF(sc, ATH_DBG_BEACON, |
527 | "resume beacon xmit after %u misses\n", | 527 | "resume beacon xmit after %u misses\n", |
528 | sc->sc_bmisscount); | 528 | sc->beacon.bmisscnt); |
529 | } | 529 | } |
530 | sc->sc_bmisscount = 0; | 530 | sc->beacon.bmisscnt = 0; |
531 | } | 531 | } |
532 | 532 | ||
533 | /* | 533 | /* |
@@ -542,7 +542,7 @@ void ath9k_beacon_tasklet(unsigned long data) | |||
542 | tsf = ath9k_hw_gettsf64(ah); | 542 | tsf = ath9k_hw_gettsf64(ah); |
543 | tsftu = TSF_TO_TU(tsf>>32, tsf); | 543 | tsftu = TSF_TO_TU(tsf>>32, tsf); |
544 | slot = ((tsftu % intval) * ATH_BCBUF) / intval; | 544 | slot = ((tsftu % intval) * ATH_BCBUF) / intval; |
545 | if_id = sc->sc_bslot[(slot + 1) % ATH_BCBUF]; | 545 | if_id = sc->beacon.bslot[(slot + 1) % ATH_BCBUF]; |
546 | 546 | ||
547 | DPRINTF(sc, ATH_DBG_BEACON, | 547 | DPRINTF(sc, ATH_DBG_BEACON, |
548 | "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", |
@@ -574,12 +574,12 @@ void ath9k_beacon_tasklet(unsigned long data) | |||
574 | * set to ATH_BCBUF so this check is a noop. | 574 | * set to ATH_BCBUF so this check is a noop. |
575 | */ | 575 | */ |
576 | /* XXX locking */ | 576 | /* XXX locking */ |
577 | if (sc->sc_updateslot == UPDATE) { | 577 | if (sc->beacon.updateslot == UPDATE) { |
578 | sc->sc_updateslot = COMMIT; /* commit next beacon */ | 578 | sc->beacon.updateslot = COMMIT; /* commit next beacon */ |
579 | sc->sc_slotupdate = slot; | 579 | sc->beacon.slotupdate = slot; |
580 | } else if (sc->sc_updateslot == COMMIT && sc->sc_slotupdate == slot) { | 580 | } else if (sc->beacon.updateslot == COMMIT && sc->beacon.slotupdate == slot) { |
581 | ath9k_hw_setslottime(sc->sc_ah, sc->sc_slottime); | 581 | ath9k_hw_setslottime(sc->sc_ah, sc->beacon.slottime); |
582 | sc->sc_updateslot = OK; | 582 | sc->beacon.updateslot = OK; |
583 | } | 583 | } |
584 | if (bfaddr != 0) { | 584 | if (bfaddr != 0) { |
585 | /* | 585 | /* |
@@ -587,17 +587,17 @@ void ath9k_beacon_tasklet(unsigned long data) | |||
587 | * This should never fail since we check above that no frames | 587 | * This should never fail since we check above that no frames |
588 | * are still pending on the queue. | 588 | * are still pending on the queue. |
589 | */ | 589 | */ |
590 | if (!ath9k_hw_stoptxdma(ah, sc->sc_bhalq)) { | 590 | if (!ath9k_hw_stoptxdma(ah, sc->beacon.beaconq)) { |
591 | DPRINTF(sc, ATH_DBG_FATAL, | 591 | DPRINTF(sc, ATH_DBG_FATAL, |
592 | "beacon queue %u did not stop?\n", sc->sc_bhalq); | 592 | "beacon queue %u did not stop?\n", sc->beacon.beaconq); |
593 | /* NB: the HAL still stops DMA, so proceed */ | 593 | /* NB: the HAL still stops DMA, so proceed */ |
594 | } | 594 | } |
595 | 595 | ||
596 | /* NB: cabq traffic should already be queued and primed */ | 596 | /* NB: cabq traffic should already be queued and primed */ |
597 | ath9k_hw_puttxbuf(ah, sc->sc_bhalq, bfaddr); | 597 | ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bfaddr); |
598 | ath9k_hw_txstart(ah, sc->sc_bhalq); | 598 | ath9k_hw_txstart(ah, sc->beacon.beaconq); |
599 | 599 | ||
600 | sc->ast_be_xmit += bc; /* XXX per-vap? */ | 600 | sc->beacon.ast_be_xmit += bc; /* XXX per-vap? */ |
601 | } | 601 | } |
602 | } | 602 | } |
603 | 603 | ||
@@ -644,7 +644,7 @@ void ath_beacon_config(struct ath_softc *sc, int if_id) | |||
644 | conf.bmiss_timeout = ATH_DEFAULT_BMISS_LIMIT * conf.beacon_interval; | 644 | conf.bmiss_timeout = ATH_DEFAULT_BMISS_LIMIT * conf.beacon_interval; |
645 | 645 | ||
646 | /* extract tstamp from last beacon and convert to TU */ | 646 | /* extract tstamp from last beacon and convert to TU */ |
647 | 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); |
648 | 648 | ||
649 | /* XXX conditionalize multi-bss support? */ | 649 | /* XXX conditionalize multi-bss support? */ |
650 | if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) { | 650 | if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) { |
@@ -831,7 +831,7 @@ void ath_beacon_config(struct ath_softc *sc, int if_id) | |||
831 | ath_beaconq_config(sc); | 831 | ath_beaconq_config(sc); |
832 | } | 832 | } |
833 | ath9k_hw_beaconinit(ah, nexttbtt, intval); | 833 | ath9k_hw_beaconinit(ah, nexttbtt, intval); |
834 | sc->sc_bmisscount = 0; | 834 | sc->beacon.bmisscnt = 0; |
835 | ath9k_hw_set_interrupts(ah, sc->sc_imask); | 835 | ath9k_hw_set_interrupts(ah, sc->sc_imask); |
836 | /* | 836 | /* |
837 | * When using a self-linked beacon descriptor in | 837 | * When using a self-linked beacon descriptor in |