summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/freescale/enetc/enetc.c
diff options
context:
space:
mode:
authorVladimir Oltean <vladimir.oltean@nxp.com>2023-04-18 14:14:53 +0300
committerJakub Kicinski <kuba@kernel.org>2023-04-20 20:03:21 -0700
commit827145392a4aad635b93e5235b7d7fecc2fa31c7 (patch)
treed92b05765108a9664e901740fdba0f58dcb05b07 /drivers/net/ethernet/freescale/enetc/enetc.c
parent153b5b1d030de3f94ecac4eec73854e4710ca6ba (diff)
net: enetc: only commit preemptible TCs to hardware when MM TX is active
This was left as TODO in commit 01e23b2b3bad ("net: enetc: add support for preemptible traffic classes") since it's relatively complicated. Where this makes a difference is with a configuration as follows: ethtool --set-mm eno0 pmac-enabled on tx-enabled on verify-enabled on Preemptible packets should only be sent when the MAC Merge TX direction becomes active (i.o.w. when the verification process succeeds, aka when the link partner confirms it can process preemptible traffic). But the tc qdisc with the preemptible traffic classes is offloaded completely asynchronously w.r.t. the MM becoming active. The ENETC manual does suggest that this should be handled in the driver: "On startup, software should wait for the verification process to complete (MMCSR[VSTS]=011) before initiating traffic". Adding the necessary logic allows future selftests to uphold the claim that an inactive or disabled MAC Merge layer should never send data packets through the pMAC. This change moves enetc_set_ptcfpr() from enetc.c to enetc_ethtool.c, where its only caller is now - enetc_mm_commit_preemptible_tcs(). Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Simon Horman <simon.horman@corigine.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'drivers/net/ethernet/freescale/enetc/enetc.c')
-rw-r--r--drivers/net/ethernet/freescale/enetc/enetc.c23
1 files changed, 6 insertions, 17 deletions
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index 41c194c1672d..3c4fa26f0f9b 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -25,23 +25,12 @@ void enetc_port_mac_wr(struct enetc_si *si, u32 reg, u32 val)
}
EXPORT_SYMBOL_GPL(enetc_port_mac_wr);
-void enetc_set_ptcfpr(struct enetc_hw *hw, unsigned long preemptible_tcs)
+static void enetc_change_preemptible_tcs(struct enetc_ndev_priv *priv,
+ u8 preemptible_tcs)
{
- u32 val;
- int tc;
-
- for (tc = 0; tc < 8; tc++) {
- val = enetc_port_rd(hw, ENETC_PTCFPR(tc));
-
- if (preemptible_tcs & BIT(tc))
- val |= ENETC_PTCFPR_FPE;
- else
- val &= ~ENETC_PTCFPR_FPE;
-
- enetc_port_wr(hw, ENETC_PTCFPR(tc), val);
- }
+ priv->preemptible_tcs = preemptible_tcs;
+ enetc_mm_commit_preemptible_tcs(priv);
}
-EXPORT_SYMBOL_GPL(enetc_set_ptcfpr);
static int enetc_num_stack_tx_queues(struct enetc_ndev_priv *priv)
{
@@ -2659,7 +2648,7 @@ static void enetc_reset_tc_mqprio(struct net_device *ndev)
enetc_debug_tx_ring_prios(priv);
- enetc_set_ptcfpr(hw, 0);
+ enetc_change_preemptible_tcs(priv, 0);
}
int enetc_setup_tc_mqprio(struct net_device *ndev, void *type_data)
@@ -2714,7 +2703,7 @@ int enetc_setup_tc_mqprio(struct net_device *ndev, void *type_data)
enetc_debug_tx_ring_prios(priv);
- enetc_set_ptcfpr(hw, mqprio->preemptible_tcs);
+ enetc_change_preemptible_tcs(priv, mqprio->preemptible_tcs);
return 0;