Re: [patch] usb ohci suspend/resume v2

2003-09-09 Thread Mark Sergeant
When compiling 

/usr/src/sys/dev/usb/ohci.c: In function `ohci_resume':
/usr/src/sys/dev/usb/ohci.c:1035: warning: unused variable `hcr'
/usr/src/sys/dev/usb/ohci.c:1035: warning: unused variable `desca'
/usr/src/sys/dev/usb/ohci.c: In function `ohci_suspend':
/usr/src/sys/dev/usb/ohci.c:1125: warning: unused variable `i'



On Tue, 2003-09-09 at 17:18, Anish Mistry wrote:
> On Monday 08 September 2003 02:39 am, you wrote:
> > I've tried this patch but was unable to compile my kernel against it
> > with any of the sources from the past couple of weeks, it does apply
> > cleanly though.
> >
> > Cheers,
> >
> > Mark
> >
> Updated patch at (same as attached):
> http://am-productions.biz/docs/usb-3.patch
> 
> This still causes the same problem as setting hw.acpi.sleep_delay on my laptop
> which cause a reset.  I can't seem to figure out what in this patch that is
> causing that same behavior, but I've yet to see anyone with that same
> problem, so I'm going to assume that this should work for everyone else :(.
> Please if you are a usb guru, I could use some help, I've looked at the spec
> and some of the usb code, but am stuck for now.
> If you try it, let me know your outcome so I can then clean up the patch so
> that someone can commit it.
> 
> Anish Mistry
-- 
Mark Sergeant <[EMAIL PROTECTED]>
SNSOnline Technical Services
___
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "[EMAIL PROTECTED]"


Re: [patch] usb ohci suspend/resume v2

2003-09-09 Thread Mark Sergeant
I've cvsup'ed applied this patch and am now compiling world and kernel,
should have an update in a few hours.

Cheers,

Mark

On Tue, 2003-09-09 at 17:18, Anish Mistry wrote:
> On Monday 08 September 2003 02:39 am, you wrote:
> > I've tried this patch but was unable to compile my kernel against it
> > with any of the sources from the past couple of weeks, it does apply
> > cleanly though.
> >
> > Cheers,
> >
> > Mark
> >
> Updated patch at (same as attached):
> http://am-productions.biz/docs/usb-3.patch
> 
> This still causes the same problem as setting hw.acpi.sleep_delay on my laptop
> which cause a reset.  I can't seem to figure out what in this patch that is
> causing that same behavior, but I've yet to see anyone with that same
> problem, so I'm going to assume that this should work for everyone else :(.
> Please if you are a usb guru, I could use some help, I've looked at the spec
> and some of the usb code, but am stuck for now.
> If you try it, let me know your outcome so I can then clean up the patch so
> that someone can commit it.
> 
> Anish Mistry
-- 
Mark Sergeant <[EMAIL PROTECTED]>
SNSOnline Technical Services
___
[EMAIL PROTECTED] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "[EMAIL PROTECTED]"


[patch] usb ohci suspend/resume v2

2003-09-09 Thread Anish Mistry
On Monday 08 September 2003 02:39 am, you wrote:
> I've tried this patch but was unable to compile my kernel against it
> with any of the sources from the past couple of weeks, it does apply
> cleanly though.
>
> Cheers,
>
> Mark
>
Updated patch at (same as attached):
http://am-productions.biz/docs/usb-3.patch

This still causes the same problem as setting hw.acpi.sleep_delay on my laptop
which cause a reset.  I can't seem to figure out what in this patch that is
causing that same behavior, but I've yet to see anyone with that same
problem, so I'm going to assume that this should work for everyone else :(.
Please if you are a usb guru, I could use some help, I've looked at the spec
and some of the usb code, but am stuck for now.
If you try it, let me know your outcome so I can then clean up the patch so
that someone can commit it.

Anish Mistry
diff -u usb.orig/ohci.c usb/ohci.c
--- usb.orig/ohci.c	Tue Sep  9 02:56:49 2003
+++ usb/ohci.c	Tue Sep  9 03:05:42 2003
@@ -1020,7 +1020,7 @@
 	DPRINTF(("ohci_shutdown: stopping the HC\n"));
 	OWRITE4(sc, OHCI_CONTROL, OHCI_HCFS_RESET);
 }
-
+#endif
 /*
  * Handle suspend/resume.
  *
@@ -1028,6 +1028,141 @@
  * called from an intterupt context.  This is all right since we
  * are almost suspended anyway.
  */
+usbd_status
+ohci_resume(struct ohci_softc *sc)
+{
+	int s;
+	u_int32_t ctl, ival, hcr, fm, per, rev, desca;
+		
+	DPRINTF(("ohci_resume: start\n"));
+#if defined(__OpenBSD__)
+	printf(",");
+#else
+	printf("%s:", USBDEVNAME(sc->sc_bus.bdev));
+#endif
+	rev = OREAD4(sc, OHCI_REVISION);
+	printf(" OHCI version %d.%d%s\n", OHCI_REV_HI(rev), OHCI_REV_LO(rev),
+	   OHCI_REV_LEGACY(rev) ? ", legacy support" : "");
+	printf("ohci_resume: controller state: ");
+	switch(OREAD4(sc, OHCI_CONTROL) & OHCI_HCFS_MASK) {
+		case OHCI_HCFS_SUSPEND:
+			printf("SUSPEND");
+			break;
+		case OHCI_HCFS_RESUME:
+printf("RESUME");
+break;
+		case OHCI_HCFS_RESET:
+printf("RESET");
+break;
+		case OHCI_HCFS_OPERATIONAL:
+printf("OPERATIONAL");
+break;
+	}
+	printf("\n");
+	s = splhardusb();
+	/* The controller only responds to resume or reset writes at this point, so lets resume */
+	/* We are only supposed to enter resume state from a suspend state.  Should we check? */
+	OWRITE4(sc, OHCI_CONTROL, OHCI_HCFS_RESUME);
+	usb_delay_ms(&sc->sc_bus, USB_RESUME_DELAY);	
+	/* check if the controller has resumed */
+ctl = OREAD4(sc, OHCI_CONTROL);
+if((ctl & OHCI_HCFS_RESUME) == OHCI_HCFS_RESUME) {
+printf("ohci_resume: Controller resumed.\n");
+} else {
+/* panic or abort? */
+printf("ohci_resume: ??? Controller not resumeded!\n");
+printf("ohci_resume: OHCI_CONTROL: 0x%x\n",ctl);
+}
+
+#ifdef USB_DEBUG
+ohci_dumpregs(sc);
+#endif
+
+	/* reset or controller may not start */
+	OWRITE4(sc, OHCI_CONTROL, OHCI_HCFS_RESET);
+	usb_delay_ms(&sc->sc_bus, USB_BUS_RESET_DELAY);
+
+/* spec says save frame interrupt value, reset, then restore */
+ival = OHCI_GET_IVAL(OREAD4(sc, OHCI_FM_INTERVAL));
+OWRITE4(sc, OHCI_COMMAND_STATUS, OHCI_HCR); /* Reset HC */
+usb_delay_ms(&sc->sc_bus, USB_BUS_RESET_DELAY);
+/*	OWRITE4(sc, OHCI_FM_INTERVAL, ival);*/
+
+ 	/* Some broken BIOSes do not recover these values */
+	OWRITE4(sc, OHCI_HCCA, DMAADDR(&sc->sc_hccadma, 0));
+	OWRITE4(sc, OHCI_CONTROL_HEAD_ED, sc->sc_ctrl_head->physaddr);
+	OWRITE4(sc, OHCI_BULK_HEAD_ED, sc->sc_bulk_head->physaddr);
+	/* disable all interrupts and then switch on all desired interrupts */
+	OWRITE4(sc, OHCI_INTERRUPT_DISABLE, OHCI_ALL_INTRS);
+	OWRITE4(sc, OHCI_INTERRUPT_ENABLE, sc->sc_intre | OHCI_MIE );
+
+	fm = (OREAD4(sc, OHCI_FM_INTERVAL) & OHCI_FIT) ^ OHCI_FIT;
+	fm |= OHCI_FSMPS(ival) | ival;
+	OWRITE4(sc, OHCI_FM_INTERVAL, fm);
+	per = OHCI_PERIODIC(ival);
+	OWRITE4(sc, OHCI_PERIODIC_START, per);
+	printf("ohci_resume: fm=0x%x per=0x%x\n",fm,per);
+
+	/* start controller */
+ctl = sc->sc_control;
+OWRITE4(sc, OHCI_CONTROL, ctl);
+usb_delay_ms(&sc->sc_bus, USB_RESUME_RECOVERY);
+
+	/* power up ports */
+	OWRITE4(sc, OHCI_RH_STATUS, OHCI_LPSC);
+	usb_delay_ms(&sc->sc_bus, OHCI_ENABLE_POWER_DELAY);
+	splx(s);
+#ifdef USB_DEBUG
+ohci_dumpregs(sc);
+#endif
+	
+	return (USBD_NORMAL_COMPLETION);
+}
+
+usbd_status
+ohci_suspend(struct ohci_softc *sc)
+{
+	u_int32_t ctl,i;
+	int s;
+
+#ifdef USB_DEBUG
+ohci_dumpregs(sc);
+#endif
+	/*
+ * Preserve register values, in case that APM BIOS
+ * does not recover them.
+ */
+sc->sc_control = OREAD4(sc, OHCI_CONTROL);
+sc->sc_intre = OREAD4(sc, OHCI_INTERRUPT_ENABLE);
+/*	sc->sc_port1 = OREAD4(sc, OHCI_RH_PORT_STATUS(1));
+	sc->sc_port2 = OREAD4(sc, OHCI_RH_PORT_STATUS(2));*/
+	s = splhardusb();
+	/* disable interrupts */
+	OWRITE4(sc, OH