dpaa2-eth: Add software annotation types
authorIoana Radulescu <ruxandra.radulescu@nxp.com>
Fri, 1 Mar 2019 17:47:23 +0000 (17:47 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 4 Mar 2019 04:41:18 +0000 (20:41 -0800)
We write different metadata information in the software annotation
area of Tx frames, depending on frame type. Make this more explicit
by introducing a type field and separate structures for single buffer
and scatter-gather frames.

Signed-off-by: Ioana Radulescu <ruxandra.radulescu@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 87777b0..3acfd8c 100644 (file)
@@ -571,10 +571,11 @@ static int build_sg_fd(struct dpaa2_eth_priv *priv,
         * all of them on Tx Conf.
         */
        swa = (struct dpaa2_eth_swa *)sgt_buf;
-       swa->skb = skb;
-       swa->scl = scl;
-       swa->num_sg = num_sg;
-       swa->sgt_size = sgt_buf_size;
+       swa->type = DPAA2_ETH_SWA_SG;
+       swa->sg.skb = skb;
+       swa->sg.scl = scl;
+       swa->sg.num_sg = num_sg;
+       swa->sg.sgt_size = sgt_buf_size;
 
        /* Separately map the SGT buffer */
        addr = dma_map_single(dev, sgt_buf, sgt_buf_size, DMA_BIDIRECTIONAL);
@@ -609,7 +610,7 @@ static int build_single_fd(struct dpaa2_eth_priv *priv,
 {
        struct device *dev = priv->net_dev->dev.parent;
        u8 *buffer_start, *aligned_start;
-       struct sk_buff **skbh;
+       struct dpaa2_eth_swa *swa;
        dma_addr_t addr;
 
        buffer_start = skb->data - dpaa2_eth_needed_headroom(priv, skb);
@@ -626,8 +627,9 @@ static int build_single_fd(struct dpaa2_eth_priv *priv,
         * (in the private data area) such that we can release it
         * on Tx confirm
         */
-       skbh = (struct sk_buff **)buffer_start;
-       *skbh = skb;
+       swa = (struct dpaa2_eth_swa *)buffer_start;
+       swa->type = DPAA2_ETH_SWA_SINGLE;
+       swa->single.skb = skb;
 
        addr = dma_map_single(dev, buffer_start,
                              skb_tail_pointer(skb) - buffer_start,
@@ -659,17 +661,17 @@ static void free_tx_fd(const struct dpaa2_eth_priv *priv,
 {
        struct device *dev = priv->net_dev->dev.parent;
        dma_addr_t fd_addr;
-       struct sk_buff **skbh, *skb;
+       struct sk_buff *skb;
        unsigned char *buffer_start;
        struct dpaa2_eth_swa *swa;
        u8 fd_format = dpaa2_fd_get_format(fd);
 
        fd_addr = dpaa2_fd_get_addr(fd);
-       skbh = dpaa2_iova_to_virt(priv->iommu_domain, fd_addr);
+       buffer_start = dpaa2_iova_to_virt(priv->iommu_domain, fd_addr);
+       swa = (struct dpaa2_eth_swa *)buffer_start;
 
        if (fd_format == dpaa2_fd_single) {
-               skb = *skbh;
-               buffer_start = (unsigned char *)skbh;
+               skb = swa->single.skb;
                /* Accessing the skb buffer is safe before dma unmap, because
                 * we didn't map the actual skb shell.
                 */
@@ -677,15 +679,15 @@ static void free_tx_fd(const struct dpaa2_eth_priv *priv,
                                 skb_tail_pointer(skb) - buffer_start,
                                 DMA_BIDIRECTIONAL);
        } else if (fd_format == dpaa2_fd_sg) {
-               swa = (struct dpaa2_eth_swa *)skbh;
-               skb = swa->skb;
+               skb = swa->sg.skb;
 
                /* Unmap the scatterlist */
-               dma_unmap_sg(dev, swa->scl, swa->num_sg, DMA_BIDIRECTIONAL);
-               kfree(swa->scl);
+               dma_unmap_sg(dev, swa->sg.scl, swa->sg.num_sg,
+                            DMA_BIDIRECTIONAL);
+               kfree(swa->sg.scl);
 
                /* Unmap the SGT buffer */
-               dma_unmap_single(dev, fd_addr, swa->sgt_size,
+               dma_unmap_single(dev, fd_addr, swa->sg.sgt_size,
                                 DMA_BIDIRECTIONAL);
        } else {
                netdev_dbg(priv->net_dev, "Invalid FD format\n");
@@ -695,7 +697,7 @@ static void free_tx_fd(const struct dpaa2_eth_priv *priv,
        /* Get the timestamp value */
        if (priv->tx_tstamp && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) {
                struct skb_shared_hwtstamps shhwtstamps;
-               __le64 *ts = dpaa2_get_ts(skbh, true);
+               __le64 *ts = dpaa2_get_ts(buffer_start, true);
                u64 ns;
 
                memset(&shhwtstamps, 0, sizeof(shhwtstamps));
@@ -707,7 +709,7 @@ static void free_tx_fd(const struct dpaa2_eth_priv *priv,
 
        /* Free SGT buffer allocated on tx */
        if (fd_format != dpaa2_fd_single)
-               skb_free_frag(skbh);
+               skb_free_frag(buffer_start);
 
        /* Move on with skb release */
        napi_consume_skb(skb, in_napi);
index 9510928..423976d 100644 (file)
  */
 #define DPAA2_ETH_SWA_SIZE             64
 
+/* We store different information in the software annotation area of a Tx frame
+ * based on what type of frame it is
+ */
+enum dpaa2_eth_swa_type {
+       DPAA2_ETH_SWA_SINGLE,
+       DPAA2_ETH_SWA_SG,
+};
+
 /* Must keep this struct smaller than DPAA2_ETH_SWA_SIZE */
 struct dpaa2_eth_swa {
-       struct sk_buff *skb;
-       struct scatterlist *scl;
-       int num_sg;
-       int sgt_size;
+       enum dpaa2_eth_swa_type type;
+       union {
+               struct {
+                       struct sk_buff *skb;
+               } single;
+               struct {
+                       struct sk_buff *skb;
+                       struct scatterlist *scl;
+                       int num_sg;
+                       int sgt_size;
+               } sg;
+       };
 };
 
 /* Annotation valid bits in FD FRC */