To follow up on my observations from tonight. There still are some
problems in the
2.3.99pre3 that is in the linuxcare.com linux-pmac-devel rsync but in
general the
previous show stopper usb kernel fault is gone with the two new patches.
I do see
two error messages appear during the boot process right after init
starts up...
usb-control/bulk_msg:timeout
and
hub.c: get_probe_status failed
This error doesn't effect the keyboard but I have been unable to boot
all the way in
cleanly to test the devices attached to my G4/450's Entegra 4-port
powered USB
hub. Is anyone on Intel seeing ohci hub related problems in 2.3.99pre3.
I would note
that we also have the following patches in linux-pmac-devel's tree...
diff -uNr newlinux/drivers/usb/usb-ohci.c
newlinux.new/drivers/usb/usb-ohci.c
--- newlinux/drivers/usb/usb-ohci.c Tue Mar 21 00:04:21 2000
+++ newlinux.new/drivers/usb/usb-ohci.c Wed Mar 22 21:52:45 2000
@@ -262,8 +262,14 @@
urb_print (urb, "SUB", usb_pipein (pipe));
#endif
+ /* a request to the virtual root hub */
if (usb_pipedevice (pipe) == ohci->rh.devnum)
- return rh_submit_urb (urb); /* a request to the virtual root hub */
+ return rh_submit_urb (urb);
+
+ /* when controller's hung, permit only hub cleanup attempts
+ * such as powering down ports */
+ if (ohci->disabled)
+ return -ESHUTDOWN;
/* every endpoint has a ed, locate and fill it */
if (!(ed = ep_add_ed (urb->dev, pipe, urb->interval, 1))) {
@@ -1222,13 +1228,17 @@
urb_t * urb = (urb_t *) ptr;
ohci_t * ohci = urb->dev->bus->hcpriv;
+
+ if (ohci->disabled)
+ return;
+
if(ohci->rh.send) {
len = rh_send_irq (ohci, urb->transfer_buffer,
urb->transfer_buffer_length);
if (len > 0) {
urb->actual_length = len;
#ifdef DEBUG
- urb_print (urb, "RET(rh)", usb_pipeout (urb->pipe));
+ urb_print (urb, "RET-t(rh)", usb_pipeout
(urb->pipe));
#endif
if (urb->complete) urb->complete (urb);
}
@@ -1472,6 +1482,7 @@
}
udelay (1);
}
+ ohci->disabled = 0;
}
/*-------------------------------------------------------------------------*/
@@ -1502,7 +1513,7 @@
writel (0x628, &ohci->regs->lsthresh);
/* Choose the interrupts we care about now, others later on demand */
- mask = OHCI_INTR_MIE | OHCI_INTR_WDH | OHCI_INTR_SO;
+ mask = OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_WDH |
OHCI_INTR_SO;
writel (ohci->hc_control = 0xBF, &ohci->regs->control); /* USB
Operational */
writel (mask, &ohci->regs->intrenable);
@@ -1549,6 +1560,12 @@
}
dbg("Interrupt: %x frame: %x", ints, le16_to_cpu
(ohci->hcca.frame_no));+
+ if (ints & OHCI_INTR_UE) {
+ ohci->disabled++;
+ err ("OHCI Unrecoverable Error, controller disabled");
+ }
+
if (ints & OHCI_INTR_WDH) {
writel (OHCI_INTR_WDH, ®s->intrdisable);
diff -uNr newlinux/drivers/usb/usb-ohci.h
newlinux.new/drivers/usb/usb-ohci.h
--- newlinux/drivers/usb/usb-ohci.h Fri Jan 28 22:20:07 2000
+++ newlinux.new/drivers/usb/usb-ohci.h Wed Mar 22 21:52:51 2000
@@ -350,8 +350,10 @@
struct ohci_hcca hcca; /* hcca */
int irq;
- struct ohci_regs * regs; /* OHCI controller's memory */
- struct list_head ohci_hcd_list; /* list of all ohci_hcd */
+ int disabled; /* e.g. got a UE, we're hung */
+
+ struct ohci_regs * regs; /* OHCI controller's memory */
+ struct list_head ohci_hcd_list; /* list of all ohci_hcd */
struct ohci * next; // chain of uhci device contexts
struct list_head urb_list; // list of all pending urbs
...in case those make any difference.
Jack Howarth
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]