* [PATCH v5 net-next 0/5] net: fec: add the Jumbo frame support
@ 2025-09-04 20:34 Shenwei Wang
2025-09-04 20:34 ` [PATCH v5 net-next 1/5] net: fec: use a member variable for maximum buffer size Shenwei Wang
` (4 more replies)
0 siblings, 5 replies; 15+ messages in thread
From: Shenwei Wang @ 2025-09-04 20:34 UTC (permalink / raw)
To: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend
Cc: Shenwei Wang, Clark Wang, Stanislav Fomichev, imx, netdev,
linux-kernel, linux-imx
Changes in v5:
- move the macro FEC_DRV_RESERVE_SPACE to fec.h
- improve the comments for patch #0004
Changes in v4:
- configure the MAX_FL according to the MTU value, and correct the
comments for patch #3.
- in change_mtu function, revert to original setting when buffer
allocation fails in patch #4
- only enable the FIFO cut-through mode when mtu greater than
(PKT_MAXBUF_SIZE - ETH_HLEN - ETH_FCS_LEN)
Changes in v3:
- modify the OPT_FRAME_SIZE definition and drop the condition logic
- address the review comments from Wei Fang
Changes in v2:
- split the v1 patch per Andrew's feedback.
Shenwei Wang (5):
net: fec: use a member variable for maximum buffer size
net: fec: add pagepool_order to support variable page size
net: fec: add rx_frame_size to support configurable RX length
net: fec: add change_mtu to support dynamic buffer allocation
net: fec: enable the Jumbo frame support for i.MX8QM
drivers/net/ethernet/freescale/fec.h | 11 ++-
drivers/net/ethernet/freescale/fec_main.c | 95 ++++++++++++++++++++---
2 files changed, 93 insertions(+), 13 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v5 net-next 1/5] net: fec: use a member variable for maximum buffer size
2025-09-04 20:34 [PATCH v5 net-next 0/5] net: fec: add the Jumbo frame support Shenwei Wang
@ 2025-09-04 20:34 ` Shenwei Wang
2025-09-04 21:02 ` Frank Li
2025-09-06 1:49 ` Jakub Kicinski
2025-09-04 20:34 ` [PATCH v5 net-next 2/5] net: fec: add pagepool_order to support variable page size Shenwei Wang
` (3 subsequent siblings)
4 siblings, 2 replies; 15+ messages in thread
From: Shenwei Wang @ 2025-09-04 20:34 UTC (permalink / raw)
To: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend
Cc: Shenwei Wang, Clark Wang, Stanislav Fomichev, imx, netdev,
linux-kernel, linux-imx, Andrew Lunn
Refactor code to support Jumbo frame functionality by adding a member
variable in the fec_enet_private structure to store PKT_MAXBUF_SIZE.
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Wei Fang <wei.fang@nxp.com>
Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com>
---
drivers/net/ethernet/freescale/fec.h | 1 +
drivers/net/ethernet/freescale/fec_main.c | 9 +++++----
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index 5c8fdcef759b..2969088dda09 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -619,6 +619,7 @@ struct fec_enet_private {
unsigned int total_tx_ring_size;
unsigned int total_rx_ring_size;
+ unsigned int max_buf_size;
struct platform_device *pdev;
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 1383918f8a3f..5a21000aca59 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -253,7 +253,7 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address");
#if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_ARM) || \
defined(CONFIG_ARM64)
-#define OPT_FRAME_SIZE (PKT_MAXBUF_SIZE << 16)
+#define OPT_FRAME_SIZE (fep->max_buf_size << 16)
#else
#define OPT_FRAME_SIZE 0
#endif
@@ -1083,7 +1083,7 @@ static void fec_enet_enable_ring(struct net_device *ndev)
for (i = 0; i < fep->num_rx_queues; i++) {
rxq = fep->rx_queue[i];
writel(rxq->bd.dma, fep->hwp + FEC_R_DES_START(i));
- writel(PKT_MAXBUF_SIZE, fep->hwp + FEC_R_BUFF_SIZE(i));
+ writel(fep->max_buf_size, fep->hwp + FEC_R_BUFF_SIZE(i));
/* enable DMA1/2 */
if (i)
@@ -1191,7 +1191,7 @@ fec_restart(struct net_device *ndev)
else
val &= ~FEC_RACC_OPTIONS;
writel(val, fep->hwp + FEC_RACC);
- writel(PKT_MAXBUF_SIZE, fep->hwp + FEC_FTRL);
+ writel(fep->max_buf_size, fep->hwp + FEC_FTRL);
}
#endif
@@ -4559,7 +4559,8 @@ fec_probe(struct platform_device *pdev)
fec_enet_clk_enable(ndev, false);
pinctrl_pm_select_sleep_state(&pdev->dev);
- ndev->max_mtu = PKT_MAXBUF_SIZE - ETH_HLEN - ETH_FCS_LEN;
+ fep->max_buf_size = PKT_MAXBUF_SIZE;
+ ndev->max_mtu = fep->max_buf_size - ETH_HLEN - ETH_FCS_LEN;
ret = register_netdev(ndev);
if (ret)
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v5 net-next 2/5] net: fec: add pagepool_order to support variable page size
2025-09-04 20:34 [PATCH v5 net-next 0/5] net: fec: add the Jumbo frame support Shenwei Wang
2025-09-04 20:34 ` [PATCH v5 net-next 1/5] net: fec: use a member variable for maximum buffer size Shenwei Wang
@ 2025-09-04 20:34 ` Shenwei Wang
2025-09-04 21:03 ` Frank Li
2025-09-06 1:52 ` Jakub Kicinski
2025-09-04 20:35 ` [PATCH v5 net-next 3/5] net: fec: add rx_frame_size to support configurable RX length Shenwei Wang
` (2 subsequent siblings)
4 siblings, 2 replies; 15+ messages in thread
From: Shenwei Wang @ 2025-09-04 20:34 UTC (permalink / raw)
To: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend
Cc: Shenwei Wang, Clark Wang, Stanislav Fomichev, imx, netdev,
linux-kernel, linux-imx, Andrew Lunn
Add a new pagepool_order member in the fec_enet_private struct
to allow dynamic configuration of page size for an instance. This
change clears the hardcoded page size assumptions.
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Wei Fang <wei.fang@nxp.com>
Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com>
---
drivers/net/ethernet/freescale/fec.h | 1 +
drivers/net/ethernet/freescale/fec_main.c | 5 +++--
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index 2969088dda09..47317346b2f3 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -620,6 +620,7 @@ struct fec_enet_private {
unsigned int total_tx_ring_size;
unsigned int total_rx_ring_size;
unsigned int max_buf_size;
+ unsigned int pagepool_order;
struct platform_device *pdev;
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 5a21000aca59..f046d32a62fb 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1780,7 +1780,7 @@ fec_enet_rx_queue(struct net_device *ndev, u16 queue_id, int budget)
* These get messed up if we get called due to a busy condition.
*/
bdp = rxq->bd.cur;
- xdp_init_buff(&xdp, PAGE_SIZE, &rxq->xdp_rxq);
+ xdp_init_buff(&xdp, (PAGE_SIZE << fep->pagepool_order), &rxq->xdp_rxq);
while (!((status = fec16_to_cpu(bdp->cbd_sc)) & BD_ENET_RX_EMPTY)) {
@@ -1850,7 +1850,7 @@ fec_enet_rx_queue(struct net_device *ndev, u16 queue_id, int budget)
* include that when passing upstream as it messes up
* bridging applications.
*/
- skb = build_skb(page_address(page), PAGE_SIZE);
+ skb = build_skb(page_address(page), (PAGE_SIZE << fep->pagepool_order));
if (unlikely(!skb)) {
page_pool_recycle_direct(rxq->page_pool, page);
ndev->stats.rx_dropped++;
@@ -4559,6 +4559,7 @@ fec_probe(struct platform_device *pdev)
fec_enet_clk_enable(ndev, false);
pinctrl_pm_select_sleep_state(&pdev->dev);
+ fep->pagepool_order = 0;
fep->max_buf_size = PKT_MAXBUF_SIZE;
ndev->max_mtu = fep->max_buf_size - ETH_HLEN - ETH_FCS_LEN;
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v5 net-next 3/5] net: fec: add rx_frame_size to support configurable RX length
2025-09-04 20:34 [PATCH v5 net-next 0/5] net: fec: add the Jumbo frame support Shenwei Wang
2025-09-04 20:34 ` [PATCH v5 net-next 1/5] net: fec: use a member variable for maximum buffer size Shenwei Wang
2025-09-04 20:34 ` [PATCH v5 net-next 2/5] net: fec: add pagepool_order to support variable page size Shenwei Wang
@ 2025-09-04 20:35 ` Shenwei Wang
2025-09-04 21:13 ` Frank Li
2025-09-04 20:35 ` [PATCH v5 net-next 4/5] net: fec: add change_mtu to support dynamic buffer allocation Shenwei Wang
2025-09-04 20:35 ` [PATCH v5 net-next 5/5] net: fec: enable the Jumbo frame support for i.MX8QM Shenwei Wang
4 siblings, 1 reply; 15+ messages in thread
From: Shenwei Wang @ 2025-09-04 20:35 UTC (permalink / raw)
To: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend
Cc: Shenwei Wang, Clark Wang, Stanislav Fomichev, imx, netdev,
linux-kernel, linux-imx
Add a new rx_frame_size member in the fec_enet_private structure to
track the RX buffer size. On the Jumbo frame enabled system, the value
will be recalculated whenever the MTU is updated, allowing the driver
to allocate RX buffer efficiently.
Configure the MAX_FL (Maximum Frame Length) based on the current MTU,
by changing the OPT_FRAME_SIZE macro.
Configure the TRUNC_FL (Frame Truncation Length) based on the smaller
value between max_buf_size and the rx_frame_size to maintain consistent
RX error behavior, regardless of whether Jumbo frames are enabled.
Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com>
---
drivers/net/ethernet/freescale/fec.h | 1 +
drivers/net/ethernet/freescale/fec_main.c | 5 +++--
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index 47317346b2f3..f1032a11aa76 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -621,6 +621,7 @@ struct fec_enet_private {
unsigned int total_rx_ring_size;
unsigned int max_buf_size;
unsigned int pagepool_order;
+ unsigned int rx_frame_size;
struct platform_device *pdev;
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index f046d32a62fb..cf5118838f9c 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -253,7 +253,7 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address");
#if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_ARM) || \
defined(CONFIG_ARM64)
-#define OPT_FRAME_SIZE (fep->max_buf_size << 16)
+#define OPT_FRAME_SIZE ((fep->netdev->mtu + ETH_HLEN + ETH_FCS_LEN) << 16)
#else
#define OPT_FRAME_SIZE 0
#endif
@@ -1191,7 +1191,7 @@ fec_restart(struct net_device *ndev)
else
val &= ~FEC_RACC_OPTIONS;
writel(val, fep->hwp + FEC_RACC);
- writel(fep->max_buf_size, fep->hwp + FEC_FTRL);
+ writel(min(fep->rx_frame_size, fep->max_buf_size), fep->hwp + FEC_FTRL);
}
#endif
@@ -4560,6 +4560,7 @@ fec_probe(struct platform_device *pdev)
pinctrl_pm_select_sleep_state(&pdev->dev);
fep->pagepool_order = 0;
+ fep->rx_frame_size = FEC_ENET_RX_FRSIZE;
fep->max_buf_size = PKT_MAXBUF_SIZE;
ndev->max_mtu = fep->max_buf_size - ETH_HLEN - ETH_FCS_LEN;
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v5 net-next 4/5] net: fec: add change_mtu to support dynamic buffer allocation
2025-09-04 20:34 [PATCH v5 net-next 0/5] net: fec: add the Jumbo frame support Shenwei Wang
` (2 preceding siblings ...)
2025-09-04 20:35 ` [PATCH v5 net-next 3/5] net: fec: add rx_frame_size to support configurable RX length Shenwei Wang
@ 2025-09-04 20:35 ` Shenwei Wang
2025-09-04 21:37 ` Frank Li
2025-09-06 1:56 ` Jakub Kicinski
2025-09-04 20:35 ` [PATCH v5 net-next 5/5] net: fec: enable the Jumbo frame support for i.MX8QM Shenwei Wang
4 siblings, 2 replies; 15+ messages in thread
From: Shenwei Wang @ 2025-09-04 20:35 UTC (permalink / raw)
To: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend
Cc: Shenwei Wang, Clark Wang, Stanislav Fomichev, imx, netdev,
linux-kernel, linux-imx
Add a fec_change_mtu() handler to recalculate the pagepool_order based
on the new_mtu value. It will update the rx_frame_size accordingly if
the pagepool_order is changed.
If the interface is running, it stops RX/TX, and recreate the pagepool
with the new configuration.
Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com>
---
drivers/net/ethernet/freescale/fec.h | 5 +-
drivers/net/ethernet/freescale/fec_main.c | 57 ++++++++++++++++++++++-
2 files changed, 58 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index f1032a11aa76..0127cfa5529f 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -348,10 +348,11 @@ struct bufdesc_ex {
* the skbuffer directly.
*/
+#define FEC_DRV_RESERVE_SPACE (XDP_PACKET_HEADROOM + \
+ SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
#define FEC_ENET_XDP_HEADROOM (XDP_PACKET_HEADROOM)
#define FEC_ENET_RX_PAGES 256
-#define FEC_ENET_RX_FRSIZE (PAGE_SIZE - FEC_ENET_XDP_HEADROOM \
- - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
+#define FEC_ENET_RX_FRSIZE (PAGE_SIZE - FEC_DRV_RESERVE_SPACE)
#define FEC_ENET_RX_FRPPG (PAGE_SIZE / FEC_ENET_RX_FRSIZE)
#define RX_RING_SIZE (FEC_ENET_RX_FRPPG * FEC_ENET_RX_PAGES)
#define FEC_ENET_TX_FRSIZE 2048
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index cf5118838f9c..295420d2b71b 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -470,14 +470,14 @@ fec_enet_create_page_pool(struct fec_enet_private *fep,
{
struct bpf_prog *xdp_prog = READ_ONCE(fep->xdp_prog);
struct page_pool_params pp_params = {
- .order = 0,
+ .order = fep->pagepool_order,
.flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV,
.pool_size = size,
.nid = dev_to_node(&fep->pdev->dev),
.dev = &fep->pdev->dev,
.dma_dir = xdp_prog ? DMA_BIDIRECTIONAL : DMA_FROM_DEVICE,
.offset = FEC_ENET_XDP_HEADROOM,
- .max_len = FEC_ENET_RX_FRSIZE,
+ .max_len = fep->rx_frame_size,
};
int err;
@@ -4020,6 +4020,58 @@ static int fec_hwtstamp_set(struct net_device *ndev,
return fec_ptp_set(ndev, config, extack);
}
+static int fec_change_mtu(struct net_device *ndev, int new_mtu)
+{
+ struct fec_enet_private *fep = netdev_priv(ndev);
+ int old_mtu, old_order, old_size, order, done;
+ int ret = 0;
+
+ order = get_order(new_mtu + ETH_HLEN + ETH_FCS_LEN + FEC_DRV_RESERVE_SPACE);
+ old_order = fep->pagepool_order;
+ old_size = fep->rx_frame_size;
+ old_mtu = READ_ONCE(ndev->mtu);
+ fep->pagepool_order = order;
+ fep->rx_frame_size = (PAGE_SIZE << order) - FEC_DRV_RESERVE_SPACE;
+
+ if (!netif_running(ndev)) {
+ WRITE_ONCE(ndev->mtu, new_mtu);
+ return 0;
+ }
+
+ /* Stop TX/RX to update MAX_FL based on the new_mtu
+ * and free/re-allocate the buffers if needs.
+ */
+ napi_disable(&fep->napi);
+ netif_tx_disable(ndev);
+ read_poll_timeout(fec_enet_rx_napi, done, (done == 0),
+ 10, 1000, false, &fep->napi, 10);
+ fec_stop(ndev);
+
+ WRITE_ONCE(ndev->mtu, new_mtu);
+
+ if (order != old_order) {
+ fec_enet_free_buffers(ndev);
+
+ /* Create the pagepool based on the new mtu.
+ * Revert to the original settings if buffer
+ * allocation fails.
+ */
+ if (fec_enet_alloc_buffers(ndev) < 0) {
+ fep->pagepool_order = old_order;
+ fep->rx_frame_size = old_size;
+ WRITE_ONCE(ndev->mtu, old_mtu);
+ fec_enet_alloc_buffers(ndev);
+ ret = -ENOMEM;
+ }
+ }
+
+ fec_restart(ndev);
+ napi_enable(&fep->napi);
+ netif_tx_start_all_queues(ndev);
+
+ return ret;
+}
+
static const struct net_device_ops fec_netdev_ops = {
.ndo_open = fec_enet_open,
.ndo_stop = fec_enet_close,
@@ -4029,6 +4081,7 @@ static const struct net_device_ops fec_netdev_ops = {
.ndo_validate_addr = eth_validate_addr,
.ndo_tx_timeout = fec_timeout,
.ndo_set_mac_address = fec_set_mac_address,
+ .ndo_change_mtu = fec_change_mtu,
.ndo_eth_ioctl = phy_do_ioctl_running,
.ndo_set_features = fec_set_features,
.ndo_bpf = fec_enet_bpf,
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v5 net-next 5/5] net: fec: enable the Jumbo frame support for i.MX8QM
2025-09-04 20:34 [PATCH v5 net-next 0/5] net: fec: add the Jumbo frame support Shenwei Wang
` (3 preceding siblings ...)
2025-09-04 20:35 ` [PATCH v5 net-next 4/5] net: fec: add change_mtu to support dynamic buffer allocation Shenwei Wang
@ 2025-09-04 20:35 ` Shenwei Wang
2025-09-04 21:40 ` Frank Li
4 siblings, 1 reply; 15+ messages in thread
From: Shenwei Wang @ 2025-09-04 20:35 UTC (permalink / raw)
To: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend
Cc: Shenwei Wang, Clark Wang, Stanislav Fomichev, imx, netdev,
linux-kernel, linux-imx
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@nxp.com>
---
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 295420d2b71b..bf854abf982d 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
@@ -1278,8 +1280,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)
@@ -4614,7 +4626,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
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v5 net-next 1/5] net: fec: use a member variable for maximum buffer size
2025-09-04 20:34 ` [PATCH v5 net-next 1/5] net: fec: use a member variable for maximum buffer size Shenwei Wang
@ 2025-09-04 21:02 ` Frank Li
2025-09-06 1:49 ` Jakub Kicinski
1 sibling, 0 replies; 15+ messages in thread
From: Frank Li @ 2025-09-04 21:02 UTC (permalink / raw)
To: Shenwei Wang
Cc: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend, Clark Wang,
Stanislav Fomichev, imx, netdev, linux-kernel, linux-imx,
Andrew Lunn
On Thu, Sep 04, 2025 at 03:34:58PM -0500, Shenwei Wang wrote:
> Refactor code to support Jumbo frame functionality by adding a member
> variable in the fec_enet_private structure to store PKT_MAXBUF_SIZE.
>
> Reviewed-by: Andrew Lunn <andrew@lunn.ch>
> Reviewed-by: Wei Fang <wei.fang@nxp.com>
> Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> ---
> drivers/net/ethernet/freescale/fec.h | 1 +
> drivers/net/ethernet/freescale/fec_main.c | 9 +++++----
> 2 files changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
> index 5c8fdcef759b..2969088dda09 100644
> --- a/drivers/net/ethernet/freescale/fec.h
> +++ b/drivers/net/ethernet/freescale/fec.h
> @@ -619,6 +619,7 @@ struct fec_enet_private {
>
> unsigned int total_tx_ring_size;
> unsigned int total_rx_ring_size;
> + unsigned int max_buf_size;
>
> struct platform_device *pdev;
>
> diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
> index 1383918f8a3f..5a21000aca59 100644
> --- a/drivers/net/ethernet/freescale/fec_main.c
> +++ b/drivers/net/ethernet/freescale/fec_main.c
> @@ -253,7 +253,7 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address");
> #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
> defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_ARM) || \
> defined(CONFIG_ARM64)
> -#define OPT_FRAME_SIZE (PKT_MAXBUF_SIZE << 16)
> +#define OPT_FRAME_SIZE (fep->max_buf_size << 16)
> #else
> #define OPT_FRAME_SIZE 0
> #endif
> @@ -1083,7 +1083,7 @@ static void fec_enet_enable_ring(struct net_device *ndev)
> for (i = 0; i < fep->num_rx_queues; i++) {
> rxq = fep->rx_queue[i];
> writel(rxq->bd.dma, fep->hwp + FEC_R_DES_START(i));
> - writel(PKT_MAXBUF_SIZE, fep->hwp + FEC_R_BUFF_SIZE(i));
> + writel(fep->max_buf_size, fep->hwp + FEC_R_BUFF_SIZE(i));
>
> /* enable DMA1/2 */
> if (i)
> @@ -1191,7 +1191,7 @@ fec_restart(struct net_device *ndev)
> else
> val &= ~FEC_RACC_OPTIONS;
> writel(val, fep->hwp + FEC_RACC);
> - writel(PKT_MAXBUF_SIZE, fep->hwp + FEC_FTRL);
> + writel(fep->max_buf_size, fep->hwp + FEC_FTRL);
> }
> #endif
>
> @@ -4559,7 +4559,8 @@ fec_probe(struct platform_device *pdev)
> fec_enet_clk_enable(ndev, false);
> pinctrl_pm_select_sleep_state(&pdev->dev);
>
> - ndev->max_mtu = PKT_MAXBUF_SIZE - ETH_HLEN - ETH_FCS_LEN;
> + fep->max_buf_size = PKT_MAXBUF_SIZE;
> + ndev->max_mtu = fep->max_buf_size - ETH_HLEN - ETH_FCS_LEN;
>
> ret = register_netdev(ndev);
> if (ret)
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 net-next 2/5] net: fec: add pagepool_order to support variable page size
2025-09-04 20:34 ` [PATCH v5 net-next 2/5] net: fec: add pagepool_order to support variable page size Shenwei Wang
@ 2025-09-04 21:03 ` Frank Li
2025-09-06 1:52 ` Jakub Kicinski
1 sibling, 0 replies; 15+ messages in thread
From: Frank Li @ 2025-09-04 21:03 UTC (permalink / raw)
To: Shenwei Wang
Cc: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend, Clark Wang,
Stanislav Fomichev, imx, netdev, linux-kernel, linux-imx,
Andrew Lunn
On Thu, Sep 04, 2025 at 03:34:59PM -0500, Shenwei Wang wrote:
> Add a new pagepool_order member in the fec_enet_private struct
> to allow dynamic configuration of page size for an instance. This
> change clears the hardcoded page size assumptions.
>
> Reviewed-by: Andrew Lunn <andrew@lunn.ch>
> Reviewed-by: Wei Fang <wei.fang@nxp.com>
> Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> drivers/net/ethernet/freescale/fec.h | 1 +
> drivers/net/ethernet/freescale/fec_main.c | 5 +++--
> 2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
> index 2969088dda09..47317346b2f3 100644
> --- a/drivers/net/ethernet/freescale/fec.h
> +++ b/drivers/net/ethernet/freescale/fec.h
> @@ -620,6 +620,7 @@ struct fec_enet_private {
> unsigned int total_tx_ring_size;
> unsigned int total_rx_ring_size;
> unsigned int max_buf_size;
> + unsigned int pagepool_order;
>
> struct platform_device *pdev;
>
> diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
> index 5a21000aca59..f046d32a62fb 100644
> --- a/drivers/net/ethernet/freescale/fec_main.c
> +++ b/drivers/net/ethernet/freescale/fec_main.c
> @@ -1780,7 +1780,7 @@ fec_enet_rx_queue(struct net_device *ndev, u16 queue_id, int budget)
> * These get messed up if we get called due to a busy condition.
> */
> bdp = rxq->bd.cur;
> - xdp_init_buff(&xdp, PAGE_SIZE, &rxq->xdp_rxq);
> + xdp_init_buff(&xdp, (PAGE_SIZE << fep->pagepool_order), &rxq->xdp_rxq);
>
> while (!((status = fec16_to_cpu(bdp->cbd_sc)) & BD_ENET_RX_EMPTY)) {
>
> @@ -1850,7 +1850,7 @@ fec_enet_rx_queue(struct net_device *ndev, u16 queue_id, int budget)
> * include that when passing upstream as it messes up
> * bridging applications.
> */
> - skb = build_skb(page_address(page), PAGE_SIZE);
> + skb = build_skb(page_address(page), (PAGE_SIZE << fep->pagepool_order));
> if (unlikely(!skb)) {
> page_pool_recycle_direct(rxq->page_pool, page);
> ndev->stats.rx_dropped++;
> @@ -4559,6 +4559,7 @@ fec_probe(struct platform_device *pdev)
> fec_enet_clk_enable(ndev, false);
> pinctrl_pm_select_sleep_state(&pdev->dev);
>
> + fep->pagepool_order = 0;
> fep->max_buf_size = PKT_MAXBUF_SIZE;
> ndev->max_mtu = fep->max_buf_size - ETH_HLEN - ETH_FCS_LEN;
>
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 net-next 3/5] net: fec: add rx_frame_size to support configurable RX length
2025-09-04 20:35 ` [PATCH v5 net-next 3/5] net: fec: add rx_frame_size to support configurable RX length Shenwei Wang
@ 2025-09-04 21:13 ` Frank Li
0 siblings, 0 replies; 15+ messages in thread
From: Frank Li @ 2025-09-04 21:13 UTC (permalink / raw)
To: Shenwei Wang
Cc: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend, Clark Wang,
Stanislav Fomichev, imx, netdev, linux-kernel, linux-imx
On Thu, Sep 04, 2025 at 03:35:00PM -0500, Shenwei Wang wrote:
> Add a new rx_frame_size member in the fec_enet_private structure to
> track the RX buffer size. On the Jumbo frame enabled system, the value
> will be recalculated whenever the MTU is updated, allowing the driver
> to allocate RX buffer efficiently.
>
> Configure the MAX_FL (Maximum Frame Length) based on the current MTU,
> by changing the OPT_FRAME_SIZE macro.
>
> Configure the TRUNC_FL (Frame Truncation Length) based on the smaller
> value between max_buf_size and the rx_frame_size to maintain consistent
> RX error behavior, regardless of whether Jumbo frames are enabled.
>
> Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> drivers/net/ethernet/freescale/fec.h | 1 +
> drivers/net/ethernet/freescale/fec_main.c | 5 +++--
> 2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
> index 47317346b2f3..f1032a11aa76 100644
> --- a/drivers/net/ethernet/freescale/fec.h
> +++ b/drivers/net/ethernet/freescale/fec.h
> @@ -621,6 +621,7 @@ struct fec_enet_private {
> unsigned int total_rx_ring_size;
> unsigned int max_buf_size;
> unsigned int pagepool_order;
> + unsigned int rx_frame_size;
>
> struct platform_device *pdev;
>
> diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
> index f046d32a62fb..cf5118838f9c 100644
> --- a/drivers/net/ethernet/freescale/fec_main.c
> +++ b/drivers/net/ethernet/freescale/fec_main.c
> @@ -253,7 +253,7 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address");
> #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
> defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_ARM) || \
> defined(CONFIG_ARM64)
> -#define OPT_FRAME_SIZE (fep->max_buf_size << 16)
> +#define OPT_FRAME_SIZE ((fep->netdev->mtu + ETH_HLEN + ETH_FCS_LEN) << 16)
> #else
> #define OPT_FRAME_SIZE 0
> #endif
> @@ -1191,7 +1191,7 @@ fec_restart(struct net_device *ndev)
> else
> val &= ~FEC_RACC_OPTIONS;
> writel(val, fep->hwp + FEC_RACC);
> - writel(fep->max_buf_size, fep->hwp + FEC_FTRL);
> + writel(min(fep->rx_frame_size, fep->max_buf_size), fep->hwp + FEC_FTRL);
> }
> #endif
>
> @@ -4560,6 +4560,7 @@ fec_probe(struct platform_device *pdev)
> pinctrl_pm_select_sleep_state(&pdev->dev);
>
> fep->pagepool_order = 0;
> + fep->rx_frame_size = FEC_ENET_RX_FRSIZE;
> fep->max_buf_size = PKT_MAXBUF_SIZE;
> ndev->max_mtu = fep->max_buf_size - ETH_HLEN - ETH_FCS_LEN;
>
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 net-next 4/5] net: fec: add change_mtu to support dynamic buffer allocation
2025-09-04 20:35 ` [PATCH v5 net-next 4/5] net: fec: add change_mtu to support dynamic buffer allocation Shenwei Wang
@ 2025-09-04 21:37 ` Frank Li
2025-09-06 1:56 ` Jakub Kicinski
1 sibling, 0 replies; 15+ messages in thread
From: Frank Li @ 2025-09-04 21:37 UTC (permalink / raw)
To: Shenwei Wang
Cc: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend, Clark Wang,
Stanislav Fomichev, imx, netdev, linux-kernel, linux-imx
On Thu, Sep 04, 2025 at 03:35:01PM -0500, Shenwei Wang wrote:
> Add a fec_change_mtu() handler to recalculate the pagepool_order based
> on the new_mtu value. It will update the rx_frame_size accordingly if
> the pagepool_order is changed.
Remove "It will".
>
> If the interface is running, it stops RX/TX, and recreate the pagepool
> with the new configuration.
If the interface is running, stop RX/TX and ...
>
> Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com>
> ---
> drivers/net/ethernet/freescale/fec.h | 5 +-
> drivers/net/ethernet/freescale/fec_main.c | 57 ++++++++++++++++++++++-
> 2 files changed, 58 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
> index f1032a11aa76..0127cfa5529f 100644
> --- a/drivers/net/ethernet/freescale/fec.h
> +++ b/drivers/net/ethernet/freescale/fec.h
> @@ -348,10 +348,11 @@ struct bufdesc_ex {
> * the skbuffer directly.
> */
>
...
>
> +static int fec_change_mtu(struct net_device *ndev, int new_mtu)
> +{
> + struct fec_enet_private *fep = netdev_priv(ndev);
> + int old_mtu, old_order, old_size, order, done;
> + int ret = 0;
> +
> + order = get_order(new_mtu + ETH_HLEN + ETH_FCS_LEN + FEC_DRV_RESERVE_SPACE);
> + old_order = fep->pagepool_order;
> + old_size = fep->rx_frame_size;
> + old_mtu = READ_ONCE(ndev->mtu);
> + fep->pagepool_order = order;
> + fep->rx_frame_size = (PAGE_SIZE << order) - FEC_DRV_RESERVE_SPACE;
> +
> + if (!netif_running(ndev)) {
> + WRITE_ONCE(ndev->mtu, new_mtu);
> + return 0;
> + }
> +
> + /* Stop TX/RX to update MAX_FL based on the new_mtu
> + * and free/re-allocate the buffers if needs.
> + */
> + napi_disable(&fep->napi);
> + netif_tx_disable(ndev);
> + read_poll_timeout(fec_enet_rx_napi, done, (done == 0),
> + 10, 1000, false, &fep->napi, 10);
> + fec_stop(ndev);
I think you need move fep->pagepool_order and fep->rx_frame_size to here.
incase update rx_frame_size impact running queue.
Frank
> +
> + WRITE_ONCE(ndev->mtu, new_mtu);
> +
> + if (order != old_order) {
> + fec_enet_free_buffers(ndev);
> +
> + /* Create the pagepool based on the new mtu.
> + * Revert to the original settings if buffer
> + * allocation fails.
> + */
> + if (fec_enet_alloc_buffers(ndev) < 0) {
> + fep->pagepool_order = old_order;
> + fep->rx_frame_size = old_size;
> + WRITE_ONCE(ndev->mtu, old_mtu);
> + fec_enet_alloc_buffers(ndev);
> + ret = -ENOMEM;
> + }
> + }
> +
> + fec_restart(ndev);
> + napi_enable(&fep->napi);
> + netif_tx_start_all_queues(ndev);
> +
> + return ret;
> +}
> +
> static const struct net_device_ops fec_netdev_ops = {
> .ndo_open = fec_enet_open,
> .ndo_stop = fec_enet_close,
> @@ -4029,6 +4081,7 @@ static const struct net_device_ops fec_netdev_ops = {
> .ndo_validate_addr = eth_validate_addr,
> .ndo_tx_timeout = fec_timeout,
> .ndo_set_mac_address = fec_set_mac_address,
> + .ndo_change_mtu = fec_change_mtu,
> .ndo_eth_ioctl = phy_do_ioctl_running,
> .ndo_set_features = fec_set_features,
> .ndo_bpf = fec_enet_bpf,
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 net-next 5/5] net: fec: enable the Jumbo frame support for i.MX8QM
2025-09-04 20:35 ` [PATCH v5 net-next 5/5] net: fec: enable the Jumbo frame support for i.MX8QM Shenwei Wang
@ 2025-09-04 21:40 ` Frank Li
2025-09-05 20:14 ` Shenwei Wang
0 siblings, 1 reply; 15+ messages in thread
From: Frank Li @ 2025-09-04 21:40 UTC (permalink / raw)
To: Shenwei Wang
Cc: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend, Clark Wang,
Stanislav Fomichev, imx, netdev, linux-kernel, linux-imx
On Thu, Sep 04, 2025 at 03:35:02PM -0500, Shenwei Wang wrote:
> 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@nxp.com>
> ---
> drivers/net/ethernet/freescale/fec.h | 3 +++
> drivers/net/ethernet/freescale/fec_main.c | 25 +++++++++++++++++++----
> 2 files changed, 24 insertions(+), 4 deletions(-)
>
...
>
> if (fep->bufdesc_ex)
> @@ -4614,7 +4626,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;
If only use once, needn't define macro.
Frank
> + 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
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH v5 net-next 5/5] net: fec: enable the Jumbo frame support for i.MX8QM
2025-09-04 21:40 ` Frank Li
@ 2025-09-05 20:14 ` Shenwei Wang
0 siblings, 0 replies; 15+ messages in thread
From: Shenwei Wang @ 2025-09-05 20:14 UTC (permalink / raw)
To: Frank Li
Cc: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann,
Jesper Dangaard Brouer, John Fastabend, Clark Wang,
Stanislav Fomichev, imx@lists.linux.dev, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, dl-linux-imx
> -----Original Message-----
> From: Frank Li <frank.li@nxp.com>
> Sent: Thursday, September 4, 2025 4:40 PM
> To: Shenwei Wang <shenwei.wang@nxp.com>
> Cc: Wei Fang <wei.fang@nxp.com>; Andrew Lunn <andrew+netdev@lunn.ch>;
> David S. Miller <davem@davemloft.net>; Eric Dumazet
> <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo Abeni
> <pabeni@redhat.com>; Alexei Starovoitov <ast@kernel.org>; Daniel Borkmann
> <daniel@iogearbox.net>; Jesper Dangaard Brouer <hawk@kernel.org>; John
> Fastabend <john.fastabend@gmail.com>; Clark Wang
> <xiaoning.wang@nxp.com>; Stanislav Fomichev <sdf@fomichev.me>;
> imx@lists.linux.dev; netdev@vger.kernel.org; linux-kernel@vger.kernel.org; dl-
> linux-imx <linux-imx@nxp.com>
> Subject: Re: [PATCH v5 net-next 5/5] net: fec: enable the Jumbo frame support
> for i.MX8QM
>
> On Thu, Sep 04, 2025 at 03:35:02PM -0500, Shenwei Wang wrote:
> > 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@nxp.com>
> > ---
> > drivers/net/ethernet/freescale/fec.h | 3 +++
> > drivers/net/ethernet/freescale/fec_main.c | 25
> > +++++++++++++++++++----
> > 2 files changed, 24 insertions(+), 4 deletions(-)
> >
> ...
> >
> > if (fep->bufdesc_ex)
> > @@ -4614,7 +4626,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;
>
> If only use once, needn't define macro.
>
Using a macro here keeps consistency with the original coding style, while also
making the code cleaner and easier to read.
Thanks,
Shenwei
> Frank
> > + 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
> >
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 net-next 1/5] net: fec: use a member variable for maximum buffer size
2025-09-04 20:34 ` [PATCH v5 net-next 1/5] net: fec: use a member variable for maximum buffer size Shenwei Wang
2025-09-04 21:02 ` Frank Li
@ 2025-09-06 1:49 ` Jakub Kicinski
1 sibling, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2025-09-06 1:49 UTC (permalink / raw)
To: Shenwei Wang
Cc: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni,
Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer,
John Fastabend, Clark Wang, Stanislav Fomichev, imx, netdev,
linux-kernel, linux-imx, Andrew Lunn
On Thu, 4 Sep 2025 15:34:58 -0500 Shenwei Wang wrote:
> -#define OPT_FRAME_SIZE (PKT_MAXBUF_SIZE << 16)
> +#define OPT_FRAME_SIZE (fep->max_buf_size << 16)
Please don't implicitly depend on local variables with a certain name.
It's quite bad code hygiene. Looks like this define is only used once
so perhaps you should instead create a define like
#define OPT_ARCH_NEEDS_BUFSZ
And then use that in fec_restart() to either add
(fep->max_buf_size << 16)
to rcntl or not?
--
pw-bot: cr
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 net-next 2/5] net: fec: add pagepool_order to support variable page size
2025-09-04 20:34 ` [PATCH v5 net-next 2/5] net: fec: add pagepool_order to support variable page size Shenwei Wang
2025-09-04 21:03 ` Frank Li
@ 2025-09-06 1:52 ` Jakub Kicinski
1 sibling, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2025-09-06 1:52 UTC (permalink / raw)
To: Shenwei Wang
Cc: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni,
Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer,
John Fastabend, Clark Wang, Stanislav Fomichev, imx, netdev,
linux-kernel, linux-imx, Andrew Lunn
On Thu, 4 Sep 2025 15:34:59 -0500 Shenwei Wang wrote:
> diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
> index 5a21000aca59..f046d32a62fb 100644
> --- a/drivers/net/ethernet/freescale/fec_main.c
> +++ b/drivers/net/ethernet/freescale/fec_main.c
> @@ -1780,7 +1780,7 @@ fec_enet_rx_queue(struct net_device *ndev, u16 queue_id, int budget)
> * These get messed up if we get called due to a busy condition.
> */
> bdp = rxq->bd.cur;
> - xdp_init_buff(&xdp, PAGE_SIZE, &rxq->xdp_rxq);
> + xdp_init_buff(&xdp, (PAGE_SIZE << fep->pagepool_order), &rxq->xdp_rxq);
please drop the unnecessary parenthesis, and
> while (!((status = fec16_to_cpu(bdp->cbd_sc)) & BD_ENET_RX_EMPTY)) {
>
> @@ -1850,7 +1850,7 @@ fec_enet_rx_queue(struct net_device *ndev, u16 queue_id, int budget)
> * include that when passing upstream as it messes up
> * bridging applications.
> */
> - skb = build_skb(page_address(page), PAGE_SIZE);
> + skb = build_skb(page_address(page), (PAGE_SIZE << fep->pagepool_order));
wrap the lines at 80 chars
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 net-next 4/5] net: fec: add change_mtu to support dynamic buffer allocation
2025-09-04 20:35 ` [PATCH v5 net-next 4/5] net: fec: add change_mtu to support dynamic buffer allocation Shenwei Wang
2025-09-04 21:37 ` Frank Li
@ 2025-09-06 1:56 ` Jakub Kicinski
1 sibling, 0 replies; 15+ messages in thread
From: Jakub Kicinski @ 2025-09-06 1:56 UTC (permalink / raw)
To: Shenwei Wang
Cc: Wei Fang, Andrew Lunn, David S. Miller, Eric Dumazet, Paolo Abeni,
Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer,
John Fastabend, Clark Wang, Stanislav Fomichev, imx, netdev,
linux-kernel, linux-imx
On Thu, 4 Sep 2025 15:35:01 -0500 Shenwei Wang wrote:
> + if (fec_enet_alloc_buffers(ndev) < 0) {
> + fep->pagepool_order = old_order;
> + fep->rx_frame_size = old_size;
> + WRITE_ONCE(ndev->mtu, old_mtu);
> + fec_enet_alloc_buffers(ndev);
And how do you know that it will succeed now?
You can't leave the device in-operational due to reconfig request when
system is under memory pressure. You need to save the previous buffers
so that you can restore them without having to allocate.
> + ret = -ENOMEM;
> + }
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2025-09-06 1:56 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-04 20:34 [PATCH v5 net-next 0/5] net: fec: add the Jumbo frame support Shenwei Wang
2025-09-04 20:34 ` [PATCH v5 net-next 1/5] net: fec: use a member variable for maximum buffer size Shenwei Wang
2025-09-04 21:02 ` Frank Li
2025-09-06 1:49 ` Jakub Kicinski
2025-09-04 20:34 ` [PATCH v5 net-next 2/5] net: fec: add pagepool_order to support variable page size Shenwei Wang
2025-09-04 21:03 ` Frank Li
2025-09-06 1:52 ` Jakub Kicinski
2025-09-04 20:35 ` [PATCH v5 net-next 3/5] net: fec: add rx_frame_size to support configurable RX length Shenwei Wang
2025-09-04 21:13 ` Frank Li
2025-09-04 20:35 ` [PATCH v5 net-next 4/5] net: fec: add change_mtu to support dynamic buffer allocation Shenwei Wang
2025-09-04 21:37 ` Frank Li
2025-09-06 1:56 ` Jakub Kicinski
2025-09-04 20:35 ` [PATCH v5 net-next 5/5] net: fec: enable the Jumbo frame support for i.MX8QM Shenwei Wang
2025-09-04 21:40 ` Frank Li
2025-09-05 20:14 ` Shenwei Wang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).