* [PATCH net-next 1/6] bnxt_en: Use FW defined resource limits for RoCE
2024-12-15 20:59 [PATCH net-next 0/6] bnxt_en: Driver update Michael Chan
@ 2024-12-15 20:59 ` Michael Chan
2024-12-15 20:59 ` [PATCH net-next 2/6] bnxt_en: Do not allow ethtool -m on an untrusted VF Michael Chan
` (4 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Michael Chan @ 2024-12-15 20:59 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, kuba, pabeni, andrew+netdev, pavan.chebbi,
andrew.gospodarek, Hongguang Gao, Damodharam Ammepalli, Kalesh AP,
Selvin Xavier
From: Hongguang Gao <hongguang.gao@broadcom.com>
If FW supports setting resource limits for RoCE, then just use the
FW limits instead of using some fixed values in the driver. These
limits will be used to allocate context memory for QP, SRQ, AH, and
MR resources for RoCE.
Reviewed-by: Damodharam Ammepalli <damodharam.ammepalli@broadcom.com>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Hongguang Gao <hongguang.gao@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
---
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 41 +++++++++++++------
drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 ++
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 2 +
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h | 2 +
4 files changed, 36 insertions(+), 12 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index b86f980fa7ea..469352ac1f7e 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -9117,10 +9117,18 @@ static int bnxt_alloc_ctx_mem(struct bnxt *bp)
ena = 0;
if ((bp->flags & BNXT_FLAG_ROCE_CAP) && !is_kdump_kernel()) {
pg_lvl = 2;
- extra_qps = min_t(u32, 65536, max_qps - l2_qps - qp1_qps);
- /* allocate extra qps if fw supports RoCE fast qp destroy feature */
- extra_qps += fast_qpmd_qps;
- extra_srqs = min_t(u32, 8192, max_srqs - srqs);
+ if (BNXT_SW_RES_LMT(bp)) {
+ extra_qps = max_qps - l2_qps - qp1_qps;
+ extra_srqs = max_srqs - srqs;
+ } else {
+ extra_qps = min_t(u32, 65536,
+ max_qps - l2_qps - qp1_qps);
+ /* allocate extra qps if fw supports RoCE fast qp
+ * destroy feature
+ */
+ extra_qps += fast_qpmd_qps;
+ extra_srqs = min_t(u32, 8192, max_srqs - srqs);
+ }
if (fast_qpmd_qps)
ena |= FUNC_BACKING_STORE_CFG_REQ_ENABLES_QP_FAST_QPMD;
}
@@ -9156,14 +9164,20 @@ static int bnxt_alloc_ctx_mem(struct bnxt *bp)
goto skip_rdma;
ctxm = &ctx->ctx_arr[BNXT_CTX_MRAV];
- /* 128K extra is needed to accommodate static AH context
- * allocation by f/w.
- */
- num_mr = min_t(u32, ctxm->max_entries / 2, 1024 * 256);
- num_ah = min_t(u32, num_mr, 1024 * 128);
- ctxm->split_entry_cnt = BNXT_CTX_MRAV_AV_SPLIT_ENTRY + 1;
- if (!ctxm->mrav_av_entries || ctxm->mrav_av_entries > num_ah)
- ctxm->mrav_av_entries = num_ah;
+ if (BNXT_SW_RES_LMT(bp) &&
+ ctxm->split_entry_cnt == BNXT_CTX_MRAV_AV_SPLIT_ENTRY + 1) {
+ num_ah = ctxm->mrav_av_entries;
+ num_mr = ctxm->max_entries - num_ah;
+ } else {
+ /* 128K extra is needed to accommodate static AH context
+ * allocation by f/w.
+ */
+ num_mr = min_t(u32, ctxm->max_entries / 2, 1024 * 256);
+ num_ah = min_t(u32, num_mr, 1024 * 128);
+ ctxm->split_entry_cnt = BNXT_CTX_MRAV_AV_SPLIT_ENTRY + 1;
+ if (!ctxm->mrav_av_entries || ctxm->mrav_av_entries > num_ah)
+ ctxm->mrav_av_entries = num_ah;
+ }
rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, num_mr + num_ah, 2);
if (rc)
@@ -9470,6 +9484,9 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
bp->flags |= BNXT_FLAG_UDP_GSO_CAP;
if (flags_ext2 & FUNC_QCAPS_RESP_FLAGS_EXT2_TX_PKT_TS_CMPL_SUPPORTED)
bp->fw_cap |= BNXT_FW_CAP_TX_TS_CMP;
+ if (flags_ext2 &
+ FUNC_QCAPS_RESP_FLAGS_EXT2_SW_MAX_RESOURCE_LIMITS_SUPPORTED)
+ bp->fw_cap |= BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS;
if (BNXT_PF(bp) &&
(flags_ext2 & FUNC_QCAPS_RESP_FLAGS_EXT2_ROCE_VF_RESOURCE_MGMT_SUPPORTED))
bp->fw_cap |= BNXT_FW_CAP_ROCE_VF_RESC_MGMT_SUPPORTED;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index 7df7a2233307..3e20d200da62 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -2482,6 +2482,7 @@ struct bnxt {
#define BNXT_FW_CAP_CFA_NTUPLE_RX_EXT_IP_PROTO BIT_ULL(38)
#define BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V3 BIT_ULL(39)
#define BNXT_FW_CAP_VNIC_RE_FLUSH BIT_ULL(40)
+ #define BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS BIT_ULL(41)
u32 fw_dbg_cap;
@@ -2501,6 +2502,8 @@ struct bnxt {
((bp)->fw_cap & BNXT_FW_CAP_ENABLE_RDMA_SRIOV)
#define BNXT_ROCE_VF_RESC_CAP(bp) \
((bp)->fw_cap & BNXT_FW_CAP_ROCE_VF_RESC_MGMT_SUPPORTED)
+#define BNXT_SW_RES_LMT(bp) \
+ ((bp)->fw_cap & BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS)
u32 hwrm_spec_code;
u16 hwrm_cmd_seq;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
index b771c84cdd89..94c6a0928ca0 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
@@ -416,6 +416,8 @@ static void bnxt_set_edev_info(struct bnxt_en_dev *edev, struct bnxt *bp)
edev->flags |= BNXT_EN_FLAG_VF;
if (BNXT_ROCE_VF_RESC_CAP(bp))
edev->flags |= BNXT_EN_FLAG_ROCE_VF_RES_MGMT;
+ if (BNXT_SW_RES_LMT(bp))
+ edev->flags |= BNXT_EN_FLAG_SW_RES_LMT;
edev->chip_num = bp->chip_num;
edev->hw_ring_stats_size = bp->hw_ring_stats_size;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
index 5d6aac60f236..54ad9f8273d7 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
@@ -65,6 +65,8 @@ struct bnxt_en_dev {
#define BNXT_EN_FLAG_VF 0x10
#define BNXT_EN_VF(edev) ((edev)->flags & BNXT_EN_FLAG_VF)
#define BNXT_EN_FLAG_ROCE_VF_RES_MGMT 0x20
+ #define BNXT_EN_FLAG_SW_RES_LMT 0x40
+#define BNXT_EN_SW_RES_LMT(edev) ((edev)->flags & BNXT_EN_FLAG_SW_RES_LMT)
struct bnxt_ulp *ulp_tbl;
int l2_db_size; /* Doorbell BAR size in
--
2.30.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH net-next 2/6] bnxt_en: Do not allow ethtool -m on an untrusted VF
2024-12-15 20:59 [PATCH net-next 0/6] bnxt_en: Driver update Michael Chan
2024-12-15 20:59 ` [PATCH net-next 1/6] bnxt_en: Use FW defined resource limits for RoCE Michael Chan
@ 2024-12-15 20:59 ` Michael Chan
2024-12-16 14:25 ` kernel test robot
2024-12-16 14:50 ` Ido Schimmel
2024-12-15 20:59 ` [PATCH net-next 3/6] bnxt_en: Skip PHY loopback ethtool selftest if unsupported by FW Michael Chan
` (3 subsequent siblings)
5 siblings, 2 replies; 10+ messages in thread
From: Michael Chan @ 2024-12-15 20:59 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, kuba, pabeni, andrew+netdev, pavan.chebbi,
andrew.gospodarek, Kalesh AP
Block all ethtool module operations on an untrusted VF. The firmware
won't allow it and will return error.
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
---
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 4 ++++
drivers/net/ethernet/broadcom/bnxt/bnxt.h | 5 +++++
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 9 +++++++++
3 files changed, 18 insertions(+)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 469352ac1f7e..631dbda725ab 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -8284,6 +8284,10 @@ static int bnxt_hwrm_func_qcfg(struct bnxt *bp)
struct bnxt_vf_info *vf = &bp->vf;
vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK;
+ if (flags & FUNC_QCFG_RESP_FLAGS_TRUSTED_VF)
+ vf->flags |= BNXT_VF_TRUST;
+ else
+ vf->flags &= ~BNXT_VF_TRUST;
} else {
bp->pf.registered_vfs = le16_to_cpu(resp->registered_vfs);
}
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index 3e20d200da62..d5e81e008ab5 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -2270,6 +2270,11 @@ struct bnxt {
#define BNXT_PF(bp) (!((bp)->flags & BNXT_FLAG_VF))
#define BNXT_VF(bp) ((bp)->flags & BNXT_FLAG_VF)
+#ifdef CONFIG_BNXT_SRIOV
+#define BNXT_VF_IS_TRUSTED(bp) ((bp)->vf.flags & BNXT_VF_TRUST)
+#else
+#define BNXT_VF_IS_TRUSTED(bp) 0
+#endif
#define BNXT_NPAR(bp) ((bp)->port_partition_type)
#define BNXT_MH(bp) ((bp)->flags & BNXT_FLAG_MULTI_HOST)
#define BNXT_SINGLE_PF(bp) (BNXT_PF(bp) && !BNXT_NPAR(bp) && !BNXT_MH(bp))
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
index d87681d71106..8de488f7cb6b 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
@@ -4375,6 +4375,9 @@ static int bnxt_get_module_info(struct net_device *dev,
struct bnxt *bp = netdev_priv(dev);
int rc;
+ if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp))
+ return -EPERM;
+
/* No point in going further if phy status indicates
* module is not inserted or if it is powered down or
* if it is of type 10GBase-T
@@ -4426,6 +4429,9 @@ static int bnxt_get_module_eeprom(struct net_device *dev,
u16 start = eeprom->offset, length = eeprom->len;
int rc = 0;
+ if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp))
+ return -EPERM;
+
memset(data, 0, eeprom->len);
/* Read A0 portion of the EEPROM */
@@ -4480,6 +4486,9 @@ static int bnxt_get_module_eeprom_by_page(struct net_device *dev,
struct bnxt *bp = netdev_priv(dev);
int rc;
+ if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp))
+ return -EPERM;
+
rc = bnxt_get_module_status(bp, extack);
if (rc)
return rc;
--
2.30.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH net-next 2/6] bnxt_en: Do not allow ethtool -m on an untrusted VF
2024-12-15 20:59 ` [PATCH net-next 2/6] bnxt_en: Do not allow ethtool -m on an untrusted VF Michael Chan
@ 2024-12-16 14:25 ` kernel test robot
2024-12-16 14:50 ` Ido Schimmel
1 sibling, 0 replies; 10+ messages in thread
From: kernel test robot @ 2024-12-16 14:25 UTC (permalink / raw)
To: Michael Chan, davem
Cc: llvm, oe-kbuild-all, netdev, edumazet, kuba, pabeni,
andrew+netdev, pavan.chebbi, andrew.gospodarek, Kalesh AP
Hi Michael,
kernel test robot noticed the following build warnings:
[auto build test WARNING on net-next/main]
url: https://github.com/intel-lab-lkp/linux/commits/Michael-Chan/bnxt_en-Use-FW-defined-resource-limits-for-RoCE/20241216-050303
base: net-next/main
patch link: https://lore.kernel.org/r/20241215205943.2341612-3-michael.chan%40broadcom.com
patch subject: [PATCH net-next 2/6] bnxt_en: Do not allow ethtool -m on an untrusted VF
config: riscv-randconfig-002-20241216 (https://download.01.org/0day-ci/archive/20241216/202412162242.yQ3MVnZ5-lkp@intel.com/config)
compiler: clang version 15.0.7 (https://github.com/llvm/llvm-project 8dfdcc7b7bf66834a761bd8de445840ef68e4d1a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241216/202412162242.yQ3MVnZ5-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412162242.yQ3MVnZ5-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/net/ethernet/broadcom/bnxt/bnxt.c:8287:7: warning: variable 'flags' is uninitialized when used here [-Wuninitialized]
if (flags & FUNC_QCFG_RESP_FLAGS_TRUSTED_VF)
^~~~~
drivers/net/ethernet/broadcom/bnxt/bnxt.c:8269:11: note: initialize the variable 'flags' to silence this warning
u16 flags;
^
= 0
1 warning generated.
vim +/flags +8287 drivers/net/ethernet/broadcom/bnxt/bnxt.c
8264
8265 static int bnxt_hwrm_func_qcfg(struct bnxt *bp)
8266 {
8267 struct hwrm_func_qcfg_output *resp;
8268 struct hwrm_func_qcfg_input *req;
8269 u16 flags;
8270 int rc;
8271
8272 rc = hwrm_req_init(bp, req, HWRM_FUNC_QCFG);
8273 if (rc)
8274 return rc;
8275
8276 req->fid = cpu_to_le16(0xffff);
8277 resp = hwrm_req_hold(bp, req);
8278 rc = hwrm_req_send(bp, req);
8279 if (rc)
8280 goto func_qcfg_exit;
8281
8282 #ifdef CONFIG_BNXT_SRIOV
8283 if (BNXT_VF(bp)) {
8284 struct bnxt_vf_info *vf = &bp->vf;
8285
8286 vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK;
> 8287 if (flags & FUNC_QCFG_RESP_FLAGS_TRUSTED_VF)
8288 vf->flags |= BNXT_VF_TRUST;
8289 else
8290 vf->flags &= ~BNXT_VF_TRUST;
8291 } else {
8292 bp->pf.registered_vfs = le16_to_cpu(resp->registered_vfs);
8293 }
8294 #endif
8295 flags = le16_to_cpu(resp->flags);
8296 if (flags & (FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED |
8297 FUNC_QCFG_RESP_FLAGS_FW_LLDP_AGENT_ENABLED)) {
8298 bp->fw_cap |= BNXT_FW_CAP_LLDP_AGENT;
8299 if (flags & FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED)
8300 bp->fw_cap |= BNXT_FW_CAP_DCBX_AGENT;
8301 }
8302 if (BNXT_PF(bp) && (flags & FUNC_QCFG_RESP_FLAGS_MULTI_HOST))
8303 bp->flags |= BNXT_FLAG_MULTI_HOST;
8304
8305 if (flags & FUNC_QCFG_RESP_FLAGS_RING_MONITOR_ENABLED)
8306 bp->fw_cap |= BNXT_FW_CAP_RING_MONITOR;
8307
8308 if (flags & FUNC_QCFG_RESP_FLAGS_ENABLE_RDMA_SRIOV)
8309 bp->fw_cap |= BNXT_FW_CAP_ENABLE_RDMA_SRIOV;
8310
8311 switch (resp->port_partition_type) {
8312 case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR1_0:
8313 case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR1_5:
8314 case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR2_0:
8315 bp->port_partition_type = resp->port_partition_type;
8316 break;
8317 }
8318 if (bp->hwrm_spec_code < 0x10707 ||
8319 resp->evb_mode == FUNC_QCFG_RESP_EVB_MODE_VEB)
8320 bp->br_mode = BRIDGE_MODE_VEB;
8321 else if (resp->evb_mode == FUNC_QCFG_RESP_EVB_MODE_VEPA)
8322 bp->br_mode = BRIDGE_MODE_VEPA;
8323 else
8324 bp->br_mode = BRIDGE_MODE_UNDEF;
8325
8326 bp->max_mtu = le16_to_cpu(resp->max_mtu_configured);
8327 if (!bp->max_mtu)
8328 bp->max_mtu = BNXT_MAX_MTU;
8329
8330 if (bp->db_size)
8331 goto func_qcfg_exit;
8332
8333 bp->db_offset = le16_to_cpu(resp->legacy_l2_db_size_kb) * 1024;
8334 if (BNXT_CHIP_P5(bp)) {
8335 if (BNXT_PF(bp))
8336 bp->db_offset = DB_PF_OFFSET_P5;
8337 else
8338 bp->db_offset = DB_VF_OFFSET_P5;
8339 }
8340 bp->db_size = PAGE_ALIGN(le16_to_cpu(resp->l2_doorbell_bar_size_kb) *
8341 1024);
8342 if (!bp->db_size || bp->db_size > pci_resource_len(bp->pdev, 2) ||
8343 bp->db_size <= bp->db_offset)
8344 bp->db_size = pci_resource_len(bp->pdev, 2);
8345
8346 func_qcfg_exit:
8347 hwrm_req_drop(bp, req);
8348 return rc;
8349 }
8350
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH net-next 2/6] bnxt_en: Do not allow ethtool -m on an untrusted VF
2024-12-15 20:59 ` [PATCH net-next 2/6] bnxt_en: Do not allow ethtool -m on an untrusted VF Michael Chan
2024-12-16 14:25 ` kernel test robot
@ 2024-12-16 14:50 ` Ido Schimmel
1 sibling, 0 replies; 10+ messages in thread
From: Ido Schimmel @ 2024-12-16 14:50 UTC (permalink / raw)
To: Michael Chan
Cc: davem, netdev, edumazet, kuba, pabeni, andrew+netdev,
pavan.chebbi, andrew.gospodarek, Kalesh AP
On Sun, Dec 15, 2024 at 12:59:39PM -0800, Michael Chan wrote:
> @@ -4480,6 +4486,9 @@ static int bnxt_get_module_eeprom_by_page(struct net_device *dev,
> struct bnxt *bp = netdev_priv(dev);
> int rc;
>
> + if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp))
> + return -EPERM;
> +
Nit: You can use 'extack' here to help users understand why the
operation failed.
> rc = bnxt_get_module_status(bp, extack);
> if (rc)
> return rc;
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH net-next 3/6] bnxt_en: Skip PHY loopback ethtool selftest if unsupported by FW
2024-12-15 20:59 [PATCH net-next 0/6] bnxt_en: Driver update Michael Chan
2024-12-15 20:59 ` [PATCH net-next 1/6] bnxt_en: Use FW defined resource limits for RoCE Michael Chan
2024-12-15 20:59 ` [PATCH net-next 2/6] bnxt_en: Do not allow ethtool -m on an untrusted VF Michael Chan
@ 2024-12-15 20:59 ` Michael Chan
2024-12-15 20:59 ` [PATCH net-next 4/6] bnxt_en: Skip MAC loopback selftest if it is " Michael Chan
` (2 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Michael Chan @ 2024-12-15 20:59 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, kuba, pabeni, andrew+netdev, pavan.chebbi,
andrew.gospodarek, Kalesh AP
Skip PHY loopback selftest if firmware advertises that it is unsupported
in the HWRM_PORT_PHY_QCAPS call. Only show PHY loopback test result to
be 0 if the test has run and passes. Do the same for external loopback
to be consistent.
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
---
.../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
index 8de488f7cb6b..e5904f2d56df 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
@@ -4911,20 +4911,26 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,
buf[BNXT_MACLPBK_TEST_IDX] = 0;
bnxt_hwrm_mac_loopback(bp, false);
+ buf[BNXT_PHYLPBK_TEST_IDX] = 1;
+ if (bp->phy_flags & BNXT_PHY_FL_NO_PHY_LPBK)
+ goto skip_phy_loopback;
+
bnxt_hwrm_phy_loopback(bp, true, false);
msleep(1000);
- if (bnxt_run_loopback(bp)) {
- buf[BNXT_PHYLPBK_TEST_IDX] = 1;
+ if (bnxt_run_loopback(bp))
etest->flags |= ETH_TEST_FL_FAILED;
- }
+ else
+ buf[BNXT_PHYLPBK_TEST_IDX] = 0;
+skip_phy_loopback:
+ buf[BNXT_EXTLPBK_TEST_IDX] = 1;
if (do_ext_lpbk) {
etest->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE;
bnxt_hwrm_phy_loopback(bp, true, true);
msleep(1000);
- if (bnxt_run_loopback(bp)) {
- buf[BNXT_EXTLPBK_TEST_IDX] = 1;
+ if (bnxt_run_loopback(bp))
etest->flags |= ETH_TEST_FL_FAILED;
- }
+ else
+ buf[BNXT_EXTLPBK_TEST_IDX] = 0;
}
bnxt_hwrm_phy_loopback(bp, false, false);
bnxt_half_close_nic(bp);
--
2.30.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH net-next 4/6] bnxt_en: Skip MAC loopback selftest if it is unsupported by FW
2024-12-15 20:59 [PATCH net-next 0/6] bnxt_en: Driver update Michael Chan
` (2 preceding siblings ...)
2024-12-15 20:59 ` [PATCH net-next 3/6] bnxt_en: Skip PHY loopback ethtool selftest if unsupported by FW Michael Chan
@ 2024-12-15 20:59 ` Michael Chan
2024-12-16 6:56 ` Michal Swiatkowski
2024-12-15 20:59 ` [PATCH net-next 5/6] bnxt_en: Skip reading PXP registers during ethtool -d if unsupported Michael Chan
2024-12-15 20:59 ` [PATCH net-next 6/6] MAINTAINERS: bnxt_en: Add Pavan Chebbi as co-maintainer Michael Chan
5 siblings, 1 reply; 10+ messages in thread
From: Michael Chan @ 2024-12-15 20:59 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, kuba, pabeni, andrew+netdev, pavan.chebbi,
andrew.gospodarek, Kalesh AP
Call the new HWRM_PORT_MAC_QCAPS to check if mac loopback is
supported. Skip the MAC loopback ethtool self test if it is
not supported.
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
---
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 29 +++++++++++++++++++
drivers/net/ethernet/broadcom/bnxt/bnxt.h | 5 ++++
.../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 11 ++++---
3 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 631dbda725ab..5a19146d6902 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -11551,6 +11551,31 @@ static int bnxt_hwrm_phy_qcaps(struct bnxt *bp)
return rc;
}
+static int bnxt_hwrm_mac_qcaps(struct bnxt *bp)
+{
+ struct hwrm_port_mac_qcaps_output *resp;
+ struct hwrm_port_mac_qcaps_input *req;
+ int rc;
+
+ if (bp->hwrm_spec_code < 0x10a03)
+ return 0;
+
+ rc = hwrm_req_init(bp, req, HWRM_PORT_MAC_QCAPS);
+ if (rc)
+ return rc;
+
+ resp = hwrm_req_hold(bp, req);
+ rc = hwrm_req_send_silent(bp, req);
+ if (rc)
+ goto hwrm_mac_qcaps_exit;
+
+ bp->mac_flags = resp->flags;
+
+hwrm_mac_qcaps_exit:
+ hwrm_req_drop(bp, req);
+ return rc;
+}
+
static bool bnxt_support_dropped(u16 advertising, u16 supported)
{
u16 diff = advertising ^ supported;
@@ -15679,6 +15704,10 @@ static int bnxt_probe_phy(struct bnxt *bp, bool fw_dflt)
bp->dev->priv_flags |= IFF_SUPP_NOFCS;
else
bp->dev->priv_flags &= ~IFF_SUPP_NOFCS;
+
+ bp->mac_flags = 0;
+ bnxt_hwrm_mac_qcaps(bp);
+
if (!fw_dflt)
return 0;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index d5e81e008ab5..094c9e95b463 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -2668,6 +2668,11 @@ struct bnxt {
#define BNXT_PHY_FL_BANK_SEL (PORT_PHY_QCAPS_RESP_FLAGS2_BANK_ADDR_SUPPORTED << 8)
#define BNXT_PHY_FL_SPEEDS2 (PORT_PHY_QCAPS_RESP_FLAGS2_SPEEDS2_SUPPORTED << 8)
+ /* copied from flags in hwrm_port_mac_qcaps_output */
+ u8 mac_flags;
+#define BNXT_MAC_FL_NO_MAC_LPBK \
+ PORT_MAC_QCAPS_RESP_FLAGS_LOCAL_LPBK_NOT_SUPPORTED
+
u8 num_tests;
struct bnxt_test_info *test_info;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
index e5904f2d56df..3bc2bd732021 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
@@ -4896,21 +4896,24 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,
bnxt_close_nic(bp, true, false);
bnxt_run_fw_tests(bp, test_mask, &test_results);
- buf[BNXT_MACLPBK_TEST_IDX] = 1;
- bnxt_hwrm_mac_loopback(bp, true);
- msleep(250);
rc = bnxt_half_open_nic(bp);
if (rc) {
- bnxt_hwrm_mac_loopback(bp, false);
etest->flags |= ETH_TEST_FL_FAILED;
return;
}
+ buf[BNXT_MACLPBK_TEST_IDX] = 1;
+ if (bp->mac_flags & BNXT_MAC_FL_NO_MAC_LPBK)
+ goto skip_mac_loopback;
+
+ bnxt_hwrm_mac_loopback(bp, true);
+ msleep(250);
if (bnxt_run_loopback(bp))
etest->flags |= ETH_TEST_FL_FAILED;
else
buf[BNXT_MACLPBK_TEST_IDX] = 0;
bnxt_hwrm_mac_loopback(bp, false);
+skip_mac_loopback:
buf[BNXT_PHYLPBK_TEST_IDX] = 1;
if (bp->phy_flags & BNXT_PHY_FL_NO_PHY_LPBK)
goto skip_phy_loopback;
--
2.30.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH net-next 4/6] bnxt_en: Skip MAC loopback selftest if it is unsupported by FW
2024-12-15 20:59 ` [PATCH net-next 4/6] bnxt_en: Skip MAC loopback selftest if it is " Michael Chan
@ 2024-12-16 6:56 ` Michal Swiatkowski
0 siblings, 0 replies; 10+ messages in thread
From: Michal Swiatkowski @ 2024-12-16 6:56 UTC (permalink / raw)
To: Michael Chan
Cc: davem, netdev, edumazet, kuba, pabeni, andrew+netdev,
pavan.chebbi, andrew.gospodarek, Kalesh AP
On Sun, Dec 15, 2024 at 12:59:41PM -0800, Michael Chan wrote:
> Call the new HWRM_PORT_MAC_QCAPS to check if mac loopback is
> supported. Skip the MAC loopback ethtool self test if it is
> not supported.
>
> Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
> Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
> Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
> Signed-off-by: Michael Chan <michael.chan@broadcom.com>
> ---
> drivers/net/ethernet/broadcom/bnxt/bnxt.c | 29 +++++++++++++++++++
> drivers/net/ethernet/broadcom/bnxt/bnxt.h | 5 ++++
> .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 11 ++++---
> 3 files changed, 41 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> index 631dbda725ab..5a19146d6902 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> @@ -11551,6 +11551,31 @@ static int bnxt_hwrm_phy_qcaps(struct bnxt *bp)
> return rc;
> }
>
> +static int bnxt_hwrm_mac_qcaps(struct bnxt *bp)
> +{
> + struct hwrm_port_mac_qcaps_output *resp;
> + struct hwrm_port_mac_qcaps_input *req;
> + int rc;
> +
> + if (bp->hwrm_spec_code < 0x10a03)
> + return 0;
> +
> + rc = hwrm_req_init(bp, req, HWRM_PORT_MAC_QCAPS);
> + if (rc)
> + return rc;
> +
> + resp = hwrm_req_hold(bp, req);
> + rc = hwrm_req_send_silent(bp, req);
> + if (rc)
> + goto hwrm_mac_qcaps_exit;
> +
> + bp->mac_flags = resp->flags;
> +
> +hwrm_mac_qcaps_exit:
> + hwrm_req_drop(bp, req);
> + return rc;
> +}
> +
> static bool bnxt_support_dropped(u16 advertising, u16 supported)
> {
> u16 diff = advertising ^ supported;
> @@ -15679,6 +15704,10 @@ static int bnxt_probe_phy(struct bnxt *bp, bool fw_dflt)
> bp->dev->priv_flags |= IFF_SUPP_NOFCS;
> else
> bp->dev->priv_flags &= ~IFF_SUPP_NOFCS;
> +
> + bp->mac_flags = 0;
> + bnxt_hwrm_mac_qcaps(bp);
The value returned from the function is ignored. Change it to return
void, or do sth here with returned value.
Thanks
> +
> if (!fw_dflt)
> return 0;
>
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> index d5e81e008ab5..094c9e95b463 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> @@ -2668,6 +2668,11 @@ struct bnxt {
> #define BNXT_PHY_FL_BANK_SEL (PORT_PHY_QCAPS_RESP_FLAGS2_BANK_ADDR_SUPPORTED << 8)
> #define BNXT_PHY_FL_SPEEDS2 (PORT_PHY_QCAPS_RESP_FLAGS2_SPEEDS2_SUPPORTED << 8)
>
> + /* copied from flags in hwrm_port_mac_qcaps_output */
> + u8 mac_flags;
> +#define BNXT_MAC_FL_NO_MAC_LPBK \
> + PORT_MAC_QCAPS_RESP_FLAGS_LOCAL_LPBK_NOT_SUPPORTED
> +
> u8 num_tests;
> struct bnxt_test_info *test_info;
>
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
> index e5904f2d56df..3bc2bd732021 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
> @@ -4896,21 +4896,24 @@ static void bnxt_self_test(struct net_device *dev, struct ethtool_test *etest,
> bnxt_close_nic(bp, true, false);
> bnxt_run_fw_tests(bp, test_mask, &test_results);
>
> - buf[BNXT_MACLPBK_TEST_IDX] = 1;
> - bnxt_hwrm_mac_loopback(bp, true);
> - msleep(250);
> rc = bnxt_half_open_nic(bp);
> if (rc) {
> - bnxt_hwrm_mac_loopback(bp, false);
> etest->flags |= ETH_TEST_FL_FAILED;
> return;
> }
> + buf[BNXT_MACLPBK_TEST_IDX] = 1;
> + if (bp->mac_flags & BNXT_MAC_FL_NO_MAC_LPBK)
> + goto skip_mac_loopback;
> +
> + bnxt_hwrm_mac_loopback(bp, true);
> + msleep(250);
> if (bnxt_run_loopback(bp))
> etest->flags |= ETH_TEST_FL_FAILED;
> else
> buf[BNXT_MACLPBK_TEST_IDX] = 0;
>
> bnxt_hwrm_mac_loopback(bp, false);
> +skip_mac_loopback:
> buf[BNXT_PHYLPBK_TEST_IDX] = 1;
> if (bp->phy_flags & BNXT_PHY_FL_NO_PHY_LPBK)
> goto skip_phy_loopback;
> --
> 2.30.1
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH net-next 5/6] bnxt_en: Skip reading PXP registers during ethtool -d if unsupported
2024-12-15 20:59 [PATCH net-next 0/6] bnxt_en: Driver update Michael Chan
` (3 preceding siblings ...)
2024-12-15 20:59 ` [PATCH net-next 4/6] bnxt_en: Skip MAC loopback selftest if it is " Michael Chan
@ 2024-12-15 20:59 ` Michael Chan
2024-12-15 20:59 ` [PATCH net-next 6/6] MAINTAINERS: bnxt_en: Add Pavan Chebbi as co-maintainer Michael Chan
5 siblings, 0 replies; 10+ messages in thread
From: Michael Chan @ 2024-12-15 20:59 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, kuba, pabeni, andrew+netdev, pavan.chebbi,
andrew.gospodarek, Ajit Khaparde, Kalesh AP, Somnath Kotur
Newer firmware does not allow reading the PXP registers during
ethtool -d, so skip the firmware call in that case. Userspace
(bnxt.c) always expects the register block to be populated so
zeroes will be returned instead.
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
---
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
index 3bc2bd732021..4c7ef1a67bcf 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
@@ -2050,7 +2050,8 @@ static void bnxt_get_regs(struct net_device *dev, struct ethtool_regs *regs,
int rc;
regs->version = 0;
- bnxt_dbg_hwrm_rd_reg(bp, 0, BNXT_PXP_REG_LEN / 4, _p);
+ if (!(bp->fw_dbg_cap & DBG_QCAPS_RESP_FLAGS_REG_ACCESS_RESTRICTED))
+ bnxt_dbg_hwrm_rd_reg(bp, 0, BNXT_PXP_REG_LEN / 4, _p);
if (!(bp->fw_cap & BNXT_FW_CAP_PCIE_STATS_SUPPORTED))
return;
--
2.30.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH net-next 6/6] MAINTAINERS: bnxt_en: Add Pavan Chebbi as co-maintainer
2024-12-15 20:59 [PATCH net-next 0/6] bnxt_en: Driver update Michael Chan
` (4 preceding siblings ...)
2024-12-15 20:59 ` [PATCH net-next 5/6] bnxt_en: Skip reading PXP registers during ethtool -d if unsupported Michael Chan
@ 2024-12-15 20:59 ` Michael Chan
5 siblings, 0 replies; 10+ messages in thread
From: Michael Chan @ 2024-12-15 20:59 UTC (permalink / raw)
To: davem
Cc: netdev, edumazet, kuba, pabeni, andrew+netdev, pavan.chebbi,
andrew.gospodarek
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
---
MAINTAINERS | 1 +
1 file changed, 1 insertion(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index 6cced90772fc..2c73a3aacafb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -4611,6 +4611,7 @@ F: drivers/net/ethernet/broadcom/bnx2x/
BROADCOM BNXT_EN 50 GIGABIT ETHERNET DRIVER
M: Michael Chan <michael.chan@broadcom.com>
+M: Pavan Chebbi <pavan.chebbi@broadcom.com>
L: netdev@vger.kernel.org
S: Supported
F: drivers/firmware/broadcom/tee_bnxt_fw.c
--
2.30.1
^ permalink raw reply related [flat|nested] 10+ messages in thread