Transmitting frames with iwn(4)
NOTE: this is just a series of notes as iwn(4) hacking is done. It doesn't at all qualify as complete documentation.
The iwn(4) hardware has a series of transmit rings which map to access categories. (TODO: there are other rings too - beacons? management? Do some digging!)
Each transmit ring entry contains a transmit descriptor and then multiple segments containing the data payload.
In the driver, iwn_tx_data() is the main transmit path and iwn_tx_data_raw() is for the raw data (management, etc) transmit path.
(TODO: talk about how this is done with PLCP and how antenna selection also goes into this.)
(.. and CCK/HT flags.)
Link Quality / Multi-rate retry
The firmware supports trying multiple transmit attempts. iwn_set_link_quality() configures the rates in the transmit table. There are 16 slots to fill. There's one table per associated station. Upon association and rate control negotiation, iwn_set_link_quality() populate the transmit table from highest available transmit rate to lowest available rate - if there's less than 16 rates available, the final slots just contain the lowest transmit rate.
Then during iwn_tx_data() and iwn_tx_data_raw(), the TX descriptor can have a linkq value that points to a particular slot in the table to start transmitting from. Each attempt will occur from the linkq value all the way to 0 (ie, counting backwards.) That way it tries successive values until it hits the lowest rate. It tells the firmware to do this by setting the IWN_TX_LINKQ flag in the TX descriptor flag value.
Now, this means that the TX descriptor rate field needs to exist in the link quality rate table and it likely should match the linkq value given.
So for now this is disabled in iwn(4), at least until the link quality table use can be refactored out and better planned.