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