Skip to content

Commit 8e00072

Browse files
vladimirolteandavem330
authored andcommitted
net: enetc: read TSN capabilities from port register, not SI
Configuring TSN (Qbv, Qbu, PSFP) capabilities requires access to port registers, which are available to the PSI but not the VSI. Yet, the SI port capability register 0 (PSICAPR0), exposed to both PSIs and VSIs, presents the same capabilities to the VF as to the PF, thus leading the VF driver into thinking it can configure these features. In the case of ENETC_SI_F_QBU, having it set in the VF leads to a crash: root@ls1028ardb:~# tc qdisc add dev eno0vf0 parent root handle 100: \ mqprio num_tc 4 map 0 0 1 1 2 2 3 3 queues 1@0 1@1 1@2 1@3 hw 1 [ 187.290775] Unable to handle kernel paging request at virtual address 0000000000001f00 [ 187.424831] pc : enetc_mm_commit_preemptible_tcs+0x1c4/0x400 [ 187.430518] lr : enetc_mm_commit_preemptible_tcs+0x30c/0x400 [ 187.511140] Call trace: [ 187.513588] enetc_mm_commit_preemptible_tcs+0x1c4/0x400 [ 187.518918] enetc_setup_tc_mqprio+0x180/0x214 [ 187.523374] enetc_vf_setup_tc+0x1c/0x30 [ 187.527306] mqprio_enable_offload+0x144/0x178 [ 187.531766] mqprio_init+0x3ec/0x668 [ 187.535351] qdisc_create+0x15c/0x488 [ 187.539023] tc_modify_qdisc+0x398/0x73c [ 187.542958] rtnetlink_rcv_msg+0x128/0x378 [ 187.547064] netlink_rcv_skb+0x60/0x130 [ 187.550910] rtnetlink_rcv+0x18/0x24 [ 187.554492] netlink_unicast+0x300/0x36c [ 187.558425] netlink_sendmsg+0x1a8/0x420 [ 187.606759] ---[ end trace 0000000000000000 ]--- while the other TSN features in the VF are harmless, because the net_device_ops used for the VF driver do not expose entry points for these other features. These capability bits are in the process of being defeatured from the SI registers. We should read them from the port capability register, where they are also present, and which is naturally only exposed to the PF. The change to blame (relevant for stable backports) is the one where this started being a problem, aka when the kernel started to crash due to the wrong capability seen by the VF driver. Fixes: 8271453 ("net: enetc: only commit preemptible TCs to hardware when MM TX is active") Reported-by: Wei Fang <wei.fang@nxp.com> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Frank Li <Frank.Li@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 65ae975 commit 8e00072

File tree

3 files changed

+22
-12
lines changed

3 files changed

+22
-12
lines changed

drivers/net/ethernet/freescale/enetc/enetc.c

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1756,15 +1756,6 @@ void enetc_get_si_caps(struct enetc_si *si)
17561756
rss = enetc_rd(hw, ENETC_SIRSSCAPR);
17571757
si->num_rss = ENETC_SIRSSCAPR_GET_NUM_RSS(rss);
17581758
}
1759-
1760-
if (val & ENETC_SIPCAPR0_QBV)
1761-
si->hw_features |= ENETC_SI_F_QBV;
1762-
1763-
if (val & ENETC_SIPCAPR0_QBU)
1764-
si->hw_features |= ENETC_SI_F_QBU;
1765-
1766-
if (val & ENETC_SIPCAPR0_PSFP)
1767-
si->hw_features |= ENETC_SI_F_PSFP;
17681759
}
17691760
EXPORT_SYMBOL_GPL(enetc_get_si_caps);
17701761

drivers/net/ethernet/freescale/enetc/enetc_hw.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@
2323
#define ENETC_SICTR0 0x18
2424
#define ENETC_SICTR1 0x1c
2525
#define ENETC_SIPCAPR0 0x20
26-
#define ENETC_SIPCAPR0_PSFP BIT(9)
2726
#define ENETC_SIPCAPR0_RSS BIT(8)
28-
#define ENETC_SIPCAPR0_QBV BIT(4)
29-
#define ENETC_SIPCAPR0_QBU BIT(3)
3027
#define ENETC_SIPCAPR0_RFS BIT(2)
3128
#define ENETC_SIPCAPR1 0x24
3229
#define ENETC_SITGTGR 0x30
@@ -194,6 +191,9 @@ enum enetc_bdr_type {TX, RX};
194191
#define ENETC_PCAPR0 0x0900
195192
#define ENETC_PCAPR0_RXBDR(val) ((val) >> 24)
196193
#define ENETC_PCAPR0_TXBDR(val) (((val) >> 16) & 0xff)
194+
#define ENETC_PCAPR0_PSFP BIT(9)
195+
#define ENETC_PCAPR0_QBV BIT(4)
196+
#define ENETC_PCAPR0_QBU BIT(3)
197197
#define ENETC_PCAPR1 0x0904
198198
#define ENETC_PSICFGR0(n) (0x0940 + (n) * 0xc) /* n = SI index */
199199
#define ENETC_PSICFGR0_SET_TXBDR(val) ((val) & 0xff)

drivers/net/ethernet/freescale/enetc/enetc_pf.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,13 +409,32 @@ static void enetc_port_assign_rfs_entries(struct enetc_si *si)
409409
enetc_port_wr(hw, ENETC_PRFSMR, ENETC_PRFSMR_RFSE);
410410
}
411411

412+
static void enetc_port_get_caps(struct enetc_si *si)
413+
{
414+
struct enetc_hw *hw = &si->hw;
415+
u32 val;
416+
417+
val = enetc_port_rd(hw, ENETC_PCAPR0);
418+
419+
if (val & ENETC_PCAPR0_QBV)
420+
si->hw_features |= ENETC_SI_F_QBV;
421+
422+
if (val & ENETC_PCAPR0_QBU)
423+
si->hw_features |= ENETC_SI_F_QBU;
424+
425+
if (val & ENETC_PCAPR0_PSFP)
426+
si->hw_features |= ENETC_SI_F_PSFP;
427+
}
428+
412429
static void enetc_port_si_configure(struct enetc_si *si)
413430
{
414431
struct enetc_pf *pf = enetc_si_priv(si);
415432
struct enetc_hw *hw = &si->hw;
416433
int num_rings, i;
417434
u32 val;
418435

436+
enetc_port_get_caps(si);
437+
419438
val = enetc_port_rd(hw, ENETC_PCAPR0);
420439
num_rings = min(ENETC_PCAPR0_RXBDR(val), ENETC_PCAPR0_TXBDR(val));
421440

0 commit comments

Comments
 (0)