net/bnxt: detect bad opaque in Rx completion
authorSomnath Kotur <somnath.kotur@broadcom.com>
Thu, 27 May 2021 06:18:46 +0000 (11:48 +0530)
committerAjit Khaparde <ajit.khaparde@broadcom.com>
Tue, 8 Jun 2021 17:17:25 +0000 (19:17 +0200)
commit03c8f2fe111c2b4c4fddc960dc82253ac7e6c5c5
tree22d0fae9c61e91f6d4988832442d95ab534258b8
parentc4e4c18963b0c686d990e067787b9944a6330a9c
net/bnxt: detect bad opaque in Rx completion

There is a rare hardware bug that can cause a bad opaque value in the RX
or TPA start completion. When this happens, the hardware may have used the
same buffer twice for 2 Rx packets.  In addition, the driver might also
crash later using the bad opaque as an index into the ring.

The Rx opaque value is predictable and is always monotonically increasing.
The workaround is to keep track of the expected next opaque value and
compare it with the one returned by hardware during RX and TPA start
completions. If they miscompare, log it, discard the completion,
schedule a ring reset and move on to the next one.

Fixes: 0958d8b6435d ("net/bnxt: support LRO")
Cc: stable@dpdk.org
Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/bnxt_hwrm.c
drivers/net/bnxt/bnxt_hwrm.h
drivers/net/bnxt/bnxt_rxq.h
drivers/net/bnxt/bnxt_rxr.c
drivers/net/bnxt/bnxt_rxr.h