Annotation of src/sys/dev/usb/xhci.c, Revision 1.28.2.51
1.28.2.51! skrll 1: /* $NetBSD: xhci.c,v 1.28.2.50 2016/02/06 08:50:52 skrll Exp $ */
1.1 jakllsch 2:
3: /*
4: * Copyright (c) 2013 Jonathan A. Kollasch
5: * All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: *
16: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
20: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27: */
28:
1.28.2.21 skrll 29: /*
30: * USB rev 3.1 specification
31: * http://www.usb.org/developers/docs/usb_31_040315.zip
32: * USB rev 2.0 specification
33: * http://www.usb.org/developers/docs/usb20_docs/usb_20_031815.zip
34: * xHCI rev 1.1 specification
35: * http://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/extensible-host-controler-interface-usb-xhci.pdf
36: */
37:
1.1 jakllsch 38: #include <sys/cdefs.h>
1.28.2.51! skrll 39: __KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.28.2.50 2016/02/06 08:50:52 skrll Exp $");
1.27 skrll 40:
41: #include "opt_usb.h"
1.1 jakllsch 42:
43: #include <sys/param.h>
44: #include <sys/systm.h>
45: #include <sys/kernel.h>
46: #include <sys/kmem.h>
47: #include <sys/device.h>
48: #include <sys/select.h>
49: #include <sys/proc.h>
50: #include <sys/queue.h>
51: #include <sys/mutex.h>
52: #include <sys/condvar.h>
53: #include <sys/bus.h>
54: #include <sys/cpu.h>
1.27 skrll 55: #include <sys/sysctl.h>
1.1 jakllsch 56:
57: #include <machine/endian.h>
58:
59: #include <dev/usb/usb.h>
60: #include <dev/usb/usbdi.h>
61: #include <dev/usb/usbdivar.h>
1.28.2.19 skrll 62: #include <dev/usb/usbdi_util.h>
1.27 skrll 63: #include <dev/usb/usbhist.h>
1.1 jakllsch 64: #include <dev/usb/usb_mem.h>
65: #include <dev/usb/usb_quirks.h>
66:
67: #include <dev/usb/xhcireg.h>
68: #include <dev/usb/xhcivar.h>
1.28.2.11 skrll 69: #include <dev/usb/usbroothub.h>
1.1 jakllsch 70:
1.27 skrll 71:
72: #ifdef USB_DEBUG
73: #ifndef XHCI_DEBUG
74: #define xhcidebug 0
1.28.2.18 skrll 75: #else /* !XHCI_DEBUG */
1.27 skrll 76: static int xhcidebug = 0;
77:
78: SYSCTL_SETUP(sysctl_hw_xhci_setup, "sysctl hw.xhci setup")
79: {
80: int err;
81: const struct sysctlnode *rnode;
82: const struct sysctlnode *cnode;
83:
84: err = sysctl_createv(clog, 0, NULL, &rnode,
85: CTLFLAG_PERMANENT, CTLTYPE_NODE, "xhci",
86: SYSCTL_DESCR("xhci global controls"),
87: NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL);
88:
89: if (err)
90: goto fail;
91:
92: /* control debugging printfs */
93: err = sysctl_createv(clog, 0, &rnode, &cnode,
94: CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT,
95: "debug", SYSCTL_DESCR("Enable debugging output"),
96: NULL, 0, &xhcidebug, sizeof(xhcidebug), CTL_CREATE, CTL_EOL);
97: if (err)
98: goto fail;
99:
100: return;
101: fail:
102: aprint_error("%s: sysctl_createv failed (err = %d)\n", __func__, err);
103: }
104:
1.28.2.18 skrll 105: #endif /* !XHCI_DEBUG */
1.27 skrll 106: #endif /* USB_DEBUG */
107:
108: #define DPRINTFN(N,FMT,A,B,C,D) USBHIST_LOGN(xhcidebug,N,FMT,A,B,C,D)
109: #define XHCIHIST_FUNC() USBHIST_FUNC()
110: #define XHCIHIST_CALLED(name) USBHIST_CALLED(xhcidebug)
1.1 jakllsch 111:
112: #define XHCI_DCI_SLOT 0
113: #define XHCI_DCI_EP_CONTROL 1
114:
115: #define XHCI_ICI_INPUT_CONTROL 0
116:
117: struct xhci_pipe {
118: struct usbd_pipe xp_pipe;
1.28.2.22 skrll 119: struct usb_task xp_async_task;
1.1 jakllsch 120: };
121:
122: #define XHCI_COMMAND_RING_TRBS 256
123: #define XHCI_EVENT_RING_TRBS 256
124: #define XHCI_EVENT_RING_SEGMENTS 1
125: #define XHCI_TRB_3_ED_BIT XHCI_TRB_3_ISP_BIT
126:
1.28.2.14 skrll 127: static usbd_status xhci_open(struct usbd_pipe *);
1.28.2.33 skrll 128: static void xhci_close_pipe(struct usbd_pipe *);
1.1 jakllsch 129: static int xhci_intr1(struct xhci_softc * const);
130: static void xhci_softintr(void *);
131: static void xhci_poll(struct usbd_bus *);
1.28.2.41 skrll 132: static struct usbd_xfer *xhci_allocx(struct usbd_bus *, unsigned int);
1.28.2.14 skrll 133: static void xhci_freex(struct usbd_bus *, struct usbd_xfer *);
1.1 jakllsch 134: static void xhci_get_lock(struct usbd_bus *, kmutex_t **);
1.28.2.14 skrll 135: static usbd_status xhci_new_device(device_t, struct usbd_bus *, int, int, int,
1.1 jakllsch 136: struct usbd_port *);
1.28.2.12 skrll 137: static int xhci_roothub_ctrl(struct usbd_bus *, usb_device_request_t *,
138: void *, int);
1.1 jakllsch 139:
1.28.2.14 skrll 140: static usbd_status xhci_configure_endpoint(struct usbd_pipe *);
1.28.2.19 skrll 141: //static usbd_status xhci_unconfigure_endpoint(struct usbd_pipe *);
1.28.2.14 skrll 142: static usbd_status xhci_reset_endpoint(struct usbd_pipe *);
1.28.2.19 skrll 143: static usbd_status xhci_stop_endpoint(struct usbd_pipe *);
1.1 jakllsch 144:
1.28.2.14 skrll 145: static usbd_status xhci_set_dequeue(struct usbd_pipe *);
1.1 jakllsch 146:
147: static usbd_status xhci_do_command(struct xhci_softc * const,
148: struct xhci_trb * const, int);
1.28.2.19 skrll 149: static usbd_status xhci_do_command1(struct xhci_softc * const,
150: struct xhci_trb * const, int, int);
151: static usbd_status xhci_do_command_locked(struct xhci_softc * const,
152: struct xhci_trb * const, int);
153: static usbd_status xhci_init_slot(struct usbd_device *, uint32_t, int, int);
1.1 jakllsch 154: static usbd_status xhci_enable_slot(struct xhci_softc * const,
155: uint8_t * const);
1.28.2.19 skrll 156: static usbd_status xhci_disable_slot(struct xhci_softc * const, uint8_t);
1.1 jakllsch 157: static usbd_status xhci_address_device(struct xhci_softc * const,
158: uint64_t, uint8_t, bool);
159: static usbd_status xhci_update_ep0_mps(struct xhci_softc * const,
160: struct xhci_slot * const, u_int);
161: static usbd_status xhci_ring_init(struct xhci_softc * const,
162: struct xhci_ring * const, size_t, size_t);
163: static void xhci_ring_free(struct xhci_softc * const, struct xhci_ring * const);
164:
1.28.2.14 skrll 165: static void xhci_noop(struct usbd_pipe *);
1.1 jakllsch 166:
1.28.2.14 skrll 167: static usbd_status xhci_root_intr_transfer(struct usbd_xfer *);
168: static usbd_status xhci_root_intr_start(struct usbd_xfer *);
169: static void xhci_root_intr_abort(struct usbd_xfer *);
170: static void xhci_root_intr_close(struct usbd_pipe *);
171: static void xhci_root_intr_done(struct usbd_xfer *);
172:
173: static usbd_status xhci_device_ctrl_transfer(struct usbd_xfer *);
174: static usbd_status xhci_device_ctrl_start(struct usbd_xfer *);
175: static void xhci_device_ctrl_abort(struct usbd_xfer *);
176: static void xhci_device_ctrl_close(struct usbd_pipe *);
177: static void xhci_device_ctrl_done(struct usbd_xfer *);
178:
179: static usbd_status xhci_device_intr_transfer(struct usbd_xfer *);
180: static usbd_status xhci_device_intr_start(struct usbd_xfer *);
181: static void xhci_device_intr_abort(struct usbd_xfer *);
182: static void xhci_device_intr_close(struct usbd_pipe *);
183: static void xhci_device_intr_done(struct usbd_xfer *);
184:
185: static usbd_status xhci_device_bulk_transfer(struct usbd_xfer *);
186: static usbd_status xhci_device_bulk_start(struct usbd_xfer *);
187: static void xhci_device_bulk_abort(struct usbd_xfer *);
188: static void xhci_device_bulk_close(struct usbd_pipe *);
189: static void xhci_device_bulk_done(struct usbd_xfer *);
1.1 jakllsch 190:
191: static void xhci_timeout(void *);
192: static void xhci_timeout_task(void *);
193:
194: static const struct usbd_bus_methods xhci_bus_methods = {
1.28.2.3 skrll 195: .ubm_open = xhci_open,
196: .ubm_softint = xhci_softintr,
197: .ubm_dopoll = xhci_poll,
198: .ubm_allocx = xhci_allocx,
199: .ubm_freex = xhci_freex,
200: .ubm_getlock = xhci_get_lock,
201: .ubm_newdev = xhci_new_device,
1.28.2.12 skrll 202: .ubm_rhctrl = xhci_roothub_ctrl,
1.1 jakllsch 203: };
204:
205: static const struct usbd_pipe_methods xhci_root_intr_methods = {
1.28.2.3 skrll 206: .upm_transfer = xhci_root_intr_transfer,
207: .upm_start = xhci_root_intr_start,
208: .upm_abort = xhci_root_intr_abort,
209: .upm_close = xhci_root_intr_close,
210: .upm_cleartoggle = xhci_noop,
211: .upm_done = xhci_root_intr_done,
1.1 jakllsch 212: };
213:
214:
215: static const struct usbd_pipe_methods xhci_device_ctrl_methods = {
1.28.2.3 skrll 216: .upm_transfer = xhci_device_ctrl_transfer,
217: .upm_start = xhci_device_ctrl_start,
218: .upm_abort = xhci_device_ctrl_abort,
219: .upm_close = xhci_device_ctrl_close,
220: .upm_cleartoggle = xhci_noop,
221: .upm_done = xhci_device_ctrl_done,
1.1 jakllsch 222: };
223:
224: static const struct usbd_pipe_methods xhci_device_isoc_methods = {
1.28.2.3 skrll 225: .upm_cleartoggle = xhci_noop,
1.1 jakllsch 226: };
227:
228: static const struct usbd_pipe_methods xhci_device_bulk_methods = {
1.28.2.3 skrll 229: .upm_transfer = xhci_device_bulk_transfer,
230: .upm_start = xhci_device_bulk_start,
231: .upm_abort = xhci_device_bulk_abort,
232: .upm_close = xhci_device_bulk_close,
233: .upm_cleartoggle = xhci_noop,
234: .upm_done = xhci_device_bulk_done,
1.1 jakllsch 235: };
236:
237: static const struct usbd_pipe_methods xhci_device_intr_methods = {
1.28.2.3 skrll 238: .upm_transfer = xhci_device_intr_transfer,
239: .upm_start = xhci_device_intr_start,
240: .upm_abort = xhci_device_intr_abort,
241: .upm_close = xhci_device_intr_close,
242: .upm_cleartoggle = xhci_noop,
243: .upm_done = xhci_device_intr_done,
1.1 jakllsch 244: };
245:
246: static inline uint32_t
1.28.2.19 skrll 247: xhci_read_1(const struct xhci_softc * const sc, bus_size_t offset)
248: {
249: return bus_space_read_1(sc->sc_iot, sc->sc_ioh, offset);
250: }
251:
252: static inline uint32_t
1.1 jakllsch 253: xhci_read_4(const struct xhci_softc * const sc, bus_size_t offset)
254: {
255: return bus_space_read_4(sc->sc_iot, sc->sc_ioh, offset);
256: }
257:
1.28.2.19 skrll 258: static inline void
259: xhci_write_1(const struct xhci_softc * const sc, bus_size_t offset,
260: uint32_t value)
261: {
262: bus_space_write_1(sc->sc_iot, sc->sc_ioh, offset, value);
263: }
264:
1.4 apb 265: #if 0 /* unused */
1.1 jakllsch 266: static inline void
267: xhci_write_4(const struct xhci_softc * const sc, bus_size_t offset,
268: uint32_t value)
269: {
270: bus_space_write_4(sc->sc_iot, sc->sc_ioh, offset, value);
271: }
1.4 apb 272: #endif /* unused */
1.1 jakllsch 273:
274: static inline uint32_t
275: xhci_cap_read_4(const struct xhci_softc * const sc, bus_size_t offset)
276: {
277: return bus_space_read_4(sc->sc_iot, sc->sc_cbh, offset);
278: }
279:
280: static inline uint32_t
281: xhci_op_read_4(const struct xhci_softc * const sc, bus_size_t offset)
282: {
283: return bus_space_read_4(sc->sc_iot, sc->sc_obh, offset);
284: }
285:
286: static inline void
287: xhci_op_write_4(const struct xhci_softc * const sc, bus_size_t offset,
288: uint32_t value)
289: {
290: bus_space_write_4(sc->sc_iot, sc->sc_obh, offset, value);
291: }
292:
1.4 apb 293: #if 0 /* unused */
1.1 jakllsch 294: static inline uint64_t
295: xhci_op_read_8(const struct xhci_softc * const sc, bus_size_t offset)
296: {
297: uint64_t value;
298:
299: if (sc->sc_ac64) {
300: #ifdef XHCI_USE_BUS_SPACE_8
301: value = bus_space_read_8(sc->sc_iot, sc->sc_obh, offset);
302: #else
303: value = bus_space_read_4(sc->sc_iot, sc->sc_obh, offset);
304: value |= (uint64_t)bus_space_read_4(sc->sc_iot, sc->sc_obh,
305: offset + 4) << 32;
306: #endif
307: } else {
308: value = bus_space_read_4(sc->sc_iot, sc->sc_obh, offset);
309: }
310:
311: return value;
312: }
1.4 apb 313: #endif /* unused */
1.1 jakllsch 314:
315: static inline void
316: xhci_op_write_8(const struct xhci_softc * const sc, bus_size_t offset,
317: uint64_t value)
318: {
319: if (sc->sc_ac64) {
320: #ifdef XHCI_USE_BUS_SPACE_8
321: bus_space_write_8(sc->sc_iot, sc->sc_obh, offset, value);
322: #else
323: bus_space_write_4(sc->sc_iot, sc->sc_obh, offset + 0,
324: (value >> 0) & 0xffffffff);
325: bus_space_write_4(sc->sc_iot, sc->sc_obh, offset + 4,
326: (value >> 32) & 0xffffffff);
327: #endif
328: } else {
329: bus_space_write_4(sc->sc_iot, sc->sc_obh, offset, value);
330: }
331: }
332:
333: static inline uint32_t
334: xhci_rt_read_4(const struct xhci_softc * const sc, bus_size_t offset)
335: {
336: return bus_space_read_4(sc->sc_iot, sc->sc_rbh, offset);
337: }
338:
339: static inline void
340: xhci_rt_write_4(const struct xhci_softc * const sc, bus_size_t offset,
341: uint32_t value)
342: {
343: bus_space_write_4(sc->sc_iot, sc->sc_rbh, offset, value);
344: }
345:
1.4 apb 346: #if 0 /* unused */
1.1 jakllsch 347: static inline uint64_t
348: xhci_rt_read_8(const struct xhci_softc * const sc, bus_size_t offset)
349: {
350: uint64_t value;
351:
352: if (sc->sc_ac64) {
353: #ifdef XHCI_USE_BUS_SPACE_8
354: value = bus_space_read_8(sc->sc_iot, sc->sc_rbh, offset);
355: #else
356: value = bus_space_read_4(sc->sc_iot, sc->sc_rbh, offset);
357: value |= (uint64_t)bus_space_read_4(sc->sc_iot, sc->sc_rbh,
358: offset + 4) << 32;
359: #endif
360: } else {
361: value = bus_space_read_4(sc->sc_iot, sc->sc_rbh, offset);
362: }
363:
364: return value;
365: }
1.4 apb 366: #endif /* unused */
1.1 jakllsch 367:
368: static inline void
369: xhci_rt_write_8(const struct xhci_softc * const sc, bus_size_t offset,
370: uint64_t value)
371: {
372: if (sc->sc_ac64) {
373: #ifdef XHCI_USE_BUS_SPACE_8
374: bus_space_write_8(sc->sc_iot, sc->sc_rbh, offset, value);
375: #else
376: bus_space_write_4(sc->sc_iot, sc->sc_rbh, offset + 0,
377: (value >> 0) & 0xffffffff);
378: bus_space_write_4(sc->sc_iot, sc->sc_rbh, offset + 4,
379: (value >> 32) & 0xffffffff);
380: #endif
381: } else {
382: bus_space_write_4(sc->sc_iot, sc->sc_rbh, offset, value);
383: }
384: }
385:
1.4 apb 386: #if 0 /* unused */
1.1 jakllsch 387: static inline uint32_t
388: xhci_db_read_4(const struct xhci_softc * const sc, bus_size_t offset)
389: {
390: return bus_space_read_4(sc->sc_iot, sc->sc_dbh, offset);
391: }
1.4 apb 392: #endif /* unused */
1.1 jakllsch 393:
394: static inline void
395: xhci_db_write_4(const struct xhci_softc * const sc, bus_size_t offset,
396: uint32_t value)
397: {
398: bus_space_write_4(sc->sc_iot, sc->sc_dbh, offset, value);
399: }
400:
401: /* --- */
402:
403: static inline uint8_t
404: xhci_ep_get_type(usb_endpoint_descriptor_t * const ed)
405: {
1.28.2.19 skrll 406: u_int eptype = 0;
1.1 jakllsch 407:
408: switch (UE_GET_XFERTYPE(ed->bmAttributes)) {
409: case UE_CONTROL:
410: eptype = 0x0;
411: break;
412: case UE_ISOCHRONOUS:
413: eptype = 0x1;
414: break;
415: case UE_BULK:
416: eptype = 0x2;
417: break;
418: case UE_INTERRUPT:
419: eptype = 0x3;
420: break;
421: }
422:
423: if ((UE_GET_XFERTYPE(ed->bmAttributes) == UE_CONTROL) ||
424: (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN))
425: return eptype | 0x4;
426: else
427: return eptype;
428: }
429:
430: static u_int
431: xhci_ep_get_dci(usb_endpoint_descriptor_t * const ed)
432: {
433: /* xHCI 1.0 section 4.5.1 */
434: u_int epaddr = UE_GET_ADDR(ed->bEndpointAddress);
435: u_int in = 0;
436:
437: if ((UE_GET_XFERTYPE(ed->bmAttributes) == UE_CONTROL) ||
438: (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN))
439: in = 1;
440:
441: return epaddr * 2 + in;
442: }
443:
444: static inline u_int
445: xhci_dci_to_ici(const u_int i)
446: {
447: return i + 1;
448: }
449:
450: static inline void *
451: xhci_slot_get_dcv(struct xhci_softc * const sc, struct xhci_slot * const xs,
452: const u_int dci)
453: {
454: return KERNADDR(&xs->xs_dc_dma, sc->sc_ctxsz * dci);
455: }
456:
1.4 apb 457: #if 0 /* unused */
1.1 jakllsch 458: static inline bus_addr_t
459: xhci_slot_get_dcp(struct xhci_softc * const sc, struct xhci_slot * const xs,
460: const u_int dci)
461: {
462: return DMAADDR(&xs->xs_dc_dma, sc->sc_ctxsz * dci);
463: }
1.4 apb 464: #endif /* unused */
1.1 jakllsch 465:
466: static inline void *
467: xhci_slot_get_icv(struct xhci_softc * const sc, struct xhci_slot * const xs,
468: const u_int ici)
469: {
470: return KERNADDR(&xs->xs_ic_dma, sc->sc_ctxsz * ici);
471: }
472:
473: static inline bus_addr_t
474: xhci_slot_get_icp(struct xhci_softc * const sc, struct xhci_slot * const xs,
475: const u_int ici)
476: {
477: return DMAADDR(&xs->xs_ic_dma, sc->sc_ctxsz * ici);
478: }
479:
480: static inline struct xhci_trb *
481: xhci_ring_trbv(struct xhci_ring * const xr, u_int idx)
482: {
483: return KERNADDR(&xr->xr_dma, XHCI_TRB_SIZE * idx);
484: }
485:
486: static inline bus_addr_t
487: xhci_ring_trbp(struct xhci_ring * const xr, u_int idx)
488: {
489: return DMAADDR(&xr->xr_dma, XHCI_TRB_SIZE * idx);
490: }
491:
492: static inline void
493: xhci_trb_put(struct xhci_trb * const trb, uint64_t parameter, uint32_t status,
494: uint32_t control)
495: {
1.28.2.34 skrll 496: trb->trb_0 = htole64(parameter);
497: trb->trb_2 = htole32(status);
498: trb->trb_3 = htole32(control);
1.1 jakllsch 499: }
500:
501: /* --- */
502:
503: void
504: xhci_childdet(device_t self, device_t child)
505: {
506: struct xhci_softc * const sc = device_private(self);
507:
508: KASSERT(sc->sc_child == child);
509: if (child == sc->sc_child)
510: sc->sc_child = NULL;
511: }
512:
513: int
514: xhci_detach(struct xhci_softc *sc, int flags)
515: {
516: int rv = 0;
517:
518: if (sc->sc_child != NULL)
519: rv = config_detach(sc->sc_child, flags);
520:
521: if (rv != 0)
1.28.2.13 skrll 522: return rv;
1.1 jakllsch 523:
524: /* XXX unconfigure/free slots */
525:
526: /* verify: */
527: xhci_rt_write_4(sc, XHCI_IMAN(0), 0);
528: xhci_op_write_4(sc, XHCI_USBCMD, 0);
529: /* do we need to wait for stop? */
530:
531: xhci_op_write_8(sc, XHCI_CRCR, 0);
532: xhci_ring_free(sc, &sc->sc_cr);
533: cv_destroy(&sc->sc_command_cv);
534:
535: xhci_rt_write_4(sc, XHCI_ERSTSZ(0), 0);
536: xhci_rt_write_8(sc, XHCI_ERSTBA(0), 0);
537: xhci_rt_write_8(sc, XHCI_ERDP(0), 0|XHCI_ERDP_LO_BUSY);
538: xhci_ring_free(sc, &sc->sc_er);
539:
540: usb_freemem(&sc->sc_bus, &sc->sc_eventst_dma);
541:
542: xhci_op_write_8(sc, XHCI_DCBAAP, 0);
543: usb_freemem(&sc->sc_bus, &sc->sc_dcbaa_dma);
544:
545: kmem_free(sc->sc_slots, sizeof(*sc->sc_slots) * sc->sc_maxslots);
546:
547: mutex_destroy(&sc->sc_lock);
548: mutex_destroy(&sc->sc_intr_lock);
1.28.2.19 skrll 549: cv_destroy(&sc->sc_softwake_cv);
1.1 jakllsch 550:
551: pool_cache_destroy(sc->sc_xferpool);
552:
553: return rv;
554: }
555:
556: int
557: xhci_activate(device_t self, enum devact act)
558: {
559: struct xhci_softc * const sc = device_private(self);
560:
561: switch (act) {
562: case DVACT_DEACTIVATE:
563: sc->sc_dying = true;
564: return 0;
565: default:
566: return EOPNOTSUPP;
567: }
568: }
569:
570: bool
571: xhci_suspend(device_t dv, const pmf_qual_t *qual)
572: {
573: return false;
574: }
575:
576: bool
577: xhci_resume(device_t dv, const pmf_qual_t *qual)
578: {
579: return false;
580: }
581:
582: bool
583: xhci_shutdown(device_t self, int flags)
584: {
585: return false;
586: }
587:
588:
589: static void
590: hexdump(const char *msg, const void *base, size_t len)
591: {
592: #if 0
593: size_t cnt;
594: const uint32_t *p;
595: extern paddr_t vtophys(vaddr_t);
596:
597: p = base;
598: cnt = 0;
599:
600: printf("*** %s (%zu bytes @ %p %p)\n", msg, len, base,
601: (void *)vtophys((vaddr_t)base));
602:
603: while (cnt < len) {
604: if (cnt % 16 == 0)
605: printf("%p: ", p);
606: else if (cnt % 8 == 0)
607: printf(" |");
608: printf(" %08x", *p++);
609: cnt += 4;
610: if (cnt % 16 == 0)
611: printf("\n");
612: }
613: #endif
614: }
615:
1.28.2.37 skrll 616: #define XHCI_HCCPREV1_BITS \
617: "\177\020" /* New bitmask */ \
618: "f\020\020XECP\0" \
619: "f\014\4MAXPSA\0" \
620: "b\013CFC\0" \
621: "b\012SEC\0" \
622: "b\011SBD\0" \
623: "b\010FSE\0" \
624: "b\7NSS\0" \
625: "b\6LTC\0" \
626: "b\5LHRC\0" \
627: "b\4PIND\0" \
628: "b\3PPC\0" \
629: "b\2CZC\0" \
630: "b\1BNC\0" \
631: "b\0AC64\0" \
632: "\0"
633: #define XHCI_HCCV1_x_BITS \
634: "\177\020" /* New bitmask */ \
635: "f\020\020XECP\0" \
636: "f\014\4MAXPSA\0" \
637: "b\013CFC\0" \
638: "b\012SEC\0" \
639: "b\011SPC\0" \
640: "b\010PAE\0" \
641: "b\7NSS\0" \
642: "b\6LTC\0" \
643: "b\5LHRC\0" \
644: "b\4PIND\0" \
645: "b\3PPC\0" \
646: "b\2CSZ\0" \
647: "b\1BNC\0" \
648: "b\0AC64\0" \
649: "\0"
1.1 jakllsch 650:
1.15 skrll 651: int
1.1 jakllsch 652: xhci_init(struct xhci_softc *sc)
653: {
654: bus_size_t bsz;
1.28.2.37 skrll 655: uint32_t cap, hcs1, hcs2, hcs3, hcc, dboff, rtsoff;
1.1 jakllsch 656: uint32_t ecp, ecr;
657: uint32_t usbcmd, usbsts, pagesize, config;
658: int i;
659: uint16_t hciversion;
660: uint8_t caplength;
661:
1.27 skrll 662: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.1 jakllsch 663:
1.28.2.40 skrll 664: sc->sc_bus.ub_revision = USBREV_3_0;
1.28.2.5 skrll 665: sc->sc_bus.ub_usedma = true;
1.1 jakllsch 666:
667: cap = xhci_read_4(sc, XHCI_CAPLENGTH);
668: caplength = XHCI_CAP_CAPLENGTH(cap);
669: hciversion = XHCI_CAP_HCIVERSION(cap);
670:
1.28.2.37 skrll 671: if (hciversion < XHCI_HCIVERSION_0_96 ||
672: hciversion > XHCI_HCIVERSION_1_0) {
1.1 jakllsch 673: aprint_normal_dev(sc->sc_dev,
674: "xHCI version %x.%x not known to be supported\n",
675: (hciversion >> 8) & 0xff, (hciversion >> 0) & 0xff);
676: } else {
677: aprint_verbose_dev(sc->sc_dev, "xHCI version %x.%x\n",
678: (hciversion >> 8) & 0xff, (hciversion >> 0) & 0xff);
679: }
680:
681: if (bus_space_subregion(sc->sc_iot, sc->sc_ioh, 0, caplength,
682: &sc->sc_cbh) != 0) {
683: aprint_error_dev(sc->sc_dev, "capability subregion failure\n");
1.15 skrll 684: return ENOMEM;
1.1 jakllsch 685: }
686:
687: hcs1 = xhci_cap_read_4(sc, XHCI_HCSPARAMS1);
688: sc->sc_maxslots = XHCI_HCS1_MAXSLOTS(hcs1);
689: sc->sc_maxintrs = XHCI_HCS1_MAXINTRS(hcs1);
690: sc->sc_maxports = XHCI_HCS1_MAXPORTS(hcs1);
691: hcs2 = xhci_cap_read_4(sc, XHCI_HCSPARAMS2);
1.28.2.37 skrll 692: hcs3 = xhci_cap_read_4(sc, XHCI_HCSPARAMS3);
693: aprint_debug_dev(sc->sc_dev,
694: "hcs1=%"PRIx32" hcs2=%"PRIx32" hcs3=%"PRIx32"\n", hcs1, hcs2, hcs3);
1.1 jakllsch 695:
1.28.2.37 skrll 696: hcc = xhci_cap_read_4(sc, XHCI_HCCPARAMS);
1.1 jakllsch 697: sc->sc_ac64 = XHCI_HCC_AC64(hcc);
698: sc->sc_ctxsz = XHCI_HCC_CSZ(hcc) ? 64 : 32;
699:
1.28.2.37 skrll 700: char sbuf[128];
701: if (hciversion < XHCI_HCIVERSION_1_0)
702: snprintb(sbuf, sizeof(sbuf), XHCI_HCCPREV1_BITS, hcc);
703: else
1.28.2.39 skrll 704: snprintb(sbuf, sizeof(sbuf), XHCI_HCCV1_x_BITS, hcc);
1.28.2.37 skrll 705: aprint_debug_dev(sc->sc_dev, "hcc=%s\n", sbuf);
1.12 jakllsch 706: aprint_debug_dev(sc->sc_dev, "xECP %x\n", XHCI_HCC_XECP(hcc) * 4);
1.28.2.37 skrll 707:
1.1 jakllsch 708: ecp = XHCI_HCC_XECP(hcc) * 4;
709: while (ecp != 0) {
710: ecr = xhci_read_4(sc, ecp);
1.12 jakllsch 711: aprint_debug_dev(sc->sc_dev, "ECR %x: %08x\n", ecp, ecr);
1.1 jakllsch 712: switch (XHCI_XECP_ID(ecr)) {
713: case XHCI_ID_PROTOCOLS: {
714: uint32_t w0, w4, w8;
715: uint16_t w2;
716: w0 = xhci_read_4(sc, ecp + 0);
717: w2 = (w0 >> 16) & 0xffff;
718: w4 = xhci_read_4(sc, ecp + 4);
719: w8 = xhci_read_4(sc, ecp + 8);
1.12 jakllsch 720: aprint_debug_dev(sc->sc_dev, "SP: %08x %08x %08x\n",
1.1 jakllsch 721: w0, w4, w8);
722: if (w4 == 0x20425355 && w2 == 0x0300) {
723: sc->sc_ss_port_start = (w8 >> 0) & 0xff;;
724: sc->sc_ss_port_count = (w8 >> 8) & 0xff;;
725: }
726: if (w4 == 0x20425355 && w2 == 0x0200) {
727: sc->sc_hs_port_start = (w8 >> 0) & 0xff;
728: sc->sc_hs_port_count = (w8 >> 8) & 0xff;
729: }
730: break;
731: }
1.28.2.19 skrll 732: case XHCI_ID_USB_LEGACY: {
733: uint8_t bios_sem;
734:
735: /* Take host controller from BIOS */
736: bios_sem = xhci_read_1(sc, ecp + XHCI_XECP_BIOS_SEM);
737: if (bios_sem) {
738: /* sets xHCI to be owned by OS */
739: xhci_write_1(sc, ecp + XHCI_XECP_OS_SEM, 1);
740: aprint_debug(
741: "waiting for BIOS to give up control\n");
742: for (i = 0; i < 5000; i++) {
743: bios_sem = xhci_read_1(sc, ecp +
744: XHCI_XECP_BIOS_SEM);
745: if (bios_sem == 0)
746: break;
747: DELAY(1000);
748: }
749: if (bios_sem)
750: printf("timed out waiting for BIOS\n");
751: }
752: break;
753: }
1.1 jakllsch 754: default:
755: break;
756: }
757: ecr = xhci_read_4(sc, ecp);
758: if (XHCI_XECP_NEXT(ecr) == 0) {
759: ecp = 0;
760: } else {
761: ecp += XHCI_XECP_NEXT(ecr) * 4;
762: }
763: }
764:
765: bsz = XHCI_PORTSC(sc->sc_maxports + 1);
766: if (bus_space_subregion(sc->sc_iot, sc->sc_ioh, caplength, bsz,
767: &sc->sc_obh) != 0) {
768: aprint_error_dev(sc->sc_dev, "operational subregion failure\n");
1.15 skrll 769: return ENOMEM;
1.1 jakllsch 770: }
771:
772: dboff = xhci_cap_read_4(sc, XHCI_DBOFF);
773: if (bus_space_subregion(sc->sc_iot, sc->sc_ioh, dboff,
774: sc->sc_maxslots * 4, &sc->sc_dbh) != 0) {
775: aprint_error_dev(sc->sc_dev, "doorbell subregion failure\n");
1.15 skrll 776: return ENOMEM;
1.1 jakllsch 777: }
778:
779: rtsoff = xhci_cap_read_4(sc, XHCI_RTSOFF);
780: if (bus_space_subregion(sc->sc_iot, sc->sc_ioh, rtsoff,
781: sc->sc_maxintrs * 0x20, &sc->sc_rbh) != 0) {
782: aprint_error_dev(sc->sc_dev, "runtime subregion failure\n");
1.15 skrll 783: return ENOMEM;
1.1 jakllsch 784: }
785:
786: for (i = 0; i < 100; i++) {
787: usbsts = xhci_op_read_4(sc, XHCI_USBSTS);
788: if ((usbsts & XHCI_STS_CNR) == 0)
789: break;
790: usb_delay_ms(&sc->sc_bus, 1);
791: }
792: if (i >= 100)
1.15 skrll 793: return EIO;
1.1 jakllsch 794:
795: usbcmd = 0;
796: xhci_op_write_4(sc, XHCI_USBCMD, usbcmd);
797: usb_delay_ms(&sc->sc_bus, 1);
798:
799: usbcmd = XHCI_CMD_HCRST;
800: xhci_op_write_4(sc, XHCI_USBCMD, usbcmd);
801: for (i = 0; i < 100; i++) {
802: usbcmd = xhci_op_read_4(sc, XHCI_USBCMD);
803: if ((usbcmd & XHCI_CMD_HCRST) == 0)
804: break;
805: usb_delay_ms(&sc->sc_bus, 1);
806: }
807: if (i >= 100)
1.15 skrll 808: return EIO;
1.1 jakllsch 809:
810: for (i = 0; i < 100; i++) {
811: usbsts = xhci_op_read_4(sc, XHCI_USBSTS);
812: if ((usbsts & XHCI_STS_CNR) == 0)
813: break;
814: usb_delay_ms(&sc->sc_bus, 1);
815: }
816: if (i >= 100)
1.15 skrll 817: return EIO;
1.1 jakllsch 818:
1.28.2.34 skrll 819: if (sc->sc_vendor_init)
820: sc->sc_vendor_init(sc);
821:
1.1 jakllsch 822: pagesize = xhci_op_read_4(sc, XHCI_PAGESIZE);
1.12 jakllsch 823: aprint_debug_dev(sc->sc_dev, "PAGESIZE 0x%08x\n", pagesize);
1.1 jakllsch 824: pagesize = ffs(pagesize);
825: if (pagesize == 0)
1.15 skrll 826: return EIO;
1.1 jakllsch 827: sc->sc_pgsz = 1 << (12 + (pagesize - 1));
1.12 jakllsch 828: aprint_debug_dev(sc->sc_dev, "sc_pgsz 0x%08x\n", (uint32_t)sc->sc_pgsz);
829: aprint_debug_dev(sc->sc_dev, "sc_maxslots 0x%08x\n",
1.1 jakllsch 830: (uint32_t)sc->sc_maxslots);
1.28.2.19 skrll 831: aprint_debug_dev(sc->sc_dev, "sc_maxports %d\n", sc->sc_maxports);
1.1 jakllsch 832:
1.5 matt 833: usbd_status err;
834:
835: sc->sc_maxspbuf = XHCI_HCS2_MAXSPBUF(hcs2);
1.12 jakllsch 836: aprint_debug_dev(sc->sc_dev, "sc_maxspbuf %d\n", sc->sc_maxspbuf);
1.5 matt 837: if (sc->sc_maxspbuf != 0) {
838: err = usb_allocmem(&sc->sc_bus,
839: sizeof(uint64_t) * sc->sc_maxspbuf, sizeof(uint64_t),
840: &sc->sc_spbufarray_dma);
841: if (err)
842: return err;
1.28.2.1 skrll 843:
1.5 matt 844: sc->sc_spbuf_dma = kmem_zalloc(sizeof(*sc->sc_spbuf_dma) * sc->sc_maxspbuf, KM_SLEEP);
845: uint64_t *spbufarray = KERNADDR(&sc->sc_spbufarray_dma, 0);
846: for (i = 0; i < sc->sc_maxspbuf; i++) {
847: usb_dma_t * const dma = &sc->sc_spbuf_dma[i];
848: /* allocate contexts */
849: err = usb_allocmem(&sc->sc_bus, sc->sc_pgsz,
850: sc->sc_pgsz, dma);
851: if (err)
852: return err;
853: spbufarray[i] = htole64(DMAADDR(dma, 0));
854: usb_syncmem(dma, 0, sc->sc_pgsz,
855: BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
856: }
857:
1.28.2.1 skrll 858: usb_syncmem(&sc->sc_spbufarray_dma, 0,
1.5 matt 859: sizeof(uint64_t) * sc->sc_maxspbuf, BUS_DMASYNC_PREWRITE);
860: }
861:
1.1 jakllsch 862: config = xhci_op_read_4(sc, XHCI_CONFIG);
863: config &= ~0xFF;
864: config |= sc->sc_maxslots & 0xFF;
865: xhci_op_write_4(sc, XHCI_CONFIG, config);
866:
867: err = xhci_ring_init(sc, &sc->sc_cr, XHCI_COMMAND_RING_TRBS,
868: XHCI_COMMAND_RING_SEGMENTS_ALIGN);
869: if (err) {
870: aprint_error_dev(sc->sc_dev, "command ring init fail\n");
871: return err;
872: }
873:
874: err = xhci_ring_init(sc, &sc->sc_er, XHCI_EVENT_RING_TRBS,
875: XHCI_EVENT_RING_SEGMENTS_ALIGN);
876: if (err) {
877: aprint_error_dev(sc->sc_dev, "event ring init fail\n");
878: return err;
879: }
880:
1.16 skrll 881: usb_dma_t *dma;
882: size_t size;
883: size_t align;
884:
885: dma = &sc->sc_eventst_dma;
886: size = roundup2(XHCI_EVENT_RING_SEGMENTS * XHCI_ERSTE_SIZE,
887: XHCI_EVENT_RING_SEGMENT_TABLE_ALIGN);
888: KASSERT(size <= (512 * 1024));
889: align = XHCI_EVENT_RING_SEGMENT_TABLE_ALIGN;
890: err = usb_allocmem(&sc->sc_bus, size, align, dma);
891:
892: memset(KERNADDR(dma, 0), 0, size);
893: usb_syncmem(dma, 0, size, BUS_DMASYNC_PREWRITE);
894: aprint_debug_dev(sc->sc_dev, "eventst: %s %016jx %p %zx\n",
895: usbd_errstr(err),
896: (uintmax_t)DMAADDR(&sc->sc_eventst_dma, 0),
897: KERNADDR(&sc->sc_eventst_dma, 0),
1.28.2.5 skrll 898: sc->sc_eventst_dma.udma_block->size);
1.16 skrll 899:
900: dma = &sc->sc_dcbaa_dma;
901: size = (1 + sc->sc_maxslots) * sizeof(uint64_t);
902: KASSERT(size <= 2048);
903: align = XHCI_DEVICE_CONTEXT_BASE_ADDRESS_ARRAY_ALIGN;
904: err = usb_allocmem(&sc->sc_bus, size, align, dma);
905:
906: memset(KERNADDR(dma, 0), 0, size);
907: if (sc->sc_maxspbuf != 0) {
908: /*
909: * DCBA entry 0 hold the scratchbuf array pointer.
910: */
911: *(uint64_t *)KERNADDR(dma, 0) =
912: htole64(DMAADDR(&sc->sc_spbufarray_dma, 0));
1.1 jakllsch 913: }
1.16 skrll 914: usb_syncmem(dma, 0, size, BUS_DMASYNC_PREWRITE);
915: aprint_debug_dev(sc->sc_dev, "dcbaa: %s %016jx %p %zx\n",
916: usbd_errstr(err),
917: (uintmax_t)DMAADDR(&sc->sc_dcbaa_dma, 0),
918: KERNADDR(&sc->sc_dcbaa_dma, 0),
1.28.2.5 skrll 919: sc->sc_dcbaa_dma.udma_block->size);
1.1 jakllsch 920:
921: sc->sc_slots = kmem_zalloc(sizeof(*sc->sc_slots) * sc->sc_maxslots,
922: KM_SLEEP);
923:
924: cv_init(&sc->sc_command_cv, "xhcicmd");
1.28.2.19 skrll 925: mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTUSB);
1.28.2.34 skrll 926: mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_USB);
1.28.2.19 skrll 927: cv_init(&sc->sc_softwake_cv, "xhciab");
928:
929: sc->sc_xferpool = pool_cache_init(sizeof(struct xhci_xfer), 0, 0, 0,
1.28.2.48 skrll 930: "xhcixfer", NULL, IPL_USB, NULL, NULL, NULL);
1.28.2.19 skrll 931:
932: /* Set up the bus struct. */
933: sc->sc_bus.ub_methods = &xhci_bus_methods;
934: sc->sc_bus.ub_pipesize = sizeof(struct xhci_pipe);
1.1 jakllsch 935:
936: struct xhci_erste *erst;
937: erst = KERNADDR(&sc->sc_eventst_dma, 0);
938: erst[0].erste_0 = htole64(xhci_ring_trbp(&sc->sc_er, 0));
939: erst[0].erste_2 = htole32(XHCI_EVENT_RING_TRBS);
940: erst[0].erste_3 = htole32(0);
941: usb_syncmem(&sc->sc_eventst_dma, 0,
942: XHCI_ERSTE_SIZE * XHCI_EVENT_RING_SEGMENTS, BUS_DMASYNC_PREWRITE);
943:
944: xhci_rt_write_4(sc, XHCI_ERSTSZ(0), XHCI_EVENT_RING_SEGMENTS);
945: xhci_rt_write_8(sc, XHCI_ERSTBA(0), DMAADDR(&sc->sc_eventst_dma, 0));
946: xhci_rt_write_8(sc, XHCI_ERDP(0), xhci_ring_trbp(&sc->sc_er, 0) |
947: XHCI_ERDP_LO_BUSY);
948: xhci_op_write_8(sc, XHCI_DCBAAP, DMAADDR(&sc->sc_dcbaa_dma, 0));
949: xhci_op_write_8(sc, XHCI_CRCR, xhci_ring_trbp(&sc->sc_cr, 0) |
950: sc->sc_cr.xr_cs);
951:
952: #if 0
953: hexdump("eventst", KERNADDR(&sc->sc_eventst_dma, 0),
954: XHCI_ERSTE_SIZE * XHCI_EVENT_RING_SEGMENTS);
955: #endif
956:
957: xhci_rt_write_4(sc, XHCI_IMAN(0), XHCI_IMAN_INTR_ENA);
1.28.2.19 skrll 958: if ((sc->sc_quirks & XHCI_QUIRK_INTEL) != 0)
959: /* Intel xhci needs interrupt rate moderated. */
960: xhci_rt_write_4(sc, XHCI_IMOD(0), XHCI_IMOD_DEFAULT_LP);
961: else
962: xhci_rt_write_4(sc, XHCI_IMOD(0), 0);
1.28.2.26 skrll 963: aprint_debug_dev(sc->sc_dev, "setting IMOD %u\n",
964: xhci_rt_read_4(sc, XHCI_IMOD(0)));
1.1 jakllsch 965:
966: xhci_op_write_4(sc, XHCI_USBCMD, XHCI_CMD_INTE|XHCI_CMD_RS); /* Go! */
1.12 jakllsch 967: aprint_debug_dev(sc->sc_dev, "USBCMD %08"PRIx32"\n",
1.1 jakllsch 968: xhci_op_read_4(sc, XHCI_USBCMD));
969:
970: return USBD_NORMAL_COMPLETION;
971: }
972:
973: int
974: xhci_intr(void *v)
975: {
976: struct xhci_softc * const sc = v;
1.25 skrll 977: int ret = 0;
1.1 jakllsch 978:
1.27 skrll 979: XHCIHIST_FUNC(); XHCIHIST_CALLED();
980:
1.25 skrll 981: if (sc == NULL)
1.1 jakllsch 982: return 0;
983:
1.25 skrll 984: mutex_spin_enter(&sc->sc_intr_lock);
985:
986: if (sc->sc_dying || !device_has_power(sc->sc_dev))
987: goto done;
988:
1.1 jakllsch 989: /* If we get an interrupt while polling, then just ignore it. */
1.28.2.5 skrll 990: if (sc->sc_bus.ub_usepolling) {
1.1 jakllsch 991: #ifdef DIAGNOSTIC
1.27 skrll 992: DPRINTFN(16, "ignored interrupt while polling", 0, 0, 0, 0);
1.1 jakllsch 993: #endif
1.25 skrll 994: goto done;
1.1 jakllsch 995: }
996:
1.25 skrll 997: ret = xhci_intr1(sc);
998: done:
999: mutex_spin_exit(&sc->sc_intr_lock);
1000: return ret;
1.1 jakllsch 1001: }
1002:
1003: int
1004: xhci_intr1(struct xhci_softc * const sc)
1005: {
1006: uint32_t usbsts;
1007: uint32_t iman;
1008:
1.27 skrll 1009: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1010:
1.1 jakllsch 1011: usbsts = xhci_op_read_4(sc, XHCI_USBSTS);
1.27 skrll 1012: DPRINTFN(16, "USBSTS %08x", usbsts, 0, 0, 0);
1.1 jakllsch 1013: #if 0
1014: if ((usbsts & (XHCI_STS_EINT|XHCI_STS_PCD)) == 0) {
1015: return 0;
1016: }
1017: #endif
1018: xhci_op_write_4(sc, XHCI_USBSTS,
1019: usbsts & (2|XHCI_STS_EINT|XHCI_STS_PCD)); /* XXX */
1020: usbsts = xhci_op_read_4(sc, XHCI_USBSTS);
1.27 skrll 1021: DPRINTFN(16, "USBSTS %08x", usbsts, 0, 0, 0);
1.1 jakllsch 1022:
1023: iman = xhci_rt_read_4(sc, XHCI_IMAN(0));
1.27 skrll 1024: DPRINTFN(16, "IMAN0 %08x", iman, 0, 0, 0);
1.28.2.19 skrll 1025:
1.28.2.34 skrll 1026: /* XXX 4.17.5 IP may be 0 if MSI/MSI-X is used */
1.28.2.19 skrll 1027: if (!(sc->sc_quirks & XHCI_QUIRK_FORCE_INTR)) {
1028: if ((iman & XHCI_IMAN_INTR_PEND) == 0) {
1029: return 0;
1030: }
1031: }
1032:
1.1 jakllsch 1033: xhci_rt_write_4(sc, XHCI_IMAN(0), iman);
1034: iman = xhci_rt_read_4(sc, XHCI_IMAN(0));
1.27 skrll 1035: DPRINTFN(16, "IMAN0 %08x", iman, 0, 0, 0);
1.1 jakllsch 1036: usbsts = xhci_op_read_4(sc, XHCI_USBSTS);
1.27 skrll 1037: DPRINTFN(16, "USBSTS %08x", usbsts, 0, 0, 0);
1.1 jakllsch 1038:
1039: usb_schedsoftintr(&sc->sc_bus);
1040:
1041: return 1;
1042: }
1043:
1.28.2.19 skrll 1044: /*
1045: * 3 port speed types used in USB stack
1046: *
1047: * usbdi speed
1048: * definition: USB_SPEED_* in usb.h
1049: * They are used in struct usbd_device in USB stack.
1050: * ioctl interface uses these values too.
1051: * port_status speed
1052: * definition: UPS_*_SPEED in usb.h
1.28.2.27 skrll 1053: * They are used in usb_port_status_t and valid only for USB 2.0.
1.28.2.28 skrll 1054: * Speed value is always 0 for Super Speed or more, and dwExtPortStatus
1055: * of usb_port_status_ext_t indicates port speed.
1.28.2.27 skrll 1056: * Note that some 3.0 values overlap with 2.0 values.
1.28.2.19 skrll 1057: * (e.g. 0x200 means UPS_POER_POWER_SS in SS and
1058: * means UPS_LOW_SPEED in HS.)
1.28.2.28 skrll 1059: * port status returned from hub also uses these values.
1060: * On NetBSD UPS_OTHER_SPEED indicates port speed is super speed
1061: * or more.
1.28.2.19 skrll 1062: * xspeed:
1063: * definition: Protocol Speed ID (PSI) (xHCI 1.1 7.2.1)
1064: * They are used in only slot context and PORTSC reg of xhci.
1.28.2.27 skrll 1065: * The difference between usbdi speed and xspeed is
1066: * that FS and LS values are swapped.
1.28.2.19 skrll 1067: */
1068:
1.28.2.27 skrll 1069: /* convert usbdi speed to xspeed */
1.28.2.19 skrll 1070: static int
1071: xhci_speed2xspeed(int speed)
1072: {
1073: switch (speed) {
1074: case USB_SPEED_LOW: return 2;
1075: case USB_SPEED_FULL: return 1;
1.28.2.27 skrll 1076: default: return speed;
1077: }
1078: }
1079:
1.28.2.46 skrll 1080: #if 0
1.28.2.27 skrll 1081: /* convert xspeed to usbdi speed */
1082: static int
1083: xhci_xspeed2speed(int xspeed)
1084: {
1085: switch (xspeed) {
1086: case 1: return USB_SPEED_FULL;
1087: case 2: return USB_SPEED_LOW;
1088: default: return xspeed;
1089: }
1090: }
1.28.2.46 skrll 1091: #endif
1.28.2.27 skrll 1092:
1093: /* convert xspeed to port status speed */
1094: static int
1095: xhci_xspeed2psspeed(int xspeed)
1096: {
1097: switch (xspeed) {
1098: case 0: return 0;
1099: case 1: return UPS_FULL_SPEED;
1100: case 2: return UPS_LOW_SPEED;
1101: case 3: return UPS_HIGH_SPEED;
1102: default: return UPS_OTHER_SPEED;
1.28.2.19 skrll 1103: }
1104: }
1105:
1106: /* construct slot context */
1107: static void
1108: xhci_setup_sctx(struct usbd_device *dev, uint32_t *cp)
1109: {
1110: usb_device_descriptor_t * const dd = &dev->ud_ddesc;
1111: int speed = dev->ud_speed;
1112: int tthubslot, ttportnum;
1113: bool ishub;
1114: bool usemtt;
1115:
1116: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1117:
1118: /*
1.28.2.37 skrll 1119: * 6.2.2, Table 57-60, 6.2.2.1, 6.2.2.2
1.28.2.19 skrll 1120: * tthubslot:
1121: * This is the slot ID of parent HS hub
1122: * if LS/FS device is connected && connected through HS hub.
1123: * This is 0 if device is not LS/FS device ||
1124: * parent hub is not HS hub ||
1125: * attached to root hub.
1126: * ttportnum:
1127: * This is the downstream facing port of parent HS hub
1128: * if LS/FS device is connected.
1129: * This is 0 if device is not LS/FS device ||
1130: * parent hub is not HS hub ||
1131: * attached to root hub.
1132: */
1133: if (dev->ud_myhsport != NULL &&
1134: dev->ud_myhub != NULL && dev->ud_myhub->ud_depth != 0 &&
1135: (dev->ud_myhub != NULL &&
1136: dev->ud_myhub->ud_speed == USB_SPEED_HIGH) &&
1137: (speed == USB_SPEED_LOW || speed == USB_SPEED_FULL)) {
1138: ttportnum = dev->ud_myhsport->up_portno;
1139: tthubslot = dev->ud_myhsport->up_parent->ud_addr;
1140: } else {
1141: ttportnum = 0;
1142: tthubslot = 0;
1143: }
1144: DPRINTFN(4, "myhsport %p ttportnum=%d tthubslot=%d",
1145: dev->ud_myhsport, ttportnum, tthubslot, 0);
1146:
1147: /* ishub is valid after reading UDESC_DEVICE */
1148: ishub = (dd->bDeviceClass == UDCLASS_HUB);
1149:
1150: /* dev->ud_hub is valid after reading UDESC_HUB */
1151: if (ishub && dev->ud_hub) {
1152: usb_hub_descriptor_t *hd = &dev->ud_hub->uh_hubdesc;
1153:
1154: cp[1] |= htole32(XHCI_SCTX_1_NUM_PORTS_SET(hd->bNbrPorts));
1155: cp[2] |= htole32(XHCI_SCTX_2_TT_THINK_TIME_SET(
1156: __SHIFTOUT(UGETW(hd->wHubCharacteristics), UHD_TT_THINK)));
1157: DPRINTFN(4, "nports=%d ttt=%d",
1158: hd->bNbrPorts, XHCI_SCTX_2_TT_THINK_TIME_GET(cp[2]), 0, 0);
1159: }
1160:
1161: #define IS_TTHUB(dd) \
1162: ((dd)->bDeviceProtocol == UDPROTO_HSHUBSTT || \
1163: (dd)->bDeviceProtocol == UDPROTO_HSHUBMTT)
1164:
1165: /*
1166: * MTT flag is set if
1167: * 1. this is HS hub && MTT is enabled
1168: * or
1169: * 2. this is not hub && this is LS or FS device &&
1170: * MTT of parent HS hub (and its parent, too) is enabled
1171: */
1172: if (ishub && speed == USB_SPEED_HIGH && IS_TTHUB(dd))
1173: usemtt = true;
1174: else if (!ishub &&
1175: (speed == USB_SPEED_LOW || speed == USB_SPEED_FULL) &&
1176: dev->ud_myhub != NULL && dev->ud_myhub->ud_depth != 0 &&
1177: (dev->ud_myhub != NULL &&
1178: dev->ud_myhub->ud_speed == USB_SPEED_HIGH) &&
1179: dev->ud_myhsport != NULL &&
1180: IS_TTHUB(&dev->ud_myhsport->up_parent->ud_ddesc))
1181: usemtt = true;
1182: else
1183: usemtt = false;
1184: DPRINTFN(4, "class %u proto %u ishub %d usemtt %d",
1185: dd->bDeviceClass, dd->bDeviceProtocol, ishub, usemtt);
1186:
1187: cp[0] |= htole32(
1188: XHCI_SCTX_0_SPEED_SET(xhci_speed2xspeed(speed)) |
1189: XHCI_SCTX_0_HUB_SET(ishub ? 1 : 0) |
1190: XHCI_SCTX_0_MTT_SET(usemtt ? 1 : 0)
1191: );
1192: cp[1] |= htole32(0);
1193: cp[2] |= htole32(
1194: XHCI_SCTX_2_IRQ_TARGET_SET(0) |
1195: XHCI_SCTX_2_TT_HUB_SID_SET(tthubslot) |
1196: XHCI_SCTX_2_TT_PORT_NUM_SET(ttportnum)
1197: );
1198: cp[3] |= htole32(0);
1199: }
1200:
1.28.2.37 skrll 1201: static uint32_t
1202: xhci_get_maxburst(struct usbd_pipe *pipe)
1203: {
1204: usb_endpoint_descriptor_t * const ed = pipe->up_endpoint->ue_edesc;
1205: usbd_desc_iter_t iter;
1206: const usb_cdc_descriptor_t *cdcd;
1207: const usb_endpoint_ss_comp_descriptor_t * esscd = NULL;
1208: uint32_t maxb = 0;
1209: uint8_t ep;
1210:
1211: cdcd = (const usb_cdc_descriptor_t *)usb_find_desc(
1212: pipe->up_dev, UDESC_INTERFACE, USBD_CDCSUBTYPE_ANY);
1213: usb_desc_iter_init(pipe->up_dev, &iter);
1214: iter.cur = (const void *)cdcd;
1215:
1216: /* find endpoint_ss_comp desc for ep of this pipe */
1217: for (ep = 0;;) {
1218: cdcd = (const usb_cdc_descriptor_t *)usb_desc_iter_next(&iter);
1219: if (cdcd == NULL)
1220: break;
1221: if (ep == 0 && cdcd->bDescriptorType == UDESC_ENDPOINT) {
1222: ep = ((const usb_endpoint_descriptor_t *)cdcd)->
1223: bEndpointAddress;
1224: if (UE_GET_ADDR(ep) ==
1225: UE_GET_ADDR(ed->bEndpointAddress)) {
1226: cdcd = (const usb_cdc_descriptor_t *)
1227: usb_desc_iter_next(&iter);
1228: break;
1229: }
1230: ep = 0;
1231: }
1232: }
1233: if (cdcd != NULL && cdcd->bDescriptorType == UDESC_ENDPOINT_SS_COMP) {
1234: esscd = (const usb_endpoint_ss_comp_descriptor_t *)cdcd;
1235: maxb = esscd->bMaxBurst;
1236: }
1237:
1238: return maxb;
1239: }
1240:
1.28.2.20 skrll 1241: /*
1.28.2.37 skrll 1242: * Convert endpoint bInterval value to endpoint context interval value
1243: * for Interrupt pipe.
1244: * xHCI 6.2.3.6 Table 65, USB 2.0 9.6.6
1.28.2.20 skrll 1245: */
1.28.2.37 skrll 1246: static uint32_t
1247: xhci_bival2ival(uint32_t ival, int speed)
1248: {
1249: if (speed == USB_SPEED_LOW || speed == USB_SPEED_FULL) {
1250: int i;
1251:
1252: /*
1253: * round ival down to "the nearest base 2 multiple of
1254: * bInterval * 8".
1255: * bInterval is at most 255 as its type is uByte.
1256: * 255(ms) = 2040(x 125us) < 2^11, so start with 10.
1257: */
1258: for (i = 10; i > 0; i--) {
1259: if ((ival * 8) >= (1 << i))
1260: break;
1261: }
1262: ival = i;
1263: } else {
1264: /* Interval = bInterval-1 for SS/HS */
1265: ival--;
1266: }
1267:
1268: return ival;
1269: }
1270:
1271: /*
1272: * 4.8.2, 6.2.3.2
1273: * construct common endpoint parameters
1274: */
1275: static void
1276: xhci_setup_endp_ctx(struct usbd_pipe *pipe, uint32_t *cp)
1.1 jakllsch 1277: {
1.28.2.5 skrll 1278: struct xhci_slot * const xs = pipe->up_dev->ud_hcpriv;
1279: usb_endpoint_descriptor_t * const ed = pipe->up_endpoint->ue_edesc;
1.28.2.37 skrll 1280: const u_int dci = xhci_ep_get_dci(ed);
1.1 jakllsch 1281: const uint8_t xfertype = UE_GET_XFERTYPE(ed->bmAttributes);
1.28.2.19 skrll 1282: uint32_t mps = UGETW(ed->wMaxPacketSize);
1283: uint32_t maxb = 0;
1284: int speed = pipe->up_dev->ud_speed;
1285: uint32_t ival = ed->bInterval;
1.1 jakllsch 1286:
1.28.2.19 skrll 1287: cp[0] = htole32(
1288: XHCI_EPCTX_0_EPSTATE_SET(0) |
1.28.2.37 skrll 1289: XHCI_EPCTX_0_MULT_SET(0) | /* always 0 except SS iscoh */
1.28.2.19 skrll 1290: XHCI_EPCTX_0_MAXP_STREAMS_SET(0) |
1.28.2.37 skrll 1291: XHCI_EPCTX_0_LSA_SET(0) |
1292: XHCI_EPCTX_0_MAX_ESIT_PAYLOAD_HI_SET(0)
1.28.2.19 skrll 1293: );
1294: cp[1] = htole32(
1295: XHCI_EPCTX_1_EPTYPE_SET(xhci_ep_get_type(ed)) |
1.28.2.37 skrll 1296: XHCI_EPCTX_1_HID_SET(0) |
1.28.2.19 skrll 1297: XHCI_EPCTX_1_MAXB_SET(0)
1298: );
1299: if (xfertype != UE_ISOCHRONOUS)
1300: cp[1] |= htole32(XHCI_EPCTX_1_CERR_SET(3));
1301:
1.28.2.37 skrll 1302: /* 6.2.3.4, 4.8.2.4 */
1.28.2.27 skrll 1303: if (USB_IS_SS(speed)) {
1.28.2.37 skrll 1304: /* UBS 3.1 9.6.6 */
1305: cp[1] |= htole32(XHCI_EPCTX_1_MAXP_SIZE_SET(mps));
1306: /* UBS 3.1 9.6.7 */
1307: maxb = xhci_get_maxburst(pipe);
1308: cp[1] |= htole32(XHCI_EPCTX_1_MAXB_SET(maxb));
1309: } else {
1310: /* UBS 2.0 9.6.6 */
1311: cp[1] |= htole32(XHCI_EPCTX_1_MAXP_SIZE_SET(UE_GET_SIZE(mps)));
1312:
1313: /* 6.2.3.4 */
1314: if (speed == USB_SPEED_HIGH &&
1315: (xfertype == UE_ISOCHRONOUS || xfertype == UE_INTERRUPT)) {
1316: maxb = UE_GET_TRANS(mps);
1317: } else {
1318: /* LS/FS or HS CTRL or HS BULK */
1319: maxb = 0;
1.28.2.19 skrll 1320: }
1321: cp[1] |= htole32(XHCI_EPCTX_1_MAXB_SET(maxb));
1322: }
1323:
1.28.2.37 skrll 1324: if (xfertype == UE_CONTROL)
1325: cp[4] = htole32(XHCI_EPCTX_4_AVG_TRB_LEN_SET(8)); /* 6.2.3 */
1326: else if (USB_IS_SS(speed))
1327: cp[4] = htole32(XHCI_EPCTX_4_AVG_TRB_LEN_SET(mps));
1328: else
1329: cp[4] = htole32(XHCI_EPCTX_4_AVG_TRB_LEN_SET(UE_GET_SIZE(mps)));
1330:
1.28.2.19 skrll 1331: switch (xfertype) {
1.28.2.37 skrll 1332: case UE_CONTROL:
1333: break;
1334: case UE_BULK:
1335: /* XXX Set MaxPStreams, HID, and LSA if streams enabled */
1336: break;
1.28.2.19 skrll 1337: case UE_INTERRUPT:
1.28.2.30 skrll 1338: if (pipe->up_interval != USBD_DEFAULT_INTERVAL)
1339: ival = pipe->up_interval;
1340:
1.28.2.37 skrll 1341: ival = xhci_bival2ival(ival, speed);
1.28.2.19 skrll 1342: cp[0] |= htole32(XHCI_EPCTX_0_IVAL_SET(ival));
1343: break;
1344: case UE_ISOCHRONOUS:
1.28.2.37 skrll 1345: if (pipe->up_interval != USBD_DEFAULT_INTERVAL)
1346: ival = pipe->up_interval;
1347:
1348: /* xHCI 6.2.3.6 Table 65, USB 2.0 9.6.6 */
1.28.2.30 skrll 1349: if (speed == USB_SPEED_FULL)
1350: ival += 3; /* 1ms -> 125us */
1351: ival--;
1.28.2.37 skrll 1352: cp[0] |= htole32(XHCI_EPCTX_0_IVAL_SET(ival));
1.28.2.30 skrll 1353:
1.28.2.27 skrll 1354: if (USB_IS_SS(speed)) {
1.28.2.37 skrll 1355: /* XXX if LEC = 1, set ESIT instead */
1356: cp[0] |= htole32(XHCI_EPCTX_0_MULT_SET(0));
1.28.2.19 skrll 1357: }
1358: break;
1359: default:
1360: break;
1.1 jakllsch 1361: }
1362: *(uint64_t *)(&cp[2]) = htole64(
1363: xhci_ring_trbp(&xs->xs_ep[dci].xe_tr, 0) |
1364: XHCI_EPCTX_2_DCS_SET(1));
1.28.2.37 skrll 1365: }
1366:
1367: /*
1368: * Construct input contexts and issue TRB
1369: */
1370: static usbd_status
1371: xhci_configure_endpoint(struct usbd_pipe *pipe)
1372: {
1.28.2.42 skrll 1373: struct xhci_softc * const sc = XHCI_PIPE2SC(pipe);
1.28.2.37 skrll 1374: struct xhci_slot * const xs = pipe->up_dev->ud_hcpriv;
1375: const u_int dci = xhci_ep_get_dci(pipe->up_endpoint->ue_edesc);
1376: struct xhci_trb trb;
1377: usbd_status err;
1378: uint32_t *cp;
1379:
1380: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1381: DPRINTFN(4, "slot %u dci %u epaddr 0x%02x attr 0x%02x",
1382: xs->xs_idx, dci, pipe->up_endpoint->ue_edesc->bEndpointAddress,
1383: pipe->up_endpoint->ue_edesc->bmAttributes);
1384:
1385: /* XXX ensure input context is available? */
1386:
1387: memset(xhci_slot_get_icv(sc, xs, 0), 0, sc->sc_pgsz);
1388:
1389: cp = xhci_slot_get_icv(sc, xs, XHCI_ICI_INPUT_CONTROL);
1390: cp[0] = htole32(0);
1391: cp[1] = htole32(XHCI_INCTX_1_ADD_MASK(dci));
1392:
1393: /* set up input slot context */
1394: cp = xhci_slot_get_icv(sc, xs, xhci_dci_to_ici(XHCI_DCI_SLOT));
1395: xhci_setup_sctx(pipe->up_dev, cp);
1396: cp[0] |= htole32(XHCI_SCTX_0_CTX_NUM_SET(dci));
1397:
1398: /* set up input endpoint context */
1399: cp = xhci_slot_get_icv(sc, xs, xhci_dci_to_ici(dci));
1400: xhci_setup_endp_ctx(pipe, cp);
1.1 jakllsch 1401:
1402: /* sync input contexts before they are read from memory */
1403: usb_syncmem(&xs->xs_ic_dma, 0, sc->sc_pgsz, BUS_DMASYNC_PREWRITE);
1404: hexdump("input control context", xhci_slot_get_icv(sc, xs, 0),
1405: sc->sc_ctxsz * 1);
1406: hexdump("input endpoint context", xhci_slot_get_icv(sc, xs,
1407: xhci_dci_to_ici(dci)), sc->sc_ctxsz * 1);
1408:
1409: trb.trb_0 = xhci_slot_get_icp(sc, xs, 0);
1410: trb.trb_2 = 0;
1411: trb.trb_3 = XHCI_TRB_3_SLOT_SET(xs->xs_idx) |
1412: XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_CONFIGURE_EP);
1413:
1414: err = xhci_do_command(sc, &trb, USBD_DEFAULT_TIMEOUT);
1415:
1416: usb_syncmem(&xs->xs_dc_dma, 0, sc->sc_pgsz, BUS_DMASYNC_POSTREAD);
1417: hexdump("output context", xhci_slot_get_dcv(sc, xs, dci),
1418: sc->sc_ctxsz * 1);
1419:
1420: return err;
1421: }
1422:
1.28.2.19 skrll 1423: #if 0
1.1 jakllsch 1424: static usbd_status
1.28.2.14 skrll 1425: xhci_unconfigure_endpoint(struct usbd_pipe *pipe)
1.1 jakllsch 1426: {
1.27 skrll 1427: #ifdef USB_DEBUG
1.28.2.5 skrll 1428: struct xhci_slot * const xs = pipe->up_dev->ud_hcpriv;
1.27 skrll 1429: #endif
1430:
1431: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1432: DPRINTFN(4, "slot %u", xs->xs_idx, 0, 0, 0);
1433:
1.1 jakllsch 1434: return USBD_NORMAL_COMPLETION;
1435: }
1.28.2.19 skrll 1436: #endif
1.1 jakllsch 1437:
1.28.2.20 skrll 1438: /* 4.6.8, 6.4.3.7 */
1.1 jakllsch 1439: static usbd_status
1.28.2.14 skrll 1440: xhci_reset_endpoint(struct usbd_pipe *pipe)
1.1 jakllsch 1441: {
1.28.2.42 skrll 1442: struct xhci_softc * const sc = XHCI_PIPE2SC(pipe);
1.28.2.5 skrll 1443: struct xhci_slot * const xs = pipe->up_dev->ud_hcpriv;
1444: const u_int dci = xhci_ep_get_dci(pipe->up_endpoint->ue_edesc);
1.1 jakllsch 1445: struct xhci_trb trb;
1446: usbd_status err;
1447:
1.27 skrll 1448: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.28.2.19 skrll 1449: DPRINTFN(4, "slot %u dci %u", xs->xs_idx, dci, 0, 0);
1450:
1451: KASSERT(!mutex_owned(&sc->sc_lock));
1.1 jakllsch 1452:
1453: trb.trb_0 = 0;
1454: trb.trb_2 = 0;
1455: trb.trb_3 = XHCI_TRB_3_SLOT_SET(xs->xs_idx) |
1456: XHCI_TRB_3_EP_SET(dci) |
1457: XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_RESET_EP);
1458:
1459: err = xhci_do_command(sc, &trb, USBD_DEFAULT_TIMEOUT);
1460:
1461: return err;
1462: }
1463:
1.28.2.20 skrll 1464: /*
1465: * 4.6.9, 6.4.3.8
1466: * Stop execution of TDs on xfer ring.
1467: * Should be called with sc_lock held.
1468: */
1.1 jakllsch 1469: static usbd_status
1.28.2.14 skrll 1470: xhci_stop_endpoint(struct usbd_pipe *pipe)
1.1 jakllsch 1471: {
1.28.2.42 skrll 1472: struct xhci_softc * const sc = XHCI_PIPE2SC(pipe);
1.28.2.5 skrll 1473: struct xhci_slot * const xs = pipe->up_dev->ud_hcpriv;
1.1 jakllsch 1474: struct xhci_trb trb;
1475: usbd_status err;
1.28.2.5 skrll 1476: const u_int dci = xhci_ep_get_dci(pipe->up_endpoint->ue_edesc);
1.1 jakllsch 1477:
1.27 skrll 1478: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.28.2.19 skrll 1479: DPRINTFN(4, "slot %u dci %u", xs->xs_idx, dci, 0, 0);
1480:
1481: KASSERT(mutex_owned(&sc->sc_lock));
1.1 jakllsch 1482:
1483: trb.trb_0 = 0;
1484: trb.trb_2 = 0;
1485: trb.trb_3 = XHCI_TRB_3_SLOT_SET(xs->xs_idx) |
1486: XHCI_TRB_3_EP_SET(dci) |
1487: XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_STOP_EP);
1488:
1.28.2.19 skrll 1489: err = xhci_do_command_locked(sc, &trb, USBD_DEFAULT_TIMEOUT);
1.1 jakllsch 1490:
1491: return err;
1492: }
1493:
1.28.2.20 skrll 1494: /*
1495: * Set TR Dequeue Pointer.
1496: * xCHI 1.1 4.6.10 6.4.3.9
1.28.2.21 skrll 1497: * Purge all of the transfer requests on ring.
1.28.2.31 skrll 1498: * EPSTATE of endpoint must be ERROR or STOPPED, or CONTEXT_STATE error.
1.28.2.20 skrll 1499: */
1.1 jakllsch 1500: static usbd_status
1.28.2.14 skrll 1501: xhci_set_dequeue(struct usbd_pipe *pipe)
1.1 jakllsch 1502: {
1.28.2.42 skrll 1503: struct xhci_softc * const sc = XHCI_PIPE2SC(pipe);
1.28.2.5 skrll 1504: struct xhci_slot * const xs = pipe->up_dev->ud_hcpriv;
1505: const u_int dci = xhci_ep_get_dci(pipe->up_endpoint->ue_edesc);
1.1 jakllsch 1506: struct xhci_ring * const xr = &xs->xs_ep[dci].xe_tr;
1507: struct xhci_trb trb;
1508: usbd_status err;
1509:
1.27 skrll 1510: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1511: DPRINTFN(4, "slot %u dci %u", xs->xs_idx, dci, 0, 0);
1.1 jakllsch 1512:
1513: memset(xr->xr_trb, 0, xr->xr_ntrb * XHCI_TRB_SIZE);
1514: usb_syncmem(&xr->xr_dma, 0, xr->xr_ntrb * XHCI_TRB_SIZE,
1515: BUS_DMASYNC_PREWRITE);
1.28.2.37 skrll 1516: memset(xr->xr_cookies, 0, xr->xr_ntrb * sizeof(*xr->xr_cookies));
1.1 jakllsch 1517:
1518: xr->xr_ep = 0;
1519: xr->xr_cs = 1;
1520:
1.28.2.20 skrll 1521: /* set DCS */
1.1 jakllsch 1522: trb.trb_0 = xhci_ring_trbp(xr, 0) | 1; /* XXX */
1523: trb.trb_2 = 0;
1524: trb.trb_3 = XHCI_TRB_3_SLOT_SET(xs->xs_idx) |
1525: XHCI_TRB_3_EP_SET(dci) |
1526: XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_SET_TR_DEQUEUE);
1527:
1528: err = xhci_do_command(sc, &trb, USBD_DEFAULT_TIMEOUT);
1529:
1530: return err;
1531: }
1532:
1.28.2.20 skrll 1533: /*
1534: * Open new pipe: called from usbd_setup_pipe_flags.
1535: * Fills methods of pipe.
1536: * If pipe is not for ep0, calls configure_endpoint.
1537: */
1.1 jakllsch 1538: static usbd_status
1.28.2.14 skrll 1539: xhci_open(struct usbd_pipe *pipe)
1.1 jakllsch 1540: {
1.28.2.18 skrll 1541: struct usbd_device * const dev = pipe->up_dev;
1.28.2.42 skrll 1542: struct xhci_softc * const sc = XHCI_BUS2SC(dev->ud_bus);
1.28.2.5 skrll 1543: usb_endpoint_descriptor_t * const ed = pipe->up_endpoint->ue_edesc;
1.1 jakllsch 1544: const uint8_t xfertype = UE_GET_XFERTYPE(ed->bmAttributes);
1545:
1.27 skrll 1546: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1547: DPRINTFN(1, "addr %d depth %d port %d speed %d",
1.28.2.19 skrll 1548: dev->ud_addr, dev->ud_depth, dev->ud_powersrc->up_portno,
1549: dev->ud_speed);
1.1 jakllsch 1550:
1551: if (sc->sc_dying)
1552: return USBD_IOERROR;
1553:
1554: /* Root Hub */
1.28.2.19 skrll 1555: if (dev->ud_depth == 0 && dev->ud_powersrc->up_portno == 0) {
1.1 jakllsch 1556: switch (ed->bEndpointAddress) {
1557: case USB_CONTROL_ENDPOINT:
1.28.2.12 skrll 1558: pipe->up_methods = &roothub_ctrl_methods;
1.1 jakllsch 1559: break;
1.28.2.12 skrll 1560: case UE_DIR_IN | USBROOTHUB_INTR_ENDPT:
1.28.2.5 skrll 1561: pipe->up_methods = &xhci_root_intr_methods;
1.1 jakllsch 1562: break;
1563: default:
1.28.2.5 skrll 1564: pipe->up_methods = NULL;
1.27 skrll 1565: DPRINTFN(0, "bad bEndpointAddress 0x%02x",
1566: ed->bEndpointAddress, 0, 0, 0);
1.1 jakllsch 1567: return USBD_INVAL;
1568: }
1569: return USBD_NORMAL_COMPLETION;
1570: }
1571:
1572: switch (xfertype) {
1573: case UE_CONTROL:
1.28.2.5 skrll 1574: pipe->up_methods = &xhci_device_ctrl_methods;
1.1 jakllsch 1575: break;
1576: case UE_ISOCHRONOUS:
1.28.2.5 skrll 1577: pipe->up_methods = &xhci_device_isoc_methods;
1.1 jakllsch 1578: return USBD_INVAL;
1579: break;
1580: case UE_BULK:
1.28.2.5 skrll 1581: pipe->up_methods = &xhci_device_bulk_methods;
1.1 jakllsch 1582: break;
1583: case UE_INTERRUPT:
1.28.2.5 skrll 1584: pipe->up_methods = &xhci_device_intr_methods;
1.1 jakllsch 1585: break;
1586: default:
1587: return USBD_IOERROR;
1588: break;
1589: }
1590:
1591: if (ed->bEndpointAddress != USB_CONTROL_ENDPOINT)
1.28.2.19 skrll 1592: return xhci_configure_endpoint(pipe);
1.1 jakllsch 1593:
1594: return USBD_NORMAL_COMPLETION;
1595: }
1596:
1.28.2.20 skrll 1597: /*
1598: * Closes pipe, called from usbd_kill_pipe via close methods.
1599: * If the endpoint to be closed is ep0, disable_slot.
1600: * Should be called with sc_lock held.
1601: */
1.28.2.33 skrll 1602: static void
1.28.2.19 skrll 1603: xhci_close_pipe(struct usbd_pipe *pipe)
1604: {
1.28.2.42 skrll 1605: struct xhci_softc * const sc = XHCI_PIPE2SC(pipe);
1.28.2.19 skrll 1606: struct xhci_slot * const xs = pipe->up_dev->ud_hcpriv;
1607: usb_endpoint_descriptor_t * const ed = pipe->up_endpoint->ue_edesc;
1608: const u_int dci = xhci_ep_get_dci(ed);
1609: struct xhci_trb trb;
1610: uint32_t *cp;
1611:
1612: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1613:
1614: if (sc->sc_dying)
1.28.2.33 skrll 1615: return;
1.28.2.19 skrll 1616:
1617: if (xs == NULL || xs->xs_idx == 0)
1618: /* xs is uninitialized before xhci_init_slot */
1.28.2.33 skrll 1619: return;
1.28.2.19 skrll 1620:
1.28.2.37 skrll 1621: DPRINTFN(4, "pipe %p slot %u dci %u", pipe, xs->xs_idx, dci, 0);
1.28.2.19 skrll 1622:
1623: KASSERTMSG(!cpu_intr_p() && !cpu_softintr_p(), "called from intr ctx");
1624: KASSERT(mutex_owned(&sc->sc_lock));
1625:
1626: if (pipe->up_dev->ud_depth == 0)
1.28.2.33 skrll 1627: return;
1.28.2.19 skrll 1628:
1629: if (dci == XHCI_DCI_EP_CONTROL) {
1630: DPRINTFN(4, "closing ep0", 0, 0, 0, 0);
1.28.2.33 skrll 1631: xhci_disable_slot(sc, xs->xs_idx);
1632: return;
1.28.2.19 skrll 1633: }
1634:
1.28.2.20 skrll 1635: /*
1636: * This may fail in the case that xhci_close_pipe is called after
1637: * xhci_abort_xfer e.g. usbd_kill_pipe.
1638: */
1.28.2.19 skrll 1639: (void)xhci_stop_endpoint(pipe);
1640:
1641: /*
1642: * set appropriate bit to be dropped.
1643: * don't set DC bit to 1, otherwise all endpoints
1644: * would be deconfigured.
1645: */
1646: cp = xhci_slot_get_icv(sc, xs, XHCI_ICI_INPUT_CONTROL);
1647: cp[0] = htole32(XHCI_INCTX_0_DROP_MASK(dci));
1648: cp[1] = htole32(0);
1649:
1650: /* XXX should be most significant one, not dci? */
1651: cp = xhci_slot_get_icv(sc, xs, xhci_dci_to_ici(XHCI_DCI_SLOT));
1652: cp[0] = htole32(XHCI_SCTX_0_CTX_NUM_SET(dci));
1653:
1654: /* sync input contexts before they are read from memory */
1655: usb_syncmem(&xs->xs_ic_dma, 0, sc->sc_pgsz, BUS_DMASYNC_PREWRITE);
1656:
1657: trb.trb_0 = xhci_slot_get_icp(sc, xs, 0);
1658: trb.trb_2 = 0;
1659: trb.trb_3 = XHCI_TRB_3_SLOT_SET(xs->xs_idx) |
1660: XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_CONFIGURE_EP);
1661:
1.28.2.35 skrll 1662: (void)xhci_do_command_locked(sc, &trb, USBD_DEFAULT_TIMEOUT);
1.28.2.19 skrll 1663: usb_syncmem(&xs->xs_dc_dma, 0, sc->sc_pgsz, BUS_DMASYNC_POSTREAD);
1664: }
1665:
1.28.2.20 skrll 1666: /*
1667: * Abort transfer.
1668: * Called with sc_lock held.
1669: * May be called from softintr context.
1670: */
1.28.2.19 skrll 1671: static void
1672: xhci_abort_xfer(struct usbd_xfer *xfer, usbd_status status)
1673: {
1.28.2.42 skrll 1674: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.28.2.19 skrll 1675:
1676: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1677: DPRINTFN(4, "xfer %p pipe %p status %d",
1678: xfer, xfer->ux_pipe, status, 0);
1679:
1680: KASSERT(mutex_owned(&sc->sc_lock));
1681:
1682: if (sc->sc_dying) {
1683: /* If we're dying, just do the software part. */
1684: DPRINTFN(4, "dying", 0, 0, 0, 0);
1685: xfer->ux_status = status; /* make software ignore it */
1686: callout_stop(&xfer->ux_callout);
1687: usb_transfer_complete(xfer);
1688: return;
1689: }
1690:
1691: /* XXX need more stuff */
1692: xfer->ux_status = status;
1693: callout_stop(&xfer->ux_callout);
1694: usb_transfer_complete(xfer);
1.28.2.37 skrll 1695: DPRINTFN(14, "end", 0, 0, 0, 0);
1.28.2.19 skrll 1696:
1697: KASSERT(mutex_owned(&sc->sc_lock));
1698: }
1699:
1.28.2.21 skrll 1700: /*
1701: * Recover STALLed endpoint.
1702: * xHCI 1.1 sect 4.10.2.1
1703: * Issue RESET_EP to recover halt condition and SET_TR_DEQUEUE to remove
1704: * all transfers on transfer ring.
1705: * These are done in thread context asynchronously.
1706: */
1.28.2.19 skrll 1707: static void
1708: xhci_clear_endpoint_stall_async_task(void *cookie)
1709: {
1710: struct usbd_xfer * const xfer = cookie;
1.28.2.42 skrll 1711: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.28.2.19 skrll 1712: struct xhci_slot * const xs = xfer->ux_pipe->up_dev->ud_hcpriv;
1713: const u_int dci = xhci_ep_get_dci(xfer->ux_pipe->up_endpoint->ue_edesc);
1714: struct xhci_ring * const tr = &xs->xs_ep[dci].xe_tr;
1715:
1716: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1717: DPRINTFN(4, "xfer %p slot %u dci %u", xfer, xs->xs_idx, dci, 0);
1718:
1719: xhci_reset_endpoint(xfer->ux_pipe);
1720: xhci_set_dequeue(xfer->ux_pipe);
1721:
1722: mutex_enter(&sc->sc_lock);
1723: tr->is_halted = false;
1724: usb_transfer_complete(xfer);
1725: mutex_exit(&sc->sc_lock);
1726: DPRINTFN(4, "ends", 0, 0, 0, 0);
1727: }
1728:
1729: static usbd_status
1730: xhci_clear_endpoint_stall_async(struct usbd_xfer *xfer)
1731: {
1.28.2.42 skrll 1732: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.28.2.22 skrll 1733: struct xhci_pipe * const xp = (struct xhci_pipe *)xfer->ux_pipe;
1.28.2.19 skrll 1734:
1735: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1736: DPRINTFN(4, "xfer %p", xfer, 0, 0, 0);
1737:
1738: if (sc->sc_dying) {
1739: return USBD_IOERROR;
1740: }
1741:
1.28.2.22 skrll 1742: usb_init_task(&xp->xp_async_task,
1.28.2.19 skrll 1743: xhci_clear_endpoint_stall_async_task, xfer, USB_TASKQ_MPSAFE);
1.28.2.22 skrll 1744: usb_add_task(xfer->ux_pipe->up_dev, &xp->xp_async_task, USB_TASKQ_HC);
1.28.2.19 skrll 1745: DPRINTFN(4, "ends", 0, 0, 0, 0);
1746:
1747: return USBD_NORMAL_COMPLETION;
1748: }
1749:
1.28.2.36 skrll 1750: /* Process roothub port status/change events and notify to uhub_intr. */
1.1 jakllsch 1751: static void
1752: xhci_rhpsc(struct xhci_softc * const sc, u_int port)
1753: {
1.28.2.18 skrll 1754: struct usbd_xfer * const xfer = sc->sc_intrxfer;
1.1 jakllsch 1755: uint8_t *p;
1756:
1.27 skrll 1757: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.28.2.32 skrll 1758: DPRINTFN(4, "xhci%d: port %u status change", device_unit(sc->sc_dev),
1759: port, 0, 0);
1.1 jakllsch 1760:
1761: if (xfer == NULL)
1762: return;
1763:
1.28.2.32 skrll 1764: if (port > sc->sc_maxports)
1765: return;
1766:
1.28.2.5 skrll 1767: p = xfer->ux_buf;
1768: memset(p, 0, xfer->ux_length);
1.1 jakllsch 1769: p[port/NBBY] |= 1 << (port%NBBY);
1.28.2.5 skrll 1770: xfer->ux_actlen = xfer->ux_length;
1771: xfer->ux_status = USBD_NORMAL_COMPLETION;
1.1 jakllsch 1772: usb_transfer_complete(xfer);
1773: }
1774:
1.28.2.36 skrll 1775: /* Process Transfer Events */
1.1 jakllsch 1776: static void
1.28.2.36 skrll 1777: xhci_event_transfer(struct xhci_softc * const sc,
1.27 skrll 1778: const struct xhci_trb * const trb)
1.1 jakllsch 1779: {
1780: uint64_t trb_0;
1781: uint32_t trb_2, trb_3;
1.28.2.36 skrll 1782: uint8_t trbcode;
1783: u_int slot, dci;
1784: struct xhci_slot *xs;
1785: struct xhci_ring *xr;
1786: struct xhci_xfer *xx;
1787: struct usbd_xfer *xfer;
1788: usbd_status err;
1.1 jakllsch 1789:
1.27 skrll 1790: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.1 jakllsch 1791:
1792: trb_0 = le64toh(trb->trb_0);
1793: trb_2 = le32toh(trb->trb_2);
1794: trb_3 = le32toh(trb->trb_3);
1.28.2.36 skrll 1795: trbcode = XHCI_TRB_2_ERROR_GET(trb_2);
1796: slot = XHCI_TRB_3_SLOT_GET(trb_3);
1797: dci = XHCI_TRB_3_EP_GET(trb_3);
1798: xs = &sc->sc_slots[slot];
1799: xr = &xs->xs_ep[dci].xe_tr;
1.1 jakllsch 1800:
1.28.2.36 skrll 1801: /* sanity check */
1.28.2.37 skrll 1802: KASSERTMSG(xs->xs_idx != 0 && xs->xs_idx < sc->sc_maxslots,
1803: "invalid xs_idx %u slot %u", xs->xs_idx, slot);
1.1 jakllsch 1804:
1.28.2.36 skrll 1805: if ((trb_3 & XHCI_TRB_3_ED_BIT) == 0) {
1.28.2.37 skrll 1806: /*
1807: * When ED == 0, trb_0 is physical address of the TRB
1808: * that caused this event. (6.4.2.1)
1809: */
1.28.2.36 skrll 1810: bus_addr_t trbp = xhci_ring_trbp(xr, 0);
1.28.2.32 skrll 1811:
1.28.2.36 skrll 1812: /* trb_0 range sanity check */
1813: if (trb_0 < trbp ||
1814: (trb_0 - trbp) % sizeof(struct xhci_trb) != 0 ||
1815: (trb_0 - trbp) / sizeof(struct xhci_trb) >=
1816: xr->xr_ntrb) {
1817: DPRINTFN(1, "invalid trb_0 0x%"PRIx64" trbp 0x%"PRIx64,
1818: trb_0, trbp, 0, 0);
1819: return;
1.28.2.24 skrll 1820: }
1.28.2.36 skrll 1821: int idx = (trb_0 - trbp) / sizeof(struct xhci_trb);
1822: xx = xr->xr_cookies[idx];
1.28.2.37 skrll 1823:
1824: /*
1825: * If endpoint is stopped between TDs, TRB pointer points at
1826: * next TRB, however, it is not put yet or is a garbage TRB.
1827: * That's why xr_cookies may be NULL or look like broken.
1828: * Note: this ev happens only when hciversion >= 1.0 or
1829: * hciversion == 0.96 and FSE of hcc1 is set.
1830: */
1831: if (xx == NULL || trbcode == XHCI_TRB_ERROR_LENGTH) {
1832: DPRINTFN(1, "xx NULL: #%u: cookie %p: code %u trb_0 %"
1833: PRIx64, idx, xx, trbcode, trb_0);
1834: }
1.28.2.36 skrll 1835: } else {
1.28.2.37 skrll 1836: /* When ED != 0, trb_0 is kaddr of struct xhci_xfer. */
1.28.2.36 skrll 1837: xx = (void *)(uintptr_t)(trb_0 & ~0x3);
1838: }
1839: /* XXX this may not happen */
1840: if (xx == NULL) {
1841: DPRINTFN(1, "xfer done: xx is NULL", 0, 0, 0, 0);
1842: return;
1843: }
1844: xfer = &xx->xx_xfer;
1845: /* XXX this may happen when detaching */
1846: if (xfer == NULL) {
1.28.2.37 skrll 1847: DPRINTFN(1, "xx(%p)->xx_xfer is NULL trb_0 %#"PRIx64,
1848: xx, trb_0, 0, 0);
1.28.2.36 skrll 1849: return;
1850: }
1851: DPRINTFN(14, "xfer %p", xfer, 0, 0, 0);
1852: /* XXX I dunno why this happens */
1.28.2.37 skrll 1853: KASSERTMSG(xfer->ux_pipe != NULL, "xfer(%p)->ux_pipe is NULL", xfer);
1.28.2.36 skrll 1854:
1855: if (!xfer->ux_pipe->up_repeat &&
1856: SIMPLEQ_EMPTY(&xfer->ux_pipe->up_queue)) {
1.28.2.37 skrll 1857: DPRINTFN(1, "xfer(%p)->pipe not queued", xfer, 0, 0, 0);
1.28.2.36 skrll 1858: return;
1859: }
1.1 jakllsch 1860:
1.28.2.37 skrll 1861: /* 4.11.5.2 Event Data TRB */
1.28.2.36 skrll 1862: if ((trb_3 & XHCI_TRB_3_ED_BIT) != 0) {
1.28.2.37 skrll 1863: DPRINTFN(14, "transfer Event Data: 0x%016"PRIx64" 0x%08"PRIx32
1864: " %02x", trb_0, XHCI_TRB_2_REM_GET(trb_2), trbcode, 0);
1.28.2.36 skrll 1865: if ((trb_0 & 0x3) == 0x3) {
1866: xfer->ux_actlen = XHCI_TRB_2_REM_GET(trb_2);
1.1 jakllsch 1867: }
1.28.2.36 skrll 1868: }
1.1 jakllsch 1869:
1.28.2.36 skrll 1870: switch (trbcode) {
1871: case XHCI_TRB_ERROR_SHORT_PKT:
1872: case XHCI_TRB_ERROR_SUCCESS:
1873: xfer->ux_actlen =
1874: xfer->ux_length - XHCI_TRB_2_REM_GET(trb_2);
1875: err = USBD_NORMAL_COMPLETION;
1876: break;
1877: case XHCI_TRB_ERROR_STALL:
1878: case XHCI_TRB_ERROR_BABBLE:
1.28.2.37 skrll 1879: DPRINTFN(1, "ERR %u slot %u dci %u", trbcode, slot, dci, 0);
1.28.2.36 skrll 1880: xr->is_halted = true;
1881: err = USBD_STALLED;
1882: /*
1883: * Stalled endpoints can be recoverd by issuing
1884: * command TRB TYPE_RESET_EP on xHCI instead of
1.28.2.37 skrll 1885: * issuing request CLEAR_FEATURE UF_ENDPOINT_HALT
1.28.2.36 skrll 1886: * on the endpoint. However, this function may be
1887: * called from softint context (e.g. from umass),
1888: * in that case driver gets KASSERT in cv_timedwait
1889: * in xhci_do_command.
1890: * To avoid this, this runs reset_endpoint and
1891: * usb_transfer_complete in usb task thread
1892: * asynchronously (and then umass issues clear
1893: * UF_ENDPOINT_HALT).
1894: */
1895: xfer->ux_status = err;
1896: xhci_clear_endpoint_stall_async(xfer);
1897: return;
1898: default:
1.28.2.37 skrll 1899: DPRINTFN(1, "ERR %u slot %u dci %u", trbcode, slot, dci, 0);
1.28.2.36 skrll 1900: err = USBD_IOERROR;
1901: break;
1902: }
1903: xfer->ux_status = err;
1.1 jakllsch 1904:
1.28.2.36 skrll 1905: if ((trb_3 & XHCI_TRB_3_ED_BIT) != 0) {
1906: if ((trb_0 & 0x3) == 0x0) {
1.1 jakllsch 1907: usb_transfer_complete(xfer);
1908: }
1.28.2.36 skrll 1909: } else {
1910: usb_transfer_complete(xfer);
1911: }
1912: }
1913:
1914: /* Process Command complete events */
1915: static void
1916: xhci_event_cmd(struct xhci_softc * const sc,
1917: const struct xhci_trb * const trb)
1918: {
1919: uint64_t trb_0;
1920: uint32_t trb_2, trb_3;
1921:
1922: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1923:
1924: trb_0 = le64toh(trb->trb_0);
1925: trb_2 = le32toh(trb->trb_2);
1926: trb_3 = le32toh(trb->trb_3);
1.1 jakllsch 1927:
1.28.2.36 skrll 1928: if (trb_0 == sc->sc_command_addr) {
1929: sc->sc_result_trb.trb_0 = trb_0;
1930: sc->sc_result_trb.trb_2 = trb_2;
1931: sc->sc_result_trb.trb_3 = trb_3;
1932: if (XHCI_TRB_2_ERROR_GET(trb_2) !=
1933: XHCI_TRB_ERROR_SUCCESS) {
1934: DPRINTFN(1, "command completion "
1935: "failure: 0x%016"PRIx64" 0x%08"PRIx32" "
1936: "0x%08"PRIx32, trb_0, trb_2, trb_3, 0);
1937: }
1938: cv_signal(&sc->sc_command_cv);
1939: } else {
1940: DPRINTFN(1, "spurious event: %p 0x%016"PRIx64" "
1941: "0x%08"PRIx32" 0x%08"PRIx32, trb, trb_0,
1942: trb_2, trb_3);
1943: }
1944: }
1945:
1946: /*
1947: * Process events.
1948: * called from xhci_softintr
1949: */
1950: static void
1951: xhci_handle_event(struct xhci_softc * const sc,
1952: const struct xhci_trb * const trb)
1953: {
1954: uint64_t trb_0;
1955: uint32_t trb_2, trb_3;
1956:
1957: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1958:
1959: KASSERT(mutex_owned(&sc->sc_lock));
1960:
1961: trb_0 = le64toh(trb->trb_0);
1962: trb_2 = le32toh(trb->trb_2);
1963: trb_3 = le32toh(trb->trb_3);
1964:
1965: DPRINTFN(14, "event: %p 0x%016"PRIx64" 0x%08"PRIx32" 0x%08"PRIx32,
1966: trb, trb_0, trb_2, trb_3);
1967:
1968: /*
1969: * 4.11.3.1, 6.4.2.1
1970: * TRB Pointer is invalid for these completion codes.
1971: */
1972: switch (XHCI_TRB_2_ERROR_GET(trb_2)) {
1973: case XHCI_TRB_ERROR_RING_UNDERRUN:
1974: case XHCI_TRB_ERROR_RING_OVERRUN:
1975: case XHCI_TRB_ERROR_VF_RING_FULL:
1976: return;
1977: default:
1978: if (trb_0 == 0) {
1979: return;
1.1 jakllsch 1980: }
1981: break;
1.28.2.36 skrll 1982: }
1983:
1984: switch (XHCI_TRB_3_TYPE_GET(trb_3)) {
1985: case XHCI_TRB_EVENT_TRANSFER:
1986: xhci_event_transfer(sc, trb);
1987: break;
1.1 jakllsch 1988: case XHCI_TRB_EVENT_CMD_COMPLETE:
1.28.2.36 skrll 1989: xhci_event_cmd(sc, trb);
1.1 jakllsch 1990: break;
1991: case XHCI_TRB_EVENT_PORT_STS_CHANGE:
1992: xhci_rhpsc(sc, (uint32_t)((trb_0 >> 24) & 0xff));
1993: break;
1994: default:
1995: break;
1996: }
1997: }
1998:
1999: static void
2000: xhci_softintr(void *v)
2001: {
1.28.2.18 skrll 2002: struct usbd_bus * const bus = v;
1.28.2.42 skrll 2003: struct xhci_softc * const sc = XHCI_BUS2SC(bus);
1.1 jakllsch 2004: struct xhci_ring * const er = &sc->sc_er;
2005: struct xhci_trb *trb;
2006: int i, j, k;
2007:
1.27 skrll 2008: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.1 jakllsch 2009:
2010: i = er->xr_ep;
2011: j = er->xr_cs;
2012:
1.27 skrll 2013: DPRINTFN(16, "xr_ep %d xr_cs %d", i, j, 0, 0);
2014:
1.1 jakllsch 2015: while (1) {
2016: usb_syncmem(&er->xr_dma, XHCI_TRB_SIZE * i, XHCI_TRB_SIZE,
2017: BUS_DMASYNC_POSTREAD);
2018: trb = &er->xr_trb[i];
2019: k = (le32toh(trb->trb_3) & XHCI_TRB_3_CYCLE_BIT) ? 1 : 0;
2020:
2021: if (j != k)
2022: break;
2023:
2024: xhci_handle_event(sc, trb);
2025:
2026: i++;
2027: if (i == XHCI_EVENT_RING_TRBS) {
2028: i = 0;
2029: j ^= 1;
2030: }
2031: }
2032:
2033: er->xr_ep = i;
2034: er->xr_cs = j;
2035:
2036: xhci_rt_write_8(sc, XHCI_ERDP(0), xhci_ring_trbp(er, er->xr_ep) |
2037: XHCI_ERDP_LO_BUSY);
2038:
1.27 skrll 2039: DPRINTFN(16, "ends", 0, 0, 0, 0);
1.1 jakllsch 2040:
2041: return;
2042: }
2043:
2044: static void
2045: xhci_poll(struct usbd_bus *bus)
2046: {
1.28.2.42 skrll 2047: struct xhci_softc * const sc = XHCI_BUS2SC(bus);
1.1 jakllsch 2048:
1.27 skrll 2049: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.1 jakllsch 2050:
1.25 skrll 2051: mutex_spin_enter(&sc->sc_intr_lock);
1.1 jakllsch 2052: xhci_intr1(sc);
1.25 skrll 2053: mutex_spin_exit(&sc->sc_intr_lock);
1.1 jakllsch 2054:
2055: return;
2056: }
2057:
1.28.2.14 skrll 2058: static struct usbd_xfer *
1.28.2.41 skrll 2059: xhci_allocx(struct usbd_bus *bus, unsigned int nframes)
1.1 jakllsch 2060: {
1.28.2.42 skrll 2061: struct xhci_softc * const sc = XHCI_BUS2SC(bus);
1.28.2.14 skrll 2062: struct usbd_xfer *xfer;
1.1 jakllsch 2063:
1.27 skrll 2064: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.1 jakllsch 2065:
2066: xfer = pool_cache_get(sc->sc_xferpool, PR_NOWAIT);
2067: if (xfer != NULL) {
1.6 skrll 2068: memset(xfer, 0, sizeof(struct xhci_xfer));
1.1 jakllsch 2069: #ifdef DIAGNOSTIC
1.28.2.5 skrll 2070: xfer->ux_state = XFER_BUSY;
1.1 jakllsch 2071: #endif
2072: }
2073:
2074: return xfer;
2075: }
2076:
2077: static void
1.28.2.14 skrll 2078: xhci_freex(struct usbd_bus *bus, struct usbd_xfer *xfer)
1.1 jakllsch 2079: {
1.28.2.42 skrll 2080: struct xhci_softc * const sc = XHCI_BUS2SC(bus);
1.1 jakllsch 2081:
1.27 skrll 2082: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.1 jakllsch 2083:
2084: #ifdef DIAGNOSTIC
1.28.2.5 skrll 2085: if (xfer->ux_state != XFER_BUSY) {
1.27 skrll 2086: DPRINTFN(0, "xfer=%p not busy, 0x%08x",
1.28.2.5 skrll 2087: xfer, xfer->ux_state, 0, 0);
1.1 jakllsch 2088: }
1.28.2.5 skrll 2089: xfer->ux_state = XFER_FREE;
1.1 jakllsch 2090: #endif
2091: pool_cache_put(sc->sc_xferpool, xfer);
2092: }
2093:
2094: static void
2095: xhci_get_lock(struct usbd_bus *bus, kmutex_t **lock)
2096: {
1.28.2.42 skrll 2097: struct xhci_softc * const sc = XHCI_BUS2SC(bus);
1.1 jakllsch 2098:
2099: *lock = &sc->sc_lock;
2100: }
2101:
1.28.2.1 skrll 2102: extern uint32_t usb_cookie_no;
1.1 jakllsch 2103:
1.28.2.20 skrll 2104: /*
1.28.2.38 skrll 2105: * Called if uhub_explore finds a new device (via usbd_new_device).
1.28.2.20 skrll 2106: * Allocate and construct dev structure of default endpoint (ep0).
2107: * Determine initial MaxPacketSize (mps) by speed.
2108: * Determine route string and roothub port for slot of dev.
2109: * Allocate pipe of ep0.
2110: * Enable and initialize slot and Set Address.
2111: * Read device descriptor.
2112: * Register this device.
2113: */
1.1 jakllsch 2114: static usbd_status
1.28.2.14 skrll 2115: xhci_new_device(device_t parent, struct usbd_bus *bus, int depth,
1.1 jakllsch 2116: int speed, int port, struct usbd_port *up)
2117: {
1.28.2.42 skrll 2118: struct xhci_softc * const sc = XHCI_BUS2SC(bus);
1.28.2.14 skrll 2119: struct usbd_device *dev;
1.1 jakllsch 2120: usbd_status err;
2121: usb_device_descriptor_t *dd;
2122: struct usbd_device *hub;
2123: struct usbd_device *adev;
2124: int rhport = 0;
2125: struct xhci_slot *xs;
2126: uint32_t *cp;
1.28.2.19 skrll 2127: uint32_t route = 0;
2128: uint8_t slot = 0;
1.1 jakllsch 2129: uint8_t addr;
2130:
1.27 skrll 2131: XHCIHIST_FUNC(); XHCIHIST_CALLED();
2132: DPRINTFN(4, "port=%d depth=%d speed=%d upport %d",
1.28.2.5 skrll 2133: port, depth, speed, up->up_portno);
1.27 skrll 2134:
1.28.2.8 skrll 2135: dev = kmem_zalloc(sizeof(*dev), KM_SLEEP);
1.1 jakllsch 2136: if (dev == NULL)
2137: return USBD_NOMEM;
2138:
1.28.2.5 skrll 2139: dev->ud_bus = bus;
1.1 jakllsch 2140:
2141: /* Set up default endpoint handle. */
1.28.2.5 skrll 2142: dev->ud_ep0.ue_edesc = &dev->ud_ep0desc;
1.1 jakllsch 2143:
2144: /* Set up default endpoint descriptor. */
1.28.2.5 skrll 2145: dev->ud_ep0desc.bLength = USB_ENDPOINT_DESCRIPTOR_SIZE;
2146: dev->ud_ep0desc.bDescriptorType = UDESC_ENDPOINT;
2147: dev->ud_ep0desc.bEndpointAddress = USB_CONTROL_ENDPOINT;
2148: dev->ud_ep0desc.bmAttributes = UE_CONTROL;
1.28.2.19 skrll 2149: /* 4.3, 4.8.2.1 */
1.28.2.27 skrll 2150: if (USB_IS_SS(speed)) {
1.28.2.19 skrll 2151: USETW(dev->ud_ep0desc.wMaxPacketSize, USB_3_MAX_CTRL_PACKET);
1.28.2.27 skrll 2152: } else
2153: switch (speed) {
1.28.2.19 skrll 2154: case USB_SPEED_FULL:
2155: /* XXX using 64 as initial mps of ep0 in FS */
2156: case USB_SPEED_HIGH:
2157: USETW(dev->ud_ep0desc.wMaxPacketSize, USB_2_MAX_CTRL_PACKET);
2158: break;
2159: case USB_SPEED_LOW:
2160: default:
1.28.2.5 skrll 2161: USETW(dev->ud_ep0desc.wMaxPacketSize, USB_MAX_IPACKET);
1.28.2.19 skrll 2162: break;
2163: }
1.28.2.5 skrll 2164: dev->ud_ep0desc.bInterval = 0;
1.1 jakllsch 2165:
2166: /* doesn't matter, just don't let it uninitialized */
1.28.2.5 skrll 2167: dev->ud_ep0.ue_toggle = 0;
1.1 jakllsch 2168:
1.28.2.5 skrll 2169: DPRINTFN(4, "up %p portno %d", up, up->up_portno, 0, 0);
1.1 jakllsch 2170:
1.28.2.5 skrll 2171: dev->ud_quirks = &usbd_no_quirk;
2172: dev->ud_addr = 0;
2173: dev->ud_ddesc.bMaxPacketSize = 0;
2174: dev->ud_depth = depth;
2175: dev->ud_powersrc = up;
2176: dev->ud_myhub = up->up_parent;
1.1 jakllsch 2177:
1.28.2.5 skrll 2178: up->up_dev = dev;
1.1 jakllsch 2179:
2180: /* Locate root hub port */
1.28.2.19 skrll 2181: for (hub = dev; hub != NULL; hub = hub->ud_myhub) {
2182: uint32_t dep;
2183:
2184: DPRINTFN(4, "hub %p depth %d upport %p upportno %d",
2185: hub, hub->ud_depth, hub->ud_powersrc,
2186: hub->ud_powersrc ? hub->ud_powersrc->up_portno : -1);
2187:
2188: if (hub->ud_powersrc == NULL)
2189: break;
2190: dep = hub->ud_depth;
2191: if (dep == 0)
2192: break;
2193: rhport = hub->ud_powersrc->up_portno;
2194: if (dep > USB_HUB_MAX_DEPTH)
2195: continue;
1.1 jakllsch 2196:
1.28.2.19 skrll 2197: route |=
2198: (rhport > UHD_SS_NPORTS_MAX ? UHD_SS_NPORTS_MAX : rhport)
2199: << ((dep - 1) * 4);
2200: }
2201: route = route >> 4;
2202: DPRINTFN(4, "rhport %d Route %05x hub %p", rhport, route, hub, 0);
2203:
2204: /* Locate port on upstream high speed hub */
2205: for (adev = dev, hub = up->up_parent;
2206: hub != NULL && hub->ud_speed != USB_SPEED_HIGH;
2207: adev = hub, hub = hub->ud_myhub)
2208: ;
2209: if (hub) {
2210: int p;
2211: for (p = 0; p < hub->ud_hub->uh_hubdesc.bNbrPorts; p++) {
1.28.2.5 skrll 2212: if (hub->ud_hub->uh_ports[p].up_dev == adev) {
1.28.2.19 skrll 2213: dev->ud_myhsport = &hub->ud_hub->uh_ports[p];
2214: goto found;
1.1 jakllsch 2215: }
2216: }
1.28.2.19 skrll 2217: panic("xhci_new_device: cannot find HS port");
2218: found:
2219: DPRINTFN(4, "high speed port %d", p, 0, 0, 0);
1.1 jakllsch 2220: } else {
1.28.2.19 skrll 2221: dev->ud_myhsport = NULL;
1.1 jakllsch 2222: }
2223:
1.28.2.5 skrll 2224: dev->ud_speed = speed;
2225: dev->ud_langid = USBD_NOLANG;
2226: dev->ud_cookie.cookie = ++usb_cookie_no;
1.1 jakllsch 2227:
2228: /* Establish the default pipe. */
1.28.2.5 skrll 2229: err = usbd_setup_pipe(dev, 0, &dev->ud_ep0, USBD_DEFAULT_INTERVAL,
2230: &dev->ud_pipe0);
1.1 jakllsch 2231: if (err) {
1.28.2.19 skrll 2232: goto bad;
1.1 jakllsch 2233: }
2234:
1.28.2.5 skrll 2235: dd = &dev->ud_ddesc;
1.1 jakllsch 2236:
2237: if ((depth == 0) && (port == 0)) {
1.28.2.5 skrll 2238: KASSERT(bus->ub_devices[dev->ud_addr] == NULL);
2239: bus->ub_devices[dev->ud_addr] = dev;
1.1 jakllsch 2240: err = usbd_get_initial_ddesc(dev, dd);
2241: if (err)
1.28.2.19 skrll 2242: goto bad;
1.1 jakllsch 2243: err = usbd_reload_device_desc(dev);
2244: if (err)
1.28.2.19 skrll 2245: goto bad;
1.1 jakllsch 2246: } else {
2247: err = xhci_enable_slot(sc, &slot);
2248: if (err)
1.28.2.19 skrll 2249: goto bad;
1.1 jakllsch 2250: xs = &sc->sc_slots[slot];
1.28.2.5 skrll 2251: dev->ud_hcpriv = xs;
1.28.2.19 skrll 2252: err = xhci_init_slot(dev, slot, route, rhport);
2253: if (err) {
2254: dev->ud_hcpriv = NULL;
1.28.2.23 skrll 2255: /*
2256: * We have to disable_slot here because
2257: * xs->xs_idx == 0 when xhci_init_slot fails,
2258: * in that case usbd_remove_dev won't work.
2259: */
2260: mutex_enter(&sc->sc_lock);
2261: xhci_disable_slot(sc, slot);
2262: mutex_exit(&sc->sc_lock);
1.28.2.19 skrll 2263: goto bad;
2264: }
2265:
2266: /* Allow device time to set new address */
2267: usbd_delay_ms(dev, USB_SET_ADDRESS_SETTLE);
1.1 jakllsch 2268: cp = xhci_slot_get_dcv(sc, xs, XHCI_DCI_SLOT);
2269: //hexdump("slot context", cp, sc->sc_ctxsz);
2270: addr = XHCI_SCTX_3_DEV_ADDR_GET(cp[3]);
1.27 skrll 2271: DPRINTFN(4, "device address %u", addr, 0, 0, 0);
1.1 jakllsch 2272: /* XXX ensure we know when the hardware does something
2273: we can't yet cope with */
2274: KASSERT(addr >= 1 && addr <= 127);
1.28.2.5 skrll 2275: dev->ud_addr = addr;
2276: /* XXX dev->ud_addr not necessarily unique on bus */
2277: KASSERT(bus->ub_devices[dev->ud_addr] == NULL);
2278: bus->ub_devices[dev->ud_addr] = dev;
1.1 jakllsch 2279:
2280: err = usbd_get_initial_ddesc(dev, dd);
2281: if (err)
1.28.2.19 skrll 2282: goto bad;
1.24 skrll 2283: /* 4.8.2.1 */
1.28.2.27 skrll 2284: if (USB_IS_SS(speed)) {
1.28.2.19 skrll 2285: if (dd->bMaxPacketSize != 9) {
2286: printf("%s: invalid mps 2^%u for SS ep0,"
2287: " using 512\n",
2288: device_xname(sc->sc_dev),
2289: dd->bMaxPacketSize);
2290: dd->bMaxPacketSize = 9;
2291: }
1.28.2.5 skrll 2292: USETW(dev->ud_ep0desc.wMaxPacketSize,
1.24 skrll 2293: (1 << dd->bMaxPacketSize));
1.28.2.19 skrll 2294: } else
1.28.2.5 skrll 2295: USETW(dev->ud_ep0desc.wMaxPacketSize,
1.24 skrll 2296: dd->bMaxPacketSize);
1.27 skrll 2297: DPRINTFN(4, "bMaxPacketSize %u", dd->bMaxPacketSize, 0, 0, 0);
1.24 skrll 2298: xhci_update_ep0_mps(sc, xs,
1.28.2.5 skrll 2299: UGETW(dev->ud_ep0desc.wMaxPacketSize));
1.1 jakllsch 2300: err = usbd_reload_device_desc(dev);
2301: if (err)
1.28.2.19 skrll 2302: goto bad;
1.1 jakllsch 2303:
1.28.2.19 skrll 2304: #if 0
2305: /* Re-establish the default pipe with the new MPS. */
2306: /* In xhci this is done by xhci_update_ep0_mps. */
1.28.2.5 skrll 2307: usbd_kill_pipe(dev->ud_pipe0);
2308: err = usbd_setup_pipe(dev, 0, &dev->ud_ep0,
2309: USBD_DEFAULT_INTERVAL, &dev->ud_pipe0);
1.28.2.19 skrll 2310: #endif
1.1 jakllsch 2311: }
2312:
1.27 skrll 2313: DPRINTFN(1, "adding unit addr=%d, rev=%02x,",
1.28.2.5 skrll 2314: dev->ud_addr, UGETW(dd->bcdUSB), 0, 0);
1.27 skrll 2315: DPRINTFN(1, " class=%d, subclass=%d, protocol=%d,",
2316: dd->bDeviceClass, dd->bDeviceSubClass,
2317: dd->bDeviceProtocol, 0);
2318: DPRINTFN(1, " mps=%d, len=%d, noconf=%d, speed=%d",
2319: dd->bMaxPacketSize, dd->bLength, dd->bNumConfigurations,
1.28.2.5 skrll 2320: dev->ud_speed);
1.1 jakllsch 2321:
1.28.2.49 skrll 2322: usbd_get_device_strings(dev);
2323:
1.1 jakllsch 2324: usbd_add_dev_event(USB_EVENT_DEVICE_ATTACH, dev);
2325:
2326: if ((depth == 0) && (port == 0)) {
2327: usbd_attach_roothub(parent, dev);
1.28.2.5 skrll 2328: DPRINTFN(1, "root_hub %p", bus->ub_roothub, 0, 0, 0);
1.1 jakllsch 2329: return USBD_NORMAL_COMPLETION;
2330: }
2331:
2332:
1.28.2.5 skrll 2333: err = usbd_probe_and_attach(parent, dev, port, dev->ud_addr);
1.28.2.19 skrll 2334: bad:
2335: if (err != USBD_NORMAL_COMPLETION) {
1.1 jakllsch 2336: usbd_remove_device(dev, up);
2337: }
2338:
1.28.2.19 skrll 2339: return err;
1.1 jakllsch 2340: }
2341:
2342: static usbd_status
2343: xhci_ring_init(struct xhci_softc * const sc, struct xhci_ring * const xr,
2344: size_t ntrb, size_t align)
2345: {
2346: usbd_status err;
2347: size_t size = ntrb * XHCI_TRB_SIZE;
2348:
1.27 skrll 2349: XHCIHIST_FUNC(); XHCIHIST_CALLED();
2350:
1.1 jakllsch 2351: err = usb_allocmem(&sc->sc_bus, size, align, &xr->xr_dma);
2352: if (err)
2353: return err;
2354: mutex_init(&xr->xr_lock, MUTEX_DEFAULT, IPL_SOFTUSB);
2355: xr->xr_cookies = kmem_zalloc(sizeof(*xr->xr_cookies) * ntrb, KM_SLEEP);
2356: xr->xr_trb = xhci_ring_trbv(xr, 0);
2357: xr->xr_ntrb = ntrb;
2358: xr->xr_ep = 0;
2359: xr->xr_cs = 1;
2360: memset(xr->xr_trb, 0, size);
2361: usb_syncmem(&xr->xr_dma, 0, size, BUS_DMASYNC_PREWRITE);
2362: xr->is_halted = false;
2363:
2364: return USBD_NORMAL_COMPLETION;
2365: }
2366:
2367: static void
2368: xhci_ring_free(struct xhci_softc * const sc, struct xhci_ring * const xr)
2369: {
2370: usb_freemem(&sc->sc_bus, &xr->xr_dma);
2371: mutex_destroy(&xr->xr_lock);
2372: kmem_free(xr->xr_cookies, sizeof(*xr->xr_cookies) * xr->xr_ntrb);
2373: }
2374:
2375: static void
2376: xhci_ring_put(struct xhci_softc * const sc, struct xhci_ring * const xr,
2377: void *cookie, struct xhci_trb * const trbs, size_t ntrbs)
2378: {
2379: size_t i;
2380: u_int ri;
2381: u_int cs;
2382: uint64_t parameter;
2383: uint32_t status;
2384: uint32_t control;
2385:
1.27 skrll 2386: XHCIHIST_FUNC(); XHCIHIST_CALLED();
2387:
1.28.2.37 skrll 2388: KASSERT(ntrbs <= XHCI_XFER_NTRB);
1.1 jakllsch 2389: for (i = 0; i < ntrbs; i++) {
1.27 skrll 2390: DPRINTFN(12, "xr %p trbs %p num %zu", xr, trbs, i, 0);
2391: DPRINTFN(12, " %016"PRIx64" %08"PRIx32" %08"PRIx32,
2392: trbs[i].trb_0, trbs[i].trb_2, trbs[i].trb_3, 0);
1.1 jakllsch 2393: KASSERT(XHCI_TRB_3_TYPE_GET(trbs[i].trb_3) !=
2394: XHCI_TRB_TYPE_LINK);
2395: }
2396:
1.27 skrll 2397: DPRINTFN(12, "%p xr_ep 0x%x xr_cs %u", xr, xr->xr_ep, xr->xr_cs, 0);
1.1 jakllsch 2398:
2399: ri = xr->xr_ep;
2400: cs = xr->xr_cs;
2401:
1.11 dsl 2402: /*
2403: * Although the xhci hardware can do scatter/gather dma from
2404: * arbitrary sized buffers, there is a non-obvious restriction
2405: * that a LINK trb is only allowed at the end of a burst of
2406: * transfers - which might be 16kB.
2407: * Arbitrary aligned LINK trb definitely fail on Ivy bridge.
2408: * The simple solution is not to allow a LINK trb in the middle
2409: * of anything - as here.
1.13 dsl 2410: * XXX: (dsl) There are xhci controllers out there (eg some made by
2411: * ASMedia) that seem to lock up if they process a LINK trb but
2412: * cannot process the linked-to trb yet.
2413: * The code should write the 'cycle' bit on the link trb AFTER
2414: * adding the other trb.
1.11 dsl 2415: */
1.1 jakllsch 2416: if (ri + ntrbs >= (xr->xr_ntrb - 1)) {
2417: parameter = xhci_ring_trbp(xr, 0);
2418: status = 0;
2419: control = XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_LINK) |
2420: XHCI_TRB_3_TC_BIT | (cs ? XHCI_TRB_3_CYCLE_BIT : 0);
1.28.2.34 skrll 2421: xhci_trb_put(&xr->xr_trb[ri], parameter, status, control);
1.1 jakllsch 2422: usb_syncmem(&xr->xr_dma, XHCI_TRB_SIZE * ri, XHCI_TRB_SIZE * 1,
2423: BUS_DMASYNC_PREWRITE);
2424: xr->xr_cookies[ri] = NULL;
2425: xr->xr_ep = 0;
2426: xr->xr_cs ^= 1;
2427: ri = xr->xr_ep;
2428: cs = xr->xr_cs;
2429: }
2430:
2431: ri++;
2432:
1.11 dsl 2433: /* Write any subsequent TRB first */
1.1 jakllsch 2434: for (i = 1; i < ntrbs; i++) {
2435: parameter = trbs[i].trb_0;
2436: status = trbs[i].trb_2;
2437: control = trbs[i].trb_3;
2438:
2439: if (cs) {
2440: control |= XHCI_TRB_3_CYCLE_BIT;
2441: } else {
2442: control &= ~XHCI_TRB_3_CYCLE_BIT;
2443: }
2444:
1.28.2.34 skrll 2445: xhci_trb_put(&xr->xr_trb[ri], parameter, status, control);
1.1 jakllsch 2446: usb_syncmem(&xr->xr_dma, XHCI_TRB_SIZE * ri, XHCI_TRB_SIZE * 1,
2447: BUS_DMASYNC_PREWRITE);
2448: xr->xr_cookies[ri] = cookie;
2449: ri++;
2450: }
2451:
1.11 dsl 2452: /* Write the first TRB last */
1.1 jakllsch 2453: i = 0;
1.28.2.16 skrll 2454: parameter = trbs[i].trb_0;
2455: status = trbs[i].trb_2;
2456: control = trbs[i].trb_3;
1.1 jakllsch 2457:
1.28.2.16 skrll 2458: if (xr->xr_cs) {
2459: control |= XHCI_TRB_3_CYCLE_BIT;
2460: } else {
2461: control &= ~XHCI_TRB_3_CYCLE_BIT;
1.1 jakllsch 2462: }
2463:
1.28.2.34 skrll 2464: xhci_trb_put(&xr->xr_trb[xr->xr_ep], parameter, status, control);
1.28.2.16 skrll 2465: usb_syncmem(&xr->xr_dma, XHCI_TRB_SIZE * ri, XHCI_TRB_SIZE * 1,
2466: BUS_DMASYNC_PREWRITE);
2467: xr->xr_cookies[xr->xr_ep] = cookie;
2468:
1.1 jakllsch 2469: xr->xr_ep = ri;
2470: xr->xr_cs = cs;
2471:
1.27 skrll 2472: DPRINTFN(12, "%p xr_ep 0x%x xr_cs %u", xr, xr->xr_ep, xr->xr_cs, 0);
1.1 jakllsch 2473: }
2474:
1.28.2.20 skrll 2475: /*
2476: * Put a command on command ring, ring bell, set timer, and cv_timedwait.
2477: * Command completion is notified by cv_signal from xhci_handle_event
2478: * (called from interrupt from xHCI), or timed-out.
2479: * Command validation is performed in xhci_handle_event by checking if
2480: * trb_0 in CMD_COMPLETE TRB and sc->sc_command_addr are identical.
2481: */
1.1 jakllsch 2482: static usbd_status
1.28.2.19 skrll 2483: xhci_do_command1(struct xhci_softc * const sc, struct xhci_trb * const trb,
2484: int timeout, int locked)
1.1 jakllsch 2485: {
2486: struct xhci_ring * const cr = &sc->sc_cr;
2487: usbd_status err;
2488:
1.27 skrll 2489: XHCIHIST_FUNC(); XHCIHIST_CALLED();
2490: DPRINTFN(12, "input: 0x%016"PRIx64" 0x%08"PRIx32" 0x%08"PRIx32,
2491: trb->trb_0, trb->trb_2, trb->trb_3, 0);
1.1 jakllsch 2492:
1.28.2.19 skrll 2493: KASSERTMSG(!cpu_intr_p() && !cpu_softintr_p(), "called from intr ctx");
2494:
2495: if (!locked)
2496: mutex_enter(&sc->sc_lock);
1.1 jakllsch 2497:
1.28.2.31 skrll 2498: /* XXX KASSERT may fire when cv_timedwait unlocks sc_lock */
1.1 jakllsch 2499: KASSERT(sc->sc_command_addr == 0);
2500: sc->sc_command_addr = xhci_ring_trbp(cr, cr->xr_ep);
2501:
2502: mutex_enter(&cr->xr_lock);
2503: xhci_ring_put(sc, cr, NULL, trb, 1);
2504: mutex_exit(&cr->xr_lock);
2505:
2506: xhci_db_write_4(sc, XHCI_DOORBELL(0), 0);
2507:
2508: if (cv_timedwait(&sc->sc_command_cv, &sc->sc_lock,
2509: MAX(1, mstohz(timeout))) == EWOULDBLOCK) {
2510: err = USBD_TIMEOUT;
2511: goto timedout;
2512: }
2513:
2514: trb->trb_0 = sc->sc_result_trb.trb_0;
2515: trb->trb_2 = sc->sc_result_trb.trb_2;
2516: trb->trb_3 = sc->sc_result_trb.trb_3;
2517:
1.27 skrll 2518: DPRINTFN(12, "output: 0x%016"PRIx64" 0x%08"PRIx32" 0x%08"PRIx32"",
2519: trb->trb_0, trb->trb_2, trb->trb_3, 0);
1.1 jakllsch 2520:
2521: switch (XHCI_TRB_2_ERROR_GET(trb->trb_2)) {
2522: case XHCI_TRB_ERROR_SUCCESS:
2523: err = USBD_NORMAL_COMPLETION;
2524: break;
2525: default:
2526: case 192 ... 223:
2527: err = USBD_IOERROR;
2528: break;
2529: case 224 ... 255:
2530: err = USBD_NORMAL_COMPLETION;
2531: break;
2532: }
2533:
2534: timedout:
2535: sc->sc_command_addr = 0;
1.28.2.19 skrll 2536: if (!locked)
2537: mutex_exit(&sc->sc_lock);
1.1 jakllsch 2538: return err;
2539: }
2540:
2541: static usbd_status
1.28.2.19 skrll 2542: xhci_do_command(struct xhci_softc * const sc, struct xhci_trb * const trb,
2543: int timeout)
2544: {
2545: return xhci_do_command1(sc, trb, timeout, 0);
2546: }
2547:
1.28.2.20 skrll 2548: /*
2549: * This allows xhci_do_command with already sc_lock held.
2550: * This is needed as USB stack calls close methods with sc_lock_held.
2551: * (see usbdivar.h)
2552: */
1.28.2.19 skrll 2553: static usbd_status
2554: xhci_do_command_locked(struct xhci_softc * const sc,
2555: struct xhci_trb * const trb, int timeout)
2556: {
2557: return xhci_do_command1(sc, trb, timeout, 1);
2558: }
2559:
2560: static usbd_status
1.1 jakllsch 2561: xhci_enable_slot(struct xhci_softc * const sc, uint8_t * const slotp)
2562: {
2563: struct xhci_trb trb;
2564: usbd_status err;
2565:
1.27 skrll 2566: XHCIHIST_FUNC(); XHCIHIST_CALLED();
2567:
1.1 jakllsch 2568: trb.trb_0 = 0;
2569: trb.trb_2 = 0;
2570: trb.trb_3 = XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_ENABLE_SLOT);
2571:
2572: err = xhci_do_command(sc, &trb, USBD_DEFAULT_TIMEOUT);
2573: if (err != USBD_NORMAL_COMPLETION) {
2574: return err;
2575: }
2576:
2577: *slotp = XHCI_TRB_3_SLOT_GET(trb.trb_3);
2578:
2579: return err;
2580: }
2581:
1.28.2.20 skrll 2582: /*
2583: * Deallocate DMA buffer and ring buffer, and disable_slot.
2584: * Should be called with sc_lock held.
2585: */
1.1 jakllsch 2586: static usbd_status
1.28.2.19 skrll 2587: xhci_disable_slot(struct xhci_softc * const sc, uint8_t slot)
2588: {
2589: struct xhci_trb trb;
2590: struct xhci_slot *xs;
2591:
2592: XHCIHIST_FUNC(); XHCIHIST_CALLED();
2593:
2594: if (sc->sc_dying)
2595: return USBD_IOERROR;
2596:
2597: xs = &sc->sc_slots[slot];
2598: if (xs->xs_idx != 0) {
2599: for (int i = XHCI_DCI_SLOT + 1; i < 32; i++) {
2600: xhci_ring_free(sc, &xs->xs_ep[i].xe_tr);
2601: memset(&xs->xs_ep[i], 0, sizeof(xs->xs_ep[i]));
2602: }
2603: usb_freemem(&sc->sc_bus, &xs->xs_ic_dma);
2604: usb_freemem(&sc->sc_bus, &xs->xs_dc_dma);
2605: }
2606:
2607: trb.trb_0 = 0;
2608: trb.trb_2 = 0;
2609: trb.trb_3 = htole32(
2610: XHCI_TRB_3_SLOT_SET(slot) |
2611: XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_DISABLE_SLOT));
2612:
2613: return xhci_do_command_locked(sc, &trb, USBD_DEFAULT_TIMEOUT);
2614: }
2615:
1.28.2.20 skrll 2616: /*
2617: * Change slot state.
2618: * bsr=0: ENABLED -> ADDRESSED
2619: * bsr=1: ENABLED -> DEFAULT
2620: * see xHCI 1.1 4.5.3, 3.3.4
2621: */
1.28.2.19 skrll 2622: static usbd_status
1.1 jakllsch 2623: xhci_address_device(struct xhci_softc * const sc,
2624: uint64_t icp, uint8_t slot_id, bool bsr)
2625: {
2626: struct xhci_trb trb;
2627: usbd_status err;
2628:
1.27 skrll 2629: XHCIHIST_FUNC(); XHCIHIST_CALLED();
2630:
1.1 jakllsch 2631: trb.trb_0 = icp;
2632: trb.trb_2 = 0;
2633: trb.trb_3 = XHCI_TRB_3_SLOT_SET(slot_id) |
2634: XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_ADDRESS_DEVICE) |
2635: (bsr ? XHCI_TRB_3_BSR_BIT : 0);
2636:
2637: err = xhci_do_command(sc, &trb, USBD_DEFAULT_TIMEOUT);
1.28.2.37 skrll 2638:
2639: if (XHCI_TRB_2_ERROR_GET(trb.trb_2) == XHCI_TRB_ERROR_NO_SLOTS)
2640: err = USBD_NO_ADDR;
2641:
1.1 jakllsch 2642: return err;
2643: }
2644:
2645: static usbd_status
2646: xhci_update_ep0_mps(struct xhci_softc * const sc,
2647: struct xhci_slot * const xs, u_int mps)
2648: {
2649: struct xhci_trb trb;
2650: usbd_status err;
2651: uint32_t * cp;
2652:
1.27 skrll 2653: XHCIHIST_FUNC(); XHCIHIST_CALLED();
2654: DPRINTFN(4, "slot %u mps %u", xs->xs_idx, mps, 0, 0);
1.1 jakllsch 2655:
2656: cp = xhci_slot_get_icv(sc, xs, XHCI_ICI_INPUT_CONTROL);
2657: cp[0] = htole32(0);
2658: cp[1] = htole32(XHCI_INCTX_1_ADD_MASK(XHCI_DCI_EP_CONTROL));
2659:
2660: cp = xhci_slot_get_icv(sc, xs, xhci_dci_to_ici(XHCI_DCI_EP_CONTROL));
2661: cp[1] = htole32(XHCI_EPCTX_1_MAXP_SIZE_SET(mps));
2662:
2663: /* sync input contexts before they are read from memory */
2664: usb_syncmem(&xs->xs_ic_dma, 0, sc->sc_pgsz, BUS_DMASYNC_PREWRITE);
2665: hexdump("input context", xhci_slot_get_icv(sc, xs, 0),
2666: sc->sc_ctxsz * 4);
2667:
2668: trb.trb_0 = xhci_slot_get_icp(sc, xs, 0);
2669: trb.trb_2 = 0;
2670: trb.trb_3 = XHCI_TRB_3_SLOT_SET(xs->xs_idx) |
2671: XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_EVALUATE_CTX);
2672:
2673: err = xhci_do_command(sc, &trb, USBD_DEFAULT_TIMEOUT);
2674: KASSERT(err == USBD_NORMAL_COMPLETION); /* XXX */
2675: return err;
2676: }
2677:
2678: static void
2679: xhci_set_dcba(struct xhci_softc * const sc, uint64_t dcba, int si)
2680: {
2681: uint64_t * const dcbaa = KERNADDR(&sc->sc_dcbaa_dma, 0);
2682:
1.27 skrll 2683: XHCIHIST_FUNC(); XHCIHIST_CALLED();
2684: DPRINTFN(4, "dcbaa %p dc %016"PRIx64" slot %d",
2685: &dcbaa[si], dcba, si, 0);
1.1 jakllsch 2686:
1.5 matt 2687: dcbaa[si] = htole64(dcba);
1.1 jakllsch 2688: usb_syncmem(&sc->sc_dcbaa_dma, si * sizeof(uint64_t), sizeof(uint64_t),
2689: BUS_DMASYNC_PREWRITE);
2690: }
2691:
1.28.2.20 skrll 2692: /*
2693: * Allocate DMA buffer and ring buffer for specified slot
2694: * and set Device Context Base Address
2695: * and issue Set Address device command.
2696: */
1.1 jakllsch 2697: static usbd_status
1.28.2.19 skrll 2698: xhci_init_slot(struct usbd_device *dev, uint32_t slot, int route, int rhport)
1.1 jakllsch 2699: {
1.28.2.42 skrll 2700: struct xhci_softc * const sc = XHCI_BUS2SC(dev->ud_bus);
1.1 jakllsch 2701: struct xhci_slot *xs;
2702: usbd_status err;
2703: u_int dci;
2704: uint32_t *cp;
1.28.2.19 skrll 2705: uint32_t mps = UGETW(dev->ud_ep0desc.wMaxPacketSize);
1.1 jakllsch 2706:
1.27 skrll 2707: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.28.2.19 skrll 2708: DPRINTFN(4, "slot %u speed %d rhport %d route %05x",
2709: slot, dev->ud_speed, route, rhport);
1.1 jakllsch 2710:
2711: xs = &sc->sc_slots[slot];
2712:
2713: /* allocate contexts */
2714: err = usb_allocmem(&sc->sc_bus, sc->sc_pgsz, sc->sc_pgsz,
2715: &xs->xs_dc_dma);
2716: if (err)
2717: return err;
2718: memset(KERNADDR(&xs->xs_dc_dma, 0), 0, sc->sc_pgsz);
2719:
2720: err = usb_allocmem(&sc->sc_bus, sc->sc_pgsz, sc->sc_pgsz,
2721: &xs->xs_ic_dma);
2722: if (err)
1.28.2.19 skrll 2723: goto bad1;
1.1 jakllsch 2724: memset(KERNADDR(&xs->xs_ic_dma, 0), 0, sc->sc_pgsz);
2725:
2726: for (dci = 0; dci < 32; dci++) {
2727: //CTASSERT(sizeof(xs->xs_ep[dci]) == sizeof(struct xhci_endpoint));
2728: memset(&xs->xs_ep[dci], 0, sizeof(xs->xs_ep[dci]));
2729: if (dci == XHCI_DCI_SLOT)
2730: continue;
2731: err = xhci_ring_init(sc, &xs->xs_ep[dci].xe_tr,
2732: XHCI_TRANSFER_RING_TRBS, XHCI_TRB_ALIGN);
2733: if (err) {
1.27 skrll 2734: DPRINTFN(0, "ring init failure", 0, 0, 0, 0);
1.28.2.19 skrll 2735: goto bad2;
1.1 jakllsch 2736: }
2737: }
2738:
2739: /* set up initial input control context */
2740: cp = xhci_slot_get_icv(sc, xs, XHCI_ICI_INPUT_CONTROL);
2741: cp[0] = htole32(0);
2742: cp[1] = htole32(XHCI_INCTX_1_ADD_MASK(XHCI_DCI_EP_CONTROL)|
2743: XHCI_INCTX_1_ADD_MASK(XHCI_DCI_SLOT));
2744:
2745: /* set up input slot context */
2746: cp = xhci_slot_get_icv(sc, xs, xhci_dci_to_ici(XHCI_DCI_SLOT));
1.28.2.19 skrll 2747: xhci_setup_sctx(dev, cp);
2748: cp[0] |= htole32(XHCI_SCTX_0_CTX_NUM_SET(1));
2749: cp[0] |= htole32(XHCI_SCTX_0_ROUTE_SET(route));
2750: cp[1] |= htole32(XHCI_SCTX_1_RH_PORT_SET(rhport));
1.1 jakllsch 2751:
2752: /* set up input EP0 context */
2753: cp = xhci_slot_get_icv(sc, xs, xhci_dci_to_ici(XHCI_DCI_EP_CONTROL));
2754: cp[0] = htole32(0);
2755: cp[1] = htole32(
2756: XHCI_EPCTX_1_MAXP_SIZE_SET(mps) |
2757: XHCI_EPCTX_1_EPTYPE_SET(4) |
2758: XHCI_EPCTX_1_CERR_SET(3)
2759: );
2760: /* can't use xhci_ep_get_dci() yet? */
2761: *(uint64_t *)(&cp[2]) = htole64(
2762: xhci_ring_trbp(&xs->xs_ep[XHCI_DCI_EP_CONTROL].xe_tr, 0) |
2763: XHCI_EPCTX_2_DCS_SET(1));
2764: cp[4] = htole32(
2765: XHCI_EPCTX_4_AVG_TRB_LEN_SET(8)
2766: );
2767:
2768: /* sync input contexts before they are read from memory */
2769: usb_syncmem(&xs->xs_ic_dma, 0, sc->sc_pgsz, BUS_DMASYNC_PREWRITE);
2770: hexdump("input context", xhci_slot_get_icv(sc, xs, 0),
2771: sc->sc_ctxsz * 3);
2772:
2773: xhci_set_dcba(sc, DMAADDR(&xs->xs_dc_dma, 0), slot);
2774:
2775: err = xhci_address_device(sc, xhci_slot_get_icp(sc, xs, 0), slot,
2776: false);
2777:
2778: usb_syncmem(&xs->xs_dc_dma, 0, sc->sc_pgsz, BUS_DMASYNC_POSTREAD);
2779: hexdump("output context", xhci_slot_get_dcv(sc, xs, 0),
2780: sc->sc_ctxsz * 2);
2781:
1.28.2.19 skrll 2782: bad2:
2783: if (err == USBD_NORMAL_COMPLETION) {
2784: xs->xs_idx = slot;
2785: } else {
2786: for (int i = 1; i < dci; i++) {
2787: xhci_ring_free(sc, &xs->xs_ep[i].xe_tr);
2788: memset(&xs->xs_ep[i], 0, sizeof(xs->xs_ep[i]));
2789: }
2790: usb_freemem(&sc->sc_bus, &xs->xs_ic_dma);
2791: bad1:
2792: usb_freemem(&sc->sc_bus, &xs->xs_dc_dma);
2793: xs->xs_idx = 0;
2794: }
2795:
1.1 jakllsch 2796: return err;
2797: }
2798:
2799: /* ----- */
2800:
2801: static void
1.28.2.14 skrll 2802: xhci_noop(struct usbd_pipe *pipe)
1.1 jakllsch 2803: {
1.27 skrll 2804: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.1 jakllsch 2805: }
2806:
1.28.2.20 skrll 2807: /*
2808: * Process root hub request.
2809: */
1.28.2.18 skrll 2810: static int
2811: xhci_roothub_ctrl(struct usbd_bus *bus, usb_device_request_t *req,
1.28.2.12 skrll 2812: void *buf, int buflen)
1.1 jakllsch 2813: {
1.28.2.42 skrll 2814: struct xhci_softc * const sc = XHCI_BUS2SC(bus);
1.1 jakllsch 2815: usb_port_status_t ps;
2816: int l, totlen = 0;
1.28.2.12 skrll 2817: uint16_t len, value, index;
1.1 jakllsch 2818: int port, i;
2819: uint32_t v;
2820:
1.27 skrll 2821: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.1 jakllsch 2822:
2823: if (sc->sc_dying)
1.28.2.12 skrll 2824: return -1;
1.1 jakllsch 2825:
1.28.2.12 skrll 2826: len = UGETW(req->wLength);
1.1 jakllsch 2827: value = UGETW(req->wValue);
2828: index = UGETW(req->wIndex);
2829:
1.27 skrll 2830: DPRINTFN(12, "rhreq: %04x %04x %04x %04x",
2831: req->bmRequestType | (req->bRequest << 8), value, index, len);
1.1 jakllsch 2832:
2833: #define C(x,y) ((x) | ((y) << 8))
1.28.2.12 skrll 2834: switch (C(req->bRequest, req->bmRequestType)) {
1.1 jakllsch 2835: case C(UR_GET_DESCRIPTOR, UT_READ_DEVICE):
1.27 skrll 2836: DPRINTFN(8, "getdesc: wValue=0x%04x", value, 0, 0, 0);
1.1 jakllsch 2837: if (len == 0)
2838: break;
1.28.2.12 skrll 2839: switch (value) {
1.28.2.34 skrll 2840: case C(0, UDESC_DEVICE): {
2841: usb_device_descriptor_t devd;
2842: totlen = min(buflen, sizeof(devd));
2843: memcpy(&devd, buf, totlen);
2844: USETW(devd.idVendor, sc->sc_id_vendor);
2845: memcpy(buf, &devd, totlen);
2846: break;
2847: }
1.1 jakllsch 2848: #define sd ((usb_string_descriptor_t *)buf)
1.28.2.34 skrll 2849: case C(1, UDESC_STRING):
2850: /* Vendor */
2851: totlen = usb_makestrdesc(sd, len, sc->sc_vendor);
2852: break;
1.28.2.12 skrll 2853: case C(2, UDESC_STRING):
2854: /* Product */
2855: totlen = usb_makestrdesc(sd, len, "xHCI Root Hub");
1.1 jakllsch 2856: break;
1.28.2.12 skrll 2857: #undef sd
1.1 jakllsch 2858: default:
1.28.2.12 skrll 2859: /* default from usbroothub */
2860: return buflen;
1.1 jakllsch 2861: }
2862: break;
1.28.2.12 skrll 2863:
1.1 jakllsch 2864: /* Hub requests */
2865: case C(UR_CLEAR_FEATURE, UT_WRITE_CLASS_DEVICE):
2866: break;
1.28.2.44 skrll 2867: /* Clear Port Feature request */
1.1 jakllsch 2868: case C(UR_CLEAR_FEATURE, UT_WRITE_CLASS_OTHER):
1.27 skrll 2869: DPRINTFN(4, "UR_CLEAR_PORT_FEATURE port=%d feature=%d",
2870: index, value, 0, 0);
1.28.2.19 skrll 2871: if (index < 1 || index > sc->sc_maxports) {
1.28.2.12 skrll 2872: return -1;
1.1 jakllsch 2873: }
1.28.2.19 skrll 2874: port = XHCI_PORTSC(index);
1.1 jakllsch 2875: v = xhci_op_read_4(sc, port);
1.27 skrll 2876: DPRINTFN(4, "portsc=0x%08x", v, 0, 0, 0);
1.1 jakllsch 2877: v &= ~XHCI_PS_CLEAR;
2878: switch (value) {
2879: case UHF_PORT_ENABLE:
1.28.2.43 skrll 2880: xhci_op_write_4(sc, port, v & ~XHCI_PS_PED);
1.1 jakllsch 2881: break;
2882: case UHF_PORT_SUSPEND:
1.28.2.12 skrll 2883: return -1;
1.1 jakllsch 2884: case UHF_PORT_POWER:
2885: break;
2886: case UHF_PORT_TEST:
2887: case UHF_PORT_INDICATOR:
1.28.2.12 skrll 2888: return -1;
1.1 jakllsch 2889: case UHF_C_PORT_CONNECTION:
2890: xhci_op_write_4(sc, port, v | XHCI_PS_CSC);
2891: break;
2892: case UHF_C_PORT_ENABLE:
2893: case UHF_C_PORT_SUSPEND:
2894: case UHF_C_PORT_OVER_CURRENT:
1.28.2.12 skrll 2895: return -1;
1.28.2.19 skrll 2896: case UHF_C_BH_PORT_RESET:
2897: xhci_op_write_4(sc, port, v | XHCI_PS_WRC);
2898: break;
1.1 jakllsch 2899: case UHF_C_PORT_RESET:
2900: xhci_op_write_4(sc, port, v | XHCI_PS_PRC);
2901: break;
1.28.2.19 skrll 2902: case UHF_C_PORT_LINK_STATE:
2903: xhci_op_write_4(sc, port, v | XHCI_PS_PLC);
2904: break;
2905: case UHF_C_PORT_CONFIG_ERROR:
2906: xhci_op_write_4(sc, port, v | XHCI_PS_CEC);
2907: break;
1.1 jakllsch 2908: default:
1.28.2.12 skrll 2909: return -1;
1.1 jakllsch 2910: }
2911: break;
2912: case C(UR_GET_DESCRIPTOR, UT_READ_CLASS_DEVICE):
2913: if (len == 0)
2914: break;
2915: if ((value & 0xff) != 0) {
1.28.2.12 skrll 2916: return -1;
1.1 jakllsch 2917: }
1.28.2.12 skrll 2918: usb_hub_descriptor_t hubd;
2919:
2920: totlen = min(buflen, sizeof(hubd));
2921: memcpy(&hubd, buf, totlen);
1.28.2.19 skrll 2922: hubd.bNbrPorts = sc->sc_maxports;
1.1 jakllsch 2923: USETW(hubd.wHubCharacteristics, UHD_PWR_NO_SWITCH);
2924: hubd.bPwrOn2PwrGood = 200;
1.2 apb 2925: for (i = 0, l = sc->sc_maxports; l > 0; i++, l -= 8)
1.3 skrll 2926: hubd.DeviceRemovable[i++] = 0; /* XXX can't find out? */
2927: hubd.bDescLength = USB_HUB_DESCRIPTOR_SIZE + i;
1.28.2.12 skrll 2928: totlen = min(totlen, hubd.bDescLength);
2929: memcpy(buf, &hubd, totlen);
1.1 jakllsch 2930: break;
2931: case C(UR_GET_STATUS, UT_READ_CLASS_DEVICE):
2932: if (len != 4) {
1.28.2.12 skrll 2933: return -1;
1.1 jakllsch 2934: }
2935: memset(buf, 0, len); /* ? XXX */
2936: totlen = len;
2937: break;
1.28.2.44 skrll 2938: /* Get Port Status request */
1.1 jakllsch 2939: case C(UR_GET_STATUS, UT_READ_CLASS_OTHER):
1.27 skrll 2940: DPRINTFN(8, "get port status i=%d", index, 0, 0, 0);
1.1 jakllsch 2941: if (index < 1 || index > sc->sc_maxports) {
1.28.2.12 skrll 2942: return -1;
1.1 jakllsch 2943: }
2944: if (len != 4) {
1.28.2.12 skrll 2945: return -1;
1.1 jakllsch 2946: }
1.28.2.19 skrll 2947: v = xhci_op_read_4(sc, XHCI_PORTSC(index));
2948: DPRINTFN(4, "getrhportsc %d %08x", index, v, 0, 0);
1.28.2.27 skrll 2949: i = xhci_xspeed2psspeed(XHCI_PS_SPEED_GET(v));
1.1 jakllsch 2950: if (v & XHCI_PS_CCS) i |= UPS_CURRENT_CONNECT_STATUS;
2951: if (v & XHCI_PS_PED) i |= UPS_PORT_ENABLED;
2952: if (v & XHCI_PS_OCA) i |= UPS_OVERCURRENT_INDICATOR;
2953: //if (v & XHCI_PS_SUSP) i |= UPS_SUSPEND;
2954: if (v & XHCI_PS_PR) i |= UPS_RESET;
1.28.2.19 skrll 2955: if (v & XHCI_PS_PP) {
1.28.2.27 skrll 2956: if (i & UPS_OTHER_SPEED)
1.28.2.19 skrll 2957: i |= UPS_PORT_POWER_SS;
2958: else
2959: i |= UPS_PORT_POWER;
2960: }
1.28.2.27 skrll 2961: if (i & UPS_OTHER_SPEED)
2962: i |= UPS_PORT_LS_SET(XHCI_PS_PLS_GET(v));
1.28.2.34 skrll 2963: if (sc->sc_vendor_port_status)
2964: i = sc->sc_vendor_port_status(sc, v, i);
1.1 jakllsch 2965: USETW(ps.wPortStatus, i);
2966: i = 0;
2967: if (v & XHCI_PS_CSC) i |= UPS_C_CONNECT_STATUS;
2968: if (v & XHCI_PS_PEC) i |= UPS_C_PORT_ENABLED;
2969: if (v & XHCI_PS_OCC) i |= UPS_C_OVERCURRENT_INDICATOR;
2970: if (v & XHCI_PS_PRC) i |= UPS_C_PORT_RESET;
1.28.2.19 skrll 2971: if (v & XHCI_PS_WRC) i |= UPS_C_BH_PORT_RESET;
2972: if (v & XHCI_PS_PLC) i |= UPS_C_PORT_LINK_STATE;
2973: if (v & XHCI_PS_CEC) i |= UPS_C_PORT_CONFIG_ERROR;
1.1 jakllsch 2974: USETW(ps.wPortChange, i);
1.28.2.12 skrll 2975: totlen = min(len, sizeof(ps));
2976: memcpy(buf, &ps, totlen);
1.1 jakllsch 2977: break;
2978: case C(UR_SET_DESCRIPTOR, UT_WRITE_CLASS_DEVICE):
1.28.2.12 skrll 2979: return -1;
1.28.2.19 skrll 2980: case C(UR_SET_HUB_DEPTH, UT_WRITE_CLASS_DEVICE):
2981: break;
1.1 jakllsch 2982: case C(UR_SET_FEATURE, UT_WRITE_CLASS_DEVICE):
2983: break;
1.28.2.44 skrll 2984: /* Set Port Feature request */
1.28.2.21 skrll 2985: case C(UR_SET_FEATURE, UT_WRITE_CLASS_OTHER): {
1.28.2.19 skrll 2986: int optval = (index >> 8) & 0xff;
2987: index &= 0xff;
2988: if (index < 1 || index > sc->sc_maxports) {
1.28.2.12 skrll 2989: return -1;
1.1 jakllsch 2990: }
1.28.2.19 skrll 2991: port = XHCI_PORTSC(index);
1.1 jakllsch 2992: v = xhci_op_read_4(sc, port);
1.27 skrll 2993: DPRINTFN(4, "portsc=0x%08x", v, 0, 0, 0);
1.28.2.45 skrll 2994: uint32_t v0 = v;
1.1 jakllsch 2995: v &= ~XHCI_PS_CLEAR;
2996: switch (value) {
2997: case UHF_PORT_ENABLE:
2998: xhci_op_write_4(sc, port, v | XHCI_PS_PED);
2999: break;
3000: case UHF_PORT_SUSPEND:
3001: /* XXX suspend */
3002: break;
3003: case UHF_PORT_RESET:
1.28.2.43 skrll 3004: v &= ~(XHCI_PS_PED | XHCI_PS_PR);
1.1 jakllsch 3005: xhci_op_write_4(sc, port, v | XHCI_PS_PR);
3006: /* Wait for reset to complete. */
3007: usb_delay_ms(&sc->sc_bus, USB_PORT_ROOT_RESET_DELAY);
3008: if (sc->sc_dying) {
1.28.2.12 skrll 3009: return -1;
1.1 jakllsch 3010: }
3011: v = xhci_op_read_4(sc, port);
3012: if (v & XHCI_PS_PR) {
3013: xhci_op_write_4(sc, port, v & ~XHCI_PS_PR);
3014: usb_delay_ms(&sc->sc_bus, 10);
3015: /* XXX */
3016: }
3017: break;
3018: case UHF_PORT_POWER:
3019: /* XXX power control */
3020: break;
3021: /* XXX more */
3022: case UHF_C_PORT_RESET:
3023: xhci_op_write_4(sc, port, v | XHCI_PS_PRC);
3024: break;
1.28.2.19 skrll 3025: case UHF_PORT_U1_TIMEOUT:
1.28.2.45 skrll 3026: if (XHCI_PS_SPEED_GET(v0) != XHCI_PS_SPEED_SS) {
1.28.2.19 skrll 3027: return -1;
3028: }
3029: port = XHCI_PORTPMSC(index);
3030: v = xhci_op_read_4(sc, port);
3031: v &= ~XHCI_PM3_U1TO_SET(0xff);
3032: v |= XHCI_PM3_U1TO_SET(optval);
3033: xhci_op_write_4(sc, port, v);
3034: break;
3035: case UHF_PORT_U2_TIMEOUT:
1.28.2.45 skrll 3036: if (XHCI_PS_SPEED_GET(v0) != XHCI_PS_SPEED_SS) {
1.28.2.19 skrll 3037: return -1;
3038: }
3039: port = XHCI_PORTPMSC(index);
3040: v = xhci_op_read_4(sc, port);
3041: v &= ~XHCI_PM3_U2TO_SET(0xff);
3042: v |= XHCI_PM3_U2TO_SET(optval);
3043: xhci_op_write_4(sc, port, v);
3044: break;
1.1 jakllsch 3045: default:
1.28.2.12 skrll 3046: return -1;
1.1 jakllsch 3047: }
1.28.2.19 skrll 3048: }
1.1 jakllsch 3049: break;
3050: case C(UR_CLEAR_TT_BUFFER, UT_WRITE_CLASS_OTHER):
3051: case C(UR_RESET_TT, UT_WRITE_CLASS_OTHER):
3052: case C(UR_GET_TT_STATE, UT_READ_CLASS_OTHER):
3053: case C(UR_STOP_TT, UT_WRITE_CLASS_OTHER):
3054: break;
3055: default:
1.28.2.12 skrll 3056: /* default from usbroothub */
3057: return buflen;
1.1 jakllsch 3058: }
3059:
1.28.2.12 skrll 3060: return totlen;
1.1 jakllsch 3061: }
3062:
1.28.2.17 skrll 3063: /* root hub interrupt */
1.1 jakllsch 3064:
3065: static usbd_status
1.28.2.14 skrll 3066: xhci_root_intr_transfer(struct usbd_xfer *xfer)
1.1 jakllsch 3067: {
1.28.2.42 skrll 3068: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.1 jakllsch 3069: usbd_status err;
3070:
1.27 skrll 3071: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3072:
1.1 jakllsch 3073: /* Insert last in queue. */
3074: mutex_enter(&sc->sc_lock);
3075: err = usb_insert_transfer(xfer);
3076: mutex_exit(&sc->sc_lock);
3077: if (err)
3078: return err;
3079:
3080: /* Pipe isn't running, start first */
1.28.2.13 skrll 3081: return xhci_root_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue));
1.1 jakllsch 3082: }
3083:
1.28.2.20 skrll 3084: /* Wait for roothub port status/change */
1.1 jakllsch 3085: static usbd_status
1.28.2.14 skrll 3086: xhci_root_intr_start(struct usbd_xfer *xfer)
1.1 jakllsch 3087: {
1.28.2.42 skrll 3088: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.1 jakllsch 3089:
1.27 skrll 3090: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3091:
1.1 jakllsch 3092: if (sc->sc_dying)
3093: return USBD_IOERROR;
3094:
3095: mutex_enter(&sc->sc_lock);
3096: sc->sc_intrxfer = xfer;
3097: mutex_exit(&sc->sc_lock);
3098:
3099: return USBD_IN_PROGRESS;
3100: }
3101:
3102: static void
1.28.2.14 skrll 3103: xhci_root_intr_abort(struct usbd_xfer *xfer)
1.1 jakllsch 3104: {
1.28.2.42 skrll 3105: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.1 jakllsch 3106:
1.27 skrll 3107: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3108:
1.1 jakllsch 3109: KASSERT(mutex_owned(&sc->sc_lock));
1.28.2.5 skrll 3110: KASSERT(xfer->ux_pipe->up_intrxfer == xfer);
1.21 skrll 3111:
1.22 skrll 3112: sc->sc_intrxfer = NULL;
3113:
1.28.2.5 skrll 3114: xfer->ux_status = USBD_CANCELLED;
1.1 jakllsch 3115: usb_transfer_complete(xfer);
3116: }
3117:
3118: static void
1.28.2.14 skrll 3119: xhci_root_intr_close(struct usbd_pipe *pipe)
1.1 jakllsch 3120: {
1.28.2.42 skrll 3121: struct xhci_softc * const sc = XHCI_PIPE2SC(pipe);
1.1 jakllsch 3122:
1.27 skrll 3123: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3124:
1.1 jakllsch 3125: KASSERT(mutex_owned(&sc->sc_lock));
3126:
3127: sc->sc_intrxfer = NULL;
3128: }
3129:
3130: static void
1.28.2.14 skrll 3131: xhci_root_intr_done(struct usbd_xfer *xfer)
1.1 jakllsch 3132: {
1.27 skrll 3133: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3134:
1.28.2.5 skrll 3135: xfer->ux_hcpriv = NULL;
1.1 jakllsch 3136: }
3137:
3138: /* -------------- */
3139: /* device control */
3140:
3141: static usbd_status
1.28.2.14 skrll 3142: xhci_device_ctrl_transfer(struct usbd_xfer *xfer)
1.1 jakllsch 3143: {
1.28.2.42 skrll 3144: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.1 jakllsch 3145: usbd_status err;
3146:
1.27 skrll 3147: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3148:
1.1 jakllsch 3149: /* Insert last in queue. */
3150: mutex_enter(&sc->sc_lock);
3151: err = usb_insert_transfer(xfer);
3152: mutex_exit(&sc->sc_lock);
3153: if (err)
1.28.2.13 skrll 3154: return err;
1.1 jakllsch 3155:
3156: /* Pipe isn't running, start first */
1.28.2.13 skrll 3157: return xhci_device_ctrl_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue));
1.1 jakllsch 3158: }
3159:
3160: static usbd_status
1.28.2.14 skrll 3161: xhci_device_ctrl_start(struct usbd_xfer *xfer)
1.1 jakllsch 3162: {
1.28.2.42 skrll 3163: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.28.2.5 skrll 3164: struct xhci_slot * const xs = xfer->ux_pipe->up_dev->ud_hcpriv;
3165: const u_int dci = xhci_ep_get_dci(xfer->ux_pipe->up_endpoint->ue_edesc);
1.1 jakllsch 3166: struct xhci_ring * const tr = &xs->xs_ep[dci].xe_tr;
3167: struct xhci_xfer * const xx = (void *)xfer;
1.28.2.5 skrll 3168: usb_device_request_t * const req = &xfer->ux_request;
1.28.2.34 skrll 3169: const int isread = usbd_xfer_isread(xfer);
1.1 jakllsch 3170: const uint32_t len = UGETW(req->wLength);
1.28.2.5 skrll 3171: usb_dma_t * const dma = &xfer->ux_dmabuf;
1.1 jakllsch 3172: uint64_t parameter;
3173: uint32_t status;
3174: uint32_t control;
3175: u_int i;
3176:
1.27 skrll 3177: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3178: DPRINTFN(12, "req: %04x %04x %04x %04x",
3179: req->bmRequestType | (req->bRequest << 8), UGETW(req->wValue),
3180: UGETW(req->wIndex), UGETW(req->wLength));
1.1 jakllsch 3181:
1.28.2.37 skrll 3182: #if 0 /* event handler does this */
1.1 jakllsch 3183: /* XXX */
3184: if (tr->is_halted) {
1.28.2.19 skrll 3185: DPRINTFN(1, "ctrl xfer %p halted: slot %u dci %u",
3186: xfer, xs->xs_idx, dci, 0);
1.28.2.5 skrll 3187: xhci_reset_endpoint(xfer->ux_pipe);
1.1 jakllsch 3188: tr->is_halted = false;
1.28.2.5 skrll 3189: xhci_set_dequeue(xfer->ux_pipe);
1.1 jakllsch 3190: }
1.28.2.37 skrll 3191: #endif
1.1 jakllsch 3192:
3193: /* we rely on the bottom bits for extra info */
3194: KASSERT(((uintptr_t)xfer & 0x3) == 0x0);
3195:
1.28.2.5 skrll 3196: KASSERT((xfer->ux_rqflags & URQ_REQUEST) != 0);
1.1 jakllsch 3197:
3198: i = 0;
3199:
3200: /* setup phase */
3201: memcpy(¶meter, req, sizeof(*req));
3202: status = XHCI_TRB_2_IRQ_SET(0) | XHCI_TRB_2_BYTES_SET(sizeof(*req));
3203: control = ((len == 0) ? XHCI_TRB_3_TRT_NONE :
3204: (isread ? XHCI_TRB_3_TRT_IN : XHCI_TRB_3_TRT_OUT)) |
3205: XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_SETUP_STAGE) |
3206: XHCI_TRB_3_IDT_BIT;
3207: xhci_trb_put(&xx->xx_trb[i++], parameter, status, control);
3208:
1.28.2.50 skrll 3209: if (len != 0) {
3210: /* data phase */
3211: parameter = DMAADDR(dma, 0);
3212: KASSERT(len <= 0x10000);
3213: status = XHCI_TRB_2_IRQ_SET(0) |
3214: XHCI_TRB_2_TDSZ_SET(1) |
3215: XHCI_TRB_2_BYTES_SET(len);
3216: control = (isread ? XHCI_TRB_3_DIR_IN : 0) |
3217: XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_DATA_STAGE) |
3218: XHCI_TRB_3_CHAIN_BIT | XHCI_TRB_3_ENT_BIT;
3219: xhci_trb_put(&xx->xx_trb[i++], parameter, status, control);
3220:
3221: parameter = (uintptr_t)xfer | 0x3;
3222: status = XHCI_TRB_2_IRQ_SET(0);
3223: control = XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_EVENT_DATA) |
3224: XHCI_TRB_3_IOC_BIT;
3225: xhci_trb_put(&xx->xx_trb[i++], parameter, status, control);
3226: }
1.1 jakllsch 3227:
3228: parameter = 0;
1.28 skrll 3229: status = XHCI_TRB_2_IRQ_SET(0);
1.1 jakllsch 3230: /* the status stage has inverted direction */
1.28 skrll 3231: control = ((isread && (len > 0)) ? 0 : XHCI_TRB_3_DIR_IN) |
1.1 jakllsch 3232: XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_STATUS_STAGE) |
3233: XHCI_TRB_3_CHAIN_BIT | XHCI_TRB_3_ENT_BIT;
3234: xhci_trb_put(&xx->xx_trb[i++], parameter, status, control);
3235:
3236: parameter = (uintptr_t)xfer | 0x0;
3237: status = XHCI_TRB_2_IRQ_SET(0);
3238: control = XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_EVENT_DATA) |
3239: XHCI_TRB_3_IOC_BIT;
3240: xhci_trb_put(&xx->xx_trb[i++], parameter, status, control);
3241:
3242: mutex_enter(&tr->xr_lock);
3243: xhci_ring_put(sc, tr, xfer, xx->xx_trb, i);
3244: mutex_exit(&tr->xr_lock);
3245:
3246: xhci_db_write_4(sc, XHCI_DOORBELL(xs->xs_idx), dci);
3247:
1.28.2.5 skrll 3248: if (xfer->ux_timeout && !sc->sc_bus.ub_usepolling) {
3249: callout_reset(&xfer->ux_callout, mstohz(xfer->ux_timeout),
1.1 jakllsch 3250: xhci_timeout, xfer);
3251: }
3252:
1.28.2.5 skrll 3253: if (sc->sc_bus.ub_usepolling) {
1.27 skrll 3254: DPRINTFN(1, "polling", 0, 0, 0, 0);
1.1 jakllsch 3255: //xhci_waitintr(sc, xfer);
3256: }
3257:
3258: return USBD_IN_PROGRESS;
3259: }
3260:
3261: static void
1.28.2.14 skrll 3262: xhci_device_ctrl_done(struct usbd_xfer *xfer)
1.1 jakllsch 3263: {
1.27 skrll 3264: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.1 jakllsch 3265:
1.28.2.5 skrll 3266: callout_stop(&xfer->ux_callout); /* XXX wrong place */
1.1 jakllsch 3267:
3268: }
3269:
3270: static void
1.28.2.14 skrll 3271: xhci_device_ctrl_abort(struct usbd_xfer *xfer)
1.1 jakllsch 3272: {
1.27 skrll 3273: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.28.2.19 skrll 3274:
3275: xhci_abort_xfer(xfer, USBD_CANCELLED);
1.1 jakllsch 3276: }
3277:
3278: static void
1.28.2.14 skrll 3279: xhci_device_ctrl_close(struct usbd_pipe *pipe)
1.1 jakllsch 3280: {
1.27 skrll 3281: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.28.2.19 skrll 3282:
1.28.2.33 skrll 3283: xhci_close_pipe(pipe);
1.1 jakllsch 3284: }
3285:
1.28.2.15 skrll 3286: /* ------------------ */
3287: /* device isochronous */
1.1 jakllsch 3288:
3289: /* ----------- */
3290: /* device bulk */
3291:
3292: static usbd_status
1.28.2.14 skrll 3293: xhci_device_bulk_transfer(struct usbd_xfer *xfer)
1.1 jakllsch 3294: {
1.28.2.42 skrll 3295: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.1 jakllsch 3296: usbd_status err;
3297:
1.27 skrll 3298: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3299:
1.1 jakllsch 3300: /* Insert last in queue. */
3301: mutex_enter(&sc->sc_lock);
3302: err = usb_insert_transfer(xfer);
3303: mutex_exit(&sc->sc_lock);
3304: if (err)
3305: return err;
3306:
3307: /*
3308: * Pipe isn't running (otherwise err would be USBD_INPROG),
3309: * so start it first.
3310: */
1.28.2.13 skrll 3311: return xhci_device_bulk_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue));
1.1 jakllsch 3312: }
3313:
3314: static usbd_status
1.28.2.14 skrll 3315: xhci_device_bulk_start(struct usbd_xfer *xfer)
1.1 jakllsch 3316: {
1.28.2.42 skrll 3317: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.28.2.5 skrll 3318: struct xhci_slot * const xs = xfer->ux_pipe->up_dev->ud_hcpriv;
3319: const u_int dci = xhci_ep_get_dci(xfer->ux_pipe->up_endpoint->ue_edesc);
1.1 jakllsch 3320: struct xhci_ring * const tr = &xs->xs_ep[dci].xe_tr;
3321: struct xhci_xfer * const xx = (void *)xfer;
1.28.2.5 skrll 3322: const uint32_t len = xfer->ux_length;
3323: usb_dma_t * const dma = &xfer->ux_dmabuf;
1.1 jakllsch 3324: uint64_t parameter;
3325: uint32_t status;
3326: uint32_t control;
3327: u_int i = 0;
3328:
1.27 skrll 3329: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3330:
3331: DPRINTFN(15, "%p slot %u dci %u", xfer, xs->xs_idx, dci, 0);
1.1 jakllsch 3332:
3333: if (sc->sc_dying)
3334: return USBD_IOERROR;
3335:
1.28.2.5 skrll 3336: KASSERT((xfer->ux_rqflags & URQ_REQUEST) == 0);
1.1 jakllsch 3337:
3338: parameter = DMAADDR(dma, 0);
1.11 dsl 3339: /*
1.13 dsl 3340: * XXX: (dsl) The physical buffer must not cross a 64k boundary.
1.11 dsl 3341: * If the user supplied buffer crosses such a boundary then 2
3342: * (or more) TRB should be used.
3343: * If multiple TRB are used the td_size field must be set correctly.
3344: * For v1.0 devices (like ivy bridge) this is the number of usb data
3345: * blocks needed to complete the transfer.
3346: * Setting it to 1 in the last TRB causes an extra zero-length
3347: * data block be sent.
3348: * The earlier documentation differs, I don't know how it behaves.
3349: */
1.1 jakllsch 3350: KASSERT(len <= 0x10000);
3351: status = XHCI_TRB_2_IRQ_SET(0) |
3352: XHCI_TRB_2_TDSZ_SET(1) |
3353: XHCI_TRB_2_BYTES_SET(len);
3354: control = XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_NORMAL) |
3355: XHCI_TRB_3_ISP_BIT | XHCI_TRB_3_IOC_BIT;
3356: xhci_trb_put(&xx->xx_trb[i++], parameter, status, control);
3357:
3358: mutex_enter(&tr->xr_lock);
3359: xhci_ring_put(sc, tr, xfer, xx->xx_trb, i);
3360: mutex_exit(&tr->xr_lock);
3361:
3362: xhci_db_write_4(sc, XHCI_DOORBELL(xs->xs_idx), dci);
3363:
1.28.2.5 skrll 3364: if (sc->sc_bus.ub_usepolling) {
1.27 skrll 3365: DPRINTFN(1, "polling", 0, 0, 0, 0);
1.1 jakllsch 3366: //xhci_waitintr(sc, xfer);
3367: }
3368:
3369: return USBD_IN_PROGRESS;
3370: }
3371:
3372: static void
1.28.2.14 skrll 3373: xhci_device_bulk_done(struct usbd_xfer *xfer)
1.1 jakllsch 3374: {
1.27 skrll 3375: #ifdef USB_DEBUG
1.28.2.5 skrll 3376: struct xhci_slot * const xs = xfer->ux_pipe->up_dev->ud_hcpriv;
3377: const u_int dci = xhci_ep_get_dci(xfer->ux_pipe->up_endpoint->ue_edesc);
1.27 skrll 3378: #endif
1.28.2.34 skrll 3379: const int isread = usbd_xfer_isread(xfer);
1.1 jakllsch 3380:
1.27 skrll 3381: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.1 jakllsch 3382:
1.27 skrll 3383: DPRINTFN(15, "%p slot %u dci %u", xfer, xs->xs_idx, dci, 0);
1.1 jakllsch 3384:
1.28.2.5 skrll 3385: callout_stop(&xfer->ux_callout); /* XXX wrong place */
1.1 jakllsch 3386:
1.28.2.5 skrll 3387: usb_syncmem(&xfer->ux_dmabuf, 0, xfer->ux_length,
1.1 jakllsch 3388: isread ? BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
3389: }
3390:
3391: static void
1.28.2.14 skrll 3392: xhci_device_bulk_abort(struct usbd_xfer *xfer)
1.1 jakllsch 3393: {
1.27 skrll 3394: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.28.2.19 skrll 3395:
3396: xhci_abort_xfer(xfer, USBD_CANCELLED);
1.1 jakllsch 3397: }
3398:
3399: static void
1.28.2.14 skrll 3400: xhci_device_bulk_close(struct usbd_pipe *pipe)
1.1 jakllsch 3401: {
1.27 skrll 3402: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.28.2.19 skrll 3403:
1.28.2.33 skrll 3404: xhci_close_pipe(pipe);
1.1 jakllsch 3405: }
3406:
1.28.2.15 skrll 3407: /* ---------------- */
3408: /* device interrupt */
1.1 jakllsch 3409:
3410: static usbd_status
1.28.2.14 skrll 3411: xhci_device_intr_transfer(struct usbd_xfer *xfer)
1.1 jakllsch 3412: {
1.28.2.42 skrll 3413: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.1 jakllsch 3414: usbd_status err;
3415:
1.27 skrll 3416: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3417:
1.1 jakllsch 3418: /* Insert last in queue. */
3419: mutex_enter(&sc->sc_lock);
3420: err = usb_insert_transfer(xfer);
3421: mutex_exit(&sc->sc_lock);
3422: if (err)
3423: return err;
3424:
3425: /*
3426: * Pipe isn't running (otherwise err would be USBD_INPROG),
3427: * so start it first.
3428: */
1.28.2.13 skrll 3429: return xhci_device_intr_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue));
1.1 jakllsch 3430: }
3431:
3432: static usbd_status
1.28.2.14 skrll 3433: xhci_device_intr_start(struct usbd_xfer *xfer)
1.1 jakllsch 3434: {
1.28.2.42 skrll 3435: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.28.2.5 skrll 3436: struct xhci_slot * const xs = xfer->ux_pipe->up_dev->ud_hcpriv;
3437: const u_int dci = xhci_ep_get_dci(xfer->ux_pipe->up_endpoint->ue_edesc);
1.1 jakllsch 3438: struct xhci_ring * const tr = &xs->xs_ep[dci].xe_tr;
3439: struct xhci_xfer * const xx = (void *)xfer;
1.28.2.5 skrll 3440: const uint32_t len = xfer->ux_length;
3441: usb_dma_t * const dma = &xfer->ux_dmabuf;
1.1 jakllsch 3442: uint64_t parameter;
3443: uint32_t status;
3444: uint32_t control;
3445: u_int i = 0;
3446:
1.27 skrll 3447: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3448:
3449: DPRINTFN(15, "%p slot %u dci %u", xfer, xs->xs_idx, dci, 0);
1.1 jakllsch 3450:
3451: if (sc->sc_dying)
3452: return USBD_IOERROR;
3453:
1.28.2.5 skrll 3454: KASSERT((xfer->ux_rqflags & URQ_REQUEST) == 0);
1.1 jakllsch 3455:
3456: parameter = DMAADDR(dma, 0);
3457: KASSERT(len <= 0x10000);
3458: status = XHCI_TRB_2_IRQ_SET(0) |
3459: XHCI_TRB_2_TDSZ_SET(1) |
3460: XHCI_TRB_2_BYTES_SET(len);
3461: control = XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_NORMAL) |
3462: XHCI_TRB_3_ISP_BIT | XHCI_TRB_3_IOC_BIT;
3463: xhci_trb_put(&xx->xx_trb[i++], parameter, status, control);
3464:
3465: mutex_enter(&tr->xr_lock);
3466: xhci_ring_put(sc, tr, xfer, xx->xx_trb, i);
3467: mutex_exit(&tr->xr_lock);
3468:
3469: xhci_db_write_4(sc, XHCI_DOORBELL(xs->xs_idx), dci);
3470:
1.28.2.5 skrll 3471: if (sc->sc_bus.ub_usepolling) {
1.27 skrll 3472: DPRINTFN(1, "polling", 0, 0, 0, 0);
1.1 jakllsch 3473: //xhci_waitintr(sc, xfer);
3474: }
3475:
3476: return USBD_IN_PROGRESS;
3477: }
3478:
3479: static void
1.28.2.14 skrll 3480: xhci_device_intr_done(struct usbd_xfer *xfer)
1.1 jakllsch 3481: {
1.20 pgoyette 3482: struct xhci_softc * const sc __diagused =
1.28.2.42 skrll 3483: XHCI_XFER2SC(xfer);
1.27 skrll 3484: #ifdef USB_DEBUG
1.28.2.5 skrll 3485: struct xhci_slot * const xs = xfer->ux_pipe->up_dev->ud_hcpriv;
3486: const u_int dci = xhci_ep_get_dci(xfer->ux_pipe->up_endpoint->ue_edesc);
1.19 ozaki-r 3487: #endif
1.28.2.34 skrll 3488: const int isread = usbd_xfer_isread(xfer);
1.1 jakllsch 3489:
1.27 skrll 3490: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3491:
3492: DPRINTFN(15, "%p slot %u dci %u", xfer, xs->xs_idx, dci, 0);
1.1 jakllsch 3493:
1.28.2.5 skrll 3494: KASSERT(sc->sc_bus.ub_usepolling || mutex_owned(&sc->sc_lock));
1.1 jakllsch 3495:
1.28.2.5 skrll 3496: usb_syncmem(&xfer->ux_dmabuf, 0, xfer->ux_length,
1.1 jakllsch 3497: isread ? BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
3498:
3499: #if 0
3500: device_printf(sc->sc_dev, "");
1.28.2.5 skrll 3501: for (size_t i = 0; i < xfer->ux_length; i++) {
3502: printf(" %02x", ((uint8_t const *)xfer->ux_buffer)[i]);
1.1 jakllsch 3503: }
3504: printf("\n");
3505: #endif
3506:
1.28.2.5 skrll 3507: if (xfer->ux_pipe->up_repeat) {
3508: xfer->ux_status = xhci_device_intr_start(xfer);
1.1 jakllsch 3509: } else {
1.28.2.5 skrll 3510: callout_stop(&xfer->ux_callout); /* XXX */
1.1 jakllsch 3511: }
3512:
3513: }
3514:
3515: static void
1.28.2.14 skrll 3516: xhci_device_intr_abort(struct usbd_xfer *xfer)
1.1 jakllsch 3517: {
1.27 skrll 3518: struct xhci_softc * const sc __diagused =
1.28.2.42 skrll 3519: XHCI_XFER2SC(xfer);
1.27 skrll 3520:
3521: XHCIHIST_FUNC(); XHCIHIST_CALLED();
1.10 skrll 3522:
3523: KASSERT(mutex_owned(&sc->sc_lock));
1.27 skrll 3524: DPRINTFN(15, "%p", xfer, 0, 0, 0);
1.28.2.5 skrll 3525: KASSERT(xfer->ux_pipe->up_intrxfer == xfer);
1.28.2.19 skrll 3526: xhci_abort_xfer(xfer, USBD_CANCELLED);
1.1 jakllsch 3527: }
3528:
3529: static void
1.28.2.14 skrll 3530: xhci_device_intr_close(struct usbd_pipe *pipe)
1.1 jakllsch 3531: {
1.28.2.42 skrll 3532: //struct xhci_softc * const sc = XHCI_PIPE2SC(pipe);
1.27 skrll 3533:
3534: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3535: DPRINTFN(15, "%p", pipe, 0, 0, 0);
3536:
1.28.2.33 skrll 3537: xhci_close_pipe(pipe);
1.1 jakllsch 3538: }
3539:
3540: /* ------------ */
3541:
3542: static void
3543: xhci_timeout(void *addr)
3544: {
3545: struct xhci_xfer * const xx = addr;
1.28.2.18 skrll 3546: struct usbd_xfer * const xfer = &xx->xx_xfer;
1.28.2.42 skrll 3547: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.1 jakllsch 3548:
1.27 skrll 3549: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3550:
1.1 jakllsch 3551: if (sc->sc_dying) {
3552: return;
3553: }
3554:
3555: usb_init_task(&xx->xx_abort_task, xhci_timeout_task, addr,
3556: USB_TASKQ_MPSAFE);
1.28.2.5 skrll 3557: usb_add_task(xx->xx_xfer.ux_pipe->up_dev, &xx->xx_abort_task,
1.1 jakllsch 3558: USB_TASKQ_HC);
3559: }
3560:
3561: static void
3562: xhci_timeout_task(void *addr)
3563: {
1.28.2.18 skrll 3564: struct usbd_xfer * const xfer = addr;
1.28.2.42 skrll 3565: struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
1.1 jakllsch 3566:
1.27 skrll 3567: XHCIHIST_FUNC(); XHCIHIST_CALLED();
3568:
1.1 jakllsch 3569: mutex_enter(&sc->sc_lock);
3570: #if 0
3571: xhci_abort_xfer(xfer, USBD_TIMEOUT);
3572: #else
1.28.2.5 skrll 3573: xfer->ux_status = USBD_TIMEOUT;
1.1 jakllsch 3574: usb_transfer_complete(xfer);
3575: #endif
3576: mutex_exit(&sc->sc_lock);
3577: }
CVSweb <webmaster@jp.NetBSD.org>