Make Tx-done interrupt processing in iwm(4) more similar to iwlwifi.
authorstsp <stsp@openbsd.org>
Wed, 30 Jun 2021 09:42:22 +0000 (09:42 +0000)
committerstsp <stsp@openbsd.org>
Wed, 30 Jun 2021 09:42:22 +0000 (09:42 +0000)
commit0090cb9837062d43df254c97b9ce976e2aa2a0ea
treeac6e23df7fbc7a4a41eb38e1294ca40e8e5820fd
parentd1659d690c5a48436f37817b60520f74b36bcfb1
Make Tx-done interrupt processing in iwm(4) more similar to iwlwifi.

When iwm(4) takes a frame off a non-aggregation queue we used the ring index
reported by firmware to figure out which frame can be taken off the ring.
This logic was inherited from iwn(4).

We have sometimes seen an index get skipped and had a workaround in place
where we took all pending frames up to this index off the ring.

Apart from the ring index the firmware reports another value which is its
starting sequence number (SSN). An SSN is usually associated with a Tx
aggregation queue that uses block ack. On non-aggregation queues the SSN
matches the ring index most of the time and hence seems redundant at first
sight. But the values are not always the same.

We now always use the SSN as the upper bound which matches the Linux driver.

This seems to fix fatal firmware errors during Tx commands seen by jcs@
which suggests that we were sometimes taking frames off the ring too early.

The ring index is still used to feed information about a frame to the Tx
rate control algorithm but no longer determines when frames are taken off
the ring.

test and ok jcs@
sys/dev/pci/if_iwm.c