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 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> |
61#include "usb_if.h" |
62 63static device_probe_t xhci_pci_probe; 64static device_attach_t xhci_pci_attach; 65static device_detach_t xhci_pci_detach; |
66static usb_take_controller_t xhci_pci_take_controller; |
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), |
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), |
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 |
92 |
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 } |
172 xhci_pci_take_controller(self); |
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 |
231static int 232xhci_pci_take_controller(device_t self) |
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); |
276} |