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.
342 lines
9.9 KiB
342 lines
9.9 KiB
5 years ago
|
From 3b43bc011b31d52e3923a4eac7951a8b4e528acb Mon Sep 17 00:00:00 2001
|
||
|
From: Jonathan Toppins <jtoppins@redhat.com>
|
||
|
Date: Wed, 2 Oct 2019 18:23:18 -0400
|
||
|
Subject: [PATCH 63/96] [netdrv] bnxt_en: Prepare bnxt_init_one() to be called
|
||
|
multiple times
|
||
|
|
||
|
Message-id: <1d65105ec743b3e52499fccd91176b5b117cf449.1570027456.git.jtoppins@redhat.com>
|
||
|
Patchwork-id: 276482
|
||
|
O-Subject: [RHEL-8.2 PATCH 56/78] bnxt_en: Prepare bnxt_init_one() to be called multiple times.
|
||
|
Bugzilla: 1724766
|
||
|
RH-Acked-by: John Linville <linville@redhat.com>
|
||
|
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
||
|
|
||
|
In preparation for the new firmware reset feature, some of the logic
|
||
|
in bnxt_init_one() and related functions will be called again after
|
||
|
firmware has reset. Reset some of the flags and capabilities so that
|
||
|
everything that can change can be re-initialized. Refactor some
|
||
|
functions to probe firmware versions and capabilities. Check some
|
||
|
buffers before allocating as they may have been allocated previously.
|
||
|
|
||
|
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
|
||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||
|
(cherry picked from commit ba642ab773db97c32293547485f562d2dfc06666)
|
||
|
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 | 126 +++++++++++++++-------
|
||
|
drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c | 2 +
|
||
|
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 5 +-
|
||
|
3 files changed, 93 insertions(+), 40 deletions(-)
|
||
|
|
||
|
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c
|
||
|
===================================================================
|
||
|
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:18.605486578 +0100
|
||
|
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:18.730485431 +0100
|
||
|
@@ -3560,6 +3560,9 @@
|
||
|
{
|
||
|
struct pci_dev *pdev = bp->pdev;
|
||
|
|
||
|
+ if (bp->hwrm_cmd_kong_resp_addr)
|
||
|
+ return 0;
|
||
|
+
|
||
|
bp->hwrm_cmd_kong_resp_addr =
|
||
|
dma_alloc_coherent(&pdev->dev, PAGE_SIZE,
|
||
|
&bp->hwrm_cmd_kong_resp_dma_addr,
|
||
|
@@ -3599,6 +3602,9 @@
|
||
|
{
|
||
|
struct pci_dev *pdev = bp->pdev;
|
||
|
|
||
|
+ if (bp->hwrm_short_cmd_req_addr)
|
||
|
+ return 0;
|
||
|
+
|
||
|
bp->hwrm_short_cmd_req_addr =
|
||
|
dma_alloc_coherent(&pdev->dev, bp->hwrm_max_ext_req_len,
|
||
|
&bp->hwrm_short_cmd_req_dma_addr,
|
||
|
@@ -5022,6 +5028,7 @@
|
||
|
int rc;
|
||
|
|
||
|
bp->hw_ring_stats_size = sizeof(struct ctx_hw_stats);
|
||
|
+ bp->flags &= ~(BNXT_FLAG_NEW_RSS_CAP | BNXT_FLAG_ROCE_MIRROR_CAP);
|
||
|
if (bp->hwrm_spec_code < 0x10600)
|
||
|
return 0;
|
||
|
|
||
|
@@ -6876,6 +6883,7 @@
|
||
|
pf->max_tx_wm_flows = le32_to_cpu(resp->max_tx_wm_flows);
|
||
|
pf->max_rx_em_flows = le32_to_cpu(resp->max_rx_em_flows);
|
||
|
pf->max_rx_wm_flows = le32_to_cpu(resp->max_rx_wm_flows);
|
||
|
+ bp->flags &= ~BNXT_FLAG_WOL_CAP;
|
||
|
if (flags & FUNC_QCAPS_RESP_FLAGS_WOL_MAGICPKT_SUPPORTED)
|
||
|
bp->flags |= BNXT_FLAG_WOL_CAP;
|
||
|
} else {
|
||
|
@@ -7004,20 +7012,30 @@
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
-static int bnxt_hwrm_ver_get(struct bnxt *bp)
|
||
|
+static int __bnxt_hwrm_ver_get(struct bnxt *bp, bool silent)
|
||
|
{
|
||
|
- int rc;
|
||
|
struct hwrm_ver_get_input req = {0};
|
||
|
- struct hwrm_ver_get_output *resp = bp->hwrm_cmd_resp_addr;
|
||
|
- u32 dev_caps_cfg;
|
||
|
+ int rc;
|
||
|
|
||
|
- bp->hwrm_max_req_len = HWRM_MAX_REQ_LEN;
|
||
|
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_VER_GET, -1, -1);
|
||
|
req.hwrm_intf_maj = HWRM_VERSION_MAJOR;
|
||
|
req.hwrm_intf_min = HWRM_VERSION_MINOR;
|
||
|
req.hwrm_intf_upd = HWRM_VERSION_UPDATE;
|
||
|
+
|
||
|
+ rc = bnxt_hwrm_do_send_msg(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT,
|
||
|
+ silent);
|
||
|
+ return rc;
|
||
|
+}
|
||
|
+
|
||
|
+static int bnxt_hwrm_ver_get(struct bnxt *bp)
|
||
|
+{
|
||
|
+ struct hwrm_ver_get_output *resp = bp->hwrm_cmd_resp_addr;
|
||
|
+ u32 dev_caps_cfg;
|
||
|
+ int rc;
|
||
|
+
|
||
|
+ bp->hwrm_max_req_len = HWRM_MAX_REQ_LEN;
|
||
|
mutex_lock(&bp->hwrm_cmd_lock);
|
||
|
- rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
||
|
+ rc = __bnxt_hwrm_ver_get(bp, false);
|
||
|
if (rc)
|
||
|
goto hwrm_ver_get_exit;
|
||
|
|
||
|
@@ -8186,6 +8204,9 @@
|
||
|
struct hwrm_port_phy_qcaps_output *resp = bp->hwrm_cmd_resp_addr;
|
||
|
struct bnxt_link_info *link_info = &bp->link_info;
|
||
|
|
||
|
+ bp->flags &= ~BNXT_FLAG_EEE_CAP;
|
||
|
+ if (bp->test_info)
|
||
|
+ bp->test_info->flags &= ~BNXT_TEST_FL_EXT_LPBK;
|
||
|
if (bp->hwrm_spec_code < 0x10201)
|
||
|
return 0;
|
||
|
|
||
|
@@ -8551,6 +8572,7 @@
|
||
|
struct bnxt_pf_info *pf = &bp->pf;
|
||
|
int rc;
|
||
|
|
||
|
+ bp->num_leds = 0;
|
||
|
if (BNXT_VF(bp) || bp->hwrm_spec_code < 0x10601)
|
||
|
return 0;
|
||
|
|
||
|
@@ -8645,6 +8667,7 @@
|
||
|
{
|
||
|
u16 handle = 0;
|
||
|
|
||
|
+ bp->wol = 0;
|
||
|
if (!BNXT_PF(bp) || !(bp->flags & BNXT_FLAG_WOL_CAP))
|
||
|
return;
|
||
|
|
||
|
@@ -8691,6 +8714,9 @@
|
||
|
{
|
||
|
struct pci_dev *pdev = bp->pdev;
|
||
|
|
||
|
+ if (bp->hwmon_dev)
|
||
|
+ return;
|
||
|
+
|
||
|
bp->hwmon_dev = hwmon_device_register_with_groups(&pdev->dev,
|
||
|
DRV_MODULE_NAME, bp,
|
||
|
bnxt_groups);
|
||
|
@@ -10007,6 +10033,53 @@
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+static void bnxt_set_dflt_rss_hash_type(struct bnxt *bp)
|
||
|
+{
|
||
|
+ bp->flags &= ~BNXT_FLAG_UDP_RSS_CAP;
|
||
|
+ bp->rss_hash_cfg = VNIC_RSS_CFG_REQ_HASH_TYPE_IPV4 |
|
||
|
+ VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV4 |
|
||
|
+ VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6 |
|
||
|
+ VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV6;
|
||
|
+ if (BNXT_CHIP_P4(bp) && bp->hwrm_spec_code >= 0x10501) {
|
||
|
+ bp->flags |= BNXT_FLAG_UDP_RSS_CAP;
|
||
|
+ bp->rss_hash_cfg |= VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV4 |
|
||
|
+ VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV6;
|
||
|
+ }
|
||
|
+}
|
||
|
+
|
||
|
+static void bnxt_set_dflt_rfs(struct bnxt *bp)
|
||
|
+{
|
||
|
+ struct net_device *dev = bp->dev;
|
||
|
+
|
||
|
+ dev->hw_features &= ~NETIF_F_NTUPLE;
|
||
|
+ dev->features &= ~NETIF_F_NTUPLE;
|
||
|
+ bp->flags &= ~BNXT_FLAG_RFS;
|
||
|
+ if (bnxt_rfs_supported(bp)) {
|
||
|
+ dev->hw_features |= NETIF_F_NTUPLE;
|
||
|
+ if (bnxt_rfs_capable(bp)) {
|
||
|
+ bp->flags |= BNXT_FLAG_RFS;
|
||
|
+ dev->features |= NETIF_F_NTUPLE;
|
||
|
+ }
|
||
|
+ }
|
||
|
+}
|
||
|
+
|
||
|
+static void bnxt_fw_init_one_p3(struct bnxt *bp)
|
||
|
+{
|
||
|
+ struct pci_dev *pdev = bp->pdev;
|
||
|
+
|
||
|
+ bnxt_set_dflt_rss_hash_type(bp);
|
||
|
+ bnxt_set_dflt_rfs(bp);
|
||
|
+
|
||
|
+ bnxt_get_wol_settings(bp);
|
||
|
+ if (bp->flags & BNXT_FLAG_WOL_CAP)
|
||
|
+ device_set_wakeup_enable(&pdev->dev, bp->wol);
|
||
|
+ else
|
||
|
+ device_set_wakeup_capable(&pdev->dev, false);
|
||
|
+
|
||
|
+ bnxt_hwrm_set_cache_line_size(bp, cache_line_size());
|
||
|
+ bnxt_hwrm_coal_params_qcaps(bp);
|
||
|
+}
|
||
|
+
|
||
|
static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev)
|
||
|
{
|
||
|
int rc;
|
||
|
@@ -10636,7 +10709,7 @@
|
||
|
free_netdev(dev);
|
||
|
}
|
||
|
|
||
|
-static int bnxt_probe_phy(struct bnxt *bp)
|
||
|
+static int bnxt_probe_phy(struct bnxt *bp, bool fw_dflt)
|
||
|
{
|
||
|
int rc = 0;
|
||
|
struct bnxt_link_info *link_info = &bp->link_info;
|
||
|
@@ -10647,8 +10720,6 @@
|
||
|
rc);
|
||
|
return rc;
|
||
|
}
|
||
|
- mutex_init(&bp->link_lock);
|
||
|
-
|
||
|
rc = bnxt_update_link(bp, false);
|
||
|
if (rc) {
|
||
|
netdev_err(bp->dev, "Probe phy can't update link (rc: %x)\n",
|
||
|
@@ -10662,6 +10733,9 @@
|
||
|
if (link_info->auto_link_speeds && !link_info->support_auto_speeds)
|
||
|
link_info->support_auto_speeds = link_info->support_speeds;
|
||
|
|
||
|
+ if (!fw_dflt)
|
||
|
+ return 0;
|
||
|
+
|
||
|
/*initialize the ethool setting copy with NVM settings */
|
||
|
if (BNXT_AUTO_MODE(link_info->auto_mode)) {
|
||
|
link_info->autoneg = BNXT_AUTONEG_SPEED;
|
||
|
@@ -10682,7 +10756,7 @@
|
||
|
link_info->auto_pause_setting & BNXT_LINK_PAUSE_BOTH;
|
||
|
else
|
||
|
link_info->req_flow_ctrl = link_info->force_pause_setting;
|
||
|
- return rc;
|
||
|
+ return 0;
|
||
|
}
|
||
|
|
||
|
static int bnxt_get_max_irq(struct pci_dev *pdev)
|
||
|
@@ -10986,6 +11060,7 @@
|
||
|
goto init_err_pci_clean;
|
||
|
|
||
|
mutex_init(&bp->hwrm_cmd_lock);
|
||
|
+ mutex_init(&bp->link_lock);
|
||
|
|
||
|
rc = bnxt_fw_init_one_p1(bp);
|
||
|
if (rc)
|
||
|
@@ -11061,7 +11136,7 @@
|
||
|
dev->min_mtu = ETH_ZLEN;
|
||
|
dev->max_mtu = bp->max_mtu;
|
||
|
|
||
|
- rc = bnxt_probe_phy(bp);
|
||
|
+ rc = bnxt_probe_phy(bp, true);
|
||
|
if (rc)
|
||
|
goto init_err_pci_clean;
|
||
|
|
||
|
@@ -11075,24 +11150,7 @@
|
||
|
goto init_err_pci_clean;
|
||
|
}
|
||
|
|
||
|
- /* Default RSS hash cfg. */
|
||
|
- bp->rss_hash_cfg = VNIC_RSS_CFG_REQ_HASH_TYPE_IPV4 |
|
||
|
- VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV4 |
|
||
|
- VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6 |
|
||
|
- VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV6;
|
||
|
- if (BNXT_CHIP_P4(bp) && bp->hwrm_spec_code >= 0x10501) {
|
||
|
- bp->flags |= BNXT_FLAG_UDP_RSS_CAP;
|
||
|
- bp->rss_hash_cfg |= VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV4 |
|
||
|
- VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV6;
|
||
|
- }
|
||
|
-
|
||
|
- if (bnxt_rfs_supported(bp)) {
|
||
|
- dev->hw_features |= NETIF_F_NTUPLE;
|
||
|
- if (bnxt_rfs_capable(bp)) {
|
||
|
- bp->flags |= BNXT_FLAG_RFS;
|
||
|
- dev->features |= NETIF_F_NTUPLE;
|
||
|
- }
|
||
|
- }
|
||
|
+ bnxt_fw_init_one_p3(bp);
|
||
|
|
||
|
if (dev->hw_features & NETIF_F_HW_VLAN_CTAG_RX)
|
||
|
bp->flags |= BNXT_FLAG_STRIP_VLAN;
|
||
|
@@ -11106,16 +11164,6 @@
|
||
|
*/
|
||
|
bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
|
||
|
|
||
|
- bnxt_get_wol_settings(bp);
|
||
|
- if (bp->flags & BNXT_FLAG_WOL_CAP)
|
||
|
- device_set_wakeup_enable(&pdev->dev, bp->wol);
|
||
|
- else
|
||
|
- device_set_wakeup_capable(&pdev->dev, false);
|
||
|
-
|
||
|
- bnxt_hwrm_set_cache_line_size(bp, cache_line_size());
|
||
|
-
|
||
|
- bnxt_hwrm_coal_params_qcaps(bp);
|
||
|
-
|
||
|
if (BNXT_PF(bp)) {
|
||
|
if (!bnxt_pf_wq) {
|
||
|
bnxt_pf_wq =
|
||
|
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c
|
||
|
===================================================================
|
||
|
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c 2020-02-06 16:23:18.306489323 +0100
|
||
|
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c 2020-02-06 16:23:18.730485431 +0100
|
||
|
@@ -389,6 +389,7 @@
|
||
|
struct hwrm_queue_dscp_qcaps_input req = {0};
|
||
|
int rc;
|
||
|
|
||
|
+ bp->max_dscp_value = 0;
|
||
|
if (bp->hwrm_spec_code < 0x10800 || BNXT_VF(bp))
|
||
|
return 0;
|
||
|
|
||
|
@@ -718,6 +719,7 @@
|
||
|
|
||
|
void bnxt_dcb_init(struct bnxt *bp)
|
||
|
{
|
||
|
+ bp->dcbx_cap = 0;
|
||
|
if (bp->hwrm_spec_code < 0x10501)
|
||
|
return;
|
||
|
|
||
|
Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
|
||
|
===================================================================
|
||
|
--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:18.307489314 +0100
|
||
|
+++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:18.730485431 +0100
|
||
|
@@ -3350,6 +3350,7 @@
|
||
|
if (!(bp->fw_cap & BNXT_FW_CAP_PKG_VER))
|
||
|
bnxt_get_pkgver(dev);
|
||
|
|
||
|
+ bp->num_tests = 0;
|
||
|
if (bp->hwrm_spec_code < 0x10704 || !BNXT_SINGLE_PF(bp))
|
||
|
return;
|
||
|
|
||
|
@@ -3359,7 +3360,9 @@
|
||
|
if (rc)
|
||
|
goto ethtool_init_exit;
|
||
|
|
||
|
- test_info = kzalloc(sizeof(*bp->test_info), GFP_KERNEL);
|
||
|
+ test_info = bp->test_info;
|
||
|
+ if (!test_info)
|
||
|
+ test_info = kzalloc(sizeof(*bp->test_info), GFP_KERNEL);
|
||
|
if (!test_info)
|
||
|
goto ethtool_init_exit;
|
||
|
|