ehci: fix infinite loop with usb netdevice

Submitted by David S. Ahern on April 16, 2010, 3:19 a.m.

Details

Message ID 4BC7D75D.9020302@cisco.com
State New
Headers show

Commit Message

David S. Ahern April 16, 2010, 3:19 a.m.
Hi Jan:

The attached addresses the spinning with the usb net device. Now I can
enable the device and ethtool shows a link:

# ifconfig usb0 up
# ethtool usb0
Settings for usb0:
	Current message level: 0x00000007 (7)
	Link detected: yes

Though dhclient still can't get an address. After a bit of
instrumentation it appears that packets are lost in the receive the path
somewhere:

usb0      Link encap:Ethernet  HWaddr 42:5F:CA:51:54:77
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:5513 (5.3 KiB)

I looked at an x3650M2 with an IMM. It has a usb-based ethernet device.
I compared the output of lsusb -v from the IMM with the qemu usb net
device and nothing jumps out -- other than the fact that the IMM's
network device shows up on a uhci bus.

David

Comments

Jan Kiszka April 19, 2010, 9:26 p.m.
David S. Ahern wrote:
> Hi Jan:
> 
> The attached addresses the spinning with the usb net device. Now I can
> enable the device and ethtool shows a link:
> 
> # ifconfig usb0 up
> # ethtool usb0
> Settings for usb0:
> 	Current message level: 0x00000007 (7)
> 	Link detected: yes
> 
> Though dhclient still can't get an address. After a bit of
> instrumentation it appears that packets are lost in the receive the path
> somewhere:
> 
> usb0      Link encap:Ethernet  HWaddr 42:5F:CA:51:54:77
>           BROADCAST MULTICAST  MTU:1500  Metric:1
>           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
>           TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
>           collisions:0 txqueuelen:1000
>           RX bytes:0 (0.0 b)  TX bytes:5513 (5.3 KiB)
> 
> I looked at an x3650M2 with an IMM. It has a usb-based ethernet device.
> I compared the output of lsusb -v from the IMM with the qemu usb net
> device and nothing jumps out -- other than the fact that the IMM's
> network device shows up on a uhci bus.
> 

Thanks merged (a git-formatted patch would have been even better :) ).

Yeah, the behavior is as before here as well. So there was or was not
USB traffic between device and controller that points to incoming
frames? Guess we need to debug through the device if there was.

Jan

Patch hide | download patch | download mbox

diff --git a/hw/usb-ehci.c b/hw/usb-ehci.c
index f806a20..218d590 100644
--- a/hw/usb-ehci.c
+++ b/hw/usb-ehci.c
@@ -981,13 +981,15 @@  err:
             qh->token |= QTD_TOKEN_HALT;
             break;
         case USB_RET_NAK:
+            /* 4.10.3 */
             reload = get_field(qh->epchar, QH_EPCHAR_RL);
             if ((ehci->pid == USB_TOKEN_IN) && reload) {
                 int nakcnt = get_field(qh->altnext_qtd, QH_ALTNEXT_NAKCNT);
                 nakcnt--;
                 set_field(&qh->altnext_qtd, nakcnt, QH_ALTNEXT_NAKCNT);
+            } else if (!reload) {
+                return USB_RET_NAK;
             }
-            return USB_RET_NAK;
             break;
         case USB_RET_BABBLE:
             fprintf(stderr, "USB babble TODO\n");
@@ -1040,7 +1042,7 @@  err:
 
         ret += ehci->more;
 
-        if (ret > ehci->tbytes) {
+        if ((ret > ehci->tbytes) && (ehci->pid == USB_TOKEN_IN)) {
             ret = USB_RET_BABBLE;
             goto err;
         }