mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-05 10:04:12 +08:00
ionic: bypass firmware cmds when stuck in reset
If the driver or firmware is stuck in reset state, don't bother trying to use adminq commands. This speeds up shutdown and prevents unnecessary timeouts and error messages. This includes a bit of rework on ionic_adminq_post_wait() and ionic_adminq_post_wait_nomsg() to both use __ionic_adminq_post_wait() which can do the checks needed in both cases. Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> Reviewed-by: Brett Creeley <brett.creeley@amd.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
45b84188a0
commit
ca5fdf9a7c
@ -392,6 +392,10 @@ static void ionic_remove(struct pci_dev *pdev)
|
||||
del_timer_sync(&ionic->watchdog_timer);
|
||||
|
||||
if (ionic->lif) {
|
||||
/* prevent adminq cmds if already known as down */
|
||||
if (test_and_clear_bit(IONIC_LIF_F_FW_RESET, ionic->lif->state))
|
||||
set_bit(IONIC_LIF_F_FW_STOPPING, ionic->lif->state);
|
||||
|
||||
ionic_lif_unregister(ionic->lif);
|
||||
ionic_devlink_unregister(ionic);
|
||||
ionic_lif_deinit(ionic->lif);
|
||||
|
@ -3161,6 +3161,9 @@ static void ionic_lif_reset(struct ionic_lif *lif)
|
||||
{
|
||||
struct ionic_dev *idev = &lif->ionic->idev;
|
||||
|
||||
if (!ionic_is_fw_running(idev))
|
||||
return;
|
||||
|
||||
mutex_lock(&lif->ionic->dev_cmd_lock);
|
||||
ionic_dev_cmd_lif_reset(idev, lif->index);
|
||||
ionic_dev_cmd_wait(lif->ionic, DEVCMD_TIMEOUT);
|
||||
|
@ -388,22 +388,28 @@ int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx,
|
||||
do_msg);
|
||||
}
|
||||
|
||||
int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
|
||||
static int __ionic_adminq_post_wait(struct ionic_lif *lif,
|
||||
struct ionic_admin_ctx *ctx,
|
||||
const bool do_msg)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!ionic_is_fw_running(&lif->ionic->idev))
|
||||
return 0;
|
||||
|
||||
err = ionic_adminq_post(lif, ctx);
|
||||
|
||||
return ionic_adminq_wait(lif, ctx, err, true);
|
||||
return ionic_adminq_wait(lif, ctx, err, do_msg);
|
||||
}
|
||||
|
||||
int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
|
||||
{
|
||||
return __ionic_adminq_post_wait(lif, ctx, true);
|
||||
}
|
||||
|
||||
int ionic_adminq_post_wait_nomsg(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = ionic_adminq_post(lif, ctx);
|
||||
|
||||
return ionic_adminq_wait(lif, ctx, err, false);
|
||||
return __ionic_adminq_post_wait(lif, ctx, false);
|
||||
}
|
||||
|
||||
static void ionic_dev_cmd_clean(struct ionic *ionic)
|
||||
|
Loading…
Reference in New Issue
Block a user