]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
bnxt_en: Abort waiting for firmware response if there is no heartbeat.
authorPavan Chebbi <pavan.chebbi@broadcom.com>
Mon, 18 Nov 2019 08:56:43 +0000 (03:56 -0500)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 Nov 2019 01:13:29 +0000 (17:13 -0800)
This is especially beneficial during the NVRAM related firmware
commands that have longer timeouts.  If the BNXT_STATE_FW_FATAL_COND
flag gets set while waiting for firmware response, abort and return
error.

Signed-off-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index 55e02a947765a5a87acea39c24bea88e4ce105fe..b20ab388e663400a9dda3dd68e9325a16a62e10f 100644 (file)
@@ -4278,6 +4278,11 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len,
                /* Wait until hwrm response cmpl interrupt is processed */
                while (bp->hwrm_intr_seq_id != (u16)~seq_id &&
                       i++ < tmo_count) {
+                       /* Abort the wait for completion if the FW health
+                        * check has failed.
+                        */
+                       if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
+                               return -EBUSY;
                        /* on first few passes, just barely sleep */
                        if (i < HWRM_SHORT_TIMEOUT_COUNTER)
                                usleep_range(HWRM_SHORT_MIN_TIMEOUT,
@@ -4301,6 +4306,11 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len,
 
                /* Check if response len is updated */
                for (i = 0; i < tmo_count; i++) {
+                       /* Abort the wait for completion if the FW health
+                        * check has failed.
+                        */
+                       if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
+                               return -EBUSY;
                        len = (le32_to_cpu(*resp_len) & HWRM_RESP_LEN_MASK) >>
                              HWRM_RESP_LEN_SFT;
                        if (len)