Dont hold the lock over the controller init, we are still attaching.

This commit is contained in:
Andrew Thompson 2009-02-07 06:27:16 +00:00
parent ea8e257984
commit 875d039fd8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=188273
3 changed files with 13 additions and 28 deletions

View File

@ -223,8 +223,6 @@ ehci_init(ehci_softc_t *sc)
uint16_t bit;
usb2_error_t err = 0;
USB_BUS_LOCK(&sc->sc_bus);
DPRINTF("start\n");
usb2_callout_init_mtx(&sc->sc_tmo_pcd, &sc->sc_bus.bus_mtx, 0);
@ -259,10 +257,12 @@ ehci_init(ehci_softc_t *sc)
/* Reset the controller */
DPRINTF("%s: resetting\n", device_get_nameunit(sc->sc_bus.bdev));
USB_BUS_LOCK(&sc->sc_bus);
err = ehci_hc_reset(sc);
USB_BUS_UNLOCK(&sc->sc_bus);
if (err) {
device_printf(sc->sc_bus.bdev, "reset timeout\n");
goto done;
return (error);
}
/*
* use current frame-list-size selection 0: 1024*4 bytes 1: 512*4
@ -270,8 +270,7 @@ ehci_init(ehci_softc_t *sc)
*/
if (EHCI_CMD_FLS(EOREAD4(sc, EHCI_USBCMD)) == 3) {
device_printf(sc->sc_bus.bdev, "invalid frame-list-size\n");
err = USB_ERR_IOERROR;
goto done;
return (USB_ERR_IOERROR);
}
/* set up the bus struct */
sc->sc_bus.methods = &ehci_bus_methods;
@ -479,7 +478,7 @@ ehci_init(ehci_softc_t *sc)
EOWRITE4(sc, EHCI_CONFIGFLAG, EHCI_CONF_CF);
for (i = 0; i < 100; i++) {
usb2_pause_mtx(&sc->sc_bus.bus_mtx, 1);
usb2_pause_mtx(NULL, 1);
hcr = EOREAD4(sc, EHCI_USBSTS) & EHCI_STS_HCH;
if (!hcr) {
break;
@ -487,11 +486,8 @@ ehci_init(ehci_softc_t *sc)
}
if (hcr) {
device_printf(sc->sc_bus.bdev, "run timeout\n");
err = USB_ERR_IOERROR;
goto done;
return (USB_ERR_IOERROR);
}
done:
USB_BUS_UNLOCK(&sc->sc_bus);
if (!err) {
/* catch any lost interrupts */

View File

@ -168,7 +168,7 @@ ohci_controller_init(ohci_softc_t *sc)
DPRINTF("SMM active, request owner change\n");
OWRITE4(sc, OHCI_COMMAND_STATUS, OHCI_OCR);
for (i = 0; (i < 100) && (ctl & OHCI_IR); i++) {
usb2_pause_mtx(&sc->sc_bus.bus_mtx, 1);
usb2_pause_mtx(NULL, 1);
ctl = OREAD4(sc, OHCI_CONTROL);
}
if (ctl & OHCI_IR) {
@ -181,8 +181,7 @@ ohci_controller_init(ohci_softc_t *sc)
DPRINTF("cold started\n");
reset:
/* controller was cold started */
usb2_pause_mtx(&sc->sc_bus.bus_mtx,
USB_BUS_RESET_DELAY);
usb2_pause_mtx(NULL, USB_BUS_RESET_DELAY);
}
/*
@ -192,8 +191,7 @@ ohci_controller_init(ohci_softc_t *sc)
DPRINTF("%s: resetting\n", device_get_nameunit(sc->sc_bus.bdev));
OWRITE4(sc, OHCI_CONTROL, OHCI_HCFS_RESET);
usb2_pause_mtx(&sc->sc_bus.bus_mtx,
USB_BUS_RESET_DELAY);
usb2_pause_mtx(NULL, USB_BUS_RESET_DELAY);
/* we now own the host controller and the bus has been reset */
ival = OHCI_GET_IVAL(OREAD4(sc, OHCI_FM_INTERVAL));
@ -255,8 +253,7 @@ ohci_controller_init(ohci_softc_t *sc)
desca = OREAD4(sc, OHCI_RH_DESCRIPTOR_A);
OWRITE4(sc, OHCI_RH_DESCRIPTOR_A, desca | OHCI_NOCP);
OWRITE4(sc, OHCI_RH_STATUS, OHCI_LPSC); /* Enable port power */
usb2_pause_mtx(&sc->sc_bus.bus_mtx,
OHCI_ENABLE_POWER_DELAY);
usb2_pause_mtx(NULL, OHCI_ENABLE_POWER_DELAY);
OWRITE4(sc, OHCI_RH_DESCRIPTOR_A, desca);
/*
@ -265,8 +262,7 @@ ohci_controller_init(ohci_softc_t *sc)
*/
sc->sc_noport = 0;
for (i = 0; (i < 10) && (sc->sc_noport == 0); i++) {
usb2_pause_mtx(&sc->sc_bus.bus_mtx,
OHCI_READ_DESC_DELAY);
usb2_pause_mtx(NULL, OHCI_READ_DESC_DELAY);
sc->sc_noport = OHCI_GET_NDP(OREAD4(sc, OHCI_RH_DESCRIPTOR_A));
}
@ -304,8 +300,6 @@ ohci_init(ohci_softc_t *sc)
uint16_t x;
uint16_t y;
USB_BUS_LOCK(&sc->sc_bus);
DPRINTF("start\n");
sc->sc_eintrs = OHCI_NORMAL_INTRS;
@ -402,10 +396,8 @@ ohci_init(ohci_softc_t *sc)
sc->sc_bus.usbrev = USB_REV_1_0;
if (ohci_controller_init(sc)) {
USB_BUS_UNLOCK(&sc->sc_bus);
return (USB_ERR_INVAL);
} else {
USB_BUS_UNLOCK(&sc->sc_bus);
/* catch any lost interrupts */
ohci_do_poll(&sc->sc_bus);
return (USB_ERR_NORMAL_COMPLETION);
@ -473,8 +465,6 @@ ohci_resume(ohci_softc_t *sc)
{
uint32_t ctl;
USB_BUS_LOCK(&sc->sc_bus);
#if USB_DEBUG
DPRINTF("\n");
if (ohcidebug > 2) {
@ -484,6 +474,7 @@ ohci_resume(ohci_softc_t *sc)
/* some broken BIOSes never initialize the Controller chip */
ohci_controller_init(sc);
USB_BUS_LOCK(&sc->sc_bus);
if (sc->sc_intre) {
OWRITE4(sc, OHCI_INTERRUPT_ENABLE,
sc->sc_intre & (OHCI_ALL_INTRS | OHCI_MIE));

View File

@ -406,8 +406,6 @@ uhci_init(uhci_softc_t *sc)
uint16_t x;
uint16_t y;
USB_BUS_LOCK(&sc->sc_bus);
DPRINTF("start\n");
#if USB_DEBUG
@ -597,12 +595,12 @@ uhci_init(uhci_softc_t *sc)
/* set up the bus struct */
sc->sc_bus.methods = &uhci_bus_methods;
USB_BUS_LOCK(&sc->sc_bus);
/* reset the controller */
uhci_reset(sc);
/* start the controller */
uhci_start(sc);
USB_BUS_UNLOCK(&sc->sc_bus);
/* catch lost interrupts */