Re: rx errors reported by usbnet

"Yum Rayan" <[email protected]>
Newsgroups gmane.linux.usb.devel
Message-ID <[email protected]>
Following is the patch that we received from our h/w vendor. It seems
to correct the issue where we are seeing the ethernet interface
accumulate RX errors while USB device is not actually used.

We have been testing this for a while and it seems to work. Comments
appreciated.

Patch is against 2.6.16

Thanks.

--- ohci-q.c.old        2007-05-31 09:18:26.569155000 -0700
+++ ohci-q.c    2007-06-19 11:08:44.678144000 -0700
@@ -872,7 +872,11 @@ static struct td *dl_reverse_done_list (
        struct td       *td_rev = NULL;
        struct td       *td = NULL;

-       td_dma = hc32_to_cpup (ohci, &ohci->hcca->done_head);
+       urb_priv_t *urbpriv;
+       int count;
+       struct urb *urb;
+
+       td_dma = hc32_to_cpup(ohci, &ohci->hcca->done_head);
        ohci->hcca->done_head = 0;
        wmb();

@@ -891,18 +895,38 @@ static struct td *dl_reverse_done_list (
                td->hwINFO |= cpu_to_hc32 (ohci, TD_DONE);
                cc = TD_CC_GET (hc32_to_cpup (ohci, &td->hwINFO));

-               /* Non-iso endpoints can halt on error; un-halt,
-                * and dequeue any other TDs from this urb.
-                * No other TD could have caused the halt.
-                */
-               if (cc != TD_CC_NOERROR
-                               && (td->ed->hwHeadP & cpu_to_hc32 (ohci, ED_H)))
-                       td_rev = ed_halted (ohci, td, cc, td_rev);
-
-               td->next_dl_td = td_rev;
-               td_rev = td;
-               td_dma = hc32_to_cpup (ohci, &td->hwNextTD);
-       }
+
+               if (cc == TD_PIDCHECKFAIL || cc == TD_DEVNOTRESP) {
+                       urbpriv = td->urb->hcpriv;
+
+                       td->ed->hwHeadP &= ~cpu_to_hc32(ohci, ED_H);
+                       td->hwINFO &= ~cpu_to_hc32(ohci, TD_CC);
+                       td->hwINFO &= ~cpu_to_hc32(ohci, TD_EC);
+                       urb = td->urb;
+                       for (count = 0; count < urbpriv->length; count++) {
+                               td = urbpriv->td[count];
+                               if (td) {
+                                       list_del(&td->td_list);
+                                       td_dma =
+                                           hc32_to_cpup(ohci, &td->hwNextTD);
+                               }
+                       }
+                       list_del(&urbpriv->pending);
+                       td_submit_urb(ohci, urb);
+               } else {
+                       /* Non-iso endpoints can halt on error; un-halt,
+                        * and dequeue any other TDs from this urb.
+                        * No other TD could have caused the halt.
+                        */
+                       if (cc != TD_CC_NOERROR &&
+                           (td->ed->hwHeadP & cpu_to_hc32(ohci, ED_H)))
+                               td_rev = ed_halted(ohci, td, cc, td_rev);
+
+                       td->next_dl_td = td_rev;
+                       td_rev = td;
+                       td_dma = hc32_to_cpup(ohci, &td->hwNextTD);
+               }
+       }
        return td_rev;
 }

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.