xhci_pci.c (227849) | xhci_pci.c (228483) |
---|---|
1/*- 2 * Copyright (c) 2010 Hans Petter Selasky. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. --- 10 unchanged lines hidden (view full) --- 19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23 * SUCH DAMAGE. 24 */ 25 26#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2010 Hans Petter Selasky. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. --- 10 unchanged lines hidden (view full) --- 19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23 * SUCH DAMAGE. 24 */ 25 26#include <sys/cdefs.h> |
27__FBSDID("$FreeBSD: head/sys/dev/usb/controller/xhci_pci.c 227849 2011-11-22 21:56:55Z hselasky $"); | 27__FBSDID("$FreeBSD: head/sys/dev/usb/controller/xhci_pci.c 228483 2011-12-14 00:28:54Z hselasky $"); |
28 29#include <sys/stdint.h> 30#include <sys/stddef.h> 31#include <sys/param.h> 32#include <sys/queue.h> 33#include <sys/types.h> 34#include <sys/systm.h> 35#include <sys/kernel.h> --- 17 unchanged lines hidden (view full) --- 53#include <dev/usb/usb_process.h> 54#include <dev/usb/usb_util.h> 55 56#include <dev/usb/usb_controller.h> 57#include <dev/usb/usb_bus.h> 58#include <dev/usb/usb_pci.h> 59#include <dev/usb/controller/xhci.h> 60#include <dev/usb/controller/xhcireg.h> | 28 29#include <sys/stdint.h> 30#include <sys/stddef.h> 31#include <sys/param.h> 32#include <sys/queue.h> 33#include <sys/types.h> 34#include <sys/systm.h> 35#include <sys/kernel.h> --- 17 unchanged lines hidden (view full) --- 53#include <dev/usb/usb_process.h> 54#include <dev/usb/usb_util.h> 55 56#include <dev/usb/usb_controller.h> 57#include <dev/usb/usb_bus.h> 58#include <dev/usb/usb_pci.h> 59#include <dev/usb/controller/xhci.h> 60#include <dev/usb/controller/xhcireg.h> |
61#include "usb_if.h" |
|
61 62static device_probe_t xhci_pci_probe; 63static device_attach_t xhci_pci_attach; 64static device_detach_t xhci_pci_detach; | 62 63static device_probe_t xhci_pci_probe; 64static device_attach_t xhci_pci_attach; 65static device_detach_t xhci_pci_detach; |
65static device_suspend_t xhci_pci_suspend; 66static device_resume_t xhci_pci_resume; 67static device_shutdown_t xhci_pci_shutdown; 68static void xhci_pci_takecontroller(device_t); | 66static usb_take_controller_t xhci_pci_take_controller; |
69 70static device_method_t xhci_device_methods[] = { 71 /* device interface */ 72 DEVMETHOD(device_probe, xhci_pci_probe), 73 DEVMETHOD(device_attach, xhci_pci_attach), 74 DEVMETHOD(device_detach, xhci_pci_detach), | 67 68static device_method_t xhci_device_methods[] = { 69 /* device interface */ 70 DEVMETHOD(device_probe, xhci_pci_probe), 71 DEVMETHOD(device_attach, xhci_pci_attach), 72 DEVMETHOD(device_detach, xhci_pci_detach), |
75 DEVMETHOD(device_suspend, xhci_pci_suspend), 76 DEVMETHOD(device_resume, xhci_pci_resume), 77 DEVMETHOD(device_shutdown, xhci_pci_shutdown), | 73 DEVMETHOD(device_suspend, bus_generic_suspend), 74 DEVMETHOD(device_resume, bus_generic_resume), 75 DEVMETHOD(device_shutdown, bus_generic_shutdown), 76 DEVMETHOD(usb_take_controller, xhci_pci_take_controller), |
78 79 DEVMETHOD_END 80}; 81 82static driver_t xhci_driver = { 83 .name = "xhci", 84 .methods = xhci_device_methods, 85 .size = sizeof(struct xhci_softc), 86}; 87 88static devclass_t xhci_devclass; 89 90DRIVER_MODULE(xhci, pci, xhci_driver, xhci_devclass, 0, 0); 91MODULE_DEPEND(xhci, usb, 1, 1, 1); 92 | 77 78 DEVMETHOD_END 79}; 80 81static driver_t xhci_driver = { 82 .name = "xhci", 83 .methods = xhci_device_methods, 84 .size = sizeof(struct xhci_softc), 85}; 86 87static devclass_t xhci_devclass; 88 89DRIVER_MODULE(xhci, pci, xhci_driver, xhci_devclass, 0, 0); 90MODULE_DEPEND(xhci, usb, 1, 1, 1); 91 |
93static int 94xhci_pci_suspend(device_t self) 95{ 96 struct xhci_softc *sc = device_get_softc(self); 97 int err; | |
98 | 92 |
99 err = bus_generic_suspend(self); 100 if (err) 101 return (err); 102 xhci_suspend(sc); 103 return (0); 104} 105 106static int 107xhci_pci_resume(device_t self) 108{ 109 struct xhci_softc *sc = device_get_softc(self); 110 111 xhci_pci_takecontroller(self); 112 xhci_resume(sc); 113 114 bus_generic_resume(self); 115 116 return (0); 117} 118 119static int 120xhci_pci_shutdown(device_t self) 121{ 122 struct xhci_softc *sc = device_get_softc(self); 123 int err; 124 125 err = bus_generic_shutdown(self); 126 if (err) 127 return (err); 128 xhci_shutdown(sc); 129 130 return (0); 131} 132 | |
133static const char * 134xhci_pci_match(device_t self) 135{ 136 if ((pci_get_class(self) == PCIC_SERIALBUS) 137 && (pci_get_subclass(self) == PCIS_SERIALBUS_USB) 138 && (pci_get_progif(self) == PCIP_SERIALBUS_USB_XHCI)) { 139 return ("XHCI (generic) USB 3.0 controller"); 140 } --- 63 unchanged lines hidden (view full) --- 204 err = bus_setup_intr(self, sc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE, 205 (driver_intr_t *)xhci_interrupt, sc, &sc->sc_intr_hdl); 206#endif 207 if (err) { 208 device_printf(self, "Could not setup IRQ, err=%d\n", err); 209 sc->sc_intr_hdl = NULL; 210 goto error; 211 } | 93static const char * 94xhci_pci_match(device_t self) 95{ 96 if ((pci_get_class(self) == PCIC_SERIALBUS) 97 && (pci_get_subclass(self) == PCIS_SERIALBUS_USB) 98 && (pci_get_progif(self) == PCIP_SERIALBUS_USB_XHCI)) { 99 return ("XHCI (generic) USB 3.0 controller"); 100 } --- 63 unchanged lines hidden (view full) --- 164 err = bus_setup_intr(self, sc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE, 165 (driver_intr_t *)xhci_interrupt, sc, &sc->sc_intr_hdl); 166#endif 167 if (err) { 168 device_printf(self, "Could not setup IRQ, err=%d\n", err); 169 sc->sc_intr_hdl = NULL; 170 goto error; 171 } |
212 xhci_pci_takecontroller(self); | 172 xhci_pci_take_controller(self); |
213 214 err = xhci_halt_controller(sc); 215 216 if (err == 0) 217 err = xhci_start_controller(sc); 218 219 if (err == 0) 220 err = device_probe_and_attach(sc->sc_bus.bdev); --- 42 unchanged lines hidden (view full) --- 263 sc->sc_io_res = NULL; 264 } 265 266 xhci_uninit(sc); 267 268 return (0); 269} 270 | 173 174 err = xhci_halt_controller(sc); 175 176 if (err == 0) 177 err = xhci_start_controller(sc); 178 179 if (err == 0) 180 err = device_probe_and_attach(sc->sc_bus.bdev); --- 42 unchanged lines hidden (view full) --- 223 sc->sc_io_res = NULL; 224 } 225 226 xhci_uninit(sc); 227 228 return (0); 229} 230 |
271static void 272xhci_pci_takecontroller(device_t self) | 231static int 232xhci_pci_take_controller(device_t self) |
273{ 274 struct xhci_softc *sc = device_get_softc(self); 275 uint32_t cparams; 276 uint32_t eecp; 277 uint32_t eec; 278 uint16_t to; 279 uint8_t bios_sem; 280 --- 26 unchanged lines hidden (view full) --- 307 if (--to == 0) { 308 device_printf(sc->sc_bus.bdev, 309 "timed out waiting for BIOS\n"); 310 break; 311 } 312 usb_pause_mtx(NULL, hz / 100); /* wait 10ms */ 313 } 314 } | 233{ 234 struct xhci_softc *sc = device_get_softc(self); 235 uint32_t cparams; 236 uint32_t eecp; 237 uint32_t eec; 238 uint16_t to; 239 uint8_t bios_sem; 240 --- 26 unchanged lines hidden (view full) --- 267 if (--to == 0) { 268 device_printf(sc->sc_bus.bdev, 269 "timed out waiting for BIOS\n"); 270 break; 271 } 272 usb_pause_mtx(NULL, hz / 100); /* wait 10ms */ 273 } 274 } |
275 return (0); |
|
315} | 276} |