Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6
[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
1524 static void port_power(struct u132 *u132, int pn, int is_on)
1525 {
1526 u132->port[pn].power = is_on;
1527 }
1528
1529 static void u132_power(struct u132 *u132, int is_on)
1530 {
1531 struct usb_hcd *hcd = u132_to_hcd(u132)
1532 ; /* hub is inactive unless the port is powered */
1533 if (is_on) {
1534 if (u132->power)
1535 return;
1536 u132->power = 1;
1537 hcd->self.controller->power.power_state = PMSG_ON;
1538 } else {
1539 u132->power = 0;
1540 hcd->state = HC_STATE_HALT;
1541 hcd->self.controller->power.power_state = PMSG_SUSPEND;
1542 }
1543 }
1544
1545 static int u132_periodic_reinit(struct u132 *u132)
1546 {
1547 int retval;
1548 u32 fi = u132->hc_fminterval & 0x03fff;
1549 u32 fit;
1550 u32 fminterval;
1551 retval = u132_read_pcimem(u132, fminterval, &fminterval);
1552 if (retval)
1553 return retval;
1554 fit = fminterval & FIT;
1555 retval = u132_write_pcimem(u132, fminterval,
1556 (fit ^ FIT) | u132->hc_fminterval);
1557 if (retval)
1558 return retval;
1559 retval = u132_write_pcimem(u132, periodicstart,
1560 ((9 *fi) / 10) & 0x3fff);
1561 if (retval)
1562 return retval;
1563 return 0;
1564 }
1565
1566 static char *hcfs2string(int state)
1567 {
1568 switch (state) {
1569 case OHCI_USB_RESET:
1570 return "reset";
1571 case OHCI_USB_RESUME:
1572 return "resume";
1573 case OHCI_USB_OPER:
1574 return "operational";
1575 case OHCI_USB_SUSPEND:
1576 return "suspend";
1577 }
1578 return "?";
1579 }
1580
1581 static int u132_init(struct u132 *u132)
1582 {
1583 int retval;
1584 u32 control;
1585 u132_disable(u132);
1586 u132->next_statechange = jiffies;
1587 retval = u132_write_pcimem(u132, intrdisable, OHCI_INTR_MIE);
1588 if (retval)
1589 return retval;
1590 retval = u132_read_pcimem(u132, control, &control);
1591 if (retval)
1592 return retval;
1593 if (u132->num_ports == 0) {
1594 u32 rh_a = -1;
1595 retval = u132_read_pcimem(u132, roothub.a, &rh_a);
1596 if (retval)
1597 return retval;
1598 u132->num_ports = rh_a & RH_A_NDP;
1599 retval = read_roothub_info(u132);
1600 if (retval)
1601 return retval;
1602 }
1603 if (u132->num_ports > MAX_U132_PORTS) {
1604 return -EINVAL;
1605 }
1606 return 0;
1607 }
1608
1609
1610 /* Start an OHCI controller, set the BUS operational
1611 * resets USB and controller
1612 * enable interrupts
1613 */
1614 static int u132_run(struct u132 *u132)
1615 {
1616 int retval;
1617 u32 control;
1618 u32 status;
1619 u32 fminterval;
1620 u32 periodicstart;
1621 u32 cmdstatus;
1622 u32 roothub_a;
1623 int mask = OHCI_INTR_INIT;
1624 int first = u132->hc_fminterval == 0;
1625 int sleep_time = 0;
1626 int reset_timeout = 30; /* ... allow extra time */
1627 u132_disable(u132);
1628 if (first) {
1629 u32 temp;
1630 retval = u132_read_pcimem(u132, fminterval, &temp);
1631 if (retval)
1632 return retval;
1633 u132->hc_fminterval = temp & 0x3fff;
1634 if (u132->hc_fminterval != FI) {
1635 }
1636 u132->hc_fminterval |= FSMP(u132->hc_fminterval) << 16;
1637 }
1638 retval = u132_read_pcimem(u132, control, &u132->hc_control);
1639 if (retval)
1640 return retval;
1641 dev_info(&u132->platform_dev->dev, "resetting from state '%s', control "
1642 "= %08X\n", hcfs2string(u132->hc_control & OHCI_CTRL_HCFS),
1643 u132->hc_control);
1644 switch (u132->hc_control & OHCI_CTRL_HCFS) {
1645 case OHCI_USB_OPER:
1646 sleep_time = 0;
1647 break;
1648 case OHCI_USB_SUSPEND:
1649 case OHCI_USB_RESUME:
1650 u132->hc_control &= OHCI_CTRL_RWC;
1651 u132->hc_control |= OHCI_USB_RESUME;
1652 sleep_time = 10;
1653 break;
1654 default:
1655 u132->hc_control &= OHCI_CTRL_RWC;
1656 u132->hc_control |= OHCI_USB_RESET;
1657 sleep_time = 50;
1658 break;
1659 }
1660 retval = u132_write_pcimem(u132, control, u132->hc_control);
1661 if (retval)
1662 return retval;
1663 retval = u132_read_pcimem(u132, control, &control);
1664 if (retval)
1665 return retval;
1666 msleep(sleep_time);
1667 retval = u132_read_pcimem(u132, roothub.a, &roothub_a);
1668 if (retval)
1669 return retval;
1670 if (!(roothub_a & RH_A_NPS)) {
1671 int temp; /* power down each port */
1672 for (temp = 0; temp < u132->num_ports; temp++) {
1673 retval = u132_write_pcimem(u132,
1674 roothub.portstatus[temp], RH_PS_LSDA);
1675 if (retval)
1676 return retval;
1677 }
1678 }
1679 retval = u132_read_pcimem(u132, control, &control);
1680 if (retval)
1681 return retval;
1682 retry:retval = u132_read_pcimem(u132, cmdstatus, &status);
1683 if (retval)
1684 return retval;
1685 retval = u132_write_pcimem(u132, cmdstatus, OHCI_HCR);
1686 if (retval)
1687 return retval;
1688 extra:{
1689 retval = u132_read_pcimem(u132, cmdstatus, &status);
1690 if (retval)
1691 return retval;
1692 if (0 != (status & OHCI_HCR)) {
1693 if (--reset_timeout == 0) {
1694 dev_err(&u132->platform_dev->dev, "USB HC reset"
1695 " timed out!\n");
1696 return -ENODEV;
1697 } else {
1698 msleep(5);
1699 goto extra;
1700 }
1701 }
1702 }
1703 if (u132->flags & OHCI_QUIRK_INITRESET) {
1704 retval = u132_write_pcimem(u132, control, u132->hc_control);
1705 if (retval)
1706 return retval;
1707 retval = u132_read_pcimem(u132, control, &control);
1708 if (retval)
1709 return retval;
1710 }
1711 retval = u132_write_pcimem(u132, ed_controlhead, 0x00000000);
1712 if (retval)
1713 return retval;
1714 retval = u132_write_pcimem(u132, ed_bulkhead, 0x11000000);
1715 if (retval)
1716 return retval;
1717 retval = u132_write_pcimem(u132, hcca, 0x00000000);
1718 if (retval)
1719 return retval;
1720 retval = u132_periodic_reinit(u132);
1721 if (retval)
1722 return retval;
1723 retval = u132_read_pcimem(u132, fminterval, &fminterval);
1724 if (retval)
1725 return retval;
1726 retval = u132_read_pcimem(u132, periodicstart, &periodicstart);
1727 if (retval)
1728 return retval;
1729 if (0 == (fminterval & 0x3fff0000) || 0 == periodicstart) {
1730 if (!(u132->flags & OHCI_QUIRK_INITRESET)) {
1731 u132->flags |= OHCI_QUIRK_INITRESET;
1732 goto retry;
1733 } else
1734 dev_err(&u132->platform_dev->dev, "init err(%08x %04x)"
1735 "\n", fminterval, periodicstart);
1736 } /* start controller operations */
1737 u132->hc_control &= OHCI_CTRL_RWC;
1738 u132->hc_control |= OHCI_CONTROL_INIT | OHCI_CTRL_BLE | OHCI_USB_OPER;
1739 retval = u132_write_pcimem(u132, control, u132->hc_control);
1740 if (retval)
1741 return retval;
1742 retval = u132_write_pcimem(u132, cmdstatus, OHCI_BLF);
1743 if (retval)
1744 return retval;
1745 retval = u132_read_pcimem(u132, cmdstatus, &cmdstatus);
1746 if (retval)
1747 return retval;
1748 retval = u132_read_pcimem(u132, control, &control);
1749 if (retval)
1750 return retval;
1751 u132_to_hcd(u132)->state = HC_STATE_RUNNING;
1752 retval = u132_write_pcimem(u132, roothub.status, RH_HS_DRWE);
1753 if (retval)
1754 return retval;
1755 retval = u132_write_pcimem(u132, intrstatus, mask);
1756 if (retval)
1757 return retval;
1758 retval = u132_write_pcimem(u132, intrdisable,
1759 OHCI_INTR_MIE | OHCI_INTR_OC | OHCI_INTR_RHSC | OHCI_INTR_FNO |
1760 OHCI_INTR_UE | OHCI_INTR_RD | OHCI_INTR_SF | OHCI_INTR_WDH |
1761 OHCI_INTR_SO);
1762 if (retval)
1763 return retval; /* handle root hub init quirks ... */
1764 retval = u132_read_pcimem(u132, roothub.a, &roothub_a);
1765 if (retval)
1766 return retval;
1767 roothub_a &= ~(RH_A_PSM | RH_A_OCPM);
1768 if (u132->flags & OHCI_QUIRK_SUPERIO) {
1769 roothub_a |= RH_A_NOCP;
1770 roothub_a &= ~(RH_A_POTPGT | RH_A_NPS);
1771 retval = u132_write_pcimem(u132, roothub.a, roothub_a);
1772 if (retval)
1773 return retval;
1774 } else if ((u132->flags & OHCI_QUIRK_AMD756) || distrust_firmware) {
1775 roothub_a |= RH_A_NPS;
1776 retval = u132_write_pcimem(u132, roothub.a, roothub_a);
1777 if (retval)
1778 return retval;
1779 }
1780 retval = u132_write_pcimem(u132, roothub.status, RH_HS_LPSC);
1781 if (retval)
1782 return retval;
1783 retval = u132_write_pcimem(u132, roothub.b,
1784 (roothub_a & RH_A_NPS) ? 0 : RH_B_PPCM);
1785 if (retval)
1786 return retval;
1787 retval = u132_read_pcimem(u132, control, &control);
1788 if (retval)
1789 return retval;
1790 mdelay((roothub_a >> 23) & 0x1fe);
1791 u132_to_hcd(u132)->state = HC_STATE_RUNNING;
1792 return 0;
1793 }
1794
1795 static void u132_hcd_stop(struct usb_hcd *hcd)
1796 {
1797 struct u132 *u132 = hcd_to_u132(hcd);
1798 if (u132->going > 1) {
1799 dev_err(&u132->platform_dev->dev, "u132 device %p(hcd=%p) has b"
1800 "een removed %d\n", u132, hcd, u132->going);
1801 } else if (u132->going > 0) {
1802 dev_err(&u132->platform_dev->dev, "device hcd=%p is being remov"
1803 "ed\n", hcd);
1804 } else {
1805 down(&u132->sw_lock);
1806 msleep(100);
1807 u132_power(u132, 0);
1808 up(&u132->sw_lock);
1809 }
1810 }
1811
1812 static int u132_hcd_start(struct usb_hcd *hcd)
1813 {
1814 struct u132 *u132 = hcd_to_u132(hcd);
1815 if (u132->going > 1) {
1816 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1817 , u132->going);
1818 return -ENODEV;
1819 } else if (u132->going > 0) {
1820 dev_err(&u132->platform_dev->dev, "device is being removed\n");
1821 return -ESHUTDOWN;
1822 } else if (hcd->self.controller) {
1823 int retval;
1824 struct platform_device *pdev =
1825 to_platform_device(hcd->self.controller);
1826 u16 vendor = ((struct u132_platform_data *)
1827 (pdev->dev.platform_data))->vendor;
1828 u16 device = ((struct u132_platform_data *)
1829 (pdev->dev.platform_data))->device;
1830 down(&u132->sw_lock);
1831 msleep(10);
1832 if (vendor == PCI_VENDOR_ID_AMD && device == 0x740c) {
1833 u132->flags = OHCI_QUIRK_AMD756;
1834 } else if (vendor == PCI_VENDOR_ID_OPTI && device == 0xc861) {
1835 dev_err(&u132->platform_dev->dev, "WARNING: OPTi workar"
1836 "ounds unavailable\n");
1837 } else if (vendor == PCI_VENDOR_ID_COMPAQ && device == 0xa0f8)
1838 u132->flags |= OHCI_QUIRK_ZFMICRO;
1839 retval = u132_run(u132);
1840 if (retval) {
1841 u132_disable(u132);
1842 u132->going = 1;
1843 }
1844 msleep(100);
1845 up(&u132->sw_lock);
1846 return retval;
1847 } else {
1848 dev_err(&u132->platform_dev->dev, "platform_device missing\n");
1849 return -ENODEV;
1850 }
1851 }
1852
1853 static int u132_hcd_reset(struct usb_hcd *hcd)
1854 {
1855 struct u132 *u132 = hcd_to_u132(hcd);
1856 if (u132->going > 1) {
1857 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1858 , u132->going);
1859 return -ENODEV;
1860 } else if (u132->going > 0) {
1861 dev_err(&u132->platform_dev->dev, "device is being removed\n");
1862 return -ESHUTDOWN;
1863 } else {
1864 int retval;
1865 down(&u132->sw_lock);
1866 retval = u132_init(u132);
1867 if (retval) {
1868 u132_disable(u132);
1869 u132->going = 1;
1870 }
1871 up(&u132->sw_lock);
1872 return retval;
1873 }
1874 }
1875
1876 static int create_endpoint_and_queue_int(struct u132 *u132,
1877 struct u132_udev *udev, struct usb_host_endpoint *hep, struct urb *urb,
1878 struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp, u8 address,
1879 gfp_t mem_flags)
1880 {
1881 struct u132_ring *ring;
1882 unsigned long irqs;
1883 u8 endp_number = ++u132->num_endpoints;
1884 struct u132_endp *endp = hep->hcpriv = u132->endp[endp_number - 1] =
1885 kmalloc(sizeof(struct u132_endp), mem_flags);
1886 if (!endp) {
1887 return -ENOMEM;
1888 }
1889 INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
1890 spin_lock_init(&endp->queue_lock.slock);
1891 INIT_LIST_HEAD(&endp->urb_more);
1892 ring = endp->ring = &u132->ring[0];
1893 if (ring->curr_endp) {
1894 list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
1895 } else {
1896 INIT_LIST_HEAD(&endp->endp_ring);
1897 ring->curr_endp = endp;
1898 }
1899 ring->length += 1;
1900 endp->dequeueing = 0;
1901 endp->edset_flush = 0;
1902 endp->active = 0;
1903 endp->delayed = 0;
1904 endp->endp_number = endp_number;
1905 endp->u132 = u132;
1906 endp->hep = hep;
1907 endp->pipetype = usb_pipetype(urb->pipe);
1908 u132_endp_init_kref(u132, endp);
1909 if (usb_pipein(urb->pipe)) {
1910 endp->toggle_bits = 0x2;
1911 usb_settoggle(udev->usb_device, usb_endp, 0, 0);
1912 endp->input = 1;
1913 endp->output = 0;
1914 udev->endp_number_in[usb_endp] = endp_number;
1915 u132_udev_get_kref(u132, udev);
1916 } else {
1917 endp->toggle_bits = 0x2;
1918 usb_settoggle(udev->usb_device, usb_endp, 1, 0);
1919 endp->input = 0;
1920 endp->output = 1;
1921 udev->endp_number_out[usb_endp] = endp_number;
1922 u132_udev_get_kref(u132, udev);
1923 }
1924 urb->hcpriv = u132;
1925 spin_lock_irqsave(&endp->queue_lock.slock, irqs);
1926 endp->delayed = 1;
1927 endp->jiffies = jiffies + msecs_to_jiffies(urb->interval);
1928 endp->udev_number = address;
1929 endp->usb_addr = usb_addr;
1930 endp->usb_endp = usb_endp;
1931 endp->queue_size = 1;
1932 endp->queue_last = 0;
1933 endp->queue_next = 0;
1934 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
1935 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
1936 u132_endp_queue_work(u132, endp, msecs_to_jiffies(urb->interval));
1937 return 0;
1938 }
1939
1940 static int queue_int_on_old_endpoint(struct u132 *u132, struct u132_udev *udev,
1941 struct usb_host_endpoint *hep, struct urb *urb,
1942 struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
1943 u8 usb_endp, u8 address)
1944 {
1945 urb->hcpriv = u132;
1946 endp->delayed = 1;
1947 endp->jiffies = jiffies + msecs_to_jiffies(urb->interval);
1948 if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
1949 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
1950 } else {
1951 struct u132_urbq *urbq = kmalloc(sizeof(struct u132_urbq),
1952 GFP_ATOMIC);
1953 if (urbq == NULL) {
1954 endp->queue_size -= 1;
1955 return -ENOMEM;
1956 } else {
1957 list_add_tail(&urbq->urb_more, &endp->urb_more);
1958 urbq->urb = urb;
1959 }
1960 }
1961 return 0;
1962 }
1963
1964 static int create_endpoint_and_queue_bulk(struct u132 *u132,
1965 struct u132_udev *udev, struct usb_host_endpoint *hep, struct urb *urb,
1966 struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp, u8 address,
1967 gfp_t mem_flags)
1968 {
1969 int ring_number;
1970 struct u132_ring *ring;
1971 unsigned long irqs;
1972 u8 endp_number = ++u132->num_endpoints;
1973 struct u132_endp *endp = hep->hcpriv = u132->endp[endp_number - 1] =
1974 kmalloc(sizeof(struct u132_endp), mem_flags);
1975 if (!endp) {
1976 return -ENOMEM;
1977 }
1978 INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
1979 spin_lock_init(&endp->queue_lock.slock);
1980 INIT_LIST_HEAD(&endp->urb_more);
1981 endp->dequeueing = 0;
1982 endp->edset_flush = 0;
1983 endp->active = 0;
1984 endp->delayed = 0;
1985 endp->endp_number = endp_number;
1986 endp->u132 = u132;
1987 endp->hep = hep;
1988 endp->pipetype = usb_pipetype(urb->pipe);
1989 u132_endp_init_kref(u132, endp);
1990 if (usb_pipein(urb->pipe)) {
1991 endp->toggle_bits = 0x2;
1992 usb_settoggle(udev->usb_device, usb_endp, 0, 0);
1993 ring_number = 3;
1994 endp->input = 1;
1995 endp->output = 0;
1996 udev->endp_number_in[usb_endp] = endp_number;
1997 u132_udev_get_kref(u132, udev);
1998 } else {
1999 endp->toggle_bits = 0x2;
2000 usb_settoggle(udev->usb_device, usb_endp, 1, 0);
2001 ring_number = 2;
2002 endp->input = 0;
2003 endp->output = 1;
2004 udev->endp_number_out[usb_endp] = endp_number;
2005 u132_udev_get_kref(u132, udev);
2006 }
2007 ring = endp->ring = &u132->ring[ring_number - 1];
2008 if (ring->curr_endp) {
2009 list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
2010 } else {
2011 INIT_LIST_HEAD(&endp->endp_ring);
2012 ring->curr_endp = endp;
2013 }
2014 ring->length += 1;
2015 urb->hcpriv = u132;
2016 spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2017 endp->udev_number = address;
2018 endp->usb_addr = usb_addr;
2019 endp->usb_endp = usb_endp;
2020 endp->queue_size = 1;
2021 endp->queue_last = 0;
2022 endp->queue_next = 0;
2023 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2024 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2025 u132_endp_queue_work(u132, endp, 0);
2026 return 0;
2027 }
2028
2029 static int queue_bulk_on_old_endpoint(struct u132 *u132, struct u132_udev *udev,
2030 struct usb_host_endpoint *hep, struct urb *urb,
2031 struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
2032 u8 usb_endp, u8 address)
2033 {
2034 urb->hcpriv = u132;
2035 if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2036 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2037 } else {
2038 struct u132_urbq *urbq = kmalloc(sizeof(struct u132_urbq),
2039 GFP_ATOMIC);
2040 if (urbq == NULL) {
2041 endp->queue_size -= 1;
2042 return -ENOMEM;
2043 } else {
2044 list_add_tail(&urbq->urb_more, &endp->urb_more);
2045 urbq->urb = urb;
2046 }
2047 }
2048 return 0;
2049 }
2050
2051 static int create_endpoint_and_queue_control(struct u132 *u132,
2052 struct usb_host_endpoint *hep, struct urb *urb,
2053 struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp,
2054 gfp_t mem_flags)
2055 {
2056 struct u132_ring *ring;
2057 u8 endp_number = ++u132->num_endpoints;
2058 struct u132_endp *endp = hep->hcpriv = u132->endp[endp_number - 1] =
2059 kmalloc(sizeof(struct u132_endp), mem_flags);
2060 if (!endp) {
2061 return -ENOMEM;
2062 }
2063 INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
2064 spin_lock_init(&endp->queue_lock.slock);
2065 INIT_LIST_HEAD(&endp->urb_more);
2066 ring = endp->ring = &u132->ring[0];
2067 if (ring->curr_endp) {
2068 list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
2069 } else {
2070 INIT_LIST_HEAD(&endp->endp_ring);
2071 ring->curr_endp = endp;
2072 }
2073 ring->length += 1;
2074 endp->dequeueing = 0;
2075 endp->edset_flush = 0;
2076 endp->active = 0;
2077 endp->delayed = 0;
2078 endp->endp_number = endp_number;
2079 endp->u132 = u132;
2080 endp->hep = hep;
2081 u132_endp_init_kref(u132, endp);
2082 u132_endp_get_kref(u132, endp);
2083 if (usb_addr == 0) {
2084 unsigned long irqs;
2085 u8 address = u132->addr[usb_addr].address;
2086 struct u132_udev *udev = &u132->udev[address];
2087 endp->udev_number = address;
2088 endp->usb_addr = usb_addr;
2089 endp->usb_endp = usb_endp;
2090 endp->input = 1;
2091 endp->output = 1;
2092 endp->pipetype = usb_pipetype(urb->pipe);
2093 u132_udev_init_kref(u132, udev);
2094 u132_udev_get_kref(u132, udev);
2095 udev->endp_number_in[usb_endp] = endp_number;
2096 udev->endp_number_out[usb_endp] = endp_number;
2097 urb->hcpriv = u132;
2098 spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2099 endp->queue_size = 1;
2100 endp->queue_last = 0;
2101 endp->queue_next = 0;
2102 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2103 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2104 u132_endp_queue_work(u132, endp, 0);
2105 return 0;
2106 } else { /*(usb_addr > 0) */
2107 unsigned long irqs;
2108 u8 address = u132->addr[usb_addr].address;
2109 struct u132_udev *udev = &u132->udev[address];
2110 endp->udev_number = address;
2111 endp->usb_addr = usb_addr;
2112 endp->usb_endp = usb_endp;
2113 endp->input = 1;
2114 endp->output = 1;
2115 endp->pipetype = usb_pipetype(urb->pipe);
2116 u132_udev_get_kref(u132, udev);
2117 udev->enumeration = 2;
2118 udev->endp_number_in[usb_endp] = endp_number;
2119 udev->endp_number_out[usb_endp] = endp_number;
2120 urb->hcpriv = u132;
2121 spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2122 endp->queue_size = 1;
2123 endp->queue_last = 0;
2124 endp->queue_next = 0;
2125 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2126 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2127 u132_endp_queue_work(u132, endp, 0);
2128 return 0;
2129 }
2130 }
2131
2132 static int queue_control_on_old_endpoint(struct u132 *u132,
2133 struct usb_host_endpoint *hep, struct urb *urb,
2134 struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
2135 u8 usb_endp)
2136 {
2137 if (usb_addr == 0) {
2138 if (usb_pipein(urb->pipe)) {
2139 urb->hcpriv = u132;
2140 if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2141 endp->urb_list[ENDP_QUEUE_MASK &
2142 endp->queue_last++] = urb;
2143 } else {
2144 struct u132_urbq *urbq =
2145 kmalloc(sizeof(struct u132_urbq),
2146 GFP_ATOMIC);
2147 if (urbq == NULL) {
2148 endp->queue_size -= 1;
2149 return -ENOMEM;
2150 } else {
2151 list_add_tail(&urbq->urb_more,
2152 &endp->urb_more);
2153 urbq->urb = urb;
2154 }
2155 }
2156 return 0;
2157 } else { /* usb_pipeout(urb->pipe) */
2158 struct u132_addr *addr = &u132->addr[usb_dev->devnum];
2159 int I = MAX_U132_UDEVS;
2160 int i = 0;
2161 while (--I > 0) {
2162 struct u132_udev *udev = &u132->udev[++i];
2163 if (udev->usb_device) {
2164 continue;
2165 } else {
2166 udev->enumeration = 1;
2167 u132->addr[0].address = i;
2168 endp->udev_number = i;
2169 udev->udev_number = i;
2170 udev->usb_addr = usb_dev->devnum;
2171 u132_udev_init_kref(u132, udev);
2172 udev->endp_number_in[usb_endp] =
2173 endp->endp_number;
2174 u132_udev_get_kref(u132, udev);
2175 udev->endp_number_out[usb_endp] =
2176 endp->endp_number;
2177 udev->usb_device = usb_dev;
2178 ((u8 *) (urb->setup_packet))[2] =
2179 addr->address = i;
2180 u132_udev_get_kref(u132, udev);
2181 break;
2182 }
2183 }
2184 if (I == 0) {
2185 dev_err(&u132->platform_dev->dev, "run out of d"
2186 "evice space\n");
2187 return -EINVAL;
2188 }
2189 urb->hcpriv = u132;
2190 if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2191 endp->urb_list[ENDP_QUEUE_MASK &
2192 endp->queue_last++] = urb;
2193 } else {
2194 struct u132_urbq *urbq =
2195 kmalloc(sizeof(struct u132_urbq),
2196 GFP_ATOMIC);
2197 if (urbq == NULL) {
2198 endp->queue_size -= 1;
2199 return -ENOMEM;
2200 } else {
2201 list_add_tail(&urbq->urb_more,
2202 &endp->urb_more);
2203 urbq->urb = urb;
2204 }
2205 }
2206 return 0;
2207 }
2208 } else { /*(usb_addr > 0) */
2209 u8 address = u132->addr[usb_addr].address;
2210 struct u132_udev *udev = &u132->udev[address];
2211 urb->hcpriv = u132;
2212 if (udev->enumeration == 2) {
2213 } else
2214 udev->enumeration = 2;
2215 if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2216 endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
2217 urb;
2218 } else {
2219 struct u132_urbq *urbq =
2220 kmalloc(sizeof(struct u132_urbq), GFP_ATOMIC);
2221 if (urbq == NULL) {
2222 endp->queue_size -= 1;
2223 return -ENOMEM;
2224 } else {
2225 list_add_tail(&urbq->urb_more, &endp->urb_more);
2226 urbq->urb = urb;
2227 }
2228 }
2229 return 0;
2230 }
2231 }
2232
2233 static int u132_urb_enqueue(struct usb_hcd *hcd, struct usb_host_endpoint *hep,
2234 struct urb *urb, gfp_t mem_flags)
2235 {
2236 struct u132 *u132 = hcd_to_u132(hcd);
2237 if (irqs_disabled()) {
2238 if (__GFP_WAIT & mem_flags) {
2239 printk(KERN_ERR "invalid context for function that migh"
2240 "t sleep\n");
2241 return -EINVAL;
2242 }
2243 }
2244 if (u132->going > 1) {
2245 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2246 , u132->going);
2247 return -ENODEV;
2248 } else if (u132->going > 0) {
2249 dev_err(&u132->platform_dev->dev, "device is being removed urb="
2250 "%p status=%d\n", urb, urb->status);
2251 return -ESHUTDOWN;
2252 } else {
2253 u8 usb_addr = usb_pipedevice(urb->pipe);
2254 u8 usb_endp = usb_pipeendpoint(urb->pipe);
2255 struct usb_device *usb_dev = urb->dev;
2256 if (usb_pipetype(urb->pipe) == PIPE_INTERRUPT) {
2257 u8 address = u132->addr[usb_addr].address;
2258 struct u132_udev *udev = &u132->udev[address];
2259 struct u132_endp *endp = hep->hcpriv;
2260 urb->actual_length = 0;
2261 if (endp) {
2262 unsigned long irqs;
2263 int retval;
2264 spin_lock_irqsave(&endp->queue_lock.slock,
2265 irqs);
2266 retval = queue_int_on_old_endpoint(u132, udev,
2267 hep, urb, usb_dev, endp, usb_addr,
2268 usb_endp, address);
2269 spin_unlock_irqrestore(&endp->queue_lock.slock,
2270 irqs);
2271 if (retval) {
2272 return retval;
2273 } else {
2274 u132_endp_queue_work(u132, endp,
2275 msecs_to_jiffies(urb->interval))
2276 ;
2277 return 0;
2278 }
2279 } else if (u132->num_endpoints == MAX_U132_ENDPS) {
2280 return -EINVAL;
2281 } else { /*(endp == NULL) */
2282 return create_endpoint_and_queue_int(u132, udev,
2283 hep, urb, usb_dev, usb_addr, usb_endp,
2284 address, mem_flags);
2285 }
2286 } else if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
2287 dev_err(&u132->platform_dev->dev, "the hardware does no"
2288 "t support PIPE_ISOCHRONOUS\n");
2289 return -EINVAL;
2290 } else if (usb_pipetype(urb->pipe) == PIPE_BULK) {
2291 u8 address = u132->addr[usb_addr].address;
2292 struct u132_udev *udev = &u132->udev[address];
2293 struct u132_endp *endp = hep->hcpriv;
2294 urb->actual_length = 0;
2295 if (endp) {
2296 unsigned long irqs;
2297 int retval;
2298 spin_lock_irqsave(&endp->queue_lock.slock,
2299 irqs);
2300 retval = queue_bulk_on_old_endpoint(u132, udev,
2301 hep, urb, usb_dev, endp, usb_addr,
2302 usb_endp, address);
2303 spin_unlock_irqrestore(&endp->queue_lock.slock,
2304 irqs);
2305 if (retval) {
2306 return retval;
2307 } else {
2308 u132_endp_queue_work(u132, endp, 0);
2309 return 0;
2310 }
2311 } else if (u132->num_endpoints == MAX_U132_ENDPS) {
2312 return -EINVAL;
2313 } else
2314 return create_endpoint_and_queue_bulk(u132,
2315 udev, hep, urb, usb_dev, usb_addr,
2316 usb_endp, address, mem_flags);
2317 } else {
2318 struct u132_endp *endp = hep->hcpriv;
2319 u16 urb_size = 8;
2320 u8 *b = urb->setup_packet;
2321 int i = 0;
2322 char data[30 *3 + 4];
2323 char *d = data;
2324 int m = (sizeof(data) - 1) / 3;
2325 int l = 0;
2326 data[0] = 0;
2327 while (urb_size-- > 0) {
2328 if (i > m) {
2329 } else if (i++ < m) {
2330 int w = sprintf(d, " %02X", *b++);
2331 d += w;
2332 l += w;
2333 } else
2334 d += sprintf(d, " ..");
2335 }
2336 if (endp) {
2337 unsigned long irqs;
2338 int retval;
2339 spin_lock_irqsave(&endp->queue_lock.slock,
2340 irqs);
2341 retval = queue_control_on_old_endpoint(u132,
2342 hep, urb, usb_dev, endp, usb_addr,
2343 usb_endp);
2344 spin_unlock_irqrestore(&endp->queue_lock.slock,
2345 irqs);
2346 if (retval) {
2347 return retval;
2348 } else {
2349 u132_endp_queue_work(u132, endp, 0);
2350 return 0;
2351 }
2352 } else if (u132->num_endpoints == MAX_U132_ENDPS) {
2353 return -EINVAL;
2354 } else
2355 return create_endpoint_and_queue_control(u132,
2356 hep, urb, usb_dev, usb_addr, usb_endp,
2357 mem_flags);
2358 }
2359 }
2360 }
2361
2362 static int dequeue_from_overflow_chain(struct u132 *u132,
2363 struct u132_endp *endp, struct urb *urb)
2364 {
2365 struct list_head *scan;
2366 struct list_head *head = &endp->urb_more;
2367 list_for_each(scan, head) {
2368 struct u132_urbq *urbq = list_entry(scan, struct u132_urbq,
2369 urb_more);
2370 if (urbq->urb == urb) {
2371 struct usb_hcd *hcd = u132_to_hcd(u132);
2372 list_del(scan);
2373 endp->queue_size -= 1;
2374 urb->error_count = 0;
2375 urb->hcpriv = NULL;
2376 usb_hcd_giveback_urb(hcd, urb);
2377 return 0;
2378 } else
2379 continue;
2380 }
2381 dev_err(&u132->platform_dev->dev, "urb=%p not found in endp[%d]=%p ring"
2382 "[%d] %c%c usb_endp=%d usb_addr=%d size=%d next=%04X last=%04X"
2383 "\n", urb, endp->endp_number, endp, endp->ring->number,
2384 endp->input ? 'I' : ' ', endp->output ? 'O' : ' ',
2385 endp->usb_endp, endp->usb_addr, endp->queue_size,
2386 endp->queue_next, endp->queue_last);
2387 return -EINVAL;
2388 }
2389
2390 static int u132_endp_urb_dequeue(struct u132 *u132, struct u132_endp *endp,
2391 struct urb *urb)
2392 {
2393 unsigned long irqs;
2394 spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2395 if (endp->queue_size == 0) {
2396 dev_err(&u132->platform_dev->dev, "urb=%p not found in endp[%d]"
2397 "=%p ring[%d] %c%c usb_endp=%d usb_addr=%d\n", urb,
2398 endp->endp_number, endp, endp->ring->number,
2399 endp->input ? 'I' : ' ', endp->output ? 'O' : ' ',
2400 endp->usb_endp, endp->usb_addr);
2401 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2402 return -EINVAL;
2403 }
2404 if (urb == endp->urb_list[ENDP_QUEUE_MASK & endp->queue_next]) {
2405 if (endp->active) {
2406 endp->dequeueing = 1;
2407 endp->edset_flush = 1;
2408 u132_endp_queue_work(u132, endp, 0);
2409 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2410 urb->hcpriv = NULL;
2411 return 0;
2412 } else {
2413 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2414 u132_hcd_abandon_urb(u132, endp, urb, urb->status);
2415 return 0;
2416 }
2417 } else {
2418 u16 queue_list = 0;
2419 u16 queue_size = endp->queue_size;
2420 u16 queue_scan = endp->queue_next;
2421 struct urb **urb_slot = NULL;
2422 while (++queue_list < ENDP_QUEUE_SIZE && --queue_size > 0) {
2423 if (urb == endp->urb_list[ENDP_QUEUE_MASK &
2424 ++queue_scan]) {
2425 urb_slot = &endp->urb_list[ENDP_QUEUE_MASK &
2426 queue_scan];
2427 break;
2428 } else
2429 continue;
2430 }
2431 while (++queue_list < ENDP_QUEUE_SIZE && --queue_size > 0) {
2432 *urb_slot = endp->urb_list[ENDP_QUEUE_MASK &
2433 ++queue_scan];
2434 urb_slot = &endp->urb_list[ENDP_QUEUE_MASK &
2435 queue_scan];
2436 }
2437 if (urb_slot) {
2438 struct usb_hcd *hcd = u132_to_hcd(u132);
2439 endp->queue_size -= 1;
2440 if (list_empty(&endp->urb_more)) {
2441 spin_unlock_irqrestore(&endp->queue_lock.slock,
2442 irqs);
2443 } else {
2444 struct list_head *next = endp->urb_more.next;
2445 struct u132_urbq *urbq = list_entry(next,
2446 struct u132_urbq, urb_more);
2447 list_del(next);
2448 *urb_slot = urbq->urb;
2449 spin_unlock_irqrestore(&endp->queue_lock.slock,
2450 irqs);
2451 kfree(urbq);
2452 } urb->error_count = 0;
2453 urb->hcpriv = NULL;
2454 usb_hcd_giveback_urb(hcd, urb);
2455 return 0;
2456 } else if (list_empty(&endp->urb_more)) {
2457 dev_err(&u132->platform_dev->dev, "urb=%p not found in "
2458 "endp[%d]=%p ring[%d] %c%c usb_endp=%d usb_addr"
2459 "=%d size=%d next=%04X last=%04X\n", urb,
2460 endp->endp_number, endp, endp->ring->number,
2461 endp->input ? 'I' : ' ',
2462 endp->output ? 'O' : ' ', endp->usb_endp,
2463 endp->usb_addr, endp->queue_size,
2464 endp->queue_next, endp->queue_last);
2465 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2466 return -EINVAL;
2467 } else {
2468 int retval = dequeue_from_overflow_chain(u132, endp,
2469 urb);
2470 spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2471 return retval;
2472 }
2473 }
2474 }
2475
2476 static int u132_urb_dequeue(struct usb_hcd *hcd, struct urb *urb)
2477 {
2478 struct u132 *u132 = hcd_to_u132(hcd);
2479 if (u132->going > 2) {
2480 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2481 , u132->going);
2482 return -ENODEV;
2483 } else {
2484 u8 usb_addr = usb_pipedevice(urb->pipe);
2485 u8 usb_endp = usb_pipeendpoint(urb->pipe);
2486 u8 address = u132->addr[usb_addr].address;
2487 struct u132_udev *udev = &u132->udev[address];
2488 if (usb_pipein(urb->pipe)) {
2489 u8 endp_number = udev->endp_number_in[usb_endp];
2490 struct u132_endp *endp = u132->endp[endp_number - 1];
2491 return u132_endp_urb_dequeue(u132, endp, urb);
2492 } else {
2493 u8 endp_number = udev->endp_number_out[usb_endp];
2494 struct u132_endp *endp = u132->endp[endp_number - 1];
2495 return u132_endp_urb_dequeue(u132, endp, urb);
2496 }
2497 }
2498 }
2499
2500 static void u132_endpoint_disable(struct usb_hcd *hcd,
2501 struct usb_host_endpoint *hep)
2502 {
2503 struct u132 *u132 = hcd_to_u132(hcd);
2504 if (u132->going > 2) {
2505 dev_err(&u132->platform_dev->dev, "u132 device %p(hcd=%p hep=%p"
2506 ") has been removed %d\n", u132, hcd, hep,
2507 u132->going);
2508 } else {
2509 struct u132_endp *endp = hep->hcpriv;
2510 if (endp)
2511 u132_endp_put_kref(u132, endp);
2512 }
2513 }
2514
2515 static int u132_get_frame(struct usb_hcd *hcd)
2516 {
2517 struct u132 *u132 = hcd_to_u132(hcd);
2518 if (u132->going > 1) {
2519 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2520 , u132->going);
2521 return -ENODEV;
2522 } else if (u132->going > 0) {
2523 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2524 return -ESHUTDOWN;
2525 } else {
2526 int frame = 0;
2527 dev_err(&u132->platform_dev->dev, "TODO: u132_get_frame\n");
2528 msleep(100);
2529 return frame;
2530 }
2531 }
2532
2533 static int u132_roothub_descriptor(struct u132 *u132,
2534 struct usb_hub_descriptor *desc)
2535 {
2536 int retval;
2537 u16 temp;
2538 u32 rh_a = -1;
2539 u32 rh_b = -1;
2540 retval = u132_read_pcimem(u132, roothub.a, &rh_a);
2541 if (retval)
2542 return retval;
2543 desc->bDescriptorType = 0x29;
2544 desc->bPwrOn2PwrGood = (rh_a & RH_A_POTPGT) >> 24;
2545 desc->bHubContrCurrent = 0;
2546 desc->bNbrPorts = u132->num_ports;
2547 temp = 1 + (u132->num_ports / 8);
2548 desc->bDescLength = 7 + 2 *temp;
2549 temp = 0;
2550 if (rh_a & RH_A_NPS)
2551 temp |= 0x0002;
2552 if (rh_a & RH_A_PSM)
2553 temp |= 0x0001;
2554 if (rh_a & RH_A_NOCP) {
2555 temp |= 0x0010;
2556 } else if (rh_a & RH_A_OCPM)
2557 temp |= 0x0008;
2558 desc->wHubCharacteristics = cpu_to_le16(temp);
2559 retval = u132_read_pcimem(u132, roothub.b, &rh_b);
2560 if (retval)
2561 return retval;
2562 memset(desc->bitmap, 0xff, sizeof(desc->bitmap));
2563 desc->bitmap[0] = rh_b & RH_B_DR;
2564 if (u132->num_ports > 7) {
2565 desc->bitmap[1] = (rh_b & RH_B_DR) >> 8;
2566 desc->bitmap[2] = 0xff;
2567 } else
2568 desc->bitmap[1] = 0xff;
2569 return 0;
2570 }
2571
2572 static int u132_roothub_status(struct u132 *u132, __le32 *desc)
2573 {
2574 u32 rh_status = -1;
2575 int ret_status = u132_read_pcimem(u132, roothub.status, &rh_status);
2576 *desc = cpu_to_le32(rh_status);
2577 return ret_status;
2578 }
2579
2580 static int u132_roothub_portstatus(struct u132 *u132, __le32 *desc, u16 wIndex)
2581 {
2582 if (wIndex == 0 || wIndex > u132->num_ports) {
2583 return -EINVAL;
2584 } else {
2585 int port = wIndex - 1;
2586 u32 rh_portstatus = -1;
2587 int ret_portstatus = u132_read_pcimem(u132,
2588 roothub.portstatus[port], &rh_portstatus);
2589 *desc = cpu_to_le32(rh_portstatus);
2590 if (*(u16 *) (desc + 2)) {
2591 dev_info(&u132->platform_dev->dev, "Port %d Status Chan"
2592 "ge = %08X\n", port, *desc);
2593 }
2594 return ret_portstatus;
2595 }
2596 }
2597
2598
2599 /* this timer value might be vendor-specific ... */
2600 #define PORT_RESET_HW_MSEC 10
2601 #define PORT_RESET_MSEC 10
2602 /* wrap-aware logic morphed from <linux/jiffies.h> */
2603 #define tick_before(t1, t2) ((s16)(((s16)(t1))-((s16)(t2))) < 0)
2604 static int u132_roothub_portreset(struct u132 *u132, int port_index)
2605 {
2606 int retval;
2607 u32 fmnumber;
2608 u16 now;
2609 u16 reset_done;
2610 retval = u132_read_pcimem(u132, fmnumber, &fmnumber);
2611 if (retval)
2612 return retval;
2613 now = fmnumber;
2614 reset_done = now + PORT_RESET_MSEC;
2615 do {
2616 u32 portstat;
2617 do {
2618 retval = u132_read_pcimem(u132,
2619 roothub.portstatus[port_index], &portstat);
2620 if (retval)
2621 return retval;
2622 if (RH_PS_PRS & portstat) {
2623 continue;
2624 } else
2625 break;
2626 } while (tick_before(now, reset_done));
2627 if (RH_PS_PRS & portstat)
2628 return -ENODEV;
2629 if (RH_PS_CCS & portstat) {
2630 if (RH_PS_PRSC & portstat) {
2631 retval = u132_write_pcimem(u132,
2632 roothub.portstatus[port_index],
2633 RH_PS_PRSC);
2634 if (retval)
2635 return retval;
2636 }
2637 } else
2638 break; /* start the next reset,
2639 sleep till it's probably done */
2640 retval = u132_write_pcimem(u132, roothub.portstatus[port_index],
2641 RH_PS_PRS);
2642 if (retval)
2643 return retval;
2644 msleep(PORT_RESET_HW_MSEC);
2645 retval = u132_read_pcimem(u132, fmnumber, &fmnumber);
2646 if (retval)
2647 return retval;
2648 now = fmnumber;
2649 } while (tick_before(now, reset_done));
2650 return 0;
2651 }
2652
2653 static int u132_roothub_setportfeature(struct u132 *u132, u16 wValue,
2654 u16 wIndex)
2655 {
2656 if (wIndex == 0 || wIndex > u132->num_ports) {
2657 return -EINVAL;
2658 } else {
2659 int retval;
2660 int port_index = wIndex - 1;
2661 struct u132_port *port = &u132->port[port_index];
2662 port->Status &= ~(1 << wValue);
2663 switch (wValue) {
2664 case USB_PORT_FEAT_SUSPEND:
2665 retval = u132_write_pcimem(u132,
2666 roothub.portstatus[port_index], RH_PS_PSS);
2667 if (retval)
2668 return retval;
2669 return 0;
2670 case USB_PORT_FEAT_POWER:
2671 retval = u132_write_pcimem(u132,
2672 roothub.portstatus[port_index], RH_PS_PPS);
2673 if (retval)
2674 return retval;
2675 return 0;
2676 case USB_PORT_FEAT_RESET:
2677 retval = u132_roothub_portreset(u132, port_index);
2678 if (retval)
2679 return retval;
2680 return 0;
2681 default:
2682 return -EPIPE;
2683 }
2684 }
2685 }
2686
2687 static int u132_roothub_clearportfeature(struct u132 *u132, u16 wValue,
2688 u16 wIndex)
2689 {
2690 if (wIndex == 0 || wIndex > u132->num_ports) {
2691 return -EINVAL;
2692 } else {
2693 int port_index = wIndex - 1;
2694 u32 temp;
2695 int retval;
2696 struct u132_port *port = &u132->port[port_index];
2697 port->Status &= ~(1 << wValue);
2698 switch (wValue) {
2699 case USB_PORT_FEAT_ENABLE:
2700 temp = RH_PS_CCS;
2701 break;
2702 case USB_PORT_FEAT_C_ENABLE:
2703 temp = RH_PS_PESC;
2704 break;
2705 case USB_PORT_FEAT_SUSPEND:
2706 temp = RH_PS_POCI;
2707 if ((u132->hc_control & OHCI_CTRL_HCFS)
2708 != OHCI_USB_OPER) {
2709 dev_err(&u132->platform_dev->dev, "TODO resume_"
2710 "root_hub\n");
2711 }
2712 break;
2713 case USB_PORT_FEAT_C_SUSPEND:
2714 temp = RH_PS_PSSC;
2715 break;
2716 case USB_PORT_FEAT_POWER:
2717 temp = RH_PS_LSDA;
2718 break;
2719 case USB_PORT_FEAT_C_CONNECTION:
2720 temp = RH_PS_CSC;
2721 break;
2722 case USB_PORT_FEAT_C_OVER_CURRENT:
2723 temp = RH_PS_OCIC;
2724 break;
2725 case USB_PORT_FEAT_C_RESET:
2726 temp = RH_PS_PRSC;
2727 break;
2728 default:
2729 return -EPIPE;
2730 }
2731 retval = u132_write_pcimem(u132, roothub.portstatus[port_index],
2732 temp);
2733 if (retval)
2734 return retval;
2735 return 0;
2736 }
2737 }
2738
2739
2740 /* the virtual root hub timer IRQ checks for hub status*/
2741 static int u132_hub_status_data(struct usb_hcd *hcd, char *buf)
2742 {
2743 struct u132 *u132 = hcd_to_u132(hcd);
2744 if (u132->going > 1) {
2745 dev_err(&u132->platform_dev->dev, "device hcd=%p has been remov"
2746 "ed %d\n", hcd, u132->going);
2747 return -ENODEV;
2748 } else if (u132->going > 0) {
2749 dev_err(&u132->platform_dev->dev, "device hcd=%p is being remov"
2750 "ed\n", hcd);
2751 return -ESHUTDOWN;
2752 } else {
2753 int i, changed = 0, length = 1;
2754 if (u132->flags & OHCI_QUIRK_AMD756) {
2755 if ((u132->hc_roothub_a & RH_A_NDP) > MAX_ROOT_PORTS) {
2756 dev_err(&u132->platform_dev->dev, "bogus NDP, r"
2757 "ereads as NDP=%d\n",
2758 u132->hc_roothub_a & RH_A_NDP);
2759 goto done;
2760 }
2761 }
2762 if (u132->hc_roothub_status & (RH_HS_LPSC | RH_HS_OCIC)) {
2763 buf[0] = changed = 1;
2764 } else
2765 buf[0] = 0;
2766 if (u132->num_ports > 7) {
2767 buf[1] = 0;
2768 length++;
2769 }
2770 for (i = 0; i < u132->num_ports; i++) {
2771 if (u132->hc_roothub_portstatus[i] & (RH_PS_CSC |
2772 RH_PS_PESC | RH_PS_PSSC | RH_PS_OCIC |
2773 RH_PS_PRSC)) {
2774 changed = 1;
2775 if (i < 7) {
2776 buf[0] |= 1 << (i + 1);
2777 } else
2778 buf[1] |= 1 << (i - 7);
2779 continue;
2780 }
2781 if (!(u132->hc_roothub_portstatus[i] & RH_PS_CCS)) {
2782 continue;
2783 }
2784 if ((u132->hc_roothub_portstatus[i] & RH_PS_PSS)) {
2785 continue;
2786 }
2787 }
2788 done:return changed ? length : 0;
2789 }
2790 }
2791
2792 static int u132_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
2793 u16 wIndex, char *buf, u16 wLength)
2794 {
2795 struct u132 *u132 = hcd_to_u132(hcd);
2796 if (u132->going > 1) {
2797 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2798 , u132->going);
2799 return -ENODEV;
2800 } else if (u132->going > 0) {
2801 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2802 return -ESHUTDOWN;
2803 } else {
2804 int retval = 0;
2805 down(&u132->sw_lock);
2806 switch (typeReq) {
2807 case ClearHubFeature:
2808 switch (wValue) {
2809 case C_HUB_OVER_CURRENT:
2810 case C_HUB_LOCAL_POWER:
2811 break;
2812 default:
2813 goto stall;
2814 }
2815 break;
2816 case SetHubFeature:
2817 switch (wValue) {
2818 case C_HUB_OVER_CURRENT:
2819 case C_HUB_LOCAL_POWER:
2820 break;
2821 default:
2822 goto stall;
2823 }
2824 break;
2825 case ClearPortFeature:{
2826 retval = u132_roothub_clearportfeature(u132,
2827 wValue, wIndex);
2828 if (retval)
2829 goto error;
2830 break;
2831 }
2832 case GetHubDescriptor:{
2833 retval = u132_roothub_descriptor(u132,
2834 (struct usb_hub_descriptor *)buf);
2835 if (retval)
2836 goto error;
2837 break;
2838 }
2839 case GetHubStatus:{
2840 retval = u132_roothub_status(u132,
2841 (__le32 *) buf);
2842 if (retval)
2843 goto error;
2844 break;
2845 }
2846 case GetPortStatus:{
2847 retval = u132_roothub_portstatus(u132,
2848 (__le32 *) buf, wIndex);
2849 if (retval)
2850 goto error;
2851 break;
2852 }
2853 case SetPortFeature:{
2854 retval = u132_roothub_setportfeature(u132,
2855 wValue, wIndex);
2856 if (retval)
2857 goto error;
2858 break;
2859 }
2860 default:
2861 goto stall;
2862 error:u132_disable(u132);
2863 u132->going = 1;
2864 break;
2865 stall:retval = -EPIPE;
2866 break;
2867 }
2868 up(&u132->sw_lock);
2869 return retval;
2870 }
2871 }
2872
2873 static int u132_start_port_reset(struct usb_hcd *hcd, unsigned port_num)
2874 {
2875 struct u132 *u132 = hcd_to_u132(hcd);
2876 if (u132->going > 1) {
2877 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2878 , u132->going);
2879 return -ENODEV;
2880 } else if (u132->going > 0) {
2881 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2882 return -ESHUTDOWN;
2883 } else
2884 return 0;
2885 }
2886
2887 static void u132_hub_irq_enable(struct usb_hcd *hcd)
2888 {
2889 struct u132 *u132 = hcd_to_u132(hcd);
2890 if (u132->going > 1) {
2891 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2892 , u132->going);
2893 } else if (u132->going > 0)
2894 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2895 }
2896
2897
2898 #ifdef CONFIG_PM
2899 static int u132_hcd_suspend(struct usb_hcd *hcd, pm_message_t message)
2900 {
2901 struct u132 *u132 = hcd_to_u132(hcd);
2902 if (u132->going > 1) {
2903 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2904 , u132->going);
2905 return -ENODEV;
2906 } else if (u132->going > 0) {
2907 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2908 return -ESHUTDOWN;
2909 } else
2910 return 0;
2911 }
2912
2913 static int u132_hcd_resume(struct usb_hcd *hcd)
2914 {
2915 struct u132 *u132 = hcd_to_u132(hcd);
2916 if (u132->going > 1) {
2917 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2918 , u132->going);
2919 return -ENODEV;
2920 } else if (u132->going > 0) {
2921 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2922 return -ESHUTDOWN;
2923 } else
2924 return 0;
2925 }
2926
2927 static int u132_bus_suspend(struct usb_hcd *hcd)
2928 {
2929 struct u132 *u132 = hcd_to_u132(hcd);
2930 if (u132->going > 1) {
2931 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2932 , u132->going);
2933 return -ENODEV;
2934 } else if (u132->going > 0) {
2935 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2936 return -ESHUTDOWN;
2937 } else
2938 return 0;
2939 }
2940
2941 static int u132_bus_resume(struct usb_hcd *hcd)
2942 {
2943 struct u132 *u132 = hcd_to_u132(hcd);
2944 if (u132->going > 1) {
2945 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2946 , u132->going);
2947 return -ENODEV;
2948 } else if (u132->going > 0) {
2949 dev_err(&u132->platform_dev->dev, "device is being removed\n");
2950 return -ESHUTDOWN;
2951 } else
2952 return 0;
2953 }
2954
2955 #else
2956 #define u132_hcd_suspend NULL
2957 #define u132_hcd_resume NULL
2958 #define u132_bus_suspend NULL
2959 #define u132_bus_resume NULL
2960 #endif
2961 static struct hc_driver u132_hc_driver = {
2962 .description = hcd_name,
2963 .hcd_priv_size = sizeof(struct u132),
2964 .irq = NULL,
2965 .flags = HCD_USB11 | HCD_MEMORY,
2966 .reset = u132_hcd_reset,
2967 .start = u132_hcd_start,
2968 .suspend = u132_hcd_suspend,
2969 .resume = u132_hcd_resume,
2970 .stop = u132_hcd_stop,
2971 .urb_enqueue = u132_urb_enqueue,
2972 .urb_dequeue = u132_urb_dequeue,
2973 .endpoint_disable = u132_endpoint_disable,
2974 .get_frame_number = u132_get_frame,
2975 .hub_status_data = u132_hub_status_data,
2976 .hub_control = u132_hub_control,
2977 .bus_suspend = u132_bus_suspend,
2978 .bus_resume = u132_bus_resume,
2979 .start_port_reset = u132_start_port_reset,
2980 .hub_irq_enable = u132_hub_irq_enable,
2981 };
2982
2983 /*
2984 * This function may be called by the USB core whilst the "usb_all_devices_rwsem"
2985 * is held for writing, thus this module must not call usb_remove_hcd()
2986 * synchronously - but instead should immediately stop activity to the
2987 * device and asynchronously call usb_remove_hcd()
2988 */
2989 static int __devexit u132_remove(struct platform_device *pdev)
2990 {
2991 struct usb_hcd *hcd = platform_get_drvdata(pdev);
2992 if (hcd) {
2993 struct u132 *u132 = hcd_to_u132(hcd);
2994 if (u132->going++ > 1) {
2995 dev_err(&u132->platform_dev->dev, "already being remove"
2996 "d\n");
2997 return -ENODEV;
2998 } else {
2999 int rings = MAX_U132_RINGS;
3000 int endps = MAX_U132_ENDPS;
3001 dev_err(&u132->platform_dev->dev, "removing device u132"
3002 ".%d\n", u132->sequence_num);
3003 msleep(100);
3004 down(&u132->sw_lock);
3005 u132_monitor_cancel_work(u132);
3006 while (rings-- > 0) {
3007 struct u132_ring *ring = &u132->ring[rings];
3008 u132_ring_cancel_work(u132, ring);
3009 } while (endps-- > 0) {
3010 struct u132_endp *endp = u132->endp[endps];
3011 if (endp)
3012 u132_endp_cancel_work(u132, endp);
3013 }
3014 u132->going += 1;
3015 printk(KERN_INFO "removing device u132.%d\n",
3016 u132->sequence_num);
3017 up(&u132->sw_lock);
3018 usb_remove_hcd(hcd);
3019 u132_u132_put_kref(u132);
3020 return 0;
3021 }
3022 } else
3023 return 0;
3024 }
3025
3026 static void u132_initialise(struct u132 *u132, struct platform_device *pdev)
3027 {
3028 int rings = MAX_U132_RINGS;
3029 int ports = MAX_U132_PORTS;
3030 int addrs = MAX_U132_ADDRS;
3031 int udevs = MAX_U132_UDEVS;
3032 int endps = MAX_U132_ENDPS;
3033 u132->board = pdev->dev.platform_data;
3034 u132->platform_dev = pdev;
3035 u132->power = 0;
3036 u132->reset = 0;
3037 init_MUTEX(&u132->sw_lock);
3038 init_MUTEX(&u132->scheduler_lock);
3039 while (rings-- > 0) {
3040 struct u132_ring *ring = &u132->ring[rings];
3041 ring->u132 = u132;
3042 ring->number = rings + 1;
3043 ring->length = 0;
3044 ring->curr_endp = NULL;
3045 INIT_DELAYED_WORK(&ring->scheduler,
3046 u132_hcd_ring_work_scheduler);
3047 } down(&u132->sw_lock);
3048 INIT_DELAYED_WORK(&u132->monitor, u132_hcd_monitor_work);
3049 while (ports-- > 0) {
3050 struct u132_port *port = &u132->port[ports];
3051 port->u132 = u132;
3052 port->reset = 0;
3053 port->enable = 0;
3054 port->power = 0;
3055 port->Status = 0;
3056 } while (addrs-- > 0) {
3057 struct u132_addr *addr = &u132->addr[addrs];
3058 addr->address = 0;
3059 } while (udevs-- > 0) {
3060 struct u132_udev *udev = &u132->udev[udevs];
3061 int i = ARRAY_SIZE(udev->endp_number_in);
3062 int o = ARRAY_SIZE(udev->endp_number_out);
3063 udev->usb_device = NULL;
3064 udev->udev_number = 0;
3065 udev->usb_addr = 0;
3066 udev->portnumber = 0;
3067 while (i-- > 0) {
3068 udev->endp_number_in[i] = 0;
3069 }
3070 while (o-- > 0) {
3071 udev->endp_number_out[o] = 0;
3072 }
3073 }
3074 while (endps-- > 0) {
3075 u132->endp[endps] = NULL;
3076 }
3077 up(&u132->sw_lock);
3078 return;
3079 }
3080
3081 static int __devinit u132_probe(struct platform_device *pdev)
3082 {
3083 struct usb_hcd *hcd;
3084 int retval;
3085 u32 control;
3086 u32 rh_a = -1;
3087 u32 num_ports;
3088 msleep(100);
3089 if (u132_exiting > 0) {
3090 return -ENODEV;
3091 }
3092 retval = ftdi_write_pcimem(pdev, intrdisable, OHCI_INTR_MIE);
3093 if (retval)
3094 return retval;
3095 retval = ftdi_read_pcimem(pdev, control, &control);
3096 if (retval)
3097 return retval;
3098 retval = ftdi_read_pcimem(pdev, roothub.a, &rh_a);
3099 if (retval)
3100 return retval;
3101 num_ports = rh_a & RH_A_NDP; /* refuse to confuse usbcore */
3102 if (pdev->dev.dma_mask) {
3103 return -EINVAL;
3104 }
3105 hcd = usb_create_hcd(&u132_hc_driver, &pdev->dev, pdev->dev.bus_id);
3106 if (!hcd) {
3107 printk(KERN_ERR "failed to create the usb hcd struct for U132\n"
3108 );
3109 ftdi_elan_gone_away(pdev);
3110 return -ENOMEM;
3111 } else {
3112 int retval = 0;
3113 struct u132 *u132 = hcd_to_u132(hcd);
3114 hcd->rsrc_start = 0;
3115 mutex_lock(&u132_module_lock);
3116 list_add_tail(&u132->u132_list, &u132_static_list);
3117 u132->sequence_num = ++u132_instances;
3118 mutex_unlock(&u132_module_lock);
3119 u132_u132_init_kref(u132);
3120 u132_initialise(u132, pdev);
3121 hcd->product_desc = "ELAN U132 Host Controller";
3122 retval = usb_add_hcd(hcd, 0, 0);
3123 if (retval != 0) {
3124 dev_err(&u132->platform_dev->dev, "init error %d\n",
3125 retval);
3126 u132_u132_put_kref(u132);
3127 return retval;
3128 } else {
3129 u132_monitor_queue_work(u132, 100);
3130 return 0;
3131 }
3132 }
3133 }
3134
3135
3136 #ifdef CONFIG_PM
3137 /* for this device there's no useful distinction between the controller
3138 * and its root hub, except that the root hub only gets direct PM calls
3139 * when CONFIG_USB_SUSPEND is enabled.
3140 */
3141 static int u132_suspend(struct platform_device *pdev, pm_message_t state)
3142 {
3143 struct usb_hcd *hcd = platform_get_drvdata(pdev);
3144 struct u132 *u132 = hcd_to_u132(hcd);
3145 if (u132->going > 1) {
3146 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
3147 , u132->going);
3148 return -ENODEV;
3149 } else if (u132->going > 0) {
3150 dev_err(&u132->platform_dev->dev, "device is being removed\n");
3151 return -ESHUTDOWN;
3152 } else {
3153 int retval = 0;
3154 if (state.event == PM_EVENT_FREEZE) {
3155 retval = u132_bus_suspend(hcd);
3156 } else if (state.event == PM_EVENT_SUSPEND) {
3157 int ports = MAX_U132_PORTS;
3158 while (ports-- > 0) {
3159 port_power(u132, ports, 0);
3160 }
3161 }
3162 if (retval == 0)
3163 pdev->dev.power.power_state = state;
3164 return retval;
3165 }
3166 }
3167
3168 static int u132_resume(struct platform_device *pdev)
3169 {
3170 struct usb_hcd *hcd = platform_get_drvdata(pdev);
3171 struct u132 *u132 = hcd_to_u132(hcd);
3172 if (u132->going > 1) {
3173 dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
3174 , u132->going);
3175 return -ENODEV;
3176 } else if (u132->going > 0) {
3177 dev_err(&u132->platform_dev->dev, "device is being removed\n");
3178 return -ESHUTDOWN;
3179 } else {
3180 int retval = 0;
3181 if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
3182 int ports = MAX_U132_PORTS;
3183 while (ports-- > 0) {
3184 port_power(u132, ports, 1);
3185 }
3186 retval = 0;
3187 } else {
3188 pdev->dev.power.power_state = PMSG_ON;
3189 retval = u132_bus_resume(hcd);
3190 }
3191 return retval;
3192 }
3193 }
3194
3195 #else
3196 #define u132_suspend NULL
3197 #define u132_resume NULL
3198 #endif
3199 /*
3200 * this driver is loaded explicitly by ftdi_u132
3201 *
3202 * the platform_driver struct is static because it is per type of module
3203 */
3204 static struct platform_driver u132_platform_driver = {
3205 .probe = u132_probe,
3206 .remove = __devexit_p(u132_remove),
3207 .suspend = u132_suspend,
3208 .resume = u132_resume,
3209 .driver = {
3210 .name = (char *)hcd_name,
3211 .owner = THIS_MODULE,
3212 },
3213 };
3214 static int __init u132_hcd_init(void)
3215 {
3216 int retval;
3217 INIT_LIST_HEAD(&u132_static_list);
3218 u132_instances = 0;
3219 u132_exiting = 0;
3220 mutex_init(&u132_module_lock);
3221 if (usb_disabled())
3222 return -ENODEV;
3223 printk(KERN_INFO "driver %s built at %s on %s\n", hcd_name, __TIME__,
3224 __DATE__);
3225 workqueue = create_singlethread_workqueue("u132");
3226 retval = platform_driver_register(&u132_platform_driver);
3227 return retval;
3228 }
3229
3230
3231 module_init(u132_hcd_init);
3232 static void __exit u132_hcd_exit(void)
3233 {
3234 struct u132 *u132;
3235 struct u132 *temp;
3236 mutex_lock(&u132_module_lock);
3237 u132_exiting += 1;
3238 mutex_unlock(&u132_module_lock);
3239 list_for_each_entry_safe(u132, temp, &u132_static_list, u132_list) {
3240 platform_device_unregister(u132->platform_dev);
3241 } platform_driver_unregister(&u132_platform_driver);
3242 printk(KERN_INFO "u132-hcd driver deregistered\n");
3243 wait_event(u132_hcd_wait, u132_instances == 0);
3244 flush_workqueue(workqueue);
3245 destroy_workqueue(workqueue);
3246 }
3247
3248
3249 module_exit(u132_hcd_exit);
3250 MODULE_LICENSE("GPL");
This page took 0.109072 seconds and 5 git commands to generate.