Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'bnxt_en-driver-update'

Michael Chan says:

====================
bnxt_en: Driver update

The first patch configures context memory for RoCE resources based
on FW limits. The next 4 patches restrict certain ethtool
operations when they are not supported. The last patch adds Pavan
Chebbi as co-maintainer of the driver.

v1: https://lore.kernel.org/20241215205943.2341612-1-michael.chan@broadcom.com
====================

Link: https://patch.msgid.link/20241217182620.2454075-1-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+109 -24
+1
MAINTAINERS
··· 4611 4611 4612 4612 BROADCOM BNXT_EN 50 GIGABIT ETHERNET DRIVER 4613 4613 M: Michael Chan <michael.chan@broadcom.com> 4614 + M: Pavan Chebbi <pavan.chebbi@broadcom.com> 4614 4615 L: netdev@vger.kernel.org 4615 4616 S: Supported 4616 4617 F: drivers/firmware/broadcom/tee_bnxt_fw.c
+58 -13
drivers/net/ethernet/broadcom/bnxt/bnxt.c
··· 8279 8279 if (rc) 8280 8280 goto func_qcfg_exit; 8281 8281 8282 + flags = le16_to_cpu(resp->flags); 8282 8283 #ifdef CONFIG_BNXT_SRIOV 8283 8284 if (BNXT_VF(bp)) { 8284 8285 struct bnxt_vf_info *vf = &bp->vf; 8285 8286 8286 8287 vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK; 8288 + if (flags & FUNC_QCFG_RESP_FLAGS_TRUSTED_VF) 8289 + vf->flags |= BNXT_VF_TRUST; 8290 + else 8291 + vf->flags &= ~BNXT_VF_TRUST; 8287 8292 } else { 8288 8293 bp->pf.registered_vfs = le16_to_cpu(resp->registered_vfs); 8289 8294 } 8290 8295 #endif 8291 - flags = le16_to_cpu(resp->flags); 8292 8296 if (flags & (FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED | 8293 8297 FUNC_QCFG_RESP_FLAGS_FW_LLDP_AGENT_ENABLED)) { 8294 8298 bp->fw_cap |= BNXT_FW_CAP_LLDP_AGENT; ··· 9121 9117 ena = 0; 9122 9118 if ((bp->flags & BNXT_FLAG_ROCE_CAP) && !is_kdump_kernel()) { 9123 9119 pg_lvl = 2; 9124 - extra_qps = min_t(u32, 65536, max_qps - l2_qps - qp1_qps); 9125 - /* allocate extra qps if fw supports RoCE fast qp destroy feature */ 9126 - extra_qps += fast_qpmd_qps; 9127 - extra_srqs = min_t(u32, 8192, max_srqs - srqs); 9120 + if (BNXT_SW_RES_LMT(bp)) { 9121 + extra_qps = max_qps - l2_qps - qp1_qps; 9122 + extra_srqs = max_srqs - srqs; 9123 + } else { 9124 + extra_qps = min_t(u32, 65536, 9125 + max_qps - l2_qps - qp1_qps); 9126 + /* allocate extra qps if fw supports RoCE fast qp 9127 + * destroy feature 9128 + */ 9129 + extra_qps += fast_qpmd_qps; 9130 + extra_srqs = min_t(u32, 8192, max_srqs - srqs); 9131 + } 9128 9132 if (fast_qpmd_qps) 9129 9133 ena |= FUNC_BACKING_STORE_CFG_REQ_ENABLES_QP_FAST_QPMD; 9130 9134 } ··· 9168 9156 goto skip_rdma; 9169 9157 9170 9158 ctxm = &ctx->ctx_arr[BNXT_CTX_MRAV]; 9171 - /* 128K extra is needed to accommodate static AH context 9172 - * allocation by f/w. 9173 - */ 9174 - num_mr = min_t(u32, ctxm->max_entries / 2, 1024 * 256); 9175 - num_ah = min_t(u32, num_mr, 1024 * 128); 9176 - ctxm->split_entry_cnt = BNXT_CTX_MRAV_AV_SPLIT_ENTRY + 1; 9177 - if (!ctxm->mrav_av_entries || ctxm->mrav_av_entries > num_ah) 9178 - ctxm->mrav_av_entries = num_ah; 9159 + if (BNXT_SW_RES_LMT(bp) && 9160 + ctxm->split_entry_cnt == BNXT_CTX_MRAV_AV_SPLIT_ENTRY + 1) { 9161 + num_ah = ctxm->mrav_av_entries; 9162 + num_mr = ctxm->max_entries - num_ah; 9163 + } else { 9164 + /* 128K extra is needed to accommodate static AH context 9165 + * allocation by f/w. 9166 + */ 9167 + num_mr = min_t(u32, ctxm->max_entries / 2, 1024 * 256); 9168 + num_ah = min_t(u32, num_mr, 1024 * 128); 9169 + ctxm->split_entry_cnt = BNXT_CTX_MRAV_AV_SPLIT_ENTRY + 1; 9170 + if (!ctxm->mrav_av_entries || ctxm->mrav_av_entries > num_ah) 9171 + ctxm->mrav_av_entries = num_ah; 9172 + } 9179 9173 9180 9174 rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, num_mr + num_ah, 2); 9181 9175 if (rc) ··· 9488 9470 bp->flags |= BNXT_FLAG_UDP_GSO_CAP; 9489 9471 if (flags_ext2 & FUNC_QCAPS_RESP_FLAGS_EXT2_TX_PKT_TS_CMPL_SUPPORTED) 9490 9472 bp->fw_cap |= BNXT_FW_CAP_TX_TS_CMP; 9473 + if (flags_ext2 & 9474 + FUNC_QCAPS_RESP_FLAGS_EXT2_SW_MAX_RESOURCE_LIMITS_SUPPORTED) 9475 + bp->fw_cap |= BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS; 9491 9476 if (BNXT_PF(bp) && 9492 9477 (flags_ext2 & FUNC_QCAPS_RESP_FLAGS_EXT2_ROCE_VF_RESOURCE_MGMT_SUPPORTED)) 9493 9478 bp->fw_cap |= BNXT_FW_CAP_ROCE_VF_RESC_MGMT_SUPPORTED; ··· 11549 11528 hwrm_phy_qcaps_exit: 11550 11529 hwrm_req_drop(bp, req); 11551 11530 return rc; 11531 + } 11532 + 11533 + static void bnxt_hwrm_mac_qcaps(struct bnxt *bp) 11534 + { 11535 + struct hwrm_port_mac_qcaps_output *resp; 11536 + struct hwrm_port_mac_qcaps_input *req; 11537 + int rc; 11538 + 11539 + if (bp->hwrm_spec_code < 0x10a03) 11540 + return; 11541 + 11542 + rc = hwrm_req_init(bp, req, HWRM_PORT_MAC_QCAPS); 11543 + if (rc) 11544 + return; 11545 + 11546 + resp = hwrm_req_hold(bp, req); 11547 + rc = hwrm_req_send_silent(bp, req); 11548 + if (!rc) 11549 + bp->mac_flags = resp->flags; 11550 + hwrm_req_drop(bp, req); 11552 11551 } 11553 11552 11554 11553 static bool bnxt_support_dropped(u16 advertising, u16 supported) ··· 15699 15658 bp->dev->priv_flags |= IFF_SUPP_NOFCS; 15700 15659 else 15701 15660 bp->dev->priv_flags &= ~IFF_SUPP_NOFCS; 15661 + 15662 + bp->mac_flags = 0; 15663 + bnxt_hwrm_mac_qcaps(bp); 15664 + 15702 15665 if (!fw_dflt) 15703 15666 return 0; 15704 15667
+13
drivers/net/ethernet/broadcom/bnxt/bnxt.h
··· 2270 2270 2271 2271 #define BNXT_PF(bp) (!((bp)->flags & BNXT_FLAG_VF)) 2272 2272 #define BNXT_VF(bp) ((bp)->flags & BNXT_FLAG_VF) 2273 + #ifdef CONFIG_BNXT_SRIOV 2274 + #define BNXT_VF_IS_TRUSTED(bp) ((bp)->vf.flags & BNXT_VF_TRUST) 2275 + #else 2276 + #define BNXT_VF_IS_TRUSTED(bp) 0 2277 + #endif 2273 2278 #define BNXT_NPAR(bp) ((bp)->port_partition_type) 2274 2279 #define BNXT_MH(bp) ((bp)->flags & BNXT_FLAG_MULTI_HOST) 2275 2280 #define BNXT_SINGLE_PF(bp) (BNXT_PF(bp) && !BNXT_NPAR(bp) && !BNXT_MH(bp)) ··· 2487 2482 #define BNXT_FW_CAP_CFA_NTUPLE_RX_EXT_IP_PROTO BIT_ULL(38) 2488 2483 #define BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V3 BIT_ULL(39) 2489 2484 #define BNXT_FW_CAP_VNIC_RE_FLUSH BIT_ULL(40) 2485 + #define BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS BIT_ULL(41) 2490 2486 2491 2487 u32 fw_dbg_cap; 2492 2488 ··· 2507 2501 ((bp)->fw_cap & BNXT_FW_CAP_ENABLE_RDMA_SRIOV) 2508 2502 #define BNXT_ROCE_VF_RESC_CAP(bp) \ 2509 2503 ((bp)->fw_cap & BNXT_FW_CAP_ROCE_VF_RESC_MGMT_SUPPORTED) 2504 + #define BNXT_SW_RES_LMT(bp) \ 2505 + ((bp)->fw_cap & BNXT_FW_CAP_SW_MAX_RESOURCE_LIMITS) 2510 2506 2511 2507 u32 hwrm_spec_code; 2512 2508 u16 hwrm_cmd_seq; ··· 2667 2659 #define BNXT_PHY_FL_NO_PFC (PORT_PHY_QCAPS_RESP_FLAGS2_PFC_UNSUPPORTED << 8) 2668 2660 #define BNXT_PHY_FL_BANK_SEL (PORT_PHY_QCAPS_RESP_FLAGS2_BANK_ADDR_SUPPORTED << 8) 2669 2661 #define BNXT_PHY_FL_SPEEDS2 (PORT_PHY_QCAPS_RESP_FLAGS2_SPEEDS2_SUPPORTED << 8) 2662 + 2663 + /* copied from flags in hwrm_port_mac_qcaps_output */ 2664 + u8 mac_flags; 2665 + #define BNXT_MAC_FL_NO_MAC_LPBK \ 2666 + PORT_MAC_QCAPS_RESP_FLAGS_LOCAL_LPBK_NOT_SUPPORTED 2670 2667 2671 2668 u8 num_tests; 2672 2669 struct bnxt_test_info *test_info;
+33 -11
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
··· 2050 2050 int rc; 2051 2051 2052 2052 regs->version = 0; 2053 - bnxt_dbg_hwrm_rd_reg(bp, 0, BNXT_PXP_REG_LEN / 4, _p); 2053 + if (!(bp->fw_dbg_cap & DBG_QCAPS_RESP_FLAGS_REG_ACCESS_RESTRICTED)) 2054 + bnxt_dbg_hwrm_rd_reg(bp, 0, BNXT_PXP_REG_LEN / 4, _p); 2054 2055 2055 2056 if (!(bp->fw_cap & BNXT_FW_CAP_PCIE_STATS_SUPPORTED)) 2056 2057 return; ··· 4376 4375 struct bnxt *bp = netdev_priv(dev); 4377 4376 int rc; 4378 4377 4378 + if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp)) 4379 + return -EPERM; 4380 + 4379 4381 /* No point in going further if phy status indicates 4380 4382 * module is not inserted or if it is powered down or 4381 4383 * if it is of type 10GBase-T ··· 4429 4425 struct bnxt *bp = netdev_priv(dev); 4430 4426 u16 start = eeprom->offset, length = eeprom->len; 4431 4427 int rc = 0; 4428 + 4429 + if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp)) 4430 + return -EPERM; 4432 4431 4433 4432 memset(data, 0, eeprom->len); 4434 4433 ··· 4486 4479 { 4487 4480 struct bnxt *bp = netdev_priv(dev); 4488 4481 int rc; 4482 + 4483 + if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp)) { 4484 + NL_SET_ERR_MSG_MOD(extack, 4485 + "Module read not permitted on untrusted VF"); 4486 + return -EPERM; 4487 + } 4489 4488 4490 4489 rc = bnxt_get_module_status(bp, extack); 4491 4490 if (rc) ··· 4900 4887 bnxt_close_nic(bp, true, false); 4901 4888 bnxt_run_fw_tests(bp, test_mask, &test_results); 4902 4889 4903 - buf[BNXT_MACLPBK_TEST_IDX] = 1; 4904 - bnxt_hwrm_mac_loopback(bp, true); 4905 - msleep(250); 4906 4890 rc = bnxt_half_open_nic(bp); 4907 4891 if (rc) { 4908 - bnxt_hwrm_mac_loopback(bp, false); 4909 4892 etest->flags |= ETH_TEST_FL_FAILED; 4910 4893 return; 4911 4894 } 4895 + buf[BNXT_MACLPBK_TEST_IDX] = 1; 4896 + if (bp->mac_flags & BNXT_MAC_FL_NO_MAC_LPBK) 4897 + goto skip_mac_loopback; 4898 + 4899 + bnxt_hwrm_mac_loopback(bp, true); 4900 + msleep(250); 4912 4901 if (bnxt_run_loopback(bp)) 4913 4902 etest->flags |= ETH_TEST_FL_FAILED; 4914 4903 else 4915 4904 buf[BNXT_MACLPBK_TEST_IDX] = 0; 4916 4905 4917 4906 bnxt_hwrm_mac_loopback(bp, false); 4907 + skip_mac_loopback: 4908 + buf[BNXT_PHYLPBK_TEST_IDX] = 1; 4909 + if (bp->phy_flags & BNXT_PHY_FL_NO_PHY_LPBK) 4910 + goto skip_phy_loopback; 4911 + 4918 4912 bnxt_hwrm_phy_loopback(bp, true, false); 4919 4913 msleep(1000); 4920 - if (bnxt_run_loopback(bp)) { 4921 - buf[BNXT_PHYLPBK_TEST_IDX] = 1; 4914 + if (bnxt_run_loopback(bp)) 4922 4915 etest->flags |= ETH_TEST_FL_FAILED; 4923 - } 4916 + else 4917 + buf[BNXT_PHYLPBK_TEST_IDX] = 0; 4918 + skip_phy_loopback: 4919 + buf[BNXT_EXTLPBK_TEST_IDX] = 1; 4924 4920 if (do_ext_lpbk) { 4925 4921 etest->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE; 4926 4922 bnxt_hwrm_phy_loopback(bp, true, true); 4927 4923 msleep(1000); 4928 - if (bnxt_run_loopback(bp)) { 4929 - buf[BNXT_EXTLPBK_TEST_IDX] = 1; 4924 + if (bnxt_run_loopback(bp)) 4930 4925 etest->flags |= ETH_TEST_FL_FAILED; 4931 - } 4926 + else 4927 + buf[BNXT_EXTLPBK_TEST_IDX] = 0; 4932 4928 } 4933 4929 bnxt_hwrm_phy_loopback(bp, false, false); 4934 4930 bnxt_half_close_nic(bp);
+2
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
··· 416 416 edev->flags |= BNXT_EN_FLAG_VF; 417 417 if (BNXT_ROCE_VF_RESC_CAP(bp)) 418 418 edev->flags |= BNXT_EN_FLAG_ROCE_VF_RES_MGMT; 419 + if (BNXT_SW_RES_LMT(bp)) 420 + edev->flags |= BNXT_EN_FLAG_SW_RES_LMT; 419 421 420 422 edev->chip_num = bp->chip_num; 421 423 edev->hw_ring_stats_size = bp->hw_ring_stats_size;
+2
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
··· 65 65 #define BNXT_EN_FLAG_VF 0x10 66 66 #define BNXT_EN_VF(edev) ((edev)->flags & BNXT_EN_FLAG_VF) 67 67 #define BNXT_EN_FLAG_ROCE_VF_RES_MGMT 0x20 68 + #define BNXT_EN_FLAG_SW_RES_LMT 0x40 69 + #define BNXT_EN_SW_RES_LMT(edev) ((edev)->flags & BNXT_EN_FLAG_SW_RES_LMT) 68 70 69 71 struct bnxt_ulp *ulp_tbl; 70 72 int l2_db_size; /* Doorbell BAR size in