ravb: Create helper to allocate skb and align it
[sfrench/cifs-2.6.git] / drivers / net / ethernet / renesas / ravb_main.c
index 5c72b780d623fcf1666b79640f42d22a743e4785..e6b0250588472e4b98e433a8fc2c52c316336145 100644 (file)
@@ -113,12 +113,23 @@ static void ravb_set_rate_rcar(struct net_device *ndev)
        }
 }
 
-static void ravb_set_buffer_align(struct sk_buff *skb)
+static struct sk_buff *
+ravb_alloc_skb(struct net_device *ndev, const struct ravb_hw_info *info,
+              gfp_t gfp_mask)
 {
-       u32 reserve = (unsigned long)skb->data & (RAVB_ALIGN - 1);
+       struct sk_buff *skb;
+       u32 reserve;
+
+       skb = __netdev_alloc_skb(ndev, info->rx_max_frame_size + RAVB_ALIGN - 1,
+                                gfp_mask);
+       if (!skb)
+               return NULL;
 
+       reserve = (unsigned long)skb->data & (RAVB_ALIGN - 1);
        if (reserve)
                skb_reserve(skb, RAVB_ALIGN - reserve);
+
+       return skb;
 }
 
 /* Get MAC address from the MAC address registers
@@ -251,7 +262,7 @@ static void ravb_rx_ring_free_gbeth(struct net_device *ndev, int q)
                                       le32_to_cpu(desc->dptr)))
                        dma_unmap_single(ndev->dev.parent,
                                         le32_to_cpu(desc->dptr),
-                                        GBETH_RX_BUFF_MAX,
+                                        priv->info->rx_max_frame_size,
                                         DMA_FROM_DEVICE);
        }
        ring_size = sizeof(struct ravb_rx_desc) * (priv->num_rx_ring[q] + 1);
@@ -276,7 +287,7 @@ static void ravb_rx_ring_free_rcar(struct net_device *ndev, int q)
                                       le32_to_cpu(desc->dptr)))
                        dma_unmap_single(ndev->dev.parent,
                                         le32_to_cpu(desc->dptr),
-                                        RX_BUF_SZ,
+                                        priv->info->rx_max_frame_size,
                                         DMA_FROM_DEVICE);
        }
        ring_size = sizeof(struct ravb_ex_rx_desc) *
@@ -342,7 +353,7 @@ static void ravb_rx_ring_format_gbeth(struct net_device *ndev, int q)
                rx_desc = &priv->rx_ring[q].desc[i];
                rx_desc->ds_cc = cpu_to_le16(GBETH_RX_DESC_DATA_SIZE);
                dma_addr = dma_map_single(ndev->dev.parent, priv->rx_skb[q][i]->data,
-                                         GBETH_RX_BUFF_MAX,
+                                         priv->info->rx_max_frame_size,
                                          DMA_FROM_DEVICE);
                /* We just set the data size to 0 for a failed mapping which
                 * should prevent DMA from happening...
@@ -372,7 +383,7 @@ static void ravb_rx_ring_format_rcar(struct net_device *ndev, int q)
                rx_desc = &priv->rx_ring[q].ex_desc[i];
                rx_desc->ds_cc = cpu_to_le16(RX_BUF_SZ);
                dma_addr = dma_map_single(ndev->dev.parent, priv->rx_skb[q][i]->data,
-                                         RX_BUF_SZ,
+                                         priv->info->rx_max_frame_size,
                                          DMA_FROM_DEVICE);
                /* We just set the data size to 0 for a failed mapping which
                 * should prevent DMA from happening...
@@ -476,10 +487,9 @@ static int ravb_ring_init(struct net_device *ndev, int q)
                goto error;
 
        for (i = 0; i < priv->num_rx_ring[q]; i++) {
-               skb = __netdev_alloc_skb(ndev, info->max_rx_len, GFP_KERNEL);
+               skb = ravb_alloc_skb(ndev, info, GFP_KERNEL);
                if (!skb)
                        goto error;
-               ravb_set_buffer_align(skb);
                priv->rx_skb[q][i] = skb;
        }
 
@@ -805,7 +815,8 @@ static struct sk_buff *ravb_get_skb_gbeth(struct net_device *ndev, int entry,
        skb = priv->rx_skb[RAVB_BE][entry];
        priv->rx_skb[RAVB_BE][entry] = NULL;
        dma_unmap_single(ndev->dev.parent, le32_to_cpu(desc->dptr),
-                        ALIGN(GBETH_RX_BUFF_MAX, 16), DMA_FROM_DEVICE);
+                        ALIGN(priv->info->rx_max_frame_size, 16),
+                        DMA_FROM_DEVICE);
 
        return skb;
 }
@@ -912,13 +923,12 @@ static bool ravb_rx_gbeth(struct net_device *ndev, int *quota, int q)
                desc->ds_cc = cpu_to_le16(GBETH_RX_DESC_DATA_SIZE);
 
                if (!priv->rx_skb[q][entry]) {
-                       skb = netdev_alloc_skb(ndev, info->max_rx_len);
+                       skb = ravb_alloc_skb(ndev, info, GFP_ATOMIC);
                        if (!skb)
                                break;
-                       ravb_set_buffer_align(skb);
                        dma_addr = dma_map_single(ndev->dev.parent,
                                                  skb->data,
-                                                 GBETH_RX_BUFF_MAX,
+                                                 priv->info->rx_max_frame_size,
                                                  DMA_FROM_DEVICE);
                        skb_checksum_none_assert(skb);
                        /* We just set the data size to 0 for a failed mapping
@@ -992,7 +1002,7 @@ static bool ravb_rx_rcar(struct net_device *ndev, int *quota, int q)
                        skb = priv->rx_skb[q][entry];
                        priv->rx_skb[q][entry] = NULL;
                        dma_unmap_single(ndev->dev.parent, le32_to_cpu(desc->dptr),
-                                        RX_BUF_SZ,
+                                        priv->info->rx_max_frame_size,
                                         DMA_FROM_DEVICE);
                        get_ts &= (q == RAVB_NC) ?
                                        RAVB_RXTSTAMP_TYPE_V2_L2_EVENT :
@@ -1028,10 +1038,9 @@ static bool ravb_rx_rcar(struct net_device *ndev, int *quota, int q)
                desc->ds_cc = cpu_to_le16(RX_BUF_SZ);
 
                if (!priv->rx_skb[q][entry]) {
-                       skb = netdev_alloc_skb(ndev, info->max_rx_len);
+                       skb = ravb_alloc_skb(ndev, info, GFP_ATOMIC);
                        if (!skb)
                                break;  /* Better luck next round. */
