Merge branch 'bnxt_en-bug-fixes'
Michael Chan says: ==================== bnxt_en: Bug fixes This patchset has the following fixes for bnxt_en: 1. Add missing VNIC ID parameter in the FW message when getting an updated RSS configuration from the FW. 2. Fix a warning when doing ethtool reset on newer chips. 3. Fix VLAN issue on a VF when a default VLAN is assigned. 4. Fix a problem during DPC (Downstream Port containment) scenario. 5. Fix a NULL pointer dereference when receiving a PTP event from FW. 6. Fix VXLAN/Geneve UDP port delete/add with newer FW. ==================== Link: https://lore.kernel.org/r/20230607075409.228450-1-michael.chan@broadcom.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
commit
6c0ec7ab5a
@ -2365,6 +2365,9 @@ static int bnxt_async_event_process(struct bnxt *bp,
|
||||
struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
|
||||
u64 ns;
|
||||
|
||||
if (!ptp)
|
||||
goto async_event_process_exit;
|
||||
|
||||
spin_lock_bh(&ptp->ptp_lock);
|
||||
bnxt_ptp_update_current_time(bp);
|
||||
ns = (((u64)BNXT_EVENT_PHC_RTC_UPDATE(data1) <<
|
||||
@ -4763,6 +4766,9 @@ int bnxt_hwrm_func_drv_rgtr(struct bnxt *bp, unsigned long *bmap, int bmap_size,
|
||||
if (event_id == ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY &&
|
||||
!(bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY))
|
||||
continue;
|
||||
if (event_id == ASYNC_EVENT_CMPL_EVENT_ID_PHC_UPDATE &&
|
||||
!bp->ptp_cfg)
|
||||
continue;
|
||||
__set_bit(bnxt_async_events_arr[i], async_events_bmap);
|
||||
}
|
||||
if (bmap && bmap_size) {
|
||||
@ -5350,6 +5356,7 @@ static void bnxt_hwrm_update_rss_hash_cfg(struct bnxt *bp)
|
||||
if (hwrm_req_init(bp, req, HWRM_VNIC_RSS_QCFG))
|
||||
return;
|
||||
|
||||
req->vnic_id = cpu_to_le16(vnic->fw_vnic_id);
|
||||
/* all contexts configured to same hash_type, zero always exists */
|
||||
req->rss_ctx_idx = cpu_to_le16(vnic->fw_rss_cos_lb_ctx[0]);
|
||||
resp = hwrm_req_hold(bp, req);
|
||||
@ -8812,6 +8819,9 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
if (BNXT_VF(bp))
|
||||
bnxt_hwrm_func_qcfg(bp);
|
||||
|
||||
rc = bnxt_setup_vnic(bp, 0);
|
||||
if (rc)
|
||||
goto err_out;
|
||||
@ -11598,6 +11608,7 @@ static void bnxt_tx_timeout(struct net_device *dev, unsigned int txqueue)
|
||||
static void bnxt_fw_health_check(struct bnxt *bp)
|
||||
{
|
||||
struct bnxt_fw_health *fw_health = bp->fw_health;
|
||||
struct pci_dev *pdev = bp->pdev;
|
||||
u32 val;
|
||||
|
||||
if (!fw_health->enabled || test_bit(BNXT_STATE_IN_FW_RESET, &bp->state))
|
||||
@ -11611,7 +11622,7 @@ static void bnxt_fw_health_check(struct bnxt *bp)
|
||||
}
|
||||
|
||||
val = bnxt_fw_health_readl(bp, BNXT_FW_HEARTBEAT_REG);
|
||||
if (val == fw_health->last_fw_heartbeat) {
|
||||
if (val == fw_health->last_fw_heartbeat && pci_device_is_present(pdev)) {
|
||||
fw_health->arrests++;
|
||||
goto fw_reset;
|
||||
}
|
||||
@ -11619,7 +11630,7 @@ static void bnxt_fw_health_check(struct bnxt *bp)
|
||||
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) {
|
||||
if (val != fw_health->last_fw_reset_cnt && pci_device_is_present(pdev)) {
|
||||
fw_health->discoveries++;
|
||||
goto fw_reset;
|
||||
}
|
||||
@ -13025,26 +13036,37 @@ static void bnxt_cfg_ntp_filters(struct bnxt *bp)
|
||||
|
||||
#endif /* CONFIG_RFS_ACCEL */
|
||||
|
||||
static int bnxt_udp_tunnel_sync(struct net_device *netdev, unsigned int table)
|
||||
static int bnxt_udp_tunnel_set_port(struct net_device *netdev, unsigned int table,
|
||||
unsigned int entry, struct udp_tunnel_info *ti)
|
||||
{
|
||||
struct bnxt *bp = netdev_priv(netdev);
|
||||
struct udp_tunnel_info ti;
|
||||
unsigned int cmd;
|
||||
|
||||
udp_tunnel_nic_get_port(netdev, table, 0, &ti);
|
||||
if (ti.type == UDP_TUNNEL_TYPE_VXLAN)
|
||||
if (ti->type == UDP_TUNNEL_TYPE_VXLAN)
|
||||
cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN;
|
||||
else
|
||||
cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE;
|
||||
|
||||
if (ti.port)
|
||||
return bnxt_hwrm_tunnel_dst_port_alloc(bp, ti.port, cmd);
|
||||
return bnxt_hwrm_tunnel_dst_port_alloc(bp, ti->port, cmd);
|
||||
}
|
||||
|
||||
static int bnxt_udp_tunnel_unset_port(struct net_device *netdev, unsigned int table,
|
||||
unsigned int entry, struct udp_tunnel_info *ti)
|
||||
{
|
||||
struct bnxt *bp = netdev_priv(netdev);
|
||||
unsigned int cmd;
|
||||
|
||||
if (ti->type == UDP_TUNNEL_TYPE_VXLAN)
|
||||
cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN;
|
||||
else
|
||||
cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE;
|
||||
|
||||
return bnxt_hwrm_tunnel_dst_port_free(bp, cmd);
|
||||
}
|
||||
|
||||
static const struct udp_tunnel_nic_info bnxt_udp_tunnels = {
|
||||
.sync_table = bnxt_udp_tunnel_sync,
|
||||
.set_port = bnxt_udp_tunnel_set_port,
|
||||
.unset_port = bnxt_udp_tunnel_unset_port,
|
||||
.flags = UDP_TUNNEL_NIC_INFO_MAY_SLEEP |
|
||||
UDP_TUNNEL_NIC_INFO_OPEN_ONLY,
|
||||
.tables = {
|
||||
|
@ -3831,7 +3831,7 @@ static int bnxt_reset(struct net_device *dev, u32 *flags)
|
||||
}
|
||||
}
|
||||
|
||||
if (req & BNXT_FW_RESET_AP) {
|
||||
if (!BNXT_CHIP_P4_PLUS(bp) && (req & BNXT_FW_RESET_AP)) {
|
||||
/* This feature is not supported in older firmware versions */
|
||||
if (bp->hwrm_spec_code >= 0x10803) {
|
||||
if (!bnxt_firmware_reset_ap(dev)) {
|
||||
|
@ -952,6 +952,7 @@ int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg)
|
||||
bnxt_ptp_timecounter_init(bp, true);
|
||||
bnxt_ptp_adjfine_rtc(bp, 0);
|
||||
}
|
||||
bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, true);
|
||||
|
||||
ptp->ptp_info = bnxt_ptp_caps;
|
||||
if ((bp->fw_cap & BNXT_FW_CAP_PTP_PPS)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user