Message ID | 20240412180340.7965-2-fancer.lancer@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | net: stmmac: Fix MAC-capabilities procedure | expand |
On Fri, 12 Apr 2024, Serge Semin wrote: > There are three DW MAC IP-cores which can have the multiple Tx/Rx queues > enabled: > DW GMAC v3.7+ with AV feature, > DW QoS Eth v4.x/v5.x, > DW XGMAC/XLGMAC > Based on the respective HW databooks, only the DW QoS Eth IP-core doesn't > support the half-duplex link mode in case if more than one queues enabled: > > "In multiple queue/channel configurations, for half-duplex operation, > enable only the Q0/CH0 on Tx and Rx. For single queue/channel in > full-duplex operation, any queue/channel can be enabled." > > The rest of the IP-cores don't have such constraint. Thus in order to have > the constraint applied for the DW QoS Eth MACs only, let's move the it' > implementation to the respective MAC-capabilities getter and make sure the > getter is called in the queues re-init procedure. > > Fixes: b6cfffa7ad92 ("stmmac: fix DMA channel hang in half-duplex mode") > Signed-off-by: Serge Semin <fancer.lancer@gmail.com> > --- > .../net/ethernet/stmicro/stmmac/dwmac4_core.c | 7 +++++++ > .../net/ethernet/stmicro/stmmac/stmmac_main.c | 19 +++---------------- > 2 files changed, 10 insertions(+), 16 deletions(-) > > diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c > index cef25efbdff9..ec6a13e644b3 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c > +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c > @@ -71,6 +71,13 @@ static void dwmac4_core_init(struct mac_device_info *hw, > static void dwmac4_phylink_get_caps(struct stmmac_priv *priv) > { > priv->phylink_config.mac_capabilities |= MAC_2500FD; > + > + if (priv->plat->tx_queues_to_use > 1) > + priv->phylink_config.mac_capabilities &= > + ~(MAC_10HD | MAC_100HD | MAC_1000HD); > + else > + priv->phylink_config.mac_capabilities |= > + (MAC_10HD | MAC_100HD | MAC_1000HD); > } > > static void dwmac4_rx_queue_enable(struct mac_device_info *hw, > diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c > index 24cd80490d19..dd58c21b53ee 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c > +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c > @@ -1198,17 +1198,6 @@ static int stmmac_init_phy(struct net_device *dev) > return ret; > } > > -static void stmmac_set_half_duplex(struct stmmac_priv *priv) > -{ > - /* Half-Duplex can only work with single tx queue */ > - if (priv->plat->tx_queues_to_use > 1) > - priv->phylink_config.mac_capabilities &= > - ~(MAC_10HD | MAC_100HD | MAC_1000HD); > - else > - priv->phylink_config.mac_capabilities |= > - (MAC_10HD | MAC_100HD | MAC_1000HD); > -} > - > static int stmmac_phy_setup(struct stmmac_priv *priv) > { > struct stmmac_mdio_bus_data *mdio_bus_data; > @@ -1237,10 +1226,7 @@ static int stmmac_phy_setup(struct stmmac_priv *priv) > priv->phylink_config.supported_interfaces); > > priv->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | > - MAC_10FD | MAC_100FD | > - MAC_1000FD; > - > - stmmac_set_half_duplex(priv); > + MAC_10 | MAC_100 | MAC_1000; > > /* Get the MAC specific capabilities */ > stmmac_mac_phylink_get_caps(priv); > @@ -7355,7 +7341,8 @@ int stmmac_reinit_queues(struct net_device *dev, u32 rx_cnt, u32 tx_cnt) > priv->rss.table[i] = ethtool_rxfh_indir_default(i, > rx_cnt); > > - stmmac_set_half_duplex(priv); > + stmmac_mac_phylink_get_caps(priv); > + > stmmac_napi_add(dev); > > if (netif_running(dev)) > -- > 2.43.0 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > Reviewed-by: Romain Gantois <romain.gantois@bootlin.com> Thanks,
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c index cef25efbdff9..ec6a13e644b3 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c @@ -71,6 +71,13 @@ static void dwmac4_core_init(struct mac_device_info *hw, static void dwmac4_phylink_get_caps(struct stmmac_priv *priv) { priv->phylink_config.mac_capabilities |= MAC_2500FD; + + if (priv->plat->tx_queues_to_use > 1) + priv->phylink_config.mac_capabilities &= + ~(MAC_10HD | MAC_100HD | MAC_1000HD); + else + priv->phylink_config.mac_capabilities |= + (MAC_10HD | MAC_100HD | MAC_1000HD); } static void dwmac4_rx_queue_enable(struct mac_device_info *hw, diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 24cd80490d19..dd58c21b53ee 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -1198,17 +1198,6 @@ static int stmmac_init_phy(struct net_device *dev) return ret; } -static void stmmac_set_half_duplex(struct stmmac_priv *priv) -{ - /* Half-Duplex can only work with single tx queue */ - if (priv->plat->tx_queues_to_use > 1) - priv->phylink_config.mac_capabilities &= - ~(MAC_10HD | MAC_100HD | MAC_1000HD); - else - priv->phylink_config.mac_capabilities |= - (MAC_10HD | MAC_100HD | MAC_1000HD); -} - static int stmmac_phy_setup(struct stmmac_priv *priv) { struct stmmac_mdio_bus_data *mdio_bus_data; @@ -1237,10 +1226,7 @@ static int stmmac_phy_setup(struct stmmac_priv *priv) priv->phylink_config.supported_interfaces); priv->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE | - MAC_10FD | MAC_100FD | - MAC_1000FD; - - stmmac_set_half_duplex(priv); + MAC_10 | MAC_100 | MAC_1000; /* Get the MAC specific capabilities */ stmmac_mac_phylink_get_caps(priv); @@ -7355,7 +7341,8 @@ int stmmac_reinit_queues(struct net_device *dev, u32 rx_cnt, u32 tx_cnt) priv->rss.table[i] = ethtool_rxfh_indir_default(i, rx_cnt); - stmmac_set_half_duplex(priv); + stmmac_mac_phylink_get_caps(priv); + stmmac_napi_add(dev); if (netif_running(dev))
There are three DW MAC IP-cores which can have the multiple Tx/Rx queues enabled: DW GMAC v3.7+ with AV feature, DW QoS Eth v4.x/v5.x, DW XGMAC/XLGMAC Based on the respective HW databooks, only the DW QoS Eth IP-core doesn't support the half-duplex link mode in case if more than one queues enabled: "In multiple queue/channel configurations, for half-duplex operation, enable only the Q0/CH0 on Tx and Rx. For single queue/channel in full-duplex operation, any queue/channel can be enabled." The rest of the IP-cores don't have such constraint. Thus in order to have the constraint applied for the DW QoS Eth MACs only, let's move the it' implementation to the respective MAC-capabilities getter and make sure the getter is called in the queues re-init procedure. Fixes: b6cfffa7ad92 ("stmmac: fix DMA channel hang in half-duplex mode") Signed-off-by: Serge Semin <fancer.lancer@gmail.com> --- .../net/ethernet/stmicro/stmmac/dwmac4_core.c | 7 +++++++ .../net/ethernet/stmicro/stmmac/stmmac_main.c | 19 +++---------------- 2 files changed, 10 insertions(+), 16 deletions(-)