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