-                       ravb_set_buffer_align(skb);
                        dma_addr = dma_map_single(ndev->dev.parent, skb->data,
                                                  le16_to_cpu(desc->ds_cc),
                                                  DMA_FROM_DEVICE);
@@ -2682,7 +2691,6 @@ static const struct ravb_hw_info ravb_gen3_hw_info = {
        .net_hw_features = NETIF_F_RXCSUM,
        .net_features = NETIF_F_RXCSUM,
        .stats_len = ARRAY_SIZE(ravb_gstrings_stats),
-       .max_rx_len = RX_BUF_SZ + RAVB_ALIGN - 1,
        .tccr_mask = TCCR_TSRQ0 | TCCR_TSRQ1 | TCCR_TSRQ2 | TCCR_TSRQ3,
        .rx_max_frame_size = SZ_2K,
        .internal_delay = 1,
@@ -2708,7 +2716,6 @@ static const struct ravb_hw_info ravb_gen2_hw_info = {
        .net_hw_features = NETIF_F_RXCSUM,
        .net_features = NETIF_F_RXCSUM,
        .stats_len = ARRAY_SIZE(ravb_gstrings_stats),
-       .max_rx_len = RX_BUF_SZ + RAVB_ALIGN - 1,
        .tccr_mask = TCCR_TSRQ0 | TCCR_TSRQ1 | TCCR_TSRQ2 | TCCR_TSRQ3,
        .rx_max_frame_size = SZ_2K,
        .aligned_tx = 1,
@@ -2731,7 +2738,6 @@ static const struct ravb_hw_info ravb_rzv2m_hw_info = {
        .net_hw_features = NETIF_F_RXCSUM,
        .net_features = NETIF_F_RXCSUM,
        .stats_len = ARRAY_SIZE(ravb_gstrings_stats),
-       .max_rx_len = RX_BUF_SZ + RAVB_ALIGN - 1,
        .tccr_mask = TCCR_TSRQ0 | TCCR_TSRQ1 | TCCR_TSRQ2 | TCCR_TSRQ3,
        .rx_max_frame_size = SZ_2K,
        .multi_irqs = 1,
@@ -2756,7 +2762,6 @@ static const struct ravb_hw_info gbeth_hw_info = {
        .net_hw_features = NETIF_F_RXCSUM | NETIF_F_HW_CSUM,
        .net_features = NETIF_F_RXCSUM | NETIF_F_HW_CSUM,
        .stats_len = ARRAY_SIZE(ravb_gstrings_stats_gbeth),
-       .max_rx_len = ALIGN(GBETH_RX_BUFF_MAX, RAVB_ALIGN),
        .tccr_mask = TCCR_TSRQ0,
        .rx_max_frame_size = SZ_8K,
        .aligned_tx = 1,