lkml.org 
[lkml]   [2010]   [Feb]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] sky2: receive dma mapping error handling
    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.

    >
    > --- 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);


    \
     
     \ /
      Last update: 2010-02-01 21:15    [W:0.023 / U:30.240 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site