Deleted Added
full compact
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}