Commit 4b3afc6e authored by Eric W. Biederman's avatar Eric W. Biederman

via-rhine: Call dev_kfree/consume_skb_any instead of dev_kfree_skb.

Replace dev_kfree_skb with dev_kfree_skb_any in rhine_start_tx which
can be called in hard irq and other contexts.  Packets are only freed
in rhine_start_tx if they are dropped.

Replace dev_kfree_skb with dev_consume_skb_any in rhine_tx that can be
called in hard irq and other contexts.  rhine_tx handles successfully
transmitted packets.
Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent 20eca054
...@@ -1676,7 +1676,7 @@ static netdev_tx_t rhine_start_tx(struct sk_buff *skb, ...@@ -1676,7 +1676,7 @@ static netdev_tx_t rhine_start_tx(struct sk_buff *skb,
/* Must use alignment buffer. */ /* Must use alignment buffer. */
if (skb->len > PKT_BUF_SZ) { if (skb->len > PKT_BUF_SZ) {
/* packet too long, drop it */ /* packet too long, drop it */
dev_kfree_skb(skb); dev_kfree_skb_any(skb);
rp->tx_skbuff[entry] = NULL; rp->tx_skbuff[entry] = NULL;
dev->stats.tx_dropped++; dev->stats.tx_dropped++;
return NETDEV_TX_OK; return NETDEV_TX_OK;
...@@ -1696,7 +1696,7 @@ static netdev_tx_t rhine_start_tx(struct sk_buff *skb, ...@@ -1696,7 +1696,7 @@ static netdev_tx_t rhine_start_tx(struct sk_buff *skb,
pci_map_single(rp->pdev, skb->data, skb->len, pci_map_single(rp->pdev, skb->data, skb->len,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
if (dma_mapping_error(&rp->pdev->dev, rp->tx_skbuff_dma[entry])) { if (dma_mapping_error(&rp->pdev->dev, rp->tx_skbuff_dma[entry])) {
dev_kfree_skb(skb); dev_kfree_skb_any(skb);
rp->tx_skbuff_dma[entry] = 0; rp->tx_skbuff_dma[entry] = 0;
dev->stats.tx_dropped++; dev->stats.tx_dropped++;
return NETDEV_TX_OK; return NETDEV_TX_OK;
...@@ -1834,7 +1834,7 @@ static void rhine_tx(struct net_device *dev) ...@@ -1834,7 +1834,7 @@ static void rhine_tx(struct net_device *dev)
rp->tx_skbuff[entry]->len, rp->tx_skbuff[entry]->len,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
} }
dev_kfree_skb(rp->tx_skbuff[entry]); dev_consume_skb_any(rp->tx_skbuff[entry]);
rp->tx_skbuff[entry] = NULL; rp->tx_skbuff[entry] = NULL;
entry = (++rp->dirty_tx) % TX_RING_SIZE; entry = (++rp->dirty_tx) % TX_RING_SIZE;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment