blob: 41bbae83fc713f3c686dc2ad4ec2c9399beee1fe [file] [log] [blame]
Olav Kongas4808a1c2005-04-09 22:57:39 +03001/*
2 * ISP116x HCD (Host Controller Driver) for USB.
3 *
4 * Derived from the SL811 HCD, rewritten for ISP116x.
5 * Copyright (C) 2005 Olav Kongas <ok@artecdesign.ee>
6 *
7 * Portions:
8 * Copyright (C) 2004 Psion Teklogix (for NetBook PRO)
9 * Copyright (C) 2004 David Brownell
10 *
11 * Periodic scheduling is based on Roman's OHCI code
12 * Copyright (C) 1999 Roman Weissgaerber
13 *
14 */
15
16/*
17 * The driver basically works. A number of people have used it with a range
18 * of devices.
19 *
Olav Kongas17f8bb72005-06-23 20:12:24 +030020 * The driver passes all usbtests 1-14.
Olav Kongas4808a1c2005-04-09 22:57:39 +030021 *
22 * Suspending/resuming of root hub via sysfs works. Remote wakeup works too.
23 * And suspending/resuming of platform device works too. Suspend/resume
24 * via HCD operations vector is not implemented.
25 *
26 * Iso transfer support is not implemented. Adding this would include
27 * implementing recovery from the failure to service the processed ITL
28 * fifo ram in time, which will involve chip reset.
29 *
30 * TODO:
31 + More testing of suspend/resume.
32*/
33
34/*
35 ISP116x chips require certain delays between accesses to its
36 registers. The following timing options exist.
37
38 1. Configure your memory controller (the best)
39 2. Implement platform-specific delay function possibly
40 combined with configuring the memory controller; see
41 include/linux/usb-isp116x.h for more info. Some broken
42 memory controllers line LH7A400 SMC need this. Also,
43 uncomment for that to work the following
44 USE_PLATFORM_DELAY macro.
45 3. Use ndelay (easiest, poorest). For that, uncomment
46 the following USE_NDELAY macro.
47*/
48#define USE_PLATFORM_DELAY
49//#define USE_NDELAY
50
51//#define DEBUG
52//#define VERBOSE
53/* Transfer descriptors. See dump_ptd() for printout format */
54//#define PTD_TRACE
55/* enqueuing/finishing log of urbs */
56//#define URB_TRACE
57
58#include <linux/config.h>
59#include <linux/module.h>
60#include <linux/moduleparam.h>
61#include <linux/kernel.h>
62#include <linux/delay.h>
63#include <linux/ioport.h>
64#include <linux/sched.h>
65#include <linux/slab.h>
66#include <linux/smp_lock.h>
67#include <linux/errno.h>
68#include <linux/init.h>
69#include <linux/list.h>
70#include <linux/interrupt.h>
71#include <linux/usb.h>
72#include <linux/usb_isp116x.h>
73
74#include <asm/io.h>
75#include <asm/irq.h>
76#include <asm/system.h>
77#include <asm/byteorder.h>
78
79#ifndef DEBUG
80# define STUB_DEBUG_FILE
81#endif
82
83#include "../core/hcd.h"
84#include "isp116x.h"
85
Olav Kongas9a571162005-08-05 14:23:35 +030086#define DRIVER_VERSION "05 Aug 2005"
Olav Kongas4808a1c2005-04-09 22:57:39 +030087#define DRIVER_DESC "ISP116x USB Host Controller Driver"
88
89MODULE_DESCRIPTION(DRIVER_DESC);
90MODULE_LICENSE("GPL");
91
92static const char hcd_name[] = "isp116x-hcd";
93
94/*-----------------------------------------------------------------*/
95
96/*
97 Write len bytes to fifo, pad till 32-bit boundary
98 */
99static void write_ptddata_to_fifo(struct isp116x *isp116x, void *buf, int len)
100{
101 u8 *dp = (u8 *) buf;
102 u16 *dp2 = (u16 *) buf;
103 u16 w;
104 int quot = len % 4;
105
106 if ((unsigned long)dp2 & 1) {
107 /* not aligned */
108 for (; len > 1; len -= 2) {
109 w = *dp++;
110 w |= *dp++ << 8;
111 isp116x_raw_write_data16(isp116x, w);
112 }
113 if (len)
114 isp116x_write_data16(isp116x, (u16) * dp);
115 } else {
116 /* aligned */
117 for (; len > 1; len -= 2)
118 isp116x_raw_write_data16(isp116x, *dp2++);
119 if (len)
120 isp116x_write_data16(isp116x, 0xff & *((u8 *) dp2));
121 }
122 if (quot == 1 || quot == 2)
123 isp116x_raw_write_data16(isp116x, 0);
124}
125
126/*
127 Read len bytes from fifo and then read till 32-bit boundary.
128 */
129static void read_ptddata_from_fifo(struct isp116x *isp116x, void *buf, int len)
130{
131 u8 *dp = (u8 *) buf;
132 u16 *dp2 = (u16 *) buf;
133 u16 w;
134 int quot = len % 4;
135
136 if ((unsigned long)dp2 & 1) {
137 /* not aligned */
138 for (; len > 1; len -= 2) {
139 w = isp116x_raw_read_data16(isp116x);
140 *dp++ = w & 0xff;
141 *dp++ = (w >> 8) & 0xff;
142 }
143 if (len)
144 *dp = 0xff & isp116x_read_data16(isp116x);
145 } else {
146 /* aligned */
147 for (; len > 1; len -= 2)
148 *dp2++ = isp116x_raw_read_data16(isp116x);
149 if (len)
150 *(u8 *) dp2 = 0xff & isp116x_read_data16(isp116x);
151 }
152 if (quot == 1 || quot == 2)
153 isp116x_raw_read_data16(isp116x);
154}
155
156/*
157 Write ptd's and data for scheduled transfers into
158 the fifo ram. Fifo must be empty and ready.
159*/
160static void pack_fifo(struct isp116x *isp116x)
161{
162 struct isp116x_ep *ep;
163 struct ptd *ptd;
164 int buflen = isp116x->atl_last_dir == PTD_DIR_IN
165 ? isp116x->atl_bufshrt : isp116x->atl_buflen;
166 int ptd_count = 0;
167
168 isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT);
169 isp116x_write_reg16(isp116x, HCXFERCTR, buflen);
170 isp116x_write_addr(isp116x, HCATLPORT | ISP116x_WRITE_OFFSET);
171 for (ep = isp116x->atl_active; ep; ep = ep->active) {
172 ++ptd_count;
173 ptd = &ep->ptd;
174 dump_ptd(ptd);
175 dump_ptd_out_data(ptd, ep->data);
176 isp116x_write_data16(isp116x, ptd->count);
177 isp116x_write_data16(isp116x, ptd->mps);
178 isp116x_write_data16(isp116x, ptd->len);
179 isp116x_write_data16(isp116x, ptd->faddr);
180 buflen -= sizeof(struct ptd);
181 /* Skip writing data for last IN PTD */
182 if (ep->active || (isp116x->atl_last_dir != PTD_DIR_IN)) {
183 write_ptddata_to_fifo(isp116x, ep->data, ep->length);
184 buflen -= ALIGN(ep->length, 4);
185 }
186 }
187 BUG_ON(buflen);
188}
189
190/*
191 Read the processed ptd's and data from fifo ram back to
192 URBs' buffers. Fifo must be full and done
193*/
194static void unpack_fifo(struct isp116x *isp116x)
195{
196 struct isp116x_ep *ep;
197 struct ptd *ptd;
198 int buflen = isp116x->atl_last_dir == PTD_DIR_IN
199 ? isp116x->atl_buflen : isp116x->atl_bufshrt;
200
201 isp116x_write_reg16(isp116x, HCuPINT, HCuPINT_AIIEOT);
202 isp116x_write_reg16(isp116x, HCXFERCTR, buflen);
203 isp116x_write_addr(isp116x, HCATLPORT);
204 for (ep = isp116x->atl_active; ep; ep = ep->active) {
205 ptd = &ep->ptd;
206 ptd->count = isp116x_read_data16(isp116x);
207 ptd->mps = isp116x_read_data16(isp116x);
208 ptd->len = isp116x_read_data16(isp116x);
209 ptd->faddr = isp116x_read_data16(isp116x);
210 buflen -= sizeof(struct ptd);
211 /* Skip reading data for last Setup or Out PTD */
212 if (ep->active || (isp116x->atl_last_dir == PTD_DIR_IN)) {
213 read_ptddata_from_fifo(isp116x, ep->data, ep->length);
214 buflen -= ALIGN(ep->length, 4);
215 }
216 dump_ptd(ptd);
217 dump_ptd_in_data(ptd, ep->data);
218 }
219 BUG_ON(buflen);
220}
221
222/*---------------------------------------------------------------*/
223
224/*
225 Set up PTD's.
226*/
227static void preproc_atl_queue(struct isp116x *isp116x)
228{
229 struct isp116x_ep *ep;
230 struct urb *urb;
231 struct ptd *ptd;
Olav Kongasf10eff22005-08-04 18:06:47 -0700232 u16 len;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300233
234 for (ep = isp116x->atl_active; ep; ep = ep->active) {
Olav Kongasf10eff22005-08-04 18:06:47 -0700235 u16 toggle = 0, dir = PTD_DIR_SETUP;
236
Olav Kongas4808a1c2005-04-09 22:57:39 +0300237 BUG_ON(list_empty(&ep->hep->urb_list));
238 urb = container_of(ep->hep->urb_list.next,
239 struct urb, urb_list);
240 ptd = &ep->ptd;
241 len = ep->length;
242 spin_lock(&urb->lock);
243 ep->data = (unsigned char *)urb->transfer_buffer
244 + urb->actual_length;
245
246 switch (ep->nextpid) {
247 case USB_PID_IN:
248 toggle = usb_gettoggle(urb->dev, ep->epnum, 0);
249 dir = PTD_DIR_IN;
250 break;
251 case USB_PID_OUT:
252 toggle = usb_gettoggle(urb->dev, ep->epnum, 1);
253 dir = PTD_DIR_OUT;
254 break;
255 case USB_PID_SETUP:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300256 len = sizeof(struct usb_ctrlrequest);
257 ep->data = urb->setup_packet;
258 break;
259 case USB_PID_ACK:
260 toggle = 1;
261 len = 0;
262 dir = (urb->transfer_buffer_length
263 && usb_pipein(urb->pipe))
264 ? PTD_DIR_OUT : PTD_DIR_IN;
265 break;
266 default:
Olav Kongas4808a1c2005-04-09 22:57:39 +0300267 ERR("%s %d: ep->nextpid %d\n", __func__, __LINE__,
268 ep->nextpid);
Olav Kongas17f8bb72005-06-23 20:12:24 +0300269 BUG();
Olav Kongas4808a1c2005-04-09 22:57:39 +0300270 }
271
272 ptd->count = PTD_CC_MSK | PTD_ACTIVE_MSK | PTD_TOGGLE(toggle);
273 ptd->mps = PTD_MPS(ep->maxpacket)
274 | PTD_SPD(urb->dev->speed == USB_SPEED_LOW)
275 | PTD_EP(ep->epnum);
276 ptd->len = PTD_LEN(len) | PTD_DIR(dir);
277 ptd->faddr = PTD_FA(usb_pipedevice(urb->pipe));
278 spin_unlock(&urb->lock);
279 if (!ep->active) {
280 ptd->mps |= PTD_LAST_MSK;
281 isp116x->atl_last_dir = dir;
282 }
283 isp116x->atl_bufshrt = sizeof(struct ptd) + isp116x->atl_buflen;
284 isp116x->atl_buflen = isp116x->atl_bufshrt + ALIGN(len, 4);
285 }
286}
287
288/*
289 Analyze transfer results, handle partial transfers and errors
290*/
291static void postproc_atl_queue(struct isp116x *isp116x)
292{
293 struct isp116x_ep *ep;
294 struct urb *urb;
295 struct usb_device *udev;
296 struct ptd *ptd;
297 int short_not_ok;
298 u8 cc;
299
300 for (ep = isp116x->atl_active; ep; ep = ep->active) {
301 BUG_ON(list_empty(&ep->hep->urb_list));
302 urb =
303 container_of(ep->hep->urb_list.next, struct urb, urb_list);
304 udev = urb->dev;
305 ptd = &ep->ptd;
306 cc = PTD_GET_CC(ptd);
307
308 spin_lock(&urb->lock);
309 short_not_ok = 1;
310
311 /* Data underrun is special. For allowed underrun
312 we clear the error and continue as normal. For
313 forbidden underrun we finish the DATA stage
314 immediately while for control transfer,
315 we do a STATUS stage. */
316 if (cc == TD_DATAUNDERRUN) {
317 if (!(urb->transfer_flags & URB_SHORT_NOT_OK)) {
318 DBG("Allowed data underrun\n");
319 cc = TD_CC_NOERROR;
320 short_not_ok = 0;
321 } else {
322 ep->error_count = 1;
323 if (usb_pipecontrol(urb->pipe))
324 ep->nextpid = USB_PID_ACK;
325 else
326 usb_settoggle(udev, ep->epnum,
327 ep->nextpid ==
328 USB_PID_OUT,
329 PTD_GET_TOGGLE(ptd) ^ 1);
330 urb->status = cc_to_error[TD_DATAUNDERRUN];
331 spin_unlock(&urb->lock);
332 continue;
333 }
334 }
335 /* Keep underrun error through the STATUS stage */
336 if (urb->status == cc_to_error[TD_DATAUNDERRUN])
337 cc = TD_DATAUNDERRUN;
338
339 if (cc != TD_CC_NOERROR && cc != TD_NOTACCESSED
340 && (++ep->error_count >= 3 || cc == TD_CC_STALL
341 || cc == TD_DATAOVERRUN)) {
342 if (urb->status == -EINPROGRESS)
343 urb->status = cc_to_error[cc];
344 if (ep->nextpid == USB_PID_ACK)
345 ep->nextpid = 0;
346 spin_unlock(&urb->lock);
347 continue;
348 }
349 /* According to usb spec, zero-length Int transfer signals
350 finishing of the urb. Hey, does this apply only
351 for IN endpoints? */
352 if (usb_pipeint(urb->pipe) && !PTD_GET_LEN(ptd)) {
353 if (urb->status == -EINPROGRESS)
354 urb->status = 0;
355 spin_unlock(&urb->lock);
356 continue;
357 }
358
359 /* Relax after previously failed, but later succeeded
360 or correctly NAK'ed retransmission attempt */
361 if (ep->error_count
362 && (cc == TD_CC_NOERROR || cc == TD_NOTACCESSED))
363 ep->error_count = 0;
364
365 /* Take into account idiosyncracies of the isp116x chip
366 regarding toggle bit for failed transfers */
367 if (ep->nextpid == USB_PID_OUT)
368 usb_settoggle(udev, ep->epnum, 1, PTD_GET_TOGGLE(ptd)
369 ^ (ep->error_count > 0));
370 else if (ep->nextpid == USB_PID_IN)
371 usb_settoggle(udev, ep->epnum, 0, PTD_GET_TOGGLE(ptd)
372 ^ (ep->error_count > 0));
373
374 switch (ep->nextpid) {
375 case USB_PID_IN:
376 case USB_PID_OUT:
377 urb->actual_length += PTD_GET_COUNT(ptd);
378 if (PTD_GET_ACTIVE(ptd)
379 || (cc != TD_CC_NOERROR && cc < 0x0E))
380 break;
381 if (urb->transfer_buffer_length != urb->actual_length) {
382 if (short_not_ok)
383 break;
384 } else {
385 if (urb->transfer_flags & URB_ZERO_PACKET
386 && ep->nextpid == USB_PID_OUT
387 && !(PTD_GET_COUNT(ptd) % ep->maxpacket)) {
388 DBG("Zero packet requested\n");
389 break;
390 }
391 }
392 /* All data for this URB is transferred, let's finish */
393 if (usb_pipecontrol(urb->pipe))
394 ep->nextpid = USB_PID_ACK;
395 else if (urb->status == -EINPROGRESS)
396 urb->status = 0;
397 break;
398 case USB_PID_SETUP:
399 if (PTD_GET_ACTIVE(ptd)
400 || (cc != TD_CC_NOERROR && cc < 0x0E))
401 break;
402 if (urb->transfer_buffer_length == urb->actual_length)
403 ep->nextpid = USB_PID_ACK;
404 else if (usb_pipeout(urb->pipe)) {
405 usb_settoggle(udev, 0, 1, 1);
406 ep->nextpid = USB_PID_OUT;
407 } else {
408 usb_settoggle(udev, 0, 0, 1);
409 ep->nextpid = USB_PID_IN;
410 }
411 break;
412 case USB_PID_ACK:
413 if (PTD_GET_ACTIVE(ptd)
414 || (cc != TD_CC_NOERROR && cc < 0x0E))
415 break;
416 if (urb->status == -EINPROGRESS)
417 urb->status = 0;
418 ep->nextpid = 0;
419 break;
420 default:
421 BUG_ON(1);
422 }
423 spin_unlock(&urb->lock);
424 }
425}
426
427/*
428 Take done or failed requests out of schedule. Give back
429 processed urbs.
430*/
431static void finish_request(struct isp116x *isp116x, struct isp116x_ep *ep,
432 struct urb *urb, struct pt_regs *regs)
433__releases(isp116x->lock) __acquires(isp116x->lock)
434{
435 unsigned i;
436
437 urb->hcpriv = NULL;
438 ep->error_count = 0;
439
440 if (usb_pipecontrol(urb->pipe))
441 ep->nextpid = USB_PID_SETUP;
442
443 urb_dbg(urb, "Finish");
444
445 spin_unlock(&isp116x->lock);
446 usb_hcd_giveback_urb(isp116x_to_hcd(isp116x), urb, regs);
447 spin_lock(&isp116x->lock);
448
449 /* take idle endpoints out of the schedule */
450 if (!list_empty(&ep->hep->urb_list))
451 return;
452
453 /* async deschedule */
454 if (!list_empty(&ep->schedule)) {
455 list_del_init(&ep->schedule);
456 return;
457 }
458
459 /* periodic deschedule */
460 DBG("deschedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
461 for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
462 struct isp116x_ep *temp;
463 struct isp116x_ep **prev = &isp116x->periodic[i];
464
465 while (*prev && ((temp = *prev) != ep))
466 prev = &temp->next;
467 if (*prev)
468 *prev = ep->next;
469 isp116x->load[i] -= ep->load;
470 }
471 ep->branch = PERIODIC_SIZE;
472 isp116x_to_hcd(isp116x)->self.bandwidth_allocated -=
473 ep->load / ep->period;
474
475 /* switch irq type? */
476 if (!--isp116x->periodic_count) {
477 isp116x->irqenb &= ~HCuPINT_SOF;
478 isp116x->irqenb |= HCuPINT_ATL;
479 }
480}
481
482/*
483 Scan transfer lists, schedule transfers, send data off
484 to chip.
485 */
486static void start_atl_transfers(struct isp116x *isp116x)
487{
488 struct isp116x_ep *last_ep = NULL, *ep;
489 struct urb *urb;
490 u16 load = 0;
491 int len, index, speed, byte_time;
492
493 if (atomic_read(&isp116x->atl_finishing))
494 return;
495
496 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state))
497 return;
498
499 /* FIFO not empty? */
500 if (isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_FULL)
501 return;
502
503 isp116x->atl_active = NULL;
504 isp116x->atl_buflen = isp116x->atl_bufshrt = 0;
505
506 /* Schedule int transfers */
507 if (isp116x->periodic_count) {
508 isp116x->fmindex = index =
509 (isp116x->fmindex + 1) & (PERIODIC_SIZE - 1);
510 if ((load = isp116x->load[index])) {
511 /* Bring all int transfers for this frame
512 into the active queue */
513 isp116x->atl_active = last_ep =
514 isp116x->periodic[index];
515 while (last_ep->next)
516 last_ep = (last_ep->active = last_ep->next);
517 last_ep->active = NULL;
518 }
519 }
520
521 /* Schedule control/bulk transfers */
522 list_for_each_entry(ep, &isp116x->async, schedule) {
523 urb = container_of(ep->hep->urb_list.next,
524 struct urb, urb_list);
525 speed = urb->dev->speed;
526 byte_time = speed == USB_SPEED_LOW
527 ? BYTE_TIME_LOWSPEED : BYTE_TIME_FULLSPEED;
528
529 if (ep->nextpid == USB_PID_SETUP) {
530 len = sizeof(struct usb_ctrlrequest);
531 } else if (ep->nextpid == USB_PID_ACK) {
532 len = 0;
533 } else {
534 /* Find current free length ... */
535 len = (MAX_LOAD_LIMIT - load) / byte_time;
536
537 /* ... then limit it to configured max size ... */
538 len = min(len, speed == USB_SPEED_LOW ?
539 MAX_TRANSFER_SIZE_LOWSPEED :
540 MAX_TRANSFER_SIZE_FULLSPEED);
541
542 /* ... and finally cut to the multiple of MaxPacketSize,
543 or to the real length if there's enough room. */
544 if (len <
545 (urb->transfer_buffer_length -
546 urb->actual_length)) {
547 len -= len % ep->maxpacket;
548 if (!len)
549 continue;
550 } else
551 len = urb->transfer_buffer_length -
552 urb->actual_length;
553 BUG_ON(len < 0);
554 }
555
556 load += len * byte_time;
557 if (load > MAX_LOAD_LIMIT)
558 break;
559
560 ep->active = NULL;
561 ep->length = len;
562 if (last_ep)
563 last_ep->active = ep;
564 else
565 isp116x->atl_active = ep;
566 last_ep = ep;
567 }
568
569 /* Avoid starving of endpoints */
570 if ((&isp116x->async)->next != (&isp116x->async)->prev)
571 list_move(&isp116x->async, (&isp116x->async)->next);
572
573 if (isp116x->atl_active) {
574 preproc_atl_queue(isp116x);
575 pack_fifo(isp116x);
576 }
577}
578
579/*
580 Finish the processed transfers
581*/
582static void finish_atl_transfers(struct isp116x *isp116x, struct pt_regs *regs)
583{
584 struct isp116x_ep *ep;
585 struct urb *urb;
586
587 if (!isp116x->atl_active)
588 return;
589 /* Fifo not ready? */
590 if (!(isp116x_read_reg16(isp116x, HCBUFSTAT) & HCBUFSTAT_ATL_DONE))
591 return;
592
593 atomic_inc(&isp116x->atl_finishing);
594 unpack_fifo(isp116x);
595 postproc_atl_queue(isp116x);
596 for (ep = isp116x->atl_active; ep; ep = ep->active) {
597 urb =
598 container_of(ep->hep->urb_list.next, struct urb, urb_list);
599 /* USB_PID_ACK check here avoids finishing of
600 control transfers, for which TD_DATAUNDERRUN
601 occured, while URB_SHORT_NOT_OK was set */
602 if (urb && urb->status != -EINPROGRESS
603 && ep->nextpid != USB_PID_ACK)
604 finish_request(isp116x, ep, urb, regs);
605 }
606 atomic_dec(&isp116x->atl_finishing);
607}
608
609static irqreturn_t isp116x_irq(struct usb_hcd *hcd, struct pt_regs *regs)
610{
611 struct isp116x *isp116x = hcd_to_isp116x(hcd);
612 u16 irqstat;
613 irqreturn_t ret = IRQ_NONE;
614
615 spin_lock(&isp116x->lock);
616 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
617 irqstat = isp116x_read_reg16(isp116x, HCuPINT);
618 isp116x_write_reg16(isp116x, HCuPINT, irqstat);
619
620 if (irqstat & (HCuPINT_ATL | HCuPINT_SOF)) {
621 ret = IRQ_HANDLED;
622 finish_atl_transfers(isp116x, regs);
623 }
624
625 if (irqstat & HCuPINT_OPR) {
626 u32 intstat = isp116x_read_reg32(isp116x, HCINTSTAT);
627 isp116x_write_reg32(isp116x, HCINTSTAT, intstat);
628 if (intstat & HCINT_UE) {
629 ERR("Unrecoverable error\n");
630 /* What should we do here? Reset? */
631 }
Olav Kongas9a571162005-08-05 14:23:35 +0300632 if (intstat & HCINT_RHSC)
633 /* When root hub or any of its ports is going
634 to come out of suspend, it may take more
635 than 10ms for status bits to stabilize. */
636 mod_timer(&hcd->rh_timer, jiffies
637 + msecs_to_jiffies(20) + 1);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300638 if (intstat & HCINT_RD) {
639 DBG("---- remote wakeup\n");
640 schedule_work(&isp116x->rh_resume);
641 ret = IRQ_HANDLED;
642 }
643 irqstat &= ~HCuPINT_OPR;
644 ret = IRQ_HANDLED;
645 }
646
647 if (irqstat & (HCuPINT_ATL | HCuPINT_SOF)) {
648 start_atl_transfers(isp116x);
649 }
650
651 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
652 spin_unlock(&isp116x->lock);
653 return ret;
654}
655
656/*-----------------------------------------------------------------*/
657
658/* usb 1.1 says max 90% of a frame is available for periodic transfers.
659 * this driver doesn't promise that much since it's got to handle an
660 * IRQ per packet; irq handling latencies also use up that time.
661 */
662
663/* out of 1000 us */
664#define MAX_PERIODIC_LOAD 600
665static int balance(struct isp116x *isp116x, u16 period, u16 load)
666{
667 int i, branch = -ENOSPC;
668
669 /* search for the least loaded schedule branch of that period
670 which has enough bandwidth left unreserved. */
671 for (i = 0; i < period; i++) {
672 if (branch < 0 || isp116x->load[branch] > isp116x->load[i]) {
673 int j;
674
675 for (j = i; j < PERIODIC_SIZE; j += period) {
676 if ((isp116x->load[j] + load)
677 > MAX_PERIODIC_LOAD)
678 break;
679 }
680 if (j < PERIODIC_SIZE)
681 continue;
682 branch = i;
683 }
684 }
685 return branch;
686}
687
688/* NB! ALL the code above this point runs with isp116x->lock
689 held, irqs off
690*/
691
692/*-----------------------------------------------------------------*/
693
694static int isp116x_urb_enqueue(struct usb_hcd *hcd,
695 struct usb_host_endpoint *hep, struct urb *urb,
Olav Kongas5db539e2005-06-23 20:25:36 +0300696 unsigned mem_flags)
Olav Kongas4808a1c2005-04-09 22:57:39 +0300697{
698 struct isp116x *isp116x = hcd_to_isp116x(hcd);
699 struct usb_device *udev = urb->dev;
700 unsigned int pipe = urb->pipe;
701 int is_out = !usb_pipein(pipe);
702 int type = usb_pipetype(pipe);
703 int epnum = usb_pipeendpoint(pipe);
704 struct isp116x_ep *ep = NULL;
705 unsigned long flags;
706 int i;
707 int ret = 0;
708
709 urb_dbg(urb, "Enqueue");
710
711 if (type == PIPE_ISOCHRONOUS) {
712 ERR("Isochronous transfers not supported\n");
713 urb_dbg(urb, "Refused to enqueue");
714 return -ENXIO;
715 }
716 /* avoid all allocations within spinlocks: request or endpoint */
717 if (!hep->hcpriv) {
Pekka Enberg7b842b62005-09-06 15:18:34 -0700718 ep = kzalloc(sizeof *ep, mem_flags);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300719 if (!ep)
720 return -ENOMEM;
721 }
722
723 spin_lock_irqsave(&isp116x->lock, flags);
724 if (!HC_IS_RUNNING(hcd->state)) {
725 ret = -ENODEV;
726 goto fail;
727 }
728
729 if (hep->hcpriv)
730 ep = hep->hcpriv;
731 else {
732 INIT_LIST_HEAD(&ep->schedule);
733 ep->udev = usb_get_dev(udev);
734 ep->epnum = epnum;
735 ep->maxpacket = usb_maxpacket(udev, urb->pipe, is_out);
736 usb_settoggle(udev, epnum, is_out, 0);
737
738 if (type == PIPE_CONTROL) {
739 ep->nextpid = USB_PID_SETUP;
740 } else if (is_out) {
741 ep->nextpid = USB_PID_OUT;
742 } else {
743 ep->nextpid = USB_PID_IN;
744 }
745
746 if (urb->interval) {
747 /*
748 With INT URBs submitted, the driver works with SOF
749 interrupt enabled and ATL interrupt disabled. After
750 the PTDs are written to fifo ram, the chip starts
751 fifo processing and usb transfers after the next
752 SOF and continues until the transfers are finished
753 (succeeded or failed) or the frame ends. Therefore,
754 the transfers occur only in every second frame,
755 while fifo reading/writing and data processing
756 occur in every other second frame. */
757 if (urb->interval < 2)
758 urb->interval = 2;
759 if (urb->interval > 2 * PERIODIC_SIZE)
760 urb->interval = 2 * PERIODIC_SIZE;
761 ep->period = urb->interval >> 1;
762 ep->branch = PERIODIC_SIZE;
763 ep->load = usb_calc_bus_time(udev->speed,
764 !is_out,
765 (type == PIPE_ISOCHRONOUS),
766 usb_maxpacket(udev, pipe,
767 is_out)) /
768 1000;
769 }
770 hep->hcpriv = ep;
771 ep->hep = hep;
772 }
773
774 /* maybe put endpoint into schedule */
775 switch (type) {
776 case PIPE_CONTROL:
777 case PIPE_BULK:
778 if (list_empty(&ep->schedule))
779 list_add_tail(&ep->schedule, &isp116x->async);
780 break;
781 case PIPE_INTERRUPT:
782 urb->interval = ep->period;
783 ep->length = min((int)ep->maxpacket,
784 urb->transfer_buffer_length);
785
786 /* urb submitted for already existing endpoint */
787 if (ep->branch < PERIODIC_SIZE)
788 break;
789
790 ret = ep->branch = balance(isp116x, ep->period, ep->load);
791 if (ret < 0)
792 goto fail;
793 ret = 0;
794
795 urb->start_frame = (isp116x->fmindex & (PERIODIC_SIZE - 1))
796 + ep->branch;
797
798 /* sort each schedule branch by period (slow before fast)
799 to share the faster parts of the tree without needing
800 dummy/placeholder nodes */
801 DBG("schedule qh%d/%p branch %d\n", ep->period, ep, ep->branch);
802 for (i = ep->branch; i < PERIODIC_SIZE; i += ep->period) {
803 struct isp116x_ep **prev = &isp116x->periodic[i];
804 struct isp116x_ep *here = *prev;
805
806 while (here && ep != here) {
807 if (ep->period > here->period)
808 break;
809 prev = &here->next;
810 here = *prev;
811 }
812 if (ep != here) {
813 ep->next = here;
814 *prev = ep;
815 }
816 isp116x->load[i] += ep->load;
817 }
818 hcd->self.bandwidth_allocated += ep->load / ep->period;
819
820 /* switch over to SOFint */
821 if (!isp116x->periodic_count++) {
822 isp116x->irqenb &= ~HCuPINT_ATL;
823 isp116x->irqenb |= HCuPINT_SOF;
824 isp116x_write_reg16(isp116x, HCuPINTENB,
825 isp116x->irqenb);
826 }
827 }
828
829 /* in case of unlink-during-submit */
830 spin_lock(&urb->lock);
831 if (urb->status != -EINPROGRESS) {
832 spin_unlock(&urb->lock);
833 finish_request(isp116x, ep, urb, NULL);
834 ret = 0;
835 goto fail;
836 }
837 urb->hcpriv = hep;
838 spin_unlock(&urb->lock);
839 start_atl_transfers(isp116x);
840
841 fail:
842 spin_unlock_irqrestore(&isp116x->lock, flags);
843 return ret;
844}
845
846/*
847 Dequeue URBs.
848*/
849static int isp116x_urb_dequeue(struct usb_hcd *hcd, struct urb *urb)
850{
851 struct isp116x *isp116x = hcd_to_isp116x(hcd);
852 struct usb_host_endpoint *hep;
853 struct isp116x_ep *ep, *ep_act;
854 unsigned long flags;
855
856 spin_lock_irqsave(&isp116x->lock, flags);
857 hep = urb->hcpriv;
858 /* URB already unlinked (or never linked)? */
859 if (!hep) {
860 spin_unlock_irqrestore(&isp116x->lock, flags);
861 return 0;
862 }
863 ep = hep->hcpriv;
864 WARN_ON(hep != ep->hep);
865
866 /* In front of queue? */
867 if (ep->hep->urb_list.next == &urb->urb_list)
868 /* active? */
869 for (ep_act = isp116x->atl_active; ep_act;
870 ep_act = ep_act->active)
871 if (ep_act == ep) {
872 VDBG("dequeue, urb %p active; wait for irq\n",
873 urb);
874 urb = NULL;
875 break;
876 }
877
878 if (urb)
879 finish_request(isp116x, ep, urb, NULL);
880
881 spin_unlock_irqrestore(&isp116x->lock, flags);
882 return 0;
883}
884
885static void isp116x_endpoint_disable(struct usb_hcd *hcd,
886 struct usb_host_endpoint *hep)
887{
888 int i;
889 struct isp116x_ep *ep = hep->hcpriv;;
890
891 if (!ep)
892 return;
893
894 /* assume we'd just wait for the irq */
895 for (i = 0; i < 100 && !list_empty(&hep->urb_list); i++)
896 msleep(3);
897 if (!list_empty(&hep->urb_list))
898 WARN("ep %p not empty?\n", ep);
899
900 usb_put_dev(ep->udev);
901 kfree(ep);
902 hep->hcpriv = NULL;
903}
904
905static int isp116x_get_frame(struct usb_hcd *hcd)
906{
907 struct isp116x *isp116x = hcd_to_isp116x(hcd);
908 u32 fmnum;
909 unsigned long flags;
910
911 spin_lock_irqsave(&isp116x->lock, flags);
912 fmnum = isp116x_read_reg32(isp116x, HCFMNUM);
913 spin_unlock_irqrestore(&isp116x->lock, flags);
914 return (int)fmnum;
915}
916
917/*----------------------------------------------------------------*/
918
919/*
920 Adapted from ohci-hub.c. Currently we don't support autosuspend.
921*/
922static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf)
923{
924 struct isp116x *isp116x = hcd_to_isp116x(hcd);
925 int ports, i, changed = 0;
Olav Kongas9a571162005-08-05 14:23:35 +0300926 unsigned long flags;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300927
928 if (!HC_IS_RUNNING(hcd->state))
929 return -ESHUTDOWN;
930
Olav Kongas9a571162005-08-05 14:23:35 +0300931 /* Report no status change now, if we are scheduled to be
932 called later */
933 if (timer_pending(&hcd->rh_timer))
934 return 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +0300935
Olav Kongas9a571162005-08-05 14:23:35 +0300936 ports = isp116x->rhdesca & RH_A_NDP;
937 spin_lock_irqsave(&isp116x->lock, flags);
938 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300939 if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC))
940 buf[0] = changed = 1;
941 else
942 buf[0] = 0;
943
944 for (i = 0; i < ports; i++) {
Olav Kongas9a571162005-08-05 14:23:35 +0300945 u32 status = isp116x->rhport[i] =
946 isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300947
948 if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC
949 | RH_PS_OCIC | RH_PS_PRSC)) {
950 changed = 1;
951 buf[0] |= 1 << (i + 1);
952 continue;
953 }
954 }
Olav Kongas9a571162005-08-05 14:23:35 +0300955 spin_unlock_irqrestore(&isp116x->lock, flags);
Olav Kongas4808a1c2005-04-09 22:57:39 +0300956 return changed;
957}
958
959static void isp116x_hub_descriptor(struct isp116x *isp116x,
960 struct usb_hub_descriptor *desc)
961{
962 u32 reg = isp116x->rhdesca;
963
964 desc->bDescriptorType = 0x29;
965 desc->bDescLength = 9;
966 desc->bHubContrCurrent = 0;
967 desc->bNbrPorts = (u8) (reg & 0x3);
968 /* Power switching, device type, overcurrent. */
969 desc->wHubCharacteristics =
970 (__force __u16) cpu_to_le16((u16) ((reg >> 8) & 0x1f));
971 desc->bPwrOn2PwrGood = (u8) ((reg >> 24) & 0xff);
972 /* two bitmaps: ports removable, and legacy PortPwrCtrlMask */
973 desc->bitmap[0] = desc->bNbrPorts == 1 ? 1 << 1 : 3 << 1;
974 desc->bitmap[1] = ~0;
975}
976
977/* Perform reset of a given port.
978 It would be great to just start the reset and let the
979 USB core to clear the reset in due time. However,
980 root hub ports should be reset for at least 50 ms, while
981 our chip stays in reset for about 10 ms. I.e., we must
982 repeatedly reset it ourself here.
983*/
984static inline void root_port_reset(struct isp116x *isp116x, unsigned port)
985{
986 u32 tmp;
987 unsigned long flags, t;
988
989 /* Root hub reset should be 50 ms, but some devices
990 want it even longer. */
991 t = jiffies + msecs_to_jiffies(100);
992
993 while (time_before(jiffies, t)) {
994 spin_lock_irqsave(&isp116x->lock, flags);
995 /* spin until any current reset finishes */
996 for (;;) {
997 tmp = isp116x_read_reg32(isp116x, port ?
998 HCRHPORT2 : HCRHPORT1);
999 if (!(tmp & RH_PS_PRS))
1000 break;
1001 udelay(500);
1002 }
1003 /* Don't reset a disconnected port */
1004 if (!(tmp & RH_PS_CCS)) {
1005 spin_unlock_irqrestore(&isp116x->lock, flags);
1006 break;
1007 }
1008 /* Reset lasts 10ms (claims datasheet) */
1009 isp116x_write_reg32(isp116x, port ? HCRHPORT2 :
1010 HCRHPORT1, (RH_PS_PRS));
1011 spin_unlock_irqrestore(&isp116x->lock, flags);
1012 msleep(10);
1013 }
1014}
1015
1016/* Adapted from ohci-hub.c */
1017static int isp116x_hub_control(struct usb_hcd *hcd,
1018 u16 typeReq,
1019 u16 wValue, u16 wIndex, char *buf, u16 wLength)
1020{
1021 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1022 int ret = 0;
1023 unsigned long flags;
1024 int ports = isp116x->rhdesca & RH_A_NDP;
1025 u32 tmp = 0;
1026
1027 switch (typeReq) {
1028 case ClearHubFeature:
1029 DBG("ClearHubFeature: ");
1030 switch (wValue) {
1031 case C_HUB_OVER_CURRENT:
1032 DBG("C_HUB_OVER_CURRENT\n");
1033 spin_lock_irqsave(&isp116x->lock, flags);
1034 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_OCIC);
1035 spin_unlock_irqrestore(&isp116x->lock, flags);
1036 case C_HUB_LOCAL_POWER:
1037 DBG("C_HUB_LOCAL_POWER\n");
1038 break;
1039 default:
1040 goto error;
1041 }
1042 break;
1043 case SetHubFeature:
1044 DBG("SetHubFeature: ");
1045 switch (wValue) {
1046 case C_HUB_OVER_CURRENT:
1047 case C_HUB_LOCAL_POWER:
1048 DBG("C_HUB_OVER_CURRENT or C_HUB_LOCAL_POWER\n");
1049 break;
1050 default:
1051 goto error;
1052 }
1053 break;
1054 case GetHubDescriptor:
1055 DBG("GetHubDescriptor\n");
1056 isp116x_hub_descriptor(isp116x,
1057 (struct usb_hub_descriptor *)buf);
1058 break;
1059 case GetHubStatus:
1060 DBG("GetHubStatus\n");
Olav Kongas17f8bb72005-06-23 20:12:24 +03001061 *(__le32 *) buf = 0;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001062 break;
1063 case GetPortStatus:
1064 DBG("GetPortStatus\n");
1065 if (!wIndex || wIndex > ports)
1066 goto error;
1067 tmp = isp116x->rhport[--wIndex];
1068 *(__le32 *) buf = cpu_to_le32(tmp);
1069 DBG("GetPortStatus: port[%d] %08x\n", wIndex + 1, tmp);
1070 break;
1071 case ClearPortFeature:
1072 DBG("ClearPortFeature: ");
1073 if (!wIndex || wIndex > ports)
1074 goto error;
1075 wIndex--;
1076
1077 switch (wValue) {
1078 case USB_PORT_FEAT_ENABLE:
1079 DBG("USB_PORT_FEAT_ENABLE\n");
1080 tmp = RH_PS_CCS;
1081 break;
1082 case USB_PORT_FEAT_C_ENABLE:
1083 DBG("USB_PORT_FEAT_C_ENABLE\n");
1084 tmp = RH_PS_PESC;
1085 break;
1086 case USB_PORT_FEAT_SUSPEND:
1087 DBG("USB_PORT_FEAT_SUSPEND\n");
1088 tmp = RH_PS_POCI;
1089 break;
1090 case USB_PORT_FEAT_C_SUSPEND:
1091 DBG("USB_PORT_FEAT_C_SUSPEND\n");
1092 tmp = RH_PS_PSSC;
1093 break;
1094 case USB_PORT_FEAT_POWER:
1095 DBG("USB_PORT_FEAT_POWER\n");
1096 tmp = RH_PS_LSDA;
1097 break;
1098 case USB_PORT_FEAT_C_CONNECTION:
1099 DBG("USB_PORT_FEAT_C_CONNECTION\n");
1100 tmp = RH_PS_CSC;
1101 break;
1102 case USB_PORT_FEAT_C_OVER_CURRENT:
1103 DBG("USB_PORT_FEAT_C_OVER_CURRENT\n");
1104 tmp = RH_PS_OCIC;
1105 break;
1106 case USB_PORT_FEAT_C_RESET:
1107 DBG("USB_PORT_FEAT_C_RESET\n");
1108 tmp = RH_PS_PRSC;
1109 break;
1110 default:
1111 goto error;
1112 }
1113 spin_lock_irqsave(&isp116x->lock, flags);
1114 isp116x_write_reg32(isp116x, wIndex
1115 ? HCRHPORT2 : HCRHPORT1, tmp);
1116 isp116x->rhport[wIndex] =
1117 isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1);
1118 spin_unlock_irqrestore(&isp116x->lock, flags);
1119 break;
1120 case SetPortFeature:
1121 DBG("SetPortFeature: ");
1122 if (!wIndex || wIndex > ports)
1123 goto error;
1124 wIndex--;
1125 switch (wValue) {
1126 case USB_PORT_FEAT_SUSPEND:
1127 DBG("USB_PORT_FEAT_SUSPEND\n");
1128 spin_lock_irqsave(&isp116x->lock, flags);
1129 isp116x_write_reg32(isp116x, wIndex
1130 ? HCRHPORT2 : HCRHPORT1, RH_PS_PSS);
1131 break;
1132 case USB_PORT_FEAT_POWER:
1133 DBG("USB_PORT_FEAT_POWER\n");
1134 spin_lock_irqsave(&isp116x->lock, flags);
1135 isp116x_write_reg32(isp116x, wIndex
1136 ? HCRHPORT2 : HCRHPORT1, RH_PS_PPS);
1137 break;
1138 case USB_PORT_FEAT_RESET:
1139 DBG("USB_PORT_FEAT_RESET\n");
1140 root_port_reset(isp116x, wIndex);
1141 spin_lock_irqsave(&isp116x->lock, flags);
1142 break;
1143 default:
1144 goto error;
1145 }
1146 isp116x->rhport[wIndex] =
1147 isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1);
1148 spin_unlock_irqrestore(&isp116x->lock, flags);
1149 break;
1150
1151 default:
1152 error:
1153 /* "protocol stall" on error */
1154 DBG("PROTOCOL STALL\n");
1155 ret = -EPIPE;
1156 }
1157 return ret;
1158}
1159
1160#ifdef CONFIG_PM
1161
1162static int isp116x_hub_suspend(struct usb_hcd *hcd)
1163{
1164 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1165 unsigned long flags;
1166 u32 val;
1167 int ret = 0;
1168
1169 spin_lock_irqsave(&isp116x->lock, flags);
1170
1171 val = isp116x_read_reg32(isp116x, HCCONTROL);
1172 switch (val & HCCONTROL_HCFS) {
1173 case HCCONTROL_USB_OPER:
1174 hcd->state = HC_STATE_QUIESCING;
1175 val &= (~HCCONTROL_HCFS & ~HCCONTROL_RWE);
1176 val |= HCCONTROL_USB_SUSPEND;
1177 if (hcd->remote_wakeup)
1178 val |= HCCONTROL_RWE;
1179 /* Wait for usb transfers to finish */
1180 mdelay(2);
1181 isp116x_write_reg32(isp116x, HCCONTROL, val);
1182 hcd->state = HC_STATE_SUSPENDED;
1183 /* Wait for devices to suspend */
1184 mdelay(5);
1185 case HCCONTROL_USB_SUSPEND:
1186 break;
1187 case HCCONTROL_USB_RESUME:
1188 isp116x_write_reg32(isp116x, HCCONTROL,
1189 (val & ~HCCONTROL_HCFS) |
1190 HCCONTROL_USB_RESET);
1191 case HCCONTROL_USB_RESET:
1192 ret = -EBUSY;
1193 break;
1194 default:
1195 ret = -EINVAL;
1196 }
1197
1198 spin_unlock_irqrestore(&isp116x->lock, flags);
1199 return ret;
1200}
1201
1202static int isp116x_hub_resume(struct usb_hcd *hcd)
1203{
1204 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1205 u32 val;
1206 int ret = -EINPROGRESS;
1207
1208 msleep(5);
1209 spin_lock_irq(&isp116x->lock);
1210
1211 val = isp116x_read_reg32(isp116x, HCCONTROL);
1212 switch (val & HCCONTROL_HCFS) {
1213 case HCCONTROL_USB_SUSPEND:
1214 val &= ~HCCONTROL_HCFS;
1215 val |= HCCONTROL_USB_RESUME;
1216 isp116x_write_reg32(isp116x, HCCONTROL, val);
1217 case HCCONTROL_USB_RESUME:
1218 break;
1219 case HCCONTROL_USB_OPER:
1220 /* Without setting power_state here the
1221 SUSPENDED state won't be removed from
1222 sysfs/usbN/power.state as a response to remote
1223 wakeup. Maybe in the future. */
1224 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1225 ret = 0;
1226 break;
1227 default:
1228 ret = -EBUSY;
1229 }
1230
1231 if (ret != -EINPROGRESS) {
1232 spin_unlock_irq(&isp116x->lock);
1233 return ret;
1234 }
1235
1236 val = isp116x->rhdesca & RH_A_NDP;
1237 while (val--) {
1238 u32 stat =
1239 isp116x_read_reg32(isp116x, val ? HCRHPORT2 : HCRHPORT1);
1240 /* force global, not selective, resume */
1241 if (!(stat & RH_PS_PSS))
1242 continue;
1243 DBG("%s: Resuming port %d\n", __func__, val);
1244 isp116x_write_reg32(isp116x, RH_PS_POCI, val
1245 ? HCRHPORT2 : HCRHPORT1);
1246 }
1247 spin_unlock_irq(&isp116x->lock);
1248
1249 hcd->state = HC_STATE_RESUMING;
1250 mdelay(20);
1251
1252 /* Go operational */
1253 spin_lock_irq(&isp116x->lock);
1254 val = isp116x_read_reg32(isp116x, HCCONTROL);
1255 isp116x_write_reg32(isp116x, HCCONTROL,
1256 (val & ~HCCONTROL_HCFS) | HCCONTROL_USB_OPER);
1257 spin_unlock_irq(&isp116x->lock);
1258 /* see analogous comment above */
1259 hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1260 hcd->state = HC_STATE_RUNNING;
1261
1262 return 0;
1263}
1264
1265static void isp116x_rh_resume(void *_hcd)
1266{
1267 struct usb_hcd *hcd = _hcd;
1268
1269 usb_resume_device(hcd->self.root_hub);
1270}
1271
1272#else
1273
1274#define isp116x_hub_suspend NULL
1275#define isp116x_hub_resume NULL
1276
1277static void isp116x_rh_resume(void *_hcd)
1278{
1279}
1280
1281#endif
1282
1283/*-----------------------------------------------------------------*/
1284
1285#ifdef STUB_DEBUG_FILE
1286
1287static inline void create_debug_file(struct isp116x *isp116x)
1288{
1289}
1290
1291static inline void remove_debug_file(struct isp116x *isp116x)
1292{
1293}
1294
1295#else
1296
1297#include <linux/proc_fs.h>
1298#include <linux/seq_file.h>
1299
1300static void dump_irq(struct seq_file *s, char *label, u16 mask)
1301{
1302 seq_printf(s, "%s %04x%s%s%s%s%s%s\n", label, mask,
1303 mask & HCuPINT_CLKRDY ? " clkrdy" : "",
1304 mask & HCuPINT_SUSP ? " susp" : "",
1305 mask & HCuPINT_OPR ? " opr" : "",
1306 mask & HCuPINT_AIIEOT ? " eot" : "",
1307 mask & HCuPINT_ATL ? " atl" : "",
1308 mask & HCuPINT_SOF ? " sof" : "");
1309}
1310
1311static void dump_int(struct seq_file *s, char *label, u32 mask)
1312{
1313 seq_printf(s, "%s %08x%s%s%s%s%s%s%s\n", label, mask,
1314 mask & HCINT_MIE ? " MIE" : "",
1315 mask & HCINT_RHSC ? " rhsc" : "",
1316 mask & HCINT_FNO ? " fno" : "",
1317 mask & HCINT_UE ? " ue" : "",
1318 mask & HCINT_RD ? " rd" : "",
1319 mask & HCINT_SF ? " sof" : "", mask & HCINT_SO ? " so" : "");
1320}
1321
1322static int proc_isp116x_show(struct seq_file *s, void *unused)
1323{
1324 struct isp116x *isp116x = s->private;
1325 struct isp116x_ep *ep;
1326 struct urb *urb;
1327 unsigned i;
1328 char *str;
1329
1330 seq_printf(s, "%s\n%s version %s\n",
1331 isp116x_to_hcd(isp116x)->product_desc, hcd_name,
1332 DRIVER_VERSION);
1333
1334 if (HC_IS_SUSPENDED(isp116x_to_hcd(isp116x)->state)) {
1335 seq_printf(s, "HCD is suspended\n");
1336 return 0;
1337 }
1338 if (!HC_IS_RUNNING(isp116x_to_hcd(isp116x)->state)) {
1339 seq_printf(s, "HCD not running\n");
1340 return 0;
1341 }
1342
1343 spin_lock_irq(&isp116x->lock);
1344
1345 dump_irq(s, "hc_irq_enable", isp116x_read_reg16(isp116x, HCuPINTENB));
1346 dump_irq(s, "hc_irq_status", isp116x_read_reg16(isp116x, HCuPINT));
1347 dump_int(s, "hc_int_enable", isp116x_read_reg32(isp116x, HCINTENB));
1348 dump_int(s, "hc_int_status", isp116x_read_reg32(isp116x, HCINTSTAT));
1349
1350 list_for_each_entry(ep, &isp116x->async, schedule) {
1351
1352 switch (ep->nextpid) {
1353 case USB_PID_IN:
1354 str = "in";
1355 break;
1356 case USB_PID_OUT:
1357 str = "out";
1358 break;
1359 case USB_PID_SETUP:
1360 str = "setup";
1361 break;
1362 case USB_PID_ACK:
1363 str = "status";
1364 break;
1365 default:
1366 str = "?";
1367 break;
1368 };
1369 seq_printf(s, "%p, ep%d%s, maxpacket %d:\n", ep,
1370 ep->epnum, str, ep->maxpacket);
1371 list_for_each_entry(urb, &ep->hep->urb_list, urb_list) {
1372 seq_printf(s, " urb%p, %d/%d\n", urb,
1373 urb->actual_length,
1374 urb->transfer_buffer_length);
1375 }
1376 }
1377 if (!list_empty(&isp116x->async))
1378 seq_printf(s, "\n");
1379
1380 seq_printf(s, "periodic size= %d\n", PERIODIC_SIZE);
1381
1382 for (i = 0; i < PERIODIC_SIZE; i++) {
1383 ep = isp116x->periodic[i];
1384 if (!ep)
1385 continue;
1386 seq_printf(s, "%2d [%3d]:\n", i, isp116x->load[i]);
1387
1388 /* DUMB: prints shared entries multiple times */
1389 do {
1390 seq_printf(s, " %d/%p (%sdev%d ep%d%s max %d)\n",
1391 ep->period, ep,
1392 (ep->udev->speed ==
1393 USB_SPEED_FULL) ? "" : "ls ",
1394 ep->udev->devnum, ep->epnum,
1395 (ep->epnum ==
1396 0) ? "" : ((ep->nextpid ==
1397 USB_PID_IN) ? "in" : "out"),
1398 ep->maxpacket);
1399 ep = ep->next;
1400 } while (ep);
1401 }
1402 spin_unlock_irq(&isp116x->lock);
1403 seq_printf(s, "\n");
1404
1405 return 0;
1406}
1407
1408static int proc_isp116x_open(struct inode *inode, struct file *file)
1409{
1410 return single_open(file, proc_isp116x_show, PDE(inode)->data);
1411}
1412
1413static struct file_operations proc_ops = {
1414 .open = proc_isp116x_open,
1415 .read = seq_read,
1416 .llseek = seq_lseek,
1417 .release = single_release,
1418};
1419
1420/* expect just one isp116x per system */
1421static const char proc_filename[] = "driver/isp116x";
1422
1423static void create_debug_file(struct isp116x *isp116x)
1424{
1425 struct proc_dir_entry *pde;
1426
1427 pde = create_proc_entry(proc_filename, 0, NULL);
1428 if (pde == NULL)
1429 return;
1430
1431 pde->proc_fops = &proc_ops;
1432 pde->data = isp116x;
1433 isp116x->pde = pde;
1434}
1435
1436static void remove_debug_file(struct isp116x *isp116x)
1437{
1438 if (isp116x->pde)
1439 remove_proc_entry(proc_filename, NULL);
1440}
1441
1442#endif
1443
1444/*-----------------------------------------------------------------*/
1445
1446/*
1447 Software reset - can be called from any contect.
1448*/
1449static int isp116x_sw_reset(struct isp116x *isp116x)
1450{
1451 int retries = 15;
1452 unsigned long flags;
1453 int ret = 0;
1454
1455 spin_lock_irqsave(&isp116x->lock, flags);
1456 isp116x_write_reg16(isp116x, HCSWRES, HCSWRES_MAGIC);
1457 isp116x_write_reg32(isp116x, HCCMDSTAT, HCCMDSTAT_HCR);
1458 while (--retries) {
1459 /* It usually resets within 1 ms */
1460 mdelay(1);
1461 if (!(isp116x_read_reg32(isp116x, HCCMDSTAT) & HCCMDSTAT_HCR))
1462 break;
1463 }
1464 if (!retries) {
1465 ERR("Software reset timeout\n");
1466 ret = -ETIME;
1467 }
1468 spin_unlock_irqrestore(&isp116x->lock, flags);
1469 return ret;
1470}
1471
Olav Kongas4808a1c2005-04-09 22:57:39 +03001472static int isp116x_reset(struct usb_hcd *hcd)
1473{
1474 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1475 unsigned long t;
1476 u16 clkrdy = 0;
1477 int ret = 0, timeout = 15 /* ms */ ;
1478
Olav Kongasf8d23d32005-08-04 17:02:54 +03001479 ret = isp116x_sw_reset(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001480 if (ret)
1481 return ret;
1482
1483 t = jiffies + msecs_to_jiffies(timeout);
1484 while (time_before_eq(jiffies, t)) {
1485 msleep(4);
1486 spin_lock_irq(&isp116x->lock);
1487 clkrdy = isp116x_read_reg16(isp116x, HCuPINT) & HCuPINT_CLKRDY;
1488 spin_unlock_irq(&isp116x->lock);
1489 if (clkrdy)
1490 break;
1491 }
1492 if (!clkrdy) {
1493 ERR("Clock not ready after 20ms\n");
Olav Kongas589a0082005-04-21 17:12:59 +03001494 /* After sw_reset the clock won't report to be ready, if
1495 H_WAKEUP pin is high. */
Olav Kongasf8d23d32005-08-04 17:02:54 +03001496 ERR("Please make sure that the H_WAKEUP pin is pulled low!\n");
Olav Kongas4808a1c2005-04-09 22:57:39 +03001497 ret = -ENODEV;
1498 }
1499 return ret;
1500}
1501
1502static void isp116x_stop(struct usb_hcd *hcd)
1503{
1504 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1505 unsigned long flags;
1506 u32 val;
1507
1508 spin_lock_irqsave(&isp116x->lock, flags);
1509 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1510
1511 /* Switch off ports' power, some devices don't come up
1512 after next 'insmod' without this */
1513 val = isp116x_read_reg32(isp116x, HCRHDESCA);
1514 val &= ~(RH_A_NPS | RH_A_PSM);
1515 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1516 isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS);
1517 spin_unlock_irqrestore(&isp116x->lock, flags);
1518
Olav Kongasf8d23d32005-08-04 17:02:54 +03001519 isp116x_sw_reset(isp116x);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001520}
1521
1522/*
1523 Configure the chip. The chip must be successfully reset by now.
1524*/
1525static int isp116x_start(struct usb_hcd *hcd)
1526{
1527 struct isp116x *isp116x = hcd_to_isp116x(hcd);
1528 struct isp116x_platform_data *board = isp116x->board;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001529 u32 val;
1530 unsigned long flags;
1531
1532 spin_lock_irqsave(&isp116x->lock, flags);
1533
1534 /* clear interrupt status and disable all interrupt sources */
1535 isp116x_write_reg16(isp116x, HCuPINT, 0xff);
1536 isp116x_write_reg16(isp116x, HCuPINTENB, 0);
1537
1538 val = isp116x_read_reg16(isp116x, HCCHIPID);
1539 if ((val & HCCHIPID_MASK) != HCCHIPID_MAGIC) {
1540 ERR("Invalid chip ID %04x\n", val);
1541 spin_unlock_irqrestore(&isp116x->lock, flags);
1542 return -ENODEV;
1543 }
1544
Olav Kongas9a571162005-08-05 14:23:35 +03001545 /* To be removed in future */
1546 hcd->uses_new_polling = 1;
1547
Olav Kongas4808a1c2005-04-09 22:57:39 +03001548 isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE);
1549 isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE);
1550
1551 /* ----- HW conf */
1552 val = HCHWCFG_INT_ENABLE | HCHWCFG_DBWIDTH(1);
1553 if (board->sel15Kres)
1554 val |= HCHWCFG_15KRSEL;
1555 /* Remote wakeup won't work without working clock */
Olav Kongasd4d62862005-08-04 16:48:19 +03001556 if (board->remote_wakeup_enable)
Olav Kongas4808a1c2005-04-09 22:57:39 +03001557 val |= HCHWCFG_CLKNOTSTOP;
1558 if (board->oc_enable)
1559 val |= HCHWCFG_ANALOG_OC;
1560 if (board->int_act_high)
1561 val |= HCHWCFG_INT_POL;
1562 if (board->int_edge_triggered)
1563 val |= HCHWCFG_INT_TRIGGER;
1564 isp116x_write_reg16(isp116x, HCHWCFG, val);
1565
1566 /* ----- Root hub conf */
Olav Kongasdc5bed02005-08-04 16:46:28 +03001567 val = (25 << 24) & RH_A_POTPGT;
Olav Kongas165c0f32005-08-04 16:52:31 +03001568 /* AN10003_1.pdf recommends RH_A_NPS (no power switching) to
1569 be always set. Yet, instead, we request individual port
1570 power switching. */
1571 val |= RH_A_PSM;
Olav Kongas9d233d92005-08-04 16:54:08 +03001572 /* Report overcurrent per port */
1573 val |= RH_A_OCPM;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001574 isp116x_write_reg32(isp116x, HCRHDESCA, val);
1575 isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA);
1576
1577 val = RH_B_PPCM;
1578 isp116x_write_reg32(isp116x, HCRHDESCB, val);
1579 isp116x->rhdescb = isp116x_read_reg32(isp116x, HCRHDESCB);
1580
1581 val = 0;
1582 if (board->remote_wakeup_enable) {
1583 hcd->can_wakeup = 1;
1584 val |= RH_HS_DRWE;
1585 }
1586 isp116x_write_reg32(isp116x, HCRHSTATUS, val);
1587 isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);
1588
1589 isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001590
Olav Kongas4808a1c2005-04-09 22:57:39 +03001591 hcd->state = HC_STATE_RUNNING;
1592
Olav Kongas4808a1c2005-04-09 22:57:39 +03001593 /* Set up interrupts */
1594 isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE;
1595 if (board->remote_wakeup_enable)
1596 isp116x->intenb |= HCINT_RD;
1597 isp116x->irqenb = HCuPINT_ATL | HCuPINT_OPR; /* | HCuPINT_SUSP; */
1598 isp116x_write_reg32(isp116x, HCINTENB, isp116x->intenb);
1599 isp116x_write_reg16(isp116x, HCuPINTENB, isp116x->irqenb);
1600
1601 /* Go operational */
1602 val = HCCONTROL_USB_OPER;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001603 if (board->remote_wakeup_enable)
1604 val |= HCCONTROL_RWE;
1605 isp116x_write_reg32(isp116x, HCCONTROL, val);
1606
1607 /* Disable ports to avoid race in device enumeration */
1608 isp116x_write_reg32(isp116x, HCRHPORT1, RH_PS_CCS);
1609 isp116x_write_reg32(isp116x, HCRHPORT2, RH_PS_CCS);
1610
1611 isp116x_show_regs(isp116x);
1612 spin_unlock_irqrestore(&isp116x->lock, flags);
1613 return 0;
1614}
1615
1616/*-----------------------------------------------------------------*/
1617
1618static struct hc_driver isp116x_hc_driver = {
1619 .description = hcd_name,
1620 .product_desc = "ISP116x Host Controller",
1621 .hcd_priv_size = sizeof(struct isp116x),
1622
1623 .irq = isp116x_irq,
1624 .flags = HCD_USB11,
1625
1626 .reset = isp116x_reset,
1627 .start = isp116x_start,
1628 .stop = isp116x_stop,
1629
1630 .urb_enqueue = isp116x_urb_enqueue,
1631 .urb_dequeue = isp116x_urb_dequeue,
1632 .endpoint_disable = isp116x_endpoint_disable,
1633
1634 .get_frame_number = isp116x_get_frame,
1635
1636 .hub_status_data = isp116x_hub_status_data,
1637 .hub_control = isp116x_hub_control,
1638 .hub_suspend = isp116x_hub_suspend,
1639 .hub_resume = isp116x_hub_resume,
1640};
1641
1642/*----------------------------------------------------------------*/
1643
1644static int __init_or_module isp116x_remove(struct device *dev)
1645{
1646 struct usb_hcd *hcd = dev_get_drvdata(dev);
Olav Kongas589a0082005-04-21 17:12:59 +03001647 struct isp116x *isp116x;
Olav Kongas4808a1c2005-04-09 22:57:39 +03001648 struct platform_device *pdev;
1649 struct resource *res;
1650
Olav Kongas9a571162005-08-05 14:23:35 +03001651 if (!hcd)
Olav Kongas589a0082005-04-21 17:12:59 +03001652 return 0;
1653 isp116x = hcd_to_isp116x(hcd);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001654 pdev = container_of(dev, struct platform_device, dev);
1655 remove_debug_file(isp116x);
1656 usb_remove_hcd(hcd);
1657
1658 iounmap(isp116x->data_reg);
1659 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1660 release_mem_region(res->start, 2);
1661 iounmap(isp116x->addr_reg);
1662 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1663 release_mem_region(res->start, 2);
1664
1665 usb_put_hcd(hcd);
1666 return 0;
1667}
1668
1669#define resource_len(r) (((r)->end - (r)->start) + 1)
1670
1671static int __init isp116x_probe(struct device *dev)
1672{
1673 struct usb_hcd *hcd;
1674 struct isp116x *isp116x;
1675 struct platform_device *pdev;
1676 struct resource *addr, *data;
1677 void __iomem *addr_reg;
1678 void __iomem *data_reg;
1679 int irq;
1680 int ret = 0;
1681
1682 pdev = container_of(dev, struct platform_device, dev);
1683 if (pdev->num_resources < 3) {
1684 ret = -ENODEV;
1685 goto err1;
1686 }
1687
1688 data = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1689 addr = platform_get_resource(pdev, IORESOURCE_MEM, 1);
1690 irq = platform_get_irq(pdev, 0);
1691 if (!addr || !data || irq < 0) {
1692 ret = -ENODEV;
1693 goto err1;
1694 }
1695
1696 if (dev->dma_mask) {
1697 DBG("DMA not supported\n");
1698 ret = -EINVAL;
1699 goto err1;
1700 }
1701
1702 if (!request_mem_region(addr->start, 2, hcd_name)) {
1703 ret = -EBUSY;
1704 goto err1;
1705 }
1706 addr_reg = ioremap(addr->start, resource_len(addr));
1707 if (addr_reg == NULL) {
1708 ret = -ENOMEM;
1709 goto err2;
1710 }
1711 if (!request_mem_region(data->start, 2, hcd_name)) {
1712 ret = -EBUSY;
1713 goto err3;
1714 }
1715 data_reg = ioremap(data->start, resource_len(data));
1716 if (data_reg == NULL) {
1717 ret = -ENOMEM;
1718 goto err4;
1719 }
1720
1721 /* allocate and initialize hcd */
1722 hcd = usb_create_hcd(&isp116x_hc_driver, dev, dev->bus_id);
1723 if (!hcd) {
1724 ret = -ENOMEM;
1725 goto err5;
1726 }
1727 /* this rsrc_start is bogus */
1728 hcd->rsrc_start = addr->start;
1729 isp116x = hcd_to_isp116x(hcd);
1730 isp116x->data_reg = data_reg;
1731 isp116x->addr_reg = addr_reg;
1732 spin_lock_init(&isp116x->lock);
1733 INIT_LIST_HEAD(&isp116x->async);
1734 INIT_WORK(&isp116x->rh_resume, isp116x_rh_resume, hcd);
1735 isp116x->board = dev->platform_data;
1736
1737 if (!isp116x->board) {
1738 ERR("Platform data structure not initialized\n");
1739 ret = -ENODEV;
1740 goto err6;
1741 }
1742 if (isp116x_check_platform_delay(isp116x)) {
1743 ERR("USE_PLATFORM_DELAY defined, but delay function not "
1744 "implemented.\n");
1745 ERR("See comments in drivers/usb/host/isp116x-hcd.c\n");
1746 ret = -ENODEV;
1747 goto err6;
1748 }
1749
1750 ret = usb_add_hcd(hcd, irq, SA_INTERRUPT);
1751 if (ret != 0)
1752 goto err6;
1753
1754 create_debug_file(isp116x);
1755 return 0;
1756
1757 err6:
1758 usb_put_hcd(hcd);
1759 err5:
1760 iounmap(data_reg);
1761 err4:
1762 release_mem_region(data->start, 2);
1763 err3:
1764 iounmap(addr_reg);
1765 err2:
1766 release_mem_region(addr->start, 2);
1767 err1:
1768 ERR("init error, %d\n", ret);
1769 return ret;
1770}
1771
1772#ifdef CONFIG_PM
1773/*
1774 Suspend of platform device
1775*/
1776static int isp116x_suspend(struct device *dev, pm_message_t state, u32 phase)
1777{
1778 int ret = 0;
1779 struct usb_hcd *hcd = dev_get_drvdata(dev);
1780
1781 VDBG("%s: state %x, phase %x\n", __func__, state, phase);
1782
1783 if (phase != SUSPEND_DISABLE && phase != SUSPEND_POWER_DOWN)
1784 return 0;
1785
1786 ret = usb_suspend_device(hcd->self.root_hub, state);
1787 if (!ret) {
1788 dev->power.power_state = state;
Olav Kongas17f8bb72005-06-23 20:12:24 +03001789 INFO("%s suspended\n", hcd_name);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001790 } else
Olav Kongas17f8bb72005-06-23 20:12:24 +03001791 ERR("%s suspend failed\n", hcd_name);
Olav Kongas4808a1c2005-04-09 22:57:39 +03001792
1793 return ret;
1794}
1795
1796/*
1797 Resume platform device
1798*/
1799static int isp116x_resume(struct device *dev, u32 phase)
1800{
1801 int ret = 0;
1802 struct usb_hcd *hcd = dev_get_drvdata(dev);
1803
1804 VDBG("%s: state %x, phase %x\n", __func__, dev->power.power_state,
1805 phase);
1806 if (phase != RESUME_POWER_ON)
1807 return 0;
1808
1809 ret = usb_resume_device(hcd->self.root_hub);
1810 if (!ret) {
1811 dev->power.power_state = PMSG_ON;
1812 VDBG("%s resumed\n", (char *)hcd_name);
1813 }
1814 return ret;
1815}
1816
1817#else
1818
1819#define isp116x_suspend NULL
1820#define isp116x_resume NULL
1821
1822#endif
1823
1824static struct device_driver isp116x_driver = {
1825 .name = (char *)hcd_name,
1826 .bus = &platform_bus_type,
1827 .probe = isp116x_probe,
1828 .remove = isp116x_remove,
1829 .suspend = isp116x_suspend,
1830 .resume = isp116x_resume,
1831};
1832
1833/*-----------------------------------------------------------------*/
1834
1835static int __init isp116x_init(void)
1836{
1837 if (usb_disabled())
1838 return -ENODEV;
1839
1840 INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION);
1841 return driver_register(&isp116x_driver);
1842}
1843
1844module_init(isp116x_init);
1845
1846static void __exit isp116x_cleanup(void)
1847{
1848 driver_unregister(&isp116x_driver);
1849}
1850
1851module_exit(isp116x_cleanup);