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.
154 lines
5.2 KiB
154 lines
5.2 KiB
5 years ago
|
From be440df803ea96609073662eb051180e742fcc43 Mon Sep 17 00:00:00 2001
|
||
|
From: Jonathan Toppins <jtoppins@redhat.com>
|
||
|
Date: Wed, 2 Oct 2019 18:23:35 -0400
|
||
|
Subject: [PATCH 80/96] [netdrv] bnxt_en: Fix compile error regression with
|
||
|
CONFIG_BNXT_SRIOV not set
|
||
|
|
||
|
Message-id: <cf5b0d73c8d862dcf1a9e5bf61b2dc974503c8cc.1570027456.git.jtoppins@redhat.com>
|
||
|
Patchwork-id: 276495
|
||
|
O-Subject: [RHEL-8.2 PATCH 73/78] bnxt_en: Fix compile error regression with CONFIG_BNXT_SRIOV not set.
|
||
|
Bugzilla: 1724766
|
||
|
RH-Acked-by: John Linville <linville@redhat.com>
|
||
|
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
||
|
|
||
|
Add a new function bnxt_get_registered_vfs() to handle the work
|
||
|
of getting the number of registered VFs under #ifdef CONFIG_BNXT_SRIOV.
|
||
|
The main code will call this function and will always work correctly
|
||
|
whether CONFIG_BNXT_SRIOV is set or not.
|
||
|
|
||
|
Fixes: 230d1f0de754 ("bnxt_en: Handle firmware reset.")
|
||
|
Reported-by: kbuild test robot <lkp@intel.com>
|
||
|
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
|
||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||
|
(cherry picked from commit e72cb7d6245380acc11a24b75a865f7104ac8b33)
|
||
|
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 | 82 ++++++++++++++++++++-----------
|
||
|
1 file changed, 52 insertions(+), 30 deletions(-)
|
||
|
|
||
|
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c
|
||
|
===================================================================
|
||
|
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:21.000464594 +0100
|
||
|
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:21.151463208 +0100
|
||
|
@@ -10112,34 +10112,56 @@
|
||
|
bnxt_rtnl_unlock_sp(bp);
|
||
|
}
|
||
|
|
||
|
-void bnxt_fw_reset(struct bnxt *bp)
|
||
|
+/* Returns the number of registered VFs, or 1 if VF configuration is pending, or
|
||
|
+ * < 0 on error.
|
||
|
+ */
|
||
|
+static int bnxt_get_registered_vfs(struct bnxt *bp)
|
||
|
{
|
||
|
+#ifdef CONFIG_BNXT_SRIOV
|
||
|
int rc;
|
||
|
|
||
|
+ if (!BNXT_PF(bp))
|
||
|
+ return 0;
|
||
|
+
|
||
|
+ rc = bnxt_hwrm_func_qcfg(bp);
|
||
|
+ if (rc) {
|
||
|
+ netdev_err(bp->dev, "func_qcfg cmd failed, rc = %d\n", rc);
|
||
|
+ return rc;
|
||
|
+ }
|
||
|
+ if (bp->pf.registered_vfs)
|
||
|
+ return bp->pf.registered_vfs;
|
||
|
+ if (bp->sriov_cfg)
|
||
|
+ return 1;
|
||
|
+#endif
|
||
|
+ return 0;
|
||
|
+}
|
||
|
+
|
||
|
+void bnxt_fw_reset(struct bnxt *bp)
|
||
|
+{
|
||
|
bnxt_rtnl_lock_sp(bp);
|
||
|
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 &&
|
||
|
- !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",
|
||
|
- rc);
|
||
|
- clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
|
||
|
- dev_close(bp->dev);
|
||
|
- goto fw_reset_exit;
|
||
|
- }
|
||
|
- if (bp->pf.registered_vfs || bp->sriov_cfg) {
|
||
|
- u16 vf_tmo_dsecs = bp->pf.registered_vfs * 10;
|
||
|
+ int n = 0;
|
||
|
|
||
|
- if (bp->fw_reset_max_dsecs < vf_tmo_dsecs)
|
||
|
- bp->fw_reset_max_dsecs = vf_tmo_dsecs;
|
||
|
- bp->fw_reset_state =
|
||
|
- BNXT_FW_RESET_STATE_POLL_VF;
|
||
|
- bnxt_queue_fw_reset_work(bp, HZ / 10);
|
||
|
- goto fw_reset_exit;
|
||
|
- }
|
||
|
+ set_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
|
||
|
+ if (bp->pf.active_vfs &&
|
||
|
+ !test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
|
||
|
+ n = bnxt_get_registered_vfs(bp);
|
||
|
+ if (n < 0) {
|
||
|
+ netdev_err(bp->dev, "Firmware reset aborted, rc = %d\n",
|
||
|
+ n);
|
||
|
+ clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
|
||
|
+ dev_close(bp->dev);
|
||
|
+ goto fw_reset_exit;
|
||
|
+ } else if (n > 0) {
|
||
|
+ u16 vf_tmo_dsecs = n * 10;
|
||
|
+
|
||
|
+ if (bp->fw_reset_max_dsecs < vf_tmo_dsecs)
|
||
|
+ bp->fw_reset_max_dsecs = vf_tmo_dsecs;
|
||
|
+ bp->fw_reset_state =
|
||
|
+ BNXT_FW_RESET_STATE_POLL_VF;
|
||
|
+ bnxt_queue_fw_reset_work(bp, HZ / 10);
|
||
|
+ goto fw_reset_exit;
|
||
|
}
|
||
|
bnxt_fw_reset_close(bp);
|
||
|
bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV;
|
||
|
@@ -10584,22 +10606,21 @@
|
||
|
}
|
||
|
|
||
|
switch (bp->fw_reset_state) {
|
||
|
- case BNXT_FW_RESET_STATE_POLL_VF:
|
||
|
- rc = bnxt_hwrm_func_qcfg(bp);
|
||
|
- if (rc) {
|
||
|
+ case BNXT_FW_RESET_STATE_POLL_VF: {
|
||
|
+ int n = bnxt_get_registered_vfs(bp);
|
||
|
+
|
||
|
+ if (n < 0) {
|
||
|
netdev_err(bp->dev, "Firmware reset aborted, subsequent func_qcfg cmd failed, rc = %d, %d msecs since reset timestamp\n",
|
||
|
- rc, jiffies_to_msecs(jiffies -
|
||
|
+ n, jiffies_to_msecs(jiffies -
|
||
|
bp->fw_reset_timestamp));
|
||
|
goto fw_reset_abort;
|
||
|
- }
|
||
|
- if (bp->pf.registered_vfs || bp->sriov_cfg) {
|
||
|
+ } else if (n > 0) {
|
||
|
if (time_after(jiffies, bp->fw_reset_timestamp +
|
||
|
(bp->fw_reset_max_dsecs * HZ / 10))) {
|
||
|
clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
|
||
|
bp->fw_reset_state = 0;
|
||
|
- netdev_err(bp->dev, "Firmware reset aborted, %d VFs still registered, sriov_cfg %d\n",
|
||
|
- bp->pf.registered_vfs,
|
||
|
- bp->sriov_cfg);
|
||
|
+ netdev_err(bp->dev, "Firmware reset aborted, bnxt_get_registered_vfs() returns %d\n",
|
||
|
+ n);
|
||
|
return;
|
||
|
}
|
||
|
bnxt_queue_fw_reset_work(bp, HZ / 10);
|
||
|
@@ -10612,6 +10633,7 @@
|
||
|
rtnl_unlock();
|
||
|
bnxt_queue_fw_reset_work(bp, bp->fw_reset_min_dsecs * HZ / 10);
|
||
|
return;
|
||
|
+ }
|
||
|
case BNXT_FW_RESET_STATE_RESET_FW: {
|
||
|
u32 wait_dsecs = bp->fw_health->post_reset_wait_dsecs;
|
||
|
|