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