You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
4.5 KiB
125 lines
4.5 KiB
From 64f664056ef6e4616a8a7da3240cfd54620f03fe Mon Sep 17 00:00:00 2001
|
|
From: Jonathan Toppins <jtoppins@redhat.com>
|
|
Date: Wed, 2 Oct 2019 18:23:31 -0400
|
|
Subject: [PATCH 76/96] [netdrv] bnxt_en: Do not send firmware messages if
|
|
firmware is in error state
|
|
|
|
Message-id: <4facd24c48464bd7bb706680b486a5bad24d21d7.1570027456.git.jtoppins@redhat.com>
|
|
Patchwork-id: 276503
|
|
O-Subject: [RHEL-8.2 PATCH 69/78] bnxt_en: Do not send firmware messages if firmware is in error state.
|
|
Bugzilla: 1724766
|
|
RH-Acked-by: John Linville <linville@redhat.com>
|
|
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
Add a flag to mark that the firmware has encountered fatal condition.
|
|
The driver will not send any more firmware messages and will return
|
|
error to the caller. Fix up some clean up functions to continue
|
|
and not abort when the firmware message function returns error.
|
|
|
|
This is preparation work to fully handle firmware error recovery
|
|
under fatal conditions.
|
|
|
|
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
(cherry picked from commit b4fff2079d1080af7dcad8ad0e80cc89e1ee000c)
|
|
Bugzilla: 1724766
|
|
Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532
|
|
Tested: build, boot, basic ping
|
|
Signed-off-by: Jonathan Toppins <jtoppins@redhat.com>
|
|
Signed-off-by: Bruno Meneguele <bmeneg@redhat.com>
|
|
---
|
|
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 18 +++++++++++-------
|
|
drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 +
|
|
2 files changed, 12 insertions(+), 7 deletions(-)
|
|
|
|
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c
|
|
===================================================================
|
|
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:20.461469542 +0100
|
|
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:20.602468248 +0100
|
|
@@ -4178,6 +4178,9 @@
|
|
u32 bar_offset = BNXT_GRCPF_REG_CHIMP_COMM;
|
|
u16 dst = BNXT_HWRM_CHNL_CHIMP;
|
|
|
|
+ if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
|
|
+ return -EBUSY;
|
|
+
|
|
if (msg_len > BNXT_HWRM_MAX_REQ_LEN) {
|
|
if (msg_len > bp->hwrm_max_ext_req_len ||
|
|
!bp->hwrm_short_cmd_req_addr)
|
|
@@ -5047,8 +5050,6 @@
|
|
cpu_to_le32(bp->vnic_info[vnic_id].fw_vnic_id);
|
|
|
|
rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
|
- if (rc)
|
|
- return rc;
|
|
bp->vnic_info[vnic_id].fw_vnic_id = INVALID_HW_RING_ID;
|
|
}
|
|
return rc;
|
|
@@ -5188,8 +5189,6 @@
|
|
|
|
rc = _hwrm_send_message(bp, &req, sizeof(req),
|
|
HWRM_CMD_TIMEOUT);
|
|
- if (rc)
|
|
- break;
|
|
bp->grp_info[i].fw_grp_id = INVALID_HW_RING_ID;
|
|
}
|
|
mutex_unlock(&bp->hwrm_cmd_lock);
|
|
@@ -5508,6 +5507,9 @@
|
|
struct hwrm_ring_free_output *resp = bp->hwrm_cmd_resp_addr;
|
|
u16 error_code;
|
|
|
|
+ if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
|
|
+ return 0;
|
|
+
|
|
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_RING_FREE, cmpl_ring_id, -1);
|
|
req.ring_type = ring_type;
|
|
req.ring_id = cpu_to_le16(ring->fw_ring_id);
|
|
@@ -6305,8 +6307,6 @@
|
|
|
|
rc = _hwrm_send_message(bp, &req, sizeof(req),
|
|
HWRM_CMD_TIMEOUT);
|
|
- if (rc)
|
|
- break;
|
|
|
|
cpr->hw_stats_ctx_id = INVALID_STATS_CTX_ID;
|
|
}
|
|
@@ -7420,6 +7420,8 @@
|
|
|
|
if (set_tpa)
|
|
tpa_flags = bp->flags & BNXT_FLAG_TPA;
|
|
+ else if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
|
|
+ return 0;
|
|
for (i = 0; i < bp->nr_vnics; i++) {
|
|
rc = bnxt_hwrm_vnic_set_tpa(bp, i, tpa_flags);
|
|
if (rc) {
|
|
@@ -10014,7 +10016,8 @@
|
|
if (test_bit(BNXT_STATE_OPEN, &bp->state) &&
|
|
!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) {
|
|
set_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
|
|
- if (BNXT_PF(bp) && bp->pf.active_vfs) {
|
|
+ if (BNXT_PF(bp) && bp->pf.active_vfs &&
|
|
+ !test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state)) {
|
|
rc = bnxt_hwrm_func_qcfg(bp);
|
|
if (rc) {
|
|
netdev_err(bp->dev, "Firmware reset aborted, first func_qcfg cmd failed, rc = %d\n",
|
|
@@ -10444,6 +10447,7 @@
|
|
bnxt_queue_fw_reset_work(bp, bp->fw_reset_min_dsecs * HZ / 10);
|
|
return;
|
|
case BNXT_FW_RESET_STATE_ENABLE_DEV:
|
|
+ clear_bit(BNXT_STATE_FW_FATAL_COND, &bp->state);
|
|
if (pci_enable_device(bp->pdev)) {
|
|
netdev_err(bp->dev, "Cannot re-enable PCI device\n");
|
|
goto fw_reset_abort;
|
|
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h
|
|
===================================================================
|
|
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:20.307470956 +0100
|
|
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:20.602468248 +0100
|
|
@@ -1617,6 +1617,7 @@
|
|
#define BNXT_STATE_FW_RESET_DET 3
|
|
#define BNXT_STATE_IN_FW_RESET 4
|
|
#define BNXT_STATE_ABORT_ERR 5
|
|
+#define BNXT_STATE_FW_FATAL_COND 6
|
|
|
|
struct bnxt_irq *irq_tbl;
|
|
int total_irqs;
|