Michael Elkins wrote:
> 
> On Thu, Nov 23, 2000 at 05:49:52PM +0100, Georg Acher wrote:
> > On Thu, Nov 23, 2000 at 04:35:33PM +0000, Rui Sousa wrote:
> > > On Thu, 23 Nov 2000, Michael Elkins wrote:
> > >
> > > Usb controller is sharing a interrupt with the emu10k1.
> > > For what I know the emu10k1 driver doesn't have any problem
> > > sharing irq's, so I would blame the usb driver...
> >
> > usb-uhci doesn't also have any problem with sharing irqs:
> >
> > > cat /proc/interrupts
> >  10:    5597981          XT-PIC  aic7xxx, eth0, usb-uhci
> >
> > Hm, no one left to blame...
> > I would debug it as follows:
> > Place various printks in the initialization code (reset_hc(), start_hc() and
> > alloc_uhci) and find out after which printk it hangs. Then it would be
> > possible to investigate this further...
> 
> It hangs in start_uhci():
> 
>                 /* disable legacy emulation */
>                 pci_write_config_word (dev, USBLEGSUP, USBLEGSUP_DEFAULT);
> 
> The loop that the call is in gets iterated 5 times.  For i < 4, the
>                 if (!(dev->resource[i].flags & 1))
> is TRUE, but on i==4, it drops into the bottom of the loop to execute
> check_region() and then pci_write_config_word(), where it hangs.

It may not make a difference, but that check is flat out wrong.

Apply this patch...  (untested, you may need to include ioport.h)

-- 
Jeff Garzik             |
Building 1024           | The chief enemy of creativity is "good" sense
MandrakeSoft            |          -- Picasso
Index: drivers/usb/usb-uhci.c
===================================================================
RCS file: /cvsroot/gkernel/linux_2_4/drivers/usb/usb-uhci.c,v
retrieving revision 1.1.1.9
diff -u -r1.1.1.9 usb-uhci.c
--- drivers/usb/usb-uhci.c      2000/10/22 23:25:12     1.1.1.9
+++ drivers/usb/usb-uhci.c      2000/11/23 23:04:37
@@ -2886,7 +2886,7 @@
                unsigned int io_addr = dev->resource[i].start;
                unsigned int io_size =
                dev->resource[i].end - dev->resource[i].start + 1;
-               if (!(dev->resource[i].flags & 1))
+               if (!(dev->resource[i].flags & IORESOURCE_IO))
                        continue;
 
                /* Is it already in use? */

Reply via email to