sh_eth: merge sh_eth_free_dma_buffer() into sh_eth_ring_free()
[deliverable/linux.git] / drivers / net / ethernet / renesas / sh_eth.c
index a484d8beb8557935b30251dc70bf3ef3d3b64dbc..e7bab7909ed9e1868dd5f8457b3cfc96c92788f1 100644 (file)
@@ -1098,7 +1098,7 @@ static struct mdiobb_ops bb_ops = {
 static void sh_eth_ring_free(struct net_device *ndev)
 {
        struct sh_eth_private *mdp = netdev_priv(ndev);
-       int i;
+       int ringsize, i;
 
        /* Free Rx skb ringbuffer */
        if (mdp->rx_skbuff) {
@@ -1115,6 +1115,20 @@ static void sh_eth_ring_free(struct net_device *ndev)
        }
        kfree(mdp->tx_skbuff);
        mdp->tx_skbuff = NULL;
+
+       if (mdp->rx_ring) {
+               ringsize = sizeof(struct sh_eth_rxdesc) * mdp->num_rx_ring;
+               dma_free_coherent(NULL, ringsize, mdp->rx_ring,
+                                 mdp->rx_desc_dma);
+               mdp->rx_ring = NULL;
+       }
+
+       if (mdp->tx_ring) {
+               ringsize = sizeof(struct sh_eth_txdesc) * mdp->num_tx_ring;
+               dma_free_coherent(NULL, ringsize, mdp->tx_ring,
+                                 mdp->tx_desc_dma);
+               mdp->tx_ring = NULL;
+       }
 }
 
 /* format skb and descriptor buffer */
@@ -1173,7 +1187,7 @@ static void sh_eth_ring_format(struct net_device *ndev)
        mdp->dirty_rx = (u32) (i - mdp->num_rx_ring);
 
        /* Mark the last entry as wrapping the ring. */
-       rxdesc->status |= cpu_to_edmac(mdp, RD_RDEL);
+       rxdesc->status |= cpu_to_edmac(mdp, RD_RDLE);
 
        memset(mdp->tx_ring, 0, tx_ringsize);
 
@@ -1199,7 +1213,7 @@ static void sh_eth_ring_format(struct net_device *ndev)
 static int sh_eth_ring_init(struct net_device *ndev)
 {
        struct sh_eth_private *mdp = netdev_priv(ndev);
-       int rx_ringsize, tx_ringsize, ret = 0;
+       int rx_ringsize, tx_ringsize;
 
        /* +26 gets the maximum ethernet encapsulation, +7 & ~7 because the
         * card needs room to do 8 byte alignment, +2 so we can reserve
@@ -1212,28 +1226,22 @@ static int sh_eth_ring_init(struct net_device *ndev)
                mdp->rx_buf_sz += NET_IP_ALIGN;
 
        /* Allocate RX and TX skb rings */
-       mdp->rx_skbuff = kmalloc_array(mdp->num_rx_ring,
-                                      sizeof(*mdp->rx_skbuff), GFP_KERNEL);
-       if (!mdp->rx_skbuff) {
-               ret = -ENOMEM;
-               return ret;
-       }
+       mdp->rx_skbuff = kcalloc(mdp->num_rx_ring, sizeof(*mdp->rx_skbuff),
+                                GFP_KERNEL);
+       if (!mdp->rx_skbuff)
+               return -ENOMEM;
 
-       mdp->tx_skbuff = kmalloc_array(mdp->num_tx_ring,
-                                      sizeof(*mdp->tx_skbuff), GFP_KERNEL);
-       if (!mdp->tx_skbuff) {
-               ret = -ENOMEM;
-               goto skb_ring_free;
-       }
+       mdp->tx_skbuff = kcalloc(mdp->num_tx_ring, sizeof(*mdp->tx_skbuff),
+                                GFP_KERNEL);
+       if (!mdp->tx_skbuff)
+               goto ring_free;
 
        /* Allocate all Rx descriptors. */
        rx_ringsize = sizeof(struct sh_eth_rxdesc) * mdp->num_rx_ring;
        mdp->rx_ring = dma_alloc_coherent(NULL, rx_ringsize, &mdp->rx_desc_dma,
                                          GFP_KERNEL);
-       if (!mdp->rx_ring) {
-               ret = -ENOMEM;
-               goto desc_ring_free;
-       }
+       if (!mdp->rx_ring)
+               goto ring_free;
 
        mdp->dirty_rx = 0;
 
@@ -1241,42 +1249,15 @@ static int sh_eth_ring_init(struct net_device *ndev)
        tx_ringsize = sizeof(struct sh_eth_txdesc) * mdp->num_tx_ring;
        mdp->tx_ring = dma_alloc_coherent(NULL, tx_ringsize, &mdp->tx_desc_dma,
                                          GFP_KERNEL);
-       if (!mdp->tx_ring) {
-               ret = -ENOMEM;
-               goto desc_ring_free;
-       }
-       return ret;
-
-desc_ring_free:
-       /* free DMA buffer */
-       dma_free_coherent(NULL, rx_ringsize, mdp->rx_ring, mdp->rx_desc_dma);
+       if (!mdp->tx_ring)
+               goto ring_free;
+       return 0;
 
-skb_ring_free:
-       /* Free Rx and Tx skb ring buffer */
+ring_free:
+       /* Free Rx and Tx skb ring buffer and DMA buffer */
        sh_eth_ring_free(ndev);
-       mdp->tx_ring = NULL;
-       mdp->rx_ring = NULL;
-
-       return ret;
-}
-
-static void sh_eth_free_dma_buffer(struct sh_eth_private *mdp)
-{
-       int ringsize;
-
-       if (mdp->rx_ring) {
-               ringsize = sizeof(struct sh_eth_rxdesc) * mdp->num_rx_ring;
-               dma_free_coherent(NULL, ringsize, mdp->rx_ring,
-                                 mdp->rx_desc_dma);
-               mdp->rx_ring = NULL;
-       }
 
-       if (mdp->tx_ring) {
-               ringsize = sizeof(struct sh_eth_txdesc) * mdp->num_tx_ring;
-               dma_free_coherent(NULL, ringsize, mdp->tx_ring,
-                                 mdp->tx_desc_dma);
-               mdp->tx_ring = NULL;
-       }
+       return -ENOMEM;
 }
 
 static int sh_eth_dev_init(struct net_device *ndev, bool start)
@@ -1416,7 +1397,7 @@ static int sh_eth_txfree(struct net_device *ndev)
                if (txdesc->status & cpu_to_edmac(mdp, TD_TACT))
                        break;
                /* TACT bit must be checked before all the following reads */
-               rmb();
+               dma_rmb();
                netif_info(mdp, tx_done, ndev,
                           "tx entry %d status 0x%08x\n",
                           entry, edmac_to_cpu(mdp, txdesc->status));
@@ -1458,7 +1439,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
        rxdesc = &mdp->rx_ring[entry];
        while (!(rxdesc->status & cpu_to_edmac(mdp, RD_RACT))) {
                /* RACT bit must be checked before all the following reads */
-               rmb();
+               dma_rmb();
                desc_status = edmac_to_cpu(mdp, rxdesc->status);
                pkt_len = rxdesc->frame_length;
 
@@ -1544,10 +1525,10 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
                        skb_checksum_none_assert(skb);
                        rxdesc->addr = dma_addr;
                }
-               wmb(); /* RACT bit must be set after all the above writes */
+               dma_wmb(); /* RACT bit must be set after all the above writes */
                if (entry >= mdp->num_rx_ring - 1)
                        rxdesc->status |=
-                               cpu_to_edmac(mdp, RD_RACT | RD_RFP | RD_RDEL);
+                               cpu_to_edmac(mdp, RD_RACT | RD_RFP | RD_RDLE);
                else
                        rxdesc->status |=
                                cpu_to_edmac(mdp, RD_RACT | RD_RFP);
@@ -2239,10 +2220,8 @@ static int sh_eth_set_ringparam(struct net_device *ndev,
 
                sh_eth_dev_exit(ndev);
 
-               /* Free all the skbuffs in the Rx queue. */
+               /* Free all the skbuffs in the Rx queue and the DMA buffers. */
                sh_eth_ring_free(ndev);
-               /* Free DMA buffer */
-               sh_eth_free_dma_buffer(mdp);
        }
 
        /* Set new parameters */
@@ -2403,7 +2382,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
        }
        txdesc->buffer_length = skb->len;
 
-       wmb(); /* TACT bit must be set after all the above writes */
+       dma_wmb(); /* TACT bit must be set after all the above writes */
        if (entry >= mdp->num_tx_ring - 1)
                txdesc->status |= cpu_to_edmac(mdp, TD_TACT | TD_TDLE);
        else
@@ -2487,12 +2466,9 @@ static int sh_eth_close(struct net_device *ndev)
 
        free_irq(ndev->irq, ndev);
 
-       /* Free all the skbuffs in the Rx queue. */
+       /* Free all the skbuffs in the Rx queue and the DMA buffer. */
        sh_eth_ring_free(ndev);
 
-       /* free DMA buffer */
-       sh_eth_free_dma_buffer(mdp);
-
        pm_runtime_put_sync(&mdp->pdev->dev);
 
        mdp->is_opened = 0;
This page took 0.041013 seconds and 5 git commands to generate.