mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
Merge branch 'bnxt_en-bug-fixes'
Michael Chan says: ==================== bnxt_en: Bug fixes This series include 3 bug fixes: 1. queue start bug fix on the VNIC's default ring. 2 refactoring patches preceed the actual bug fix. 2. Bug fix for TPA data corruption seen on some ARM systems. 3. PTP PPS setting bug fix. ==================== Link: https://patch.msgid.link/20260731190937.807270-1-michael.chan@broadcom.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
6183a645aa
|
|
@ -4611,11 +4611,14 @@ static void bnxt_init_one_rx_agg_ring_rxbd(struct bnxt *bp,
|
|||
type = ((u32)rxr->rx_page_size << RX_BD_LEN_SHIFT) |
|
||||
RX_BD_TYPE_RX_AGG_BD;
|
||||
|
||||
/* On P7, setting EOP will cause the chip to disable
|
||||
* Relaxed Ordering (RO) for TPA data. Disable EOP for
|
||||
* potentially higher performance with RO.
|
||||
/* Disable EOP if TPA is enabled to prevent overlapping zero
|
||||
* padding with the next segment's data. On P7_PLUS, EOP will
|
||||
* automatically disable Relaxed Ordering (RO) to prevent
|
||||
* potential data corruption (and may degrade performance). On
|
||||
* older chips, RO will not be automatically disabled and may
|
||||
* cause corruption.
|
||||
*/
|
||||
if (BNXT_CHIP_P5_AND_MINUS(bp) || !(bp->flags & BNXT_FLAG_TPA))
|
||||
if (!(bp->flags & BNXT_FLAG_TPA))
|
||||
type |= RX_BD_FLAGS_AGG_EOP;
|
||||
|
||||
bnxt_init_rxbd_pages(ring, type);
|
||||
|
|
@ -6704,22 +6707,36 @@ int bnxt_get_nr_rss_ctxs(struct bnxt *bp, int rx_rings)
|
|||
static void bnxt_fill_hw_rss_tbl(struct bnxt *bp, struct bnxt_vnic_info *vnic)
|
||||
{
|
||||
bool no_rss = !(vnic->flags & BNXT_VNIC_RSS_FLAG);
|
||||
u16 i, j;
|
||||
u16 i, j, min_j = bp->rx_nr_rings - 1;
|
||||
|
||||
if (!vnic->rss_table)
|
||||
goto skip_rss_tbl;
|
||||
|
||||
/* Fill the RSS indirection table with ring group ids */
|
||||
for (i = 0, j = 0; i < HW_HASH_INDEX_SIZE; i++) {
|
||||
if (!no_rss)
|
||||
j = bp->rss_indir_tbl[i];
|
||||
min_j = min(j, min_j);
|
||||
vnic->rss_table[i] = cpu_to_le16(vnic->fw_grp_ids[j]);
|
||||
}
|
||||
|
||||
skip_rss_tbl:
|
||||
if (vnic->rss_table && !no_rss)
|
||||
vnic->default_rx_ring = min_j;
|
||||
else if (vnic->flags & BNXT_VNIC_RFS_FLAG)
|
||||
vnic->default_rx_ring = vnic->vnic_id - 1;
|
||||
else if ((vnic->vnic_id == 1) && BNXT_CHIP_TYPE_NITRO_A0(bp))
|
||||
vnic->default_rx_ring = bp->rx_nr_rings - 1;
|
||||
else
|
||||
vnic->default_rx_ring = 0;
|
||||
}
|
||||
|
||||
static void bnxt_fill_hw_rss_tbl_p5(struct bnxt *bp,
|
||||
struct bnxt_vnic_info *vnic)
|
||||
{
|
||||
u16 tbl_size, i, min_j = bp->rx_nr_rings - 1;
|
||||
__le16 *ring_tbl = vnic->rss_table;
|
||||
struct bnxt_rx_ring_info *rxr;
|
||||
u16 tbl_size, i;
|
||||
|
||||
tbl_size = bnxt_get_rxfh_indir_size(bp->dev);
|
||||
|
||||
|
|
@ -6732,6 +6749,7 @@ static void bnxt_fill_hw_rss_tbl_p5(struct bnxt *bp,
|
|||
j = ethtool_rxfh_context_indir(vnic->rss_ctx)[i];
|
||||
else
|
||||
j = bp->rss_indir_tbl[i];
|
||||
min_j = min(j, min_j);
|
||||
rxr = &bp->rx_ring[j];
|
||||
|
||||
ring_id = rxr->rx_ring_struct.fw_ring_id;
|
||||
|
|
@ -6739,19 +6757,15 @@ static void bnxt_fill_hw_rss_tbl_p5(struct bnxt *bp,
|
|||
ring_id = bnxt_cp_ring_for_rx(bp, rxr);
|
||||
*ring_tbl++ = cpu_to_le16(ring_id);
|
||||
}
|
||||
vnic->default_rx_ring = min_j;
|
||||
}
|
||||
|
||||
static void
|
||||
__bnxt_hwrm_vnic_set_rss(struct bnxt *bp, struct hwrm_vnic_rss_cfg_input *req,
|
||||
struct bnxt_vnic_info *vnic)
|
||||
{
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
|
||||
bnxt_fill_hw_rss_tbl_p5(bp, vnic);
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P7)
|
||||
req->flags |= VNIC_RSS_CFG_REQ_FLAGS_IPSEC_HASH_TYPE_CFG_SUPPORT;
|
||||
} else {
|
||||
bnxt_fill_hw_rss_tbl(bp, vnic);
|
||||
}
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P7)
|
||||
req->flags |= VNIC_RSS_CFG_REQ_FLAGS_IPSEC_HASH_TYPE_CFG_SUPPORT;
|
||||
|
||||
if (bp->rss_hash_delta) {
|
||||
req->hash_type = cpu_to_le32(bp->rss_hash_delta);
|
||||
|
|
@ -6803,6 +6817,7 @@ static int bnxt_hwrm_vnic_set_rss_p5(struct bnxt *bp,
|
|||
if (!set_rss)
|
||||
return hwrm_req_send(bp, req);
|
||||
|
||||
bnxt_fill_hw_rss_tbl_p5(bp, vnic);
|
||||
__bnxt_hwrm_vnic_set_rss(bp, req, vnic);
|
||||
ring_tbl_map = vnic->rss_table_dma_addr;
|
||||
nr_ctxs = bnxt_get_nr_rss_ctxs(bp, bp->rx_nr_rings);
|
||||
|
|
@ -6939,8 +6954,9 @@ int bnxt_hwrm_vnic_cfg(struct bnxt *bp, struct bnxt_vnic_info *vnic)
|
|||
return rc;
|
||||
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
|
||||
struct bnxt_rx_ring_info *rxr = &bp->rx_ring[0];
|
||||
struct bnxt_rx_ring_info *rxr;
|
||||
|
||||
rxr = &bp->rx_ring[vnic->default_rx_ring];
|
||||
req->default_rx_ring_id =
|
||||
cpu_to_le16(rxr->rx_ring_struct.fw_ring_id);
|
||||
req->default_cmpl_ring_id =
|
||||
|
|
@ -6973,13 +6989,7 @@ int bnxt_hwrm_vnic_cfg(struct bnxt *bp, struct bnxt_vnic_info *vnic)
|
|||
req->cos_rule = cpu_to_le16(0xffff);
|
||||
}
|
||||
|
||||
if (vnic->flags & BNXT_VNIC_RSS_FLAG)
|
||||
ring = 0;
|
||||
else if (vnic->flags & BNXT_VNIC_RFS_FLAG)
|
||||
ring = vnic->vnic_id - 1;
|
||||
else if ((vnic->vnic_id == 1) && BNXT_CHIP_TYPE_NITRO_A0(bp))
|
||||
ring = bp->rx_nr_rings - 1;
|
||||
|
||||
ring = vnic->default_rx_ring;
|
||||
grp_idx = bp->rx_ring[ring].bnapi->index;
|
||||
req->dflt_ring_grp = cpu_to_le16(bp->grp_info[grp_idx].fw_grp_id);
|
||||
req->lb_rule = cpu_to_le16(0xffff);
|
||||
|
|
@ -10866,6 +10876,7 @@ static int __bnxt_setup_vnic(struct bnxt *bp, struct bnxt_vnic_info *vnic)
|
|||
}
|
||||
|
||||
skip_rss_ctx:
|
||||
bnxt_fill_hw_rss_tbl(bp, vnic);
|
||||
/* configure default vnic, ring grp */
|
||||
rc = bnxt_hwrm_vnic_cfg(bp, vnic);
|
||||
if (rc) {
|
||||
|
|
@ -11090,6 +11101,11 @@ static int bnxt_set_vnic_mru_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic,
|
|||
vnic->vnic_id, rc);
|
||||
return rc;
|
||||
}
|
||||
if (rxr_id == vnic->default_rx_ring) {
|
||||
rc = bnxt_hwrm_vnic_cfg(bp, vnic);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
vnic->mru = mru;
|
||||
bnxt_hwrm_vnic_update(bp, vnic,
|
||||
|
|
@ -11171,6 +11187,9 @@ static int bnxt_setup_nitroa0_vnic(struct bnxt *bp)
|
|||
return rc;
|
||||
}
|
||||
|
||||
/* Setup the proper default RX ring */
|
||||
bnxt_fill_hw_rss_tbl(bp, vnic);
|
||||
|
||||
rc = bnxt_hwrm_vnic_cfg(bp, vnic);
|
||||
if (rc) {
|
||||
netdev_err(bp->dev, "Cannot allocate special vnic for NS2 A0: %x\n",
|
||||
|
|
|
|||
|
|
@ -1334,6 +1334,7 @@ struct bnxt_vnic_info {
|
|||
#define BNXT_VNIC_RSSCTX_FLAG 0x40
|
||||
struct ethtool_rxfh_context *rss_ctx;
|
||||
u32 vnic_id;
|
||||
u16 default_rx_ring;
|
||||
};
|
||||
|
||||
struct bnxt_rss_ctx {
|
||||
|
|
|
|||
|
|
@ -495,12 +495,15 @@ static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
|
|||
return rc;
|
||||
case PTP_CLK_REQ_PPS:
|
||||
/* Configure PHC PPS IN */
|
||||
rc = bnxt_ptp_cfg_pin(bp, 0, BNXT_PPS_PIN_PPS_IN);
|
||||
pin_id = 0;
|
||||
if (!on)
|
||||
break;
|
||||
rc = bnxt_ptp_cfg_pin(bp, pin_id, BNXT_PPS_PIN_PPS_IN);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = bnxt_ptp_cfg_event(bp, BNXT_PPS_EVENT_INTERNAL);
|
||||
if (!rc)
|
||||
ptp->pps_info.pins[0].event = BNXT_PPS_EVENT_INTERNAL;
|
||||
ptp->pps_info.pins[pin_id].event = BNXT_PPS_EVENT_INTERNAL;
|
||||
return rc;
|
||||
default:
|
||||
netdev_err(ptp->bp->dev, "Unrecognized PIN function\n");
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user