git: wlan - if_ath driver - Make some adjustments to ath (preliminary)
dillon at crater.dragonflybsd.org
Wed Sep 8 00:33:49 PDT 2010
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date: Wed Sep 8 00:20:23 2010 -0700
wlan - if_ath driver - Make some adjustments to ath (preliminary)
These adjustments correct some chip races and appear to fix issues
related to running the wlan in AP mode with the atheros driver.
* Fix a bug in ath_txqmove(). This bug was hidden due to a queue
length check in the one place that used the routine but fix it anyway.
* Call stoptxdma() before messing with the beacon linkages rather than
afterwords (ap mode). I'm a bit unclear as to whether the previously
installed beacon should have been allowed to continue to run if no
new beacons are found. For now it isn't.
* Redo the qbusy logic. The old logic had at least 2 chipset/driver
races related to the link field. The new logic makes no assumptions
and only reactivates the txdma if the queue is clearly idle and
we are adding the first (bf) to it. Otherwise leave it to the INT_TX
code to detect where the txdma stopped and restart it at the
This bit of code needs more work as the INT_TX for tx completion may
be delayed indefinitely (we might need a callout check in there too,
I'm not sure).
* For the moment use MB_WAIT when loading or replentishing the receive ring.
There does not appear to be a proper mechanism to deal with stalls that
might be created if a mbuf fails to allocate.
What we really need here is proper rx ring mbuf replacement logic where
the filled mbuf is NOT removed if no new mbuf can be allocated to take
its place. Using MB_WAIT is a bad hack. It isn't entirely trivial
due to the DMA load and the 32 bit address space restriction.
* Add a few cpu_sfence()s when poking the (bf) link field. This probably
* Cleanup, add some debugging kprintf()s for a few unexpected conditions
Summary of changes:
sys/dev/netif/ath/ath/if_ath.c | 210 ++++++++++++--------
sys/dev/netif/ath/ath/if_ath_pci.c | 2 +-
sys/dev/netif/ath/hal/ath_hal/ar5210/ar5210_xmit.c | 1 +
sys/dev/netif/ath/hal/ath_hal/ar5211/ar5211_xmit.c | 1 +
sys/dev/netif/ath/hal/ath_hal/ar5212/ar5212_xmit.c | 2 +
5 files changed, 133 insertions(+), 83 deletions(-)
DragonFly BSD source repository
More information about the Commits