Make Tx-done interrupt processing in iwx(4) more similar to iwlwifi.
authorstsp <stsp@openbsd.org>
Wed, 30 Jun 2021 09:46:46 +0000 (09:46 +0000)
committerstsp <stsp@openbsd.org>
Wed, 30 Jun 2021 09:46:46 +0000 (09:46 +0000)
commit9b075b3f4b0d0fe1f04574592e3b2439629c3040
treeb7a78e09caff5ae35dfd1b68110abff286d448c1
parent665c80ebbe9c540ef5124aef6b9e94feefcece67
Make Tx-done interrupt processing in iwx(4) more similar to iwlwifi.

When iwx(4) takes a frame off the 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.
sys/dev/pci/if_iwx.c
sys/dev/pci/if_iwxvar.h