Small bugfixes, at least one of which gets rid of  some
rather random behavior from certain board init
behaviors.

Please merge.

- Dave
OHCI updates:

 - Bugfix the code taking frame clock adjustments from the boot loader.
   A recent change had a bug which caused inconsistent failures on some
   OHCI configs, including amd756.  Thanks to <[EMAIL PROTECTED]>
   for tracking down the specifics.

 - From Lothar Wassmann <[EMAIL PROTECTED]> two fixes:
     (a) don't let tick clock sign-extend, that can make unlinks
         take excessively long (could happen easily enough);
     (b) when re-activating schedules after suspend, use the right
         bitmask (rare/exotic)

 - When suspending the root hub, mark it as USB_STATE_SUSPENDED

Signed-off-by: David Brownell <[EMAIL PROTECTED]>


--- 1.29/drivers/usb/host/ohci-dbg.c	Wed Jul 14 15:24:27 2004
+++ edited/drivers/usb/host/ohci-dbg.c	Wed Sep  8 22:49:26 2004
@@ -640,14 +640,14 @@
 	rdata = ohci_readl (&regs->fminterval);
 	temp = scnprintf (next, size,
 			"fmintvl 0x%08x %sFSMPS=0x%04x FI=0x%04x\n",
-			rdata, (rdata >> 31) ? " FIT" : "",
+			rdata, (rdata >> 31) ? "FIT " : "",
 			(rdata >> 16) & 0xefff, rdata & 0xffff);
 	size -= temp;
 	next += temp;
 
 	rdata = ohci_readl (&regs->fmremaining);
 	temp = scnprintf (next, size, "fmremaining 0x%08x %sFR=0x%04x\n",
-			rdata, (rdata >> 31) ? " FRT" : "",
+			rdata, (rdata >> 31) ? "FRT " : "",
 			rdata & 0x3fff);
 	size -= temp;
 	next += temp;
--- 1.68/drivers/usb/host/ohci-hcd.c	Thu Sep  2 09:39:09 2004
+++ edited/drivers/usb/host/ohci-hcd.c	Wed Sep  8 22:49:26 2004
@@ -409,11 +409,19 @@
 
 	/* boot firmware should have set this up (5.1.1.3.1) */
 	if (!ohci->fminterval) {
+		u32	t2;
+
 		temp = ohci_readl (&ohci->regs->fminterval);
-		if (temp & 0x3fff0000)
-			ohci->fminterval = temp;
-		else
-			ohci->fminterval = DEFAULT_FMINTERVAL;
+		ohci->fminterval = temp & 0x3fff;
+		if (ohci->fminterval != FI)
+			ohci_dbg (ohci, "fminterval delta %d\n",
+				ohci->fminterval - FI);
+
+		t2 = FSMP (ohci->fminterval);
+		temp >>= 16;
+		if ((t2/2) < temp || temp > t2)
+			temp = t2;
+		ohci->fminterval |= temp << 16;
 		/* also: power/overcurrent flags in roothub.a */
 	}
 
--- 1.23/drivers/usb/host/ohci-hub.c	Sat Aug 21 16:33:45 2004
+++ edited/drivers/usb/host/ohci-hub.c	Wed Sep  8 22:49:26 2004
@@ -146,10 +146,11 @@
 	ohci->next_statechange = jiffies + msecs_to_jiffies (5);
 
 succeed:
-	/* it's not USB_STATE_SUSPENDED unless access to this
+	/* it's not HCD_STATE_SUSPENDED unless access to this
 	 * hub from the non-usb side (PCI, SOC, etc) stopped 
 	 */
 	root->dev.power.power_state = 3;
+	root->state = USB_STATE_SUSPENDED;
 done:
 	spin_unlock_irq (&ohci->lock);
 	return status;
@@ -289,7 +290,7 @@
 		ohci->hc_control |= enables;
 		writel (ohci->hc_control, &ohci->regs->control);
 		if (temp)
-			writel (status, &ohci->regs->cmdstatus);
+			writel (temp, &ohci->regs->cmdstatus);
 		(void) ohci_readl (&ohci->regs->control);
 	}
 
@@ -481,8 +482,8 @@
 /* this timer value might be vendor-specific ... */
 #define	PORT_RESET_HW_MSEC	10
 
-/* wrap-aware logic stolen from <linux/jiffies.h> */
-#define tick_before(t1,t2) ((((s16)(t1))-((s16)(t2))) < 0)
+/* wrap-aware logic morphed from <linux/jiffies.h> */
+#define tick_before(t1,t2) ((s16)(((s16)(t1))-((s16)(t2))) < 0)
 
 /* called from some task, normally khubd */
 static inline void root_port_reset (struct ohci_hcd *ohci, unsigned port)
--- 1.26/drivers/usb/host/ohci.h	Thu Sep  2 09:39:10 2004
+++ edited/drivers/usb/host/ohci.h	Wed Sep  8 22:49:26 2004
@@ -406,13 +406,14 @@
 }
 
 #define	FI			0x2edf		/* 12000 bits per frame (-1) */
-#define	DEFAULT_FMINTERVAL 	((((6 * (FI - 210)) / 7) << 16) | FI)
+#define	FSMP(fi) 		((6 * ((fi) - 210)) / 7)
 #define LSTHRESH		0x628		/* lowspeed bit threshold */
 
 static inline void periodic_reinit (struct ohci_hcd *ohci)
 {
+	u32	fi = ohci->fminterval & 0x0ffff;
 	writel (ohci->fminterval, &ohci->regs->fminterval);
-	writel (((9 * FI) / 10) & 0x3fff, &ohci->regs->periodicstart);
+	writel (((9 * fi) / 10) & 0x3fff, &ohci->regs->periodicstart);
 	writel (LSTHRESH, &ohci->regs->lsthresh);
 }
 

Reply via email to