opnsense-src/sys/dev/ath
Adrian Chadd 470a7f4191 Migrate the TX path to a taskqueue for now, until a better way of
implementing parallel TX and TX/RX completion can be done without
simply abusing long-held locks.

Right now, multiple concurrent ath_start() entries can result in
frames being dequeued out of order.  Well, they're dequeued in order
fine, but if there's any preemption or race between CPUs between:

* removing the frame from the ifnet, and
* calling and runningath_tx_start(), until the frame is placed on a
  software or hardware TXQ

Then although dequeueing the frame is in-order, queueing it to the hardware
may be out of order.

This is solved in a lot of other drivers by just holding a TX lock over
a rather long period of time.  This lets them continue to direct dispatch
without races between dequeue and hardware queue.

Note to observers: if_transmit() doesn't necessarily solve this.
It removes the ifnet from the main path, but the same issue exists if
there's some intermediary queue (eg a bufring, which as an aside also
may pull in ifnet when you're using ALTQ.)

So, until I can sit down and code up a much better way of doing parallel
TX, I'm going to leave the TX path using a deferred taskqueue task.
What I will likely head towards is doing a direct dispatch to hardware
or software via if_transmit(), but it'll require some driver changes to
allow queues to be made without using the really large ath_buf / ath_desc
entries.

TODO:

* Look at how feasible it'll be to just do direct dispatch to
  ath_tx_start() from if_transmit(), avoiding doing _any_ intermediary
  serialisation into a global queue.  This may break ALTQ for example,
  so I have to be delicate.

* It's quite likely that I should break up ath_tx_start() so it
  deposits frames onto the software queues first, and then only fill
  in the 802.11 fields when it's being queued to the hardware.
  That will make the if_transmit() -> software queue path very
  quick and lightweight.

* This has some very bad behaviour when using ACPI and Cx states.
  I'll do some subsequent analysis using KTR and schedgraph and file
  a follow-up PR or two.

PR:		kern/168649
2012-06-04 22:01:12 +00:00
..
ath_dfs/null Contribute some example code which demonstrates how to initialise the 2012-02-06 20:23:21 +00:00
ath_hal Add the AR9280 workarounds for PCIe suspend/resume. 2012-05-26 01:36:25 +00:00
ath_rate Add in some debugging code to check whether the current rate table has 2012-02-26 06:04:44 +00:00
ah_osdep.c Stop using the hardware register value byte order swapping for now, 2012-04-19 03:26:21 +00:00
ah_osdep.h Add placeholder methods for WMI command access (USB, perhaps SDIO later) 2012-04-25 01:42:22 +00:00
if_ath.c Migrate the TX path to a taskqueue for now, until a better way of 2012-06-04 22:01:12 +00:00
if_ath_ahb.c Begin merging in some of my 802.11n TX aggregation driver changes. 2011-11-08 02:12:11 +00:00
if_ath_beacon.c Migrate most of the beacon handling functions out to if_ath_beacon.c. 2012-05-20 04:14:29 +00:00
if_ath_beacon.h Migrate most of the beacon handling functions out to if_ath_beacon.c. 2012-05-20 04:14:29 +00:00
if_ath_debug.c Migrate ath_debug and sc_debug from an int to a uint64_t / QUAD; 2012-05-15 23:39:37 +00:00
if_ath_debug.h Migrate ath_debug and sc_debug from an int to a uint64_t / QUAD; 2012-05-15 23:39:37 +00:00
if_ath_keycache.c Add a 'vap' to ath_keyset(). 2011-11-08 19:25:52 +00:00
if_ath_keycache.h Add a 'vap' to ath_keyset(). 2011-11-08 19:25:52 +00:00
if_ath_led.c Since the only thing with a mux is the AR5416 and later, and we're now 2011-12-26 07:48:29 +00:00
if_ath_led.h Refactor out the software LED config code into a common function, called 2011-12-26 05:46:22 +00:00
if_ath_misc.h Migrate the TX path to a taskqueue for now, until a better way of 2012-06-04 22:01:12 +00:00
if_ath_pci.c Override some default values to work around various issues in the deep, 2012-04-15 00:04:23 +00:00
if_ath_rx.c Migrate the TX path to a taskqueue for now, until a better way of 2012-06-04 22:01:12 +00:00
if_ath_rx.h Migrate the bulk of the RX routines out from if_ath.c to if_ath_rx.[ch]. 2012-05-20 02:05:10 +00:00
if_ath_sysctl.c Migrate ath_debug and sc_debug from an int to a uint64_t / QUAD; 2012-05-15 23:39:37 +00:00
if_ath_sysctl.h Break out most of the HAL related tweaks into a per-HAL instance, 2011-06-23 02:38:36 +00:00
if_ath_tdma.c Migrate the TDMA management functions out of if_ath.c into if_ath_tdma.c. 2012-05-20 02:49:42 +00:00
if_ath_tdma.h Migrate the TDMA management functions out of if_ath.c into if_ath_tdma.c. 2012-05-20 02:49:42 +00:00
if_ath_tsf.h Migrate the bulk of the RX routines out from if_ath.c to if_ath_rx.[ch]. 2012-05-20 02:05:10 +00:00
if_ath_tx.c Avoid using hard-coded numbers here. 2012-05-26 01:35:11 +00:00
if_ath_tx.h Delay sequence number allocation for A-MPDU until just before the frame 2012-03-20 04:50:25 +00:00
if_ath_tx_ht.c As I thought, this is a bad idea. When forming aggregates, the RTS/CTS 2012-04-07 05:46:00 +00:00
if_ath_tx_ht.h Introduce TX aggregation and software TX queue management 2011-11-08 22:43:13 +00:00
if_athdfs.h Change the prototype so the radar enable can fail. 2012-01-28 21:44:42 +00:00
if_athioctl.h Squirrel away SYNC interrupt debugging if it's enabled in the HAL. 2012-04-10 07:23:37 +00:00
if_athrate.h Introduce TX aggregation and software TX queue management 2011-11-08 22:43:13 +00:00
if_athvar.h Migrate the TX path to a taskqueue for now, until a better way of 2012-06-04 22:01:12 +00:00