Re: [PATCH] sky2: receive dma mapping error handling
From: Jarek Poplawski <hidden>
Date: 2010-02-01 20:13:33
Also in:
lkml
On Mon, Feb 01, 2010 at 10:20:18AM -0800, Stephen Hemminger wrote:
This fixes the fact that re->flags is always zero without causing other confusion.
Actually, there is a slight confusion: after tx_init() slots #0 are skipped and waiting for tx_complete. Of course, no big deal, but no problem with fixing it too, so there is the main difference between these two patches. (Moving re->flags and re->skb initializations is an optimization, but I tried to change only the buggy parts.) Jarek P.
quoted hunk ↗ jump to hunk
--- a/drivers/net/sky2.c 2010-02-01 10:07:42.676296236 -0800 +++ b/drivers/net/sky2.c 2010-02-01 10:18:12.575044064 -0800@@ -1025,11 +1025,8 @@ static void sky2_prefetch_init(struct sk static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2, u16 *slot) { struct sky2_tx_le *le = sky2->tx_le + *slot; - struct tx_ring_info *re = sky2->tx_ring + *slot; *slot = RING_NEXT(*slot, sky2->tx_ring_size); - re->flags = 0; - re->skb = NULL; le->ctrl = 0; return le; }@@ -1622,8 +1619,7 @@ static unsigned tx_le_req(const struct s return count; } -static void sky2_tx_unmap(struct pci_dev *pdev, - const struct tx_ring_info *re) +static void sky2_tx_unmap(struct pci_dev *pdev, struct tx_ring_info *re) { if (re->flags & TX_MAP_SINGLE) pci_unmap_single(pdev, pci_unmap_addr(re, mapaddr),@@ -1633,6 +1629,7 @@ static void sky2_tx_unmap(struct pci_dev pci_unmap_page(pdev, pci_unmap_addr(re, mapaddr), pci_unmap_len(re, maplen), PCI_DMA_TODEVICE); + re->flags = 0; } /*@@ -1839,6 +1836,7 @@ static void sky2_tx_complete(struct sky2 dev->stats.tx_packets++; dev->stats.tx_bytes += skb->len; + re->skb = NULL; dev_kfree_skb_any(skb); sky2->tx_next = RING_NEXT(idx, sky2->tx_ring_size);