]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
octeontx2-af: Workaround SQM/PSE stalls by disabling sticky
authorGeetha sowjanya <gakula@marvell.com>
Tue, 27 Jan 2026 12:51:47 +0000 (18:21 +0530)
committerJakub Kicinski <kuba@kernel.org>
Fri, 30 Jan 2026 02:36:07 +0000 (18:36 -0800)
NIX SQ manager sticky mode is known to cause stalls when multiple SQs
share an SMQ and transmit concurrently. Additionally, PSE may deadlock
on transitions between sticky and non-sticky transmissions. There is
also a credit drop issue observed when certain condition clocks are
gated.

work around these hardware errata by:
- Disabling SQM sticky operation:
  - Clear TM6 (bit 15)
  - Clear TM11 (bit 14)
- Disabling sticky → non-sticky transition path that can deadlock PSE:
  - Clear TM5 (bit 23)
- Preventing credit drops by keeping the control-flow clock enabled:
  - Set TM9 (bit 21)

These changes are applied via NIX_AF_SQM_DBG_CTL_STATUS. With this
configuration the SQM/PSE maintain forward progress under load without
credit loss, at the cost of disabling sticky optimizations.

Signed-off-by: Geetha sowjanya <gakula@marvell.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260127125147.1642-1-gakula@marvell.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c

index 2f485a930edd17d15b323ea9f8fc56f8872400fa..49f7ff5eddfc8c20427b64c368fec94614f09365 100644 (file)
@@ -4938,12 +4938,18 @@ static int rvu_nix_block_init(struct rvu *rvu, struct nix_hw *nix_hw)
        /* Set chan/link to backpressure TL3 instead of TL2 */
        rvu_write64(rvu, blkaddr, NIX_AF_PSE_CHANNEL_LEVEL, 0x01);
 
-       /* Disable SQ manager's sticky mode operation (set TM6 = 0)
+       /* Disable SQ manager's sticky mode operation (set TM6 = 0, TM11 = 0)
         * This sticky mode is known to cause SQ stalls when multiple
-        * SQs are mapped to same SMQ and transmitting pkts at a time.
+        * SQs are mapped to same SMQ and transmitting pkts simultaneously.
+        * NIX PSE may deadlock when there are any sticky to non-sticky
+        * transmission. Hence disable it (TM5 = 0).
         */
        cfg = rvu_read64(rvu, blkaddr, NIX_AF_SQM_DBG_CTL_STATUS);
-       cfg &= ~BIT_ULL(15);
+       cfg &= ~(BIT_ULL(15) | BIT_ULL(14) | BIT_ULL(23));
+       /* NIX may drop credits when condition clocks are turned off.
+        * Hence enable control flow clk (set TM9 = 1).
+        */
+       cfg |= BIT_ULL(21);
        rvu_write64(rvu, blkaddr, NIX_AF_SQM_DBG_CTL_STATUS, cfg);
 
        ltdefs = rvu->kpu.lt_def;