net: dpaa2-eth: create and export the dpaa2_eth_receive_skb() function
authorRobert-Ionut Alexa <robert-ionut.alexa@nxp.com>
Tue, 18 Oct 2022 14:18:58 +0000 (17:18 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Oct 2022 08:22:11 +0000 (09:22 +0100)
Carve out code from the dpaa2_eth_rx() function in order to create and
export the dpaa2_eth_receive_skb() function. Do this in order to reuse
this code also from the XSK path which will be introduced in a later
patch.

Signed-off-by: Robert-Ionut Alexa <robert-ionut.alexa@nxp.com>
Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h

index 9909fdf..0b21a3e 100644 (file)
@@ -523,11 +523,53 @@ static struct sk_buff *dpaa2_eth_copybreak(struct dpaa2_eth_channel *ch,
        return dpaa2_eth_alloc_skb(priv, ch, fd, fd_length, fd_vaddr);
 }
 
+void dpaa2_eth_receive_skb(struct dpaa2_eth_priv *priv,
+                          struct dpaa2_eth_channel *ch,
+                          const struct dpaa2_fd *fd, void *vaddr,
+                          struct dpaa2_eth_fq *fq,
+                          struct rtnl_link_stats64 *percpu_stats,
+                          struct sk_buff *skb)
+{
+       struct dpaa2_fas *fas;
+       u32 status = 0;
+
+       fas = dpaa2_get_fas(vaddr, false);
+       prefetch(fas);
+       prefetch(skb->data);
+
+       /* Get the timestamp value */
+       if (priv->rx_tstamp) {
+               struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
+               __le64 *ts = dpaa2_get_ts(vaddr, false);
+               u64 ns;
+
+               memset(shhwtstamps, 0, sizeof(*shhwtstamps));
+
+               ns = DPAA2_PTP_CLK_PERIOD_NS * le64_to_cpup(ts);
+               shhwtstamps->hwtstamp = ns_to_ktime(ns);
+       }
+
+       /* Check if we need to validate the L4 csum */
+       if (likely(dpaa2_fd_get_frc(fd) & DPAA2_FD_FRC_FASV)) {
+               status = le32_to_cpu(fas->status);
+               dpaa2_eth_validate_rx_csum(priv, status, skb);
+       }
+
+       skb->protocol = eth_type_trans(skb, priv->net_dev);
+       skb_record_rx_queue(skb, fq->flowid);
+
+       percpu_stats->rx_packets++;
+       percpu_stats->rx_bytes += dpaa2_fd_get_len(fd);
+       ch->stats.bytes_per_cdan += dpaa2_fd_get_len(fd);
+
+       list_add_tail(&skb->list, ch->rx_list);
+}
+
 /* Main Rx frame processing routine */
-static void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
-                        struct dpaa2_eth_channel *ch,
-                        const struct dpaa2_fd *fd,
-                        struct dpaa2_eth_fq *fq)
+void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
+                 struct dpaa2_eth_channel *ch,
+                 const struct dpaa2_fd *fd,
+                 struct dpaa2_eth_fq *fq)
 {
        dma_addr_t addr = dpaa2_fd_get_addr(fd);
        u8 fd_format = dpaa2_fd_get_format(fd);
@@ -536,9 +578,7 @@ static void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
        struct rtnl_link_stats64 *percpu_stats;
        struct dpaa2_eth_drv_stats *percpu_extras;
        struct device *dev = priv->net_dev->dev.parent;
-       struct dpaa2_fas *fas;
        void *buf_data;
-       u32 status = 0;
        u32 xdp_act;
 
        /* Tracing point */
@@ -548,8 +588,6 @@ static void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
        dma_sync_single_for_cpu(dev, addr, priv->rx_buf_size,
                                DMA_BIDIRECTIONAL);
 
-       fas = dpaa2_get_fas(vaddr, false);
-       prefetch(fas);
        buf_data = vaddr + dpaa2_fd_get_offset(fd);
        prefetch(buf_data);
 
@@ -587,35 +625,7 @@ static void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
        if (unlikely(!skb))
                goto err_build_skb;
 
-       prefetch(skb->data);
-
-       /* Get the timestamp value */
-       if (priv->rx_tstamp) {
-               struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
-               __le64 *ts = dpaa2_get_ts(vaddr, false);
-               u64 ns;
-
-               memset(shhwtstamps, 0, sizeof(*shhwtstamps));
-
-               ns = DPAA2_PTP_CLK_PERIOD_NS * le64_to_cpup(ts);
-               shhwtstamps->hwtstamp = ns_to_ktime(ns);
-       }
-
-       /* Check if we need to validate the L4 csum */
-       if (likely(dpaa2_fd_get_frc(fd) & DPAA2_FD_FRC_FASV)) {
-               status = le32_to_cpu(fas->status);
-               dpaa2_eth_validate_rx_csum(priv, status, skb);
-       }
-
-       skb->protocol = eth_type_trans(skb, priv->net_dev);
-       skb_record_rx_queue(skb, fq->flowid);
-
-       percpu_stats->rx_packets++;
-       percpu_stats->rx_bytes += dpaa2_fd_get_len(fd);
-       ch->stats.bytes_per_cdan += dpaa2_fd_get_len(fd);
-
-       list_add_tail(&skb->list, ch->rx_list);
-
+       dpaa2_eth_receive_skb(priv, ch, fd, vaddr, fq, percpu_stats, skb);
        return;
 
 err_build_skb:
index 7c46ec3..3c4fc46 100644 (file)
@@ -796,4 +796,16 @@ struct sk_buff *dpaa2_eth_alloc_skb(struct dpaa2_eth_priv *priv,
                                    struct dpaa2_eth_channel *ch,
                                    const struct dpaa2_fd *fd, u32 fd_length,
                                    void *fd_vaddr);
+
+void dpaa2_eth_receive_skb(struct dpaa2_eth_priv *priv,
+                          struct dpaa2_eth_channel *ch,
+                          const struct dpaa2_fd *fd, void *vaddr,
+                          struct dpaa2_eth_fq *fq,
+                          struct rtnl_link_stats64 *percpu_stats,
+                          struct sk_buff *skb);
+
+void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
+                 struct dpaa2_eth_channel *ch,
+                 const struct dpaa2_fd *fd,
+                 struct dpaa2_eth_fq *fq);
 #endif /* __DPAA2_H */