12 #include <linux/slab.h>
13 #include <linux/kernel.h>
19 static struct dentry *uhci_debugfs_root;
24 static void lprintk(
char *
buf)
52 out +=
sprintf(out,
"%*s[%p] link (%08x) ", space,
"", td,
54 out +=
sprintf(out,
"e%d %s%s%s%s%s%s%s%s%s%sLength=%x ",
84 out +=
sprintf(out,
"MaxLen=%x DT%d EndPt=%x Dev=%x, PID=%x(%s) ",
97 char *buf,
int len,
int space)
101 int i, nactive, ninactive;
107 out +=
sprintf(out,
"urb_priv [%p] ", urbp);
109 out +=
sprintf(out,
"qh [%p] ", urbp->
qh);
110 out +=
sprintf(out,
"Dev=%d ", usb_pipedevice(urbp->
urb->pipe));
111 out +=
sprintf(out,
"EP=%x(%s) ", usb_pipeendpoint(urbp->
urb->pipe),
112 (usb_pipein(urbp->
urb->pipe) ?
"IN" :
"OUT"));
114 switch (usb_pipetype(urbp->
urb->pipe)) {
115 case PIPE_ISOCHRONOUS: ptype =
"ISO";
break;
116 case PIPE_INTERRUPT: ptype =
"INT";
break;
117 case PIPE_BULK: ptype =
"BLK";
break;
119 case PIPE_CONTROL: ptype =
"CTL";
break;
122 out +=
sprintf(out,
"%s%s", ptype, (urbp->
fsbr ?
" FSBR" :
""));
123 out +=
sprintf(out,
" Actlen=%d%s", urbp->
urb->actual_length,
127 if (urbp->
urb->unlinked)
128 out +=
sprintf(out,
" Unlinked=%d", urbp->
urb->unlinked);
131 i = nactive = ninactive = 0;
134 (++i <= 10 || debug > 2)) {
135 out +=
sprintf(out,
"%*s%d: ", space + 2,
"", i);
136 out += uhci_show_td(uhci, td, out,
137 len - (out - buf), 0);
139 if (
td_status(uhci, td) & TD_CTRL_ACTIVE)
145 if (nactive + ninactive > 0)
146 out +=
sprintf(out,
"%*s[skipped %d inactive and %d active "
148 space,
"", ninactive, nactive);
153 static int uhci_show_qh(
struct uhci_hcd *uhci,
154 struct uhci_qh *qh,
char *buf,
int len,
int space)
170 default: qtype =
"Skel" ;
break;
173 out +=
sprintf(out,
"%*s[%p] %s QH link (%08x) element (%08x)\n",
174 space,
"", qh, qtype,
178 out +=
sprintf(out,
"%*s period %d phase %d load %d us, "
179 "frame %x desc [%p]\n",
183 out +=
sprintf(out,
"%*s period %d phase %d load %d us\n",
187 out +=
sprintf(out,
"%*s Element points to QH (bug?)\n", space,
"");
190 out +=
sprintf(out,
"%*s Depth traverse\n", space,
"");
193 out +=
sprintf(out,
"%*s Bit 3 set (bug?)\n", space,
"");
196 out +=
sprintf(out,
"%*s Element is NULL (bug?)\n", space,
"");
198 if (list_empty(&qh->
queue)) {
199 out +=
sprintf(out,
"%*s queue is empty\n", space,
"");
200 if (qh == uhci->skel_async_qh)
201 out += uhci_show_td(uhci, uhci->
term_td, out,
202 len - (out - buf), 0);
210 out +=
sprintf(out,
"%*s Element != First TD\n",
215 out += uhci_show_urbp(uhci, urbp, out,
216 len - (out - buf), space + 2);
221 out +=
sprintf(out,
"%*s Skipped %d URBs\n",
226 out +=
sprintf(out,
"%*s Dummy TD\n", space,
"");
227 out += uhci_show_td(uhci, qh->
dummy_td, out,
228 len - (out - buf), 0);
234 static int uhci_show_sc(
int port,
unsigned short status,
char *buf,
int len)
242 out +=
sprintf(out,
" stat%d = %04x %s%s%s%s%s%s%s%s%s%s\n",
259 static int uhci_show_root_hub_state(
struct uhci_hcd *uhci,
char *buf,
int len)
270 rh_state =
"reset";
break;
272 rh_state =
"suspended";
break;
274 rh_state =
"auto-stopped";
break;
276 rh_state =
"resuming";
break;
278 rh_state =
"suspending";
break;
280 rh_state =
"running";
break;
282 rh_state =
"running, no devs";
break;
284 rh_state =
"?";
break;
286 out +=
sprintf(out,
"Root-hub state: %s FSBR: %d\n",
291 static int uhci_show_status(
struct uhci_hcd *uhci,
char *buf,
int len)
294 unsigned short usbcmd,
usbstat, usbint, usbfrnum;
295 unsigned int flbaseadd;
297 unsigned short portsc1, portsc2;
303 usbcmd = uhci_readw(uhci, 0);
304 usbstat = uhci_readw(uhci, 2);
305 usbint = uhci_readw(uhci, 4);
306 usbfrnum = uhci_readw(uhci, 6);
307 flbaseadd = uhci_readl(uhci, 8);
308 sof = uhci_readb(uhci, 12);
309 portsc1 = uhci_readw(uhci, 16);
310 portsc2 = uhci_readw(uhci, 18);
312 out +=
sprintf(out,
" usbcmd = %04x %s%s%s%s%s%s%s%s\n",
323 out +=
sprintf(out,
" usbstat = %04x %s%s%s%s%s%s\n",
326 (usbstat &
USBSTS_HCPE) ?
"HostControllerProcessError " :
"",
327 (usbstat &
USBSTS_HSE) ?
"HostSystemError " :
"",
328 (usbstat &
USBSTS_RD) ?
"ResumeDetect " :
"",
332 out +=
sprintf(out,
" usbint = %04x\n", usbint);
333 out +=
sprintf(out,
" usbfrnum = (%d)%03x\n", (usbfrnum >> 10) & 1,
334 0xfff & (4*(
unsigned int)usbfrnum));
335 out +=
sprintf(out,
" flbaseadd = %08x\n", flbaseadd);
336 out +=
sprintf(out,
" sof = %02x\n", sof);
337 out += uhci_show_sc(1, portsc1, out, len - (out - buf));
338 out += uhci_show_sc(2, portsc2, out, len - (out - buf));
339 out +=
sprintf(out,
"Most recent frame: %x (%d) "
340 "Last ISO frame: %x (%d)\n",
347 static int uhci_sprint_schedule(
struct uhci_hcd *uhci,
char *buf,
int len)
358 static const char *
const qh_names[] = {
359 "unlink",
"iso",
"int128",
"int64",
"int32",
"int16",
360 "int8",
"int4",
"int2",
"async",
"term"
363 out += uhci_show_root_hub_state(uhci, out, len - (out - buf));
364 out +=
sprintf(out,
"HC status\n");
365 out += uhci_show_status(uhci, out, len - (out - buf));
367 out +=
sprintf(out,
"Periodic load table\n");
373 out +=
sprintf(out,
"Total: %d, #INT: %d, #ISO: %d\n",
375 uhci_to_hcd(uhci)->
self.bandwidth_int_reqs,
376 uhci_to_hcd(uhci)->
self.bandwidth_isoc_reqs);
380 out +=
sprintf(out,
"Frame List\n");
393 out +=
sprintf(out,
"- Frame %d -> (%08x)\n",
405 out +=
sprintf(out,
" link does "
406 "not match list entry!\n");
411 out += uhci_show_td(uhci, td, out,
412 len - (out - buf), 4);
414 }
while (tmp != head);
417 qh_dma = uhci_frame_skel_link(uhci, i);
418 if (link != qh_dma) {
422 "- Frame %d -> (%08x)\n",
426 out +=
sprintf(out,
" link does not match "
435 out +=
sprintf(out,
"Skipped %d bad links\n", nerrs);
437 out +=
sprintf(out,
"Skeleton QHs\n");
444 out +=
sprintf(out,
"- skel_%s_qh\n", qh_names[i]); \
445 out += uhci_show_qh(uhci, qh, out, len - (out - buf), 4);
450 out +=
sprintf(out,
" skel_term_qh element is not set to term_td!\n");
460 while (tmp != head) {
464 out += uhci_show_qh(uhci, qh, out,
465 len - (out - buf), 4);
470 out +=
sprintf(out,
" Skipped %d QHs\n", cnt);
482 if (qh->
link != link)
483 out +=
sprintf(out,
" last QH not linked to next skeleton!\n");
489 #ifdef CONFIG_DEBUG_FS
491 #define MAX_OUTPUT (64 * 1024)
501 struct uhci_debug *
up;
517 up->size = uhci_sprint_schedule(uhci, up->data,
MAX_OUTPUT);
518 spin_unlock_irqrestore(&uhci->
lock, flags);
525 static loff_t uhci_debug_lseek(
struct file *file, loff_t off,
int whence)
527 struct uhci_debug *
up;
538 new = file->
f_pos + off;
542 if (new < 0 || new > up->size)
545 return (file->
f_pos =
new);
548 static ssize_t uhci_debug_read(
struct file *file,
char __user *buf,
549 size_t nbytes, loff_t *ppos)
555 static int uhci_debug_release(
struct inode *inode,
struct file *file)
567 .open = uhci_debug_open,
568 .llseek = uhci_debug_lseek,
569 .read = uhci_debug_read,
570 .release = uhci_debug_release,
572 #define UHCI_DEBUG_OPS
578 static inline void lprintk(
char *buf)
581 static inline int uhci_show_qh(
struct uhci_hcd *uhci,
582 struct uhci_qh *qh,
char *buf,
int len,
int space)
587 static inline int uhci_sprint_schedule(
struct uhci_hcd *uhci,