mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-23 16:31:15 -05:00
Merge branch 'enetc-mqprio-fixes'
Wei Fang sayus: ==================== fix crash issue when setting MQPRIO for VFs There is a crash issue when setting MQPRIO for ENETC VFs, the root casue is that ENETC VFs don't like ENETC PFs, they don't have port registers, so hw->port of VFs is NULL. However, this NULL pointer will be accessed without any checks in enetc_mm_commit_preemptible_tcs() when configuring MQPRIO for VFs. Therefore, two patches are added to fix this issue. The first patch sets ENETC_SI_F_QBU flag only for SIs that support 802.1Qbu. The second patch adds a check in enetc_change_preemptible_tcs() to ensure that SIs that do not support 802.1Qbu do not configure preemptible TCs. --- v1 Link: https://lore.kernel.org/imx/20241030082117.1172634-1-wei.fang@nxp.com/ v2 Link: https://lore.kernel.org/imx/20241104054309.1388433-1-wei.fang@nxp.com/ --- ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -29,6 +29,9 @@ EXPORT_SYMBOL_GPL(enetc_port_mac_wr);
|
||||
static void enetc_change_preemptible_tcs(struct enetc_ndev_priv *priv,
|
||||
u8 preemptible_tcs)
|
||||
{
|
||||
if (!(priv->si->hw_features & ENETC_SI_F_QBU))
|
||||
return;
|
||||
|
||||
priv->preemptible_tcs = preemptible_tcs;
|
||||
enetc_mm_commit_preemptible_tcs(priv);
|
||||
}
|
||||
@@ -1756,15 +1759,6 @@ void enetc_get_si_caps(struct enetc_si *si)
|
||||
rss = enetc_rd(hw, ENETC_SIRSSCAPR);
|
||||
si->num_rss = ENETC_SIRSSCAPR_GET_NUM_RSS(rss);
|
||||
}
|
||||
|
||||
if (val & ENETC_SIPCAPR0_QBV)
|
||||
si->hw_features |= ENETC_SI_F_QBV;
|
||||
|
||||
if (val & ENETC_SIPCAPR0_QBU)
|
||||
si->hw_features |= ENETC_SI_F_QBU;
|
||||
|
||||
if (val & ENETC_SIPCAPR0_PSFP)
|
||||
si->hw_features |= ENETC_SI_F_PSFP;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(enetc_get_si_caps);
|
||||
|
||||
|
||||
@@ -23,10 +23,7 @@
|
||||
#define ENETC_SICTR0 0x18
|
||||
#define ENETC_SICTR1 0x1c
|
||||
#define ENETC_SIPCAPR0 0x20
|
||||
#define ENETC_SIPCAPR0_PSFP BIT(9)
|
||||
#define ENETC_SIPCAPR0_RSS BIT(8)
|
||||
#define ENETC_SIPCAPR0_QBV BIT(4)
|
||||
#define ENETC_SIPCAPR0_QBU BIT(3)
|
||||
#define ENETC_SIPCAPR0_RFS BIT(2)
|
||||
#define ENETC_SIPCAPR1 0x24
|
||||
#define ENETC_SITGTGR 0x30
|
||||
@@ -194,6 +191,9 @@ enum enetc_bdr_type {TX, RX};
|
||||
#define ENETC_PCAPR0 0x0900
|
||||
#define ENETC_PCAPR0_RXBDR(val) ((val) >> 24)
|
||||
#define ENETC_PCAPR0_TXBDR(val) (((val) >> 16) & 0xff)
|
||||
#define ENETC_PCAPR0_PSFP BIT(9)
|
||||
#define ENETC_PCAPR0_QBV BIT(4)
|
||||
#define ENETC_PCAPR0_QBU BIT(3)
|
||||
#define ENETC_PCAPR1 0x0904
|
||||
#define ENETC_PSICFGR0(n) (0x0940 + (n) * 0xc) /* n = SI index */
|
||||
#define ENETC_PSICFGR0_SET_TXBDR(val) ((val) & 0xff)
|
||||
|
||||
@@ -409,6 +409,23 @@ static void enetc_port_assign_rfs_entries(struct enetc_si *si)
|
||||
enetc_port_wr(hw, ENETC_PRFSMR, ENETC_PRFSMR_RFSE);
|
||||
}
|
||||
|
||||
static void enetc_port_get_caps(struct enetc_si *si)
|
||||
{
|
||||
struct enetc_hw *hw = &si->hw;
|
||||
u32 val;
|
||||
|
||||
val = enetc_port_rd(hw, ENETC_PCAPR0);
|
||||
|
||||
if (val & ENETC_PCAPR0_QBV)
|
||||
si->hw_features |= ENETC_SI_F_QBV;
|
||||
|
||||
if (val & ENETC_PCAPR0_QBU)
|
||||
si->hw_features |= ENETC_SI_F_QBU;
|
||||
|
||||
if (val & ENETC_PCAPR0_PSFP)
|
||||
si->hw_features |= ENETC_SI_F_PSFP;
|
||||
}
|
||||
|
||||
static void enetc_port_si_configure(struct enetc_si *si)
|
||||
{
|
||||
struct enetc_pf *pf = enetc_si_priv(si);
|
||||
@@ -416,6 +433,8 @@ static void enetc_port_si_configure(struct enetc_si *si)
|
||||
int num_rings, i;
|
||||
u32 val;
|
||||
|
||||
enetc_port_get_caps(si);
|
||||
|
||||
val = enetc_port_rd(hw, ENETC_PCAPR0);
|
||||
num_rings = min(ENETC_PCAPR0_RXBDR(val), ENETC_PCAPR0_TXBDR(val));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user