RE: [PATCH v6 net-next 6/6] net: fec: enable the Jumbo frame support for i.MX8QM

From: Wei Fang
Date: Mon Sep 08 2025 - 22:53:09 EST


> Certain i.MX SoCs, such as i.MX8QM and i.MX8QXP, feature enhanced
> FEC hardware that supports Ethernet Jumbo frames with packet sizes
> up to 16K bytes.
>
> When Jumbo frames are supported, the TX FIFO may not be large enough
> to hold an entire frame. To handle this, the FIFO is configured to
> operate in cut-through mode when the frame size exceeds
> (PKT_MAXBUF_SIZE - ETH_HLEN - ETH_FCS_LEN), which allows transmission
> to begin once the FIFO reaches a certain threshold.
>
> Signed-off-by: Shenwei Wang <shenwei.wang@xxxxxxx>
> ---
> drivers/net/ethernet/freescale/fec.h | 3 +++
> drivers/net/ethernet/freescale/fec_main.c | 25 +++++++++++++++++++----
> 2 files changed, 24 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fec.h
> b/drivers/net/ethernet/freescale/fec.h
> index 0127cfa5529f..41e0d85d15da 100644
> --- a/drivers/net/ethernet/freescale/fec.h
> +++ b/drivers/net/ethernet/freescale/fec.h
> @@ -514,6 +514,9 @@ struct bufdesc_ex {
> */
> #define FEC_QUIRK_HAS_MDIO_C45 BIT(24)
>
> +/* Jumbo Frame support */
> +#define FEC_QUIRK_JUMBO_FRAME BIT(25)
> +
> struct bufdesc_prop {
> int qid;
> /* Address of Rx and Tx buffers */
> diff --git a/drivers/net/ethernet/freescale/fec_main.c
> b/drivers/net/ethernet/freescale/fec_main.c
> index a2aa08afa4bd..329320395285 100644
> --- a/drivers/net/ethernet/freescale/fec_main.c
> +++ b/drivers/net/ethernet/freescale/fec_main.c
> @@ -167,7 +167,8 @@ static const struct fec_devinfo fec_imx8qm_info = {
> FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE |
> FEC_QUIRK_HAS_RACC | FEC_QUIRK_HAS_COALESCE |
> FEC_QUIRK_CLEAR_SETUP_MII | FEC_QUIRK_HAS_MULTI_QUEUES
> |
> - FEC_QUIRK_DELAYED_CLKS_SUPPORT |
> FEC_QUIRK_HAS_MDIO_C45,
> + FEC_QUIRK_DELAYED_CLKS_SUPPORT |
> FEC_QUIRK_HAS_MDIO_C45 |
> + FEC_QUIRK_JUMBO_FRAME,
> };
>
> static const struct fec_devinfo fec_s32v234_info = {
> @@ -233,6 +234,7 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC
> address");
> * 2048 byte skbufs are allocated. However, alignment requirements
> * varies between FEC variants. Worst case is 64, so round down by 64.
> */
> +#define MAX_JUMBO_BUF_SIZE (round_down(16384 -
> FEC_DRV_RESERVE_SPACE - 64, 64))
> #define PKT_MAXBUF_SIZE (round_down(2048 - 64, 64))
> #define PKT_MINBUF_SIZE 64
>
> @@ -1279,8 +1281,18 @@ fec_restart(struct net_device *ndev)
> if (fep->quirks & FEC_QUIRK_ENET_MAC) {
> /* enable ENET endian swap */
> ecntl |= FEC_ECR_BYTESWP;
> - /* enable ENET store and forward mode */
> - writel(FEC_TXWMRK_STRFWD, fep->hwp + FEC_X_WMRK);
> +
> + /* When Jumbo Frame is enabled, the FIFO may not be large enough
> + * to hold an entire frame. In such cases, if the MTU exceeds
> + * (PKT_MAXBUF_SIZE - ETH_HLEN - ETH_FCS_LEN), configure the
> interface
> + * to operate in cut-through mode, triggered by the FIFO threshold.
> + * Otherwise, enable the ENET store-and-forward mode.
> + */
> + if ((fep->quirks & FEC_QUIRK_JUMBO_FRAME) &&
> + (ndev->mtu > (PKT_MAXBUF_SIZE - ETH_HLEN - ETH_FCS_LEN)))
> + writel(0xF, fep->hwp + FEC_X_WMRK);
> + else
> + writel(FEC_TXWMRK_STRFWD, fep->hwp + FEC_X_WMRK);
> }
>
> if (fep->bufdesc_ex)
> @@ -4581,7 +4593,12 @@ fec_probe(struct platform_device *pdev)
>
> fep->pagepool_order = 0;
> fep->rx_frame_size = FEC_ENET_RX_FRSIZE;
> - fep->max_buf_size = PKT_MAXBUF_SIZE;
> +
> + if (fep->quirks & FEC_QUIRK_JUMBO_FRAME)
> + fep->max_buf_size = MAX_JUMBO_BUF_SIZE;
> + else
> + fep->max_buf_size = PKT_MAXBUF_SIZE;
> +
> ndev->max_mtu = fep->max_buf_size - ETH_HLEN - ETH_FCS_LEN;
>
> ret = register_netdev(ndev);
> --
> 2.43.0

Reviewed-by: Wei Fang <wei.fang@xxxxxxx>