From a9f46ba20de99dba4788fc06cb53f20217ad205f Mon Sep 17 00:00:00 2001 From: n_hibma Date: Mon, 23 Aug 1999 21:00:08 +0000 Subject: Reset the UHCI controller when the device comes back from suspend. This should be replaced by proper support for suspend one day (global suspend). Submitted-by: Christopher Masto --- sys/dev/usb/uhci.c | 23 +++++++++++------------ sys/dev/usb/uhci_pci.c | 39 +++++++++++++++++++++++++++++++++------ sys/dev/usb/uhcivar.h | 6 ++---- sys/pci/uhci_pci.c | 39 +++++++++++++++++++++++++++++++++------ 4 files changed, 79 insertions(+), 28 deletions(-) diff --git a/sys/dev/usb/uhci.c b/sys/dev/usb/uhci.c index 5c333b8..dfedf52 100644 --- a/sys/dev/usb/uhci.c +++ b/sys/dev/usb/uhci.c @@ -305,8 +305,7 @@ uhci_init(uhci_softc_t *sc) return(err); sc->sc_pframes = KERNADDR(&dma); - UWRITE2(sc, UHCI_FRNUM, 0); /* set frame number to 0 */ - UWRITE4(sc, UHCI_FLBASEADDR, DMAADDR(&dma)); /* set frame list address */ + sc->sc_flbase = DMAADDR(&dma); err = uhci_init_framelist(sc); if (err) { @@ -322,10 +321,7 @@ uhci_init(uhci_softc_t *sc) sc->sc_bus.do_poll = uhci_poll; DPRINTFN(1,("uhci_init: enabling\n")); - UWRITE2(sc, UHCI_INTR, UHCI_INTR_TOCRCIE | UHCI_INTR_RIE | - UHCI_INTR_IOCE | UHCI_INTR_SPIE); /* enable interrupts */ - - return(uhci_run(sc, 1)); /* and here we go... */ + return uhci_reset(sc); } usbd_status @@ -424,12 +420,10 @@ uhci_busreset(sc) UHCICMD(sc, 0); /* do nothing */ } -#if 0 -void -uhci_reset(priv) - void *priv; +usbd_status +uhci_reset(sc) + uhci_softc_t *sc; { - uhci_softc_t *sc = priv; int n; /* Reset the host controller */ @@ -442,8 +436,13 @@ uhci_reset(priv) if (n >= UHCI_RESET_TIMEOUT) printf("%s: controller did not reset\n", USBDEVNAME(sc->sc_bus.bdev)); + UWRITE2(sc, UHCI_FRNUM, 0); /* set frame number to 0 */ + UWRITE4(sc, UHCI_FLBASEADDR, sc->sc_flbase); /* set frame list address */ + UWRITE2(sc, UHCI_INTR, UHCI_INTR_TOCRCIE | UHCI_INTR_RIE | + UHCI_INTR_IOCE | UHCI_INTR_SPIE); /* enable interrupts */ + + return(uhci_run(sc, 1)); /* and here we go... */ } -#endif usbd_status uhci_run(sc, run) diff --git a/sys/dev/usb/uhci_pci.c b/sys/dev/usb/uhci_pci.c index 3183eda..83bca9b 100644 --- a/sys/dev/usb/uhci_pci.c +++ b/sys/dev/usb/uhci_pci.c @@ -1,5 +1,3 @@ -/* $FreeBSD$ */ - /* * Copyright (c) 1998 The NetBSD Foundation, Inc. * All rights reserved. @@ -35,6 +33,8 @@ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ */ /* Universal Host Controller Interface @@ -58,11 +58,12 @@ #include #include #if defined(__FreeBSD__) -#include -#endif +#include + #include -#include #include +#include +#endif #include #include @@ -90,6 +91,29 @@ static const char *uhci_device_generic = "UHCI (generic) USB controller"; #define PCI_UHCI_BASE_REG 0x20 +static int +uhci_pci_suspend(device_t self) +{ + uhci_softc_t *sc; + + sc = device_get_softc(self); + bus_generic_suspend(self); + + return 0; +} + +static int +uhci_pci_resume(device_t self) +{ + uhci_softc_t *sc; + + sc = device_get_softc(self); + uhci_reset(sc); + bus_generic_resume(self); + + return 0; +} + static const char * uhci_pci_match(device_t self) { @@ -148,7 +172,8 @@ uhci_pci_attach(device_t self) sc->iot = rman_get_bustag(res); sc->ioh = rman_get_bushandle(res); - bus_space_write_2(sc->iot, sc->ioh, UHCI_INTR, 0); /* disable interrupts */ + /* disable interrupts */ + bus_space_write_2(sc->iot, sc->ioh, UHCI_INTR, 0); rid = 0; res = bus_alloc_resource(self, SYS_RES_IRQ, &rid, 0, ~0, 1, @@ -247,6 +272,8 @@ static device_method_t uhci_methods[] = { /* Device interface */ DEVMETHOD(device_probe, uhci_pci_probe), DEVMETHOD(device_attach, uhci_pci_attach), + DEVMETHOD(device_suspend, uhci_pci_suspend), + DEVMETHOD(device_resume, uhci_pci_resume), /* Bus interface */ DEVMETHOD(bus_print_child, bus_generic_print_child), diff --git a/sys/dev/usb/uhcivar.h b/sys/dev/usb/uhcivar.h index 9af98b7..266bced 100644 --- a/sys/dev/usb/uhcivar.h +++ b/sys/dev/usb/uhcivar.h @@ -133,6 +133,7 @@ typedef struct uhci_softc { #endif uhci_physaddr_t *sc_pframes; + vm_offset_t sc_flbase; struct uhci_vframe sc_vframes[UHCI_VFRAMELIST_COUNT]; uhci_soft_qh_t *sc_ctl_start; /* dummy QH for control */ @@ -168,7 +169,4 @@ typedef struct uhci_softc { usbd_status uhci_init __P((uhci_softc_t *)); int uhci_intr __P((void *)); -#if 0 -void uhci_reset __P((void *)); -#endif - +usbd_status uhci_reset __P((uhci_softc_t *)); diff --git a/sys/pci/uhci_pci.c b/sys/pci/uhci_pci.c index 3183eda..83bca9b 100644 --- a/sys/pci/uhci_pci.c +++ b/sys/pci/uhci_pci.c @@ -1,5 +1,3 @@ -/* $FreeBSD$ */ - /* * Copyright (c) 1998 The NetBSD Foundation, Inc. * All rights reserved. @@ -35,6 +33,8 @@ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ */ /* Universal Host Controller Interface @@ -58,11 +58,12 @@ #include #include #if defined(__FreeBSD__) -#include -#endif +#include + #include -#include #include +#include +#endif #include #include @@ -90,6 +91,29 @@ static const char *uhci_device_generic = "UHCI (generic) USB controller"; #define PCI_UHCI_BASE_REG 0x20 +static int +uhci_pci_suspend(device_t self) +{ + uhci_softc_t *sc; + + sc = device_get_softc(self); + bus_generic_suspend(self); + + return 0; +} + +static int +uhci_pci_resume(device_t self) +{ + uhci_softc_t *sc; + + sc = device_get_softc(self); + uhci_reset(sc); + bus_generic_resume(self); + + return 0; +} + static const char * uhci_pci_match(device_t self) { @@ -148,7 +172,8 @@ uhci_pci_attach(device_t self) sc->iot = rman_get_bustag(res); sc->ioh = rman_get_bushandle(res); - bus_space_write_2(sc->iot, sc->ioh, UHCI_INTR, 0); /* disable interrupts */ + /* disable interrupts */ + bus_space_write_2(sc->iot, sc->ioh, UHCI_INTR, 0); rid = 0; res = bus_alloc_resource(self, SYS_RES_IRQ, &rid, 0, ~0, 1, @@ -247,6 +272,8 @@ static device_method_t uhci_methods[] = { /* Device interface */ DEVMETHOD(device_probe, uhci_pci_probe), DEVMETHOD(device_attach, uhci_pci_attach), + DEVMETHOD(device_suspend, uhci_pci_suspend), + DEVMETHOD(device_resume, uhci_pci_resume), /* Bus interface */ DEVMETHOD(bus_print_child, bus_generic_print_child), -- cgit v1.1