Skip to content

Commit

Permalink
net: sh_eth: fix up the buffer pointers
Browse files Browse the repository at this point in the history
After freeing the buffer, the driver should change the value of
the pointer to NULL.

Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Yoshihiro Shimoda authored and David S. Miller committed Jun 27, 2012
1 parent 2ecbb78 commit 91c7755
Showing 1 changed file with 24 additions and 7 deletions.
31 changes: 24 additions & 7 deletions drivers/net/ethernet/renesas/sh_eth.c
Original file line number Diff line number Diff line change
Expand Up @@ -788,6 +788,7 @@ static void sh_eth_ring_free(struct net_device *ndev)
}
}
kfree(mdp->rx_skbuff);
mdp->rx_skbuff = NULL;

/* Free Tx skb ringbuffer */
if (mdp->tx_skbuff) {
Expand All @@ -797,6 +798,7 @@ static void sh_eth_ring_free(struct net_device *ndev)
}
}
kfree(mdp->tx_skbuff);
mdp->tx_skbuff = NULL;
}

/* format skb and descriptor buffer */
Expand Down Expand Up @@ -933,10 +935,31 @@ static int sh_eth_ring_init(struct net_device *ndev)
skb_ring_free:
/* Free Rx and Tx skb ring 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) * RX_RING_SIZE;
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) * TX_RING_SIZE;
dma_free_coherent(NULL, ringsize, mdp->tx_ring,
mdp->tx_desc_dma);
mdp->tx_ring = NULL;
}
}

static int sh_eth_dev_init(struct net_device *ndev)
{
int ret = 0;
Expand Down Expand Up @@ -1677,7 +1700,6 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
static int sh_eth_close(struct net_device *ndev)
{
struct sh_eth_private *mdp = netdev_priv(ndev);
int ringsize;

netif_stop_queue(ndev);

Expand All @@ -1700,12 +1722,7 @@ static int sh_eth_close(struct net_device *ndev)
sh_eth_ring_free(ndev);

/* free DMA buffer */
ringsize = sizeof(struct sh_eth_rxdesc) * RX_RING_SIZE;
dma_free_coherent(NULL, ringsize, mdp->rx_ring, mdp->rx_desc_dma);

/* free DMA buffer */
ringsize = sizeof(struct sh_eth_txdesc) * TX_RING_SIZE;
dma_free_coherent(NULL, ringsize, mdp->tx_ring, mdp->tx_desc_dma);
sh_eth_free_dma_buffer(mdp);

pm_runtime_put_sync(&mdp->pdev->dev);

Expand Down

0 comments on commit 91c7755

Please sign in to comment.