1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <linux/module.h>
27#include <linux/device.h>
28#include <linux/dmapool.h>
29#include <linux/kernel.h>
30#include <linux/delay.h>
31#include <linux/ioport.h>
32#include <linux/sched.h>
33#include <linux/vmalloc.h>
34#include <linux/errno.h>
35#include <linux/init.h>
36#include <linux/hrtimer.h>
37#include <linux/list.h>
38#include <linux/interrupt.h>
39#include <linux/usb.h>
40#include <linux/usb/hcd.h>
41#include <linux/moduleparam.h>
42#include <linux/dma-mapping.h>
43#include <linux/debugfs.h>
44#include <linux/slab.h>
45#include <linux/uaccess.h>
46#include <linux/platform_device.h>
47#include <linux/io.h>
48
49#include <asm/byteorder.h>
50#include <asm/irq.h>
51#include <asm/unaligned.h>
52
53
54#define DRIVER_AUTHOR "Yuan-Hsin Chen"
55#define DRIVER_DESC "FOTG210 Host Controller (EHCI) Driver"
56
57static const char hcd_name[] = "fotg210_hcd";
58
59#undef FOTG210_URB_TRACE
60
61#define FOTG210_STATS
62
63
64#define FOTG210_TUNE_CERR 3
65#define FOTG210_TUNE_RL_HS 4
66#define FOTG210_TUNE_RL_TT 0
67#define FOTG210_TUNE_MULT_HS 1
68#define FOTG210_TUNE_MULT_TT 1
69
70
71
72
73
74
75#define FOTG210_TUNE_FLS 1
76
77
78static int log2_irq_thresh;
79module_param(log2_irq_thresh, int, S_IRUGO);
80MODULE_PARM_DESC(log2_irq_thresh, "log2 IRQ latency, 1-64 microframes");
81
82
83static unsigned park;
84module_param(park, uint, S_IRUGO);
85MODULE_PARM_DESC(park, "park setting; 1-3 back-to-back async packets");
86
87
88static unsigned int hird;
89module_param(hird, int, S_IRUGO);
90MODULE_PARM_DESC(hird, "host initiated resume duration, +1 for each 75us");
91
92#define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT)
93
94#include "fotg210.h"
95
96
97
98#define fotg210_dbg(fotg210, fmt, args...) \
99 dev_dbg(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args)
100#define fotg210_err(fotg210, fmt, args...) \
101 dev_err(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args)
102#define fotg210_info(fotg210, fmt, args...) \
103 dev_info(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args)
104#define fotg210_warn(fotg210, fmt, args...) \
105 dev_warn(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args)
106
107
108
109
110
111static void dbg_hcs_params(struct fotg210_hcd *fotg210, char *label)
112{
113 u32 params = fotg210_readl(fotg210, &fotg210->caps->hcs_params);
114
115 fotg210_dbg(fotg210,
116 "%s hcs_params 0x%x ports=%d\n",
117 label, params,
118 HCS_N_PORTS(params)
119 );
120}
121
122
123
124
125
126static void dbg_hcc_params(struct fotg210_hcd *fotg210, char *label)
127{
128 u32 params = fotg210_readl(fotg210, &fotg210->caps->hcc_params);
129
130 fotg210_dbg(fotg210,
131 "%s hcc_params %04x uframes %s%s\n",
132 label,
133 params,
134 HCC_PGM_FRAMELISTLEN(params) ? "256/512/1024" : "1024",
135 HCC_CANPARK(params) ? " park" : "");
136}
137
138static void __maybe_unused
139dbg_qtd(const char *label, struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd)
140{
141 fotg210_dbg(fotg210, "%s td %p n%08x %08x t%08x p0=%08x\n", label, qtd,
142 hc32_to_cpup(fotg210, &qtd->hw_next),
143 hc32_to_cpup(fotg210, &qtd->hw_alt_next),
144 hc32_to_cpup(fotg210, &qtd->hw_token),
145 hc32_to_cpup(fotg210, &qtd->hw_buf[0]));
146 if (qtd->hw_buf[1])
147 fotg210_dbg(fotg210, " p1=%08x p2=%08x p3=%08x p4=%08x\n",
148 hc32_to_cpup(fotg210, &qtd->hw_buf[1]),
149 hc32_to_cpup(fotg210, &qtd->hw_buf[2]),
150 hc32_to_cpup(fotg210, &qtd->hw_buf[3]),
151 hc32_to_cpup(fotg210, &qtd->hw_buf[4]));
152}
153
154static void __maybe_unused
155dbg_qh(const char *label, struct fotg210_hcd *fotg210, struct fotg210_qh *qh)
156{
157 struct fotg210_qh_hw *hw = qh->hw;
158
159 fotg210_dbg(fotg210, "%s qh %p n%08x info %x %x qtd %x\n", label,
160 qh, hw->hw_next, hw->hw_info1, hw->hw_info2, hw->hw_current);
161 dbg_qtd("overlay", fotg210, (struct fotg210_qtd *) &hw->hw_qtd_next);
162}
163
164static void __maybe_unused
165dbg_itd(const char *label, struct fotg210_hcd *fotg210, struct fotg210_itd *itd)
166{
167 fotg210_dbg(fotg210, "%s[%d] itd %p, next %08x, urb %p\n",
168 label, itd->frame, itd, hc32_to_cpu(fotg210, itd->hw_next),
169 itd->urb);
170 fotg210_dbg(fotg210,
171 " trans: %08x %08x %08x %08x %08x %08x %08x %08x\n",
172 hc32_to_cpu(fotg210, itd->hw_transaction[0]),
173 hc32_to_cpu(fotg210, itd->hw_transaction[1]),
174 hc32_to_cpu(fotg210, itd->hw_transaction[2]),
175 hc32_to_cpu(fotg210, itd->hw_transaction[3]),
176 hc32_to_cpu(fotg210, itd->hw_transaction[4]),
177 hc32_to_cpu(fotg210, itd->hw_transaction[5]),
178 hc32_to_cpu(fotg210, itd->hw_transaction[6]),
179 hc32_to_cpu(fotg210, itd->hw_transaction[7]));
180 fotg210_dbg(fotg210,
181 " buf: %08x %08x %08x %08x %08x %08x %08x\n",
182 hc32_to_cpu(fotg210, itd->hw_bufp[0]),
183 hc32_to_cpu(fotg210, itd->hw_bufp[1]),
184 hc32_to_cpu(fotg210, itd->hw_bufp[2]),
185 hc32_to_cpu(fotg210, itd->hw_bufp[3]),
186 hc32_to_cpu(fotg210, itd->hw_bufp[4]),
187 hc32_to_cpu(fotg210, itd->hw_bufp[5]),
188 hc32_to_cpu(fotg210, itd->hw_bufp[6]));
189 fotg210_dbg(fotg210, " index: %d %d %d %d %d %d %d %d\n",
190 itd->index[0], itd->index[1], itd->index[2],
191 itd->index[3], itd->index[4], itd->index[5],
192 itd->index[6], itd->index[7]);
193}
194
195static int __maybe_unused
196dbg_status_buf(char *buf, unsigned len, const char *label, u32 status)
197{
198 return scnprintf(buf, len,
199 "%s%sstatus %04x%s%s%s%s%s%s%s%s%s%s",
200 label, label[0] ? " " : "", status,
201 (status & STS_ASS) ? " Async" : "",
202 (status & STS_PSS) ? " Periodic" : "",
203 (status & STS_RECL) ? " Recl" : "",
204 (status & STS_HALT) ? " Halt" : "",
205 (status & STS_IAA) ? " IAA" : "",
206 (status & STS_FATAL) ? " FATAL" : "",
207 (status & STS_FLR) ? " FLR" : "",
208 (status & STS_PCD) ? " PCD" : "",
209 (status & STS_ERR) ? " ERR" : "",
210 (status & STS_INT) ? " INT" : ""
211 );
212}
213
214static int __maybe_unused
215dbg_intr_buf(char *buf, unsigned len, const char *label, u32 enable)
216{
217 return scnprintf(buf, len,
218 "%s%sintrenable %02x%s%s%s%s%s%s",
219 label, label[0] ? " " : "", enable,
220 (enable & STS_IAA) ? " IAA" : "",
221 (enable & STS_FATAL) ? " FATAL" : "",
222 (enable & STS_FLR) ? " FLR" : "",
223 (enable & STS_PCD) ? " PCD" : "",
224 (enable & STS_ERR) ? " ERR" : "",
225 (enable & STS_INT) ? " INT" : ""
226 );
227}
228
229static const char *const fls_strings[] = { "1024", "512", "256", "??" };
230
231static int
232dbg_command_buf(char *buf, unsigned len, const char *label, u32 command)
233{
234 return scnprintf(buf, len,
235 "%s%scommand %07x %s=%d ithresh=%d%s%s%s "
236 "period=%s%s %s",
237 label, label[0] ? " " : "", command,
238 (command & CMD_PARK) ? " park" : "(park)",
239 CMD_PARK_CNT(command),
240 (command >> 16) & 0x3f,
241 (command & CMD_IAAD) ? " IAAD" : "",
242 (command & CMD_ASE) ? " Async" : "",
243 (command & CMD_PSE) ? " Periodic" : "",
244 fls_strings[(command >> 2) & 0x3],
245 (command & CMD_RESET) ? " Reset" : "",
246 (command & CMD_RUN) ? "RUN" : "HALT"
247 );
248}
249
250static char
251*dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status)
252{
253 char *sig;
254
255
256 switch (status & (3 << 10)) {
257 case 0 << 10:
258 sig = "se0";
259 break;
260 case 1 << 10:
261 sig = "k";
262 break;
263 case 2 << 10:
264 sig = "j";
265 break;
266 default:
267 sig = "?";
268 break;
269 }
270
271 scnprintf(buf, len,
272 "%s%sport:%d status %06x %d "
273 "sig=%s%s%s%s%s%s%s%s",
274 label, label[0] ? " " : "", port, status,
275 status>>25,
276 sig,
277 (status & PORT_RESET) ? " RESET" : "",
278 (status & PORT_SUSPEND) ? " SUSPEND" : "",
279 (status & PORT_RESUME) ? " RESUME" : "",
280 (status & PORT_PEC) ? " PEC" : "",
281 (status & PORT_PE) ? " PE" : "",
282 (status & PORT_CSC) ? " CSC" : "",
283 (status & PORT_CONNECT) ? " CONNECT" : "");
284 return buf;
285}
286
287
288#define dbg_status(fotg210, label, status) { \
289 char _buf[80]; \
290 dbg_status_buf(_buf, sizeof(_buf), label, status); \
291 fotg210_dbg(fotg210, "%s\n", _buf); \
292}
293
294#define dbg_cmd(fotg210, label, command) { \
295 char _buf[80]; \
296 dbg_command_buf(_buf, sizeof(_buf), label, command); \
297 fotg210_dbg(fotg210, "%s\n", _buf); \
298}
299
300#define dbg_port(fotg210, label, port, status) { \
301 char _buf[80]; \
302 fotg210_dbg(fotg210, "%s\n", dbg_port_buf(_buf, sizeof(_buf), label, port, status) ); \
303}
304
305
306
307
308
309static int debug_async_open(struct inode *, struct file *);
310static int debug_periodic_open(struct inode *, struct file *);
311static int debug_registers_open(struct inode *, struct file *);
312static int debug_async_open(struct inode *, struct file *);
313
314static ssize_t debug_output(struct file*, char __user*, size_t, loff_t*);
315static int debug_close(struct inode *, struct file *);
316
317static const struct file_operations debug_async_fops = {
318 .owner = THIS_MODULE,
319 .open = debug_async_open,
320 .read = debug_output,
321 .release = debug_close,
322 .llseek = default_llseek,
323};
324static const struct file_operations debug_periodic_fops = {
325 .owner = THIS_MODULE,
326 .open = debug_periodic_open,
327 .read = debug_output,
328 .release = debug_close,
329 .llseek = default_llseek,
330};
331static const struct file_operations debug_registers_fops = {
332 .owner = THIS_MODULE,
333 .open = debug_registers_open,
334 .read = debug_output,
335 .release = debug_close,
336 .llseek = default_llseek,
337};
338
339static struct dentry *fotg210_debug_root;
340
341struct debug_buffer {
342 ssize_t (*fill_func)(struct debug_buffer *);
343 struct usb_bus *bus;
344 struct mutex mutex;
345 size_t count;
346 char *output_buf;
347 size_t alloc_size;
348};
349
350#define speed_char(info1)({ char tmp; \
351 switch (info1 & (3 << 12)) { \
352 case QH_FULL_SPEED: \
353 tmp = 'f'; break; \
354 case QH_LOW_SPEED: \
355 tmp = 'l'; break; \
356 case QH_HIGH_SPEED: \
357 tmp = 'h'; break; \
358 default: \
359 tmp = '?'; break; \
360 } tmp; })
361
362static inline char token_mark(struct fotg210_hcd *fotg210, __hc32 token)
363{
364 __u32 v = hc32_to_cpu(fotg210, token);
365
366 if (v & QTD_STS_ACTIVE)
367 return '*';
368 if (v & QTD_STS_HALT)
369 return '-';
370 if (!IS_SHORT_READ(v))
371 return ' ';
372
373 return '/';
374}
375
376static void qh_lines(
377 struct fotg210_hcd *fotg210,
378 struct fotg210_qh *qh,
379 char **nextp,
380 unsigned *sizep
381)
382{
383 u32 scratch;
384 u32 hw_curr;
385 struct fotg210_qtd *td;
386 unsigned temp;
387 unsigned size = *sizep;
388 char *next = *nextp;
389 char mark;
390 __le32 list_end = FOTG210_LIST_END(fotg210);
391 struct fotg210_qh_hw *hw = qh->hw;
392
393 if (hw->hw_qtd_next == list_end)
394 mark = '@';
395 else
396 mark = token_mark(fotg210, hw->hw_token);
397 if (mark == '/') {
398 if ((hw->hw_alt_next & QTD_MASK(fotg210))
399 == fotg210->async->hw->hw_alt_next)
400 mark = '#';
401 else if (hw->hw_alt_next == list_end)
402 mark = '.';
403
404 }
405 scratch = hc32_to_cpup(fotg210, &hw->hw_info1);
406 hw_curr = (mark == '*') ? hc32_to_cpup(fotg210, &hw->hw_current) : 0;
407 temp = scnprintf(next, size,
408 "qh/%p dev%d %cs ep%d %08x %08x(%08x%c %s nak%d)",
409 qh, scratch & 0x007f,
410 speed_char(scratch),
411 (scratch >> 8) & 0x000f,
412 scratch, hc32_to_cpup(fotg210, &hw->hw_info2),
413 hc32_to_cpup(fotg210, &hw->hw_token), mark,
414 (cpu_to_hc32(fotg210, QTD_TOGGLE) & hw->hw_token)
415 ? "data1" : "data0",
416 (hc32_to_cpup(fotg210, &hw->hw_alt_next) >> 1) & 0x0f);
417 size -= temp;
418 next += temp;
419
420
421 list_for_each_entry(td, &qh->qtd_list, qtd_list) {
422 scratch = hc32_to_cpup(fotg210, &td->hw_token);
423 mark = ' ';
424 if (hw_curr == td->qtd_dma)
425 mark = '*';
426 else if (hw->hw_qtd_next == cpu_to_hc32(fotg210, td->qtd_dma))
427 mark = '+';
428 else if (QTD_LENGTH(scratch)) {
429 if (td->hw_alt_next == fotg210->async->hw->hw_alt_next)
430 mark = '#';
431 else if (td->hw_alt_next != list_end)
432 mark = '/';
433 }
434 temp = snprintf(next, size,
435 "\n\t%p%c%s len=%d %08x urb %p",
436 td, mark, ({ char *tmp;
437 switch ((scratch>>8)&0x03) {
438 case 0:
439 tmp = "out";
440 break;
441 case 1:
442 tmp = "in";
443 break;
444 case 2:
445 tmp = "setup";
446 break;
447 default:
448 tmp = "?";
449 break;
450 } tmp; }),
451 (scratch >> 16) & 0x7fff,
452 scratch,
453 td->urb);
454 if (size < temp)
455 temp = size;
456 size -= temp;
457 next += temp;
458 if (temp == size)
459 goto done;
460 }
461
462 temp = snprintf(next, size, "\n");
463 if (size < temp)
464 temp = size;
465 size -= temp;
466 next += temp;
467
468done:
469 *sizep = size;
470 *nextp = next;
471}
472
473static ssize_t fill_async_buffer(struct debug_buffer *buf)
474{
475 struct usb_hcd *hcd;
476 struct fotg210_hcd *fotg210;
477 unsigned long flags;
478 unsigned temp, size;
479 char *next;
480 struct fotg210_qh *qh;
481
482 hcd = bus_to_hcd(buf->bus);
483 fotg210 = hcd_to_fotg210(hcd);
484 next = buf->output_buf;
485 size = buf->alloc_size;
486
487 *next = 0;
488
489
490
491
492
493 spin_lock_irqsave(&fotg210->lock, flags);
494 for (qh = fotg210->async->qh_next.qh; size > 0 && qh;
495 qh = qh->qh_next.qh)
496 qh_lines(fotg210, qh, &next, &size);
497 if (fotg210->async_unlink && size > 0) {
498 temp = scnprintf(next, size, "\nunlink =\n");
499 size -= temp;
500 next += temp;
501
502 for (qh = fotg210->async_unlink; size > 0 && qh;
503 qh = qh->unlink_next)
504 qh_lines(fotg210, qh, &next, &size);
505 }
506 spin_unlock_irqrestore(&fotg210->lock, flags);
507
508 return strlen(buf->output_buf);
509}
510
511#define DBG_SCHED_LIMIT 64
512static ssize_t fill_periodic_buffer(struct debug_buffer *buf)
513{
514 struct usb_hcd *hcd;
515 struct fotg210_hcd *fotg210;
516 unsigned long flags;
517 union fotg210_shadow p, *seen;
518 unsigned temp, size, seen_count;
519 char *next;
520 unsigned i;
521 __hc32 tag;
522
523 seen = kmalloc(DBG_SCHED_LIMIT * sizeof(*seen), GFP_ATOMIC);
524 if (!seen)
525 return 0;
526 seen_count = 0;
527
528 hcd = bus_to_hcd(buf->bus);
529 fotg210 = hcd_to_fotg210(hcd);
530 next = buf->output_buf;
531 size = buf->alloc_size;
532
533 temp = scnprintf(next, size, "size = %d\n", fotg210->periodic_size);
534 size -= temp;
535 next += temp;
536
537
538
539
540 spin_lock_irqsave(&fotg210->lock, flags);
541 for (i = 0; i < fotg210->periodic_size; i++) {
542 p = fotg210->pshadow[i];
543 if (likely(!p.ptr))
544 continue;
545 tag = Q_NEXT_TYPE(fotg210, fotg210->periodic[i]);
546
547 temp = scnprintf(next, size, "%4d: ", i);
548 size -= temp;
549 next += temp;
550
551 do {
552 struct fotg210_qh_hw *hw;
553
554 switch (hc32_to_cpu(fotg210, tag)) {
555 case Q_TYPE_QH:
556 hw = p.qh->hw;
557 temp = scnprintf(next, size, " qh%d-%04x/%p",
558 p.qh->period,
559 hc32_to_cpup(fotg210,
560 &hw->hw_info2)
561
562 & (QH_CMASK | QH_SMASK),
563 p.qh);
564 size -= temp;
565 next += temp;
566
567 for (temp = 0; temp < seen_count; temp++) {
568 if (seen[temp].ptr != p.ptr)
569 continue;
570 if (p.qh->qh_next.ptr) {
571 temp = scnprintf(next, size,
572 " ...");
573 size -= temp;
574 next += temp;
575 }
576 break;
577 }
578
579 if (temp == seen_count) {
580 u32 scratch = hc32_to_cpup(fotg210,
581 &hw->hw_info1);
582 struct fotg210_qtd *qtd;
583 char *type = "";
584
585
586 temp = 0;
587 list_for_each_entry(qtd,
588 &p.qh->qtd_list,
589 qtd_list) {
590 temp++;
591 switch (0x03 & (hc32_to_cpu(
592 fotg210,
593 qtd->hw_token) >> 8)) {
594 case 0:
595 type = "out";
596 continue;
597 case 1:
598 type = "in";
599 continue;
600 }
601 }
602
603 temp = scnprintf(next, size,
604 "(%c%d ep%d%s "
605 "[%d/%d] q%d p%d)",
606 speed_char(scratch),
607 scratch & 0x007f,
608 (scratch >> 8) & 0x000f, type,
609 p.qh->usecs, p.qh->c_usecs,
610 temp,
611 0x7ff & (scratch >> 16));
612
613 if (seen_count < DBG_SCHED_LIMIT)
614 seen[seen_count++].qh = p.qh;
615 } else
616 temp = 0;
617 tag = Q_NEXT_TYPE(fotg210, hw->hw_next);
618 p = p.qh->qh_next;
619 break;
620 case Q_TYPE_FSTN:
621 temp = scnprintf(next, size,
622 " fstn-%8x/%p", p.fstn->hw_prev,
623 p.fstn);
624 tag = Q_NEXT_TYPE(fotg210, p.fstn->hw_next);
625 p = p.fstn->fstn_next;
626 break;
627 case Q_TYPE_ITD:
628 temp = scnprintf(next, size,
629 " itd/%p", p.itd);
630 tag = Q_NEXT_TYPE(fotg210, p.itd->hw_next);
631 p = p.itd->itd_next;
632 break;
633 }
634 size -= temp;
635 next += temp;
636 } while (p.ptr);
637
638 temp = scnprintf(next, size, "\n");
639 size -= temp;
640 next += temp;
641 }
642 spin_unlock_irqrestore(&fotg210->lock, flags);
643 kfree(seen);
644
645 return buf->alloc_size - size;
646}
647#undef DBG_SCHED_LIMIT
648
649static const char *rh_state_string(struct fotg210_hcd *fotg210)
650{
651 switch (fotg210->rh_state) {
652 case FOTG210_RH_HALTED:
653 return "halted";
654 case FOTG210_RH_SUSPENDED:
655 return "suspended";
656 case FOTG210_RH_RUNNING:
657 return "running";
658 case FOTG210_RH_STOPPING:
659 return "stopping";
660 }
661 return "?";
662}
663
664static ssize_t fill_registers_buffer(struct debug_buffer *buf)
665{
666 struct usb_hcd *hcd;
667 struct fotg210_hcd *fotg210;
668 unsigned long flags;
669 unsigned temp, size, i;
670 char *next, scratch[80];
671 static const char fmt[] = "%*s\n";
672 static const char label[] = "";
673
674 hcd = bus_to_hcd(buf->bus);
675 fotg210 = hcd_to_fotg210(hcd);
676 next = buf->output_buf;
677 size = buf->alloc_size;
678
679 spin_lock_irqsave(&fotg210->lock, flags);
680
681 if (!HCD_HW_ACCESSIBLE(hcd)) {
682 size = scnprintf(next, size,
683 "bus %s, device %s\n"
684 "%s\n"
685 "SUSPENDED(no register access)\n",
686 hcd->self.controller->bus->name,
687 dev_name(hcd->self.controller),
688 hcd->product_desc);
689 goto done;
690 }
691
692
693 i = HC_VERSION(fotg210, fotg210_readl(fotg210,
694 &fotg210->caps->hc_capbase));
695 temp = scnprintf(next, size,
696 "bus %s, device %s\n"
697 "%s\n"
698 "EHCI %x.%02x, rh state %s\n",
699 hcd->self.controller->bus->name,
700 dev_name(hcd->self.controller),
701 hcd->product_desc,
702 i >> 8, i & 0x0ff, rh_state_string(fotg210));
703 size -= temp;
704 next += temp;
705
706
707 i = fotg210_readl(fotg210, &fotg210->caps->hcs_params);
708 temp = scnprintf(next, size, "structural params 0x%08x\n", i);
709 size -= temp;
710 next += temp;
711
712 i = fotg210_readl(fotg210, &fotg210->caps->hcc_params);
713 temp = scnprintf(next, size, "capability params 0x%08x\n", i);
714 size -= temp;
715 next += temp;
716
717
718 temp = dbg_status_buf(scratch, sizeof(scratch), label,
719 fotg210_readl(fotg210, &fotg210->regs->status));
720 temp = scnprintf(next, size, fmt, temp, scratch);
721 size -= temp;
722 next += temp;
723
724 temp = dbg_command_buf(scratch, sizeof(scratch), label,
725 fotg210_readl(fotg210, &fotg210->regs->command));
726 temp = scnprintf(next, size, fmt, temp, scratch);
727 size -= temp;
728 next += temp;
729
730 temp = dbg_intr_buf(scratch, sizeof(scratch), label,
731 fotg210_readl(fotg210, &fotg210->regs->intr_enable));
732 temp = scnprintf(next, size, fmt, temp, scratch);
733 size -= temp;
734 next += temp;
735
736 temp = scnprintf(next, size, "uframe %04x\n",
737 fotg210_read_frame_index(fotg210));
738 size -= temp;
739 next += temp;
740
741 if (fotg210->async_unlink) {
742 temp = scnprintf(next, size, "async unlink qh %p\n",
743 fotg210->async_unlink);
744 size -= temp;
745 next += temp;
746 }
747
748#ifdef FOTG210_STATS
749 temp = scnprintf(next, size,
750 "irq normal %ld err %ld iaa %ld(lost %ld)\n",
751 fotg210->stats.normal, fotg210->stats.error, fotg210->stats.iaa,
752 fotg210->stats.lost_iaa);
753 size -= temp;
754 next += temp;
755
756 temp = scnprintf(next, size, "complete %ld unlink %ld\n",
757 fotg210->stats.complete, fotg210->stats.unlink);
758 size -= temp;
759 next += temp;
760#endif
761
762done:
763 spin_unlock_irqrestore(&fotg210->lock, flags);
764
765 return buf->alloc_size - size;
766}
767
768static struct debug_buffer *alloc_buffer(struct usb_bus *bus,
769 ssize_t (*fill_func)(struct debug_buffer *))
770{
771 struct debug_buffer *buf;
772
773 buf = kzalloc(sizeof(struct debug_buffer), GFP_KERNEL);
774
775 if (buf) {
776 buf->bus = bus;
777 buf->fill_func = fill_func;
778 mutex_init(&buf->mutex);
779 buf->alloc_size = PAGE_SIZE;
780 }
781
782 return buf;
783}
784
785static int fill_buffer(struct debug_buffer *buf)
786{
787 int ret = 0;
788
789 if (!buf->output_buf)
790 buf->output_buf = vmalloc(buf->alloc_size);
791
792 if (!buf->output_buf) {
793 ret = -ENOMEM;
794 goto out;
795 }
796
797 ret = buf->fill_func(buf);
798
799 if (ret >= 0) {
800 buf->count = ret;
801 ret = 0;
802 }
803
804out:
805 return ret;
806}
807
808static ssize_t debug_output(struct file *file, char __user *user_buf,
809 size_t len, loff_t *offset)
810{
811 struct debug_buffer *buf = file->private_data;
812 int ret = 0;
813
814 mutex_lock(&buf->mutex);
815 if (buf->count == 0) {
816 ret = fill_buffer(buf);
817 if (ret != 0) {
818 mutex_unlock(&buf->mutex);
819 goto out;
820 }
821 }
822 mutex_unlock(&buf->mutex);
823
824 ret = simple_read_from_buffer(user_buf, len, offset,
825 buf->output_buf, buf->count);
826
827out:
828 return ret;
829
830}
831
832static int debug_close(struct inode *inode, struct file *file)
833{
834 struct debug_buffer *buf = file->private_data;
835
836 if (buf) {
837 vfree(buf->output_buf);
838 kfree(buf);
839 }
840
841 return 0;
842}
843static int debug_async_open(struct inode *inode, struct file *file)
844{
845 file->private_data = alloc_buffer(inode->i_private, fill_async_buffer);
846
847 return file->private_data ? 0 : -ENOMEM;
848}
849
850static int debug_periodic_open(struct inode *inode, struct file *file)
851{
852 struct debug_buffer *buf;
853 buf = alloc_buffer(inode->i_private, fill_periodic_buffer);
854 if (!buf)
855 return -ENOMEM;
856
857 buf->alloc_size = (sizeof(void *) == 4 ? 6 : 8)*PAGE_SIZE;
858 file->private_data = buf;
859 return 0;
860}
861
862static int debug_registers_open(struct inode *inode, struct file *file)
863{
864 file->private_data = alloc_buffer(inode->i_private,
865 fill_registers_buffer);
866
867 return file->private_data ? 0 : -ENOMEM;
868}
869
870static inline void create_debug_files(struct fotg210_hcd *fotg210)
871{
872 struct usb_bus *bus = &fotg210_to_hcd(fotg210)->self;
873
874 fotg210->debug_dir = debugfs_create_dir(bus->bus_name,
875 fotg210_debug_root);
876 if (!fotg210->debug_dir)
877 return;
878
879 if (!debugfs_create_file("async", S_IRUGO, fotg210->debug_dir, bus,
880 &debug_async_fops))
881 goto file_error;
882
883 if (!debugfs_create_file("periodic", S_IRUGO, fotg210->debug_dir, bus,
884 &debug_periodic_fops))
885 goto file_error;
886
887 if (!debugfs_create_file("registers", S_IRUGO, fotg210->debug_dir, bus,
888 &debug_registers_fops))
889 goto file_error;
890
891 return;
892
893file_error:
894 debugfs_remove_recursive(fotg210->debug_dir);
895}
896
897static inline void remove_debug_files(struct fotg210_hcd *fotg210)
898{
899 debugfs_remove_recursive(fotg210->debug_dir);
900}
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921static int handshake(struct fotg210_hcd *fotg210, void __iomem *ptr,
922 u32 mask, u32 done, int usec)
923{
924 u32 result;
925
926 do {
927 result = fotg210_readl(fotg210, ptr);
928 if (result == ~(u32)0)
929 return -ENODEV;
930 result &= mask;
931 if (result == done)
932 return 0;
933 udelay(1);
934 usec--;
935 } while (usec > 0);
936 return -ETIMEDOUT;
937}
938
939
940
941
942
943static int fotg210_halt(struct fotg210_hcd *fotg210)
944{
945 u32 temp;
946
947 spin_lock_irq(&fotg210->lock);
948
949
950 fotg210_writel(fotg210, 0, &fotg210->regs->intr_enable);
951
952
953
954
955
956 fotg210->command &= ~CMD_RUN;
957 temp = fotg210_readl(fotg210, &fotg210->regs->command);
958 temp &= ~(CMD_RUN | CMD_IAAD);
959 fotg210_writel(fotg210, temp, &fotg210->regs->command);
960
961 spin_unlock_irq(&fotg210->lock);
962 synchronize_irq(fotg210_to_hcd(fotg210)->irq);
963
964 return handshake(fotg210, &fotg210->regs->status,
965 STS_HALT, STS_HALT, 16 * 125);
966}
967
968
969
970
971
972static int fotg210_reset(struct fotg210_hcd *fotg210)
973{
974 int retval;
975 u32 command = fotg210_readl(fotg210, &fotg210->regs->command);
976
977
978
979 if (fotg210->debug && !dbgp_reset_prep(fotg210_to_hcd(fotg210)))
980 fotg210->debug = NULL;
981
982 command |= CMD_RESET;
983 dbg_cmd(fotg210, "reset", command);
984 fotg210_writel(fotg210, command, &fotg210->regs->command);
985 fotg210->rh_state = FOTG210_RH_HALTED;
986 fotg210->next_statechange = jiffies;
987 retval = handshake(fotg210, &fotg210->regs->command,
988 CMD_RESET, 0, 250 * 1000);
989
990 if (retval)
991 return retval;
992
993 if (fotg210->debug)
994 dbgp_external_startup(fotg210_to_hcd(fotg210));
995
996 fotg210->port_c_suspend = fotg210->suspended_ports =
997 fotg210->resuming_ports = 0;
998 return retval;
999}
1000
1001
1002
1003
1004
1005static void fotg210_quiesce(struct fotg210_hcd *fotg210)
1006{
1007 u32 temp;
1008
1009 if (fotg210->rh_state != FOTG210_RH_RUNNING)
1010 return;
1011
1012
1013 temp = (fotg210->command << 10) & (STS_ASS | STS_PSS);
1014 handshake(fotg210, &fotg210->regs->status, STS_ASS | STS_PSS, temp,
1015 16 * 125);
1016
1017
1018 spin_lock_irq(&fotg210->lock);
1019 fotg210->command &= ~(CMD_ASE | CMD_PSE);
1020 fotg210_writel(fotg210, fotg210->command, &fotg210->regs->command);
1021 spin_unlock_irq(&fotg210->lock);
1022
1023
1024 handshake(fotg210, &fotg210->regs->status, STS_ASS | STS_PSS, 0,
1025 16 * 125);
1026}
1027
1028
1029
1030static void end_unlink_async(struct fotg210_hcd *fotg210);
1031static void unlink_empty_async(struct fotg210_hcd *fotg210);
1032static void fotg210_work(struct fotg210_hcd *fotg210);
1033static void start_unlink_intr(struct fotg210_hcd *fotg210,
1034 struct fotg210_qh *qh);
1035static void end_unlink_intr(struct fotg210_hcd *fotg210, struct fotg210_qh *qh);
1036
1037
1038
1039
1040static void fotg210_set_command_bit(struct fotg210_hcd *fotg210, u32 bit)
1041{
1042 fotg210->command |= bit;
1043 fotg210_writel(fotg210, fotg210->command, &fotg210->regs->command);
1044
1045
1046 fotg210_readl(fotg210, &fotg210->regs->command);
1047}
1048
1049
1050static void fotg210_clear_command_bit(struct fotg210_hcd *fotg210, u32 bit)
1051{
1052 fotg210->command &= ~bit;
1053 fotg210_writel(fotg210, fotg210->command, &fotg210->regs->command);
1054
1055
1056 fotg210_readl(fotg210, &fotg210->regs->command);
1057}
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089static unsigned event_delays_ns[] = {
1090 1 * NSEC_PER_MSEC,
1091 1 * NSEC_PER_MSEC,
1092 1 * NSEC_PER_MSEC,
1093 1125 * NSEC_PER_USEC,
1094 2 * NSEC_PER_MSEC,
1095 6 * NSEC_PER_MSEC,
1096 10 * NSEC_PER_MSEC,
1097 10 * NSEC_PER_MSEC,
1098 15 * NSEC_PER_MSEC,
1099 100 * NSEC_PER_MSEC,
1100};
1101
1102
1103static void fotg210_enable_event(struct fotg210_hcd *fotg210, unsigned event,
1104 bool resched)
1105{
1106 ktime_t *timeout = &fotg210->hr_timeouts[event];
1107
1108 if (resched)
1109 *timeout = ktime_add(ktime_get(),
1110 ktime_set(0, event_delays_ns[event]));
1111 fotg210->enabled_hrtimer_events |= (1 << event);
1112
1113
1114 if (event < fotg210->next_hrtimer_event) {
1115 fotg210->next_hrtimer_event = event;
1116 hrtimer_start_range_ns(&fotg210->hrtimer, *timeout,
1117 NSEC_PER_MSEC, HRTIMER_MODE_ABS);
1118 }
1119}
1120
1121
1122
1123static void fotg210_poll_ASS(struct fotg210_hcd *fotg210)
1124{
1125 unsigned actual, want;
1126
1127
1128 if (fotg210->rh_state != FOTG210_RH_RUNNING)
1129 return;
1130
1131 want = (fotg210->command & CMD_ASE) ? STS_ASS : 0;
1132 actual = fotg210_readl(fotg210, &fotg210->regs->status) & STS_ASS;
1133
1134 if (want != actual) {
1135
1136
1137 if (fotg210->ASS_poll_count++ < 20) {
1138 fotg210_enable_event(fotg210, FOTG210_HRTIMER_POLL_ASS,
1139 true);
1140 return;
1141 }
1142 fotg210_dbg(fotg210, "Waited too long for the async schedule status (%x/%x), giving up\n",
1143 want, actual);
1144 }
1145 fotg210->ASS_poll_count = 0;
1146
1147
1148 if (want == 0) {
1149 if (fotg210->async_count > 0)
1150 fotg210_set_command_bit(fotg210, CMD_ASE);
1151
1152 } else {
1153 if (fotg210->async_count == 0) {
1154
1155
1156 fotg210_enable_event(fotg210,
1157 FOTG210_HRTIMER_DISABLE_ASYNC,
1158 true);
1159 }
1160 }
1161}
1162
1163
1164static void fotg210_disable_ASE(struct fotg210_hcd *fotg210)
1165{
1166 fotg210_clear_command_bit(fotg210, CMD_ASE);
1167}
1168
1169
1170
1171static void fotg210_poll_PSS(struct fotg210_hcd *fotg210)
1172{
1173 unsigned actual, want;
1174
1175
1176 if (fotg210->rh_state != FOTG210_RH_RUNNING)
1177 return;
1178
1179 want = (fotg210->command & CMD_PSE) ? STS_PSS : 0;
1180 actual = fotg210_readl(fotg210, &fotg210->regs->status) & STS_PSS;
1181
1182 if (want != actual) {
1183
1184
1185 if (fotg210->PSS_poll_count++ < 20) {
1186 fotg210_enable_event(fotg210, FOTG210_HRTIMER_POLL_PSS,
1187 true);
1188 return;
1189 }
1190 fotg210_dbg(fotg210, "Waited too long for the periodic schedule status (%x/%x), giving up\n",
1191 want, actual);
1192 }
1193 fotg210->PSS_poll_count = 0;
1194
1195
1196 if (want == 0) {
1197 if (fotg210->periodic_count > 0)
1198 fotg210_set_command_bit(fotg210, CMD_PSE);
1199
1200 } else {
1201 if (fotg210->periodic_count == 0) {
1202
1203
1204 fotg210_enable_event(fotg210,
1205 FOTG210_HRTIMER_DISABLE_PERIODIC,
1206 true);
1207 }
1208 }
1209}
1210
1211
1212static void fotg210_disable_PSE(struct fotg210_hcd *fotg210)
1213{
1214 fotg210_clear_command_bit(fotg210, CMD_PSE);
1215}
1216
1217
1218
1219static void fotg210_handle_controller_death(struct fotg210_hcd *fotg210)
1220{
1221 if (!(fotg210_readl(fotg210, &fotg210->regs->status) & STS_HALT)) {
1222
1223
1224 if (fotg210->died_poll_count++ < 5) {
1225
1226 fotg210_enable_event(fotg210,
1227 FOTG210_HRTIMER_POLL_DEAD, true);
1228 return;
1229 }
1230 fotg210_warn(fotg210, "Waited too long for the controller to stop, giving up\n");
1231 }
1232
1233
1234 fotg210->rh_state = FOTG210_RH_HALTED;
1235 fotg210_writel(fotg210, 0, &fotg210->regs->intr_enable);
1236 fotg210_work(fotg210);
1237 end_unlink_async(fotg210);
1238
1239
1240}
1241
1242
1243
1244static void fotg210_handle_intr_unlinks(struct fotg210_hcd *fotg210)
1245{
1246 bool stopped = (fotg210->rh_state < FOTG210_RH_RUNNING);
1247
1248
1249
1250
1251
1252
1253
1254
1255 fotg210->intr_unlinking = true;
1256 while (fotg210->intr_unlink) {
1257 struct fotg210_qh *qh = fotg210->intr_unlink;
1258
1259 if (!stopped && qh->unlink_cycle == fotg210->intr_unlink_cycle)
1260 break;
1261 fotg210->intr_unlink = qh->unlink_next;
1262 qh->unlink_next = NULL;
1263 end_unlink_intr(fotg210, qh);
1264 }
1265
1266
1267 if (fotg210->intr_unlink) {
1268 fotg210_enable_event(fotg210, FOTG210_HRTIMER_UNLINK_INTR,
1269 true);
1270 ++fotg210->intr_unlink_cycle;
1271 }
1272 fotg210->intr_unlinking = false;
1273}
1274
1275
1276
1277static void start_free_itds(struct fotg210_hcd *fotg210)
1278{
1279 if (!(fotg210->enabled_hrtimer_events &
1280 BIT(FOTG210_HRTIMER_FREE_ITDS))) {
1281 fotg210->last_itd_to_free = list_entry(
1282 fotg210->cached_itd_list.prev,
1283 struct fotg210_itd, itd_list);
1284 fotg210_enable_event(fotg210, FOTG210_HRTIMER_FREE_ITDS, true);
1285 }
1286}
1287
1288
1289static void end_free_itds(struct fotg210_hcd *fotg210)
1290{
1291 struct fotg210_itd *itd, *n;
1292
1293 if (fotg210->rh_state < FOTG210_RH_RUNNING)
1294 fotg210->last_itd_to_free = NULL;
1295
1296 list_for_each_entry_safe(itd, n, &fotg210->cached_itd_list, itd_list) {
1297 list_del(&itd->itd_list);
1298 dma_pool_free(fotg210->itd_pool, itd, itd->itd_dma);
1299 if (itd == fotg210->last_itd_to_free)
1300 break;
1301 }
1302
1303 if (!list_empty(&fotg210->cached_itd_list))
1304 start_free_itds(fotg210);
1305}
1306
1307
1308
1309static void fotg210_iaa_watchdog(struct fotg210_hcd *fotg210)
1310{
1311 if (fotg210->rh_state != FOTG210_RH_RUNNING)
1312 return;
1313
1314
1315
1316
1317
1318
1319
1320 if (fotg210->async_iaa) {
1321 u32 cmd, status;
1322
1323
1324
1325
1326
1327
1328
1329 cmd = fotg210_readl(fotg210, &fotg210->regs->command);
1330
1331
1332
1333
1334
1335
1336
1337
1338 status = fotg210_readl(fotg210, &fotg210->regs->status);
1339 if ((status & STS_IAA) || !(cmd & CMD_IAAD)) {
1340 COUNT(fotg210->stats.lost_iaa);
1341 fotg210_writel(fotg210, STS_IAA,
1342 &fotg210->regs->status);
1343 }
1344
1345 fotg210_dbg(fotg210, "IAA watchdog: status %x cmd %x\n",
1346 status, cmd);
1347 end_unlink_async(fotg210);
1348 }
1349}
1350
1351
1352
1353static void turn_on_io_watchdog(struct fotg210_hcd *fotg210)
1354{
1355
1356 if (fotg210->rh_state != FOTG210_RH_RUNNING ||
1357 (fotg210->enabled_hrtimer_events &
1358 BIT(FOTG210_HRTIMER_IO_WATCHDOG)))
1359 return;
1360
1361
1362
1363
1364
1365 if (fotg210->isoc_count > 0 || (fotg210->need_io_watchdog &&
1366 fotg210->async_count + fotg210->intr_count > 0))
1367 fotg210_enable_event(fotg210, FOTG210_HRTIMER_IO_WATCHDOG,
1368 true);
1369}
1370
1371
1372
1373
1374
1375
1376
1377static void (*event_handlers[])(struct fotg210_hcd *) = {
1378 fotg210_poll_ASS,
1379 fotg210_poll_PSS,
1380 fotg210_handle_controller_death,
1381 fotg210_handle_intr_unlinks,
1382 end_free_itds,
1383 unlink_empty_async,
1384 fotg210_iaa_watchdog,
1385 fotg210_disable_PSE,
1386 fotg210_disable_ASE,
1387 fotg210_work,
1388};
1389
1390static enum hrtimer_restart fotg210_hrtimer_func(struct hrtimer *t)
1391{
1392 struct fotg210_hcd *fotg210 =
1393 container_of(t, struct fotg210_hcd, hrtimer);
1394 ktime_t now;
1395 unsigned long events;
1396 unsigned long flags;
1397 unsigned e;
1398
1399 spin_lock_irqsave(&fotg210->lock, flags);
1400
1401 events = fotg210->enabled_hrtimer_events;
1402 fotg210->enabled_hrtimer_events = 0;
1403 fotg210->next_hrtimer_event = FOTG210_HRTIMER_NO_EVENT;
1404
1405
1406
1407
1408
1409 now = ktime_get();
1410 for_each_set_bit(e, &events, FOTG210_HRTIMER_NUM_EVENTS) {
1411 if (now.tv64 >= fotg210->hr_timeouts[e].tv64)
1412 event_handlers[e](fotg210);
1413 else
1414 fotg210_enable_event(fotg210, e, false);
1415 }
1416
1417 spin_unlock_irqrestore(&fotg210->lock, flags);
1418 return HRTIMER_NORESTART;
1419}
1420
1421
1422
1423#define fotg210_bus_suspend NULL
1424#define fotg210_bus_resume NULL
1425
1426
1427
1428static int check_reset_complete(
1429 struct fotg210_hcd *fotg210,
1430 int index,
1431 u32 __iomem *status_reg,
1432 int port_status
1433) {
1434 if (!(port_status & PORT_CONNECT))
1435 return port_status;
1436
1437
1438 if (!(port_status & PORT_PE)) {
1439
1440 fotg210_dbg(fotg210,
1441 "Failed to enable port %d on root hub TT\n",
1442 index+1);
1443 return port_status;
1444 } else {
1445 fotg210_dbg(fotg210, "port %d reset complete, port enabled\n",
1446 index + 1);
1447 }
1448
1449 return port_status;
1450}
1451
1452
1453
1454
1455
1456
1457static int
1458fotg210_hub_status_data(struct usb_hcd *hcd, char *buf)
1459{
1460 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
1461 u32 temp, status;
1462 u32 mask;
1463 int retval = 1;
1464 unsigned long flags;
1465
1466
1467 buf[0] = 0;
1468
1469
1470
1471
1472 status = fotg210->resuming_ports;
1473
1474 mask = PORT_CSC | PORT_PEC;
1475
1476
1477
1478
1479
1480 spin_lock_irqsave(&fotg210->lock, flags);
1481
1482 temp = fotg210_readl(fotg210, &fotg210->regs->port_status);
1483
1484
1485
1486
1487
1488
1489
1490
1491 if ((temp & mask) != 0 || test_bit(0, &fotg210->port_c_suspend)
1492 || (fotg210->reset_done[0] && time_after_eq(
1493 jiffies, fotg210->reset_done[0]))) {
1494 buf[0] |= 1 << 1;
1495 status = STS_PCD;
1496 }
1497
1498 spin_unlock_irqrestore(&fotg210->lock, flags);
1499 return status ? retval : 0;
1500}
1501
1502
1503
1504static void
1505fotg210_hub_descriptor(
1506 struct fotg210_hcd *fotg210,
1507 struct usb_hub_descriptor *desc
1508) {
1509 int ports = HCS_N_PORTS(fotg210->hcs_params);
1510 u16 temp;
1511
1512 desc->bDescriptorType = USB_DT_HUB;
1513 desc->bPwrOn2PwrGood = 10;
1514 desc->bHubContrCurrent = 0;
1515
1516 desc->bNbrPorts = ports;
1517 temp = 1 + (ports / 8);
1518 desc->bDescLength = 7 + 2 * temp;
1519
1520
1521 memset(&desc->u.hs.DeviceRemovable[0], 0, temp);
1522 memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp);
1523
1524 temp = HUB_CHAR_INDV_PORT_OCPM;
1525 temp |= HUB_CHAR_NO_LPSM;
1526 desc->wHubCharacteristics = cpu_to_le16(temp);
1527}
1528
1529
1530
1531static int fotg210_hub_control(
1532 struct usb_hcd *hcd,
1533 u16 typeReq,
1534 u16 wValue,
1535 u16 wIndex,
1536 char *buf,
1537 u16 wLength
1538) {
1539 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
1540 int ports = HCS_N_PORTS(fotg210->hcs_params);
1541 u32 __iomem *status_reg = &fotg210->regs->port_status;
1542 u32 temp, temp1, status;
1543 unsigned long flags;
1544 int retval = 0;
1545 unsigned selector;
1546
1547
1548
1549
1550
1551
1552
1553
1554 spin_lock_irqsave(&fotg210->lock, flags);
1555 switch (typeReq) {
1556 case ClearHubFeature:
1557 switch (wValue) {
1558 case C_HUB_LOCAL_POWER:
1559 case C_HUB_OVER_CURRENT:
1560
1561 break;
1562 default:
1563 goto error;
1564 }
1565 break;
1566 case ClearPortFeature:
1567 if (!wIndex || wIndex > ports)
1568 goto error;
1569 wIndex--;
1570 temp = fotg210_readl(fotg210, status_reg);
1571 temp &= ~PORT_RWC_BITS;
1572
1573
1574
1575
1576
1577
1578
1579
1580 switch (wValue) {
1581 case USB_PORT_FEAT_ENABLE:
1582 fotg210_writel(fotg210, temp & ~PORT_PE, status_reg);
1583 break;
1584 case USB_PORT_FEAT_C_ENABLE:
1585 fotg210_writel(fotg210, temp | PORT_PEC, status_reg);
1586 break;
1587 case USB_PORT_FEAT_SUSPEND:
1588 if (temp & PORT_RESET)
1589 goto error;
1590 if (!(temp & PORT_SUSPEND))
1591 break;
1592 if ((temp & PORT_PE) == 0)
1593 goto error;
1594
1595
1596 fotg210_writel(fotg210, temp | PORT_RESUME, status_reg);
1597 fotg210->reset_done[wIndex] = jiffies
1598 + msecs_to_jiffies(USB_RESUME_TIMEOUT);
1599 break;
1600 case USB_PORT_FEAT_C_SUSPEND:
1601 clear_bit(wIndex, &fotg210->port_c_suspend);
1602 break;
1603 case USB_PORT_FEAT_C_CONNECTION:
1604 fotg210_writel(fotg210, temp | PORT_CSC, status_reg);
1605 break;
1606 case USB_PORT_FEAT_C_OVER_CURRENT:
1607 fotg210_writel(fotg210, temp | OTGISR_OVC,
1608 &fotg210->regs->otgisr);
1609 break;
1610 case USB_PORT_FEAT_C_RESET:
1611
1612 break;
1613 default:
1614 goto error;
1615 }
1616 fotg210_readl(fotg210, &fotg210->regs->command);
1617 break;
1618 case GetHubDescriptor:
1619 fotg210_hub_descriptor(fotg210, (struct usb_hub_descriptor *)
1620 buf);
1621 break;
1622 case GetHubStatus:
1623
1624 memset(buf, 0, 4);
1625
1626 break;
1627 case GetPortStatus:
1628 if (!wIndex || wIndex > ports)
1629 goto error;
1630 wIndex--;
1631 status = 0;
1632 temp = fotg210_readl(fotg210, status_reg);
1633
1634
1635 if (temp & PORT_CSC)
1636 status |= USB_PORT_STAT_C_CONNECTION << 16;
1637 if (temp & PORT_PEC)
1638 status |= USB_PORT_STAT_C_ENABLE << 16;
1639
1640 temp1 = fotg210_readl(fotg210, &fotg210->regs->otgisr);
1641 if (temp1 & OTGISR_OVC)
1642 status |= USB_PORT_STAT_C_OVERCURRENT << 16;
1643
1644
1645 if (temp & PORT_RESUME) {
1646
1647
1648 if (!fotg210->reset_done[wIndex]) {
1649
1650 fotg210->reset_done[wIndex] = jiffies
1651 + msecs_to_jiffies(20);
1652
1653 mod_timer(&fotg210_to_hcd(fotg210)->rh_timer,
1654 fotg210->reset_done[wIndex]);
1655 }
1656
1657
1658 else if (time_after_eq(jiffies,
1659 fotg210->reset_done[wIndex])) {
1660 clear_bit(wIndex, &fotg210->suspended_ports);
1661 set_bit(wIndex, &fotg210->port_c_suspend);
1662 fotg210->reset_done[wIndex] = 0;
1663
1664
1665 temp = fotg210_readl(fotg210, status_reg);
1666 fotg210_writel(fotg210,
1667 temp & ~(PORT_RWC_BITS | PORT_RESUME),
1668 status_reg);
1669 clear_bit(wIndex, &fotg210->resuming_ports);
1670 retval = handshake(fotg210, status_reg,
1671 PORT_RESUME, 0, 2000 );
1672 if (retval != 0) {
1673 fotg210_err(fotg210,
1674 "port %d resume error %d\n",
1675 wIndex + 1, retval);
1676 goto error;
1677 }
1678 temp &= ~(PORT_SUSPEND|PORT_RESUME|(3<<10));
1679 }
1680 }
1681
1682
1683 if ((temp & PORT_RESET)
1684 && time_after_eq(jiffies,
1685 fotg210->reset_done[wIndex])) {
1686 status |= USB_PORT_STAT_C_RESET << 16;
1687 fotg210->reset_done[wIndex] = 0;
1688 clear_bit(wIndex, &fotg210->resuming_ports);
1689
1690
1691 fotg210_writel(fotg210,
1692 temp & ~(PORT_RWC_BITS | PORT_RESET),
1693 status_reg);
1694
1695
1696
1697 retval = handshake(fotg210, status_reg,
1698 PORT_RESET, 0, 1000);
1699 if (retval != 0) {
1700 fotg210_err(fotg210, "port %d reset error %d\n",
1701 wIndex + 1, retval);
1702 goto error;
1703 }
1704
1705
1706 temp = check_reset_complete(fotg210, wIndex, status_reg,
1707 fotg210_readl(fotg210, status_reg));
1708 }
1709
1710 if (!(temp & (PORT_RESUME|PORT_RESET))) {
1711 fotg210->reset_done[wIndex] = 0;
1712 clear_bit(wIndex, &fotg210->resuming_ports);
1713 }
1714
1715
1716 if ((temp & PORT_CONNECT) &&
1717 test_bit(wIndex, &fotg210->companion_ports)) {
1718 temp &= ~PORT_RWC_BITS;
1719 fotg210_writel(fotg210, temp, status_reg);
1720 fotg210_dbg(fotg210, "port %d --> companion\n",
1721 wIndex + 1);
1722 temp = fotg210_readl(fotg210, status_reg);
1723 }
1724
1725
1726
1727
1728
1729
1730
1731 if (temp & PORT_CONNECT) {
1732 status |= USB_PORT_STAT_CONNECTION;
1733 status |= fotg210_port_speed(fotg210, temp);
1734 }
1735 if (temp & PORT_PE)
1736 status |= USB_PORT_STAT_ENABLE;
1737
1738
1739 if (temp & (PORT_SUSPEND|PORT_RESUME)) {
1740 status |= USB_PORT_STAT_SUSPEND;
1741 } else if (test_bit(wIndex, &fotg210->suspended_ports)) {
1742 clear_bit(wIndex, &fotg210->suspended_ports);
1743 clear_bit(wIndex, &fotg210->resuming_ports);
1744 fotg210->reset_done[wIndex] = 0;
1745 if (temp & PORT_PE)
1746 set_bit(wIndex, &fotg210->port_c_suspend);
1747 }
1748
1749 temp1 = fotg210_readl(fotg210, &fotg210->regs->otgisr);
1750 if (temp1 & OTGISR_OVC)
1751 status |= USB_PORT_STAT_OVERCURRENT;
1752 if (temp & PORT_RESET)
1753 status |= USB_PORT_STAT_RESET;
1754 if (test_bit(wIndex, &fotg210->port_c_suspend))
1755 status |= USB_PORT_STAT_C_SUSPEND << 16;
1756
1757 if (status & ~0xffff)
1758 dbg_port(fotg210, "GetStatus", wIndex + 1, temp);
1759 put_unaligned_le32(status, buf);
1760 break;
1761 case SetHubFeature:
1762 switch (wValue) {
1763 case C_HUB_LOCAL_POWER:
1764 case C_HUB_OVER_CURRENT:
1765
1766 break;
1767 default:
1768 goto error;
1769 }
1770 break;
1771 case SetPortFeature:
1772 selector = wIndex >> 8;
1773 wIndex &= 0xff;
1774
1775 if (!wIndex || wIndex > ports)
1776 goto error;
1777 wIndex--;
1778 temp = fotg210_readl(fotg210, status_reg);
1779 temp &= ~PORT_RWC_BITS;
1780 switch (wValue) {
1781 case USB_PORT_FEAT_SUSPEND:
1782 if ((temp & PORT_PE) == 0
1783 || (temp & PORT_RESET) != 0)
1784 goto error;
1785
1786
1787
1788
1789
1790 fotg210_writel(fotg210, temp | PORT_SUSPEND,
1791 status_reg);
1792 set_bit(wIndex, &fotg210->suspended_ports);
1793 break;
1794 case USB_PORT_FEAT_RESET:
1795 if (temp & PORT_RESUME)
1796 goto error;
1797
1798
1799
1800
1801 fotg210_dbg(fotg210, "port %d reset\n", wIndex + 1);
1802 temp |= PORT_RESET;
1803 temp &= ~PORT_PE;
1804
1805
1806
1807
1808
1809 fotg210->reset_done[wIndex] = jiffies
1810 + msecs_to_jiffies(50);
1811 fotg210_writel(fotg210, temp, status_reg);
1812 break;
1813
1814
1815
1816
1817
1818
1819
1820 case USB_PORT_FEAT_TEST:
1821 if (!selector || selector > 5)
1822 goto error;
1823 spin_unlock_irqrestore(&fotg210->lock, flags);
1824 fotg210_quiesce(fotg210);
1825 spin_lock_irqsave(&fotg210->lock, flags);
1826
1827
1828 temp = fotg210_readl(fotg210, status_reg) &
1829 ~PORT_RWC_BITS;
1830 if (temp & PORT_PE)
1831 fotg210_writel(fotg210, temp | PORT_SUSPEND,
1832 status_reg);
1833
1834 spin_unlock_irqrestore(&fotg210->lock, flags);
1835 fotg210_halt(fotg210);
1836 spin_lock_irqsave(&fotg210->lock, flags);
1837
1838 temp = fotg210_readl(fotg210, status_reg);
1839 temp |= selector << 16;
1840 fotg210_writel(fotg210, temp, status_reg);
1841 break;
1842
1843 default:
1844 goto error;
1845 }
1846 fotg210_readl(fotg210, &fotg210->regs->command);
1847 break;
1848
1849 default:
1850error:
1851
1852 retval = -EPIPE;
1853 }
1854 spin_unlock_irqrestore(&fotg210->lock, flags);
1855 return retval;
1856}
1857
1858static void __maybe_unused fotg210_relinquish_port(struct usb_hcd *hcd,
1859 int portnum)
1860{
1861 return;
1862}
1863
1864static int __maybe_unused fotg210_port_handed_over(struct usb_hcd *hcd,
1865 int portnum)
1866{
1867 return 0;
1868}
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885static inline void fotg210_qtd_init(struct fotg210_hcd *fotg210,
1886 struct fotg210_qtd *qtd, dma_addr_t dma)
1887{
1888 memset(qtd, 0, sizeof(*qtd));
1889 qtd->qtd_dma = dma;
1890 qtd->hw_token = cpu_to_hc32(fotg210, QTD_STS_HALT);
1891 qtd->hw_next = FOTG210_LIST_END(fotg210);
1892 qtd->hw_alt_next = FOTG210_LIST_END(fotg210);
1893 INIT_LIST_HEAD(&qtd->qtd_list);
1894}
1895
1896static struct fotg210_qtd *fotg210_qtd_alloc(struct fotg210_hcd *fotg210,
1897 gfp_t flags)
1898{
1899 struct fotg210_qtd *qtd;
1900 dma_addr_t dma;
1901
1902 qtd = dma_pool_alloc(fotg210->qtd_pool, flags, &dma);
1903 if (qtd != NULL)
1904 fotg210_qtd_init(fotg210, qtd, dma);
1905
1906 return qtd;
1907}
1908
1909static inline void fotg210_qtd_free(struct fotg210_hcd *fotg210,
1910 struct fotg210_qtd *qtd)
1911{
1912 dma_pool_free(fotg210->qtd_pool, qtd, qtd->qtd_dma);
1913}
1914
1915
1916static void qh_destroy(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)
1917{
1918
1919 if (!list_empty(&qh->qtd_list) || qh->qh_next.ptr) {
1920 fotg210_dbg(fotg210, "unused qh not empty!\n");
1921 BUG();
1922 }
1923 if (qh->dummy)
1924 fotg210_qtd_free(fotg210, qh->dummy);
1925 dma_pool_free(fotg210->qh_pool, qh->hw, qh->qh_dma);
1926 kfree(qh);
1927}
1928
1929static struct fotg210_qh *fotg210_qh_alloc(struct fotg210_hcd *fotg210,
1930 gfp_t flags)
1931{
1932 struct fotg210_qh *qh;
1933 dma_addr_t dma;
1934
1935 qh = kzalloc(sizeof(*qh), GFP_ATOMIC);
1936 if (!qh)
1937 goto done;
1938 qh->hw = (struct fotg210_qh_hw *)
1939 dma_pool_alloc(fotg210->qh_pool, flags, &dma);
1940 if (!qh->hw)
1941 goto fail;
1942 memset(qh->hw, 0, sizeof(*qh->hw));
1943 qh->qh_dma = dma;
1944 INIT_LIST_HEAD(&qh->qtd_list);
1945
1946
1947 qh->dummy = fotg210_qtd_alloc(fotg210, flags);
1948 if (qh->dummy == NULL) {
1949 fotg210_dbg(fotg210, "no dummy td\n");
1950 goto fail1;
1951 }
1952done:
1953 return qh;
1954fail1:
1955 dma_pool_free(fotg210->qh_pool, qh->hw, qh->qh_dma);
1956fail:
1957 kfree(qh);
1958 return NULL;
1959}
1960
1961
1962
1963
1964
1965
1966
1967
1968static void fotg210_mem_cleanup(struct fotg210_hcd *fotg210)
1969{
1970 if (fotg210->async)
1971 qh_destroy(fotg210, fotg210->async);
1972 fotg210->async = NULL;
1973
1974 if (fotg210->dummy)
1975 qh_destroy(fotg210, fotg210->dummy);
1976 fotg210->dummy = NULL;
1977
1978
1979 if (fotg210->qtd_pool)
1980 dma_pool_destroy(fotg210->qtd_pool);
1981 fotg210->qtd_pool = NULL;
1982
1983 if (fotg210->qh_pool) {
1984 dma_pool_destroy(fotg210->qh_pool);
1985 fotg210->qh_pool = NULL;
1986 }
1987
1988 if (fotg210->itd_pool)
1989 dma_pool_destroy(fotg210->itd_pool);
1990 fotg210->itd_pool = NULL;
1991
1992 if (fotg210->periodic)
1993 dma_free_coherent(fotg210_to_hcd(fotg210)->self.controller,
1994 fotg210->periodic_size * sizeof(u32),
1995 fotg210->periodic, fotg210->periodic_dma);
1996 fotg210->periodic = NULL;
1997
1998
1999 kfree(fotg210->pshadow);
2000 fotg210->pshadow = NULL;
2001}
2002
2003
2004static int fotg210_mem_init(struct fotg210_hcd *fotg210, gfp_t flags)
2005{
2006 int i;
2007
2008
2009 fotg210->qtd_pool = dma_pool_create("fotg210_qtd",
2010 fotg210_to_hcd(fotg210)->self.controller,
2011 sizeof(struct fotg210_qtd),
2012 32 ,
2013 4096 );
2014 if (!fotg210->qtd_pool)
2015 goto fail;
2016
2017
2018 fotg210->qh_pool = dma_pool_create("fotg210_qh",
2019 fotg210_to_hcd(fotg210)->self.controller,
2020 sizeof(struct fotg210_qh_hw),
2021 32 ,
2022 4096 );
2023 if (!fotg210->qh_pool)
2024 goto fail;
2025
2026 fotg210->async = fotg210_qh_alloc(fotg210, flags);
2027 if (!fotg210->async)
2028 goto fail;
2029
2030
2031 fotg210->itd_pool = dma_pool_create("fotg210_itd",
2032 fotg210_to_hcd(fotg210)->self.controller,
2033 sizeof(struct fotg210_itd),
2034 64 ,
2035 4096 );
2036 if (!fotg210->itd_pool)
2037 goto fail;
2038
2039
2040 fotg210->periodic = (__le32 *)
2041 dma_alloc_coherent(fotg210_to_hcd(fotg210)->self.controller,
2042 fotg210->periodic_size * sizeof(__le32),
2043 &fotg210->periodic_dma, 0);
2044 if (fotg210->periodic == NULL)
2045 goto fail;
2046
2047 for (i = 0; i < fotg210->periodic_size; i++)
2048 fotg210->periodic[i] = FOTG210_LIST_END(fotg210);
2049
2050
2051 fotg210->pshadow = kcalloc(fotg210->periodic_size, sizeof(void *),
2052 flags);
2053 if (fotg210->pshadow != NULL)
2054 return 0;
2055
2056fail:
2057 fotg210_dbg(fotg210, "couldn't init memory\n");
2058 fotg210_mem_cleanup(fotg210);
2059 return -ENOMEM;
2060}
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084static int
2085qtd_fill(struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd, dma_addr_t buf,
2086 size_t len, int token, int maxpacket)
2087{
2088 int i, count;
2089 u64 addr = buf;
2090
2091
2092 qtd->hw_buf[0] = cpu_to_hc32(fotg210, (u32)addr);
2093 qtd->hw_buf_hi[0] = cpu_to_hc32(fotg210, (u32)(addr >> 32));
2094 count = 0x1000 - (buf & 0x0fff);
2095 if (likely(len < count))
2096 count = len;
2097 else {
2098 buf += 0x1000;
2099 buf &= ~0x0fff;
2100
2101
2102 for (i = 1; count < len && i < 5; i++) {
2103 addr = buf;
2104 qtd->hw_buf[i] = cpu_to_hc32(fotg210, (u32)addr);
2105 qtd->hw_buf_hi[i] = cpu_to_hc32(fotg210,
2106 (u32)(addr >> 32));
2107 buf += 0x1000;
2108 if ((count + 0x1000) < len)
2109 count += 0x1000;
2110 else
2111 count = len;
2112 }
2113
2114
2115 if (count != len)
2116 count -= (count % maxpacket);
2117 }
2118 qtd->hw_token = cpu_to_hc32(fotg210, (count << 16) | token);
2119 qtd->length = count;
2120
2121 return count;
2122}
2123
2124
2125
2126static inline void
2127qh_update(struct fotg210_hcd *fotg210, struct fotg210_qh *qh,
2128 struct fotg210_qtd *qtd)
2129{
2130 struct fotg210_qh_hw *hw = qh->hw;
2131
2132
2133 BUG_ON(qh->qh_state != QH_STATE_IDLE);
2134
2135 hw->hw_qtd_next = QTD_NEXT(fotg210, qtd->qtd_dma);
2136 hw->hw_alt_next = FOTG210_LIST_END(fotg210);
2137
2138
2139
2140
2141
2142
2143 if (!(hw->hw_info1 & cpu_to_hc32(fotg210, QH_TOGGLE_CTL))) {
2144 unsigned is_out, epnum;
2145
2146 is_out = qh->is_out;
2147 epnum = (hc32_to_cpup(fotg210, &hw->hw_info1) >> 8) & 0x0f;
2148 if (unlikely(!usb_gettoggle(qh->dev, epnum, is_out))) {
2149 hw->hw_token &= ~cpu_to_hc32(fotg210, QTD_TOGGLE);
2150 usb_settoggle(qh->dev, epnum, is_out, 1);
2151 }
2152 }
2153
2154 hw->hw_token &= cpu_to_hc32(fotg210, QTD_TOGGLE | QTD_STS_PING);
2155}
2156
2157
2158
2159
2160
2161static void
2162qh_refresh(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)
2163{
2164 struct fotg210_qtd *qtd;
2165
2166 if (list_empty(&qh->qtd_list))
2167 qtd = qh->dummy;
2168 else {
2169 qtd = list_entry(qh->qtd_list.next,
2170 struct fotg210_qtd, qtd_list);
2171
2172
2173
2174
2175
2176
2177
2178 if (cpu_to_hc32(fotg210, qtd->qtd_dma) == qh->hw->hw_current) {
2179 qh->hw->hw_qtd_next = qtd->hw_next;
2180 qtd = NULL;
2181 }
2182 }
2183
2184 if (qtd)
2185 qh_update(fotg210, qh, qtd);
2186}
2187
2188
2189
2190static void qh_link_async(struct fotg210_hcd *fotg210, struct fotg210_qh *qh);
2191
2192static void fotg210_clear_tt_buffer_complete(struct usb_hcd *hcd,
2193 struct usb_host_endpoint *ep)
2194{
2195 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
2196 struct fotg210_qh *qh = ep->hcpriv;
2197 unsigned long flags;
2198
2199 spin_lock_irqsave(&fotg210->lock, flags);
2200 qh->clearing_tt = 0;
2201 if (qh->qh_state == QH_STATE_IDLE && !list_empty(&qh->qtd_list)
2202 && fotg210->rh_state == FOTG210_RH_RUNNING)
2203 qh_link_async(fotg210, qh);
2204 spin_unlock_irqrestore(&fotg210->lock, flags);
2205}
2206
2207static void fotg210_clear_tt_buffer(struct fotg210_hcd *fotg210,
2208 struct fotg210_qh *qh,
2209 struct urb *urb, u32 token)
2210{
2211
2212
2213
2214
2215
2216
2217
2218 if (urb->dev->tt && !usb_pipeint(urb->pipe) && !qh->clearing_tt) {
2219 struct usb_device *tt = urb->dev->tt->hub;
2220 dev_dbg(&tt->dev,
2221 "clear tt buffer port %d, a%d ep%d t%08x\n",
2222 urb->dev->ttport, urb->dev->devnum,
2223 usb_pipeendpoint(urb->pipe), token);
2224
2225 if (urb->dev->tt->hub !=
2226 fotg210_to_hcd(fotg210)->self.root_hub) {
2227 if (usb_hub_clear_tt_buffer(urb) == 0)
2228 qh->clearing_tt = 1;
2229 }
2230 }
2231}
2232
2233static int qtd_copy_status(
2234 struct fotg210_hcd *fotg210,
2235 struct urb *urb,
2236 size_t length,
2237 u32 token
2238)
2239{
2240 int status = -EINPROGRESS;
2241
2242
2243 if (likely(QTD_PID(token) != 2))
2244 urb->actual_length += length - QTD_LENGTH(token);
2245
2246
2247 if (unlikely(urb->unlinked))
2248 return status;
2249
2250
2251 if (unlikely(IS_SHORT_READ(token)))
2252 status = -EREMOTEIO;
2253
2254
2255 if (token & QTD_STS_HALT) {
2256 if (token & QTD_STS_BABBLE) {
2257
2258 status = -EOVERFLOW;
2259
2260 } else if (QTD_CERR(token)) {
2261 status = -EPIPE;
2262
2263
2264
2265
2266
2267 } else if (token & QTD_STS_MMF) {
2268
2269 status = -EPROTO;
2270 } else if (token & QTD_STS_DBE) {
2271 status = (QTD_PID(token) == 1)
2272 ? -ENOSR
2273 : -ECOMM;
2274 } else if (token & QTD_STS_XACT) {
2275
2276 fotg210_dbg(fotg210, "devpath %s ep%d%s 3strikes\n",
2277 urb->dev->devpath,
2278 usb_pipeendpoint(urb->pipe),
2279 usb_pipein(urb->pipe) ? "in" : "out");
2280 status = -EPROTO;
2281 } else {
2282 status = -EPROTO;
2283 }
2284
2285 fotg210_dbg(fotg210,
2286 "dev%d ep%d%s qtd token %08x --> status %d\n",
2287 usb_pipedevice(urb->pipe),
2288 usb_pipeendpoint(urb->pipe),
2289 usb_pipein(urb->pipe) ? "in" : "out",
2290 token, status);
2291 }
2292
2293 return status;
2294}
2295
2296static void
2297fotg210_urb_done(struct fotg210_hcd *fotg210, struct urb *urb, int status)
2298__releases(fotg210->lock)
2299__acquires(fotg210->lock)
2300{
2301 if (likely(urb->hcpriv != NULL)) {
2302 struct fotg210_qh *qh = (struct fotg210_qh *) urb->hcpriv;
2303
2304
2305 if ((qh->hw->hw_info2 & cpu_to_hc32(fotg210, QH_SMASK)) != 0) {
2306
2307
2308 fotg210_to_hcd(fotg210)->self.bandwidth_int_reqs--;
2309 }
2310 }
2311
2312 if (unlikely(urb->unlinked)) {
2313 COUNT(fotg210->stats.unlink);
2314 } else {
2315
2316 if (status == -EINPROGRESS || status == -EREMOTEIO)
2317 status = 0;
2318 COUNT(fotg210->stats.complete);
2319 }
2320
2321#ifdef FOTG210_URB_TRACE
2322 fotg210_dbg(fotg210,
2323 "%s %s urb %p ep%d%s status %d len %d/%d\n",
2324 __func__, urb->dev->devpath, urb,
2325 usb_pipeendpoint(urb->pipe),
2326 usb_pipein(urb->pipe) ? "in" : "out",
2327 status,
2328 urb->actual_length, urb->transfer_buffer_length);
2329#endif
2330
2331
2332 usb_hcd_unlink_urb_from_ep(fotg210_to_hcd(fotg210), urb);
2333 spin_unlock(&fotg210->lock);
2334 usb_hcd_giveback_urb(fotg210_to_hcd(fotg210), urb, status);
2335 spin_lock(&fotg210->lock);
2336}
2337
2338static int qh_schedule(struct fotg210_hcd *fotg210, struct fotg210_qh *qh);
2339
2340
2341
2342
2343
2344
2345static unsigned
2346qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)
2347{
2348 struct fotg210_qtd *last, *end = qh->dummy;
2349 struct list_head *entry, *tmp;
2350 int last_status;
2351 int stopped;
2352 unsigned count = 0;
2353 u8 state;
2354 struct fotg210_qh_hw *hw = qh->hw;
2355
2356 if (unlikely(list_empty(&qh->qtd_list)))
2357 return count;
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369 state = qh->qh_state;
2370 qh->qh_state = QH_STATE_COMPLETING;
2371 stopped = (state == QH_STATE_IDLE);
2372
2373 rescan:
2374 last = NULL;
2375 last_status = -EINPROGRESS;
2376 qh->needs_rescan = 0;
2377
2378
2379
2380
2381
2382
2383 list_for_each_safe(entry, tmp, &qh->qtd_list) {
2384 struct fotg210_qtd *qtd;
2385 struct urb *urb;
2386 u32 token = 0;
2387
2388 qtd = list_entry(entry, struct fotg210_qtd, qtd_list);
2389 urb = qtd->urb;
2390
2391
2392 if (last) {
2393 if (likely(last->urb != urb)) {
2394 fotg210_urb_done(fotg210, last->urb,
2395 last_status);
2396 count++;
2397 last_status = -EINPROGRESS;
2398 }
2399 fotg210_qtd_free(fotg210, last);
2400 last = NULL;
2401 }
2402
2403
2404 if (qtd == end)
2405 break;
2406
2407
2408 rmb();
2409 token = hc32_to_cpu(fotg210, qtd->hw_token);
2410
2411
2412 retry_xacterr:
2413 if ((token & QTD_STS_ACTIVE) == 0) {
2414
2415
2416 if (token & QTD_STS_DBE)
2417 fotg210_dbg(fotg210,
2418 "detected DataBufferErr for urb %p ep%d%s len %d, qtd %p [qh %p]\n",
2419 urb,
2420 usb_endpoint_num(&urb->ep->desc),
2421 usb_endpoint_dir_in(&urb->ep->desc)
2422 ? "in" : "out",
2423 urb->transfer_buffer_length,
2424 qtd,
2425 qh);
2426
2427
2428
2429
2430 if ((token & QTD_STS_HALT) != 0) {
2431
2432
2433
2434
2435 if ((token & QTD_STS_XACT) &&
2436 QTD_CERR(token) == 0 &&
2437 ++qh->xacterrs < QH_XACTERR_MAX &&
2438 !urb->unlinked) {
2439 fotg210_dbg(fotg210,
2440 "detected XactErr len %zu/%zu retry %d\n",
2441 qtd->length - QTD_LENGTH(token), qtd->length, qh->xacterrs);
2442
2443
2444
2445
2446
2447
2448 token &= ~QTD_STS_HALT;
2449 token |= QTD_STS_ACTIVE |
2450 (FOTG210_TUNE_CERR << 10);
2451 qtd->hw_token = cpu_to_hc32(fotg210,
2452 token);
2453 wmb();
2454 hw->hw_token = cpu_to_hc32(fotg210,
2455 token);
2456 goto retry_xacterr;
2457 }
2458 stopped = 1;
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469 } else if (IS_SHORT_READ(token)
2470 && !(qtd->hw_alt_next
2471 & FOTG210_LIST_END(fotg210))) {
2472 stopped = 1;
2473 }
2474
2475
2476 } else if (likely(!stopped
2477 && fotg210->rh_state >= FOTG210_RH_RUNNING)) {
2478 break;
2479
2480
2481 } else {
2482 stopped = 1;
2483
2484
2485 if (fotg210->rh_state < FOTG210_RH_RUNNING)
2486 last_status = -ESHUTDOWN;
2487
2488
2489
2490
2491 else if (last_status == -EINPROGRESS && !urb->unlinked)
2492 continue;
2493
2494
2495 if (state == QH_STATE_IDLE
2496 && cpu_to_hc32(fotg210, qtd->qtd_dma)
2497 == hw->hw_current) {
2498 token = hc32_to_cpu(fotg210, hw->hw_token);
2499
2500
2501
2502
2503
2504 fotg210_clear_tt_buffer(fotg210, qh, urb,
2505 token);
2506 }
2507 }
2508
2509
2510
2511
2512
2513
2514
2515
2516 if (last_status == -EINPROGRESS) {
2517 last_status = qtd_copy_status(fotg210, urb,
2518 qtd->length, token);
2519 if (last_status == -EREMOTEIO
2520 && (qtd->hw_alt_next
2521 & FOTG210_LIST_END(fotg210)))
2522 last_status = -EINPROGRESS;
2523
2524
2525
2526
2527 if (unlikely(last_status != -EINPROGRESS &&
2528 last_status != -EREMOTEIO)) {
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538 if (last_status != -EPIPE)
2539 fotg210_clear_tt_buffer(fotg210, qh,
2540 urb, token);
2541 }
2542 }
2543
2544
2545
2546
2547 if (stopped && qtd->qtd_list.prev != &qh->qtd_list) {
2548 last = list_entry(qtd->qtd_list.prev,
2549 struct fotg210_qtd, qtd_list);
2550 last->hw_next = qtd->hw_next;
2551 }
2552
2553
2554 list_del(&qtd->qtd_list);
2555 last = qtd;
2556
2557
2558 qh->xacterrs = 0;
2559 }
2560
2561
2562 if (likely(last != NULL)) {
2563 fotg210_urb_done(fotg210, last->urb, last_status);
2564 count++;
2565 fotg210_qtd_free(fotg210, last);
2566 }
2567
2568
2569 if (unlikely(qh->needs_rescan)) {
2570
2571 if (state == QH_STATE_IDLE)
2572 goto rescan;
2573
2574
2575
2576
2577
2578
2579 if (state != QH_STATE_LINKED)
2580 qh->needs_rescan = 0;
2581 }
2582
2583
2584 qh->qh_state = state;
2585
2586
2587
2588
2589
2590 if (stopped != 0 || hw->hw_qtd_next == FOTG210_LIST_END(fotg210)) {
2591 switch (state) {
2592 case QH_STATE_IDLE:
2593 qh_refresh(fotg210, qh);
2594 break;
2595 case QH_STATE_LINKED:
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609 qh->needs_rescan = 1;
2610 break;
2611
2612 }
2613 }
2614
2615 return count;
2616}
2617
2618
2619
2620
2621#define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
2622
2623#define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
2624
2625
2626
2627
2628
2629static void qtd_list_free(
2630 struct fotg210_hcd *fotg210,
2631 struct urb *urb,
2632 struct list_head *qtd_list
2633) {
2634 struct list_head *entry, *temp;
2635
2636 list_for_each_safe(entry, temp, qtd_list) {
2637 struct fotg210_qtd *qtd;
2638
2639 qtd = list_entry(entry, struct fotg210_qtd, qtd_list);
2640 list_del(&qtd->qtd_list);
2641 fotg210_qtd_free(fotg210, qtd);
2642 }
2643}
2644
2645
2646
2647
2648static struct list_head *
2649qh_urb_transaction(
2650 struct fotg210_hcd *fotg210,
2651 struct urb *urb,
2652 struct list_head *head,
2653 gfp_t flags
2654) {
2655 struct fotg210_qtd *qtd, *qtd_prev;
2656 dma_addr_t buf;
2657 int len, this_sg_len, maxpacket;
2658 int is_input;
2659 u32 token;
2660 int i;
2661 struct scatterlist *sg;
2662
2663
2664
2665
2666 qtd = fotg210_qtd_alloc(fotg210, flags);
2667 if (unlikely(!qtd))
2668 return NULL;
2669 list_add_tail(&qtd->qtd_list, head);
2670 qtd->urb = urb;
2671
2672 token = QTD_STS_ACTIVE;
2673 token |= (FOTG210_TUNE_CERR << 10);
2674
2675
2676 len = urb->transfer_buffer_length;
2677 is_input = usb_pipein(urb->pipe);
2678 if (usb_pipecontrol(urb->pipe)) {
2679
2680 qtd_fill(fotg210, qtd, urb->setup_dma,
2681 sizeof(struct usb_ctrlrequest),
2682 token | (2 << 8), 8);
2683
2684
2685 token ^= QTD_TOGGLE;
2686 qtd_prev = qtd;
2687 qtd = fotg210_qtd_alloc(fotg210, flags);
2688 if (unlikely(!qtd))
2689 goto cleanup;
2690 qtd->urb = urb;
2691 qtd_prev->hw_next = QTD_NEXT(fotg210, qtd->qtd_dma);
2692 list_add_tail(&qtd->qtd_list, head);
2693
2694
2695 if (len == 0)
2696 token |= (1 << 8);
2697 }
2698
2699
2700
2701
2702 i = urb->num_mapped_sgs;
2703 if (len > 0 && i > 0) {
2704 sg = urb->sg;
2705 buf = sg_dma_address(sg);
2706
2707
2708
2709
2710 this_sg_len = min_t(int, sg_dma_len(sg), len);
2711 } else {
2712 sg = NULL;
2713 buf = urb->transfer_dma;
2714 this_sg_len = len;
2715 }
2716
2717 if (is_input)
2718 token |= (1 << 8);
2719
2720
2721 maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
2722
2723
2724
2725
2726
2727
2728 for (;;) {
2729 int this_qtd_len;
2730
2731 this_qtd_len = qtd_fill(fotg210, qtd, buf, this_sg_len, token,
2732 maxpacket);
2733 this_sg_len -= this_qtd_len;
2734 len -= this_qtd_len;
2735 buf += this_qtd_len;
2736
2737
2738
2739
2740
2741
2742 if (is_input)
2743 qtd->hw_alt_next = fotg210->async->hw->hw_alt_next;
2744
2745
2746 if ((maxpacket & (this_qtd_len + (maxpacket - 1))) == 0)
2747 token ^= QTD_TOGGLE;
2748
2749 if (likely(this_sg_len <= 0)) {
2750 if (--i <= 0 || len <= 0)
2751 break;
2752 sg = sg_next(sg);
2753 buf = sg_dma_address(sg);
2754 this_sg_len = min_t(int, sg_dma_len(sg), len);
2755 }
2756
2757 qtd_prev = qtd;
2758 qtd = fotg210_qtd_alloc(fotg210, flags);
2759 if (unlikely(!qtd))
2760 goto cleanup;
2761 qtd->urb = urb;
2762 qtd_prev->hw_next = QTD_NEXT(fotg210, qtd->qtd_dma);
2763 list_add_tail(&qtd->qtd_list, head);
2764 }
2765
2766
2767
2768
2769
2770
2771 if (likely((urb->transfer_flags & URB_SHORT_NOT_OK) == 0
2772 || usb_pipecontrol(urb->pipe)))
2773 qtd->hw_alt_next = FOTG210_LIST_END(fotg210);
2774
2775
2776
2777
2778
2779
2780 if (likely(urb->transfer_buffer_length != 0)) {
2781 int one_more = 0;
2782
2783 if (usb_pipecontrol(urb->pipe)) {
2784 one_more = 1;
2785 token ^= 0x0100;
2786 token |= QTD_TOGGLE;
2787 } else if (usb_pipeout(urb->pipe)
2788 && (urb->transfer_flags & URB_ZERO_PACKET)
2789 && !(urb->transfer_buffer_length % maxpacket)) {
2790 one_more = 1;
2791 }
2792 if (one_more) {
2793 qtd_prev = qtd;
2794 qtd = fotg210_qtd_alloc(fotg210, flags);
2795 if (unlikely(!qtd))
2796 goto cleanup;
2797 qtd->urb = urb;
2798 qtd_prev->hw_next = QTD_NEXT(fotg210, qtd->qtd_dma);
2799 list_add_tail(&qtd->qtd_list, head);
2800
2801
2802 qtd_fill(fotg210, qtd, 0, 0, token, 0);
2803 }
2804 }
2805
2806
2807 if (likely(!(urb->transfer_flags & URB_NO_INTERRUPT)))
2808 qtd->hw_token |= cpu_to_hc32(fotg210, QTD_IOC);
2809 return head;
2810
2811cleanup:
2812 qtd_list_free(fotg210, urb, head);
2813 return NULL;
2814}
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834static struct fotg210_qh *
2835qh_make(
2836 struct fotg210_hcd *fotg210,
2837 struct urb *urb,
2838 gfp_t flags
2839) {
2840 struct fotg210_qh *qh = fotg210_qh_alloc(fotg210, flags);
2841 u32 info1 = 0, info2 = 0;
2842 int is_input, type;
2843 int maxp = 0;
2844 struct usb_tt *tt = urb->dev->tt;
2845 struct fotg210_qh_hw *hw;
2846
2847 if (!qh)
2848 return qh;
2849
2850
2851
2852
2853 info1 |= usb_pipeendpoint(urb->pipe) << 8;
2854 info1 |= usb_pipedevice(urb->pipe) << 0;
2855
2856 is_input = usb_pipein(urb->pipe);
2857 type = usb_pipetype(urb->pipe);
2858 maxp = usb_maxpacket(urb->dev, urb->pipe, !is_input);
2859
2860
2861
2862
2863 if (max_packet(maxp) > 1024) {
2864 fotg210_dbg(fotg210, "bogus qh maxpacket %d\n",
2865 max_packet(maxp));
2866 goto done;
2867 }
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877 if (type == PIPE_INTERRUPT) {
2878 qh->usecs = NS_TO_US(usb_calc_bus_time(USB_SPEED_HIGH,
2879 is_input, 0,
2880 hb_mult(maxp) * max_packet(maxp)));
2881 qh->start = NO_FRAME;
2882
2883 if (urb->dev->speed == USB_SPEED_HIGH) {
2884 qh->c_usecs = 0;
2885 qh->gap_uf = 0;
2886
2887 qh->period = urb->interval >> 3;
2888 if (qh->period == 0 && urb->interval != 1) {
2889
2890
2891
2892
2893 urb->interval = 1;
2894 } else if (qh->period > fotg210->periodic_size) {
2895 qh->period = fotg210->periodic_size;
2896 urb->interval = qh->period << 3;
2897 }
2898 } else {
2899 int think_time;
2900
2901
2902 qh->gap_uf = 1 + usb_calc_bus_time(urb->dev->speed,
2903 is_input, 0, maxp) / (125 * 1000);
2904
2905
2906 if (is_input) {
2907 qh->c_usecs = qh->usecs + HS_USECS(0);
2908 qh->usecs = HS_USECS(1);
2909 } else {
2910 qh->usecs += HS_USECS(1);
2911 qh->c_usecs = HS_USECS(0);
2912 }
2913
2914 think_time = tt ? tt->think_time : 0;
2915 qh->tt_usecs = NS_TO_US(think_time +
2916 usb_calc_bus_time(urb->dev->speed,
2917 is_input, 0, max_packet(maxp)));
2918 qh->period = urb->interval;
2919 if (qh->period > fotg210->periodic_size) {
2920 qh->period = fotg210->periodic_size;
2921 urb->interval = qh->period;
2922 }
2923 }
2924 }
2925
2926
2927 qh->dev = urb->dev;
2928
2929
2930 switch (urb->dev->speed) {
2931 case USB_SPEED_LOW:
2932 info1 |= QH_LOW_SPEED;
2933
2934
2935 case USB_SPEED_FULL:
2936
2937 if (type != PIPE_INTERRUPT)
2938 info1 |= (FOTG210_TUNE_RL_TT << 28);
2939 if (type == PIPE_CONTROL) {
2940 info1 |= QH_CONTROL_EP;
2941 info1 |= QH_TOGGLE_CTL;
2942 }
2943 info1 |= maxp << 16;
2944
2945 info2 |= (FOTG210_TUNE_MULT_TT << 30);
2946
2947
2948
2949
2950 if (fotg210_has_fsl_portno_bug(fotg210))
2951 info2 |= (urb->dev->ttport-1) << 23;
2952 else
2953 info2 |= urb->dev->ttport << 23;
2954
2955
2956
2957
2958 if (tt && tt->hub != fotg210_to_hcd(fotg210)->self.root_hub)
2959 info2 |= tt->hub->devnum << 16;
2960
2961
2962
2963 break;
2964
2965 case USB_SPEED_HIGH:
2966 info1 |= QH_HIGH_SPEED;
2967 if (type == PIPE_CONTROL) {
2968 info1 |= (FOTG210_TUNE_RL_HS << 28);
2969 info1 |= 64 << 16;
2970 info1 |= QH_TOGGLE_CTL;
2971 info2 |= (FOTG210_TUNE_MULT_HS << 30);
2972 } else if (type == PIPE_BULK) {
2973 info1 |= (FOTG210_TUNE_RL_HS << 28);
2974
2975
2976
2977
2978
2979
2980 info1 |= max_packet(maxp) << 16;
2981 info2 |= (FOTG210_TUNE_MULT_HS << 30);
2982 } else {
2983 info1 |= max_packet(maxp) << 16;
2984 info2 |= hb_mult(maxp) << 30;
2985 }
2986 break;
2987 default:
2988 fotg210_dbg(fotg210, "bogus dev %p speed %d\n", urb->dev,
2989 urb->dev->speed);
2990done:
2991 qh_destroy(fotg210, qh);
2992 return NULL;
2993 }
2994
2995
2996
2997
2998 qh->qh_state = QH_STATE_IDLE;
2999 hw = qh->hw;
3000 hw->hw_info1 = cpu_to_hc32(fotg210, info1);
3001 hw->hw_info2 = cpu_to_hc32(fotg210, info2);
3002 qh->is_out = !is_input;
3003 usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), !is_input, 1);
3004 qh_refresh(fotg210, qh);
3005 return qh;
3006}
3007
3008
3009
3010static void enable_async(struct fotg210_hcd *fotg210)
3011{
3012 if (fotg210->async_count++)
3013 return;
3014
3015
3016 fotg210->enabled_hrtimer_events &= ~BIT(FOTG210_HRTIMER_DISABLE_ASYNC);
3017
3018
3019 fotg210_poll_ASS(fotg210);
3020 turn_on_io_watchdog(fotg210);
3021}
3022
3023static void disable_async(struct fotg210_hcd *fotg210)
3024{
3025 if (--fotg210->async_count)
3026 return;
3027
3028
3029 WARN_ON(fotg210->async->qh_next.qh || fotg210->async_unlink);
3030
3031
3032 fotg210_poll_ASS(fotg210);
3033}
3034
3035
3036
3037static void qh_link_async(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)
3038{
3039 __hc32 dma = QH_NEXT(fotg210, qh->qh_dma);
3040 struct fotg210_qh *head;
3041
3042
3043 if (unlikely(qh->clearing_tt))
3044 return;
3045
3046 WARN_ON(qh->qh_state != QH_STATE_IDLE);
3047
3048
3049 qh_refresh(fotg210, qh);
3050
3051
3052 head = fotg210->async;
3053 qh->qh_next = head->qh_next;
3054 qh->hw->hw_next = head->hw->hw_next;
3055 wmb();
3056
3057 head->qh_next.qh = qh;
3058 head->hw->hw_next = dma;
3059
3060 qh->xacterrs = 0;
3061 qh->qh_state = QH_STATE_LINKED;
3062
3063
3064 enable_async(fotg210);
3065}
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075static struct fotg210_qh *qh_append_tds(
3076 struct fotg210_hcd *fotg210,
3077 struct urb *urb,
3078 struct list_head *qtd_list,
3079 int epnum,
3080 void **ptr
3081)
3082{
3083 struct fotg210_qh *qh = NULL;
3084 __hc32 qh_addr_mask = cpu_to_hc32(fotg210, 0x7f);
3085
3086 qh = (struct fotg210_qh *) *ptr;
3087 if (unlikely(qh == NULL)) {
3088
3089 qh = qh_make(fotg210, urb, GFP_ATOMIC);
3090 *ptr = qh;
3091 }
3092 if (likely(qh != NULL)) {
3093 struct fotg210_qtd *qtd;
3094
3095 if (unlikely(list_empty(qtd_list)))
3096 qtd = NULL;
3097 else
3098 qtd = list_entry(qtd_list->next, struct fotg210_qtd,
3099 qtd_list);
3100
3101
3102 if (unlikely(epnum == 0)) {
3103
3104 if (usb_pipedevice(urb->pipe) == 0)
3105 qh->hw->hw_info1 &= ~qh_addr_mask;
3106 }
3107
3108
3109
3110
3111 if (likely(qtd != NULL)) {
3112 struct fotg210_qtd *dummy;
3113 dma_addr_t dma;
3114 __hc32 token;
3115
3116
3117
3118
3119
3120
3121 token = qtd->hw_token;
3122 qtd->hw_token = HALT_BIT(fotg210);
3123
3124 dummy = qh->dummy;
3125
3126 dma = dummy->qtd_dma;
3127 *dummy = *qtd;
3128 dummy->qtd_dma = dma;
3129
3130 list_del(&qtd->qtd_list);
3131 list_add(&dummy->qtd_list, qtd_list);
3132 list_splice_tail(qtd_list, &qh->qtd_list);
3133
3134 fotg210_qtd_init(fotg210, qtd, qtd->qtd_dma);
3135 qh->dummy = qtd;
3136
3137
3138 dma = qtd->qtd_dma;
3139 qtd = list_entry(qh->qtd_list.prev,
3140 struct fotg210_qtd, qtd_list);
3141 qtd->hw_next = QTD_NEXT(fotg210, dma);
3142
3143
3144 wmb();
3145 dummy->hw_token = token;
3146
3147 urb->hcpriv = qh;
3148 }
3149 }
3150 return qh;
3151}
3152
3153
3154
3155static int
3156submit_async(
3157 struct fotg210_hcd *fotg210,
3158 struct urb *urb,
3159 struct list_head *qtd_list,
3160 gfp_t mem_flags
3161) {
3162 int epnum;
3163 unsigned long flags;
3164 struct fotg210_qh *qh = NULL;
3165 int rc;
3166
3167 epnum = urb->ep->desc.bEndpointAddress;
3168
3169#ifdef FOTG210_URB_TRACE
3170 {
3171 struct fotg210_qtd *qtd;
3172 qtd = list_entry(qtd_list->next, struct fotg210_qtd, qtd_list);
3173 fotg210_dbg(fotg210,
3174 "%s %s urb %p ep%d%s len %d, qtd %p [qh %p]\n",
3175 __func__, urb->dev->devpath, urb,
3176 epnum & 0x0f, (epnum & USB_DIR_IN) ? "in" : "out",
3177 urb->transfer_buffer_length,
3178 qtd, urb->ep->hcpriv);
3179 }
3180#endif
3181
3182 spin_lock_irqsave(&fotg210->lock, flags);
3183 if (unlikely(!HCD_HW_ACCESSIBLE(fotg210_to_hcd(fotg210)))) {
3184 rc = -ESHUTDOWN;
3185 goto done;
3186 }
3187 rc = usb_hcd_link_urb_to_ep(fotg210_to_hcd(fotg210), urb);
3188 if (unlikely(rc))
3189 goto done;
3190
3191 qh = qh_append_tds(fotg210, urb, qtd_list, epnum, &urb->ep->hcpriv);
3192 if (unlikely(qh == NULL)) {
3193 usb_hcd_unlink_urb_from_ep(fotg210_to_hcd(fotg210), urb);
3194 rc = -ENOMEM;
3195 goto done;
3196 }
3197
3198
3199
3200
3201 if (likely(qh->qh_state == QH_STATE_IDLE))
3202 qh_link_async(fotg210, qh);
3203 done:
3204 spin_unlock_irqrestore(&fotg210->lock, flags);
3205 if (unlikely(qh == NULL))
3206 qtd_list_free(fotg210, urb, qtd_list);
3207 return rc;
3208}
3209
3210
3211
3212static void single_unlink_async(struct fotg210_hcd *fotg210,
3213 struct fotg210_qh *qh)
3214{
3215 struct fotg210_qh *prev;
3216
3217
3218 qh->qh_state = QH_STATE_UNLINK;
3219 if (fotg210->async_unlink)
3220 fotg210->async_unlink_last->unlink_next = qh;
3221 else
3222 fotg210->async_unlink = qh;
3223 fotg210->async_unlink_last = qh;
3224
3225
3226 prev = fotg210->async;
3227 while (prev->qh_next.qh != qh)
3228 prev = prev->qh_next.qh;
3229
3230 prev->hw->hw_next = qh->hw->hw_next;
3231 prev->qh_next = qh->qh_next;
3232 if (fotg210->qh_scan_next == qh)
3233 fotg210->qh_scan_next = qh->qh_next.qh;
3234}
3235
3236static void start_iaa_cycle(struct fotg210_hcd *fotg210, bool nested)
3237{
3238
3239
3240
3241
3242 if (fotg210->async_iaa || fotg210->async_unlinking)
3243 return;
3244
3245
3246 fotg210->async_iaa = fotg210->async_unlink;
3247 fotg210->async_unlink = NULL;
3248
3249
3250 if (unlikely(fotg210->rh_state < FOTG210_RH_RUNNING)) {
3251 if (!nested)
3252 end_unlink_async(fotg210);
3253
3254
3255 } else if (likely(fotg210->rh_state == FOTG210_RH_RUNNING)) {
3256
3257 wmb();
3258
3259 fotg210_writel(fotg210, fotg210->command | CMD_IAAD,
3260 &fotg210->regs->command);
3261 fotg210_readl(fotg210, &fotg210->regs->command);
3262 fotg210_enable_event(fotg210, FOTG210_HRTIMER_IAA_WATCHDOG,
3263 true);
3264 }
3265}
3266
3267
3268
3269static void end_unlink_async(struct fotg210_hcd *fotg210)
3270{
3271 struct fotg210_qh *qh;
3272
3273
3274 restart:
3275 fotg210->async_unlinking = true;
3276 while (fotg210->async_iaa) {
3277 qh = fotg210->async_iaa;
3278 fotg210->async_iaa = qh->unlink_next;
3279 qh->unlink_next = NULL;
3280
3281 qh->qh_state = QH_STATE_IDLE;
3282 qh->qh_next.qh = NULL;
3283
3284 qh_completions(fotg210, qh);
3285 if (!list_empty(&qh->qtd_list) &&
3286 fotg210->rh_state == FOTG210_RH_RUNNING)
3287 qh_link_async(fotg210, qh);
3288 disable_async(fotg210);
3289 }
3290 fotg210->async_unlinking = false;
3291
3292
3293 if (fotg210->async_unlink) {
3294 start_iaa_cycle(fotg210, true);
3295 if (unlikely(fotg210->rh_state < FOTG210_RH_RUNNING))
3296 goto restart;
3297 }
3298}
3299
3300static void unlink_empty_async(struct fotg210_hcd *fotg210)
3301{
3302 struct fotg210_qh *qh, *next;
3303 bool stopped = (fotg210->rh_state < FOTG210_RH_RUNNING);
3304 bool check_unlinks_later = false;
3305
3306
3307 next = fotg210->async->qh_next.qh;
3308 while (next) {
3309 qh = next;
3310 next = qh->qh_next.qh;
3311
3312 if (list_empty(&qh->qtd_list) &&
3313 qh->qh_state == QH_STATE_LINKED) {
3314 if (!stopped && qh->unlink_cycle ==
3315 fotg210->async_unlink_cycle)
3316 check_unlinks_later = true;
3317 else
3318 single_unlink_async(fotg210, qh);
3319 }
3320 }
3321
3322
3323 if (fotg210->async_unlink)
3324 start_iaa_cycle(fotg210, false);
3325
3326
3327 if (check_unlinks_later) {
3328 fotg210_enable_event(fotg210, FOTG210_HRTIMER_ASYNC_UNLINKS,
3329 true);
3330 ++fotg210->async_unlink_cycle;
3331 }
3332}
3333
3334
3335
3336
3337static void start_unlink_async(struct fotg210_hcd *fotg210,
3338 struct fotg210_qh *qh)
3339{
3340
3341
3342
3343
3344
3345 if (qh->qh_state != QH_STATE_LINKED) {
3346 if (qh->qh_state == QH_STATE_COMPLETING)
3347 qh->needs_rescan = 1;
3348 return;
3349 }
3350
3351 single_unlink_async(fotg210, qh);
3352 start_iaa_cycle(fotg210, false);
3353}
3354
3355
3356
3357static void scan_async(struct fotg210_hcd *fotg210)
3358{
3359 struct fotg210_qh *qh;
3360 bool check_unlinks_later = false;
3361
3362 fotg210->qh_scan_next = fotg210->async->qh_next.qh;
3363 while (fotg210->qh_scan_next) {
3364 qh = fotg210->qh_scan_next;
3365 fotg210->qh_scan_next = qh->qh_next.qh;
3366 rescan:
3367
3368 if (!list_empty(&qh->qtd_list)) {
3369 int temp;
3370
3371
3372
3373
3374
3375
3376
3377
3378 temp = qh_completions(fotg210, qh);
3379 if (qh->needs_rescan) {
3380 start_unlink_async(fotg210, qh);
3381 } else if (list_empty(&qh->qtd_list)
3382 && qh->qh_state == QH_STATE_LINKED) {
3383 qh->unlink_cycle = fotg210->async_unlink_cycle;
3384 check_unlinks_later = true;
3385 } else if (temp != 0)
3386 goto rescan;
3387 }
3388 }
3389
3390
3391
3392
3393
3394
3395
3396 if (check_unlinks_later && fotg210->rh_state == FOTG210_RH_RUNNING &&
3397 !(fotg210->enabled_hrtimer_events &
3398 BIT(FOTG210_HRTIMER_ASYNC_UNLINKS))) {
3399 fotg210_enable_event(fotg210,
3400 FOTG210_HRTIMER_ASYNC_UNLINKS, true);
3401 ++fotg210->async_unlink_cycle;
3402 }
3403}
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418static int fotg210_get_frame(struct usb_hcd *hcd);
3419
3420
3421
3422
3423
3424
3425
3426
3427static union fotg210_shadow *
3428periodic_next_shadow(struct fotg210_hcd *fotg210,
3429 union fotg210_shadow *periodic, __hc32 tag)
3430{
3431 switch (hc32_to_cpu(fotg210, tag)) {
3432 case Q_TYPE_QH:
3433 return &periodic->qh->qh_next;
3434 case Q_TYPE_FSTN:
3435 return &periodic->fstn->fstn_next;
3436 default:
3437 return &periodic->itd->itd_next;
3438 }
3439}
3440
3441static __hc32 *
3442shadow_next_periodic(struct fotg210_hcd *fotg210,
3443 union fotg210_shadow *periodic, __hc32 tag)
3444{
3445 switch (hc32_to_cpu(fotg210, tag)) {
3446
3447 case Q_TYPE_QH:
3448 return &periodic->qh->hw->hw_next;
3449
3450 default:
3451 return periodic->hw_next;
3452 }
3453}
3454
3455
3456static void periodic_unlink(struct fotg210_hcd *fotg210, unsigned frame,
3457 void *ptr)
3458{
3459 union fotg210_shadow *prev_p = &fotg210->pshadow[frame];
3460 __hc32 *hw_p = &fotg210->periodic[frame];
3461 union fotg210_shadow here = *prev_p;
3462
3463
3464 while (here.ptr && here.ptr != ptr) {
3465 prev_p = periodic_next_shadow(fotg210, prev_p,
3466 Q_NEXT_TYPE(fotg210, *hw_p));
3467 hw_p = shadow_next_periodic(fotg210, &here,
3468 Q_NEXT_TYPE(fotg210, *hw_p));
3469 here = *prev_p;
3470 }
3471
3472 if (!here.ptr)
3473 return;
3474
3475
3476
3477
3478 *prev_p = *periodic_next_shadow(fotg210, &here,
3479 Q_NEXT_TYPE(fotg210, *hw_p));
3480
3481 *hw_p = *shadow_next_periodic(fotg210, &here,
3482 Q_NEXT_TYPE(fotg210, *hw_p));
3483}
3484
3485
3486static unsigned short
3487periodic_usecs(struct fotg210_hcd *fotg210, unsigned frame, unsigned uframe)
3488{
3489 __hc32 *hw_p = &fotg210->periodic[frame];
3490 union fotg210_shadow *q = &fotg210->pshadow[frame];
3491 unsigned usecs = 0;
3492 struct fotg210_qh_hw *hw;
3493
3494 while (q->ptr) {
3495 switch (hc32_to_cpu(fotg210, Q_NEXT_TYPE(fotg210, *hw_p))) {
3496 case Q_TYPE_QH:
3497 hw = q->qh->hw;
3498
3499 if (hw->hw_info2 & cpu_to_hc32(fotg210, 1 << uframe))
3500 usecs += q->qh->usecs;
3501
3502 if (hw->hw_info2 & cpu_to_hc32(fotg210,
3503 1 << (8 + uframe)))
3504 usecs += q->qh->c_usecs;
3505 hw_p = &hw->hw_next;
3506 q = &q->qh->qh_next;
3507 break;
3508
3509 default:
3510
3511
3512
3513 if (q->fstn->hw_prev != FOTG210_LIST_END(fotg210))
3514 fotg210_dbg(fotg210, "ignoring FSTN cost ...\n");
3515
3516 hw_p = &q->fstn->hw_next;
3517 q = &q->fstn->fstn_next;
3518 break;
3519 case Q_TYPE_ITD:
3520 if (q->itd->hw_transaction[uframe])
3521 usecs += q->itd->stream->usecs;
3522 hw_p = &q->itd->hw_next;
3523 q = &q->itd->itd_next;
3524 break;
3525 }
3526 }
3527 if (usecs > fotg210->uframe_periodic_max)
3528 fotg210_err(fotg210, "uframe %d sched overrun: %d usecs\n",
3529 frame * 8 + uframe, usecs);
3530 return usecs;
3531}
3532
3533
3534
3535static int same_tt(struct usb_device *dev1, struct usb_device *dev2)
3536{
3537 if (!dev1->tt || !dev2->tt)
3538 return 0;
3539 if (dev1->tt != dev2->tt)
3540 return 0;
3541 if (dev1->tt->multi)
3542 return dev1->ttport == dev2->ttport;
3543 else
3544 return 1;
3545}
3546
3547
3548
3549
3550
3551static int tt_no_collision(
3552 struct fotg210_hcd *fotg210,
3553 unsigned period,
3554 struct usb_device *dev,
3555 unsigned frame,
3556 u32 uf_mask
3557)
3558{
3559 if (period == 0)
3560 return 0;
3561
3562
3563
3564
3565
3566 for (; frame < fotg210->periodic_size; frame += period) {
3567 union fotg210_shadow here;
3568 __hc32 type;
3569 struct fotg210_qh_hw *hw;
3570
3571 here = fotg210->pshadow[frame];
3572 type = Q_NEXT_TYPE(fotg210, fotg210->periodic[frame]);
3573 while (here.ptr) {
3574 switch (hc32_to_cpu(fotg210, type)) {
3575 case Q_TYPE_ITD:
3576 type = Q_NEXT_TYPE(fotg210, here.itd->hw_next);
3577 here = here.itd->itd_next;
3578 continue;
3579 case Q_TYPE_QH:
3580 hw = here.qh->hw;
3581 if (same_tt(dev, here.qh->dev)) {
3582 u32 mask;
3583
3584 mask = hc32_to_cpu(fotg210,
3585 hw->hw_info2);
3586
3587 mask |= mask >> 8;
3588 if (mask & uf_mask)
3589 break;
3590 }
3591 type = Q_NEXT_TYPE(fotg210, hw->hw_next);
3592 here = here.qh->qh_next;
3593 continue;
3594
3595 default:
3596 fotg210_dbg(fotg210,
3597 "periodic frame %d bogus type %d\n",
3598 frame, type);
3599 }
3600
3601
3602 return 0;
3603 }
3604 }
3605
3606
3607 return 1;
3608}
3609
3610
3611
3612static void enable_periodic(struct fotg210_hcd *fotg210)
3613{
3614 if (fotg210->periodic_count++)
3615 return;
3616
3617
3618 fotg210->enabled_hrtimer_events &=
3619 ~BIT(FOTG210_HRTIMER_DISABLE_PERIODIC);
3620
3621
3622 fotg210_poll_PSS(fotg210);
3623 turn_on_io_watchdog(fotg210);
3624}
3625
3626static void disable_periodic(struct fotg210_hcd *fotg210)
3627{
3628 if (--fotg210->periodic_count)
3629 return;
3630
3631
3632 fotg210_poll_PSS(fotg210);
3633}
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643static void qh_link_periodic(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)
3644{
3645 unsigned i;
3646 unsigned period = qh->period;
3647
3648 dev_dbg(&qh->dev->dev,
3649 "link qh%d-%04x/%p start %d [%d/%d us]\n",
3650 period, hc32_to_cpup(fotg210, &qh->hw->hw_info2)
3651 & (QH_CMASK | QH_SMASK),
3652 qh, qh->start, qh->usecs, qh->c_usecs);
3653
3654
3655 if (period == 0)
3656 period = 1;
3657
3658 for (i = qh->start; i < fotg210->periodic_size; i += period) {
3659 union fotg210_shadow *prev = &fotg210->pshadow[i];
3660 __hc32 *hw_p = &fotg210->periodic[i];
3661 union fotg210_shadow here = *prev;
3662 __hc32 type = 0;
3663
3664
3665 while (here.ptr) {
3666 type = Q_NEXT_TYPE(fotg210, *hw_p);
3667 if (type == cpu_to_hc32(fotg210, Q_TYPE_QH))
3668 break;
3669 prev = periodic_next_shadow(fotg210, prev, type);
3670 hw_p = shadow_next_periodic(fotg210, &here, type);
3671 here = *prev;
3672 }
3673
3674
3675
3676
3677 while (here.ptr && qh != here.qh) {
3678 if (qh->period > here.qh->period)
3679 break;
3680 prev = &here.qh->qh_next;
3681 hw_p = &here.qh->hw->hw_next;
3682 here = *prev;
3683 }
3684
3685 if (qh != here.qh) {
3686 qh->qh_next = here;
3687 if (here.qh)
3688 qh->hw->hw_next = *hw_p;
3689 wmb();
3690 prev->qh = qh;
3691 *hw_p = QH_NEXT(fotg210, qh->qh_dma);
3692 }
3693 }
3694 qh->qh_state = QH_STATE_LINKED;
3695 qh->xacterrs = 0;
3696
3697
3698 fotg210_to_hcd(fotg210)->self.bandwidth_allocated += qh->period
3699 ? ((qh->usecs + qh->c_usecs) / qh->period)
3700 : (qh->usecs * 8);
3701
3702 list_add(&qh->intr_node, &fotg210->intr_qh_list);
3703
3704
3705 ++fotg210->intr_count;
3706 enable_periodic(fotg210);
3707}
3708
3709static void qh_unlink_periodic(struct fotg210_hcd *fotg210,
3710 struct fotg210_qh *qh)
3711{
3712 unsigned i;
3713 unsigned period;
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731 period = qh->period;
3732 if (!period)
3733 period = 1;
3734
3735 for (i = qh->start; i < fotg210->periodic_size; i += period)
3736 periodic_unlink(fotg210, i, qh);
3737
3738
3739 fotg210_to_hcd(fotg210)->self.bandwidth_allocated -= qh->period
3740 ? ((qh->usecs + qh->c_usecs) / qh->period)
3741 : (qh->usecs * 8);
3742
3743 dev_dbg(&qh->dev->dev,
3744 "unlink qh%d-%04x/%p start %d [%d/%d us]\n",
3745 qh->period,
3746 hc32_to_cpup(fotg210, &qh->hw->hw_info2) &
3747 (QH_CMASK | QH_SMASK), qh, qh->start, qh->usecs, qh->c_usecs);
3748
3749
3750 qh->qh_state = QH_STATE_UNLINK;
3751 qh->qh_next.ptr = NULL;
3752
3753 if (fotg210->qh_scan_next == qh)
3754 fotg210->qh_scan_next = list_entry(qh->intr_node.next,
3755 struct fotg210_qh, intr_node);
3756 list_del(&qh->intr_node);
3757}
3758
3759static void start_unlink_intr(struct fotg210_hcd *fotg210,
3760 struct fotg210_qh *qh)
3761{
3762
3763
3764
3765
3766 if (qh->qh_state != QH_STATE_LINKED) {
3767 if (qh->qh_state == QH_STATE_COMPLETING)
3768 qh->needs_rescan = 1;
3769 return;
3770 }
3771
3772 qh_unlink_periodic(fotg210, qh);
3773
3774
3775 wmb();
3776
3777
3778
3779
3780
3781
3782 qh->unlink_cycle = fotg210->intr_unlink_cycle;
3783
3784
3785 if (fotg210->intr_unlink)
3786 fotg210->intr_unlink_last->unlink_next = qh;
3787 else
3788 fotg210->intr_unlink = qh;
3789 fotg210->intr_unlink_last = qh;
3790
3791 if (fotg210->intr_unlinking)
3792 ;
3793 else if (fotg210->rh_state < FOTG210_RH_RUNNING)
3794 fotg210_handle_intr_unlinks(fotg210);
3795 else if (fotg210->intr_unlink == qh) {
3796 fotg210_enable_event(fotg210, FOTG210_HRTIMER_UNLINK_INTR,
3797 true);
3798 ++fotg210->intr_unlink_cycle;
3799 }
3800}
3801
3802static void end_unlink_intr(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)
3803{
3804 struct fotg210_qh_hw *hw = qh->hw;
3805 int rc;
3806
3807 qh->qh_state = QH_STATE_IDLE;
3808 hw->hw_next = FOTG210_LIST_END(fotg210);
3809
3810 qh_completions(fotg210, qh);
3811
3812
3813 if (!list_empty(&qh->qtd_list) &&
3814 fotg210->rh_state == FOTG210_RH_RUNNING) {
3815 rc = qh_schedule(fotg210, qh);
3816
3817
3818
3819
3820
3821
3822
3823 if (rc != 0)
3824 fotg210_err(fotg210, "can't reschedule qh %p, err %d\n",
3825 qh, rc);
3826 }
3827
3828
3829 --fotg210->intr_count;
3830 disable_periodic(fotg210);
3831}
3832
3833
3834
3835static int check_period(
3836 struct fotg210_hcd *fotg210,
3837 unsigned frame,
3838 unsigned uframe,
3839 unsigned period,
3840 unsigned usecs
3841) {
3842 int claimed;
3843
3844
3845
3846
3847 if (uframe >= 8)
3848 return 0;
3849
3850
3851 usecs = fotg210->uframe_periodic_max - usecs;
3852
3853
3854
3855
3856 if (unlikely(period == 0)) {
3857 do {
3858 for (uframe = 0; uframe < 7; uframe++) {
3859 claimed = periodic_usecs(fotg210, frame,
3860 uframe);
3861 if (claimed > usecs)
3862 return 0;
3863 }
3864 } while ((frame += 1) < fotg210->periodic_size);
3865
3866
3867 } else {
3868 do {
3869 claimed = periodic_usecs(fotg210, frame, uframe);
3870 if (claimed > usecs)
3871 return 0;
3872 } while ((frame += period) < fotg210->periodic_size);
3873 }
3874
3875
3876 return 1;
3877}
3878
3879static int check_intr_schedule(
3880 struct fotg210_hcd *fotg210,
3881 unsigned frame,
3882 unsigned uframe,
3883 const struct fotg210_qh *qh,
3884 __hc32 *c_maskp
3885)
3886{
3887 int retval = -ENOSPC;
3888 u8 mask = 0;
3889
3890 if (qh->c_usecs && uframe >= 6)
3891 goto done;
3892
3893 if (!check_period(fotg210, frame, uframe, qh->period, qh->usecs))
3894 goto done;
3895 if (!qh->c_usecs) {
3896 retval = 0;
3897 *c_maskp = 0;
3898 goto done;
3899 }
3900
3901
3902
3903
3904
3905
3906
3907
3908 mask = 0x03 << (uframe + qh->gap_uf);
3909 *c_maskp = cpu_to_hc32(fotg210, mask << 8);
3910
3911 mask |= 1 << uframe;
3912 if (tt_no_collision(fotg210, qh->period, qh->dev, frame, mask)) {
3913 if (!check_period(fotg210, frame, uframe + qh->gap_uf + 1,
3914 qh->period, qh->c_usecs))
3915 goto done;
3916 if (!check_period(fotg210, frame, uframe + qh->gap_uf,
3917 qh->period, qh->c_usecs))
3918 goto done;
3919 retval = 0;
3920 }
3921done:
3922 return retval;
3923}
3924
3925
3926
3927
3928static int qh_schedule(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)
3929{
3930 int status;
3931 unsigned uframe;
3932 __hc32 c_mask;
3933 unsigned frame;
3934 struct fotg210_qh_hw *hw = qh->hw;
3935
3936 qh_refresh(fotg210, qh);
3937 hw->hw_next = FOTG210_LIST_END(fotg210);
3938 frame = qh->start;
3939
3940
3941 if (frame < qh->period) {
3942 uframe = ffs(hc32_to_cpup(fotg210, &hw->hw_info2) & QH_SMASK);
3943 status = check_intr_schedule(fotg210, frame, --uframe,
3944 qh, &c_mask);
3945 } else {
3946 uframe = 0;
3947 c_mask = 0;
3948 status = -ENOSPC;
3949 }
3950
3951
3952
3953
3954 if (status) {
3955
3956 if (qh->period) {
3957 int i;
3958
3959 for (i = qh->period; status && i > 0; --i) {
3960 frame = ++fotg210->random_frame % qh->period;
3961 for (uframe = 0; uframe < 8; uframe++) {
3962 status = check_intr_schedule(fotg210,
3963 frame, uframe, qh,
3964 &c_mask);
3965 if (status == 0)
3966 break;
3967 }
3968 }
3969
3970
3971 } else {
3972 frame = 0;
3973 status = check_intr_schedule(fotg210, 0, 0, qh,
3974 &c_mask);
3975 }
3976 if (status)
3977 goto done;
3978 qh->start = frame;
3979
3980
3981 hw->hw_info2 &= cpu_to_hc32(fotg210, ~(QH_CMASK | QH_SMASK));
3982 hw->hw_info2 |= qh->period
3983 ? cpu_to_hc32(fotg210, 1 << uframe)
3984 : cpu_to_hc32(fotg210, QH_SMASK);
3985 hw->hw_info2 |= c_mask;
3986 } else
3987 fotg210_dbg(fotg210, "reused qh %p schedule\n", qh);
3988
3989
3990 qh_link_periodic(fotg210, qh);
3991done:
3992 return status;
3993}
3994
3995static int intr_submit(
3996 struct fotg210_hcd *fotg210,
3997 struct urb *urb,
3998 struct list_head *qtd_list,
3999 gfp_t mem_flags
4000) {
4001 unsigned epnum;
4002 unsigned long flags;
4003 struct fotg210_qh *qh;
4004 int status;
4005 struct list_head empty;
4006
4007
4008 epnum = urb->ep->desc.bEndpointAddress;
4009
4010 spin_lock_irqsave(&fotg210->lock, flags);
4011
4012 if (unlikely(!HCD_HW_ACCESSIBLE(fotg210_to_hcd(fotg210)))) {
4013 status = -ESHUTDOWN;
4014 goto done_not_linked;
4015 }
4016 status = usb_hcd_link_urb_to_ep(fotg210_to_hcd(fotg210), urb);
4017 if (unlikely(status))
4018 goto done_not_linked;
4019
4020
4021 INIT_LIST_HEAD(&empty);
4022 qh = qh_append_tds(fotg210, urb, &empty, epnum, &urb->ep->hcpriv);
4023 if (qh == NULL) {
4024 status = -ENOMEM;
4025 goto done;
4026 }
4027 if (qh->qh_state == QH_STATE_IDLE) {
4028 status = qh_schedule(fotg210, qh);
4029 if (status)
4030 goto done;
4031 }
4032
4033
4034 qh = qh_append_tds(fotg210, urb, qtd_list, epnum, &urb->ep->hcpriv);
4035 BUG_ON(qh == NULL);
4036
4037
4038 fotg210_to_hcd(fotg210)->self.bandwidth_int_reqs++;
4039
4040done:
4041 if (unlikely(status))
4042 usb_hcd_unlink_urb_from_ep(fotg210_to_hcd(fotg210), urb);
4043done_not_linked:
4044 spin_unlock_irqrestore(&fotg210->lock, flags);
4045 if (status)
4046 qtd_list_free(fotg210, urb, qtd_list);
4047
4048 return status;
4049}
4050
4051static void scan_intr(struct fotg210_hcd *fotg210)
4052{
4053 struct fotg210_qh *qh;
4054
4055 list_for_each_entry_safe(qh, fotg210->qh_scan_next,
4056 &fotg210->intr_qh_list, intr_node) {
4057 rescan:
4058
4059 if (!list_empty(&qh->qtd_list)) {
4060 int temp;
4061
4062
4063
4064
4065
4066
4067
4068
4069 temp = qh_completions(fotg210, qh);
4070 if (unlikely(qh->needs_rescan ||
4071 (list_empty(&qh->qtd_list) &&
4072 qh->qh_state == QH_STATE_LINKED)))
4073 start_unlink_intr(fotg210, qh);
4074 else if (temp != 0)
4075 goto rescan;
4076 }
4077 }
4078}
4079
4080
4081
4082
4083
4084static struct fotg210_iso_stream *
4085iso_stream_alloc(gfp_t mem_flags)
4086{
4087 struct fotg210_iso_stream *stream;
4088
4089 stream = kzalloc(sizeof(*stream), mem_flags);
4090 if (likely(stream != NULL)) {
4091 INIT_LIST_HEAD(&stream->td_list);
4092 INIT_LIST_HEAD(&stream->free_list);
4093 stream->next_uframe = -1;
4094 }
4095 return stream;
4096}
4097
4098static void
4099iso_stream_init(
4100 struct fotg210_hcd *fotg210,
4101 struct fotg210_iso_stream *stream,
4102 struct usb_device *dev,
4103 int pipe,
4104 unsigned interval
4105)
4106{
4107 u32 buf1;
4108 unsigned epnum, maxp;
4109 int is_input;
4110 long bandwidth;
4111 unsigned multi;
4112
4113
4114
4115
4116
4117 epnum = usb_pipeendpoint(pipe);
4118 is_input = usb_pipein(pipe) ? USB_DIR_IN : 0;
4119 maxp = usb_maxpacket(dev, pipe, !is_input);
4120 if (is_input)
4121 buf1 = (1 << 11);
4122 else
4123 buf1 = 0;
4124
4125 maxp = max_packet(maxp);
4126 multi = hb_mult(maxp);
4127 buf1 |= maxp;
4128 maxp *= multi;
4129
4130 stream->buf0 = cpu_to_hc32(fotg210, (epnum << 8) | dev->devnum);
4131 stream->buf1 = cpu_to_hc32(fotg210, buf1);
4132 stream->buf2 = cpu_to_hc32(fotg210, multi);
4133
4134
4135
4136
4137 if (dev->speed == USB_SPEED_FULL) {
4138 interval <<= 3;
4139 stream->usecs = NS_TO_US(usb_calc_bus_time(dev->speed,
4140 is_input, 1, maxp));
4141 stream->usecs /= 8;
4142 } else {
4143 stream->highspeed = 1;
4144 stream->usecs = HS_USECS_ISO(maxp);
4145 }
4146 bandwidth = stream->usecs * 8;
4147 bandwidth /= interval;
4148
4149 stream->bandwidth = bandwidth;
4150 stream->udev = dev;
4151 stream->bEndpointAddress = is_input | epnum;
4152 stream->interval = interval;
4153 stream->maxp = maxp;
4154}
4155
4156static struct fotg210_iso_stream *
4157iso_stream_find(struct fotg210_hcd *fotg210, struct urb *urb)
4158{
4159 unsigned epnum;
4160 struct fotg210_iso_stream *stream;
4161 struct usb_host_endpoint *ep;
4162 unsigned long flags;
4163
4164 epnum = usb_pipeendpoint(urb->pipe);
4165 if (usb_pipein(urb->pipe))
4166 ep = urb->dev->ep_in[epnum];
4167 else
4168 ep = urb->dev->ep_out[epnum];
4169
4170 spin_lock_irqsave(&fotg210->lock, flags);
4171 stream = ep->hcpriv;
4172
4173 if (unlikely(stream == NULL)) {
4174 stream = iso_stream_alloc(GFP_ATOMIC);
4175 if (likely(stream != NULL)) {
4176 ep->hcpriv = stream;
4177 stream->ep = ep;
4178 iso_stream_init(fotg210, stream, urb->dev, urb->pipe,
4179 urb->interval);
4180 }
4181
4182
4183 } else if (unlikely(stream->hw != NULL)) {
4184 fotg210_dbg(fotg210, "dev %s ep%d%s, not iso??\n",
4185 urb->dev->devpath, epnum,
4186 usb_pipein(urb->pipe) ? "in" : "out");
4187 stream = NULL;
4188 }
4189
4190 spin_unlock_irqrestore(&fotg210->lock, flags);
4191 return stream;
4192}
4193
4194
4195
4196
4197
4198static struct fotg210_iso_sched *
4199iso_sched_alloc(unsigned packets, gfp_t mem_flags)
4200{
4201 struct fotg210_iso_sched *iso_sched;
4202 int size = sizeof(*iso_sched);
4203
4204 size += packets * sizeof(struct fotg210_iso_packet);
4205 iso_sched = kzalloc(size, mem_flags);
4206 if (likely(iso_sched != NULL))
4207 INIT_LIST_HEAD(&iso_sched->td_list);
4208
4209 return iso_sched;
4210}
4211
4212static inline void
4213itd_sched_init(
4214 struct fotg210_hcd *fotg210,
4215 struct fotg210_iso_sched *iso_sched,
4216 struct fotg210_iso_stream *stream,
4217 struct urb *urb
4218)
4219{
4220 unsigned i;
4221 dma_addr_t dma = urb->transfer_dma;
4222
4223
4224 iso_sched->span = urb->number_of_packets * stream->interval;
4225
4226
4227
4228
4229 for (i = 0; i < urb->number_of_packets; i++) {
4230 struct fotg210_iso_packet *uframe = &iso_sched->packet[i];
4231 unsigned length;
4232 dma_addr_t buf;
4233 u32 trans;
4234
4235 length = urb->iso_frame_desc[i].length;
4236 buf = dma + urb->iso_frame_desc[i].offset;
4237
4238 trans = FOTG210_ISOC_ACTIVE;
4239 trans |= buf & 0x0fff;
4240 if (unlikely(((i + 1) == urb->number_of_packets))
4241 && !(urb->transfer_flags & URB_NO_INTERRUPT))
4242 trans |= FOTG210_ITD_IOC;
4243 trans |= length << 16;
4244 uframe->transaction = cpu_to_hc32(fotg210, trans);
4245
4246
4247 uframe->bufp = (buf & ~(u64)0x0fff);
4248 buf += length;
4249 if (unlikely((uframe->bufp != (buf & ~(u64)0x0fff))))
4250 uframe->cross = 1;
4251 }
4252}
4253
4254static void
4255iso_sched_free(
4256 struct fotg210_iso_stream *stream,
4257 struct fotg210_iso_sched *iso_sched
4258)
4259{
4260 if (!iso_sched)
4261 return;
4262
4263 list_splice(&iso_sched->td_list, &stream->free_list);
4264 kfree(iso_sched);
4265}
4266
4267static int
4268itd_urb_transaction(
4269 struct fotg210_iso_stream *stream,
4270 struct fotg210_hcd *fotg210,
4271 struct urb *urb,
4272 gfp_t mem_flags
4273)
4274{
4275 struct fotg210_itd *itd;
4276 dma_addr_t itd_dma;
4277 int i;
4278 unsigned num_itds;
4279 struct fotg210_iso_sched *sched;
4280 unsigned long flags;
4281
4282 sched = iso_sched_alloc(urb->number_of_packets, mem_flags);
4283 if (unlikely(sched == NULL))
4284 return -ENOMEM;
4285
4286 itd_sched_init(fotg210, sched, stream, urb);
4287
4288 if (urb->interval < 8)
4289 num_itds = 1 + (sched->span + 7) / 8;
4290 else
4291 num_itds = urb->number_of_packets;
4292
4293
4294 spin_lock_irqsave(&fotg210->lock, flags);
4295 for (i = 0; i < num_itds; i++) {
4296
4297
4298
4299
4300
4301 if (likely(!list_empty(&stream->free_list))) {
4302 itd = list_first_entry(&stream->free_list,
4303 struct fotg210_itd, itd_list);
4304 if (itd->frame == fotg210->now_frame)
4305 goto alloc_itd;
4306 list_del(&itd->itd_list);
4307 itd_dma = itd->itd_dma;
4308 } else {
4309 alloc_itd:
4310 spin_unlock_irqrestore(&fotg210->lock, flags);
4311 itd = dma_pool_alloc(fotg210->itd_pool, mem_flags,
4312 &itd_dma);
4313 spin_lock_irqsave(&fotg210->lock, flags);
4314 if (!itd) {
4315 iso_sched_free(stream, sched);
4316 spin_unlock_irqrestore(&fotg210->lock, flags);
4317 return -ENOMEM;
4318 }
4319 }
4320
4321 memset(itd, 0, sizeof(*itd));
4322 itd->itd_dma = itd_dma;
4323 list_add(&itd->itd_list, &sched->td_list);
4324 }
4325 spin_unlock_irqrestore(&fotg210->lock, flags);
4326
4327
4328 urb->hcpriv = sched;
4329 urb->error_count = 0;
4330 return 0;
4331}
4332
4333
4334
4335static inline int
4336itd_slot_ok(
4337 struct fotg210_hcd *fotg210,
4338 u32 mod,
4339 u32 uframe,
4340 u8 usecs,
4341 u32 period
4342)
4343{
4344 uframe %= period;
4345 do {
4346
4347 if (periodic_usecs(fotg210, uframe >> 3, uframe & 0x7)
4348 > (fotg210->uframe_periodic_max - usecs))
4349 return 0;
4350
4351
4352 uframe += period;
4353 } while (uframe < mod);
4354 return 1;
4355}
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368#define SCHEDULE_SLOP 80
4369
4370static int
4371iso_stream_schedule(
4372 struct fotg210_hcd *fotg210,
4373 struct urb *urb,
4374 struct fotg210_iso_stream *stream
4375)
4376{
4377 u32 now, next, start, period, span;
4378 int status;
4379 unsigned mod = fotg210->periodic_size << 3;
4380 struct fotg210_iso_sched *sched = urb->hcpriv;
4381
4382 period = urb->interval;
4383 span = sched->span;
4384
4385 if (span > mod - SCHEDULE_SLOP) {
4386 fotg210_dbg(fotg210, "iso request %p too long\n", urb);
4387 status = -EFBIG;
4388 goto fail;
4389 }
4390
4391 now = fotg210_read_frame_index(fotg210) & (mod - 1);
4392
4393
4394
4395
4396
4397
4398 if (likely(!list_empty(&stream->td_list))) {
4399 u32 excess;
4400
4401
4402
4403
4404
4405
4406 if (!stream->highspeed && fotg210->fs_i_thresh)
4407 next = now + fotg210->i_thresh;
4408 else
4409 next = now;
4410
4411
4412
4413
4414
4415 excess = (stream->next_uframe - period - next) & (mod - 1);
4416 if (excess >= mod - 2 * SCHEDULE_SLOP)
4417 start = next + excess - mod + period *
4418 DIV_ROUND_UP(mod - excess, period);
4419 else
4420 start = next + excess + period;
4421 if (start - now >= mod) {
4422 fotg210_dbg(fotg210, "request %p would overflow (%d+%d >= %d)\n",
4423 urb, start - now - period, period,
4424 mod);
4425 status = -EFBIG;
4426 goto fail;
4427 }
4428 }
4429
4430
4431
4432
4433
4434
4435
4436 else {
4437 int done = 0;
4438 start = SCHEDULE_SLOP + (now & ~0x07);
4439
4440
4441
4442
4443
4444
4445
4446
4447 next = start;
4448 start += period;
4449 do {
4450 start--;
4451
4452 if (itd_slot_ok(fotg210, mod, start,
4453 stream->usecs, period))
4454 done = 1;
4455 } while (start > next && !done);
4456
4457
4458 if (!done) {
4459 fotg210_dbg(fotg210, "iso resched full %p (now %d max %d)\n",
4460 urb, now, now + mod);
4461 status = -ENOSPC;
4462 goto fail;
4463 }
4464 }
4465
4466
4467 if (unlikely(start - now + span - period
4468 >= mod - 2 * SCHEDULE_SLOP)) {
4469 fotg210_dbg(fotg210, "request %p would overflow (%d+%d >= %d)\n",
4470 urb, start - now, span - period,
4471 mod - 2 * SCHEDULE_SLOP);
4472 status = -EFBIG;
4473 goto fail;
4474 }
4475
4476 stream->next_uframe = start & (mod - 1);
4477
4478
4479 urb->start_frame = stream->next_uframe;
4480 if (!stream->highspeed)
4481 urb->start_frame >>= 3;
4482
4483
4484 if (fotg210->isoc_count == 0)
4485 fotg210->next_frame = now >> 3;
4486 return 0;
4487
4488 fail:
4489 iso_sched_free(stream, sched);
4490 urb->hcpriv = NULL;
4491 return status;
4492}
4493
4494
4495
4496static inline void
4497itd_init(struct fotg210_hcd *fotg210, struct fotg210_iso_stream *stream,
4498 struct fotg210_itd *itd)
4499{
4500 int i;
4501
4502
4503 itd->hw_next = FOTG210_LIST_END(fotg210);
4504 itd->hw_bufp[0] = stream->buf0;
4505 itd->hw_bufp[1] = stream->buf1;
4506 itd->hw_bufp[2] = stream->buf2;
4507
4508 for (i = 0; i < 8; i++)
4509 itd->index[i] = -1;
4510
4511
4512}
4513
4514static inline void
4515itd_patch(
4516 struct fotg210_hcd *fotg210,
4517 struct fotg210_itd *itd,
4518 struct fotg210_iso_sched *iso_sched,
4519 unsigned index,
4520 u16 uframe
4521)
4522{
4523 struct fotg210_iso_packet *uf = &iso_sched->packet[index];
4524 unsigned pg = itd->pg;
4525
4526 uframe &= 0x07;
4527 itd->index[uframe] = index;
4528
4529 itd->hw_transaction[uframe] = uf->transaction;
4530 itd->hw_transaction[uframe] |= cpu_to_hc32(fotg210, pg << 12);
4531 itd->hw_bufp[pg] |= cpu_to_hc32(fotg210, uf->bufp & ~(u32)0);
4532 itd->hw_bufp_hi[pg] |= cpu_to_hc32(fotg210, (u32)(uf->bufp >> 32));
4533
4534
4535 if (unlikely(uf->cross)) {
4536 u64 bufp = uf->bufp + 4096;
4537
4538 itd->pg = ++pg;
4539 itd->hw_bufp[pg] |= cpu_to_hc32(fotg210, bufp & ~(u32)0);
4540 itd->hw_bufp_hi[pg] |= cpu_to_hc32(fotg210, (u32)(bufp >> 32));
4541 }
4542}
4543
4544static inline void
4545itd_link(struct fotg210_hcd *fotg210, unsigned frame, struct fotg210_itd *itd)
4546{
4547 union fotg210_shadow *prev = &fotg210->pshadow[frame];
4548 __hc32 *hw_p = &fotg210->periodic[frame];
4549 union fotg210_shadow here = *prev;
4550 __hc32 type = 0;
4551
4552
4553 while (here.ptr) {
4554 type = Q_NEXT_TYPE(fotg210, *hw_p);
4555 if (type == cpu_to_hc32(fotg210, Q_TYPE_QH))
4556 break;
4557 prev = periodic_next_shadow(fotg210, prev, type);
4558 hw_p = shadow_next_periodic(fotg210, &here, type);
4559 here = *prev;
4560 }
4561
4562 itd->itd_next = here;
4563 itd->hw_next = *hw_p;
4564 prev->itd = itd;
4565 itd->frame = frame;
4566 wmb();
4567 *hw_p = cpu_to_hc32(fotg210, itd->itd_dma | Q_TYPE_ITD);
4568}
4569
4570
4571static void itd_link_urb(
4572 struct fotg210_hcd *fotg210,
4573 struct urb *urb,
4574 unsigned mod,
4575 struct fotg210_iso_stream *stream
4576)
4577{
4578 int packet;
4579 unsigned next_uframe, uframe, frame;
4580 struct fotg210_iso_sched *iso_sched = urb->hcpriv;
4581 struct fotg210_itd *itd;
4582
4583 next_uframe = stream->next_uframe & (mod - 1);
4584
4585 if (unlikely(list_empty(&stream->td_list))) {
4586 fotg210_to_hcd(fotg210)->self.bandwidth_allocated
4587 += stream->bandwidth;
4588 fotg210_dbg(fotg210,
4589 "schedule devp %s ep%d%s-iso period %d start %d.%d\n",
4590 urb->dev->devpath, stream->bEndpointAddress & 0x0f,
4591 (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out",
4592 urb->interval,
4593 next_uframe >> 3, next_uframe & 0x7);
4594 }
4595
4596
4597 for (packet = 0, itd = NULL; packet < urb->number_of_packets;) {
4598 if (itd == NULL) {
4599
4600
4601
4602
4603 itd = list_entry(iso_sched->td_list.next,
4604 struct fotg210_itd, itd_list);
4605 list_move_tail(&itd->itd_list, &stream->td_list);
4606 itd->stream = stream;
4607 itd->urb = urb;
4608 itd_init(fotg210, stream, itd);
4609 }
4610
4611 uframe = next_uframe & 0x07;
4612 frame = next_uframe >> 3;
4613
4614 itd_patch(fotg210, itd, iso_sched, packet, uframe);
4615
4616 next_uframe += stream->interval;
4617 next_uframe &= mod - 1;
4618 packet++;
4619
4620
4621 if (((next_uframe >> 3) != frame)
4622 || packet == urb->number_of_packets) {
4623 itd_link(fotg210, frame & (fotg210->periodic_size - 1),
4624 itd);
4625 itd = NULL;
4626 }
4627 }
4628 stream->next_uframe = next_uframe;
4629
4630
4631 iso_sched_free(stream, iso_sched);
4632 urb->hcpriv = NULL;
4633
4634 ++fotg210->isoc_count;
4635 enable_periodic(fotg210);
4636}
4637
4638#define ISO_ERRS (FOTG210_ISOC_BUF_ERR | FOTG210_ISOC_BABBLE |\
4639 FOTG210_ISOC_XACTERR)
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651static bool itd_complete(struct fotg210_hcd *fotg210, struct fotg210_itd *itd)
4652{
4653 struct urb *urb = itd->urb;
4654 struct usb_iso_packet_descriptor *desc;
4655 u32 t;
4656 unsigned uframe;
4657 int urb_index = -1;
4658 struct fotg210_iso_stream *stream = itd->stream;
4659 struct usb_device *dev;
4660 bool retval = false;
4661
4662
4663 for (uframe = 0; uframe < 8; uframe++) {
4664 if (likely(itd->index[uframe] == -1))
4665 continue;
4666 urb_index = itd->index[uframe];
4667 desc = &urb->iso_frame_desc[urb_index];
4668
4669 t = hc32_to_cpup(fotg210, &itd->hw_transaction[uframe]);
4670 itd->hw_transaction[uframe] = 0;
4671
4672
4673 if (unlikely(t & ISO_ERRS)) {
4674 urb->error_count++;
4675 if (t & FOTG210_ISOC_BUF_ERR)
4676 desc->status = usb_pipein(urb->pipe)
4677 ? -ENOSR
4678 : -ECOMM;
4679 else if (t & FOTG210_ISOC_BABBLE)
4680 desc->status = -EOVERFLOW;
4681 else
4682 desc->status = -EPROTO;
4683
4684
4685 if (!(t & FOTG210_ISOC_BABBLE)) {
4686 desc->actual_length =
4687 fotg210_itdlen(urb, desc, t);
4688 urb->actual_length += desc->actual_length;
4689 }
4690 } else if (likely((t & FOTG210_ISOC_ACTIVE) == 0)) {
4691 desc->status = 0;
4692 desc->actual_length = fotg210_itdlen(urb, desc, t);
4693 urb->actual_length += desc->actual_length;
4694 } else {
4695
4696 desc->status = -EXDEV;
4697 }
4698 }
4699
4700
4701 if (likely((urb_index + 1) != urb->number_of_packets))
4702 goto done;
4703
4704
4705
4706
4707
4708
4709
4710 dev = urb->dev;
4711 fotg210_urb_done(fotg210, urb, 0);
4712 retval = true;
4713 urb = NULL;
4714
4715 --fotg210->isoc_count;
4716 disable_periodic(fotg210);
4717
4718 if (unlikely(list_is_singular(&stream->td_list))) {
4719 fotg210_to_hcd(fotg210)->self.bandwidth_allocated
4720 -= stream->bandwidth;
4721 fotg210_dbg(fotg210,
4722 "deschedule devp %s ep%d%s-iso\n",
4723 dev->devpath, stream->bEndpointAddress & 0x0f,
4724 (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out");
4725 }
4726
4727done:
4728 itd->urb = NULL;
4729
4730
4731 list_move_tail(&itd->itd_list, &stream->free_list);
4732
4733
4734 if (list_empty(&stream->td_list)) {
4735 list_splice_tail_init(&stream->free_list,
4736 &fotg210->cached_itd_list);
4737 start_free_itds(fotg210);
4738 }
4739
4740 return retval;
4741}
4742
4743
4744
4745static int itd_submit(struct fotg210_hcd *fotg210, struct urb *urb,
4746 gfp_t mem_flags)
4747{
4748 int status = -EINVAL;
4749 unsigned long flags;
4750 struct fotg210_iso_stream *stream;
4751
4752
4753 stream = iso_stream_find(fotg210, urb);
4754 if (unlikely(stream == NULL)) {
4755 fotg210_dbg(fotg210, "can't get iso stream\n");
4756 return -ENOMEM;
4757 }
4758 if (unlikely(urb->interval != stream->interval &&
4759 fotg210_port_speed(fotg210, 0) ==
4760 USB_PORT_STAT_HIGH_SPEED)) {
4761 fotg210_dbg(fotg210, "can't change iso interval %d --> %d\n",
4762 stream->interval, urb->interval);
4763 goto done;
4764 }
4765
4766#ifdef FOTG210_URB_TRACE
4767 fotg210_dbg(fotg210,
4768 "%s %s urb %p ep%d%s len %d, %d pkts %d uframes[%p]\n",
4769 __func__, urb->dev->devpath, urb,
4770 usb_pipeendpoint(urb->pipe),
4771 usb_pipein(urb->pipe) ? "in" : "out",
4772 urb->transfer_buffer_length,
4773 urb->number_of_packets, urb->interval,
4774 stream);
4775#endif
4776
4777
4778 status = itd_urb_transaction(stream, fotg210, urb, mem_flags);
4779 if (unlikely(status < 0)) {
4780 fotg210_dbg(fotg210, "can't init itds\n");
4781 goto done;
4782 }
4783
4784
4785 spin_lock_irqsave(&fotg210->lock, flags);
4786 if (unlikely(!HCD_HW_ACCESSIBLE(fotg210_to_hcd(fotg210)))) {
4787 status = -ESHUTDOWN;
4788 goto done_not_linked;
4789 }
4790 status = usb_hcd_link_urb_to_ep(fotg210_to_hcd(fotg210), urb);
4791 if (unlikely(status))
4792 goto done_not_linked;
4793 status = iso_stream_schedule(fotg210, urb, stream);
4794 if (likely(status == 0))
4795 itd_link_urb(fotg210, urb, fotg210->periodic_size << 3, stream);
4796 else
4797 usb_hcd_unlink_urb_from_ep(fotg210_to_hcd(fotg210), urb);
4798 done_not_linked:
4799 spin_unlock_irqrestore(&fotg210->lock, flags);
4800 done:
4801 return status;
4802}
4803
4804
4805
4806static void scan_isoc(struct fotg210_hcd *fotg210)
4807{
4808 unsigned uf, now_frame, frame;
4809 unsigned fmask = fotg210->periodic_size - 1;
4810 bool modified, live;
4811
4812
4813
4814
4815
4816
4817 if (fotg210->rh_state >= FOTG210_RH_RUNNING) {
4818 uf = fotg210_read_frame_index(fotg210);
4819 now_frame = (uf >> 3) & fmask;
4820 live = true;
4821 } else {
4822 now_frame = (fotg210->next_frame - 1) & fmask;
4823 live = false;
4824 }
4825 fotg210->now_frame = now_frame;
4826
4827 frame = fotg210->next_frame;
4828 for (;;) {
4829 union fotg210_shadow q, *q_p;
4830 __hc32 type, *hw_p;
4831
4832restart:
4833
4834 q_p = &fotg210->pshadow[frame];
4835 hw_p = &fotg210->periodic[frame];
4836 q.ptr = q_p->ptr;
4837 type = Q_NEXT_TYPE(fotg210, *hw_p);
4838 modified = false;
4839
4840 while (q.ptr != NULL) {
4841 switch (hc32_to_cpu(fotg210, type)) {
4842 case Q_TYPE_ITD:
4843
4844
4845
4846
4847
4848 if (frame == now_frame && live) {
4849 rmb();
4850 for (uf = 0; uf < 8; uf++) {
4851 if (q.itd->hw_transaction[uf] &
4852 ITD_ACTIVE(fotg210))
4853 break;
4854 }
4855 if (uf < 8) {
4856 q_p = &q.itd->itd_next;
4857 hw_p = &q.itd->hw_next;
4858 type = Q_NEXT_TYPE(fotg210,
4859 q.itd->hw_next);
4860 q = *q_p;
4861 break;
4862 }
4863 }
4864
4865
4866
4867
4868
4869
4870 *q_p = q.itd->itd_next;
4871 *hw_p = q.itd->hw_next;
4872 type = Q_NEXT_TYPE(fotg210, q.itd->hw_next);
4873 wmb();
4874 modified = itd_complete(fotg210, q.itd);
4875 q = *q_p;
4876 break;
4877 default:
4878 fotg210_dbg(fotg210, "corrupt type %d frame %d shadow %p\n",
4879 type, frame, q.ptr);
4880
4881 case Q_TYPE_QH:
4882 case Q_TYPE_FSTN:
4883
4884 q.ptr = NULL;
4885 break;
4886 }
4887
4888
4889 if (unlikely(modified && fotg210->isoc_count > 0))
4890 goto restart;
4891 }
4892
4893
4894 if (frame == now_frame)
4895 break;
4896 frame = (frame + 1) & fmask;
4897 }
4898 fotg210->next_frame = now_frame;
4899}
4900
4901
4902
4903
4904static ssize_t show_uframe_periodic_max(struct device *dev,
4905 struct device_attribute *attr,
4906 char *buf)
4907{
4908 struct fotg210_hcd *fotg210;
4909 int n;
4910
4911 fotg210 = hcd_to_fotg210(bus_to_hcd(dev_get_drvdata(dev)));
4912 n = scnprintf(buf, PAGE_SIZE, "%d\n", fotg210->uframe_periodic_max);
4913 return n;
4914}
4915
4916
4917static ssize_t store_uframe_periodic_max(struct device *dev,
4918 struct device_attribute *attr,
4919 const char *buf, size_t count)
4920{
4921 struct fotg210_hcd *fotg210;
4922 unsigned uframe_periodic_max;
4923 unsigned frame, uframe;
4924 unsigned short allocated_max;
4925 unsigned long flags;
4926 ssize_t ret;
4927
4928 fotg210 = hcd_to_fotg210(bus_to_hcd(dev_get_drvdata(dev)));
4929 if (kstrtouint(buf, 0, &uframe_periodic_max) < 0)
4930 return -EINVAL;
4931
4932 if (uframe_periodic_max < 100 || uframe_periodic_max >= 125) {
4933 fotg210_info(fotg210, "rejecting invalid request for uframe_periodic_max=%u\n",
4934 uframe_periodic_max);
4935 return -EINVAL;
4936 }
4937
4938 ret = -EINVAL;
4939
4940
4941
4942
4943
4944 spin_lock_irqsave(&fotg210->lock, flags);
4945
4946
4947
4948
4949
4950
4951 if (uframe_periodic_max < fotg210->uframe_periodic_max) {
4952 allocated_max = 0;
4953
4954 for (frame = 0; frame < fotg210->periodic_size; ++frame)
4955 for (uframe = 0; uframe < 7; ++uframe)
4956 allocated_max = max(allocated_max,
4957 periodic_usecs(fotg210, frame, uframe));
4958
4959 if (allocated_max > uframe_periodic_max) {
4960 fotg210_info(fotg210,
4961 "cannot decrease uframe_periodic_max because "
4962 "periodic bandwidth is already allocated "
4963 "(%u > %u)\n",
4964 allocated_max, uframe_periodic_max);
4965 goto out_unlock;
4966 }
4967 }
4968
4969
4970
4971 fotg210_info(fotg210, "setting max periodic bandwidth to %u%% (== %u usec/uframe)\n",
4972 100 * uframe_periodic_max/125, uframe_periodic_max);
4973
4974 if (uframe_periodic_max != 100)
4975 fotg210_warn(fotg210, "max periodic bandwidth set is non-standard\n");
4976
4977 fotg210->uframe_periodic_max = uframe_periodic_max;
4978 ret = count;
4979
4980out_unlock:
4981 spin_unlock_irqrestore(&fotg210->lock, flags);
4982 return ret;
4983}
4984
4985static DEVICE_ATTR(uframe_periodic_max, 0644, show_uframe_periodic_max,
4986 store_uframe_periodic_max);
4987
4988static inline int create_sysfs_files(struct fotg210_hcd *fotg210)
4989{
4990 struct device *controller = fotg210_to_hcd(fotg210)->self.controller;
4991 int i = 0;
4992
4993 if (i)
4994 goto out;
4995
4996 i = device_create_file(controller, &dev_attr_uframe_periodic_max);
4997out:
4998 return i;
4999}
5000
5001static inline void remove_sysfs_files(struct fotg210_hcd *fotg210)
5002{
5003 struct device *controller = fotg210_to_hcd(fotg210)->self.controller;
5004
5005 device_remove_file(controller, &dev_attr_uframe_periodic_max);
5006}
5007
5008
5009
5010
5011
5012
5013static void fotg210_turn_off_all_ports(struct fotg210_hcd *fotg210)
5014{
5015 u32 __iomem *status_reg = &fotg210->regs->port_status;
5016
5017 fotg210_writel(fotg210, PORT_RWC_BITS, status_reg);
5018}
5019
5020
5021
5022
5023
5024static void fotg210_silence_controller(struct fotg210_hcd *fotg210)
5025{
5026 fotg210_halt(fotg210);
5027
5028 spin_lock_irq(&fotg210->lock);
5029 fotg210->rh_state = FOTG210_RH_HALTED;
5030 fotg210_turn_off_all_ports(fotg210);
5031 spin_unlock_irq(&fotg210->lock);
5032}
5033
5034
5035
5036
5037
5038static void fotg210_shutdown(struct usb_hcd *hcd)
5039{
5040 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
5041
5042 spin_lock_irq(&fotg210->lock);
5043 fotg210->shutdown = true;
5044 fotg210->rh_state = FOTG210_RH_STOPPING;
5045 fotg210->enabled_hrtimer_events = 0;
5046 spin_unlock_irq(&fotg210->lock);
5047
5048 fotg210_silence_controller(fotg210);
5049
5050 hrtimer_cancel(&fotg210->hrtimer);
5051}
5052
5053
5054
5055
5056
5057
5058
5059static void fotg210_work(struct fotg210_hcd *fotg210)
5060{
5061
5062
5063
5064
5065 if (fotg210->scanning) {
5066 fotg210->need_rescan = true;
5067 return;
5068 }
5069 fotg210->scanning = true;
5070
5071 rescan:
5072 fotg210->need_rescan = false;
5073 if (fotg210->async_count)
5074 scan_async(fotg210);
5075 if (fotg210->intr_count > 0)
5076 scan_intr(fotg210);
5077 if (fotg210->isoc_count > 0)
5078 scan_isoc(fotg210);
5079 if (fotg210->need_rescan)
5080 goto rescan;
5081 fotg210->scanning = false;
5082
5083
5084
5085
5086
5087 turn_on_io_watchdog(fotg210);
5088}
5089
5090
5091
5092
5093static void fotg210_stop(struct usb_hcd *hcd)
5094{
5095 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
5096
5097 fotg210_dbg(fotg210, "stop\n");
5098
5099
5100
5101 spin_lock_irq(&fotg210->lock);
5102 fotg210->enabled_hrtimer_events = 0;
5103 spin_unlock_irq(&fotg210->lock);
5104
5105 fotg210_quiesce(fotg210);
5106 fotg210_silence_controller(fotg210);
5107 fotg210_reset(fotg210);
5108
5109 hrtimer_cancel(&fotg210->hrtimer);
5110 remove_sysfs_files(fotg210);
5111 remove_debug_files(fotg210);
5112
5113
5114 spin_lock_irq(&fotg210->lock);
5115 end_free_itds(fotg210);
5116 spin_unlock_irq(&fotg210->lock);
5117 fotg210_mem_cleanup(fotg210);
5118
5119#ifdef FOTG210_STATS
5120 fotg210_dbg(fotg210, "irq normal %ld err %ld iaa %ld (lost %ld)\n",
5121 fotg210->stats.normal, fotg210->stats.error, fotg210->stats.iaa,
5122 fotg210->stats.lost_iaa);
5123 fotg210_dbg(fotg210, "complete %ld unlink %ld\n",
5124 fotg210->stats.complete, fotg210->stats.unlink);
5125#endif
5126
5127 dbg_status(fotg210, "fotg210_stop completed",
5128 fotg210_readl(fotg210, &fotg210->regs->status));
5129}
5130
5131
5132static int hcd_fotg210_init(struct usb_hcd *hcd)
5133{
5134 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
5135 u32 temp;
5136 int retval;
5137 u32 hcc_params;
5138 struct fotg210_qh_hw *hw;
5139
5140 spin_lock_init(&fotg210->lock);
5141
5142
5143
5144
5145 fotg210->need_io_watchdog = 1;
5146
5147 hrtimer_init(&fotg210->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
5148 fotg210->hrtimer.function = fotg210_hrtimer_func;
5149 fotg210->next_hrtimer_event = FOTG210_HRTIMER_NO_EVENT;
5150
5151 hcc_params = fotg210_readl(fotg210, &fotg210->caps->hcc_params);
5152
5153
5154
5155
5156
5157 fotg210->uframe_periodic_max = 100;
5158
5159
5160
5161
5162
5163 fotg210->periodic_size = DEFAULT_I_TDPS;
5164 INIT_LIST_HEAD(&fotg210->intr_qh_list);
5165 INIT_LIST_HEAD(&fotg210->cached_itd_list);
5166
5167 if (HCC_PGM_FRAMELISTLEN(hcc_params)) {
5168
5169 switch (FOTG210_TUNE_FLS) {
5170 case 0:
5171 fotg210->periodic_size = 1024;
5172 break;
5173 case 1:
5174 fotg210->periodic_size = 512;
5175 break;
5176 case 2:
5177 fotg210->periodic_size = 256;
5178 break;
5179 default:
5180 BUG();
5181 }
5182 }
5183 retval = fotg210_mem_init(fotg210, GFP_KERNEL);
5184 if (retval < 0)
5185 return retval;
5186
5187
5188 fotg210->i_thresh = 2;
5189
5190
5191
5192
5193
5194
5195
5196
5197 fotg210->async->qh_next.qh = NULL;
5198 hw = fotg210->async->hw;
5199 hw->hw_next = QH_NEXT(fotg210, fotg210->async->qh_dma);
5200 hw->hw_info1 = cpu_to_hc32(fotg210, QH_HEAD);
5201 hw->hw_token = cpu_to_hc32(fotg210, QTD_STS_HALT);
5202 hw->hw_qtd_next = FOTG210_LIST_END(fotg210);
5203 fotg210->async->qh_state = QH_STATE_LINKED;
5204 hw->hw_alt_next = QTD_NEXT(fotg210, fotg210->async->dummy->qtd_dma);
5205
5206
5207 if (log2_irq_thresh < 0 || log2_irq_thresh > 6)
5208 log2_irq_thresh = 0;
5209 temp = 1 << (16 + log2_irq_thresh);
5210 if (HCC_CANPARK(hcc_params)) {
5211
5212
5213
5214
5215
5216
5217
5218 if (park) {
5219 park = min_t(unsigned, park, 3);
5220 temp |= CMD_PARK;
5221 temp |= park << 8;
5222 }
5223 fotg210_dbg(fotg210, "park %d\n", park);
5224 }
5225 if (HCC_PGM_FRAMELISTLEN(hcc_params)) {
5226
5227 temp &= ~(3 << 2);
5228 temp |= (FOTG210_TUNE_FLS << 2);
5229 }
5230 fotg210->command = temp;
5231
5232
5233 if (!(hcd->driver->flags & HCD_LOCAL_MEM))
5234 hcd->self.sg_tablesize = ~0;
5235 return 0;
5236}
5237
5238
5239static int fotg210_run(struct usb_hcd *hcd)
5240{
5241 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
5242 u32 temp;
5243 u32 hcc_params;
5244
5245 hcd->uses_new_polling = 1;
5246
5247
5248
5249 fotg210_writel(fotg210, fotg210->periodic_dma,
5250 &fotg210->regs->frame_list);
5251 fotg210_writel(fotg210, (u32)fotg210->async->qh_dma,
5252 &fotg210->regs->async_next);
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266 hcc_params = fotg210_readl(fotg210, &fotg210->caps->hcc_params);
5267
5268
5269
5270
5271
5272 fotg210->command &= ~(CMD_IAAD|CMD_PSE|CMD_ASE|CMD_RESET);
5273 fotg210->command |= CMD_RUN;
5274 fotg210_writel(fotg210, fotg210->command, &fotg210->regs->command);
5275 dbg_cmd(fotg210, "init", fotg210->command);
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291 down_write(&ehci_cf_port_reset_rwsem);
5292 fotg210->rh_state = FOTG210_RH_RUNNING;
5293
5294 fotg210_readl(fotg210, &fotg210->regs->command);
5295 msleep(5);
5296 up_write(&ehci_cf_port_reset_rwsem);
5297 fotg210->last_periodic_enable = ktime_get_real();
5298
5299 temp = HC_VERSION(fotg210,
5300 fotg210_readl(fotg210, &fotg210->caps->hc_capbase));
5301 fotg210_info(fotg210,
5302 "USB %x.%x started, EHCI %x.%02x\n",
5303 ((fotg210->sbrn & 0xf0)>>4), (fotg210->sbrn & 0x0f),
5304 temp >> 8, temp & 0xff);
5305
5306 fotg210_writel(fotg210, INTR_MASK,
5307 &fotg210->regs->intr_enable);
5308
5309
5310
5311
5312
5313 create_debug_files(fotg210);
5314 create_sysfs_files(fotg210);
5315
5316 return 0;
5317}
5318
5319static int fotg210_setup(struct usb_hcd *hcd)
5320{
5321 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
5322 int retval;
5323
5324 fotg210->regs = (void __iomem *)fotg210->caps +
5325 HC_LENGTH(fotg210,
5326 fotg210_readl(fotg210, &fotg210->caps->hc_capbase));
5327 dbg_hcs_params(fotg210, "reset");
5328 dbg_hcc_params(fotg210, "reset");
5329
5330
5331 fotg210->hcs_params = fotg210_readl(fotg210,
5332 &fotg210->caps->hcs_params);
5333
5334 fotg210->sbrn = HCD_USB2;
5335
5336
5337 retval = hcd_fotg210_init(hcd);
5338 if (retval)
5339 return retval;
5340
5341 retval = fotg210_halt(fotg210);
5342 if (retval)
5343 return retval;
5344
5345 fotg210_reset(fotg210);
5346
5347 return 0;
5348}
5349
5350
5351
5352static irqreturn_t fotg210_irq(struct usb_hcd *hcd)
5353{
5354 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
5355 u32 status, masked_status, pcd_status = 0, cmd;
5356 int bh;
5357
5358 spin_lock(&fotg210->lock);
5359
5360 status = fotg210_readl(fotg210, &fotg210->regs->status);
5361
5362
5363 if (status == ~(u32) 0) {
5364 fotg210_dbg(fotg210, "device removed\n");
5365 goto dead;
5366 }
5367
5368
5369
5370
5371
5372 masked_status = status & (INTR_MASK | STS_FLR);
5373
5374
5375 if (!masked_status ||
5376 unlikely(fotg210->rh_state == FOTG210_RH_HALTED)) {
5377 spin_unlock(&fotg210->lock);
5378 return IRQ_NONE;
5379 }
5380
5381
5382 fotg210_writel(fotg210, masked_status, &fotg210->regs->status);
5383 cmd = fotg210_readl(fotg210, &fotg210->regs->command);
5384 bh = 0;
5385
5386
5387 dbg_status(fotg210, "irq", status);
5388
5389
5390
5391
5392 if (likely((status & (STS_INT|STS_ERR)) != 0)) {
5393 if (likely((status & STS_ERR) == 0))
5394 COUNT(fotg210->stats.normal);
5395 else
5396 COUNT(fotg210->stats.error);
5397 bh = 1;
5398 }
5399
5400
5401 if (status & STS_IAA) {
5402
5403
5404 fotg210->enabled_hrtimer_events &=
5405 ~BIT(FOTG210_HRTIMER_IAA_WATCHDOG);
5406
5407
5408
5409
5410
5411
5412
5413
5414 if (fotg210->next_hrtimer_event == FOTG210_HRTIMER_IAA_WATCHDOG)
5415 ++fotg210->next_hrtimer_event;
5416
5417
5418 if (cmd & CMD_IAAD)
5419 fotg210_dbg(fotg210, "IAA with IAAD still set?\n");
5420 if (fotg210->async_iaa) {
5421 COUNT(fotg210->stats.iaa);
5422 end_unlink_async(fotg210);
5423 } else
5424 fotg210_dbg(fotg210, "IAA with nothing unlinked?\n");
5425 }
5426
5427
5428 if (status & STS_PCD) {
5429 int pstatus;
5430 u32 __iomem *status_reg = &fotg210->regs->port_status;
5431
5432
5433 pcd_status = status;
5434
5435
5436 if (fotg210->rh_state == FOTG210_RH_SUSPENDED)
5437 usb_hcd_resume_root_hub(hcd);
5438
5439 pstatus = fotg210_readl(fotg210, status_reg);
5440
5441 if (test_bit(0, &fotg210->suspended_ports) &&
5442 ((pstatus & PORT_RESUME) ||
5443 !(pstatus & PORT_SUSPEND)) &&
5444 (pstatus & PORT_PE) &&
5445 fotg210->reset_done[0] == 0) {
5446
5447
5448
5449
5450
5451
5452 fotg210->reset_done[0] = jiffies + msecs_to_jiffies(25);
5453 set_bit(0, &fotg210->resuming_ports);
5454 fotg210_dbg(fotg210, "port 1 remote wakeup\n");
5455 mod_timer(&hcd->rh_timer, fotg210->reset_done[0]);
5456 }
5457 }
5458
5459
5460 if (unlikely((status & STS_FATAL) != 0)) {
5461 fotg210_err(fotg210, "fatal error\n");
5462 dbg_cmd(fotg210, "fatal", cmd);
5463 dbg_status(fotg210, "fatal", status);
5464dead:
5465 usb_hc_died(hcd);
5466
5467
5468 fotg210->shutdown = true;
5469 fotg210->rh_state = FOTG210_RH_STOPPING;
5470 fotg210->command &= ~(CMD_RUN | CMD_ASE | CMD_PSE);
5471 fotg210_writel(fotg210, fotg210->command,
5472 &fotg210->regs->command);
5473 fotg210_writel(fotg210, 0, &fotg210->regs->intr_enable);
5474 fotg210_handle_controller_death(fotg210);
5475
5476
5477 bh = 0;
5478 }
5479
5480 if (bh)
5481 fotg210_work(fotg210);
5482 spin_unlock(&fotg210->lock);
5483 if (pcd_status)
5484 usb_hcd_poll_rh_status(hcd);
5485 return IRQ_HANDLED;
5486}
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502static int fotg210_urb_enqueue(
5503 struct usb_hcd *hcd,
5504 struct urb *urb,
5505 gfp_t mem_flags
5506) {
5507 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
5508 struct list_head qtd_list;
5509
5510 INIT_LIST_HEAD(&qtd_list);
5511
5512 switch (usb_pipetype(urb->pipe)) {
5513 case PIPE_CONTROL:
5514
5515
5516
5517 if (urb->transfer_buffer_length > (16 * 1024))
5518 return -EMSGSIZE;
5519
5520
5521 default:
5522 if (!qh_urb_transaction(fotg210, urb, &qtd_list, mem_flags))
5523 return -ENOMEM;
5524 return submit_async(fotg210, urb, &qtd_list, mem_flags);
5525
5526 case PIPE_INTERRUPT:
5527 if (!qh_urb_transaction(fotg210, urb, &qtd_list, mem_flags))
5528 return -ENOMEM;
5529 return intr_submit(fotg210, urb, &qtd_list, mem_flags);
5530
5531 case PIPE_ISOCHRONOUS:
5532 return itd_submit(fotg210, urb, mem_flags);
5533 }
5534}
5535
5536
5537
5538
5539
5540static int fotg210_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
5541{
5542 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
5543 struct fotg210_qh *qh;
5544 unsigned long flags;
5545 int rc;
5546
5547 spin_lock_irqsave(&fotg210->lock, flags);
5548 rc = usb_hcd_check_unlink_urb(hcd, urb, status);
5549 if (rc)
5550 goto done;
5551
5552 switch (usb_pipetype(urb->pipe)) {
5553
5554
5555 default:
5556 qh = (struct fotg210_qh *) urb->hcpriv;
5557 if (!qh)
5558 break;
5559 switch (qh->qh_state) {
5560 case QH_STATE_LINKED:
5561 case QH_STATE_COMPLETING:
5562 start_unlink_async(fotg210, qh);
5563 break;
5564 case QH_STATE_UNLINK:
5565 case QH_STATE_UNLINK_WAIT:
5566
5567 break;
5568 case QH_STATE_IDLE:
5569
5570 qh_completions(fotg210, qh);
5571 break;
5572 }
5573 break;
5574
5575 case PIPE_INTERRUPT:
5576 qh = (struct fotg210_qh *) urb->hcpriv;
5577 if (!qh)
5578 break;
5579 switch (qh->qh_state) {
5580 case QH_STATE_LINKED:
5581 case QH_STATE_COMPLETING:
5582 start_unlink_intr(fotg210, qh);
5583 break;
5584 case QH_STATE_IDLE:
5585 qh_completions(fotg210, qh);
5586 break;
5587 default:
5588 fotg210_dbg(fotg210, "bogus qh %p state %d\n",
5589 qh, qh->qh_state);
5590 goto done;
5591 }
5592 break;
5593
5594 case PIPE_ISOCHRONOUS:
5595
5596
5597
5598
5599 break;
5600 }
5601done:
5602 spin_unlock_irqrestore(&fotg210->lock, flags);
5603 return rc;
5604}
5605
5606
5607
5608
5609
5610static void
5611fotg210_endpoint_disable(struct usb_hcd *hcd, struct usb_host_endpoint *ep)
5612{
5613 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
5614 unsigned long flags;
5615 struct fotg210_qh *qh, *tmp;
5616
5617
5618
5619
5620rescan:
5621 spin_lock_irqsave(&fotg210->lock, flags);
5622 qh = ep->hcpriv;
5623 if (!qh)
5624 goto done;
5625
5626
5627
5628
5629 if (qh->hw == NULL) {
5630 struct fotg210_iso_stream *stream = ep->hcpriv;
5631
5632 if (!list_empty(&stream->td_list))
5633 goto idle_timeout;
5634
5635
5636 kfree(stream);
5637 goto done;
5638 }
5639
5640 if (fotg210->rh_state < FOTG210_RH_RUNNING)
5641 qh->qh_state = QH_STATE_IDLE;
5642 switch (qh->qh_state) {
5643 case QH_STATE_LINKED:
5644 case QH_STATE_COMPLETING:
5645 for (tmp = fotg210->async->qh_next.qh;
5646 tmp && tmp != qh;
5647 tmp = tmp->qh_next.qh)
5648 continue;
5649
5650
5651
5652 if (tmp)
5653 start_unlink_async(fotg210, qh);
5654
5655 case QH_STATE_UNLINK:
5656 case QH_STATE_UNLINK_WAIT:
5657idle_timeout:
5658 spin_unlock_irqrestore(&fotg210->lock, flags);
5659 schedule_timeout_uninterruptible(1);
5660 goto rescan;
5661 case QH_STATE_IDLE:
5662 if (qh->clearing_tt)
5663 goto idle_timeout;
5664 if (list_empty(&qh->qtd_list)) {
5665 qh_destroy(fotg210, qh);
5666 break;
5667 }
5668
5669 default:
5670
5671
5672
5673 fotg210_err(fotg210, "qh %p (#%02x) state %d%s\n",
5674 qh, ep->desc.bEndpointAddress, qh->qh_state,
5675 list_empty(&qh->qtd_list) ? "" : "(has tds)");
5676 break;
5677 }
5678 done:
5679 ep->hcpriv = NULL;
5680 spin_unlock_irqrestore(&fotg210->lock, flags);
5681}
5682
5683static void
5684fotg210_endpoint_reset(struct usb_hcd *hcd, struct usb_host_endpoint *ep)
5685{
5686 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
5687 struct fotg210_qh *qh;
5688 int eptype = usb_endpoint_type(&ep->desc);
5689 int epnum = usb_endpoint_num(&ep->desc);
5690 int is_out = usb_endpoint_dir_out(&ep->desc);
5691 unsigned long flags;
5692
5693 if (eptype != USB_ENDPOINT_XFER_BULK && eptype != USB_ENDPOINT_XFER_INT)
5694 return;
5695
5696 spin_lock_irqsave(&fotg210->lock, flags);
5697 qh = ep->hcpriv;
5698
5699
5700
5701
5702
5703
5704 if (qh) {
5705 usb_settoggle(qh->dev, epnum, is_out, 0);
5706 if (!list_empty(&qh->qtd_list)) {
5707 WARN_ONCE(1, "clear_halt for a busy endpoint\n");
5708 } else if (qh->qh_state == QH_STATE_LINKED ||
5709 qh->qh_state == QH_STATE_COMPLETING) {
5710
5711
5712
5713
5714
5715 if (eptype == USB_ENDPOINT_XFER_BULK)
5716 start_unlink_async(fotg210, qh);
5717 else
5718 start_unlink_intr(fotg210, qh);
5719 }
5720 }
5721 spin_unlock_irqrestore(&fotg210->lock, flags);
5722}
5723
5724static int fotg210_get_frame(struct usb_hcd *hcd)
5725{
5726 struct fotg210_hcd *fotg210 = hcd_to_fotg210(hcd);
5727 return (fotg210_read_frame_index(fotg210) >> 3) %
5728 fotg210->periodic_size;
5729}
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739MODULE_DESCRIPTION(DRIVER_DESC);
5740MODULE_AUTHOR(DRIVER_AUTHOR);
5741MODULE_LICENSE("GPL");
5742
5743static const struct hc_driver fotg210_fotg210_hc_driver = {
5744 .description = hcd_name,
5745 .product_desc = "Faraday USB2.0 Host Controller",
5746 .hcd_priv_size = sizeof(struct fotg210_hcd),
5747
5748
5749
5750
5751 .irq = fotg210_irq,
5752 .flags = HCD_MEMORY | HCD_USB2,
5753
5754
5755
5756
5757 .reset = hcd_fotg210_init,
5758 .start = fotg210_run,
5759 .stop = fotg210_stop,
5760 .shutdown = fotg210_shutdown,
5761
5762
5763
5764
5765 .urb_enqueue = fotg210_urb_enqueue,
5766 .urb_dequeue = fotg210_urb_dequeue,
5767 .endpoint_disable = fotg210_endpoint_disable,
5768 .endpoint_reset = fotg210_endpoint_reset,
5769
5770
5771
5772
5773 .get_frame_number = fotg210_get_frame,
5774
5775
5776
5777
5778 .hub_status_data = fotg210_hub_status_data,
5779 .hub_control = fotg210_hub_control,
5780 .bus_suspend = fotg210_bus_suspend,
5781 .bus_resume = fotg210_bus_resume,
5782
5783 .relinquish_port = fotg210_relinquish_port,
5784 .port_handed_over = fotg210_port_handed_over,
5785
5786 .clear_tt_buffer_complete = fotg210_clear_tt_buffer_complete,
5787};
5788
5789static void fotg210_init(struct fotg210_hcd *fotg210)
5790{
5791 u32 value;
5792
5793 iowrite32(GMIR_MDEV_INT | GMIR_MOTG_INT | GMIR_INT_POLARITY,
5794 &fotg210->regs->gmir);
5795
5796 value = ioread32(&fotg210->regs->otgcsr);
5797 value &= ~OTGCSR_A_BUS_DROP;
5798 value |= OTGCSR_A_BUS_REQ;
5799 iowrite32(value, &fotg210->regs->otgcsr);
5800}
5801
5802
5803
5804
5805
5806
5807
5808
5809static int fotg210_hcd_probe(struct platform_device *pdev)
5810{
5811 struct device *dev = &pdev->dev;
5812 struct usb_hcd *hcd;
5813 struct resource *res;
5814 int irq;
5815 int retval = -ENODEV;
5816 struct fotg210_hcd *fotg210;
5817
5818 if (usb_disabled())
5819 return -ENODEV;
5820
5821 pdev->dev.power.power_state = PMSG_ON;
5822
5823 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
5824 if (!res) {
5825 dev_err(dev,
5826 "Found HC with no IRQ. Check %s setup!\n",
5827 dev_name(dev));
5828 return -ENODEV;
5829 }
5830
5831 irq = res->start;
5832
5833 hcd = usb_create_hcd(&fotg210_fotg210_hc_driver, dev,
5834 dev_name(dev));
5835 if (!hcd) {
5836 dev_err(dev, "failed to create hcd with err %d\n", retval);
5837 retval = -ENOMEM;
5838 goto fail_create_hcd;
5839 }
5840
5841 hcd->has_tt = 1;
5842
5843 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
5844 hcd->regs = devm_ioremap_resource(&pdev->dev, res);
5845 if (IS_ERR(hcd->regs)) {
5846 retval = PTR_ERR(hcd->regs);
5847 goto failed;
5848 }
5849
5850 hcd->rsrc_start = res->start;
5851 hcd->rsrc_len = resource_size(res);
5852
5853 fotg210 = hcd_to_fotg210(hcd);
5854
5855 fotg210->caps = hcd->regs;
5856
5857 retval = fotg210_setup(hcd);
5858 if (retval)
5859 goto failed;
5860
5861 fotg210_init(fotg210);
5862
5863 retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
5864 if (retval) {
5865 dev_err(dev, "failed to add hcd with err %d\n", retval);
5866 goto failed;
5867 }
5868 device_wakeup_enable(hcd->self.controller);
5869
5870 return retval;
5871
5872failed:
5873 usb_put_hcd(hcd);
5874fail_create_hcd:
5875 dev_err(dev, "init %s fail, %d\n", dev_name(dev), retval);
5876 return retval;
5877}
5878
5879
5880
5881
5882
5883
5884static int fotg210_hcd_remove(struct platform_device *pdev)
5885{
5886 struct device *dev = &pdev->dev;
5887 struct usb_hcd *hcd = dev_get_drvdata(dev);
5888
5889 if (!hcd)
5890 return 0;
5891
5892 usb_remove_hcd(hcd);
5893 usb_put_hcd(hcd);
5894
5895 return 0;
5896}
5897
5898static struct platform_driver fotg210_hcd_driver = {
5899 .driver = {
5900 .name = "fotg210-hcd",
5901 },
5902 .probe = fotg210_hcd_probe,
5903 .remove = fotg210_hcd_remove,
5904};
5905
5906static int __init fotg210_hcd_init(void)
5907{
5908 int retval = 0;
5909
5910 if (usb_disabled())
5911 return -ENODEV;
5912
5913 pr_info("%s: " DRIVER_DESC "\n", hcd_name);
5914 set_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
5915 if (test_bit(USB_UHCI_LOADED, &usb_hcds_loaded) ||
5916 test_bit(USB_OHCI_LOADED, &usb_hcds_loaded))
5917 pr_warn(KERN_WARNING "Warning! fotg210_hcd should always be loaded before uhci_hcd and ohci_hcd, not after\n");
5918
5919 pr_debug("%s: block sizes: qh %Zd qtd %Zd itd %Zd\n",
5920 hcd_name,
5921 sizeof(struct fotg210_qh), sizeof(struct fotg210_qtd),
5922 sizeof(struct fotg210_itd));
5923
5924 fotg210_debug_root = debugfs_create_dir("fotg210", usb_debug_root);
5925 if (!fotg210_debug_root) {
5926 retval = -ENOENT;
5927 goto err_debug;
5928 }
5929
5930 retval = platform_driver_register(&fotg210_hcd_driver);
5931 if (retval < 0)
5932 goto clean;
5933 return retval;
5934
5935 platform_driver_unregister(&fotg210_hcd_driver);
5936clean:
5937 debugfs_remove(fotg210_debug_root);
5938 fotg210_debug_root = NULL;
5939err_debug:
5940 clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
5941 return retval;
5942}
5943module_init(fotg210_hcd_init);
5944
5945static void __exit fotg210_hcd_cleanup(void)
5946{
5947 platform_driver_unregister(&fotg210_hcd_driver);
5948 debugfs_remove(fotg210_debug_root);
5949 clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
5950}
5951module_exit(fotg210_hcd_cleanup);
5952