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