On Wed July 8 2009, Michael S. Zick wrote: > On Wed July 8 2009, Michael S. Zick wrote: > > On Tue July 7 2009, Alan Stern wrote: > > > On Tue, 7 Jul 2009, Michael S. Zick wrote: > > > > > > > On Tue July 7 2009, Alan Stern wrote: > > > > > On Tue, 7 Jul 2009, Michael S. Zick wrote: > > > > > > > > > > > > It looks like there's a serious problem in your UHCI hardware. > > > > > > > According to the log you posted, it's not working at all. > > > > > > > > > > > > > > > > > > > I am using the x86-generic drivers - - > > > > > > > > > > Not a problem with the drivers, a problem in the hardware. > > > > > > > > > > > > > Or hardware that works as the manufacturer intended, but differently > > > > than expected. Same difference as "broken" when compared to "standard". > > > > > > No, hardware that doesn't work at all. As in "all reads return > > > 0xffffffff" -- that's just a guess but something like it would account > > > for what you saw. > > > I tried to combine the addition of the diagnostic print (BUG()) statements and the potential fix - - This is what I put into the code for today's testing: diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index be86ae3..d686f1d 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -160,8 +160,10 @@ static inline char *portspeed(int portstatus) } /* Note that hdev or one of its children must be locked! */ -static inline struct usb_hub *hdev_to_hub(struct usb_device *hdev) +static struct usb_hub *hdev_to_hub(struct usb_device *hdev) { + if (!hdev || !hdev->actconfig) + return NULL; return usb_get_intfdata(hdev->actconfig->interface[0]); } @@ -369,11 +371,16 @@ static void kick_khubd(struct usb_hub *hub) { unsigned long flags; - /* Suppress autosuspend until khubd runs */ - to_usb_interface(hub->intfdev)->pm_usage_cnt = 1; + if (!hub) { + BUG(); + return; + } spin_lock_irqsave(&hub_event_lock, flags); if (!hub->disconnected && list_empty(&hub->event_list)) { + /* Suppress autosuspend until khubd runs */ + to_usb_interface(hub->intfdev)->pm_usage_cnt = 1; + list_add_tail(&hub->event_list, &hub_event_list); wake_up(&khubd_wait); } @@ -382,8 +389,19 @@ static void kick_khubd(struct usb_hub *hub) void usb_kick_khubd(struct usb_device *hdev) { - /* FIXME: What if hdev isn't bound to the hub driver? */ - kick_khubd(hdev_to_hub(hdev)); + struct usb_hub *hub; + + if (!hdev) { + BUG(); + return; + } + hub = hdev_to_hub(hdev); + if (hub) { + kick_khubd(hub); + } else { + BUG(); + return; + } } Mike -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html