#
32484645 |
| 17-Nov-2012 |
Neel Natu <neel@FreeBSD.org> |
IFC @ r243164
|
#
bb327d28 |
| 16-Nov-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
ALQ logging enhancements:
* upon setup, tell the alq code what the chip information is. * add TX/RX path logging for legacy chips. * populate the tx/rx descriptor length fields with a best-estimate.
ALQ logging enhancements:
* upon setup, tell the alq code what the chip information is. * add TX/RX path logging for legacy chips. * populate the tx/rx descriptor length fields with a best-estimate. It's overly big (96 bytes when AH_SUPPORT_AR5416 is enabled) but it'll do for now.
Whilst I'm here, add CURVNET_RESTORE() here during probe/attach as a partial solution to fixing crashes during attach when the attach fails. There are other attach failures that I have to deal with; those'll come later.
show more ...
|
#
7d3d462b |
| 13-Nov-2012 |
Neel Natu <neel@FreeBSD.org> |
IFC @ r242940
|
#
60328038 |
| 11-Nov-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Correctly fix the 'scan during STA mode' crash.
|
#
a10c6f55 |
| 11-Nov-2012 |
Neel Natu <neel@FreeBSD.org> |
IFC @ r242684
|
#
89d2e576 |
| 07-Nov-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Don't compile in my (not yet committed) ath_alq code unless ATH_DEBUG_ALQ is defined.
This will unbreak ATH_DEBUG builds.
|
#
bdbb6e5b |
| 07-Nov-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Disable my software queue TIM and PS handling for now.
ps-poll is totally broken in its current form.
This should unbreak things enough to let people use PS-POLL devices, but leave it in place for
Disable my software queue TIM and PS handling for now.
ps-poll is totally broken in its current form.
This should unbreak things enough to let people use PS-POLL devices, but leave it in place for me to finish PS-POLL handling.
show more ...
|
#
23090366 |
| 04-Nov-2012 |
Simon J. Gerraty <sjg@FreeBSD.org> |
Sync from head
|
#
5540369b |
| 03-Nov-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Add a new HAL call to extract out the HAL enterprise bits from the AR9300 HAL.
|
#
1b5c5f5a |
| 31-Oct-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
I give up - introduce a TX lock to serialise TX operations.
I've tried serialising TX using queues and such but unfortunately due to how this interacts with the locking going on elsewhere in the net
I give up - introduce a TX lock to serialise TX operations.
I've tried serialising TX using queues and such but unfortunately due to how this interacts with the locking going on elsewhere in the networking stack, the TX task gets delayed, resulting in quite a noticable throughput loss:
* baseline TCP for 2x2 11n HT40 is ~ 170mbit/sec; * TCP for TX task in the ath taskq, with the RX also going on - 80mbit/sec; * TCP for TX task in a separate, second taskq - 100mbit/sec.
So for now I'm going with the Linux wireless stack approach - lock tx early. The linux code does in the wireless stack, before the 802.11 state stuff happens and before it's punted to the driver. But TX locking needs to also occur at the driver layer as the TX completion code _also_ begins to drain the ifnet TX queue.
Whilst I'm here, add some KTR traces for the TX path.
Note:
* This really should be done at the net80211 layer (as well, at least.) But that'll have to wait for a little more thought to happen.
show more ...
|
#
548a605d |
| 28-Oct-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Begin fleshing out some software queue awareness for TIM handling with the power save queue.
* introduce some new ATH_NODE lock protected fields, tracking the net80211 psq and TIM state; * when do
Begin fleshing out some software queue awareness for TIM handling with the power save queue.
* introduce some new ATH_NODE lock protected fields, tracking the net80211 psq and TIM state; * when doing buffer transitions - ie, when sending and completing buffers - check the state of the SWQ and update the TIM appropriately. * when clearing the TIM bit, if the SWQ is not empty then delay clearing it.
This is racy, but it's no less racy than the current net80211 power save queue management code. Specifically, with multiple TX threads, it's quite plausible that parallel state updates will race and the TIM will be left in an inconsistent state. I'll address that in a follow-up commit.
show more ...
|
#
a93c5097 |
| 28-Oct-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Add a temporary (for values of "temporary") work around for hotplug support with ath(4) and VIMAGE.
Right now the VIMAGE code doesn't supply a default vnet context during:
* hotplug attach; * any d
Add a temporary (for values of "temporary") work around for hotplug support with ath(4) and VIMAGE.
Right now the VIMAGE code doesn't supply a default vnet context during:
* hotplug attach; * any device detach.
It special cases kldload/boot time probing (by setting the context to vnet0) but that doesn't occur when probing devices during a bus rescan - eg, adding a cardbus card.
These will eventually go away when the VIMAGE support extends to providing default contexts to hotplug attach/detach.
show more ...
|
#
8e739394 |
| 14-Oct-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Push the actual TX processing into the ath taskqueue, rather than having it run out of multiple concurrent contexts.
Right now the ath(4) TX processing is a bit hairy. Specifically:
* It was runnin
Push the actual TX processing into the ath taskqueue, rather than having it run out of multiple concurrent contexts.
Right now the ath(4) TX processing is a bit hairy. Specifically:
* It was running out of ath_start(), which could occur from multiple concurrent sending processes (as if_start() can be started from multiple sending threads nowdays.. sigh)
* during RX if fast frames are enabled (so not really at the moment, not until I fix this particular feature again..)
* during ath_reset() - so anything which calls that
* during ath_tx_proc*() in the ath taskqueue - ie, TX is attempted again after TX completion, as there's now hopefully some ath_bufs available.
* Then, the ic_raw_xmit() method can queue raw frames for transmission at any time, from any net80211 TX context. Ew.
This has caused packet ordering issues in the past - specifically, there's absolutely no guarantee that preemption won't occuring _during_ ath_start() by the TX completion processing, which will call ath_start() again. It's a mess - 802.11 really, really wants things to be in sequence or things go all kinds of loopy.
So:
* create a new task struct for TX'ing; * make the if_start method simply queue the task on the ath taskqueue; * make ath_start() just be called by the new TX task; * make ath_tx_kick() just schedule the ath TX task, rather than directly calling ath_start().
Now yes, this means that I've taken a step backwards in terms of concurrency - TX -and- RX now occur in the same single-task taskqueue. But there's nothing stopping me from separating out the TX / TX completion code into a separate taskqueue which runs in parallel with the RX path, if that ends up being appropriate for some platforms.
This fixes the CCMP/seqno concurrency issues that creep up when you transmit large amounts of uni-directional UDP traffic (>200MBit) on a FreeBSD STA -> AP, as now there's only one TX context no matter what's going on (TX completion->retry/software queue, userland->net80211->ath_start(), TX completion -> ath_start()); but it won't fix any concurrency issues between raw transmitted frames and non-raw transmitted frames (eg EAPOL frames on TID 16 and any other TID 16 multicast traffic that gets put on the CABQ.) That is going to require a bunch more re-architecture before it's feasible to fix.
In any case, this is a big step towards making the majority of the TX path locking irrelevant, as now almost all TX activity occurs in the taskqueue.
Phew.
show more ...
|
#
943e37a1 |
| 05-Oct-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Initialise an uninitialised variable.
|
#
0eb81626 |
| 04-Oct-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Pause and unpause the software queues for a given node based on the net80211 node power save state.
* Add an ATH_NODE_UNLOCK_ASSERT() check * Add a new node field - an_is_powersave * Pause/unpause t
Pause and unpause the software queues for a given node based on the net80211 node power save state.
* Add an ATH_NODE_UNLOCK_ASSERT() check * Add a new node field - an_is_powersave * Pause/unpause the queue based on the node state * Attempt to handle net80211 concurrency issues so the queue doesn't get paused/unpaused more than once at a time from the net80211 power save code.
Whilst here (and breaking my usual rule), set CLRDMASK when a queue is unpaused, regardless of whether the queue has some pending traffic. This means the first frame from that TID (now or later) will hvae CLRDMASK set.
Also whilst here, bump the swretrymax counters whenever the filtered frames code expires a frame. Again, breaking my rule, but this is just a statistics thing rather than a functional change.
This doesn't fix ps-poll (but it doesn't break it too much worse than it is at the present) or correcting the TID updates. That's next on the list.
Tested: * AR9220 AP (Atheros AP96 reference design) * Macbook Pro and LG Optimus 1 Android phone, both setting and clearing power save state (but not using PS-POLL.)
show more ...
|
#
03682514 |
| 24-Sep-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Migrate the ath(4) KTR logging to use an ATH_KTR() macro.
This should eventually be unified with ATH_DEBUG() so I can get both from one macro; that may take some time.
Add some new probes for TX an
Migrate the ath(4) KTR logging to use an ATH_KTR() macro.
This should eventually be unified with ATH_DEBUG() so I can get both from one macro; that may take some time.
Add some new probes for TX and TX completion.
show more ...
|
#
a71362ce |
| 09-Sep-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Remove TDMA #define entries from if_ath.c; they now exist in if_ath_tdma.h.
|
#
24bf3585 |
| 04-Sep-2012 |
Gleb Smirnoff <glebius@FreeBSD.org> |
Merge head r233826 through r240095.
|
#
fb20fd24 |
| 29-Aug-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
There's no nede to allocate a DMA map just before calling bus_dmamem_alloc().
In fact, bus_dmamem_alloc() happily NULLs the dmat pointer passed in, before replacing it with its own.
This fixes a MI
There's no nede to allocate a DMA map just before calling bus_dmamem_alloc().
In fact, bus_dmamem_alloc() happily NULLs the dmat pointer passed in, before replacing it with its own.
This fixes a MIPS crash when kldload'ing if_ath/if_ath_pci - bus_dmamap_destroy() was passed in a NULL dmat pointer and was doing all kinds of very bad things.
Reviewed by: scottl
show more ...
|
#
85bf9bc3 |
| 15-Aug-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Implement a sequential descriptor ID value and stuff it in the ath_buf.
This will be used by the EDMA TX code to assign descriptor IDs in order to provide some debugging.
|
#
bad98824 |
| 15-Aug-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Break out the TX completion code into a separate function, so it can be re-used by the upcoming EDMA TX completion code.
Make ath_stoptxdma() public, again so the EDMA TX code can use it.
Don't che
Break out the TX completion code into a separate function, so it can be re-used by the upcoming EDMA TX completion code.
Make ath_stoptxdma() public, again so the EDMA TX code can use it.
Don't check for the TXQ bitmap in the ISR when doing EDMA work as it doesn't apply for EDMA.
show more ...
|
#
1762ec94 |
| 12-Aug-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Revert the ath_tx_draintxq() method, and instead teach it the minimum necessary to "do" EDMA.
It was just using the TX completion status for logging information about the descriptor completion. Sin
Revert the ath_tx_draintxq() method, and instead teach it the minimum necessary to "do" EDMA.
It was just using the TX completion status for logging information about the descriptor completion. Since with EDMA we don't know this without checking the TX completion FIFO, we can't provide this information. So don't.
show more ...
|
#
788e6aa9 |
| 12-Aug-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Break out ath_draintxq() into a method and un-methodize ath_tx_processq().
Now that I understand what's going on with this, I've realised that it's going to be quite difficult to implement a process
Break out ath_draintxq() into a method and un-methodize ath_tx_processq().
Now that I understand what's going on with this, I've realised that it's going to be quite difficult to implement a processq method in the EDMA case. Because there's a separate TX status FIFO, I can't just run processq() on each EDMA TXQ to see what's finished. i have to actually run the TX status queue and handle individual TXQs.
So:
* unmethodize ath_tx_processq(); * leave ath_tx_draintxq() as a method, as it only uses the completion status for debugging rather than actively completing the frames (ie, all frames here are failed); * Methodize ath_draintxq().
The EDMA ath_draintxq() will have to take care of running the TX completion FIFO before (potentially) freeing frames in the queue.
The only two places where ath_tx_draintxq() (on a single TXQ) are used:
* ath_draintxq(); and * the CABQ handling in the beacon setup code - it drains the CABQ before populating the CABQ with frames for a new beacon (when doing multi-VAP operation.)
So it's quite possible that once I methodize the CABQ and beacon handling, I can just drop ath_tx_draintxq() in its entirety.
Finally, it's also quite possible that I can remove ath_tx_draintxq() in the future and just "teach" it to not check the status when doing EDMA.
show more ...
|
#
e1252ce1 |
| 12-Aug-2012 |
Adrian Chadd <adrian@FreeBSD.org> |
Extend the beacon code slightly to support AP mode beaconing for the EDMA HAL hardware.
* The EDMA HAL code assumes the nexttbtt and intval values are in TU/8 units, rather than TU. For now, just
Extend the beacon code slightly to support AP mode beaconing for the EDMA HAL hardware.
* The EDMA HAL code assumes the nexttbtt and intval values are in TU/8 units, rather than TU. For now, just "hack" around that here, at least until I code up something to translate it in the HAL. * Setup some different TXQ flags for EDMA hardware. * The EDMA HAL doesn't support setting the first rate series via ath_hal_setuptxdesc() - instead, a call to ath_hal_set11nratescenario() is always required. So for now, just do an 11n rate series setup for EDMA beacon frames.
This allows my AR9380 to successfully transmit beacon frames.
However, CABQ TX and all normal data frame TX and TX completion is still not functional and will require some more significant code churn to make work.
show more ...
|
#
e11b6fa3 |
| 03-Aug-2012 |
Gleb Smirnoff <glebius@FreeBSD.org> |
Merge head r233826 through r239010.
|