bnxt_en: Fix wrong return value check in bnxt_close_nic()
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: c0c050c58d
("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>
This commit is contained in:
parent
aded5d1feb
commit
bd6781c18c
5 changed files with 16 additions and 34 deletions
|
@ -10732,10 +10732,8 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init,
|
||||||
bnxt_free_mem(bp, 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 (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) {
|
||||||
/* If we get here, it means firmware reset is in progress
|
/* If we get here, it means firmware reset is in progress
|
||||||
* while we are trying to close. We can safely proceed with
|
* 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
|
#ifdef CONFIG_BNXT_SRIOV
|
||||||
if (bp->sriov_cfg) {
|
if (bp->sriov_cfg) {
|
||||||
|
int rc;
|
||||||
|
|
||||||
rc = wait_event_interruptible_timeout(bp->sriov_cfg_wait,
|
rc = wait_event_interruptible_timeout(bp->sriov_cfg_wait,
|
||||||
!bp->sriov_cfg,
|
!bp->sriov_cfg,
|
||||||
BNXT_SRIOV_CFG_WAIT_TMO);
|
BNXT_SRIOV_CFG_WAIT_TMO);
|
||||||
if (rc)
|
if (!rc)
|
||||||
netdev_warn(bp->dev, "timeout waiting for SRIOV config operation to complete!\n");
|
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
|
#endif
|
||||||
__bnxt_close_nic(bp, irq_re_init, link_re_init);
|
__bnxt_close_nic(bp, irq_re_init, link_re_init);
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bnxt_close(struct net_device *dev)
|
static int bnxt_close(struct net_device *dev)
|
||||||
|
|
|
@ -2375,7 +2375,7 @@ int bnxt_open_nic(struct bnxt *, bool, bool);
|
||||||
int bnxt_half_open_nic(struct bnxt *bp);
|
int bnxt_half_open_nic(struct bnxt *bp);
|
||||||
void bnxt_half_close_nic(struct bnxt *bp);
|
void bnxt_half_close_nic(struct bnxt *bp);
|
||||||
void bnxt_reenable_sriov(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,
|
void bnxt_get_ring_err_stats(struct bnxt *bp,
|
||||||
struct bnxt_total_ring_err_stats *stats);
|
struct bnxt_total_ring_err_stats *stats);
|
||||||
int bnxt_dbg_hwrm_rd_reg(struct bnxt *bp, u32 reg_off, u16 num_words,
|
int bnxt_dbg_hwrm_rd_reg(struct bnxt *bp, u32 reg_off, u16 num_words,
|
||||||
|
|
|
@ -449,15 +449,8 @@ static int bnxt_dl_reload_down(struct devlink *dl, bool netns_change,
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
bnxt_ulp_stop(bp);
|
bnxt_ulp_stop(bp);
|
||||||
if (netif_running(bp->dev)) {
|
if (netif_running(bp->dev))
|
||||||
rc = bnxt_close_nic(bp, true, true);
|
bnxt_close_nic(bp, true, true);
|
||||||
if (rc) {
|
|
||||||
NL_SET_ERR_MSG_MOD(extack, "Failed to close");
|
|
||||||
dev_close(bp->dev);
|
|
||||||
rtnl_unlock();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bnxt_vf_reps_free(bp);
|
bnxt_vf_reps_free(bp);
|
||||||
rc = bnxt_hwrm_func_drv_unrgtr(bp);
|
rc = bnxt_hwrm_func_drv_unrgtr(bp);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
|
|
|
@ -165,8 +165,7 @@ static int bnxt_set_coalesce(struct net_device *dev,
|
||||||
reset_coalesce:
|
reset_coalesce:
|
||||||
if (test_bit(BNXT_STATE_OPEN, &bp->state)) {
|
if (test_bit(BNXT_STATE_OPEN, &bp->state)) {
|
||||||
if (update_stats) {
|
if (update_stats) {
|
||||||
rc = bnxt_close_nic(bp, true, false);
|
bnxt_close_nic(bp, true, false);
|
||||||
if (!rc)
|
|
||||||
rc = bnxt_open_nic(bp, true, false);
|
rc = bnxt_open_nic(bp, true, false);
|
||||||
} else {
|
} else {
|
||||||
rc = bnxt_hwrm_set_coal(bp);
|
rc = bnxt_hwrm_set_coal(bp);
|
||||||
|
@ -972,12 +971,7 @@ static int bnxt_set_channels(struct net_device *dev,
|
||||||
* before PF unload
|
* before PF unload
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
rc = bnxt_close_nic(bp, true, false);
|
bnxt_close_nic(bp, true, false);
|
||||||
if (rc) {
|
|
||||||
netdev_err(bp->dev, "Set channel failure rc :%x\n",
|
|
||||||
rc);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sh) {
|
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);
|
bnxt_run_fw_tests(bp, test_mask, &test_results);
|
||||||
} else {
|
} else {
|
||||||
bnxt_ulp_stop(bp);
|
bnxt_ulp_stop(bp);
|
||||||
rc = bnxt_close_nic(bp, true, false);
|
bnxt_close_nic(bp, true, false);
|
||||||
if (rc) {
|
|
||||||
etest->flags |= ETH_TEST_FL_FAILED;
|
|
||||||
bnxt_ulp_start(bp, rc);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
bnxt_run_fw_tests(bp, test_mask, &test_results);
|
bnxt_run_fw_tests(bp, test_mask, &test_results);
|
||||||
|
|
||||||
buf[BNXT_MACLPBK_TEST_IDX] = 1;
|
buf[BNXT_MACLPBK_TEST_IDX] = 1;
|
||||||
|
|
|
@ -521,8 +521,7 @@ static int bnxt_hwrm_ptp_cfg(struct bnxt *bp)
|
||||||
|
|
||||||
if (netif_running(bp->dev)) {
|
if (netif_running(bp->dev)) {
|
||||||
if (ptp->rx_filter == HWTSTAMP_FILTER_ALL) {
|
if (ptp->rx_filter == HWTSTAMP_FILTER_ALL) {
|
||||||
rc = bnxt_close_nic(bp, false, false);
|
bnxt_close_nic(bp, false, false);
|
||||||
if (!rc)
|
|
||||||
rc = bnxt_open_nic(bp, false, false);
|
rc = bnxt_open_nic(bp, false, false);
|
||||||
} else {
|
} else {
|
||||||
bnxt_ptp_cfg_tstamp_filters(bp);
|
bnxt_ptp_cfg_tstamp_filters(bp);
|
||||||
|
|
Loading…
Add table
Reference in a new issue