Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-9]: src/sys/dev/usb Pull up following revision(s) (requested by m...
details: https://anonhg.NetBSD.org/src/rev/f6e23cf4e52f
branches: netbsd-9
changeset: 454278:f6e23cf4e52f
user: martin <martin%NetBSD.org@localhost>
date: Fri Sep 13 06:32:11 2019 +0000
description:
Pull up following revision(s) (requested by mrg in ticket #196):
sys/dev/usb/xhci.c: revision 1.111
sys/dev/usb/xhci.c: revision 1.112
sys/dev/usb/xhci.c: revision 1.113
sys/dev/usb/xhci.c: revision 1.114
introduce and use XHCIHIST_CALLARGS(). reduces lots of double logs,
and includes useful info in all cases instead of just "called".
add a couple of more logs that i've wanted while debugging ryzen3
vs USB issues.
fix 32-bit debug build, and also vmstat -y. reported by sc.dying.
fix ryzen usb issue: we set TD size to '1', where has xhci spec 4.11.2.4
says final TRB for a TD should have this set to '0'. since we currently
only generate sinel TRB TDs, set this to 0.
from sc.dying
avoid non-debug kernel build issues.
diffstat:
sys/dev/usb/xhci.c | 197 ++++++++++++++++++++++++++++------------------------
1 files changed, 107 insertions(+), 90 deletions(-)
diffs (truncated from 565 to 300 lines):
diff -r 945964e6852b -r f6e23cf4e52f sys/dev/usb/xhci.c
--- a/sys/dev/usb/xhci.c Fri Sep 13 06:25:25 2019 +0000
+++ b/sys/dev/usb/xhci.c Fri Sep 13 06:32:11 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: xhci.c,v 1.107.2.2 2019/09/01 13:00:37 martin Exp $ */
+/* $NetBSD: xhci.c,v 1.107.2.3 2019/09/13 06:32:11 martin Exp $ */
/*
* Copyright (c) 2013 Jonathan A. Kollasch
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.107.2.2 2019/09/01 13:00:37 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.107.2.3 2019/09/13 06:32:11 martin Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -114,9 +114,12 @@
#define HEXDUMP(a, b, c)
#endif
-#define DPRINTFN(N,FMT,A,B,C,D) USBHIST_LOGN(xhcidebug,N,FMT,A,B,C,D)
-#define XHCIHIST_FUNC() USBHIST_FUNC()
-#define XHCIHIST_CALLED(name) USBHIST_CALLED(xhcidebug)
+#define DPRINTF(FMT,A,B,C,D) USBHIST_LOG(xhcidebug,FMT,A,B,C,D)
+#define DPRINTFN(N,FMT,A,B,C,D) USBHIST_LOGN(xhcidebug,N,FMT,A,B,C,D)
+#define XHCIHIST_FUNC() USBHIST_FUNC()
+#define XHCIHIST_CALLED(name) USBHIST_CALLED(xhcidebug)
+#define XHCIHIST_CALLARGS(FMT,A,B,C,D) \
+ USBHIST_CALLARGS(xhcidebug,FMT,A,B,C,D)
#define XHCI_DCI_SLOT 0
#define XHCI_DCI_EP_CONTROL 1
@@ -1297,10 +1300,10 @@
uint32_t usbsts;
uint32_t iman;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
+ XHCIHIST_FUNC();
usbsts = xhci_op_read_4(sc, XHCI_USBSTS);
- DPRINTFN(16, "USBSTS %08jx", usbsts, 0, 0, 0);
+ XHCIHIST_CALLARGS("USBSTS %08jx", usbsts, 0, 0, 0);
if ((usbsts & (XHCI_STS_HSE | XHCI_STS_EINT | XHCI_STS_PCD |
XHCI_STS_HCE)) == 0) {
DPRINTFN(16, "ignored intr not for %s",
@@ -1411,8 +1414,8 @@
struct xhci_soft_trb trb;
usbd_status err;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
- DPRINTFN(4, "slot %ju dci %ju epaddr 0x%02jx attr 0x%02jx",
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("slot %ju dci %ju epaddr 0x%02jx attr 0x%02jx",
xs->xs_idx, dci, pipe->up_endpoint->ue_edesc->bEndpointAddress,
pipe->up_endpoint->ue_edesc->bmAttributes);
@@ -1450,8 +1453,8 @@
struct xhci_slot * const xs = pipe->up_dev->ud_hcpriv;
#endif
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
- DPRINTFN(4, "slot %ju", xs->xs_idx, 0, 0, 0);
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("slot %ju", xs->xs_idx, 0, 0, 0);
return USBD_NORMAL_COMPLETION;
}
@@ -1467,8 +1470,8 @@
struct xhci_soft_trb trb;
usbd_status err;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
- DPRINTFN(4, "slot %ju dci %ju", xs->xs_idx, dci, 0, 0);
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("slot %ju dci %ju", xs->xs_idx, dci, 0, 0);
KASSERT(mutex_owned(&sc->sc_lock));
@@ -1509,8 +1512,8 @@
usbd_status err;
const u_int dci = xhci_ep_get_dci(pipe->up_endpoint->ue_edesc);
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
- DPRINTFN(4, "slot %ju dci %ju", xs->xs_idx, dci, 0, 0);
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("slot %ju dci %ju", xs->xs_idx, dci, 0, 0);
KASSERT(mutex_owned(&sc->sc_lock));
@@ -1543,8 +1546,8 @@
struct xhci_soft_trb trb;
usbd_status err;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
- DPRINTFN(4, "slot %ju dci %ju", xs->xs_idx, dci, 0, 0);
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("slot %ju dci %ju", xs->xs_idx, dci, 0, 0);
KASSERT(mutex_owned(&sc->sc_lock));
@@ -1587,8 +1590,8 @@
usb_endpoint_descriptor_t * const ed = pipe->up_endpoint->ue_edesc;
const uint8_t xfertype = UE_GET_XFERTYPE(ed->bmAttributes);
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
- DPRINTFN(1, "addr %jd depth %jd port %jd speed %jd", dev->ud_addr,
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("addr %jd depth %jd port %jd speed %jd", dev->ud_addr,
dev->ud_depth, dev->ud_powersrc->up_portno, dev->ud_speed);
DPRINTFN(1, " dci %ju type 0x%02jx epaddr 0x%02jx attr 0x%02jx",
xhci_ep_get_dci(ed), ed->bDescriptorType, ed->bEndpointAddress,
@@ -1657,7 +1660,7 @@
struct xhci_soft_trb trb;
uint32_t *cp;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
+ XHCIHIST_FUNC();
if (sc->sc_dying)
return;
@@ -1666,8 +1669,8 @@
if (xs == NULL || xs->xs_idx == 0)
return;
- DPRINTFN(4, "pipe %#jx slot %ju dci %ju", (uintptr_t)pipe, xs->xs_idx,
- dci, 0);
+ XHCIHIST_CALLARGS("pipe %#jx slot %ju dci %ju",
+ (uintptr_t)pipe, xs->xs_idx, dci, 0);
KASSERTMSG(!cpu_intr_p() && !cpu_softintr_p(), "called from intr ctx");
KASSERT(mutex_owned(&sc->sc_lock));
@@ -1719,7 +1722,7 @@
static void
xhci_abort_xfer(struct usbd_xfer *xfer, usbd_status status)
{
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
+ XHCIHIST_FUNC();
struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
struct xhci_slot * const xs = xfer->ux_pipe->up_dev->ud_hcpriv;
const u_int dci = xhci_ep_get_dci(xfer->ux_pipe->up_endpoint->ue_edesc);
@@ -1727,7 +1730,7 @@
KASSERTMSG((status == USBD_CANCELLED || status == USBD_TIMEOUT),
"invalid status for abort: %d", (int)status);
- DPRINTFN(4, "xfer %#jx pipe %#jx status %jd",
+ XHCIHIST_CALLARGS("xfer %#jx pipe %#jx status %jd",
(uintptr_t)xfer, (uintptr_t)xfer->ux_pipe, status, 0);
KASSERT(mutex_owned(&sc->sc_lock));
@@ -1838,8 +1841,8 @@
const u_int dci = xhci_ep_get_dci(xfer->ux_pipe->up_endpoint->ue_edesc);
struct xhci_ring * const tr = &xs->xs_ep[dci].xe_tr;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
- DPRINTFN(4, "xfer %#jx slot %ju dci %ju", (uintptr_t)xfer, xs->xs_idx,
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("xfer %#jx slot %ju dci %ju", (uintptr_t)xfer, xs->xs_idx,
dci, 0);
/*
@@ -1871,8 +1874,8 @@
struct xhci_softc * const sc = XHCI_XFER2SC(xfer);
struct xhci_pipe * const xp = (struct xhci_pipe *)xfer->ux_pipe;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
- DPRINTFN(4, "xfer %#jx", (uintptr_t)xfer, 0, 0, 0);
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("xfer %#jx", (uintptr_t)xfer, 0, 0, 0);
if (sc->sc_dying) {
return USBD_IOERROR;
@@ -1890,9 +1893,9 @@
static void
xhci_rhpsc(struct xhci_softc * const sc, u_int ctlrport)
{
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
- DPRINTFN(4, "xhci%jd: port %ju status change", device_unit(sc->sc_dev),
- ctlrport, 0, 0);
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("xhci%jd: port %ju status change",
+ device_unit(sc->sc_dev), ctlrport, 0, 0);
if (ctlrport > sc->sc_maxports)
return;
@@ -2167,13 +2170,13 @@
uint64_t trb_0;
uint32_t trb_2, trb_3;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
+ XHCIHIST_FUNC();
trb_0 = le64toh(trb->trb_0);
trb_2 = le32toh(trb->trb_2);
trb_3 = le32toh(trb->trb_3);
- DPRINTFN(14, "event: %#jx 0x%016jx 0x%08jx 0x%08jx",
+ XHCIHIST_CALLARGS("event: %#jx 0x%016jx 0x%08jx 0x%08jx",
(uintptr_t)trb, trb_0, trb_2, trb_3);
/*
@@ -2216,14 +2219,14 @@
struct xhci_trb *trb;
int i, j, k;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
+ XHCIHIST_FUNC();
KASSERT(xhci_polling_p(sc) || mutex_owned(&sc->sc_lock));
i = er->xr_ep;
j = er->xr_cs;
- DPRINTFN(16, "er: xr_ep %jd xr_cs %jd", i, j, 0, 0);
+ XHCIHIST_CALLARGS("er: xr_ep %jd xr_cs %jd", i, j, 0, 0);
while (1) {
usb_syncmem(&er->xr_dma, XHCI_TRB_SIZE * i, XHCI_TRB_SIZE,
@@ -2346,8 +2349,8 @@
struct xhci_slot *xs;
uint32_t *cp;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
- DPRINTFN(4, "port %ju depth %ju speed %ju up %#jx",
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("port %ju depth %ju speed %ju up %#jx",
port, depth, speed, (uintptr_t)up);
dev = kmem_zalloc(sizeof(*dev), KM_SLEEP);
@@ -2448,7 +2451,7 @@
/* 4.3.4 Address Assignment */
err = xhci_set_address(dev, slot, false);
if (err) {
- DPRINTFN(1, "set address w/o bsr %ju", err, 0, 0, 0);
+ DPRINTFN(1, "failed! to set address: %ju", err, 0, 0, 0);
goto bad;
}
@@ -2544,7 +2547,9 @@
usbd_status err;
size_t size = ntrb * XHCI_TRB_SIZE;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("xr %#jx ntrb %#jx align %#jx",
+ (uintptr_t)xr, ntrb, align, 0);
err = usb_allocmem(&sc->sc_bus, size, align, &xr->xr_dma);
if (err)
@@ -2578,7 +2583,9 @@
uint32_t status;
uint32_t control;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("%#jx xr_ep 0x%jx xr_cs %ju",
+ (uintptr_t)xr, xr->xr_ep, xr->xr_cs, 0);
KASSERTMSG(ntrbs <= XHCI_XFER_NTRB, "ntrbs %zu", ntrbs);
for (i = 0; i < ntrbs; i++) {
@@ -2590,9 +2597,6 @@
XHCI_TRB_TYPE_LINK, "trbs[%zu].trb3 %#x", i, trbs[i].trb_3);
}
- DPRINTFN(12, "%#jx xr_ep 0x%jx xr_cs %ju", (uintptr_t)xr, xr->xr_ep,
- xr->xr_cs, 0);
-
ri = xr->xr_ep;
cs = xr->xr_cs;
@@ -2686,8 +2690,8 @@
uint64_t crcr;
int i;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
- DPRINTFN(14, "command %#jx timeout, aborting",
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("command %#jx timeout, aborting",
sc->sc_command_addr, 0, 0, 0);
mutex_enter(&cr->xr_lock);
@@ -2729,8 +2733,8 @@
struct xhci_ring * const cr = &sc->sc_cr;
usbd_status err;
- XHCIHIST_FUNC(); XHCIHIST_CALLED();
- DPRINTFN(12, "input: 0x%016jx 0x%08jx 0x%08jx",
+ XHCIHIST_FUNC();
+ XHCIHIST_CALLARGS("input: 0x%016jx 0x%08jx 0x%08jx",
trb->trb_0, trb->trb_2, trb->trb_3, 0);
KASSERTMSG(!cpu_intr_p() && !cpu_softintr_p(), "called from intr ctx");
@@ -2778,6 +2782,8 @@
break;
default:
case 192 ... 223:
+ DPRINTFN(5, "error %x",
+ XHCI_TRB_2_ERROR_GET(trb->trb_2), 0, 0, 0);
err = USBD_IOERROR;
Home |
Main Index |
Thread Index |
Old Index