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