Hi,
Part 1 is just a dump of my notes analysing the current TX scheme.
driver setup
============
non-QUEUE_CONTROL drivers
* have >= 4 queues
- per-AC queues [0-3]
* have < 4 queues
- all goes to queue 0
QUEUE_CONTROL drivers
* hwsim (doesn't handle CAB correctly)
- each vif: 0...3
- each cab: 0
- offchannel: 4
* TI (doesn't set HOST_BROADCAST_PS_BUFFERING)
- each vif: 4 queues (separate)
- each cab: separate queue
- offchannel: separate from all others
* iwldvm/iwlmvm (doesn't set HOST_BROADCAST_PS_BUFFERING)
- each vif: 4 queues (separate)
- each cab: separate queue
- offchannel: separate from all others (AUX)
* ath9k (uses TXQ, sets HOST_BROADCAST_PS_BUFFERING)
- each vif: 4 queues (shared based on chanctx)
- each cab: all the same (# queues - 2)
- offchannel: separate from all others
* ath10k (may use TXQ, doesn't set HOST_BROADCAST_PS_BUFFERING)
- each vif: 1 queue for all ACs
- each cab: same queue as for ACs
- offchannel: separate from all others
current TX scheme
=================
HOST_BROADCAST_PS_BUFFERING && IEEE80211_TX_CTL_SEND_AFTER_DTIM
--> queue for ieee80211_get_buffered_bc()
!AP_LINK_PS && sta sleeping
--> queue on sta->ps_tx_buf[ac] for wakeup/poll
--> send on poll with IEEE80211_TX_CTRL_PS_RESPONSE
--> send on wakeup as normal frame (with or without TXQ)
[NB: with TXQs, this is buggy due to waking old TXQ before tx_filtered]
finally
--> send directly (with or without TXQ)
if filtered TX status
--> append to tx_filtered[ac] and use that before ps_tx_buf[ac]
TXQ scheme (where used)
=======================
MONITOR || IEEE80211_TX_CTL_SEND_AFTER_DTIM || IEEE80211_TX_CTRL_PS_RESPONSE ||
non-data
--> send directly (to TX queue number as given above)
have STA
--> per-STA/TID TXQ
otherwise
--> per-VIF TXQ (for VLAN use AP instead)