Deleted Added
sdiff udiff text old ( 227849 ) new ( 228483 )
full compact
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}