Skip to content

Commit 91c7755

Browse files
shimodaydavem330
authored andcommitted
net: sh_eth: fix up the buffer pointers
After freeing the buffer, the driver should change the value of the pointer to NULL. Signed-off-by: Yoshihiro Shimoda <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 2ecbb78 commit 91c7755

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

drivers/net/ethernet/renesas/sh_eth.c

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,7 @@ static void sh_eth_ring_free(struct net_device *ndev)
788788
}
789789
}
790790
kfree(mdp->rx_skbuff);
791+
mdp->rx_skbuff = NULL;
791792

792793
/* Free Tx skb ringbuffer */
793794
if (mdp->tx_skbuff) {
@@ -797,6 +798,7 @@ static void sh_eth_ring_free(struct net_device *ndev)
797798
}
798799
}
799800
kfree(mdp->tx_skbuff);
801+
mdp->tx_skbuff = NULL;
800802
}
801803

802804
/* format skb and descriptor buffer */
@@ -933,10 +935,31 @@ static int sh_eth_ring_init(struct net_device *ndev)
933935
skb_ring_free:
934936
/* Free Rx and Tx skb ring buffer */
935937
sh_eth_ring_free(ndev);
938+
mdp->tx_ring = NULL;
939+
mdp->rx_ring = NULL;
936940

937941
return ret;
938942
}
939943

944+
static void sh_eth_free_dma_buffer(struct sh_eth_private *mdp)
945+
{
946+
int ringsize;
947+
948+
if (mdp->rx_ring) {
949+
ringsize = sizeof(struct sh_eth_rxdesc) * RX_RING_SIZE;
950+
dma_free_coherent(NULL, ringsize, mdp->rx_ring,
951+
mdp->rx_desc_dma);
952+
mdp->rx_ring = NULL;
953+
}
954+
955+
if (mdp->tx_ring) {
956+
ringsize = sizeof(struct sh_eth_txdesc) * TX_RING_SIZE;
957+
dma_free_coherent(NULL, ringsize, mdp->tx_ring,
958+
mdp->tx_desc_dma);
959+
mdp->tx_ring = NULL;
960+
}
961+
}
962+
940963
static int sh_eth_dev_init(struct net_device *ndev)
941964
{
942965
int ret = 0;
@@ -1677,7 +1700,6 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
16771700
static int sh_eth_close(struct net_device *ndev)
16781701
{
16791702
struct sh_eth_private *mdp = netdev_priv(ndev);
1680-
int ringsize;
16811703

16821704
netif_stop_queue(ndev);
16831705

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

17021724
/* free DMA buffer */
1703-
ringsize = sizeof(struct sh_eth_rxdesc) * RX_RING_SIZE;
1704-
dma_free_coherent(NULL, ringsize, mdp->rx_ring, mdp->rx_desc_dma);
1705-
1706-
/* free DMA buffer */
1707-
ringsize = sizeof(struct sh_eth_txdesc) * TX_RING_SIZE;
1708-
dma_free_coherent(NULL, ringsize, mdp->tx_ring, mdp->tx_desc_dma);
1725+
sh_eth_free_dma_buffer(mdp);
17091726

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

0 commit comments

Comments
 (0)