On Wed, May 01, Johannes Erdfelt wrote:
> On Wed, May 01, 2002, Olaf Hering <[EMAIL PROTECTED]> wrote:
> > Here is a patch to let it work with 2.4.19-pre7. fsbr should not be NULL
> > and there is some gap needed in struct uhci, more than 4 bytes. If I
> > move *foo2 down it does not work, leaving it like that and it works
> > again:
> >
> > diff -urNX exclude linux-2.4.19-pre7-ide.orig/drivers/usb/uhci.c
>linux-2.4.19-pre7-ide/drivers/usb/uhci.c
> > --- linux-2.4.19-pre7-ide.orig/drivers/usb/uhci.c Wed May 1 11:59:40 2002
> > +++ linux-2.4.19-pre7-ide/drivers/usb/uhci.c Wed May 1 14:55:32 2002
> > @@ -2475,6 +2475,7 @@
> > }
> > spin_unlock(&uhci->urb_list_lock);
> >
> > + err("io_addr %u foo1 %p foo2 %p", uhci->io_addr, uhci->foo1, uhci->foo2);
> > uhci_finish_completion(uhci);
> > }
> >
> > @@ -2733,7 +2734,12 @@
> > /* or broken setup */
> > reset_hc(uhci);
> >
> > + info("XXX uhci->fsbr %d ioaddr %u uhci: %p foo1: %p fsbr: %p", uhci->fsbr
>, uhci->io_addr, uhci, &uhci->foo1, &uhci->fsbr);
> > + uhci->foo1 = NULL;
> > + uhci->foo2 = NULL;
> > +#if 0
> > uhci->fsbr = 0;
> > +#endif
> > uhci->fsbrtimeout = 0;
> >
> > uhci->is_suspended = 0;
> > diff -urNX exclude linux-2.4.19-pre7-ide.orig/drivers/usb/uhci.h
>linux-2.4.19-pre7-ide/drivers/usb/uhci.h
> > --- linux-2.4.19-pre7-ide.orig/drivers/usb/uhci.h Wed May 1 11:59:40 2002
> > +++ linux-2.4.19-pre7-ide/drivers/usb/uhci.h Wed May 1 15:00:11 2002
> > @@ -308,6 +309,8 @@
> >
> > spinlock_t frame_list_lock;
> > struct uhci_frame_list *fl; /* P: uhci->frame_list_lock */
> > + char *foo1;
> > + char *foo2;
> > int fsbr; /* Full speed bandwidth
>reclamation */
> > unsigned long fsbrtimeout; /* FSBR delay */
> > int is_suspended;
> >
> >
> > This is the dmesg output with the nonworking version (*foo2 moved down):
> > linux:~ # dmesg | grep XXX
> > uhci.c: XXX uhci->fsbr 134605280 ioaddr 6208 uhci: cf933ca0 foo1: cf933d04 fsbr:
>cf933d08
> > uhci.c: XXX uhci->fsbr 0 ioaddr 6240 uhci: cf933da0 foo1: cf933e04 fsbr: cf933e08
> > uhci.c: XXX uhci->fsbr 0 ioaddr 6272 uhci: cf933ba0 foo1: cf933c04 fsbr: cf933c08
>
> Could you tell me exactly how this version differs from -pre7?
Al still working version of pre7 would look like that:
diff -urNX exclude linux-2.4.19-pre7-ide.orig/drivers/usb/uhci.c
linux-2.4.19-pre7-ide/drivers/usb/uhci.c
--- linux-2.4.19-pre7-ide.orig/drivers/usb/uhci.c Wed May 1 11:59:40 2002
+++ linux-2.4.19-pre7-ide/drivers/usb/uhci.c Wed May 1 16:26:34 2002
@@ -2733,7 +2733,9 @@
/* or broken setup */
reset_hc(uhci);
+#if 0
uhci->fsbr = 0;
+#endif
uhci->fsbrtimeout = 0;
uhci->is_suspended = 0;
diff -urNX exclude linux-2.4.19-pre7-ide.orig/drivers/usb/uhci.h
linux-2.4.19-pre7-ide/drivers/usb/uhci.h
--- linux-2.4.19-pre7-ide.orig/drivers/usb/uhci.h Wed May 1 11:59:40 2002
+++ linux-2.4.19-pre7-ide/drivers/usb/uhci.h Wed May 1 16:06:19 2002
@@ -308,6 +308,8 @@
spinlock_t frame_list_lock;
struct uhci_frame_list *fl; /* P: uhci->frame_list_lock */
+ char *foo1;
+ char *foo2;
int fsbr; /* Full speed bandwidth reclamation */
unsigned long fsbrtimeout; /* FSBR delay */
int is_suspended;
And a not working version would look like that:
diff -urNX exclude linux-2.4.19-pre7-ide.orig/drivers/usb/uhci.c
linux-2.4.19-pre7-ide/drivers/usb/uhci.c
--- linux-2.4.19-pre7-ide.orig/drivers/usb/uhci.c Wed May 1 11:59:40 2002
+++ linux-2.4.19-pre7-ide/drivers/usb/uhci.c Wed May 1 16:26:34 2002
@@ -2733,7 +2733,9 @@
/* or broken setup */
reset_hc(uhci);
+#if 0
uhci->fsbr = 0;
+#endif
uhci->fsbrtimeout = 0;
uhci->is_suspended = 0;
diff -urNX exclude linux-2.4.19-pre7-ide.orig/drivers/usb/uhci.h
linux-2.4.19-pre7-ide/drivers/usb/uhci.h
--- linux-2.4.19-pre7-ide.orig/drivers/usb/uhci.h Wed May 1 11:59:40 2002
+++ linux-2.4.19-pre7-ide/drivers/usb/uhci.h Wed May 1 18:35:27 2002
@@ -308,7 +308,9 @@
spinlock_t frame_list_lock;
struct uhci_frame_list *fl; /* P: uhci->frame_list_lock */
+ char *foo1;
int fsbr; /* Full speed bandwidth reclamation */
+ char *foo2;
unsigned long fsbrtimeout; /* FSBR delay */
int is_suspended;
> > And this is the working version:
> > linux:~ # dmesg | grep XXX
> > uhci.c: XXX uhci->fsbr 134605280 ioaddr 6208 uhci: cf933ba0 foo1: cf933c04 fsbr:
>cf933c0c
> > uhci.c: XXX uhci->fsbr 1095585103 ioaddr 6240 uhci: cf933da0 foo1: cf933e04 fsbr:
>cf933e0c
> > uhci.c: XXX uhci->fsbr 539767613 ioaddr 6272 uhci: cf9337a0 foo1: cf933804 fsbr:
>cf93380c
> >
> >
> > So, something does touch fsbr. memcorruption somewhere?
>
> Well, fsbr needs to start at 0. If we don't initialize it, it'll be a
> random value. If it's random, we'll never end up turning on FSBR and
> things will work very slowly.
I do not say thats a correct fix, but it does work for me.
I just found that pre7 + the hack works better when CONFIG_USB_BANDWIDTH
is set, but I have to test more now.
Gruss Olaf
--
$ man clone
BUGS
Main feature not yet implemented...