+++ /dev/null
-From 18c00ec29df3d353de5407578e2bfe84f63c76dc Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 15 Oct 2025 10:14:27 +0800
-Subject: net: enetc: fix the deadlock of enetc_mdio_lock
-
-From: Jianpeng Chang <jianpeng.chang.cn@windriver.com>
-
-[ Upstream commit 50bd33f6b3922a6b760aa30d409cae891cec8fb5 ]
-
-After applying the workaround for err050089, the LS1028A platform
-experiences RCU stalls on RT kernel. This issue is caused by the
-recursive acquisition of the read lock enetc_mdio_lock. Here list some
-of the call stacks identified under the enetc_poll path that may lead to
-a deadlock:
-
-enetc_poll
- -> enetc_lock_mdio
- -> enetc_clean_rx_ring OR napi_complete_done
- -> napi_gro_receive
- -> enetc_start_xmit
- -> enetc_lock_mdio
- -> enetc_map_tx_buffs
- -> enetc_unlock_mdio
- -> enetc_unlock_mdio
-
-After enetc_poll acquires the read lock, a higher-priority writer attempts
-to acquire the lock, causing preemption. The writer detects that a
-read lock is already held and is scheduled out. However, readers under
-enetc_poll cannot acquire the read lock again because a writer is already
-waiting, leading to a thread hang.
-
-Currently, the deadlock is avoided by adjusting enetc_lock_mdio to prevent
-recursive lock acquisition.
-
-Fixes: 6d36ecdbc441 ("net: enetc: take the MDIO lock only once per NAPI poll cycle")
-Signed-off-by: Jianpeng Chang <jianpeng.chang.cn@windriver.com>
-Acked-by: Wei Fang <wei.fang@nxp.com>
-Link: https://patch.msgid.link/20251015021427.180757-1-jianpeng.chang.cn@windriver.com
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/freescale/enetc/enetc.c | 25 ++++++++++++++++----
- 1 file changed, 21 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
-index 44ae1d2c34fd6..ed1db7f056e66 100644
---- a/drivers/net/ethernet/freescale/enetc/enetc.c
-+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
-@@ -1225,6 +1225,8 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
- /* next descriptor to process */
- i = rx_ring->next_to_clean;
-
-+ enetc_lock_mdio();
-+
- while (likely(rx_frm_cnt < work_limit)) {
- union enetc_rx_bd *rxbd;
- struct sk_buff *skb;
-@@ -1260,7 +1262,9 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
- rx_byte_cnt += skb->len + ETH_HLEN;
- rx_frm_cnt++;
-
-+ enetc_unlock_mdio();
- napi_gro_receive(napi, skb);
-+ enetc_lock_mdio();
- }
-
- rx_ring->next_to_clean = i;
-@@ -1268,6 +1272,8 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
- rx_ring->stats.packets += rx_frm_cnt;
- rx_ring->stats.bytes += rx_byte_cnt;
-
-+ enetc_unlock_mdio();
-+
- return rx_frm_cnt;
- }
-
-@@ -1572,6 +1578,8 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring,
- /* next descriptor to process */
- i = rx_ring->next_to_clean;
-
-+ enetc_lock_mdio();
-+
- while (likely(rx_frm_cnt < work_limit)) {
- union enetc_rx_bd *rxbd, *orig_rxbd;
- int orig_i, orig_cleaned_cnt;
-@@ -1631,7 +1639,9 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring,
- if (unlikely(!skb))
- goto out;
-
-+ enetc_unlock_mdio();
- napi_gro_receive(napi, skb);
-+ enetc_lock_mdio();
- break;
- case XDP_TX:
- tx_ring = priv->xdp_tx_ring[rx_ring->index];
-@@ -1660,7 +1670,9 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring,
- }
- break;
- case XDP_REDIRECT:
-+ enetc_unlock_mdio();
- err = xdp_do_redirect(rx_ring->ndev, &xdp_buff, prog);
-+ enetc_lock_mdio();
- if (unlikely(err)) {
- enetc_xdp_drop(rx_ring, orig_i, i);
- rx_ring->stats.xdp_redirect_failures++;
-@@ -1680,8 +1692,11 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring,
- rx_ring->stats.packets += rx_frm_cnt;
- rx_ring->stats.bytes += rx_byte_cnt;
-
-- if (xdp_redirect_frm_cnt)
-+ if (xdp_redirect_frm_cnt) {
-+ enetc_unlock_mdio();
- xdp_do_flush();
-+ enetc_lock_mdio();
-+ }
-
- if (xdp_tx_frm_cnt)
- enetc_update_tx_ring_tail(tx_ring);
-@@ -1690,6 +1705,8 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring,
- enetc_refill_rx_ring(rx_ring, enetc_bd_unused(rx_ring) -
- rx_ring->xdp.xdp_tx_in_flight);
-
-+ enetc_unlock_mdio();
-+
- return rx_frm_cnt;
- }
-
-@@ -1708,6 +1725,7 @@ static int enetc_poll(struct napi_struct *napi, int budget)
- for (i = 0; i < v->count_tx_rings; i++)
- if (!enetc_clean_tx_ring(&v->tx_ring[i], budget))
- complete = false;
-+ enetc_unlock_mdio();
-
- prog = rx_ring->xdp.prog;
- if (prog)
-@@ -1719,10 +1737,8 @@ static int enetc_poll(struct napi_struct *napi, int budget)
- if (work_done)
- v->rx_napi_work = true;
-
-- if (!complete) {
-- enetc_unlock_mdio();
-+ if (!complete)
- return budget;
-- }
-
- napi_complete_done(napi, work_done);
-
-@@ -1731,6 +1747,7 @@ static int enetc_poll(struct napi_struct *napi, int budget)
-
- v->rx_napi_work = false;
-
-+ enetc_lock_mdio();
- /* enable interrupts */
- enetc_wr_reg_hot(v->rbier, ENETC_RBIER_RXTIE);
-
---
-2.51.0
-
+++ /dev/null
-From ecf10ad02f186ebfcc966a9d82e6e3fc29e70f58 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 4 Jan 2023 14:57:10 +0100
-Subject: net: ethernet: enetc: unlock XDP_REDIRECT for XDP non-linear buffers
-
-From: Lorenzo Bianconi <lorenzo@kernel.org>
-
-[ Upstream commit 8feb020f92a559f5a73a55c7337a3e51f19a2dc9 ]
-
-Even if full XDP_REDIRECT is not supported yet for non-linear XDP buffers
-since we allow redirecting just into CPUMAPs, unlock XDP_REDIRECT for
-S/G XDP buffer and rely on XDP stack to properly take care of the
-frames.
-
-Tested-by: Vladimir Oltean <vladimir.oltean@nxp.com>
-Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
-Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Stable-dep-of: 50bd33f6b392 ("net: enetc: fix the deadlock of enetc_mdio_lock")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/freescale/enetc/enetc.c | 24 ++++++++------------
- 1 file changed, 10 insertions(+), 14 deletions(-)
-
-diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
-index bf49c07c8b513..4b4cc64724932 100644
---- a/drivers/net/ethernet/freescale/enetc/enetc.c
-+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
-@@ -1460,6 +1460,16 @@ static void enetc_add_rx_buff_to_xdp(struct enetc_bdr *rx_ring, int i,
- /* To be used for XDP_TX */
- rx_swbd->len = size;
-
-+ if (!xdp_buff_has_frags(xdp_buff)) {
-+ xdp_buff_set_frags_flag(xdp_buff);
-+ shinfo->xdp_frags_size = size;
-+ } else {
-+ shinfo->xdp_frags_size += size;
-+ }
-+
-+ if (page_is_pfmemalloc(rx_swbd->page))
-+ xdp_buff_set_frag_pfmemalloc(xdp_buff);
-+
- skb_frag_off_set(frag, rx_swbd->page_offset);
- skb_frag_size_set(frag, size);
- __skb_frag_set_page(frag, rx_swbd->page);
-@@ -1650,20 +1660,6 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring,
- }
- break;
- case XDP_REDIRECT:
-- /* xdp_return_frame does not support S/G in the sense
-- * that it leaks the fragments (__xdp_return should not
-- * call page_frag_free only for the initial buffer).
-- * Until XDP_REDIRECT gains support for S/G let's keep
-- * the code structure in place, but dead. We drop the
-- * S/G frames ourselves to avoid memory leaks which
-- * would otherwise leave the kernel OOM.
-- */
-- if (unlikely(cleaned_cnt - orig_cleaned_cnt != 1)) {
-- enetc_xdp_drop(rx_ring, orig_i, i);
-- rx_ring->stats.xdp_redirect_sg++;
-- break;
-- }
--
- err = xdp_do_redirect(rx_ring->ndev, &xdp_buff, prog);
- if (unlikely(err)) {
- enetc_xdp_drop(rx_ring, orig_i, i);
---
-2.51.0
-
+++ /dev/null
-From 47a3f48d7721f3132f9f1d0eae94edb0167b09ca Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 31 Oct 2022 13:53:50 -0500
-Subject: net: fec: add initial XDP support
-
-From: Shenwei Wang <shenwei.wang@nxp.com>
-
-[ Upstream commit 6d6b39f180b83dfe1e938382b68dd1e6cb51363c ]
-
-This patch adds the initial XDP support to Freescale driver. It supports
-XDP_PASS, XDP_DROP and XDP_REDIRECT actions. Upcoming patches will add
-support for XDP_TX and Zero Copy features.
-
-As the patch is rather large, the part of codes to collect the
-statistics is separated and will prepare a dedicated patch for that
-part.
-
-I just tested with the application of xdpsock.
- -- Native here means running command of "xdpsock -i eth0"
- -- SKB-Mode means running command of "xdpsock -S -i eth0"
-
-The following are the testing result relating to XDP mode:
-
-root@imx8qxpc0mek:~/bpf# ./xdpsock -i eth0
- sock0@eth0:0 rxdrop xdp-drv
- pps pkts 1.00
-rx 371347 2717794
-tx 0 0
-
-root@imx8qxpc0mek:~/bpf# ./xdpsock -S -i eth0
- sock0@eth0:0 rxdrop xdp-skb
- pps pkts 1.00
-rx 202229 404528
-tx 0 0
-
-root@imx8qxpc0mek:~/bpf# ./xdp2 eth0
-proto 0: 496708 pkt/s
-proto 0: 505469 pkt/s
-proto 0: 505283 pkt/s
-proto 0: 505443 pkt/s
-proto 0: 505465 pkt/s
-
-root@imx8qxpc0mek:~/bpf# ./xdp2 -S eth0
-proto 0: 0 pkt/s
-proto 17: 118778 pkt/s
-proto 17: 118989 pkt/s
-proto 0: 1 pkt/s
-proto 17: 118987 pkt/s
-proto 0: 0 pkt/s
-proto 17: 118943 pkt/s
-proto 17: 118976 pkt/s
-proto 0: 1 pkt/s
-proto 17: 119006 pkt/s
-proto 0: 0 pkt/s
-proto 17: 119071 pkt/s
-proto 17: 119092 pkt/s
-
-Signed-off-by: Shenwei Wang <shenwei.wang@nxp.com>
-Reported-by: kernel test robot <lkp@intel.com>
-Link: https://lore.kernel.org/r/20221031185350.2045675-1-shenwei.wang@nxp.com
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Stable-dep-of: 50bd33f6b392 ("net: enetc: fix the deadlock of enetc_mdio_lock")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/freescale/fec.h | 4 +-
- drivers/net/ethernet/freescale/fec_main.c | 224 +++++++++++++++++++++-
- 2 files changed, 226 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
-index 33f84a30e1671..6bdf7c98c3651 100644
---- a/drivers/net/ethernet/freescale/fec.h
-+++ b/drivers/net/ethernet/freescale/fec.h
-@@ -348,7 +348,6 @@ struct bufdesc_ex {
- */
-
- #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)))
-@@ -661,6 +660,9 @@ struct fec_enet_private {
-
- struct imx_sc_ipc *ipc_handle;
-
-+ /* XDP BPF Program */
-+ struct bpf_prog *xdp_prog;
-+
- u64 ethtool_stats[];
- };
-
-diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
-index ca271d7a388b4..5c72d229d3b6f 100644
---- a/drivers/net/ethernet/freescale/fec_main.c
-+++ b/drivers/net/ethernet/freescale/fec_main.c
-@@ -89,6 +89,11 @@ static const u16 fec_enet_vlan_pri_to_queue[8] = {0, 0, 1, 1, 1, 2, 2, 2};
- #define FEC_ENET_OPD_V 0xFFF0
- #define FEC_MDIO_PM_TIMEOUT 100 /* ms */
-
-+#define FEC_ENET_XDP_PASS 0
-+#define FEC_ENET_XDP_CONSUMED BIT(0)
-+#define FEC_ENET_XDP_TX BIT(1)
-+#define FEC_ENET_XDP_REDIR BIT(2)
-+
- struct fec_devinfo {
- u32 quirks;
- };
-@@ -443,13 +448,14 @@ static int
- fec_enet_create_page_pool(struct fec_enet_private *fep,
- struct fec_enet_priv_rx_q *rxq, int size)
- {
-+ struct bpf_prog *xdp_prog = READ_ONCE(fep->xdp_prog);
- struct page_pool_params pp_params = {
- .order = 0,
- .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 = DMA_FROM_DEVICE,
-+ .dma_dir = xdp_prog ? DMA_BIDIRECTIONAL : DMA_FROM_DEVICE,
- .offset = FEC_ENET_XDP_HEADROOM,
- .max_len = FEC_ENET_RX_FRSIZE,
- };
-@@ -1610,6 +1616,59 @@ static void fec_enet_update_cbd(struct fec_enet_priv_rx_q *rxq,
- bdp->cbd_bufaddr = cpu_to_fec32(phys_addr);
- }
-
-+static u32
-+fec_enet_run_xdp(struct fec_enet_private *fep, struct bpf_prog *prog,
-+ struct xdp_buff *xdp, struct fec_enet_priv_rx_q *rxq, int index)
-+{
-+ unsigned int sync, len = xdp->data_end - xdp->data;
-+ u32 ret = FEC_ENET_XDP_PASS;
-+ struct page *page;
-+ int err;
-+ u32 act;
-+
-+ act = bpf_prog_run_xdp(prog, xdp);
-+
-+ /* Due xdp_adjust_tail: DMA sync for_device cover max len CPU touch */
-+ sync = xdp->data_end - xdp->data_hard_start - FEC_ENET_XDP_HEADROOM;
-+ sync = max(sync, len);
-+
-+ switch (act) {
-+ case XDP_PASS:
-+ ret = FEC_ENET_XDP_PASS;
-+ break;
-+
-+ case XDP_REDIRECT:
-+ err = xdp_do_redirect(fep->netdev, xdp, prog);
-+ if (!err) {
-+ ret = FEC_ENET_XDP_REDIR;
-+ } else {
-+ ret = FEC_ENET_XDP_CONSUMED;
-+ page = virt_to_head_page(xdp->data);
-+ page_pool_put_page(rxq->page_pool, page, sync, true);
-+ }
-+ break;
-+
-+ default:
-+ bpf_warn_invalid_xdp_action(fep->netdev, prog, act);
-+ fallthrough;
-+
-+ case XDP_TX:
-+ bpf_warn_invalid_xdp_action(fep->netdev, prog, act);
-+ fallthrough;
-+
-+ case XDP_ABORTED:
-+ fallthrough; /* handle aborts by dropping packet */
-+
-+ case XDP_DROP:
-+ ret = FEC_ENET_XDP_CONSUMED;
-+ page = virt_to_head_page(xdp->data);
-+ page_pool_put_page(rxq->page_pool, page, sync, true);
-+ break;
-+ }
-+
-+ return ret;
-+}
-+
- /* During a receive, the bd_rx.cur points to the current incoming buffer.
- * When we update through the ring, if the next incoming buffer has
- * not been given to the system, we just set the empty indicator,
-@@ -1631,6 +1690,9 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
- u16 vlan_tag;
- int index = 0;
- bool need_swap = fep->quirks & FEC_QUIRK_SWAP_FRAME;
-+ struct bpf_prog *xdp_prog = READ_ONCE(fep->xdp_prog);
-+ u32 ret, xdp_result = FEC_ENET_XDP_PASS;
-+ struct xdp_buff xdp;
- struct page *page;
-
- #ifdef CONFIG_M532x
-@@ -1642,6 +1704,7 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
- * 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);
-
- while (!((status = fec16_to_cpu(bdp->cbd_sc)) & BD_ENET_RX_EMPTY)) {
-
-@@ -1691,6 +1754,17 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
- prefetch(page_address(page));
- fec_enet_update_cbd(rxq, bdp, index);
-
-+ if (xdp_prog) {
-+ xdp_buff_clear_frags_flag(&xdp);
-+ xdp_prepare_buff(&xdp, page_address(page),
-+ FEC_ENET_XDP_HEADROOM, pkt_len, false);
-+
-+ ret = fec_enet_run_xdp(fep, xdp_prog, &xdp, rxq, index);
-+ xdp_result |= ret;
-+ if (ret != FEC_ENET_XDP_PASS)
-+ goto rx_processing_done;
-+ }
-+
- /* The packet length includes FCS, but we don't want to
- * include that when passing upstream as it messes up
- * bridging applications.
-@@ -1794,6 +1868,10 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
- writel(0, rxq->bd.reg_desc_active);
- }
- rxq->bd.cur = bdp;
-+
-+ if (xdp_result & FEC_ENET_XDP_REDIR)
-+ xdp_do_flush_map();
-+
- return pkt_received;
- }
-
-@@ -3604,6 +3682,148 @@ static u16 fec_enet_select_queue(struct net_device *ndev, struct sk_buff *skb,
- return fec_enet_vlan_pri_to_queue[vlan_tag >> 13];
- }
-
-+static int fec_enet_bpf(struct net_device *dev, struct netdev_bpf *bpf)
-+{
-+ struct fec_enet_private *fep = netdev_priv(dev);
-+ bool is_run = netif_running(dev);
-+ struct bpf_prog *old_prog;
-+
-+ switch (bpf->command) {
-+ case XDP_SETUP_PROG:
-+ if (is_run) {
-+ napi_disable(&fep->napi);
-+ netif_tx_disable(dev);
-+ }
-+
-+ old_prog = xchg(&fep->xdp_prog, bpf->prog);
-+ fec_restart(dev);
-+
-+ if (is_run) {
-+ napi_enable(&fep->napi);
-+ netif_tx_start_all_queues(dev);
-+ }
-+
-+ if (old_prog)
-+ bpf_prog_put(old_prog);
-+
-+ return 0;
-+
-+ case XDP_SETUP_XSK_POOL:
-+ return -EOPNOTSUPP;
-+
-+ default:
-+ return -EOPNOTSUPP;
-+ }
-+}
-+
-+static int
-+fec_enet_xdp_get_tx_queue(struct fec_enet_private *fep, int cpu)
-+{
-+ int index = cpu;
-+
-+ if (unlikely(index < 0))
-+ index = 0;
-+
-+ while (index >= fep->num_tx_queues)
-+ index -= fep->num_tx_queues;
-+
-+ return index;
-+}
-+
-+static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep,
-+ struct fec_enet_priv_tx_q *txq,
-+ struct xdp_frame *frame)
-+{
-+ unsigned int index, status, estatus;
-+ struct bufdesc *bdp, *last_bdp;
-+ dma_addr_t dma_addr;
-+ int entries_free;
-+
-+ entries_free = fec_enet_get_free_txdesc_num(txq);
-+ if (entries_free < MAX_SKB_FRAGS + 1) {
-+ netdev_err(fep->netdev, "NOT enough BD for SG!\n");
-+ return NETDEV_TX_OK;
-+ }
-+
-+ /* Fill in a Tx ring entry */
-+ bdp = txq->bd.cur;
-+ last_bdp = bdp;
-+ status = fec16_to_cpu(bdp->cbd_sc);
-+ status &= ~BD_ENET_TX_STATS;
-+
-+ index = fec_enet_get_bd_index(bdp, &txq->bd);
-+
-+ dma_addr = dma_map_single(&fep->pdev->dev, frame->data,
-+ frame->len, DMA_TO_DEVICE);
-+ if (dma_mapping_error(&fep->pdev->dev, dma_addr))
-+ return FEC_ENET_XDP_CONSUMED;
-+
-+ status |= (BD_ENET_TX_INTR | BD_ENET_TX_LAST);
-+ if (fep->bufdesc_ex)
-+ estatus = BD_ENET_TX_INT;
-+
-+ bdp->cbd_bufaddr = cpu_to_fec32(dma_addr);
-+ bdp->cbd_datlen = cpu_to_fec16(frame->len);
-+
-+ if (fep->bufdesc_ex) {
-+ struct bufdesc_ex *ebdp = (struct bufdesc_ex *)bdp;
-+
-+ if (fep->quirks & FEC_QUIRK_HAS_AVB)
-+ estatus |= FEC_TX_BD_FTYPE(txq->bd.qid);
-+
-+ ebdp->cbd_bdu = 0;
-+ ebdp->cbd_esc = cpu_to_fec32(estatus);
-+ }
-+
-+ index = fec_enet_get_bd_index(last_bdp, &txq->bd);
-+ txq->tx_skbuff[index] = NULL;
-+
-+ /* Send it on its way. Tell FEC it's ready, interrupt when done,
-+ * it's the last BD of the frame, and to put the CRC on the end.
-+ */
-+ status |= (BD_ENET_TX_READY | BD_ENET_TX_TC);
-+ bdp->cbd_sc = cpu_to_fec16(status);
-+
-+ /* If this was the last BD in the ring, start at the beginning again. */
-+ bdp = fec_enet_get_nextdesc(last_bdp, &txq->bd);
-+
-+ txq->bd.cur = bdp;
-+
-+ return 0;
-+}
-+
-+static int fec_enet_xdp_xmit(struct net_device *dev,
-+ int num_frames,
-+ struct xdp_frame **frames,
-+ u32 flags)
-+{
-+ struct fec_enet_private *fep = netdev_priv(dev);
-+ struct fec_enet_priv_tx_q *txq;
-+ int cpu = smp_processor_id();
-+ struct netdev_queue *nq;
-+ unsigned int queue;
-+ int i;
-+
-+ queue = fec_enet_xdp_get_tx_queue(fep, cpu);
-+ txq = fep->tx_queue[queue];
-+ nq = netdev_get_tx_queue(fep->netdev, queue);
-+
-+ __netif_tx_lock(nq, cpu);
-+
-+ for (i = 0; i < num_frames; i++)
-+ fec_enet_txq_xmit_frame(fep, txq, frames[i]);
-+
-+ /* Make sure the update to bdp and tx_skbuff are performed. */
-+ wmb();
-+
-+ /* Trigger transmission start */
-+ writel(0, txq->bd.reg_desc_active);
-+
-+ __netif_tx_unlock(nq);
-+
-+ return num_frames;
-+}
-+
- static const struct net_device_ops fec_netdev_ops = {
- .ndo_open = fec_enet_open,
- .ndo_stop = fec_enet_close,
-@@ -3615,6 +3835,8 @@ static const struct net_device_ops fec_netdev_ops = {
- .ndo_set_mac_address = fec_set_mac_address,
- .ndo_eth_ioctl = fec_enet_ioctl,
- .ndo_set_features = fec_set_features,
-+ .ndo_bpf = fec_enet_bpf,
-+ .ndo_xdp_xmit = fec_enet_xdp_xmit,
- };
-
- static const unsigned short offset_des_active_rxq[] = {
---
-2.51.0
-
+++ /dev/null
-From 20abbd7880cfc00ffcf960a25d3d7cd5ac0fb978 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 8 Sep 2023 16:32:14 +0200
-Subject: net: Tree wide: Replace xdp_do_flush_map() with xdp_do_flush().
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
-
-[ Upstream commit 7f04bd109d4c358a12b125bc79a6f0eac2e915ec ]
-
-xdp_do_flush_map() is deprecated and new code should use xdp_do_flush()
-instead.
-
-Replace xdp_do_flush_map() with xdp_do_flush().
-
-Cc: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
-Cc: Clark Wang <xiaoning.wang@nxp.com>
-Cc: Claudiu Manoil <claudiu.manoil@nxp.com>
-Cc: David Arinzon <darinzon@amazon.com>
-Cc: Edward Cree <ecree.xilinx@gmail.com>
-Cc: Felix Fietkau <nbd@nbd.name>
-Cc: Grygorii Strashko <grygorii.strashko@ti.com>
-Cc: Jassi Brar <jaswinder.singh@linaro.org>
-Cc: Jesse Brandeburg <jesse.brandeburg@intel.com>
-Cc: John Crispin <john@phrozen.org>
-Cc: Leon Romanovsky <leon@kernel.org>
-Cc: Lorenzo Bianconi <lorenzo@kernel.org>
-Cc: Louis Peens <louis.peens@corigine.com>
-Cc: Marcin Wojtas <mw@semihalf.com>
-Cc: Mark Lee <Mark-MC.Lee@mediatek.com>
-Cc: Matthias Brugger <matthias.bgg@gmail.com>
-Cc: NXP Linux Team <linux-imx@nxp.com>
-Cc: Noam Dagan <ndagan@amazon.com>
-Cc: Russell King <linux@armlinux.org.uk>
-Cc: Saeed Bishara <saeedb@amazon.com>
-Cc: Saeed Mahameed <saeedm@nvidia.com>
-Cc: Sean Wang <sean.wang@mediatek.com>
-Cc: Shay Agroskin <shayagr@amazon.com>
-Cc: Shenwei Wang <shenwei.wang@nxp.com>
-Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
-Cc: Tony Nguyen <anthony.l.nguyen@intel.com>
-Cc: Vladimir Oltean <vladimir.oltean@nxp.com>
-Cc: Wei Fang <wei.fang@nxp.com>
-Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
-Acked-by: Arthur Kiyanovski <akiyano@amazon.com>
-Acked-by: Toke Høiland-Jørgensen <toke@redhat.com>
-Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
-Acked-by: Martin Habets <habetsm.xilinx@gmail.com>
-Acked-by: Jesper Dangaard Brouer <hawk@kernel.org>
-Link: https://lore.kernel.org/r/20230908143215.869913-2-bigeasy@linutronix.de
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Stable-dep-of: 50bd33f6b392 ("net: enetc: fix the deadlock of enetc_mdio_lock")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/amazon/ena/ena_netdev.c | 2 +-
- drivers/net/ethernet/freescale/enetc/enetc.c | 2 +-
- drivers/net/ethernet/freescale/fec_main.c | 2 +-
- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 2 +-
- drivers/net/ethernet/intel/ice/ice_txrx_lib.c | 2 +-
- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 2 +-
- drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | 2 +-
- drivers/net/ethernet/marvell/mvneta.c | 2 +-
- drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | 2 +-
- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +-
- drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c | 2 +-
- drivers/net/ethernet/netronome/nfp/nfd3/xsk.c | 2 +-
- drivers/net/ethernet/sfc/efx_channels.c | 2 +-
- drivers/net/ethernet/sfc/siena/efx_channels.c | 2 +-
- drivers/net/ethernet/socionext/netsec.c | 2 +-
- drivers/net/ethernet/ti/cpsw_priv.c | 2 +-
- 16 files changed, 16 insertions(+), 16 deletions(-)
-
-diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
-index 77fa4c35f2331..af03e307451c2 100644
---- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
-+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
-@@ -1828,7 +1828,7 @@ static int ena_clean_rx_irq(struct ena_ring *rx_ring, struct napi_struct *napi,
- }
-
- if (xdp_flags & ENA_XDP_REDIRECT)
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- return work_done;
-
-diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
-index 4b4cc64724932..44ae1d2c34fd6 100644
---- a/drivers/net/ethernet/freescale/enetc/enetc.c
-+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
-@@ -1681,7 +1681,7 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring,
- rx_ring->stats.bytes += rx_byte_cnt;
-
- if (xdp_redirect_frm_cnt)
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- if (xdp_tx_frm_cnt)
- enetc_update_tx_ring_tail(tx_ring);
-diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
-index 5c72d229d3b6f..b352b89d096bf 100644
---- a/drivers/net/ethernet/freescale/fec_main.c
-+++ b/drivers/net/ethernet/freescale/fec_main.c
-@@ -1870,7 +1870,7 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
- rxq->bd.cur = bdp;
-
- if (xdp_result & FEC_ENET_XDP_REDIR)
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- return pkt_received;
- }
-diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
-index 2ede35ba3919b..a428d57c1da52 100644
---- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
-+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
-@@ -2392,7 +2392,7 @@ void i40e_update_rx_stats(struct i40e_ring *rx_ring,
- void i40e_finalize_xdp_rx(struct i40e_ring *rx_ring, unsigned int xdp_res)
- {
- if (xdp_res & I40E_XDP_REDIR)
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- if (xdp_res & I40E_XDP_TX) {
- struct i40e_ring *xdp_ring =
-diff --git a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c
-index d137b98d78eb6..48eac14fe991a 100644
---- a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c
-+++ b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c
-@@ -358,7 +358,7 @@ int ice_xmit_xdp_buff(struct xdp_buff *xdp, struct ice_tx_ring *xdp_ring)
- void ice_finalize_xdp_rx(struct ice_tx_ring *xdp_ring, unsigned int xdp_res)
- {
- if (xdp_res & ICE_XDP_REDIR)
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- if (xdp_res & ICE_XDP_TX) {
- if (static_branch_unlikely(&ice_xdp_locking_key))
-diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
-index 086cc25730338..d036dc190396c 100644
---- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
-+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
-@@ -2429,7 +2429,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
- }
-
- if (xdp_xmit & IXGBE_XDP_REDIR)
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- if (xdp_xmit & IXGBE_XDP_TX) {
- struct ixgbe_ring *ring = ixgbe_determine_xdp_ring(adapter);
-diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
-index 7ef82c30e8571..9fdd19acf2242 100644
---- a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
-+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
-@@ -351,7 +351,7 @@ int ixgbe_clean_rx_irq_zc(struct ixgbe_q_vector *q_vector,
- }
-
- if (xdp_xmit & IXGBE_XDP_REDIR)
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- if (xdp_xmit & IXGBE_XDP_TX) {
- struct ixgbe_ring *ring = ixgbe_determine_xdp_ring(adapter);
-diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
-index eb4ebaa1c92ff..0cc277fe33f5b 100644
---- a/drivers/net/ethernet/marvell/mvneta.c
-+++ b/drivers/net/ethernet/marvell/mvneta.c
-@@ -2514,7 +2514,7 @@ static int mvneta_rx_swbm(struct napi_struct *napi,
- mvneta_xdp_put_buff(pp, rxq, &xdp_buf, -1);
-
- if (ps.xdp_redirect)
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- if (ps.rx_packets)
- mvneta_update_stats(pp, &ps);
-diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
-index ec69bb90f5740..79516673811bd 100644
---- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
-+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
-@@ -4052,7 +4052,7 @@ static int mvpp2_rx(struct mvpp2_port *port, struct napi_struct *napi,
- }
-
- if (xdp_ret & MVPP2_XDP_REDIR)
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- if (ps.rx_packets) {
- struct mvpp2_pcpu_stats *stats = this_cpu_ptr(port->stats);
-diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-index 3f2f725ccceb3..b2ec1f183271d 100644
---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1989,7 +1989,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget,
- net_dim(ð->rx_dim, dim_sample);
-
- if (xdp_flush)
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- return done;
- }
-diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
-index 20507ef2f9569..e6612d1c3749c 100644
---- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
-+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c
-@@ -677,7 +677,7 @@ void mlx5e_xdp_rx_poll_complete(struct mlx5e_rq *rq)
- mlx5e_xmit_xdp_doorbell(xdpsq);
-
- if (test_bit(MLX5E_RQ_FLAG_XDP_REDIRECT, rq->flags)) {
-- xdp_do_flush_map();
-+ xdp_do_flush();
- __clear_bit(MLX5E_RQ_FLAG_XDP_REDIRECT, rq->flags);
- }
- }
-diff --git a/drivers/net/ethernet/netronome/nfp/nfd3/xsk.c b/drivers/net/ethernet/netronome/nfp/nfd3/xsk.c
-index 5d9db8c2a5b43..45be6954d5aae 100644
---- a/drivers/net/ethernet/netronome/nfp/nfd3/xsk.c
-+++ b/drivers/net/ethernet/netronome/nfp/nfd3/xsk.c
-@@ -256,7 +256,7 @@ nfp_nfd3_xsk_rx(struct nfp_net_rx_ring *rx_ring, int budget,
- nfp_net_xsk_rx_ring_fill_freelist(r_vec->rx_ring);
-
- if (xdp_redir)
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- if (tx_ring->wr_ptr_add)
- nfp_net_tx_xmit_more_flush(tx_ring);
-diff --git a/drivers/net/ethernet/sfc/efx_channels.c b/drivers/net/ethernet/sfc/efx_channels.c
-index 27d00ffac68f4..506163c977fa0 100644
---- a/drivers/net/ethernet/sfc/efx_channels.c
-+++ b/drivers/net/ethernet/sfc/efx_channels.c
-@@ -1281,7 +1281,7 @@ static int efx_poll(struct napi_struct *napi, int budget)
-
- spent = efx_process_channel(channel, budget);
-
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- if (spent < budget) {
- if (efx_channel_has_rx_queue(channel) &&
-diff --git a/drivers/net/ethernet/sfc/siena/efx_channels.c b/drivers/net/ethernet/sfc/siena/efx_channels.c
-index 1776f7f8a7a90..a7346e965bfe7 100644
---- a/drivers/net/ethernet/sfc/siena/efx_channels.c
-+++ b/drivers/net/ethernet/sfc/siena/efx_channels.c
-@@ -1285,7 +1285,7 @@ static int efx_poll(struct napi_struct *napi, int budget)
-
- spent = efx_process_channel(channel, budget);
-
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- if (spent < budget) {
- if (efx_channel_has_rx_queue(channel) &&
-diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c
-index b130e978366c1..f4b516906abdb 100644
---- a/drivers/net/ethernet/socionext/netsec.c
-+++ b/drivers/net/ethernet/socionext/netsec.c
-@@ -780,7 +780,7 @@ static void netsec_finalize_xdp_rx(struct netsec_priv *priv, u32 xdp_res,
- u16 pkts)
- {
- if (xdp_res & NETSEC_XDP_REDIR)
-- xdp_do_flush_map();
-+ xdp_do_flush();
-
- if (xdp_res & NETSEC_XDP_TX)
- netsec_xdp_ring_tx_db(priv, pkts);
-diff --git a/drivers/net/ethernet/ti/cpsw_priv.c b/drivers/net/ethernet/ti/cpsw_priv.c
-index 758295c898ac9..7b861e1027b9b 100644
---- a/drivers/net/ethernet/ti/cpsw_priv.c
-+++ b/drivers/net/ethernet/ti/cpsw_priv.c
-@@ -1359,7 +1359,7 @@ int cpsw_run_xdp(struct cpsw_priv *priv, int ch, struct xdp_buff *xdp,
- * particular hardware is sharing a common queue, so the
- * incoming device might change per packet.
- */
-- xdp_do_flush_map();
-+ xdp_do_flush();
- break;
- default:
- bpf_warn_invalid_xdp_action(ndev, prog, act);
---
-2.51.0
-
smb-server-let-smb_direct_flush_send_list-invalidate.patch
net-mlx5e-return-1-instead-of-0-in-invalid-case-in-m.patch
rtnetlink-allow-deleting-fdb-entries-in-user-namespa.patch
-net-fec-add-initial-xdp-support.patch
-net-ethernet-enetc-unlock-xdp_redirect-for-xdp-non-l.patch
-net-tree-wide-replace-xdp_do_flush_map-with-xdp_do_f.patch
-net-enetc-fix-the-deadlock-of-enetc_mdio_lock.patch
net-enetc-correct-the-value-of-enetc_rxb_truesize.patch
dpaa2-eth-fix-the-pointer-passed-to-ptr_align-on-tx-.patch
arm64-mm-avoid-always-making-pte-dirty-in-pte_mkwrit.patch