]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: enetc: update max chained Tx BD number for i.MX95 ENETC
authorWei Fang <wei.fang@nxp.com>
Thu, 19 Dec 2024 05:47:53 +0000 (13:47 +0800)
committerJakub Kicinski <kuba@kernel.org>
Mon, 23 Dec 2024 17:54:33 +0000 (09:54 -0800)
The max chained Tx BDs of latest ENETC (i.MX95 ENETC, rev 4.1) has been
increased to 63, but since the range of MAX_SKB_FRAGS is 17~45, so for
i.MX95 ENETC and later revision, it is better to set ENETC4_MAX_SKB_FRAGS
to MAX_SKB_FRAGS.

In addition, add max_frags in struct enetc_drvdata to indicate the max
chained BDs supported by device. Because the max number of chained BDs
supported by LS1028A and i.MX95 ENETC is different.

Signed-off-by: Wei Fang <wei.fang@nxp.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Reviewed-by: Claudiu Manoil <claudiu.manoil@nxp.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20241219054755.1615626-3-wei.fang@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/freescale/enetc/enetc.c
drivers/net/ethernet/freescale/enetc/enetc.h
drivers/net/ethernet/freescale/enetc/enetc_pf_common.c
drivers/net/ethernet/freescale/enetc/enetc_vf.c

