Merge Linux 2.6.23
[deliverable/linux.git] / drivers / usb / host / u132-hcd.c
1 /*
2 * Host Controller Driver for the Elan Digital Systems U132 adapter
3 *
4 * Copyright(C) 2006 Elan Digital Systems Limited
5 * http://www.elandigitalsystems.com
6 *
7 * Author and Maintainer - Tony Olech - Elan Digital Systems
8 * tony.olech@elandigitalsystems.com
9 *
10 * This program is free software;you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License as
12 * published by the Free Software Foundation, version 2.
13 *
14 *
15 * This driver was written by Tony Olech(tony.olech@elandigitalsystems.com)
16 * based on various USB host drivers in the 2.6.15 linux kernel
17 * with constant reference to the 3rd Edition of Linux Device Drivers
18 * published by O'Reilly
19 *
20 * The U132 adapter is a USB to CardBus adapter specifically designed
21 * for PC cards that contain an OHCI host controller. Typical PC cards
22 * are the Orange Mobile 3G Option GlobeTrotter Fusion card.
23 *
24 * The U132 adapter will *NOT *work with PC cards that do not contain
25 * an OHCI controller. A simple way to test whether a PC card has an
26 * OHCI controller as an interface is to insert the PC card directly
27 * into a laptop(or desktop) with a CardBus slot and if "lspci" shows
28 * a new USB controller and "lsusb -v" shows a new OHCI Host Controller
29 * then there is a good chance that the U132 adapter will support the
30 * PC card.(you also need the specific client driver for the PC card)
31 *
32 * Please inform the Author and Maintainer about any PC cards that
33 * contain OHCI Host Controller and work when directly connected to
34 * an embedded CardBus slot but do not work when they are connected
35 * via an ELAN U132 adapter.
36 *
37 */
38 #include <linux/kernel.h>
39 #include <linux/module.h>
40 #include <linux/moduleparam.h>
41 #include <linux/delay.h>
42 #include <linux/ioport.h>
43 #include <linux/pci_ids.h>
44 #include <linux/sched.h>
45 #include <linux/slab.h>
46 #include <linux/errno.h>
47 #include <linux/init.h>
48 #include <linux/timer.h>
49 #include <linux/list.h>
50 #include <linux/interrupt.h>
51 #include <linux/usb.h>
52 #include <linux/workqueue.h>
53 #include <linux/platform_device.h>
54 #include <linux/pci_ids.h>
55 #include <linux/mutex.h>
56 #include <asm/io.h>
57 #include <asm/irq.h>
58 #include <asm/system.h>
59 #include <asm/byteorder.h>
60 #include "../core/hcd.h"
61
62 /* FIXME ohci.h is ONLY for internal use by the OHCI driver.
63 * If you're going to try stuff like this, you need to split
64 * out shareable stuff (register declarations?) into its own
65 * file, maybe name <linux/usb/ohci.h>
66 */
67
68 #include "ohci.h"
69 #define OHCI_CONTROL_INIT OHCI_CTRL_CBSR
70 #define OHCI_INTR_INIT (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD | \
71 OHCI_INTR_WDH)
72 MODULE_AUTHOR("Tony Olech - Elan Digital Systems Limited");
73 MODULE_DESCRIPTION("U132 USB Host Controller Driver");
74 MODULE_LICENSE("GPL");
75 #define INT_MODULE_PARM(n, v) static int n = v;module_param(n, int, 0444)
76 INT_MODULE_PARM(testing, 0);
77 /* Some boards misreport power switching/overcurrent*/
78 static int distrust_firmware = 1;
79 module_param(distrust_firmware, bool, 0);
80 MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurren"
81 "t setup");
82 static DECLARE_WAIT_QUEUE_HEAD(u132_hcd_wait);
83 /*
84 * u132_module_lock exists to protect access to global variables
85 *
86 */
87 static struct mutex u132_module_lock;
88 static int u132_exiting = 0;
89 static int u132_instances = 0;
90 static struct list_head u132_static_list;
91 /*
92 * end of the global variables protected by u132_module_lock
93 */
94 static struct workqueue_struct *workqueue;
95 #define MAX_U132_PORTS 7
96 #define MAX_U132_ADDRS 128
97 #define MAX_U132_UDEVS 4
98 #define MAX_U132_ENDPS 100
99 #define MAX_U132_RINGS 4
100 static const char *cc_to_text[16] = {
101 "No Error ",
102 "CRC Error ",
103 "Bit Stuff ",
104 "Data Togg ",
105 "Stall ",
106 "DevNotResp ",
107 "PIDCheck ",
108 "UnExpPID ",
109 "DataOver ",
110 "DataUnder ",
111 "(for hw) ",
112 "(for hw) ",
113 "BufferOver ",
114 "BuffUnder ",
115 "(for HCD) ",
116 "(for HCD) "
117 };
118 struct u132_port {
119 struct u132 *u132;
120 int reset;
121 int enable;
122 int power;
123 int Status;
124 };
125 struct u132_addr {
126 u8 address;
127 };
128 struct u132_udev {
129 struct kref kref;
130 struct usb_device *usb_device;
131 u8 enumeration;
132 u8 udev_number;
133 u8 usb_addr;
134 u8 portnumber;
135 u8 endp_number_in[16];
136 u8 endp_number_out[16];
137 };
138 #define ENDP_QUEUE_SHIFT 3
139 #define ENDP_QUEUE_SIZE (1<<ENDP_QUEUE_SHIFT)
140 #define ENDP_QUEUE_MASK (ENDP_QUEUE_SIZE-1)
141 struct u132_urbq {
142 struct list_head urb_more;
143 struct urb *urb;
144 };
145 struct u132_spin {
146 spinlock_t slock;
147 };
148 struct u132_endp {
149 struct kref kref;
150 u8 udev_number;
151 u8 endp_number;
152 u8 usb_addr;
153 u8 usb_endp;
154 struct u132 *u132;
155 struct list_head endp_ring;
156 struct u132_ring *ring;
157 unsigned toggle_bits:2;
158 unsigned active:1;
159 unsigned delayed:1;
160 unsigned input:1;
161 unsigned output:1;
162 unsigned pipetype:2;
163 unsigned dequeueing:1;
164 unsigned edset_flush:1;
165 unsigned spare_bits:14;
166 unsigned long jiffies;
167 struct usb_host_endpoint *hep;
168 struct u132_spin queue_lock;
169 u16 queue_size;
170 u16 queue_last;
171 u16 queue_next;
172 struct urb *urb_list[ENDP_QUEUE_SIZE];
173 struct list_head urb_more;
174 struct delayed_work scheduler;
175 };
176 struct u132_ring {
177 unsigned in_use:1;
178 unsigned length:7;
179 u8 number;
180 struct u132 *u132;
181 struct u132_endp *curr_endp;
182 struct delayed_work scheduler;
183 };
184 struct u132 {
185 struct kref kref;
186 struct list_head u132_list;
187 struct semaphore sw_lock;
188 struct semaphore scheduler_lock;
189 struct u132_platform_data *board;
190 struct platform_device *platform_dev;
191 struct u132_ring ring[MAX_U132_RINGS];
192 int sequence_num;
193 int going;
194 int power;
195 int reset;
196 int num_ports;
197 u32 hc_control;
198 u32 hc_fminterval;
199 u32 hc_roothub_status;
200 u32 hc_roothub_a;
201 u32 hc_roothub_portstatus[MAX_ROOT_PORTS];
202 int flags;
203 unsigned long next_statechange;
204 struct delayed_work monitor;
205 int num_endpoints;
206 struct u132_addr addr[MAX_U132_ADDRS];
207 struct u132_udev udev[MAX_U132_UDEVS];
208 struct u132_port port[MAX_U132_PORTS];
209 struct u132_endp *endp[MAX_U132_ENDPS];
210 };
211
212 /*
213 * these cannot be inlines because we need the structure offset!!
214 * Does anyone have a better way?????
215 */
216 #define ftdi_read_pcimem(pdev, member, data) usb_ftdi_elan_read_pcimem(pdev, \
217 offsetof(struct ohci_regs, member), 0, data);
218 #define ftdi_write_pcimem(pdev, member, data) usb_ftdi_elan_write_pcimem(pdev, \
219 offsetof(struct ohci_regs, member), 0, data);
220 #define u132_read_pcimem(u132, member, data) \
221 usb_ftdi_elan_read_pcimem(u132->platform_dev, offsetof(struct \
222 ohci_regs, member), 0, data);
223 #define u132_write_pcimem(u132, member, data) \
224 usb_ftdi_elan_write_pcimem(u132->platform_dev, offsetof(struct \
225 ohci_regs, member), 0, data);
226 static inline struct u132 *udev_to_u132(struct u132_udev *udev)
227 {
228 u8 udev_number = udev->udev_number;
229 return container_of(udev, struct u132, udev[udev_number]);
230 }
231
232 static inline struct u132 *hcd_to_u132(struct usb_hcd *hcd)
233 {
234 return (struct u132 *)(hcd->hcd_priv);
235 }
236
237 static inline struct usb_hcd *u132_to_hcd(struct u132 *u132)
238 {
239 return container_of((void *)u132, struct usb_hcd, hcd_priv);
240 }
241
242 static inline void u132_disable(struct u132 *u132)
243 {
244 u132_to_hcd(u132)->state = HC_STATE_HALT;
245 }
246
247
248 #define kref_to_u132(d) container_of(d, struct u132, kref)
249 #define kref_to_u132_endp(d) container_of(d, struct u132_endp, kref)
250 #define kref_to_u132_udev(d) container_of(d, struct u132_udev, kref)
251 #include "../misc/usb_u132.h"
252 static const char hcd_name[] = "u132_hcd";
253 #define PORT_C_MASK ((USB_PORT_STAT_C_CONNECTION | USB_PORT_STAT_C_ENABLE | \
254 USB_PORT_STAT_C_SUSPEND | USB_PORT_STAT_C_OVERCURRENT | \
255 USB_PORT_STAT_C_RESET) << 16)
256 static void u132_hcd_delete(struct kref *kref)
257 {
258 struct u132 *u132 = kref_to_u132(kref);
259 struct platform_device *pdev = u132->platform_dev;
260 struct usb_hcd *hcd = u132_to_hcd(u132);
261 u132->going += 1;
262 mutex_lock(&u132_module_lock);
263 list_del_init(&u132->u132_list);
264 u132_instances -= 1;
265 mutex_unlock(&u132_module_lock);
266 dev_warn(&u132->platform_dev->dev, "FREEING the hcd=%p and thus the u13"
267 "2=%p going=%d pdev=%p\n", hcd, u132, u132->going, pdev);
268 usb_put_hcd(hcd);
269 }
270
271 static inline void u132_u132_put_kref(struct u132 *u132)
272 {
273 kref_put(&u132->kref, u132_hcd_delete);
274 }
275
276 static inline void u132_u132_init_kref(struct u132 *u132)
277 {
278 kref_init(&u132->kref);
279 }
280
281 static void u132_udev_delete(struct kref *kref)
282 {
283 struct u132_udev *udev = kref_to_u132_udev(kref);
284 udev->udev_number = 0;
285 udev->usb_device = NULL;
286 udev->usb_addr = 0;
287 udev->enumeration = 0;
288 }
289
290 static inline void u132_udev_put_kref(struct u132 *u132, struct u132_udev *udev)
291 {
292 kref_put(&udev->kref, u132_udev_delete);
293 }
294
295 static inline void u132_udev_get_kref(struct u132 *u132, struct u132_udev *udev)
296 {
297 kref_get(&udev->kref);
298 }
299
300 static inline void u132_udev_init_kref(struct u132 *u132,
301 struct u132_udev *udev)
302 {
303 kref_init(&udev->kref);
304 }
305
306 static inline void u132_ring_put_kref(struct u132 *u132, struct u132_ring *ring)
307 {
308 kref_put(&u132->kref, u132_hcd_delete);
309 }
310
311 static void u132_ring_requeue_work(struct u132 *u132, struct u132_ring *ring,
312 unsigned int delta)
313 {
314 if (delta > 0) {
315 if (queue_delayed_work(workqueue, &ring->scheduler, delta))
316 return;
317 } else if (queue_delayed_work(workqueue, &ring->scheduler, 0))
318 return;
319 kref_put(&u132->kref, u132_hcd_delete);
320 return;
321 }
322
323 static void u132_ring_queue_work(struct u132 *u132, struct u132_ring *ring,
324 unsigned int delta)
325 {
326 kref_get(&u132->kref);
327 u132_ring_requeue_work(u132, ring, delta);
328 return;
329 }
330
331 static void u132_ring_cancel_work(struct u132 *u132, struct u132_ring *ring)
332 {
333 if (cancel_delayed_work(&ring->scheduler)) {
334 kref_put(&u132->kref, u132_hcd_delete);
335 }
336 }
337
338 static void u132_endp_delete(struct kref *kref)
339 {
340 struct u132_endp *endp = kref_to_u132_endp(kref);
341 struct u132 *u132 = endp->u132;
342 u8 usb_addr = endp->usb_addr;
343 u8 usb_endp = endp->usb_endp;
344 u8 address = u132->addr[usb_addr].address;
345 struct u132_udev *udev = &u132->udev[address];
346 u8 endp_number = endp->endp_number;
347 struct usb_host_endpoint *hep = endp->hep;
348 struct u132_ring *ring = endp->ring;
349 struct list_head *head = &endp->endp_ring;
350 ring->length -= 1;
351 if (endp == ring->curr_endp) {
352 if (list_empty(head)) {
353 ring->curr_endp = NULL;
354 list_del(head);
355 } else {
356 struct u132_endp *next_endp = list_entry(head->next,
357 struct u132_endp, endp_ring);
358 ring->curr_endp = next_endp;
359 list_del(head);
360 }} else
361 list_del(head);
362 if (endp->input) {
363 udev->endp_number_in[usb_endp] = 0;
364 u132_udev_put_kref(u132, udev);
365 }
366 if (endp->output) {
367 udev->endp_number_out[usb_endp] = 0;
368 u132_udev_put_kref(u132, udev);
369 }
370 u132->endp[endp_number - 1] = NULL;
371 hep->hcpriv = NULL;
372 kfree(endp);
373 u132_u132_put_kref(u132);
374 }
375
376 static inline void u132_endp_put_kref(struct u132 *u132, struct u132_endp *endp)
377 {
378 kref_put(&endp->kref, u132_endp_delete);
379 }
380
381 static inline void u132_endp_get_kref(struct u132 *u132, struct u132_endp *endp)
382 {
383 kref_get(&endp->kref);
384 }
385
386 static inline void u132_endp_init_kref(struct u132 *u132,
387 struct u132_endp *endp)
388 {
389 kref_init(&endp->kref);
390 kref_get(&u132->kref);
391 }
392
393 static void u132_endp_queue_work(struct u132 *u132, struct u132_endp *endp,
394 unsigned int delta)
395 {
396 if (queue_delayed_work(workqueue, &endp->scheduler, delta))
397 kref_get(&endp->kref);
398 }
399
400 static void u132_endp_cancel_work(struct u132 *u132, struct u132_endp *endp)
401 {
402 if (cancel_delayed_work(&endp->scheduler))
403 kref_put(&endp->kref, u132_endp_delete);
404 }
405
406 static inline void u132_monitor_put_kref(struct u132 *u132)
407 {
408 kref_put(&u132->kref, u132_hcd_delete);
409 }
410
411 static void u132_monitor_queue_work(struct u132 *u132, unsigned int delta)
412 {
413 if (queue_delayed_work(workqueue, &u132->monitor, delta))
414 kref_get(&u132->kref);
415 }
416
417 static void u132_monitor_requeue_work(struct u132 *u132, unsigned int delta)
418 {
419 if (!queue_delayed_work(workqueue, &u132->monitor, delta))
420 kref_put(&u132->kref, u132_hcd_delete);
421 }
422
423 static void u132_monitor_cancel_work(struct u132 *u132)
424 {
425 if (cancel_delayed_work(&u132->monitor))
426 kref_put(&u132->kref, u132_hcd_delete);
427 }
428
429 static int read_roothub_info(struct u132 *u132)
430 {
431 u32 revision;
432 int retval;
433 retval = u132_read_pcimem(u132, revision, &revision);
434 if (retval) {
435 dev_err(&u132->platform_dev->dev, "error %d accessing device co"
436 "ntrol\n", retval);
437 return retval;
438 } else if ((revision & 0xFF) == 0x10) {
439 } else if ((revision & 0xFF) == 0x11) {
440 } else {
441 dev_err(&u132->platform_dev->dev, "device revision is not valid"
442 " %08X\n", revision);
443 return -ENODEV;
444 }
445 retval = u132_read_pcimem(u132, control, &u132->hc_control);
446 if (retval) {
447 dev_err(&u132->platform_dev->dev, "error %d accessing device co"
448 "ntrol\n", retval);
449 return retval;
450 }
451 retval = u132_read_pcimem(u132, roothub.status,
452 &u132->hc_roothub_status);
453 if (retval) {
454 dev_err(&u132->platform_dev->dev, "error %d accessing device re"
455 "g roothub.status\n", retval);
456 return retval;
457 }
458 retval = u132_read_pcimem(u132, roothub.a, &u132->hc_roothub_a);
459 if (retval) {
460 dev_err(&u132->platform_dev->dev, "error %d accessing device re"
461 "g roothub.a\n", retval);
462 return retval;
463 }
464 {
465 int I = u132->num_ports;
466 int i = 0;
467 while (I-- > 0) {
468 retval = u132_read_pcimem(u132, roothub.portstatus[i],
469 &u132->hc_roothub_portstatus[i]);
470 if (retval) {
471 dev_err(&u132->platform_dev->dev, "error %d acc"
472 "essing device roothub.portstatus[%d]\n"
473 , retval, i);
474 return retval;
475 } else
476 i += 1;
477 }
478 }
479 return 0;
480 }
481
482 static void u132_hcd_monitor_work(struct work_struct *work)
483 {
484 struct u132 *u132 = container_of(work, struct u132, monitor.work);
485 if (u132->going > 1) {
486 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
487 , u132->going);
488 u132_monitor_put_kref(u132);
489 return;
490 } else if (u132->going > 0) {
491 dev_err(&u132->platform_dev->dev, "device is being removed\n");
492 u132_monitor_put_kref(u132);
493 return;
494 } else {
495 int retval;
496 down(&u132->sw_lock);
497 retval = read_roothub_info(u132);
498 if (retval) {
499 struct usb_hcd *hcd = u132_to_hcd(u132);
500 u132_disable(u132);
501 u132->going = 1;
502 up(&u132->sw_lock);
503 usb_hc_died(hcd);
504 ftdi_elan_gone_away(u132->platform_dev);
505 u132_monitor_put_kref(u132);
506 return;
507 } else {
508 u132_monitor_requeue_work(u132, 500);
509 up(&u132->sw_lock);
510 return;
511 }
512 }
513 }
514
515 static void u132_hcd_giveback_urb(struct u132 *u132, struct u132_endp *endp,
516 struct urb *urb, int status)
517 {
518 struct u132_ring *ring;
519 unsigned long irqs;
520 struct usb_hcd *hcd = u132_to_hcd(u132);
521 urb->error_count = 0;
522 urb->status = status;
523 urb->hcpriv = NULL;
524 spin_lock_irqsave(&endp->queue_lock.slock, irqs);
525 endp->queue_next += 1;
526 if (ENDP_QUEUE_SIZE > --endp->queue_size) {
527 endp->active = 0;
528 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
529 } else {
530 struct list_head *next = endp->urb_more.next;
531 struct u132_urbq *urbq = list_entry(next, struct u132_urbq,
532 urb_more);
533 list_del(next);
534 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
535 urbq->urb;
536 endp->active = 0;
537 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
538 kfree(urbq);
539 } down(&u132->scheduler_lock);
540 ring = endp->ring;
541 ring->in_use = 0;
542 u132_ring_cancel_work(u132, ring);
543 u132_ring_queue_work(u132, ring, 0);
544 up(&u132->scheduler_lock);
545 u132_endp_put_kref(u132, endp);
546 usb_hcd_giveback_urb(hcd, urb);
547 return;
548 }
549
550 static void u132_hcd_forget_urb(struct u132 *u132, struct u132_endp *endp,
551 struct urb *urb, int status)
552 {
553 u132_endp_put_kref(u132, endp);
554 }
555
556 static void u132_hcd_abandon_urb(struct u132 *u132, struct u132_endp *endp,
557 struct urb *urb, int status)
558 {
559 unsigned long irqs;
560 struct usb_hcd *hcd = u132_to_hcd(u132);
561 urb->error_count = 0;
562 urb->status = status;
563 urb->hcpriv = NULL;
564 spin_lock_irqsave(&endp->queue_lock.slock, irqs);
565 endp->queue_next += 1;
566 if (ENDP_QUEUE_SIZE > --endp->queue_size) {
567 endp->active = 0;
568 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
569 } else {
570 struct list_head *next = endp->urb_more.next;
571 struct u132_urbq *urbq = list_entry(next, struct u132_urbq,
572 urb_more);
573 list_del(next);
574 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
575 urbq->urb;
576 endp->active = 0;
577 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
578 kfree(urbq);
579 } usb_hcd_giveback_urb(hcd, urb);
580 return;
581 }
582
583 static inline int edset_input(struct u132 *u132, struct u132_ring *ring,
584 struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
585 void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
586 int toggle_bits, int error_count, int condition_code, int repeat_number,
587 int halted, int skipped, int actual, int non_null))
588 {
589 return usb_ftdi_elan_edset_input(u132->platform_dev, ring->number, endp,
590 urb, address, endp->usb_endp, toggle_bits, callback);
591 }
592
593 static inline int edset_setup(struct u132 *u132, struct u132_ring *ring,
594 struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
595 void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
596 int toggle_bits, int error_count, int condition_code, int repeat_number,
597 int halted, int skipped, int actual, int non_null))
598 {
599 return usb_ftdi_elan_edset_setup(u132->platform_dev, ring->number, endp,
600 urb, address, endp->usb_endp, toggle_bits, callback);
601 }
602
603 static inline int edset_single(struct u132 *u132, struct u132_ring *ring,
604 struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
605 void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
606 int toggle_bits, int error_count, int condition_code, int repeat_number,
607 int halted, int skipped, int actual, int non_null))
608 {
609 return usb_ftdi_elan_edset_single(u132->platform_dev, ring->number,
610 endp, urb, address, endp->usb_endp, toggle_bits, callback);
611 }
612
613 static inline int edset_output(struct u132 *u132, struct u132_ring *ring,
614 struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
615 void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
616 int toggle_bits, int error_count, int condition_code, int repeat_number,
617 int halted, int skipped, int actual, int non_null))
618 {
619 return usb_ftdi_elan_edset_output(u132->platform_dev, ring->number,
620 endp, urb, address, endp->usb_endp, toggle_bits, callback);
621 }
622
623
624 /*
625 * must not LOCK sw_lock
626 *
627 */
628 static void u132_hcd_interrupt_recv(void *data, struct urb *urb, u8 *buf,
629 int len, int toggle_bits, int error_count, int condition_code,
630 int repeat_number, int halted, int skipped, int actual, int non_null)
631 {
632 struct u132_endp *endp = data;
633 struct u132 *u132 = endp->u132;
634 u8 address = u132->addr[endp->usb_addr].address;
635 struct u132_udev *udev = &u132->udev[address];
636 down(&u132->scheduler_lock);
637 if (u132->going > 1) {
638 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
639 , u132->going);
640 up(&u132->scheduler_lock);
641 u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
642 return;
643 } else if (endp->dequeueing) {
644 endp->dequeueing = 0;
645 up(&u132->scheduler_lock);
646 u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
647 return;
648 } else if (u132->going > 0) {
649 dev_err(&u132->platform_dev->dev, "device is being removed urb="
650 "%p status=%d\n", urb, urb->status);
651 up(&u132->scheduler_lock);
652 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
653 return;
654 } else if (urb->status == -EINPROGRESS) {
655 struct u132_ring *ring = endp->ring;
656 u8 *u = urb->transfer_buffer + urb->actual_length;
657 u8 *b = buf;
658 int L = len;
659 while (L-- > 0) {
660 *u++ = *b++;
661 }
662 urb->actual_length += len;
663 if ((condition_code == TD_CC_NOERROR) &&
664 (urb->transfer_buffer_length > urb->actual_length)) {
665 endp->toggle_bits = toggle_bits;
666 usb_settoggle(udev->usb_device, endp->usb_endp, 0,
667 1 & toggle_bits);
668 if (urb->actual_length > 0) {
669 int retval;
670 up(&u132->scheduler_lock);
671 retval = edset_single(u132, ring, endp, urb,
672 address, endp->toggle_bits,
673 u132_hcd_interrupt_recv);
674 if (retval == 0) {
675 } else
676 u132_hcd_giveback_urb(u132, endp, urb,
677 retval);
678 } else {
679 ring->in_use = 0;
680 endp->active = 0;
681 endp->jiffies = jiffies +
682 msecs_to_jiffies(urb->interval);
683 u132_ring_cancel_work(u132, ring);
684 u132_ring_queue_work(u132, ring, 0);
685 up(&u132->scheduler_lock);
686 u132_endp_put_kref(u132, endp);
687 }
688 return;
689 } else if ((condition_code == TD_DATAUNDERRUN) &&
690 ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0)) {
691 endp->toggle_bits = toggle_bits;
692 usb_settoggle(udev->usb_device, endp->usb_endp, 0,
693 1 & toggle_bits);
694 up(&u132->scheduler_lock);
695 u132_hcd_giveback_urb(u132, endp, urb, 0);
696 return;
697 } else {
698 if (condition_code == TD_CC_NOERROR) {
699 endp->toggle_bits = toggle_bits;
700 usb_settoggle(udev->usb_device, endp->usb_endp,
701 0, 1 & toggle_bits);
702 } else if (condition_code == TD_CC_STALL) {
703 endp->toggle_bits = 0x2;
704 usb_settoggle(udev->usb_device, endp->usb_endp,
705 0, 0);
706 } else {
707 endp->toggle_bits = 0x2;
708 usb_settoggle(udev->usb_device, endp->usb_endp,
709 0, 0);
710 dev_err(&u132->platform_dev->dev, "urb=%p givin"
711 "g back INTERRUPT %s\n", urb,
712 cc_to_text[condition_code]);
713 }
714 up(&u132->scheduler_lock);
715 u132_hcd_giveback_urb(u132, endp, urb,
716 cc_to_error[condition_code]);
717 return;
718 }
719 } else {
720 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"
721 "s=%d\n", urb, urb->status);
722 up(&u132->scheduler_lock);
723 u132_hcd_giveback_urb(u132, endp, urb, urb->status);
724 return;
725 }
726 }
727
728 static void u132_hcd_bulk_output_sent(void *data, struct urb *urb, u8 *buf,
729 int len, int toggle_bits, int error_count, int condition_code,
730 int repeat_number, int halted, int skipped, int actual, int non_null)
731 {
732 struct u132_endp *endp = data;
733 struct u132 *u132 = endp->u132;
734 u8 address = u132->addr[endp->usb_addr].address;
735 down(&u132->scheduler_lock);
736 if (u132->going > 1) {
737 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
738 , u132->going);
739 up(&u132->scheduler_lock);
740 u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
741 return;
742 } else if (endp->dequeueing) {
743 endp->dequeueing = 0;
744 up(&u132->scheduler_lock);
745 u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
746 return;
747 } else if (u132->going > 0) {
748 dev_err(&u132->platform_dev->dev, "device is being removed urb="
749 "%p status=%d\n", urb, urb->status);
750 up(&u132->scheduler_lock);
751 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
752 return;
753 } else if (urb->status == -EINPROGRESS) {
754 struct u132_ring *ring = endp->ring;
755 urb->actual_length += len;
756 endp->toggle_bits = toggle_bits;
757 if (urb->transfer_buffer_length > urb->actual_length) {
758 int retval;
759 up(&u132->scheduler_lock);
760 retval = edset_output(u132, ring, endp, urb, address,
761 endp->toggle_bits, u132_hcd_bulk_output_sent);
762 if (retval == 0) {
763 } else
764 u132_hcd_giveback_urb(u132, endp, urb, retval);
765 return;
766 } else {
767 up(&u132->scheduler_lock);
768 u132_hcd_giveback_urb(u132, endp, urb, 0);
769 return;
770 }
771 } else {
772 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"
773 "s=%d\n", urb, urb->status);
774 up(&u132->scheduler_lock);
775 u132_hcd_giveback_urb(u132, endp, urb, urb->status);
776 return;
777 }
778 }
779
780 static void u132_hcd_bulk_input_recv(void *data, struct urb *urb, u8 *buf,
781 int len, int toggle_bits, int error_count, int condition_code,
782 int repeat_number, int halted, int skipped, int actual, int non_null)
783 {
784 struct u132_endp *endp = data;
785 struct u132 *u132 = endp->u132;
786 u8 address = u132->addr[endp->usb_addr].address;
787 struct u132_udev *udev = &u132->udev[address];
788 down(&u132->scheduler_lock);
789 if (u132->going > 1) {
790 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
791 , u132->going);
792 up(&u132->scheduler_lock);
793 u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
794 return;
795 } else if (endp->dequeueing) {
796 endp->dequeueing = 0;
797 up(&u132->scheduler_lock);
798 u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
799 return;
800 } else if (u132->going > 0) {
801 dev_err(&u132->platform_dev->dev, "device is being removed urb="
802 "%p status=%d\n", urb, urb->status);
803 up(&u132->scheduler_lock);
804 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
805 return;
806 } else if (urb->status == -EINPROGRESS) {
807 struct u132_ring *ring = endp->ring;
808 u8 *u = urb->transfer_buffer + urb->actual_length;
809 u8 *b = buf;
810 int L = len;
811 while (L-- > 0) {
812 *u++ = *b++;
813 }
814 urb->actual_length += len;
815 if ((condition_code == TD_CC_NOERROR) &&
816 (urb->transfer_buffer_length > urb->actual_length)) {
817 int retval;
818 endp->toggle_bits = toggle_bits;
819 usb_settoggle(udev->usb_device, endp->usb_endp, 0,
820 1 & toggle_bits);
821 up(&u132->scheduler_lock);
822 retval = usb_ftdi_elan_edset_input(u132->platform_dev,
823 ring->number, endp, urb, address,
824 endp->usb_endp, endp->toggle_bits,
825 u132_hcd_bulk_input_recv);
826 if (retval == 0) {
827 } else
828 u132_hcd_giveback_urb(u132, endp, urb, retval);
829 return;
830 } else if (condition_code == TD_CC_NOERROR) {
831 endp->toggle_bits = toggle_bits;
832 usb_settoggle(udev->usb_device, endp->usb_endp, 0,
833 1 & toggle_bits);
834 up(&u132->scheduler_lock);
835 u132_hcd_giveback_urb(u132, endp, urb,
836 cc_to_error[condition_code]);
837 return;
838 } else if ((condition_code == TD_DATAUNDERRUN) &&
839 ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0)) {
840 endp->toggle_bits = toggle_bits;
841 usb_settoggle(udev->usb_device, endp->usb_endp, 0,
842 1 & toggle_bits);
843 up(&u132->scheduler_lock);
844 u132_hcd_giveback_urb(u132, endp, urb, 0);
845 return;
846 } else if (condition_code == TD_DATAUNDERRUN) {
847 endp->toggle_bits = toggle_bits;
848 usb_settoggle(udev->usb_device, endp->usb_endp, 0,
849 1 & toggle_bits);
850 dev_warn(&u132->platform_dev->dev, "urb=%p(SHORT NOT OK"
851 ") giving back BULK IN %s\n", urb,
852 cc_to_text[condition_code]);
853 up(&u132->scheduler_lock);
854 u132_hcd_giveback_urb(u132, endp, urb, 0);
855 return;
856 } else if (condition_code == TD_CC_STALL) {
857 endp->toggle_bits = 0x2;
858 usb_settoggle(udev->usb_device, endp->usb_endp, 0, 0);
859 up(&u132->scheduler_lock);
860 u132_hcd_giveback_urb(u132, endp, urb,
861 cc_to_error[condition_code]);
862 return;
863 } else {
864 endp->toggle_bits = 0x2;
865 usb_settoggle(udev->usb_device, endp->usb_endp, 0, 0);
866 dev_err(&u132->platform_dev->dev, "urb=%p giving back B"
867 "ULK IN code=%d %s\n", urb, condition_code,
868 cc_to_text[condition_code]);
869 up(&u132->scheduler_lock);
870 u132_hcd_giveback_urb(u132, endp, urb,
871 cc_to_error[condition_code]);
872 return;
873 }
874 } else {
875 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"
876 "s=%d\n", urb, urb->status);
877 up(&u132->scheduler_lock);
878 u132_hcd_giveback_urb(u132, endp, urb, urb->status);
879 return;
880 }
881 }
882
883 static void u132_hcd_configure_empty_sent(void *data, struct urb *urb, u8 *buf,
884 int len, int toggle_bits, int error_count, int condition_code,
885 int repeat_number, int halted, int skipped, int actual, int non_null)
886 {
887 struct u132_endp *endp = data;
888 struct u132 *u132 = endp->u132;
889 down(&u132->scheduler_lock);
890 if (u132->going > 1) {
891 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
892 , u132->going);
893 up(&u132->scheduler_lock);
894 u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
895 return;
896 } else if (endp->dequeueing) {
897 endp->dequeueing = 0;
898 up(&u132->scheduler_lock);
899 u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
900 return;
901 } else if (u132->going > 0) {
902 dev_err(&u132->platform_dev->dev, "device is being removed urb="
903 "%p status=%d\n", urb, urb->status);
904 up(&u132->scheduler_lock);
905 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
906 return;
907 } else if (urb->status == -EINPROGRESS) {
908 up(&u132->scheduler_lock);
909 u132_hcd_giveback_urb(u132, endp, urb, 0);
910 return;
911 } else {
912 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"
913 "s=%d\n", urb, urb->status);
914 up(&u132->scheduler_lock);
915 u132_hcd_giveback_urb(u132, endp, urb, urb->status);
916 return;
917 }
918 }
919
920 static void u132_hcd_configure_input_recv(void *data, struct urb *urb, u8 *buf,
921 int len, int toggle_bits, int error_count, int condition_code,
922 int repeat_number, int halted, int skipped, int actual, int non_null)
923 {
924 struct u132_endp *endp = data;
925 struct u132 *u132 = endp->u132;
926 u8 address = u132->addr[endp->usb_addr].address;
927 down(&u132->scheduler_lock);
928 if (u132->going > 1) {
929 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
930 , u132->going);
931 up(&u132->scheduler_lock);
932 u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
933 return;
934 } else if (endp->dequeueing) {
935 endp->dequeueing = 0;
936 up(&u132->scheduler_lock);
937 u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
938 return;
939 } else if (u132->going > 0) {
940 dev_err(&u132->platform_dev->dev, "device is being removed urb="
941 "%p status=%d\n", urb, urb->status);
942 up(&u132->scheduler_lock);
943 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
944 return;
945 } else if (urb->status == -EINPROGRESS) {
946 struct u132_ring *ring = endp->ring;
947 u8 *u = urb->transfer_buffer;
948 u8 *b = buf;
949 int L = len;
950 while (L-- > 0) {
951 *u++ = *b++;
952 }
953 urb->actual_length = len;
954 if ((condition_code == TD_CC_NOERROR) || ((condition_code ==
955 TD_DATAUNDERRUN) && ((urb->transfer_flags &
956 URB_SHORT_NOT_OK) == 0))) {
957 int retval;
958 up(&u132->scheduler_lock);
959 retval = usb_ftdi_elan_edset_empty(u132->platform_dev,
960 ring->number, endp, urb, address,
961 endp->usb_endp, 0x3,
962 u132_hcd_configure_empty_sent);
963 if (retval == 0) {
964 } else
965 u132_hcd_giveback_urb(u132, endp, urb, retval);
966 return;
967 } else if (condition_code == TD_CC_STALL) {
968 up(&u132->scheduler_lock);
969 dev_warn(&u132->platform_dev->dev, "giving back SETUP I"
970 "NPUT STALL urb %p\n", urb);
971 u132_hcd_giveback_urb(u132, endp, urb,
972 cc_to_error[condition_code]);
973 return;
974 } else {
975 up(&u132->scheduler_lock);
976 dev_err(&u132->platform_dev->dev, "giving back SETUP IN"
977 "PUT %s urb %p\n", cc_to_text[condition_code],
978 urb);
979 u132_hcd_giveback_urb(u132, endp, urb,
980 cc_to_error[condition_code]);
981 return;
982 }
983 } else {
984 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"
985 "s=%d\n", urb, urb->status);
986 up(&u132->scheduler_lock);
987 u132_hcd_giveback_urb(u132, endp, urb, urb->status);
988 return;
989 }
990 }
991
992 static void u132_hcd_configure_empty_recv(void *data, struct urb *urb, u8 *buf,
993 int len, int toggle_bits, int error_count, int condition_code,
994 int repeat_number, int halted, int skipped, int actual, int non_null)
995 {
996 struct u132_endp *endp = data;
997 struct u132 *u132 = endp->u132;
998 down(&u132->scheduler_lock);
999 if (u132->going > 1) {
1000 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1001 , u132->going);
1002 up(&u132->scheduler_lock);
1003 u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1004 return;
1005 } else if (endp->dequeueing) {
1006 endp->dequeueing = 0;
1007 up(&u132->scheduler_lock);
1008 u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1009 return;
1010 } else if (u132->going > 0) {
1011 dev_err(&u132->platform_dev->dev, "device is being removed urb="
1012 "%p status=%d\n", urb, urb->status);
1013 up(&u132->scheduler_lock);
1014 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1015 return;
1016 } else if (urb->status == -EINPROGRESS) {
1017 up(&u132->scheduler_lock);
1018 u132_hcd_giveback_urb(u132, endp, urb, 0);
1019 return;
1020 } else {
1021 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"
1022 "s=%d\n", urb, urb->status);
1023 up(&u132->scheduler_lock);
1024 u132_hcd_giveback_urb(u132, endp, urb, urb->status);
1025 return;
1026 }
1027 }
1028
1029 static void u132_hcd_configure_setup_sent(void *data, struct urb *urb, u8 *buf,
1030 int len, int toggle_bits, int error_count, int condition_code,
1031 int repeat_number, int halted, int skipped, int actual, int non_null)
1032 {
1033 struct u132_endp *endp = data;
1034 struct u132 *u132 = endp->u132;
1035 u8 address = u132->addr[endp->usb_addr].address;
1036 down(&u132->scheduler_lock);
1037 if (u132->going > 1) {
1038 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1039 , u132->going);
1040 up(&u132->scheduler_lock);
1041 u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1042 return;
1043 } else if (endp->dequeueing) {
1044 endp->dequeueing = 0;
1045 up(&u132->scheduler_lock);
1046 u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1047 return;
1048 } else if (u132->going > 0) {
1049 dev_err(&u132->platform_dev->dev, "device is being removed urb="
1050 "%p status=%d\n", urb, urb->status);
1051 up(&u132->scheduler_lock);
1052 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1053 return;
1054 } else if (urb->status == -EINPROGRESS) {
1055 if (usb_pipein(urb->pipe)) {
1056 int retval;
1057 struct u132_ring *ring = endp->ring;
1058 up(&u132->scheduler_lock);
1059 retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1060 ring->number, endp, urb, address,
1061 endp->usb_endp, 0,
1062 u132_hcd_configure_input_recv);
1063 if (retval == 0) {
1064 } else
1065 u132_hcd_giveback_urb(u132, endp, urb, retval);
1066 return;
1067 } else {
1068 int retval;
1069 struct u132_ring *ring = endp->ring;
1070 up(&u132->scheduler_lock);
1071 retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1072 ring->number, endp, urb, address,
1073 endp->usb_endp, 0,
1074 u132_hcd_configure_empty_recv);
1075 if (retval == 0) {
1076 } else
1077 u132_hcd_giveback_urb(u132, endp, urb, retval);
1078 return;
1079 }
1080 } else {
1081 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"
1082 "s=%d\n", urb, urb->status);
1083 up(&u132->scheduler_lock);
1084 u132_hcd_giveback_urb(u132, endp, urb, urb->status);
1085 return;
1086 }
1087 }
1088
1089 static void u132_hcd_enumeration_empty_recv(void *data, struct urb *urb,
1090 u8 *buf, int len, int toggle_bits, int error_count, int condition_code,
1091 int repeat_number, int halted, int skipped, int actual, int non_null)
1092 {
1093 struct u132_endp *endp = data;
1094 struct u132 *u132 = endp->u132;
1095 u8 address = u132->addr[endp->usb_addr].address;
1096 struct u132_udev *udev = &u132->udev[address];
1097 down(&u132->scheduler_lock);
1098 if (u132->going > 1) {
1099 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1100 , u132->going);
1101 up(&u132->scheduler_lock);
1102 u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1103 return;
1104 } else if (endp->dequeueing) {
1105 endp->dequeueing = 0;
1106 up(&u132->scheduler_lock);
1107 u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1108 return;
1109 } else if (u132->going > 0) {
1110 dev_err(&u132->platform_dev->dev, "device is being removed urb="
1111 "%p status=%d\n", urb, urb->status);
1112 up(&u132->scheduler_lock);
1113 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1114 return;
1115 } else if (urb->status == -EINPROGRESS) {
1116 u132->addr[0].address = 0;
1117 endp->usb_addr = udev->usb_addr;
1118 up(&u132->scheduler_lock);
1119 u132_hcd_giveback_urb(u132, endp, urb, 0);
1120 return;
1121 } else {
1122 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"
1123 "s=%d\n", urb, urb->status);
1124 up(&u132->scheduler_lock);
1125 u132_hcd_giveback_urb(u132, endp, urb, urb->status);
1126 return;
1127 }
1128 }
1129
1130 static void u132_hcd_enumeration_address_sent(void *data, struct urb *urb,
1131 u8 *buf, int len, int toggle_bits, int error_count, int condition_code,
1132 int repeat_number, int halted, int skipped, int actual, int non_null)
1133 {
1134 struct u132_endp *endp = data;
1135 struct u132 *u132 = endp->u132;
1136 down(&u132->scheduler_lock);
1137 if (u132->going > 1) {
1138 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1139 , u132->going);
1140 up(&u132->scheduler_lock);
1141 u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1142 return;
1143 } else if (endp->dequeueing) {
1144 endp->dequeueing = 0;
1145 up(&u132->scheduler_lock);
1146 u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1147 return;
1148 } else if (u132->going > 0) {
1149 dev_err(&u132->platform_dev->dev, "device is being removed urb="
1150 "%p status=%d\n", urb, urb->status);
1151 up(&u132->scheduler_lock);
1152 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1153 return;
1154 } else if (urb->status == -EINPROGRESS) {
1155 int retval;
1156 struct u132_ring *ring = endp->ring;
1157 up(&u132->scheduler_lock);
1158 retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1159 ring->number, endp, urb, 0, endp->usb_endp, 0,
1160 u132_hcd_enumeration_empty_recv);
1161 if (retval == 0) {
1162 } else
1163 u132_hcd_giveback_urb(u132, endp, urb, retval);
1164 return;
1165 } else {
1166 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"
1167 "s=%d\n", urb, urb->status);
1168 up(&u132->scheduler_lock);
1169 u132_hcd_giveback_urb(u132, endp, urb, urb->status);
1170 return;
1171 }
1172 }
1173
1174 static void u132_hcd_initial_empty_sent(void *data, struct urb *urb, u8 *buf,
1175 int len, int toggle_bits, int error_count, int condition_code,
1176 int repeat_number, int halted, int skipped, int actual, int non_null)
1177 {
1178 struct u132_endp *endp = data;
1179 struct u132 *u132 = endp->u132;
1180 down(&u132->scheduler_lock);
1181 if (u132->going > 1) {
1182 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1183 , u132->going);
1184 up(&u132->scheduler_lock);
1185 u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1186 return;
1187 } else if (endp->dequeueing) {
1188 endp->dequeueing = 0;
1189 up(&u132->scheduler_lock);
1190 u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1191 return;
1192 } else if (u132->going > 0) {
1193 dev_err(&u132->platform_dev->dev, "device is being removed urb="
1194 "%p status=%d\n", urb, urb->status);
1195 up(&u132->scheduler_lock);
1196 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1197 return;
1198 } else if (urb->status == -EINPROGRESS) {
1199 up(&u132->scheduler_lock);
1200 u132_hcd_giveback_urb(u132, endp, urb, 0);
1201 return;
1202 } else {
1203 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"
1204 "s=%d\n", urb, urb->status);
1205 up(&u132->scheduler_lock);
1206 u132_hcd_giveback_urb(u132, endp, urb, urb->status);
1207 return;
1208 }
1209 }
1210
1211 static void u132_hcd_initial_input_recv(void *data, struct urb *urb, u8 *buf,
1212 int len, int toggle_bits, int error_count, int condition_code,
1213 int repeat_number, int halted, int skipped, int actual, int non_null)
1214 {
1215 struct u132_endp *endp = data;
1216 struct u132 *u132 = endp->u132;
1217 u8 address = u132->addr[endp->usb_addr].address;
1218 down(&u132->scheduler_lock);
1219 if (u132->going > 1) {
1220 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1221 , u132->going);
1222 up(&u132->scheduler_lock);
1223 u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1224 return;
1225 } else if (endp->dequeueing) {
1226 endp->dequeueing = 0;
1227 up(&u132->scheduler_lock);
1228 u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1229 return;
1230 } else if (u132->going > 0) {
1231 dev_err(&u132->platform_dev->dev, "device is being removed urb="
1232 "%p status=%d\n", urb, urb->status);
1233 up(&u132->scheduler_lock);
1234 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1235 return;
1236 } else if (urb->status == -EINPROGRESS) {
1237 int retval;
1238 struct u132_ring *ring = endp->ring;
1239 u8 *u = urb->transfer_buffer;
1240 u8 *b = buf;
1241 int L = len;
1242 while (L-- > 0) {
1243 *u++ = *b++;
1244 }
1245 urb->actual_length = len;
1246 up(&u132->scheduler_lock);
1247 retval = usb_ftdi_elan_edset_empty(u132->platform_dev,
1248 ring->number, endp, urb, address, endp->usb_endp, 0x3,
1249 u132_hcd_initial_empty_sent);
1250 if (retval == 0) {
1251 } else
1252 u132_hcd_giveback_urb(u132, endp, urb, retval);
1253 return;
1254 } else {
1255 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"
1256 "s=%d\n", urb, urb->status);
1257 up(&u132->scheduler_lock);
1258 u132_hcd_giveback_urb(u132, endp, urb, urb->status);
1259 return;
1260 }
1261 }
1262
1263 static void u132_hcd_initial_setup_sent(void *data, struct urb *urb, u8 *buf,
1264 int len, int toggle_bits, int error_count, int condition_code,
1265 int repeat_number, int halted, int skipped, int actual, int non_null)
1266 {
1267 struct u132_endp *endp = data;
1268 struct u132 *u132 = endp->u132;
1269 u8 address = u132->addr[endp->usb_addr].address;
1270 down(&u132->scheduler_lock);
1271 if (u132->going > 1) {
1272 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1273 , u132->going);
1274 up(&u132->scheduler_lock);
1275 u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1276 return;
1277 } else if (endp->dequeueing) {
1278 endp->dequeueing = 0;
1279 up(&u132->scheduler_lock);
1280 u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1281 return;
1282 } else if (u132->going > 0) {
1283 dev_err(&u132->platform_dev->dev, "device is being removed urb="
1284 "%p status=%d\n", urb, urb->status);
1285 up(&u132->scheduler_lock);
1286 u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1287 return;
1288 } else if (urb->status == -EINPROGRESS) {
1289 int retval;
1290 struct u132_ring *ring = endp->ring;
1291 up(&u132->scheduler_lock);
1292 retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1293 ring->number, endp, urb, address, endp->usb_endp, 0,
1294 u132_hcd_initial_input_recv);
1295 if (retval == 0) {
1296 } else
1297 u132_hcd_giveback_urb(u132, endp, urb, retval);
1298 return;
1299 } else {
1300 dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p statu"
1301 "s=%d\n", urb, urb->status);
1302 up(&u132->scheduler_lock);
1303 u132_hcd_giveback_urb(u132, endp, urb, urb->status);
1304 return;
1305 }
1306 }
1307
1308 /*
1309 * this work function is only executed from the work queue
1310 *
1311 */
1312 static void u132_hcd_ring_work_scheduler(struct work_struct *work)
1313 {
1314 struct u132_ring *ring =
1315 container_of(work, struct u132_ring, scheduler.work);
1316 struct u132 *u132 = ring->u132;
1317 down(&u132->scheduler_lock);
1318 if (ring->in_use) {
1319 up(&u132->scheduler_lock);
1320 u132_ring_put_kref(u132, ring);
1321 return;
1322 } else if (ring->curr_endp) {
1323 struct u132_endp *last_endp = ring->curr_endp;
1324 struct list_head *scan;
1325 struct list_head *head = &last_endp->endp_ring;
1326 unsigned long wakeup = 0;
1327 list_for_each(scan, head) {
1328 struct u132_endp *endp = list_entry(scan,
1329 struct u132_endp, endp_ring);
1330 if (endp->queue_next == endp->queue_last) {
1331 } else if ((endp->delayed == 0)
1332 || time_after_eq(jiffies, endp->jiffies)) {
1333 ring->curr_endp = endp;
1334 u132_endp_cancel_work(u132, last_endp);
1335 u132_endp_queue_work(u132, last_endp, 0);
1336 up(&u132->scheduler_lock);
1337 u132_ring_put_kref(u132, ring);
1338 return;
1339 } else {
1340 unsigned long delta = endp->jiffies - jiffies;
1341 if (delta > wakeup)
1342 wakeup = delta;
1343 }
1344 }
1345 if (last_endp->queue_next == last_endp->queue_last) {
1346 } else if ((last_endp->delayed == 0) || time_after_eq(jiffies,
1347 last_endp->jiffies)) {
1348 u132_endp_cancel_work(u132, last_endp);
1349 u132_endp_queue_work(u132, last_endp, 0);
1350 up(&u132->scheduler_lock);
1351 u132_ring_put_kref(u132, ring);
1352 return;
1353 } else {
1354 unsigned long delta = last_endp->jiffies - jiffies;
1355 if (delta > wakeup)
1356 wakeup = delta;
1357 }
1358 if (wakeup > 0) {
1359 u132_ring_requeue_work(u132, ring, wakeup);
1360 up(&u132->scheduler_lock);
1361 return;
1362 } else {
1363 up(&u132->scheduler_lock);
1364 u132_ring_put_kref(u132, ring);
1365 return;
1366 }
1367 } else {
1368 up(&u132->scheduler_lock);
1369 u132_ring_put_kref(u132, ring);
1370 return;
1371 }
1372 }
1373
1374 static void u132_hcd_endp_work_scheduler(struct work_struct *work)
1375 {
1376 struct u132_ring *ring;
1377 struct u132_endp *endp =
1378 container_of(work, struct u132_endp, scheduler.work);
1379 struct u132 *u132 = endp->u132;
1380 down(&u132->scheduler_lock);
1381 ring = endp->ring;
1382 if (endp->edset_flush) {
1383 endp->edset_flush = 0;
1384 if (endp->dequeueing)
1385 usb_ftdi_elan_edset_flush(u132->platform_dev,
1386 ring->number, endp);
1387 up(&u132->scheduler_lock);
1388 u132_endp_put_kref(u132, endp);
1389 return;
1390 } else if (endp->active) {
1391 up(&u132->scheduler_lock);
1392 u132_endp_put_kref(u132, endp);
1393 return;
1394 } else if (ring->in_use) {
1395 up(&u132->scheduler_lock);
1396 u132_endp_put_kref(u132, endp);
1397 return;
1398 } else if (endp->queue_next == endp->queue_last) {
1399 up(&u132->scheduler_lock);
1400 u132_endp_put_kref(u132, endp);
1401 return;
1402 } else if (endp->pipetype == PIPE_INTERRUPT) {
1403 u8 address = u132->addr[endp->usb_addr].address;
1404 if (ring->in_use) {
1405 up(&u132->scheduler_lock);
1406 u132_endp_put_kref(u132, endp);
1407 return;
1408 } else {
1409 int retval;
1410 struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1411 endp->queue_next];
1412 endp->active = 1;
1413 ring->curr_endp = endp;
1414 ring->in_use = 1;
1415 up(&u132->scheduler_lock);
1416 retval = edset_single(u132, ring, endp, urb, address,
1417 endp->toggle_bits, u132_hcd_interrupt_recv);
1418 if (retval == 0) {
1419 } else
1420 u132_hcd_giveback_urb(u132, endp, urb, retval);
1421 return;
1422 }
1423 } else if (endp->pipetype == PIPE_CONTROL) {
1424 u8 address = u132->addr[endp->usb_addr].address;
1425 if (ring->in_use) {
1426 up(&u132->scheduler_lock);
1427 u132_endp_put_kref(u132, endp);
1428 return;
1429 } else if (address == 0) {
1430 int retval;
1431 struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1432 endp->queue_next];
1433 endp->active = 1;
1434 ring->curr_endp = endp;
1435 ring->in_use = 1;
1436 up(&u132->scheduler_lock);
1437 retval = edset_setup(u132, ring, endp, urb, address,
1438 0x2, u132_hcd_initial_setup_sent);
1439 if (retval == 0) {
1440 } else
1441 u132_hcd_giveback_urb(u132, endp, urb, retval);
1442 return;
1443 } else if (endp->usb_addr == 0) {
1444 int retval;
1445 struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1446 endp->queue_next];
1447 endp->active = 1;
1448 ring->curr_endp = endp;
1449 ring->in_use = 1;
1450 up(&u132->scheduler_lock);
1451 retval = edset_setup(u132, ring, endp, urb, 0, 0x2,
1452 u132_hcd_enumeration_address_sent);
1453 if (retval == 0) {
1454 } else
1455 u132_hcd_giveback_urb(u132, endp, urb, retval);
1456 return;
1457 } else {
1458 int retval;
1459 u8 address = u132->addr[endp->usb_addr].address;
1460 struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1461 endp->queue_next];
1462 endp->active = 1;
1463 ring->curr_endp = endp;
1464 ring->in_use = 1;
1465 up(&u132->scheduler_lock);
1466 retval = edset_setup(u132, ring, endp, urb, address,
1467 0x2, u132_hcd_configure_setup_sent);
1468 if (retval == 0) {
1469 } else
1470 u132_hcd_giveback_urb(u132, endp, urb, retval);
1471 return;
1472 }
1473 } else {
1474 if (endp->input) {
1475 u8 address = u132->addr[endp->usb_addr].address;
1476 if (ring->in_use) {
1477 up(&u132->scheduler_lock);
1478 u132_endp_put_kref(u132, endp);
1479 return;
1480 } else {
1481 int retval;
1482 struct urb *urb = endp->urb_list[
1483 ENDP_QUEUE_MASK & endp->queue_next];
1484 endp->active = 1;
1485 ring->curr_endp = endp;
1486 ring->in_use = 1;
1487 up(&u132->scheduler_lock);
1488 retval = edset_input(u132, ring, endp, urb,
1489 address, endp->toggle_bits,
1490 u132_hcd_bulk_input_recv);
1491 if (retval == 0) {
1492 } else
1493 u132_hcd_giveback_urb(u132, endp, urb,
1494 retval);
1495 return;
1496 }
1497 } else { /* output pipe */
1498 u8 address = u132->addr[endp->usb_addr].address;
1499 if (ring->in_use) {
1500 up(&u132->scheduler_lock);
1501 u132_endp_put_kref(u132, endp);
1502 return;
1503 } else {
1504 int retval;
1505 struct urb *urb = endp->urb_list[
1506 ENDP_QUEUE_MASK & endp->queue_next];
1507 endp->active = 1;
1508 ring->curr_endp = endp;
1509 ring->in_use = 1;
1510 up(&u132->scheduler_lock);
1511 retval = edset_output(u132, ring, endp, urb,
1512 address, endp->toggle_bits,
1513 u132_hcd_bulk_output_sent);
1514 if (retval == 0) {
1515 } else
1516 u132_hcd_giveback_urb(u132, endp, urb,
1517 retval);
1518 return;
1519 }
1520 }
1521 }
1522 }
1523 #ifdef CONFIG_PM
1524
1525 static void port_power(struct u132 *u132, int pn, int is_on)
1526 {
1527 u132->port[pn].power = is_on;
1528 }
1529
1530 #endif
1531
1532 static void u132_power(struct u132 *u132, int is_on)
1533 {
1534 struct usb_hcd *hcd = u132_to_hcd(u132)
1535 ; /* hub is inactive unless the port is powered */
1536 if (is_on) {
1537 if (u132->power)
1538 return;
1539 u132->power = 1;
1540 hcd->self.controller->power.power_state = PMSG_ON;
1541 } else {
1542 u132->power = 0;
1543 hcd->state = HC_STATE_HALT;
1544 hcd->self.controller->power.power_state = PMSG_SUSPEND;
1545 }
1546 }
1547
1548 static int u132_periodic_reinit(struct u132 *u132)
1549 {
1550 int retval;
1551 u32 fi = u132->hc_fminterval & 0x03fff;
1552 u32 fit;
1553 u32 fminterval;
1554 retval = u132_read_pcimem(u132, fminterval, &fminterval);
1555 if (retval)
1556 return retval;
1557 fit = fminterval & FIT;
1558 retval = u132_write_pcimem(u132, fminterval,
1559 (fit ^ FIT) | u132->hc_fminterval);
1560 if (retval)
1561 return retval;
1562 retval = u132_write_pcimem(u132, periodicstart,
1563 ((9 *fi) / 10) & 0x3fff);
1564 if (retval)
1565 return retval;
1566 return 0;
1567 }
1568
1569 static char *hcfs2string(int state)
1570 {
1571 switch (state) {
1572 case OHCI_USB_RESET:
1573 return "reset";
1574 case OHCI_USB_RESUME:
1575 return "resume";
1576 case OHCI_USB_OPER:
1577 return "operational";
1578 case OHCI_USB_SUSPEND:
1579 return "suspend";
1580 }
1581 return "?";
1582 }
1583
1584 static int u132_init(struct u132 *u132)
1585 {
1586 int retval;
1587 u32 control;
1588 u132_disable(u132);
1589 u132->next_statechange = jiffies;
1590 retval = u132_write_pcimem(u132, intrdisable, OHCI_INTR_MIE);
1591 if (retval)
1592 return retval;
1593 retval = u132_read_pcimem(u132, control, &control);
1594 if (retval)
1595 return retval;
1596 if (u132->num_ports == 0) {
1597 u32 rh_a = -1;
1598 retval = u132_read_pcimem(u132, roothub.a, &rh_a);
1599 if (retval)
1600 return retval;
1601 u132->num_ports = rh_a & RH_A_NDP;
1602 retval = read_roothub_info(u132);
1603 if (retval)
1604 return retval;
1605 }
1606 if (u132->num_ports > MAX_U132_PORTS) {
1607 return -EINVAL;
1608 }
1609 return 0;
1610 }
1611
1612
1613 /* Start an OHCI controller, set the BUS operational
1614 * resets USB and controller
1615 * enable interrupts
1616 */
1617 static int u132_run(struct u132 *u132)
1618 {
1619 int retval;
1620 u32 control;
1621 u32 status;
1622 u32 fminterval;
1623 u32 periodicstart;
1624 u32 cmdstatus;
1625 u32 roothub_a;
1626 int mask = OHCI_INTR_INIT;
1627 int first = u132->hc_fminterval == 0;
1628 int sleep_time = 0;
1629 int reset_timeout = 30; /* ... allow extra time */
1630 u132_disable(u132);
1631 if (first) {
1632 u32 temp;
1633 retval = u132_read_pcimem(u132, fminterval, &temp);
1634 if (retval)
1635 return retval;
1636 u132->hc_fminterval = temp & 0x3fff;
1637 if (u132->hc_fminterval != FI) {
1638 }
1639 u132->hc_fminterval |= FSMP(u132->hc_fminterval) << 16;
1640 }
1641 retval = u132_read_pcimem(u132, control, &u132->hc_control);
1642 if (retval)
1643 return retval;
1644 dev_info(&u132->platform_dev->dev, "resetting from state '%s', control "
1645 "= %08X\n", hcfs2string(u132->hc_control & OHCI_CTRL_HCFS),
1646 u132->hc_control);
1647 switch (u132->hc_control & OHCI_CTRL_HCFS) {
1648 case OHCI_USB_OPER:
1649 sleep_time = 0;
1650 break;
1651 case OHCI_USB_SUSPEND:
1652 case OHCI_USB_RESUME:
1653 u132->hc_control &= OHCI_CTRL_RWC;
1654 u132->hc_control |= OHCI_USB_RESUME;
1655 sleep_time = 10;
1656 break;
1657 default:
1658 u132->hc_control &= OHCI_CTRL_RWC;
1659 u132->hc_control |= OHCI_USB_RESET;
1660 sleep_time = 50;
1661 break;
1662 }
1663 retval = u132_write_pcimem(u132, control, u132->hc_control);
1664 if (retval)
1665 return retval;
1666 retval = u132_read_pcimem(u132, control, &control);
1667 if (retval)
1668 return retval;
1669 msleep(sleep_time);
1670 retval = u132_read_pcimem(u132, roothub.a, &roothub_a);
1671 if (retval)
1672 return retval;
1673 if (!(roothub_a & RH_A_NPS)) {
1674 int temp; /* power down each port */
1675 for (temp = 0; temp < u132->num_ports; temp++) {
1676 retval = u132_write_pcimem(u132,
1677 roothub.portstatus[temp], RH_PS_LSDA);
1678 if (retval)
1679 return retval;
1680 }
1681 }
1682 retval = u132_read_pcimem(u132, control, &control);
1683 if (retval)
1684 return retval;
1685 retry:retval = u132_read_pcimem(u132, cmdstatus, &status);
1686 if (retval)
1687 return retval;
1688 retval = u132_write_pcimem(u132, cmdstatus, OHCI_HCR);
1689 if (retval)
1690 return retval;
1691 extra:{
1692 retval = u132_read_pcimem(u132, cmdstatus, &status);
1693 if (retval)
1694 return retval;
1695 if (0 != (status & OHCI_HCR)) {
1696 if (--reset_timeout == 0) {
1697 dev_err(&u132->platform_dev->dev, "USB HC reset"
1698 " timed out!\n");
1699 return -ENODEV;
1700 } else {
1701 msleep(5);
1702 goto extra;
1703 }
1704 }
1705 }
1706 if (u132->flags & OHCI_QUIRK_INITRESET) {
1707 retval = u132_write_pcimem(u132, control, u132->hc_control);
1708 if (retval)
1709 return retval;
1710 retval = u132_read_pcimem(u132, control, &control);
1711 if (retval)
1712 return retval;
1713 }
1714 retval = u132_write_pcimem(u132, ed_controlhead, 0x00000000);
1715 if (retval)
1716 return retval;
1717 retval = u132_write_pcimem(u132, ed_bulkhead, 0x11000000);
1718 if (retval)
1719 return retval;
1720 retval = u132_write_pcimem(u132, hcca, 0x00000000);
1721 if (retval)
1722 return retval;
1723 retval = u132_periodic_reinit(u132);
1724 if (retval)
1725 return retval;
1726 retval = u132_read_pcimem(u132, fminterval, &fminterval);
1727 if (retval)
1728 return retval;
1729 retval = u132_read_pcimem(u132, periodicstart, &periodicstart);
1730 if (retval)
1731 return retval;
1732 if (0 == (fminterval & 0x3fff0000) || 0 == periodicstart) {
1733 if (!(u132->flags & OHCI_QUIRK_INITRESET)) {
1734 u132->flags |= OHCI_QUIRK_INITRESET;
1735 goto retry;
1736 } else
1737 dev_err(&u132->platform_dev->dev, "init err(%08x %04x)"
1738 "\n", fminterval, periodicstart);
1739 } /* start controller operations */
1740 u132->hc_control &= OHCI_CTRL_RWC;
1741 u132->hc_control |= OHCI_CONTROL_INIT | OHCI_CTRL_BLE | OHCI_USB_OPER;
1742 retval = u132_write_pcimem(u132, control, u132->hc_control);
1743 if (retval)
1744 return retval;
1745 retval = u132_write_pcimem(u132, cmdstatus, OHCI_BLF);
1746 if (retval)
1747 return retval;
1748 retval = u132_read_pcimem(u132, cmdstatus, &cmdstatus);
1749 if (retval)
1750 return retval;
1751 retval = u132_read_pcimem(u132, control, &control);
1752 if (retval)
1753 return retval;
1754 u132_to_hcd(u132)->state = HC_STATE_RUNNING;
1755 retval = u132_write_pcimem(u132, roothub.status, RH_HS_DRWE);
1756 if (retval)
1757 return retval;
1758 retval = u132_write_pcimem(u132, intrstatus, mask);
1759 if (retval)
1760 return retval;
1761 retval = u132_write_pcimem(u132, intrdisable,
1762 OHCI_INTR_MIE | OHCI_INTR_OC | OHCI_INTR_RHSC | OHCI_INTR_FNO |
1763 OHCI_INTR_UE | OHCI_INTR_RD | OHCI_INTR_SF | OHCI_INTR_WDH |
1764 OHCI_INTR_SO);
1765 if (retval)
1766 return retval; /* handle root hub init quirks ... */
1767 retval = u132_read_pcimem(u132, roothub.a, &roothub_a);
1768 if (retval)
1769 return retval;
1770 roothub_a &= ~(RH_A_PSM | RH_A_OCPM);
1771 if (u132->flags & OHCI_QUIRK_SUPERIO) {
1772 roothub_a |= RH_A_NOCP;
1773 roothub_a &= ~(RH_A_POTPGT | RH_A_NPS);
1774 retval = u132_write_pcimem(u132, roothub.a, roothub_a);
1775 if (retval)
1776 return retval;
1777 } else if ((u132->flags & OHCI_QUIRK_AMD756) || distrust_firmware) {
1778 roothub_a |= RH_A_NPS;
1779 retval = u132_write_pcimem(u132, roothub.a, roothub_a);
1780 if (retval)
1781 return retval;
1782 }
1783 retval = u132_write_pcimem(u132, roothub.status, RH_HS_LPSC);
1784 if (retval)
1785 return retval;
1786 retval = u132_write_pcimem(u132, roothub.b,
1787 (roothub_a & RH_A_NPS) ? 0 : RH_B_PPCM);
1788 if (retval)
1789 return retval;
1790 retval = u132_read_pcimem(u132, control, &control);
1791 if (retval)
1792 return retval;
1793 mdelay((roothub_a >> 23) & 0x1fe);
1794 u132_to_hcd(u132)->state = HC_STATE_RUNNING;
1795 return 0;
1796 }
1797
1798 static void u132_hcd_stop(struct usb_hcd *hcd)
1799 {
1800 struct u132 *u132 = hcd_to_u132(hcd);
1801 if (u132->going > 1) {
1802 dev_err(&u132->platform_dev->dev, "u132 device %p(hcd=%p) has b"
1803 "een removed %d\n", u132, hcd, u132->going);
1804 } else if (u132->going > 0) {
1805 dev_err(&u132->platform_dev->dev, "device hcd=%p is being remov"
1806 "ed\n", hcd);
1807 } else {
1808 down(&u132->sw_lock);
1809 msleep(100);
1810 u132_power(u132, 0);
1811 up(&u132->sw_lock);
1812 }
1813 }
1814
1815 static int u132_hcd_start(struct usb_hcd *hcd)
1816 {
1817 struct u132 *u132 = hcd_to_u132(hcd);
1818 if (u132->going > 1) {
1819 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1820 , u132->going);
1821 return -ENODEV;
1822 } else if (u132->going > 0) {
1823 dev_err(&u132->platform_dev->dev, "device is being removed\n");
1824 return -ESHUTDOWN;
1825 } else if (hcd->self.controller) {
1826 int retval;
1827 struct platform_device *pdev =
1828 to_platform_device(hcd->self.controller);
1829 u16 vendor = ((struct u132_platform_data *)
1830 (pdev->dev.platform_data))->vendor;
1831 u16 device = ((struct u132_platform_data *)
1832 (pdev->dev.platform_data))->device;
1833 down(&u132->sw_lock);
1834 msleep(10);
1835 if (vendor == PCI_VENDOR_ID_AMD && device == 0x740c) {
1836 u132->flags = OHCI_QUIRK_AMD756;
1837 } else if (vendor == PCI_VENDOR_ID_OPTI && device == 0xc861) {
1838 dev_err(&u132->platform_dev->dev, "WARNING: OPTi workar"
1839 "ounds unavailable\n");
1840 } else if (vendor == PCI_VENDOR_ID_COMPAQ && device == 0xa0f8)
1841 u132->flags |= OHCI_QUIRK_ZFMICRO;
1842 retval = u132_run(u132);
1843 if (retval) {
1844 u132_disable(u132);
1845 u132->going = 1;
1846 }
1847 msleep(100);
1848 up(&u132->sw_lock);
1849 return retval;
1850 } else {
1851 dev_err(&u132->platform_dev->dev, "platform_device missing\n");
1852 return -ENODEV;
1853 }
1854 }
1855
1856 static int u132_hcd_reset(struct usb_hcd *hcd)
1857 {
1858 struct u132 *u132 = hcd_to_u132(hcd);
1859 if (u132->going > 1) {
1860 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1861 , u132->going);
1862 return -ENODEV;
1863 } else if (u132->going > 0) {
1864 dev_err(&u132->platform_dev->dev, "device is being removed\n");
1865 return -ESHUTDOWN;
1866 } else {
1867 int retval;
1868 down(&u132->sw_lock);
1869 retval = u132_init(u132);
1870 if (retval) {
1871 u132_disable(u132);
1872 u132->going = 1;
1873 }
1874 up(&u132->sw_lock);
1875 return retval;
1876 }
1877 }
1878
1879 static int create_endpoint_and_queue_int(struct u132 *u132,
1880 struct u132_udev *udev, struct usb_host_endpoint *hep, struct urb *urb,
1881 struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp, u8 address,
1882 gfp_t mem_flags)
1883 {
1884 struct u132_ring *ring;
1885 unsigned long irqs;
1886 u8 endp_number = ++u132->num_endpoints;
1887 struct u132_endp *endp = hep->hcpriv = u132->endp[endp_number - 1] =
1888 kmalloc(sizeof(struct u132_endp), mem_flags);
1889 if (!endp) {
1890 return -ENOMEM;
1891 }
1892 INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
1893 spin_lock_init(&endp->queue_lock.slock);
1894 INIT_LIST_HEAD(&endp->urb_more);
1895 ring = endp->ring = &u132->ring[0];
1896 if (ring->curr_endp) {
1897 list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
1898 } else {
1899 INIT_LIST_HEAD(&endp->endp_ring);
1900 ring->curr_endp = endp;
1901 }
1902 ring->length += 1;
1903 endp->dequeueing = 0;
1904 endp->edset_flush = 0;
1905 endp->active = 0;
1906 endp->delayed = 0;
1907 endp->endp_number = endp_number;
1908 endp->u132 = u132;
1909 endp->hep = hep;
1910 endp->pipetype = usb_pipetype(urb->pipe);
1911 u132_endp_init_kref(u132, endp);
1912 if (usb_pipein(urb->pipe)) {
1913 endp->toggle_bits = 0x2;
1914 usb_settoggle(udev->usb_device, usb_endp, 0, 0);
1915 endp->input = 1;
1916 endp->output = 0;
1917 udev->endp_number_in[usb_endp] = endp_number;
1918 u132_udev_get_kref(u132, udev);
1919 } else {
1920 endp->toggle_bits = 0x2;
1921 usb_settoggle(udev->usb_device, usb_endp, 1, 0);
1922 endp->input = 0;
1923 endp->output = 1;
1924 udev->endp_number_out[usb_endp] = endp_number;
1925 u132_udev_get_kref(u132, udev);
1926 }
1927 urb->hcpriv = u132;
1928 spin_lock_irqsave(&endp->queue_lock.slock, irqs);
1929 endp->delayed = 1;
1930 endp->jiffies = jiffies + msecs_to_jiffies(urb->interval);
1931 endp->udev_number = address;
1932 endp->usb_addr = usb_addr;
1933 endp->usb_endp = usb_endp;
1934 endp->queue_size = 1;
1935 endp->queue_last = 0;
1936 endp->queue_next = 0;
1937 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
1938 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
1939 u132_endp_queue_work(u132, endp, msecs_to_jiffies(urb->interval));
1940 return 0;
1941 }
1942
1943 static int queue_int_on_old_endpoint(struct u132 *u132, struct u132_udev *udev,
1944 struct usb_host_endpoint *hep, struct urb *urb,
1945 struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
1946 u8 usb_endp, u8 address)
1947 {
1948 urb->hcpriv = u132;
1949 endp->delayed = 1;
1950 endp->jiffies = jiffies + msecs_to_jiffies(urb->interval);
1951 if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
1952 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
1953 } else {
1954 struct u132_urbq *urbq = kmalloc(sizeof(struct u132_urbq),
1955 GFP_ATOMIC);
1956 if (urbq == NULL) {
1957 endp->queue_size -= 1;
1958 return -ENOMEM;
1959 } else {
1960 list_add_tail(&urbq->urb_more, &endp->urb_more);
1961 urbq->urb = urb;
1962 }
1963 }
1964 return 0;
1965 }
1966
1967 static int create_endpoint_and_queue_bulk(struct u132 *u132,
1968 struct u132_udev *udev, struct usb_host_endpoint *hep, struct urb *urb,
1969 struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp, u8 address,
1970 gfp_t mem_flags)
1971 {
1972 int ring_number;
1973 struct u132_ring *ring;
1974 unsigned long irqs;
1975 u8 endp_number = ++u132->num_endpoints;
1976 struct u132_endp *endp = hep->hcpriv = u132->endp[endp_number - 1] =
1977 kmalloc(sizeof(struct u132_endp), mem_flags);
1978 if (!endp) {
1979 return -ENOMEM;
1980 }
1981 INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
1982 spin_lock_init(&endp->queue_lock.slock);
1983 INIT_LIST_HEAD(&endp->urb_more);
1984 endp->dequeueing = 0;
1985 endp->edset_flush = 0;
1986 endp->active = 0;
1987 endp->delayed = 0;
1988 endp->endp_number = endp_number;
1989 endp->u132 = u132;
1990 endp->hep = hep;
1991 endp->pipetype = usb_pipetype(urb->pipe);
1992 u132_endp_init_kref(u132, endp);
1993 if (usb_pipein(urb->pipe)) {
1994 endp->toggle_bits = 0x2;
1995 usb_settoggle(udev->usb_device, usb_endp, 0, 0);
1996 ring_number = 3;
1997 endp->input = 1;
1998 endp->output = 0;
1999 udev->endp_number_in[usb_endp] = endp_number;
2000 u132_udev_get_kref(u132, udev);
2001 } else {
2002 endp->toggle_bits = 0x2;
2003 usb_settoggle(udev->usb_device, usb_endp, 1, 0);
2004 ring_number = 2;
2005 endp->input = 0;
2006 endp->output = 1;
2007 udev->endp_number_out[usb_endp] = endp_number;
2008 u132_udev_get_kref(u132, udev);
2009 }
2010 ring = endp->ring = &u132->ring[ring_number - 1];
2011 if (ring->curr_endp) {
2012 list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
2013 } else {
2014 INIT_LIST_HEAD(&endp->endp_ring);
2015 ring->curr_endp = endp;
2016 }
2017 ring->length += 1;
2018 urb->hcpriv = u132;
2019 spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2020 endp->udev_number = address;
2021 endp->usb_addr = usb_addr;
2022 endp->usb_endp = usb_endp;
2023 endp->queue_size = 1;
2024 endp->queue_last = 0;
2025 endp->queue_next = 0;
2026 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2027 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2028 u132_endp_queue_work(u132, endp, 0);
2029 return 0;
2030 }
2031
2032 static int queue_bulk_on_old_endpoint(struct u132 *u132, struct u132_udev *udev,
2033 struct usb_host_endpoint *hep, struct urb *urb,
2034 struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
2035 u8 usb_endp, u8 address)
2036 {
2037 urb->hcpriv = u132;
2038 if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2039 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2040 } else {
2041 struct u132_urbq *urbq = kmalloc(sizeof(struct u132_urbq),
2042 GFP_ATOMIC);
2043 if (urbq == NULL) {
2044 endp->queue_size -= 1;
2045 return -ENOMEM;
2046 } else {
2047 list_add_tail(&urbq->urb_more, &endp->urb_more);
2048 urbq->urb = urb;
2049 }
2050 }
2051 return 0;
2052 }
2053
2054 static int create_endpoint_and_queue_control(struct u132 *u132,
2055 struct usb_host_endpoint *hep, struct urb *urb,
2056 struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp,
2057 gfp_t mem_flags)
2058 {
2059 struct u132_ring *ring;
2060 u8 endp_number = ++u132->num_endpoints;
2061 struct u132_endp *endp = hep->hcpriv = u132->endp[endp_number - 1] =
2062 kmalloc(sizeof(struct u132_endp), mem_flags);
2063 if (!endp) {
2064 return -ENOMEM;
2065 }
2066 INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
2067 spin_lock_init(&endp->queue_lock.slock);
2068 INIT_LIST_HEAD(&endp->urb_more);
2069 ring = endp->ring = &u132->ring[0];
2070 if (ring->curr_endp) {
2071 list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
2072 } else {
2073 INIT_LIST_HEAD(&endp->endp_ring);
2074 ring->curr_endp = endp;
2075 }
2076 ring->length += 1;
2077 endp->dequeueing = 0;
2078 endp->edset_flush = 0;
2079 endp->active = 0;
2080 endp->delayed = 0;
2081 endp->endp_number = endp_number;
2082 endp->u132 = u132;
2083 endp->hep = hep;
2084 u132_endp_init_kref(u132, endp);
2085 u132_endp_get_kref(u132, endp);
2086 if (usb_addr == 0) {
2087 unsigned long irqs;
2088 u8 address = u132->addr[usb_addr].address;
2089 struct u132_udev *udev = &u132->udev[address];
2090 endp->udev_number = address;
2091 endp->usb_addr = usb_addr;
2092 endp->usb_endp = usb_endp;
2093 endp->input = 1;
2094 endp->output = 1;
2095 endp->pipetype = usb_pipetype(urb->pipe);
2096 u132_udev_init_kref(u132, udev);
2097 u132_udev_get_kref(u132, udev);
2098 udev->endp_number_in[usb_endp] = endp_number;
2099 udev->endp_number_out[usb_endp] = endp_number;
2100 urb->hcpriv = u132;
2101 spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2102 endp->queue_size = 1;
2103 endp->queue_last = 0;
2104 endp->queue_next = 0;
2105 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2106 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2107 u132_endp_queue_work(u132, endp, 0);
2108 return 0;
2109 } else { /*(usb_addr > 0) */
2110 unsigned long irqs;
2111 u8 address = u132->addr[usb_addr].address;
2112 struct u132_udev *udev = &u132->udev[address];
2113 endp->udev_number = address;
2114 endp->usb_addr = usb_addr;
2115 endp->usb_endp = usb_endp;
2116 endp->input = 1;
2117 endp->output = 1;
2118 endp->pipetype = usb_pipetype(urb->pipe);
2119 u132_udev_get_kref(u132, udev);
2120 udev->enumeration = 2;
2121 udev->endp_number_in[usb_endp] = endp_number;
2122 udev->endp_number_out[usb_endp] = endp_number;
2123 urb->hcpriv = u132;
2124 spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2125 endp->queue_size = 1;
2126 endp->queue_last = 0;
2127 endp->queue_next = 0;
2128 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2129 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2130 u132_endp_queue_work(u132, endp, 0);
2131 return 0;
2132 }
2133 }
2134
2135 static int queue_control_on_old_endpoint(struct u132 *u132,
2136 struct usb_host_endpoint *hep, struct urb *urb,
2137 struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
2138 u8 usb_endp)
2139 {
2140 if (usb_addr == 0) {
2141 if (usb_pipein(urb->pipe)) {
2142 urb->hcpriv = u132;
2143 if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2144 endp->urb_list[ENDP_QUEUE_MASK &
2145 endp->queue_last++] = urb;
2146 } else {
2147 struct u132_urbq *urbq =
2148 kmalloc(sizeof(struct u132_urbq),
2149 GFP_ATOMIC);
2150 if (urbq == NULL) {
2151 endp->queue_size -= 1;
2152 return -ENOMEM;
2153 } else {
2154 list_add_tail(&urbq->urb_more,
2155 &endp->urb_more);
2156 urbq->urb = urb;
2157 }
2158 }
2159 return 0;
2160 } else { /* usb_pipeout(urb->pipe) */
2161 struct u132_addr *addr = &u132->addr[usb_dev->devnum];
2162 int I = MAX_U132_UDEVS;
2163 int i = 0;
2164 while (--I > 0) {
2165 struct u132_udev *udev = &u132->udev[++i];
2166 if (udev->usb_device) {
2167 continue;
2168 } else {
2169 udev->enumeration = 1;
2170 u132->addr[0].address = i;
2171 endp->udev_number = i;
2172 udev->udev_number = i;
2173 udev->usb_addr = usb_dev->devnum;
2174 u132_udev_init_kref(u132, udev);
2175 udev->endp_number_in[usb_endp] =
2176 endp->endp_number;
2177 u132_udev_get_kref(u132, udev);
2178 udev->endp_number_out[usb_endp] =
2179 endp->endp_number;
2180 udev->usb_device = usb_dev;
2181 ((u8 *) (urb->setup_packet))[2] =
2182 addr->address = i;
2183 u132_udev_get_kref(u132, udev);
2184 break;
2185 }
2186 }
2187 if (I == 0) {
2188 dev_err(&u132->platform_dev->dev, "run out of d"
2189 "evice space\n");
2190 return -EINVAL;
2191 }
2192 urb->hcpriv = u132;
2193 if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2194 endp->urb_list[ENDP_QUEUE_MASK &
2195 endp->queue_last++] = urb;
2196 } else {
2197 struct u132_urbq *urbq =
2198 kmalloc(sizeof(struct u132_urbq),
2199 GFP_ATOMIC);
2200 if (urbq == NULL) {
2201 endp->queue_size -= 1;
2202 return -ENOMEM;
2203 } else {
2204 list_add_tail(&urbq->urb_more,
2205 &endp->urb_more);
2206 urbq->urb = urb;
2207 }
2208 }
2209 return 0;
2210 }
2211 } else { /*(usb_addr > 0) */
2212 u8 address = u132->addr[usb_addr].address;
2213 struct u132_udev *udev = &u132->udev[address];
2214 urb->hcpriv = u132;
2215 if (udev->enumeration == 2) {
2216 } else
2217 udev->enumeration = 2;
2218 if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2219 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
2220 urb;
2221 } else {
2222 struct u132_urbq *urbq =
2223 kmalloc(sizeof(struct u132_urbq), GFP_ATOMIC);
2224 if (urbq == NULL) {
2225 endp->queue_size -= 1;
2226 return -ENOMEM;
2227 } else {
2228 list_add_tail(&urbq->urb_more, &endp->urb_more);
2229 urbq->urb = urb;
2230 }
2231 }
2232 return 0;
2233 }
2234 }
2235
2236 static int u132_urb_enqueue(struct usb_hcd *hcd, struct usb_host_endpoint *hep,
2237 struct urb *urb, gfp_t mem_flags)
2238 {
2239 struct u132 *u132 = hcd_to_u132(hcd);
2240 if (irqs_disabled()) {
2241 if (__GFP_WAIT & mem_flags) {
2242 printk(KERN_ERR "invalid context for function that migh"
2243 "t sleep\n");
2244 return -EINVAL;
2245 }
2246 }
2247 if (u132->going > 1) {
2248 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2249 , u132->going);
2250 return -ENODEV;
2251 } else if (u132->going > 0) {
2252 dev_err(&u132->platform_dev->dev, "device is being removed urb="
2253 "%p status=%d\n", urb, urb->status);
2254 return -ESHUTDOWN;
2255 } else {
2256 u8 usb_addr = usb_pipedevice(urb->pipe);
2257 u8 usb_endp = usb_pipeendpoint(urb->pipe);
2258 struct usb_device *usb_dev = urb->dev;
2259 if (usb_pipetype(urb->pipe) == PIPE_INTERRUPT) {
2260 u8 address = u132->addr[usb_addr].address;
2261 struct u132_udev *udev = &u132->udev[address];
2262 struct u132_endp *endp = hep->hcpriv;
2263 urb->actual_length = 0;
2264 if (endp) {
2265 unsigned long irqs;
2266 int retval;
2267 spin_lock_irqsave(&endp->queue_lock.slock,
2268 irqs);
2269 retval = queue_int_on_old_endpoint(u132, udev,
2270 hep, urb, usb_dev, endp, usb_addr,
2271 usb_endp, address);
2272 spin_unlock_irqrestore(&endp->queue_lock.slock,
2273 irqs);
2274 if (retval) {
2275 return retval;
2276 } else {
2277 u132_endp_queue_work(u132, endp,
2278 msecs_to_jiffies(urb->interval))
2279 ;
2280 return 0;
2281 }
2282 } else if (u132->num_endpoints == MAX_U132_ENDPS) {
2283 return -EINVAL;
2284 } else { /*(endp == NULL) */
2285 return create_endpoint_and_queue_int(u132, udev,
2286 hep, urb, usb_dev, usb_addr, usb_endp,
2287 address, mem_flags);
2288 }
2289 } else if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
2290 dev_err(&u132->platform_dev->dev, "the hardware does no"
2291 "t support PIPE_ISOCHRONOUS\n");
2292 return -EINVAL;
2293 } else if (usb_pipetype(urb->pipe) == PIPE_BULK) {
2294 u8 address = u132->addr[usb_addr].address;
2295 struct u132_udev *udev = &u132->udev[address];
2296 struct u132_endp *endp = hep->hcpriv;
2297 urb->actual_length = 0;
2298 if (endp) {
2299 unsigned long irqs;
2300 int retval;
2301 spin_lock_irqsave(&endp->queue_lock.slock,
2302 irqs);
2303 retval = queue_bulk_on_old_endpoint(u132, udev,
2304 hep, urb, usb_dev, endp, usb_addr,
2305 usb_endp, address);
2306 spin_unlock_irqrestore(&endp->queue_lock.slock,
2307 irqs);
2308 if (retval) {
2309 return retval;
2310 } else {
2311 u132_endp_queue_work(u132, endp, 0);
2312 return 0;
2313 }
2314 } else if (u132->num_endpoints == MAX_U132_ENDPS) {
2315 return -EINVAL;
2316 } else
2317 return create_endpoint_and_queue_bulk(u132,
2318 udev, hep, urb, usb_dev, usb_addr,
2319 usb_endp, address, mem_flags);
2320 } else {
2321 struct u132_endp *endp = hep->hcpriv;
2322 u16 urb_size = 8;
2323 u8 *b = urb->setup_packet;
2324 int i = 0;
2325 char data[30 *3 + 4];
2326 char *d = data;
2327 int m = (sizeof(data) - 1) / 3;
2328 int l = 0;
2329 data[0] = 0;
2330 while (urb_size-- > 0) {
2331 if (i > m) {
2332 } else if (i++ < m) {
2333 int w = sprintf(d, " %02X", *b++);
2334 d += w;
2335 l += w;
2336 } else
2337 d += sprintf(d, " ..");
2338 }
2339 if (endp) {
2340 unsigned long irqs;
2341 int retval;
2342 spin_lock_irqsave(&endp->queue_lock.slock,
2343 irqs);
2344 retval = queue_control_on_old_endpoint(u132,
2345 hep, urb, usb_dev, endp, usb_addr,
2346 usb_endp);
2347 spin_unlock_irqrestore(&endp->queue_lock.slock,
2348 irqs);
2349 if (retval) {
2350 return retval;
2351 } else {
2352 u132_endp_queue_work(u132, endp, 0);
2353 return 0;
2354 }
2355 } else if (u132->num_endpoints == MAX_U132_ENDPS) {
2356 return -EINVAL;
2357 } else
2358 return create_endpoint_and_queue_control(u132,
2359 hep, urb, usb_dev, usb_addr, usb_endp,
2360 mem_flags);
2361 }
2362 }
2363 }
2364
2365 static int dequeue_from_overflow_chain(struct u132 *u132,
2366 struct u132_endp *endp, struct urb *urb)
2367 {
2368 struct list_head *scan;
2369 struct list_head *head = &endp->urb_more;
2370 list_for_each(scan, head) {
2371 struct u132_urbq *urbq = list_entry(scan, struct u132_urbq,
2372 urb_more);
2373 if (urbq->urb == urb) {
2374 struct usb_hcd *hcd = u132_to_hcd(u132);
2375 list_del(scan);
2376 endp->queue_size -= 1;
2377 urb->error_count = 0;
2378 urb->hcpriv = NULL;
2379 usb_hcd_giveback_urb(hcd, urb);
2380 return 0;
2381 } else
2382 continue;
2383 }
2384 dev_err(&u132->platform_dev->dev, "urb=%p not found in endp[%d]=%p ring"
2385 "[%d] %c%c usb_endp=%d usb_addr=%d size=%d next=%04X last=%04X"
2386 "\n", urb, endp->endp_number, endp, endp->ring->number,
2387 endp->input ? 'I' : ' ', endp->output ? 'O' : ' ',
2388 endp->usb_endp, endp->usb_addr, endp->queue_size,
2389 endp->queue_next, endp->queue_last);
2390 return -EINVAL;
2391 }
2392
2393 static int u132_endp_urb_dequeue(struct u132 *u132, struct u132_endp *endp,
2394 struct urb *urb)
2395 {
2396 unsigned long irqs;
2397 spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2398 if (endp->queue_size == 0) {
2399 dev_err(&u132->platform_dev->dev, "urb=%p not found in endp[%d]"
2400 "=%p ring[%d] %c%c usb_endp=%d usb_addr=%d\n", urb,
2401 endp->endp_number, endp, endp->ring->number,
2402 endp->input ? 'I' : ' ', endp->output ? 'O' : ' ',
2403 endp->usb_endp, endp->usb_addr);
2404 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2405 return -EINVAL;
2406 }
2407 if (urb == endp->urb_list[ENDP_QUEUE_MASK & endp->queue_next]) {
2408 if (endp->active) {
2409 endp->dequeueing = 1;
2410 endp->edset_flush = 1;
2411 u132_endp_queue_work(u132, endp, 0);
2412 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2413 urb->hcpriv = NULL;
2414 return 0;
2415 } else {
2416 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2417 u132_hcd_abandon_urb(u132, endp, urb, urb->status);
2418 return 0;
2419 }
2420 } else {
2421 u16 queue_list = 0;
2422 u16 queue_size = endp->queue_size;
2423 u16 queue_scan = endp->queue_next;
2424 struct urb **urb_slot = NULL;
2425 while (++queue_list < ENDP_QUEUE_SIZE && --queue_size > 0) {
2426 if (urb == endp->urb_list[ENDP_QUEUE_MASK &
2427 ++queue_scan]) {
2428 urb_slot = &endp->urb_list[ENDP_QUEUE_MASK &
2429 queue_scan];
2430 break;
2431 } else
2432 continue;
2433 }
2434 while (++queue_list < ENDP_QUEUE_SIZE && --queue_size > 0) {
2435 *urb_slot = endp->urb_list[ENDP_QUEUE_MASK &
2436 ++queue_scan];
2437 urb_slot = &endp->urb_list[ENDP_QUEUE_MASK &
2438 queue_scan];
2439 }
2440 if (urb_slot) {
2441 struct usb_hcd *hcd = u132_to_hcd(u132);
2442 endp->queue_size -= 1;
2443 if (list_empty(&endp->urb_more)) {
2444 spin_unlock_irqrestore(&endp->queue_lock.slock,
2445 irqs);
2446 } else {
2447 struct list_head *next = endp->urb_more.next;
2448 struct u132_urbq *urbq = list_entry(next,
2449 struct u132_urbq, urb_more);
2450 list_del(next);
2451 *urb_slot = urbq->urb;
2452 spin_unlock_irqrestore(&endp->queue_lock.slock,
2453 irqs);
2454 kfree(urbq);
2455 } urb->error_count = 0;
2456 urb->hcpriv = NULL;
2457 usb_hcd_giveback_urb(hcd, urb);
2458 return 0;
2459 } else if (list_empty(&endp->urb_more)) {
2460 dev_err(&u132->platform_dev->dev, "urb=%p not found in "
2461 "endp[%d]=%p ring[%d] %c%c usb_endp=%d usb_addr"
2462 "=%d size=%d next=%04X last=%04X\n", urb,
2463 endp->endp_number, endp, endp->ring->number,
2464 endp->input ? 'I' : ' ',
2465 endp->output ? 'O' : ' ', endp->usb_endp,
2466 endp->usb_addr, endp->queue_size,
2467 endp->queue_next, endp->queue_last);
2468 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2469 return -EINVAL;
2470 } else {
2471 int retval = dequeue_from_overflow_chain(u132, endp,
2472 urb);
2473 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2474 return retval;
2475 }
2476 }
2477 }
2478
2479 static int u132_urb_dequeue(struct usb_hcd *hcd, struct urb *urb)
2480 {
2481 struct u132 *u132 = hcd_to_u132(hcd);
2482 if (u132->going > 2) {
2483 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2484 , u132->going);
2485 return -ENODEV;
2486 } else {
2487 u8 usb_addr = usb_pipedevice(urb->pipe);
2488 u8 usb_endp = usb_pipeendpoint(urb->pipe);
2489 u8 address = u132->addr[usb_addr].address;
2490 struct u132_udev *udev = &u132->udev[address];
2491 if (usb_pipein(urb->pipe)) {
2492 u8 endp_number = udev->endp_number_in[usb_endp];
2493 struct u132_endp *endp = u132->endp[endp_number - 1];
2494 return u132_endp_urb_dequeue(u132, endp, urb);
2495 } else {
2496 u8 endp_number = udev->endp_number_out[usb_endp];
2497 struct u132_endp *endp = u132->endp[endp_number - 1];
2498 return u132_endp_urb_dequeue(u132, endp, urb);
2499 }
2500 }
2501 }
2502
2503 static void u132_endpoint_disable(struct usb_hcd *hcd,
2504 struct usb_host_endpoint *hep)
2505 {
2506 struct u132 *u132 = hcd_to_u132(hcd);
2507 if (u132->going > 2) {
2508 dev_err(&u132->platform_dev->dev, "u132 device %p(hcd=%p hep=%p"
2509 ") has been removed %d\n", u132, hcd, hep,
2510 u132->going);
2511 } else {
2512 struct u132_endp *endp = hep->hcpriv;
2513 if (endp)
2514 u132_endp_put_kref(u132, endp);
2515 }
2516 }
2517
2518 static int u132_get_frame(struct usb_hcd *hcd)
2519 {
2520 struct u132 *u132 = hcd_to_u132(hcd);
2521 if (u132->going > 1) {
2522 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2523 , u132->going);
2524 return -ENODEV;
2525 } else if (u132->going > 0) {
2526 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2527 return -ESHUTDOWN;
2528 } else {
2529 int frame = 0;
2530 dev_err(&u132->platform_dev->dev, "TODO: u132_get_frame\n");
2531 msleep(100);
2532 return frame;
2533 }
2534 }
2535
2536 static int u132_roothub_descriptor(struct u132 *u132,
2537 struct usb_hub_descriptor *desc)
2538 {
2539 int retval;
2540 u16 temp;
2541 u32 rh_a = -1;
2542 u32 rh_b = -1;
2543 retval = u132_read_pcimem(u132, roothub.a, &rh_a);
2544 if (retval)
2545 return retval;
2546 desc->bDescriptorType = 0x29;
2547 desc->bPwrOn2PwrGood = (rh_a & RH_A_POTPGT) >> 24;
2548 desc->bHubContrCurrent = 0;
2549 desc->bNbrPorts = u132->num_ports;
2550 temp = 1 + (u132->num_ports / 8);
2551 desc->bDescLength = 7 + 2 *temp;
2552 temp = 0;
2553 if (rh_a & RH_A_NPS)
2554 temp |= 0x0002;
2555 if (rh_a & RH_A_PSM)
2556 temp |= 0x0001;
2557 if (rh_a & RH_A_NOCP) {
2558 temp |= 0x0010;
2559 } else if (rh_a & RH_A_OCPM)
2560 temp |= 0x0008;
2561 desc->wHubCharacteristics = cpu_to_le16(temp);
2562 retval = u132_read_pcimem(u132, roothub.b, &rh_b);
2563 if (retval)
2564 return retval;
2565 memset(desc->bitmap, 0xff, sizeof(desc->bitmap));
2566 desc->bitmap[0] = rh_b & RH_B_DR;
2567 if (u132->num_ports > 7) {
2568 desc->bitmap[1] = (rh_b & RH_B_DR) >> 8;
2569 desc->bitmap[2] = 0xff;
2570 } else
2571 desc->bitmap[1] = 0xff;
2572 return 0;
2573 }
2574
2575 static int u132_roothub_status(struct u132 *u132, __le32 *desc)
2576 {
2577 u32 rh_status = -1;
2578 int ret_status = u132_read_pcimem(u132, roothub.status, &rh_status);
2579 *desc = cpu_to_le32(rh_status);
2580 return ret_status;
2581 }
2582
2583 static int u132_roothub_portstatus(struct u132 *u132, __le32 *desc, u16 wIndex)
2584 {
2585 if (wIndex == 0 || wIndex > u132->num_ports) {
2586 return -EINVAL;
2587 } else {
2588 int port = wIndex - 1;
2589 u32 rh_portstatus = -1;
2590 int ret_portstatus = u132_read_pcimem(u132,
2591 roothub.portstatus[port], &rh_portstatus);
2592 *desc = cpu_to_le32(rh_portstatus);
2593 if (*(u16 *) (desc + 2)) {
2594 dev_info(&u132->platform_dev->dev, "Port %d Status Chan"
2595 "ge = %08X\n", port, *desc);
2596 }
2597 return ret_portstatus;
2598 }
2599 }
2600
2601
2602 /* this timer value might be vendor-specific ... */
2603 #define PORT_RESET_HW_MSEC 10
2604 #define PORT_RESET_MSEC 10
2605 /* wrap-aware logic morphed from <linux/jiffies.h> */
2606 #define tick_before(t1, t2) ((s16)(((s16)(t1))-((s16)(t2))) < 0)
2607 static int u132_roothub_portreset(struct u132 *u132, int port_index)
2608 {
2609 int retval;
2610 u32 fmnumber;
2611 u16 now;
2612 u16 reset_done;
2613 retval = u132_read_pcimem(u132, fmnumber, &fmnumber);
2614 if (retval)
2615 return retval;
2616 now = fmnumber;
2617 reset_done = now + PORT_RESET_MSEC;
2618 do {
2619 u32 portstat;
2620 do {
2621 retval = u132_read_pcimem(u132,
2622 roothub.portstatus[port_index], &portstat);
2623 if (retval)
2624 return retval;
2625 if (RH_PS_PRS & portstat) {
2626 continue;
2627 } else
2628 break;
2629 } while (tick_before(now, reset_done));
2630 if (RH_PS_PRS & portstat)
2631 return -ENODEV;
2632 if (RH_PS_CCS & portstat) {
2633 if (RH_PS_PRSC & portstat) {
2634 retval = u132_write_pcimem(u132,
2635 roothub.portstatus[port_index],
2636 RH_PS_PRSC);
2637 if (retval)
2638 return retval;
2639 }
2640 } else
2641 break; /* start the next reset,
2642 sleep till it's probably done */
2643 retval = u132_write_pcimem(u132, roothub.portstatus[port_index],
2644 RH_PS_PRS);
2645 if (retval)
2646 return retval;
2647 msleep(PORT_RESET_HW_MSEC);
2648 retval = u132_read_pcimem(u132, fmnumber, &fmnumber);
2649 if (retval)
2650 return retval;
2651 now = fmnumber;
2652 } while (tick_before(now, reset_done));
2653 return 0;
2654 }
2655
2656 static int u132_roothub_setportfeature(struct u132 *u132, u16 wValue,
2657 u16 wIndex)
2658 {
2659 if (wIndex == 0 || wIndex > u132->num_ports) {
2660 return -EINVAL;
2661 } else {
2662 int retval;
2663 int port_index = wIndex - 1;
2664 struct u132_port *port = &u132->port[port_index];
2665 port->Status &= ~(1 << wValue);
2666 switch (wValue) {
2667 case USB_PORT_FEAT_SUSPEND:
2668 retval = u132_write_pcimem(u132,
2669 roothub.portstatus[port_index], RH_PS_PSS);
2670 if (retval)
2671 return retval;
2672 return 0;
2673 case USB_PORT_FEAT_POWER:
2674 retval = u132_write_pcimem(u132,
2675 roothub.portstatus[port_index], RH_PS_PPS);
2676 if (retval)
2677 return retval;
2678 return 0;
2679 case USB_PORT_FEAT_RESET:
2680 retval = u132_roothub_portreset(u132, port_index);
2681 if (retval)
2682 return retval;
2683 return 0;
2684 default:
2685 return -EPIPE;
2686 }
2687 }
2688 }
2689
2690 static int u132_roothub_clearportfeature(struct u132 *u132, u16 wValue,
2691 u16 wIndex)
2692 {
2693 if (wIndex == 0 || wIndex > u132->num_ports) {
2694 return -EINVAL;
2695 } else {
2696 int port_index = wIndex - 1;
2697 u32 temp;
2698 int retval;
2699 struct u132_port *port = &u132->port[port_index];
2700 port->Status &= ~(1 << wValue);
2701 switch (wValue) {
2702 case USB_PORT_FEAT_ENABLE:
2703 temp = RH_PS_CCS;
2704 break;
2705 case USB_PORT_FEAT_C_ENABLE:
2706 temp = RH_PS_PESC;
2707 break;
2708 case USB_PORT_FEAT_SUSPEND:
2709 temp = RH_PS_POCI;
2710 if ((u132->hc_control & OHCI_CTRL_HCFS)
2711 != OHCI_USB_OPER) {
2712 dev_err(&u132->platform_dev->dev, "TODO resume_"
2713 "root_hub\n");
2714 }
2715 break;
2716 case USB_PORT_FEAT_C_SUSPEND:
2717 temp = RH_PS_PSSC;
2718 break;
2719 case USB_PORT_FEAT_POWER:
2720 temp = RH_PS_LSDA;
2721 break;
2722 case USB_PORT_FEAT_C_CONNECTION:
2723 temp = RH_PS_CSC;
2724 break;
2725 case USB_PORT_FEAT_C_OVER_CURRENT:
2726 temp = RH_PS_OCIC;
2727 break;
2728 case USB_PORT_FEAT_C_RESET:
2729 temp = RH_PS_PRSC;
2730 break;
2731 default:
2732 return -EPIPE;
2733 }
2734 retval = u132_write_pcimem(u132, roothub.portstatus[port_index],
2735 temp);
2736 if (retval)
2737 return retval;
2738 return 0;
2739 }
2740 }
2741
2742
2743 /* the virtual root hub timer IRQ checks for hub status*/
2744 static int u132_hub_status_data(struct usb_hcd *hcd, char *buf)
2745 {
2746 struct u132 *u132 = hcd_to_u132(hcd);
2747 if (u132->going > 1) {
2748 dev_err(&u132->platform_dev->dev, "device hcd=%p has been remov"
2749 "ed %d\n", hcd, u132->going);
2750 return -ENODEV;
2751 } else if (u132->going > 0) {
2752 dev_err(&u132->platform_dev->dev, "device hcd=%p is being remov"
2753 "ed\n", hcd);
2754 return -ESHUTDOWN;
2755 } else {
2756 int i, changed = 0, length = 1;
2757 if (u132->flags & OHCI_QUIRK_AMD756) {
2758 if ((u132->hc_roothub_a & RH_A_NDP) > MAX_ROOT_PORTS) {
2759 dev_err(&u132->platform_dev->dev, "bogus NDP, r"
2760 "ereads as NDP=%d\n",
2761 u132->hc_roothub_a & RH_A_NDP);
2762 goto done;
2763 }
2764 }
2765 if (u132->hc_roothub_status & (RH_HS_LPSC | RH_HS_OCIC)) {
2766 buf[0] = changed = 1;
2767 } else
2768 buf[0] = 0;
2769 if (u132->num_ports > 7) {
2770 buf[1] = 0;
2771 length++;
2772 }
2773 for (i = 0; i < u132->num_ports; i++) {
2774 if (u132->hc_roothub_portstatus[i] & (RH_PS_CSC |
2775 RH_PS_PESC | RH_PS_PSSC | RH_PS_OCIC |
2776 RH_PS_PRSC)) {
2777 changed = 1;
2778 if (i < 7) {
2779 buf[0] |= 1 << (i + 1);
2780 } else
2781 buf[1] |= 1 << (i - 7);
2782 continue;
2783 }
2784 if (!(u132->hc_roothub_portstatus[i] & RH_PS_CCS)) {
2785 continue;
2786 }
2787 if ((u132->hc_roothub_portstatus[i] & RH_PS_PSS)) {
2788 continue;
2789 }
2790 }
2791 done:return changed ? length : 0;
2792 }
2793 }
2794
2795 static int u132_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
2796 u16 wIndex, char *buf, u16 wLength)
2797 {
2798 struct u132 *u132 = hcd_to_u132(hcd);
2799 if (u132->going > 1) {
2800 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2801 , u132->going);
2802 return -ENODEV;
2803 } else if (u132->going > 0) {
2804 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2805 return -ESHUTDOWN;
2806 } else {
2807 int retval = 0;
2808 down(&u132->sw_lock);
2809 switch (typeReq) {
2810 case ClearHubFeature:
2811 switch (wValue) {
2812 case C_HUB_OVER_CURRENT:
2813 case C_HUB_LOCAL_POWER:
2814 break;
2815 default:
2816 goto stall;
2817 }
2818 break;
2819 case SetHubFeature:
2820 switch (wValue) {
2821 case C_HUB_OVER_CURRENT:
2822 case C_HUB_LOCAL_POWER:
2823 break;
2824 default:
2825 goto stall;
2826 }
2827 break;
2828 case ClearPortFeature:{
2829 retval = u132_roothub_clearportfeature(u132,
2830 wValue, wIndex);
2831 if (retval)
2832 goto error;
2833 break;
2834 }
2835 case GetHubDescriptor:{
2836 retval = u132_roothub_descriptor(u132,
2837 (struct usb_hub_descriptor *)buf);
2838 if (retval)
2839 goto error;
2840 break;
2841 }
2842 case GetHubStatus:{
2843 retval = u132_roothub_status(u132,
2844 (__le32 *) buf);
2845 if (retval)
2846 goto error;
2847 break;
2848 }
2849 case GetPortStatus:{
2850 retval = u132_roothub_portstatus(u132,
2851 (__le32 *) buf, wIndex);
2852 if (retval)
2853 goto error;
2854 break;
2855 }
2856 case SetPortFeature:{
2857 retval = u132_roothub_setportfeature(u132,
2858 wValue, wIndex);
2859 if (retval)
2860 goto error;
2861 break;
2862 }
2863 default:
2864 goto stall;
2865 error:u132_disable(u132);
2866 u132->going = 1;
2867 break;
2868 stall:retval = -EPIPE;
2869 break;
2870 }
2871 up(&u132->sw_lock);
2872 return retval;
2873 }
2874 }
2875
2876 static int u132_start_port_reset(struct usb_hcd *hcd, unsigned port_num)
2877 {
2878 struct u132 *u132 = hcd_to_u132(hcd);
2879 if (u132->going > 1) {
2880 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2881 , u132->going);
2882 return -ENODEV;
2883 } else if (u132->going > 0) {
2884 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2885 return -ESHUTDOWN;
2886 } else
2887 return 0;
2888 }
2889
2890 static void u132_hub_irq_enable(struct usb_hcd *hcd)
2891 {
2892 struct u132 *u132 = hcd_to_u132(hcd);
2893 if (u132->going > 1) {
2894 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2895 , u132->going);
2896 } else if (u132->going > 0)
2897 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2898 }
2899
2900
2901 #ifdef CONFIG_PM
2902 static int u132_hcd_suspend(struct usb_hcd *hcd, pm_message_t message)
2903 {
2904 struct u132 *u132 = hcd_to_u132(hcd);
2905 if (u132->going > 1) {
2906 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2907 , u132->going);
2908 return -ENODEV;
2909 } else if (u132->going > 0) {
2910 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2911 return -ESHUTDOWN;
2912 } else
2913 return 0;
2914 }
2915
2916 static int u132_hcd_resume(struct usb_hcd *hcd)
2917 {
2918 struct u132 *u132 = hcd_to_u132(hcd);
2919 if (u132->going > 1) {
2920 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2921 , u132->going);
2922 return -ENODEV;
2923 } else if (u132->going > 0) {
2924 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2925 return -ESHUTDOWN;
2926 } else
2927 return 0;
2928 }
2929
2930 static int u132_bus_suspend(struct usb_hcd *hcd)
2931 {
2932 struct u132 *u132 = hcd_to_u132(hcd);
2933 if (u132->going > 1) {
2934 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2935 , u132->going);
2936 return -ENODEV;
2937 } else if (u132->going > 0) {
2938 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2939 return -ESHUTDOWN;
2940 } else
2941 return 0;
2942 }
2943
2944 static int u132_bus_resume(struct usb_hcd *hcd)
2945 {
2946 struct u132 *u132 = hcd_to_u132(hcd);
2947 if (u132->going > 1) {
2948 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2949 , u132->going);
2950 return -ENODEV;
2951 } else if (u132->going > 0) {
2952 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2953 return -ESHUTDOWN;
2954 } else
2955 return 0;
2956 }
2957
2958 #else
2959 #define u132_hcd_suspend NULL
2960 #define u132_hcd_resume NULL
2961 #define u132_bus_suspend NULL
2962 #define u132_bus_resume NULL
2963 #endif
2964 static struct hc_driver u132_hc_driver = {
2965 .description = hcd_name,
2966 .hcd_priv_size = sizeof(struct u132),
2967 .irq = NULL,
2968 .flags = HCD_USB11 | HCD_MEMORY,
2969 .reset = u132_hcd_reset,
2970 .start = u132_hcd_start,
2971 .suspend = u132_hcd_suspend,
2972 .resume = u132_hcd_resume,
2973 .stop = u132_hcd_stop,
2974 .urb_enqueue = u132_urb_enqueue,
2975 .urb_dequeue = u132_urb_dequeue,
2976 .endpoint_disable = u132_endpoint_disable,
2977 .get_frame_number = u132_get_frame,
2978 .hub_status_data = u132_hub_status_data,
2979 .hub_control = u132_hub_control,
2980 .bus_suspend = u132_bus_suspend,
2981 .bus_resume = u132_bus_resume,
2982 .start_port_reset = u132_start_port_reset,
2983 .hub_irq_enable = u132_hub_irq_enable,
2984 };
2985
2986 /*
2987 * This function may be called by the USB core whilst the "usb_all_devices_rwsem"
2988 * is held for writing, thus this module must not call usb_remove_hcd()
2989 * synchronously - but instead should immediately stop activity to the
2990 * device and asynchronously call usb_remove_hcd()
2991 */
2992 static int __devexit u132_remove(struct platform_device *pdev)
2993 {
2994 struct usb_hcd *hcd = platform_get_drvdata(pdev);
2995 if (hcd) {
2996 struct u132 *u132 = hcd_to_u132(hcd);
2997 if (u132->going++ > 1) {
2998 dev_err(&u132->platform_dev->dev, "already being remove"
2999 "d\n");
3000 return -ENODEV;
3001 } else {
3002 int rings = MAX_U132_RINGS;
3003 int endps = MAX_U132_ENDPS;
3004 dev_err(&u132->platform_dev->dev, "removing device u132"
3005 ".%d\n", u132->sequence_num);
3006 msleep(100);
3007 down(&u132->sw_lock);
3008 u132_monitor_cancel_work(u132);
3009 while (rings-- > 0) {
3010 struct u132_ring *ring = &u132->ring[rings];
3011 u132_ring_cancel_work(u132, ring);
3012 } while (endps-- > 0) {
3013 struct u132_endp *endp = u132->endp[endps];
3014 if (endp)
3015 u132_endp_cancel_work(u132, endp);
3016 }
3017 u132->going += 1;
3018 printk(KERN_INFO "removing device u132.%d\n",
3019 u132->sequence_num);
3020 up(&u132->sw_lock);
3021 usb_remove_hcd(hcd);
3022 u132_u132_put_kref(u132);
3023 return 0;
3024 }
3025 } else
3026 return 0;
3027 }
3028
3029 static void u132_initialise(struct u132 *u132, struct platform_device *pdev)
3030 {
3031 int rings = MAX_U132_RINGS;
3032 int ports = MAX_U132_PORTS;
3033 int addrs = MAX_U132_ADDRS;
3034 int udevs = MAX_U132_UDEVS;
3035 int endps = MAX_U132_ENDPS;
3036 u132->board = pdev->dev.platform_data;
3037 u132->platform_dev = pdev;
3038 u132->power = 0;
3039 u132->reset = 0;
3040 init_MUTEX(&u132->sw_lock);
3041 init_MUTEX(&u132->scheduler_lock);
3042 while (rings-- > 0) {
3043 struct u132_ring *ring = &u132->ring[rings];
3044 ring->u132 = u132;
3045 ring->number = rings + 1;
3046 ring->length = 0;
3047 ring->curr_endp = NULL;
3048 INIT_DELAYED_WORK(&ring->scheduler,
3049 u132_hcd_ring_work_scheduler);
3050 } down(&u132->sw_lock);
3051 INIT_DELAYED_WORK(&u132->monitor, u132_hcd_monitor_work);
3052 while (ports-- > 0) {
3053 struct u132_port *port = &u132->port[ports];
3054 port->u132 = u132;
3055 port->reset = 0;
3056 port->enable = 0;
3057 port->power = 0;
3058 port->Status = 0;
3059 } while (addrs-- > 0) {
3060 struct u132_addr *addr = &u132->addr[addrs];
3061 addr->address = 0;
3062 } while (udevs-- > 0) {
3063 struct u132_udev *udev = &u132->udev[udevs];
3064 int i = ARRAY_SIZE(udev->endp_number_in);
3065 int o = ARRAY_SIZE(udev->endp_number_out);
3066 udev->usb_device = NULL;
3067 udev->udev_number = 0;
3068 udev->usb_addr = 0;
3069 udev->portnumber = 0;
3070 while (i-- > 0) {
3071 udev->endp_number_in[i] = 0;
3072 }
3073 while (o-- > 0) {
3074 udev->endp_number_out[o] = 0;
3075 }
3076 }
3077 while (endps-- > 0) {
3078 u132->endp[endps] = NULL;
3079 }
3080 up(&u132->sw_lock);
3081 return;
3082 }
3083
3084 static int __devinit u132_probe(struct platform_device *pdev)
3085 {
3086 struct usb_hcd *hcd;
3087 int retval;
3088 u32 control;
3089 u32 rh_a = -1;
3090 u32 num_ports;
3091 msleep(100);
3092 if (u132_exiting > 0) {
3093 return -ENODEV;
3094 }
3095 retval = ftdi_write_pcimem(pdev, intrdisable, OHCI_INTR_MIE);
3096 if (retval)
3097 return retval;
3098 retval = ftdi_read_pcimem(pdev, control, &control);
3099 if (retval)
3100 return retval;
3101 retval = ftdi_read_pcimem(pdev, roothub.a, &rh_a);
3102 if (retval)
3103 return retval;
3104 num_ports = rh_a & RH_A_NDP; /* refuse to confuse usbcore */
3105 if (pdev->dev.dma_mask) {
3106 return -EINVAL;
3107 }
3108 hcd = usb_create_hcd(&u132_hc_driver, &pdev->dev, pdev->dev.bus_id);
3109 if (!hcd) {
3110 printk(KERN_ERR "failed to create the usb hcd struct for U132\n"
3111 );
3112 ftdi_elan_gone_away(pdev);
3113 return -ENOMEM;
3114 } else {
3115 int retval = 0;
3116 struct u132 *u132 = hcd_to_u132(hcd);
3117 hcd->rsrc_start = 0;
3118 mutex_lock(&u132_module_lock);
3119 list_add_tail(&u132->u132_list, &u132_static_list);
3120 u132->sequence_num = ++u132_instances;
3121 mutex_unlock(&u132_module_lock);
3122 u132_u132_init_kref(u132);
3123 u132_initialise(u132, pdev);
3124 hcd->product_desc = "ELAN U132 Host Controller";
3125 retval = usb_add_hcd(hcd, 0, 0);
3126 if (retval != 0) {
3127 dev_err(&u132->platform_dev->dev, "init error %d\n",
3128 retval);
3129 u132_u132_put_kref(u132);
3130 return retval;
3131 } else {
3132 u132_monitor_queue_work(u132, 100);
3133 return 0;
3134 }
3135 }
3136 }
3137
3138
3139 #ifdef CONFIG_PM
3140 /* for this device there's no useful distinction between the controller
3141 * and its root hub, except that the root hub only gets direct PM calls
3142 * when CONFIG_USB_SUSPEND is enabled.
3143 */
3144 static int u132_suspend(struct platform_device *pdev, pm_message_t state)
3145 {
3146 struct usb_hcd *hcd = platform_get_drvdata(pdev);
3147 struct u132 *u132 = hcd_to_u132(hcd);
3148 if (u132->going > 1) {
3149 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
3150 , u132->going);
3151 return -ENODEV;
3152 } else if (u132->going > 0) {
3153 dev_err(&u132->platform_dev->dev, "device is being removed\n");
3154 return -ESHUTDOWN;
3155 } else {
3156 int retval = 0;
3157 if (state.event == PM_EVENT_FREEZE) {
3158 retval = u132_bus_suspend(hcd);
3159 } else if (state.event == PM_EVENT_SUSPEND) {
3160 int ports = MAX_U132_PORTS;
3161 while (ports-- > 0) {
3162 port_power(u132, ports, 0);
3163 }
3164 }
3165 if (retval == 0)
3166 pdev->dev.power.power_state = state;
3167 return retval;
3168 }
3169 }
3170
3171 static int u132_resume(struct platform_device *pdev)
3172 {
3173 struct usb_hcd *hcd = platform_get_drvdata(pdev);
3174 struct u132 *u132 = hcd_to_u132(hcd);
3175 if (u132->going > 1) {
3176 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
3177 , u132->going);
3178 return -ENODEV;
3179 } else if (u132->going > 0) {
3180 dev_err(&u132->platform_dev->dev, "device is being removed\n");
3181 return -ESHUTDOWN;
3182 } else {
3183 int retval = 0;
3184 if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
3185 int ports = MAX_U132_PORTS;
3186 while (ports-- > 0) {
3187 port_power(u132, ports, 1);
3188 }
3189 retval = 0;
3190 } else {
3191 pdev->dev.power.power_state = PMSG_ON;
3192 retval = u132_bus_resume(hcd);
3193 }
3194 return retval;
3195 }
3196 }
3197
3198 #else
3199 #define u132_suspend NULL
3200 #define u132_resume NULL
3201 #endif
3202 /*
3203 * this driver is loaded explicitly by ftdi_u132
3204 *
3205 * the platform_driver struct is static because it is per type of module
3206 */
3207 static struct platform_driver u132_platform_driver = {
3208 .probe = u132_probe,
3209 .remove = __devexit_p(u132_remove),
3210 .suspend = u132_suspend,
3211 .resume = u132_resume,
3212 .driver = {
3213 .name = (char *)hcd_name,
3214 .owner = THIS_MODULE,
3215 },
3216 };
3217 static int __init u132_hcd_init(void)
3218 {
3219 int retval;
3220 INIT_LIST_HEAD(&u132_static_list);
3221 u132_instances = 0;
3222 u132_exiting = 0;
3223 mutex_init(&u132_module_lock);
3224 if (usb_disabled())
3225 return -ENODEV;
3226 printk(KERN_INFO "driver %s built at %s on %s\n", hcd_name, __TIME__,
3227 __DATE__);
3228 workqueue = create_singlethread_workqueue("u132");
3229 retval = platform_driver_register(&u132_platform_driver);
3230 return retval;
3231 }
3232
3233
3234 module_init(u132_hcd_init);
3235 static void __exit u132_hcd_exit(void)
3236 {
3237 struct u132 *u132;
3238 struct u132 *temp;
3239 mutex_lock(&u132_module_lock);
3240 u132_exiting += 1;
3241 mutex_unlock(&u132_module_lock);
3242 list_for_each_entry_safe(u132, temp, &u132_static_list, u132_list) {
3243 platform_device_unregister(u132->platform_dev);
3244 } platform_driver_unregister(&u132_platform_driver);
3245 printk(KERN_INFO "u132-hcd driver deregistered\n");
3246 wait_event(u132_hcd_wait, u132_instances == 0);
3247 flush_workqueue(workqueue);
3248 destroy_workqueue(workqueue);
3249 }
3250
3251
3252 module_exit(u132_hcd_exit);
3253 MODULE_LICENSE("GPL");
This page took 0.217804 seconds and 6 git commands to generate.