ionic: bypass firmware cmds when stuck in reset
authorShannon Nelson <shannon.nelson@amd.com>
Mon, 11 Dec 2023 18:57:59 +0000 (10:57 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 13 Dec 2023 12:35:55 +0000 (12:35 +0000)
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>
drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
drivers/net/ethernet/pensando/ionic/ionic_lif.c
drivers/net/ethernet/pensando/ionic/ionic_main.c

index 43e7967ad1c543fcd0d1a798a23f9feaef36cb35..f69178b9636fb626caa769c603fd2ed5327c7b83 100644 (file)
@@ -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);
index 3bb0cfc40576cfa900793622384672f0c9503b31..cf2d5ad7b68cc85195e516697d82238c6a7f5924 100644 (file)
@@ -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);
index 873a86010b2762174e3bcb919235565a12acf84a..165ab08ad2dda8ea15cca7aba88f586b0010c3f2 100644 (file)
@@ -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_nomsg(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
+int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
 {
-       int err;
-
-       err = ionic_adminq_post(lif, ctx);
+       return __ionic_adminq_post_wait(lif, ctx, true);
+}
 
-       return ionic_adminq_wait(lif, ctx, err, false);
+int ionic_adminq_post_wait_nomsg(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
+{
+       return __ionic_adminq_post_wait(lif, ctx, false);
 }
 
 static void ionic_dev_cmd_clean(struct ionic *ionic)