index 88f12c88110ff400392af243af0e5c09198b1171..76c33506991b237a66ec67401df76f8d94a512fa 100644 (file)
@@ -534,6 +534,7 @@ static void enetc_tso_complete_csum(struct enetc_bdr *tx_ring, struct tso_t *tso
 
 static int enetc_map_tx_tso_buffs(struct enetc_bdr *tx_ring, struct sk_buff *skb)
 {
+       struct enetc_ndev_priv *priv = netdev_priv(tx_ring->ndev);
        int hdr_len, total_len, data_len;
        struct enetc_tx_swbd *tx_swbd;
        union enetc_tx_bd *txbd;
@@ -599,7 +600,7 @@ static int enetc_map_tx_tso_buffs(struct enetc_bdr *tx_ring, struct sk_buff *skb
                        bd_data_num++;
                        tso_build_data(skb, &tso, size);
 
-                       if (unlikely(bd_data_num >= ENETC_MAX_SKB_FRAGS && data_len))
+                       if (unlikely(bd_data_num >= priv->max_frags && data_len))
                                goto err_chained_bd;
                }
 
@@ -660,7 +661,7 @@ static netdev_tx_t enetc_start_xmit(struct sk_buff *skb,
                count = enetc_map_tx_tso_buffs(tx_ring, skb);
                enetc_unlock_mdio();
        } else {
-               if (unlikely(skb_shinfo(skb)->nr_frags > ENETC_MAX_SKB_FRAGS))
+               if (unlikely(skb_shinfo(skb)->nr_frags > priv->max_frags))
                        if (unlikely(skb_linearize(skb)))
                                goto drop_packet_err;
 
@@ -678,7 +679,7 @@ static netdev_tx_t enetc_start_xmit(struct sk_buff *skb,
        if (unlikely(!count))
                goto drop_packet_err;
 
-       if (enetc_bd_unused(tx_ring) < ENETC_TXBDS_MAX_NEEDED)
+       if (enetc_bd_unused(tx_ring) < ENETC_TXBDS_MAX_NEEDED(priv->max_frags))
                netif_stop_subqueue(ndev, tx_ring->index);
 
        return NETDEV_TX_OK;
@@ -946,7 +947,8 @@ static bool enetc_clean_tx_ring(struct enetc_bdr *tx_ring, int napi_budget)
        if (unlikely(tx_frm_cnt && netif_carrier_ok(ndev) &&
                     __netif_subqueue_stopped(ndev, tx_ring->index) &&
                     !test_bit(ENETC_TX_DOWN, &priv->flags) &&
-                    (enetc_bd_unused(tx_ring) >= ENETC_TXBDS_MAX_NEEDED))) {
+                    (enetc_bd_unused(tx_ring) >=
+                     ENETC_TXBDS_MAX_NEEDED(priv->max_frags)))) {
                netif_wake_subqueue(ndev, tx_ring->index);
        }
 
@@ -3307,18 +3309,21 @@ EXPORT_SYMBOL_GPL(enetc_pci_remove);
 static const struct enetc_drvdata enetc_pf_data = {
        .sysclk_freq = ENETC_CLK_400M,
        .pmac_offset = ENETC_PMAC_OFFSET,
+       .max_frags = ENETC_MAX_SKB_FRAGS,
        .eth_ops = &enetc_pf_ethtool_ops,
 };
 
 static const struct enetc_drvdata enetc4_pf_data = {
        .sysclk_freq = ENETC_CLK_333M,
        .tx_csum = true,
+       .max_frags = ENETC4_MAX_SKB_FRAGS,
        .pmac_offset = ENETC4_PMAC_OFFSET,
        .eth_ops = &enetc4_pf_ethtool_ops,
 };
 
 static const struct enetc_drvdata enetc_vf_data = {
        .sysclk_freq = ENETC_CLK_400M,
+       .max_frags = ENETC_MAX_SKB_FRAGS,
        .eth_ops = &enetc_vf_ethtool_ops,
 };
 
index e82eb9a9137c9984a802639875540c2415ce9a40..1e680f0f512364ad4a1a09e5d2a2aa713c0d5367 100644 (file)
@@ -59,9 +59,16 @@ struct enetc_rx_swbd {
 
 /* ENETC overhead: optional extension BD + 1 BD gap */
 #define ENETC_TXBDS_NEEDED(val)        ((val) + 2)
-/* max # of chained Tx BDs is 15, including head and extension BD */
+/* For LS1028A, max # of chained Tx BDs is 15, including head and
+ * extension BD.
+ */
 #define ENETC_MAX_SKB_FRAGS    13
-#define ENETC_TXBDS_MAX_NEEDED ENETC_TXBDS_NEEDED(ENETC_MAX_SKB_FRAGS + 1)
+/* For ENETC v4 and later versions, max # of chained Tx BDs is 63,
+ * including head and extension BD, but the range of MAX_SKB_FRAGS
+ * is 17 ~ 45, so set ENETC4_MAX_SKB_FRAGS to MAX_SKB_FRAGS.
+ */
+#define ENETC4_MAX_SKB_FRAGS           MAX_SKB_FRAGS
+#define ENETC_TXBDS_MAX_NEEDED(x)      ENETC_TXBDS_NEEDED((x) + 1)
 
 struct enetc_ring_stats {
        unsigned int packets;
@@ -235,6 +242,7 @@ enum enetc_errata {
 struct enetc_drvdata {
        u32 pmac_offset; /* Only valid for PSI which supports 802.1Qbu */
        u8 tx_csum:1;
+       u8 max_frags;
        u64 sysclk_freq;
        const struct ethtool_ops *eth_ops;
 };
@@ -377,6 +385,7 @@ struct enetc_ndev_priv {
        u16 msg_enable;
 
        u8 preemptible_tcs;
+       u8 max_frags; /* The maximum number of BDs for fragments */
 
        enum enetc_active_offloads active_offloads;
 
index 09f2d7ec44eb2c94b73b039dc20c0fa3a0f69cc4..00b73a9487466dd74182e1ee1fc1c38a065bfd2a 100644 (file)
@@ -101,6 +101,7 @@ void enetc_pf_netdev_setup(struct enetc_si *si, struct net_device *ndev,
 
        priv->msg_enable = (NETIF_MSG_WOL << 1) - 1;
        priv->sysclk_freq = si->drvdata->sysclk_freq;
+       priv->max_frags = si->drvdata->max_frags;
        ndev->netdev_ops = ndev_ops;
        enetc_set_ethtool_ops(ndev);
        ndev->watchdog_timeo = 5 * HZ;
index a5f8ce576b6e80ed0f396ae7fb200464d90506c2..63d78b2b8670931dcb40f7b54c954ae691d286eb 100644 (file)
@@ -136,6 +136,7 @@ static void enetc_vf_netdev_setup(struct enetc_si *si, struct net_device *ndev,
 
        priv->msg_enable = (NETIF_MSG_IFUP << 1) - 1;
        priv->sysclk_freq = si->drvdata->sysclk_freq;
+       priv->max_frags = si->drvdata->max_frags;
        ndev->netdev_ops = ndev_ops;
        enetc_set_ethtool_ops(ndev);
        ndev->watchdog_timeo = 5 * HZ;