PERFORCE change 139361 for review

Rafal Jaworowski raj at FreeBSD.org
Fri Apr 4 18:49:45 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=139361

Change 139361 by raj at raj_mimi on 2008/04/04 18:49:09

	EHCI workarounds for Marvell 88F5XXX integrated USB controller.
	
	Obtained from:	Marvell, Semihalf

Affected files ...

.. //depot/projects/arm/src/sys/dev/usb/ehci.c#20 edit
.. //depot/projects/arm/src/sys/dev/usb/ehcivar.h#7 edit

Differences ...

==== //depot/projects/arm/src/sys/dev/usb/ehci.c#20 (text+ko) ====

@@ -338,8 +338,12 @@
 	for (i = 0; i < 100; i++) {
 		usb_delay_ms(&sc->sc_bus, 1);
 		hcr = EOREAD4(sc, EHCI_USBCMD) & EHCI_CMD_HCRESET;
-		if (!hcr)
+		if (!hcr) {
+			if (sc->sc_flags & EHCI_SCFLG_SETMODE)
+				EOWRITE4(sc,  0x68, 0x3);
+
 			return (USBD_NORMAL_COMPLETION);
+		}
 	}
 	printf("%s: reset timeout\n", device_get_nameunit(sc->sc_bus.bdev));
 	return (USBD_IOERROR);
@@ -1976,7 +1980,18 @@
 		v = EOREAD4(sc, EHCI_PORTSC(index));
 		DPRINTFN(8,("ehci_root_ctrl_start: port status=0x%04x\n",
 			    v));
+
 		i = UPS_HIGH_SPEED;
+
+		if (sc->sc_flags & EHCI_SCFLG_FORCESPEED) {
+			if ((v & 0xc000000) == 0x8000000)
+				i = UPS_HIGH_SPEED;
+			else if ((v & 0xc000000) == 0x4000000)
+				i = UPS_LOW_SPEED;
+			else
+				i = 0;
+		}
+
 		if (v & EHCI_PS_CS)	i |= UPS_CURRENT_CONNECT_STATUS;
 		if (v & EHCI_PS_PE)	i |= UPS_PORT_ENABLED;
 		if (v & EHCI_PS_SUSP)	i |= UPS_SUSPEND;
@@ -2031,7 +2046,11 @@
 				goto ret;
 			}
 			/* Terminate reset sequence. */
-			EOWRITE4(sc, port, v);
+			if (sc->sc_flags & EHCI_SCFLG_NORESTERM)
+				;
+			else
+				EOWRITE4(sc, port, v);
+
 			/* Wait for HC to complete reset. */
 			usb_delay_ms(&sc->sc_bus, EHCI_PORT_RESET_COMPLETE);
 			if (sc->sc_dying) {

==== //depot/projects/arm/src/sys/dev/usb/ehcivar.h#7 (text+ko) ====

@@ -96,6 +96,9 @@
 
 #define EHCI_SCFLG_DONEINIT	0x0001	/* ehci_init() has been called. */
 #define EHCI_SCFLG_LOSTINTRBUG	0x0002	/* workaround for VIA / ATI chipsets */
+#define EHCI_SCFLG_SETMODE	0x0004	/* set bridge mode again after init (Marvell) */
+#define EHCI_SCFLG_FORCESPEED	0x0008	/* force speed (Marvell) */
+#define EHCI_SCFLG_NORESTERM	0x0010	/* don't terminate reset sequence (Marvell) */
 
 typedef struct ehci_softc {
 	struct usbd_bus sc_bus;		/* base device */


More information about the p4-projects mailing list