diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..25496fc --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/bnxt_en-redhat-1.10.0_dup8.1.tar.bz2 diff --git a/.kmod-redhat-bnxt_en.metadata b/.kmod-redhat-bnxt_en.metadata new file mode 100644 index 0000000..dcb763d --- /dev/null +++ b/.kmod-redhat-bnxt_en.metadata @@ -0,0 +1 @@ +ad955a9c26bc917e457b85ae4fcc39242a6a7f68 SOURCES/bnxt_en-redhat-1.10.0_dup8.1.tar.bz2 diff --git a/SOURCES/0001-netdrv-linux-dim-Fix-overflow-in-dim-calculation.patch b/SOURCES/0001-netdrv-linux-dim-Fix-overflow-in-dim-calculation.patch new file mode 100644 index 0000000..bdb0e22 --- /dev/null +++ b/SOURCES/0001-netdrv-linux-dim-Fix-overflow-in-dim-calculation.patch @@ -0,0 +1,61 @@ +From 2bb4fd965ddb1682b18a937d61be197a242bc803 Mon Sep 17 00:00:00 2001 +From: Ivan Vecera +Date: Wed, 7 Aug 2019 14:26:29 -0400 +Subject: [PATCH 01/96] [netdrv] linux/dim: Fix overflow in dim calculation + +Message-id: <20190807142629.15867-1-ivecera@redhat.com> +Patchwork-id: 268439 +O-Subject: [RHEL-8.2 net PATCH 9/9] linux/dim: Fix overflow in dim calculation +Bugzilla: 1737807 +RH-Acked-by: Kamal Heib +RH-Acked-by: Corinna Vinschen +RH-Acked-by: Jonathan Toppins +RH-Acked-by: John Linville + +Bugzilla: http://bugzilla.redhat.com/show_bug.cgi?id=1737807 + +Upstream commit(s): +commit f06d0ca45827a5790d7508de4759aed976933d4d +Author: Yamin Friedman +Date: Tue Jul 23 10:22:47 2019 +0300 + + linux/dim: Fix overflow in dim calculation + + While using net_dim, a dim_sample was used without ever initializing the + comps value. Added use of DIV_ROUND_DOWN_ULL() to prevent potential + overflow, it should not be a problem to save the final result in an int + because after the division by epms the value should not be larger than a + few thousand. + + [ 1040.127124] UBSAN: Undefined behaviour in lib/dim/dim.c:78:23 + [ 1040.130118] signed integer overflow: + [ 1040.131643] 134718714 * 100 cannot be represented in type 'int' + + Fixes: 398c2b05bbee ("linux/dim: Add completions count to dim_sample") + Signed-off-by: Yamin Friedman + Signed-off-by: Leon Romanovsky + Acked-by: Saeed Mahameed + Signed-off-by: David S. Miller + +Signed-off-by: Ivan Vecera +Signed-off-by: Jiri Benc + +Signed-off-by: Timothy Redaelli +Signed-off-by: Phillip Lougher +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:22:57.646678963 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:10.933557001 +0100 +@@ -2132,7 +2132,7 @@ + } + } + if (bp->flags & BNXT_FLAG_DIM) { +- struct net_dim_sample dim_sample; ++ struct net_dim_sample dim_sample = {}; + + net_dim_sample(cpr->event_ctr, + cpr->rx_packets, diff --git a/SOURCES/0002-netdrv-bnxt_en-Add-bnxt_en-initial-port-params-table.patch b/SOURCES/0002-netdrv-bnxt_en-Add-bnxt_en-initial-port-params-table.patch new file mode 100644 index 0000000..f394b8d --- /dev/null +++ b/SOURCES/0002-netdrv-bnxt_en-Add-bnxt_en-initial-port-params-table.patch @@ -0,0 +1,176 @@ +From 467b7f37120a4e7b7583045ec83e549e7d01a28d Mon Sep 17 00:00:00 2001 +From: Petr Oros +Date: Thu, 5 Sep 2019 10:00:57 -0400 +Subject: [PATCH 02/96] [netdrv] bnxt_en: Add bnxt_en initial port params table + and register it + +Message-id: <8735851440fccbd92993e8958f70edb7811f4512.1567595345.git.poros@redhat.com> +Patchwork-id: 270937 +O-Subject: [RHEL8.2 net PATCH 01/15] bnxt_en: Add bnxt_en initial port params table and register it +Bugzilla: 1737133 +RH-Acked-by: Jonathan Toppins +RH-Acked-by: Neil Horman +RH-Acked-by: John Linville +RH-Acked-by: Ivan Vecera + +Bugzilla: http://bugzilla.redhat.com/show_bug.cgi?id=1737133 + +Conflicts: \ +- Adjusted due to already aplied 7c62cfb8c5744b ("devlink: publish params + only after driver init is done") + +Upstream commit(s): +commit 782a624d00fa22e7499f5abc29747501ec671313 +Author: Vasundhara Volam +Date: Mon Jan 28 18:00:27 2019 +0530 + + bnxt_en: Add bnxt_en initial port params table and register it + + Register devlink_port with devlink and create initial port params + table for bnxt_en. The table consists of a generic parameter: + + wake_on_lan: Enables Wake on Lan for this port when magic packet + is received with this port's MAC address using ACPI pattern. + If enabled, the controller asserts a wake pin upon reception of + WoL packet. ACPI (Advanced Configuration and Power Interface) is + an industry specification for the efficient handling of power + consumption in desktop and mobile computers. + + v2->v3: + - Modify bnxt_dl_wol_validate(), to throw error message when user gives + value other than DEVLINK_PARAM_WAKE_MAGIC ot to disable WOL. + - Use netdev_err() instead of netdev_warn(), when devlink_port_register() + and devlink_port_params_register() returns error. Also, don't log rc + in this message. + + Cc: Michael Chan + Signed-off-by: Vasundhara Volam + Signed-off-by: David S. Miller + +Signed-off-by: Petr Oros +Signed-off-by: Timothy Redaelli +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 44 ++++++++++++++++++++++- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h | 1 + + 3 files changed, 45 insertions(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:22:57.596679422 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:11.133555165 +0100 +@@ -1613,6 +1613,7 @@ + + /* devlink interface and vf-rep structs */ + struct devlink *dl; ++ struct devlink_port dl_port; + enum devlink_eswitch_mode eswitch_mode; + struct bnxt_vf_rep **vf_reps; /* array of vf-rep ptrs */ + u16 *cfa_code_map; /* cfa_code -> vf_idx map */ +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:22:57.596679422 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:11.134555156 +0100 +@@ -37,6 +37,8 @@ + NVM_OFF_MSIX_VEC_PER_PF_MIN, BNXT_NVM_SHARED_CFG, 7}, + {BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK, NVM_OFF_DIS_GRE_VER_CHECK, + BNXT_NVM_SHARED_CFG, 1}, ++ ++ {DEVLINK_PARAM_GENERIC_ID_WOL, NVM_OFF_WOL, BNXT_NVM_PORT_CFG, 1}, + }; + + static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg, +@@ -70,7 +72,8 @@ + bytesize = roundup(nvm_param.num_bits, BITS_PER_BYTE) / BITS_PER_BYTE; + switch (bytesize) { + case 1: +- if (nvm_param.num_bits == 1) ++ if (nvm_param.num_bits == 1 && ++ nvm_param.id != DEVLINK_PARAM_GENERIC_ID_WOL) + buf = &val->vbool; + else + buf = &val->vu8; +@@ -164,6 +167,17 @@ + return 0; + } + ++static int bnxt_dl_wol_validate(struct devlink *dl, u32 id, ++ union devlink_param_value val, ++ struct netlink_ext_ack *extack) ++{ ++ if (val.vu8 && val.vu8 != DEVLINK_PARAM_WAKE_MAGIC) { ++ NL_SET_ERR_MSG_MOD(extack, "WOL type is not supported"); ++ return -EINVAL; ++ } ++ return 0; ++} ++ + static const struct devlink_param bnxt_dl_params[] = { + DEVLINK_PARAM_GENERIC(ENABLE_SRIOV, + BIT(DEVLINK_PARAM_CMODE_PERMANENT), +@@ -188,6 +202,12 @@ + NULL), + }; + ++static const struct devlink_param bnxt_dl_port_params[] = { ++ DEVLINK_PARAM_GENERIC(WOL, BIT(DEVLINK_PARAM_CMODE_PERMANENT), ++ bnxt_dl_nvm_param_get, bnxt_dl_nvm_param_set, ++ bnxt_dl_wol_validate), ++}; ++ + int bnxt_dl_register(struct bnxt *bp) + { + struct devlink *dl; +@@ -225,10 +245,29 @@ + goto err_dl_unreg; + } + ++ rc = devlink_port_register(dl, &bp->dl_port, bp->pf.port_id); ++ if (rc) { ++ netdev_err(bp->dev, "devlink_port_register failed"); ++ goto err_dl_param_unreg; ++ } ++ devlink_port_type_eth_set(&bp->dl_port, bp->dev); ++ ++ rc = devlink_port_params_register(&bp->dl_port, bnxt_dl_port_params, ++ ARRAY_SIZE(bnxt_dl_port_params)); ++ if (rc) { ++ netdev_err(bp->dev, "devlink_port_params_register failed"); ++ goto err_dl_port_unreg; ++ } ++ + devlink_params_publish(dl); + + return 0; + ++err_dl_port_unreg: ++ devlink_port_unregister(&bp->dl_port); ++err_dl_param_unreg: ++ devlink_params_unregister(dl, bnxt_dl_params, ++ ARRAY_SIZE(bnxt_dl_params)); + err_dl_unreg: + devlink_unregister(dl); + err_dl_free: +@@ -244,6 +283,9 @@ + if (!dl) + return; + ++ devlink_port_params_unregister(&bp->dl_port, bnxt_dl_port_params, ++ ARRAY_SIZE(bnxt_dl_port_params)); ++ devlink_port_unregister(&bp->dl_port); + devlink_params_unregister(dl, bnxt_dl_params, + ARRAY_SIZE(bnxt_dl_params)); + devlink_unregister(dl); +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h 2020-02-06 16:22:57.596679422 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h 2020-02-06 16:23:11.134555156 +0100 +@@ -35,6 +35,7 @@ + + #define NVM_OFF_MSIX_VEC_PER_PF_MAX 108 + #define NVM_OFF_MSIX_VEC_PER_PF_MIN 114 ++#define NVM_OFF_WOL 152 + #define NVM_OFF_IGNORE_ARI 164 + #define NVM_OFF_DIS_GRE_VER_CHECK 171 + #define NVM_OFF_ENABLE_SRIOV 401 diff --git a/SOURCES/0003-netdrv-revert-devlink-Add-a-generic-wake_on_lan-port.patch b/SOURCES/0003-netdrv-revert-devlink-Add-a-generic-wake_on_lan-port.patch new file mode 100644 index 0000000..7deecbe --- /dev/null +++ b/SOURCES/0003-netdrv-revert-devlink-Add-a-generic-wake_on_lan-port.patch @@ -0,0 +1,111 @@ +From 2c4d992b57a4b6709fcda6fd12b1f53c19a719cc Mon Sep 17 00:00:00 2001 +From: Petr Oros +Date: Thu, 5 Sep 2019 10:00:58 -0400 +Subject: [PATCH 03/96] [netdrv] revert "devlink: Add a generic wake_on_lan + port parameter" + +Message-id: +Patchwork-id: 270934 +O-Subject: [RHEL8.2 net PATCH 02/15] Revert "devlink: Add a generic wake_on_lan port parameter" +Bugzilla: 1737133 +RH-Acked-by: Jonathan Toppins +RH-Acked-by: Neil Horman +RH-Acked-by: John Linville +RH-Acked-by: Ivan Vecera + +Bugzilla: http://bugzilla.redhat.com/show_bug.cgi?id=1737133 + +Upstream commit(s): +commit da203dfa89ce83c55b6623f73560ef7ec742aca4 +Author: Vasundhara Volam +Date: Mon Feb 11 14:46:17 2019 +0530 + + Revert "devlink: Add a generic wake_on_lan port parameter" + + This reverts commit b639583f9e36d044ac1b13090ae812266992cbac. + + As per discussion with Jakub Kicinski and Michal Kubecek, + this will be better addressed by soon-too-come ethtool netlink + API with additional indication that given configuration request + is supposed to be persisted. + + Also, remove the parameter support from bnxt_en driver. + + Cc: Jiri Pirko + Cc: Michael Chan + Cc: Michal Kubecek + Suggested-by: Jakub Kicinski + Signed-off-by: Vasundhara Volam + Signed-off-by: David S. Miller + +Signed-off-by: Petr Oros +Signed-off-by: Timothy Redaelli +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 19 +------------------ + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h | 1 - + 2 files changed, 1 insertion(+), 19 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:11.134555156 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:11.278553834 +0100 +@@ -37,8 +37,6 @@ + NVM_OFF_MSIX_VEC_PER_PF_MIN, BNXT_NVM_SHARED_CFG, 7}, + {BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK, NVM_OFF_DIS_GRE_VER_CHECK, + BNXT_NVM_SHARED_CFG, 1}, +- +- {DEVLINK_PARAM_GENERIC_ID_WOL, NVM_OFF_WOL, BNXT_NVM_PORT_CFG, 1}, + }; + + static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg, +@@ -72,8 +70,7 @@ + bytesize = roundup(nvm_param.num_bits, BITS_PER_BYTE) / BITS_PER_BYTE; + switch (bytesize) { + case 1: +- if (nvm_param.num_bits == 1 && +- nvm_param.id != DEVLINK_PARAM_GENERIC_ID_WOL) ++ if (nvm_param.num_bits == 1) + buf = &val->vbool; + else + buf = &val->vu8; +@@ -167,17 +164,6 @@ + return 0; + } + +-static int bnxt_dl_wol_validate(struct devlink *dl, u32 id, +- union devlink_param_value val, +- struct netlink_ext_ack *extack) +-{ +- if (val.vu8 && val.vu8 != DEVLINK_PARAM_WAKE_MAGIC) { +- NL_SET_ERR_MSG_MOD(extack, "WOL type is not supported"); +- return -EINVAL; +- } +- return 0; +-} +- + static const struct devlink_param bnxt_dl_params[] = { + DEVLINK_PARAM_GENERIC(ENABLE_SRIOV, + BIT(DEVLINK_PARAM_CMODE_PERMANENT), +@@ -203,9 +189,6 @@ + }; + + static const struct devlink_param bnxt_dl_port_params[] = { +- DEVLINK_PARAM_GENERIC(WOL, BIT(DEVLINK_PARAM_CMODE_PERMANENT), +- bnxt_dl_nvm_param_get, bnxt_dl_nvm_param_set, +- bnxt_dl_wol_validate), + }; + + int bnxt_dl_register(struct bnxt *bp) +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h 2020-02-06 16:23:11.134555156 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h 2020-02-06 16:23:11.278553834 +0100 +@@ -35,7 +35,6 @@ + + #define NVM_OFF_MSIX_VEC_PER_PF_MAX 108 + #define NVM_OFF_MSIX_VEC_PER_PF_MIN 114 +-#define NVM_OFF_WOL 152 + #define NVM_OFF_IGNORE_ARI 164 + #define NVM_OFF_DIS_GRE_VER_CHECK 171 + #define NVM_OFF_ENABLE_SRIOV 401 diff --git a/SOURCES/0004-netdrv-bnxt-add-missing-net-devlink.h-include.patch b/SOURCES/0004-netdrv-bnxt-add-missing-net-devlink.h-include.patch new file mode 100644 index 0000000..ddac2ad --- /dev/null +++ b/SOURCES/0004-netdrv-bnxt-add-missing-net-devlink.h-include.patch @@ -0,0 +1,47 @@ +From 67688aa4d866e8db3ce8ffcece88dfce0615291b Mon Sep 17 00:00:00 2001 +From: Petr Oros +Date: Thu, 5 Sep 2019 10:00:59 -0400 +Subject: [PATCH 04/96] [netdrv] bnxt: add missing net/devlink.h include + +Message-id: <53e744a37a2f5e808c071e9b3f668df45dde6438.1567595345.git.poros@redhat.com> +Patchwork-id: 270938 +O-Subject: [RHEL8.2 net PATCH 03/15] bnxt: add missing net/devlink.h include +Bugzilla: 1737133 +RH-Acked-by: Jonathan Toppins +RH-Acked-by: Neil Horman +RH-Acked-by: John Linville +RH-Acked-by: Ivan Vecera + +Bugzilla: http://bugzilla.redhat.com/show_bug.cgi?id=1737133 + +Upstream commit(s): +commit 477edb7806b652043750aa33c584b9838a7c2123 +Author: Jiri Pirko +Date: Sun Mar 24 11:14:25 2019 +0100 + + bnxt: add missing net/devlink.h include + + devlink functions are in use, so include the related header file. + + Signed-off-by: Jiri Pirko + Signed-off-by: David S. Miller + +Signed-off-by: Petr Oros +Signed-off-by: Timothy Redaelli +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 1 + + 1 file changed, 1 insertion(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:11.278553834 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:11.413552595 +0100 +@@ -9,6 +9,7 @@ + + #include + #include ++#include + #include "bnxt_hsi.h" + #include "bnxt.h" + #include "bnxt_vfr.h" diff --git a/SOURCES/0005-netdrv-bnxt-set-devlink-port-attrs-properly.patch b/SOURCES/0005-netdrv-bnxt-set-devlink-port-attrs-properly.patch new file mode 100644 index 0000000..4c78619 --- /dev/null +++ b/SOURCES/0005-netdrv-bnxt-set-devlink-port-attrs-properly.patch @@ -0,0 +1,49 @@ +From 1194d1ea18ead0d3eec03bfeefa88b5a9b4702bc Mon Sep 17 00:00:00 2001 +From: Petr Oros +Date: Thu, 5 Sep 2019 10:01:01 -0400 +Subject: [PATCH 05/96] [netdrv] bnxt: set devlink port attrs properly + +Message-id: +Patchwork-id: 270939 +O-Subject: [RHEL8.2 net PATCH 05/15] bnxt: set devlink port attrs properly +Bugzilla: 1737133 +RH-Acked-by: Jonathan Toppins +RH-Acked-by: Neil Horman +RH-Acked-by: John Linville +RH-Acked-by: Ivan Vecera + +Bugzilla: http://bugzilla.redhat.com/show_bug.cgi?id=1737133 + +Upstream commit(s): +commit a0e18132ec51301414a5c92e6c258c2e62fdf08f +Author: Jiri Pirko +Date: Sun Mar 24 11:14:27 2019 +0100 + + bnxt: set devlink port attrs properly + + Set the attrs properly so delink has enough info to generate physical + port names. + + Signed-off-by: Jiri Pirko + Signed-off-by: David S. Miller + +Signed-off-by: Petr Oros +Signed-off-by: Timothy Redaelli +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 2 ++ + 1 file changed, 2 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:11.413552595 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:11.535551475 +0100 +@@ -229,6 +229,8 @@ + goto err_dl_unreg; + } + ++ devlink_port_attrs_set(&bp->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL, ++ bp->pf.port_id, false, 0); + rc = devlink_port_register(dl, &bp->dl_port, bp->pf.port_id); + if (rc) { + netdev_err(bp->dev, "devlink_port_register failed"); diff --git a/SOURCES/0006-netdrv-bnxt-call-devlink_port_type_eth_set-before-po.patch b/SOURCES/0006-netdrv-bnxt-call-devlink_port_type_eth_set-before-po.patch new file mode 100644 index 0000000..e7678d3 --- /dev/null +++ b/SOURCES/0006-netdrv-bnxt-call-devlink_port_type_eth_set-before-po.patch @@ -0,0 +1,58 @@ +From 01c377f7da9b3c4c36cc9f764e0d133aab619e64 Mon Sep 17 00:00:00 2001 +From: Petr Oros +Date: Thu, 5 Sep 2019 10:01:02 -0400 +Subject: [PATCH 06/96] [netdrv] bnxt: call devlink_port_type_eth_set() before + port register + +Message-id: +Patchwork-id: 270943 +O-Subject: [RHEL8.2 net PATCH 06/15] bnxt: call devlink_port_type_eth_set() before port register +Bugzilla: 1737133 +RH-Acked-by: Jonathan Toppins +RH-Acked-by: Neil Horman +RH-Acked-by: John Linville +RH-Acked-by: Ivan Vecera + +Bugzilla: http://bugzilla.redhat.com/show_bug.cgi?id=1737133 + +Upstream commit(s): +commit c3f10cbcaa3d5e1980733c3ccd0261df426412d2 +Author: Jiri Pirko +Date: Sun Mar 24 11:14:28 2019 +0100 + + bnxt: call devlink_port_type_eth_set() before port register + + Call devlink_port_type_eth_set() before devlink_port_register(). Bnxt + instances won't change type during lifetime. This avoids one extra + userspace devlink notification. + + Signed-off-by: Jiri Pirko + Signed-off-by: David S. Miller + +Signed-off-by: Petr Oros +Signed-off-by: Timothy Redaelli +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:11.535551475 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:11.657550355 +0100 +@@ -229,6 +229,7 @@ + goto err_dl_unreg; + } + ++ devlink_port_type_eth_set(&bp->dl_port, bp->dev); + devlink_port_attrs_set(&bp->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL, + bp->pf.port_id, false, 0); + rc = devlink_port_register(dl, &bp->dl_port, bp->pf.port_id); +@@ -236,7 +237,6 @@ + netdev_err(bp->dev, "devlink_port_register failed"); + goto err_dl_param_unreg; + } +- devlink_port_type_eth_set(&bp->dl_port, bp->dev); + + rc = devlink_port_params_register(&bp->dl_port, bnxt_dl_port_params, + ARRAY_SIZE(bnxt_dl_port_params)); diff --git a/SOURCES/0007-netdrv-bnxt-set-devlink-port-type-after-registration.patch b/SOURCES/0007-netdrv-bnxt-set-devlink-port-type-after-registration.patch new file mode 100644 index 0000000..018a8da --- /dev/null +++ b/SOURCES/0007-netdrv-bnxt-set-devlink-port-type-after-registration.patch @@ -0,0 +1,55 @@ +From ca0762826bab5d15667f3d513d4a1f2ee9d1a72c Mon Sep 17 00:00:00 2001 +From: Petr Oros +Date: Thu, 5 Sep 2019 10:01:03 -0400 +Subject: [PATCH 07/96] [netdrv] bnxt: set devlink port type after registration + +Message-id: <827b45ca798f38bebb40d7a4adf079df0506cb08.1567595345.git.poros@redhat.com> +Patchwork-id: 270941 +O-Subject: [RHEL8.2 net PATCH 07/15] bnxt: set devlink port type after registration +Bugzilla: 1737133 +RH-Acked-by: Jonathan Toppins +RH-Acked-by: Neil Horman +RH-Acked-by: John Linville +RH-Acked-by: Ivan Vecera + +Bugzilla: http://bugzilla.redhat.com/show_bug.cgi?id=1737133 + +Upstream commit(s): +commit d0d54e8c359399a8d07656779d5b6ddae68ef3c7 +Author: Jiri Pirko +Date: Sun Mar 24 11:14:35 2019 +0100 + + bnxt: set devlink port type after registration + + Move the type set of devlink port after it is registered. + + Signed-off-by: Jiri Pirko + Signed-off-by: David S. Miller + +Signed-off-by: Petr Oros +Signed-off-by: Timothy Redaelli +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:11.657550355 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:11.781549217 +0100 +@@ -229,7 +229,6 @@ + goto err_dl_unreg; + } + +- devlink_port_type_eth_set(&bp->dl_port, bp->dev); + devlink_port_attrs_set(&bp->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL, + bp->pf.port_id, false, 0); + rc = devlink_port_register(dl, &bp->dl_port, bp->pf.port_id); +@@ -237,6 +236,7 @@ + netdev_err(bp->dev, "devlink_port_register failed"); + goto err_dl_param_unreg; + } ++ devlink_port_type_eth_set(&bp->dl_port, bp->dev); + + rc = devlink_port_params_register(&bp->dl_port, bnxt_dl_port_params, + ARRAY_SIZE(bnxt_dl_port_params)); diff --git a/SOURCES/0009-netdrv-bnx2x-Mark-expected-switch-fall-throughs.patch b/SOURCES/0009-netdrv-bnx2x-Mark-expected-switch-fall-throughs.patch new file mode 100644 index 0000000..7baaaee --- /dev/null +++ b/SOURCES/0009-netdrv-bnx2x-Mark-expected-switch-fall-throughs.patch @@ -0,0 +1,40 @@ +From 2882c017dd9e20a2ee60be54b9f2526f546b8ede Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:23 -0400 +Subject: [PATCH 09/96] [netdrv] bnx2x: Mark expected switch fall-throughs + +Message-id: <1206ba4b35133e848acd993afd66d271c4fc1e9b.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276427 +O-Subject: [RHEL-8.2 PATCH 01/78] bnx2x: Mark expected switch fall-throughs +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +In preparation to enabling -Wimplicit-fallthrough, mark switch cases +where we are expecting to fall through. + +Signed-off-by: Gustavo A. R. Silva +Signed-off-by: David S. Miller +(cherry picked from commit 83607344d667315687e1a5ddd2ad2fbbff22cc43) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:10.933557001 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:11.904548088 +0100 +@@ -1793,7 +1793,7 @@ + speed); + } + set_bit(BNXT_LINK_SPEED_CHNG_SP_EVENT, &bp->sp_event); +- /* fall thru */ ++ /* fall through */ + } + case ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE: + set_bit(BNXT_LINK_CHNG_SP_EVENT, &bp->sp_event); diff --git a/SOURCES/0010-netdrv-bnx2x-Mark-expected-switch-fall-thoughs.patch b/SOURCES/0010-netdrv-bnx2x-Mark-expected-switch-fall-thoughs.patch new file mode 100644 index 0000000..417477f --- /dev/null +++ b/SOURCES/0010-netdrv-bnx2x-Mark-expected-switch-fall-thoughs.patch @@ -0,0 +1,42 @@ +From ee4e5bb0fce41914bc6f43193cdd5b509112c6f3 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:24 -0400 +Subject: [PATCH 10/96] [netdrv] bnx2x: Mark expected switch fall-thoughs + +Message-id: <3f7032881cc02b243f65b2143256790bc0038133.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276428 +O-Subject: [RHEL-8.2 PATCH 02/78] bnx2x: Mark expected switch fall-thoughs +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +In preparation to enabling -Wimplicit-fallthrough, mark switch cases +where we are expecting to fall through. + +Addresses-Coverity-ID: 114878 ("Missing break in switch") +Signed-off-by: Gustavo A. R. Silva +Signed-off-by: David S. Miller +(cherry picked from commit bc171e87a7e29a41b119fdfccd378f7179b39c23) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:11.904548088 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.026546968 +0100 +@@ -1793,8 +1793,8 @@ + speed); + } + set_bit(BNXT_LINK_SPEED_CHNG_SP_EVENT, &bp->sp_event); +- /* fall through */ + } ++ /* fall through */ + case ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE: + set_bit(BNXT_LINK_CHNG_SP_EVENT, &bp->sp_event); + break; diff --git a/SOURCES/0011-netdrv-bnxt_en-Fix-firmware-signaled-resource-change.patch b/SOURCES/0011-netdrv-bnxt_en-Fix-firmware-signaled-resource-change.patch new file mode 100644 index 0000000..8ed2706 --- /dev/null +++ b/SOURCES/0011-netdrv-bnxt_en-Fix-firmware-signaled-resource-change.patch @@ -0,0 +1,75 @@ +From 7df147aa7b593a55576767db4c79d78340d023d5 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:25 -0400 +Subject: [PATCH 11/96] [netdrv] bnxt_en: Fix firmware signaled resource change + logic in open + +Message-id: <8409cf4642a734f8fd0a2bb94d320794dd5c9a1d.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276429 +O-Subject: [RHEL-8.2 PATCH 03/78] bnxt_en: Fix firmware signaled resource change logic in open. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +When the driver detects that resources have changed during open, it +should reset the rx and tx rings to 0. This will properly setup the +init sequence to initialize the default rings again. We also need +to signal the RDMA driver to stop and clear its interrupts. We then +call the RoCE driver to restart if a new set of default rings is +successfully reserved. + +Fixes: 25e1acd6b92b ("bnxt_en: Notify firmware about IF state changes.") +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 6b95c3e9697254dab0c8eafc6ab9d5e10d2eca4e) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.026546968 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.151545820 +0100 +@@ -8155,6 +8155,8 @@ + hw_resc->resv_rx_rings = 0; + hw_resc->resv_hw_ring_grps = 0; + hw_resc->resv_vnics = 0; ++ bp->tx_nr_rings = 0; ++ bp->rx_nr_rings = 0; + } + return rc; + } +@@ -10409,20 +10411,25 @@ + if (bp->tx_nr_rings) + return 0; + ++ bnxt_ulp_irq_stop(bp); ++ bnxt_clear_int_mode(bp); + rc = bnxt_set_dflt_rings(bp, true); + if (rc) { + netdev_err(bp->dev, "Not enough rings available.\n"); +- return rc; ++ goto init_dflt_ring_err; + } + rc = bnxt_init_int_mode(bp); + if (rc) +- return rc; ++ goto init_dflt_ring_err; ++ + bp->tx_nr_rings_per_tc = bp->tx_nr_rings; + if (bnxt_rfs_supported(bp) && bnxt_rfs_capable(bp)) { + bp->flags |= BNXT_FLAG_RFS; + bp->dev->features |= NETIF_F_NTUPLE; + } +- return 0; ++init_dflt_ring_err: ++ bnxt_ulp_irq_restart(bp, rc); ++ return rc; + } + + int bnxt_restore_pf_fw_resources(struct bnxt *bp) diff --git a/SOURCES/0012-netdrv-cross-tree-phase-out-dma_zalloc_coherent.patch b/SOURCES/0012-netdrv-cross-tree-phase-out-dma_zalloc_coherent.patch new file mode 100644 index 0000000..495b725 --- /dev/null +++ b/SOURCES/0012-netdrv-cross-tree-phase-out-dma_zalloc_coherent.patch @@ -0,0 +1,108 @@ +From 10271656a2cca09a8fc023e78559156fb0659583 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:26 -0400 +Subject: [PATCH 12/96] [netdrv] cross-tree: phase out dma_zalloc_coherent() + +Message-id: <239a788461171e2df3655e35be52674e381012f6.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276430 +O-Subject: [RHEL-8.2 PATCH 04/78] cross-tree: phase out dma_zalloc_coherent() +Bugzilla: 1724766 +RH-Acked-by: Don Dutile +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +We already need to zero out memory for dma_alloc_coherent(), as such +using dma_zalloc_coherent() is superflous. Phase it out. + +This change was generated with the following Coccinelle SmPL patch: + +@ replace_dma_zalloc_coherent @ +expression dev, size, data, handle, flags; +@@ + +-dma_zalloc_coherent(dev, size, handle, flags) ++dma_alloc_coherent(dev, size, handle, flags) + +Suggested-by: Christoph Hellwig +Signed-off-by: Luis Chamberlain +[hch: re-ran the script on the latest tree] +Signed-off-by: Christoph Hellwig +(cherry picked from commit 750afb08ca71310fcf0c4e2cb1565c63b8235b60) + +Note: only applied bnxt_en/bnxt_re applicable hunks. +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping + +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 16 ++++++++-------- + drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c | 4 ++-- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 4 ++-- + 3 files changed, 12 insertions(+), 12 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.151545820 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.276544673 +0100 +@@ -3476,10 +3476,10 @@ + goto alloc_tx_ext_stats; + + bp->hw_rx_port_stats_ext = +- dma_zalloc_coherent(&pdev->dev, +- sizeof(struct rx_port_stats_ext), +- &bp->hw_rx_port_stats_ext_map, +- GFP_KERNEL); ++ dma_alloc_coherent(&pdev->dev, ++ sizeof(struct rx_port_stats_ext), ++ &bp->hw_rx_port_stats_ext_map, ++ GFP_KERNEL); + if (!bp->hw_rx_port_stats_ext) + return 0; + +@@ -3489,10 +3489,10 @@ + + if (bp->hwrm_spec_code >= 0x10902) { + bp->hw_tx_port_stats_ext = +- dma_zalloc_coherent(&pdev->dev, +- sizeof(struct tx_port_stats_ext), +- &bp->hw_tx_port_stats_ext_map, +- GFP_KERNEL); ++ dma_alloc_coherent(&pdev->dev, ++ sizeof(struct tx_port_stats_ext), ++ &bp->hw_tx_port_stats_ext_map, ++ GFP_KERNEL); + } + bp->flags |= BNXT_FLAG_PORT_STATS_EXT; + } +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c 2020-02-06 16:22:57.132683682 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c 2020-02-06 16:23:12.277544664 +0100 +@@ -316,8 +316,8 @@ + + n = IEEE_8021QAZ_MAX_TCS; + data_len = sizeof(*data) + sizeof(*fw_app) * n; +- data = dma_zalloc_coherent(&bp->pdev->dev, data_len, &mapping, +- GFP_KERNEL); ++ data = dma_alloc_coherent(&bp->pdev->dev, data_len, &mapping, ++ GFP_KERNEL); + if (!data) + return -ENOMEM; + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:11.781549217 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:12.277544664 +0100 +@@ -86,8 +86,8 @@ + return -EFAULT; + } + +- data_addr = dma_zalloc_coherent(&bp->pdev->dev, bytesize, +- &data_dma_addr, GFP_KERNEL); ++ data_addr = dma_alloc_coherent(&bp->pdev->dev, bytesize, ++ &data_dma_addr, GFP_KERNEL); + if (!data_addr) + return -ENOMEM; + diff --git a/SOURCES/0013-netdrv-bnxt-Implement-ndo_get_port_parent_id.patch b/SOURCES/0013-netdrv-bnxt-Implement-ndo_get_port_parent_id.patch new file mode 100644 index 0000000..43d15d3 --- /dev/null +++ b/SOURCES/0013-netdrv-bnxt-Implement-ndo_get_port_parent_id.patch @@ -0,0 +1,180 @@ +From 25caba1a0368d1af60c0ee2e817d36a0d97e05e1 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:27 -0400 +Subject: [PATCH 13/96] [netdrv] bnxt: Implement ndo_get_port_parent_id() + +Message-id: <610919f3c6de0c97b6b178b7f643f6c81a2de24a.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276436 +O-Subject: [RHEL-8.2 PATCH 05/78] bnxt: Implement ndo_get_port_parent_id() +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +BNXT only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID, which makes it a +great candidate to be converted to use the ndo_get_port_parent_id() NDO +instead of implementing switchdev_port_attr_get(). The conversion is +straight forward here since the PF and VF code use the same getter. + +Since bnxt makes uses of switchdev_port_same_parent_id() convert it to +use netdev_port_same_parent_id(). + +Acked-by: Jiri Pirko +Signed-off-by: Florian Fainelli +Signed-off-by: David S. Miller +(cherry picked from commit 52d5254a2d045bba2a744042319c64e1fe41b5c8) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 28 ++++++++------------------- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 4 ++-- + drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c | 2 +- + drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c | 12 ++++-------- + 4 files changed, 15 insertions(+), 31 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.276544673 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.414543406 +0100 +@@ -10099,8 +10099,11 @@ + return 0; + } + +-int bnxt_port_attr_get(struct bnxt *bp, struct switchdev_attr *attr) ++int bnxt_get_port_parent_id(struct net_device *dev, ++ struct netdev_phys_item_id *ppid) + { ++ struct bnxt *bp = netdev_priv(dev); ++ + if (bp->eswitch_mode != DEVLINK_ESWITCH_MODE_SWITCHDEV) + return -EOPNOTSUPP; + +@@ -10108,27 +10111,12 @@ + if (!BNXT_PF(bp)) + return -EOPNOTSUPP; + +- switch (attr->id) { +- case SWITCHDEV_ATTR_ID_PORT_PARENT_ID: +- attr->u.ppid.id_len = sizeof(bp->switch_id); +- memcpy(attr->u.ppid.id, bp->switch_id, attr->u.ppid.id_len); +- break; +- default: +- return -EOPNOTSUPP; +- } +- return 0; +-} ++ ppid->id_len = sizeof(bp->switch_id); ++ memcpy(ppid->id, bp->switch_id, ppid->id_len); + +-static int bnxt_swdev_port_attr_get(struct net_device *dev, +- struct switchdev_attr *attr) +-{ +- return bnxt_port_attr_get(netdev_priv(dev), attr); ++ return 0; + } + +-static const struct switchdev_ops bnxt_switchdev_ops = { +- .switchdev_port_attr_get = bnxt_swdev_port_attr_get +-}; +- + static const struct net_device_ops bnxt_netdev_ops = { + .ndo_open = bnxt_open, + .ndo_start_xmit = bnxt_start_xmit, +@@ -10160,6 +10148,7 @@ + .ndo_bpf = bnxt_xdp, + .ndo_bridge_getlink = bnxt_bridge_getlink, + .ndo_bridge_setlink = bnxt_bridge_setlink, ++ .ndo_get_port_parent_id = bnxt_get_port_parent_id, + .ndo_get_phys_port_name = bnxt_get_phys_port_name + }; + +@@ -10518,7 +10507,6 @@ + dev->netdev_ops = &bnxt_netdev_ops; + dev->watchdog_timeo = BNXT_TX_TIMEOUT; + dev->ethtool_ops = &bnxt_ethtool_ops; +- SWITCHDEV_SET_OPS(dev, &bnxt_switchdev_ops); + pci_set_drvdata(pdev, dev); + + rc = bnxt_alloc_hwrm_resources(bp); +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:11.133555165 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:12.415543397 +0100 +@@ -23,7 +23,6 @@ + #include + #include + #include +-#include + #include + #include + +@@ -1799,7 +1798,8 @@ + int bnxt_setup_mq_tc(struct net_device *dev, u8 tc); + int bnxt_get_max_rings(struct bnxt *, int *, int *, bool); + int bnxt_restore_pf_fw_resources(struct bnxt *bp); +-int bnxt_port_attr_get(struct bnxt *bp, struct switchdev_attr *attr); ++int bnxt_get_port_parent_id(struct net_device *dev, ++ struct netdev_phys_item_id *ppid); + void bnxt_dim_work(struct work_struct *work); + int bnxt_hwrm_set_ring_coal(struct bnxt *bp, struct bnxt_napi *bnapi); + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c 2020-02-06 16:22:57.079684168 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c 2020-02-06 16:23:12.415543397 +0100 +@@ -45,7 +45,7 @@ + struct bnxt *bp; + + /* check if dev belongs to the same switch */ +- if (!switchdev_port_same_parent_id(pf_bp->dev, dev)) { ++ if (!netdev_port_same_parent_id(pf_bp->dev, dev)) { + netdev_info(pf_bp->dev, "dev(ifindex=%d) not on same switch", + dev->ifindex); + return BNXT_FID_INVALID; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c 2020-02-06 16:22:57.079684168 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c 2020-02-06 16:23:12.415543397 +0100 +@@ -237,21 +237,17 @@ + strlcpy(info->version, DRV_MODULE_VERSION, sizeof(info->version)); + } + +-static int bnxt_vf_rep_port_attr_get(struct net_device *dev, +- struct switchdev_attr *attr) ++static int bnxt_vf_rep_get_port_parent_id(struct net_device *dev, ++ struct netdev_phys_item_id *ppid) + { + struct bnxt_vf_rep *vf_rep = netdev_priv(dev); + + /* as only PORT_PARENT_ID is supported currently use common code + * between PF and VF-rep for now. + */ +- return bnxt_port_attr_get(vf_rep->bp, attr); ++ return bnxt_get_port_parent_id(vf_rep->bp->dev, ppid); + } + +-static const struct switchdev_ops bnxt_vf_rep_switchdev_ops = { +- .switchdev_port_attr_get = bnxt_vf_rep_port_attr_get +-}; +- + static const struct ethtool_ops bnxt_vf_rep_ethtool_ops = { + .get_drvinfo = bnxt_vf_rep_get_drvinfo + }; +@@ -262,6 +258,7 @@ + .ndo_start_xmit = bnxt_vf_rep_xmit, + .ndo_get_stats64 = bnxt_vf_rep_get_stats64, + .ndo_setup_tc = bnxt_vf_rep_setup_tc, ++ .ndo_get_port_parent_id = bnxt_vf_rep_get_port_parent_id, + .ndo_get_phys_port_name = bnxt_vf_rep_get_phys_port_name + }; + +@@ -392,7 +389,6 @@ + + dev->netdev_ops = &bnxt_vf_rep_netdev_ops; + dev->ethtool_ops = &bnxt_vf_rep_ethtool_ops; +- SWITCHDEV_SET_OPS(dev, &bnxt_vf_rep_switchdev_ops); + /* Just inherit all the featues of the parent PF as the VF-R + * uses the RX/TX rings of the parent PF + */ diff --git a/SOURCES/0016-netdrv-bnxt-move-bp-switch_id-initialization-to-PF-p.patch b/SOURCES/0016-netdrv-bnxt-move-bp-switch_id-initialization-to-PF-p.patch new file mode 100644 index 0000000..465e69c --- /dev/null +++ b/SOURCES/0016-netdrv-bnxt-move-bp-switch_id-initialization-to-PF-p.patch @@ -0,0 +1,117 @@ +From 1271da6fd65bb6129a99946546cdd8e1f9e69e2d Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:30 -0400 +Subject: [PATCH 16/96] [netdrv] bnxt: move bp->switch_id initialization to PF + probe + +Message-id: +Patchwork-id: 276431 +O-Subject: [RHEL-8.2 PATCH 08/78] bnxt: move bp->switch_id initialization to PF probe +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Currently the switch_id is being only initialized when switching eswitch +mode from "legacy" to "switchdev". However, nothing prevents the id to +be initialized from the very beginning. Physical ports can show it even +in "legacy" mode. + +Signed-off-by: Jiri Pirko +Signed-off-by: David S. Miller +(cherry picked from commit 03213a996531e507e03c085d411a313e34357498) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 25 +++++++++++++++++++++++++ + drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c | 25 ------------------------- + 2 files changed, 25 insertions(+), 25 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.414543406 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.563542039 +0100 +@@ -10473,6 +10473,26 @@ + return rc; + } + ++static int bnxt_pcie_dsn_get(struct bnxt *bp, u8 dsn[]) ++{ ++ struct pci_dev *pdev = bp->pdev; ++ int pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_DSN); ++ u32 dw; ++ ++ if (!pos) { ++ netdev_info(bp->dev, "Unable do read adapter's DSN"); ++ return -EOPNOTSUPP; ++ } ++ ++ /* DSN (two dw) is at an offset of 4 from the cap pos */ ++ pos += 4; ++ pci_read_config_dword(pdev, pos, &dw); ++ put_unaligned_le32(dw, &dsn[0]); ++ pci_read_config_dword(pdev, pos + 4, &dw); ++ put_unaligned_le32(dw, &dsn[4]); ++ return 0; ++} ++ + static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + { + static int version_printed; +@@ -10613,6 +10633,11 @@ + goto init_err_pci_clean; + } + ++ /* Read the adapter's DSN to use as the eswitch switch_id */ ++ rc = bnxt_pcie_dsn_get(bp, bp->switch_id); ++ if (rc) ++ goto init_err_pci_clean; ++ + bnxt_hwrm_func_qcfg(bp); + bnxt_hwrm_vnic_qcaps(bp); + bnxt_hwrm_port_led_qcaps(bp); +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c 2020-02-06 16:23:12.415543397 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c 2020-02-06 16:23:12.563542039 +0100 +@@ -406,26 +406,6 @@ + dev->min_mtu = ETH_ZLEN; + } + +-static int bnxt_pcie_dsn_get(struct bnxt *bp, u8 dsn[]) +-{ +- struct pci_dev *pdev = bp->pdev; +- int pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_DSN); +- u32 dw; +- +- if (!pos) { +- netdev_info(bp->dev, "Unable do read adapter's DSN"); +- return -EOPNOTSUPP; +- } +- +- /* DSN (two dw) is at an offset of 4 from the cap pos */ +- pos += 4; +- pci_read_config_dword(pdev, pos, &dw); +- put_unaligned_le32(dw, &dsn[0]); +- pci_read_config_dword(pdev, pos + 4, &dw); +- put_unaligned_le32(dw, &dsn[4]); +- return 0; +-} +- + static int bnxt_vf_reps_create(struct bnxt *bp) + { + u16 *cfa_code_map = NULL, num_vfs = pci_num_vf(bp->pdev); +@@ -490,11 +470,6 @@ + } + } + +- /* Read the adapter's DSN to use as the eswitch switch_id */ +- rc = bnxt_pcie_dsn_get(bp, bp->switch_id); +- if (rc) +- goto err; +- + /* publish cfa_code_map only after all VF-reps have been initialized */ + bp->cfa_code_map = cfa_code_map; + bp->eswitch_mode = DEVLINK_ESWITCH_MODE_SWITCHDEV; diff --git a/SOURCES/0018-netdrv-bnxt_en-Update-firmware-interface-to-1.10.0.6.patch b/SOURCES/0018-netdrv-bnxt_en-Update-firmware-interface-to-1.10.0.6.patch new file mode 100644 index 0000000..f9ac3dd --- /dev/null +++ b/SOURCES/0018-netdrv-bnxt_en-Update-firmware-interface-to-1.10.0.6.patch @@ -0,0 +1,616 @@ +From 4eb7ff7cec3438c66789730caff4d5aa683f6172 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:33 -0400 +Subject: [PATCH 18/96] [netdrv] bnxt_en: Update firmware interface to + 1.10.0.69 + +Message-id: +Patchwork-id: 276437 +O-Subject: [RHEL-8.2 PATCH 11/78] bnxt_en: Update firmware interface to 1.10.0.69. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +PTP API updates for 57500 chips, new RX port stats counters and other +miscellaneous updates. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 4a50ddc2d2ea81d3fcbfbe05657d73ac9a9655fd) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 4 + + drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h | 263 +++++++++++++++++----- + 2 files changed, 214 insertions(+), 53 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:22:56.973685141 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:12.694540836 +0100 +@@ -345,6 +345,10 @@ + BNXT_RX_STATS_EXT_ENTRY(resume_roce_pause_events), + BNXT_RX_STATS_EXT_COS_ENTRIES, + BNXT_RX_STATS_EXT_PFC_ENTRIES, ++ BNXT_RX_STATS_EXT_ENTRY(rx_bits), ++ BNXT_RX_STATS_EXT_ENTRY(rx_buffer_passed_threshold), ++ BNXT_RX_STATS_EXT_ENTRY(rx_pcs_symbol_err), ++ BNXT_RX_STATS_EXT_ENTRY(rx_corrected_bits), + }; + + static const struct { +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h 2020-02-06 16:22:56.973685141 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h 2020-02-06 16:23:12.696540818 +0100 +@@ -89,7 +89,10 @@ + __le16 signature; + #define SHORT_REQ_SIGNATURE_SHORT_CMD 0x4321UL + #define SHORT_REQ_SIGNATURE_LAST SHORT_REQ_SIGNATURE_SHORT_CMD +- __le16 unused_0; ++ __le16 target_id; ++ #define SHORT_REQ_TARGET_ID_DEFAULT 0x0UL ++ #define SHORT_REQ_TARGET_ID_TOOLS 0xfffdUL ++ #define SHORT_REQ_TARGET_ID_LAST SHORT_REQ_TARGET_ID_TOOLS + __le16 size; + __le64 req_addr; + }; +@@ -211,6 +214,7 @@ + #define HWRM_FWD_RESP 0xd2UL + #define HWRM_FWD_ASYNC_EVENT_CMPL 0xd3UL + #define HWRM_OEM_CMD 0xd4UL ++ #define HWRM_PORT_PRBS_TEST 0xd5UL + #define HWRM_TEMP_MONITOR_QUERY 0xe0UL + #define HWRM_WOL_FILTER_ALLOC 0xf0UL + #define HWRM_WOL_FILTER_FREE 0xf1UL +@@ -262,6 +266,7 @@ + #define HWRM_CFA_EEM_QCFG 0x122UL + #define HWRM_CFA_EEM_OP 0x123UL + #define HWRM_CFA_ADV_FLOW_MGNT_QCAPS 0x124UL ++ #define HWRM_CFA_TFLIB 0x125UL + #define HWRM_ENGINE_CKV_HELLO 0x12dUL + #define HWRM_ENGINE_CKV_STATUS 0x12eUL + #define HWRM_ENGINE_CKV_CKEK_ADD 0x12fUL +@@ -272,6 +277,7 @@ + #define HWRM_ENGINE_CKV_RNG_GET 0x134UL + #define HWRM_ENGINE_CKV_KEY_GEN 0x135UL + #define HWRM_ENGINE_CKV_KEY_LABEL_CFG 0x136UL ++ #define HWRM_ENGINE_CKV_KEY_LABEL_QCFG 0x137UL + #define HWRM_ENGINE_QG_CONFIG_QUERY 0x13cUL + #define HWRM_ENGINE_QG_QUERY 0x13dUL + #define HWRM_ENGINE_QG_METER_PROFILE_CONFIG_QUERY 0x13eUL +@@ -312,6 +318,11 @@ + #define HWRM_SELFTEST_IRQ 0x202UL + #define HWRM_SELFTEST_RETRIEVE_SERDES_DATA 0x203UL + #define HWRM_PCIE_QSTATS 0x204UL ++ #define HWRM_MFG_FRU_WRITE_CONTROL 0x205UL ++ #define HWRM_MFG_TIMERS_QUERY 0x206UL ++ #define HWRM_MFG_OTP_CFG 0x207UL ++ #define HWRM_MFG_OTP_QCFG 0x208UL ++ #define HWRM_MFG_HDMA_TEST 0x209UL + #define HWRM_DBG_READ_DIRECT 0xff10UL + #define HWRM_DBG_READ_INDIRECT 0xff11UL + #define HWRM_DBG_WRITE_DIRECT 0xff12UL +@@ -325,6 +336,8 @@ + #define HWRM_DBG_FW_CLI 0xff1aUL + #define HWRM_DBG_I2C_CMD 0xff1bUL + #define HWRM_DBG_RING_INFO_GET 0xff1cUL ++ #define HWRM_DBG_CRASHDUMP_HEADER 0xff1dUL ++ #define HWRM_DBG_CRASHDUMP_ERASE 0xff1eUL + #define HWRM_NVM_FACTORY_DEFAULTS 0xffeeUL + #define HWRM_NVM_VALIDATE_OPTION 0xffefUL + #define HWRM_NVM_FLUSH 0xfff0UL +@@ -350,23 +363,26 @@ + /* ret_codes (size:64b/8B) */ + struct ret_codes { + __le16 error_code; +- #define HWRM_ERR_CODE_SUCCESS 0x0UL +- #define HWRM_ERR_CODE_FAIL 0x1UL +- #define HWRM_ERR_CODE_INVALID_PARAMS 0x2UL +- #define HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED 0x3UL +- #define HWRM_ERR_CODE_RESOURCE_ALLOC_ERROR 0x4UL +- #define HWRM_ERR_CODE_INVALID_FLAGS 0x5UL +- #define HWRM_ERR_CODE_INVALID_ENABLES 0x6UL +- #define HWRM_ERR_CODE_UNSUPPORTED_TLV 0x7UL +- #define HWRM_ERR_CODE_NO_BUFFER 0x8UL +- #define HWRM_ERR_CODE_UNSUPPORTED_OPTION_ERR 0x9UL +- #define HWRM_ERR_CODE_HOT_RESET_PROGRESS 0xaUL +- #define HWRM_ERR_CODE_HOT_RESET_FAIL 0xbUL +- #define HWRM_ERR_CODE_HWRM_ERROR 0xfUL +- #define HWRM_ERR_CODE_TLV_ENCAPSULATED_RESPONSE 0x8000UL +- #define HWRM_ERR_CODE_UNKNOWN_ERR 0xfffeUL +- #define HWRM_ERR_CODE_CMD_NOT_SUPPORTED 0xffffUL +- #define HWRM_ERR_CODE_LAST HWRM_ERR_CODE_CMD_NOT_SUPPORTED ++ #define HWRM_ERR_CODE_SUCCESS 0x0UL ++ #define HWRM_ERR_CODE_FAIL 0x1UL ++ #define HWRM_ERR_CODE_INVALID_PARAMS 0x2UL ++ #define HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED 0x3UL ++ #define HWRM_ERR_CODE_RESOURCE_ALLOC_ERROR 0x4UL ++ #define HWRM_ERR_CODE_INVALID_FLAGS 0x5UL ++ #define HWRM_ERR_CODE_INVALID_ENABLES 0x6UL ++ #define HWRM_ERR_CODE_UNSUPPORTED_TLV 0x7UL ++ #define HWRM_ERR_CODE_NO_BUFFER 0x8UL ++ #define HWRM_ERR_CODE_UNSUPPORTED_OPTION_ERR 0x9UL ++ #define HWRM_ERR_CODE_HOT_RESET_PROGRESS 0xaUL ++ #define HWRM_ERR_CODE_HOT_RESET_FAIL 0xbUL ++ #define HWRM_ERR_CODE_NO_FLOW_COUNTER_DURING_ALLOC 0xcUL ++ #define HWRM_ERR_CODE_KEY_HASH_COLLISION 0xdUL ++ #define HWRM_ERR_CODE_KEY_ALREADY_EXISTS 0xeUL ++ #define HWRM_ERR_CODE_HWRM_ERROR 0xfUL ++ #define HWRM_ERR_CODE_TLV_ENCAPSULATED_RESPONSE 0x8000UL ++ #define HWRM_ERR_CODE_UNKNOWN_ERR 0xfffeUL ++ #define HWRM_ERR_CODE_CMD_NOT_SUPPORTED 0xffffUL ++ #define HWRM_ERR_CODE_LAST HWRM_ERR_CODE_CMD_NOT_SUPPORTED + __le16 unused_0[3]; + }; + +@@ -387,11 +403,15 @@ + #define HW_HASH_INDEX_SIZE 0x80 + #define HW_HASH_KEY_SIZE 40 + #define HWRM_RESP_VALID_KEY 1 ++#define HWRM_TARGET_ID_BONO 0xFFF8 ++#define HWRM_TARGET_ID_KONG 0xFFF9 ++#define HWRM_TARGET_ID_APE 0xFFFA ++#define HWRM_TARGET_ID_TOOLS 0xFFFD + #define HWRM_VERSION_MAJOR 1 + #define HWRM_VERSION_MINOR 10 + #define HWRM_VERSION_UPDATE 0 +-#define HWRM_VERSION_RSVD 47 +-#define HWRM_VERSION_STR "1.10.0.47" ++#define HWRM_VERSION_RSVD 69 ++#define HWRM_VERSION_STR "1.10.0.69" + + /* hwrm_ver_get_input (size:192b/24B) */ + struct hwrm_ver_get_input { +@@ -442,6 +462,7 @@ + #define VER_GET_RESP_DEV_CAPS_CFG_ADV_FLOW_COUNTERS_SUPPORTED 0x400UL + #define VER_GET_RESP_DEV_CAPS_CFG_CFA_EEM_SUPPORTED 0x800UL + #define VER_GET_RESP_DEV_CAPS_CFG_CFA_ADV_FLOW_MGNT_SUPPORTED 0x1000UL ++ #define VER_GET_RESP_DEV_CAPS_CFG_CFA_TFLIB_SUPPORTED 0x2000UL + u8 roce_fw_maj_8b; + u8 roce_fw_min_8b; + u8 roce_fw_bld_8b; +@@ -449,7 +470,7 @@ + char hwrm_fw_name[16]; + char mgmt_fw_name[16]; + char netctrl_fw_name[16]; +- u8 reserved2[16]; ++ char active_pkg_name[16]; + char roce_fw_name[16]; + __le16 chip_num; + u8 chip_rev; +@@ -1047,6 +1068,7 @@ + #define FUNC_QCAPS_RESP_FLAGS_DYNAMIC_TX_RING_ALLOC 0x200000UL + #define FUNC_QCAPS_RESP_FLAGS_HOT_RESET_CAPABLE 0x400000UL + #define FUNC_QCAPS_RESP_FLAGS_ERROR_RECOVERY_CAPABLE 0x800000UL ++ #define FUNC_QCAPS_RESP_FLAGS_EXT_STATS_SUPPORTED 0x1000000UL + u8 mac_address[6]; + __le16 max_rsscos_ctx; + __le16 max_cmpl_rings; +@@ -1715,7 +1737,7 @@ + __le16 mrav_entry_size; + __le16 tim_entry_size; + __le32 tim_max_entries; +- u8 unused_0[2]; ++ __le16 mrav_num_entries_units; + u8 tqm_entries_multiple; + u8 valid; + }; +@@ -1728,7 +1750,8 @@ + __le16 target_id; + __le64 resp_addr; + __le32 flags; +- #define FUNC_BACKING_STORE_CFG_REQ_FLAGS_PREBOOT_MODE 0x1UL ++ #define FUNC_BACKING_STORE_CFG_REQ_FLAGS_PREBOOT_MODE 0x1UL ++ #define FUNC_BACKING_STORE_CFG_REQ_FLAGS_MRAV_RESERVATION_SPLIT 0x2UL + __le32 enables; + #define FUNC_BACKING_STORE_CFG_REQ_ENABLES_QP 0x1UL + #define FUNC_BACKING_STORE_CFG_REQ_ENABLES_SRQ 0x2UL +@@ -2580,7 +2603,7 @@ + u8 valid; + }; + +-/* hwrm_port_mac_cfg_input (size:320b/40B) */ ++/* hwrm_port_mac_cfg_input (size:384b/48B) */ + struct hwrm_port_mac_cfg_input { + __le16 req_type; + __le16 cmpl_ring; +@@ -2601,6 +2624,7 @@ + #define PORT_MAC_CFG_REQ_FLAGS_VLAN_PRI2COS_DISABLE 0x400UL + #define PORT_MAC_CFG_REQ_FLAGS_TUNNEL_PRI2COS_DISABLE 0x800UL + #define PORT_MAC_CFG_REQ_FLAGS_IP_DSCP2COS_DISABLE 0x1000UL ++ #define PORT_MAC_CFG_REQ_FLAGS_PTP_ONE_STEP_TX_TS 0x2000UL + __le32 enables; + #define PORT_MAC_CFG_REQ_ENABLES_IPG 0x1UL + #define PORT_MAC_CFG_REQ_ENABLES_LPBK 0x2UL +@@ -2610,6 +2634,7 @@ + #define PORT_MAC_CFG_REQ_ENABLES_RX_TS_CAPTURE_PTP_MSG_TYPE 0x40UL + #define PORT_MAC_CFG_REQ_ENABLES_TX_TS_CAPTURE_PTP_MSG_TYPE 0x80UL + #define PORT_MAC_CFG_REQ_ENABLES_COS_FIELD_CFG 0x100UL ++ #define PORT_MAC_CFG_REQ_ENABLES_PTP_FREQ_ADJ_PPB 0x200UL + __le16 port_id; + u8 ipg; + u8 lpbk; +@@ -2642,6 +2667,8 @@ + #define PORT_MAC_CFG_REQ_COS_FIELD_CFG_DEFAULT_COS_MASK 0xe0UL + #define PORT_MAC_CFG_REQ_COS_FIELD_CFG_DEFAULT_COS_SFT 5 + u8 unused_0[3]; ++ __s32 ptp_freq_adj_ppb; ++ u8 unused_1[4]; + }; + + /* hwrm_port_mac_cfg_output (size:128b/16B) */ +@@ -2680,8 +2707,9 @@ + __le16 seq_id; + __le16 resp_len; + u8 flags; +- #define PORT_MAC_PTP_QCFG_RESP_FLAGS_DIRECT_ACCESS 0x1UL +- #define PORT_MAC_PTP_QCFG_RESP_FLAGS_HWRM_ACCESS 0x2UL ++ #define PORT_MAC_PTP_QCFG_RESP_FLAGS_DIRECT_ACCESS 0x1UL ++ #define PORT_MAC_PTP_QCFG_RESP_FLAGS_HWRM_ACCESS 0x2UL ++ #define PORT_MAC_PTP_QCFG_RESP_FLAGS_ONE_STEP_TX_TS 0x4UL + u8 unused_0[3]; + __le32 rx_ts_reg_off_lower; + __le32 rx_ts_reg_off_upper; +@@ -2888,7 +2916,7 @@ + __le64 pfc_pri7_tx_transitions; + }; + +-/* rx_port_stats_ext (size:2368b/296B) */ ++/* rx_port_stats_ext (size:2624b/328B) */ + struct rx_port_stats_ext { + __le64 link_down_events; + __le64 continuous_pause_events; +@@ -2927,6 +2955,10 @@ + __le64 pfc_pri6_rx_transitions; + __le64 pfc_pri7_rx_duration_us; + __le64 pfc_pri7_rx_transitions; ++ __le64 rx_bits; ++ __le64 rx_buffer_passed_threshold; ++ __le64 rx_pcs_symbol_err; ++ __le64 rx_corrected_bits; + }; + + /* hwrm_port_qstats_ext_input (size:320b/40B) */ +@@ -3029,6 +3061,35 @@ + u8 valid; + }; + ++/* hwrm_port_ts_query_input (size:192b/24B) */ ++struct hwrm_port_ts_query_input { ++ __le16 req_type; ++ __le16 cmpl_ring; ++ __le16 seq_id; ++ __le16 target_id; ++ __le64 resp_addr; ++ __le32 flags; ++ #define PORT_TS_QUERY_REQ_FLAGS_PATH 0x1UL ++ #define PORT_TS_QUERY_REQ_FLAGS_PATH_TX 0x0UL ++ #define PORT_TS_QUERY_REQ_FLAGS_PATH_RX 0x1UL ++ #define PORT_TS_QUERY_REQ_FLAGS_PATH_LAST PORT_TS_QUERY_REQ_FLAGS_PATH_RX ++ #define PORT_TS_QUERY_REQ_FLAGS_CURRENT_TIME 0x2UL ++ __le16 port_id; ++ u8 unused_0[2]; ++}; ++ ++/* hwrm_port_ts_query_output (size:192b/24B) */ ++struct hwrm_port_ts_query_output { ++ __le16 error_code; ++ __le16 req_type; ++ __le16 seq_id; ++ __le16 resp_len; ++ __le64 ptp_msg_ts; ++ __le16 ptp_msg_seqid; ++ u8 unused_0[5]; ++ u8 valid; ++}; ++ + /* hwrm_port_phy_qcaps_input (size:192b/24B) */ + struct hwrm_port_phy_qcaps_input { + __le16 req_type; +@@ -4703,7 +4764,8 @@ + #define VNIC_QCAPS_RESP_FLAGS_RSS_DFLT_CR_CAP 0x20UL + #define VNIC_QCAPS_RESP_FLAGS_ROCE_MIRRORING_CAPABLE_VNIC_CAP 0x40UL + #define VNIC_QCAPS_RESP_FLAGS_OUTERMOST_RSS_CAP 0x80UL +- u8 unused_1[7]; ++ __le16 max_aggs_supported; ++ u8 unused_1[5]; + u8 valid; + }; + +@@ -4723,6 +4785,7 @@ + #define VNIC_TPA_CFG_REQ_FLAGS_AGG_WITH_SAME_GRE_SEQ 0x20UL + #define VNIC_TPA_CFG_REQ_FLAGS_GRO_IPID_CHECK 0x40UL + #define VNIC_TPA_CFG_REQ_FLAGS_GRO_TTL_CHECK 0x80UL ++ #define VNIC_TPA_CFG_REQ_FLAGS_AGG_PACK_AS_GRO 0x100UL + __le32 enables; + #define VNIC_TPA_CFG_REQ_ENABLES_MAX_AGG_SEGS 0x1UL + #define VNIC_TPA_CFG_REQ_ENABLES_MAX_AGGS 0x2UL +@@ -5254,6 +5317,8 @@ + #define CFA_L2_FILTER_ALLOC_REQ_FLAGS_TRAFFIC_L2 (0x1UL << 4) + #define CFA_L2_FILTER_ALLOC_REQ_FLAGS_TRAFFIC_ROCE (0x2UL << 4) + #define CFA_L2_FILTER_ALLOC_REQ_FLAGS_TRAFFIC_LAST CFA_L2_FILTER_ALLOC_REQ_FLAGS_TRAFFIC_ROCE ++ #define CFA_L2_FILTER_ALLOC_REQ_FLAGS_XDP_DISABLE 0x40UL ++ #define CFA_L2_FILTER_ALLOC_REQ_FLAGS_SOURCE_VALID 0x80UL + __le32 enables; + #define CFA_L2_FILTER_ALLOC_REQ_ENABLES_L2_ADDR 0x1UL + #define CFA_L2_FILTER_ALLOC_REQ_ENABLES_L2_ADDR_MASK 0x2UL +@@ -5272,8 +5337,11 @@ + #define CFA_L2_FILTER_ALLOC_REQ_ENABLES_TUNNEL_TYPE 0x4000UL + #define CFA_L2_FILTER_ALLOC_REQ_ENABLES_DST_ID 0x8000UL + #define CFA_L2_FILTER_ALLOC_REQ_ENABLES_MIRROR_VNIC_ID 0x10000UL ++ #define CFA_L2_FILTER_ALLOC_REQ_ENABLES_NUM_VLANS 0x20000UL ++ #define CFA_L2_FILTER_ALLOC_REQ_ENABLES_T_NUM_VLANS 0x40000UL + u8 l2_addr[6]; +- u8 unused_0[2]; ++ u8 num_vlans; ++ u8 t_num_vlans; + u8 l2_addr_mask[6]; + __le16 l2_ovlan; + __le16 l2_ovlan_mask; +@@ -5338,6 +5406,16 @@ + __le16 resp_len; + __le64 l2_filter_id; + __le32 flow_id; ++ #define CFA_L2_FILTER_ALLOC_RESP_FLOW_ID_VALUE_MASK 0x3fffffffUL ++ #define CFA_L2_FILTER_ALLOC_RESP_FLOW_ID_VALUE_SFT 0 ++ #define CFA_L2_FILTER_ALLOC_RESP_FLOW_ID_TYPE 0x40000000UL ++ #define CFA_L2_FILTER_ALLOC_RESP_FLOW_ID_TYPE_INT (0x0UL << 30) ++ #define CFA_L2_FILTER_ALLOC_RESP_FLOW_ID_TYPE_EXT (0x1UL << 30) ++ #define CFA_L2_FILTER_ALLOC_RESP_FLOW_ID_TYPE_LAST CFA_L2_FILTER_ALLOC_RESP_FLOW_ID_TYPE_EXT ++ #define CFA_L2_FILTER_ALLOC_RESP_FLOW_ID_DIR 0x80000000UL ++ #define CFA_L2_FILTER_ALLOC_RESP_FLOW_ID_DIR_RX (0x0UL << 31) ++ #define CFA_L2_FILTER_ALLOC_RESP_FLOW_ID_DIR_TX (0x1UL << 31) ++ #define CFA_L2_FILTER_ALLOC_RESP_FLOW_ID_DIR_LAST CFA_L2_FILTER_ALLOC_RESP_FLOW_ID_DIR_TX + u8 unused_0[3]; + u8 valid; + }; +@@ -5504,6 +5582,16 @@ + __le16 resp_len; + __le64 tunnel_filter_id; + __le32 flow_id; ++ #define CFA_TUNNEL_FILTER_ALLOC_RESP_FLOW_ID_VALUE_MASK 0x3fffffffUL ++ #define CFA_TUNNEL_FILTER_ALLOC_RESP_FLOW_ID_VALUE_SFT 0 ++ #define CFA_TUNNEL_FILTER_ALLOC_RESP_FLOW_ID_TYPE 0x40000000UL ++ #define CFA_TUNNEL_FILTER_ALLOC_RESP_FLOW_ID_TYPE_INT (0x0UL << 30) ++ #define CFA_TUNNEL_FILTER_ALLOC_RESP_FLOW_ID_TYPE_EXT (0x1UL << 30) ++ #define CFA_TUNNEL_FILTER_ALLOC_RESP_FLOW_ID_TYPE_LAST CFA_TUNNEL_FILTER_ALLOC_RESP_FLOW_ID_TYPE_EXT ++ #define CFA_TUNNEL_FILTER_ALLOC_RESP_FLOW_ID_DIR 0x80000000UL ++ #define CFA_TUNNEL_FILTER_ALLOC_RESP_FLOW_ID_DIR_RX (0x0UL << 31) ++ #define CFA_TUNNEL_FILTER_ALLOC_RESP_FLOW_ID_DIR_TX (0x1UL << 31) ++ #define CFA_TUNNEL_FILTER_ALLOC_RESP_FLOW_ID_DIR_LAST CFA_TUNNEL_FILTER_ALLOC_RESP_FLOW_ID_DIR_TX + u8 unused_0[3]; + u8 valid; + }; +@@ -5646,7 +5734,7 @@ + u8 valid; + }; + +-/* hwrm_cfa_ntuple_filter_alloc_input (size:1024b/128B) */ ++/* hwrm_cfa_ntuple_filter_alloc_input (size:1088b/136B) */ + struct hwrm_cfa_ntuple_filter_alloc_input { + __le16 req_type; + __le16 cmpl_ring; +@@ -5678,6 +5766,7 @@ + #define CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_DST_ID 0x10000UL + #define CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_MIRROR_VNIC_ID 0x20000UL + #define CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_DST_MACADDR 0x40000UL ++ #define CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_RFS_RING_TBL_IDX 0x80000UL + __le64 l2_filter_id; + u8 src_macaddr[6]; + __be16 ethertype; +@@ -5725,6 +5814,8 @@ + __be16 dst_port; + __be16 dst_port_mask; + __le64 ntuple_filter_id_hint; ++ __le16 rfs_ring_tbl_idx; ++ u8 unused_0[6]; + }; + + /* hwrm_cfa_ntuple_filter_alloc_output (size:192b/24B) */ +@@ -5735,6 +5826,16 @@ + __le16 resp_len; + __le64 ntuple_filter_id; + __le32 flow_id; ++ #define CFA_NTUPLE_FILTER_ALLOC_RESP_FLOW_ID_VALUE_MASK 0x3fffffffUL ++ #define CFA_NTUPLE_FILTER_ALLOC_RESP_FLOW_ID_VALUE_SFT 0 ++ #define CFA_NTUPLE_FILTER_ALLOC_RESP_FLOW_ID_TYPE 0x40000000UL ++ #define CFA_NTUPLE_FILTER_ALLOC_RESP_FLOW_ID_TYPE_INT (0x0UL << 30) ++ #define CFA_NTUPLE_FILTER_ALLOC_RESP_FLOW_ID_TYPE_EXT (0x1UL << 30) ++ #define CFA_NTUPLE_FILTER_ALLOC_RESP_FLOW_ID_TYPE_LAST CFA_NTUPLE_FILTER_ALLOC_RESP_FLOW_ID_TYPE_EXT ++ #define CFA_NTUPLE_FILTER_ALLOC_RESP_FLOW_ID_DIR 0x80000000UL ++ #define CFA_NTUPLE_FILTER_ALLOC_RESP_FLOW_ID_DIR_RX (0x0UL << 31) ++ #define CFA_NTUPLE_FILTER_ALLOC_RESP_FLOW_ID_DIR_TX (0x1UL << 31) ++ #define CFA_NTUPLE_FILTER_ALLOC_RESP_FLOW_ID_DIR_LAST CFA_NTUPLE_FILTER_ALLOC_RESP_FLOW_ID_DIR_TX + u8 unused_0[3]; + u8 valid; + }; +@@ -5934,19 +6035,20 @@ + __le16 src_fid; + __le32 tunnel_handle; + __le16 action_flags; +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_FWD 0x1UL +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_RECYCLE 0x2UL +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_DROP 0x4UL +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_METER 0x8UL +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_TUNNEL 0x10UL +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_NAT_SRC 0x20UL +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_NAT_DEST 0x40UL +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_NAT_IPV4_ADDRESS 0x80UL +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_L2_HEADER_REWRITE 0x100UL +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_TTL_DECREMENT 0x200UL +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_TUNNEL_IP 0x400UL +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_FLOW_AGING_ENABLED 0x800UL +- #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_PRI_HINT 0x1000UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_FWD 0x1UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_RECYCLE 0x2UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_DROP 0x4UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_METER 0x8UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_TUNNEL 0x10UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_NAT_SRC 0x20UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_NAT_DEST 0x40UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_NAT_IPV4_ADDRESS 0x80UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_L2_HEADER_REWRITE 0x100UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_TTL_DECREMENT 0x200UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_TUNNEL_IP 0x400UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_FLOW_AGING_ENABLED 0x800UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_PRI_HINT 0x1000UL ++ #define CFA_FLOW_ALLOC_REQ_ACTION_FLAGS_NO_FLOW_COUNTER_ALLOC 0x2000UL + __le16 dst_fid; + __be16 l2_rewrite_vlan_tpid; + __be16 l2_rewrite_vlan_tci; +@@ -5997,6 +6099,16 @@ + __le16 flow_handle; + u8 unused_0[2]; + __le32 flow_id; ++ #define CFA_FLOW_ALLOC_RESP_FLOW_ID_VALUE_MASK 0x3fffffffUL ++ #define CFA_FLOW_ALLOC_RESP_FLOW_ID_VALUE_SFT 0 ++ #define CFA_FLOW_ALLOC_RESP_FLOW_ID_TYPE 0x40000000UL ++ #define CFA_FLOW_ALLOC_RESP_FLOW_ID_TYPE_INT (0x0UL << 30) ++ #define CFA_FLOW_ALLOC_RESP_FLOW_ID_TYPE_EXT (0x1UL << 30) ++ #define CFA_FLOW_ALLOC_RESP_FLOW_ID_TYPE_LAST CFA_FLOW_ALLOC_RESP_FLOW_ID_TYPE_EXT ++ #define CFA_FLOW_ALLOC_RESP_FLOW_ID_DIR 0x80000000UL ++ #define CFA_FLOW_ALLOC_RESP_FLOW_ID_DIR_RX (0x0UL << 31) ++ #define CFA_FLOW_ALLOC_RESP_FLOW_ID_DIR_TX (0x1UL << 31) ++ #define CFA_FLOW_ALLOC_RESP_FLOW_ID_DIR_LAST CFA_FLOW_ALLOC_RESP_FLOW_ID_DIR_TX + __le64 ext_flow_handle; + __le32 flow_counter_id; + u8 unused_1[3]; +@@ -6011,7 +6123,8 @@ + __le16 target_id; + __le64 resp_addr; + __le16 flow_handle; +- u8 unused_0[6]; ++ __le16 unused_0; ++ __le32 flow_counter_id; + __le64 ext_flow_handle; + }; + +@@ -6199,8 +6312,10 @@ + __le16 seq_id; + __le16 resp_len; + __le32 flags; +- #define CFA_EEM_QCAPS_RESP_FLAGS_PATH_TX 0x1UL +- #define CFA_EEM_QCAPS_RESP_FLAGS_PATH_RX 0x2UL ++ #define CFA_EEM_QCAPS_RESP_FLAGS_PATH_TX 0x1UL ++ #define CFA_EEM_QCAPS_RESP_FLAGS_PATH_RX 0x2UL ++ #define CFA_EEM_QCAPS_RESP_FLAGS_CENTRALIZED_MEMORY_MODEL_SUPPORTED 0x4UL ++ #define CFA_EEM_QCAPS_RESP_FLAGS_DETACHED_CENTRALIZED_MEMORY_MODEL_SUPPORTED 0x8UL + __le32 unused_0; + __le32 supported; + #define CFA_EEM_QCAPS_RESP_SUPPORTED_KEY0_TABLE 0x1UL +@@ -6226,7 +6341,9 @@ + #define CFA_EEM_CFG_REQ_FLAGS_PATH_TX 0x1UL + #define CFA_EEM_CFG_REQ_FLAGS_PATH_RX 0x2UL + #define CFA_EEM_CFG_REQ_FLAGS_PREFERRED_OFFLOAD 0x4UL +- __le32 unused_0; ++ #define CFA_EEM_CFG_REQ_FLAGS_SECONDARY_PF 0x8UL ++ __le16 group_id; ++ __le16 unused_0; + __le32 num_entries; + __le32 unused_1; + __le16 key0_ctx_id; +@@ -6258,7 +6375,7 @@ + __le32 unused_0; + }; + +-/* hwrm_cfa_eem_qcfg_output (size:128b/16B) */ ++/* hwrm_cfa_eem_qcfg_output (size:192b/24B) */ + struct hwrm_cfa_eem_qcfg_output { + __le16 error_code; + __le16 req_type; +@@ -6269,6 +6386,8 @@ + #define CFA_EEM_QCFG_RESP_FLAGS_PATH_RX 0x2UL + #define CFA_EEM_QCFG_RESP_FLAGS_PREFERRED_OFFLOAD 0x4UL + __le32 num_entries; ++ u8 unused_0[7]; ++ u8 valid; + }; + + /* hwrm_cfa_eem_op_input (size:192b/24B) */ +@@ -6300,6 +6419,39 @@ + u8 valid; + }; + ++/* hwrm_cfa_adv_flow_mgnt_qcaps_input (size:256b/32B) */ ++struct hwrm_cfa_adv_flow_mgnt_qcaps_input { ++ __le16 req_type; ++ __le16 cmpl_ring; ++ __le16 seq_id; ++ __le16 target_id; ++ __le64 resp_addr; ++ __le32 unused_0[4]; ++}; ++ ++/* hwrm_cfa_adv_flow_mgnt_qcaps_output (size:128b/16B) */ ++struct hwrm_cfa_adv_flow_mgnt_qcaps_output { ++ __le16 error_code; ++ __le16 req_type; ++ __le16 seq_id; ++ __le16 resp_len; ++ __le32 flags; ++ #define CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_FLOW_HND_16BIT_SUPPORTED 0x1UL ++ #define CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_FLOW_HND_64BIT_SUPPORTED 0x2UL ++ #define CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_FLOW_BATCH_DELETE_SUPPORTED 0x4UL ++ #define CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_FLOW_RESET_ALL_SUPPORTED 0x8UL ++ #define CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_NTUPLE_FLOW_DEST_FUNC_SUPPORTED 0x10UL ++ #define CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_TX_EEM_FLOW_SUPPORTED 0x20UL ++ #define CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_RX_EEM_FLOW_SUPPORTED 0x40UL ++ #define CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_FLOW_COUNTER_ALLOC_SUPPORTED 0x80UL ++ #define CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_RFS_RING_TBL_IDX_SUPPORTED 0x100UL ++ #define CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_UNTAGGED_VLAN_SUPPORTED 0x200UL ++ #define CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_XDP_SUPPORTED 0x400UL ++ #define CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_L2_HEADER_SOURCE_FIELDS_SUPPORTED 0x800UL ++ u8 unused_0[3]; ++ u8 valid; ++}; ++ + /* hwrm_tunnel_dst_port_query_input (size:192b/24B) */ + struct hwrm_tunnel_dst_port_query_input { + __le16 req_type; +@@ -6636,7 +6788,8 @@ + #define FW_QSTATUS_RESP_SELFRST_STATUS_SELFRSTNONE 0x0UL + #define FW_QSTATUS_RESP_SELFRST_STATUS_SELFRSTASAP 0x1UL + #define FW_QSTATUS_RESP_SELFRST_STATUS_SELFRSTPCIERST 0x2UL +- #define FW_QSTATUS_RESP_SELFRST_STATUS_LAST FW_QSTATUS_RESP_SELFRST_STATUS_SELFRSTPCIERST ++ #define FW_QSTATUS_RESP_SELFRST_STATUS_SELFRSTPOWER 0x3UL ++ #define FW_QSTATUS_RESP_SELFRST_STATUS_LAST FW_QSTATUS_RESP_SELFRST_STATUS_SELFRSTPOWER + u8 unused_0[6]; + u8 valid; + }; +@@ -6659,8 +6812,8 @@ + u8 unused_0; + __le16 millisecond; + __le16 zone; +- #define FW_SET_TIME_REQ_ZONE_UTC 0x0UL +- #define FW_SET_TIME_REQ_ZONE_UNKNOWN 0xffffUL ++ #define FW_SET_TIME_REQ_ZONE_UTC 0 ++ #define FW_SET_TIME_REQ_ZONE_UNKNOWN 65535 + #define FW_SET_TIME_REQ_ZONE_LAST FW_SET_TIME_REQ_ZONE_UNKNOWN + u8 unused_1[4]; + }; +@@ -7064,7 +7217,9 @@ + __le64 host_dest_addr; + __le32 host_buf_len; + __le16 seq_no; +- u8 unused_0[2]; ++ u8 flags; ++ #define DBG_COREDUMP_LIST_REQ_FLAGS_CRASHDUMP 0x1UL ++ u8 unused_0[1]; + }; + + /* hwrm_dbg_coredump_list_output (size:128b/16B) */ +@@ -7392,7 +7547,9 @@ + __le32 nvram_size; + __le32 reserved_size; + __le32 available_size; +- u8 unused_0[3]; ++ u8 nvm_cfg_ver_maj; ++ u8 nvm_cfg_ver_min; ++ u8 nvm_cfg_ver_upd; + u8 valid; + }; + diff --git a/SOURCES/0019-netdrv-bnxt_en-Refactor-bnxt_alloc_stats.patch b/SOURCES/0019-netdrv-bnxt_en-Refactor-bnxt_alloc_stats.patch new file mode 100644 index 0000000..cb335d0 --- /dev/null +++ b/SOURCES/0019-netdrv-bnxt_en-Refactor-bnxt_alloc_stats.patch @@ -0,0 +1,128 @@ +From 7b521924055a466fc15021ba7c0fbd3833739abf Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:34 -0400 +Subject: [PATCH 19/96] [netdrv] bnxt_en: Refactor bnxt_alloc_stats() + +Message-id: <0b455fb7258aebee3261769c74274ce59cd30970.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276441 +O-Subject: [RHEL-8.2 PATCH 12/78] bnxt_en: Refactor bnxt_alloc_stats(). +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Reverse the condition of the large "if" block and return early. This +will simplify the follow up patch to add PCIe statistics. + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit a220eabc8887e3c02d308a9960e92a70cbd00b52) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 75 +++++++++++++++---------------- + 1 file changed, 36 insertions(+), 39 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.563542039 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.831539579 +0100 +@@ -3446,56 +3446,53 @@ + cpr->hw_stats_ctx_id = INVALID_STATS_CTX_ID; + } + +- if (BNXT_PF(bp) && bp->chip_num != CHIP_NUM_58700) { +- if (bp->hw_rx_port_stats) +- goto alloc_ext_stats; +- +- bp->hw_port_stats_size = sizeof(struct rx_port_stats) + +- sizeof(struct tx_port_stats) + 1024; +- +- bp->hw_rx_port_stats = +- dma_alloc_coherent(&pdev->dev, bp->hw_port_stats_size, +- &bp->hw_rx_port_stats_map, +- GFP_KERNEL); +- if (!bp->hw_rx_port_stats) +- return -ENOMEM; ++ if (BNXT_VF(bp) || bp->chip_num == CHIP_NUM_58700) ++ return 0; + +- bp->hw_tx_port_stats = (void *)(bp->hw_rx_port_stats + 1) + +- 512; +- bp->hw_tx_port_stats_map = bp->hw_rx_port_stats_map + +- sizeof(struct rx_port_stats) + 512; +- bp->flags |= BNXT_FLAG_PORT_STATS; ++ if (bp->hw_rx_port_stats) ++ goto alloc_ext_stats; + +-alloc_ext_stats: +- /* Display extended statistics only if FW supports it */ +- if (bp->hwrm_spec_code < 0x10804 || +- bp->hwrm_spec_code == 0x10900) +- return 0; ++ bp->hw_port_stats_size = sizeof(struct rx_port_stats) + ++ sizeof(struct tx_port_stats) + 1024; + +- if (bp->hw_rx_port_stats_ext) +- goto alloc_tx_ext_stats; ++ bp->hw_rx_port_stats = ++ dma_alloc_coherent(&pdev->dev, bp->hw_port_stats_size, ++ &bp->hw_rx_port_stats_map, ++ GFP_KERNEL); ++ if (!bp->hw_rx_port_stats) ++ return -ENOMEM; ++ ++ bp->hw_tx_port_stats = (void *)(bp->hw_rx_port_stats + 1) + 512; ++ bp->hw_tx_port_stats_map = bp->hw_rx_port_stats_map + ++ sizeof(struct rx_port_stats) + 512; ++ bp->flags |= BNXT_FLAG_PORT_STATS; + +- bp->hw_rx_port_stats_ext = +- dma_alloc_coherent(&pdev->dev, +- sizeof(struct rx_port_stats_ext), +- &bp->hw_rx_port_stats_ext_map, +- GFP_KERNEL); +- if (!bp->hw_rx_port_stats_ext) +- return 0; ++alloc_ext_stats: ++ /* Display extended statistics only if FW supports it */ ++ if (bp->hwrm_spec_code < 0x10804 || bp->hwrm_spec_code == 0x10900) ++ return 0; ++ ++ if (bp->hw_rx_port_stats_ext) ++ goto alloc_tx_ext_stats; ++ ++ bp->hw_rx_port_stats_ext = ++ dma_alloc_coherent(&pdev->dev, sizeof(struct rx_port_stats_ext), ++ &bp->hw_rx_port_stats_ext_map, GFP_KERNEL); ++ if (!bp->hw_rx_port_stats_ext) ++ return 0; + + alloc_tx_ext_stats: +- if (bp->hw_tx_port_stats_ext) +- return 0; ++ if (bp->hw_tx_port_stats_ext) ++ return 0; + +- if (bp->hwrm_spec_code >= 0x10902) { +- bp->hw_tx_port_stats_ext = +- dma_alloc_coherent(&pdev->dev, +- sizeof(struct tx_port_stats_ext), +- &bp->hw_tx_port_stats_ext_map, +- GFP_KERNEL); +- } +- bp->flags |= BNXT_FLAG_PORT_STATS_EXT; ++ if (bp->hwrm_spec_code >= 0x10902) { ++ bp->hw_tx_port_stats_ext = ++ dma_alloc_coherent(&pdev->dev, ++ sizeof(struct tx_port_stats_ext), ++ &bp->hw_tx_port_stats_ext_map, ++ GFP_KERNEL); + } ++ bp->flags |= BNXT_FLAG_PORT_STATS_EXT; + return 0; + } + diff --git a/SOURCES/0020-netdrv-bnxt_en-Add-support-for-PCIe-statistics.patch b/SOURCES/0020-netdrv-bnxt_en-Add-support-for-PCIe-statistics.patch new file mode 100644 index 0000000..ecadb79 --- /dev/null +++ b/SOURCES/0020-netdrv-bnxt_en-Add-support-for-PCIe-statistics.patch @@ -0,0 +1,240 @@ +From 4ea414c5bfab1738d910849ba97abc165ea491c3 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:35 -0400 +Subject: [PATCH 20/96] [netdrv] bnxt_en: Add support for PCIe statistics + +Message-id: +Patchwork-id: 276451 +O-Subject: [RHEL-8.2 PATCH 13/78] bnxt_en: Add support for PCIe statistics +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Gather periodic PCIe statistics for ethtool -S. + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 55e4398d4ee578094fb38f25af175629a24675d5) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 37 ++++++++++++++++++++- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 7 ++++ + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 39 +++++++++++++++++++++++ + 3 files changed, 82 insertions(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.831539579 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.956538431 +0100 +@@ -3402,6 +3402,12 @@ + bp->hw_rx_port_stats_ext_map); + bp->hw_rx_port_stats_ext = NULL; + } ++ ++ if (bp->hw_pcie_stats) { ++ dma_free_coherent(&pdev->dev, sizeof(struct pcie_ctx_hw_stats), ++ bp->hw_pcie_stats, bp->hw_pcie_stats_map); ++ bp->hw_pcie_stats = NULL; ++ } + } + + static void bnxt_free_ring_stats(struct bnxt *bp) +@@ -3483,7 +3489,7 @@ + + alloc_tx_ext_stats: + if (bp->hw_tx_port_stats_ext) +- return 0; ++ goto alloc_pcie_stats; + + if (bp->hwrm_spec_code >= 0x10902) { + bp->hw_tx_port_stats_ext = +@@ -3493,6 +3499,19 @@ + GFP_KERNEL); + } + bp->flags |= BNXT_FLAG_PORT_STATS_EXT; ++ ++alloc_pcie_stats: ++ if (bp->hw_pcie_stats || ++ !(bp->fw_cap & BNXT_FW_CAP_PCIE_STATS_SUPPORTED)) ++ return 0; ++ ++ bp->hw_pcie_stats = ++ dma_alloc_coherent(&pdev->dev, sizeof(struct pcie_ctx_hw_stats), ++ &bp->hw_pcie_stats_map, GFP_KERNEL); ++ if (!bp->hw_pcie_stats) ++ return 0; ++ ++ bp->flags |= BNXT_FLAG_PCIE_STATS; + return 0; + } + +@@ -6522,6 +6541,8 @@ + bp->flags |= BNXT_FLAG_ROCEV1_CAP; + if (flags & FUNC_QCAPS_RESP_FLAGS_ROCE_V2_SUPPORTED) + bp->flags |= BNXT_FLAG_ROCEV2_CAP; ++ if (flags & FUNC_QCAPS_RESP_FLAGS_PCIE_STATS_SUPPORTED) ++ bp->fw_cap |= BNXT_FW_CAP_PCIE_STATS_SUPPORTED; + + bp->tx_push_thresh = 0; + if (flags & FUNC_QCAPS_RESP_FLAGS_PUSH_MODE_SUPPORTED) +@@ -6822,6 +6843,19 @@ + return rc; + } + ++static int bnxt_hwrm_pcie_qstats(struct bnxt *bp) ++{ ++ struct hwrm_pcie_qstats_input req = {0}; ++ ++ if (!(bp->flags & BNXT_FLAG_PCIE_STATS)) ++ return 0; ++ ++ bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_PCIE_QSTATS, -1, -1); ++ req.pcie_stat_size = cpu_to_le16(sizeof(struct pcie_ctx_hw_stats)); ++ req.pcie_stat_host_addr = cpu_to_le64(bp->hw_pcie_stats_map); ++ return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++} ++ + static void bnxt_hwrm_free_tunnel_ports(struct bnxt *bp) + { + if (bp->vxlan_port_cnt) { +@@ -9409,6 +9443,7 @@ + if (test_and_clear_bit(BNXT_PERIODIC_STATS_SP_EVENT, &bp->sp_event)) { + bnxt_hwrm_port_qstats(bp); + bnxt_hwrm_port_qstats_ext(bp); ++ bnxt_hwrm_pcie_qstats(bp); + } + + if (test_and_clear_bit(BNXT_LINK_CHNG_SP_EVENT, &bp->sp_event)) { +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:12.415543397 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:12.956538431 +0100 +@@ -1355,6 +1355,7 @@ + #define BNXT_FLAG_DIM 0x2000000 + #define BNXT_FLAG_ROCE_MIRROR_CAP 0x4000000 + #define BNXT_FLAG_PORT_STATS_EXT 0x10000000 ++ #define BNXT_FLAG_PCIE_STATS 0x40000000 + + #define BNXT_FLAG_ALL_CONFIG_FEATS (BNXT_FLAG_TPA | \ + BNXT_FLAG_RFS | \ +@@ -1482,6 +1483,7 @@ + #define BNXT_FW_CAP_KONG_MB_CHNL 0x00000080 + #define BNXT_FW_CAP_OVS_64BIT_HANDLE 0x00000400 + #define BNXT_FW_CAP_TRUSTED_VF 0x00000800 ++ #define BNXT_FW_CAP_PCIE_STATS_SUPPORTED 0x00020000 + + #define BNXT_NEW_RM(bp) ((bp)->fw_cap & BNXT_FW_CAP_NEW_RM) + u32 hwrm_spec_code; +@@ -1500,10 +1502,12 @@ + struct tx_port_stats *hw_tx_port_stats; + struct rx_port_stats_ext *hw_rx_port_stats_ext; + struct tx_port_stats_ext *hw_tx_port_stats_ext; ++ struct pcie_ctx_hw_stats *hw_pcie_stats; + dma_addr_t hw_rx_port_stats_map; + dma_addr_t hw_tx_port_stats_map; + dma_addr_t hw_rx_port_stats_ext_map; + dma_addr_t hw_tx_port_stats_ext_map; ++ dma_addr_t hw_pcie_stats_map; + int hw_port_stats_size; + u16 fw_rx_stats_ext_size; + u16 fw_tx_stats_ext_size; +@@ -1636,6 +1640,9 @@ + #define BNXT_TX_STATS_EXT_OFFSET(counter) \ + (offsetof(struct tx_port_stats_ext, counter) / 8) + ++#define BNXT_PCIE_STATS_OFFSET(counter) \ ++ (offsetof(struct pcie_ctx_hw_stats, counter) / 8) ++ + #define I2C_DEV_ADDR_A0 0xa0 + #define I2C_DEV_ADDR_A2 0xa2 + #define SFF_DIAG_SUPPORT_OFFSET 0x5c +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:12.694540836 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:12.957538422 +0100 +@@ -235,6 +235,9 @@ + BNXT_TX_STATS_PRI_ENTRY(counter, 6), \ + BNXT_TX_STATS_PRI_ENTRY(counter, 7) + ++#define BNXT_PCIE_STATS_ENTRY(counter) \ ++ { BNXT_PCIE_STATS_OFFSET(counter), __stringify(counter) } ++ + enum { + RX_TOTAL_DISCARDS, + TX_TOTAL_DISCARDS, +@@ -387,6 +390,24 @@ + BNXT_TX_STATS_PRI_ENTRIES(tx_packets), + }; + ++static const struct { ++ long offset; ++ char string[ETH_GSTRING_LEN]; ++} bnxt_pcie_stats_arr[] = { ++ BNXT_PCIE_STATS_ENTRY(pcie_pl_signal_integrity), ++ BNXT_PCIE_STATS_ENTRY(pcie_dl_signal_integrity), ++ BNXT_PCIE_STATS_ENTRY(pcie_tl_signal_integrity), ++ BNXT_PCIE_STATS_ENTRY(pcie_link_integrity), ++ BNXT_PCIE_STATS_ENTRY(pcie_tx_traffic_rate), ++ BNXT_PCIE_STATS_ENTRY(pcie_rx_traffic_rate), ++ BNXT_PCIE_STATS_ENTRY(pcie_tx_dllp_statistics), ++ BNXT_PCIE_STATS_ENTRY(pcie_rx_dllp_statistics), ++ BNXT_PCIE_STATS_ENTRY(pcie_equalization_time), ++ BNXT_PCIE_STATS_ENTRY(pcie_ltssm_histogram[0]), ++ BNXT_PCIE_STATS_ENTRY(pcie_ltssm_histogram[2]), ++ BNXT_PCIE_STATS_ENTRY(pcie_recovery_histogram), ++}; ++ + #define BNXT_NUM_SW_FUNC_STATS ARRAY_SIZE(bnxt_sw_func_stats) + #define BNXT_NUM_PORT_STATS ARRAY_SIZE(bnxt_port_stats_arr) + #define BNXT_NUM_STATS_PRI \ +@@ -394,6 +415,7 @@ + ARRAY_SIZE(bnxt_rx_pkts_pri_arr) + \ + ARRAY_SIZE(bnxt_tx_bytes_pri_arr) + \ + ARRAY_SIZE(bnxt_tx_pkts_pri_arr)) ++#define BNXT_NUM_PCIE_STATS ARRAY_SIZE(bnxt_pcie_stats_arr) + + static int bnxt_get_num_stats(struct bnxt *bp) + { +@@ -411,6 +433,9 @@ + num_stats += BNXT_NUM_STATS_PRI; + } + ++ if (bp->flags & BNXT_FLAG_PCIE_STATS) ++ num_stats += BNXT_NUM_PCIE_STATS; ++ + return num_stats; + } + +@@ -513,6 +538,14 @@ + } + } + } ++ if (bp->flags & BNXT_FLAG_PCIE_STATS) { ++ __le64 *pcie_stats = (__le64 *)bp->hw_pcie_stats; ++ ++ for (i = 0; i < BNXT_NUM_PCIE_STATS; i++, j++) { ++ buf[j] = le64_to_cpu(*(pcie_stats + ++ bnxt_pcie_stats_arr[i].offset)); ++ } ++ } + } + + static void bnxt_get_strings(struct net_device *dev, u32 stringset, u8 *buf) +@@ -613,6 +646,12 @@ + } + } + } ++ if (bp->flags & BNXT_FLAG_PCIE_STATS) { ++ for (i = 0; i < BNXT_NUM_PCIE_STATS; i++) { ++ strcpy(buf, bnxt_pcie_stats_arr[i].string); ++ buf += ETH_GSTRING_LEN; ++ } ++ } + break; + case ETH_SS_TEST: + if (bp->num_tests) diff --git a/SOURCES/0021-netdrv-bnxt_en-Check-new-firmware-capability-to-disp.patch b/SOURCES/0021-netdrv-bnxt_en-Check-new-firmware-capability-to-disp.patch new file mode 100644 index 0000000..f815d89 --- /dev/null +++ b/SOURCES/0021-netdrv-bnxt_en-Check-new-firmware-capability-to-disp.patch @@ -0,0 +1,76 @@ +From 7c4869095f8b11b912280ce17ebdbe6389cedf1b Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:36 -0400 +Subject: [PATCH 21/96] [netdrv] bnxt_en: Check new firmware capability to + display extended stats + +Message-id: <75c33ccbd03fe0c828ea8d1177ece257e36b1f0a.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276438 +O-Subject: [RHEL-8.2 PATCH 14/78] bnxt_en: Check new firmware capability to display extended stats. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Newer firmware now advertises the capability for extended stats +support. Check the new capability in addition to the existing +version check. + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 6154532fe8fe4e5ec5ffb1a71f587015973f8753) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 8 ++++++-- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + + 2 files changed, 7 insertions(+), 2 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:12.956538431 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.099537119 +0100 +@@ -3476,7 +3476,8 @@ + alloc_ext_stats: + /* Display extended statistics only if FW supports it */ + if (bp->hwrm_spec_code < 0x10804 || bp->hwrm_spec_code == 0x10900) +- return 0; ++ if (!(bp->fw_cap & BNXT_FW_CAP_EXT_STATS_SUPPORTED)) ++ return 0; + + if (bp->hw_rx_port_stats_ext) + goto alloc_tx_ext_stats; +@@ -3491,7 +3492,8 @@ + if (bp->hw_tx_port_stats_ext) + goto alloc_pcie_stats; + +- if (bp->hwrm_spec_code >= 0x10902) { ++ if (bp->hwrm_spec_code >= 0x10902 || ++ (bp->fw_cap & BNXT_FW_CAP_EXT_STATS_SUPPORTED)) { + bp->hw_tx_port_stats_ext = + dma_alloc_coherent(&pdev->dev, + sizeof(struct tx_port_stats_ext), +@@ -6543,6 +6545,8 @@ + bp->flags |= BNXT_FLAG_ROCEV2_CAP; + if (flags & FUNC_QCAPS_RESP_FLAGS_PCIE_STATS_SUPPORTED) + bp->fw_cap |= BNXT_FW_CAP_PCIE_STATS_SUPPORTED; ++ if (flags & FUNC_QCAPS_RESP_FLAGS_EXT_STATS_SUPPORTED) ++ bp->fw_cap |= BNXT_FW_CAP_EXT_STATS_SUPPORTED; + + bp->tx_push_thresh = 0; + if (flags & FUNC_QCAPS_RESP_FLAGS_PUSH_MODE_SUPPORTED) +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:12.956538431 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:13.099537119 +0100 +@@ -1484,6 +1484,7 @@ + #define BNXT_FW_CAP_OVS_64BIT_HANDLE 0x00000400 + #define BNXT_FW_CAP_TRUSTED_VF 0x00000800 + #define BNXT_FW_CAP_PCIE_STATS_SUPPORTED 0x00020000 ++ #define BNXT_FW_CAP_EXT_STATS_SUPPORTED 0x00040000 + + #define BNXT_NEW_RM(bp) ((bp)->fw_cap & BNXT_FW_CAP_NEW_RM) + u32 hwrm_spec_code; diff --git a/SOURCES/0022-netdrv-bnxt_en-Read-package-version-from-firmware.patch b/SOURCES/0022-netdrv-bnxt_en-Read-package-version-from-firmware.patch new file mode 100644 index 0000000..280cf83 --- /dev/null +++ b/SOURCES/0022-netdrv-bnxt_en-Read-package-version-from-firmware.patch @@ -0,0 +1,77 @@ +From d3c5c8c9f03aef9ee1560babaf9513478e3b3bf2 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:37 -0400 +Subject: [PATCH 22/96] [netdrv] bnxt_en: Read package version from firmware + +Message-id: <47986fa0bee271229f9f3fd74257117edf28b159.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276440 +O-Subject: [RHEL-8.2 PATCH 15/78] bnxt_en: Read package version from firmware. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +HWRM_VER_GET firmware command returns package name that is running +actively on the adapter. Use this version instead of parsing from +the package log in NVRAM. + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 691aa62045c2b23152ce3b64feb601502aab97c5) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 9 +++++++++ + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 3 ++- + 3 files changed, 12 insertions(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.099537119 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.240535824 +0100 +@@ -6710,6 +6710,15 @@ + resp->hwrm_fw_maj_8b, resp->hwrm_fw_min_8b, + resp->hwrm_fw_bld_8b, resp->hwrm_fw_rsvd_8b); + ++ if (strlen(resp->active_pkg_name)) { ++ int fw_ver_len = strlen(bp->fw_ver_str); ++ ++ snprintf(bp->fw_ver_str + fw_ver_len, ++ FW_VER_STR_LEN - fw_ver_len - 1, "/pkg %s", ++ resp->active_pkg_name); ++ bp->fw_cap |= BNXT_FW_CAP_PKG_VER; ++ } ++ + bp->hwrm_cmd_timeout = le16_to_cpu(resp->def_req_timeout); + if (!bp->hwrm_cmd_timeout) + bp->hwrm_cmd_timeout = DFLT_HWRM_CMD_TIMEOUT; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:13.099537119 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:13.240535824 +0100 +@@ -1483,6 +1483,7 @@ + #define BNXT_FW_CAP_KONG_MB_CHNL 0x00000080 + #define BNXT_FW_CAP_OVS_64BIT_HANDLE 0x00000400 + #define BNXT_FW_CAP_TRUSTED_VF 0x00000800 ++ #define BNXT_FW_CAP_PKG_VER 0x00004000 + #define BNXT_FW_CAP_PCIE_STATS_SUPPORTED 0x00020000 + #define BNXT_FW_CAP_EXT_STATS_SUPPORTED 0x00040000 + +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:12.957538422 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:13.241535815 +0100 +@@ -3305,7 +3305,8 @@ + struct net_device *dev = bp->dev; + int i, rc; + +- bnxt_get_pkgver(dev); ++ if (!(bp->fw_cap & BNXT_FW_CAP_PKG_VER)) ++ bnxt_get_pkgver(dev); + + if (bp->hwrm_spec_code < 0x10704 || !BNXT_SINGLE_PF(bp)) + return; diff --git a/SOURCES/0023-netdrv-bnxt_en-read-the-clause-type-from-the-PHY-ID.patch b/SOURCES/0023-netdrv-bnxt_en-read-the-clause-type-from-the-PHY-ID.patch new file mode 100644 index 0000000..5e04faf --- /dev/null +++ b/SOURCES/0023-netdrv-bnxt_en-read-the-clause-type-from-the-PHY-ID.patch @@ -0,0 +1,52 @@ +From 046588ccc17d792129f8d5f2ad717a76134f9581 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:38 -0400 +Subject: [PATCH 23/96] [netdrv] bnxt_en: read the clause type from the PHY ID + +Message-id: +Patchwork-id: 276443 +O-Subject: [RHEL-8.2 PATCH 16/78] bnxt_en: read the clause type from the PHY ID +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Currently driver hard code Clause 45 based on speed supported by the +PHY. Instead read the clause type from the PHY ID provided as input +to the mdio ioctl. + +Fixes: 0ca12be99667 ("bnxt_en: Add support for mdio read/write to external PHY") +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 2730214ddb889c54d5f6a734e2fe584c295cbd9b) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.240535824 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.384534503 +0100 +@@ -8713,7 +8713,7 @@ + req.port_id = cpu_to_le16(bp->pf.port_id); + req.phy_addr = phy_addr; + req.reg_addr = cpu_to_le16(reg & 0x1f); +- if (bp->link_info.support_speeds & BNXT_LINK_SPEED_MSK_10GB) { ++ if (mdio_phy_id_is_c45(phy_addr)) { + req.cl45_mdio = 1; + req.phy_addr = mdio_phy_id_prtad(phy_addr); + req.dev_addr = mdio_phy_id_devad(phy_addr); +@@ -8740,7 +8740,7 @@ + req.port_id = cpu_to_le16(bp->pf.port_id); + req.phy_addr = phy_addr; + req.reg_addr = cpu_to_le16(reg & 0x1f); +- if (bp->link_info.support_speeds & BNXT_LINK_SPEED_MSK_10GB) { ++ if (mdio_phy_id_is_c45(phy_addr)) { + req.cl45_mdio = 1; + req.phy_addr = mdio_phy_id_prtad(phy_addr); + req.dev_addr = mdio_phy_id_devad(phy_addr); diff --git a/SOURCES/0024-netdrv-bnxt_en-Separate-RDMA-MR-AH-context-allocatio.patch b/SOURCES/0024-netdrv-bnxt_en-Separate-RDMA-MR-AH-context-allocatio.patch new file mode 100644 index 0000000..e901448 --- /dev/null +++ b/SOURCES/0024-netdrv-bnxt_en-Separate-RDMA-MR-AH-context-allocatio.patch @@ -0,0 +1,114 @@ +From 075dd4d3abf9b0b014318e6c103d100703bada59 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:39 -0400 +Subject: [PATCH 24/96] [netdrv] bnxt_en: Separate RDMA MR/AH context + allocation + +Message-id: <954dad29d938cf452dacb2aeff7e5775a8df5e6f.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276439 +O-Subject: [RHEL-8.2 PATCH 17/78] bnxt_en: Separate RDMA MR/AH context allocation. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +In newer firmware, the context memory for MR (Memory Region) +and AH (Address Handle) to support RDMA are specified separately. +Modify driver to specify and allocate the 2 context memory types +separately when supported by the firmware. + +Signed-off-by: Devesh Sharma +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 53579e37d13a7a87430e2ec0171e091ebf2e63a1) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 19 ++++++++++++++++++- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + + 2 files changed, 19 insertions(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.384534503 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.520533254 +0100 +@@ -6091,6 +6091,8 @@ + ctx->tqm_entries_multiple = 1; + ctx->mrav_max_entries = le32_to_cpu(resp->mrav_max_entries); + ctx->mrav_entry_size = le16_to_cpu(resp->mrav_entry_size); ++ ctx->mrav_num_entries_units = ++ le16_to_cpu(resp->mrav_num_entries_units); + ctx->tim_entry_size = le16_to_cpu(resp->tim_entry_size); + ctx->tim_max_entries = le32_to_cpu(resp->tim_max_entries); + } else { +@@ -6137,6 +6139,7 @@ + struct bnxt_ctx_pg_info *ctx_pg; + __le32 *num_entries; + __le64 *pg_dir; ++ u32 flags = 0; + u8 *pg_attr; + int i, rc; + u32 ena; +@@ -6196,6 +6199,9 @@ + if (enables & FUNC_BACKING_STORE_CFG_REQ_ENABLES_MRAV) { + ctx_pg = &ctx->mrav_mem; + req.mrav_num_entries = cpu_to_le32(ctx_pg->entries); ++ if (ctx->mrav_num_entries_units) ++ flags |= ++ FUNC_BACKING_STORE_CFG_REQ_FLAGS_MRAV_RESERVATION_SPLIT; + req.mrav_entry_size = cpu_to_le16(ctx->mrav_entry_size); + bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem, + &req.mrav_pg_size_mrav_lvl, +@@ -6222,6 +6228,7 @@ + *num_entries = cpu_to_le32(ctx_pg->entries); + bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem, pg_attr, pg_dir); + } ++ req.flags = cpu_to_le32(flags); + rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + if (rc) + rc = -EIO; +@@ -6360,6 +6367,7 @@ + struct bnxt_ctx_pg_info *ctx_pg; + struct bnxt_ctx_mem_info *ctx; + u32 mem_size, ena, entries; ++ u32 num_mr, num_ah; + u32 extra_srqs = 0; + u32 extra_qps = 0; + u8 pg_lvl = 1; +@@ -6423,12 +6431,21 @@ + goto skip_rdma; + + ctx_pg = &ctx->mrav_mem; +- ctx_pg->entries = extra_qps * 4; ++ /* 128K extra is needed to accommodate static AH context ++ * allocation by f/w. ++ */ ++ num_mr = 1024 * 256; ++ num_ah = 1024 * 128; ++ ctx_pg->entries = num_mr + num_ah; + mem_size = ctx->mrav_entry_size * ctx_pg->entries; + rc = bnxt_alloc_ctx_pg_tbls(bp, ctx_pg, mem_size, 2); + if (rc) + return rc; + ena = FUNC_BACKING_STORE_CFG_REQ_ENABLES_MRAV; ++ if (ctx->mrav_num_entries_units) ++ ctx_pg->entries = ++ ((num_mr / ctx->mrav_num_entries_units) << 16) | ++ (num_ah / ctx->mrav_num_entries_units); + + ctx_pg = &ctx->tim_mem; + ctx_pg->entries = ctx->qp_mem.entries; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:13.240535824 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:13.520533254 +0100 +@@ -1228,6 +1228,7 @@ + u16 mrav_entry_size; + u16 tim_entry_size; + u32 tim_max_entries; ++ u16 mrav_num_entries_units; + u8 tqm_entries_multiple; + + u32 flags; diff --git a/SOURCES/0025-netdrv-bnxt_en-Query-firmware-capability-to-support-.patch b/SOURCES/0025-netdrv-bnxt_en-Query-firmware-capability-to-support-.patch new file mode 100644 index 0000000..939073a --- /dev/null +++ b/SOURCES/0025-netdrv-bnxt_en-Query-firmware-capability-to-support-.patch @@ -0,0 +1,117 @@ +From bbe3117afaa0ff9fca4b8691a7f138c5c609c8f9 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:40 -0400 +Subject: [PATCH 25/96] [netdrv] bnxt_en: Query firmware capability to support + aRFS on 57500 chips + +Message-id: <76a89a755982ba153852e5f3c8364a30c283f28c.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276446 +O-Subject: [RHEL-8.2 PATCH 18/78] bnxt_en: Query firmware capability to support aRFS on 57500 chips. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Query support for the aRFS ring table index in the firmware. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit e969ae5bbfcf48e3ff2d159870453121d5a8441d) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 43 ++++++++++++++++++++++++++++++- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 ++ + 2 files changed, 44 insertions(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.520533254 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.662531951 +0100 +@@ -6636,6 +6636,34 @@ + return 0; + } + ++static int bnxt_hwrm_cfa_adv_flow_mgnt_qcaps(struct bnxt *bp) ++{ ++ struct hwrm_cfa_adv_flow_mgnt_qcaps_input req = {0}; ++ struct hwrm_cfa_adv_flow_mgnt_qcaps_output *resp; ++ int rc = 0; ++ u32 flags; ++ ++ if (!(bp->fw_cap & BNXT_FW_CAP_CFA_ADV_FLOW)) ++ return 0; ++ ++ resp = bp->hwrm_cmd_resp_addr; ++ bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_CFA_ADV_FLOW_MGNT_QCAPS, -1, -1); ++ ++ mutex_lock(&bp->hwrm_cmd_lock); ++ rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ if (rc) ++ goto hwrm_cfa_adv_qcaps_exit; ++ ++ flags = le32_to_cpu(resp->flags); ++ if (flags & ++ CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_RFS_RING_TBL_IDX_SUPPORTED) ++ bp->fw_cap |= BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX; ++ ++hwrm_cfa_adv_qcaps_exit: ++ mutex_unlock(&bp->hwrm_cmd_lock); ++ return rc; ++} ++ + static int bnxt_hwrm_func_reset(struct bnxt *bp) + { + struct hwrm_func_reset_input req = {0}; +@@ -6768,6 +6796,10 @@ + VER_GET_RESP_DEV_CAPS_CFG_TRUSTED_VF_SUPPORTED) + bp->fw_cap |= BNXT_FW_CAP_TRUSTED_VF; + ++ if (dev_caps_cfg & ++ VER_GET_RESP_DEV_CAPS_CFG_CFA_ADV_FLOW_MGNT_SUPPORTED) ++ bp->fw_cap |= BNXT_FW_CAP_CFA_ADV_FLOW; ++ + hwrm_ver_get_exit: + mutex_unlock(&bp->hwrm_cmd_lock); + return rc; +@@ -9075,8 +9107,11 @@ + /* If the chip and firmware supports RFS */ + static bool bnxt_rfs_supported(struct bnxt *bp) + { +- if (bp->flags & BNXT_FLAG_CHIP_P5) ++ if (bp->flags & BNXT_FLAG_CHIP_P5) { ++ if (bp->fw_cap & BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX) ++ return true; + return false; ++ } + if (BNXT_PF(bp) && !BNXT_CHIP_TYPE_NITRO_A0(bp)) + return true; + if (bp->flags & BNXT_FLAG_NEW_RSS_CAP) +@@ -10688,6 +10723,12 @@ + rc = -1; + goto init_err_pci_clean; + } ++ ++ rc = bnxt_hwrm_cfa_adv_flow_mgnt_qcaps(bp); ++ if (rc) ++ netdev_warn(bp->dev, "hwrm query adv flow mgnt failure rc: %d\n", ++ rc); ++ + rc = bnxt_init_mac_addr(bp); + if (rc) { + dev_err(&pdev->dev, "Unable to initialize mac address.\n"); +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:13.520533254 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:13.662531951 +0100 +@@ -1485,6 +1485,8 @@ + #define BNXT_FW_CAP_OVS_64BIT_HANDLE 0x00000400 + #define BNXT_FW_CAP_TRUSTED_VF 0x00000800 + #define BNXT_FW_CAP_PKG_VER 0x00004000 ++ #define BNXT_FW_CAP_CFA_ADV_FLOW 0x00008000 ++ #define BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX 0x00010000 + #define BNXT_FW_CAP_PCIE_STATS_SUPPORTED 0x00020000 + #define BNXT_FW_CAP_EXT_STATS_SUPPORTED 0x00040000 + diff --git a/SOURCES/0026-netdrv-bnxt_en-Add-support-for-aRFS-on-57500-chips.patch b/SOURCES/0026-netdrv-bnxt_en-Add-support-for-aRFS-on-57500-chips.patch new file mode 100644 index 0000000..f14938a --- /dev/null +++ b/SOURCES/0026-netdrv-bnxt_en-Add-support-for-aRFS-on-57500-chips.patch @@ -0,0 +1,76 @@ +From 57b905197ca2cf5b07e4a9da7f257b229f99c6a1 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:41 -0400 +Subject: [PATCH 26/96] [netdrv] bnxt_en: Add support for aRFS on 57500 chips + +Message-id: +Patchwork-id: 276445 +O-Subject: [RHEL-8.2 PATCH 19/78] bnxt_en: Add support for aRFS on 57500 chips. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Set RSS ring table index of the RFS destination ring for the NTUPLE +filters on 57500 chips. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit ac33906c67e22edeabe3f0150ffeb367462e754f) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.662531951 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.805530638 +0100 +@@ -4232,16 +4232,25 @@ + static int bnxt_hwrm_cfa_ntuple_filter_alloc(struct bnxt *bp, + struct bnxt_ntuple_filter *fltr) + { +- struct bnxt_vnic_info *vnic = &bp->vnic_info[fltr->rxq + 1]; + struct hwrm_cfa_ntuple_filter_alloc_input req = {0}; + struct hwrm_cfa_ntuple_filter_alloc_output *resp; + struct flow_keys *keys = &fltr->fkeys; ++ struct bnxt_vnic_info *vnic; ++ u32 dst_ena = 0; + int rc = 0; + + bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_CFA_NTUPLE_FILTER_ALLOC, -1, -1); + req.l2_filter_id = bp->vnic_info[0].fw_l2_filter_id[fltr->l2_fltr_idx]; + +- req.enables = cpu_to_le32(BNXT_NTP_FLTR_FLAGS); ++ if (bp->fw_cap & BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX) { ++ dst_ena = CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_RFS_RING_TBL_IDX; ++ req.rfs_ring_tbl_idx = cpu_to_le16(fltr->rxq); ++ vnic = &bp->vnic_info[0]; ++ } else { ++ vnic = &bp->vnic_info[fltr->rxq + 1]; ++ } ++ req.dst_id = cpu_to_le16(vnic->fw_vnic_id); ++ req.enables = cpu_to_le32(BNXT_NTP_FLTR_FLAGS | dst_ena); + + req.ethertype = htons(ETH_P_IP); + memcpy(req.src_macaddr, fltr->src_mac_addr, ETH_ALEN); +@@ -4279,7 +4288,6 @@ + req.dst_port = keys->ports.dst; + req.dst_port_mask = cpu_to_be16(0xffff); + +- req.dst_id = cpu_to_le16(vnic->fw_vnic_id); + mutex_lock(&bp->hwrm_cmd_lock); + rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + if (!rc) { +@@ -9126,7 +9134,7 @@ + int vnics, max_vnics, max_rss_ctxs; + + if (bp->flags & BNXT_FLAG_CHIP_P5) +- return false; ++ return bnxt_rfs_supported(bp); + if (!(bp->flags & BNXT_FLAG_MSIX_CAP) || !bnxt_can_reserve_rings(bp)) + return false; + diff --git a/SOURCES/0027-netdrv-bnxt_en-Device-serial-number-is-supported-onl.patch b/SOURCES/0027-netdrv-bnxt_en-Device-serial-number-is-supported-onl.patch new file mode 100644 index 0000000..227da63 --- /dev/null +++ b/SOURCES/0027-netdrv-bnxt_en-Device-serial-number-is-supported-onl.patch @@ -0,0 +1,51 @@ +From 620cc08cb52bfe54049e69c56c7d75ba7b67ce26 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:42 -0400 +Subject: [PATCH 27/96] [netdrv] bnxt_en: Device serial number is supported + only for PFs + +Message-id: <42a558146846b42a704f96b91b13e688f5533fb9.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276442 +O-Subject: [RHEL-8.2 PATCH 20/78] bnxt_en: Device serial number is supported only for PFs. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Don't read DSN on VFs that do not have the PCI capability. + +Fixes: 03213a996531 ("bnxt: move bp->switch_id initialization to PF probe") +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 2e9217d1e8b72dde2c7e3e2338cc1830f68cb58d) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.805530638 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.941529390 +0100 +@@ -10744,11 +10744,12 @@ + goto init_err_pci_clean; + } + +- /* Read the adapter's DSN to use as the eswitch switch_id */ +- rc = bnxt_pcie_dsn_get(bp, bp->switch_id); +- if (rc) +- goto init_err_pci_clean; +- ++ if (BNXT_PF(bp)) { ++ /* Read the adapter's DSN to use as the eswitch switch_id */ ++ rc = bnxt_pcie_dsn_get(bp, bp->switch_id); ++ if (rc) ++ goto init_err_pci_clean; ++ } + bnxt_hwrm_func_qcfg(bp); + bnxt_hwrm_vnic_qcaps(bp); + bnxt_hwrm_port_led_qcaps(bp); diff --git a/SOURCES/0028-netdrv-bnxt_en-rename-some-xdp-functions.patch b/SOURCES/0028-netdrv-bnxt_en-rename-some-xdp-functions.patch new file mode 100644 index 0000000..211a43f --- /dev/null +++ b/SOURCES/0028-netdrv-bnxt_en-rename-some-xdp-functions.patch @@ -0,0 +1,84 @@ +From 57e81b54c97b6f765ab3e0d5b2943ba40a018663 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:43 -0400 +Subject: [PATCH 28/96] [netdrv] bnxt_en: rename some xdp functions + +Message-id: +Patchwork-id: 276444 +O-Subject: [RHEL-8.2 PATCH 21/78] bnxt_en: rename some xdp functions +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Renaming bnxt_xmit_xdp to __bnxt_xmit_xdp to get ready for XDP_REDIRECT +support and reduce confusion/namespace collision. + +Signed-off-by: Andy Gospodarek +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 52c0609258658ff35b85c654c568a50abd602ac6) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 2 +- + drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 8 ++++---- + drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h | 4 ++-- + 3 files changed, 7 insertions(+), 7 deletions(-) + +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:13.241535815 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:14.076528151 +0100 +@@ -2799,7 +2799,7 @@ + dev_kfree_skb(skb); + return -EIO; + } +- bnxt_xmit_xdp(bp, txr, map, pkt_size, 0); ++ __bnxt_xmit_xdp(bp, txr, map, pkt_size, 0); + + /* Sync BD data before updating doorbell */ + wmb(); +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c 2020-02-06 16:22:56.456689887 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c 2020-02-06 16:23:14.076528151 +0100 +@@ -19,8 +19,8 @@ + #include "bnxt.h" + #include "bnxt_xdp.h" + +-void bnxt_xmit_xdp(struct bnxt *bp, struct bnxt_tx_ring_info *txr, +- dma_addr_t mapping, u32 len, u16 rx_prod) ++void __bnxt_xmit_xdp(struct bnxt *bp, struct bnxt_tx_ring_info *txr, ++ dma_addr_t mapping, u32 len, u16 rx_prod) + { + struct bnxt_sw_tx_bd *tx_buf; + struct tx_bd *txbd; +@@ -132,8 +132,8 @@ + *event = BNXT_TX_EVENT; + dma_sync_single_for_device(&pdev->dev, mapping + offset, *len, + bp->rx_dir); +- bnxt_xmit_xdp(bp, txr, mapping + offset, *len, +- NEXT_RX(rxr->rx_prod)); ++ __bnxt_xmit_xdp(bp, txr, mapping + offset, *len, ++ NEXT_RX(rxr->rx_prod)); + bnxt_reuse_rx_data(rxr, cons, page); + return true; + default: +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h 2020-02-06 16:22:56.456689887 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h 2020-02-06 16:23:14.076528151 +0100 +@@ -10,8 +10,8 @@ + #ifndef BNXT_XDP_H + #define BNXT_XDP_H + +-void bnxt_xmit_xdp(struct bnxt *bp, struct bnxt_tx_ring_info *txr, +- dma_addr_t mapping, u32 len, u16 rx_prod); ++void __bnxt_xmit_xdp(struct bnxt *bp, struct bnxt_tx_ring_info *txr, ++ dma_addr_t mapping, u32 len, u16 rx_prod); + void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts); + bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons, + struct page *page, u8 **data_ptr, unsigned int *len, diff --git a/SOURCES/0029-netdrv-bnxt_en-Refactor-__bnxt_xmit_xdp.patch b/SOURCES/0029-netdrv-bnxt_en-Refactor-__bnxt_xmit_xdp.patch new file mode 100644 index 0000000..9c9d467 --- /dev/null +++ b/SOURCES/0029-netdrv-bnxt_en-Refactor-__bnxt_xmit_xdp.patch @@ -0,0 +1,149 @@ +From 21e44965c1de18146e7d7b29612751eeac02968a Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:44 -0400 +Subject: [PATCH 29/96] [netdrv] bnxt_en: Refactor __bnxt_xmit_xdp() + +Message-id: +Patchwork-id: 276447 +O-Subject: [RHEL-8.2 PATCH 22/78] bnxt_en: Refactor __bnxt_xmit_xdp(). +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +__bnxt_xmit_xdp() is used by XDP_TX and ethtool loopback packet transmit. +Refactor it so that it can be re-used by the XDP_REDIRECT logic. +Restructure the TX interrupt handler logic to cleanly separate XDP_TX +logic in preparation for XDP_REDIRECT. + +Acked-by: Andy Gospodarek +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit c1ba92a86db24dc9ca2648473d4820979a0d8a4c) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 2 +- + drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 33 ++++++++++++++++------- + drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h | 5 ++-- + 4 files changed, 28 insertions(+), 13 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:13.662531951 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:14.227526765 +0100 +@@ -596,6 +596,7 @@ + DEFINE_DMA_UNMAP_ADDR(mapping); + u8 is_gso; + u8 is_push; ++ u8 action; + union { + unsigned short nr_frags; + u16 rx_prod; +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:14.076528151 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:14.228526755 +0100 +@@ -2799,7 +2799,7 @@ + dev_kfree_skb(skb); + return -EIO; + } +- __bnxt_xmit_xdp(bp, txr, map, pkt_size, 0); ++ bnxt_xmit_bd(bp, txr, map, pkt_size); + + /* Sync BD data before updating doorbell */ + wmb(); +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c 2020-02-06 16:23:14.076528151 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c 2020-02-06 16:23:14.228526755 +0100 +@@ -19,8 +19,9 @@ + #include "bnxt.h" + #include "bnxt_xdp.h" + +-void __bnxt_xmit_xdp(struct bnxt *bp, struct bnxt_tx_ring_info *txr, +- dma_addr_t mapping, u32 len, u16 rx_prod) ++struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp, ++ struct bnxt_tx_ring_info *txr, ++ dma_addr_t mapping, u32 len) + { + struct bnxt_sw_tx_bd *tx_buf; + struct tx_bd *txbd; +@@ -29,7 +30,6 @@ + + prod = txr->tx_prod; + tx_buf = &txr->tx_buf_ring[prod]; +- tx_buf->rx_prod = rx_prod; + + txbd = &txr->tx_desc_ring[TX_RING(prod)][TX_IDX(prod)]; + flags = (len << TX_BD_LEN_SHIFT) | (1 << TX_BD_FLAGS_BD_CNT_SHIFT) | +@@ -40,30 +40,43 @@ + + prod = NEXT_TX(prod); + txr->tx_prod = prod; ++ return tx_buf; ++} ++ ++static void __bnxt_xmit_xdp(struct bnxt *bp, struct bnxt_tx_ring_info *txr, ++ dma_addr_t mapping, u32 len, u16 rx_prod) ++{ ++ struct bnxt_sw_tx_bd *tx_buf; ++ ++ tx_buf = bnxt_xmit_bd(bp, txr, mapping, len); ++ tx_buf->rx_prod = rx_prod; ++ tx_buf->action = XDP_TX; + } + + void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts) + { + struct bnxt_tx_ring_info *txr = bnapi->tx_ring; + struct bnxt_rx_ring_info *rxr = bnapi->rx_ring; ++ bool rx_doorbell_needed = false; + struct bnxt_sw_tx_bd *tx_buf; + u16 tx_cons = txr->tx_cons; + u16 last_tx_cons = tx_cons; +- u16 rx_prod; + int i; + + for (i = 0; i < nr_pkts; i++) { +- last_tx_cons = tx_cons; ++ tx_buf = &txr->tx_buf_ring[tx_cons]; ++ ++ if (tx_buf->action == XDP_TX) { ++ rx_doorbell_needed = true; ++ last_tx_cons = tx_cons; ++ } + tx_cons = NEXT_TX(tx_cons); + } + txr->tx_cons = tx_cons; +- if (bnxt_tx_avail(bp, txr) == bp->tx_ring_size) { +- rx_prod = rxr->rx_prod; +- } else { ++ if (rx_doorbell_needed) { + tx_buf = &txr->tx_buf_ring[last_tx_cons]; +- rx_prod = tx_buf->rx_prod; ++ bnxt_db_write(bp, &rxr->rx_db, tx_buf->rx_prod); + } +- bnxt_db_write(bp, &rxr->rx_db, rx_prod); + } + + /* returns the following: +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h 2020-02-06 16:23:14.076528151 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h 2020-02-06 16:23:14.228526755 +0100 +@@ -10,8 +10,9 @@ + #ifndef BNXT_XDP_H + #define BNXT_XDP_H + +-void __bnxt_xmit_xdp(struct bnxt *bp, struct bnxt_tx_ring_info *txr, +- dma_addr_t mapping, u32 len, u16 rx_prod); ++struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp, ++ struct bnxt_tx_ring_info *txr, ++ dma_addr_t mapping, u32 len); + void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts); + bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons, + struct page *page, u8 **data_ptr, unsigned int *len, diff --git a/SOURCES/0030-netdrv-bnxt_en-optimized-XDP_REDIRECT-support.patch b/SOURCES/0030-netdrv-bnxt_en-optimized-XDP_REDIRECT-support.patch new file mode 100644 index 0000000..48332e2 --- /dev/null +++ b/SOURCES/0030-netdrv-bnxt_en-optimized-XDP_REDIRECT-support.patch @@ -0,0 +1,288 @@ +From 5e0d15dae3ed578ed72d161b6aaf29b10d6af67a Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:45 -0400 +Subject: [PATCH 30/96] [netdrv] bnxt_en: optimized XDP_REDIRECT support + +Message-id: <874a17aca14370fdeffadc8cf36fe78221e9641f.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276450 +O-Subject: [RHEL-8.2 PATCH 23/78] bnxt_en: optimized XDP_REDIRECT support +Bugzilla: 1724766 1669220 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +This adds basic support for XDP_REDIRECT in the bnxt_en driver. Next +patch adds the more optimized page pool support. + +Signed-off-by: Andy Gospodarek +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit f18c2b77b2e4eec2313d519ba125bd6a069513cf) +Bugzilla: 1724766 +Bugzilla: 1669220 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 27 ++++++- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 13 +++- + drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 108 ++++++++++++++++++++++++-- + drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h | 2 + + 4 files changed, 140 insertions(+), 10 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:13.941529390 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:14.390525268 +0100 +@@ -1991,6 +1991,9 @@ + } + } + ++ if (event & BNXT_REDIRECT_EVENT) ++ xdp_do_flush_map(); ++ + if (event & BNXT_TX_EVENT) { + struct bnxt_tx_ring_info *txr = bnapi->tx_ring; + u16 prod = txr->tx_prod; +@@ -2257,9 +2260,23 @@ + + for (j = 0; j < max_idx;) { + struct bnxt_sw_tx_bd *tx_buf = &txr->tx_buf_ring[j]; +- struct sk_buff *skb = tx_buf->skb; ++ struct sk_buff *skb; + int k, last; + ++ if (i < bp->tx_nr_rings_xdp && ++ tx_buf->action == XDP_REDIRECT) { ++ dma_unmap_single(&pdev->dev, ++ dma_unmap_addr(tx_buf, mapping), ++ dma_unmap_len(tx_buf, len), ++ PCI_DMA_TODEVICE); ++ xdp_return_frame(tx_buf->xdpf); ++ tx_buf->action = 0; ++ tx_buf->xdpf = NULL; ++ j++; ++ continue; ++ } ++ ++ skb = tx_buf->skb; + if (!skb) { + j++; + continue; +@@ -2520,6 +2537,13 @@ + if (rc < 0) + return rc; + ++ rc = xdp_rxq_info_reg_mem_model(&rxr->xdp_rxq, ++ MEM_TYPE_PAGE_SHARED, NULL); ++ if (rc) { ++ xdp_rxq_info_unreg(&rxr->xdp_rxq); ++ return rc; ++ } ++ + rc = bnxt_alloc_ring(bp, &ring->ring_mem); + if (rc) + return rc; +@@ -10251,6 +10275,7 @@ + .ndo_udp_tunnel_add = bnxt_udp_tunnel_add, + .ndo_udp_tunnel_del = bnxt_udp_tunnel_del, + .ndo_bpf = bnxt_xdp, ++ .ndo_xdp_xmit = bnxt_xdp_xmit, + .ndo_bridge_getlink = bnxt_bridge_getlink, + .ndo_bridge_setlink = bnxt_bridge_setlink, + .ndo_get_port_parent_id = bnxt_get_port_parent_id, +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:14.227526765 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:14.390525268 +0100 +@@ -587,13 +587,18 @@ + #define BNXT_HWRM_CHNL_CHIMP 0 + #define BNXT_HWRM_CHNL_KONG 1 + +-#define BNXT_RX_EVENT 1 +-#define BNXT_AGG_EVENT 2 +-#define BNXT_TX_EVENT 4 ++#define BNXT_RX_EVENT 1 ++#define BNXT_AGG_EVENT 2 ++#define BNXT_TX_EVENT 4 ++#define BNXT_REDIRECT_EVENT 8 + + struct bnxt_sw_tx_bd { +- struct sk_buff *skb; ++ union { ++ struct sk_buff *skb; ++ struct xdp_frame *xdpf; ++ }; + DEFINE_DMA_UNMAP_ADDR(mapping); ++ DEFINE_DMA_UNMAP_LEN(len); + u8 is_gso; + u8 is_push; + u8 action; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c 2020-02-06 16:23:14.228526755 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c 2020-02-06 16:23:14.390525268 +0100 +@@ -53,6 +53,20 @@ + tx_buf->action = XDP_TX; + } + ++static void __bnxt_xmit_xdp_redirect(struct bnxt *bp, ++ struct bnxt_tx_ring_info *txr, ++ dma_addr_t mapping, u32 len, ++ struct xdp_frame *xdpf) ++{ ++ struct bnxt_sw_tx_bd *tx_buf; ++ ++ tx_buf = bnxt_xmit_bd(bp, txr, mapping, len); ++ tx_buf->action = XDP_REDIRECT; ++ tx_buf->xdpf = xdpf; ++ dma_unmap_addr_set(tx_buf, mapping, mapping); ++ dma_unmap_len_set(tx_buf, len, 0); ++} ++ + void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts) + { + struct bnxt_tx_ring_info *txr = bnapi->tx_ring; +@@ -66,7 +80,17 @@ + for (i = 0; i < nr_pkts; i++) { + tx_buf = &txr->tx_buf_ring[tx_cons]; + +- if (tx_buf->action == XDP_TX) { ++ if (tx_buf->action == XDP_REDIRECT) { ++ struct pci_dev *pdev = bp->pdev; ++ ++ dma_unmap_single(&pdev->dev, ++ dma_unmap_addr(tx_buf, mapping), ++ dma_unmap_len(tx_buf, len), ++ PCI_DMA_TODEVICE); ++ xdp_return_frame(tx_buf->xdpf); ++ tx_buf->action = 0; ++ tx_buf->xdpf = NULL; ++ } else if (tx_buf->action == XDP_TX) { + rx_doorbell_needed = true; + last_tx_cons = tx_cons; + } +@@ -101,19 +125,19 @@ + return false; + + pdev = bp->pdev; +- txr = rxr->bnapi->tx_ring; + rx_buf = &rxr->rx_buf_ring[cons]; + offset = bp->rx_offset; + ++ mapping = rx_buf->mapping - bp->rx_dma_offset; ++ dma_sync_single_for_cpu(&pdev->dev, mapping + offset, *len, bp->rx_dir); ++ ++ txr = rxr->bnapi->tx_ring; + xdp.data_hard_start = *data_ptr - offset; + xdp.data = *data_ptr; + xdp_set_data_meta_invalid(&xdp); + xdp.data_end = *data_ptr + *len; + xdp.rxq = &rxr->xdp_rxq; + orig_data = xdp.data; +- mapping = rx_buf->mapping - bp->rx_dma_offset; +- +- dma_sync_single_for_cpu(&pdev->dev, mapping + offset, *len, bp->rx_dir); + + rcu_read_lock(); + act = bpf_prog_run_xdp(xdp_prog, &xdp); +@@ -149,6 +173,30 @@ + NEXT_RX(rxr->rx_prod)); + bnxt_reuse_rx_data(rxr, cons, page); + return true; ++ case XDP_REDIRECT: ++ /* if we are calling this here then we know that the ++ * redirect is coming from a frame received by the ++ * bnxt_en driver. ++ */ ++ dma_unmap_page_attrs(&pdev->dev, mapping, ++ PAGE_SIZE, bp->rx_dir, ++ DMA_ATTR_WEAK_ORDERING); ++ ++ /* if we are unable to allocate a new buffer, abort and reuse */ ++ if (bnxt_alloc_rx_data(bp, rxr, rxr->rx_prod, GFP_ATOMIC)) { ++ trace_xdp_exception(bp->dev, xdp_prog, act); ++ bnxt_reuse_rx_data(rxr, cons, page); ++ return true; ++ } ++ ++ if (xdp_do_redirect(bp->dev, &xdp, xdp_prog)) { ++ trace_xdp_exception(bp->dev, xdp_prog, act); ++ __free_page(page); ++ return true; ++ } ++ ++ *event |= BNXT_REDIRECT_EVENT; ++ break; + default: + bpf_warn_invalid_xdp_action(act); + /* Fall thru */ +@@ -162,6 +210,56 @@ + return true; + } + ++int bnxt_xdp_xmit(struct net_device *dev, int num_frames, ++ struct xdp_frame **frames, u32 flags) ++{ ++ struct bnxt *bp = netdev_priv(dev); ++ struct bpf_prog *xdp_prog = READ_ONCE(bp->xdp_prog); ++ struct pci_dev *pdev = bp->pdev; ++ struct bnxt_tx_ring_info *txr; ++ dma_addr_t mapping; ++ int drops = 0; ++ int ring; ++ int i; ++ ++ if (!test_bit(BNXT_STATE_OPEN, &bp->state) || ++ !bp->tx_nr_rings_xdp || ++ !xdp_prog) ++ return -EINVAL; ++ ++ ring = smp_processor_id() % bp->tx_nr_rings_xdp; ++ txr = &bp->tx_ring[ring]; ++ ++ for (i = 0; i < num_frames; i++) { ++ struct xdp_frame *xdp = frames[i]; ++ ++ if (!txr || !bnxt_tx_avail(bp, txr) || ++ !(bp->bnapi[ring]->flags & BNXT_NAPI_FLAG_XDP)) { ++ xdp_return_frame_rx_napi(xdp); ++ drops++; ++ continue; ++ } ++ ++ mapping = dma_map_single(&pdev->dev, xdp->data, xdp->len, ++ DMA_TO_DEVICE); ++ ++ if (dma_mapping_error(&pdev->dev, mapping)) { ++ xdp_return_frame_rx_napi(xdp); ++ drops++; ++ continue; ++ } ++ __bnxt_xmit_xdp_redirect(bp, txr, mapping, xdp->len, xdp); ++ } ++ ++ if (flags & XDP_XMIT_FLUSH) { ++ /* Sync BD data before updating doorbell */ ++ wmb(); ++ bnxt_db_write(bp, &txr->tx_db, txr->tx_prod); ++ } ++ ++ return num_frames - drops; ++} ++ + /* Under rtnl_lock */ + static int bnxt_xdp_set(struct bnxt *bp, struct bpf_prog *prog) + { +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h 2020-02-06 16:23:14.228526755 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h 2020-02-06 16:23:14.390525268 +0100 +@@ -18,5 +18,7 @@ + struct page *page, u8 **data_ptr, unsigned int *len, + u8 *event); + int bnxt_xdp(struct net_device *dev, struct netdev_bpf *xdp); ++int bnxt_xdp_xmit(struct net_device *dev, int num_frames, ++ struct xdp_frame **frames, u32 flags); + + #endif diff --git a/SOURCES/0031-netdrv-bnxt_en-add-page_pool-support.patch b/SOURCES/0031-netdrv-bnxt_en-add-page_pool-support.patch new file mode 100644 index 0000000..75e8346 --- /dev/null +++ b/SOURCES/0031-netdrv-bnxt_en-add-page_pool-support.patch @@ -0,0 +1,194 @@ +From cde6d65ea5063367fa782fcd1ea9fc54cdad4deb Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:46 -0400 +Subject: [PATCH 31/96] [netdrv] bnxt_en: add page_pool support + +Message-id: <5af2e26517985727f11c26b4580740d97a57abce.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276452 +O-Subject: [RHEL-8.2 PATCH 24/78] bnxt_en: add page_pool support +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +This removes contention over page allocation for XDP_REDIRECT actions by +adding page_pool support per queue for the driver. The performance for +XDP_REDIRECT actions scales linearly with the number of cores performing +redirect actions when using the page pools instead of the standard page +allocator. + +v2: Fix up the error path from XDP registration, noted by Ilias Apalodimas. + +Signed-off-by: Andy Gospodarek +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 322b87ca55f2f3936ec9f9de438ef9b2115b5c9b) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 47 +++++++++++++++++++++++---- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 ++ + drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 3 +- + 3 files changed, 46 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:14.390525268 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:14.547523827 +0100 +@@ -54,6 +54,7 @@ + #include + #include + #include ++#include + + #include "bnxt_hsi.h" + #include "bnxt.h" +@@ -670,19 +671,20 @@ + } + + static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping, ++ struct bnxt_rx_ring_info *rxr, + gfp_t gfp) + { + struct device *dev = &bp->pdev->dev; + struct page *page; + +- page = alloc_page(gfp); ++ page = page_pool_dev_alloc_pages(rxr->page_pool); + if (!page) + return NULL; + + *mapping = dma_map_page_attrs(dev, page, 0, PAGE_SIZE, bp->rx_dir, + DMA_ATTR_WEAK_ORDERING); + if (dma_mapping_error(dev, *mapping)) { +- __free_page(page); ++ page_pool_recycle_direct(rxr->page_pool, page); + return NULL; + } + *mapping += bp->rx_dma_offset; +@@ -718,7 +720,8 @@ + dma_addr_t mapping; + + if (BNXT_RX_PAGE_MODE(bp)) { +- struct page *page = __bnxt_alloc_rx_page(bp, &mapping, gfp); ++ struct page *page = ++ __bnxt_alloc_rx_page(bp, &mapping, rxr, gfp); + + if (!page) + return -ENOMEM; +@@ -2363,7 +2366,7 @@ + dma_unmap_page_attrs(&pdev->dev, mapping, + PAGE_SIZE, bp->rx_dir, + DMA_ATTR_WEAK_ORDERING); +- __free_page(data); ++ page_pool_recycle_direct(rxr->page_pool, data); + } else { + dma_unmap_single_attrs(&pdev->dev, mapping, + bp->rx_buf_use_size, +@@ -2500,6 +2503,8 @@ + if (xdp_rxq_info_is_reg(&rxr->xdp_rxq)) + xdp_rxq_info_unreg(&rxr->xdp_rxq); + ++ rxr->page_pool = NULL; ++ + kfree(rxr->rx_tpa); + rxr->rx_tpa = NULL; + +@@ -2514,6 +2519,26 @@ + } + } + ++static int bnxt_alloc_rx_page_pool(struct bnxt *bp, ++ struct bnxt_rx_ring_info *rxr) ++{ ++ struct page_pool_params pp = { 0 }; ++ ++ pp.pool_size = bp->rx_ring_size; ++ pp.nid = dev_to_node(&bp->pdev->dev); ++ pp.dev = &bp->pdev->dev; ++ pp.dma_dir = DMA_BIDIRECTIONAL; ++ ++ rxr->page_pool = page_pool_create(&pp); ++ if (IS_ERR(rxr->page_pool)) { ++ int err = PTR_ERR(rxr->page_pool); ++ ++ rxr->page_pool = NULL; ++ return err; ++ } ++ return 0; ++} ++ + static int bnxt_alloc_rx_rings(struct bnxt *bp) + { + int i, rc, agg_rings = 0, tpa_rings = 0; +@@ -2533,14 +2558,24 @@ + + ring = &rxr->rx_ring_struct; + ++ rc = bnxt_alloc_rx_page_pool(bp, rxr); ++ if (rc) ++ return rc; ++ + rc = xdp_rxq_info_reg(&rxr->xdp_rxq, bp->dev, i); +- if (rc < 0) ++ if (rc < 0) { ++ page_pool_free(rxr->page_pool); ++ rxr->page_pool = NULL; + return rc; ++ } + + rc = xdp_rxq_info_reg_mem_model(&rxr->xdp_rxq, +- MEM_TYPE_PAGE_SHARED, NULL); ++ MEM_TYPE_PAGE_POOL, ++ rxr->page_pool); + if (rc) { + xdp_rxq_info_unreg(&rxr->xdp_rxq); ++ page_pool_free(rxr->page_pool); ++ rxr->page_pool = NULL; + return rc; + } + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:14.390525268 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:14.548523818 +0100 +@@ -26,6 +26,8 @@ + #include + #include + ++struct page_pool; ++ + struct tx_bd { + __le32 tx_bd_len_flags_type; + #define TX_BD_TYPE (0x3f << 0) +@@ -799,6 +801,7 @@ + struct bnxt_ring_struct rx_ring_struct; + struct bnxt_ring_struct rx_agg_ring_struct; + struct xdp_rxq_info xdp_rxq; ++ struct page_pool *page_pool; + }; + + struct bnxt_cp_ring_info { +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c 2020-02-06 16:23:14.390525268 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c 2020-02-06 16:23:14.548523818 +0100 +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + #include "bnxt_hsi.h" + #include "bnxt.h" + #include "bnxt_xdp.h" +@@ -191,7 +192,7 @@ + + if (xdp_do_redirect(bp->dev, &xdp, xdp_prog)) { + trace_xdp_exception(bp->dev, xdp_prog, act); +- __free_page(page); ++ page_pool_recycle_direct(rxr->page_pool, page); + return true; + } + diff --git a/SOURCES/0032-netdrv-bnxt_en-Add-page_pool_destroy-during-RX-ring-.patch b/SOURCES/0032-netdrv-bnxt_en-Add-page_pool_destroy-during-RX-ring-.patch new file mode 100644 index 0000000..f28437f --- /dev/null +++ b/SOURCES/0032-netdrv-bnxt_en-Add-page_pool_destroy-during-RX-ring-.patch @@ -0,0 +1,72 @@ +From da53b34b995100f84ac925275fe36a252166ec52 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:47 -0400 +Subject: [PATCH 32/96] [netdrv] bnxt_en: Add page_pool_destroy() during RX + ring cleanup + +Message-id: +Patchwork-id: 276448 +O-Subject: [RHEL-8.2 PATCH 25/78] bnxt_en: Add page_pool_destroy() during RX ring cleanup. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Add page_pool_destroy() in bnxt_free_rx_rings() during normal RX ring +cleanup, as Ilias has informed us that the following commit has been +merged: + +1da4bbeffe41 ("net: core: page_pool: add user refcnt and reintroduce page_pool_destroy") + +The special error handling code to call page_pool_free() can now be +removed. bnxt_free_rx_rings() will always be called during normal +shutdown or any error paths. + +Fixes: 322b87ca55f2 ("bnxt_en: add page_pool support") +Cc: Ilias Apalodimas +Cc: Andy Gospodarek +Signed-off-by: Michael Chan +Acked-by: Andy Gospodarek +Signed-off-by: David S. Miller +(cherry picked from commit 12479f627f7c2017e6fcd50b56c2537592674c50) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:14.547523827 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:14.697522450 +0100 +@@ -2503,6 +2503,7 @@ + if (xdp_rxq_info_is_reg(&rxr->xdp_rxq)) + xdp_rxq_info_unreg(&rxr->xdp_rxq); + ++ page_pool_destroy(rxr->page_pool); + rxr->page_pool = NULL; + + kfree(rxr->rx_tpa); +@@ -2563,19 +2564,14 @@ + return rc; + + rc = xdp_rxq_info_reg(&rxr->xdp_rxq, bp->dev, i); +- if (rc < 0) { +- page_pool_free(rxr->page_pool); +- rxr->page_pool = NULL; ++ if (rc < 0) + return rc; +- } + + rc = xdp_rxq_info_reg_mem_model(&rxr->xdp_rxq, + MEM_TYPE_PAGE_POOL, + rxr->page_pool); + if (rc) { + xdp_rxq_info_unreg(&rxr->xdp_rxq); +- page_pool_free(rxr->page_pool); +- rxr->page_pool = NULL; + return rc; + } + diff --git a/SOURCES/0033-netdrv-bnxt_en-Fix-VNIC-accounting-when-enabling-aRF.patch b/SOURCES/0033-netdrv-bnxt_en-Fix-VNIC-accounting-when-enabling-aRF.patch new file mode 100644 index 0000000..69feabc --- /dev/null +++ b/SOURCES/0033-netdrv-bnxt_en-Fix-VNIC-accounting-when-enabling-aRF.patch @@ -0,0 +1,64 @@ +From a14a9a4590a264a697d4749b4ec88ffbb9a6bc2f Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:48 -0400 +Subject: [PATCH 33/96] [netdrv] bnxt_en: Fix VNIC accounting when enabling + aRFS on 57500 chips + +Message-id: <7579696a1f5495cda9cfb3e7b819d0ce20cc022b.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276453 +O-Subject: [RHEL-8.2 PATCH 26/78] bnxt_en: Fix VNIC accounting when enabling aRFS on 57500 chips. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Unlike legacy chips, 57500 chips don't need additional VNIC resources +for aRFS/ntuple. Fix the code accordingly so that we don't reserve +and allocate additional VNICs on 57500 chips. Without this patch, +the driver is failing to initialize when it tries to allocate extra +VNICs. + +Fixes: ac33906c67e2 ("bnxt_en: Add support for aRFS on 57500 chips.") +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 9b3d15e6b05e0b916be5fbd915f90300a403098b) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:14.697522450 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:14.827521257 +0100 +@@ -3080,7 +3080,7 @@ + int num_vnics = 1; + + #ifdef CONFIG_RFS_ACCEL +- if (bp->flags & BNXT_FLAG_RFS) ++ if ((bp->flags & (BNXT_FLAG_RFS | BNXT_FLAG_CHIP_P5)) == BNXT_FLAG_RFS) + num_vnics += bp->rx_nr_rings; + #endif + +@@ -7191,6 +7191,9 @@ + #ifdef CONFIG_RFS_ACCEL + int i, rc = 0; + ++ if (bp->flags & BNXT_FLAG_CHIP_P5) ++ return 0; ++ + for (i = 0; i < bp->rx_nr_rings; i++) { + struct bnxt_vnic_info *vnic; + u16 vnic_id = i + 1; +@@ -9650,7 +9653,7 @@ + return -ENOMEM; + + vnics = 1; +- if (bp->flags & BNXT_FLAG_RFS) ++ if ((bp->flags & (BNXT_FLAG_RFS | BNXT_FLAG_CHIP_P5)) == BNXT_FLAG_RFS) + vnics += rx_rings; + + if (bp->flags & BNXT_FLAG_AGG_RINGS) diff --git a/SOURCES/0034-netdrv-bnxt_en-Fix-VNIC-clearing-logic-for-57500-chi.patch b/SOURCES/0034-netdrv-bnxt_en-Fix-VNIC-clearing-logic-for-57500-chi.patch new file mode 100644 index 0000000..5a7a27b --- /dev/null +++ b/SOURCES/0034-netdrv-bnxt_en-Fix-VNIC-clearing-logic-for-57500-chi.patch @@ -0,0 +1,77 @@ +From dbe4cfd4c9843b1273f200131b94a525b58081ae Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:49 -0400 +Subject: [PATCH 34/96] [netdrv] bnxt_en: Fix VNIC clearing logic for 57500 + chips + +Message-id: <35f3ca679fd3fa079ba85558e610e106471c630f.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276449 +O-Subject: [RHEL-8.2 PATCH 27/78] bnxt_en: Fix VNIC clearing logic for 57500 chips. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +During device shutdown, the VNIC clearing sequence needs to be modified +to free the VNIC first before freeing the RSS contexts. The current +code is doing the reverse and we can get mis-directed RX completions +to CP ring ID 0 when the RSS contexts are freed and zeroed. The clearing +of RSS contexts is not required with the new sequence. + +Refactor the VNIC clearing logic into a new function bnxt_clear_vnic() +and do the chip specific VNIC clearing sequence. + +Fixes: 7b3af4f75b81 ("bnxt_en: Add RSS support for 57500 chips.") +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit a46ecb116fb7f722fa8cb2da01959c36e4e10c41) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 26 ++++++++++++++++++-------- + 1 file changed, 18 insertions(+), 8 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:14.827521257 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:14.964520000 +0100 +@@ -7021,19 +7021,29 @@ + bnxt_hwrm_vnic_set_rss(bp, i, false); + } + +-static void bnxt_hwrm_resource_free(struct bnxt *bp, bool close_path, +- bool irq_re_init) ++static void bnxt_clear_vnic(struct bnxt *bp) + { +- if (bp->vnic_info) { +- bnxt_hwrm_clear_vnic_filter(bp); ++ if (!bp->vnic_info) ++ return; ++ ++ bnxt_hwrm_clear_vnic_filter(bp); ++ if (!(bp->flags & BNXT_FLAG_CHIP_P5)) { + /* clear all RSS setting before free vnic ctx */ + bnxt_hwrm_clear_vnic_rss(bp); + bnxt_hwrm_vnic_ctx_free(bp); +- /* before free the vnic, undo the vnic tpa settings */ +- if (bp->flags & BNXT_FLAG_TPA) +- bnxt_set_tpa(bp, false); +- bnxt_hwrm_vnic_free(bp); + } ++ /* before free the vnic, undo the vnic tpa settings */ ++ if (bp->flags & BNXT_FLAG_TPA) ++ bnxt_set_tpa(bp, false); ++ bnxt_hwrm_vnic_free(bp); ++ if (bp->flags & BNXT_FLAG_CHIP_P5) ++ bnxt_hwrm_vnic_ctx_free(bp); ++} ++ ++static void bnxt_hwrm_resource_free(struct bnxt *bp, bool close_path, ++ bool irq_re_init) ++{ ++ bnxt_clear_vnic(bp); + bnxt_hwrm_ring_free(bp, close_path); + bnxt_hwrm_ring_grp_free(bp); + if (irq_re_init) { diff --git a/SOURCES/0035-netdrv-bnxt_en-Improve-RX-doorbell-sequence.patch b/SOURCES/0035-netdrv-bnxt_en-Improve-RX-doorbell-sequence.patch new file mode 100644 index 0000000..1a9664a --- /dev/null +++ b/SOURCES/0035-netdrv-bnxt_en-Improve-RX-doorbell-sequence.patch @@ -0,0 +1,88 @@ +From a63a2a674ca076e657998c0bf05c4ce52f3df200 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:50 -0400 +Subject: [PATCH 35/96] [netdrv] bnxt_en: Improve RX doorbell sequence + +Message-id: +Patchwork-id: 276454 +O-Subject: [RHEL-8.2 PATCH 28/78] bnxt_en: Improve RX doorbell sequence. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +When both RX buffers and RX aggregation buffers have to be +replenished at the end of NAPI, post the RX aggregation buffers first +before RX buffers. Otherwise, we may run into a situation where +there are only RX buffers without RX aggregation buffers for a split +second. This will cause the hardware to abort the RX packet and +report buffer errors, which will cause unnecessary cleanup by the +driver. + +Ringing the Aggregation ring doorbell first before the RX ring doorbell +will prevent some of these buffer errors. Use the same sequence during +ring initialization as well. + +Fixes: 697197e5a173 ("bnxt_en: Re-structure doorbells.") +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit e8f267b063208372f7a329c6d5288d58944d873c) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:14.964520000 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:15.092518825 +0100 +@@ -2023,9 +2023,9 @@ + if (bnapi->events & BNXT_RX_EVENT) { + struct bnxt_rx_ring_info *rxr = bnapi->rx_ring; + +- bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod); + if (bnapi->events & BNXT_AGG_EVENT) + bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod); ++ bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod); + } + bnapi->events = 0; + } +@@ -5069,6 +5069,7 @@ + + static int bnxt_hwrm_ring_alloc(struct bnxt *bp) + { ++ bool agg_rings = !!(bp->flags & BNXT_FLAG_AGG_RINGS); + int i, rc = 0; + u32 type; + +@@ -5144,7 +5145,9 @@ + if (rc) + goto err_out; + bnxt_set_db(bp, &rxr->rx_db, type, map_idx, ring->fw_ring_id); +- bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod); ++ /* If we have agg rings, post agg buffers first. */ ++ if (!agg_rings) ++ bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod); + bp->grp_info[map_idx].rx_fw_ring_id = ring->fw_ring_id; + if (bp->flags & BNXT_FLAG_CHIP_P5) { + struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring; +@@ -5163,7 +5166,7 @@ + } + } + +- if (bp->flags & BNXT_FLAG_AGG_RINGS) { ++ if (agg_rings) { + type = HWRM_RING_ALLOC_AGG; + for (i = 0; i < bp->rx_nr_rings; i++) { + struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; +@@ -5179,6 +5182,7 @@ + bnxt_set_db(bp, &rxr->rx_agg_db, type, map_idx, + ring->fw_ring_id); + bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod); ++ bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod); + bp->grp_info[grp_idx].agg_fw_ring_id = ring->fw_ring_id; + } + } diff --git a/SOURCES/0036-netdrv-bnxt_en-Fix-handling-FRAG_ERR-when-NVM_INSTAL.patch b/SOURCES/0036-netdrv-bnxt_en-Fix-handling-FRAG_ERR-when-NVM_INSTAL.patch new file mode 100644 index 0000000..ac5e01a --- /dev/null +++ b/SOURCES/0036-netdrv-bnxt_en-Fix-handling-FRAG_ERR-when-NVM_INSTAL.patch @@ -0,0 +1,63 @@ +From 97b39f6254351e160a853289bd1e3336ce6f83d3 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:51 -0400 +Subject: [PATCH 36/96] [netdrv] bnxt_en: Fix handling FRAG_ERR when + NVM_INSTALL_UPDATE cmd fails + +Message-id: +Patchwork-id: 276455 +O-Subject: [RHEL-8.2 PATCH 29/78] bnxt_en: Fix handling FRAG_ERR when NVM_INSTALL_UPDATE cmd fails +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +If FW returns FRAG_ERR in response error code, driver is resending the +command only when HWRM command returns success. Fix the code to resend +NVM_INSTALL_UPDATE command with DEFRAG install flags, if FW returns +FRAG_ERR in its response error code. + +Fixes: cb4d1d626145 ("bnxt_en: Retry failed NVM_INSTALL_UPDATE with defragmentation flag enabled.") +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit dd2ebf3404c7c295014bc025dea23960960ceb1a) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 12 +++++------- + 1 file changed, 5 insertions(+), 7 deletions(-) + +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:14.228526755 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:15.223517622 +0100 +@@ -2016,21 +2016,19 @@ + mutex_lock(&bp->hwrm_cmd_lock); + hwrm_err = _hwrm_send_message(bp, &install, sizeof(install), + INSTALL_PACKAGE_TIMEOUT); +- if (hwrm_err) +- goto flash_pkg_exit; +- +- if (resp->error_code) { ++ if (hwrm_err) { + u8 error_code = ((struct hwrm_err_output *)resp)->cmd_err; + +- if (error_code == NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) { ++ if (resp->error_code && error_code == ++ NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) { + install.flags |= cpu_to_le16( + NVM_INSTALL_UPDATE_REQ_FLAGS_ALLOWED_TO_DEFRAG); + hwrm_err = _hwrm_send_message(bp, &install, + sizeof(install), + INSTALL_PACKAGE_TIMEOUT); +- if (hwrm_err) +- goto flash_pkg_exit; + } ++ if (hwrm_err) ++ goto flash_pkg_exit; + } + + if (resp->result) { diff --git a/SOURCES/0037-netdrv-bnxt_en-Use-correct-src_fid-to-determine-dire.patch b/SOURCES/0037-netdrv-bnxt_en-Use-correct-src_fid-to-determine-dire.patch new file mode 100644 index 0000000..0427e49 --- /dev/null +++ b/SOURCES/0037-netdrv-bnxt_en-Use-correct-src_fid-to-determine-dire.patch @@ -0,0 +1,54 @@ +From c6fc223ec3d9a83bd206c14fa5ad064cee76f21a Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:52 -0400 +Subject: [PATCH 37/96] [netdrv] bnxt_en: Use correct src_fid to determine + direction of the flow + +Message-id: <5d51854166a66f196a410e05a77ee9b68a95e4df.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276456 +O-Subject: [RHEL-8.2 PATCH 30/78] bnxt_en: Use correct src_fid to determine direction of the flow +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Direction of the flow is determined using src_fid. For an RX flow, +src_fid is PF's fid and for TX flow, src_fid is VF's fid. Direction +of the flow must be specified, when getting statistics for that flow. +Currently, for DECAP flow, direction is determined incorrectly, i.e., +direction is initialized as TX for DECAP flow, instead of RX. Because +of which, stats are not reported for this DECAP flow, though it is +offloaded and there is traffic for that flow, resulting in flow age out. + +This patch fixes the problem by determining the DECAP flow's direction +using correct fid. Set the flow direction in all cases for consistency +even if 64-bit flow handle is not used. + +Fixes: abd43a13525d ("bnxt_en: Support for 64-bit flow handle.") +Signed-off-by: Venkat Duvvuru +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 685ec6a81bb0d47faf1dba49437d5bdaede2733d) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c 2020-02-06 16:23:12.415543397 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c 2020-02-06 16:23:15.352516438 +0100 +@@ -1285,9 +1285,7 @@ + goto free_node; + + bnxt_tc_set_src_fid(bp, flow, src_fid); +- +- if (bp->fw_cap & BNXT_FW_CAP_OVS_64BIT_HANDLE) +- bnxt_tc_set_flow_dir(bp, flow, src_fid); ++ bnxt_tc_set_flow_dir(bp, flow, flow->src_fid); + + if (!bnxt_tc_can_offload(bp, flow)) { + rc = -EOPNOTSUPP; diff --git a/SOURCES/0038-netdrv-bnxt_en-Fix-to-include-flow-direction-in-L2-k.patch b/SOURCES/0038-netdrv-bnxt_en-Fix-to-include-flow-direction-in-L2-k.patch new file mode 100644 index 0000000..30dbe2d --- /dev/null +++ b/SOURCES/0038-netdrv-bnxt_en-Fix-to-include-flow-direction-in-L2-k.patch @@ -0,0 +1,88 @@ +From 3a8601f1dc8e341392bde4484716cdb1dd32e0f9 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:53 -0400 +Subject: [PATCH 38/96] [netdrv] bnxt_en: Fix to include flow direction in L2 + key + +Message-id: <6991949fd7b4b1a47fac9013c2aaeae8f97cac3f.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276457 +O-Subject: [RHEL-8.2 PATCH 31/78] bnxt_en: Fix to include flow direction in L2 key +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +FW expects the driver to provide unique flow reference handles +for Tx or Rx flows. When a Tx flow and an Rx flow end up sharing +a reference handle, flow offload does not seem to work. +This could happen in the case of 2 flows having their L2 fields +wildcarded but in different direction. +Fix to incorporate the flow direction as part of the L2 key + +v2: Move the dir field to the end of the bnxt_tc_l2_key struct to +fix the warning reported by kbuild test robot . +There is existing code that initializes the structure using +nested initializer and will warn with the new u8 field added to +the beginning. The structure also packs nicer when this new u8 is +added to the end of the structure [MChan]. + +Fixes: abd43a13525d ("bnxt_en: Support for 64-bit flow handle.") +Signed-off-by: Somnath Kotur +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 9bf46566e80fd94845527d01ebd888eb49313551) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c | 4 ++-- + drivers/net/ethernet/broadcom/bnxt/bnxt_tc.h | 6 +++--- + 2 files changed, 5 insertions(+), 5 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c 2020-02-06 16:23:15.352516438 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c 2020-02-06 16:23:15.476515300 +0100 +@@ -1236,7 +1236,7 @@ + static void bnxt_tc_set_flow_dir(struct bnxt *bp, struct bnxt_tc_flow *flow, + u16 src_fid) + { +- flow->dir = (bp->pf.fw_fid == src_fid) ? BNXT_DIR_RX : BNXT_DIR_TX; ++ flow->l2_key.dir = (bp->pf.fw_fid == src_fid) ? BNXT_DIR_RX : BNXT_DIR_TX; + } + + static void bnxt_tc_set_src_fid(struct bnxt *bp, struct bnxt_tc_flow *flow, +@@ -1405,7 +1405,7 @@ + * 2. 15th bit of flow_handle must specify the flow + * direction (TX/RX). + */ +- if (flow_node->flow.dir == BNXT_DIR_RX) ++ if (flow_node->flow.l2_key.dir == BNXT_DIR_RX) + handle = CFA_FLOW_INFO_REQ_FLOW_HANDLE_DIR_RX | + CFA_FLOW_INFO_REQ_FLOW_HANDLE_MAX_MASK; + else +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.h 2020-02-06 16:22:55.940694623 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.h 2020-02-06 16:23:15.476515300 +0100 +@@ -23,6 +23,9 @@ + __be16 inner_vlan_tci; + __be16 ether_type; + u8 num_vlans; ++ u8 dir; ++#define BNXT_DIR_RX 1 ++#define BNXT_DIR_TX 0 + }; + + struct bnxt_tc_l3_key { +@@ -98,9 +101,6 @@ + + /* flow applicable to pkts ingressing on this fid */ + u16 src_fid; +- u8 dir; +-#define BNXT_DIR_RX 1 +-#define BNXT_DIR_TX 0 + struct bnxt_tc_l2_key l2_key; + struct bnxt_tc_l2_key l2_mask; + struct bnxt_tc_l3_key l3_key; diff --git a/SOURCES/0039-netdrv-bnxt_en-Suppress-HWRM-errors-for-HWRM_NVM_GET.patch b/SOURCES/0039-netdrv-bnxt_en-Suppress-HWRM-errors-for-HWRM_NVM_GET.patch new file mode 100644 index 0000000..9f299e6 --- /dev/null +++ b/SOURCES/0039-netdrv-bnxt_en-Suppress-HWRM-errors-for-HWRM_NVM_GET.patch @@ -0,0 +1,52 @@ +From befaad00d846a0d60e0f997d913e64a67fe79b66 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:54 -0400 +Subject: [PATCH 39/96] [netdrv] bnxt_en: Suppress HWRM errors for + HWRM_NVM_GET_VARIABLE command + +Message-id: <3f152c462aacd24f8159b158cf6d29d8089a1b6e.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276459 +O-Subject: [RHEL-8.2 PATCH 32/78] bnxt_en: Suppress HWRM errors for HWRM_NVM_GET_VARIABLE command +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +For newly added NVM parameters, older firmware may not have the support. +Suppress the error message to avoid the unncessary error message which is +triggered when devlink calls the driver during initialization. + +Fixes: 782a624d00fa ("bnxt_en: Add bnxt_en initial params table and register it.") +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit b703ba751dbb4bcd086509ed4b28102bc1670b35) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:12.277544664 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:15.606514107 +0100 +@@ -98,10 +98,13 @@ + if (idx) + req->dimensions = cpu_to_le16(1); + +- if (req->req_type == cpu_to_le16(HWRM_NVM_SET_VARIABLE)) ++ if (req->req_type == cpu_to_le16(HWRM_NVM_SET_VARIABLE)) { + memcpy(data_addr, buf, bytesize); +- +- rc = hwrm_send_message(bp, msg, msg_len, HWRM_CMD_TIMEOUT); ++ rc = hwrm_send_message(bp, msg, msg_len, HWRM_CMD_TIMEOUT); ++ } else { ++ rc = hwrm_send_message_silent(bp, msg, msg_len, ++ HWRM_CMD_TIMEOUT); ++ } + if (!rc && req->req_type == cpu_to_le16(HWRM_NVM_GET_VARIABLE)) + memcpy(buf, data_addr, bytesize); + diff --git a/SOURCES/0040-netdrv-bnxt_en-Update-firmware-interface-spec.-to-1..patch b/SOURCES/0040-netdrv-bnxt_en-Update-firmware-interface-spec.-to-1..patch new file mode 100644 index 0000000..307e639 --- /dev/null +++ b/SOURCES/0040-netdrv-bnxt_en-Update-firmware-interface-spec.-to-1..patch @@ -0,0 +1,327 @@ +From bb970cfdc4d465839a47e12e5979d51b6895e412 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:55 -0400 +Subject: [PATCH 40/96] [netdrv] bnxt_en: Update firmware interface spec. to + 1.10.0.89 + +Message-id: +Patchwork-id: 276458 +O-Subject: [RHEL-8.2 PATCH 33/78] bnxt_en: Update firmware interface spec. to 1.10.0.89. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Among the changes are new CoS discard counters and new ctx_hw_stats_ext +struct for the latest 5750X B0 chips. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 2792b5b95ed5f38279da08f467a490687332324d) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 15 +++ + drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h | 109 ++++++++++++++++++---- + 2 files changed, 108 insertions(+), 16 deletions(-) + +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:15.223517622 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:15.727512996 +0100 +@@ -207,6 +207,20 @@ + BNXT_TX_STATS_EXT_COS_ENTRY(6), \ + BNXT_TX_STATS_EXT_COS_ENTRY(7) \ + ++#define BNXT_RX_STATS_EXT_DISCARD_COS_ENTRY(n) \ ++ BNXT_RX_STATS_EXT_ENTRY(rx_discard_bytes_cos##n), \ ++ BNXT_RX_STATS_EXT_ENTRY(rx_discard_packets_cos##n) ++ ++#define BNXT_RX_STATS_EXT_DISCARD_COS_ENTRIES \ ++ BNXT_RX_STATS_EXT_DISCARD_COS_ENTRY(0), \ ++ BNXT_RX_STATS_EXT_DISCARD_COS_ENTRY(1), \ ++ BNXT_RX_STATS_EXT_DISCARD_COS_ENTRY(2), \ ++ BNXT_RX_STATS_EXT_DISCARD_COS_ENTRY(3), \ ++ BNXT_RX_STATS_EXT_DISCARD_COS_ENTRY(4), \ ++ BNXT_RX_STATS_EXT_DISCARD_COS_ENTRY(5), \ ++ BNXT_RX_STATS_EXT_DISCARD_COS_ENTRY(6), \ ++ BNXT_RX_STATS_EXT_DISCARD_COS_ENTRY(7) ++ + #define BNXT_RX_STATS_PRI_ENTRY(counter, n) \ + { BNXT_RX_STATS_EXT_OFFSET(counter##_cos0), \ + __stringify(counter##_pri##n) } +@@ -352,6 +366,7 @@ + BNXT_RX_STATS_EXT_ENTRY(rx_buffer_passed_threshold), + BNXT_RX_STATS_EXT_ENTRY(rx_pcs_symbol_err), + BNXT_RX_STATS_EXT_ENTRY(rx_corrected_bits), ++ BNXT_RX_STATS_EXT_DISCARD_COS_ENTRIES, + }; + + static const struct { +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h 2020-02-06 16:23:12.696540818 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h 2020-02-06 16:23:15.728512987 +0100 +@@ -1,7 +1,8 @@ + /* Broadcom NetXtreme-C/E network driver. + * + * Copyright (c) 2014-2016 Broadcom Corporation +- * Copyright (c) 2016-2019 Broadcom Limited ++ * Copyright (c) 2014-2018 Broadcom Limited ++ * Copyright (c) 2018-2019 Broadcom Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -39,15 +40,15 @@ + #define TLV_TYPE_ROCE_SP_COMMAND 0x3UL + #define TLV_TYPE_QUERY_ROCE_CC_GEN1 0x4UL + #define TLV_TYPE_MODIFY_ROCE_CC_GEN1 0x5UL +-#define TLV_TYPE_ENGINE_CKV_DEVICE_SERIAL_NUMBER 0x8001UL +-#define TLV_TYPE_ENGINE_CKV_NONCE 0x8002UL ++#define TLV_TYPE_ENGINE_CKV_ALIAS_ECC_PUBLIC_KEY 0x8001UL + #define TLV_TYPE_ENGINE_CKV_IV 0x8003UL + #define TLV_TYPE_ENGINE_CKV_AUTH_TAG 0x8004UL + #define TLV_TYPE_ENGINE_CKV_CIPHERTEXT 0x8005UL + #define TLV_TYPE_ENGINE_CKV_ALGORITHMS 0x8006UL +-#define TLV_TYPE_ENGINE_CKV_ECC_PUBLIC_KEY 0x8007UL ++#define TLV_TYPE_ENGINE_CKV_HOST_ECC_PUBLIC_KEY 0x8007UL + #define TLV_TYPE_ENGINE_CKV_ECDSA_SIGNATURE 0x8008UL +-#define TLV_TYPE_LAST TLV_TYPE_ENGINE_CKV_ECDSA_SIGNATURE ++#define TLV_TYPE_ENGINE_CKV_SRT_ECC_PUBLIC_KEY 0x8009UL ++#define TLV_TYPE_LAST TLV_TYPE_ENGINE_CKV_SRT_ECC_PUBLIC_KEY + + + /* tlv (size:64b/8B) */ +@@ -267,7 +268,6 @@ + #define HWRM_CFA_EEM_OP 0x123UL + #define HWRM_CFA_ADV_FLOW_MGNT_QCAPS 0x124UL + #define HWRM_CFA_TFLIB 0x125UL +- #define HWRM_ENGINE_CKV_HELLO 0x12dUL + #define HWRM_ENGINE_CKV_STATUS 0x12eUL + #define HWRM_ENGINE_CKV_CKEK_ADD 0x12fUL + #define HWRM_ENGINE_CKV_CKEK_DELETE 0x130UL +@@ -313,6 +313,7 @@ + #define HWRM_FUNC_BACKING_STORE_QCFG 0x194UL + #define HWRM_FUNC_VF_BW_CFG 0x195UL + #define HWRM_FUNC_VF_BW_QCFG 0x196UL ++ #define HWRM_FUNC_HOST_PF_IDS_QUERY 0x197UL + #define HWRM_SELFTEST_QLIST 0x200UL + #define HWRM_SELFTEST_EXEC 0x201UL + #define HWRM_SELFTEST_IRQ 0x202UL +@@ -410,8 +411,8 @@ + #define HWRM_VERSION_MAJOR 1 + #define HWRM_VERSION_MINOR 10 + #define HWRM_VERSION_UPDATE 0 +-#define HWRM_VERSION_RSVD 69 +-#define HWRM_VERSION_STR "1.10.0.69" ++#define HWRM_VERSION_RSVD 89 ++#define HWRM_VERSION_STR "1.10.0.89" + + /* hwrm_ver_get_input (size:192b/24B) */ + struct hwrm_ver_get_input { +@@ -624,6 +625,8 @@ + #define ASYNC_EVENT_CMPL_EVENT_ID_TCP_FLAG_ACTION_CHANGE 0x3aUL + #define ASYNC_EVENT_CMPL_EVENT_ID_EEM_FLOW_ACTIVE 0x3bUL + #define ASYNC_EVENT_CMPL_EVENT_ID_EEM_CFG_CHANGE 0x3cUL ++ #define ASYNC_EVENT_CMPL_EVENT_ID_TFLIB_DEFAULT_VNIC_CHANGE 0x3dUL ++ #define ASYNC_EVENT_CMPL_EVENT_ID_TFLIB_LINK_STATUS_CHANGE 0x3eUL + #define ASYNC_EVENT_CMPL_EVENT_ID_FW_TRACE_MSG 0xfeUL + #define ASYNC_EVENT_CMPL_EVENT_ID_HWRM_ERROR 0xffUL + #define ASYNC_EVENT_CMPL_EVENT_ID_LAST ASYNC_EVENT_CMPL_EVENT_ID_HWRM_ERROR +@@ -1122,6 +1125,7 @@ + #define FUNC_QCFG_RESP_FLAGS_MULTI_HOST 0x20UL + #define FUNC_QCFG_RESP_FLAGS_TRUSTED_VF 0x40UL + #define FUNC_QCFG_RESP_FLAGS_SECURE_MODE_ENABLED 0x80UL ++ #define FUNC_QCFG_RESP_FLAGS_PREBOOT_LEGACY_L2_RINGS 0x100UL + u8 mac_address[6]; + __le16 pci_id; + __le16 alloc_rsscos_ctx; +@@ -1241,6 +1245,7 @@ + #define FUNC_CFG_REQ_FLAGS_DYNAMIC_TX_RING_ALLOC 0x400000UL + #define FUNC_CFG_REQ_FLAGS_NQ_ASSETS_TEST 0x800000UL + #define FUNC_CFG_REQ_FLAGS_TRUSTED_VF_DISABLE 0x1000000UL ++ #define FUNC_CFG_REQ_FLAGS_PREBOOT_LEGACY_L2_RINGS 0x2000000UL + __le32 enables; + #define FUNC_CFG_REQ_ENABLES_MTU 0x1UL + #define FUNC_CFG_REQ_ENABLES_MRU 0x2UL +@@ -2916,7 +2921,7 @@ + __le64 pfc_pri7_tx_transitions; + }; + +-/* rx_port_stats_ext (size:2624b/328B) */ ++/* rx_port_stats_ext (size:3648b/456B) */ + struct rx_port_stats_ext { + __le64 link_down_events; + __le64 continuous_pause_events; +@@ -2959,6 +2964,22 @@ + __le64 rx_buffer_passed_threshold; + __le64 rx_pcs_symbol_err; + __le64 rx_corrected_bits; ++ __le64 rx_discard_bytes_cos0; ++ __le64 rx_discard_bytes_cos1; ++ __le64 rx_discard_bytes_cos2; ++ __le64 rx_discard_bytes_cos3; ++ __le64 rx_discard_bytes_cos4; ++ __le64 rx_discard_bytes_cos5; ++ __le64 rx_discard_bytes_cos6; ++ __le64 rx_discard_bytes_cos7; ++ __le64 rx_discard_packets_cos0; ++ __le64 rx_discard_packets_cos1; ++ __le64 rx_discard_packets_cos2; ++ __le64 rx_discard_packets_cos3; ++ __le64 rx_discard_packets_cos4; ++ __le64 rx_discard_packets_cos5; ++ __le64 rx_discard_packets_cos6; ++ __le64 rx_discard_packets_cos7; + }; + + /* hwrm_port_qstats_ext_input (size:320b/40B) */ +@@ -6115,6 +6136,21 @@ + u8 valid; + }; + ++/* hwrm_cfa_flow_alloc_cmd_err (size:64b/8B) */ ++struct hwrm_cfa_flow_alloc_cmd_err { ++ u8 code; ++ #define CFA_FLOW_ALLOC_CMD_ERR_CODE_UNKNOWN 0x0UL ++ #define CFA_FLOW_ALLOC_CMD_ERR_CODE_L2_CONTEXT_TCAM 0x1UL ++ #define CFA_FLOW_ALLOC_CMD_ERR_CODE_ACTION_RECORD 0x2UL ++ #define CFA_FLOW_ALLOC_CMD_ERR_CODE_FLOW_COUNTER 0x3UL ++ #define CFA_FLOW_ALLOC_CMD_ERR_CODE_WILD_CARD_TCAM 0x4UL ++ #define CFA_FLOW_ALLOC_CMD_ERR_CODE_HASH_COLLISION 0x5UL ++ #define CFA_FLOW_ALLOC_CMD_ERR_CODE_KEY_EXISTS 0x6UL ++ #define CFA_FLOW_ALLOC_CMD_ERR_CODE_FLOW_CTXT_DB 0x7UL ++ #define CFA_FLOW_ALLOC_CMD_ERR_CODE_LAST CFA_FLOW_ALLOC_CMD_ERR_CODE_FLOW_CTXT_DB ++ u8 unused_0[7]; ++}; ++ + /* hwrm_cfa_flow_free_input (size:256b/32B) */ + struct hwrm_cfa_flow_free_input { + __le16 req_type; +@@ -6305,7 +6341,7 @@ + __le32 unused_0; + }; + +-/* hwrm_cfa_eem_qcaps_output (size:256b/32B) */ ++/* hwrm_cfa_eem_qcaps_output (size:320b/40B) */ + struct hwrm_cfa_eem_qcaps_output { + __le16 error_code; + __le16 req_type; +@@ -6322,15 +6358,17 @@ + #define CFA_EEM_QCAPS_RESP_SUPPORTED_KEY1_TABLE 0x2UL + #define CFA_EEM_QCAPS_RESP_SUPPORTED_EXTERNAL_RECORD_TABLE 0x4UL + #define CFA_EEM_QCAPS_RESP_SUPPORTED_EXTERNAL_FLOW_COUNTERS_TABLE 0x8UL ++ #define CFA_EEM_QCAPS_RESP_SUPPORTED_FID_TABLE 0x10UL + __le32 max_entries_supported; + __le16 key_entry_size; + __le16 record_entry_size; + __le16 efc_entry_size; +- u8 unused_1; ++ __le16 fid_entry_size; ++ u8 unused_1[7]; + u8 valid; + }; + +-/* hwrm_cfa_eem_cfg_input (size:320b/40B) */ ++/* hwrm_cfa_eem_cfg_input (size:384b/48B) */ + struct hwrm_cfa_eem_cfg_input { + __le16 req_type; + __le16 cmpl_ring; +@@ -6350,6 +6388,9 @@ + __le16 key1_ctx_id; + __le16 record_ctx_id; + __le16 efc_ctx_id; ++ __le16 fid_ctx_id; ++ __le16 unused_2; ++ __le32 unused_3; + }; + + /* hwrm_cfa_eem_cfg_output (size:128b/16B) */ +@@ -6375,7 +6416,7 @@ + __le32 unused_0; + }; + +-/* hwrm_cfa_eem_qcfg_output (size:192b/24B) */ ++/* hwrm_cfa_eem_qcfg_output (size:256b/32B) */ + struct hwrm_cfa_eem_qcfg_output { + __le16 error_code; + __le16 req_type; +@@ -6386,7 +6427,12 @@ + #define CFA_EEM_QCFG_RESP_FLAGS_PATH_RX 0x2UL + #define CFA_EEM_QCFG_RESP_FLAGS_PREFERRED_OFFLOAD 0x4UL + __le32 num_entries; +- u8 unused_0[7]; ++ __le16 key0_ctx_id; ++ __le16 key1_ctx_id; ++ __le16 record_ctx_id; ++ __le16 efc_ctx_id; ++ __le16 fid_ctx_id; ++ u8 unused_2[5]; + u8 valid; + }; + +@@ -6567,6 +6613,31 @@ + __le64 tpa_aborts; + }; + ++/* ctx_hw_stats_ext (size:1344b/168B) */ ++struct ctx_hw_stats_ext { ++ __le64 rx_ucast_pkts; ++ __le64 rx_mcast_pkts; ++ __le64 rx_bcast_pkts; ++ __le64 rx_discard_pkts; ++ __le64 rx_drop_pkts; ++ __le64 rx_ucast_bytes; ++ __le64 rx_mcast_bytes; ++ __le64 rx_bcast_bytes; ++ __le64 tx_ucast_pkts; ++ __le64 tx_mcast_pkts; ++ __le64 tx_bcast_pkts; ++ __le64 tx_discard_pkts; ++ __le64 tx_drop_pkts; ++ __le64 tx_ucast_bytes; ++ __le64 tx_mcast_bytes; ++ __le64 tx_bcast_bytes; ++ __le64 rx_tpa_eligible_pkt; ++ __le64 rx_tpa_eligible_bytes; ++ __le64 rx_tpa_pkt; ++ __le64 rx_tpa_bytes; ++ __le64 rx_tpa_errors; ++}; ++ + /* hwrm_stat_ctx_alloc_input (size:256b/32B) */ + struct hwrm_stat_ctx_alloc_input { + __le16 req_type; +@@ -6578,7 +6649,8 @@ + __le32 update_period_ms; + u8 stat_ctx_flags; + #define STAT_CTX_ALLOC_REQ_STAT_CTX_FLAGS_ROCE 0x1UL +- u8 unused_0[3]; ++ u8 unused_0; ++ __le16 stats_dma_length; + }; + + /* hwrm_stat_ctx_alloc_output (size:128b/16B) */ +@@ -7204,7 +7276,9 @@ + u8 version_hi; + u8 version_low; + u8 seg_flags; +- u8 unused_0[7]; ++ u8 compress_flags; ++ #define SFLAG_COMPRESSED_ZLIB 0x1UL ++ u8 unused_0[6]; + }; + + /* hwrm_dbg_coredump_list_input (size:256b/32B) */ +@@ -7729,6 +7803,9 @@ + #define NVM_SET_VARIABLE_REQ_FLAGS_ENCRYPT_MODE_AES256 (0x2UL << 1) + #define NVM_SET_VARIABLE_REQ_FLAGS_ENCRYPT_MODE_HMAC_SHA1_AUTH (0x3UL << 1) + #define NVM_SET_VARIABLE_REQ_FLAGS_ENCRYPT_MODE_LAST NVM_SET_VARIABLE_REQ_FLAGS_ENCRYPT_MODE_HMAC_SHA1_AUTH ++ #define NVM_SET_VARIABLE_REQ_FLAGS_FLAGS_UNUSED_0_MASK 0x70UL ++ #define NVM_SET_VARIABLE_REQ_FLAGS_FLAGS_UNUSED_0_SFT 4 ++ #define NVM_SET_VARIABLE_REQ_FLAGS_FACTORY_DEFAULT 0x80UL + u8 unused_0; + }; + diff --git a/SOURCES/0041-netdrv-bnxt_en-Add-TPA-structure-definitions-for-BCM.patch b/SOURCES/0041-netdrv-bnxt_en-Add-TPA-structure-definitions-for-BCM.patch new file mode 100644 index 0000000..8f0febb --- /dev/null +++ b/SOURCES/0041-netdrv-bnxt_en-Add-TPA-structure-definitions-for-BCM.patch @@ -0,0 +1,197 @@ +From 11d98847abe069f6e5910c6351d1514aebe520d3 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:56 -0400 +Subject: [PATCH 41/96] [netdrv] bnxt_en: Add TPA structure definitions for + BCM57500 chips + +Message-id: <71783720a1ef4976b7bbf63cf5f41a12fdca037d.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276462 +O-Subject: [RHEL-8.2 PATCH 34/78] bnxt_en: Add TPA structure definitions for BCM57500 chips. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +The new chips have a slightly modified TPA interface for LRO/GRO_HW. +Modify the TPA structures so that the same structures can also be +used on the new chips. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 218a8a71d91ab9e52205f4098cf1fe121c98850e) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 67 +++++++++++++++++++++++++++++++ + 1 file changed, 67 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:14.548523818 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:15.866511720 +0100 +@@ -113,6 +113,7 @@ + #define CMP_TYPE_RX_AGG_CMP 18 + #define CMP_TYPE_RX_L2_TPA_START_CMP 19 + #define CMP_TYPE_RX_L2_TPA_END_CMP 21 ++ #define CMP_TYPE_RX_TPA_AGG_CMP 22 + #define CMP_TYPE_STATUS_CMP 32 + #define CMP_TYPE_REMOTE_DRIVER_REQ 34 + #define CMP_TYPE_REMOTE_DRIVER_RESP 36 +@@ -263,14 +264,21 @@ + u32 rx_agg_cmp_opaque; + __le32 rx_agg_cmp_v; + #define RX_AGG_CMP_V (1 << 0) ++ #define RX_AGG_CMP_AGG_ID (0xffff << 16) ++ #define RX_AGG_CMP_AGG_ID_SHIFT 16 + __le32 rx_agg_cmp_unused; + }; + ++#define TPA_AGG_AGG_ID(rx_agg) \ ++ ((le32_to_cpu((rx_agg)->rx_agg_cmp_v) & \ ++ RX_AGG_CMP_AGG_ID) >> RX_AGG_CMP_AGG_ID_SHIFT) ++ + struct rx_tpa_start_cmp { + __le32 rx_tpa_start_cmp_len_flags_type; + #define RX_TPA_START_CMP_TYPE (0x3f << 0) + #define RX_TPA_START_CMP_FLAGS (0x3ff << 6) + #define RX_TPA_START_CMP_FLAGS_SHIFT 6 ++ #define RX_TPA_START_CMP_FLAGS_ERROR (0x1 << 6) + #define RX_TPA_START_CMP_FLAGS_PLACEMENT (0x7 << 7) + #define RX_TPA_START_CMP_FLAGS_PLACEMENT_SHIFT 7 + #define RX_TPA_START_CMP_FLAGS_PLACEMENT_JUMBO (0x1 << 7) +@@ -278,6 +286,7 @@ + #define RX_TPA_START_CMP_FLAGS_PLACEMENT_GRO_JUMBO (0x5 << 7) + #define RX_TPA_START_CMP_FLAGS_PLACEMENT_GRO_HDS (0x6 << 7) + #define RX_TPA_START_CMP_FLAGS_RSS_VALID (0x1 << 10) ++ #define RX_TPA_START_CMP_FLAGS_TIMESTAMP (0x1 << 11) + #define RX_TPA_START_CMP_FLAGS_ITYPES (0xf << 12) + #define RX_TPA_START_CMP_FLAGS_ITYPES_SHIFT 12 + #define RX_TPA_START_CMP_FLAGS_ITYPE_TCP (0x2 << 12) +@@ -291,6 +300,8 @@ + #define RX_TPA_START_CMP_RSS_HASH_TYPE_SHIFT 9 + #define RX_TPA_START_CMP_AGG_ID (0x7f << 25) + #define RX_TPA_START_CMP_AGG_ID_SHIFT 25 ++ #define RX_TPA_START_CMP_AGG_ID_P5 (0xffff << 16) ++ #define RX_TPA_START_CMP_AGG_ID_SHIFT_P5 16 + + __le32 rx_tpa_start_cmp_rss_hash; + }; +@@ -308,6 +319,14 @@ + ((le32_to_cpu((rx_tpa_start)->rx_tpa_start_cmp_misc_v1) & \ + RX_TPA_START_CMP_AGG_ID) >> RX_TPA_START_CMP_AGG_ID_SHIFT) + ++#define TPA_START_AGG_ID_P5(rx_tpa_start) \ ++ ((le32_to_cpu((rx_tpa_start)->rx_tpa_start_cmp_misc_v1) & \ ++ RX_TPA_START_CMP_AGG_ID_P5) >> RX_TPA_START_CMP_AGG_ID_SHIFT_P5) ++ ++#define TPA_START_ERROR(rx_tpa_start) \ ++ ((rx_tpa_start)->rx_tpa_start_cmp_len_flags_type & \ ++ cpu_to_le32(RX_TPA_START_CMP_FLAGS_ERROR)) ++ + struct rx_tpa_start_cmp_ext { + __le32 rx_tpa_start_cmp_flags2; + #define RX_TPA_START_CMP_FLAGS2_IP_CS_CALC (0x1 << 0) +@@ -315,10 +334,20 @@ + #define RX_TPA_START_CMP_FLAGS2_T_IP_CS_CALC (0x1 << 2) + #define RX_TPA_START_CMP_FLAGS2_T_L4_CS_CALC (0x1 << 3) + #define RX_TPA_START_CMP_FLAGS2_IP_TYPE (0x1 << 8) ++ #define RX_TPA_START_CMP_FLAGS2_CSUM_CMPL_VALID (0x1 << 9) ++ #define RX_TPA_START_CMP_FLAGS2_EXT_META_FORMAT (0x3 << 10) ++ #define RX_TPA_START_CMP_FLAGS2_EXT_META_FORMAT_SHIFT 10 ++ #define RX_TPA_START_CMP_FLAGS2_CSUM_CMPL (0xffff << 16) ++ #define RX_TPA_START_CMP_FLAGS2_CSUM_CMPL_SHIFT 16 + + __le32 rx_tpa_start_cmp_metadata; + __le32 rx_tpa_start_cmp_cfa_code_v2; + #define RX_TPA_START_CMP_V2 (0x1 << 0) ++ #define RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_MASK (0x7 << 1) ++ #define RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_SHIFT 1 ++ #define RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_NO_BUFFER (0x0 << 1) ++ #define RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_BAD_FORMAT (0x3 << 1) ++ #define RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_FLUSH (0x5 << 1) + #define RX_TPA_START_CMP_CFA_CODE (0xffff << 16) + #define RX_TPA_START_CMPL_CFA_CODE_SHIFT 16 + __le32 rx_tpa_start_cmp_hdr_info; +@@ -332,6 +361,11 @@ + (!!((rx_tpa_start)->rx_tpa_start_cmp_flags2 & \ + cpu_to_le32(RX_TPA_START_CMP_FLAGS2_IP_TYPE))) + ++#define TPA_START_ERROR_CODE(rx_tpa_start) \ ++ ((le32_to_cpu((rx_tpa_start)->rx_tpa_start_cmp_cfa_code_v2) & \ ++ RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_MASK) >> \ ++ RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_SHIFT) ++ + struct rx_tpa_end_cmp { + __le32 rx_tpa_end_cmp_len_flags_type; + #define RX_TPA_END_CMP_TYPE (0x3f << 0) +@@ -361,6 +395,8 @@ + #define RX_TPA_END_CMP_PAYLOAD_OFFSET_SHIFT 16 + #define RX_TPA_END_CMP_AGG_ID (0x7f << 25) + #define RX_TPA_END_CMP_AGG_ID_SHIFT 25 ++ #define RX_TPA_END_CMP_AGG_ID_P5 (0xffff << 16) ++ #define RX_TPA_END_CMP_AGG_ID_SHIFT_P5 16 + + __le32 rx_tpa_end_cmp_tsdelta; + #define RX_TPA_END_GRO_TS (0x1 << 31) +@@ -370,6 +406,18 @@ + ((le32_to_cpu((rx_tpa_end)->rx_tpa_end_cmp_misc_v1) & \ + RX_TPA_END_CMP_AGG_ID) >> RX_TPA_END_CMP_AGG_ID_SHIFT) + ++#define TPA_END_AGG_ID_P5(rx_tpa_end) \ ++ ((le32_to_cpu((rx_tpa_end)->rx_tpa_end_cmp_misc_v1) & \ ++ RX_TPA_END_CMP_AGG_ID_P5) >> RX_TPA_END_CMP_AGG_ID_SHIFT_P5) ++ ++#define TPA_END_PAYLOAD_OFF(rx_tpa_end) \ ++ ((le32_to_cpu((rx_tpa_end)->rx_tpa_end_cmp_misc_v1) & \ ++ RX_TPA_END_CMP_PAYLOAD_OFFSET) >> RX_TPA_END_CMP_PAYLOAD_OFFSET_SHIFT) ++ ++#define TPA_END_AGG_BUFS(rx_tpa_end) \ ++ ((le32_to_cpu((rx_tpa_end)->rx_tpa_end_cmp_misc_v1) & \ ++ RX_TPA_END_CMP_AGG_BUFS) >> RX_TPA_END_CMP_AGG_BUFS_SHIFT) ++ + #define TPA_END_TPA_SEGS(rx_tpa_end) \ + ((le32_to_cpu((rx_tpa_end)->rx_tpa_end_cmp_misc_v1) & \ + RX_TPA_END_CMP_TPA_SEGS) >> RX_TPA_END_CMP_TPA_SEGS_SHIFT) +@@ -389,6 +437,10 @@ + struct rx_tpa_end_cmp_ext { + __le32 rx_tpa_end_cmp_dup_acks; + #define RX_TPA_END_CMP_TPA_DUP_ACKS (0xf << 0) ++ #define RX_TPA_END_CMP_PAYLOAD_OFFSET_P5 (0xff << 16) ++ #define RX_TPA_END_CMP_PAYLOAD_OFFSET_SHIFT_P5 16 ++ #define RX_TPA_END_CMP_AGG_BUFS_P5 (0xff << 24) ++ #define RX_TPA_END_CMP_AGG_BUFS_SHIFT_P5 24 + + __le32 rx_tpa_end_cmp_seg_len; + #define RX_TPA_END_CMP_TPA_SEG_LEN (0xffff << 0) +@@ -396,7 +448,13 @@ + __le32 rx_tpa_end_cmp_errors_v2; + #define RX_TPA_END_CMP_V2 (0x1 << 0) + #define RX_TPA_END_CMP_ERRORS (0x3 << 1) ++ #define RX_TPA_END_CMP_ERRORS_P5 (0x7 << 1) + #define RX_TPA_END_CMPL_ERRORS_SHIFT 1 ++ #define RX_TPA_END_CMP_ERRORS_BUFFER_ERROR_NO_BUFFER (0x0 << 1) ++ #define RX_TPA_END_CMP_ERRORS_BUFFER_ERROR_NOT_ON_CHIP (0x2 << 1) ++ #define RX_TPA_END_CMP_ERRORS_BUFFER_ERROR_BAD_FORMAT (0x3 << 1) ++ #define RX_TPA_END_CMP_ERRORS_BUFFER_ERROR_RSV_ERROR (0x4 << 1) ++ #define RX_TPA_END_CMP_ERRORS_BUFFER_ERROR_FLUSH (0x5 << 1) + + u32 rx_tpa_end_cmp_start_opaque; + }; +@@ -405,6 +463,15 @@ + ((rx_tpa_end_ext)->rx_tpa_end_cmp_errors_v2 & \ + cpu_to_le32(RX_TPA_END_CMP_ERRORS)) + ++#define TPA_END_PAYLOAD_OFF_P5(rx_tpa_end_ext) \ ++ ((le32_to_cpu((rx_tpa_end_ext)->rx_tpa_end_cmp_dup_acks) & \ ++ RX_TPA_END_CMP_PAYLOAD_OFFSET_P5) >> \ ++ RX_TPA_END_CMP_PAYLOAD_OFFSET_SHIFT_P5) ++ ++#define TPA_END_AGG_BUFS_P5(rx_tpa_end_ext) \ ++ ((le32_to_cpu((rx_tpa_end_ext)->rx_tpa_end_cmp_dup_acks) & \ ++ RX_TPA_END_CMP_AGG_BUFS_P5) >> RX_TPA_END_CMP_AGG_BUFS_SHIFT_P5) ++ + struct nqe_cn { + __le16 type; + #define NQ_CN_TYPE_MASK 0x3fUL diff --git a/SOURCES/0042-netdrv-bnxt_en-Refactor-TPA-logic.patch b/SOURCES/0042-netdrv-bnxt_en-Refactor-TPA-logic.patch new file mode 100644 index 0000000..f7418db --- /dev/null +++ b/SOURCES/0042-netdrv-bnxt_en-Refactor-TPA-logic.patch @@ -0,0 +1,345 @@ +From 746679f876254905a83b0c7ad192d4cc9c149315 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:57 -0400 +Subject: [PATCH 42/96] [netdrv] bnxt_en: Refactor TPA logic + +Message-id: +Patchwork-id: 276460 +O-Subject: [RHEL-8.2 PATCH 35/78] bnxt_en: Refactor TPA logic. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Refactor the TPA logic slightly, so that the code can be more easily +extended to support TPA on the new 57500 chips. In particular, the +logic to get the next aggregation completion is refactored into a +new function bnxt_get_agg() so that this operation is made more +generalized. This operation will be different on the new chip in TPA +mode. The logic to recycle the aggregation buffers has a new start +index parameter added for the same purpose. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 4a228a3a5e58e5c05c6ffb5b430e5cb936865a8b) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 117 ++++++++++++++++++------------ + 1 file changed, 69 insertions(+), 48 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:15.092518825 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:15.989510591 +0100 +@@ -830,8 +830,20 @@ + return 0; + } + +-static void bnxt_reuse_rx_agg_bufs(struct bnxt_cp_ring_info *cpr, u16 cp_cons, +- u32 agg_bufs) ++static struct rx_agg_cmp *bnxt_get_agg(struct bnxt *bp, ++ struct bnxt_cp_ring_info *cpr, ++ u16 cp_cons, u16 curr) ++{ ++ struct rx_agg_cmp *agg; ++ ++ cp_cons = RING_CMP(ADV_RAW_CMP(cp_cons, curr)); ++ agg = (struct rx_agg_cmp *) ++ &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)]; ++ return agg; ++} ++ ++static void bnxt_reuse_rx_agg_bufs(struct bnxt_cp_ring_info *cpr, u16 idx, ++ u16 start, u32 agg_bufs, bool tpa) + { + struct bnxt_napi *bnapi = cpr->bnapi; + struct bnxt *bp = bnapi->bp; +@@ -847,8 +859,7 @@ + struct rx_bd *prod_bd; + struct page *page; + +- agg = (struct rx_agg_cmp *) +- &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)]; ++ agg = bnxt_get_agg(bp, cpr, idx, start + i); + cons = agg->rx_agg_cmp_opaque; + __clear_bit(cons, rxr->rx_agg_bmap); + +@@ -876,7 +887,6 @@ + + prod = NEXT_RX_AGG(prod); + sw_prod = NEXT_RX_AGG(sw_prod); +- cp_cons = NEXT_CMP(cp_cons); + } + rxr->rx_agg_prod = prod; + rxr->rx_sw_agg_prod = sw_prod; +@@ -959,8 +969,8 @@ + + static struct sk_buff *bnxt_rx_pages(struct bnxt *bp, + struct bnxt_cp_ring_info *cpr, +- struct sk_buff *skb, u16 cp_cons, +- u32 agg_bufs) ++ struct sk_buff *skb, u16 idx, ++ u32 agg_bufs, bool tpa) + { + struct bnxt_napi *bnapi = cpr->bnapi; + struct pci_dev *pdev = bp->pdev; +@@ -975,8 +985,7 @@ + struct page *page; + dma_addr_t mapping; + +- agg = (struct rx_agg_cmp *) +- &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)]; ++ agg = bnxt_get_agg(bp, cpr, idx, i); + cons = agg->rx_agg_cmp_opaque; + frag_len = (le32_to_cpu(agg->rx_agg_cmp_len_flags_type) & + RX_AGG_CMP_LEN) >> RX_AGG_CMP_LEN_SHIFT; +@@ -1010,7 +1019,7 @@ + * allocated already. + */ + rxr->rx_agg_prod = prod; +- bnxt_reuse_rx_agg_bufs(cpr, cp_cons, agg_bufs - i); ++ bnxt_reuse_rx_agg_bufs(cpr, idx, i, agg_bufs - i, tpa); + return NULL; + } + +@@ -1023,7 +1032,6 @@ + skb->truesize += PAGE_SIZE; + + prod = NEXT_RX_AGG(prod); +- cp_cons = NEXT_CMP(cp_cons); + } + rxr->rx_agg_prod = prod; + return skb; +@@ -1083,9 +1091,7 @@ + } else if (cmp_type == CMP_TYPE_RX_L2_TPA_END_CMP) { + struct rx_tpa_end_cmp *tpa_end = cmp; + +- agg_bufs = (le32_to_cpu(tpa_end->rx_tpa_end_cmp_misc_v1) & +- RX_TPA_END_CMP_AGG_BUFS) >> +- RX_TPA_END_CMP_AGG_BUFS_SHIFT; ++ agg_bufs = TPA_END_AGG_BUFS(tpa_end); + } + + if (agg_bufs) { +@@ -1197,11 +1203,10 @@ + cons_rx_buf->data = NULL; + } + +-static void bnxt_abort_tpa(struct bnxt_cp_ring_info *cpr, u16 cp_cons, +- u32 agg_bufs) ++static void bnxt_abort_tpa(struct bnxt_cp_ring_info *cpr, u16 idx, u32 agg_bufs) + { + if (agg_bufs) +- bnxt_reuse_rx_agg_bufs(cpr, cp_cons, agg_bufs); ++ bnxt_reuse_rx_agg_bufs(cpr, idx, 0, agg_bufs, true); + } + + static struct sk_buff *bnxt_gro_func_5731x(struct bnxt_tpa_info *tpa_info, +@@ -1373,9 +1378,7 @@ + skb_shinfo(skb)->gso_size = + le32_to_cpu(tpa_end1->rx_tpa_end_cmp_seg_len); + skb_shinfo(skb)->gso_type = tpa_info->gso_type; +- payload_off = (le32_to_cpu(tpa_end->rx_tpa_end_cmp_misc_v1) & +- RX_TPA_END_CMP_PAYLOAD_OFFSET) >> +- RX_TPA_END_CMP_PAYLOAD_OFFSET_SHIFT; ++ payload_off = TPA_END_PAYLOAD_OFF(tpa_end); + skb = bp->gro_func(tpa_info, payload_off, TPA_END_GRO_TS(tpa_end), skb); + if (likely(skb)) + tcp_gro_complete(skb); +@@ -1405,11 +1408,11 @@ + struct bnxt_rx_ring_info *rxr = bnapi->rx_ring; + u8 agg_id = TPA_END_AGG_ID(tpa_end); + u8 *data_ptr, agg_bufs; +- u16 cp_cons = RING_CMP(*raw_cons); + unsigned int len; + struct bnxt_tpa_info *tpa_info; + dma_addr_t mapping; + struct sk_buff *skb; ++ u16 idx = 0; + void *data; + + if (unlikely(bnapi->in_reset)) { +@@ -1427,19 +1430,19 @@ + len = tpa_info->len; + mapping = tpa_info->mapping; + +- agg_bufs = (le32_to_cpu(tpa_end->rx_tpa_end_cmp_misc_v1) & +- RX_TPA_END_CMP_AGG_BUFS) >> RX_TPA_END_CMP_AGG_BUFS_SHIFT; ++ agg_bufs = TPA_END_AGG_BUFS(tpa_end); + + if (agg_bufs) { ++ idx = RING_CMP(*raw_cons); + if (!bnxt_agg_bufs_valid(bp, cpr, agg_bufs, raw_cons)) + return ERR_PTR(-EBUSY); + + *event |= BNXT_AGG_EVENT; +- cp_cons = NEXT_CMP(cp_cons); ++ idx = NEXT_CMP(idx); + } + + if (unlikely(agg_bufs > MAX_SKB_FRAGS || TPA_END_ERRORS(tpa_end1))) { +- bnxt_abort_tpa(cpr, cp_cons, agg_bufs); ++ bnxt_abort_tpa(cpr, idx, agg_bufs); + if (agg_bufs > MAX_SKB_FRAGS) + netdev_warn(bp->dev, "TPA frags %d exceeded MAX_SKB_FRAGS %d\n", + agg_bufs, (int)MAX_SKB_FRAGS); +@@ -1449,7 +1452,7 @@ + if (len <= bp->rx_copy_thresh) { + skb = bnxt_copy_skb(bnapi, data_ptr, len, mapping); + if (!skb) { +- bnxt_abort_tpa(cpr, cp_cons, agg_bufs); ++ bnxt_abort_tpa(cpr, idx, agg_bufs); + return NULL; + } + } else { +@@ -1458,7 +1461,7 @@ + + new_data = __bnxt_alloc_rx_data(bp, &new_mapping, GFP_ATOMIC); + if (!new_data) { +- bnxt_abort_tpa(cpr, cp_cons, agg_bufs); ++ bnxt_abort_tpa(cpr, idx, agg_bufs); + return NULL; + } + +@@ -1473,7 +1476,7 @@ + + if (!skb) { + kfree(data); +- bnxt_abort_tpa(cpr, cp_cons, agg_bufs); ++ bnxt_abort_tpa(cpr, idx, agg_bufs); + return NULL; + } + skb_reserve(skb, bp->rx_offset); +@@ -1481,7 +1484,7 @@ + } + + if (agg_bufs) { +- skb = bnxt_rx_pages(bp, cpr, skb, cp_cons, agg_bufs); ++ skb = bnxt_rx_pages(bp, cpr, skb, idx, agg_bufs, true); + if (!skb) { + /* Page reuse already handled by bnxt_rx_pages(). */ + return NULL; +@@ -1625,7 +1628,8 @@ + + bnxt_reuse_rx_data(rxr, cons, data); + if (agg_bufs) +- bnxt_reuse_rx_agg_bufs(cpr, cp_cons, agg_bufs); ++ bnxt_reuse_rx_agg_bufs(cpr, cp_cons, 0, agg_bufs, ++ false); + + rc = -EIO; + if (rx_err & RX_CMPL_ERRORS_BUFFER_ERROR_MASK) { +@@ -1648,7 +1652,8 @@ + bnxt_reuse_rx_data(rxr, cons, data); + if (!skb) { + if (agg_bufs) +- bnxt_reuse_rx_agg_bufs(cpr, cp_cons, agg_bufs); ++ bnxt_reuse_rx_agg_bufs(cpr, cp_cons, 0, ++ agg_bufs, false); + rc = -ENOMEM; + goto next_rx; + } +@@ -1668,7 +1673,7 @@ + } + + if (agg_bufs) { +- skb = bnxt_rx_pages(bp, cpr, skb, cp_cons, agg_bufs); ++ skb = bnxt_rx_pages(bp, cpr, skb, cp_cons, agg_bufs, false); + if (!skb) { + rc = -ENOMEM; + goto next_rx; +@@ -2486,6 +2491,33 @@ + return 0; + } + ++static void bnxt_free_tpa_info(struct bnxt *bp) ++{ ++ int i; ++ ++ for (i = 0; i < bp->rx_nr_rings; i++) { ++ struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; ++ ++ kfree(rxr->rx_tpa); ++ rxr->rx_tpa = NULL; ++ } ++} ++ ++static int bnxt_alloc_tpa_info(struct bnxt *bp) ++{ ++ int i; ++ ++ for (i = 0; i < bp->rx_nr_rings; i++) { ++ struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; ++ ++ rxr->rx_tpa = kcalloc(MAX_TPA, sizeof(struct bnxt_tpa_info), ++ GFP_KERNEL); ++ if (!rxr->rx_tpa) ++ return -ENOMEM; ++ } ++ return 0; ++} ++ + static void bnxt_free_rx_rings(struct bnxt *bp) + { + int i; +@@ -2493,6 +2525,7 @@ + if (!bp->rx_ring) + return; + ++ bnxt_free_tpa_info(bp); + for (i = 0; i < bp->rx_nr_rings; i++) { + struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; + struct bnxt_ring_struct *ring; +@@ -2506,9 +2539,6 @@ + page_pool_destroy(rxr->page_pool); + rxr->page_pool = NULL; + +- kfree(rxr->rx_tpa); +- rxr->rx_tpa = NULL; +- + kfree(rxr->rx_agg_bmap); + rxr->rx_agg_bmap = NULL; + +@@ -2542,7 +2572,7 @@ + + static int bnxt_alloc_rx_rings(struct bnxt *bp) + { +- int i, rc, agg_rings = 0, tpa_rings = 0; ++ int i, rc = 0, agg_rings = 0; + + if (!bp->rx_ring) + return -ENOMEM; +@@ -2550,9 +2580,6 @@ + if (bp->flags & BNXT_FLAG_AGG_RINGS) + agg_rings = 1; + +- if (bp->flags & BNXT_FLAG_TPA) +- tpa_rings = 1; +- + for (i = 0; i < bp->rx_nr_rings; i++) { + struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; + struct bnxt_ring_struct *ring; +@@ -2594,17 +2621,11 @@ + rxr->rx_agg_bmap = kzalloc(mem_size, GFP_KERNEL); + if (!rxr->rx_agg_bmap) + return -ENOMEM; +- +- if (tpa_rings) { +- rxr->rx_tpa = kcalloc(MAX_TPA, +- sizeof(struct bnxt_tpa_info), +- GFP_KERNEL); +- if (!rxr->rx_tpa) +- return -ENOMEM; +- } + } + } +- return 0; ++ if (bp->flags & BNXT_FLAG_TPA) ++ rc = bnxt_alloc_tpa_info(bp); ++ return rc; + } + + static void bnxt_free_tx_rings(struct bnxt *bp) diff --git a/SOURCES/0043-netdrv-bnxt_en-Expand-bnxt_tpa_info-struct-to-suppor.patch b/SOURCES/0043-netdrv-bnxt_en-Expand-bnxt_tpa_info-struct-to-suppor.patch new file mode 100644 index 0000000..3a0e385 --- /dev/null +++ b/SOURCES/0043-netdrv-bnxt_en-Expand-bnxt_tpa_info-struct-to-suppor.patch @@ -0,0 +1,170 @@ +From 7cff5d1939a2a4b5325abda7aa5bddb7757e0e87 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:58 -0400 +Subject: [PATCH 43/96] [netdrv] bnxt_en: Expand bnxt_tpa_info struct to + support 57500 chips + +Message-id: +Patchwork-id: 276471 +O-Subject: [RHEL-8.2 PATCH 36/78] bnxt_en: Expand bnxt_tpa_info struct to support 57500 chips. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Add an aggregation array to bnxt_tpa_info struct to keep track of the +aggregation completions. The aggregation completions are not +completed at the TPA_END completion on 57500 chips so we need to +keep track of them. The array is only allocated on the new chips +when required. An agg_count field is also added to keep track of the +number of these completions. + +The maximum concurrent TPA is now discovered from firmware instead of +the hardcoded 64. Add a new bp->max_tpa to keep track of maximum +configured TPA. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 79632e9ba38671215fb193346ef6fb8db582744d) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 41 ++++++++++++++++++++++++++----- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 6 +++++ + 2 files changed, 41 insertions(+), 6 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:15.989510591 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.115509434 +0100 +@@ -2336,7 +2336,7 @@ + int j; + + if (rxr->rx_tpa) { +- for (j = 0; j < MAX_TPA; j++) { ++ for (j = 0; j < bp->max_tpa; j++) { + struct bnxt_tpa_info *tpa_info = + &rxr->rx_tpa[j]; + u8 *data = tpa_info->data; +@@ -2498,6 +2498,10 @@ + for (i = 0; i < bp->rx_nr_rings; i++) { + struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; + ++ if (rxr->rx_tpa) { ++ kfree(rxr->rx_tpa[0].agg_arr); ++ rxr->rx_tpa[0].agg_arr = NULL; ++ } + kfree(rxr->rx_tpa); + rxr->rx_tpa = NULL; + } +@@ -2505,15 +2509,33 @@ + + static int bnxt_alloc_tpa_info(struct bnxt *bp) + { +- int i; ++ int i, j, total_aggs = 0; ++ ++ bp->max_tpa = MAX_TPA; ++ if (bp->flags & BNXT_FLAG_CHIP_P5) { ++ if (!bp->max_tpa_v2) ++ return 0; ++ bp->max_tpa = max_t(u16, bp->max_tpa_v2, MAX_TPA_P5); ++ total_aggs = bp->max_tpa * MAX_SKB_FRAGS; ++ } + + for (i = 0; i < bp->rx_nr_rings; i++) { + struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; ++ struct rx_agg_cmp *agg; + +- rxr->rx_tpa = kcalloc(MAX_TPA, sizeof(struct bnxt_tpa_info), ++ rxr->rx_tpa = kcalloc(bp->max_tpa, sizeof(struct bnxt_tpa_info), + GFP_KERNEL); + if (!rxr->rx_tpa) + return -ENOMEM; ++ ++ if (!(bp->flags & BNXT_FLAG_CHIP_P5)) ++ continue; ++ agg = kcalloc(total_aggs, sizeof(*agg), GFP_KERNEL); ++ rxr->rx_tpa[0].agg_arr = agg; ++ if (!agg) ++ return -ENOMEM; ++ for (j = 1; j < bp->max_tpa; j++) ++ rxr->rx_tpa[j].agg_arr = agg + j * MAX_SKB_FRAGS; + } + return 0; + } +@@ -2979,7 +3001,7 @@ + u8 *data; + dma_addr_t mapping; + +- for (i = 0; i < MAX_TPA; i++) { ++ for (i = 0; i < bp->max_tpa; i++) { + data = __bnxt_alloc_rx_data(bp, &mapping, + GFP_KERNEL); + if (!data) +@@ -4440,6 +4462,7 @@ + static int bnxt_hwrm_vnic_set_tpa(struct bnxt *bp, u16 vnic_id, u32 tpa_flags) + { + struct bnxt_vnic_info *vnic = &bp->vnic_info[vnic_id]; ++ u16 max_aggs = VNIC_TPA_CFG_REQ_MAX_AGGS_MAX; + struct hwrm_vnic_tpa_cfg_input req = {0}; + + if (vnic->fw_vnic_id == INVALID_HW_RING_ID) +@@ -4479,9 +4502,14 @@ + nsegs = (MAX_SKB_FRAGS - n) / n; + } + +- segs = ilog2(nsegs); ++ if (bp->flags & BNXT_FLAG_CHIP_P5) { ++ segs = MAX_TPA_SEGS_P5; ++ max_aggs = bp->max_tpa; ++ } else { ++ segs = ilog2(nsegs); ++ } + req.max_agg_segs = cpu_to_le16(segs); +- req.max_aggs = cpu_to_le16(VNIC_TPA_CFG_REQ_MAX_AGGS_MAX); ++ req.max_aggs = cpu_to_le16(max_aggs); + + req.min_agg_len = cpu_to_le32(512); + } +@@ -4841,6 +4869,7 @@ + if (flags & + VNIC_QCAPS_RESP_FLAGS_ROCE_MIRRORING_CAPABLE_VNIC_CAP) + bp->flags |= BNXT_FLAG_ROCE_MIRROR_CAP; ++ bp->max_tpa_v2 = le16_to_cpu(resp->max_aggs_supported); + } + mutex_unlock(&bp->hwrm_cmd_lock); + return rc; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:15.866511720 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:16.116509425 +0100 +@@ -554,6 +554,8 @@ + #define BNXT_DEFAULT_TX_RING_SIZE 511 + + #define MAX_TPA 64 ++#define MAX_TPA_P5 256 ++#define MAX_TPA_SEGS_P5 0x3f + + #if (BNXT_PAGE_SHIFT == 16) + #define MAX_RX_PAGES 1 +@@ -835,6 +837,8 @@ + ((hdr_info) & 0x1ff) + + u16 cfa_code; /* cfa_code in TPA start compl */ ++ u8 agg_count; ++ struct rx_agg_cmp *agg_arr; + }; + + struct bnxt_rx_ring_info { +@@ -1481,6 +1485,8 @@ + u16, void *, u8 *, dma_addr_t, + unsigned int); + ++ u16 max_tpa_v2; ++ u16 max_tpa; + u32 rx_buf_size; + u32 rx_buf_use_size; /* useable size */ + u16 rx_offset; diff --git a/SOURCES/0044-netdrv-bnxt_en-Handle-standalone-RX_AGG-completions.patch b/SOURCES/0044-netdrv-bnxt_en-Handle-standalone-RX_AGG-completions.patch new file mode 100644 index 0000000..8154417 --- /dev/null +++ b/SOURCES/0044-netdrv-bnxt_en-Handle-standalone-RX_AGG-completions.patch @@ -0,0 +1,74 @@ +From 7d47d61e11444426ad0d5493de4194224d693606 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:22:59 -0400 +Subject: [PATCH 44/96] [netdrv] bnxt_en: Handle standalone RX_AGG completions + +Message-id: +Patchwork-id: 276463 +O-Subject: [RHEL-8.2 PATCH 37/78] bnxt_en: Handle standalone RX_AGG completions. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +On the new 57500 chips, these new RX_AGG completions are not coalesced +at the TPA_END completion. Handle these by storing them in the +array in the bnxt_tpa_info struct, as they are seen when processing +the CMPL ring. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 8fe88ce7ab3181a11989eb7a8bb00c42a2b7b3b0) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 20 ++++++++++++++++++-- + 1 file changed, 18 insertions(+), 2 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.115509434 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.250508195 +0100 +@@ -1519,6 +1519,17 @@ + return skb; + } + ++static void bnxt_tpa_agg(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, ++ struct rx_agg_cmp *rx_agg) ++{ ++ u16 agg_id = TPA_AGG_AGG_ID(rx_agg); ++ struct bnxt_tpa_info *tpa_info; ++ ++ tpa_info = &rxr->rx_tpa[agg_id]; ++ BUG_ON(tpa_info->agg_count >= MAX_SKB_FRAGS); ++ tpa_info->agg_arr[tpa_info->agg_count++] = *rx_agg; ++} ++ + static void bnxt_deliver_skb(struct bnxt *bp, struct bnxt_napi *bnapi, + struct sk_buff *skb) + { +@@ -1560,6 +1571,13 @@ + rxcmp = (struct rx_cmp *) + &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)]; + ++ cmp_type = RX_CMP_TYPE(rxcmp); ++ ++ if (cmp_type == CMP_TYPE_RX_TPA_AGG_CMP) { ++ bnxt_tpa_agg(bp, rxr, (struct rx_agg_cmp *)rxcmp); ++ goto next_rx_no_prod_no_len; ++ } ++ + tmp_raw_cons = NEXT_RAW_CMP(tmp_raw_cons); + cp_cons = RING_CMP(tmp_raw_cons); + rxcmp1 = (struct rx_cmp_ext *) +@@ -1568,8 +1586,6 @@ + if (!RX_CMP_VALID(rxcmp1, tmp_raw_cons)) + return -EBUSY; + +- cmp_type = RX_CMP_TYPE(rxcmp); +- + prod = rxr->rx_prod; + + if (cmp_type == CMP_TYPE_RX_L2_TPA_START_CMP) { diff --git a/SOURCES/0045-netdrv-bnxt_en-Refactor-tunneled-hardware-GRO-logic.patch b/SOURCES/0045-netdrv-bnxt_en-Refactor-tunneled-hardware-GRO-logic.patch new file mode 100644 index 0000000..fcebd99 --- /dev/null +++ b/SOURCES/0045-netdrv-bnxt_en-Refactor-tunneled-hardware-GRO-logic.patch @@ -0,0 +1,126 @@ +From 563c6968f57f296bf0bfc06528ff603392090da2 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:00 -0400 +Subject: [PATCH 45/96] [netdrv] bnxt_en: Refactor tunneled hardware GRO logic + +Message-id: <7e0c61958705e069e76dbb6ad6987b3fa99093e6.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276461 +O-Subject: [RHEL-8.2 PATCH 38/78] bnxt_en: Refactor tunneled hardware GRO logic. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +The 2 GRO functions to set up the hardware GRO SKB fields for 2 +different hardware chips have practically identical logic for +tunneled packets. Refactor the logic into a separate bnxt_gro_tunnel() +function that can be used by both functions. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit bee5a188b71657092dc9eb1a529b4e502fe51444) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 69 +++++++++++++------------------ + 1 file changed, 28 insertions(+), 41 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.250508195 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.376507039 +0100 +@@ -1209,6 +1209,31 @@ + bnxt_reuse_rx_agg_bufs(cpr, idx, 0, agg_bufs, true); + } + ++#ifdef CONFIG_INET ++static void bnxt_gro_tunnel(struct sk_buff *skb, __be16 ip_proto) ++{ ++ struct udphdr *uh = NULL; ++ ++ if (ip_proto == htons(ETH_P_IP)) { ++ struct iphdr *iph = (struct iphdr *)skb->data; ++ ++ if (iph->protocol == IPPROTO_UDP) ++ uh = (struct udphdr *)(iph + 1); ++ } else { ++ struct ipv6hdr *iph = (struct ipv6hdr *)skb->data; ++ ++ if (iph->nexthdr == IPPROTO_UDP) ++ uh = (struct udphdr *)(iph + 1); ++ } ++ if (uh) { ++ if (uh->check) ++ skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL_CSUM; ++ else ++ skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL; ++ } ++} ++#endif ++ + static struct sk_buff *bnxt_gro_func_5731x(struct bnxt_tpa_info *tpa_info, + int payload_off, int tcp_ts, + struct sk_buff *skb) +@@ -1266,28 +1291,10 @@ + } + + if (inner_mac_off) { /* tunnel */ +- struct udphdr *uh = NULL; + __be16 proto = *((__be16 *)(skb->data + outer_ip_off - + ETH_HLEN - 2)); + +- if (proto == htons(ETH_P_IP)) { +- struct iphdr *iph = (struct iphdr *)skb->data; +- +- if (iph->protocol == IPPROTO_UDP) +- uh = (struct udphdr *)(iph + 1); +- } else { +- struct ipv6hdr *iph = (struct ipv6hdr *)skb->data; +- +- if (iph->nexthdr == IPPROTO_UDP) +- uh = (struct udphdr *)(iph + 1); +- } +- if (uh) { +- if (uh->check) +- skb_shinfo(skb)->gso_type |= +- SKB_GSO_UDP_TUNNEL_CSUM; +- else +- skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL; +- } ++ bnxt_gro_tunnel(skb, proto); + } + #endif + return skb; +@@ -1334,28 +1341,8 @@ + return NULL; + } + +- if (nw_off) { /* tunnel */ +- struct udphdr *uh = NULL; +- +- if (skb->protocol == htons(ETH_P_IP)) { +- struct iphdr *iph = (struct iphdr *)skb->data; +- +- if (iph->protocol == IPPROTO_UDP) +- uh = (struct udphdr *)(iph + 1); +- } else { +- struct ipv6hdr *iph = (struct ipv6hdr *)skb->data; +- +- if (iph->nexthdr == IPPROTO_UDP) +- uh = (struct udphdr *)(iph + 1); +- } +- if (uh) { +- if (uh->check) +- skb_shinfo(skb)->gso_type |= +- SKB_GSO_UDP_TUNNEL_CSUM; +- else +- skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL; +- } +- } ++ if (nw_off) /* tunnel */ ++ bnxt_gro_tunnel(skb, skb->protocol); + #endif + return skb; + } diff --git a/SOURCES/0046-netdrv-bnxt_en-Set-TPA-GRO-mode-flags-on-57500-chips.patch b/SOURCES/0046-netdrv-bnxt_en-Set-TPA-GRO-mode-flags-on-57500-chips.patch new file mode 100644 index 0000000..cd1e0c8 --- /dev/null +++ b/SOURCES/0046-netdrv-bnxt_en-Set-TPA-GRO-mode-flags-on-57500-chips.patch @@ -0,0 +1,72 @@ +From 45e01e8de10f92ab0ae02baf23cbed93b7dae48a Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:01 -0400 +Subject: [PATCH 46/96] [netdrv] bnxt_en: Set TPA GRO mode flags on 57500 chips + properly + +Message-id: <6382b11d2a91ab884bfc45379b12c9f5d23bc48b.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276464 +O-Subject: [RHEL-8.2 PATCH 39/78] bnxt_en: Set TPA GRO mode flags on 57500 chips properly. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +On 57500 chips, hardware GRO mode cannot be determined from the TPA +end, so we need to check bp->flags to determine if we are in hardware +GRO mode or not. Modify bnxt_set_features so that the TPA flags +in bp->flags don't change until the device is closed. This will ensure +that the fast path can safely rely on bp->flags to determine the +TPA mode. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit f45b7b78c619cd73c7ca25b68c6ba9653b8e4a0a) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.376507039 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.499505910 +0100 +@@ -9364,7 +9364,8 @@ + if (changes & BNXT_FLAG_TPA) { + update_tpa = true; + if ((bp->flags & BNXT_FLAG_TPA) == 0 || +- (flags & BNXT_FLAG_TPA) == 0) ++ (flags & BNXT_FLAG_TPA) == 0 || ++ (bp->flags & BNXT_FLAG_CHIP_P5)) + re_init = true; + } + +@@ -9374,9 +9375,8 @@ + if (flags != bp->flags) { + u32 old_flags = bp->flags; + +- bp->flags = flags; +- + if (!test_bit(BNXT_STATE_OPEN, &bp->state)) { ++ bp->flags = flags; + if (update_tpa) + bnxt_set_ring_params(bp); + return rc; +@@ -9384,12 +9384,14 @@ + + if (re_init) { + bnxt_close_nic(bp, false, false); ++ bp->flags = flags; + if (update_tpa) + bnxt_set_ring_params(bp); + + return bnxt_open_nic(bp, false, false); + } + if (update_tpa) { ++ bp->flags = flags; + rc = bnxt_set_tpa(bp, + (flags & BNXT_FLAG_TPA) ? + true : false); diff --git a/SOURCES/0047-netdrv-bnxt_en-Add-fast-path-logic-for-TPA-on-57500-.patch b/SOURCES/0047-netdrv-bnxt_en-Add-fast-path-logic-for-TPA-on-57500-.patch new file mode 100644 index 0000000..47d203d --- /dev/null +++ b/SOURCES/0047-netdrv-bnxt_en-Add-fast-path-logic-for-TPA-on-57500-.patch @@ -0,0 +1,251 @@ +From 321df466af8f407daf083b46f29e0b1ce454b25d Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:02 -0400 +Subject: [PATCH 47/96] [netdrv] bnxt_en: Add fast path logic for TPA on 57500 + chips + +Message-id: +Patchwork-id: 276470 +O-Subject: [RHEL-8.2 PATCH 40/78] bnxt_en: Add fast path logic for TPA on 57500 chips. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +With all the previous refactoring, the TPA fast path can now be +modified slightly to support TPA on the new chips. The main +difference is that the agg completions are retrieved differently using +the bnxt_get_tpa_agg_p5() function on the new chips. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit bfcd8d791ec18496772d117774398e336917f56e) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 100 ++++++++++++++++++++++-------- + 1 file changed, 75 insertions(+), 25 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.499505910 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.622504781 +0100 +@@ -842,6 +842,15 @@ + return agg; + } + ++static struct rx_agg_cmp *bnxt_get_tpa_agg_p5(struct bnxt *bp, ++ struct bnxt_rx_ring_info *rxr, ++ u16 agg_id, u16 curr) ++{ ++ struct bnxt_tpa_info *tpa_info = &rxr->rx_tpa[agg_id]; ++ ++ return &tpa_info->agg_arr[curr]; ++} ++ + static void bnxt_reuse_rx_agg_bufs(struct bnxt_cp_ring_info *cpr, u16 idx, + u16 start, u32 agg_bufs, bool tpa) + { +@@ -850,8 +859,12 @@ + struct bnxt_rx_ring_info *rxr = bnapi->rx_ring; + u16 prod = rxr->rx_agg_prod; + u16 sw_prod = rxr->rx_sw_agg_prod; ++ bool p5_tpa = false; + u32 i; + ++ if ((bp->flags & BNXT_FLAG_CHIP_P5) && tpa) ++ p5_tpa = true; ++ + for (i = 0; i < agg_bufs; i++) { + u16 cons; + struct rx_agg_cmp *agg; +@@ -859,7 +872,10 @@ + struct rx_bd *prod_bd; + struct page *page; + +- agg = bnxt_get_agg(bp, cpr, idx, start + i); ++ if (p5_tpa) ++ agg = bnxt_get_tpa_agg_p5(bp, rxr, idx, start + i); ++ else ++ agg = bnxt_get_agg(bp, cpr, idx, start + i); + cons = agg->rx_agg_cmp_opaque; + __clear_bit(cons, rxr->rx_agg_bmap); + +@@ -976,8 +992,12 @@ + struct pci_dev *pdev = bp->pdev; + struct bnxt_rx_ring_info *rxr = bnapi->rx_ring; + u16 prod = rxr->rx_agg_prod; ++ bool p5_tpa = false; + u32 i; + ++ if ((bp->flags & BNXT_FLAG_CHIP_P5) && tpa) ++ p5_tpa = true; ++ + for (i = 0; i < agg_bufs; i++) { + u16 cons, frag_len; + struct rx_agg_cmp *agg; +@@ -985,7 +1005,10 @@ + struct page *page; + dma_addr_t mapping; + +- agg = bnxt_get_agg(bp, cpr, idx, i); ++ if (p5_tpa) ++ agg = bnxt_get_tpa_agg_p5(bp, rxr, idx, i); ++ else ++ agg = bnxt_get_agg(bp, cpr, idx, i); + cons = agg->rx_agg_cmp_opaque; + frag_len = (le32_to_cpu(agg->rx_agg_cmp_len_flags_type) & + RX_AGG_CMP_LEN) >> RX_AGG_CMP_LEN_SHIFT; +@@ -1091,6 +1114,9 @@ + } else if (cmp_type == CMP_TYPE_RX_L2_TPA_END_CMP) { + struct rx_tpa_end_cmp *tpa_end = cmp; + ++ if (bp->flags & BNXT_FLAG_CHIP_P5) ++ return 0; ++ + agg_bufs = TPA_END_AGG_BUFS(tpa_end); + } + +@@ -1132,22 +1158,27 @@ + struct rx_tpa_start_cmp *tpa_start, + struct rx_tpa_start_cmp_ext *tpa_start1) + { +- u8 agg_id = TPA_START_AGG_ID(tpa_start); +- u16 cons, prod; +- struct bnxt_tpa_info *tpa_info; + struct bnxt_sw_rx_bd *cons_rx_buf, *prod_rx_buf; ++ struct bnxt_tpa_info *tpa_info; ++ u16 cons, prod, agg_id; + struct rx_bd *prod_bd; + dma_addr_t mapping; + ++ if (bp->flags & BNXT_FLAG_CHIP_P5) ++ agg_id = TPA_START_AGG_ID_P5(tpa_start); ++ else ++ agg_id = TPA_START_AGG_ID(tpa_start); + cons = tpa_start->rx_tpa_start_cmp_opaque; + prod = rxr->rx_prod; + cons_rx_buf = &rxr->rx_buf_ring[cons]; + prod_rx_buf = &rxr->rx_buf_ring[prod]; + tpa_info = &rxr->rx_tpa[agg_id]; + +- if (unlikely(cons != rxr->rx_next_cons)) { +- netdev_warn(bp->dev, "TPA cons %x != expected cons %x\n", +- cons, rxr->rx_next_cons); ++ if (unlikely(cons != rxr->rx_next_cons || ++ TPA_START_ERROR(tpa_start))) { ++ netdev_warn(bp->dev, "TPA cons %x, expected cons %x, error code %x\n", ++ cons, rxr->rx_next_cons, ++ TPA_START_ERROR_CODE(tpa_start1)); + bnxt_sched_reset(bp, rxr); + return; + } +@@ -1192,6 +1223,7 @@ + tpa_info->flags2 = le32_to_cpu(tpa_start1->rx_tpa_start_cmp_flags2); + tpa_info->metadata = le32_to_cpu(tpa_start1->rx_tpa_start_cmp_metadata); + tpa_info->hdr_info = le32_to_cpu(tpa_start1->rx_tpa_start_cmp_hdr_info); ++ tpa_info->agg_count = 0; + + rxr->rx_prod = NEXT_RX(prod); + cons = NEXT_RX(cons); +@@ -1365,7 +1397,10 @@ + skb_shinfo(skb)->gso_size = + le32_to_cpu(tpa_end1->rx_tpa_end_cmp_seg_len); + skb_shinfo(skb)->gso_type = tpa_info->gso_type; +- payload_off = TPA_END_PAYLOAD_OFF(tpa_end); ++ if (bp->flags & BNXT_FLAG_CHIP_P5) ++ payload_off = TPA_END_PAYLOAD_OFF_P5(tpa_end1); ++ else ++ payload_off = TPA_END_PAYLOAD_OFF(tpa_end); + skb = bp->gro_func(tpa_info, payload_off, TPA_END_GRO_TS(tpa_end), skb); + if (likely(skb)) + tcp_gro_complete(skb); +@@ -1393,14 +1428,14 @@ + { + struct bnxt_napi *bnapi = cpr->bnapi; + struct bnxt_rx_ring_info *rxr = bnapi->rx_ring; +- u8 agg_id = TPA_END_AGG_ID(tpa_end); + u8 *data_ptr, agg_bufs; + unsigned int len; + struct bnxt_tpa_info *tpa_info; + dma_addr_t mapping; + struct sk_buff *skb; +- u16 idx = 0; ++ u16 idx = 0, agg_id; + void *data; ++ bool gro; + + if (unlikely(bnapi->in_reset)) { + int rc = bnxt_discard_rx(bp, cpr, raw_cons, tpa_end); +@@ -1410,24 +1445,39 @@ + return NULL; + } + +- tpa_info = &rxr->rx_tpa[agg_id]; ++ if (bp->flags & BNXT_FLAG_CHIP_P5) { ++ agg_id = TPA_END_AGG_ID_P5(tpa_end); ++ agg_bufs = TPA_END_AGG_BUFS_P5(tpa_end1); ++ tpa_info = &rxr->rx_tpa[agg_id]; ++ if (unlikely(agg_bufs != tpa_info->agg_count)) { ++ netdev_warn(bp->dev, "TPA end agg_buf %d != expected agg_bufs %d\n", ++ agg_bufs, tpa_info->agg_count); ++ agg_bufs = tpa_info->agg_count; ++ } ++ tpa_info->agg_count = 0; ++ *event |= BNXT_AGG_EVENT; ++ idx = agg_id; ++ gro = !!(bp->flags & BNXT_FLAG_GRO); ++ } else { ++ agg_id = TPA_END_AGG_ID(tpa_end); ++ agg_bufs = TPA_END_AGG_BUFS(tpa_end); ++ tpa_info = &rxr->rx_tpa[agg_id]; ++ idx = RING_CMP(*raw_cons); ++ if (agg_bufs) { ++ if (!bnxt_agg_bufs_valid(bp, cpr, agg_bufs, raw_cons)) ++ return ERR_PTR(-EBUSY); ++ ++ *event |= BNXT_AGG_EVENT; ++ idx = NEXT_CMP(idx); ++ } ++ gro = !!TPA_END_GRO(tpa_end); ++ } + data = tpa_info->data; + data_ptr = tpa_info->data_ptr; + prefetch(data_ptr); + len = tpa_info->len; + mapping = tpa_info->mapping; + +- agg_bufs = TPA_END_AGG_BUFS(tpa_end); +- +- if (agg_bufs) { +- idx = RING_CMP(*raw_cons); +- if (!bnxt_agg_bufs_valid(bp, cpr, agg_bufs, raw_cons)) +- return ERR_PTR(-EBUSY); +- +- *event |= BNXT_AGG_EVENT; +- idx = NEXT_CMP(idx); +- } +- + if (unlikely(agg_bufs > MAX_SKB_FRAGS || TPA_END_ERRORS(tpa_end1))) { + bnxt_abort_tpa(cpr, idx, agg_bufs); + if (agg_bufs > MAX_SKB_FRAGS) +@@ -1500,7 +1550,7 @@ + (tpa_info->flags2 & RX_CMP_FLAGS2_T_L4_CS_CALC) >> 3; + } + +- if (TPA_END_GRO(tpa_end)) ++ if (gro) + skb = bnxt_gro_skb(bp, tpa_info, tpa_end, tpa_end1, skb); + + return skb; +@@ -10828,7 +10878,7 @@ + #endif + if (BNXT_SUPPORTS_TPA(bp)) { + bp->gro_func = bnxt_gro_func_5730x; +- if (BNXT_CHIP_P4(bp)) ++ if (BNXT_CHIP_P4_PLUS(bp)) + bp->gro_func = bnxt_gro_func_5731x; + } + if (!BNXT_CHIP_P4_PLUS(bp)) diff --git a/SOURCES/0048-netdrv-bnxt_en-Add-TPA-ID-mapping-logic-for-57500-ch.patch b/SOURCES/0048-netdrv-bnxt_en-Add-TPA-ID-mapping-logic-for-57500-ch.patch new file mode 100644 index 0000000..09adc62 --- /dev/null +++ b/SOURCES/0048-netdrv-bnxt_en-Add-TPA-ID-mapping-logic-for-57500-ch.patch @@ -0,0 +1,182 @@ +From 52051cf0ae9b711f99261f06b8dd923fbc6806fa Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:03 -0400 +Subject: [PATCH 48/96] [netdrv] bnxt_en: Add TPA ID mapping logic for 57500 + chips + +Message-id: <57e311cc4754abce34f1ea7baed45aa1740f0679.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276467 +O-Subject: [RHEL-8.2 PATCH 41/78] bnxt_en: Add TPA ID mapping logic for 57500 chips. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +The new TPA feature on 57500 supports a larger number of concurrent TPAs +(up to 1024) divided among the functions. We need to add some logic to +map the hardware TPA ID to a software index that keeps track of each TPA +in progress. A 1:1 direct mapping without translation would be too +wasteful as we would have to allocate 1024 TPA structures for each RX +ring on each PCI function. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit ec4d8e7cf024e42def027531676918048e5c7982) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 46 +++++++++++++++++++++++++++++-- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 9 ++++++ + 2 files changed, 53 insertions(+), 2 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.622504781 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.749503615 +0100 +@@ -1154,6 +1154,33 @@ + rxr->rx_next_cons = 0xffff; + } + ++static u16 bnxt_alloc_agg_idx(struct bnxt_rx_ring_info *rxr, u16 agg_id) ++{ ++ struct bnxt_tpa_idx_map *map = rxr->rx_tpa_idx_map; ++ u16 idx = agg_id & MAX_TPA_P5_MASK; ++ ++ if (test_bit(idx, map->agg_idx_bmap)) ++ idx = find_first_zero_bit(map->agg_idx_bmap, ++ BNXT_AGG_IDX_BMAP_SIZE); ++ __set_bit(idx, map->agg_idx_bmap); ++ map->agg_id_tbl[agg_id] = idx; ++ return idx; ++} ++ ++static void bnxt_free_agg_idx(struct bnxt_rx_ring_info *rxr, u16 idx) ++{ ++ struct bnxt_tpa_idx_map *map = rxr->rx_tpa_idx_map; ++ ++ __clear_bit(idx, map->agg_idx_bmap); ++} ++ ++static u16 bnxt_lookup_agg_idx(struct bnxt_rx_ring_info *rxr, u16 agg_id) ++{ ++ struct bnxt_tpa_idx_map *map = rxr->rx_tpa_idx_map; ++ ++ return map->agg_id_tbl[agg_id]; ++} ++ + static void bnxt_tpa_start(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, + struct rx_tpa_start_cmp *tpa_start, + struct rx_tpa_start_cmp_ext *tpa_start1) +@@ -1164,10 +1191,12 @@ + struct rx_bd *prod_bd; + dma_addr_t mapping; + +- if (bp->flags & BNXT_FLAG_CHIP_P5) ++ if (bp->flags & BNXT_FLAG_CHIP_P5) { + agg_id = TPA_START_AGG_ID_P5(tpa_start); +- else ++ agg_id = bnxt_alloc_agg_idx(rxr, agg_id); ++ } else { + agg_id = TPA_START_AGG_ID(tpa_start); ++ } + cons = tpa_start->rx_tpa_start_cmp_opaque; + prod = rxr->rx_prod; + cons_rx_buf = &rxr->rx_buf_ring[cons]; +@@ -1447,6 +1476,7 @@ + + if (bp->flags & BNXT_FLAG_CHIP_P5) { + agg_id = TPA_END_AGG_ID_P5(tpa_end); ++ agg_id = bnxt_lookup_agg_idx(rxr, agg_id); + agg_bufs = TPA_END_AGG_BUFS_P5(tpa_end1); + tpa_info = &rxr->rx_tpa[agg_id]; + if (unlikely(agg_bufs != tpa_info->agg_count)) { +@@ -1456,6 +1486,7 @@ + } + tpa_info->agg_count = 0; + *event |= BNXT_AGG_EVENT; ++ bnxt_free_agg_idx(rxr, agg_id); + idx = agg_id; + gro = !!(bp->flags & BNXT_FLAG_GRO); + } else { +@@ -1562,6 +1593,7 @@ + u16 agg_id = TPA_AGG_AGG_ID(rx_agg); + struct bnxt_tpa_info *tpa_info; + ++ agg_id = bnxt_lookup_agg_idx(rxr, agg_id); + tpa_info = &rxr->rx_tpa[agg_id]; + BUG_ON(tpa_info->agg_count >= MAX_SKB_FRAGS); + tpa_info->agg_arr[tpa_info->agg_count++] = *rx_agg; +@@ -2386,6 +2418,7 @@ + max_agg_idx = bp->rx_agg_nr_pages * RX_DESC_CNT; + for (i = 0; i < bp->rx_nr_rings; i++) { + struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; ++ struct bnxt_tpa_idx_map *map; + int j; + + if (rxr->rx_tpa) { +@@ -2456,6 +2489,9 @@ + __free_page(rxr->rx_page); + rxr->rx_page = NULL; + } ++ map = rxr->rx_tpa_idx_map; ++ if (map) ++ memset(map->agg_idx_bmap, 0, sizeof(map->agg_idx_bmap)); + } + } + +@@ -2551,6 +2587,8 @@ + for (i = 0; i < bp->rx_nr_rings; i++) { + struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i]; + ++ kfree(rxr->rx_tpa_idx_map); ++ rxr->rx_tpa_idx_map = NULL; + if (rxr->rx_tpa) { + kfree(rxr->rx_tpa[0].agg_arr); + rxr->rx_tpa[0].agg_arr = NULL; +@@ -2589,6 +2627,10 @@ + return -ENOMEM; + for (j = 1; j < bp->max_tpa; j++) + rxr->rx_tpa[j].agg_arr = agg + j * MAX_SKB_FRAGS; ++ rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map), ++ GFP_KERNEL); ++ if (!rxr->rx_tpa_idx_map) ++ return -ENOMEM; + } + return 0; + } +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:16.116509425 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:16.750503606 +0100 +@@ -555,6 +555,7 @@ + + #define MAX_TPA 64 + #define MAX_TPA_P5 256 ++#define MAX_TPA_P5_MASK (MAX_TPA_P5 - 1) + #define MAX_TPA_SEGS_P5 0x3f + + #if (BNXT_PAGE_SHIFT == 16) +@@ -841,6 +842,13 @@ + struct rx_agg_cmp *agg_arr; + }; + ++#define BNXT_AGG_IDX_BMAP_SIZE (MAX_TPA_P5 / BITS_PER_LONG) ++ ++struct bnxt_tpa_idx_map { ++ u16 agg_id_tbl[1024]; ++ unsigned long agg_idx_bmap[BNXT_AGG_IDX_BMAP_SIZE]; ++}; ++ + struct bnxt_rx_ring_info { + struct bnxt_napi *bnapi; + u16 rx_prod; +@@ -868,6 +876,7 @@ + dma_addr_t rx_agg_desc_mapping[MAX_RX_AGG_PAGES]; + + struct bnxt_tpa_info *rx_tpa; ++ struct bnxt_tpa_idx_map *rx_tpa_idx_map; + + struct bnxt_ring_struct rx_ring_struct; + struct bnxt_ring_struct rx_agg_ring_struct; diff --git a/SOURCES/0049-netdrv-bnxt_en-Add-hardware-GRO-setup-function-for-5.patch b/SOURCES/0049-netdrv-bnxt_en-Add-hardware-GRO-setup-function-for-5.patch new file mode 100644 index 0000000..6d861af --- /dev/null +++ b/SOURCES/0049-netdrv-bnxt_en-Add-hardware-GRO-setup-function-for-5.patch @@ -0,0 +1,82 @@ +From f18c355c95b64d442e4f0cee4e44f6ef2b3d8905 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:04 -0400 +Subject: [PATCH 49/96] [netdrv] bnxt_en: Add hardware GRO setup function for + 57500 chips + +Message-id: <8e748026e423be248e251a6fb5aa5c7dc5814864.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276466 +O-Subject: [RHEL-8.2 PATCH 42/78] bnxt_en: Add hardware GRO setup function for 57500 chips. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Add a more optimized hardware GRO function to setup the SKB on 57500 +chips. Some workaround code is no longer needed on 57500 chips and +the pseudo checksum is also calculated in hardware, so no need to +do the software pseudo checksum in the driver. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 67912c366d4bb0a9d108459e7c845cc7ba83f76f) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 33 ++++++++++++++++++++++++++++++- + 1 file changed, 32 insertions(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.749503615 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.886502357 +0100 +@@ -1361,6 +1361,35 @@ + return skb; + } + ++static struct sk_buff *bnxt_gro_func_5750x(struct bnxt_tpa_info *tpa_info, ++ int payload_off, int tcp_ts, ++ struct sk_buff *skb) ++{ ++#ifdef CONFIG_INET ++ u16 outer_ip_off, inner_ip_off, inner_mac_off; ++ u32 hdr_info = tpa_info->hdr_info; ++ int iphdr_len, nw_off; ++ ++ inner_ip_off = BNXT_TPA_INNER_L3_OFF(hdr_info); ++ inner_mac_off = BNXT_TPA_INNER_L2_OFF(hdr_info); ++ outer_ip_off = BNXT_TPA_OUTER_L3_OFF(hdr_info); ++ ++ nw_off = inner_ip_off - ETH_HLEN; ++ skb_set_network_header(skb, nw_off); ++ iphdr_len = (tpa_info->flags2 & RX_TPA_START_CMP_FLAGS2_IP_TYPE) ? ++ sizeof(struct ipv6hdr) : sizeof(struct iphdr); ++ skb_set_transport_header(skb, nw_off + iphdr_len); ++ ++ if (inner_mac_off) { /* tunnel */ ++ __be16 proto = *((__be16 *)(skb->data + outer_ip_off - ++ ETH_HLEN - 2)); ++ ++ bnxt_gro_tunnel(skb, proto); ++ } ++#endif ++ return skb; ++} ++ + #define BNXT_IPV4_HDR_SIZE (sizeof(struct iphdr) + sizeof(struct tcphdr)) + #define BNXT_IPV6_HDR_SIZE (sizeof(struct ipv6hdr) + sizeof(struct tcphdr)) + +@@ -10920,8 +10949,10 @@ + #endif + if (BNXT_SUPPORTS_TPA(bp)) { + bp->gro_func = bnxt_gro_func_5730x; +- if (BNXT_CHIP_P4_PLUS(bp)) ++ if (BNXT_CHIP_P4(bp)) + bp->gro_func = bnxt_gro_func_5731x; ++ else if (BNXT_CHIP_P5(bp)) ++ bp->gro_func = bnxt_gro_func_5750x; + } + if (!BNXT_CHIP_P4_PLUS(bp)) + bp->flags |= BNXT_FLAG_DOUBLE_DB; diff --git a/SOURCES/0050-netdrv-bnxt_en-Refactor-ethtool-ring-statistics-logi.patch b/SOURCES/0050-netdrv-bnxt_en-Refactor-ethtool-ring-statistics-logi.patch new file mode 100644 index 0000000..9c408fb --- /dev/null +++ b/SOURCES/0050-netdrv-bnxt_en-Refactor-ethtool-ring-statistics-logi.patch @@ -0,0 +1,191 @@ +From f6434f257c096205df4d2333e219e66229433072 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:05 -0400 +Subject: [PATCH 50/96] [netdrv] bnxt_en: Refactor ethtool ring statistics + logic + +Message-id: <5774e6c89e7d2c4808b6fd71337d9e03acce8bcd.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276474 +O-Subject: [RHEL-8.2 PATCH 43/78] bnxt_en: Refactor ethtool ring statistics logic. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +The current code assumes that the per ring statistics counters are +fixed. In newer chips that support a newer version of TPA, the +TPA counters are also changed. Refactor the code by defining these +counter names in arrays so that it is easy to add a new array for +a new set of counters supported by the newer chips. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit ee79566e65945dcf557bcfb9335e46fac67fb002) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 120 +++++++++++++--------- + 1 file changed, 70 insertions(+), 50 deletions(-) + +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:15.727512996 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:17.017501155 +0100 +@@ -137,7 +137,36 @@ + return rc; + } + +-#define BNXT_NUM_STATS 22 ++static const char * const bnxt_ring_stats_str[] = { ++ "rx_ucast_packets", ++ "rx_mcast_packets", ++ "rx_bcast_packets", ++ "rx_discards", ++ "rx_drops", ++ "rx_ucast_bytes", ++ "rx_mcast_bytes", ++ "rx_bcast_bytes", ++ "tx_ucast_packets", ++ "tx_mcast_packets", ++ "tx_bcast_packets", ++ "tx_discards", ++ "tx_drops", ++ "tx_ucast_bytes", ++ "tx_mcast_bytes", ++ "tx_bcast_bytes", ++}; ++ ++static const char * const bnxt_ring_tpa_stats_str[] = { ++ "tpa_packets", ++ "tpa_bytes", ++ "tpa_events", ++ "tpa_aborts", ++}; ++ ++static const char * const bnxt_ring_sw_stats_str[] = { ++ "rx_l4_csum_errors", ++ "missed_irqs", ++}; + + #define BNXT_RX_STATS_ENTRY(counter) \ + { BNXT_RX_STATS_OFFSET(counter), __stringify(counter) } +@@ -432,9 +461,20 @@ + ARRAY_SIZE(bnxt_tx_pkts_pri_arr)) + #define BNXT_NUM_PCIE_STATS ARRAY_SIZE(bnxt_pcie_stats_arr) + ++static int bnxt_get_num_ring_stats(struct bnxt *bp) ++{ ++ int num_stats; ++ ++ num_stats = ARRAY_SIZE(bnxt_ring_stats_str) + ++ ARRAY_SIZE(bnxt_ring_sw_stats_str); ++ if (BNXT_SUPPORTS_TPA(bp)) ++ num_stats += ARRAY_SIZE(bnxt_ring_tpa_stats_str); ++ return num_stats * bp->cp_nr_rings; ++} ++ + static int bnxt_get_num_stats(struct bnxt *bp) + { +- int num_stats = BNXT_NUM_STATS * bp->cp_nr_rings; ++ int num_stats = bnxt_get_num_ring_stats(bp); + + num_stats += BNXT_NUM_SW_FUNC_STATS; + +@@ -475,10 +515,13 @@ + { + u32 i, j = 0; + struct bnxt *bp = netdev_priv(dev); +- u32 stat_fields = sizeof(struct ctx_hw_stats) / 8; ++ u32 stat_fields = ARRAY_SIZE(bnxt_ring_stats_str); ++ ++ if (BNXT_SUPPORTS_TPA(bp)) ++ stat_fields += ARRAY_SIZE(bnxt_ring_tpa_stats_str); + + if (!bp->bnapi) { +- j += BNXT_NUM_STATS * bp->cp_nr_rings + BNXT_NUM_SW_FUNC_STATS; ++ j += bnxt_get_num_ring_stats(bp) + BNXT_NUM_SW_FUNC_STATS; + goto skip_ring_stats; + } + +@@ -566,56 +609,33 @@ + static void bnxt_get_strings(struct net_device *dev, u32 stringset, u8 *buf) + { + struct bnxt *bp = netdev_priv(dev); +- u32 i; ++ u32 i, j, num_str; + + switch (stringset) { +- /* The number of strings must match BNXT_NUM_STATS defined above. */ + case ETH_SS_STATS: + for (i = 0; i < bp->cp_nr_rings; i++) { +- sprintf(buf, "[%d]: rx_ucast_packets", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: rx_mcast_packets", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: rx_bcast_packets", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: rx_discards", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: rx_drops", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: rx_ucast_bytes", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: rx_mcast_bytes", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: rx_bcast_bytes", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: tx_ucast_packets", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: tx_mcast_packets", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: tx_bcast_packets", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: tx_discards", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: tx_drops", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: tx_ucast_bytes", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: tx_mcast_bytes", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: tx_bcast_bytes", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: tpa_packets", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: tpa_bytes", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: tpa_events", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: tpa_aborts", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: rx_l4_csum_errors", i); +- buf += ETH_GSTRING_LEN; +- sprintf(buf, "[%d]: missed_irqs", i); +- buf += ETH_GSTRING_LEN; ++ num_str = ARRAY_SIZE(bnxt_ring_stats_str); ++ for (j = 0; j < num_str; j++) { ++ sprintf(buf, "[%d]: %s", i, ++ bnxt_ring_stats_str[j]); ++ buf += ETH_GSTRING_LEN; ++ } ++ if (!BNXT_SUPPORTS_TPA(bp)) ++ goto skip_tpa_stats; ++ ++ num_str = ARRAY_SIZE(bnxt_ring_tpa_stats_str); ++ for (j = 0; j < num_str; j++) { ++ sprintf(buf, "[%d]: %s", i, ++ bnxt_ring_tpa_stats_str[j]); ++ buf += ETH_GSTRING_LEN; ++ } ++skip_tpa_stats: ++ num_str = ARRAY_SIZE(bnxt_ring_sw_stats_str); ++ for (j = 0; j < num_str; j++) { ++ sprintf(buf, "[%d]: %s", i, ++ bnxt_ring_sw_stats_str[j]); ++ buf += ETH_GSTRING_LEN; ++ } + } + for (i = 0; i < BNXT_NUM_SW_FUNC_STATS; i++) { + strcpy(buf, bnxt_sw_func_stats[i].string); diff --git a/SOURCES/0051-netdrv-bnxt_en-Allocate-the-larger-per-ring-statisti.patch b/SOURCES/0051-netdrv-bnxt_en-Allocate-the-larger-per-ring-statisti.patch new file mode 100644 index 0000000..93b5563 --- /dev/null +++ b/SOURCES/0051-netdrv-bnxt_en-Allocate-the-larger-per-ring-statisti.patch @@ -0,0 +1,83 @@ +From 4e9c35933c1034517f8d1ea4db0d84e67bf9fb6a Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:06 -0400 +Subject: [PATCH 51/96] [netdrv] bnxt_en: Allocate the larger per-ring + statistics block for 57500 chips + +Message-id: +Patchwork-id: 276465 +O-Subject: [RHEL-8.2 PATCH 44/78] bnxt_en: Allocate the larger per-ring statistics block for 57500 chips. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +The new TPA implemantation has additional TPA counters that extend the +per-ring statistics block. Allocate the proper size accordingly. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 4e7485066373f3e9a87fa063b65d0838990753e5) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 10 ++++++++-- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + + 2 files changed, 9 insertions(+), 2 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:16.886502357 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:17.147499962 +0100 +@@ -3640,7 +3640,7 @@ + if (!bp->bnapi) + return; + +- size = sizeof(struct ctx_hw_stats); ++ size = bp->hw_ring_stats_size; + + for (i = 0; i < bp->cp_nr_rings; i++) { + struct bnxt_napi *bnapi = bp->bnapi[i]; +@@ -3659,7 +3659,7 @@ + u32 size, i; + struct pci_dev *pdev = bp->pdev; + +- size = sizeof(struct ctx_hw_stats); ++ size = bp->hw_ring_stats_size; + + for (i = 0; i < bp->cp_nr_rings; i++) { + struct bnxt_napi *bnapi = bp->bnapi[i]; +@@ -4994,6 +4994,11 @@ + VNIC_QCAPS_RESP_FLAGS_ROCE_MIRRORING_CAPABLE_VNIC_CAP) + bp->flags |= BNXT_FLAG_ROCE_MIRROR_CAP; + bp->max_tpa_v2 = le16_to_cpu(resp->max_aggs_supported); ++ if (bp->max_tpa_v2) ++ bp->hw_ring_stats_size = ++ sizeof(struct ctx_hw_stats_ext); ++ else ++ bp->hw_ring_stats_size = sizeof(struct ctx_hw_stats); + } + mutex_unlock(&bp->hwrm_cmd_lock); + return rc; +@@ -6195,6 +6200,7 @@ + + bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_STAT_CTX_ALLOC, -1, -1); + ++ req.stats_dma_length = cpu_to_le16(bp->hw_ring_stats_size); + req.update_period_ms = cpu_to_le32(bp->stats_coal_ticks / 1000); + + mutex_lock(&bp->hwrm_cmd_lock); +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:16.750503606 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:17.148499952 +0100 +@@ -1607,6 +1607,7 @@ + int hw_port_stats_size; + u16 fw_rx_stats_ext_size; + u16 fw_tx_stats_ext_size; ++ u16 hw_ring_stats_size; + u8 pri2cos[8]; + u8 pri2cos_valid; + diff --git a/SOURCES/0052-netdrv-bnxt_en-Support-TPA-counters-on-57500-chips.patch b/SOURCES/0052-netdrv-bnxt_en-Support-TPA-counters-on-57500-chips.patch new file mode 100644 index 0000000..0cb513c --- /dev/null +++ b/SOURCES/0052-netdrv-bnxt_en-Support-TPA-counters-on-57500-chips.patch @@ -0,0 +1,113 @@ +From ecb8a317044a5892e9f0d5a3ebe27689dcb264b4 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:07 -0400 +Subject: [PATCH 52/96] [netdrv] bnxt_en: Support TPA counters on 57500 chips + +Message-id: +Patchwork-id: 276468 +O-Subject: [RHEL-8.2 PATCH 45/78] bnxt_en: Support TPA counters on 57500 chips. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Support the new expanded TPA v2 counters on 57500 B0 chips for +ethtool -S. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 78e7b86605b460e8b40622d16d840f9276d58627) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 41 +++++++++++++++++------ + 1 file changed, 31 insertions(+), 10 deletions(-) + +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:17.017501155 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:17.286498686 +0100 +@@ -163,6 +163,14 @@ + "tpa_aborts", + }; + ++static const char * const bnxt_ring_tpa2_stats_str[] = { ++ "rx_tpa_eligible_pkt", ++ "rx_tpa_eligible_bytes", ++ "rx_tpa_pkt", ++ "rx_tpa_bytes", ++ "rx_tpa_errors", ++}; ++ + static const char * const bnxt_ring_sw_stats_str[] = { + "rx_l4_csum_errors", + "missed_irqs", +@@ -461,14 +469,23 @@ + ARRAY_SIZE(bnxt_tx_pkts_pri_arr)) + #define BNXT_NUM_PCIE_STATS ARRAY_SIZE(bnxt_pcie_stats_arr) + ++static int bnxt_get_num_tpa_ring_stats(struct bnxt *bp) ++{ ++ if (BNXT_SUPPORTS_TPA(bp)) { ++ if (bp->max_tpa_v2) ++ return ARRAY_SIZE(bnxt_ring_tpa2_stats_str); ++ return ARRAY_SIZE(bnxt_ring_tpa_stats_str); ++ } ++ return 0; ++} ++ + static int bnxt_get_num_ring_stats(struct bnxt *bp) + { + int num_stats; + + num_stats = ARRAY_SIZE(bnxt_ring_stats_str) + +- ARRAY_SIZE(bnxt_ring_sw_stats_str); +- if (BNXT_SUPPORTS_TPA(bp)) +- num_stats += ARRAY_SIZE(bnxt_ring_tpa_stats_str); ++ ARRAY_SIZE(bnxt_ring_sw_stats_str) + ++ bnxt_get_num_tpa_ring_stats(bp); + return num_stats * bp->cp_nr_rings; + } + +@@ -515,10 +532,8 @@ + { + u32 i, j = 0; + struct bnxt *bp = netdev_priv(dev); +- u32 stat_fields = ARRAY_SIZE(bnxt_ring_stats_str); +- +- if (BNXT_SUPPORTS_TPA(bp)) +- stat_fields += ARRAY_SIZE(bnxt_ring_tpa_stats_str); ++ u32 stat_fields = ARRAY_SIZE(bnxt_ring_stats_str) + ++ bnxt_get_num_tpa_ring_stats(bp); + + if (!bp->bnapi) { + j += bnxt_get_num_ring_stats(bp) + BNXT_NUM_SW_FUNC_STATS; +@@ -609,6 +624,7 @@ + static void bnxt_get_strings(struct net_device *dev, u32 stringset, u8 *buf) + { + struct bnxt *bp = netdev_priv(dev); ++ static const char * const *str; + u32 i, j, num_str; + + switch (stringset) { +@@ -623,10 +639,15 @@ + if (!BNXT_SUPPORTS_TPA(bp)) + goto skip_tpa_stats; + +- num_str = ARRAY_SIZE(bnxt_ring_tpa_stats_str); ++ if (bp->max_tpa_v2) { ++ num_str = ARRAY_SIZE(bnxt_ring_tpa2_stats_str); ++ str = bnxt_ring_tpa2_stats_str; ++ } else { ++ num_str = ARRAY_SIZE(bnxt_ring_tpa_stats_str); ++ str = bnxt_ring_tpa_stats_str; ++ } + for (j = 0; j < num_str; j++) { +- sprintf(buf, "[%d]: %s", i, +- bnxt_ring_tpa_stats_str[j]); ++ sprintf(buf, "[%d]: %s", i, str[j]); + buf += ETH_GSTRING_LEN; + } + skip_tpa_stats: diff --git a/SOURCES/0053-netdrv-bnxt_en-Refactor-bnxt_init_one-and-turn-on-TP.patch b/SOURCES/0053-netdrv-bnxt_en-Refactor-bnxt_init_one-and-turn-on-TP.patch new file mode 100644 index 0000000..1e10393 --- /dev/null +++ b/SOURCES/0053-netdrv-bnxt_en-Refactor-bnxt_init_one-and-turn-on-TP.patch @@ -0,0 +1,205 @@ +From a9536e5d7071700b70864dd36a64c76be4cd66d9 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:08 -0400 +Subject: [PATCH 53/96] [netdrv] bnxt_en: Refactor bnxt_init_one() and turn on + TPA support on 57500 chips + +Message-id: <123b7087655bc1637b5b987815609f43d1ef2caa.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276472 +O-Subject: [RHEL-8.2 PATCH 46/78] bnxt_en: Refactor bnxt_init_one() and turn on TPA support on 57500 chips. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +With the new TPA feature in the 57500 chips, we need to discover the +feature first before setting up the netdev features. Refactor the +the firmware probe and init logic more cleanly into 2 functions and +and make these calls before setting up the netdev features. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 7c3809181468a219aa2abd25910bd3b02b89b0de) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 116 +++++++++++++++++------------- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 4 +- + 2 files changed, 67 insertions(+), 53 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:17.147499962 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:17.409497557 +0100 +@@ -9915,6 +9915,68 @@ + bp->stats_coal_ticks = BNXT_DEF_STATS_COAL_TICKS; + } + ++static int bnxt_fw_init_one_p1(struct bnxt *bp) ++{ ++ int rc; ++ ++ bp->fw_cap = 0; ++ rc = bnxt_hwrm_ver_get(bp); ++ if (rc) ++ return rc; ++ ++ if (bp->fw_cap & BNXT_FW_CAP_KONG_MB_CHNL) { ++ rc = bnxt_alloc_kong_hwrm_resources(bp); ++ if (rc) ++ bp->fw_cap &= ~BNXT_FW_CAP_KONG_MB_CHNL; ++ } ++ ++ if ((bp->fw_cap & BNXT_FW_CAP_SHORT_CMD) || ++ bp->hwrm_max_ext_req_len > BNXT_HWRM_MAX_REQ_LEN) { ++ rc = bnxt_alloc_hwrm_short_cmd_req(bp); ++ if (rc) ++ return rc; ++ } ++ rc = bnxt_hwrm_func_reset(bp); ++ if (rc) ++ return -ENODEV; ++ ++ bnxt_hwrm_fw_set_time(bp); ++ return 0; ++} ++ ++static int bnxt_fw_init_one_p2(struct bnxt *bp) ++{ ++ int rc; ++ ++ /* Get the MAX capabilities for this function */ ++ rc = bnxt_hwrm_func_qcaps(bp); ++ if (rc) { ++ netdev_err(bp->dev, "hwrm query capability failure rc: %x\n", ++ rc); ++ return -ENODEV; ++ } ++ ++ rc = bnxt_hwrm_cfa_adv_flow_mgnt_qcaps(bp); ++ if (rc) ++ netdev_warn(bp->dev, "hwrm query adv flow mgnt failure rc: %d\n", ++ rc); ++ ++ rc = bnxt_hwrm_func_drv_rgtr(bp); ++ if (rc) ++ return -ENODEV; ++ ++ rc = bnxt_hwrm_func_rgtr_async_events(bp, NULL, 0); ++ if (rc) ++ return -ENODEV; ++ ++ bnxt_hwrm_func_qcfg(bp); ++ bnxt_hwrm_vnic_qcaps(bp); ++ bnxt_hwrm_port_led_qcaps(bp); ++ bnxt_ethtool_init(bp); ++ bnxt_dcb_init(bp); ++ return 0; ++} ++ + static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev) + { + int rc; +@@ -10894,32 +10956,18 @@ + goto init_err_pci_clean; + + mutex_init(&bp->hwrm_cmd_lock); +- rc = bnxt_hwrm_ver_get(bp); ++ ++ rc = bnxt_fw_init_one_p1(bp); + if (rc) + goto init_err_pci_clean; + +- if (bp->fw_cap & BNXT_FW_CAP_KONG_MB_CHNL) { +- rc = bnxt_alloc_kong_hwrm_resources(bp); +- if (rc) +- bp->fw_cap &= ~BNXT_FW_CAP_KONG_MB_CHNL; +- } +- +- if ((bp->fw_cap & BNXT_FW_CAP_SHORT_CMD) || +- bp->hwrm_max_ext_req_len > BNXT_HWRM_MAX_REQ_LEN) { +- rc = bnxt_alloc_hwrm_short_cmd_req(bp); +- if (rc) +- goto init_err_pci_clean; +- } +- + if (BNXT_CHIP_P5(bp)) + bp->flags |= BNXT_FLAG_CHIP_P5; + +- rc = bnxt_hwrm_func_reset(bp); ++ rc = bnxt_fw_init_one_p2(bp); + if (rc) + goto init_err_pci_clean; + +- bnxt_hwrm_fw_set_time(bp); +- + dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_SG | + NETIF_F_TSO | NETIF_F_TSO6 | + NETIF_F_GSO_UDP_TUNNEL | NETIF_F_GSO_GRE | +@@ -10963,37 +11011,8 @@ + if (!BNXT_CHIP_P4_PLUS(bp)) + bp->flags |= BNXT_FLAG_DOUBLE_DB; + +- rc = bnxt_hwrm_func_drv_rgtr(bp); +- if (rc) +- goto init_err_pci_clean; +- +- rc = bnxt_hwrm_func_rgtr_async_events(bp, NULL, 0); +- if (rc) +- goto init_err_pci_clean; +- + bp->ulp_probe = bnxt_ulp_probe; + +- rc = bnxt_hwrm_queue_qportcfg(bp); +- if (rc) { +- netdev_err(bp->dev, "hwrm query qportcfg failure rc: %x\n", +- rc); +- rc = -1; +- goto init_err_pci_clean; +- } +- /* Get the MAX capabilities for this function */ +- rc = bnxt_hwrm_func_qcaps(bp); +- if (rc) { +- netdev_err(bp->dev, "hwrm query capability failure rc: %x\n", +- rc); +- rc = -1; +- goto init_err_pci_clean; +- } +- +- rc = bnxt_hwrm_cfa_adv_flow_mgnt_qcaps(bp); +- if (rc) +- netdev_warn(bp->dev, "hwrm query adv flow mgnt failure rc: %d\n", +- rc); +- + rc = bnxt_init_mac_addr(bp); + if (rc) { + dev_err(&pdev->dev, "Unable to initialize mac address.\n"); +@@ -11007,11 +11026,6 @@ + if (rc) + goto init_err_pci_clean; + } +- bnxt_hwrm_func_qcfg(bp); +- bnxt_hwrm_vnic_qcaps(bp); +- bnxt_hwrm_port_led_qcaps(bp); +- bnxt_ethtool_init(bp); +- bnxt_dcb_init(bp); + + /* MTU range: 60 - FW defined max */ + dev->min_mtu = ETH_ZLEN; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:17.148499952 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:17.409497557 +0100 +@@ -1459,8 +1459,8 @@ + #define BNXT_CHIP_TYPE_NITRO_A0(bp) ((bp)->flags & BNXT_FLAG_CHIP_NITRO_A0) + #define BNXT_RX_PAGE_MODE(bp) ((bp)->flags & BNXT_FLAG_RX_PAGE_MODE) + #define BNXT_SUPPORTS_TPA(bp) (!BNXT_CHIP_TYPE_NITRO_A0(bp) && \ +- !(bp->flags & BNXT_FLAG_CHIP_P5) && \ +- !is_kdump_kernel()) ++ (!((bp)->flags & BNXT_FLAG_CHIP_P5) || \ ++ (bp)->max_tpa_v2) && !is_kdump_kernel()) + + /* Chip class phase 5 */ + #define BNXT_CHIP_P5(bp) \ diff --git a/SOURCES/0054-netdrv-bnxt_en-Support-all-variants-of-the-5750X-chi.patch b/SOURCES/0054-netdrv-bnxt_en-Support-all-variants-of-the-5750X-chi.patch new file mode 100644 index 0000000..bb7188a --- /dev/null +++ b/SOURCES/0054-netdrv-bnxt_en-Support-all-variants-of-the-5750X-chi.patch @@ -0,0 +1,54 @@ +From 0a5ec2abf3d05d1aa939458395c5777f692326c9 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:09 -0400 +Subject: [PATCH 54/96] [netdrv] bnxt_en: Support all variants of the 5750X + chip family + +Message-id: +Patchwork-id: 276477 +O-Subject: [RHEL-8.2 PATCH 47/78] bnxt_en: Support all variants of the 5750X chip family. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Define the 57508, 57504, and 57502 chip IDs that are all part of the +BNXT_CHIP_P5 family of chips. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 1dc88b97a020148c0eea6c595d511a19c2fab347) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:17.409497557 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:17.543496327 +0100 +@@ -1362,7 +1362,9 @@ + + #define CHIP_NUM_5745X 0xd730 + +-#define CHIP_NUM_57500 0x1750 ++#define CHIP_NUM_57508 0x1750 ++#define CHIP_NUM_57504 0x1751 ++#define CHIP_NUM_57502 0x1752 + + #define CHIP_NUM_58802 0xd802 + #define CHIP_NUM_58804 0xd804 +@@ -1464,7 +1466,9 @@ + + /* Chip class phase 5 */ + #define BNXT_CHIP_P5(bp) \ +- ((bp)->chip_num == CHIP_NUM_57500) ++ ((bp)->chip_num == CHIP_NUM_57508 || \ ++ (bp)->chip_num == CHIP_NUM_57504 || \ ++ (bp)->chip_num == CHIP_NUM_57502) + + /* Chip class phase 4.x */ + #define BNXT_CHIP_P4(bp) \ diff --git a/SOURCES/0055-netdrv-bnxt_en-Add-PCI-IDs-for-57500-series-NPAR-dev.patch b/SOURCES/0055-netdrv-bnxt_en-Add-PCI-IDs-for-57500-series-NPAR-dev.patch new file mode 100644 index 0000000..0165ec2 --- /dev/null +++ b/SOURCES/0055-netdrv-bnxt_en-Add-PCI-IDs-for-57500-series-NPAR-dev.patch @@ -0,0 +1,62 @@ +From 07191de7be15338828221c43363a0d6104484c6e Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:10 -0400 +Subject: [PATCH 55/96] [netdrv] bnxt_en: Add PCI IDs for 57500 series NPAR + devices + +Message-id: +Patchwork-id: 276469 +O-Subject: [RHEL-8.2 PATCH 48/78] bnxt_en: Add PCI IDs for 57500 series NPAR devices. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 49c98421e6ab33665e8ee7901218a712f5b0db2e) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:17.409497557 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:17.665495207 +0100 +@@ -116,6 +116,9 @@ + BCM57508, + BCM57504, + BCM57502, ++ BCM57508_NPAR, ++ BCM57504_NPAR, ++ BCM57502_NPAR, + BCM58802, + BCM58804, + BCM58808, +@@ -161,6 +164,9 @@ + [BCM57508] = { "Broadcom BCM57508 NetXtreme-E 10Gb/25Gb/50Gb/100Gb/200Gb Ethernet" }, + [BCM57504] = { "Broadcom BCM57504 NetXtreme-E 10Gb/25Gb/50Gb/100Gb/200Gb Ethernet" }, + [BCM57502] = { "Broadcom BCM57502 NetXtreme-E 10Gb/25Gb/50Gb Ethernet" }, ++ [BCM57508_NPAR] = { "Broadcom BCM57508 NetXtreme-E Ethernet Partition" }, ++ [BCM57504_NPAR] = { "Broadcom BCM57504 NetXtreme-E Ethernet Partition" }, ++ [BCM57502_NPAR] = { "Broadcom BCM57502 NetXtreme-E Ethernet Partition" }, + [BCM58802] = { "Broadcom BCM58802 NetXtreme-S 10Gb/25Gb/40Gb/50Gb Ethernet" }, + [BCM58804] = { "Broadcom BCM58804 NetXtreme-S 10Gb/25Gb/40Gb/50Gb/100Gb Ethernet" }, + [BCM58808] = { "Broadcom BCM58808 NetXtreme-S 10Gb/25Gb/40Gb/50Gb/100Gb Ethernet" }, +@@ -209,6 +215,12 @@ + { PCI_VDEVICE(BROADCOM, 0x1750), .driver_data = BCM57508 }, + { PCI_VDEVICE(BROADCOM, 0x1751), .driver_data = BCM57504 }, + { PCI_VDEVICE(BROADCOM, 0x1752), .driver_data = BCM57502 }, ++ { PCI_VDEVICE(BROADCOM, 0x1800), .driver_data = BCM57508_NPAR }, ++ { PCI_VDEVICE(BROADCOM, 0x1801), .driver_data = BCM57504_NPAR }, ++ { PCI_VDEVICE(BROADCOM, 0x1802), .driver_data = BCM57502_NPAR }, ++ { PCI_VDEVICE(BROADCOM, 0x1803), .driver_data = BCM57508_NPAR }, ++ { PCI_VDEVICE(BROADCOM, 0x1804), .driver_data = BCM57504_NPAR }, ++ { PCI_VDEVICE(BROADCOM, 0x1805), .driver_data = BCM57502_NPAR }, + { PCI_VDEVICE(BROADCOM, 0xd802), .driver_data = BCM58802 }, + { PCI_VDEVICE(BROADCOM, 0xd804), .driver_data = BCM58804 }, + #ifdef CONFIG_BNXT_SRIOV diff --git a/SOURCES/0056-netdrv-bnxt-no-need-to-check-return-value-of-debugfs.patch b/SOURCES/0056-netdrv-bnxt-no-need-to-check-return-value-of-debugfs.patch new file mode 100644 index 0000000..6b820bc --- /dev/null +++ b/SOURCES/0056-netdrv-bnxt-no-need-to-check-return-value-of-debugfs.patch @@ -0,0 +1,119 @@ +From 2ebefa82c1a4132e47d8e9ebaa8c1ba1647c3a7f Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:11 -0400 +Subject: [PATCH 56/96] [netdrv] bnxt: no need to check return value of + debugfs_create functions + +Message-id: <85557a81f2bb78d291f389dfdd9b0175b2d8f3e2.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276475 +O-Subject: [RHEL-8.2 PATCH 49/78] bnxt: no need to check return value of debugfs_create functions +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +When calling debugfs functions, there is no need to ever check the +return value. The function can work or not, but the code logic should +never do something different based on this. + +This cleans up a lot of unneeded code and logic around the debugfs +files, making all of this much simpler and easier to understand. + +Cc: Michael Chan +Cc: "David S. Miller" +Cc: netdev@vger.kernel.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: David S. Miller +(cherry picked from commit 3a131e85043cf538d5e70c0f23f9d69a4dd642b9) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 - + drivers/net/ethernet/broadcom/bnxt/bnxt_debugfs.c | 39 +++++++---------------- + 2 files changed, 11 insertions(+), 29 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:17.543496327 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:17.788494078 +0100 +@@ -1724,7 +1724,6 @@ + u8 switch_id[8]; + struct bnxt_tc_info *tc_info; + struct dentry *debugfs_pdev; +- struct dentry *debugfs_dim; + struct device *hwmon_dev; + }; + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_debugfs.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_debugfs.c 2020-02-06 16:22:54.954703674 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_debugfs.c 2020-02-06 16:23:17.788494078 +0100 +@@ -61,45 +61,30 @@ + .read = debugfs_dim_read, + }; + +-static struct dentry *debugfs_dim_ring_init(struct net_dim *dim, int ring_idx, +- struct dentry *dd) ++static void debugfs_dim_ring_init(struct net_dim *dim, int ring_idx, ++ struct dentry *dd) + { + static char qname[16]; + + snprintf(qname, 10, "%d", ring_idx); +- return debugfs_create_file(qname, 0600, dd, +- dim, &debugfs_dim_fops); ++ debugfs_create_file(qname, 0600, dd, dim, &debugfs_dim_fops); + } + + void bnxt_debug_dev_init(struct bnxt *bp) + { + const char *pname = pci_name(bp->pdev); +- struct dentry *pdevf; ++ struct dentry *dir; + int i; + + bp->debugfs_pdev = debugfs_create_dir(pname, bnxt_debug_mnt); +- if (bp->debugfs_pdev) { +- pdevf = debugfs_create_dir("dim", bp->debugfs_pdev); +- if (!pdevf) { +- pr_err("failed to create debugfs entry %s/dim\n", +- pname); +- return; +- } +- bp->debugfs_dim = pdevf; +- /* create files for each rx ring */ +- for (i = 0; i < bp->cp_nr_rings; i++) { +- struct bnxt_cp_ring_info *cpr = &bp->bnapi[i]->cp_ring; +- +- if (cpr && bp->bnapi[i]->rx_ring) { +- pdevf = debugfs_dim_ring_init(&cpr->dim, i, +- bp->debugfs_dim); +- if (!pdevf) +- pr_err("failed to create debugfs entry %s/dim/%d\n", +- pname, i); +- } +- } +- } else { +- pr_err("failed to create debugfs entry %s\n", pname); ++ dir = debugfs_create_dir("dim", bp->debugfs_pdev); ++ ++ /* create files for each rx ring */ ++ for (i = 0; i < bp->cp_nr_rings; i++) { ++ struct bnxt_cp_ring_info *cpr = &bp->bnapi[i]->cp_ring; ++ ++ if (cpr && bp->bnapi[i]->rx_ring) ++ debugfs_dim_ring_init(&cpr->dim, i, dir); + } + } + +@@ -114,8 +99,6 @@ + void bnxt_debug_init(void) + { + bnxt_debug_mnt = debugfs_create_dir("bnxt_en", NULL); +- if (!bnxt_debug_mnt) +- pr_err("failed to init bnxt_en debugfs\n"); + } + + void bnxt_debug_exit(void) diff --git a/SOURCES/0057-netdrv-bnxt_en-Fix-allocation-of-zero-statistics-blo.patch b/SOURCES/0057-netdrv-bnxt_en-Fix-allocation-of-zero-statistics-blo.patch new file mode 100644 index 0000000..c6d0f0d --- /dev/null +++ b/SOURCES/0057-netdrv-bnxt_en-Fix-allocation-of-zero-statistics-blo.patch @@ -0,0 +1,57 @@ +From dc0e1a87f072fad80e9b9dd314dbf182a0655931 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:12 -0400 +Subject: [PATCH 57/96] [netdrv] bnxt_en: Fix allocation of zero statistics + block size regression + +Message-id: +Patchwork-id: 276481 +O-Subject: [RHEL-8.2 PATCH 50/78] bnxt_en: Fix allocation of zero statistics block size regression. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Recent commit added logic to determine the appropriate statistics block +size to allocate and the size is stored in bp->hw_ring_stats_size. But +if the firmware spec is older than 1.6.0, it is 0 and not initialized. +This causes the allocation to fail with size 0 and bnxt_open() to +abort. Fix it by always initializing bp->hw_ring_stats_size to the +legacy default size value. + +Fixes: 4e7485066373 ("bnxt_en: Allocate the larger per-ring statistics block for 57500 chips.") +Reported-by: Jonathan Lemon +Signed-off-by: Michael Chan +Tested-by: Jonathan Lemon +Acked-by: Jonathan Lemon +Signed-off-by: David S. Miller +(cherry picked from commit fbbdbc6473070dcb3ee1d69cf1c49ff78677d716) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:17.665495207 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:17.921492857 +0100 +@@ -4990,6 +4990,7 @@ + struct hwrm_vnic_qcaps_input req = {0}; + int rc; + ++ bp->hw_ring_stats_size = sizeof(struct ctx_hw_stats); + if (bp->hwrm_spec_code < 0x10600) + return 0; + +@@ -5009,8 +5010,6 @@ + if (bp->max_tpa_v2) + bp->hw_ring_stats_size = + sizeof(struct ctx_hw_stats_ext); +- else +- bp->hw_ring_stats_size = sizeof(struct ctx_hw_stats); + } + mutex_unlock(&bp->hwrm_cmd_lock); + return rc; diff --git a/SOURCES/0058-netdrv-bnxt_en-Use-a-common-function-to-print-the-sa.patch b/SOURCES/0058-netdrv-bnxt_en-Use-a-common-function-to-print-the-sa.patch new file mode 100644 index 0000000..0d7a2ce --- /dev/null +++ b/SOURCES/0058-netdrv-bnxt_en-Use-a-common-function-to-print-the-sa.patch @@ -0,0 +1,74 @@ +From a63606600d431959dd1a271a8b91d1c6b6e305fd Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:13 -0400 +Subject: [PATCH 58/96] [netdrv] bnxt_en: Use a common function to print the + same ethtool -f error message + +Message-id: <29dc7b5858ac5320c7eac0eeff93abd135cb6e2e.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276476 +O-Subject: [RHEL-8.2 PATCH 51/78] bnxt_en: Use a common function to print the same ethtool -f error message. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +The same message is printed 3 times in the code, so use a common function +to do that. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit b3b0ddd07e63d564a3d5500938913805d06a1682) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +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:17.286498686 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:18.049491682 +0100 +@@ -1699,6 +1699,11 @@ + return bp->link_info.link_up; + } + ++static void bnxt_print_admin_err(struct bnxt *bp) ++{ ++ netdev_info(bp->dev, "PF does not have admin privileges to flash or reset the device\n"); ++} ++ + static int bnxt_find_nvram_item(struct net_device *dev, u16 type, u16 ordinal, + u16 ext, u16 *index, u32 *item_length, + u32 *data_length); +@@ -1739,8 +1744,7 @@ + dma_free_coherent(&bp->pdev->dev, data_len, kmem, dma_handle); + + if (rc == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) { +- netdev_info(dev, +- "PF does not have admin privileges to flash the device\n"); ++ bnxt_print_admin_err(bp); + rc = -EACCES; + } else if (rc) { + rc = -EIO; +@@ -1795,8 +1799,7 @@ + + rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + if (rc == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) { +- netdev_info(dev, +- "PF does not have admin privileges to reset the device\n"); ++ bnxt_print_admin_err(bp); + rc = -EACCES; + } else if (rc) { + rc = -EIO; +@@ -2096,8 +2099,7 @@ + mutex_unlock(&bp->hwrm_cmd_lock); + err_exit: + if (hwrm_err == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) { +- netdev_info(dev, +- "PF does not have admin privileges to flash the device\n"); ++ bnxt_print_admin_err(bp); + rc = -EACCES; + } else if (hwrm_err) { + rc = -EOPNOTSUPP; diff --git a/SOURCES/0059-netdrv-bnxt_en-Remove-the-1-error-return-code-from-b.patch b/SOURCES/0059-netdrv-bnxt_en-Remove-the-1-error-return-code-from-b.patch new file mode 100644 index 0000000..394fc01 --- /dev/null +++ b/SOURCES/0059-netdrv-bnxt_en-Remove-the-1-error-return-code-from-b.patch @@ -0,0 +1,59 @@ +From 6f33f93474d2f2ce4c358a87236dfd597bc60e5f Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:14 -0400 +Subject: [PATCH 59/96] [netdrv] bnxt_en: Remove the -1 error return code from + bnxt_hwrm_do_send_msg() + +Message-id: +Patchwork-id: 276473 +O-Subject: [RHEL-8.2 PATCH 52/78] bnxt_en: Remove the -1 error return code from bnxt_hwrm_do_send_msg(). +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Replace the non-standard -1 code with -EBUSY when there is no firmware +response after waiting for the maximum timeout. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit a935cb7ec449bca1adf806d7fb00f5032b63c6e0) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:17.921492857 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:18.179490489 +0100 +@@ -4167,7 +4167,7 @@ + if (bp->hwrm_intr_seq_id != (u16)~seq_id) { + netdev_err(bp->dev, "Resp cmpl intr err msg: 0x%x\n", + le16_to_cpu(req->req_type)); +- return -1; ++ return -EBUSY; + } + len = (le32_to_cpu(*resp_len) & HWRM_RESP_LEN_MASK) >> + HWRM_RESP_LEN_SFT; +@@ -4195,7 +4195,7 @@ + HWRM_TOTAL_TIMEOUT(i), + le16_to_cpu(req->req_type), + le16_to_cpu(req->seq_id), len); +- return -1; ++ return -EBUSY; + } + + /* Last byte of resp contains valid bit */ +@@ -4213,7 +4213,7 @@ + HWRM_TOTAL_TIMEOUT(i), + le16_to_cpu(req->req_type), + le16_to_cpu(req->seq_id), len, *valid); +- return -1; ++ return -EBUSY; + } + } + diff --git a/SOURCES/0060-netdrv-bnxt_en-Convert-error-code-in-firmware-messag.patch b/SOURCES/0060-netdrv-bnxt_en-Convert-error-code-in-firmware-messag.patch new file mode 100644 index 0000000..36677e0 --- /dev/null +++ b/SOURCES/0060-netdrv-bnxt_en-Convert-error-code-in-firmware-messag.patch @@ -0,0 +1,404 @@ +From ba2d2e2bd59c1dcd20c30fa6f05a847dc613b85d Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:15 -0400 +Subject: [PATCH 60/96] [netdrv] bnxt_en: Convert error code in firmware + message response to standard code + +Message-id: <6fad2b5f944f9ec2522f438afff3f55d8099ac99.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276478 +O-Subject: [RHEL-8.2 PATCH 53/78] bnxt_en: Convert error code in firmware message response to standard code. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +The main firmware messaging function returns the firmware defined error +code and many callers have to convert to standard error code for proper +propagation to userspace. Convert bnxt_hwrm_do_send_msg() to return +standard error code so we can do away with all the special error code +handling by the many callers. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit d4f1420d365633490aa134abfe408453d1c7c238) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 60 ++++++++++++++--------- + drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c | 4 -- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 8 +-- + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 20 ++------ + drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 12 ++--- + drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c | 17 ------- + 6 files changed, 44 insertions(+), 77 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.179490489 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:18.306489323 +0100 +@@ -4053,6 +4053,32 @@ + req->resp_addr = cpu_to_le64(bp->hwrm_cmd_resp_dma_addr); + } + ++static int bnxt_hwrm_to_stderr(u32 hwrm_err) ++{ ++ switch (hwrm_err) { ++ case HWRM_ERR_CODE_SUCCESS: ++ return 0; ++ case HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED: ++ return -EACCES; ++ case HWRM_ERR_CODE_RESOURCE_ALLOC_ERROR: ++ return -ENOSPC; ++ case HWRM_ERR_CODE_INVALID_PARAMS: ++ case HWRM_ERR_CODE_INVALID_FLAGS: ++ case HWRM_ERR_CODE_INVALID_ENABLES: ++ case HWRM_ERR_CODE_UNSUPPORTED_TLV: ++ case HWRM_ERR_CODE_UNSUPPORTED_OPTION_ERR: ++ return -EINVAL; ++ case HWRM_ERR_CODE_NO_BUFFER: ++ return -ENOMEM; ++ case HWRM_ERR_CODE_HOT_RESET_PROGRESS: ++ return -EAGAIN; ++ case HWRM_ERR_CODE_CMD_NOT_SUPPORTED: ++ return -EOPNOTSUPP; ++ default: ++ return -EIO; ++ } ++} ++ + static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len, + int timeout, bool silent) + { +@@ -4227,7 +4253,7 @@ + netdev_err(bp->dev, "hwrm req_type 0x%x seq id 0x%x error 0x%x\n", + le16_to_cpu(resp->req_type), + le16_to_cpu(resp->seq_id), rc); +- return rc; ++ return bnxt_hwrm_to_stderr(rc); + } + + int _hwrm_send_message(struct bnxt *bp, void *msg, u32 msg_len, int timeout) +@@ -4340,10 +4366,8 @@ + + mutex_lock(&bp->hwrm_cmd_lock); + rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- if (rc) +- rc = -EIO; +- else if (resp->flags & +- cpu_to_le32(FUNC_DRV_RGTR_RESP_FLAGS_IF_CHANGE_SUPPORTED)) ++ if (!rc && (resp->flags & ++ cpu_to_le32(FUNC_DRV_RGTR_RESP_FLAGS_IF_CHANGE_SUPPORTED))) + bp->fw_cap |= BNXT_FW_CAP_IF_CHANGE; + mutex_unlock(&bp->hwrm_cmd_lock); + return rc; +@@ -4766,7 +4790,7 @@ + } + rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + if (rc) +- return -EIO; ++ return rc; + } + return 0; + } +@@ -5526,7 +5550,7 @@ + rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + if (rc) { + mutex_unlock(&bp->hwrm_cmd_lock); +- return -EIO; ++ return rc; + } + + hw_resc->resv_tx_rings = le16_to_cpu(resp->alloc_tx_rings); +@@ -5690,7 +5714,7 @@ + + rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + if (rc) +- return -ENOMEM; ++ return rc; + + if (bp->hwrm_spec_code < 0x10601) + bp->hw_resc.resv_tx_rings = tx_rings; +@@ -5715,7 +5739,7 @@ + cp_rings, stats, vnics); + rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + if (rc) +- return -ENOMEM; ++ return rc; + + rc = bnxt_hwrm_get_rings(bp); + return rc; +@@ -5896,9 +5920,7 @@ + + req.flags = cpu_to_le32(flags); + rc = hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- if (rc) +- return -ENOMEM; +- return 0; ++ return rc; + } + + static int bnxt_hwrm_check_pf_rings(struct bnxt *bp, int tx_rings, int rx_rings, +@@ -5926,9 +5948,7 @@ + + req.flags = cpu_to_le32(flags); + rc = hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- if (rc) +- return -ENOMEM; +- return 0; ++ return rc; + } + + static int bnxt_hwrm_check_rings(struct bnxt *bp, int tx_rings, int rx_rings, +@@ -6488,8 +6508,6 @@ + } + req.flags = cpu_to_le32(flags); + rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- if (rc) +- rc = -EIO; + return rc; + } + +@@ -6751,10 +6769,8 @@ + mutex_lock(&bp->hwrm_cmd_lock); + rc = _hwrm_send_message_silent(bp, &req, sizeof(req), + HWRM_CMD_TIMEOUT); +- if (rc) { +- rc = -EIO; ++ if (rc) + goto hwrm_func_resc_qcaps_exit; +- } + + hw_resc->max_tx_sch_inputs = le16_to_cpu(resp->max_tx_scheduler_inputs); + if (!all) +@@ -7262,8 +7278,6 @@ + else + return -EINVAL; + rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- if (rc) +- rc = -EIO; + return rc; + } + +@@ -7283,8 +7297,6 @@ + req.options = FUNC_CFG_REQ_OPTIONS_CACHE_LINESIZE_SIZE_128; + + rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- if (rc) +- rc = -EIO; + return rc; + } + +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:12.277544664 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c 2020-02-06 16:23:18.306489323 +0100 +@@ -377,8 +377,6 @@ + set.data_len = cpu_to_le16(sizeof(*data) + sizeof(*fw_app) * n); + set.hdr_cnt = 1; + rc = hwrm_send_message(bp, &set, sizeof(set), HWRM_CMD_TIMEOUT); +- if (rc) +- rc = -EIO; + + set_app_exit: + dma_free_coherent(&bp->pdev->dev, data_len, data, mapping); +@@ -433,8 +431,6 @@ + dscp2pri->pri = app->priority; + req.entry_cnt = cpu_to_le16(1); + rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- if (rc) +- rc = -EIO; + dma_free_coherent(&bp->pdev->dev, sizeof(*dscp2pri), dscp2pri, + mapping); + return rc; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:15.606514107 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:18.306489323 +0100 +@@ -109,13 +109,9 @@ + memcpy(buf, data_addr, bytesize); + + dma_free_coherent(&bp->pdev->dev, bytesize, data_addr, data_dma_addr); +- if (rc == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) { ++ if (rc == -EACCES) + netdev_err(bp->dev, "PF does not have admin privileges to modify NVM config\n"); +- return -EACCES; +- } else if (rc) { +- return -EIO; +- } +- return 0; ++ return rc; + } + + static int bnxt_dl_nvm_param_get(struct devlink *dl, u32 id, +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.049491682 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:18.307489314 +0100 +@@ -1743,12 +1743,8 @@ + rc = hwrm_send_message(bp, &req, sizeof(req), FLASH_NVRAM_TIMEOUT); + dma_free_coherent(&bp->pdev->dev, data_len, kmem, dma_handle); + +- if (rc == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) { ++ if (rc == -EACCES) + bnxt_print_admin_err(bp); +- rc = -EACCES; +- } else if (rc) { +- rc = -EIO; +- } + return rc; + } + +@@ -1798,12 +1794,8 @@ + } + + rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- if (rc == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) { ++ if (rc == -EACCES) + bnxt_print_admin_err(bp); +- rc = -EACCES; +- } else if (rc) { +- rc = -EIO; +- } + return rc; + } + +@@ -2098,12 +2090,8 @@ + flash_pkg_exit: + mutex_unlock(&bp->hwrm_cmd_lock); + err_exit: +- if (hwrm_err == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) { ++ if (hwrm_err == -EACCES) + bnxt_print_admin_err(bp); +- rc = -EACCES; +- } else if (hwrm_err) { +- rc = -EOPNOTSUPP; +- } + return rc; + } + +@@ -2642,8 +2630,6 @@ + led_cfg->led_group_id = bp->leds[i].led_group_id; + } + rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- if (rc) +- rc = -EIO; + return rc; + } + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c 2020-02-06 16:22:54.758705473 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c 2020-02-06 16:23:18.307489314 +0100 +@@ -133,7 +133,7 @@ + rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + if (rc) { + mutex_unlock(&bp->hwrm_cmd_lock); +- return -EIO; ++ return rc; + } + vf->func_qcfg_flags = le16_to_cpu(resp->flags); + mutex_unlock(&bp->hwrm_cmd_lock); +@@ -164,9 +164,7 @@ + else + req.flags = cpu_to_le32(FUNC_CFG_REQ_FLAGS_TRUSTED_VF_DISABLE); + rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- if (rc) +- return -EIO; +- return 0; ++ return rc; + } + + int bnxt_set_vf_trust(struct net_device *dev, int vf_id, bool trusted) +@@ -564,10 +562,8 @@ + req.vf_id = cpu_to_le16(pf->first_vf_id + i); + rc = _hwrm_send_message(bp, &req, sizeof(req), + HWRM_CMD_TIMEOUT); +- if (rc) { +- rc = -ENOMEM; ++ if (rc) + break; +- } + pf->active_vfs = i + 1; + pf->vf[i].fw_fid = pf->first_vf_id + i; + } +@@ -664,8 +660,6 @@ + total_vf_tx_rings += vf_tx_rsvd; + } + mutex_unlock(&bp->hwrm_cmd_lock); +- if (rc) +- rc = -ENOMEM; + if (pf->active_vfs) { + hw_resc->max_tx_rings -= total_vf_tx_rings; + hw_resc->max_rx_rings -= vf_rx_rings * num_vfs; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c 2020-02-06 16:23:15.476515300 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c 2020-02-06 16:23:18.307489314 +0100 +@@ -319,8 +319,6 @@ + if (rc) + netdev_info(bp->dev, "%s: Error rc=%d", __func__, rc); + +- if (rc) +- rc = -EIO; + return rc; + } + +@@ -515,11 +513,6 @@ + } + } + mutex_unlock(&bp->hwrm_cmd_lock); +- +- if (rc == HWRM_ERR_CODE_RESOURCE_ALLOC_ERROR) +- rc = -ENOSPC; +- else if (rc) +- rc = -EIO; + return rc; + } + +@@ -591,8 +584,6 @@ + } + mutex_unlock(&bp->hwrm_cmd_lock); + +- if (rc) +- rc = -EIO; + return rc; + } + +@@ -609,8 +600,6 @@ + if (rc) + netdev_info(bp->dev, "%s: Error rc=%d", __func__, rc); + +- if (rc) +- rc = -EIO; + return rc; + } + +@@ -660,8 +649,6 @@ + } + mutex_unlock(&bp->hwrm_cmd_lock); + +- if (rc) +- rc = -EIO; + return rc; + } + +@@ -678,8 +665,6 @@ + if (rc) + netdev_info(bp->dev, "%s: Error rc=%d", __func__, rc); + +- if (rc) +- rc = -EIO; + return rc; + } + +@@ -1457,8 +1442,6 @@ + } + mutex_unlock(&bp->hwrm_cmd_lock); + +- if (rc) +- rc = -EIO; + return rc; + } + diff --git a/SOURCES/0061-netdrv-bnxt_en-Simplify-error-checking-in-the-SR-IOV.patch b/SOURCES/0061-netdrv-bnxt_en-Simplify-error-checking-in-the-SR-IOV.patch new file mode 100644 index 0000000..9596724 --- /dev/null +++ b/SOURCES/0061-netdrv-bnxt_en-Simplify-error-checking-in-the-SR-IOV.patch @@ -0,0 +1,169 @@ +From 345da077d523267494a9414944cde11bef6ff3cf Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:16 -0400 +Subject: [PATCH 61/96] [netdrv] bnxt_en: Simplify error checking in the SR-IOV + message forwarding functions + +Message-id: <0c9d8a2c5d2d4eee088584ec4dc51aecd8c624a2.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276479 +O-Subject: [RHEL-8.2 PATCH 54/78] bnxt_en: Simplify error checking in the SR-IOV message forwarding functions. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +There are 4 functions handling message forwarding for SR-IOV. They +check for non-zero firmware response code and then return -1. There +is no need to do this anymore. The main messaging function will +now return standard error code. Since we don't need to examine the +response, we can use the hwrm_send_message() variant which will +take the mutex automatically. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit a798302d56f56fb7ad6a01f64f495aeafeb6c0f0) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 72 +++---------------------- + 1 file changed, 8 insertions(+), 64 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c 2020-02-06 16:23:18.307489314 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c 2020-02-06 16:23:18.477487753 +0100 +@@ -25,7 +25,6 @@ + static int bnxt_hwrm_fwd_async_event_cmpl(struct bnxt *bp, + struct bnxt_vf_info *vf, u16 event_id) + { +- struct hwrm_fwd_async_event_cmpl_output *resp = bp->hwrm_cmd_resp_addr; + struct hwrm_fwd_async_event_cmpl_input req = {0}; + struct hwrm_async_event_cmpl *async_cmpl; + int rc = 0; +@@ -40,23 +39,10 @@ + async_cmpl->type = cpu_to_le16(ASYNC_EVENT_CMPL_TYPE_HWRM_ASYNC_EVENT); + async_cmpl->event_id = cpu_to_le16(event_id); + +- mutex_lock(&bp->hwrm_cmd_lock); +- rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- +- if (rc) { ++ rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ if (rc) + netdev_err(bp->dev, "hwrm_fwd_async_event_cmpl failed. rc:%d\n", + rc); +- goto fwd_async_event_cmpl_exit; +- } +- +- if (resp->error_code) { +- netdev_err(bp->dev, "hwrm_fwd_async_event_cmpl error %d\n", +- resp->error_code); +- rc = -1; +- } +- +-fwd_async_event_cmpl_exit: +- mutex_unlock(&bp->hwrm_cmd_lock); + return rc; + } + +@@ -864,7 +850,6 @@ + { + int rc = 0; + struct hwrm_fwd_resp_input req = {0}; +- struct hwrm_fwd_resp_output *resp = bp->hwrm_cmd_resp_addr; + + if (BNXT_FWD_RESP_SIZE_ERR(msg_size)) + return -EINVAL; +@@ -879,22 +864,9 @@ + req.encap_resp_cmpl_ring = encap_resp_cpr; + memcpy(req.encap_resp, encap_resp, msg_size); + +- mutex_lock(&bp->hwrm_cmd_lock); +- rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- +- if (rc) { ++ rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ if (rc) + netdev_err(bp->dev, "hwrm_fwd_resp failed. rc:%d\n", rc); +- goto fwd_resp_exit; +- } +- +- if (resp->error_code) { +- netdev_err(bp->dev, "hwrm_fwd_resp error %d\n", +- resp->error_code); +- rc = -1; +- } +- +-fwd_resp_exit: +- mutex_unlock(&bp->hwrm_cmd_lock); + return rc; + } + +@@ -903,7 +875,6 @@ + { + int rc = 0; + struct hwrm_reject_fwd_resp_input req = {0}; +- struct hwrm_reject_fwd_resp_output *resp = bp->hwrm_cmd_resp_addr; + + if (BNXT_REJ_FWD_RESP_SIZE_ERR(msg_size)) + return -EINVAL; +@@ -914,22 +885,9 @@ + req.encap_resp_target_id = cpu_to_le16(vf->fw_fid); + memcpy(req.encap_request, vf->hwrm_cmd_req_addr, msg_size); + +- mutex_lock(&bp->hwrm_cmd_lock); +- rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- +- if (rc) { ++ rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ if (rc) + netdev_err(bp->dev, "hwrm_fwd_err_resp failed. rc:%d\n", rc); +- goto fwd_err_resp_exit; +- } +- +- if (resp->error_code) { +- netdev_err(bp->dev, "hwrm_fwd_err_resp error %d\n", +- resp->error_code); +- rc = -1; +- } +- +-fwd_err_resp_exit: +- mutex_unlock(&bp->hwrm_cmd_lock); + return rc; + } + +@@ -938,7 +896,6 @@ + { + int rc = 0; + struct hwrm_exec_fwd_resp_input req = {0}; +- struct hwrm_exec_fwd_resp_output *resp = bp->hwrm_cmd_resp_addr; + + if (BNXT_EXEC_FWD_RESP_SIZE_ERR(msg_size)) + return -EINVAL; +@@ -949,22 +906,9 @@ + req.encap_resp_target_id = cpu_to_le16(vf->fw_fid); + memcpy(req.encap_request, vf->hwrm_cmd_req_addr, msg_size); + +- mutex_lock(&bp->hwrm_cmd_lock); +- rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- +- if (rc) { ++ rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ if (rc) + netdev_err(bp->dev, "hwrm_exec_fw_resp failed. rc:%d\n", rc); +- goto exec_fwd_resp_exit; +- } +- +- if (resp->error_code) { +- netdev_err(bp->dev, "hwrm_exec_fw_resp error %d\n", +- resp->error_code); +- rc = -1; +- } +- +-exec_fwd_resp_exit: +- mutex_unlock(&bp->hwrm_cmd_lock); + return rc; + } + diff --git a/SOURCES/0062-netdrv-bnxt_en-Suppress-all-error-messages-in-hwrm_d.patch b/SOURCES/0062-netdrv-bnxt_en-Suppress-all-error-messages-in-hwrm_d.patch new file mode 100644 index 0000000..0ff7f0a --- /dev/null +++ b/SOURCES/0062-netdrv-bnxt_en-Suppress-all-error-messages-in-hwrm_d.patch @@ -0,0 +1,91 @@ +From 7368c8c1ff8c532df744d7e183507309cd4647f9 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:17 -0400 +Subject: [PATCH 62/96] [netdrv] bnxt_en: Suppress all error messages in + hwrm_do_send_msg() in silent mode + +Message-id: <8cb780ae7e85c9c31455263c9cb89b904e44e2c0.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276485 +O-Subject: [RHEL-8.2 PATCH 55/78] bnxt_en: Suppress all error messages in hwrm_do_send_msg() in silent mode. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +If the silent parameter is set, suppress all messages when there is +no response from firmware. When polling for firmware to come out of +reset, no response may be normal and we want to suppress the error +messages. Also, don't poll for the firmware DMA response if Bus Master +is disabled. This is in preparation for error recovery when firmware +may be in error or reset state or Bus Master is disabled. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 5bedb5296e33e889818d77c8ec69040481fab157) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 27 +++++++++++++++++---------- + 1 file changed, 17 insertions(+), 10 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.306489323 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:18.605486578 +0100 +@@ -4160,6 +4160,9 @@ + /* Ring channel doorbell */ + writel(1, bp->bar0 + doorbell_offset); + ++ if (!pci_is_enabled(bp->pdev)) ++ return 0; ++ + if (!timeout) + timeout = DFLT_HWRM_CMD_TIMEOUT; + /* convert timeout to usec */ +@@ -4191,8 +4194,9 @@ + } + + if (bp->hwrm_intr_seq_id != (u16)~seq_id) { +- netdev_err(bp->dev, "Resp cmpl intr err msg: 0x%x\n", +- le16_to_cpu(req->req_type)); ++ if (!silent) ++ netdev_err(bp->dev, "Resp cmpl intr err msg: 0x%x\n", ++ le16_to_cpu(req->req_type)); + return -EBUSY; + } + len = (le32_to_cpu(*resp_len) & HWRM_RESP_LEN_MASK) >> +@@ -4217,10 +4221,11 @@ + } + + if (i >= tmo_count) { +- netdev_err(bp->dev, "Error (timeout: %d) msg {0x%x 0x%x} len:%d\n", +- HWRM_TOTAL_TIMEOUT(i), +- le16_to_cpu(req->req_type), +- le16_to_cpu(req->seq_id), len); ++ if (!silent) ++ netdev_err(bp->dev, "Error (timeout: %d) msg {0x%x 0x%x} len:%d\n", ++ HWRM_TOTAL_TIMEOUT(i), ++ le16_to_cpu(req->req_type), ++ le16_to_cpu(req->seq_id), len); + return -EBUSY; + } + +@@ -4235,10 +4240,12 @@ + } + + if (j >= HWRM_VALID_BIT_DELAY_USEC) { +- netdev_err(bp->dev, "Error (timeout: %d) msg {0x%x 0x%x} len:%d v:%d\n", +- HWRM_TOTAL_TIMEOUT(i), +- le16_to_cpu(req->req_type), +- le16_to_cpu(req->seq_id), len, *valid); ++ if (!silent) ++ netdev_err(bp->dev, "Error (timeout: %d) msg {0x%x 0x%x} len:%d v:%d\n", ++ HWRM_TOTAL_TIMEOUT(i), ++ le16_to_cpu(req->req_type), ++ le16_to_cpu(req->seq_id), len, ++ *valid); + return -EBUSY; + } + } diff --git a/SOURCES/0063-netdrv-bnxt_en-Prepare-bnxt_init_one-to-be-called-mu.patch b/SOURCES/0063-netdrv-bnxt_en-Prepare-bnxt_init_one-to-be-called-mu.patch new file mode 100644 index 0000000..019c409 --- /dev/null +++ b/SOURCES/0063-netdrv-bnxt_en-Prepare-bnxt_init_one-to-be-called-mu.patch @@ -0,0 +1,341 @@ +From 3b43bc011b31d52e3923a4eac7951a8b4e528acb Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +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 +RH-Acked-by: Jarod Wilson + +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 +Signed-off-by: David S. Miller +(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 +Signed-off-by: Bruno Meneguele +--- + 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; + diff --git a/SOURCES/0064-netdrv-bnxt_en-Refactor-bnxt_sriov_enable.patch b/SOURCES/0064-netdrv-bnxt_en-Refactor-bnxt_sriov_enable.patch new file mode 100644 index 0000000..8312a1b --- /dev/null +++ b/SOURCES/0064-netdrv-bnxt_en-Refactor-bnxt_sriov_enable.patch @@ -0,0 +1,122 @@ +From 6fb84701e71b1a4b1fae2995c96968316124ed0c Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:19 -0400 +Subject: [PATCH 64/96] [netdrv] bnxt_en: Refactor bnxt_sriov_enable() + +Message-id: <570ee9c11a5e90122d0545caee13801f8538224f.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276484 +O-Subject: [RHEL-8.2 PATCH 57/78] bnxt_en: Refactor bnxt_sriov_enable(). +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Refactor the hardware/firmware configuration portion in +bnxt_sriov_enable() into a new function bnxt_cfg_hw_sriov(). This +new function can be called after a firmware reset to reconfigure the +VFs previously enabled. + +v2: straight refactor of the code. Reordering done in the next patch. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 702d5011ab5e7b9afe44058d33a89d1501645a10) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 50 +++++++++++++++++-------- + drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h | 1 + + 2 files changed, 35 insertions(+), 16 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c 2020-02-06 16:23:18.477487753 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c 2020-02-06 16:23:18.878484072 +0100 +@@ -667,6 +667,32 @@ + return bnxt_hwrm_func_cfg(bp, num_vfs); + } + ++int bnxt_cfg_hw_sriov(struct bnxt *bp, int *num_vfs) ++{ ++ int rc; ++ ++ /* Reserve resources for VFs */ ++ rc = bnxt_func_cfg(bp, *num_vfs); ++ if (rc != *num_vfs) { ++ if (rc <= 0) { ++ netdev_warn(bp->dev, "Unable to reserve resources for SRIOV.\n"); ++ *num_vfs = 0; ++ return rc; ++ } ++ netdev_warn(bp->dev, "Only able to reserve resources for %d VFs.\n", ++ rc); ++ *num_vfs = rc; ++ } ++ ++ /* Register buffers for VFs */ ++ rc = bnxt_hwrm_func_buf_rgtr(bp); ++ if (rc) ++ return rc; ++ ++ bnxt_ulp_sriov_cfg(bp, *num_vfs); ++ return 0; ++} ++ + static int bnxt_sriov_enable(struct bnxt *bp, int *num_vfs) + { + int rc = 0, vfs_supported; +@@ -732,25 +758,10 @@ + if (rc) + goto err_out1; + +- /* Reserve resources for VFs */ +- rc = bnxt_func_cfg(bp, *num_vfs); +- if (rc != *num_vfs) { +- if (rc <= 0) { +- netdev_warn(bp->dev, "Unable to reserve resources for SRIOV.\n"); +- *num_vfs = 0; +- goto err_out2; +- } +- netdev_warn(bp->dev, "Only able to reserve resources for %d VFs.\n", rc); +- *num_vfs = rc; +- } +- +- /* Register buffers for VFs */ +- rc = bnxt_hwrm_func_buf_rgtr(bp); ++ rc = bnxt_cfg_hw_sriov(bp, num_vfs); + if (rc) + goto err_out2; + +- bnxt_ulp_sriov_cfg(bp, *num_vfs); +- + rc = pci_enable_sriov(bp->pdev, *num_vfs); + if (rc) + goto err_out2; +@@ -1128,6 +1139,13 @@ + } + #else + ++int bnxt_cfg_hw_sriov(struct bnxt *bp, int *num_vfs) ++{ ++ if (*num_vfs) ++ return -EOPNOTSUPP; ++ return 0; ++} ++ + void bnxt_sriov_disable(struct bnxt *bp) + { + } +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h 2020-02-06 16:22:54.551707373 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h 2020-02-06 16:23:18.878484072 +0100 +@@ -36,6 +36,7 @@ + int bnxt_set_vf_spoofchk(struct net_device *, int, bool); + int bnxt_set_vf_trust(struct net_device *dev, int vf_id, bool trust); + int bnxt_sriov_configure(struct pci_dev *pdev, int num_vfs); ++int bnxt_cfg_hw_sriov(struct bnxt *bp, int *num_vfs); + void bnxt_sriov_disable(struct bnxt *); + void bnxt_hwrm_exec_fwd_req(struct bnxt *); + void bnxt_update_vf_mac(struct bnxt *); diff --git a/SOURCES/0065-netdrv-bnxt_en-Register-buffers-for-VFs-before-reser.patch b/SOURCES/0065-netdrv-bnxt_en-Register-buffers-for-VFs-before-reser.patch new file mode 100644 index 0000000..1cbbb99 --- /dev/null +++ b/SOURCES/0065-netdrv-bnxt_en-Register-buffers-for-VFs-before-reser.patch @@ -0,0 +1,62 @@ +From 65fc42a0bb19a85798469eeb2c61b754029414ef Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:20 -0400 +Subject: [PATCH 65/96] [netdrv] bnxt_en: Register buffers for VFs before + reserving resources + +Message-id: <3494363ea29ad1d7fa4ad16dbe767e2c30222282.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276480 +O-Subject: [RHEL-8.2 PATCH 58/78] bnxt_en: Register buffers for VFs before reserving resources. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +When VFs need to be reconfigured dynamically after firmwware reset, the +configuration sequence on the PF needs to be changed to register the VF +buffers first. Otherwise, some VF firmware commands may not succeed as +there may not be PF buffers ready for the re-directed firmware commands. + +This sequencing did not matter much before when we only supported +the normal bring-up of VFs. + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 91b9be487001d344a39c453ade6cdbd125e06208) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c 2020-02-06 16:23:18.878484072 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c 2020-02-06 16:23:19.013482833 +0100 +@@ -671,6 +671,11 @@ + { + int rc; + ++ /* Register buffers for VFs */ ++ rc = bnxt_hwrm_func_buf_rgtr(bp); ++ if (rc) ++ return rc; ++ + /* Reserve resources for VFs */ + rc = bnxt_func_cfg(bp, *num_vfs); + if (rc != *num_vfs) { +@@ -684,11 +689,6 @@ + *num_vfs = rc; + } + +- /* Register buffers for VFs */ +- rc = bnxt_hwrm_func_buf_rgtr(bp); +- if (rc) +- return rc; +- + bnxt_ulp_sriov_cfg(bp, *num_vfs); + return 0; + } diff --git a/SOURCES/0066-netdrv-bnxt_en-Handle-firmware-reset-status-during-I.patch b/SOURCES/0066-netdrv-bnxt_en-Handle-firmware-reset-status-during-I.patch new file mode 100644 index 0000000..97e4ded --- /dev/null +++ b/SOURCES/0066-netdrv-bnxt_en-Handle-firmware-reset-status-during-I.patch @@ -0,0 +1,195 @@ +From 2e673311338d1e2e27a2fe9aabe8fbfcb81c3718 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:21 -0400 +Subject: [PATCH 66/96] [netdrv] bnxt_en: Handle firmware reset status during + IF_UP + +Message-id: <46b898742e8a2f4726a84ce5492cd5e31b5fcfae.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276486 +O-Subject: [RHEL-8.2 PATCH 59/78] bnxt_en: Handle firmware reset status during IF_UP. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +During IF_UP, newer firmware has a new status flag that indicates that +firmware has reset. Add new function bnxt_fw_init_one() to re-probe the +firmware and re-setup VF resources on the PF if necessary. If the +re-probe fails, set a flag to prevent bnxt_open() from proceeding again. + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit ec5d31e3c15d5233b491400133c67f78a320062c) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 107 ++++++++++++++++++++++++------ + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 + + 2 files changed, 89 insertions(+), 20 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.730485431 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:19.143481640 +0100 +@@ -8528,11 +8528,14 @@ + return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + } + ++static int bnxt_fw_init_one(struct bnxt *bp); ++ + static int bnxt_hwrm_if_change(struct bnxt *bp, bool up) + { + struct hwrm_func_drv_if_change_output *resp = bp->hwrm_cmd_resp_addr; + struct hwrm_func_drv_if_change_input req = {0}; +- bool resc_reinit = false; ++ bool resc_reinit = false, fw_reset = false; ++ u32 flags = 0; + int rc; + + if (!(bp->fw_cap & BNXT_FW_CAP_IF_CHANGE)) +@@ -8543,26 +8546,53 @@ + req.flags = cpu_to_le32(FUNC_DRV_IF_CHANGE_REQ_FLAGS_UP); + mutex_lock(&bp->hwrm_cmd_lock); + rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +- if (!rc && (resp->flags & +- cpu_to_le32(FUNC_DRV_IF_CHANGE_RESP_FLAGS_RESC_CHANGE))) +- resc_reinit = true; ++ if (!rc) ++ flags = le32_to_cpu(resp->flags); + mutex_unlock(&bp->hwrm_cmd_lock); ++ if (rc) ++ return rc; + +- if (up && resc_reinit && BNXT_NEW_RM(bp)) { +- struct bnxt_hw_resc *hw_resc = &bp->hw_resc; ++ if (!up) ++ return 0; ++ ++ if (flags & FUNC_DRV_IF_CHANGE_RESP_FLAGS_RESC_CHANGE) ++ resc_reinit = true; ++ if (flags & FUNC_DRV_IF_CHANGE_RESP_FLAGS_HOT_FW_RESET_DONE) ++ fw_reset = true; + +- rc = bnxt_hwrm_func_resc_qcaps(bp, true); +- hw_resc->resv_cp_rings = 0; +- hw_resc->resv_stat_ctxs = 0; +- hw_resc->resv_irqs = 0; +- hw_resc->resv_tx_rings = 0; +- hw_resc->resv_rx_rings = 0; +- hw_resc->resv_hw_ring_grps = 0; +- hw_resc->resv_vnics = 0; +- bp->tx_nr_rings = 0; +- bp->rx_nr_rings = 0; ++ if (resc_reinit || fw_reset) { ++ if (fw_reset) { ++ rc = bnxt_fw_init_one(bp); ++ if (rc) { ++ set_bit(BNXT_STATE_ABORT_ERR, &bp->state); ++ return rc; ++ } ++ bnxt_clear_int_mode(bp); ++ rc = bnxt_init_int_mode(bp); ++ if (rc) { ++ netdev_err(bp->dev, "init int mode failed\n"); ++ return rc; ++ } ++ set_bit(BNXT_STATE_FW_RESET_DET, &bp->state); ++ } ++ if (BNXT_NEW_RM(bp)) { ++ struct bnxt_hw_resc *hw_resc = &bp->hw_resc; ++ ++ rc = bnxt_hwrm_func_resc_qcaps(bp, true); ++ hw_resc->resv_cp_rings = 0; ++ hw_resc->resv_stat_ctxs = 0; ++ hw_resc->resv_irqs = 0; ++ hw_resc->resv_tx_rings = 0; ++ hw_resc->resv_rx_rings = 0; ++ hw_resc->resv_hw_ring_grps = 0; ++ hw_resc->resv_vnics = 0; ++ if (!fw_reset) { ++ bp->tx_nr_rings = 0; ++ bp->rx_nr_rings = 0; ++ } ++ } + } +- return rc; ++ return 0; + } + + static int bnxt_hwrm_port_led_qcaps(struct bnxt *bp) +@@ -8982,12 +9012,28 @@ + struct bnxt *bp = netdev_priv(dev); + int rc; + +- bnxt_hwrm_if_change(bp, true); +- rc = __bnxt_open_nic(bp, true, true); ++ if (test_bit(BNXT_STATE_ABORT_ERR, &bp->state)) { ++ netdev_err(bp->dev, "A previous firmware reset did not complete, aborting\n"); ++ return -ENODEV; ++ } ++ ++ rc = bnxt_hwrm_if_change(bp, true); + if (rc) ++ return rc; ++ rc = __bnxt_open_nic(bp, true, true); ++ if (rc) { + bnxt_hwrm_if_change(bp, false); ++ } else { ++ if (test_and_clear_bit(BNXT_STATE_FW_RESET_DET, &bp->state) && ++ BNXT_PF(bp)) { ++ struct bnxt_pf_info *pf = &bp->pf; ++ int n = pf->active_vfs; + +- bnxt_hwmon_open(bp); ++ if (n) ++ bnxt_cfg_hw_sriov(bp, &n); ++ } ++ bnxt_hwmon_open(bp); ++ } + + return rc; + } +@@ -10080,6 +10126,27 @@ + bnxt_hwrm_coal_params_qcaps(bp); + } + ++static int bnxt_fw_init_one(struct bnxt *bp) ++{ ++ int rc; ++ ++ rc = bnxt_fw_init_one_p1(bp); ++ if (rc) { ++ netdev_err(bp->dev, "Firmware init phase 1 failed\n"); ++ return rc; ++ } ++ rc = bnxt_fw_init_one_p2(bp); ++ if (rc) { ++ netdev_err(bp->dev, "Firmware init phase 2 failed\n"); ++ return rc; ++ } ++ rc = bnxt_approve_mac(bp, bp->dev->dev_addr, false); ++ if (rc) ++ return rc; ++ bnxt_fw_init_one_p3(bp); ++ return 0; ++} ++ + static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev) + { + int rc; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:17.788494078 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:19.143481640 +0100 +@@ -1555,6 +1555,8 @@ + #define BNXT_STATE_OPEN 0 + #define BNXT_STATE_IN_SP_TASK 1 + #define BNXT_STATE_READ_STATS 2 ++#define BNXT_STATE_FW_RESET_DET 3 ++#define BNXT_STATE_ABORT_ERR 5 + + struct bnxt_irq *irq_tbl; + int total_irqs; diff --git a/SOURCES/0067-netdrv-bnxt_en-Discover-firmware-error-recovery-capa.patch b/SOURCES/0067-netdrv-bnxt_en-Discover-firmware-error-recovery-capa.patch new file mode 100644 index 0000000..1fbc79b --- /dev/null +++ b/SOURCES/0067-netdrv-bnxt_en-Discover-firmware-error-recovery-capa.patch @@ -0,0 +1,203 @@ +From 4eb487db76c9385d110d31f0b4b9e5c4f2393f5d Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:22 -0400 +Subject: [PATCH 67/96] [netdrv] bnxt_en: Discover firmware error recovery + capabilities + +Message-id: +Patchwork-id: 276487 +O-Subject: [RHEL-8.2 PATCH 60/78] bnxt_en: Discover firmware error recovery capabilities. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Call the new firmware API HWRM_ERROR_RECOVERY_QCFG if it is supported +to discover the firmware health and recovery capabilities and settings. +This feature allows the driver to reset the chip if firmware crashes and +becomes unresponsive. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 07f83d72d238f5d41b03d6142641129e8a7a0ec4) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 77 +++++++++++++++++++++++++++++++ + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 38 +++++++++++++++ + 2 files changed, 115 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:19.143481640 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:19.289480300 +0100 +@@ -6852,6 +6852,8 @@ + bp->fw_cap |= BNXT_FW_CAP_PCIE_STATS_SUPPORTED; + if (flags & FUNC_QCAPS_RESP_FLAGS_EXT_STATS_SUPPORTED) + bp->fw_cap |= BNXT_FW_CAP_EXT_STATS_SUPPORTED; ++ if (flags & FUNC_QCAPS_RESP_FLAGS_ERROR_RECOVERY_CAPABLE) ++ bp->fw_cap |= BNXT_FW_CAP_ERROR_RECOVERY; + + bp->tx_push_thresh = 0; + if (flags & FUNC_QCAPS_RESP_FLAGS_PUSH_MODE_SUPPORTED) +@@ -6953,6 +6955,74 @@ + return rc; + } + ++static int bnxt_hwrm_error_recovery_qcfg(struct bnxt *bp) ++{ ++ struct hwrm_error_recovery_qcfg_output *resp = bp->hwrm_cmd_resp_addr; ++ struct bnxt_fw_health *fw_health = bp->fw_health; ++ struct hwrm_error_recovery_qcfg_input req = {0}; ++ int rc, i; ++ ++ if (!(bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY)) ++ return 0; ++ ++ bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_ERROR_RECOVERY_QCFG, -1, -1); ++ mutex_lock(&bp->hwrm_cmd_lock); ++ rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ if (rc) ++ goto err_recovery_out; ++ if (!fw_health) { ++ fw_health = kzalloc(sizeof(*fw_health), GFP_KERNEL); ++ bp->fw_health = fw_health; ++ if (!fw_health) { ++ rc = -ENOMEM; ++ goto err_recovery_out; ++ } ++ } ++ fw_health->flags = le32_to_cpu(resp->flags); ++ if ((fw_health->flags & ERROR_RECOVERY_QCFG_RESP_FLAGS_CO_CPU) && ++ !(bp->fw_cap & BNXT_FW_CAP_KONG_MB_CHNL)) { ++ rc = -EINVAL; ++ goto err_recovery_out; ++ } ++ fw_health->polling_dsecs = le32_to_cpu(resp->driver_polling_freq); ++ fw_health->master_func_wait_dsecs = ++ le32_to_cpu(resp->master_func_wait_period); ++ fw_health->normal_func_wait_dsecs = ++ le32_to_cpu(resp->normal_func_wait_period); ++ fw_health->post_reset_wait_dsecs = ++ le32_to_cpu(resp->master_func_wait_period_after_reset); ++ fw_health->post_reset_max_wait_dsecs = ++ le32_to_cpu(resp->max_bailout_time_after_reset); ++ fw_health->regs[BNXT_FW_HEALTH_REG] = ++ le32_to_cpu(resp->fw_health_status_reg); ++ fw_health->regs[BNXT_FW_HEARTBEAT_REG] = ++ le32_to_cpu(resp->fw_heartbeat_reg); ++ fw_health->regs[BNXT_FW_RESET_CNT_REG] = ++ le32_to_cpu(resp->fw_reset_cnt_reg); ++ fw_health->regs[BNXT_FW_RESET_INPROG_REG] = ++ le32_to_cpu(resp->reset_inprogress_reg); ++ fw_health->fw_reset_inprog_reg_mask = ++ le32_to_cpu(resp->reset_inprogress_reg_mask); ++ fw_health->fw_reset_seq_cnt = resp->reg_array_cnt; ++ if (fw_health->fw_reset_seq_cnt >= 16) { ++ rc = -EINVAL; ++ goto err_recovery_out; ++ } ++ for (i = 0; i < fw_health->fw_reset_seq_cnt; i++) { ++ fw_health->fw_reset_seq_regs[i] = ++ le32_to_cpu(resp->reset_reg[i]); ++ fw_health->fw_reset_seq_vals[i] = ++ le32_to_cpu(resp->reset_reg_val[i]); ++ fw_health->fw_reset_seq_delay_msec[i] = ++ resp->delay_after_reset[i]; ++ } ++err_recovery_out: ++ mutex_unlock(&bp->hwrm_cmd_lock); ++ if (rc) ++ bp->fw_cap &= ~BNXT_FW_CAP_ERROR_RECOVERY; ++ return rc; ++} ++ + static int bnxt_hwrm_func_reset(struct bnxt *bp) + { + struct hwrm_func_reset_input req = {0}; +@@ -10063,6 +10133,11 @@ + netdev_warn(bp->dev, "hwrm query adv flow mgnt failure rc: %d\n", + rc); + ++ rc = bnxt_hwrm_error_recovery_qcfg(bp); ++ if (rc) ++ netdev_warn(bp->dev, "hwrm query error recovery failure rc: %d\n", ++ rc); ++ + rc = bnxt_hwrm_func_drv_rgtr(bp); + if (rc) + return -ENODEV; +@@ -11267,6 +11342,8 @@ + bnxt_free_ctx_mem(bp); + kfree(bp->ctx); + bp->ctx = NULL; ++ kfree(bp->fw_health); ++ bp->fw_health = NULL; + bnxt_cleanup_pci(bp); + + init_err_free: +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:19.143481640 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:19.289480300 +0100 +@@ -1333,6 +1333,41 @@ + struct bnxt_ctx_pg_info *tqm_mem[9]; + }; + ++struct bnxt_fw_health { ++ u32 flags; ++ u32 polling_dsecs; ++ u32 master_func_wait_dsecs; ++ u32 normal_func_wait_dsecs; ++ u32 post_reset_wait_dsecs; ++ u32 post_reset_max_wait_dsecs; ++ u32 regs[4]; ++ u32 mapped_regs[4]; ++#define BNXT_FW_HEALTH_REG 0 ++#define BNXT_FW_HEARTBEAT_REG 1 ++#define BNXT_FW_RESET_CNT_REG 2 ++#define BNXT_FW_RESET_INPROG_REG 3 ++ u32 fw_reset_inprog_reg_mask; ++ u32 last_fw_heartbeat; ++ u32 last_fw_reset_cnt; ++ u8 enabled:1; ++ u8 master:1; ++ u8 tmr_multiplier; ++ u8 tmr_counter; ++ u8 fw_reset_seq_cnt; ++ u32 fw_reset_seq_regs[16]; ++ u32 fw_reset_seq_vals[16]; ++ u32 fw_reset_seq_delay_msec[16]; ++}; ++ ++#define BNXT_FW_HEALTH_REG_TYPE_MASK 3 ++#define BNXT_FW_HEALTH_REG_TYPE_CFG 0 ++#define BNXT_FW_HEALTH_REG_TYPE_GRC 1 ++#define BNXT_FW_HEALTH_REG_TYPE_BAR0 2 ++#define BNXT_FW_HEALTH_REG_TYPE_BAR1 3 ++ ++#define BNXT_FW_HEALTH_REG_TYPE(reg) ((reg) & BNXT_FW_HEALTH_REG_TYPE_MASK) ++#define BNXT_FW_HEALTH_REG_OFF(reg) ((reg) & ~BNXT_FW_HEALTH_REG_TYPE_MASK) ++ + struct bnxt { + void __iomem *bar0; + void __iomem *bar1; +@@ -1581,6 +1616,7 @@ + #define BNXT_FW_CAP_KONG_MB_CHNL 0x00000080 + #define BNXT_FW_CAP_OVS_64BIT_HANDLE 0x00000400 + #define BNXT_FW_CAP_TRUSTED_VF 0x00000800 ++ #define BNXT_FW_CAP_ERROR_RECOVERY 0x00002000 + #define BNXT_FW_CAP_PKG_VER 0x00004000 + #define BNXT_FW_CAP_CFA_ADV_FLOW 0x00008000 + #define BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX 0x00010000 +@@ -1666,6 +1702,8 @@ + #define BNXT_UPDATE_PHY_SP_EVENT 16 + #define BNXT_RING_COAL_NOW_SP_EVENT 17 + ++ struct bnxt_fw_health *fw_health; ++ + struct bnxt_hw_resc hw_resc; + struct bnxt_pf_info pf; + struct bnxt_ctx_mem_info *ctx; diff --git a/SOURCES/0068-netdrv-bnxt_en-Pre-map-the-firmware-health-monitorin.patch b/SOURCES/0068-netdrv-bnxt_en-Pre-map-the-firmware-health-monitorin.patch new file mode 100644 index 0000000..8a73267 --- /dev/null +++ b/SOURCES/0068-netdrv-bnxt_en-Pre-map-the-firmware-health-monitorin.patch @@ -0,0 +1,100 @@ +From 48b35e7c5e2e2b19be38219c97a652453b982bc7 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:23 -0400 +Subject: [PATCH 68/96] [netdrv] bnxt_en: Pre-map the firmware health + monitoring registers + +Message-id: <91d24ffc1068f9308c91815baf3e8aa149d16a36.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276483 +O-Subject: [RHEL-8.2 PATCH 61/78] bnxt_en: Pre-map the firmware health monitoring registers. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Pre-map the GRC registers for periodic firmware health monitoring. + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 9ffbd67734909ca8bb099e62f06387649b43d5a8) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 29 +++++++++++++++++++++++++++++ + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 6 ++++++ + 2 files changed, 35 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:19.289480300 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:19.432478987 +0100 +@@ -6955,6 +6955,33 @@ + return rc; + } + ++static int bnxt_map_fw_health_regs(struct bnxt *bp) ++{ ++ struct bnxt_fw_health *fw_health = bp->fw_health; ++ u32 reg_base = 0xffffffff; ++ int i; ++ ++ /* Only pre-map the monitoring GRC registers using window 3 */ ++ for (i = 0; i < 4; i++) { ++ u32 reg = fw_health->regs[i]; ++ ++ if (BNXT_FW_HEALTH_REG_TYPE(reg) != BNXT_FW_HEALTH_REG_TYPE_GRC) ++ continue; ++ if (reg_base == 0xffffffff) ++ reg_base = reg & BNXT_GRC_BASE_MASK; ++ if ((reg & BNXT_GRC_BASE_MASK) != reg_base) ++ return -ERANGE; ++ fw_health->mapped_regs[i] = BNXT_FW_HEALTH_WIN_BASE + ++ (reg & BNXT_GRC_OFFSET_MASK); ++ } ++ if (reg_base == 0xffffffff) ++ return 0; ++ ++ writel(reg_base, bp->bar0 + BNXT_GRCPF_REG_WINDOW_BASE_OUT + ++ BNXT_FW_HEALTH_WIN_MAP_OFF); ++ return 0; ++} ++ + static int bnxt_hwrm_error_recovery_qcfg(struct bnxt *bp) + { + struct hwrm_error_recovery_qcfg_output *resp = bp->hwrm_cmd_resp_addr; +@@ -7018,6 +7045,8 @@ + } + err_recovery_out: + mutex_unlock(&bp->hwrm_cmd_lock); ++ if (!rc) ++ rc = bnxt_map_fw_health_regs(bp); + if (rc) + bp->fw_cap &= ~BNXT_FW_CAP_ERROR_RECOVERY; + return rc; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:19.289480300 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:19.432478987 +0100 +@@ -1217,6 +1217,9 @@ + #define BNXT_GRCPF_REG_KONG_COMM 0xA00 + #define BNXT_GRCPF_REG_KONG_COMM_TRIGGER 0xB00 + ++#define BNXT_GRC_BASE_MASK 0xfffff000 ++#define BNXT_GRC_OFFSET_MASK 0x00000ffc ++ + struct bnxt_tc_flow_stats { + u64 packets; + u64 bytes; +@@ -1368,6 +1371,9 @@ + #define BNXT_FW_HEALTH_REG_TYPE(reg) ((reg) & BNXT_FW_HEALTH_REG_TYPE_MASK) + #define BNXT_FW_HEALTH_REG_OFF(reg) ((reg) & ~BNXT_FW_HEALTH_REG_TYPE_MASK) + ++#define BNXT_FW_HEALTH_WIN_BASE 0x3000 ++#define BNXT_FW_HEALTH_WIN_MAP_OFF 8 ++ + struct bnxt { + void __iomem *bar0; + void __iomem *bar1; diff --git a/SOURCES/0069-netdrv-bnxt_en-Enable-health-monitoring.patch b/SOURCES/0069-netdrv-bnxt_en-Enable-health-monitoring.patch new file mode 100644 index 0000000..47fcede --- /dev/null +++ b/SOURCES/0069-netdrv-bnxt_en-Enable-health-monitoring.patch @@ -0,0 +1,154 @@ +From 1d427d9e7f961722a309c6a82f62a9178e5a2c3f Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:24 -0400 +Subject: [PATCH 69/96] [netdrv] bnxt_en: Enable health monitoring + +Message-id: <42efde25f8365e758d5336dd899277a3bbab23aa.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276498 +O-Subject: [RHEL-8.2 PATCH 62/78] bnxt_en: Enable health monitoring. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Handle the async event from the firmware that enables firmware health +monitoring. Store initial health metrics. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 7e914027f757b656cd681ba4fe75f3984531ee50) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 66 ++++++++++++++++++++++++++++++- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 9 +++++ + 2 files changed, 73 insertions(+), 2 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:19.432478987 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:19.590477537 +0100 +@@ -254,6 +254,7 @@ + ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED, + ASYNC_EVENT_CMPL_EVENT_ID_VF_CFG_CHANGE, + ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE, ++ ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY, + }; + + static struct workqueue_struct *bnxt_pf_wq; +@@ -1898,6 +1899,33 @@ + return bnxt_rx_pkt(bp, cpr, raw_cons, event); + } + ++u32 bnxt_fw_health_readl(struct bnxt *bp, int reg_idx) ++{ ++ struct bnxt_fw_health *fw_health = bp->fw_health; ++ u32 reg = fw_health->regs[reg_idx]; ++ u32 reg_type, reg_off, val = 0; ++ ++ reg_type = BNXT_FW_HEALTH_REG_TYPE(reg); ++ reg_off = BNXT_FW_HEALTH_REG_OFF(reg); ++ switch (reg_type) { ++ case BNXT_FW_HEALTH_REG_TYPE_CFG: ++ pci_read_config_dword(bp->pdev, reg_off, &val); ++ break; ++ case BNXT_FW_HEALTH_REG_TYPE_GRC: ++ reg_off = fw_health->mapped_regs[reg_idx]; ++ /* fall through */ ++ case BNXT_FW_HEALTH_REG_TYPE_BAR0: ++ val = readl(bp->bar0 + reg_off); ++ break; ++ case BNXT_FW_HEALTH_REG_TYPE_BAR1: ++ val = readl(bp->bar1 + reg_off); ++ break; ++ } ++ if (reg_idx == BNXT_FW_RESET_INPROG_REG) ++ val &= fw_health->fw_reset_inprog_reg_mask; ++ return val; ++} ++ + #define BNXT_GET_EVENT_PORT(data) \ + ((data) & \ + ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_PORT_ID_MASK) +@@ -1953,6 +1981,35 @@ + goto async_event_process_exit; + set_bit(BNXT_RESET_TASK_SILENT_SP_EVENT, &bp->sp_event); + break; ++ case ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY: { ++ struct bnxt_fw_health *fw_health = bp->fw_health; ++ u32 data1 = le32_to_cpu(cmpl->event_data1); ++ ++ if (!fw_health) ++ goto async_event_process_exit; ++ ++ fw_health->enabled = EVENT_DATA1_RECOVERY_ENABLED(data1); ++ fw_health->master = EVENT_DATA1_RECOVERY_MASTER_FUNC(data1); ++ if (!fw_health->enabled) ++ break; ++ ++ if (netif_msg_drv(bp)) ++ netdev_info(bp->dev, "Error recovery info: error recovery[%d], master[%d], reset count[0x%x], health status: 0x%x\n", ++ fw_health->enabled, fw_health->master, ++ bnxt_fw_health_readl(bp, ++ BNXT_FW_RESET_CNT_REG), ++ bnxt_fw_health_readl(bp, ++ BNXT_FW_HEALTH_REG)); ++ fw_health->tmr_multiplier = ++ DIV_ROUND_UP(fw_health->polling_dsecs * HZ, ++ bp->current_interval * 10); ++ fw_health->tmr_counter = fw_health->tmr_multiplier; ++ fw_health->last_fw_heartbeat = ++ bnxt_fw_health_readl(bp, BNXT_FW_HEARTBEAT_REG); ++ fw_health->last_fw_reset_cnt = ++ bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG); ++ goto async_event_process_exit; ++ } + default: + goto async_event_process_exit; + } +@@ -4315,9 +4372,14 @@ + cpu_to_le32(FUNC_DRV_RGTR_REQ_ENABLES_ASYNC_EVENT_FWD); + + memset(async_events_bmap, 0, sizeof(async_events_bmap)); +- for (i = 0; i < ARRAY_SIZE(bnxt_async_events_arr); i++) +- __set_bit(bnxt_async_events_arr[i], async_events_bmap); ++ for (i = 0; i < ARRAY_SIZE(bnxt_async_events_arr); i++) { ++ u16 event_id = bnxt_async_events_arr[i]; + ++ if (event_id == ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY && ++ !(bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY)) ++ continue; ++ __set_bit(bnxt_async_events_arr[i], async_events_bmap); ++ } + if (bmap && bmap_size) { + for (i = 0; i < bmap_size; i++) { + if (test_bit(i, bmap)) +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:19.432478987 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:19.591477528 +0100 +@@ -472,6 +472,14 @@ + ((le32_to_cpu((rx_tpa_end_ext)->rx_tpa_end_cmp_dup_acks) & \ + RX_TPA_END_CMP_AGG_BUFS_P5) >> RX_TPA_END_CMP_AGG_BUFS_SHIFT_P5) + ++#define EVENT_DATA1_RECOVERY_MASTER_FUNC(data1) \ ++ !!((data1) & \ ++ ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_MASTER_FUNC) ++ ++#define EVENT_DATA1_RECOVERY_ENABLED(data1) \ ++ !!((data1) & \ ++ ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_RECOVERY_ENABLED) ++ + struct nqe_cn { + __le16 type; + #define NQ_CN_TYPE_MASK 0x3fUL +@@ -1914,6 +1922,7 @@ + int bnxt_alloc_rx_data(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, + u16 prod, gfp_t gfp); + void bnxt_reuse_rx_data(struct bnxt_rx_ring_info *rxr, u16 cons, void *data); ++u32 bnxt_fw_health_readl(struct bnxt *bp, int reg_idx); + void bnxt_set_tpa_flags(struct bnxt *bp); + void bnxt_set_ring_params(struct bnxt *); + int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode); diff --git a/SOURCES/0070-netdrv-bnxt_en-Add-BNXT_STATE_IN_FW_RESET-state.patch b/SOURCES/0070-netdrv-bnxt_en-Add-BNXT_STATE_IN_FW_RESET-state.patch new file mode 100644 index 0000000..76f1d01 --- /dev/null +++ b/SOURCES/0070-netdrv-bnxt_en-Add-BNXT_STATE_IN_FW_RESET-state.patch @@ -0,0 +1,107 @@ +From b5a3e2be5f5d41b6d999ad9346f1247e2b7ad247 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:25 -0400 +Subject: [PATCH 70/96] [netdrv] bnxt_en: Add BNXT_STATE_IN_FW_RESET state + +Message-id: <7698266f568917253716b6f64ad8c2c5ae29a62a.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276488 +O-Subject: [RHEL-8.2 PATCH 63/78] bnxt_en: Add BNXT_STATE_IN_FW_RESET state. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +The new flag will be set in subsequent patches when firmware is +going through reset. If bnxt_close() is called while the new flag +is set, the FW reset sequence will have to be aborted because the +NIC is prematurely closed before FW reset has completed. We also +reject SRIOV configurations while FW reset is in progress. + +v2: No longer drop rtnl_lock() in close and wait for FW reset to complete. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 3bc7d4a352efe5b596883ef16b769055320db1f6) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 20 ++++++++++++++++++++ + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + + drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 5 +++++ + 3 files changed, 26 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:19.590477537 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:19.749476077 +0100 +@@ -8721,6 +8721,10 @@ + if (flags & FUNC_DRV_IF_CHANGE_RESP_FLAGS_HOT_FW_RESET_DONE) + fw_reset = true; + ++ if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state) && !fw_reset) { ++ netdev_err(bp->dev, "RESET_DONE not set during FW reset.\n"); ++ return -ENODEV; ++ } + if (resc_reinit || fw_reset) { + if (fw_reset) { + rc = bnxt_fw_init_one(bp); +@@ -9231,6 +9235,10 @@ + bnxt_debug_dev_exit(bp); + bnxt_disable_napi(bp); + del_timer_sync(&bp->timer); ++ if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state) && ++ pci_is_enabled(bp->pdev)) ++ pci_disable_device(bp->pdev); ++ + bnxt_free_skbs(bp); + + /* Save ring stats before shutdown */ +@@ -9247,6 +9255,18 @@ + { + int rc = 0; + ++ if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) { ++ /* If we get here, it means firmware reset is in progress ++ * while we are trying to close. We can safely proceed with ++ * the close because we are holding rtnl_lock(). Some firmware ++ * messages may fail as we proceed to close. We set the ++ * ABORT_ERR flag here so that the FW reset thread will later ++ * abort when it gets the rtnl_lock() and sees the flag. ++ */ ++ netdev_warn(bp->dev, "FW reset in progress during close, FW reset will be aborted\n"); ++ set_bit(BNXT_STATE_ABORT_ERR, &bp->state); ++ } ++ + #ifdef CONFIG_BNXT_SRIOV + if (bp->sriov_cfg) { + rc = wait_event_interruptible_timeout(bp->sriov_cfg_wait, +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:19.591477528 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:19.750476068 +0100 +@@ -1605,6 +1605,7 @@ + #define BNXT_STATE_IN_SP_TASK 1 + #define BNXT_STATE_READ_STATS 2 + #define BNXT_STATE_FW_RESET_DET 3 ++#define BNXT_STATE_IN_FW_RESET 4 + #define BNXT_STATE_ABORT_ERR 5 + + struct bnxt_irq *irq_tbl; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c 2020-02-06 16:23:19.013482833 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c 2020-02-06 16:23:19.750476068 +0100 +@@ -828,6 +828,11 @@ + rtnl_unlock(); + return 0; + } ++ if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) { ++ netdev_warn(dev, "Reject SRIOV config request when FW reset is in progress\n"); ++ rtnl_unlock(); ++ return 0; ++ } + bp->sriov_cfg = true; + rtnl_unlock(); + diff --git a/SOURCES/0071-netdrv-bnxt_en-Add-new-FW-devlink_health_reporter.patch b/SOURCES/0071-netdrv-bnxt_en-Add-new-FW-devlink_health_reporter.patch new file mode 100644 index 0000000..96bfcf8 --- /dev/null +++ b/SOURCES/0071-netdrv-bnxt_en-Add-new-FW-devlink_health_reporter.patch @@ -0,0 +1,166 @@ +From a5722300aaf495489ab5ce115f8955915a4dcb70 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:26 -0400 +Subject: [PATCH 71/96] [netdrv] bnxt_en: Add new FW devlink_health_reporter + +Message-id: <54406dbbfa698feebe5b59a0c650fe80f3bd751c.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276493 +O-Subject: [RHEL-8.2 PATCH 64/78] bnxt_en: Add new FW devlink_health_reporter +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Create new FW devlink_health_reporter, to know the current health +status of FW. + +Command example and output: +$ devlink health show pci/0000:af:00.0 reporter fw + +pci/0000:af:00.0: + name fw + state healthy error 0 recover 0 + + FW status: Healthy; Reset count: 1 + +Cc: Jiri Pirko +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 6763c779c2d8b568b2e174f3eeeaf644fa38b34d) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 + + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 81 +++++++++++++++++++++++ + 2 files changed, 84 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:19.750476068 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:19.896474728 +0100 +@@ -1368,6 +1368,7 @@ + u32 fw_reset_seq_regs[16]; + u32 fw_reset_seq_vals[16]; + u32 fw_reset_seq_delay_msec[16]; ++ struct devlink_health_reporter *fw_reporter; + }; + + #define BNXT_FW_HEALTH_REG_TYPE_MASK 3 +@@ -1382,6 +1383,8 @@ + #define BNXT_FW_HEALTH_WIN_BASE 0x3000 + #define BNXT_FW_HEALTH_WIN_MAP_OFF 8 + ++#define BNXT_FW_STATUS_HEALTHY 0x8000 ++ + struct bnxt { + void __iomem *bar0; + void __iomem *bar1; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:18.306489323 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:19.896474728 +0100 +@@ -15,6 +15,84 @@ + #include "bnxt_vfr.h" + #include "bnxt_devlink.h" + ++static int bnxt_fw_reporter_diagnose(struct devlink_health_reporter *reporter, ++ struct devlink_fmsg *fmsg) ++{ ++ struct bnxt *bp = devlink_health_reporter_priv(reporter); ++ struct bnxt_fw_health *health = bp->fw_health; ++ u32 val, health_status; ++ int rc; ++ ++ if (!health || test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) ++ return 0; ++ ++ val = bnxt_fw_health_readl(bp, BNXT_FW_HEALTH_REG); ++ health_status = val & 0xffff; ++ ++ if (health_status == BNXT_FW_STATUS_HEALTHY) { ++ rc = devlink_fmsg_string_pair_put(fmsg, "FW status", ++ "Healthy;"); ++ if (rc) ++ return rc; ++ } else if (health_status < BNXT_FW_STATUS_HEALTHY) { ++ rc = devlink_fmsg_string_pair_put(fmsg, "FW status", ++ "Not yet completed initialization;"); ++ if (rc) ++ return rc; ++ } else if (health_status > BNXT_FW_STATUS_HEALTHY) { ++ rc = devlink_fmsg_string_pair_put(fmsg, "FW status", ++ "Encountered fatal error and cannot recover;"); ++ if (rc) ++ return rc; ++ } ++ ++ if (val >> 16) { ++ rc = devlink_fmsg_u32_pair_put(fmsg, "Error", val >> 16); ++ if (rc) ++ return rc; ++ } ++ ++ val = bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG); ++ rc = devlink_fmsg_u32_pair_put(fmsg, "Reset count", val); ++ if (rc) ++ return rc; ++ ++ return 0; ++} ++ ++static const struct devlink_health_reporter_ops bnxt_dl_fw_reporter_ops = { ++ .name = "fw", ++ .diagnose = bnxt_fw_reporter_diagnose, ++}; ++ ++static void bnxt_dl_fw_reporters_create(struct bnxt *bp) ++{ ++ struct bnxt_fw_health *health = bp->fw_health; ++ ++ if (!health) ++ return; ++ ++ health->fw_reporter = ++ devlink_health_reporter_create(bp->dl, &bnxt_dl_fw_reporter_ops, ++ 0, false, bp); ++ if (IS_ERR(health->fw_reporter)) { ++ netdev_warn(bp->dev, "Failed to create FW health reporter, rc = %ld\n", ++ PTR_ERR(health->fw_reporter)); ++ health->fw_reporter = NULL; ++ } ++} ++ ++static void bnxt_dl_fw_reporters_destroy(struct bnxt *bp) ++{ ++ struct bnxt_fw_health *health = bp->fw_health; ++ ++ if (!health) ++ return; ++ ++ if (health->fw_reporter) ++ devlink_health_reporter_destroy(health->fw_reporter); ++} ++ + static const struct devlink_ops bnxt_dl_ops = { + #ifdef CONFIG_BNXT_SRIOV + .eswitch_mode_set = bnxt_dl_eswitch_mode_set, +@@ -246,6 +324,8 @@ + + devlink_params_publish(dl); + ++ bnxt_dl_fw_reporters_create(bp); ++ + return 0; + + err_dl_port_unreg: +@@ -268,6 +348,7 @@ + if (!dl) + return; + ++ bnxt_dl_fw_reporters_destroy(bp); + devlink_port_params_unregister(&bp->dl_port, bnxt_dl_port_params, + ARRAY_SIZE(bnxt_dl_port_params)); + devlink_port_unregister(&bp->dl_port); diff --git a/SOURCES/0072-netdrv-bnxt_en-Handle-RESET_NOTIFY-async-event-from-.patch b/SOURCES/0072-netdrv-bnxt_en-Handle-RESET_NOTIFY-async-event-from-.patch new file mode 100644 index 0000000..47b9afa --- /dev/null +++ b/SOURCES/0072-netdrv-bnxt_en-Handle-RESET_NOTIFY-async-event-from-.patch @@ -0,0 +1,81 @@ +From 03bfb6460688a8879a9a159167b3c8d36a4275ee Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:27 -0400 +Subject: [PATCH 72/96] [netdrv] bnxt_en: Handle RESET_NOTIFY async event from + firmware + +Message-id: <3a807e3f42d2f73dd6a5c46ce3792861aabac0be.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276499 +O-Subject: [RHEL-8.2 PATCH 65/78] bnxt_en: Handle RESET_NOTIFY async event from firmware. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +This event from firmware signals a coordinated reset initiated by the +firmware. It may be triggered by some error conditions encountered +in the firmware or other orderly reset conditions. + +We store the parameters from this event. Subsequent patches will +add logic to handle reset itself using devlink reporters. + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 2151fe0830fdb951f8ecfcfe67306fdef2366aa0) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 11 +++++++++++ + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 7 +++++++ + 2 files changed, 18 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:19.749476077 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:20.029473507 +0100 +@@ -254,6 +254,7 @@ + ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED, + ASYNC_EVENT_CMPL_EVENT_ID_VF_CFG_CHANGE, + ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE, ++ ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY, + ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY, + }; + +@@ -1981,6 +1982,16 @@ + goto async_event_process_exit; + set_bit(BNXT_RESET_TASK_SILENT_SP_EVENT, &bp->sp_event); + break; ++ case ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY: ++ bp->fw_reset_timestamp = jiffies; ++ bp->fw_reset_min_dsecs = cmpl->timestamp_lo; ++ if (!bp->fw_reset_min_dsecs) ++ bp->fw_reset_min_dsecs = BNXT_DFLT_FW_RST_MIN_DSECS; ++ bp->fw_reset_max_dsecs = le16_to_cpu(cmpl->timestamp_hi); ++ if (!bp->fw_reset_max_dsecs) ++ bp->fw_reset_max_dsecs = BNXT_DFLT_FW_RST_MAX_DSECS; ++ set_bit(BNXT_FW_RESET_NOTIFY_SP_EVENT, &bp->sp_event); ++ break; + case ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY: { + struct bnxt_fw_health *fw_health = bp->fw_health; + u32 data1 = le32_to_cpu(cmpl->event_data1); +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:19.896474728 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:20.029473507 +0100 +@@ -1719,6 +1719,13 @@ + #define BNXT_FLOW_STATS_SP_EVENT 15 + #define BNXT_UPDATE_PHY_SP_EVENT 16 + #define BNXT_RING_COAL_NOW_SP_EVENT 17 ++#define BNXT_FW_RESET_NOTIFY_SP_EVENT 18 ++ ++ u16 fw_reset_min_dsecs; ++#define BNXT_DFLT_FW_RST_MIN_DSECS 20 ++ u16 fw_reset_max_dsecs; ++#define BNXT_DFLT_FW_RST_MAX_DSECS 60 ++ unsigned long fw_reset_timestamp; + + struct bnxt_fw_health *fw_health; + diff --git a/SOURCES/0073-netdrv-bnxt_en-Handle-firmware-reset.patch b/SOURCES/0073-netdrv-bnxt_en-Handle-firmware-reset.patch new file mode 100644 index 0000000..4b96dc2 --- /dev/null +++ b/SOURCES/0073-netdrv-bnxt_en-Handle-firmware-reset.patch @@ -0,0 +1,282 @@ +From e0a7aa5afea68660d3bee9a46dcc04f776da7f1f Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:28 -0400 +Subject: [PATCH 73/96] [netdrv] bnxt_en: Handle firmware reset + +Message-id: +Patchwork-id: 276504 +O-Subject: [RHEL-8.2 PATCH 66/78] bnxt_en: Handle firmware reset. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Add the bnxt_fw_reset() main function to handle firmware reset. This +is triggered by firmware to initiate an orderly reset, for example +when a non-fatal exception condition has been detected. bnxt_fw_reset() +will first wait for all VFs to shutdown and then start the +bnxt_fw_reset_task() work queue to go through the sequence of reset, +re-probe, and re-initialization. + +The next patch will add the devlink reporter to start the sequence and +call bnxt_fw_reset(). + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 230d1f0de754b483ec6eefc1ca5aaeff2b6b9a4c) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 150 ++++++++++++++++++++++++++ + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 11 ++ + drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 3 + + 3 files changed, 164 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:20.029473507 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:20.162472286 +0100 +@@ -1142,6 +1142,14 @@ + return 0; + } + ++static void bnxt_queue_fw_reset_work(struct bnxt *bp, unsigned long delay) ++{ ++ if (BNXT_PF(bp)) ++ queue_delayed_work(bnxt_pf_wq, &bp->fw_reset_task, delay); ++ else ++ schedule_delayed_work(&bp->fw_reset_task, delay); ++} ++ + static void bnxt_queue_sp_work(struct bnxt *bp) + { + if (BNXT_PF(bp)) +@@ -6360,6 +6368,8 @@ + struct bnxt_vf_info *vf = &bp->vf; + + vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK; ++ } else { ++ bp->pf.registered_vfs = le16_to_cpu(resp->registered_vfs); + } + #endif + flags = le16_to_cpu(resp->flags); +@@ -9985,6 +9995,53 @@ + bnxt_rtnl_unlock_sp(bp); + } + ++static void bnxt_fw_reset_close(struct bnxt *bp) ++{ ++ __bnxt_close_nic(bp, true, false); ++ bnxt_ulp_irq_stop(bp); ++ bnxt_clear_int_mode(bp); ++ bnxt_hwrm_func_drv_unrgtr(bp); ++ bnxt_free_ctx_mem(bp); ++ kfree(bp->ctx); ++ bp->ctx = NULL; ++} ++ ++void bnxt_fw_reset(struct bnxt *bp) ++{ ++ int rc; ++ ++ 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) { ++ 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; ++ ++ 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; ++ bnxt_queue_fw_reset_work(bp, bp->fw_reset_min_dsecs * HZ / 10); ++ } ++fw_reset_exit: ++ bnxt_rtnl_unlock_sp(bp); ++} ++ + static void bnxt_chk_missed_irq(struct bnxt *bp) + { + int i; +@@ -10344,6 +10401,98 @@ + return 0; + } + ++static void bnxt_fw_reset_task(struct work_struct *work) ++{ ++ struct bnxt *bp = container_of(work, struct bnxt, fw_reset_task.work); ++ int rc; ++ ++ if (!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) { ++ netdev_err(bp->dev, "bnxt_fw_reset_task() called when not in fw reset mode!\n"); ++ return; ++ } ++ ++ switch (bp->fw_reset_state) { ++ case BNXT_FW_RESET_STATE_POLL_VF: ++ rc = bnxt_hwrm_func_qcfg(bp); ++ if (rc) { ++ 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 - ++ bp->fw_reset_timestamp)); ++ goto fw_reset_abort; ++ } ++ if (bp->pf.registered_vfs || bp->sriov_cfg) { ++ 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); ++ return; ++ } ++ bnxt_queue_fw_reset_work(bp, HZ / 10); ++ return; ++ } ++ bp->fw_reset_timestamp = jiffies; ++ rtnl_lock(); ++ bnxt_fw_reset_close(bp); ++ bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV; ++ rtnl_unlock(); ++ bnxt_queue_fw_reset_work(bp, bp->fw_reset_min_dsecs * HZ / 10); ++ return; ++ case BNXT_FW_RESET_STATE_ENABLE_DEV: ++ if (pci_enable_device(bp->pdev)) { ++ netdev_err(bp->dev, "Cannot re-enable PCI device\n"); ++ goto fw_reset_abort; ++ } ++ pci_set_master(bp->pdev); ++ bp->fw_reset_state = BNXT_FW_RESET_STATE_POLL_FW; ++ /* fall through */ ++ case BNXT_FW_RESET_STATE_POLL_FW: ++ bp->hwrm_cmd_timeout = SHORT_HWRM_CMD_TIMEOUT; ++ rc = __bnxt_hwrm_ver_get(bp, true); ++ if (rc) { ++ if (time_after(jiffies, bp->fw_reset_timestamp + ++ (bp->fw_reset_max_dsecs * HZ / 10))) { ++ netdev_err(bp->dev, "Firmware reset aborted\n"); ++ goto fw_reset_abort; ++ } ++ bnxt_queue_fw_reset_work(bp, HZ / 5); ++ return; ++ } ++ bp->hwrm_cmd_timeout = DFLT_HWRM_CMD_TIMEOUT; ++ bp->fw_reset_state = BNXT_FW_RESET_STATE_OPENING; ++ /* fall through */ ++ case BNXT_FW_RESET_STATE_OPENING: ++ while (!rtnl_trylock()) { ++ bnxt_queue_fw_reset_work(bp, HZ / 10); ++ return; ++ } ++ rc = bnxt_open(bp->dev); ++ if (rc) { ++ netdev_err(bp->dev, "bnxt_open_nic() failed\n"); ++ clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state); ++ dev_close(bp->dev); ++ } ++ bnxt_ulp_irq_restart(bp, rc); ++ rtnl_unlock(); ++ ++ bp->fw_reset_state = 0; ++ /* Make sure fw_reset_state is 0 before clearing the flag */ ++ smp_mb__before_atomic(); ++ clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state); ++ break; ++ } ++ return; ++ ++fw_reset_abort: ++ clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state); ++ bp->fw_reset_state = 0; ++ rtnl_lock(); ++ dev_close(bp->dev); ++ rtnl_unlock(); ++} ++ + static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev) + { + int rc; +@@ -10406,6 +10555,7 @@ + pci_enable_pcie_error_reporting(pdev); + + INIT_WORK(&bp->sp_task, bnxt_sp_task); ++ INIT_DELAYED_WORK(&bp->fw_reset_task, bnxt_fw_reset_task); + + spin_lock_init(&bp->ntp_fltr_lock); + #if BITS_PER_LONG == 32 +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:20.029473507 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:20.163472277 +0100 +@@ -640,6 +640,7 @@ + #define BNXT_HWRM_MAX_REQ_LEN (bp->hwrm_max_req_len) + #define BNXT_HWRM_SHORT_REQ_LEN sizeof(struct hwrm_short_input) + #define DFLT_HWRM_CMD_TIMEOUT 500 ++#define SHORT_HWRM_CMD_TIMEOUT 20 + #define HWRM_CMD_TIMEOUT (bp->hwrm_cmd_timeout) + #define HWRM_RESET_TIMEOUT ((HWRM_CMD_TIMEOUT) * 4) + #define HWRM_RESP_ERR_CODE_MASK 0xffff +@@ -1066,6 +1067,7 @@ + u8 mac_addr[ETH_ALEN]; + u32 first_vf_id; + u16 active_vfs; ++ u16 registered_vfs; + u16 max_vfs; + u32 max_encap_records; + u32 max_decap_records; +@@ -1721,6 +1723,14 @@ + #define BNXT_RING_COAL_NOW_SP_EVENT 17 + #define BNXT_FW_RESET_NOTIFY_SP_EVENT 18 + ++ struct delayed_work fw_reset_task; ++ int fw_reset_state; ++#define BNXT_FW_RESET_STATE_POLL_VF 1 ++#define BNXT_FW_RESET_STATE_RESET_FW 2 ++#define BNXT_FW_RESET_STATE_ENABLE_DEV 3 ++#define BNXT_FW_RESET_STATE_POLL_FW 4 ++#define BNXT_FW_RESET_STATE_OPENING 5 ++ + u16 fw_reset_min_dsecs; + #define BNXT_DFLT_FW_RST_MIN_DSECS 20 + u16 fw_reset_max_dsecs; +@@ -1966,6 +1976,7 @@ + int bnxt_half_open_nic(struct bnxt *bp); + void bnxt_half_close_nic(struct bnxt *bp); + int bnxt_close_nic(struct bnxt *, bool, bool); ++void bnxt_fw_reset(struct bnxt *bp); + int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs, + int tx_xdp); + int bnxt_setup_mq_tc(struct net_device *dev, u8 tc); +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c 2020-02-06 16:22:54.098711531 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c 2020-02-06 16:23:20.163472277 +0100 +@@ -226,6 +226,9 @@ + struct input *req; + int rc; + ++ if (ulp_id != BNXT_ROCE_ULP && bp->fw_reset_state) ++ return -EBUSY; ++ + mutex_lock(&bp->hwrm_cmd_lock); + req = fw_msg->msg; + req->resp_addr = cpu_to_le64(bp->hwrm_cmd_resp_dma_addr); diff --git a/SOURCES/0074-netdrv-bnxt_en-Add-devlink-health-reset-reporter.patch b/SOURCES/0074-netdrv-bnxt_en-Add-devlink-health-reset-reporter.patch new file mode 100644 index 0000000..0a57cb1 --- /dev/null +++ b/SOURCES/0074-netdrv-bnxt_en-Add-devlink-health-reset-reporter.patch @@ -0,0 +1,153 @@ +From dd8e8f16e4fa95d701b184f9e8b93bd3f0177cb8 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:29 -0400 +Subject: [PATCH 74/96] [netdrv] bnxt_en: Add devlink health reset reporter + +Message-id: <4524cb0b03008ec82cf84ba49c1d62dc2c7e029a.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276496 +O-Subject: [RHEL-8.2 PATCH 67/78] bnxt_en: Add devlink health reset reporter. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Add devlink health reporter for the firmware reset event. Once we get +the notification from firmware about the impending reset, the driver +will report this to devlink and the call to bnxt_fw_reset() will be +initiated to complete the reset sequence. + +Cc: Jiri Pirko +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 657a33c8a0a2342e91259b28356838dc89216b19) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 ++ + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 5 +++ + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 52 +++++++++++++++++++++++ + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h | 1 + + 4 files changed, 61 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:20.162472286 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:20.307470956 +0100 +@@ -10172,6 +10172,9 @@ + if (test_and_clear_bit(BNXT_RESET_TASK_SILENT_SP_EVENT, &bp->sp_event)) + bnxt_reset(bp, true); + ++ if (test_and_clear_bit(BNXT_FW_RESET_NOTIFY_SP_EVENT, &bp->sp_event)) ++ bnxt_devlink_health_report(bp, BNXT_FW_RESET_NOTIFY_SP_EVENT); ++ + smp_mb__before_atomic(); + clear_bit(BNXT_STATE_IN_SP_TASK, &bp->state); + } +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:20.163472277 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:20.307470956 +0100 +@@ -1371,6 +1371,11 @@ + u32 fw_reset_seq_vals[16]; + u32 fw_reset_seq_delay_msec[16]; + struct devlink_health_reporter *fw_reporter; ++ struct devlink_health_reporter *fw_reset_reporter; ++}; ++ ++struct bnxt_fw_reporter_ctx { ++ unsigned long sp_event; + }; + + #define BNXT_FW_HEALTH_REG_TYPE_MASK 3 +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:19.896474728 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:20.308470946 +0100 +@@ -65,6 +65,24 @@ + .diagnose = bnxt_fw_reporter_diagnose, + }; + ++static int bnxt_fw_reset_recover(struct devlink_health_reporter *reporter, ++ void *priv_ctx) ++{ ++ struct bnxt *bp = devlink_health_reporter_priv(reporter); ++ ++ if (!priv_ctx) ++ return -EOPNOTSUPP; ++ ++ bnxt_fw_reset(bp); ++ return 0; ++} ++ ++static const ++struct devlink_health_reporter_ops bnxt_dl_fw_reset_reporter_ops = { ++ .name = "fw_reset", ++ .recover = bnxt_fw_reset_recover, ++}; ++ + static void bnxt_dl_fw_reporters_create(struct bnxt *bp) + { + struct bnxt_fw_health *health = bp->fw_health; +@@ -80,6 +98,16 @@ + PTR_ERR(health->fw_reporter)); + health->fw_reporter = NULL; + } ++ ++ health->fw_reset_reporter = ++ devlink_health_reporter_create(bp->dl, ++ &bnxt_dl_fw_reset_reporter_ops, ++ 0, true, bp); ++ if (IS_ERR(health->fw_reset_reporter)) { ++ netdev_warn(bp->dev, "Failed to create FW fatal health reporter, rc = %ld\n", ++ PTR_ERR(health->fw_reset_reporter)); ++ health->fw_reset_reporter = NULL; ++ } + } + + static void bnxt_dl_fw_reporters_destroy(struct bnxt *bp) +@@ -91,6 +119,30 @@ + + if (health->fw_reporter) + devlink_health_reporter_destroy(health->fw_reporter); ++ ++ if (health->fw_reset_reporter) ++ devlink_health_reporter_destroy(health->fw_reset_reporter); ++} ++ ++void bnxt_devlink_health_report(struct bnxt *bp, unsigned long event) ++{ ++ struct bnxt_fw_health *fw_health = bp->fw_health; ++ struct bnxt_fw_reporter_ctx fw_reporter_ctx; ++ ++ if (!fw_health) ++ return; ++ ++ fw_reporter_ctx.sp_event = event; ++ switch (event) { ++ case BNXT_FW_RESET_NOTIFY_SP_EVENT: ++ if (!fw_health->fw_reset_reporter) ++ return; ++ ++ devlink_health_report(fw_health->fw_reset_reporter, ++ "FW non-fatal reset event received", ++ &fw_reporter_ctx); ++ return; ++ } + } + + static const struct devlink_ops bnxt_dl_ops = { +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h 2020-02-06 16:23:11.278553834 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h 2020-02-06 16:23:20.308470946 +0100 +@@ -55,6 +55,7 @@ + u16 num_bits; + }; + ++void bnxt_devlink_health_report(struct bnxt *bp, unsigned long event); + int bnxt_dl_register(struct bnxt *bp); + void bnxt_dl_unregister(struct bnxt *bp); + diff --git a/SOURCES/0075-netdrv-bnxt_en-Retain-user-settings-on-a-VF-after-RE.patch b/SOURCES/0075-netdrv-bnxt_en-Retain-user-settings-on-a-VF-after-RE.patch new file mode 100644 index 0000000..8d78b1a --- /dev/null +++ b/SOURCES/0075-netdrv-bnxt_en-Retain-user-settings-on-a-VF-after-RE.patch @@ -0,0 +1,162 @@ +From 94a4266dd4286313065805b7d482f1aa7c61acd8 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:30 -0400 +Subject: [PATCH 75/96] [netdrv] bnxt_en: Retain user settings on a VF after + RESET_NOTIFY event + +Message-id: +Patchwork-id: 276489 +O-Subject: [RHEL-8.2 PATCH 68/78] bnxt_en: Retain user settings on a VF after RESET_NOTIFY event. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Retain the VF MAC address, default VLAN, TX rate control, trust settings +of VFs after firmware reset. + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 2cd8696850450b750f278be06ee56eb51d84621c) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- + drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c | 50 +++++++++++++++++++++---- + drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h | 2 +- + 3 files changed, 45 insertions(+), 9 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.307470956 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:20.461469542 +0100 +@@ -9216,7 +9216,7 @@ + int n = pf->active_vfs; + + if (n) +- bnxt_cfg_hw_sriov(bp, &n); ++ bnxt_cfg_hw_sriov(bp, &n, true); + } + bnxt_hwmon_open(bp); + } +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c 2020-02-06 16:23:19.750476068 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c 2020-02-06 16:23:20.461469542 +0100 +@@ -470,10 +470,43 @@ + return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + } + ++/* Caller holds bp->hwrm_cmd_lock mutex lock */ ++static void __bnxt_set_vf_params(struct bnxt *bp, int vf_id) ++{ ++ struct hwrm_func_cfg_input req = {0}; ++ struct bnxt_vf_info *vf; ++ ++ vf = &bp->pf.vf[vf_id]; ++ bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_CFG, -1, -1); ++ req.fid = cpu_to_le16(vf->fw_fid); ++ req.flags = cpu_to_le32(vf->func_flags); ++ ++ if (is_valid_ether_addr(vf->mac_addr)) { ++ req.enables |= cpu_to_le32(FUNC_CFG_REQ_ENABLES_DFLT_MAC_ADDR); ++ memcpy(req.dflt_mac_addr, vf->mac_addr, ETH_ALEN); ++ } ++ if (vf->vlan) { ++ req.enables |= cpu_to_le32(FUNC_CFG_REQ_ENABLES_DFLT_VLAN); ++ req.dflt_vlan = cpu_to_le16(vf->vlan); ++ } ++ if (vf->max_tx_rate) { ++ req.enables |= cpu_to_le32(FUNC_CFG_REQ_ENABLES_MAX_BW); ++ req.max_bw = cpu_to_le32(vf->max_tx_rate); ++#ifdef HAVE_IFLA_TX_RATE ++ req.enables |= cpu_to_le32(FUNC_CFG_REQ_ENABLES_MIN_BW); ++ req.min_bw = cpu_to_le32(vf->min_tx_rate); ++#endif ++ } ++ if (vf->flags & BNXT_VF_TRUST) ++ req.flags |= cpu_to_le32(FUNC_CFG_REQ_FLAGS_TRUSTED_VF_ENABLE); ++ ++ _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++} ++ + /* Only called by PF to reserve resources for VFs, returns actual number of + * VFs configured, or < 0 on error. + */ +-static int bnxt_hwrm_func_vf_resc_cfg(struct bnxt *bp, int num_vfs) ++static int bnxt_hwrm_func_vf_resc_cfg(struct bnxt *bp, int num_vfs, bool reset) + { + struct hwrm_func_vf_resource_cfg_input req = {0}; + struct bnxt_hw_resc *hw_resc = &bp->hw_resc; +@@ -545,6 +578,9 @@ + + mutex_lock(&bp->hwrm_cmd_lock); + for (i = 0; i < num_vfs; i++) { ++ if (reset) ++ __bnxt_set_vf_params(bp, i); ++ + req.vf_id = cpu_to_le16(pf->first_vf_id + i); + rc = _hwrm_send_message(bp, &req, sizeof(req), + HWRM_CMD_TIMEOUT); +@@ -659,15 +695,15 @@ + return rc; + } + +-static int bnxt_func_cfg(struct bnxt *bp, int num_vfs) ++static int bnxt_func_cfg(struct bnxt *bp, int num_vfs, bool reset) + { + if (BNXT_NEW_RM(bp)) +- return bnxt_hwrm_func_vf_resc_cfg(bp, num_vfs); ++ return bnxt_hwrm_func_vf_resc_cfg(bp, num_vfs, reset); + else + return bnxt_hwrm_func_cfg(bp, num_vfs); + } + +-int bnxt_cfg_hw_sriov(struct bnxt *bp, int *num_vfs) ++int bnxt_cfg_hw_sriov(struct bnxt *bp, int *num_vfs, bool reset) + { + int rc; + +@@ -677,7 +713,7 @@ + return rc; + + /* Reserve resources for VFs */ +- rc = bnxt_func_cfg(bp, *num_vfs); ++ rc = bnxt_func_cfg(bp, *num_vfs, reset); + if (rc != *num_vfs) { + if (rc <= 0) { + netdev_warn(bp->dev, "Unable to reserve resources for SRIOV.\n"); +@@ -758,7 +794,7 @@ + if (rc) + goto err_out1; + +- rc = bnxt_cfg_hw_sriov(bp, num_vfs); ++ rc = bnxt_cfg_hw_sriov(bp, num_vfs, false); + if (rc) + goto err_out2; + +@@ -1144,7 +1180,7 @@ + } + #else + +-int bnxt_cfg_hw_sriov(struct bnxt *bp, int *num_vfs) ++int bnxt_cfg_hw_sriov(struct bnxt *bp, int *num_vfs, bool reset) + { + if (*num_vfs) + return -EOPNOTSUPP; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h 2020-02-06 16:23:18.878484072 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.h 2020-02-06 16:23:20.461469542 +0100 +@@ -36,7 +36,7 @@ + int bnxt_set_vf_spoofchk(struct net_device *, int, bool); + int bnxt_set_vf_trust(struct net_device *dev, int vf_id, bool trust); + int bnxt_sriov_configure(struct pci_dev *pdev, int num_vfs); +-int bnxt_cfg_hw_sriov(struct bnxt *bp, int *num_vfs); ++int bnxt_cfg_hw_sriov(struct bnxt *bp, int *num_vfs, bool reset); + void bnxt_sriov_disable(struct bnxt *); + void bnxt_hwrm_exec_fwd_req(struct bnxt *); + void bnxt_update_vf_mac(struct bnxt *); diff --git a/SOURCES/0076-netdrv-bnxt_en-Do-not-send-firmware-messages-if-firm.patch b/SOURCES/0076-netdrv-bnxt_en-Do-not-send-firmware-messages-if-firm.patch new file mode 100644 index 0000000..4f76ee1 --- /dev/null +++ b/SOURCES/0076-netdrv-bnxt_en-Do-not-send-firmware-messages-if-firm.patch @@ -0,0 +1,124 @@ +From 64f664056ef6e4616a8a7da3240cfd54620f03fe Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +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 +RH-Acked-by: Jarod Wilson + +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 +Signed-off-by: David S. Miller +(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 +Signed-off-by: Bruno Meneguele +--- + 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; diff --git a/SOURCES/0077-netdrv-bnxt_en-Add-RESET_FW-state-logic-to-bnxt_fw_r.patch b/SOURCES/0077-netdrv-bnxt_en-Add-RESET_FW-state-logic-to-bnxt_fw_r.patch new file mode 100644 index 0000000..5249a5e --- /dev/null +++ b/SOURCES/0077-netdrv-bnxt_en-Add-RESET_FW-state-logic-to-bnxt_fw_r.patch @@ -0,0 +1,112 @@ +From c587c80cd46091f35a6d063dd4c515f600cc91b9 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:32 -0400 +Subject: [PATCH 77/96] [netdrv] bnxt_en: Add RESET_FW state logic to + bnxt_fw_reset_task() + +Message-id: <4dcd528def5dab7e4524d88a3aa5306d1e6d561f.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276490 +O-Subject: [RHEL-8.2 PATCH 70/78] bnxt_en: Add RESET_FW state logic to bnxt_fw_reset_task(). +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +This state handles driver initiated chip reset during error recovery. +Only the master function will perform this step during error recovery. +The next patch will add code to initiate this reset from the master +function. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit cbb51067a5f5fbae733283b67fc8013881eb4bb1) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 64 +++++++++++++++++++++++++++++++ + 1 file changed, 64 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:20.602468248 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:20.736467018 +0100 +@@ -10407,6 +10407,62 @@ + return 0; + } + ++static void bnxt_fw_reset_writel(struct bnxt *bp, int reg_idx) ++{ ++ struct bnxt_fw_health *fw_health = bp->fw_health; ++ u32 reg = fw_health->fw_reset_seq_regs[reg_idx]; ++ u32 val = fw_health->fw_reset_seq_vals[reg_idx]; ++ u32 reg_type, reg_off, delay_msecs; ++ ++ delay_msecs = fw_health->fw_reset_seq_delay_msec[reg_idx]; ++ reg_type = BNXT_FW_HEALTH_REG_TYPE(reg); ++ reg_off = BNXT_FW_HEALTH_REG_OFF(reg); ++ switch (reg_type) { ++ case BNXT_FW_HEALTH_REG_TYPE_CFG: ++ pci_write_config_dword(bp->pdev, reg_off, val); ++ break; ++ case BNXT_FW_HEALTH_REG_TYPE_GRC: ++ writel(reg_off & BNXT_GRC_BASE_MASK, ++ bp->bar0 + BNXT_GRCPF_REG_WINDOW_BASE_OUT + 4); ++ reg_off = (reg_off & BNXT_GRC_OFFSET_MASK) + 0x2000; ++ /* fall through */ ++ case BNXT_FW_HEALTH_REG_TYPE_BAR0: ++ writel(val, bp->bar0 + reg_off); ++ break; ++ case BNXT_FW_HEALTH_REG_TYPE_BAR1: ++ writel(val, bp->bar1 + reg_off); ++ break; ++ } ++ if (delay_msecs) { ++ pci_read_config_dword(bp->pdev, 0, &val); ++ msleep(delay_msecs); ++ } ++} ++ ++static void bnxt_reset_all(struct bnxt *bp) ++{ ++ struct bnxt_fw_health *fw_health = bp->fw_health; ++ int i; ++ ++ if (fw_health->flags & ERROR_RECOVERY_QCFG_RESP_FLAGS_HOST) { ++ for (i = 0; i < fw_health->fw_reset_seq_cnt; i++) ++ bnxt_fw_reset_writel(bp, i); ++ } else if (fw_health->flags & ERROR_RECOVERY_QCFG_RESP_FLAGS_CO_CPU) { ++ struct hwrm_fw_reset_input req = {0}; ++ int rc; ++ ++ bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FW_RESET, -1, -1); ++ req.resp_addr = cpu_to_le64(bp->hwrm_cmd_kong_resp_dma_addr); ++ req.embedded_proc_type = FW_RESET_REQ_EMBEDDED_PROC_TYPE_CHIP; ++ req.selfrst_status = FW_RESET_REQ_SELFRST_STATUS_SELFRSTASAP; ++ req.flags = FW_RESET_REQ_FLAGS_RESET_GRACEFUL; ++ rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ if (rc) ++ netdev_warn(bp->dev, "Unable to reset FW rc=%d\n", rc); ++ } ++ bp->fw_reset_timestamp = jiffies; ++} ++ + static void bnxt_fw_reset_task(struct work_struct *work) + { + struct bnxt *bp = container_of(work, struct bnxt, fw_reset_task.work); +@@ -10446,6 +10502,14 @@ + 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; ++ ++ bnxt_reset_all(bp); ++ bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV; ++ bnxt_queue_fw_reset_work(bp, wait_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)) { diff --git a/SOURCES/0078-netdrv-bnxt_en-Add-bnxt_fw_exception-to-handle-fatal.patch b/SOURCES/0078-netdrv-bnxt_en-Add-bnxt_fw_exception-to-handle-fatal.patch new file mode 100644 index 0000000..0f3686a --- /dev/null +++ b/SOURCES/0078-netdrv-bnxt_en-Add-bnxt_fw_exception-to-handle-fatal.patch @@ -0,0 +1,113 @@ +From bc6e952463a8ff739d2c19e2bf244b2fc20333e5 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:33 -0400 +Subject: [PATCH 78/96] [netdrv] bnxt_en: Add bnxt_fw_exception() to handle + fatal firmware errors + +Message-id: <7d2820df47f74feb4d96b3892f2ac534344a8293.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276501 +O-Subject: [RHEL-8.2 PATCH 71/78] bnxt_en: Add bnxt_fw_exception() to handle fatal firmware errors. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +This call will handle fatal firmware errors by forcing a reset on the +firmware. The master function driver will carry out the forced reset. +The sequence will go through the same bnxt_fw_reset_task() workqueue. +This fatal reset differs from the non-fatal reset at the beginning +stages. From the BNXT_FW_RESET_STATE_ENABLE_DEV state onwards where +the firmware is coming out of reset, it is practically identical to the +non-fatal reset. + +The next patch will add the periodic heartbeat check and the devlink +reporter to report the fatal event and to initiate the bnxt_fw_exception() +call. + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit d1db9e166bf6a50e1e6713f3fd3b4de6007e3671) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 44 +++++++++++++++++++++++++++++++ + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + + 2 files changed, 45 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:20.736467018 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:20.864465843 +0100 +@@ -10008,6 +10008,40 @@ + bp->ctx = NULL; + } + ++/* rtnl_lock is acquired before calling this function */ ++static void bnxt_force_fw_reset(struct bnxt *bp) ++{ ++ struct bnxt_fw_health *fw_health = bp->fw_health; ++ u32 wait_dsecs; ++ ++ if (!test_bit(BNXT_STATE_OPEN, &bp->state) || ++ test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) ++ return; ++ ++ set_bit(BNXT_STATE_IN_FW_RESET, &bp->state); ++ bnxt_fw_reset_close(bp); ++ wait_dsecs = fw_health->master_func_wait_dsecs; ++ if (fw_health->master) { ++ if (fw_health->flags & ERROR_RECOVERY_QCFG_RESP_FLAGS_CO_CPU) ++ wait_dsecs = 0; ++ bp->fw_reset_state = BNXT_FW_RESET_STATE_RESET_FW; ++ } else { ++ bp->fw_reset_timestamp = jiffies + wait_dsecs * HZ / 10; ++ wait_dsecs = fw_health->normal_func_wait_dsecs; ++ bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV; ++ } ++ bp->fw_reset_max_dsecs = fw_health->post_reset_max_wait_dsecs; ++ bnxt_queue_fw_reset_work(bp, wait_dsecs * HZ / 10); ++} ++ ++void bnxt_fw_exception(struct bnxt *bp) ++{ ++ set_bit(BNXT_STATE_FW_FATAL_COND, &bp->state); ++ bnxt_rtnl_lock_sp(bp); ++ bnxt_force_fw_reset(bp); ++ bnxt_rtnl_unlock_sp(bp); ++} ++ + void bnxt_fw_reset(struct bnxt *bp) + { + int rc; +@@ -10511,6 +10545,16 @@ + return; + } + case BNXT_FW_RESET_STATE_ENABLE_DEV: ++ if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state) && ++ bp->fw_health) { ++ u32 val; ++ ++ val = bnxt_fw_health_readl(bp, ++ BNXT_FW_RESET_INPROG_REG); ++ if (val) ++ netdev_warn(bp->dev, "FW reset inprog %x after min wait time.\n", ++ val); ++ } + 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"); +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:20.602468248 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:20.864465843 +0100 +@@ -1982,6 +1982,7 @@ + int bnxt_half_open_nic(struct bnxt *bp); + void bnxt_half_close_nic(struct bnxt *bp); + int bnxt_close_nic(struct bnxt *, bool, bool); ++void bnxt_fw_exception(struct bnxt *bp); + void bnxt_fw_reset(struct bnxt *bp); + int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs, + int tx_xdp); diff --git a/SOURCES/0079-netdrv-bnxt_en-Add-FW-fatal-devlink_health_reporter.patch b/SOURCES/0079-netdrv-bnxt_en-Add-FW-fatal-devlink_health_reporter.patch new file mode 100644 index 0000000..7cfc286 --- /dev/null +++ b/SOURCES/0079-netdrv-bnxt_en-Add-FW-fatal-devlink_health_reporter.patch @@ -0,0 +1,311 @@ +From b3e7152c648b111070c144a01ce482ec7f3f593c Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:34 -0400 +Subject: [PATCH 79/96] [netdrv] bnxt_en: Add FW fatal devlink_health_reporter + +Message-id: +Patchwork-id: 276494 +O-Subject: [RHEL-8.2 PATCH 72/78] bnxt_en: Add FW fatal devlink_health_reporter. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Health show command example and output: + +$ devlink health show pci/0000:af:00.0 reporter fw_fatal + +pci/0000:af:00.0: + name fw_fatal + state healthy error 1 recover 1 grace_period 0 auto_recover true + +Fatal events from firmware or missing periodic heartbeats will +be reported and recovery will be handled. + +We also turn on the support flags when we register with the firmware to +enable this health and recovery feature in the firmware. + +Cc: Jiri Pirko +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit acfb50e4e773c9a5755a3c265c7c20d37a8642e5) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 80 ++++++++++++++++++++++- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 7 ++ + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 56 ++++++++++++++++ + 3 files changed, 141 insertions(+), 2 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.864465843 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:21.000464594 +0100 +@@ -1990,7 +1990,9 @@ + goto async_event_process_exit; + set_bit(BNXT_RESET_TASK_SILENT_SP_EVENT, &bp->sp_event); + break; +- case ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY: ++ case ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY: { ++ u32 data1 = le32_to_cpu(cmpl->event_data1); ++ + bp->fw_reset_timestamp = jiffies; + bp->fw_reset_min_dsecs = cmpl->timestamp_lo; + if (!bp->fw_reset_min_dsecs) +@@ -1998,8 +2000,16 @@ + bp->fw_reset_max_dsecs = le16_to_cpu(cmpl->timestamp_hi); + if (!bp->fw_reset_max_dsecs) + bp->fw_reset_max_dsecs = BNXT_DFLT_FW_RST_MAX_DSECS; ++ if (EVENT_DATA1_RESET_NOTIFY_FATAL(data1)) { ++ netdev_warn(bp->dev, "Firmware fatal reset event received\n"); ++ set_bit(BNXT_STATE_FW_FATAL_COND, &bp->state); ++ } else { ++ netdev_warn(bp->dev, "Firmware non-fatal reset event received, max wait time %d msec\n", ++ bp->fw_reset_max_dsecs * 100); ++ } + set_bit(BNXT_FW_RESET_NOTIFY_SP_EVENT, &bp->sp_event); + break; ++ } + case ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY: { + struct bnxt_fw_health *fw_health = bp->fw_health; + u32 data1 = le32_to_cpu(cmpl->event_data1); +@@ -4419,6 +4429,7 @@ + { + struct hwrm_func_drv_rgtr_output *resp = bp->hwrm_cmd_resp_addr; + struct hwrm_func_drv_rgtr_input req = {0}; ++ u32 flags; + int rc; + + bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_DRV_RGTR, -1, -1); +@@ -4428,7 +4439,11 @@ + FUNC_DRV_RGTR_REQ_ENABLES_VER); + + req.os_type = cpu_to_le16(FUNC_DRV_RGTR_REQ_OS_TYPE_LINUX); +- req.flags = cpu_to_le32(FUNC_DRV_RGTR_REQ_FLAGS_16BIT_VER_MODE); ++ flags = FUNC_DRV_RGTR_REQ_FLAGS_16BIT_VER_MODE | ++ FUNC_DRV_RGTR_REQ_FLAGS_HOT_RESET_SUPPORT; ++ if (bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY) ++ flags |= FUNC_DRV_RGTR_REQ_FLAGS_ERROR_RECOVERY_SUPPORT; ++ req.flags = cpu_to_le32(flags); + req.ver_maj_8b = DRV_VER_MAJ; + req.ver_min_8b = DRV_VER_MIN; + req.ver_upd_8b = DRV_VER_UPD; +@@ -9931,6 +9946,38 @@ + bnxt_queue_sp_work(bp); + } + ++static void bnxt_fw_health_check(struct bnxt *bp) ++{ ++ struct bnxt_fw_health *fw_health = bp->fw_health; ++ u32 val; ++ ++ if (!fw_health || !fw_health->enabled || ++ test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) ++ return; ++ ++ if (fw_health->tmr_counter) { ++ fw_health->tmr_counter--; ++ return; ++ } ++ ++ val = bnxt_fw_health_readl(bp, BNXT_FW_HEARTBEAT_REG); ++ if (val == fw_health->last_fw_heartbeat) ++ goto fw_reset; ++ ++ fw_health->last_fw_heartbeat = val; ++ ++ val = bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG); ++ if (val != fw_health->last_fw_reset_cnt) ++ goto fw_reset; ++ ++ fw_health->tmr_counter = fw_health->tmr_multiplier; ++ return; ++ ++fw_reset: ++ set_bit(BNXT_FW_EXCEPTION_SP_EVENT, &bp->sp_event); ++ bnxt_queue_sp_work(bp); ++} ++ + static void bnxt_timer(struct timer_list *t) + { + struct bnxt *bp = from_timer(bp, t, timer); +@@ -9942,6 +9989,9 @@ + if (atomic_read(&bp->intr_sem) != 0) + goto bnxt_restart_timer; + ++ if (bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY) ++ bnxt_fw_health_check(bp); ++ + if (bp->link_info.link_up && (bp->flags & BNXT_FLAG_PORT_STATS) && + bp->stats_coal_ticks) { + set_bit(BNXT_PERIODIC_STATS_SP_EVENT, &bp->sp_event); +@@ -10008,6 +10058,26 @@ + bp->ctx = NULL; + } + ++static bool is_bnxt_fw_ok(struct bnxt *bp) ++{ ++ struct bnxt_fw_health *fw_health = bp->fw_health; ++ bool no_heartbeat = false, has_reset = false; ++ u32 val; ++ ++ val = bnxt_fw_health_readl(bp, BNXT_FW_HEARTBEAT_REG); ++ if (val == fw_health->last_fw_heartbeat) ++ no_heartbeat = true; ++ ++ val = bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG); ++ if (val != fw_health->last_fw_reset_cnt) ++ has_reset = true; ++ ++ if (!no_heartbeat && has_reset) ++ return true; ++ ++ return false; ++} ++ + /* rtnl_lock is acquired before calling this function */ + static void bnxt_force_fw_reset(struct bnxt *bp) + { +@@ -10212,6 +10282,12 @@ + if (test_and_clear_bit(BNXT_FW_RESET_NOTIFY_SP_EVENT, &bp->sp_event)) + bnxt_devlink_health_report(bp, BNXT_FW_RESET_NOTIFY_SP_EVENT); + ++ if (test_and_clear_bit(BNXT_FW_EXCEPTION_SP_EVENT, &bp->sp_event)) { ++ if (!is_bnxt_fw_ok(bp)) ++ bnxt_devlink_health_report(bp, ++ BNXT_FW_EXCEPTION_SP_EVENT); ++ } ++ + smp_mb__before_atomic(); + clear_bit(BNXT_STATE_IN_SP_TASK, &bp->state); + } +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:20.864465843 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:21.001464585 +0100 +@@ -472,6 +472,11 @@ + ((le32_to_cpu((rx_tpa_end_ext)->rx_tpa_end_cmp_dup_acks) & \ + RX_TPA_END_CMP_AGG_BUFS_P5) >> RX_TPA_END_CMP_AGG_BUFS_SHIFT_P5) + ++#define EVENT_DATA1_RESET_NOTIFY_FATAL(data1) \ ++ (((data1) & \ ++ ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_MASK) ==\ ++ ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_EXCEPTION_FATAL) ++ + #define EVENT_DATA1_RECOVERY_MASTER_FUNC(data1) \ + !!((data1) & \ + ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_MASTER_FUNC) +@@ -1372,6 +1377,7 @@ + u32 fw_reset_seq_delay_msec[16]; + struct devlink_health_reporter *fw_reporter; + struct devlink_health_reporter *fw_reset_reporter; ++ struct devlink_health_reporter *fw_fatal_reporter; + }; + + struct bnxt_fw_reporter_ctx { +@@ -1728,6 +1734,7 @@ + #define BNXT_UPDATE_PHY_SP_EVENT 16 + #define BNXT_RING_COAL_NOW_SP_EVENT 17 + #define BNXT_FW_RESET_NOTIFY_SP_EVENT 18 ++#define BNXT_FW_EXCEPTION_SP_EVENT 19 + + struct delayed_work fw_reset_task; + int fw_reset_state; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:20.308470946 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:21.001464585 +0100 +@@ -83,6 +83,31 @@ + .recover = bnxt_fw_reset_recover, + }; + ++static int bnxt_fw_fatal_recover(struct devlink_health_reporter *reporter, ++ void *priv_ctx) ++{ ++ struct bnxt *bp = devlink_health_reporter_priv(reporter); ++ struct bnxt_fw_reporter_ctx *fw_reporter_ctx = priv_ctx; ++ unsigned long event; ++ ++ if (!priv_ctx) ++ return -EOPNOTSUPP; ++ ++ event = fw_reporter_ctx->sp_event; ++ if (event == BNXT_FW_RESET_NOTIFY_SP_EVENT) ++ bnxt_fw_reset(bp); ++ else if (event == BNXT_FW_EXCEPTION_SP_EVENT) ++ bnxt_fw_exception(bp); ++ ++ return 0; ++} ++ ++static const ++struct devlink_health_reporter_ops bnxt_dl_fw_fatal_reporter_ops = { ++ .name = "fw_fatal", ++ .recover = bnxt_fw_fatal_recover, ++}; ++ + static void bnxt_dl_fw_reporters_create(struct bnxt *bp) + { + struct bnxt_fw_health *health = bp->fw_health; +@@ -108,6 +133,16 @@ + PTR_ERR(health->fw_reset_reporter)); + health->fw_reset_reporter = NULL; + } ++ ++ health->fw_fatal_reporter = ++ devlink_health_reporter_create(bp->dl, ++ &bnxt_dl_fw_fatal_reporter_ops, ++ 0, true, bp); ++ if (IS_ERR(health->fw_fatal_reporter)) { ++ netdev_warn(bp->dev, "Failed to create FW fatal health reporter, rc = %ld\n", ++ PTR_ERR(health->fw_fatal_reporter)); ++ health->fw_fatal_reporter = NULL; ++ } + } + + static void bnxt_dl_fw_reporters_destroy(struct bnxt *bp) +@@ -122,6 +157,9 @@ + + if (health->fw_reset_reporter) + devlink_health_reporter_destroy(health->fw_reset_reporter); ++ ++ if (health->fw_fatal_reporter) ++ devlink_health_reporter_destroy(health->fw_fatal_reporter); + } + + void bnxt_devlink_health_report(struct bnxt *bp, unsigned long event) +@@ -135,6 +173,15 @@ + fw_reporter_ctx.sp_event = event; + switch (event) { + case BNXT_FW_RESET_NOTIFY_SP_EVENT: ++ if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state)) { ++ if (!fw_health->fw_fatal_reporter) ++ return; ++ ++ devlink_health_report(fw_health->fw_fatal_reporter, ++ "FW fatal async event received", ++ &fw_reporter_ctx); ++ return; ++ } + if (!fw_health->fw_reset_reporter) + return; + +@@ -142,6 +189,15 @@ + "FW non-fatal reset event received", + &fw_reporter_ctx); + return; ++ ++ case BNXT_FW_EXCEPTION_SP_EVENT: ++ if (!fw_health->fw_fatal_reporter) ++ return; ++ ++ devlink_health_report(fw_health->fw_fatal_reporter, ++ "FW fatal error reported", ++ &fw_reporter_ctx); ++ return; + } + } + diff --git a/SOURCES/0080-netdrv-bnxt_en-Fix-compile-error-regression-with-CON.patch b/SOURCES/0080-netdrv-bnxt_en-Fix-compile-error-regression-with-CON.patch new file mode 100644 index 0000000..2e0e895 --- /dev/null +++ b/SOURCES/0080-netdrv-bnxt_en-Fix-compile-error-regression-with-CON.patch @@ -0,0 +1,153 @@ +From be440df803ea96609073662eb051180e742fcc43 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +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: +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 +RH-Acked-by: Jarod Wilson + +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 +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(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 +Signed-off-by: Bruno Meneguele +--- + 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; + diff --git a/SOURCES/0081-netdrv-bnxt_en-Don-t-proceed-in-.ndo_set_rx_mode-whe.patch b/SOURCES/0081-netdrv-bnxt_en-Don-t-proceed-in-.ndo_set_rx_mode-whe.patch new file mode 100644 index 0000000..5b0dd79 --- /dev/null +++ b/SOURCES/0081-netdrv-bnxt_en-Don-t-proceed-in-.ndo_set_rx_mode-whe.patch @@ -0,0 +1,56 @@ +From 5de2d4f892cac111195aeddc741e2ef199e554c2 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:36 -0400 +Subject: [PATCH 81/96] [netdrv] bnxt_en: Don't proceed in .ndo_set_rx_mode() + when device is not in open state + +Message-id: <622e3c11be99362a153efe46b13f7fc1b0182027.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276497 +O-Subject: [RHEL-8.2 PATCH 74/78] bnxt_en: Don't proceed in .ndo_set_rx_mode() when device is not in open state. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Check the BNXT_STATE_OPEN flag instead of netif_running() in +bnxt_set_rx_mode(). If the driver is going through any reset, such +as firmware reset or even TX timeout, it may not be ready to set the RX +mode and may crash. The new rx mode settings will be picked up when +the device is opened again later. + +Fixes: 230d1f0de754 ("bnxt_en: Handle firmware reset.") +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 268d0895f1b9690755d91b6ced60c9d8d17a7567) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 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.151463208 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:21.286461969 +0100 +@@ -9562,14 +9562,16 @@ + static void bnxt_set_rx_mode(struct net_device *dev) + { + struct bnxt *bp = netdev_priv(dev); +- struct bnxt_vnic_info *vnic = &bp->vnic_info[0]; +- u32 mask = vnic->rx_mask; ++ struct bnxt_vnic_info *vnic; + bool mc_update = false; + bool uc_update; ++ u32 mask; + +- if (!netif_running(dev)) ++ if (!test_bit(BNXT_STATE_OPEN, &bp->state)) + return; + ++ vnic = &bp->vnic_info[0]; ++ mask = vnic->rx_mask; + mask &= ~(CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS | + CFA_L2_SET_RX_MASK_REQ_MASK_MCAST | + CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST | diff --git a/SOURCES/0082-netdrv-bnxt_en-Increase-timeout-for-HWRM_DBG_COREDUM.patch b/SOURCES/0082-netdrv-bnxt_en-Increase-timeout-for-HWRM_DBG_COREDUM.patch new file mode 100644 index 0000000..5fe0519 --- /dev/null +++ b/SOURCES/0082-netdrv-bnxt_en-Increase-timeout-for-HWRM_DBG_COREDUM.patch @@ -0,0 +1,56 @@ +From b66eac123a22a6590e58eb3933d0ec90d80e6d5f Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:37 -0400 +Subject: [PATCH 82/96] [netdrv] bnxt_en: Increase timeout for + HWRM_DBG_COREDUMP_XX commands + +Message-id: <87db84c8920d668c06d3ac0c00c52bffaf49ad14.1570027456.git.jtoppins@redhat.com> +Patchwork-id: 276491 +O-Subject: [RHEL-8.2 PATCH 75/78] bnxt_en: Increase timeout for HWRM_DBG_COREDUMP_XX commands +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Firmware coredump messages take much longer than standard messages, +so increase the timeout accordingly. + +Fixes: 6c5657d085ae ("bnxt_en: Add support for ethtool get dump.") +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 57a8730b1f7a0be7bf8a0a0bb665329074ba764f) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:21.001464585 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:21.412460813 +0100 +@@ -648,6 +648,7 @@ + #define SHORT_HWRM_CMD_TIMEOUT 20 + #define HWRM_CMD_TIMEOUT (bp->hwrm_cmd_timeout) + #define HWRM_RESET_TIMEOUT ((HWRM_CMD_TIMEOUT) * 4) ++#define HWRM_COREDUMP_TIMEOUT ((HWRM_CMD_TIMEOUT) * 12) + #define HWRM_RESP_ERR_CODE_MASK 0xffff + #define HWRM_RESP_LEN_OFFSET 4 + #define HWRM_RESP_LEN_MASK 0xffff0000 +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.730485431 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:21.412460813 +0100 +@@ -3112,7 +3112,7 @@ + req.component_id = cpu_to_le16(component_id); + req.segment_id = cpu_to_le16(segment_id); + +- return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ return hwrm_send_message(bp, &req, sizeof(req), HWRM_COREDUMP_TIMEOUT); + } + + static int bnxt_hwrm_dbg_coredump_retrieve(struct bnxt *bp, u16 component_id, diff --git a/SOURCES/0083-netdrv-bnxt_en-Update-firmware-interface-spec.-to-1..patch b/SOURCES/0083-netdrv-bnxt_en-Update-firmware-interface-spec.-to-1..patch new file mode 100644 index 0000000..fefe135 --- /dev/null +++ b/SOURCES/0083-netdrv-bnxt_en-Update-firmware-interface-spec.-to-1..patch @@ -0,0 +1,282 @@ +From 0441942faf5c6e7372792b10cf57345cfad2cefa Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:38 -0400 +Subject: [PATCH 83/96] [netdrv] bnxt_en: Update firmware interface spec. to + 1.10.0.100 + +Message-id: +Patchwork-id: 276500 +O-Subject: [RHEL-8.2 PATCH 76/78] bnxt_en: Update firmware interface spec. to 1.10.0.100. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +Some error recovery updates to the spec., among other minor changes. + +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 72e0c9f91238f1f5f22954be6aea535d1d5fbf31) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h | 146 ++++++++++++++++++-------- + 1 file changed, 103 insertions(+), 43 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h 2020-02-06 16:23:15.728512987 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h 2020-02-06 16:23:21.544459601 +0100 +@@ -44,11 +44,12 @@ + #define TLV_TYPE_ENGINE_CKV_IV 0x8003UL + #define TLV_TYPE_ENGINE_CKV_AUTH_TAG 0x8004UL + #define TLV_TYPE_ENGINE_CKV_CIPHERTEXT 0x8005UL +-#define TLV_TYPE_ENGINE_CKV_ALGORITHMS 0x8006UL ++#define TLV_TYPE_ENGINE_CKV_HOST_ALGORITHMS 0x8006UL + #define TLV_TYPE_ENGINE_CKV_HOST_ECC_PUBLIC_KEY 0x8007UL + #define TLV_TYPE_ENGINE_CKV_ECDSA_SIGNATURE 0x8008UL +-#define TLV_TYPE_ENGINE_CKV_SRT_ECC_PUBLIC_KEY 0x8009UL +-#define TLV_TYPE_LAST TLV_TYPE_ENGINE_CKV_SRT_ECC_PUBLIC_KEY ++#define TLV_TYPE_ENGINE_CKV_FW_ECC_PUBLIC_KEY 0x8009UL ++#define TLV_TYPE_ENGINE_CKV_FW_ALGORITHMS 0x800aUL ++#define TLV_TYPE_LAST TLV_TYPE_ENGINE_CKV_FW_ALGORITHMS + + + /* tlv (size:64b/8B) */ +@@ -201,10 +202,16 @@ + #define HWRM_PORT_QSTATS_EXT 0xb4UL + #define HWRM_PORT_PHY_MDIO_WRITE 0xb5UL + #define HWRM_PORT_PHY_MDIO_READ 0xb6UL ++ #define HWRM_PORT_PHY_MDIO_BUS_ACQUIRE 0xb7UL ++ #define HWRM_PORT_PHY_MDIO_BUS_RELEASE 0xb8UL + #define HWRM_FW_RESET 0xc0UL + #define HWRM_FW_QSTATUS 0xc1UL + #define HWRM_FW_HEALTH_CHECK 0xc2UL + #define HWRM_FW_SYNC 0xc3UL ++ #define HWRM_FW_STATE_BUFFER_QCAPS 0xc4UL ++ #define HWRM_FW_STATE_QUIESCE 0xc5UL ++ #define HWRM_FW_STATE_BACKUP 0xc6UL ++ #define HWRM_FW_STATE_RESTORE 0xc7UL + #define HWRM_FW_SET_TIME 0xc8UL + #define HWRM_FW_GET_TIME 0xc9UL + #define HWRM_FW_SET_STRUCTURED_DATA 0xcaUL +@@ -216,7 +223,10 @@ + #define HWRM_FWD_ASYNC_EVENT_CMPL 0xd3UL + #define HWRM_OEM_CMD 0xd4UL + #define HWRM_PORT_PRBS_TEST 0xd5UL ++ #define HWRM_PORT_SFP_SIDEBAND_CFG 0xd6UL ++ #define HWRM_PORT_SFP_SIDEBAND_QCFG 0xd7UL + #define HWRM_TEMP_MONITOR_QUERY 0xe0UL ++ #define HWRM_REG_POWER_QUERY 0xe1UL + #define HWRM_WOL_FILTER_ALLOC 0xf0UL + #define HWRM_WOL_FILTER_FREE 0xf1UL + #define HWRM_WOL_FILTER_QCFG 0xf2UL +@@ -411,8 +421,8 @@ + #define HWRM_VERSION_MAJOR 1 + #define HWRM_VERSION_MINOR 10 + #define HWRM_VERSION_UPDATE 0 +-#define HWRM_VERSION_RSVD 89 +-#define HWRM_VERSION_STR "1.10.0.89" ++#define HWRM_VERSION_RSVD 100 ++#define HWRM_VERSION_STR "1.10.0.100" + + /* hwrm_ver_get_input (size:192b/24B) */ + struct hwrm_ver_get_input { +@@ -805,6 +815,37 @@ + #define ASYNC_EVENT_CMPL_VF_CFG_CHANGE_EVENT_DATA1_TRUSTED_VF_CFG_CHANGE 0x10UL + }; + ++/* hwrm_async_event_cmpl_default_vnic_change (size:128b/16B) */ ++struct hwrm_async_event_cmpl_default_vnic_change { ++ __le16 type; ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_TYPE_MASK 0x3fUL ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_TYPE_SFT 0 ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_TYPE_HWRM_ASYNC_EVENT 0x2eUL ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_TYPE_LAST ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_TYPE_HWRM_ASYNC_EVENT ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_UNUSED1_MASK 0xffc0UL ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_UNUSED1_SFT 6 ++ __le16 event_id; ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_ID_ALLOC_FREE_NOTIFICATION 0x35UL ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_ID_LAST ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_ID_ALLOC_FREE_NOTIFICATION ++ __le32 event_data2; ++ u8 opaque_v; ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_V 0x1UL ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_OPAQUE_MASK 0xfeUL ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_OPAQUE_SFT 1 ++ u8 timestamp_lo; ++ __le16 timestamp_hi; ++ __le32 event_data1; ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_DEF_VNIC_STATE_MASK 0x3UL ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_DEF_VNIC_STATE_SFT 0 ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_DEF_VNIC_STATE_DEF_VNIC_ALLOC 0x1UL ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_DEF_VNIC_STATE_DEF_VNIC_FREE 0x2UL ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_DEF_VNIC_STATE_LAST ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_DEF_VNIC_STATE_DEF_VNIC_FREE ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_PF_ID_MASK 0x3fcUL ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_PF_ID_SFT 2 ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_VF_ID_MASK 0x3fffc00UL ++ #define ASYNC_EVENT_CMPL_DEFAULT_VNIC_CHANGE_EVENT_DATA1_VF_ID_SFT 10 ++}; ++ + /* hwrm_async_event_cmpl_hw_flow_aged (size:128b/16B) */ + struct hwrm_async_event_cmpl_hw_flow_aged { + __le16 type; +@@ -1047,31 +1088,33 @@ + __le16 fid; + __le16 port_id; + __le32 flags; +- #define FUNC_QCAPS_RESP_FLAGS_PUSH_MODE_SUPPORTED 0x1UL +- #define FUNC_QCAPS_RESP_FLAGS_GLOBAL_MSIX_AUTOMASKING 0x2UL +- #define FUNC_QCAPS_RESP_FLAGS_PTP_SUPPORTED 0x4UL +- #define FUNC_QCAPS_RESP_FLAGS_ROCE_V1_SUPPORTED 0x8UL +- #define FUNC_QCAPS_RESP_FLAGS_ROCE_V2_SUPPORTED 0x10UL +- #define FUNC_QCAPS_RESP_FLAGS_WOL_MAGICPKT_SUPPORTED 0x20UL +- #define FUNC_QCAPS_RESP_FLAGS_WOL_BMP_SUPPORTED 0x40UL +- #define FUNC_QCAPS_RESP_FLAGS_TX_RING_RL_SUPPORTED 0x80UL +- #define FUNC_QCAPS_RESP_FLAGS_TX_BW_CFG_SUPPORTED 0x100UL +- #define FUNC_QCAPS_RESP_FLAGS_VF_TX_RING_RL_SUPPORTED 0x200UL +- #define FUNC_QCAPS_RESP_FLAGS_VF_BW_CFG_SUPPORTED 0x400UL +- #define FUNC_QCAPS_RESP_FLAGS_STD_TX_RING_MODE_SUPPORTED 0x800UL +- #define FUNC_QCAPS_RESP_FLAGS_GENEVE_TUN_FLAGS_SUPPORTED 0x1000UL +- #define FUNC_QCAPS_RESP_FLAGS_NVGRE_TUN_FLAGS_SUPPORTED 0x2000UL +- #define FUNC_QCAPS_RESP_FLAGS_GRE_TUN_FLAGS_SUPPORTED 0x4000UL +- #define FUNC_QCAPS_RESP_FLAGS_MPLS_TUN_FLAGS_SUPPORTED 0x8000UL +- #define FUNC_QCAPS_RESP_FLAGS_PCIE_STATS_SUPPORTED 0x10000UL +- #define FUNC_QCAPS_RESP_FLAGS_ADOPTED_PF_SUPPORTED 0x20000UL +- #define FUNC_QCAPS_RESP_FLAGS_ADMIN_PF_SUPPORTED 0x40000UL +- #define FUNC_QCAPS_RESP_FLAGS_LINK_ADMIN_STATUS_SUPPORTED 0x80000UL +- #define FUNC_QCAPS_RESP_FLAGS_WCB_PUSH_MODE 0x100000UL +- #define FUNC_QCAPS_RESP_FLAGS_DYNAMIC_TX_RING_ALLOC 0x200000UL +- #define FUNC_QCAPS_RESP_FLAGS_HOT_RESET_CAPABLE 0x400000UL +- #define FUNC_QCAPS_RESP_FLAGS_ERROR_RECOVERY_CAPABLE 0x800000UL +- #define FUNC_QCAPS_RESP_FLAGS_EXT_STATS_SUPPORTED 0x1000000UL ++ #define FUNC_QCAPS_RESP_FLAGS_PUSH_MODE_SUPPORTED 0x1UL ++ #define FUNC_QCAPS_RESP_FLAGS_GLOBAL_MSIX_AUTOMASKING 0x2UL ++ #define FUNC_QCAPS_RESP_FLAGS_PTP_SUPPORTED 0x4UL ++ #define FUNC_QCAPS_RESP_FLAGS_ROCE_V1_SUPPORTED 0x8UL ++ #define FUNC_QCAPS_RESP_FLAGS_ROCE_V2_SUPPORTED 0x10UL ++ #define FUNC_QCAPS_RESP_FLAGS_WOL_MAGICPKT_SUPPORTED 0x20UL ++ #define FUNC_QCAPS_RESP_FLAGS_WOL_BMP_SUPPORTED 0x40UL ++ #define FUNC_QCAPS_RESP_FLAGS_TX_RING_RL_SUPPORTED 0x80UL ++ #define FUNC_QCAPS_RESP_FLAGS_TX_BW_CFG_SUPPORTED 0x100UL ++ #define FUNC_QCAPS_RESP_FLAGS_VF_TX_RING_RL_SUPPORTED 0x200UL ++ #define FUNC_QCAPS_RESP_FLAGS_VF_BW_CFG_SUPPORTED 0x400UL ++ #define FUNC_QCAPS_RESP_FLAGS_STD_TX_RING_MODE_SUPPORTED 0x800UL ++ #define FUNC_QCAPS_RESP_FLAGS_GENEVE_TUN_FLAGS_SUPPORTED 0x1000UL ++ #define FUNC_QCAPS_RESP_FLAGS_NVGRE_TUN_FLAGS_SUPPORTED 0x2000UL ++ #define FUNC_QCAPS_RESP_FLAGS_GRE_TUN_FLAGS_SUPPORTED 0x4000UL ++ #define FUNC_QCAPS_RESP_FLAGS_MPLS_TUN_FLAGS_SUPPORTED 0x8000UL ++ #define FUNC_QCAPS_RESP_FLAGS_PCIE_STATS_SUPPORTED 0x10000UL ++ #define FUNC_QCAPS_RESP_FLAGS_ADOPTED_PF_SUPPORTED 0x20000UL ++ #define FUNC_QCAPS_RESP_FLAGS_ADMIN_PF_SUPPORTED 0x40000UL ++ #define FUNC_QCAPS_RESP_FLAGS_LINK_ADMIN_STATUS_SUPPORTED 0x80000UL ++ #define FUNC_QCAPS_RESP_FLAGS_WCB_PUSH_MODE 0x100000UL ++ #define FUNC_QCAPS_RESP_FLAGS_DYNAMIC_TX_RING_ALLOC 0x200000UL ++ #define FUNC_QCAPS_RESP_FLAGS_HOT_RESET_CAPABLE 0x400000UL ++ #define FUNC_QCAPS_RESP_FLAGS_ERROR_RECOVERY_CAPABLE 0x800000UL ++ #define FUNC_QCAPS_RESP_FLAGS_EXT_STATS_SUPPORTED 0x1000000UL ++ #define FUNC_QCAPS_RESP_FLAGS_ERR_RECOVER_RELOAD 0x2000000UL ++ #define FUNC_QCAPS_RESP_FLAGS_NOTIFY_VF_DEF_VNIC_CHNG_SUPPORTED 0x4000000UL + u8 mac_address[6]; + __le16 max_rsscos_ctx; + __le16 max_cmpl_rings; +@@ -1208,7 +1251,8 @@ + __le16 alloc_stat_ctx; + __le16 alloc_msix; + __le16 registered_vfs; +- u8 unused_1[3]; ++ __le16 l2_doorbell_bar_size_kb; ++ u8 unused_1; + u8 always_1; + __le32 reset_addr_poll; + u8 unused_2[3]; +@@ -1363,7 +1407,11 @@ + __le16 target_id; + __le64 resp_addr; + __le16 fid; +- u8 unused_0[6]; ++ u8 flags; ++ #define FUNC_QSTATS_REQ_FLAGS_UNUSED 0x0UL ++ #define FUNC_QSTATS_REQ_FLAGS_ROCE_ONLY 0x1UL ++ #define FUNC_QSTATS_REQ_FLAGS_LAST FUNC_QSTATS_REQ_FLAGS_ROCE_ONLY ++ u8 unused_0[5]; + }; + + /* hwrm_func_qstats_output (size:1408b/176B) */ +@@ -4714,7 +4762,7 @@ + u8 valid; + }; + +-/* hwrm_vnic_cfg_input (size:320b/40B) */ ++/* hwrm_vnic_cfg_input (size:384b/48B) */ + struct hwrm_vnic_cfg_input { + __le16 req_type; + __le16 cmpl_ring; +@@ -4737,6 +4785,7 @@ + #define VNIC_CFG_REQ_ENABLES_MRU 0x10UL + #define VNIC_CFG_REQ_ENABLES_DEFAULT_RX_RING_ID 0x20UL + #define VNIC_CFG_REQ_ENABLES_DEFAULT_CMPL_RING_ID 0x40UL ++ #define VNIC_CFG_REQ_ENABLES_QUEUE_ID 0x80UL + __le16 vnic_id; + __le16 dflt_ring_grp; + __le16 rss_rule; +@@ -4745,6 +4794,8 @@ + __le16 mru; + __le16 default_rx_ring_id; + __le16 default_cmpl_ring_id; ++ __le16 queue_id; ++ u8 unused0[6]; + }; + + /* hwrm_vnic_cfg_output (size:128b/16B) */ +@@ -4785,6 +4836,7 @@ + #define VNIC_QCAPS_RESP_FLAGS_RSS_DFLT_CR_CAP 0x20UL + #define VNIC_QCAPS_RESP_FLAGS_ROCE_MIRRORING_CAPABLE_VNIC_CAP 0x40UL + #define VNIC_QCAPS_RESP_FLAGS_OUTERMOST_RSS_CAP 0x80UL ++ #define VNIC_QCAPS_RESP_FLAGS_COS_ASSIGNMENT_CAP 0x100UL + __le16 max_aggs_supported; + u8 unused_1[5]; + u8 valid; +@@ -6794,15 +6846,16 @@ + __le16 target_id; + __le64 resp_addr; + u8 embedded_proc_type; +- #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_BOOT 0x0UL +- #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_MGMT 0x1UL +- #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_NETCTRL 0x2UL +- #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_ROCE 0x3UL +- #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_HOST 0x4UL +- #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_AP 0x5UL +- #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_CHIP 0x6UL +- #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_HOST_RESOURCE_REINIT 0x7UL +- #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_LAST FW_RESET_REQ_EMBEDDED_PROC_TYPE_HOST_RESOURCE_REINIT ++ #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_BOOT 0x0UL ++ #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_MGMT 0x1UL ++ #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_NETCTRL 0x2UL ++ #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_ROCE 0x3UL ++ #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_HOST 0x4UL ++ #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_AP 0x5UL ++ #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_CHIP 0x6UL ++ #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_HOST_RESOURCE_REINIT 0x7UL ++ #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_IMPACTLESS_ACTIVATION 0x8UL ++ #define FW_RESET_REQ_EMBEDDED_PROC_TYPE_LAST FW_RESET_REQ_EMBEDDED_PROC_TYPE_IMPACTLESS_ACTIVATION + u8 selfrst_status; + #define FW_RESET_REQ_SELFRST_STATUS_SELFRSTNONE 0x0UL + #define FW_RESET_REQ_SELFRST_STATUS_SELFRSTASAP 0x1UL +@@ -7125,7 +7178,14 @@ + __le16 seq_id; + __le16 resp_len; + u8 temp; +- u8 unused_0[6]; ++ u8 phy_temp; ++ u8 om_temp; ++ u8 flags; ++ #define TEMP_MONITOR_QUERY_RESP_FLAGS_TEMP_NOT_AVAILABLE 0x1UL ++ #define TEMP_MONITOR_QUERY_RESP_FLAGS_PHY_TEMP_NOT_AVAILABLE 0x2UL ++ #define TEMP_MONITOR_QUERY_RESP_FLAGS_OM_NOT_PRESENT 0x4UL ++ #define TEMP_MONITOR_QUERY_RESP_FLAGS_OM_TEMP_NOT_AVAILABLE 0x8UL ++ u8 unused_0[3]; + u8 valid; + }; + diff --git a/SOURCES/0084-netdrv-bnxt_en-Add-a-new-BNXT_FW_RESET_STATE_POLL_FW.patch b/SOURCES/0084-netdrv-bnxt_en-Add-a-new-BNXT_FW_RESET_STATE_POLL_FW.patch new file mode 100644 index 0000000..bc98606 --- /dev/null +++ b/SOURCES/0084-netdrv-bnxt_en-Add-a-new-BNXT_FW_RESET_STATE_POLL_FW.patch @@ -0,0 +1,158 @@ +From a10d58b1feaebcd74c4c1c0d2247c742a8d704e7 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Wed, 2 Oct 2019 18:23:39 -0400 +Subject: [PATCH 84/96] [netdrv] bnxt_en: Add a new + BNXT_FW_RESET_STATE_POLL_FW_DOWN state + +Message-id: +Patchwork-id: 276502 +O-Subject: [RHEL-8.2 PATCH 77/78] bnxt_en: Add a new BNXT_FW_RESET_STATE_POLL_FW_DOWN state. +Bugzilla: 1724766 +RH-Acked-by: John Linville +RH-Acked-by: Jarod Wilson + +This new state is required when firmware indicates that the error +recovery process requires polling for firmware state to be completely +down before initiating reset. For example, firmware may take some +time to collect the crash dump before it is down and ready to be +reset. + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 4037eb715680caa3d80075fb54dbc35d79d5f9ff) +Bugzilla: 1724766 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=23809532 +Tested: build, boot, basic ping +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 48 +++++++++++++++++++++++++++---- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 ++ + 2 files changed, 46 insertions(+), 5 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.286461969 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:21.672458426 +0100 +@@ -6952,6 +6952,8 @@ + bp->fw_cap |= BNXT_FW_CAP_EXT_STATS_SUPPORTED; + if (flags & FUNC_QCAPS_RESP_FLAGS_ERROR_RECOVERY_CAPABLE) + bp->fw_cap |= BNXT_FW_CAP_ERROR_RECOVERY; ++ if (flags & FUNC_QCAPS_RESP_FLAGS_ERR_RECOVER_RELOAD) ++ bp->fw_cap |= BNXT_FW_CAP_ERR_RECOVER_RELOAD; + + bp->tx_push_thresh = 0; + if (flags & FUNC_QCAPS_RESP_FLAGS_PUSH_MODE_SUPPORTED) +@@ -10102,6 +10104,8 @@ + wait_dsecs = fw_health->normal_func_wait_dsecs; + bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV; + } ++ ++ bp->fw_reset_min_dsecs = fw_health->post_reset_wait_dsecs; + bp->fw_reset_max_dsecs = fw_health->post_reset_max_wait_dsecs; + bnxt_queue_fw_reset_work(bp, wait_dsecs * HZ / 10); + } +@@ -10143,7 +10147,7 @@ + bnxt_rtnl_lock_sp(bp); + if (test_bit(BNXT_STATE_OPEN, &bp->state) && + !test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) { +- int n = 0; ++ int n = 0, tmo; + + set_bit(BNXT_STATE_IN_FW_RESET, &bp->state); + if (bp->pf.active_vfs && +@@ -10166,8 +10170,14 @@ + goto fw_reset_exit; + } + bnxt_fw_reset_close(bp); +- bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV; +- bnxt_queue_fw_reset_work(bp, bp->fw_reset_min_dsecs * HZ / 10); ++ if (bp->fw_cap & BNXT_FW_CAP_ERR_RECOVER_RELOAD) { ++ bp->fw_reset_state = BNXT_FW_RESET_STATE_POLL_FW_DOWN; ++ tmo = HZ / 10; ++ } else { ++ bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV; ++ tmo = bp->fw_reset_min_dsecs * HZ / 10; ++ } ++ bnxt_queue_fw_reset_work(bp, tmo); + } + fw_reset_exit: + bnxt_rtnl_unlock_sp(bp); +@@ -10610,6 +10620,7 @@ + switch (bp->fw_reset_state) { + case BNXT_FW_RESET_STATE_POLL_VF: { + int n = bnxt_get_registered_vfs(bp); ++ int tmo; + + if (n < 0) { + netdev_err(bp->dev, "Firmware reset aborted, subsequent func_qcfg cmd failed, rc = %d, %d msecs since reset timestamp\n", +@@ -10631,11 +10642,38 @@ + bp->fw_reset_timestamp = jiffies; + rtnl_lock(); + bnxt_fw_reset_close(bp); +- bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV; ++ if (bp->fw_cap & BNXT_FW_CAP_ERR_RECOVER_RELOAD) { ++ bp->fw_reset_state = BNXT_FW_RESET_STATE_POLL_FW_DOWN; ++ tmo = HZ / 10; ++ } else { ++ bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV; ++ tmo = bp->fw_reset_min_dsecs * HZ / 10; ++ } + rtnl_unlock(); +- bnxt_queue_fw_reset_work(bp, bp->fw_reset_min_dsecs * HZ / 10); ++ bnxt_queue_fw_reset_work(bp, tmo); + return; + } ++ case BNXT_FW_RESET_STATE_POLL_FW_DOWN: { ++ u32 val; ++ ++ val = bnxt_fw_health_readl(bp, BNXT_FW_HEALTH_REG); ++ if (!(val & BNXT_FW_STATUS_SHUTDOWN) && ++ !time_after(jiffies, bp->fw_reset_timestamp + ++ (bp->fw_reset_max_dsecs * HZ / 10))) { ++ bnxt_queue_fw_reset_work(bp, HZ / 5); ++ return; ++ } ++ ++ if (!bp->fw_health->master) { ++ u32 wait_dsecs = bp->fw_health->normal_func_wait_dsecs; ++ ++ bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV; ++ bnxt_queue_fw_reset_work(bp, wait_dsecs * HZ / 10); ++ return; ++ } ++ bp->fw_reset_state = BNXT_FW_RESET_STATE_RESET_FW; ++ } ++ /* fall through */ + case BNXT_FW_RESET_STATE_RESET_FW: { + u32 wait_dsecs = bp->fw_health->post_reset_wait_dsecs; + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:21.412460813 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:21.672458426 +0100 +@@ -1398,6 +1398,7 @@ + #define BNXT_FW_HEALTH_WIN_MAP_OFF 8 + + #define BNXT_FW_STATUS_HEALTHY 0x8000 ++#define BNXT_FW_STATUS_SHUTDOWN 0x100000 + + struct bnxt { + void __iomem *bar0; +@@ -1655,6 +1656,7 @@ + #define BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX 0x00010000 + #define BNXT_FW_CAP_PCIE_STATS_SUPPORTED 0x00020000 + #define BNXT_FW_CAP_EXT_STATS_SUPPORTED 0x00040000 ++ #define BNXT_FW_CAP_ERR_RECOVER_RELOAD 0x00100000 + + #define BNXT_NEW_RM(bp) ((bp)->fw_cap & BNXT_FW_CAP_NEW_RM) + u32 hwrm_spec_code; +@@ -1744,6 +1746,7 @@ + #define BNXT_FW_RESET_STATE_ENABLE_DEV 3 + #define BNXT_FW_RESET_STATE_POLL_FW 4 + #define BNXT_FW_RESET_STATE_OPENING 5 ++#define BNXT_FW_RESET_STATE_POLL_FW_DOWN 6 + + u16 fw_reset_min_dsecs; + #define BNXT_DFLT_FW_RST_MIN_DSECS 20 diff --git a/SOURCES/0085-netdrv-bnxt_en-Fix-the-size-of-devlink-MSIX-paramete.patch b/SOURCES/0085-netdrv-bnxt_en-Fix-the-size-of-devlink-MSIX-paramete.patch new file mode 100644 index 0000000..173f064 --- /dev/null +++ b/SOURCES/0085-netdrv-bnxt_en-Fix-the-size-of-devlink-MSIX-paramete.patch @@ -0,0 +1,138 @@ +From 4efc1d44bba3790e80c873c904d7ea492a95c266 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Fri, 6 Dec 2019 20:12:41 -0500 +Subject: [PATCH 85/96] [netdrv] bnxt_en: Fix the size of devlink MSIX + parameters + +Message-id: <1b368014d051a2c3530a23412e08b2275d988c8c.1575651771.git.jtoppins@redhat.com> +Patchwork-id: 291380 +O-Subject: [PATCH rhel8 01/13] bnxt_en: Fix the size of devlink MSIX parameters. +Bugzilla: 1773724 +RH-Acked-by: Steve Best +RH-Acked-by: David Arcari +RH-Acked-by: Jarod Wilson +RH-Acked-by: John Linville + +The current code that rounds up the NVRAM parameter bit size to the next +byte size for the devlink parameter is not always correct. The MSIX +devlink parameters are 4 bytes and we don't get the correct size +using this method. + +Fix it by adding a new dl_num_bytes member to the bnxt_dl_nvm_param +structure which statically provides bytesize information according +to the devlink parameter type definition. + +Fixes: 782a624d00fa ("bnxt_en: Add bnxt_en initial port params table and register it") +Cc: Jiri Pirko +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: Jakub Kicinski +(cherry picked from commit c329230ce886f449a6e559b636096b75ab00d18a) +Bugzilla: 1773724 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25154853 +Tested: simple boot test +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 28 +++++++++++------------ + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h | 3 ++- + 2 files changed, 16 insertions(+), 15 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:21.001464585 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:21.809457168 +0100 +@@ -215,15 +215,15 @@ + + static const struct bnxt_dl_nvm_param nvm_params[] = { + {DEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV, NVM_OFF_ENABLE_SRIOV, +- BNXT_NVM_SHARED_CFG, 1}, ++ BNXT_NVM_SHARED_CFG, 1, 1}, + {DEVLINK_PARAM_GENERIC_ID_IGNORE_ARI, NVM_OFF_IGNORE_ARI, +- BNXT_NVM_SHARED_CFG, 1}, ++ BNXT_NVM_SHARED_CFG, 1, 1}, + {DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX, +- NVM_OFF_MSIX_VEC_PER_PF_MAX, BNXT_NVM_SHARED_CFG, 10}, ++ NVM_OFF_MSIX_VEC_PER_PF_MAX, BNXT_NVM_SHARED_CFG, 10, 4}, + {DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN, +- NVM_OFF_MSIX_VEC_PER_PF_MIN, BNXT_NVM_SHARED_CFG, 7}, ++ NVM_OFF_MSIX_VEC_PER_PF_MIN, BNXT_NVM_SHARED_CFG, 7, 4}, + {BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK, NVM_OFF_DIS_GRE_VER_CHECK, +- BNXT_NVM_SHARED_CFG, 1}, ++ BNXT_NVM_SHARED_CFG, 1, 1}, + }; + + static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg, +@@ -232,8 +232,8 @@ + struct hwrm_nvm_get_variable_input *req = msg; + void *data_addr = NULL, *buf = NULL; + struct bnxt_dl_nvm_param nvm_param; +- int bytesize, idx = 0, rc, i; + dma_addr_t data_dma_addr; ++ int idx = 0, rc, i; + + /* Get/Set NVM CFG parameter is supported only on PFs */ + if (BNXT_VF(bp)) +@@ -254,10 +254,9 @@ + else if (nvm_param.dir_type == BNXT_NVM_FUNC_CFG) + idx = bp->pf.fw_fid - BNXT_FIRST_PF_FID; + +- bytesize = roundup(nvm_param.num_bits, BITS_PER_BYTE) / BITS_PER_BYTE; +- switch (bytesize) { ++ switch (nvm_param.dl_num_bytes) { + case 1: +- if (nvm_param.num_bits == 1) ++ if (nvm_param.nvm_num_bits == 1) + buf = &val->vbool; + else + buf = &val->vu8; +@@ -272,29 +271,30 @@ + return -EFAULT; + } + +- data_addr = dma_alloc_coherent(&bp->pdev->dev, bytesize, ++ data_addr = dma_alloc_coherent(&bp->pdev->dev, nvm_param.dl_num_bytes, + &data_dma_addr, GFP_KERNEL); + if (!data_addr) + return -ENOMEM; + + req->dest_data_addr = cpu_to_le64(data_dma_addr); +- req->data_len = cpu_to_le16(nvm_param.num_bits); ++ req->data_len = cpu_to_le16(nvm_param.nvm_num_bits); + req->option_num = cpu_to_le16(nvm_param.offset); + req->index_0 = cpu_to_le16(idx); + if (idx) + req->dimensions = cpu_to_le16(1); + + if (req->req_type == cpu_to_le16(HWRM_NVM_SET_VARIABLE)) { +- memcpy(data_addr, buf, bytesize); ++ memcpy(data_addr, buf, nvm_param.dl_num_bytes); + rc = hwrm_send_message(bp, msg, msg_len, HWRM_CMD_TIMEOUT); + } else { + rc = hwrm_send_message_silent(bp, msg, msg_len, + HWRM_CMD_TIMEOUT); + } + if (!rc && req->req_type == cpu_to_le16(HWRM_NVM_GET_VARIABLE)) +- memcpy(buf, data_addr, bytesize); ++ memcpy(buf, data_addr, nvm_param.dl_num_bytes); + +- dma_free_coherent(&bp->pdev->dev, bytesize, data_addr, data_dma_addr); ++ dma_free_coherent(&bp->pdev->dev, nvm_param.dl_num_bytes, data_addr, ++ data_dma_addr); + if (rc == -EACCES) + netdev_err(bp->dev, "PF does not have admin privileges to modify NVM config\n"); + return rc; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h 2020-02-06 16:23:20.308470946 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h 2020-02-06 16:23:21.809457168 +0100 +@@ -52,7 +52,8 @@ + u16 id; + u16 offset; + u16 dir_type; +- u16 num_bits; ++ u16 nvm_num_bits; ++ u8 dl_num_bytes; + }; + + void bnxt_devlink_health_report(struct bnxt *bp, unsigned long event); diff --git a/SOURCES/0086-netdrv-bnxt_en-Fix-devlink-NVRAM-related-byte-order-.patch b/SOURCES/0086-netdrv-bnxt_en-Fix-devlink-NVRAM-related-byte-order-.patch new file mode 100644 index 0000000..aee5805 --- /dev/null +++ b/SOURCES/0086-netdrv-bnxt_en-Fix-devlink-NVRAM-related-byte-order-.patch @@ -0,0 +1,151 @@ +From 5ad60432be4bc7b015baeba7013d74fba3130363 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Fri, 6 Dec 2019 20:12:42 -0500 +Subject: [PATCH 86/96] [netdrv] bnxt_en: Fix devlink NVRAM related byte order + related issues + +Message-id: +Patchwork-id: 291377 +O-Subject: [PATCH rhel8 02/13] bnxt_en: Fix devlink NVRAM related byte order related issues. +Bugzilla: 1773724 +RH-Acked-by: Steve Best +RH-Acked-by: David Arcari +RH-Acked-by: Jarod Wilson +RH-Acked-by: John Linville + +The current code does not do endian swapping between the devlink +parameter and the internal NVRAM representation. Define a union to +represent the little endian NVRAM data and add 2 helper functions to +copy to and from the NVRAM data with the proper byte swapping. + +Fixes: 782a624d00fa ("bnxt_en: Add bnxt_en initial port params table and register it") +Cc: Jiri Pirko +Reviewed-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: Jakub Kicinski +(cherry picked from commit 83a46a82b96c1928ad82958752523fb0c7d9fcce) +Bugzilla: 1773724 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25154853 +Tested: simple boot test +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 81 +++++++++++++++-------- + 1 file changed, 54 insertions(+), 27 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:21.809457168 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:21.942455948 +0100 +@@ -226,12 +226,55 @@ + BNXT_NVM_SHARED_CFG, 1, 1}, + }; + ++union bnxt_nvm_data { ++ u8 val8; ++ __le32 val32; ++}; ++ ++static void bnxt_copy_to_nvm_data(union bnxt_nvm_data *dst, ++ union devlink_param_value *src, ++ int nvm_num_bits, int dl_num_bytes) ++{ ++ u32 val32 = 0; ++ ++ if (nvm_num_bits == 1) { ++ dst->val8 = src->vbool; ++ return; ++ } ++ if (dl_num_bytes == 4) ++ val32 = src->vu32; ++ else if (dl_num_bytes == 2) ++ val32 = (u32)src->vu16; ++ else if (dl_num_bytes == 1) ++ val32 = (u32)src->vu8; ++ dst->val32 = cpu_to_le32(val32); ++} ++ ++static void bnxt_copy_from_nvm_data(union devlink_param_value *dst, ++ union bnxt_nvm_data *src, ++ int nvm_num_bits, int dl_num_bytes) ++{ ++ u32 val32; ++ ++ if (nvm_num_bits == 1) { ++ dst->vbool = src->val8; ++ return; ++ } ++ val32 = le32_to_cpu(src->val32); ++ if (dl_num_bytes == 4) ++ dst->vu32 = val32; ++ else if (dl_num_bytes == 2) ++ dst->vu16 = (u16)val32; ++ else if (dl_num_bytes == 1) ++ dst->vu8 = (u8)val32; ++} ++ + static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg, + int msg_len, union devlink_param_value *val) + { + struct hwrm_nvm_get_variable_input *req = msg; +- void *data_addr = NULL, *buf = NULL; + struct bnxt_dl_nvm_param nvm_param; ++ union bnxt_nvm_data *data; + dma_addr_t data_dma_addr; + int idx = 0, rc, i; + +@@ -254,26 +297,9 @@ + else if (nvm_param.dir_type == BNXT_NVM_FUNC_CFG) + idx = bp->pf.fw_fid - BNXT_FIRST_PF_FID; + +- switch (nvm_param.dl_num_bytes) { +- case 1: +- if (nvm_param.nvm_num_bits == 1) +- buf = &val->vbool; +- else +- buf = &val->vu8; +- break; +- case 2: +- buf = &val->vu16; +- break; +- case 4: +- buf = &val->vu32; +- break; +- default: +- return -EFAULT; +- } +- +- data_addr = dma_alloc_coherent(&bp->pdev->dev, nvm_param.dl_num_bytes, +- &data_dma_addr, GFP_KERNEL); +- if (!data_addr) ++ data = dma_alloc_coherent(&bp->pdev->dev, sizeof(*data), ++ &data_dma_addr, GFP_KERNEL); ++ if (!data) + return -ENOMEM; + + req->dest_data_addr = cpu_to_le64(data_dma_addr); +@@ -284,17 +310,18 @@ + req->dimensions = cpu_to_le16(1); + + if (req->req_type == cpu_to_le16(HWRM_NVM_SET_VARIABLE)) { +- memcpy(data_addr, buf, nvm_param.dl_num_bytes); ++ bnxt_copy_to_nvm_data(data, val, nvm_param.nvm_num_bits, ++ nvm_param.dl_num_bytes); + rc = hwrm_send_message(bp, msg, msg_len, HWRM_CMD_TIMEOUT); + } else { + rc = hwrm_send_message_silent(bp, msg, msg_len, + HWRM_CMD_TIMEOUT); ++ if (!rc) ++ bnxt_copy_from_nvm_data(val, data, ++ nvm_param.nvm_num_bits, ++ nvm_param.dl_num_bytes); + } +- if (!rc && req->req_type == cpu_to_le16(HWRM_NVM_GET_VARIABLE)) +- memcpy(buf, data_addr, nvm_param.dl_num_bytes); +- +- dma_free_coherent(&bp->pdev->dev, nvm_param.dl_num_bytes, data_addr, +- data_dma_addr); ++ dma_free_coherent(&bp->pdev->dev, sizeof(*data), data, data_dma_addr); + if (rc == -EACCES) + netdev_err(bp->dev, "PF does not have admin privileges to modify NVM config\n"); + return rc; diff --git a/SOURCES/0087-netdrv-bnxt_en-Adjust-the-time-to-wait-before-pollin.patch b/SOURCES/0087-netdrv-bnxt_en-Adjust-the-time-to-wait-before-pollin.patch new file mode 100644 index 0000000..a30901d --- /dev/null +++ b/SOURCES/0087-netdrv-bnxt_en-Adjust-the-time-to-wait-before-pollin.patch @@ -0,0 +1,58 @@ +From ef7f935ad4295dbc775456efd99c583cd51eaa74 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Fri, 6 Dec 2019 20:12:43 -0500 +Subject: [PATCH 87/96] [netdrv] bnxt_en: Adjust the time to wait before + polling firmware readiness + +Message-id: +Patchwork-id: 291376 +O-Subject: [PATCH rhel8 03/13] bnxt_en: Adjust the time to wait before polling firmware readiness. +Bugzilla: 1773724 +RH-Acked-by: Steve Best +RH-Acked-by: David Arcari +RH-Acked-by: Jarod Wilson +RH-Acked-by: John Linville + +When firmware indicates that driver needs to invoke firmware reset +which is common for both error recovery and live firmware reset path, +driver needs a different time to wait before polling for firmware +readiness. + +Modify the wait time to fw_reset_min_dsecs, which is initialised to +correct timeout for error recovery and firmware reset. + +Fixes: 4037eb715680 ("bnxt_en: Add a new BNXT_FW_RESET_STATE_POLL_FW_DOWN state.") +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: Jakub Kicinski +(cherry picked from commit c6a9e7aa2e8b15402022a15625284069d4fd6df0) +Bugzilla: 1773724 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25154853 +Tested: simple boot test +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 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.672458426 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:22.071454764 +0100 +@@ -10674,14 +10674,11 @@ + bp->fw_reset_state = BNXT_FW_RESET_STATE_RESET_FW; + } + /* fall through */ +- case BNXT_FW_RESET_STATE_RESET_FW: { +- u32 wait_dsecs = bp->fw_health->post_reset_wait_dsecs; +- ++ case BNXT_FW_RESET_STATE_RESET_FW: + bnxt_reset_all(bp); + bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV; +- bnxt_queue_fw_reset_work(bp, wait_dsecs * HZ / 10); ++ bnxt_queue_fw_reset_work(bp, bp->fw_reset_min_dsecs * HZ / 10); + return; +- } + case BNXT_FW_RESET_STATE_ENABLE_DEV: + if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state) && + bp->fw_health) { diff --git a/SOURCES/0088-netdrv-bnxt_en-Minor-formatting-changes-in-FW-devlin.patch b/SOURCES/0088-netdrv-bnxt_en-Minor-formatting-changes-in-FW-devlin.patch new file mode 100644 index 0000000..0c86eb6 --- /dev/null +++ b/SOURCES/0088-netdrv-bnxt_en-Minor-formatting-changes-in-FW-devlin.patch @@ -0,0 +1,69 @@ +From 5794ca78ec757be0a96c5538227d5a7bad227ad7 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Fri, 6 Dec 2019 20:12:44 -0500 +Subject: [PATCH 88/96] [netdrv] bnxt_en: Minor formatting changes in FW + devlink_health_reporter + +Message-id: +Patchwork-id: 291375 +O-Subject: [PATCH rhel8 04/13] bnxt_en: Minor formatting changes in FW devlink_health_reporter +Bugzilla: 1773724 +RH-Acked-by: Steve Best +RH-Acked-by: David Arcari +RH-Acked-by: Jarod Wilson +RH-Acked-by: John Linville + +Minor formatting changes to diagnose cb for FW devlink health +reporter. + +Suggested-by: Jiri Pirko +Cc: Jiri Pirko +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: Jakub Kicinski +(cherry picked from commit f255ed1c4e4c5ed8171b6e81dce1297df1f1b60c) +Bugzilla: 1773724 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25154853 +Tested: simple boot test +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 17 ++++++----------- + 1 file changed, 6 insertions(+), 11 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:21.942455948 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 2020-02-06 16:23:22.198453598 +0100 +@@ -29,25 +29,20 @@ + val = bnxt_fw_health_readl(bp, BNXT_FW_HEALTH_REG); + health_status = val & 0xffff; + +- if (health_status == BNXT_FW_STATUS_HEALTHY) { +- rc = devlink_fmsg_string_pair_put(fmsg, "FW status", +- "Healthy;"); +- if (rc) +- return rc; +- } else if (health_status < BNXT_FW_STATUS_HEALTHY) { +- rc = devlink_fmsg_string_pair_put(fmsg, "FW status", +- "Not yet completed initialization;"); ++ if (health_status < BNXT_FW_STATUS_HEALTHY) { ++ rc = devlink_fmsg_string_pair_put(fmsg, "Description", ++ "Not yet completed initialization"); + if (rc) + return rc; + } else if (health_status > BNXT_FW_STATUS_HEALTHY) { +- rc = devlink_fmsg_string_pair_put(fmsg, "FW status", +- "Encountered fatal error and cannot recover;"); ++ rc = devlink_fmsg_string_pair_put(fmsg, "Description", ++ "Encountered fatal error and cannot recover"); + if (rc) + return rc; + } + + if (val >> 16) { +- rc = devlink_fmsg_u32_pair_put(fmsg, "Error", val >> 16); ++ rc = devlink_fmsg_u32_pair_put(fmsg, "Error code", val >> 16); + if (rc) + return rc; + } diff --git a/SOURCES/0089-netdrv-bnxt_en-Avoid-disabling-pci-device-in-bnxt_re.patch b/SOURCES/0089-netdrv-bnxt_en-Avoid-disabling-pci-device-in-bnxt_re.patch new file mode 100644 index 0000000..6fff938 --- /dev/null +++ b/SOURCES/0089-netdrv-bnxt_en-Avoid-disabling-pci-device-in-bnxt_re.patch @@ -0,0 +1,48 @@ +From 6224dddff248c8c2870061195aed015df77bee08 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Fri, 6 Dec 2019 20:12:45 -0500 +Subject: [PATCH 89/96] [netdrv] bnxt_en: Avoid disabling pci device in + bnxt_remove_one() for already disabled device + +Message-id: +Patchwork-id: 291383 +O-Subject: [PATCH rhel8 05/13] bnxt_en: Avoid disabling pci device in bnxt_remove_one() for already disabled device. +Bugzilla: 1773724 +RH-Acked-by: Steve Best +RH-Acked-by: David Arcari +RH-Acked-by: Jarod Wilson +RH-Acked-by: John Linville + +With the recently added error recovery logic, the device may already +be disabled if the firmware recovery is unsuccessful. In +bnxt_remove_one(), check that the device is still enabled first +before calling pci_disable_device(). + +Fixes: 3bc7d4a352ef ("bnxt_en: Add BNXT_STATE_IN_FW_RESET state.") +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: Jakub Kicinski +(cherry picked from commit f6824308c4be25ba024ab942a6135aa0356acaea) +Bugzilla: 1773724 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25154853 +Tested: simple boot test +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:22.071454764 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:22.325452432 +0100 +@@ -10387,7 +10387,8 @@ + { + bnxt_unmap_bars(bp, bp->pdev); + pci_release_regions(bp->pdev); +- pci_disable_device(bp->pdev); ++ if (pci_is_enabled(bp->pdev)) ++ pci_disable_device(bp->pdev); + } + + static void bnxt_init_dflt_coal(struct bnxt *bp) diff --git a/SOURCES/0090-netdrv-broadcom-bnxt-Fix-use-true-false-for-bool.patch b/SOURCES/0090-netdrv-broadcom-bnxt-Fix-use-true-false-for-bool.patch new file mode 100644 index 0000000..305fb6d --- /dev/null +++ b/SOURCES/0090-netdrv-broadcom-bnxt-Fix-use-true-false-for-bool.patch @@ -0,0 +1,42 @@ +From 2b001e35ef1204a73e8302ca35aebd297a3af6ab Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Fri, 6 Dec 2019 20:12:46 -0500 +Subject: [PATCH 90/96] [netdrv] broadcom: bnxt: Fix use true/false for bool + +Message-id: <65bbd7dd8c315df314e739ce0ad31e8bd157e734.1575651772.git.jtoppins@redhat.com> +Patchwork-id: 291387 +O-Subject: [PATCH rhel8 06/13] broadcom: bnxt: Fix use true/false for bool +Bugzilla: 1773724 +RH-Acked-by: Steve Best +RH-Acked-by: David Arcari +RH-Acked-by: Jarod Wilson +RH-Acked-by: John Linville + +Use true/false for bool type in bnxt_timer function. + +Signed-off-by: Saurav Girepunje +Acked-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit acda6180e86ba9e0026287d65f30d1e2b0c8882a) +Bugzilla: 1773724 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25154853 +Tested: simple boot test +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:22.325452432 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:22.451451275 +0100 +@@ -10009,7 +10009,7 @@ + + if (bp->link_info.phy_retry) { + if (time_after(jiffies, bp->link_info.phy_retry_expires)) { +- bp->link_info.phy_retry = 0; ++ bp->link_info.phy_retry = false; + netdev_warn(bp->dev, "failed to update phy settings after maximum retries.\n"); + } else { + set_bit(BNXT_UPDATE_PHY_SP_EVENT, &bp->sp_event); diff --git a/SOURCES/0091-netdrv-bnxt_en-Add-support-to-invoke-OP-TEE-API-to-r.patch b/SOURCES/0091-netdrv-bnxt_en-Add-support-to-invoke-OP-TEE-API-to-r.patch new file mode 100644 index 0000000..709ec25 --- /dev/null +++ b/SOURCES/0091-netdrv-bnxt_en-Add-support-to-invoke-OP-TEE-API-to-r.patch @@ -0,0 +1,77 @@ +From 3f0777c62d6df5c01697a0061aaeba3507d356b1 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Fri, 6 Dec 2019 20:12:47 -0500 +Subject: [PATCH 91/96] [netdrv] bnxt_en: Add support to invoke OP-TEE API to + reset firmware + +Message-id: +Patchwork-id: 291374 +O-Subject: [PATCH rhel8 07/13] bnxt_en: Add support to invoke OP-TEE API to reset firmware +Bugzilla: 1773724 +RH-Acked-by: Steve Best +RH-Acked-by: David Arcari +RH-Acked-by: Jarod Wilson +RH-Acked-by: John Linville + +In error recovery process when firmware indicates that it is +completely down, initiate a firmware reset by calling OP-TEE API. + +Cc: Michael Chan +Signed-off-by: Vasundhara Volam +Signed-off-by: Sheetal Tigadoli +Signed-off-by: David S. Miller +(cherry picked from commit e07ab2021eb6b7123ec66ae1dc019afae566a56c) +Bugzilla: 1773724 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25154853 +Tested: simple boot test +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 13 +++++++++++-- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 +++ + 2 files changed, 14 insertions(+), 2 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:22.451451275 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:22.576450128 +0100 +@@ -10587,14 +10587,23 @@ + static void bnxt_reset_all(struct bnxt *bp) + { + struct bnxt_fw_health *fw_health = bp->fw_health; +- int i; ++ int i, rc; ++ ++ if (bp->fw_cap & BNXT_FW_CAP_ERR_RECOVER_RELOAD) { ++#ifdef CONFIG_TEE_BNXT_FW ++ rc = tee_bnxt_fw_load(); ++ if (rc) ++ netdev_err(bp->dev, "Unable to reset FW rc=%d\n", rc); ++ bp->fw_reset_timestamp = jiffies; ++#endif ++ return; ++ } + + if (fw_health->flags & ERROR_RECOVERY_QCFG_RESP_FLAGS_HOST) { + for (i = 0; i < fw_health->fw_reset_seq_cnt; i++) + bnxt_fw_reset_writel(bp, i); + } else if (fw_health->flags & ERROR_RECOVERY_QCFG_RESP_FLAGS_CO_CPU) { + struct hwrm_fw_reset_input req = {0}; +- int rc; + + bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FW_RESET, -1, -1); + req.resp_addr = cpu_to_le64(bp->hwrm_cmd_kong_resp_dma_addr); +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:21.672458426 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:22.576450128 +0100 +@@ -25,6 +25,9 @@ + #include + #include + #include ++#ifdef CONFIG_TEE_BNXT_FW ++#include ++#endif + + struct page_pool; + diff --git a/SOURCES/0092-netdrv-bnxt_en-Add-support-to-collect-crash-dump-via.patch b/SOURCES/0092-netdrv-bnxt_en-Add-support-to-collect-crash-dump-via.patch new file mode 100644 index 0000000..5e901b8 --- /dev/null +++ b/SOURCES/0092-netdrv-bnxt_en-Add-support-to-collect-crash-dump-via.patch @@ -0,0 +1,151 @@ +From 36a2341eb0c9dbff43d31d3ed2ac50acd1b56b47 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Fri, 6 Dec 2019 20:12:48 -0500 +Subject: [PATCH 92/96] [netdrv] bnxt_en: Add support to collect crash dump via + ethtool + +Message-id: +Patchwork-id: 291386 +O-Subject: [PATCH rhel8 08/13] bnxt_en: Add support to collect crash dump via ethtool +Bugzilla: 1773724 +RH-Acked-by: Steve Best +RH-Acked-by: David Arcari +RH-Acked-by: Jarod Wilson +RH-Acked-by: John Linville + +Driver supports 2 types of core dumps. + +1. Live dump - Firmware dump when system is up and running. +2. Crash dump - Dump which is collected during firmware crash + that can be retrieved after recovery. +Crash dump is currently supported only on specific 58800 chips +which can be retrieved using OP-TEE API only, as firmware cannot +access this region directly. + +User needs to set the dump flag using following command before +initiating the dump collection: + + $ ethtool -W|--set-dump eth0 N + +Where N is "0" for live dump and "1" for crash dump + +Command to collect the dump after setting the flag: + + $ ethtool -w eth0 data Filename + +v3: Modify set_dump to support even when CONFIG_TEE_BNXT_FW=n. +Also change log message to netdev_info(). + +Cc: Jakub Kicinski +Cc: Michael Chan +Signed-off-by: Vasundhara Volam +Signed-off-by: Sheetal Tigadoli +Signed-off-by: David S. Miller +(cherry picked from commit 0b0eacf3c83cb292c6eef55c76d5138c9302dc20) +Bugzilla: 1773724 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25154853 +Tested: simple boot test +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 ++ + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 37 +++++++++++++++++++++-- + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.h | 2 ++ + 3 files changed, 40 insertions(+), 2 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:22.576450128 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:23:22.708448916 +0100 +@@ -1807,6 +1807,9 @@ + + u8 num_leds; + struct bnxt_led_info leds[BNXT_MAX_LED]; ++ u16 dump_flag; ++#define BNXT_DUMP_LIVE 0 ++#define BNXT_DUMP_CRASH 1 + + struct bpf_prog *xdp_prog; + +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:21.412460813 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 2020-02-06 16:23:22.709448907 +0100 +@@ -3311,6 +3311,24 @@ + return rc; + } + ++static int bnxt_set_dump(struct net_device *dev, struct ethtool_dump *dump) ++{ ++ struct bnxt *bp = netdev_priv(dev); ++ ++ if (dump->flag > BNXT_DUMP_CRASH) { ++ netdev_info(dev, "Supports only Live(0) and Crash(1) dumps.\n"); ++ return -EINVAL; ++ } ++ ++ if (!IS_ENABLED(CONFIG_TEE_BNXT_FW) && dump->flag == BNXT_DUMP_CRASH) { ++ netdev_info(dev, "Cannot collect crash dump as TEE_BNXT_FW config option is not enabled.\n"); ++ return -EOPNOTSUPP; ++ } ++ ++ bp->dump_flag = dump->flag; ++ return 0; ++} ++ + static int bnxt_get_dump_flag(struct net_device *dev, struct ethtool_dump *dump) + { + struct bnxt *bp = netdev_priv(dev); +@@ -3323,7 +3341,12 @@ + bp->ver_resp.hwrm_fw_bld_8b << 8 | + bp->ver_resp.hwrm_fw_rsvd_8b; + +- return bnxt_get_coredump(bp, NULL, &dump->len); ++ dump->flag = bp->dump_flag; ++ if (bp->dump_flag == BNXT_DUMP_CRASH) ++ dump->len = BNXT_CRASH_DUMP_LEN; ++ else ++ bnxt_get_coredump(bp, NULL, &dump->len); ++ return 0; + } + + static int bnxt_get_dump_data(struct net_device *dev, struct ethtool_dump *dump, +@@ -3336,7 +3359,16 @@ + + memset(buf, 0, dump->len); + +- return bnxt_get_coredump(bp, buf, &dump->len); ++ dump->flag = bp->dump_flag; ++ if (dump->flag == BNXT_DUMP_CRASH) { ++#ifdef CONFIG_TEE_BNXT_FW ++ return tee_bnxt_copy_coredump(buf, 0, dump->len); ++#endif ++ } else { ++ return bnxt_get_coredump(bp, buf, &dump->len); ++ } ++ ++ return 0; + } + + void bnxt_ethtool_init(struct bnxt *bp) +@@ -3446,6 +3478,7 @@ + .set_phys_id = bnxt_set_phys_id, + .self_test = bnxt_self_test, + .reset = bnxt_reset, ++ .set_dump = bnxt_set_dump, + .get_dump_flag = bnxt_get_dump_flag, + .get_dump_data = bnxt_get_dump_data, + }; +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.h 2020-02-06 16:22:53.098720710 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.h 2020-02-06 16:23:22.709448907 +0100 +@@ -59,6 +59,8 @@ + #define HWRM_DBG_CMN_FLAGS_MORE 1 + }; + ++#define BNXT_CRASH_DUMP_LEN (8 << 20) ++ + #define BNXT_LED_DFLT_ENA \ + (PORT_LED_CFG_REQ_ENABLES_LED0_ID | \ + PORT_LED_CFG_REQ_ENABLES_LED0_STATE | \ diff --git a/SOURCES/0093-netdrv-bnxt-Avoid-logging-an-unnecessary-message-whe.patch b/SOURCES/0093-netdrv-bnxt-Avoid-logging-an-unnecessary-message-whe.patch new file mode 100644 index 0000000..f4bee57 --- /dev/null +++ b/SOURCES/0093-netdrv-bnxt-Avoid-logging-an-unnecessary-message-whe.patch @@ -0,0 +1,48 @@ +From fd58eda8d85adfa7b537e19b4407155cd014f76b Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Fri, 6 Dec 2019 20:12:49 -0500 +Subject: [PATCH 93/96] [netdrv] bnxt: Avoid logging an unnecessary message + when a flow can't be offloaded + +Message-id: +Patchwork-id: 291381 +O-Subject: [PATCH rhel8 09/13] bnxt: Avoid logging an unnecessary message when a flow can't be offloaded +Bugzilla: 1773724 +RH-Acked-by: Steve Best +RH-Acked-by: David Arcari +RH-Acked-by: Jarod Wilson +RH-Acked-by: John Linville + +For every single case where bnxt_tc_can_offload() can fail, we are +logging a user friendly descriptive message anyway, but because of the +path it would take in case of failure, another redundant error message +would get logged. Just freeing the node and returning from the point of +failure should suffice. + +Signed-off-by: Somnath Kotur +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 08f8280e8788202a67a359952cd436707f8789bd) +Bugzilla: 1773724 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25154853 +Tested: simple boot test +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c 2020-02-06 16:23:18.307489314 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c 2020-02-06 16:23:22.853447585 +0100 +@@ -1274,7 +1274,8 @@ + + if (!bnxt_tc_can_offload(bp, flow)) { + rc = -EOPNOTSUPP; +- goto free_node; ++ kfree_rcu(new_node, rcu); ++ return rc; + } + + /* If a flow exists with the same cookie, delete it */ diff --git a/SOURCES/0094-netdrv-bnxt_en-Improve-bnxt_ulp_stop-bnxt_ulp_start-.patch b/SOURCES/0094-netdrv-bnxt_en-Improve-bnxt_ulp_stop-bnxt_ulp_start-.patch new file mode 100644 index 0000000..5f6aaa3 --- /dev/null +++ b/SOURCES/0094-netdrv-bnxt_en-Improve-bnxt_ulp_stop-bnxt_ulp_start-.patch @@ -0,0 +1,147 @@ +From c0fca90e2368d9632e50ad92844591bb15830aa3 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Fri, 6 Dec 2019 20:12:51 -0500 +Subject: [PATCH 94/96] [netdrv] bnxt_en: Improve + bnxt_ulp_stop()/bnxt_ulp_start() call sequence + +Message-id: <9db03065554258d9fea296da3c76419aa2bbc777.1575651772.git.jtoppins@redhat.com> +Patchwork-id: 291385 +O-Subject: [PATCH rhel8 11/13] bnxt_en: Improve bnxt_ulp_stop()/bnxt_ulp_start() call sequence. +Bugzilla: 1773724 +RH-Acked-by: Steve Best +RH-Acked-by: David Arcari +RH-Acked-by: Jarod Wilson +RH-Acked-by: John Linville + +We call bnxt_ulp_stop() to notify the RDMA driver that some error or +imminent reset is about to happen. After that we always call +some variants of bnxt_close(). + +In the next patch, we will integrate the recently added error +recovery with the RDMA driver. In response to ulp_stop, the +RDMA driver may free MSIX vectors and that will also trigger +bnxt_close(). To avoid bnxt_close() from being called twice, +we set a new flag after ulp_stop is called. If the RDMA driver +frees MSIX vectors while the new flag is set, we will not call +bnxt_close(), knowing that it will happen in due course. + +With this change, we must make sure that the bnxt_close() call +after ulp_stop will reset IRQ. Modify bnxt_reset_task() +accordingly if we call ulp_stop. + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit aa46dffff452f7c6d907c4e6a0062e2c53a87fc0) +Bugzilla: 1773724 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25154853 +Tested: simple boot test +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 18 ++++++++++-------- + drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 10 ++++++++-- + drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h | 3 ++- + 3 files changed, 20 insertions(+), 11 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:22.576450128 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:22.982446401 +0100 +@@ -9932,12 +9932,15 @@ + if (netif_running(bp->dev)) { + int rc; + +- if (!silent) ++ if (silent) { ++ bnxt_close_nic(bp, false, false); ++ bnxt_open_nic(bp, false, false); ++ } else { + bnxt_ulp_stop(bp); +- bnxt_close_nic(bp, false, false); +- rc = bnxt_open_nic(bp, false, false); +- if (!silent && !rc) +- bnxt_ulp_start(bp); ++ bnxt_close_nic(bp, true, false); ++ rc = bnxt_open_nic(bp, true, false); ++ bnxt_ulp_start(bp, rc); ++ } + } + } + +@@ -12034,10 +12037,9 @@ + if (!err && netif_running(netdev)) + err = bnxt_open(netdev); + +- if (!err) { ++ if (!err) + result = PCI_ERS_RESULT_RECOVERED; +- bnxt_ulp_start(bp); +- } ++ bnxt_ulp_start(bp, err); + } + + if (result != PCI_ERS_RESULT_RECOVERED && netif_running(netdev)) +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c 2020-02-06 16:23:20.163472277 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c 2020-02-06 16:23:22.982446401 +0100 +@@ -182,7 +182,7 @@ + + edev->ulp_tbl[ulp_id].msix_requested = 0; + edev->flags &= ~BNXT_EN_FLAG_MSIX_REQUESTED; +- if (netif_running(dev)) { ++ if (netif_running(dev) && !(edev->flags & BNXT_EN_FLAG_ULP_STOPPED)) { + bnxt_close_nic(bp, true, false); + bnxt_open_nic(bp, true, false); + } +@@ -266,6 +266,7 @@ + if (!edev) + return; + ++ edev->flags |= BNXT_EN_FLAG_ULP_STOPPED; + for (i = 0; i < BNXT_MAX_ULP; i++) { + struct bnxt_ulp *ulp = &edev->ulp_tbl[i]; + +@@ -276,7 +277,7 @@ + } + } + +-void bnxt_ulp_start(struct bnxt *bp) ++void bnxt_ulp_start(struct bnxt *bp, int err) + { + struct bnxt_en_dev *edev = bp->edev; + struct bnxt_ulp_ops *ops; +@@ -285,6 +286,11 @@ + if (!edev) + return; + ++ edev->flags &= ~BNXT_EN_FLAG_ULP_STOPPED; ++ ++ if (err) ++ return; ++ + for (i = 0; i < BNXT_MAX_ULP; i++) { + struct bnxt_ulp *ulp = &edev->ulp_tbl[i]; + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h 2020-02-06 16:22:53.036721279 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h 2020-02-06 16:23:22.982446401 +0100 +@@ -64,6 +64,7 @@ + #define BNXT_EN_FLAG_ROCE_CAP (BNXT_EN_FLAG_ROCEV1_CAP | \ + BNXT_EN_FLAG_ROCEV2_CAP) + #define BNXT_EN_FLAG_MSIX_REQUESTED 0x4 ++ #define BNXT_EN_FLAG_ULP_STOPPED 0x8 + const struct bnxt_en_ops *en_ops; + struct bnxt_ulp ulp_tbl[BNXT_MAX_ULP]; + }; +@@ -92,7 +93,7 @@ + int bnxt_get_ulp_msix_base(struct bnxt *bp); + int bnxt_get_ulp_stat_ctxs(struct bnxt *bp); + void bnxt_ulp_stop(struct bnxt *bp); +-void bnxt_ulp_start(struct bnxt *bp); ++void bnxt_ulp_start(struct bnxt *bp, int err); + void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs); + void bnxt_ulp_shutdown(struct bnxt *bp); + void bnxt_ulp_irq_stop(struct bnxt *bp); diff --git a/SOURCES/0095-netdrv-bnxt_en-Call-bnxt_ulp_stop-bnxt_ulp_start-dur.patch b/SOURCES/0095-netdrv-bnxt_en-Call-bnxt_ulp_stop-bnxt_ulp_start-dur.patch new file mode 100644 index 0000000..9119dc6 --- /dev/null +++ b/SOURCES/0095-netdrv-bnxt_en-Call-bnxt_ulp_stop-bnxt_ulp_start-dur.patch @@ -0,0 +1,95 @@ +From 62709321caaafe7638f3df3f791a03dac1130b59 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Fri, 6 Dec 2019 20:12:52 -0500 +Subject: [PATCH 95/96] [netdrv] bnxt_en: Call bnxt_ulp_stop()/bnxt_ulp_start() + during error recovery + +Message-id: <6a79e26467333b7a1e9cb6e56caf1341323e69ff.1575651772.git.jtoppins@redhat.com> +Patchwork-id: 291384 +O-Subject: [PATCH rhel8 12/13] bnxt_en: Call bnxt_ulp_stop()/bnxt_ulp_start() during error recovery. +Bugzilla: 1773724 +RH-Acked-by: Steve Best +RH-Acked-by: David Arcari +RH-Acked-by: Jarod Wilson +RH-Acked-by: John Linville + +Notify the RDMA driver by calling the bnxt_ulp_stop()/bnxt_ulp_start() +hooks during error recovery. The current ULP IRQ start/stop +sequence in error recovery (which is insufficient) is replaced with the +full reset sequence when we call bnxt_ulp_stop()/bnxt_ulp_start(). + +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit f3a6d206c25ad9490f3a3c6d62baba9504227a75) +Bugzilla: 1773724 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25154853 +Tested: simple boot test +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:22.982446401 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:23.130445043 +0100 +@@ -8767,6 +8767,8 @@ + } + if (resc_reinit || fw_reset) { + if (fw_reset) { ++ if (!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) ++ bnxt_ulp_stop(bp); + rc = bnxt_fw_init_one(bp); + if (rc) { + set_bit(BNXT_STATE_ABORT_ERR, &bp->state); +@@ -9229,13 +9231,16 @@ + if (rc) { + bnxt_hwrm_if_change(bp, false); + } else { +- if (test_and_clear_bit(BNXT_STATE_FW_RESET_DET, &bp->state) && +- BNXT_PF(bp)) { +- struct bnxt_pf_info *pf = &bp->pf; +- int n = pf->active_vfs; ++ if (test_and_clear_bit(BNXT_STATE_FW_RESET_DET, &bp->state)) { ++ if (BNXT_PF(bp)) { ++ struct bnxt_pf_info *pf = &bp->pf; ++ int n = pf->active_vfs; + +- if (n) +- bnxt_cfg_hw_sriov(bp, &n, true); ++ if (n) ++ bnxt_cfg_hw_sriov(bp, &n, true); ++ } ++ if (!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) ++ bnxt_ulp_start(bp, 0); + } + bnxt_hwmon_open(bp); + } +@@ -10056,8 +10061,8 @@ + + static void bnxt_fw_reset_close(struct bnxt *bp) + { ++ bnxt_ulp_stop(bp); + __bnxt_close_nic(bp, true, false); +- bnxt_ulp_irq_stop(bp); + bnxt_clear_int_mode(bp); + bnxt_hwrm_func_drv_unrgtr(bp); + bnxt_free_ctx_mem(bp); +@@ -10737,13 +10742,13 @@ + clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state); + dev_close(bp->dev); + } +- bnxt_ulp_irq_restart(bp, rc); +- rtnl_unlock(); + + bp->fw_reset_state = 0; + /* Make sure fw_reset_state is 0 before clearing the flag */ + smp_mb__before_atomic(); + clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state); ++ bnxt_ulp_start(bp, rc); ++ rtnl_unlock(); + break; + } + return; diff --git a/SOURCES/0096-netdrv-bnxt_en-Call-bnxt_ulp_stop-bnxt_ulp_start-dur.patch b/SOURCES/0096-netdrv-bnxt_en-Call-bnxt_ulp_stop-bnxt_ulp_start-dur.patch new file mode 100644 index 0000000..956dfb4 --- /dev/null +++ b/SOURCES/0096-netdrv-bnxt_en-Call-bnxt_ulp_stop-bnxt_ulp_start-dur.patch @@ -0,0 +1,51 @@ +From c3ded828bd263b14d9a7af6e51e6d38ba83a7856 Mon Sep 17 00:00:00 2001 +From: Jonathan Toppins +Date: Fri, 6 Dec 2019 20:12:53 -0500 +Subject: [PATCH 96/96] [netdrv] bnxt_en: Call bnxt_ulp_stop()/bnxt_ulp_start() + during suspend/resume + +Message-id: <8fe101a1eefe9c4bba9c301514b692d55696ddc6.1575651772.git.jtoppins@redhat.com> +Patchwork-id: 291378 +O-Subject: [PATCH rhel8 13/13] bnxt_en: Call bnxt_ulp_stop()/bnxt_ulp_start() during suspend/resume. +Bugzilla: 1773724 +RH-Acked-by: Steve Best +RH-Acked-by: David Arcari +RH-Acked-by: Jarod Wilson +RH-Acked-by: John Linville + +Inform the RDMA driver to stop/start during suspend/resume. The +RDMA driver needs to stop and start just like error recovery. + +Signed-off-by: Pavan Chebbi +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +(cherry picked from commit 6a68749dbd777b832e1d84265bd6d8b39d1843ac) +Bugzilla: 1773724 +Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=25154853 +Tested: simple boot test +Signed-off-by: Jonathan Toppins +Signed-off-by: Bruno Meneguele +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 ++ + 1 file changed, 2 insertions(+) + +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.c +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:23.130445043 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.c 2020-02-06 16:23:23.267443785 +0100 +@@ -11929,6 +11929,7 @@ + int rc = 0; + + rtnl_lock(); ++ bnxt_ulp_stop(bp); + if (netif_running(dev)) { + netif_device_detach(dev); + rc = bnxt_close(dev); +@@ -11963,6 +11964,7 @@ + } + + resume_exit: ++ bnxt_ulp_start(bp, rc); + rtnl_unlock(); + return rc; + } diff --git a/SOURCES/9000-bump-driver-version.patch b/SOURCES/9000-bump-driver-version.patch new file mode 100644 index 0000000..4646b2b --- /dev/null +++ b/SOURCES/9000-bump-driver-version.patch @@ -0,0 +1,13 @@ +Index: src/drivers/net/ethernet/broadcom/bnxt/bnxt.h +=================================================================== +--- src.orig/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:26:49.709548812 +0100 ++++ src/drivers/net/ethernet/broadcom/bnxt/bnxt.h 2020-02-06 16:57:36.951721112 +0100 +@@ -12,7 +12,7 @@ + #define BNXT_H + + #define DRV_MODULE_NAME "bnxt_en" +-#define DRV_MODULE_VERSION "1.10.0" ++#define DRV_MODULE_VERSION "1.10.0_dup8.1" + + #define DRV_VER_MAJ 1 + #define DRV_VER_MIN 10 diff --git a/SPECS/bnxt_en.spec b/SPECS/bnxt_en.spec new file mode 100644 index 0000000..4e0922f --- /dev/null +++ b/SPECS/bnxt_en.spec @@ -0,0 +1,467 @@ +%define kmod_name bnxt_en +%define kmod_vendor redhat +%define kmod_driver_version 1.10.0_dup8.1 +%define kmod_driver_epoch %{nil} +%define kmod_rpm_release 2 +%define kmod_kernel_version 4.18.0-147.el8 +%define kmod_kernel_version_min %{nil} +%define kmod_kernel_version_dep %{nil} +%define kmod_kbuild_dir drivers/net/ethernet/broadcom/bnxt +%define kmod_dependencies %{nil} +%define kmod_dist_build_deps %{nil} +%define kmod_build_dependencies %{nil} +%define kmod_devel_package 0 +%define kmod_install_path extra/kmod-redhat-bnxt_en +%define kernel_pkg kernel +%define kernel_devel_pkg kernel-devel +%define kernel_modules_pkg kernel-modules + +%{!?dist: %define dist .el8_1} +%{!?make_build: %define make_build make} + +%if "%{kmod_kernel_version_dep}" == "" +%define kmod_kernel_version_dep %{kmod_kernel_version} +%endif + +%if "%{kmod_dist_build_deps}" == "" +%if (0%{?rhel} > 7) || (0%{?centos} > 7) +%define kmod_dist_build_deps redhat-rpm-config kernel-abi-whitelists elfutils-libelf-devel kernel-rpm-macros kmod +%else +%define kmod_dist_build_deps redhat-rpm-config kernel-abi-whitelists +%endif +%endif + +Source0: %{kmod_name}-%{kmod_vendor}-%{kmod_driver_version}.tar.bz2 +# Source code patches +Patch0: 0001-netdrv-linux-dim-Fix-overflow-in-dim-calculation.patch +Patch1: 0002-netdrv-bnxt_en-Add-bnxt_en-initial-port-params-table.patch +Patch2: 0003-netdrv-revert-devlink-Add-a-generic-wake_on_lan-port.patch +Patch3: 0004-netdrv-bnxt-add-missing-net-devlink.h-include.patch +Patch4: 0005-netdrv-bnxt-set-devlink-port-attrs-properly.patch +Patch5: 0006-netdrv-bnxt-call-devlink_port_type_eth_set-before-po.patch +Patch6: 0007-netdrv-bnxt-set-devlink-port-type-after-registration.patch +Patch7: 0009-netdrv-bnx2x-Mark-expected-switch-fall-throughs.patch +Patch8: 0010-netdrv-bnx2x-Mark-expected-switch-fall-thoughs.patch +Patch9: 0011-netdrv-bnxt_en-Fix-firmware-signaled-resource-change.patch +Patch10: 0012-netdrv-cross-tree-phase-out-dma_zalloc_coherent.patch +Patch11: 0013-netdrv-bnxt-Implement-ndo_get_port_parent_id.patch +Patch12: 0016-netdrv-bnxt-move-bp-switch_id-initialization-to-PF-p.patch +Patch13: 0018-netdrv-bnxt_en-Update-firmware-interface-to-1.10.0.6.patch +Patch14: 0019-netdrv-bnxt_en-Refactor-bnxt_alloc_stats.patch +Patch15: 0020-netdrv-bnxt_en-Add-support-for-PCIe-statistics.patch +Patch16: 0021-netdrv-bnxt_en-Check-new-firmware-capability-to-disp.patch +Patch17: 0022-netdrv-bnxt_en-Read-package-version-from-firmware.patch +Patch18: 0023-netdrv-bnxt_en-read-the-clause-type-from-the-PHY-ID.patch +Patch19: 0024-netdrv-bnxt_en-Separate-RDMA-MR-AH-context-allocatio.patch +Patch20: 0025-netdrv-bnxt_en-Query-firmware-capability-to-support-.patch +Patch21: 0026-netdrv-bnxt_en-Add-support-for-aRFS-on-57500-chips.patch +Patch22: 0027-netdrv-bnxt_en-Device-serial-number-is-supported-onl.patch +Patch23: 0028-netdrv-bnxt_en-rename-some-xdp-functions.patch +Patch24: 0029-netdrv-bnxt_en-Refactor-__bnxt_xmit_xdp.patch +Patch25: 0030-netdrv-bnxt_en-optimized-XDP_REDIRECT-support.patch +Patch26: 0031-netdrv-bnxt_en-add-page_pool-support.patch +Patch27: 0032-netdrv-bnxt_en-Add-page_pool_destroy-during-RX-ring-.patch +Patch28: 0033-netdrv-bnxt_en-Fix-VNIC-accounting-when-enabling-aRF.patch +Patch29: 0034-netdrv-bnxt_en-Fix-VNIC-clearing-logic-for-57500-chi.patch +Patch30: 0035-netdrv-bnxt_en-Improve-RX-doorbell-sequence.patch +Patch31: 0036-netdrv-bnxt_en-Fix-handling-FRAG_ERR-when-NVM_INSTAL.patch +Patch32: 0037-netdrv-bnxt_en-Use-correct-src_fid-to-determine-dire.patch +Patch33: 0038-netdrv-bnxt_en-Fix-to-include-flow-direction-in-L2-k.patch +Patch34: 0039-netdrv-bnxt_en-Suppress-HWRM-errors-for-HWRM_NVM_GET.patch +Patch35: 0040-netdrv-bnxt_en-Update-firmware-interface-spec.-to-1..patch +Patch36: 0041-netdrv-bnxt_en-Add-TPA-structure-definitions-for-BCM.patch +Patch37: 0042-netdrv-bnxt_en-Refactor-TPA-logic.patch +Patch38: 0043-netdrv-bnxt_en-Expand-bnxt_tpa_info-struct-to-suppor.patch +Patch39: 0044-netdrv-bnxt_en-Handle-standalone-RX_AGG-completions.patch +Patch40: 0045-netdrv-bnxt_en-Refactor-tunneled-hardware-GRO-logic.patch +Patch41: 0046-netdrv-bnxt_en-Set-TPA-GRO-mode-flags-on-57500-chips.patch +Patch42: 0047-netdrv-bnxt_en-Add-fast-path-logic-for-TPA-on-57500-.patch +Patch43: 0048-netdrv-bnxt_en-Add-TPA-ID-mapping-logic-for-57500-ch.patch +Patch44: 0049-netdrv-bnxt_en-Add-hardware-GRO-setup-function-for-5.patch +Patch45: 0050-netdrv-bnxt_en-Refactor-ethtool-ring-statistics-logi.patch +Patch46: 0051-netdrv-bnxt_en-Allocate-the-larger-per-ring-statisti.patch +Patch47: 0052-netdrv-bnxt_en-Support-TPA-counters-on-57500-chips.patch +Patch48: 0053-netdrv-bnxt_en-Refactor-bnxt_init_one-and-turn-on-TP.patch +Patch49: 0054-netdrv-bnxt_en-Support-all-variants-of-the-5750X-chi.patch +Patch50: 0055-netdrv-bnxt_en-Add-PCI-IDs-for-57500-series-NPAR-dev.patch +Patch51: 0056-netdrv-bnxt-no-need-to-check-return-value-of-debugfs.patch +Patch52: 0057-netdrv-bnxt_en-Fix-allocation-of-zero-statistics-blo.patch +Patch53: 0058-netdrv-bnxt_en-Use-a-common-function-to-print-the-sa.patch +Patch54: 0059-netdrv-bnxt_en-Remove-the-1-error-return-code-from-b.patch +Patch55: 0060-netdrv-bnxt_en-Convert-error-code-in-firmware-messag.patch +Patch56: 0061-netdrv-bnxt_en-Simplify-error-checking-in-the-SR-IOV.patch +Patch57: 0062-netdrv-bnxt_en-Suppress-all-error-messages-in-hwrm_d.patch +Patch58: 0063-netdrv-bnxt_en-Prepare-bnxt_init_one-to-be-called-mu.patch +Patch59: 0064-netdrv-bnxt_en-Refactor-bnxt_sriov_enable.patch +Patch60: 0065-netdrv-bnxt_en-Register-buffers-for-VFs-before-reser.patch +Patch61: 0066-netdrv-bnxt_en-Handle-firmware-reset-status-during-I.patch +Patch62: 0067-netdrv-bnxt_en-Discover-firmware-error-recovery-capa.patch +Patch63: 0068-netdrv-bnxt_en-Pre-map-the-firmware-health-monitorin.patch +Patch64: 0069-netdrv-bnxt_en-Enable-health-monitoring.patch +Patch65: 0070-netdrv-bnxt_en-Add-BNXT_STATE_IN_FW_RESET-state.patch +Patch66: 0071-netdrv-bnxt_en-Add-new-FW-devlink_health_reporter.patch +Patch67: 0072-netdrv-bnxt_en-Handle-RESET_NOTIFY-async-event-from-.patch +Patch68: 0073-netdrv-bnxt_en-Handle-firmware-reset.patch +Patch69: 0074-netdrv-bnxt_en-Add-devlink-health-reset-reporter.patch +Patch70: 0075-netdrv-bnxt_en-Retain-user-settings-on-a-VF-after-RE.patch +Patch71: 0076-netdrv-bnxt_en-Do-not-send-firmware-messages-if-firm.patch +Patch72: 0077-netdrv-bnxt_en-Add-RESET_FW-state-logic-to-bnxt_fw_r.patch +Patch73: 0078-netdrv-bnxt_en-Add-bnxt_fw_exception-to-handle-fatal.patch +Patch74: 0079-netdrv-bnxt_en-Add-FW-fatal-devlink_health_reporter.patch +Patch75: 0080-netdrv-bnxt_en-Fix-compile-error-regression-with-CON.patch +Patch76: 0081-netdrv-bnxt_en-Don-t-proceed-in-.ndo_set_rx_mode-whe.patch +Patch77: 0082-netdrv-bnxt_en-Increase-timeout-for-HWRM_DBG_COREDUM.patch +Patch78: 0083-netdrv-bnxt_en-Update-firmware-interface-spec.-to-1..patch +Patch79: 0084-netdrv-bnxt_en-Add-a-new-BNXT_FW_RESET_STATE_POLL_FW.patch +Patch80: 0085-netdrv-bnxt_en-Fix-the-size-of-devlink-MSIX-paramete.patch +Patch81: 0086-netdrv-bnxt_en-Fix-devlink-NVRAM-related-byte-order-.patch +Patch82: 0087-netdrv-bnxt_en-Adjust-the-time-to-wait-before-pollin.patch +Patch83: 0088-netdrv-bnxt_en-Minor-formatting-changes-in-FW-devlin.patch +Patch84: 0089-netdrv-bnxt_en-Avoid-disabling-pci-device-in-bnxt_re.patch +Patch85: 0090-netdrv-broadcom-bnxt-Fix-use-true-false-for-bool.patch +Patch86: 0091-netdrv-bnxt_en-Add-support-to-invoke-OP-TEE-API-to-r.patch +Patch87: 0092-netdrv-bnxt_en-Add-support-to-collect-crash-dump-via.patch +Patch88: 0093-netdrv-bnxt-Avoid-logging-an-unnecessary-message-whe.patch +Patch89: 0094-netdrv-bnxt_en-Improve-bnxt_ulp_stop-bnxt_ulp_start-.patch +Patch90: 0095-netdrv-bnxt_en-Call-bnxt_ulp_stop-bnxt_ulp_start-dur.patch +Patch91: 0096-netdrv-bnxt_en-Call-bnxt_ulp_stop-bnxt_ulp_start-dur.patch +Patch92: 9000-bump-driver-version.patch + +%define findpat %( echo "%""P" ) +%define __find_requires /usr/lib/rpm/redhat/find-requires.ksyms +%define __find_provides /usr/lib/rpm/redhat/find-provides.ksyms %{kmod_name} %{?epoch:%{epoch}:}%{version}-%{release} +%define sbindir %( if [ -d "/sbin" -a \! -h "/sbin" ]; then echo "/sbin"; else echo %{_sbindir}; fi ) +%define dup_state_dir %{_localstatedir}/lib/rpm-state/kmod-dups +%define kver_state_dir %{dup_state_dir}/kver +%define kver_state_file %{kver_state_dir}/%{kmod_kernel_version}.%(arch) +%define dup_module_list %{dup_state_dir}/rpm-kmod-%{kmod_name}-modules + +Name: kmod-redhat-bnxt_en +Version: %{kmod_driver_version} +Release: %{kmod_rpm_release}%{?dist} +%if "%{kmod_driver_epoch}" != "" +Epoch: %{kmod_driver_epoch} +%endif +Summary: bnxt_en kernel module for Driver Update Program +Group: System/Kernel +License: GPLv2 +URL: https://www.kernel.org/ +BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) +BuildRequires: %kernel_devel_pkg = %kmod_kernel_version +%if "%{kmod_dist_build_deps}" != "" +BuildRequires: %{kmod_dist_build_deps} +%endif +ExclusiveArch: x86_64 +%global kernel_source() /usr/src/kernels/%{kmod_kernel_version}.$(arch) + +%global _use_internal_dependency_generator 0 +%if "%{?kmod_kernel_version_min}" != "" +Provides: %kernel_modules_pkg >= %{kmod_kernel_version_min}.%{_target_cpu} +%else +Provides: %kernel_modules_pkg = %{kmod_kernel_version_dep}.%{_target_cpu} +%endif +Provides: kmod-%{kmod_name} = %{?epoch:%{epoch}:}%{version}-%{release} +Requires(post): %{sbindir}/weak-modules +Requires(postun): %{sbindir}/weak-modules +Requires: kernel >= 4.18.0-147.el8 + +Requires: kernel < 4.18.0-148.el8 +%if 0 +Requires: firmware(%{kmod_name}) = ENTER_FIRMWARE_VERSION +%endif +%if "%{kmod_build_dependencies}" != "" +BuildRequires: %{kmod_build_dependencies} +%endif +%if "%{kmod_dependencies}" != "" +Requires: %{kmod_dependencies} +%endif +# if there are multiple kmods for the same driver from different vendors, +# they should conflict with each other. +Conflicts: kmod-%{kmod_name} + +%description +bnxt_en kernel module for Driver Update Program + +%if 0 + +%package -n kmod-redhat-bnxt_en-firmware +Version: ENTER_FIRMWARE_VERSION +Summary: bnxt_en firmware for Driver Update Program +Provides: firmware(%{kmod_name}) = ENTER_FIRMWARE_VERSION +%if "%{kmod_kernel_version_min}" != "" +Provides: %kernel_modules_pkg >= %{kmod_kernel_version_min}.%{_target_cpu} +%else +Provides: %kernel_modules_pkg = %{kmod_kernel_version_dep}.%{_target_cpu} +%endif +%description -n kmod-redhat-bnxt_en-firmware +bnxt_en firmware for Driver Update Program + + +%files -n kmod-redhat-bnxt_en-firmware +%defattr(644,root,root,755) +%{FIRMWARE_FILES} + +%endif + +# Development package +%if 0%{kmod_devel_package} +%package -n kmod-redhat-bnxt_en-devel +Version: %{kmod_driver_version} +Requires: kernel >= 4.18.0-147.el8 + +Requires: kernel < 4.18.0-148.el8 +Summary: bnxt_en development files for Driver Update Program + +%description -n kmod-redhat-bnxt_en-devel +bnxt_en development files for Driver Update Program + + +%files -n kmod-redhat-bnxt_en-devel +%defattr(644,root,root,755) +/usr/share/kmod-%{kmod_vendor}-%{kmod_name}/Module.symvers +%endif + +%post +modules=( $(find /lib/modules/%{kmod_kernel_version}.%(arch)/%{kmod_install_path} | grep '\.ko$') ) +printf '%s\n' "${modules[@]}" | %{sbindir}/weak-modules --add-modules --no-initramfs + +mkdir -p "%{kver_state_dir}" +touch "%{kver_state_file}" + +exit 0 + +%posttrans +# We have to re-implement part of weak-modules here because it doesn't allow +# calling initramfs regeneration separately +if [ -f "%{kver_state_file}" ]; then + kver_base="%{kmod_kernel_version_dep}" + kvers=$(ls -d "/lib/modules/${kver_base%%.*}"*) + + for k_dir in $kvers; do + k="${k_dir#/lib/modules/}" + + tmp_initramfs="/boot/initramfs-$k.tmp" + dst_initramfs="/boot/initramfs-$k.img" + + # The same check as in weak-modules: we assume that the kernel present + # if the symvers file exists. + if [ -e "/boot/symvers-$k.gz" ]; then + /usr/bin/dracut -f "$tmp_initramfs" "$k" || exit 1 + cmp -s "$tmp_initramfs" "$dst_initramfs" + if [ "$?" = 1 ]; then + mv "$tmp_initramfs" "$dst_initramfs" + else + rm -f "$tmp_initramfs" + fi + fi + done + + rm -f "%{kver_state_file}" + rmdir "%{kver_state_dir}" 2> /dev/null +fi + +rmdir "%{dup_state_dir}" 2> /dev/null + +exit 0 + +%preun +if rpm -q --filetriggers kmod 2> /dev/null| grep -q "Trigger for weak-modules call on kmod removal"; then + mkdir -p "%{kver_state_dir}" + touch "%{kver_state_file}" +fi + +mkdir -p "%{dup_state_dir}" +rpm -ql kmod-redhat-bnxt_en-%{kmod_driver_version}-%{kmod_rpm_release}%{?dist}.$(arch) | \ + grep '\.ko$' > "%{dup_module_list}" + +%postun +if rpm -q --filetriggers kmod 2> /dev/null| grep -q "Trigger for weak-modules call on kmod removal"; then + initramfs_opt="--no-initramfs" +else + initramfs_opt="" +fi + +modules=( $(cat "%{dup_module_list}") ) +rm -f "%{dup_module_list}" +printf '%s\n' "${modules[@]}" | %{sbindir}/weak-modules --remove-modules $initramfs_opt + +rmdir "%{dup_state_dir}" 2> /dev/null + +exit 0 + +%files +%defattr(644,root,root,755) +/lib/modules/%{kmod_kernel_version}.%(arch) +/etc/depmod.d/%{kmod_name}.conf +/usr/share/doc/kmod-%{kmod_name}/greylist.txt + +%prep +%setup -n %{kmod_name}-%{kmod_vendor}-%{kmod_driver_version} + +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 +%patch14 -p1 +%patch15 -p1 +%patch16 -p1 +%patch17 -p1 +%patch18 -p1 +%patch19 -p1 +%patch20 -p1 +%patch21 -p1 +%patch22 -p1 +%patch23 -p1 +%patch24 -p1 +%patch25 -p1 +%patch26 -p1 +%patch27 -p1 +%patch28 -p1 +%patch29 -p1 +%patch30 -p1 +%patch31 -p1 +%patch32 -p1 +%patch33 -p1 +%patch34 -p1 +%patch35 -p1 +%patch36 -p1 +%patch37 -p1 +%patch38 -p1 +%patch39 -p1 +%patch40 -p1 +%patch41 -p1 +%patch42 -p1 +%patch43 -p1 +%patch44 -p1 +%patch45 -p1 +%patch46 -p1 +%patch47 -p1 +%patch48 -p1 +%patch49 -p1 +%patch50 -p1 +%patch51 -p1 +%patch52 -p1 +%patch53 -p1 +%patch54 -p1 +%patch55 -p1 +%patch56 -p1 +%patch57 -p1 +%patch58 -p1 +%patch59 -p1 +%patch60 -p1 +%patch61 -p1 +%patch62 -p1 +%patch63 -p1 +%patch64 -p1 +%patch65 -p1 +%patch66 -p1 +%patch67 -p1 +%patch68 -p1 +%patch69 -p1 +%patch70 -p1 +%patch71 -p1 +%patch72 -p1 +%patch73 -p1 +%patch74 -p1 +%patch75 -p1 +%patch76 -p1 +%patch77 -p1 +%patch78 -p1 +%patch79 -p1 +%patch80 -p1 +%patch81 -p1 +%patch82 -p1 +%patch83 -p1 +%patch84 -p1 +%patch85 -p1 +%patch86 -p1 +%patch87 -p1 +%patch88 -p1 +%patch89 -p1 +%patch90 -p1 +%patch91 -p1 +%patch92 -p1 +set -- * +mkdir source +mv "$@" source/ +mkdir obj + +%build +rm -rf obj +cp -r source obj + +PWD_PATH="$PWD" +%if "%{workaround_no_pwd_rel_path}" != "1" +PWD_PATH=$(realpath --relative-to="%{kernel_source}" . 2>/dev/null || echo "$PWD") +%endif +%{make_build} -C %{kernel_source} V=1 M="$PWD_PATH/obj/%{kmod_kbuild_dir}" \ + NOSTDINC_FLAGS="-I$PWD_PATH/obj/include -I$PWD_PATH/obj/include/uapi" \ + EXTRA_CFLAGS="%{nil}" \ + %{nil} +# mark modules executable so that strip-to-file can strip them +find obj/%{kmod_kbuild_dir} -name "*.ko" -type f -exec chmod u+x '{}' + + +whitelist="/lib/modules/kabi-current/kabi_whitelist_%{_target_cpu}" +for modules in $( find obj/%{kmod_kbuild_dir} -name "*.ko" -type f -printf "%{findpat}\n" | sed 's|\.ko$||' | sort -u ) ; do + # update depmod.conf + module_weak_path=$(echo "$modules" | sed 's/[\/]*[^\/]*$//') + if [ -z "$module_weak_path" ]; then + module_weak_path=%{name} + else + module_weak_path=%{name}/$module_weak_path + fi + echo "override $(echo $modules | sed 's/.*\///')" \ + "$(echo "%{kmod_kernel_version_dep}" | + sed 's/\.[^\.]*$//; + s/\([.+?^$\/\\|()\[]\|\]\)/\\\0/g').*" \ + "weak-updates/$module_weak_path" >> source/depmod.conf + + # update greylist + nm -u obj/%{kmod_kbuild_dir}/$modules.ko | sed 's/.*U //' | sed 's/^\.//' | sort -u | while read -r symbol; do + grep -q "^\s*$symbol\$" $whitelist || echo "$symbol" >> source/greylist + done +done +sort -u source/greylist | uniq > source/greylist.txt + +%install +export INSTALL_MOD_PATH=$RPM_BUILD_ROOT +export INSTALL_MOD_DIR=%{kmod_install_path} +PWD_PATH="$PWD" +%if "%{workaround_no_pwd_rel_path}" != "1" +PWD_PATH=$(realpath --relative-to="%{kernel_source}" . 2>/dev/null || echo "$PWD") +%endif +make -C %{kernel_source} modules_install \ + M=$PWD_PATH/obj/%{kmod_kbuild_dir} +# Cleanup unnecessary kernel-generated module dependency files. +find $INSTALL_MOD_PATH/lib/modules -iname 'modules.*' -exec rm {} \; + +install -m 644 -D source/depmod.conf $RPM_BUILD_ROOT/etc/depmod.d/%{kmod_name}.conf +install -m 644 -D source/greylist.txt $RPM_BUILD_ROOT/usr/share/doc/kmod-%{kmod_name}/greylist.txt +%if 0 +%{FIRMWARE_FILES_INSTALL} +%endif +%if 0%{kmod_devel_package} +install -m 644 -D $PWD/obj/%{kmod_kbuild_dir}/Module.symvers $RPM_BUILD_ROOT/usr/share/kmod-%{kmod_vendor}-%{kmod_name}/Module.symvers +%endif + +%clean +rm -rf $RPM_BUILD_ROOT + +%changelog +* Wed Feb 19 2020 Eugene Syromiatnikov 1.10.0_dup8.1-2 +- Bump release. + +* Tue Feb 18 2020 Eugene Syromiatnikov 1.10.0_dup8.1-1 +- 9158390ccae759c2c0221de6e0c9541375a480f6 +- bnxt_en kernel module for Driver Update Program +- Resolves: #bz1802054