From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> This patchset contains bnxt bug fixes. Kalesh AP (5): net/bnxt: fix endianness while setting L4 destination port net/bnxt: fix to initialize structure variable net/bnxt: fix a possible segfault in vector mode Tx path net/bnxt: fix L2 filter alloc net/bnxt: fix speed setting on BCM957508-N2100 adapters Venkat Duvvuru (1): net/bnxt: fix LRO configuration drivers/net/bnxt/bnxt.h | 4 ++++ drivers/net/bnxt/bnxt_ethdev.c | 44 +++++++++++++++++++++++------------ drivers/net/bnxt/bnxt_hwrm.c | 15 ++++++++---- drivers/net/bnxt/bnxt_ring.c | 1 + drivers/net/bnxt/bnxt_rxr.c | 3 +++ drivers/net/bnxt/bnxt_rxtx_vec_neon.c | 2 ++ drivers/net/bnxt/bnxt_rxtx_vec_sse.c | 2 ++ drivers/net/bnxt/bnxt_txr.c | 2 ++ 8 files changed, 53 insertions(+), 20 deletions(-) -- 2.10.1
From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> Use "req.tunnel_dst_port_val" in bnxt_hwrm_tunnel_dst_port_alloc() as big endian since hwrm spec mandates this field in network byte order. Also, fixed the endianness while parsing the command output. Fixes: 10d074b2022d ("net/bnxt: support tunneling") Cc: stable@dpdk.org Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> Reviewed-by: Ajit Kumar Khaparde <ajit.khaparde@broadcom.com> Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com> --- drivers/net/bnxt/bnxt_hwrm.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index 8296d1d..49d81dd 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -3598,17 +3598,19 @@ int bnxt_hwrm_tunnel_dst_port_alloc(struct bnxt *bp, uint16_t port, HWRM_PREP(&req, HWRM_TUNNEL_DST_PORT_ALLOC, BNXT_USE_CHIMP_MB); req.tunnel_type = tunnel_type; - req.tunnel_dst_port_val = port; + req.tunnel_dst_port_val = rte_cpu_to_be_16(port); rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB); HWRM_CHECK_RESULT(); switch (tunnel_type) { case HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_VXLAN: - bp->vxlan_fw_dst_port_id = resp->tunnel_dst_port_id; + bp->vxlan_fw_dst_port_id = + rte_le_to_cpu_16(resp->tunnel_dst_port_id); bp->vxlan_port = port; break; case HWRM_TUNNEL_DST_PORT_ALLOC_INPUT_TUNNEL_TYPE_GENEVE: - bp->geneve_fw_dst_port_id = resp->tunnel_dst_port_id; + bp->geneve_fw_dst_port_id = + rte_le_to_cpu_16(resp->tunnel_dst_port_id); bp->geneve_port = port; break; default: -- 2.10.1
From: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com> The maximum number of TCP segments that can be aggregated & the maximum number of aggregations the VNIC supports are configured incorrectly during LRO configuration. This patch fixes these values. Fixes: b150a7e7ee66 ("net/bnxt: support LRO on Thor adapters") Cc: stable@dpdk.org Signed-off-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com> Reviewed-by: Kalesh Anakkur Purayil <kalesh-anakkur.purayil@broadcom.com> Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com> --- drivers/net/bnxt/bnxt_hwrm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index 49d81dd..4f70d93 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -2242,8 +2242,8 @@ int bnxt_hwrm_vnic_tpa_cfg(struct bnxt *bp, HWRM_VNIC_TPA_CFG_INPUT_FLAGS_GRO | HWRM_VNIC_TPA_CFG_INPUT_FLAGS_AGG_WITH_ECN | HWRM_VNIC_TPA_CFG_INPUT_FLAGS_AGG_WITH_SAME_GRE_SEQ); - req.max_agg_segs = rte_cpu_to_le_16(BNXT_TPA_MAX_AGGS(bp)); - req.max_aggs = rte_cpu_to_le_16(BNXT_TPA_MAX_SEGS(bp)); + req.max_aggs = rte_cpu_to_le_16(BNXT_TPA_MAX_AGGS(bp)); + req.max_agg_segs = rte_cpu_to_le_16(BNXT_TPA_MAX_SEGS(bp)); req.min_agg_len = rte_cpu_to_le_32(512); } req.vnic_id = rte_cpu_to_le_16(vnic->fw_vnic_id); -- 2.10.1
From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> During port start if bnxt_alloc_all_hwrm_stat_ctxs() fails, in the cleanup path we do see errors like below: bnxt_hwrm_ring_free(): hwrm_ring_free cp failed. rc:2 bnxt_hwrm_ring_free(): hwrm_ring_free rx failed. rc:2 The reason for this is in bnxt_free_all_hwrm_rings(), the check is made against "ring->fw_ring_id != INVALID_HW_RING_ID" which always return true as ring->fw_ring_id is not set to INVALID_HW_RING_ID while initialising the ring structs. Fixes: 6eb3cc2294fd ("net/bnxt: add initial Tx code") Fixes: 2eb53b134aae ("net/bnxt: add initial Rx code") Cc: stable@dpdk.org Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> Reviewed-by: Lance Richardson <lance.richardson@broadcom.com> Reviewed-by: Ajit Kumar Khaparde <ajit.khaparde@broadcom.com> --- drivers/net/bnxt/bnxt_ring.c | 1 + drivers/net/bnxt/bnxt_rxr.c | 3 +++ drivers/net/bnxt/bnxt_txr.c | 2 ++ 3 files changed, 6 insertions(+) diff --git a/drivers/net/bnxt/bnxt_ring.c b/drivers/net/bnxt/bnxt_ring.c index 54f6547..8f2296b 100644 --- a/drivers/net/bnxt/bnxt_ring.c +++ b/drivers/net/bnxt/bnxt_ring.c @@ -451,6 +451,7 @@ int bnxt_alloc_rxtx_nq_ring(struct bnxt *bp) ring->ring_mask = ring->ring_size - 1; ring->vmem_size = 0; ring->vmem = NULL; + ring->fw_ring_id = INVALID_HW_RING_ID; nqr->cp_ring_struct = ring; rc = bnxt_alloc_rings(bp, 0, NULL, NULL, nqr, NULL, "l2_nqr"); diff --git a/drivers/net/bnxt/bnxt_rxr.c b/drivers/net/bnxt/bnxt_rxr.c index 43b1256..b086898 100644 --- a/drivers/net/bnxt/bnxt_rxr.c +++ b/drivers/net/bnxt/bnxt_rxr.c @@ -962,6 +962,7 @@ int bnxt_init_rx_ring_struct(struct bnxt_rx_queue *rxq, unsigned int socket_id) ring->bd_dma = rxr->rx_desc_mapping; ring->vmem_size = ring->ring_size * sizeof(struct bnxt_sw_rx_bd); ring->vmem = (void **)&rxr->rx_buf_ring; + ring->fw_ring_id = INVALID_HW_RING_ID; cpr = rte_zmalloc_socket("bnxt_rx_ring", sizeof(struct bnxt_cp_ring_info), @@ -983,6 +984,7 @@ int bnxt_init_rx_ring_struct(struct bnxt_rx_queue *rxq, unsigned int socket_id) ring->bd_dma = cpr->cp_desc_mapping; ring->vmem_size = 0; ring->vmem = NULL; + ring->fw_ring_id = INVALID_HW_RING_ID; /* Allocate Aggregator rings */ ring = rte_zmalloc_socket("bnxt_rx_ring_struct", @@ -998,6 +1000,7 @@ int bnxt_init_rx_ring_struct(struct bnxt_rx_queue *rxq, unsigned int socket_id) ring->bd_dma = rxr->ag_desc_mapping; ring->vmem_size = ring->ring_size * sizeof(struct bnxt_sw_rx_bd); ring->vmem = (void **)&rxr->ag_buf_ring; + ring->fw_ring_id = INVALID_HW_RING_ID; return 0; } diff --git a/drivers/net/bnxt/bnxt_txr.c b/drivers/net/bnxt/bnxt_txr.c index c7a2de6..2068331 100644 --- a/drivers/net/bnxt/bnxt_txr.c +++ b/drivers/net/bnxt/bnxt_txr.c @@ -78,6 +78,7 @@ int bnxt_init_tx_ring_struct(struct bnxt_tx_queue *txq, unsigned int socket_id) ring->bd_dma = txr->tx_desc_mapping; ring->vmem_size = ring->ring_size * sizeof(struct bnxt_sw_tx_bd); ring->vmem = (void **)&txr->tx_buf_ring; + ring->fw_ring_id = INVALID_HW_RING_ID; cpr = rte_zmalloc_socket("bnxt_tx_ring", sizeof(struct bnxt_cp_ring_info), @@ -98,6 +99,7 @@ int bnxt_init_tx_ring_struct(struct bnxt_tx_queue *txq, unsigned int socket_id) ring->bd_dma = cpr->cp_desc_mapping; ring->vmem_size = 0; ring->vmem = NULL; + ring->fw_ring_id = INVALID_HW_RING_ID; return 0; } -- 2.10.1
From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> rte_pktmbuf_prefree_seg() can return NULL if the mbuf still has remaining references on it. Adding a NULL check to prevent segfault. Fixes: bc4a000f2f53 ("net/bnxt: implement SSE vector mode") Cc: stable@dpdk.org Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> Reviewed-by: Lance Richardson <lance.richardson@broadcom.com> Reviewed-by: Ajit Kumar Khaparde <ajit.khaparde@broadcom.com> Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com> --- drivers/net/bnxt/bnxt_rxtx_vec_neon.c | 2 ++ drivers/net/bnxt/bnxt_rxtx_vec_sse.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/drivers/net/bnxt/bnxt_rxtx_vec_neon.c b/drivers/net/bnxt/bnxt_rxtx_vec_neon.c index 488a0b4..bf76c2a 100644 --- a/drivers/net/bnxt/bnxt_rxtx_vec_neon.c +++ b/drivers/net/bnxt/bnxt_rxtx_vec_neon.c @@ -329,6 +329,8 @@ bnxt_tx_cmp_vec(struct bnxt_tx_queue *txq, int nr_pkts) tx_buf = &txr->tx_buf_ring[cons]; cons = RING_NEXT(txr->tx_ring_struct, cons); mbuf = rte_pktmbuf_prefree_seg(tx_buf->mbuf); + if (unlikely(mbuf == NULL)) + continue; tx_buf->mbuf = NULL; if (blk && mbuf->pool != free[0]->pool) { diff --git a/drivers/net/bnxt/bnxt_rxtx_vec_sse.c b/drivers/net/bnxt/bnxt_rxtx_vec_sse.c index c4ca5cf..98220bc 100644 --- a/drivers/net/bnxt/bnxt_rxtx_vec_sse.c +++ b/drivers/net/bnxt/bnxt_rxtx_vec_sse.c @@ -334,6 +334,8 @@ bnxt_tx_cmp_vec(struct bnxt_tx_queue *txq, int nr_pkts) tx_buf = &txr->tx_buf_ring[cons]; cons = RING_NEXT(txr->tx_ring_struct, cons); mbuf = rte_pktmbuf_prefree_seg(tx_buf->mbuf); + if (unlikely(mbuf == NULL)) + continue; tx_buf->mbuf = NULL; if (blk && mbuf->pool != free[0]->pool) { -- 2.10.1
From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> DPDK does not support RoCE and XDP. The driver should set the bit 5:4 of the flag to 1 and set bit 6 of the flag in the HWRM_CFA_L2_FILTER_ALLOC command to disable RoCE and XDP features. This change will greatly reduce the CFA resource consumption. Fixes: f92735db1e4c ("net/bnxt: add L2 filter alloc/init/free") Cc: stable@dpdk.org Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> Reviewed-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com> Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com> Reviewed-by: Ajit Kumar Khaparde <ajit.khaparde@broadcom.com> --- drivers/net/bnxt/bnxt_hwrm.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index 4f70d93..32fe24c 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -530,6 +530,9 @@ int bnxt_hwrm_set_l2_filter(struct bnxt *bp, HWRM_PREP(&req, HWRM_CFA_L2_FILTER_ALLOC, BNXT_USE_CHIMP_MB); + /* PMD does not support XDP and RoCE */ + filter->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_XDP_DISABLE | + HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_TRAFFIC_L2; req.flags = rte_cpu_to_le_32(filter->flags); enables = filter->enables | -- 2.10.1
From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> On BCM957508-N2100 adapters, FW will not allow any user other than BMC to shutdown the port. As a result, bnxt_get_hwrm_link_config() always returns link up. Because of this, driver will not update the new port configurations such as speed, autoneg during a port start. Fixed the condition to invoke bnxt_set_hwrm_link_config() in bnxt_init_chip(). Fixes: 7bc8e9a227cc ("net/bnxt: support async link notification") Cc: stable@dpdk.org Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> Reviewed-by: Ajit Kumar Khaparde <ajit.khaparde@broadcom.com> --- drivers/net/bnxt/bnxt.h | 4 ++++ drivers/net/bnxt/bnxt_ethdev.c | 44 ++++++++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h index f4b2a3f..a38fe8c 100644 --- a/drivers/net/bnxt/bnxt.h +++ b/drivers/net/bnxt/bnxt.h @@ -81,6 +81,10 @@ #define BROADCOM_DEV_ID_58808 0x16f0 #define BROADCOM_DEV_ID_58802_VF 0xd800 +#define BROADCOM_DEV_957508_N2100 0x5208 +#define IS_BNXT_DEV_957508_N2100(bp) \ + ((bp)->pdev->id.subsystem_device_id == BROADCOM_DEV_957508_N2100) + #define BNXT_MAX_MTU 9574 #define VLAN_TAG_SIZE 4 #define BNXT_NUM_VLANS 2 diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 510a0d9..0a038d4 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -605,9 +605,35 @@ static int bnxt_init_ctx_mem(struct bnxt *bp) return rc; } -static int bnxt_init_chip(struct bnxt *bp) +static int bnxt_update_phy_setting(struct bnxt *bp) { struct rte_eth_link new; + int rc; + + rc = bnxt_get_hwrm_link_config(bp, &new); + if (rc) { + PMD_DRV_LOG(ERR, "Failed to get link settings\n"); + return rc; + } + + /* + * On BCM957508-N2100 adapters, FW will not allow any user other + * than BMC to shutdown the port. bnxt_get_hwrm_link_config() call + * always returns link up. Force phy update always in that case. + */ + if (!new.link_status || IS_BNXT_DEV_957508_N2100(bp)) { + rc = bnxt_set_hwrm_link_config(bp, true); + if (rc) { + PMD_DRV_LOG(ERR, "Failed to update PHY settings\n"); + return rc; + } + } + + return rc; +} + +static int bnxt_init_chip(struct bnxt *bp) +{ struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(bp->eth_dev); struct rte_intr_handle *intr_handle = &pci_dev->intr_handle; uint32_t intr_vector = 0; @@ -737,21 +763,9 @@ static int bnxt_init_chip(struct bnxt *bp) goto err_free; #endif - rc = bnxt_get_hwrm_link_config(bp, &new); - if (rc) { - PMD_DRV_LOG(ERR, "HWRM Get link config failure rc: %x\n", rc); + rc = bnxt_update_phy_setting(bp); + if (rc) goto err_free; - } - - if (!bp->link_info->link_up) { - rc = bnxt_set_hwrm_link_config(bp, true); - if (rc) { - PMD_DRV_LOG(ERR, - "HWRM link config failure rc: %x\n", rc); - goto err_free; - } - } - bnxt_print_link_info(bp->eth_dev); bp->mark_table = rte_zmalloc("bnxt_mark_table", BNXT_MARK_TABLE_SZ, 0); if (!bp->mark_table) -- 2.10.1
On Thu, Aug 27, 2020 at 9:46 PM Kalesh A P < kalesh-anakkur.purayil@broadcom.com> wrote: > From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com> > > This patchset contains bnxt bug fixes. > Patchset applied to dpdk-next-net-brcm. Thanks > > Kalesh AP (5): > net/bnxt: fix endianness while setting L4 destination port > net/bnxt: fix to initialize structure variable > net/bnxt: fix a possible segfault in vector mode Tx path > net/bnxt: fix L2 filter alloc > net/bnxt: fix speed setting on BCM957508-N2100 adapters > > Venkat Duvvuru (1): > net/bnxt: fix LRO configuration > > drivers/net/bnxt/bnxt.h | 4 ++++ > drivers/net/bnxt/bnxt_ethdev.c | 44 > +++++++++++++++++++++++------------ > drivers/net/bnxt/bnxt_hwrm.c | 15 ++++++++---- > drivers/net/bnxt/bnxt_ring.c | 1 + > drivers/net/bnxt/bnxt_rxr.c | 3 +++ > drivers/net/bnxt/bnxt_rxtx_vec_neon.c | 2 ++ > drivers/net/bnxt/bnxt_rxtx_vec_sse.c | 2 ++ > drivers/net/bnxt/bnxt_txr.c | 2 ++ > 8 files changed, 53 insertions(+), 20 deletions(-) > > -- > 2.10.1 > >