bnxt_en: Don't support offline self test when RoCE driver is loaded
authorKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Wed, 1 May 2024 00:30:52 +0000 (17:30 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 2 May 2024 14:27:20 +0000 (07:27 -0700)
Offline self test is a very disruptive operation for RoCE and requires
all active QPs to be destroyed.  With a large number of QPs, it can
take a long time to destroy all the QPs and can timeout.  Do not allow
ethtool offline self test if the RoCE driver is registered on the
device.

Reviewed-by: Selvin Thyparampil Xavier <selvin.xavier@broadcom.com>
Reviewed-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/20240501003056.100607-3-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 6de3cfcea90f95820a07f5765ec9810a59995178..8763f8a01457f64e0cec75a28b218e14de308eca 100644 (file)
@@ -4820,6 +4820,14 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,
 
        if (!bp->num_tests || !BNXT_PF(bp))
                return;
+
+       if (etest->flags & ETH_TEST_FL_OFFLINE &&
+           bnxt_ulp_registered(bp->edev)) {
+               etest->flags |= ETH_TEST_FL_FAILED;
+               netdev_warn(dev, "Offline tests cannot be run with RoCE driver loaded\n");
+               return;
+       }
+
        memset(buf, 0, sizeof(u64) * bp->num_tests);
        if (!netif_running(dev)) {
                etest->flags |= ETH_TEST_FL_FAILED;
@@ -4850,7 +4858,6 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,
        if (!offline) {
                bnxt_run_fw_tests(bp, test_mask, &test_results);
        } else {
-               bnxt_ulp_stop(bp);
                bnxt_close_nic(bp, true, false);
                bnxt_run_fw_tests(bp, test_mask, &test_results);
 
@@ -4861,7 +4868,6 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,
                if (rc) {
                        bnxt_hwrm_mac_loopback(bp, false);
                        etest->flags |= ETH_TEST_FL_FAILED;
-                       bnxt_ulp_start(bp, rc);
                        return;
                }
                if (bnxt_run_loopback(bp))
@@ -4888,7 +4894,6 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,
                bnxt_hwrm_phy_loopback(bp, false, false);
                bnxt_half_close_nic(bp);
                rc = bnxt_open_nic(bp, true, true);
-               bnxt_ulp_start(bp, rc);
        }
        if (rc || bnxt_test_irq(bp)) {
                buf[BNXT_IRQ_TEST_IDX] = 1;