Commit 5dfd7d94 authored by Paolo Abeni's avatar Paolo Abeni
Browse files

Merge branch 'bnxt_en-bug-fixes'

Michael Chan says:

====================
bnxt_en: Bug fixes

This patchset fixes several things:

1. AER recovery for RoCE when NIC interface is down.
2. Set ethtool backplane link modes correctly.
3. Update RSS ring ID during RX queue restart.
4. Crash with XDP and MTU change.
5. PCIe completion timeout when reading PHC after shutdown.
====================

Link: https://patch.msgid.link/20241122224547.984808-1-michael.chan@broadcom.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 9cfb5e7f 3661c05c
Loading
Loading
Loading
Loading
+31 −6
Original line number Diff line number Diff line
@@ -4661,7 +4661,7 @@ int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode)
	struct net_device *dev = bp->dev;

	if (page_mode) {
		bp->flags &= ~BNXT_FLAG_AGG_RINGS;
		bp->flags &= ~(BNXT_FLAG_AGG_RINGS | BNXT_FLAG_NO_AGG_RINGS);
		bp->flags |= BNXT_FLAG_RX_PAGE_MODE;

		if (bp->xdp_prog->aux->xdp_has_frags)
@@ -9296,7 +9296,6 @@ static int __bnxt_hwrm_ptp_qcfg(struct bnxt *bp)
	struct hwrm_port_mac_ptp_qcfg_output *resp;
	struct hwrm_port_mac_ptp_qcfg_input *req;
	struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
	bool phc_cfg;
	u8 flags;
	int rc;

@@ -9343,8 +9342,9 @@ static int __bnxt_hwrm_ptp_qcfg(struct bnxt *bp)
		rc = -ENODEV;
		goto exit;
	}
	phc_cfg = (flags & PORT_MAC_PTP_QCFG_RESP_FLAGS_RTC_CONFIGURED) != 0;
	rc = bnxt_ptp_init(bp, phc_cfg);
	ptp->rtc_configured =
		(flags & PORT_MAC_PTP_QCFG_RESP_FLAGS_RTC_CONFIGURED) != 0;
	rc = bnxt_ptp_init(bp);
	if (rc)
		netdev_warn(bp->dev, "PTP initialization failed.\n");
exit:
@@ -14740,6 +14740,14 @@ static int bnxt_change_mtu(struct net_device *dev, int new_mtu)
		bnxt_close_nic(bp, true, false);

	WRITE_ONCE(dev->mtu, new_mtu);

	/* MTU change may change the AGG ring settings if an XDP multi-buffer
	 * program is attached.  We need to set the AGG rings settings and
	 * rx_skb_func accordingly.
	 */
	if (READ_ONCE(bp->xdp_prog))
		bnxt_set_rx_skb_mode(bp, true);

	bnxt_set_ring_params(bp);

	if (netif_running(dev))
@@ -15477,6 +15485,13 @@ static int bnxt_queue_start(struct net_device *dev, void *qmem, int idx)

	for (i = 0; i <= BNXT_VNIC_NTUPLE; i++) {
		vnic = &bp->vnic_info[i];

		rc = bnxt_hwrm_vnic_set_rss_p5(bp, vnic, true);
		if (rc) {
			netdev_err(bp->dev, "hwrm vnic %d set rss failure rc: %d\n",
				   vnic->vnic_id, rc);
			return rc;
		}
		vnic->mru = bp->dev->mtu + ETH_HLEN + VLAN_HLEN;
		bnxt_hwrm_vnic_update(bp, vnic,
				      VNIC_UPDATE_REQ_ENABLES_MRU_VALID);
@@ -16230,6 +16245,7 @@ static void bnxt_shutdown(struct pci_dev *pdev)
	if (netif_running(dev))
		dev_close(dev);

	bnxt_ptp_clear(bp);
	bnxt_clear_int_mode(bp);
	pci_disable_device(pdev);

@@ -16257,6 +16273,7 @@ static int bnxt_suspend(struct device *device)
		rc = bnxt_close(dev);
	}
	bnxt_hwrm_func_drv_unrgtr(bp);
	bnxt_ptp_clear(bp);
	pci_disable_device(bp->pdev);
	bnxt_free_ctx_mem(bp, false);
	rtnl_unlock();
