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, &regs->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]

Reply via email to