ionic: bypass firmware cmds when stuck in reset
[ Upstream commit ca5fdf9a7c5b65968c718f2be159cda4c13556a1 ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
434fcaf372
commit
238ec612a2
3 changed files with 20 additions and 7 deletions
|
|
@ -380,6 +380,10 @@ static void ionic_remove(struct pci_dev *pdev)
|
||||||
del_timer_sync(&ionic->watchdog_timer);
|
del_timer_sync(&ionic->watchdog_timer);
|
||||||
|
|
||||||
if (ionic->lif) {
|
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_lif_unregister(ionic->lif);
|
||||||
ionic_devlink_unregister(ionic);
|
ionic_devlink_unregister(ionic);
|
||||||
ionic_lif_deinit(ionic->lif);
|
ionic_lif_deinit(ionic->lif);
|
||||||
|
|
|
||||||
|
|
@ -3008,6 +3008,9 @@ static void ionic_lif_reset(struct ionic_lif *lif)
|
||||||
{
|
{
|
||||||
struct ionic_dev *idev = &lif->ionic->idev;
|
struct ionic_dev *idev = &lif->ionic->idev;
|
||||||
|
|
||||||
|
if (!ionic_is_fw_running(idev))
|
||||||
|
return;
|
||||||
|
|
||||||
mutex_lock(&lif->ionic->dev_cmd_lock);
|
mutex_lock(&lif->ionic->dev_cmd_lock);
|
||||||
ionic_dev_cmd_lif_reset(idev, lif->index);
|
ionic_dev_cmd_lif_reset(idev, lif->index);
|
||||||
ionic_dev_cmd_wait(lif->ionic, DEVCMD_TIMEOUT);
|
ionic_dev_cmd_wait(lif->ionic, DEVCMD_TIMEOUT);
|
||||||
|
|
|
||||||
|
|
@ -410,22 +410,28 @@ int ionic_adminq_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx,
|
||||||
do_msg);
|
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;
|
int err;
|
||||||
|
|
||||||
|
if (!ionic_is_fw_running(&lif->ionic->idev))
|
||||||
|
return 0;
|
||||||
|
|
||||||
err = ionic_adminq_post(lif, ctx);
|
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 ionic_adminq_post_wait_nomsg(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
|
||||||
{
|
{
|
||||||
int err;
|
return __ionic_adminq_post_wait(lif, ctx, false);
|
||||||
|
|
||||||
err = ionic_adminq_post(lif, ctx);
|
|
||||||
|
|
||||||
return ionic_adminq_wait(lif, ctx, err, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ionic_dev_cmd_clean(struct ionic *ionic)
|
static void ionic_dev_cmd_clean(struct ionic *ionic)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue