aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Anderson <dianders@chromium.org>2016-01-28 21:19:58 -0500
committerFelipe Balbi <balbi@kernel.org>2016-03-04 08:14:41 -0500
commit74fc4a7558f859e89b849cc87afed38f517ded9a (patch)
treeaf2db4a91021e7b499bd66cf811b4f410adaccba
parentc9c8ac0150df2b75b25683cd3df3cb56877e4e52 (diff)
usb: dwc2: host: Add scheduler tracing
In preparation for future changes to the scheduler let's add some tracing that makes it easy for us to see what's happening. By default this tracing will be off. By changing "core.h" you can easily trace to ftrace, the console, or nowhere. Acked-by: John Youn <johnyoun@synopsys.com> Signed-off-by: Douglas Anderson <dianders@chromium.org> Reviewed-by: Kever Yang <kever.yang@rock-chips.com> Tested-by: Heiko Stuebner <heiko@sntech.de> Tested-by: Stefan Wahren <stefan.wahren@i2se.com> Signed-off-by: Felipe Balbi <balbi@kernel.org>
-rw-r--r--drivers/usb/dwc2/core.h20
-rw-r--r--drivers/usb/dwc2/hcd.h5
-rw-r--r--drivers/usb/dwc2/hcd_intr.c6
-rw-r--r--drivers/usb/dwc2/hcd_queue.c24
4 files changed, 53 insertions, 2 deletions
diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
index 538cf38af0e4..18f9e4045643 100644
--- a/drivers/usb/dwc2/core.h
+++ b/drivers/usb/dwc2/core.h
@@ -44,6 +44,26 @@
44#include <linux/usb/phy.h> 44#include <linux/usb/phy.h>
45#include "hw.h" 45#include "hw.h"
46 46
47/*
48 * Suggested defines for tracers:
49 * - no_printk: Disable tracing
50 * - pr_info: Print this info to the console
51 * - trace_printk: Print this info to trace buffer (good for verbose logging)
52 */
53
54#define DWC2_TRACE_SCHEDULER no_printk
55#define DWC2_TRACE_SCHEDULER_VB no_printk
56
57/* Detailed scheduler tracing, but won't overwhelm console */
58#define dwc2_sch_dbg(hsotg, fmt, ...) \
59 DWC2_TRACE_SCHEDULER(pr_fmt("%s: SCH: " fmt), \
60 dev_name(hsotg->dev), ##__VA_ARGS__)
61
62/* Verbose scheduler tracing */
63#define dwc2_sch_vdbg(hsotg, fmt, ...) \
64 DWC2_TRACE_SCHEDULER_VB(pr_fmt("%s: SCH: " fmt), \
65 dev_name(hsotg->dev), ##__VA_ARGS__)
66
47static inline u32 dwc2_readl(const void __iomem *addr) 67static inline u32 dwc2_readl(const void __iomem *addr)
48{ 68{
49 u32 value = __raw_readl(addr); 69 u32 value = __raw_readl(addr);
diff --git a/drivers/usb/dwc2/hcd.h b/drivers/usb/dwc2/hcd.h
index 1b46e2e617cc..809bc4ff9116 100644
--- a/drivers/usb/dwc2/hcd.h
+++ b/drivers/usb/dwc2/hcd.h
@@ -563,6 +563,11 @@ static inline u16 dwc2_frame_num_inc(u16 frame, u16 inc)
563 return (frame + inc) & HFNUM_MAX_FRNUM; 563 return (frame + inc) & HFNUM_MAX_FRNUM;
564} 564}
565 565
566static inline u16 dwc2_frame_num_dec(u16 frame, u16 dec)
567{
568 return (frame + HFNUM_MAX_FRNUM + 1 - dec) & HFNUM_MAX_FRNUM;
569}
570
566static inline u16 dwc2_full_frame_num(u16 frame) 571static inline u16 dwc2_full_frame_num(u16 frame)
567{ 572{
568 return (frame & HFNUM_MAX_FRNUM) >> 3; 573 return (frame & HFNUM_MAX_FRNUM) >> 3;
diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c
index c4098431ba2f..1faf1c6410e1 100644
--- a/drivers/usb/dwc2/hcd_intr.c
+++ b/drivers/usb/dwc2/hcd_intr.c
@@ -138,13 +138,17 @@ static void dwc2_sof_intr(struct dwc2_hsotg *hsotg)
138 while (qh_entry != &hsotg->periodic_sched_inactive) { 138 while (qh_entry != &hsotg->periodic_sched_inactive) {
139 qh = list_entry(qh_entry, struct dwc2_qh, qh_list_entry); 139 qh = list_entry(qh_entry, struct dwc2_qh, qh_list_entry);
140 qh_entry = qh_entry->next; 140 qh_entry = qh_entry->next;
141 if (dwc2_frame_num_le(qh->sched_frame, hsotg->frame_number)) 141 if (dwc2_frame_num_le(qh->sched_frame, hsotg->frame_number)) {
142 dwc2_sch_vdbg(hsotg, "QH=%p ready fn=%04x, sch=%04x\n",
143 qh, hsotg->frame_number, qh->sched_frame);
144
142 /* 145 /*
143 * Move QH to the ready list to be executed next 146 * Move QH to the ready list to be executed next
144 * (micro)frame 147 * (micro)frame
145 */ 148 */
146 list_move_tail(&qh->qh_list_entry, 149 list_move_tail(&qh->qh_list_entry,
147 &hsotg->periodic_sched_ready); 150 &hsotg->periodic_sched_ready);
151 }
148 } 152 }
149 tr_type = dwc2_hcd_select_transactions(hsotg); 153 tr_type = dwc2_hcd_select_transactions(hsotg);
150 if (tr_type != DWC2_TRANSACTION_NONE) 154 if (tr_type != DWC2_TRANSACTION_NONE)
diff --git a/drivers/usb/dwc2/hcd_queue.c b/drivers/usb/dwc2/hcd_queue.c
index bc632a72f611..0e9faa75593c 100644
--- a/drivers/usb/dwc2/hcd_queue.c
+++ b/drivers/usb/dwc2/hcd_queue.c
@@ -113,6 +113,9 @@ static void dwc2_qh_init(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh,
113 qh->sched_frame = dwc2_frame_num_inc(hsotg->frame_number, 113 qh->sched_frame = dwc2_frame_num_inc(hsotg->frame_number,
114 SCHEDULE_SLOP); 114 SCHEDULE_SLOP);
115 qh->interval = urb->interval; 115 qh->interval = urb->interval;
116 dwc2_sch_dbg(hsotg, "QH=%p init sch=%04x, fn=%04x, int=%#x\n",
117 qh, qh->sched_frame, hsotg->frame_number,
118 qh->interval);
116#if 0 119#if 0
117 /* Increase interrupt polling rate for debugging */ 120 /* Increase interrupt polling rate for debugging */
118 if (qh->ep_type == USB_ENDPOINT_XFER_INT) 121 if (qh->ep_type == USB_ENDPOINT_XFER_INT)
@@ -126,6 +129,11 @@ static void dwc2_qh_init(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh,
126 qh->interval *= 8; 129 qh->interval *= 8;
127 qh->sched_frame |= 0x7; 130 qh->sched_frame |= 0x7;
128 qh->start_split_frame = qh->sched_frame; 131 qh->start_split_frame = qh->sched_frame;
132 dwc2_sch_dbg(hsotg,
133 "QH=%p init*8 sch=%04x, fn=%04x, int=%#x\n",
134 qh, qh->sched_frame, hsotg->frame_number,
135 qh->interval);
136
129 } 137 }
130 dev_dbg(hsotg->dev, "interval=%d\n", qh->interval); 138 dev_dbg(hsotg->dev, "interval=%d\n", qh->interval);
131 } 139 }
@@ -482,6 +490,8 @@ static int dwc2_schedule_periodic(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh)
482 if (frame >= 0) { 490 if (frame >= 0) {
483 qh->sched_frame &= ~0x7; 491 qh->sched_frame &= ~0x7;
484 qh->sched_frame |= (frame & 7); 492 qh->sched_frame |= (frame & 7);
493 dwc2_sch_dbg(hsotg, "QH=%p sched_p sch=%04x, uf=%d\n",
494 qh, qh->sched_frame, frame);
485 } 495 }
486 496
487 if (status > 0) 497 if (status > 0)
@@ -583,10 +593,16 @@ int dwc2_hcd_qh_add(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh)
583 593
584 if (!dwc2_frame_num_le(qh->sched_frame, hsotg->frame_number) && 594 if (!dwc2_frame_num_le(qh->sched_frame, hsotg->frame_number) &&
585 !hsotg->frame_number) { 595 !hsotg->frame_number) {
596 u16 new_frame;
597
586 dev_dbg(hsotg->dev, 598 dev_dbg(hsotg->dev,
587 "reset frame number counter\n"); 599 "reset frame number counter\n");
588 qh->sched_frame = dwc2_frame_num_inc(hsotg->frame_number, 600 new_frame = dwc2_frame_num_inc(hsotg->frame_number,
589 SCHEDULE_SLOP); 601 SCHEDULE_SLOP);
602
603 dwc2_sch_vdbg(hsotg, "QH=%p reset sch=%04x=>%04x\n",
604 qh, qh->sched_frame, new_frame);
605 qh->sched_frame = new_frame;
590 } 606 }
591 607
592 /* Add the new QH to the appropriate schedule */ 608 /* Add the new QH to the appropriate schedule */
@@ -652,6 +668,7 @@ static void dwc2_sched_periodic_split(struct dwc2_hsotg *hsotg,
652 int sched_next_periodic_split) 668 int sched_next_periodic_split)
653{ 669{
654 u16 incr; 670 u16 incr;
671 u16 old_frame = qh->sched_frame;
655 672
656 if (sched_next_periodic_split) { 673 if (sched_next_periodic_split) {
657 qh->sched_frame = frame_number; 674 qh->sched_frame = frame_number;
@@ -677,6 +694,11 @@ static void dwc2_sched_periodic_split(struct dwc2_hsotg *hsotg,
677 qh->sched_frame |= 0x7; 694 qh->sched_frame |= 0x7;
678 qh->start_split_frame = qh->sched_frame; 695 qh->start_split_frame = qh->sched_frame;
679 } 696 }
697
698 dwc2_sch_vdbg(hsotg, "QH=%p next(%d) fn=%04x, sch=%04x=>%04x (%+d)\n",
699 qh, sched_next_periodic_split, frame_number, old_frame,
700 qh->sched_frame,
701 dwc2_frame_num_dec(qh->sched_frame, old_frame));
680} 702}
681 703
682/* 704/*