blob: ecd3296157c6e2255c727edb4163ba406689962e [file] [log] [blame]
Alan Sternd58b4bc2012-07-11 11:21:54 -04001/*
2 * Copyright (C) 2012 by Alan Stern
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * for more details.
13 */
14
15/* This file is part of ehci-hcd.c */
16
17/*-------------------------------------------------------------------------*/
18
Alan Stern3ca9aeb2012-07-11 11:22:05 -040019/* Set a bit in the USBCMD register */
20static void ehci_set_command_bit(struct ehci_hcd *ehci, u32 bit)
21{
22 ehci->command |= bit;
23 ehci_writel(ehci, ehci->command, &ehci->regs->command);
24
25 /* unblock posted write */
26 ehci_readl(ehci, &ehci->regs->command);
27}
28
29/* Clear a bit in the USBCMD register */
30static void ehci_clear_command_bit(struct ehci_hcd *ehci, u32 bit)
31{
32 ehci->command &= ~bit;
33 ehci_writel(ehci, ehci->command, &ehci->regs->command);
34
35 /* unblock posted write */
36 ehci_readl(ehci, &ehci->regs->command);
37}
38
39/*-------------------------------------------------------------------------*/
40
Alan Sternd58b4bc2012-07-11 11:21:54 -040041/*
42 * EHCI timer support... Now using hrtimers.
43 *
44 * Lots of different events are triggered from ehci->hrtimer. Whenever
45 * the timer routine runs, it checks each possible event; events that are
46 * currently enabled and whose expiration time has passed get handled.
47 * The set of enabled events is stored as a collection of bitflags in
48 * ehci->enabled_hrtimer_events, and they are numbered in order of
49 * increasing delay values (ranging between 1 ms and 100 ms).
50 *
51 * Rather than implementing a sorted list or tree of all pending events,
52 * we keep track only of the lowest-numbered pending event, in
53 * ehci->next_hrtimer_event. Whenever ehci->hrtimer gets restarted, its
54 * expiration time is set to the timeout value for this event.
55 *
56 * As a result, events might not get handled right away; the actual delay
57 * could be anywhere up to twice the requested delay. This doesn't
58 * matter, because none of the events are especially time-critical. The
59 * ones that matter most all have a delay of 1 ms, so they will be
60 * handled after 2 ms at most, which is okay. In addition to this, we
61 * allow for an expiration range of 1 ms.
62 */
63
64/*
65 * Delay lengths for the hrtimer event types.
66 * Keep this list sorted by delay length, in the same order as
67 * the event types indexed by enum ehci_hrtimer_event in ehci.h.
68 */
69static unsigned event_delays_ns[] = {
Alan Stern3ca9aeb2012-07-11 11:22:05 -040070 1 * NSEC_PER_MSEC, /* EHCI_HRTIMER_POLL_PSS */
71 10 * NSEC_PER_MSEC, /* EHCI_HRTIMER_DISABLE_PERIODIC */
Alan Sternd58b4bc2012-07-11 11:21:54 -040072};
73
74/* Enable a pending hrtimer event */
75static void ehci_enable_event(struct ehci_hcd *ehci, unsigned event,
76 bool resched)
77{
78 ktime_t *timeout = &ehci->hr_timeouts[event];
79
80 if (resched)
81 *timeout = ktime_add(ktime_get(),
82 ktime_set(0, event_delays_ns[event]));
83 ehci->enabled_hrtimer_events |= (1 << event);
84
85 /* Track only the lowest-numbered pending event */
86 if (event < ehci->next_hrtimer_event) {
87 ehci->next_hrtimer_event = event;
88 hrtimer_start_range_ns(&ehci->hrtimer, *timeout,
89 NSEC_PER_MSEC, HRTIMER_MODE_ABS);
90 }
91}
92
93
Alan Stern3ca9aeb2012-07-11 11:22:05 -040094/* Poll the STS_PSS status bit; see when it agrees with CMD_PSE */
95static void ehci_poll_PSS(struct ehci_hcd *ehci)
96{
97 unsigned actual, want;
98
99 /* Don't do anything if the controller isn't running (e.g., died) */
100 if (ehci->rh_state != EHCI_RH_RUNNING)
101 return;
102
103 want = (ehci->command & CMD_PSE) ? STS_PSS : 0;
104 actual = ehci_readl(ehci, &ehci->regs->status) & STS_PSS;
105
106 if (want != actual) {
107
108 /* Poll again later, but give up after about 20 ms */
109 if (ehci->PSS_poll_count++ < 20) {
110 ehci_enable_event(ehci, EHCI_HRTIMER_POLL_PSS, true);
111 return;
112 }
113 ehci_warn(ehci, "Waited too long for the periodic schedule status, giving up\n");
114 }
115 ehci->PSS_poll_count = 0;
116
117 /* The status is up-to-date; restart or stop the schedule as needed */
118 if (want == 0) { /* Stopped */
119 free_cached_lists(ehci);
120 if (ehci->periodic_count > 0) {
121
122 /* make sure ehci_work scans these */
123 ehci->next_uframe = ehci_read_frame_index(ehci)
124 & ((ehci->periodic_size << 3) - 1);
125 ehci_set_command_bit(ehci, CMD_PSE);
126 }
127
128 } else { /* Running */
129 if (ehci->periodic_count == 0) {
130
131 /* Turn off the schedule after a while */
132 ehci_enable_event(ehci, EHCI_HRTIMER_DISABLE_PERIODIC,
133 true);
134 }
135 }
136}
137
138/* Turn off the periodic schedule after a brief delay */
139static void ehci_disable_PSE(struct ehci_hcd *ehci)
140{
141 ehci_clear_command_bit(ehci, CMD_PSE);
142
143 /* Poll to see when it actually stops */
144 ehci_enable_event(ehci, EHCI_HRTIMER_POLL_PSS, true);
145}
146
147
Alan Sternd58b4bc2012-07-11 11:21:54 -0400148/*
149 * Handler functions for the hrtimer event types.
150 * Keep this array in the same order as the event types indexed by
151 * enum ehci_hrtimer_event in ehci.h.
152 */
153static void (*event_handlers[])(struct ehci_hcd *) = {
Alan Stern3ca9aeb2012-07-11 11:22:05 -0400154 ehci_poll_PSS, /* EHCI_HRTIMER_POLL_PSS */
155 ehci_disable_PSE, /* EHCI_HRTIMER_DISABLE_PERIODIC */
Alan Sternd58b4bc2012-07-11 11:21:54 -0400156};
157
158static enum hrtimer_restart ehci_hrtimer_func(struct hrtimer *t)
159{
160 struct ehci_hcd *ehci = container_of(t, struct ehci_hcd, hrtimer);
161 ktime_t now;
162 unsigned long events;
163 unsigned long flags;
164 unsigned e;
165
166 spin_lock_irqsave(&ehci->lock, flags);
167
168 events = ehci->enabled_hrtimer_events;
169 ehci->enabled_hrtimer_events = 0;
170 ehci->next_hrtimer_event = EHCI_HRTIMER_NO_EVENT;
171
172 /*
173 * Check each pending event. If its time has expired, handle
174 * the event; otherwise re-enable it.
175 */
176 now = ktime_get();
177 for_each_set_bit(e, &events, EHCI_HRTIMER_NUM_EVENTS) {
178 if (now.tv64 >= ehci->hr_timeouts[e].tv64)
179 event_handlers[e](ehci);
180 else
181 ehci_enable_event(ehci, e, false);
182 }
183
184 spin_unlock_irqrestore(&ehci->lock, flags);
185 return HRTIMER_NORESTART;
186}