RE: [linux-usb-devel] 2.6.17 hangs during boot on ASUS M2NPV-VM motherboard

From: Andy Chittenden
Date: Mon Jul 17 2006 - 06:42:28 EST


> On Fri, 14 Jul 2006 14:50:16 -0400 (EDT)
> Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote:
>
> > On Fri, 14 Jul 2006, Andrew Morton wrote:
> >
> > > On Fri, 14 Jul 2006 16:54:25 +0100
> > > "Andy Chittenden" <AChittenden@xxxxxxxxxxx> wrote:
> >
> > > > > So I guess there's something awry with the USB
> controller driver?
> > > > >
> > > >
> > > > Is there any other info that someone wants to track
> this down? Or has
> > > > someone got a fix?
> >
> > It's hard to come up with a fix without knowing what's
> wrong. The current
> > development version of that subroutine is essentially the
> same as the
> > version in 2.6.17.
> >
> > If you want to pin down the problem more precisely, try
> adding a whole
> > bunch of printk() statements to the
> quirk_usb_handoff_ohci() function in
> > drivers/usb/host/pci-quirks.c.
> >
>
> Andy, please add the below, work out what line it gets stuck
> at and then
> let us know? Thanks.

Well I did that and the kernel got a lot further! It ran through the
pci_init stuff without a hitch and then hung just after this line was
output:

ohci_hcd: 2005 April 22 USB 1.1 'Open' Host Controller (OHCI) Driver
(PCI)

So I littered drivers/usb/host/ohci-pci.c with similar debugging and the
last line it printed was from (marked with --->):

static int __init ohci_hcd_pci_init (void)
{
int ret;
printk (KERN_DEBUG "%s: " DRIVER_INFO " (PCI)\n", hcd_name);
if (usb_disabled())
return -ENODEV;

D();

pr_debug ("%s: block sizes: ed %Zd td %Zd\n", hcd_name,
sizeof (struct ed), sizeof (struct td));
---> D();

ret = pci_register_driver (&ohci_pci_driver);
D();
return ret;

}

IE it never returned from pci_register_driver.

A bit more sprinkling of debugging showed it got to drivers/base/bus.c
(bus_add_driver()):

D();

driver_attach(drv);
D();

It never returned from driver_attach().

More debugging in drivers/base/dd.c showed the last output to be (marked
with --->):

static int __driver_attach(struct device * dev, void * data)
{
struct device_driver * drv = data;

/*
* Lock device and try to bind to it. We drop the error
* here and always return 0, because we need to keep trying
* to bind to devices and some drivers will return an error
* simply if it didn't support the device.
*
* driver_probe_device() will spit a warning if there
* is an error.
*/

---> D();

if (dev->parent) /* Needed for USB */
down(&dev->parent->sem);
D();

IE it never returned from down.

So why did putting in the initial lot of debug alter where the kernel
hung? And what's next?

NB a reminder: 2.6.16 boots up fine on this machine.

--
Andy, BlueArc Engineering
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/