aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/uhci-debug.c
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2007-01-08 12:00:28 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2007-02-07 18:44:35 -0500
commitf3fe239b67424d88104e32076aec902c0642925f (patch)
treed7b3986dcdcb434111c0570eb2a129b2570e3bfa /drivers/usb/host/uhci-debug.c
parentf38649fee955c19f4df9b9e7267f87702712d973 (diff)
UHCI: improved debugging checks for the frame list
This patch (as768) improves the debugging checks for the uhci-hcd frame list. The number of entries displayed is limited to 10, and the driver now checks for the correct Skeleton QH link value at the end of each chain of Isochronous TDs. The code to compute these link values is now used in two spots, so it is moved into its own separate subroutine. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/uhci-debug.c')
-rw-r--r--drivers/usb/host/uhci-debug.c48
1 files changed, 43 insertions, 5 deletions
diff --git a/drivers/usb/host/uhci-debug.c b/drivers/usb/host/uhci-debug.c
index e345f15b7d87..b40bc1ac9b8c 100644
--- a/drivers/usb/host/uhci-debug.c
+++ b/drivers/usb/host/uhci-debug.c
@@ -347,6 +347,7 @@ static int uhci_sprint_schedule(struct uhci_hcd *uhci, char *buf, int len)
347 struct uhci_qh *qh; 347 struct uhci_qh *qh;
348 struct uhci_td *td; 348 struct uhci_td *td;
349 struct list_head *tmp, *head; 349 struct list_head *tmp, *head;
350 int nframes, nerrs;
350 351
351 out += uhci_show_root_hub_state(uhci, out, len - (out - buf)); 352 out += uhci_show_root_hub_state(uhci, out, len - (out - buf));
352 out += sprintf(out, "HC status\n"); 353 out += sprintf(out, "HC status\n");
@@ -355,23 +356,60 @@ static int uhci_sprint_schedule(struct uhci_hcd *uhci, char *buf, int len)
355 return out - buf; 356 return out - buf;
356 357
357 out += sprintf(out, "Frame List\n"); 358 out += sprintf(out, "Frame List\n");
359 nframes = 10;
360 nerrs = 0;
358 for (i = 0; i < UHCI_NUMFRAMES; ++i) { 361 for (i = 0; i < UHCI_NUMFRAMES; ++i) {
362 __le32 link, qh_dma;
363
364 j = 0;
359 td = uhci->frame_cpu[i]; 365 td = uhci->frame_cpu[i];
366 link = uhci->frame[i];
360 if (!td) 367 if (!td)
361 continue; 368 goto check_link;
362 369
363 out += sprintf(out, "- Frame %d\n", i); \ 370 if (nframes > 0) {
364 if (td->dma_handle != (dma_addr_t)uhci->frame[i]) 371 out += sprintf(out, "- Frame %d -> (%08x)\n",
365 out += sprintf(out, " frame list does not match td->dma_handle!\n"); 372 i, le32_to_cpu(link));
373 j = 1;
374 }
366 375
367 head = &td->fl_list; 376 head = &td->fl_list;
368 tmp = head; 377 tmp = head;
369 do { 378 do {
370 td = list_entry(tmp, struct uhci_td, fl_list); 379 td = list_entry(tmp, struct uhci_td, fl_list);
371 tmp = tmp->next; 380 tmp = tmp->next;
372 out += uhci_show_td(td, out, len - (out - buf), 4); 381 if (cpu_to_le32(td->dma_handle) != link) {
382 if (nframes > 0)
383 out += sprintf(out, " link does "
384 "not match list entry!\n");
385 else
386 ++nerrs;
387 }
388 if (nframes > 0)
389 out += uhci_show_td(td, out,
390 len - (out - buf), 4);
391 link = td->link;
373 } while (tmp != head); 392 } while (tmp != head);
393
394check_link:
395 qh_dma = uhci_frame_skel_link(uhci, i);
396 if (link != qh_dma) {
397 if (nframes > 0) {
398 if (!j) {
399 out += sprintf(out,
400 "- Frame %d -> (%08x)\n",
401 i, le32_to_cpu(link));
402 j = 1;
403 }
404 out += sprintf(out, " link does not match "
405 "QH (%08x)!\n", le32_to_cpu(qh_dma));
406 } else
407 ++nerrs;
408 }
409 nframes -= j;
374 } 410 }
411 if (nerrs > 0)
412 out += sprintf(out, "Skipped %d bad links\n", nerrs);
375 413
376 out += sprintf(out, "Skeleton QHs\n"); 414 out += sprintf(out, "Skeleton QHs\n");
377 415