@@ -16300,6 +16317,10 @@ static int bnxt_resume(struct device *device)
	if (bp->fw_crash_mem)
		bnxt_hwrm_crash_dump_mem_cfg(bp);

	if (bnxt_ptp_init(bp)) {
		kfree(bp->ptp_cfg);
		bp->ptp_cfg = NULL;
	}
	bnxt_get_wol_settings(bp);
	if (netif_running(dev)) {
		rc = bnxt_open(dev);
@@ -16478,8 +16499,12 @@ static void bnxt_io_resume(struct pci_dev *pdev)
	rtnl_lock();

	err = bnxt_hwrm_func_qcaps(bp);
	if (!err && netif_running(netdev))
	if (!err) {
		if (netif_running(netdev))
			err = bnxt_open(netdev);
		else
			err = bnxt_reserve_rings(bp, true);
	}

	if (!err)
		netif_device_attach(netdev);
+7 −2
Original line number Diff line number Diff line
@@ -2837,19 +2837,24 @@ static int bnxt_get_link_ksettings(struct net_device *dev,
	}

	base->port = PORT_NONE;
	if (link_info->media_type == PORT_PHY_QCFG_RESP_MEDIA_TYPE_TP) {
	if (media == BNXT_MEDIA_TP) {
		base->port = PORT_TP;
		linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT,
				 lk_ksettings->link_modes.supported);
		linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT,
				 lk_ksettings->link_modes.advertising);
	} else if (media == BNXT_MEDIA_KR) {
		linkmode_set_bit(ETHTOOL_LINK_MODE_Backplane_BIT,
				 lk_ksettings->link_modes.supported);
		linkmode_set_bit(ETHTOOL_LINK_MODE_Backplane_BIT,
				 lk_ksettings->link_modes.advertising);
	} else {
		linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT,
				 lk_ksettings->link_modes.supported);
		linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT,
				 lk_ksettings->link_modes.advertising);

		if (link_info->media_type == PORT_PHY_QCFG_RESP_MEDIA_TYPE_DAC)
		if (media == BNXT_MEDIA_CR)
			base->port = PORT_DA;
		else
			base->port = PORT_FIBRE;
+2 −2
Original line number Diff line number Diff line
@@ -1038,7 +1038,7 @@ static void bnxt_ptp_free(struct bnxt *bp)
	}
}

int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg)
int bnxt_ptp_init(struct bnxt *bp)
{
	struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
	int rc;
@@ -1061,7 +1061,7 @@ int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg)

	if (BNXT_PTP_USE_RTC(bp)) {
		bnxt_ptp_timecounter_init(bp, false);
		rc = bnxt_ptp_init_rtc(bp, phc_cfg);
		rc = bnxt_ptp_init_rtc(bp, ptp->rtc_configured);
		if (rc)
			goto out;
	} else {
+2 −1
Original line number Diff line number Diff line
@@ -135,6 +135,7 @@ struct bnxt_ptp_cfg {
					 BNXT_PTP_MSG_PDELAY_REQ |	\
					 BNXT_PTP_MSG_PDELAY_RESP)
	u8			tx_tstamp_en:1;
	u8			rtc_configured:1;
	int			rx_filter;
	u32			tstamp_filters;

@@ -168,7 +169,7 @@ void bnxt_tx_ts_cmp(struct bnxt *bp, struct bnxt_napi *bnapi,
		    struct tx_ts_cmp *tscmp);
void bnxt_ptp_rtc_timecounter_init(struct bnxt_ptp_cfg *ptp, u64 ns);
int bnxt_ptp_init_rtc(struct bnxt *bp, bool phc_cfg);
int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg);
int bnxt_ptp_init(struct bnxt *bp);
void bnxt_ptp_clear(struct bnxt *bp);
static inline u64 bnxt_timecounter_cyc2time(struct bnxt_ptp_cfg *ptp, u64 ts)
{