[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <ZyzreUeh9PddNBY/@lizhi-Precision-Tower-5810>
Date: Thu, 7 Nov 2024 11:31:53 -0500
From: Frank Li <Frank.li@....com>
To: Wei Fang <wei.fang@....com>
Cc: claudiu.manoil@....com, vladimir.oltean@....com, xiaoning.wang@....com,
andrew+netdev@...n.ch, davem@...emloft.net, edumazet@...gle.com,
kuba@...nel.org, pabeni@...hat.com, netdev@...r.kernel.org,
linux-kernel@...r.kernel.org, imx@...ts.linux.dev
Subject: Re: [PATCH net-next 3/5] net: enetc: update max chained Tx BD number
for i.MX95 ENETC
On Thu, Nov 07, 2024 at 11:38:15AM +0800, Wei Fang wrote:
> 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.
Add empty line here
> Because the maximum number of chained BDs supported by LS1028A and i.MX95
> ENETC is different, so add max_frags to struct enetc_drvdata to indicate
> the maximum chained BDs supported by device.
Add ... because ...
Reviewed-by: Frank Li <Frank.Li@....com>
>
> Signed-off-by: Wei Fang <wei.fang@....com>
> ---
> drivers/net/ethernet/freescale/enetc/enetc.c | 13 +++++++++----
> drivers/net/ethernet/freescale/enetc/enetc.h | 13 +++++++++++--
> .../net/ethernet/freescale/enetc/enetc_pf_common.c | 1 +
> drivers/net/ethernet/freescale/enetc/enetc_vf.c | 1 +
> 4 files changed, 22 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
> index f98d14841838..b294ca4c2885 100644
> --- a/drivers/net/ethernet/freescale/enetc/enetc.c
> +++ b/drivers/net/ethernet/freescale/enetc/enetc.c
> @@ -530,6 +530,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;
> @@ -595,7 +596,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;
> }
>
> @@ -656,7 +657,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;
>
> @@ -674,7 +675,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;
> @@ -942,7 +943,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);
> }
>
> @@ -3317,6 +3319,7 @@ 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,
> };
>
> @@ -3325,11 +3328,13 @@ static const struct enetc_drvdata enetc4_pf_data = {
> .pmac_offset = ENETC4_PMAC_OFFSET,
> .rx_csum = 1,
> .tx_csum = 1,
> + .max_frags = ENETC4_MAX_SKB_FRAGS,
> .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,
> };
>
> diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h b/drivers/net/ethernet/freescale/enetc/enetc.h
> index ee11ff97e9ed..a78af4f624e0 100644
> --- a/drivers/net/ethernet/freescale/enetc/enetc.h
> +++ b/drivers/net/ethernet/freescale/enetc/enetc.h
> @@ -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;
> @@ -236,6 +243,7 @@ struct enetc_drvdata {
> u32 pmac_offset; /* Only valid for PSI which supports 802.1Qbu */
> u8 rx_csum:1;
> u8 tx_csum:1;
> + u8 max_frags;
> u64 sysclk_freq;
> const struct ethtool_ops *eth_ops;
> };
> @@ -379,6 +387,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;
>
> diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf_common.c b/drivers/net/ethernet/freescale/enetc/enetc_pf_common.c
> index 3a8a5b6d8c26..2c4c6af672e7 100644
> --- a/drivers/net/ethernet/freescale/enetc/enetc_pf_common.c
> +++ b/drivers/net/ethernet/freescale/enetc/enetc_pf_common.c
> @@ -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;
> diff --git a/drivers/net/ethernet/freescale/enetc/enetc_vf.c b/drivers/net/ethernet/freescale/enetc/enetc_vf.c
> index 31e630638090..052833acd220 100644
> --- a/drivers/net/ethernet/freescale/enetc/enetc_vf.c
> +++ b/drivers/net/ethernet/freescale/enetc/enetc_vf.c
> @@ -129,6 +129,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;
> --
> 2.34.1
>
Powered by blists - more mailing lists