]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
bnxt_en: Fix wrong return value check in bnxt_close_nic()
authorKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Fri, 8 Dec 2023 00:16:57 +0000 (16:16 -0800)
committerJakub Kicinski <kuba@kernel.org>
Sat, 9 Dec 2023 01:20:26 +0000 (17:20 -0800)
The wait_event_interruptible_timeout() function returns 0
if the timeout elapsed, -ERESTARTSYS if it was interrupted
by a signal, and the remaining jiffies otherwise if the
condition evaluated to true before the timeout elapsed.

Driver should have checked for zero return value instead of
a positive value.

MChan: Print a warning for -ERESTARTSYS.  The close operation
will proceed anyway when wait_event_interruptible_timeout()
returns for any reason.  Since we do the close no matter what,
we should not return this error code to the caller.  Change
bnxt_close_nic() to a void function and remove all error
handling from some of the callers.

Fixes: c0c050c58d84 ("bnxt_en: New Broadcom ethernet driver.")
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Reviewed-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20231208001658.14230-4-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c

index b4a5311bdeb501849bd6004a26f148a2ea5805c1..aa1f5b776b5aa531f5b25d2479e23cb0ea18cda4 100644 (file)
@@ -10732,10 +10732,8 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init,
        bnxt_free_mem(bp, irq_re_init);
 }
 
-int bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
+void bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
 {
-       int rc = 0;
-
        if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) {
                /* If we get here, it means firmware reset is in progress
                 * while we are trying to close.  We can safely proceed with
@@ -10750,15 +10748,18 @@ int bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
 
 #ifdef CONFIG_BNXT_SRIOV
        if (bp->sriov_cfg) {
+               int rc;
+
                rc = wait_event_interruptible_timeout(bp->sriov_cfg_wait,
                                                      !bp->sriov_cfg,
                                                      BNXT_SRIOV_CFG_WAIT_TMO);
-               if (rc)
-                       netdev_warn(bp->dev, "timeout waiting for SRIOV config operation to complete!\n");
+               if (!rc)
+                       netdev_warn(bp->dev, "timeout waiting for SRIOV config operation to complete, proceeding to close!\n");
+               else if (rc < 0)
+                       netdev_warn(bp->dev, "SRIOV config operation interrupted, proceeding to close!\n");
        }
 #endif
        __bnxt_close_nic(bp, irq_re_init, link_re_init);
-       return rc;
 }
 
 static int bnxt_close(struct net_device *dev)
index e702dbc3e6b131d1bf622be3ae781201a9f8e5f3..0488b046601564f2bb7ddfbbeb4313c179e306d7 100644 (file)
@@ -2375,7 +2375,7 @@ int bnxt_open_nic(struct bnxt *, bool, bool);
 int bnxt_half_open_nic(struct bnxt *bp);
 void bnxt_half_close_nic(struct bnxt *bp);
 void bnxt_reenable_sriov(struct bnxt *bp);
-int bnxt_close_nic(struct bnxt *, bool, bool);
+void bnxt_close_nic(struct bnxt *, bool, bool);
 void bnxt_get_ring_err_stats(struct bnxt *bp,
                             struct bnxt_total_ring_err_stats *stats);
 int bnxt_dbg_hwrm_rd_reg(struct bnxt *bp, u32 reg_off, u16 num_words,
index f302dac565996d11f7d6f1f35d8100fd6aad9896..89809f1b129c0e6c4a19394599003cabdb25caf5 100644 (file)
@@ -449,15 +449,8 @@ static int bnxt_dl_reload_down(struct devlink *dl, bool netns_change,
                        return -ENODEV;
                }
                bnxt_ulp_stop(bp);
-               if (netif_running(bp->dev)) {
-                       rc = bnxt_close_nic(bp, true, true);
-                       if (rc) {
-                               NL_SET_ERR_MSG_MOD(extack, "Failed to close");
-                               dev_close(bp->dev);
-                               rtnl_unlock();
-                               break;
-                       }
-               }
+               if (netif_running(bp->dev))
+                       bnxt_close_nic(bp, true, true);
                bnxt_vf_reps_free(bp);
                rc = bnxt_hwrm_func_drv_unrgtr(bp);
                if (rc) {
index f3f384773ac038ada07b65a357bc411df2ffdfe8..5f67a7f94e7d1f3a72d037b94743c5531fc105d3 100644 (file)
@@ -165,9 +165,8 @@ static int bnxt_set_coalesce(struct net_device *dev,
 reset_coalesce:
        if (test_bit(BNXT_STATE_OPEN, &bp->state)) {
                if (update_stats) {
-                       rc = bnxt_close_nic(bp, true, false);
-                       if (!rc)
-                               rc = bnxt_open_nic(bp, true, false);
+                       bnxt_close_nic(bp, true, false);
+                       rc = bnxt_open_nic(bp, true, false);
                } else {
                        rc = bnxt_hwrm_set_coal(bp);
                }
@@ -972,12 +971,7 @@ static int bnxt_set_channels(struct net_device *dev,
                         * before PF unload
                         */
                }
-               rc = bnxt_close_nic(bp, true, false);
-               if (rc) {
-                       netdev_err(bp->dev, "Set channel failure rc :%x\n",
-                                  rc);
-                       return rc;
-               }
+               bnxt_close_nic(bp, true, false);
        }
 
        if (sh) {
@@ -4042,12 +4036,7 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,
                bnxt_run_fw_tests(bp, test_mask, &test_results);
        } else {
                bnxt_ulp_stop(bp);
-               rc = bnxt_close_nic(bp, true, false);
-               if (rc) {
-                       etest->flags |= ETH_TEST_FL_FAILED;
-                       bnxt_ulp_start(bp, rc);
-                       return;
-               }
+               bnxt_close_nic(bp, true, false);
                bnxt_run_fw_tests(bp, test_mask, &test_results);
 
                buf[BNXT_MACLPBK_TEST_IDX] = 1;
index f3886710e77873a83e8b8aad3eb2f3e2ba7d465e..6e3da3362bd6177765dd5c9ebd888c2c387d7338 100644 (file)
@@ -521,9 +521,8 @@ static int bnxt_hwrm_ptp_cfg(struct bnxt *bp)
 
        if (netif_running(bp->dev)) {
                if (ptp->rx_filter == HWTSTAMP_FILTER_ALL) {
-                       rc = bnxt_close_nic(bp, false, false);
-                       if (!rc)
-                               rc = bnxt_open_nic(bp, false, false);
+                       bnxt_close_nic(bp, false, false);
+                       rc = bnxt_open_nic(bp, false, false);
                } else {
                        bnxt_ptp_cfg_tstamp_filters(bp);
                }