xref: /dflybsd-src/sys/bus/u4b/usb_debug.c (revision 12bd3c8bdb153b265dcce6f8cde3b86911661898)
1*12bd3c8bSSascha Wildner /* $FreeBSD$ */
2*12bd3c8bSSascha Wildner /*-
3*12bd3c8bSSascha Wildner  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
4*12bd3c8bSSascha Wildner  *
5*12bd3c8bSSascha Wildner  * Redistribution and use in source and binary forms, with or without
6*12bd3c8bSSascha Wildner  * modification, are permitted provided that the following conditions
7*12bd3c8bSSascha Wildner  * are met:
8*12bd3c8bSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
9*12bd3c8bSSascha Wildner  *    notice, this list of conditions and the following disclaimer.
10*12bd3c8bSSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
11*12bd3c8bSSascha Wildner  *    notice, this list of conditions and the following disclaimer in the
12*12bd3c8bSSascha Wildner  *    documentation and/or other materials provided with the distribution.
13*12bd3c8bSSascha Wildner  *
14*12bd3c8bSSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*12bd3c8bSSascha Wildner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*12bd3c8bSSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*12bd3c8bSSascha Wildner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*12bd3c8bSSascha Wildner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*12bd3c8bSSascha Wildner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*12bd3c8bSSascha Wildner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*12bd3c8bSSascha Wildner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*12bd3c8bSSascha Wildner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*12bd3c8bSSascha Wildner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*12bd3c8bSSascha Wildner  * SUCH DAMAGE.
25*12bd3c8bSSascha Wildner  */
26*12bd3c8bSSascha Wildner 
27*12bd3c8bSSascha Wildner #include <sys/stdint.h>
28*12bd3c8bSSascha Wildner #include <sys/stddef.h>
29*12bd3c8bSSascha Wildner #include <sys/param.h>
30*12bd3c8bSSascha Wildner #include <sys/queue.h>
31*12bd3c8bSSascha Wildner #include <sys/types.h>
32*12bd3c8bSSascha Wildner #include <sys/systm.h>
33*12bd3c8bSSascha Wildner #include <sys/kernel.h>
34*12bd3c8bSSascha Wildner #include <sys/bus.h>
35*12bd3c8bSSascha Wildner #include <sys/module.h>
36*12bd3c8bSSascha Wildner #include <sys/lock.h>
37*12bd3c8bSSascha Wildner #include <sys/mutex.h>
38*12bd3c8bSSascha Wildner #include <sys/condvar.h>
39*12bd3c8bSSascha Wildner #include <sys/sysctl.h>
40*12bd3c8bSSascha Wildner #include <sys/sx.h>
41*12bd3c8bSSascha Wildner #include <sys/unistd.h>
42*12bd3c8bSSascha Wildner #include <sys/callout.h>
43*12bd3c8bSSascha Wildner #include <sys/malloc.h>
44*12bd3c8bSSascha Wildner #include <sys/priv.h>
45*12bd3c8bSSascha Wildner 
46*12bd3c8bSSascha Wildner #include <dev/usb/usb.h>
47*12bd3c8bSSascha Wildner #include <dev/usb/usbdi.h>
48*12bd3c8bSSascha Wildner 
49*12bd3c8bSSascha Wildner #include <dev/usb/usb_core.h>
50*12bd3c8bSSascha Wildner #include <dev/usb/usb_debug.h>
51*12bd3c8bSSascha Wildner #include <dev/usb/usb_process.h>
52*12bd3c8bSSascha Wildner #include <dev/usb/usb_device.h>
53*12bd3c8bSSascha Wildner #include <dev/usb/usb_busdma.h>
54*12bd3c8bSSascha Wildner #include <dev/usb/usb_transfer.h>
55*12bd3c8bSSascha Wildner 
56*12bd3c8bSSascha Wildner #include <ddb/ddb.h>
57*12bd3c8bSSascha Wildner #include <ddb/db_sym.h>
58*12bd3c8bSSascha Wildner 
59*12bd3c8bSSascha Wildner /*
60*12bd3c8bSSascha Wildner  * Define this unconditionally in case a kernel module is loaded that
61*12bd3c8bSSascha Wildner  * has been compiled with debugging options.
62*12bd3c8bSSascha Wildner  */
63*12bd3c8bSSascha Wildner int	usb_debug = 0;
64*12bd3c8bSSascha Wildner 
65*12bd3c8bSSascha Wildner SYSCTL_NODE(_hw, OID_AUTO, usb, CTLFLAG_RW, 0, "USB debugging");
66*12bd3c8bSSascha Wildner SYSCTL_INT(_hw_usb, OID_AUTO, debug, CTLFLAG_RW,
67*12bd3c8bSSascha Wildner     &usb_debug, 0, "Debug level");
68*12bd3c8bSSascha Wildner 
69*12bd3c8bSSascha Wildner TUNABLE_INT("hw.usb.debug", &usb_debug);
70*12bd3c8bSSascha Wildner 
71*12bd3c8bSSascha Wildner /*------------------------------------------------------------------------*
72*12bd3c8bSSascha Wildner  *	usb_dump_iface
73*12bd3c8bSSascha Wildner  *
74*12bd3c8bSSascha Wildner  * This function dumps information about an USB interface.
75*12bd3c8bSSascha Wildner  *------------------------------------------------------------------------*/
76*12bd3c8bSSascha Wildner void
77*12bd3c8bSSascha Wildner usb_dump_iface(struct usb_interface *iface)
78*12bd3c8bSSascha Wildner {
79*12bd3c8bSSascha Wildner 	printf("usb_dump_iface: iface=%p\n", iface);
80*12bd3c8bSSascha Wildner 	if (iface == NULL) {
81*12bd3c8bSSascha Wildner 		return;
82*12bd3c8bSSascha Wildner 	}
83*12bd3c8bSSascha Wildner 	printf(" iface=%p idesc=%p altindex=%d\n",
84*12bd3c8bSSascha Wildner 	    iface, iface->idesc, iface->alt_index);
85*12bd3c8bSSascha Wildner }
86*12bd3c8bSSascha Wildner 
87*12bd3c8bSSascha Wildner /*------------------------------------------------------------------------*
88*12bd3c8bSSascha Wildner  *	usb_dump_device
89*12bd3c8bSSascha Wildner  *
90*12bd3c8bSSascha Wildner  * This function dumps information about an USB device.
91*12bd3c8bSSascha Wildner  *------------------------------------------------------------------------*/
92*12bd3c8bSSascha Wildner void
93*12bd3c8bSSascha Wildner usb_dump_device(struct usb_device *udev)
94*12bd3c8bSSascha Wildner {
95*12bd3c8bSSascha Wildner 	printf("usb_dump_device: dev=%p\n", udev);
96*12bd3c8bSSascha Wildner 	if (udev == NULL) {
97*12bd3c8bSSascha Wildner 		return;
98*12bd3c8bSSascha Wildner 	}
99*12bd3c8bSSascha Wildner 	printf(" bus=%p \n"
100*12bd3c8bSSascha Wildner 	    " address=%d config=%d depth=%d speed=%d self_powered=%d\n"
101*12bd3c8bSSascha Wildner 	    " power=%d langid=%d\n",
102*12bd3c8bSSascha Wildner 	    udev->bus,
103*12bd3c8bSSascha Wildner 	    udev->address, udev->curr_config_no, udev->depth, udev->speed,
104*12bd3c8bSSascha Wildner 	    udev->flags.self_powered, udev->power, udev->langid);
105*12bd3c8bSSascha Wildner }
106*12bd3c8bSSascha Wildner 
107*12bd3c8bSSascha Wildner /*------------------------------------------------------------------------*
108*12bd3c8bSSascha Wildner  *	usb_dump_queue
109*12bd3c8bSSascha Wildner  *
110*12bd3c8bSSascha Wildner  * This function dumps the USB transfer that are queued up on an USB endpoint.
111*12bd3c8bSSascha Wildner  *------------------------------------------------------------------------*/
112*12bd3c8bSSascha Wildner void
113*12bd3c8bSSascha Wildner usb_dump_queue(struct usb_endpoint *ep)
114*12bd3c8bSSascha Wildner {
115*12bd3c8bSSascha Wildner 	struct usb_xfer *xfer;
116*12bd3c8bSSascha Wildner 
117*12bd3c8bSSascha Wildner 	printf("usb_dump_queue: endpoint=%p xfer: ", ep);
118*12bd3c8bSSascha Wildner 	TAILQ_FOREACH(xfer, &ep->endpoint_q.head, wait_entry) {
119*12bd3c8bSSascha Wildner 		printf(" %p", xfer);
120*12bd3c8bSSascha Wildner 	}
121*12bd3c8bSSascha Wildner 	printf("\n");
122*12bd3c8bSSascha Wildner }
123*12bd3c8bSSascha Wildner 
124*12bd3c8bSSascha Wildner /*------------------------------------------------------------------------*
125*12bd3c8bSSascha Wildner  *	usb_dump_endpoint
126*12bd3c8bSSascha Wildner  *
127*12bd3c8bSSascha Wildner  * This function dumps information about an USB endpoint.
128*12bd3c8bSSascha Wildner  *------------------------------------------------------------------------*/
129*12bd3c8bSSascha Wildner void
130*12bd3c8bSSascha Wildner usb_dump_endpoint(struct usb_endpoint *ep)
131*12bd3c8bSSascha Wildner {
132*12bd3c8bSSascha Wildner 	if (ep) {
133*12bd3c8bSSascha Wildner 		printf("usb_dump_endpoint: endpoint=%p", ep);
134*12bd3c8bSSascha Wildner 
135*12bd3c8bSSascha Wildner 		printf(" edesc=%p isoc_next=%d toggle_next=%d",
136*12bd3c8bSSascha Wildner 		    ep->edesc, ep->isoc_next, ep->toggle_next);
137*12bd3c8bSSascha Wildner 
138*12bd3c8bSSascha Wildner 		if (ep->edesc) {
139*12bd3c8bSSascha Wildner 			printf(" bEndpointAddress=0x%02x",
140*12bd3c8bSSascha Wildner 			    ep->edesc->bEndpointAddress);
141*12bd3c8bSSascha Wildner 		}
142*12bd3c8bSSascha Wildner 		printf("\n");
143*12bd3c8bSSascha Wildner 		usb_dump_queue(ep);
144*12bd3c8bSSascha Wildner 	} else {
145*12bd3c8bSSascha Wildner 		printf("usb_dump_endpoint: endpoint=NULL\n");
146*12bd3c8bSSascha Wildner 	}
147*12bd3c8bSSascha Wildner }
148*12bd3c8bSSascha Wildner 
149*12bd3c8bSSascha Wildner /*------------------------------------------------------------------------*
150*12bd3c8bSSascha Wildner  *	usb_dump_xfer
151*12bd3c8bSSascha Wildner  *
152*12bd3c8bSSascha Wildner  * This function dumps information about an USB transfer.
153*12bd3c8bSSascha Wildner  *------------------------------------------------------------------------*/
154*12bd3c8bSSascha Wildner void
155*12bd3c8bSSascha Wildner usb_dump_xfer(struct usb_xfer *xfer)
156*12bd3c8bSSascha Wildner {
157*12bd3c8bSSascha Wildner 	struct usb_device *udev;
158*12bd3c8bSSascha Wildner 	printf("usb_dump_xfer: xfer=%p\n", xfer);
159*12bd3c8bSSascha Wildner 	if (xfer == NULL) {
160*12bd3c8bSSascha Wildner 		return;
161*12bd3c8bSSascha Wildner 	}
162*12bd3c8bSSascha Wildner 	if (xfer->endpoint == NULL) {
163*12bd3c8bSSascha Wildner 		printf("xfer %p: endpoint=NULL\n",
164*12bd3c8bSSascha Wildner 		    xfer);
165*12bd3c8bSSascha Wildner 		return;
166*12bd3c8bSSascha Wildner 	}
167*12bd3c8bSSascha Wildner 	udev = xfer->xroot->udev;
168*12bd3c8bSSascha Wildner 	printf("xfer %p: udev=%p vid=0x%04x pid=0x%04x addr=%d "
169*12bd3c8bSSascha Wildner 	    "endpoint=%p ep=0x%02x attr=0x%02x\n",
170*12bd3c8bSSascha Wildner 	    xfer, udev,
171*12bd3c8bSSascha Wildner 	    UGETW(udev->ddesc.idVendor),
172*12bd3c8bSSascha Wildner 	    UGETW(udev->ddesc.idProduct),
173*12bd3c8bSSascha Wildner 	    udev->address, xfer->endpoint,
174*12bd3c8bSSascha Wildner 	    xfer->endpoint->edesc->bEndpointAddress,
175*12bd3c8bSSascha Wildner 	    xfer->endpoint->edesc->bmAttributes);
176*12bd3c8bSSascha Wildner }
177