#
4136c091 |
| 04-May-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
The holding buffer logic needs to be used for _all_ transmission, not just "when the queue is busy."
After talking with the MAC team, it turns out that the linked list implementation sometimes will
The holding buffer logic needs to be used for _all_ transmission, not just "when the queue is busy."
After talking with the MAC team, it turns out that the linked list implementation sometimes will not accept a TxDP update and will instead re-read the link pointer. So even if the hardware has finished transmitting a chain and has hit EOL/VEOL, it may still re-read the link pointer to begin transmitting again.
So, always set ATH_BUF_BUSY on the last buffer in the chain (to mark the last descriptor as the holding descriptor) and never blank the axq_link pointer.
Tested:
* AR5416, STA mode
TODO:
* much more thorough testing with the pre-11n NICs, just to verify that they behave the same way. * test TDMA on the 11n and non-11n hardware.
show more ...
|
#
8d060542 |
| 29-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Debugging changes!
* That lock isn't actually held during reset - just the whole TX/RX path is paused. So, remove the assertion.
* Log the TX queue status - how many hardware frames are active i
Debugging changes!
* That lock isn't actually held during reset - just the whole TX/RX path is paused. So, remove the assertion.
* Log the TX queue status - how many hardware frames are active in the MAC and whether the queue is active.
show more ...
|
#
07187d11 |
| 27-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Conditionally compile this only if ATH_DEBUG is defined.
|
#
ed261a61 |
| 26-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Dump the entire TXQ descriptor contents during a reset, rather than only completed descriptors.
|
#
ff5b5634 |
| 19-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Initialise the chainmask fields regardless of whether 11n support is compiled in or not.
This fixes issues with people running -HEAD but who build modules without doing a "make buildkernel KERNCONF=
Initialise the chainmask fields regardless of whether 11n support is compiled in or not.
This fixes issues with people running -HEAD but who build modules without doing a "make buildkernel KERNCONF=XXX", thus picking up opt_*.h. The resulting module wouldn't have 11n enabled and the chainmask configuration would just be plain wrong.
show more ...
|
#
7904f516 |
| 19-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Add a debug statement to log the currently chosen chainmask configuration.
|
#
b0bf95ff |
| 19-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
.. don't know how this snuck into this commit. Sorry.
Fix compile build before anyone notices.
|
#
b661bd2e |
| 19-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Print out the chainmask configuration.
|
#
6f4fb2d8 |
| 19-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Use uint32_t for fields that are fetched via ath_hal_getcapability().
|
#
5d4dedad |
| 16-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Use a per-RX-queue deferred list, rather than a single deferred list for both queues.
Since ath_rx_pkt() does multi-mbuf frame recombining based on the RX queue, this needs to occur.
Tested:
* AR9
Use a per-RX-queue deferred list, rather than a single deferred list for both queues.
Since ath_rx_pkt() does multi-mbuf frame recombining based on the RX queue, this needs to occur.
Tested:
* AR9380 (XB112), hostap mode
show more ...
|
#
69e6d7b7 |
| 12-Apr-2013 |
Simon J. Gerraty <sjg@FreeBSD.org> |
sync from head
|
#
6961e9ed |
| 12-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Always enable TXOK interrupts when setting up TX queues for EDMA NICs.
|
#
a91ab3c0 |
| 02-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Some TX dmamap cleanups.
* Don't use BUS_DMA_ALLOCNOW for descriptor DMA maps; we never use bounce buffers for the descriptors themselves.
* Add some XXX's to mark where the ath_buf has its mbuf
Some TX dmamap cleanups.
* Don't use BUS_DMA_ALLOCNOW for descriptor DMA maps; we never use bounce buffers for the descriptors themselves.
* Add some XXX's to mark where the ath_buf has its mbuf ripped from underneath it without actually cleaning up the dmamap. I haven't audited those particular code paths to see if the DMA map is guaranteed to be setup there; I'll do that later.
* Print out a warning if the descdma tidyup code is given some descriptors w/ maps to free. Ideally the owner will free the mbufs and unmap the descriptors before freeing the descriptor/ath_buf pairs, but right now that's not guaranteed to be done.
Reviewed by: scottl (BUS_DMA_ALLOCNOW tag)
show more ...
|
#
3f3a5dbd |
| 01-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Ensure that we only call the busdma unmap/flush routines once, when the buffer is being freed.
* When buffers are cloned, the original mapping isn't copied but it wasn't freeing the mapping until
Ensure that we only call the busdma unmap/flush routines once, when the buffer is being freed.
* When buffers are cloned, the original mapping isn't copied but it wasn't freeing the mapping until later. To be safe, free the mapping when the buffer is cloned.
* ath_freebuf() now no longer calls the busdma sync/unmap routines.
* ath_tx_freebuf() now calls sync/unmap.
* Call sync first, before calling unmap.
Tested:
* AR5416, STA mode
show more ...
|
#
587feafb |
| 01-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Remove an un-needed comment.
|
#
09067b6e |
| 01-Apr-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Use ATH_MAX_SCATTER rather than ATH_TXDESC.
ATH_MAX_SCATTER is used to size the ath_buf DMA segment array. We thus should use it when checking sizes of things.
|
#
3feffbd7 |
| 26-Mar-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Add per-TXQ EDMA FIFO staging queue support.
Each set of frames pushed into a FIFO is represented by a list of ath_bufs - the first ath_buf in the FIFO list is marked with ATH_BUF_FIFOPTR; the last
Add per-TXQ EDMA FIFO staging queue support.
Each set of frames pushed into a FIFO is represented by a list of ath_bufs - the first ath_buf in the FIFO list is marked with ATH_BUF_FIFOPTR; the last ath_buf in the FIFO list is marked with ATH_BUF_FIFOEND.
Multiple lists of frames are just glued together in the TAILQ as per normal - except that at the end of a FIFO list, the descriptor link pointer will be NULL and it'll be tagged with ATH_BUF_FIFOEND.
For non-EDMA chipsets this is a no-op - the ath_txq frame list (axq_q) stays the same and is treated the same.
For EDMA chipsets the frames are pushed into axq_q and then when the FIFO is to be (re) filled, frames will be moved onto the FIFO queue and then pushed into the FIFO.
So:
* Add a new queue in each hardware TXQ (ath_txq) for staging FIFO frame lists. It's a TAILQ (like the normal hardware frame queue) rather than the ath9k list-of-lists to represent FIFO entries.
* Add new ath_buf flags - ATH_TX_FIFOPTR and ATH_TX_FIFOEND.
* When allocating ath_buf entries, clear out the flag value before returning it or it'll end up having stale flags.
* When cloning ath_buf entries, only clone ATH_BUF_MGMT. Don't clone the FIFO related flags.
* Extend ath_tx_draintxq() to first drain the FIFO staging queue, _then_ drain the normal hardware queue.
Tested:
* AR9280, hostap * AR9280, STA * AR9380/AR9580 - hostap
TODO:
* Test on other chipsets, just to be thorough.
show more ...
|
#
b837332d |
| 24-Mar-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Overhaul the TXQ locking (again!) as part of some beacon/cabq timing related issues.
Moving the TX locking under one lock made things easier to progress on but it had one important side-effect - it
Overhaul the TXQ locking (again!) as part of some beacon/cabq timing related issues.
Moving the TX locking under one lock made things easier to progress on but it had one important side-effect - it increased the latency when handling CABQ setup when sending beacons.
This commit introduces a bunch of new changes and a few unrelated changs that are just easier to lump in here.
The aim is to have the CABQ locking separate from other locking. The CABQ transmit path in the beacon process thus doesn't have to grab the general TX lock, reducing lock contention/latency and making it more likely that we'll make the beacon TX timing.
The second half of this commit is the CABQ related setup changes needed for sane looking EDMA CABQ support. Right now the EDMA TX code naively assumes that only one frame (MPDU or A-MPDU) is being pushed into each FIFO slot. For the CABQ this isn't true - a whole list of frames is being pushed in - and thus CABQ handling breaks very quickly.
The aim here is to setup the CABQ list and then push _that list_ to the hardware for transmission. I can then extend the EDMA TX code to stamp that list as being "one" FIFO entry (likely by tagging the last buffer in that list as "FIFO END") so the EDMA TX completion code correctly tracks things.
Major:
* Migrate the per-TXQ add/removal locking back to per-TXQ, rather than a single lock.
* Leave the software queue side of things under the ATH_TX_LOCK lock, (continuing) to serialise things as they are.
* Add a new function which is called whenever there's a beacon miss, to print out some debugging. This is primarily designed to help me figure out if the beacon miss events are due to a noisy environment, issues with the PHY/MAC, or other.
* Move the CABQ setup/enable to occur _after_ all the VAPs have been looked at. This means that for multiple VAPS in bursted mode, the CABQ gets primed once all VAPs are checked, rather than being primed on the first VAP and then having frames appended after this.
Minor:
* Add a (disabled) twiddle to let me enable/disable cabq traffic. It's primarily there to let me easily debug what's going on with beacon and CABQ setup/traffic; there's some DMA engine hangs which I'm finally trying to trace down.
* Clear bf_next when flushing frames; it should quieten some warnings that show up when a node goes away.
Tested:
* AR9280, STA/hostap, up to 4 vaps (staggered) * AR5416, STA/hostap, up to 4 vaps (staggered)
TODO:
* (Lots) more AR9380 and later testing, as I may have missed something here. * Leverage this to fix CABQ hanling for AR9380 and later chips. * Force bursted beaconing on the chips that default to staggered beacons and ensure the CABQ stuff is all sane (eg, the MORE bits that aren't being correctly set when chaining descriptors.)
show more ...
|
#
f0db652c |
| 19-Mar-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Break out the RX completion path into "FIFO check / refill" and "complete RX frames."
The 128 entry RX FIFO is really easy to fill up and miss refilling when it's done in the ath taskq - as that get
Break out the RX completion path into "FIFO check / refill" and "complete RX frames."
The 128 entry RX FIFO is really easy to fill up and miss refilling when it's done in the ath taskq - as that gets blocked up doing RX completion, TX completion and other random things.
So the 128 entry RX FIFO now gets emptied and refilled in the ath_intr() task (and it grabs / releases locks, so now ath_intr() can't just be a FAST handler yet!) but the locks aren't held for very long. The completion part is done in the ath taskqueue context.
Details:
* Create a new completed frame list - sc->sc_rx_rxlist; * Split the EDMA RX process queue into two halves - one that processes the RX FIFO and refills it with new frames; another that completes the completed frame list; * When tearing down the driver, flush whatever is in the deferred queue as well as what's in the FIFO; * Create two new RX methods - one that processes all RX queues, one that processes the given RX queue. When MSI is implemented, we get told which RX queue the interrupt came in on so we can specifically schedule that. (And I can do that with the non-MSI path too; I'll figure that out later.) * Convert the legacy code over to use these new RX methods; * Replace all the instances of the RX taskqueue enqueue with a call to a relevant RX method to enqueue one or all RX queues.
Tested:
* AR9380, STA * AR9580, STA * AR5413, STA
show more ...
|
#
876a84e8 |
| 18-Mar-2013 |
Martin Matuska <mm@FreeBSD.org> |
MFC @248461
|
#
5f2f0e61 |
| 15-Mar-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Add locking around the new holdingbf code.
Since this is being done during buffer free, it's a crap shoot whether the TX path lock is held or not. I tried putting the ath_freebuf() code inside the
Add locking around the new holdingbf code.
Since this is being done during buffer free, it's a crap shoot whether the TX path lock is held or not. I tried putting the ath_freebuf() code inside the TX lock and I got all kinds of locking issues - it turns out that the buffer free path sometimes is called with the lock held and sometimes isn't. So I'll go and fix that soon.
Hence for now the holdingbf buffers are protected by the TXBUF lock.
show more ...
|
#
629ce218 |
| 14-Mar-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Implement "holding buffers" per TX queue rather than globally.
When working on TDMA, Sam Leffler found that the MAC DMA hardware would re-read the last TX descriptor when getting ready to transmit t
Implement "holding buffers" per TX queue rather than globally.
When working on TDMA, Sam Leffler found that the MAC DMA hardware would re-read the last TX descriptor when getting ready to transmit the next one. Thus the whole ATH_BUF_BUSY came into existance - the descriptor must be left alone (very specifically the link pointer must be maintained) until the hardware has moved onto the next frame.
He saw this in TDMA because the MAC would be frequently stopping during active transmit (ie, when it wasn't its turn to transmit.)
Fast-forward to today. It turns out that this is a problem not with a single MAC DMA instance, but with each QCU (from 0->9). They each maintain separate descriptor pointers and will re-read the last descriptor when starting to transmit the next.
So when your AP is busy transmitting from multiple TX queues, you'll (more) frequently see one QCU stopped, waiting for a higher-priority QCU to finsh transmitting, before it'll go ahead and continue. If you mess up the descriptor (ie by freeing it) then you're short of luck.
Thanks to rpaulo for sticking with me whilst I diagnosed this issue that he was quite reliably triggering in his environment.
This is a reimplementation; it doesn't have anything in common with the ath9k or the Qualcomm Atheros reference driver.
Now - it in theory doesn't apply on the EDMA chips, as long as you push one complete frame into the FIFO at a time. But the MAC can DMA from a list of frames pushed into the hardware queue (ie, you concat 'n' frames together with link pointers, and then push the head pointer into the TXQ FIFO.) Since that's likely how I'm going to implement CABQ handling in hostap mode, it's likely that I will end up teaching the EDMA TX completion code about busy buffers, just to be "sure" this doesn't creep up.
Tested - iperf ap->sta and sta->ap (with both sides running this code):
* AR5416 STA * AR9160/AR9220 hostap
To validate that it doesn't break the EDMA (FIFO) chips:
* AR9380, AR9485, AR9462 STA
Using iperf with the -S <tos byte decimal value> to set the TCP client side DSCP bits, mapping to different TIDs and thus different TX queues.
TODO:
* Make this work on the EDMA chips, if we end up pushing lists of frames to the hardware (eg how we eventually will handle cabq in hostap/ibss mode.)
show more ...
|
#
a03fbc7e |
| 09-Mar-2013 |
Martin Matuska <mm@FreeBSD.org> |
MFC @248093
|
#
9d2a962b |
| 09-Mar-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Print out the queue flags during a TX DMA shutdown.
|
#
6606ba81 |
| 27-Feb-2013 |
Adrian Chadd <adrian@FreeBSD.org> |
Add in the STBC TX/RX capability support into the HAL and driver.
The HAL already included the STBC fields; it just needed to be exposed to the driver and net80211 stack.
This should allow single-s
Add in the STBC TX/RX capability support into the HAL and driver.
The HAL already included the STBC fields; it just needed to be exposed to the driver and net80211 stack.
This should allow single-stream STBC TX and RX to be negotiated; however the driver and rate control code currently don't do anything with it.
show more ...
|