USB: Remove duplicate define of OHCI_QUIRK_ZFMICRO
[linux-2.6] / drivers / usb / misc / ftdi-elan.c
1 /*
2 * USB FTDI client driver for Elan Digital Systems's Uxxx adapters
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 client 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/errno.h>
40 #include <linux/init.h>
41 #include <linux/list.h>
42 #include <linux/ioctl.h>
43 #include <linux/pci_ids.h>
44 #include <linux/slab.h>
45 #include <linux/module.h>
46 #include <linux/kref.h>
47 #include <asm/uaccess.h>
48 #include <linux/usb.h>
49 #include <linux/workqueue.h>
50 #include <linux/platform_device.h>
51 MODULE_AUTHOR("Tony Olech");
52 MODULE_DESCRIPTION("FTDI ELAN driver");
53 MODULE_LICENSE("GPL");
54 #define INT_MODULE_PARM(n, v) static int n = v;module_param(n, int, 0444)
55 static int distrust_firmware = 1;
56 module_param(distrust_firmware, bool, 0);
57 MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurren"
58         "t setup");
59 extern struct platform_driver u132_platform_driver;
60 static struct workqueue_struct *status_queue;
61 static struct workqueue_struct *command_queue;
62 static struct workqueue_struct *respond_queue;
63 /*
64 * ftdi_module_lock exists to protect access to global variables
65 *
66 */
67 static struct semaphore ftdi_module_lock;
68 static int ftdi_instances = 0;
69 static struct list_head ftdi_static_list;
70 /*
71 * end of the global variables protected by ftdi_module_lock
72 */
73 #include "usb_u132.h"
74 #include <asm/io.h>
75 #include "../core/hcd.h"
76 #include "../host/ohci.h"
77 /* Define these values to match your devices*/
78 #define USB_FTDI_ELAN_VENDOR_ID 0x0403
79 #define USB_FTDI_ELAN_PRODUCT_ID 0xd6ea
80 /* table of devices that work with this driver*/
81 static struct usb_device_id ftdi_elan_table[] = {
82         {USB_DEVICE(USB_FTDI_ELAN_VENDOR_ID, USB_FTDI_ELAN_PRODUCT_ID)},
83         { /* Terminating entry */ }
84 };
85
86 MODULE_DEVICE_TABLE(usb, ftdi_elan_table);
87 /* only the jtag(firmware upgrade device) interface requires
88 * a device file and corresponding minor number, but the
89 * interface is created unconditionally - I suppose it could
90 * be configured or not according to a module parameter.
91 * But since we(now) require one interface per device,
92 * and since it unlikely that a normal installation would
93 * require more than a couple of elan-ftdi devices, 8 seems
94 * like a reasonable limit to have here, and if someone
95 * really requires more than 8 devices, then they can frig the
96 * code and recompile
97 */
98 #define USB_FTDI_ELAN_MINOR_BASE 192
99 #define COMMAND_BITS 5
100 #define COMMAND_SIZE (1<<COMMAND_BITS)
101 #define COMMAND_MASK (COMMAND_SIZE-1)
102 struct u132_command {
103         u8 header;
104         u16 length;
105         u8 address;
106         u8 width;
107         u32 value;
108         int follows;
109         void *buffer;
110 };
111 #define RESPOND_BITS 5
112 #define RESPOND_SIZE (1<<RESPOND_BITS)
113 #define RESPOND_MASK (RESPOND_SIZE-1)
114 struct u132_respond {
115         u8 header;
116         u8 address;
117         u32 *value;
118         int *result;
119         struct completion wait_completion;
120 };
121 struct u132_target {
122         void *endp;
123         struct urb *urb;
124         int toggle_bits;
125         int error_count;
126         int condition_code;
127         int repeat_number;
128         int halted;
129         int skipped;
130         int actual;
131         int non_null;
132         int active;
133         int abandoning;
134         void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
135                 int toggle_bits, int error_count, int condition_code,
136                 int repeat_number, int halted, int skipped, int actual,
137                 int non_null);
138 };
139 /* Structure to hold all of our device specific stuff*/
140 struct usb_ftdi {
141         struct list_head ftdi_list;
142         struct semaphore u132_lock;
143         int command_next;
144         int command_head;
145         struct u132_command command[COMMAND_SIZE];
146         int respond_next;
147         int respond_head;
148         struct u132_respond respond[RESPOND_SIZE];
149         struct u132_target target[4];
150         char device_name[16];
151         unsigned synchronized:1;
152         unsigned enumerated:1;
153         unsigned registered:1;
154         unsigned initialized:1;
155         unsigned card_ejected:1;
156         int function;
157         int sequence_num;
158         int disconnected;
159         int gone_away;
160         int stuck_status;
161         int status_queue_delay;
162         struct semaphore sw_lock;
163         struct usb_device *udev;
164         struct usb_interface *interface;
165         struct usb_class_driver *class;
166         struct delayed_work status_work;
167         struct delayed_work command_work;
168         struct delayed_work respond_work;
169         struct u132_platform_data platform_data;
170         struct resource resources[0];
171         struct platform_device platform_dev;
172         unsigned char *bulk_in_buffer;
173         size_t bulk_in_size;
174         size_t bulk_in_last;
175         size_t bulk_in_left;
176         __u8 bulk_in_endpointAddr;
177         __u8 bulk_out_endpointAddr;
178         struct kref kref;
179         u32 controlreg;
180         u8 response[4 + 1024];
181         int expected;
182         int recieved;
183         int ed_found;
184 };
185 #define kref_to_usb_ftdi(d) container_of(d, struct usb_ftdi, kref)
186 #define platform_device_to_usb_ftdi(d) container_of(d, struct usb_ftdi, \
187         platform_dev)
188 static struct usb_driver ftdi_elan_driver;
189 static void ftdi_elan_delete(struct kref *kref)
190 {
191         struct usb_ftdi *ftdi = kref_to_usb_ftdi(kref);
192         dev_warn(&ftdi->udev->dev, "FREEING ftdi=%p\n", ftdi);
193         usb_put_dev(ftdi->udev);
194         ftdi->disconnected += 1;
195         down(&ftdi_module_lock);
196         list_del_init(&ftdi->ftdi_list);
197         ftdi_instances -= 1;
198         up(&ftdi_module_lock);
199         kfree(ftdi->bulk_in_buffer);
200         ftdi->bulk_in_buffer = NULL;
201 }
202
203 static void ftdi_elan_put_kref(struct usb_ftdi *ftdi)
204 {
205         kref_put(&ftdi->kref, ftdi_elan_delete);
206 }
207
208 static void ftdi_elan_get_kref(struct usb_ftdi *ftdi)
209 {
210         kref_get(&ftdi->kref);
211 }
212
213 static void ftdi_elan_init_kref(struct usb_ftdi *ftdi)
214 {
215         kref_init(&ftdi->kref);
216 }
217
218 static void ftdi_status_requeue_work(struct usb_ftdi *ftdi, unsigned int delta)
219 {
220         if (!queue_delayed_work(status_queue, &ftdi->status_work, delta))
221                 kref_put(&ftdi->kref, ftdi_elan_delete);
222 }
223
224 static void ftdi_status_queue_work(struct usb_ftdi *ftdi, unsigned int delta)
225 {
226         if (queue_delayed_work(status_queue, &ftdi->status_work, delta))
227                 kref_get(&ftdi->kref);
228 }
229
230 static void ftdi_status_cancel_work(struct usb_ftdi *ftdi)
231 {
232         if (cancel_delayed_work(&ftdi->status_work))
233                 kref_put(&ftdi->kref, ftdi_elan_delete);
234 }
235
236 static void ftdi_command_requeue_work(struct usb_ftdi *ftdi, unsigned int delta)
237 {
238         if (!queue_delayed_work(command_queue, &ftdi->command_work, delta))
239                 kref_put(&ftdi->kref, ftdi_elan_delete);
240 }
241
242 static void ftdi_command_queue_work(struct usb_ftdi *ftdi, unsigned int delta)
243 {
244         if (queue_delayed_work(command_queue, &ftdi->command_work, delta))
245                 kref_get(&ftdi->kref);
246 }
247
248 static void ftdi_command_cancel_work(struct usb_ftdi *ftdi)
249 {
250         if (cancel_delayed_work(&ftdi->command_work))
251                 kref_put(&ftdi->kref, ftdi_elan_delete);
252 }
253
254 static void ftdi_response_requeue_work(struct usb_ftdi *ftdi,
255         unsigned int delta)
256 {
257         if (!queue_delayed_work(respond_queue, &ftdi->respond_work, delta))
258                 kref_put(&ftdi->kref, ftdi_elan_delete);
259 }
260
261 static void ftdi_respond_queue_work(struct usb_ftdi *ftdi, unsigned int delta)
262 {
263         if (queue_delayed_work(respond_queue, &ftdi->respond_work, delta))
264                 kref_get(&ftdi->kref);
265 }
266
267 static void ftdi_response_cancel_work(struct usb_ftdi *ftdi)
268 {
269         if (cancel_delayed_work(&ftdi->respond_work))
270                 kref_put(&ftdi->kref, ftdi_elan_delete);
271 }
272
273 void ftdi_elan_gone_away(struct platform_device *pdev)
274 {
275         struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
276         ftdi->gone_away += 1;
277         ftdi_elan_put_kref(ftdi);
278 }
279
280
281 EXPORT_SYMBOL_GPL(ftdi_elan_gone_away);
282 static void ftdi_release_platform_dev(struct device *dev)
283 {
284         dev->parent = NULL;
285 }
286
287 static void ftdi_elan_do_callback(struct usb_ftdi *ftdi,
288         struct u132_target *target, u8 *buffer, int length);
289 static void ftdi_elan_kick_command_queue(struct usb_ftdi *ftdi);
290 static void ftdi_elan_kick_respond_queue(struct usb_ftdi *ftdi);
291 static int ftdi_elan_setupOHCI(struct usb_ftdi *ftdi);
292 static int ftdi_elan_checkingPCI(struct usb_ftdi *ftdi);
293 static int ftdi_elan_enumeratePCI(struct usb_ftdi *ftdi);
294 static int ftdi_elan_synchronize(struct usb_ftdi *ftdi);
295 static int ftdi_elan_stuck_waiting(struct usb_ftdi *ftdi);
296 static int ftdi_elan_command_engine(struct usb_ftdi *ftdi);
297 static int ftdi_elan_respond_engine(struct usb_ftdi *ftdi);
298 static int ftdi_elan_hcd_init(struct usb_ftdi *ftdi)
299 {
300         int result;
301         if (ftdi->platform_dev.dev.parent)
302                 return -EBUSY;
303         ftdi_elan_get_kref(ftdi);
304         ftdi->platform_data.potpg = 100;
305         ftdi->platform_data.reset = NULL;
306         ftdi->platform_dev.id = ftdi->sequence_num;
307         ftdi->platform_dev.resource = ftdi->resources;
308         ftdi->platform_dev.num_resources = ARRAY_SIZE(ftdi->resources);
309         ftdi->platform_dev.dev.platform_data = &ftdi->platform_data;
310         ftdi->platform_dev.dev.parent = NULL;
311         ftdi->platform_dev.dev.release = ftdi_release_platform_dev;
312         ftdi->platform_dev.dev.dma_mask = NULL;
313         snprintf(ftdi->device_name, sizeof(ftdi->device_name), "u132_hcd");
314         ftdi->platform_dev.name = ftdi->device_name;
315         dev_info(&ftdi->udev->dev, "requesting module '%s'\n", "u132_hcd");
316         request_module("u132_hcd");
317         dev_info(&ftdi->udev->dev, "registering '%s'\n",
318                 ftdi->platform_dev.name);
319         result = platform_device_register(&ftdi->platform_dev);
320         return result;
321 }
322
323 static void ftdi_elan_abandon_completions(struct usb_ftdi *ftdi)
324 {
325         down(&ftdi->u132_lock);
326         while (ftdi->respond_next > ftdi->respond_head) {
327                 struct u132_respond *respond = &ftdi->respond[RESPOND_MASK &
328                         ftdi->respond_head++];
329                 *respond->result = -ESHUTDOWN;
330                 *respond->value = 0;
331                 complete(&respond->wait_completion);
332         } up(&ftdi->u132_lock);
333 }
334
335 static void ftdi_elan_abandon_targets(struct usb_ftdi *ftdi)
336 {
337         int ed_number = 4;
338         down(&ftdi->u132_lock);
339         while (ed_number-- > 0) {
340                 struct u132_target *target = &ftdi->target[ed_number];
341                 if (target->active == 1) {
342                         target->condition_code = TD_DEVNOTRESP;
343                         up(&ftdi->u132_lock);
344                         ftdi_elan_do_callback(ftdi, target, NULL, 0);
345                         down(&ftdi->u132_lock);
346                 }
347         }
348         ftdi->recieved = 0;
349         ftdi->expected = 4;
350         ftdi->ed_found = 0;
351         up(&ftdi->u132_lock);
352 }
353
354 static void ftdi_elan_flush_targets(struct usb_ftdi *ftdi)
355 {
356         int ed_number = 4;
357         down(&ftdi->u132_lock);
358         while (ed_number-- > 0) {
359                 struct u132_target *target = &ftdi->target[ed_number];
360                 target->abandoning = 1;
361               wait_1:if (target->active == 1) {
362                         int command_size = ftdi->command_next -
363                                 ftdi->command_head;
364                         if (command_size < COMMAND_SIZE) {
365                                 struct u132_command *command = &ftdi->command[
366                                         COMMAND_MASK & ftdi->command_next];
367                                 command->header = 0x80 | (ed_number << 5) | 0x4;
368                                 command->length = 0x00;
369                                 command->address = 0x00;
370                                 command->width = 0x00;
371                                 command->follows = 0;
372                                 command->value = 0;
373                                 command->buffer = &command->value;
374                                 ftdi->command_next += 1;
375                                 ftdi_elan_kick_command_queue(ftdi);
376                         } else {
377                                 up(&ftdi->u132_lock);
378                                 msleep(100);
379                                 down(&ftdi->u132_lock);
380                                 goto wait_1;
381                         }
382                 }
383               wait_2:if (target->active == 1) {
384                         int command_size = ftdi->command_next -
385                                 ftdi->command_head;
386                         if (command_size < COMMAND_SIZE) {
387                                 struct u132_command *command = &ftdi->command[
388                                         COMMAND_MASK & ftdi->command_next];
389                                 command->header = 0x90 | (ed_number << 5);
390                                 command->length = 0x00;
391                                 command->address = 0x00;
392                                 command->width = 0x00;
393                                 command->follows = 0;
394                                 command->value = 0;
395                                 command->buffer = &command->value;
396                                 ftdi->command_next += 1;
397                                 ftdi_elan_kick_command_queue(ftdi);
398                         } else {
399                                 up(&ftdi->u132_lock);
400                                 msleep(100);
401                                 down(&ftdi->u132_lock);
402                                 goto wait_2;
403                         }
404                 }
405         }
406         ftdi->recieved = 0;
407         ftdi->expected = 4;
408         ftdi->ed_found = 0;
409         up(&ftdi->u132_lock);
410 }
411
412 static void ftdi_elan_cancel_targets(struct usb_ftdi *ftdi)
413 {
414         int ed_number = 4;
415         down(&ftdi->u132_lock);
416         while (ed_number-- > 0) {
417                 struct u132_target *target = &ftdi->target[ed_number];
418                 target->abandoning = 1;
419               wait:if (target->active == 1) {
420                         int command_size = ftdi->command_next -
421                                 ftdi->command_head;
422                         if (command_size < COMMAND_SIZE) {
423                                 struct u132_command *command = &ftdi->command[
424                                         COMMAND_MASK & ftdi->command_next];
425                                 command->header = 0x80 | (ed_number << 5) | 0x4;
426                                 command->length = 0x00;
427                                 command->address = 0x00;
428                                 command->width = 0x00;
429                                 command->follows = 0;
430                                 command->value = 0;
431                                 command->buffer = &command->value;
432                                 ftdi->command_next += 1;
433                                 ftdi_elan_kick_command_queue(ftdi);
434                         } else {
435                                 up(&ftdi->u132_lock);
436                                 msleep(100);
437                                 down(&ftdi->u132_lock);
438                                 goto wait;
439                         }
440                 }
441         }
442         ftdi->recieved = 0;
443         ftdi->expected = 4;
444         ftdi->ed_found = 0;
445         up(&ftdi->u132_lock);
446 }
447
448 static void ftdi_elan_kick_command_queue(struct usb_ftdi *ftdi)
449 {
450         ftdi_command_queue_work(ftdi, 0);
451         return;
452 }
453
454 static void ftdi_elan_command_work(struct work_struct *work)
455 {
456         struct usb_ftdi *ftdi =
457                 container_of(work, struct usb_ftdi, command_work.work);
458
459         if (ftdi->disconnected > 0) {
460                 ftdi_elan_put_kref(ftdi);
461                 return;
462         } else {
463                 int retval = ftdi_elan_command_engine(ftdi);
464                 if (retval == -ESHUTDOWN) {
465                         ftdi->disconnected += 1;
466                 } else if (retval == -ENODEV) {
467                         ftdi->disconnected += 1;
468                 } else if (retval)
469                         dev_err(&ftdi->udev->dev, "command error %d\n", retval);
470                 ftdi_command_requeue_work(ftdi, msecs_to_jiffies(10));
471                 return;
472         }
473 }
474
475 static void ftdi_elan_kick_respond_queue(struct usb_ftdi *ftdi)
476 {
477         ftdi_respond_queue_work(ftdi, 0);
478         return;
479 }
480
481 static void ftdi_elan_respond_work(struct work_struct *work)
482 {
483         struct usb_ftdi *ftdi =
484                 container_of(work, struct usb_ftdi, respond_work.work);
485         if (ftdi->disconnected > 0) {
486                 ftdi_elan_put_kref(ftdi);
487                 return;
488         } else {
489                 int retval = ftdi_elan_respond_engine(ftdi);
490                 if (retval == 0) {
491                 } else if (retval == -ESHUTDOWN) {
492                         ftdi->disconnected += 1;
493                 } else if (retval == -ENODEV) {
494                         ftdi->disconnected += 1;
495                 } else if (retval == -EILSEQ) {
496                         ftdi->disconnected += 1;
497                 } else {
498                         ftdi->disconnected += 1;
499                         dev_err(&ftdi->udev->dev, "respond error %d\n", retval);
500                 }
501                 if (ftdi->disconnected > 0) {
502                         ftdi_elan_abandon_completions(ftdi);
503                         ftdi_elan_abandon_targets(ftdi);
504                 }
505                 ftdi_response_requeue_work(ftdi, msecs_to_jiffies(10));
506                 return;
507         }
508 }
509
510
511 /*
512 * the sw_lock is initially held and will be freed
513 * after the FTDI has been synchronized
514 *
515 */
516 static void ftdi_elan_status_work(struct work_struct *work)
517 {
518         struct usb_ftdi *ftdi =
519                 container_of(work, struct usb_ftdi, status_work.work);
520         int work_delay_in_msec = 0;
521         if (ftdi->disconnected > 0) {
522                 ftdi_elan_put_kref(ftdi);
523                 return;
524         } else if (ftdi->synchronized == 0) {
525                 down(&ftdi->sw_lock);
526                 if (ftdi_elan_synchronize(ftdi) == 0) {
527                         ftdi->synchronized = 1;
528                         ftdi_command_queue_work(ftdi, 1);
529                         ftdi_respond_queue_work(ftdi, 1);
530                         up(&ftdi->sw_lock);
531                         work_delay_in_msec = 100;
532                 } else {
533                         dev_err(&ftdi->udev->dev, "synchronize failed\n");
534                         up(&ftdi->sw_lock);
535                         work_delay_in_msec = 10 *1000;
536                 }
537         } else if (ftdi->stuck_status > 0) {
538                 if (ftdi_elan_stuck_waiting(ftdi) == 0) {
539                         ftdi->stuck_status = 0;
540                         ftdi->synchronized = 0;
541                 } else if ((ftdi->stuck_status++ % 60) == 1) {
542                         dev_err(&ftdi->udev->dev, "WRONG type of card inserted "
543                                 "- please remove\n");
544                 } else
545                         dev_err(&ftdi->udev->dev, "WRONG type of card inserted "
546                                 "- checked %d times\n", ftdi->stuck_status);
547                 work_delay_in_msec = 100;
548         } else if (ftdi->enumerated == 0) {
549                 if (ftdi_elan_enumeratePCI(ftdi) == 0) {
550                         ftdi->enumerated = 1;
551                         work_delay_in_msec = 250;
552                 } else
553                         work_delay_in_msec = 1000;
554         } else if (ftdi->initialized == 0) {
555                 if (ftdi_elan_setupOHCI(ftdi) == 0) {
556                         ftdi->initialized = 1;
557                         work_delay_in_msec = 500;
558                 } else {
559                         dev_err(&ftdi->udev->dev, "initialized failed - trying "
560                                 "again in 10 seconds\n");
561                         work_delay_in_msec = 1 *1000;
562                 }
563         } else if (ftdi->registered == 0) {
564                 work_delay_in_msec = 10;
565                 if (ftdi_elan_hcd_init(ftdi) == 0) {
566                         ftdi->registered = 1;
567                 } else
568                         dev_err(&ftdi->udev->dev, "register failed\n");
569                 work_delay_in_msec = 250;
570         } else {
571                 if (ftdi_elan_checkingPCI(ftdi) == 0) {
572                         work_delay_in_msec = 250;
573                 } else if (ftdi->controlreg & 0x00400000) {
574                         if (ftdi->gone_away > 0) {
575                                 dev_err(&ftdi->udev->dev, "PCI device eject con"
576                                         "firmed platform_dev.dev.parent=%p plat"
577                                         "form_dev.dev=%p\n",
578                                         ftdi->platform_dev.dev.parent,
579                                         &ftdi->platform_dev.dev);
580                                 platform_device_unregister(&ftdi->platform_dev);
581                                 ftdi->platform_dev.dev.parent = NULL;
582                                 ftdi->registered = 0;
583                                 ftdi->enumerated = 0;
584                                 ftdi->card_ejected = 0;
585                                 ftdi->initialized = 0;
586                                 ftdi->gone_away = 0;
587                         } else
588                                 ftdi_elan_flush_targets(ftdi);
589                         work_delay_in_msec = 250;
590                 } else {
591                         dev_err(&ftdi->udev->dev, "PCI device has disappeared\n"
592                                 );
593                         ftdi_elan_cancel_targets(ftdi);
594                         work_delay_in_msec = 500;
595                         ftdi->enumerated = 0;
596                         ftdi->initialized = 0;
597                 }
598         }
599         if (ftdi->disconnected > 0) {
600                 ftdi_elan_put_kref(ftdi);
601                 return;
602         } else {
603                 ftdi_status_requeue_work(ftdi,
604                         msecs_to_jiffies(work_delay_in_msec));
605                 return;
606         }
607 }
608
609
610 /*
611 * file_operations for the jtag interface
612 *
613 * the usage count for the device is incremented on open()
614 * and decremented on release()
615 */
616 static int ftdi_elan_open(struct inode *inode, struct file *file)
617 {
618         int subminor = iminor(inode);
619         struct usb_interface *interface = usb_find_interface(&ftdi_elan_driver,
620                 subminor);
621         if (!interface) {
622                 printk(KERN_ERR "can't find device for minor %d\n", subminor);
623                 return -ENODEV;
624         } else {
625                 struct usb_ftdi *ftdi = usb_get_intfdata(interface);
626                 if (!ftdi) {
627                         return -ENODEV;
628                 } else {
629                         if (down_interruptible(&ftdi->sw_lock)) {
630                                 return -EINTR;
631                         } else {
632                                 ftdi_elan_get_kref(ftdi);
633                                 file->private_data = ftdi;
634                                 return 0;
635                         }
636                 }
637         }
638 }
639
640 static int ftdi_elan_release(struct inode *inode, struct file *file)
641 {
642         struct usb_ftdi *ftdi = (struct usb_ftdi *)file->private_data;
643         if (ftdi == NULL)
644                 return -ENODEV;
645         up(&ftdi->sw_lock);        /* decrement the count on our device */
646         ftdi_elan_put_kref(ftdi);
647         return 0;
648 }
649
650
651 #define FTDI_ELAN_IOC_MAGIC 0xA1
652 #define FTDI_ELAN_IOCDEBUG _IOC(_IOC_WRITE, FTDI_ELAN_IOC_MAGIC, 1, 132)
653 static int ftdi_elan_ioctl(struct inode *inode, struct file *file,
654         unsigned int cmd, unsigned long arg)
655 {
656         switch (cmd) {
657         case FTDI_ELAN_IOCDEBUG:{
658                         char line[132];
659                         int size = strncpy_from_user(line,
660                                 (const char __user *)arg, sizeof(line));
661                         if (size < 0) {
662                                 return -EINVAL;
663                         } else {
664                                 printk(KERN_ERR "TODO: ioctl %s\n", line);
665                                 return 0;
666                         }
667                 }
668         default:
669                 return -EFAULT;
670         }
671 }
672
673
674 /*
675 *
676 * blocking bulk reads are used to get data from the device
677 *
678 */
679 static ssize_t ftdi_elan_read(struct file *file, char __user *buffer,
680                               size_t count, loff_t *ppos)
681 {
682         char data[30 *3 + 4];
683         char *d = data;
684         int m = (sizeof(data) - 1) / 3;
685         int bytes_read = 0;
686         int retry_on_empty = 10;
687         int retry_on_timeout = 5;
688         struct usb_ftdi *ftdi = (struct usb_ftdi *)file->private_data;
689         if (ftdi->disconnected > 0) {
690                 return -ENODEV;
691         }
692         data[0] = 0;
693       have:if (ftdi->bulk_in_left > 0) {
694                 if (count-- > 0) {
695                         char *p = ++ftdi->bulk_in_last + ftdi->bulk_in_buffer;
696                         ftdi->bulk_in_left -= 1;
697                         if (bytes_read < m) {
698                                 d += sprintf(d, " %02X", 0x000000FF & *p);
699                         } else if (bytes_read > m) {
700                         } else
701                                 d += sprintf(d, " ..");
702                         if (copy_to_user(buffer++, p, 1)) {
703                                 return -EFAULT;
704                         } else {
705                                 bytes_read += 1;
706                                 goto have;
707                         }
708                 } else
709                         return bytes_read;
710         }
711       more:if (count > 0) {
712                 int packet_bytes = 0;
713                 int retval = usb_bulk_msg(ftdi->udev,
714                         usb_rcvbulkpipe(ftdi->udev, ftdi->bulk_in_endpointAddr),
715                          ftdi->bulk_in_buffer, ftdi->bulk_in_size,
716                         &packet_bytes, msecs_to_jiffies(50));
717                 if (packet_bytes > 2) {
718                         ftdi->bulk_in_left = packet_bytes - 2;
719                         ftdi->bulk_in_last = 1;
720                         goto have;
721                 } else if (retval == -ETIMEDOUT) {
722                         if (retry_on_timeout-- > 0) {
723                                 goto more;
724                         } else if (bytes_read > 0) {
725                                 return bytes_read;
726                         } else
727                                 return retval;
728                 } else if (retval == 0) {
729                         if (retry_on_empty-- > 0) {
730                                 goto more;
731                         } else
732                                 return bytes_read;
733                 } else
734                         return retval;
735         } else
736                 return bytes_read;
737 }
738
739 static void ftdi_elan_write_bulk_callback(struct urb *urb)
740 {
741         struct usb_ftdi *ftdi = (struct usb_ftdi *)urb->context;
742         if (urb->status && !(urb->status == -ENOENT || urb->status ==
743                 -ECONNRESET || urb->status == -ESHUTDOWN)) {
744                 dev_err(&ftdi->udev->dev, "urb=%p write bulk status received: %"
745                         "d\n", urb, urb->status);
746         }
747         usb_buffer_free(urb->dev, urb->transfer_buffer_length,
748                 urb->transfer_buffer, urb->transfer_dma);
749 }
750
751 static int fill_buffer_with_all_queued_commands(struct usb_ftdi *ftdi,
752         char *buf, int command_size, int total_size)
753 {
754         int ed_commands = 0;
755         int b = 0;
756         int I = command_size;
757         int i = ftdi->command_head;
758         while (I-- > 0) {
759                 struct u132_command *command = &ftdi->command[COMMAND_MASK &
760                         i++];
761                 int F = command->follows;
762                 u8 *f = command->buffer;
763                 if (command->header & 0x80) {
764                         ed_commands |= 1 << (0x3 & (command->header >> 5));
765                 }
766                 buf[b++] = command->header;
767                 buf[b++] = (command->length >> 0) & 0x00FF;
768                 buf[b++] = (command->length >> 8) & 0x00FF;
769                 buf[b++] = command->address;
770                 buf[b++] = command->width;
771                 while (F-- > 0) {
772                         buf[b++] = *f++;
773                 }
774         }
775         return ed_commands;
776 }
777
778 static int ftdi_elan_total_command_size(struct usb_ftdi *ftdi, int command_size)
779 {
780         int total_size = 0;
781         int I = command_size;
782         int i = ftdi->command_head;
783         while (I-- > 0) {
784                 struct u132_command *command = &ftdi->command[COMMAND_MASK &
785                         i++];
786                 total_size += 5 + command->follows;
787         } return total_size;
788 }
789
790 static int ftdi_elan_command_engine(struct usb_ftdi *ftdi)
791 {
792         int retval;
793         char *buf;
794         int ed_commands;
795         int total_size;
796         struct urb *urb;
797         int command_size = ftdi->command_next - ftdi->command_head;
798         if (command_size == 0)
799                 return 0;
800         total_size = ftdi_elan_total_command_size(ftdi, command_size);
801         urb = usb_alloc_urb(0, GFP_KERNEL);
802         if (!urb) {
803                 dev_err(&ftdi->udev->dev, "could not get a urb to write %d comm"
804                         "ands totaling %d bytes to the Uxxx\n", command_size,
805                         total_size);
806                 return -ENOMEM;
807         }
808         buf = usb_buffer_alloc(ftdi->udev, total_size, GFP_KERNEL,
809                 &urb->transfer_dma);
810         if (!buf) {
811                 dev_err(&ftdi->udev->dev, "could not get a buffer to write %d c"
812                         "ommands totaling %d bytes to the Uxxx\n", command_size,
813                          total_size);
814                 usb_free_urb(urb);
815                 return -ENOMEM;
816         }
817         ed_commands = fill_buffer_with_all_queued_commands(ftdi, buf,
818                 command_size, total_size);
819         usb_fill_bulk_urb(urb, ftdi->udev, usb_sndbulkpipe(ftdi->udev,
820                 ftdi->bulk_out_endpointAddr), buf, total_size,
821                 ftdi_elan_write_bulk_callback, ftdi);
822         urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
823         if (ed_commands) {
824                 char diag[40 *3 + 4];
825                 char *d = diag;
826                 int m = total_size;
827                 u8 *c = buf;
828                 int s = (sizeof(diag) - 1) / 3;
829                 diag[0] = 0;
830                 while (s-- > 0 && m-- > 0) {
831                         if (s > 0 || m == 0) {
832                                 d += sprintf(d, " %02X", *c++);
833                         } else
834                                 d += sprintf(d, " ..");
835                 }
836         }
837         retval = usb_submit_urb(urb, GFP_KERNEL);
838         if (retval) {
839                 dev_err(&ftdi->udev->dev, "failed %d to submit urb %p to write "
840                         "%d commands totaling %d bytes to the Uxxx\n", retval,
841                         urb, command_size, total_size);
842                 usb_buffer_free(ftdi->udev, total_size, buf, urb->transfer_dma);
843                 usb_free_urb(urb);
844                 return retval;
845         }
846         usb_free_urb(urb);        /* release our reference to this urb,
847                 the USB core will eventually free it entirely */
848         ftdi->command_head += command_size;
849         ftdi_elan_kick_respond_queue(ftdi);
850         return 0;
851 }
852
853 static void ftdi_elan_do_callback(struct usb_ftdi *ftdi,
854         struct u132_target *target, u8 *buffer, int length)
855 {
856         struct urb *urb = target->urb;
857         int halted = target->halted;
858         int skipped = target->skipped;
859         int actual = target->actual;
860         int non_null = target->non_null;
861         int toggle_bits = target->toggle_bits;
862         int error_count = target->error_count;
863         int condition_code = target->condition_code;
864         int repeat_number = target->repeat_number;
865         void (*callback) (void *, struct urb *, u8 *, int, int, int, int, int,
866                 int, int, int, int) = target->callback;
867         target->active -= 1;
868         target->callback = NULL;
869         (*callback) (target->endp, urb, buffer, length, toggle_bits,
870                 error_count, condition_code, repeat_number, halted, skipped,
871                 actual, non_null);
872 }
873
874 static char *have_ed_set_response(struct usb_ftdi *ftdi,
875         struct u132_target *target, u16 ed_length, int ed_number, int ed_type,
876         char *b)
877 {
878         int payload = (ed_length >> 0) & 0x07FF;
879         down(&ftdi->u132_lock);
880         target->actual = 0;
881         target->non_null = (ed_length >> 15) & 0x0001;
882         target->repeat_number = (ed_length >> 11) & 0x000F;
883         if (ed_type == 0x02) {
884                 if (payload == 0 || target->abandoning > 0) {
885                         target->abandoning = 0;
886                         up(&ftdi->u132_lock);
887                         ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
888                                 payload);
889                         ftdi->recieved = 0;
890                         ftdi->expected = 4;
891                         ftdi->ed_found = 0;
892                         return ftdi->response;
893                 } else {
894                         ftdi->expected = 4 + payload;
895                         ftdi->ed_found = 1;
896                         up(&ftdi->u132_lock);
897                         return b;
898                 }
899         } else if (ed_type == 0x03) {
900                 if (payload == 0 || target->abandoning > 0) {
901                         target->abandoning = 0;
902                         up(&ftdi->u132_lock);
903                         ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
904                                 payload);
905                         ftdi->recieved = 0;
906                         ftdi->expected = 4;
907                         ftdi->ed_found = 0;
908                         return ftdi->response;
909                 } else {
910                         ftdi->expected = 4 + payload;
911                         ftdi->ed_found = 1;
912                         up(&ftdi->u132_lock);
913                         return b;
914                 }
915         } else if (ed_type == 0x01) {
916                 target->abandoning = 0;
917                 up(&ftdi->u132_lock);
918                 ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
919                         payload);
920                 ftdi->recieved = 0;
921                 ftdi->expected = 4;
922                 ftdi->ed_found = 0;
923                 return ftdi->response;
924         } else {
925                 target->abandoning = 0;
926                 up(&ftdi->u132_lock);
927                 ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
928                         payload);
929                 ftdi->recieved = 0;
930                 ftdi->expected = 4;
931                 ftdi->ed_found = 0;
932                 return ftdi->response;
933         }
934 }
935
936 static char *have_ed_get_response(struct usb_ftdi *ftdi,
937         struct u132_target *target, u16 ed_length, int ed_number, int ed_type,
938         char *b)
939 {
940         down(&ftdi->u132_lock);
941         target->condition_code = TD_DEVNOTRESP;
942         target->actual = (ed_length >> 0) & 0x01FF;
943         target->non_null = (ed_length >> 15) & 0x0001;
944         target->repeat_number = (ed_length >> 11) & 0x000F;
945         up(&ftdi->u132_lock);
946         if (target->active)
947                 ftdi_elan_do_callback(ftdi, target, NULL, 0);
948         target->abandoning = 0;
949         ftdi->recieved = 0;
950         ftdi->expected = 4;
951         ftdi->ed_found = 0;
952         return ftdi->response;
953 }
954
955
956 /*
957 * The engine tries to empty the FTDI fifo
958 *
959 * all responses found in the fifo data are dispatched thus
960 * the response buffer can only ever hold a maximum sized
961 * response from the Uxxx.
962 *
963 */
964 static int ftdi_elan_respond_engine(struct usb_ftdi *ftdi)
965 {
966         u8 *b = ftdi->response + ftdi->recieved;
967         int bytes_read = 0;
968         int retry_on_empty = 1;
969         int retry_on_timeout = 3;
970         int empty_packets = 0;
971       read:{
972                 int packet_bytes = 0;
973                 int retval = usb_bulk_msg(ftdi->udev,
974                         usb_rcvbulkpipe(ftdi->udev, ftdi->bulk_in_endpointAddr),
975                          ftdi->bulk_in_buffer, ftdi->bulk_in_size,
976                         &packet_bytes, msecs_to_jiffies(500));
977                 char diag[30 *3 + 4];
978                 char *d = diag;
979                 int m = packet_bytes;
980                 u8 *c = ftdi->bulk_in_buffer;
981                 int s = (sizeof(diag) - 1) / 3;
982                 diag[0] = 0;
983                 while (s-- > 0 && m-- > 0) {
984                         if (s > 0 || m == 0) {
985                                 d += sprintf(d, " %02X", *c++);
986                         } else
987                                 d += sprintf(d, " ..");
988                 }
989                 if (packet_bytes > 2) {
990                         ftdi->bulk_in_left = packet_bytes - 2;
991                         ftdi->bulk_in_last = 1;
992                         goto have;
993                 } else if (retval == -ETIMEDOUT) {
994                         if (retry_on_timeout-- > 0) {
995                                 dev_err(&ftdi->udev->dev, "TIMED OUT with packe"
996                                         "t_bytes = %d with total %d bytes%s\n",
997                                         packet_bytes, bytes_read, diag);
998                                 goto more;
999                         } else if (bytes_read > 0) {
1000                                 dev_err(&ftdi->udev->dev, "ONLY %d bytes%s\n",
1001                                         bytes_read, diag);
1002                                 return -ENOMEM;
1003                         } else {
1004                                 dev_err(&ftdi->udev->dev, "TIMED OUT with packe"
1005                                         "t_bytes = %d with total %d bytes%s\n",
1006                                         packet_bytes, bytes_read, diag);
1007                                 return -ENOMEM;
1008                         }
1009                 } else if (retval == -EILSEQ) {
1010                         dev_err(&ftdi->udev->dev, "error = %d with packet_bytes"
1011                                 " = %d with total %d bytes%s\n", retval,
1012                                 packet_bytes, bytes_read, diag);
1013                         return retval;
1014                 } else if (retval) {
1015                         dev_err(&ftdi->udev->dev, "error = %d with packet_bytes"
1016                                 " = %d with total %d bytes%s\n", retval,
1017                                 packet_bytes, bytes_read, diag);
1018                         return retval;
1019                 } else if (packet_bytes == 2) {
1020                         unsigned char s0 = ftdi->bulk_in_buffer[0];
1021                         unsigned char s1 = ftdi->bulk_in_buffer[1];
1022                         empty_packets += 1;
1023                         if (s0 == 0x31 && s1 == 0x60) {
1024                                 if (retry_on_empty-- > 0) {
1025                                         goto more;
1026                                 } else
1027                                         return 0;
1028                         } else if (s0 == 0x31 && s1 == 0x00) {
1029                                 if (retry_on_empty-- > 0) {
1030                                         goto more;
1031                                 } else
1032                                         return 0;
1033                         } else {
1034                                 if (retry_on_empty-- > 0) {
1035                                         goto more;
1036                                 } else
1037                                         return 0;
1038                         }
1039                 } else if (packet_bytes == 1) {
1040                         if (retry_on_empty-- > 0) {
1041                                 goto more;
1042                         } else
1043                                 return 0;
1044                 } else {
1045                         if (retry_on_empty-- > 0) {
1046                                 goto more;
1047                         } else
1048                                 return 0;
1049                 }
1050         }
1051       more:{
1052                 goto read;
1053         }
1054       have:if (ftdi->bulk_in_left > 0) {
1055                 u8 c = ftdi->bulk_in_buffer[++ftdi->bulk_in_last];
1056                 bytes_read += 1;
1057                 ftdi->bulk_in_left -= 1;
1058                 if (ftdi->recieved == 0 && c == 0xFF) {
1059                         goto have;
1060                 } else
1061                         *b++ = c;
1062                 if (++ftdi->recieved < ftdi->expected) {
1063                         goto have;
1064                 } else if (ftdi->ed_found) {
1065                         int ed_number = (ftdi->response[0] >> 5) & 0x03;
1066                         u16 ed_length = (ftdi->response[2] << 8) |
1067                                 ftdi->response[1];
1068                         struct u132_target *target = &ftdi->target[ed_number];
1069                         int payload = (ed_length >> 0) & 0x07FF;
1070                         char diag[30 *3 + 4];
1071                         char *d = diag;
1072                         int m = payload;
1073                         u8 *c = 4 + ftdi->response;
1074                         int s = (sizeof(diag) - 1) / 3;
1075                         diag[0] = 0;
1076                         while (s-- > 0 && m-- > 0) {
1077                                 if (s > 0 || m == 0) {
1078                                         d += sprintf(d, " %02X", *c++);
1079                                 } else
1080                                         d += sprintf(d, " ..");
1081                         }
1082                         ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
1083                                 payload);
1084                         ftdi->recieved = 0;
1085                         ftdi->expected = 4;
1086                         ftdi->ed_found = 0;
1087                         b = ftdi->response;
1088                         goto have;
1089                 } else if (ftdi->expected == 8) {
1090                         u8 buscmd;
1091                         int respond_head = ftdi->respond_head++;
1092                         struct u132_respond *respond = &ftdi->respond[
1093                                 RESPOND_MASK & respond_head];
1094                         u32 data = ftdi->response[7];
1095                         data <<= 8;
1096                         data |= ftdi->response[6];
1097                         data <<= 8;
1098                         data |= ftdi->response[5];
1099                         data <<= 8;
1100                         data |= ftdi->response[4];
1101                         *respond->value = data;
1102                         *respond->result = 0;
1103                         complete(&respond->wait_completion);
1104                         ftdi->recieved = 0;
1105                         ftdi->expected = 4;
1106                         ftdi->ed_found = 0;
1107                         b = ftdi->response;
1108                         buscmd = (ftdi->response[0] >> 0) & 0x0F;
1109                         if (buscmd == 0x00) {
1110                         } else if (buscmd == 0x02) {
1111                         } else if (buscmd == 0x06) {
1112                         } else if (buscmd == 0x0A) {
1113                         } else
1114                                 dev_err(&ftdi->udev->dev, "Uxxx unknown(%0X) va"
1115                                         "lue = %08X\n", buscmd, data);
1116                         goto have;
1117                 } else {
1118                         if ((ftdi->response[0] & 0x80) == 0x00) {
1119                                 ftdi->expected = 8;
1120                                 goto have;
1121                         } else {
1122                                 int ed_number = (ftdi->response[0] >> 5) & 0x03;
1123                                 int ed_type = (ftdi->response[0] >> 0) & 0x03;
1124                                 u16 ed_length = (ftdi->response[2] << 8) |
1125                                         ftdi->response[1];
1126                                 struct u132_target *target = &ftdi->target[
1127                                         ed_number];
1128                                 target->halted = (ftdi->response[0] >> 3) &
1129                                         0x01;
1130                                 target->skipped = (ftdi->response[0] >> 2) &
1131                                         0x01;
1132                                 target->toggle_bits = (ftdi->response[3] >> 6)
1133                                         & 0x03;
1134                                 target->error_count = (ftdi->response[3] >> 4)
1135                                         & 0x03;
1136                                 target->condition_code = (ftdi->response[
1137                                         3] >> 0) & 0x0F;
1138                                 if ((ftdi->response[0] & 0x10) == 0x00) {
1139                                         b = have_ed_set_response(ftdi, target,
1140                                                 ed_length, ed_number, ed_type,
1141                                                 b);
1142                                         goto have;
1143                                 } else {
1144                                         b = have_ed_get_response(ftdi, target,
1145                                                 ed_length, ed_number, ed_type,
1146                                                 b);
1147                                         goto have;
1148                                 }
1149                         }
1150                 }
1151         } else
1152                 goto more;
1153 }
1154
1155
1156 /*
1157 * create a urb, and a buffer for it, and copy the data to the urb
1158 *
1159 */
1160 static ssize_t ftdi_elan_write(struct file *file,
1161                                const char __user *user_buffer, size_t count,
1162                                loff_t *ppos)
1163 {
1164         int retval = 0;
1165         struct urb *urb;
1166         char *buf;
1167         struct usb_ftdi *ftdi = file->private_data;
1168
1169         if (ftdi->disconnected > 0) {
1170                 return -ENODEV;
1171         }
1172         if (count == 0) {
1173                 goto exit;
1174         }
1175         urb = usb_alloc_urb(0, GFP_KERNEL);
1176         if (!urb) {
1177                 retval = -ENOMEM;
1178                 goto error_1;
1179         }
1180         buf = usb_buffer_alloc(ftdi->udev, count, GFP_KERNEL,
1181                 &urb->transfer_dma);
1182         if (!buf) {
1183                 retval = -ENOMEM;
1184                 goto error_2;
1185         }
1186         if (copy_from_user(buf, user_buffer, count)) {
1187                 retval = -EFAULT;
1188                 goto error_3;
1189         }
1190         usb_fill_bulk_urb(urb, ftdi->udev, usb_sndbulkpipe(ftdi->udev,
1191                 ftdi->bulk_out_endpointAddr), buf, count,
1192                 ftdi_elan_write_bulk_callback, ftdi);
1193         urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1194         retval = usb_submit_urb(urb, GFP_KERNEL);
1195         if (retval) {
1196                 dev_err(&ftdi->udev->dev, "failed submitting write urb, error %"
1197                         "d\n", retval);
1198                 goto error_3;
1199         }
1200         usb_free_urb(urb);
1201
1202 exit:
1203         return count;
1204 error_3:
1205         usb_buffer_free(ftdi->udev, count, buf, urb->transfer_dma);
1206 error_2:
1207         usb_free_urb(urb);
1208 error_1:
1209         return retval;
1210 }
1211
1212 static const struct file_operations ftdi_elan_fops = {
1213         .owner = THIS_MODULE,
1214         .llseek = no_llseek,
1215         .ioctl = ftdi_elan_ioctl,
1216         .read = ftdi_elan_read,
1217         .write = ftdi_elan_write,
1218         .open = ftdi_elan_open,
1219         .release = ftdi_elan_release,
1220 };
1221
1222 /*
1223 * usb class driver info in order to get a minor number from the usb core,
1224 * and to have the device registered with the driver core
1225 */
1226 static struct usb_class_driver ftdi_elan_jtag_class = {
1227         .name = "ftdi-%d-jtag",
1228         .fops = &ftdi_elan_fops,
1229         .minor_base = USB_FTDI_ELAN_MINOR_BASE,
1230 };
1231
1232 /*
1233 * the following definitions are for the
1234 * ELAN FPGA state machgine processor that
1235 * lies on the other side of the FTDI chip
1236 */
1237 #define cPCIu132rd 0x0
1238 #define cPCIu132wr 0x1
1239 #define cPCIiord 0x2
1240 #define cPCIiowr 0x3
1241 #define cPCImemrd 0x6
1242 #define cPCImemwr 0x7
1243 #define cPCIcfgrd 0xA
1244 #define cPCIcfgwr 0xB
1245 #define cPCInull 0xF
1246 #define cU132cmd_status 0x0
1247 #define cU132flash 0x1
1248 #define cPIDsetup 0x0
1249 #define cPIDout 0x1
1250 #define cPIDin 0x2
1251 #define cPIDinonce 0x3
1252 #define cCCnoerror 0x0
1253 #define cCCcrc 0x1
1254 #define cCCbitstuff 0x2
1255 #define cCCtoggle 0x3
1256 #define cCCstall 0x4
1257 #define cCCnoresp 0x5
1258 #define cCCbadpid1 0x6
1259 #define cCCbadpid2 0x7
1260 #define cCCdataoverrun 0x8
1261 #define cCCdataunderrun 0x9
1262 #define cCCbuffoverrun 0xC
1263 #define cCCbuffunderrun 0xD
1264 #define cCCnotaccessed 0xF
1265 static int ftdi_elan_write_reg(struct usb_ftdi *ftdi, u32 data)
1266 {
1267       wait:if (ftdi->disconnected > 0) {
1268                 return -ENODEV;
1269         } else {
1270                 int command_size;
1271                 down(&ftdi->u132_lock);
1272                 command_size = ftdi->command_next - ftdi->command_head;
1273                 if (command_size < COMMAND_SIZE) {
1274                         struct u132_command *command = &ftdi->command[
1275                                 COMMAND_MASK & ftdi->command_next];
1276                         command->header = 0x00 | cPCIu132wr;
1277                         command->length = 0x04;
1278                         command->address = 0x00;
1279                         command->width = 0x00;
1280                         command->follows = 4;
1281                         command->value = data;
1282                         command->buffer = &command->value;
1283                         ftdi->command_next += 1;
1284                         ftdi_elan_kick_command_queue(ftdi);
1285                         up(&ftdi->u132_lock);
1286                         return 0;
1287                 } else {
1288                         up(&ftdi->u132_lock);
1289                         msleep(100);
1290                         goto wait;
1291                 }
1292         }
1293 }
1294
1295 static int ftdi_elan_write_config(struct usb_ftdi *ftdi, int config_offset,
1296         u8 width, u32 data)
1297 {
1298         u8 addressofs = config_offset / 4;
1299       wait:if (ftdi->disconnected > 0) {
1300                 return -ENODEV;
1301         } else {
1302                 int command_size;
1303                 down(&ftdi->u132_lock);
1304                 command_size = ftdi->command_next - ftdi->command_head;
1305                 if (command_size < COMMAND_SIZE) {
1306                         struct u132_command *command = &ftdi->command[
1307                                 COMMAND_MASK & ftdi->command_next];
1308                         command->header = 0x00 | (cPCIcfgwr & 0x0F);
1309                         command->length = 0x04;
1310                         command->address = addressofs;
1311                         command->width = 0x00 | (width & 0x0F);
1312                         command->follows = 4;
1313                         command->value = data;
1314                         command->buffer = &command->value;
1315                         ftdi->command_next += 1;
1316                         ftdi_elan_kick_command_queue(ftdi);
1317                         up(&ftdi->u132_lock);
1318                         return 0;
1319                 } else {
1320                         up(&ftdi->u132_lock);
1321                         msleep(100);
1322                         goto wait;
1323                 }
1324         }
1325 }
1326
1327 static int ftdi_elan_write_pcimem(struct usb_ftdi *ftdi, int mem_offset,
1328         u8 width, u32 data)
1329 {
1330         u8 addressofs = mem_offset / 4;
1331       wait:if (ftdi->disconnected > 0) {
1332                 return -ENODEV;
1333         } else {
1334                 int command_size;
1335                 down(&ftdi->u132_lock);
1336                 command_size = ftdi->command_next - ftdi->command_head;
1337                 if (command_size < COMMAND_SIZE) {
1338                         struct u132_command *command = &ftdi->command[
1339                                 COMMAND_MASK & ftdi->command_next];
1340                         command->header = 0x00 | (cPCImemwr & 0x0F);
1341                         command->length = 0x04;
1342                         command->address = addressofs;
1343                         command->width = 0x00 | (width & 0x0F);
1344                         command->follows = 4;
1345                         command->value = data;
1346                         command->buffer = &command->value;
1347                         ftdi->command_next += 1;
1348                         ftdi_elan_kick_command_queue(ftdi);
1349                         up(&ftdi->u132_lock);
1350                         return 0;
1351                 } else {
1352                         up(&ftdi->u132_lock);
1353                         msleep(100);
1354                         goto wait;
1355                 }
1356         }
1357 }
1358
1359 int usb_ftdi_elan_write_pcimem(struct platform_device *pdev, int mem_offset,
1360         u8 width, u32 data)
1361 {
1362         struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
1363         return ftdi_elan_write_pcimem(ftdi, mem_offset, width, data);
1364 }
1365
1366
1367 EXPORT_SYMBOL_GPL(usb_ftdi_elan_write_pcimem);
1368 static int ftdi_elan_read_reg(struct usb_ftdi *ftdi, u32 *data)
1369 {
1370       wait:if (ftdi->disconnected > 0) {
1371                 return -ENODEV;
1372         } else {
1373                 int command_size;
1374                 int respond_size;
1375                 down(&ftdi->u132_lock);
1376                 command_size = ftdi->command_next - ftdi->command_head;
1377                 respond_size = ftdi->respond_next - ftdi->respond_head;
1378                 if (command_size < COMMAND_SIZE && respond_size < RESPOND_SIZE)
1379                         {
1380                         struct u132_command *command = &ftdi->command[
1381                                 COMMAND_MASK & ftdi->command_next];
1382                         struct u132_respond *respond = &ftdi->respond[
1383                                 RESPOND_MASK & ftdi->respond_next];
1384                         int result = -ENODEV;
1385                         respond->result = &result;
1386                         respond->header = command->header = 0x00 | cPCIu132rd;
1387                         command->length = 0x04;
1388                         respond->address = command->address = cU132cmd_status;
1389                         command->width = 0x00;
1390                         command->follows = 0;
1391                         command->value = 0;
1392                         command->buffer = NULL;
1393                         respond->value = data;
1394                         init_completion(&respond->wait_completion);
1395                         ftdi->command_next += 1;
1396                         ftdi->respond_next += 1;
1397                         ftdi_elan_kick_command_queue(ftdi);
1398                         up(&ftdi->u132_lock);
1399                         wait_for_completion(&respond->wait_completion);
1400                         return result;
1401                 } else {
1402                         up(&ftdi->u132_lock);
1403                         msleep(100);
1404                         goto wait;
1405                 }
1406         }
1407 }
1408
1409 static int ftdi_elan_read_config(struct usb_ftdi *ftdi, int config_offset,
1410         u8 width, u32 *data)
1411 {
1412         u8 addressofs = config_offset / 4;
1413       wait:if (ftdi->disconnected > 0) {
1414                 return -ENODEV;
1415         } else {
1416                 int command_size;
1417                 int respond_size;
1418                 down(&ftdi->u132_lock);
1419                 command_size = ftdi->command_next - ftdi->command_head;
1420                 respond_size = ftdi->respond_next - ftdi->respond_head;
1421                 if (command_size < COMMAND_SIZE && respond_size < RESPOND_SIZE)
1422                         {
1423                         struct u132_command *command = &ftdi->command[
1424                                 COMMAND_MASK & ftdi->command_next];
1425                         struct u132_respond *respond = &ftdi->respond[
1426                                 RESPOND_MASK & ftdi->respond_next];
1427                         int result = -ENODEV;
1428                         respond->result = &result;
1429                         respond->header = command->header = 0x00 | (cPCIcfgrd &
1430                                 0x0F);
1431                         command->length = 0x04;
1432                         respond->address = command->address = addressofs;
1433                         command->width = 0x00 | (width & 0x0F);
1434                         command->follows = 0;
1435                         command->value = 0;
1436                         command->buffer = NULL;
1437                         respond->value = data;
1438                         init_completion(&respond->wait_completion);
1439                         ftdi->command_next += 1;
1440                         ftdi->respond_next += 1;
1441                         ftdi_elan_kick_command_queue(ftdi);
1442                         up(&ftdi->u132_lock);
1443                         wait_for_completion(&respond->wait_completion);
1444                         return result;
1445                 } else {
1446                         up(&ftdi->u132_lock);
1447                         msleep(100);
1448                         goto wait;
1449                 }
1450         }
1451 }
1452
1453 static int ftdi_elan_read_pcimem(struct usb_ftdi *ftdi, int mem_offset,
1454         u8 width, u32 *data)
1455 {
1456         u8 addressofs = mem_offset / 4;
1457       wait:if (ftdi->disconnected > 0) {
1458                 return -ENODEV;
1459         } else {
1460                 int command_size;
1461                 int respond_size;
1462                 down(&ftdi->u132_lock);
1463                 command_size = ftdi->command_next - ftdi->command_head;
1464                 respond_size = ftdi->respond_next - ftdi->respond_head;
1465                 if (command_size < COMMAND_SIZE && respond_size < RESPOND_SIZE)
1466                         {
1467                         struct u132_command *command = &ftdi->command[
1468                                 COMMAND_MASK & ftdi->command_next];
1469                         struct u132_respond *respond = &ftdi->respond[
1470                                 RESPOND_MASK & ftdi->respond_next];
1471                         int result = -ENODEV;
1472                         respond->result = &result;
1473                         respond->header = command->header = 0x00 | (cPCImemrd &
1474                                 0x0F);
1475                         command->length = 0x04;
1476                         respond->address = command->address = addressofs;
1477                         command->width = 0x00 | (width & 0x0F);
1478                         command->follows = 0;
1479                         command->value = 0;
1480                         command->buffer = NULL;
1481                         respond->value = data;
1482                         init_completion(&respond->wait_completion);
1483                         ftdi->command_next += 1;
1484                         ftdi->respond_next += 1;
1485                         ftdi_elan_kick_command_queue(ftdi);
1486                         up(&ftdi->u132_lock);
1487                         wait_for_completion(&respond->wait_completion);
1488                         return result;
1489                 } else {
1490                         up(&ftdi->u132_lock);
1491                         msleep(100);
1492                         goto wait;
1493                 }
1494         }
1495 }
1496
1497 int usb_ftdi_elan_read_pcimem(struct platform_device *pdev, int mem_offset,
1498         u8 width, u32 *data)
1499 {
1500         struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
1501         if (ftdi->initialized == 0) {
1502                 return -ENODEV;
1503         } else
1504                 return ftdi_elan_read_pcimem(ftdi, mem_offset, width, data);
1505 }
1506
1507
1508 EXPORT_SYMBOL_GPL(usb_ftdi_elan_read_pcimem);
1509 static int ftdi_elan_edset_setup(struct usb_ftdi *ftdi, u8 ed_number,
1510         void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
1511         void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
1512         int toggle_bits, int error_count, int condition_code, int repeat_number,
1513          int halted, int skipped, int actual, int non_null))
1514 {
1515         u8 ed = ed_number - 1;
1516       wait:if (ftdi->disconnected > 0) {
1517                 return -ENODEV;
1518         } else if (ftdi->initialized == 0) {
1519                 return -ENODEV;
1520         } else {
1521                 int command_size;
1522                 down(&ftdi->u132_lock);
1523                 command_size = ftdi->command_next - ftdi->command_head;
1524                 if (command_size < COMMAND_SIZE) {
1525                         struct u132_target *target = &ftdi->target[ed];
1526                         struct u132_command *command = &ftdi->command[
1527                                 COMMAND_MASK & ftdi->command_next];
1528                         command->header = 0x80 | (ed << 5);
1529                         command->length = 0x8007;
1530                         command->address = (toggle_bits << 6) | (ep_number << 2)
1531                                 | (address << 0);
1532                         command->width = usb_maxpacket(urb->dev, urb->pipe,
1533                                 usb_pipeout(urb->pipe));
1534                         command->follows = 8;
1535                         command->value = 0;
1536                         command->buffer = urb->setup_packet;
1537                         target->callback = callback;
1538                         target->endp = endp;
1539                         target->urb = urb;
1540                         target->active = 1;
1541                         ftdi->command_next += 1;
1542                         ftdi_elan_kick_command_queue(ftdi);
1543                         up(&ftdi->u132_lock);
1544                         return 0;
1545                 } else {
1546                         up(&ftdi->u132_lock);
1547                         msleep(100);
1548                         goto wait;
1549                 }
1550         }
1551 }
1552
1553 int usb_ftdi_elan_edset_setup(struct platform_device *pdev, u8 ed_number,
1554         void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
1555         void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
1556         int toggle_bits, int error_count, int condition_code, int repeat_number,
1557          int halted, int skipped, int actual, int non_null))
1558 {
1559         struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
1560         return ftdi_elan_edset_setup(ftdi, ed_number, endp, urb, address,
1561                 ep_number, toggle_bits, callback);
1562 }
1563
1564
1565 EXPORT_SYMBOL_GPL(usb_ftdi_elan_edset_setup);
1566 static int ftdi_elan_edset_input(struct usb_ftdi *ftdi, u8 ed_number,
1567         void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
1568         void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
1569         int toggle_bits, int error_count, int condition_code, int repeat_number,
1570          int halted, int skipped, int actual, int non_null))
1571 {
1572         u8 ed = ed_number - 1;
1573       wait:if (ftdi->disconnected > 0) {
1574                 return -ENODEV;
1575         } else if (ftdi->initialized == 0) {
1576                 return -ENODEV;
1577         } else {
1578                 int command_size;
1579                 down(&ftdi->u132_lock);
1580                 command_size = ftdi->command_next - ftdi->command_head;
1581                 if (command_size < COMMAND_SIZE) {
1582                         struct u132_target *target = &ftdi->target[ed];
1583                         struct u132_command *command = &ftdi->command[
1584                                 COMMAND_MASK & ftdi->command_next];
1585                         int remaining_length = urb->transfer_buffer_length -
1586                                 urb->actual_length;
1587                         command->header = 0x82 | (ed << 5);
1588                         if (remaining_length == 0) {
1589                                 command->length = 0x0000;
1590                         } else if (remaining_length > 1024) {
1591                                 command->length = 0x8000 | 1023;
1592                         } else
1593                                 command->length = 0x8000 | (remaining_length -
1594                                         1);
1595                         command->address = (toggle_bits << 6) | (ep_number << 2)
1596                                 | (address << 0);
1597                         command->width = usb_maxpacket(urb->dev, urb->pipe,
1598                                 usb_pipeout(urb->pipe));
1599                         command->follows = 0;
1600                         command->value = 0;
1601                         command->buffer = NULL;
1602                         target->callback = callback;
1603                         target->endp = endp;
1604                         target->urb = urb;
1605                         target->active = 1;
1606                         ftdi->command_next += 1;
1607                         ftdi_elan_kick_command_queue(ftdi);
1608                         up(&ftdi->u132_lock);
1609                         return 0;
1610                 } else {
1611                         up(&ftdi->u132_lock);
1612                         msleep(100);
1613                         goto wait;
1614                 }
1615         }
1616 }
1617
1618 int usb_ftdi_elan_edset_input(struct platform_device *pdev, u8 ed_number,
1619         void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
1620         void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
1621         int toggle_bits, int error_count, int condition_code, int repeat_number,
1622          int halted, int skipped, int actual, int non_null))
1623 {
1624         struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
1625         return ftdi_elan_edset_input(ftdi, ed_number, endp, urb, address,
1626                 ep_number, toggle_bits, callback);
1627 }
1628
1629
1630 EXPORT_SYMBOL_GPL(usb_ftdi_elan_edset_input);
1631 static int ftdi_elan_edset_empty(struct usb_ftdi *ftdi, u8 ed_number,
1632         void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
1633         void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
1634         int toggle_bits, int error_count, int condition_code, int repeat_number,
1635          int halted, int skipped, int actual, int non_null))
1636 {
1637         u8 ed = ed_number - 1;
1638       wait:if (ftdi->disconnected > 0) {
1639                 return -ENODEV;
1640         } else if (ftdi->initialized == 0) {
1641                 return -ENODEV;
1642         } else {
1643                 int command_size;
1644                 down(&ftdi->u132_lock);
1645                 command_size = ftdi->command_next - ftdi->command_head;
1646                 if (command_size < COMMAND_SIZE) {
1647                         struct u132_target *target = &ftdi->target[ed];
1648                         struct u132_command *command = &ftdi->command[
1649                                 COMMAND_MASK & ftdi->command_next];
1650                         command->header = 0x81 | (ed << 5);
1651                         command->length = 0x0000;
1652                         command->address = (toggle_bits << 6) | (ep_number << 2)
1653                                 | (address << 0);
1654                         command->width = usb_maxpacket(urb->dev, urb->pipe,
1655                                 usb_pipeout(urb->pipe));
1656                         command->follows = 0;
1657                         command->value = 0;
1658                         command->buffer = NULL;
1659                         target->callback = callback;
1660                         target->endp = endp;
1661                         target->urb = urb;
1662                         target->active = 1;
1663                         ftdi->command_next += 1;
1664                         ftdi_elan_kick_command_queue(ftdi);
1665                         up(&ftdi->u132_lock);
1666                         return 0;
1667                 } else {
1668                         up(&ftdi->u132_lock);
1669                         msleep(100);
1670                         goto wait;
1671                 }
1672         }
1673 }
1674
1675 int usb_ftdi_elan_edset_empty(struct platform_device *pdev, u8 ed_number,
1676         void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
1677         void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
1678         int toggle_bits, int error_count, int condition_code, int repeat_number,
1679          int halted, int skipped, int actual, int non_null))
1680 {
1681         struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
1682         return ftdi_elan_edset_empty(ftdi, ed_number, endp, urb, address,
1683                 ep_number, toggle_bits, callback);
1684 }
1685
1686
1687 EXPORT_SYMBOL_GPL(usb_ftdi_elan_edset_empty);
1688 static int ftdi_elan_edset_output(struct usb_ftdi *ftdi, u8 ed_number,
1689         void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
1690         void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
1691         int toggle_bits, int error_count, int condition_code, int repeat_number,
1692          int halted, int skipped, int actual, int non_null))
1693 {
1694         u8 ed = ed_number - 1;
1695       wait:if (ftdi->disconnected > 0) {
1696                 return -ENODEV;
1697         } else if (ftdi->initialized == 0) {
1698                 return -ENODEV;
1699         } else {
1700                 int command_size;
1701                 down(&ftdi->u132_lock);
1702                 command_size = ftdi->command_next - ftdi->command_head;
1703                 if (command_size < COMMAND_SIZE) {
1704                         u8 *b;
1705                         u16 urb_size;
1706                         int i = 0;
1707                         char data[30 *3 + 4];
1708                         char *d = data;
1709                         int m = (sizeof(data) - 1) / 3;
1710                         int l = 0;
1711                         struct u132_target *target = &ftdi->target[ed];
1712                         struct u132_command *command = &ftdi->command[
1713                                 COMMAND_MASK & ftdi->command_next];
1714                         command->header = 0x81 | (ed << 5);
1715                         command->address = (toggle_bits << 6) | (ep_number << 2)
1716                                 | (address << 0);
1717                         command->width = usb_maxpacket(urb->dev, urb->pipe,
1718                                 usb_pipeout(urb->pipe));
1719                         command->follows = min(1024,
1720                                 urb->transfer_buffer_length -
1721                                 urb->actual_length);
1722                         command->value = 0;
1723                         command->buffer = urb->transfer_buffer +
1724                                 urb->actual_length;
1725                         command->length = 0x8000 | (command->follows - 1);
1726                         b = command->buffer;
1727                         urb_size = command->follows;
1728                         data[0] = 0;
1729                         while (urb_size-- > 0) {
1730                                 if (i > m) {
1731                                 } else if (i++ < m) {
1732                                         int w = sprintf(d, " %02X", *b++);
1733                                         d += w;
1734                                         l += w;
1735                                 } else
1736                                         d += sprintf(d, " ..");
1737                         }
1738                         target->callback = callback;
1739                         target->endp = endp;
1740                         target->urb = urb;
1741                         target->active = 1;
1742                         ftdi->command_next += 1;
1743                         ftdi_elan_kick_command_queue(ftdi);
1744                         up(&ftdi->u132_lock);
1745                         return 0;
1746                 } else {
1747                         up(&ftdi->u132_lock);
1748                         msleep(100);
1749                         goto wait;
1750                 }
1751         }
1752 }
1753
1754 int usb_ftdi_elan_edset_output(struct platform_device *pdev, u8 ed_number,
1755         void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
1756         void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
1757         int toggle_bits, int error_count, int condition_code, int repeat_number,
1758          int halted, int skipped, int actual, int non_null))
1759 {
1760         struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
1761         return ftdi_elan_edset_output(ftdi, ed_number, endp, urb, address,
1762                 ep_number, toggle_bits, callback);
1763 }
1764
1765
1766 EXPORT_SYMBOL_GPL(usb_ftdi_elan_edset_output);
1767 static int ftdi_elan_edset_single(struct usb_ftdi *ftdi, u8 ed_number,
1768         void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
1769         void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
1770         int toggle_bits, int error_count, int condition_code, int repeat_number,
1771          int halted, int skipped, int actual, int non_null))
1772 {
1773         u8 ed = ed_number - 1;
1774       wait:if (ftdi->disconnected > 0) {
1775                 return -ENODEV;
1776         } else if (ftdi->initialized == 0) {
1777                 return -ENODEV;
1778         } else {
1779                 int command_size;
1780                 down(&ftdi->u132_lock);
1781                 command_size = ftdi->command_next - ftdi->command_head;
1782                 if (command_size < COMMAND_SIZE) {
1783                         int remaining_length = urb->transfer_buffer_length -
1784                                 urb->actual_length;
1785                         struct u132_target *target = &ftdi->target[ed];
1786                         struct u132_command *command = &ftdi->command[
1787                                 COMMAND_MASK & ftdi->command_next];
1788                         command->header = 0x83 | (ed << 5);
1789                         if (remaining_length == 0) {
1790                                 command->length = 0x0000;
1791                         } else if (remaining_length > 1024) {
1792                                 command->length = 0x8000 | 1023;
1793                         } else
1794                                 command->length = 0x8000 | (remaining_length -
1795                                         1);
1796                         command->address = (toggle_bits << 6) | (ep_number << 2)
1797                                 | (address << 0);
1798                         command->width = usb_maxpacket(urb->dev, urb->pipe,
1799                                 usb_pipeout(urb->pipe));
1800                         command->follows = 0;
1801                         command->value = 0;
1802                         command->buffer = NULL;
1803                         target->callback = callback;
1804                         target->endp = endp;
1805                         target->urb = urb;
1806                         target->active = 1;
1807                         ftdi->command_next += 1;
1808                         ftdi_elan_kick_command_queue(ftdi);
1809                         up(&ftdi->u132_lock);
1810                         return 0;
1811                 } else {
1812                         up(&ftdi->u132_lock);
1813                         msleep(100);
1814                         goto wait;
1815                 }
1816         }
1817 }
1818
1819 int usb_ftdi_elan_edset_single(struct platform_device *pdev, u8 ed_number,
1820         void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
1821         void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
1822         int toggle_bits, int error_count, int condition_code, int repeat_number,
1823          int halted, int skipped, int actual, int non_null))
1824 {
1825         struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
1826         return ftdi_elan_edset_single(ftdi, ed_number, endp, urb, address,
1827                 ep_number, toggle_bits, callback);
1828 }
1829
1830
1831 EXPORT_SYMBOL_GPL(usb_ftdi_elan_edset_single);
1832 static int ftdi_elan_edset_flush(struct usb_ftdi *ftdi, u8 ed_number,
1833         void *endp)
1834 {
1835         u8 ed = ed_number - 1;
1836         if (ftdi->disconnected > 0) {
1837                 return -ENODEV;
1838         } else if (ftdi->initialized == 0) {
1839                 return -ENODEV;
1840         } else {
1841                 struct u132_target *target = &ftdi->target[ed];
1842                 down(&ftdi->u132_lock);
1843                 if (target->abandoning > 0) {
1844                         up(&ftdi->u132_lock);
1845                         return 0;
1846                 } else {
1847                         target->abandoning = 1;
1848                       wait_1:if (target->active == 1) {
1849                                 int command_size = ftdi->command_next -
1850                                         ftdi->command_head;
1851                                 if (command_size < COMMAND_SIZE) {
1852                                         struct u132_command *command =
1853                                                 &ftdi->command[COMMAND_MASK &
1854                                                 ftdi->command_next];
1855                                         command->header = 0x80 | (ed << 5) |
1856                                                 0x4;
1857                                         command->length = 0x00;
1858                                         command->address = 0x00;
1859                                         command->width = 0x00;
1860                                         command->follows = 0;
1861                                         command->value = 0;
1862                                         command->buffer = &command->value;
1863                                         ftdi->command_next += 1;
1864                                         ftdi_elan_kick_command_queue(ftdi);
1865                                 } else {
1866                                         up(&ftdi->u132_lock);
1867                                         msleep(100);
1868                                         down(&ftdi->u132_lock);
1869                                         goto wait_1;
1870                                 }
1871                         }
1872                         up(&ftdi->u132_lock);
1873                         return 0;
1874                 }
1875         }
1876 }
1877
1878 int usb_ftdi_elan_edset_flush(struct platform_device *pdev, u8 ed_number,
1879         void *endp)
1880 {
1881         struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
1882         return ftdi_elan_edset_flush(ftdi, ed_number, endp);
1883 }
1884
1885
1886 EXPORT_SYMBOL_GPL(usb_ftdi_elan_edset_flush);
1887 static int ftdi_elan_flush_input_fifo(struct usb_ftdi *ftdi)
1888 {
1889         int retry_on_empty = 10;
1890         int retry_on_timeout = 5;
1891         int retry_on_status = 20;
1892       more:{
1893                 int packet_bytes = 0;
1894                 int retval = usb_bulk_msg(ftdi->udev,
1895                         usb_rcvbulkpipe(ftdi->udev, ftdi->bulk_in_endpointAddr),
1896                          ftdi->bulk_in_buffer, ftdi->bulk_in_size,
1897                         &packet_bytes, msecs_to_jiffies(100));
1898                 if (packet_bytes > 2) {
1899                         char diag[30 *3 + 4];
1900                         char *d = diag;
1901                         int m = (sizeof(diag) - 1) / 3;
1902                         char *b = ftdi->bulk_in_buffer;
1903                         int bytes_read = 0;
1904                         diag[0] = 0;
1905                         while (packet_bytes-- > 0) {
1906                                 char c = *b++;
1907                                 if (bytes_read < m) {
1908                                         d += sprintf(d, " %02X",
1909                                                 0x000000FF & c);
1910                                 } else if (bytes_read > m) {
1911                                 } else
1912                                         d += sprintf(d, " ..");
1913                                 bytes_read += 1;
1914                                 continue;
1915                         }
1916                         goto more;
1917                 } else if (packet_bytes > 1) {
1918                         char s1 = ftdi->bulk_in_buffer[0];
1919                         char s2 = ftdi->bulk_in_buffer[1];
1920                         if (s1 == 0x31 && s2 == 0x60) {
1921                                 return 0;
1922                         } else if (retry_on_status-- > 0) {
1923                                 goto more;
1924                         } else {
1925                                 dev_err(&ftdi->udev->dev, "STATUS ERROR retry l"
1926                                         "imit reached\n");
1927                                 return -EFAULT;
1928                         }
1929                 } else if (packet_bytes > 0) {
1930                         char b1 = ftdi->bulk_in_buffer[0];
1931                         dev_err(&ftdi->udev->dev, "only one byte flushed from F"
1932                                 "TDI = %02X\n", b1);
1933                         if (retry_on_status-- > 0) {
1934                                 goto more;
1935                         } else {
1936                                 dev_err(&ftdi->udev->dev, "STATUS ERROR retry l"
1937                                         "imit reached\n");
1938                                 return -EFAULT;
1939                         }
1940                 } else if (retval == -ETIMEDOUT) {
1941                         if (retry_on_timeout-- > 0) {
1942                                 goto more;
1943                         } else {
1944                                 dev_err(&ftdi->udev->dev, "TIMED OUT retry limi"
1945                                         "t reached\n");
1946                                 return -ENOMEM;
1947                         }
1948                 } else if (retval == 0) {
1949                         if (retry_on_empty-- > 0) {
1950                                 goto more;
1951                         } else {
1952                                 dev_err(&ftdi->udev->dev, "empty packet retry l"
1953                                         "imit reached\n");
1954                                 return -ENOMEM;
1955                         }
1956                 } else {
1957                         dev_err(&ftdi->udev->dev, "error = %d\n", retval);
1958                         return retval;
1959                 }
1960         }
1961         return -1;
1962 }
1963
1964
1965 /*
1966 * send the long flush sequence
1967 *
1968 */
1969 static int ftdi_elan_synchronize_flush(struct usb_ftdi *ftdi)
1970 {
1971         int retval;
1972         struct urb *urb;
1973         char *buf;
1974         int I = 257;
1975         int i = 0;
1976         urb = usb_alloc_urb(0, GFP_KERNEL);
1977         if (!urb) {
1978                 dev_err(&ftdi->udev->dev, "could not alloc a urb for flush sequ"
1979                         "ence\n");
1980                 return -ENOMEM;
1981         }
1982         buf = usb_buffer_alloc(ftdi->udev, I, GFP_KERNEL, &urb->transfer_dma);
1983         if (!buf) {
1984                 dev_err(&ftdi->udev->dev, "could not get a buffer for flush seq"
1985                         "uence\n");
1986                 usb_free_urb(urb);
1987                 return -ENOMEM;
1988         }
1989         while (I-- > 0)
1990                 buf[i++] = 0x55;
1991         usb_fill_bulk_urb(urb, ftdi->udev, usb_sndbulkpipe(ftdi->udev,
1992                 ftdi->bulk_out_endpointAddr), buf, i,
1993                 ftdi_elan_write_bulk_callback, ftdi);
1994         urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1995         retval = usb_submit_urb(urb, GFP_KERNEL);
1996         if (retval) {
1997                 dev_err(&ftdi->udev->dev, "failed to submit urb containing the "
1998                         "flush sequence\n");
1999                 usb_buffer_free(ftdi->udev, i, buf, urb->transfer_dma);
2000                 usb_free_urb(urb);
2001                 return -ENOMEM;
2002         }
2003         usb_free_urb(urb);
2004         return 0;
2005 }
2006
2007
2008 /*
2009 * send the reset sequence
2010 *
2011 */
2012 static int ftdi_elan_synchronize_reset(struct usb_ftdi *ftdi)
2013 {
2014         int retval;
2015         struct urb *urb;
2016         char *buf;
2017         int I = 4;
2018         int i = 0;
2019         urb = usb_alloc_urb(0, GFP_KERNEL);
2020         if (!urb) {
2021                 dev_err(&ftdi->udev->dev, "could not get a urb for the reset se"
2022                         "quence\n");
2023                 return -ENOMEM;
2024         }
2025         buf = usb_buffer_alloc(ftdi->udev, I, GFP_KERNEL, &urb->transfer_dma);
2026         if (!buf) {
2027                 dev_err(&ftdi->udev->dev, "could not get a buffer for the reset"
2028                         " sequence\n");
2029                 usb_free_urb(urb);
2030                 return -ENOMEM;
2031         }
2032         buf[i++] = 0x55;
2033         buf[i++] = 0xAA;
2034         buf[i++] = 0x5A;
2035         buf[i++] = 0xA5;
2036         usb_fill_bulk_urb(urb, ftdi->udev, usb_sndbulkpipe(ftdi->udev,
2037                 ftdi->bulk_out_endpointAddr), buf, i,
2038                 ftdi_elan_write_bulk_callback, ftdi);
2039         urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
2040         retval = usb_submit_urb(urb, GFP_KERNEL);
2041         if (retval) {
2042                 dev_err(&ftdi->udev->dev, "failed to submit urb containing the "
2043                         "reset sequence\n");
2044                 usb_buffer_free(ftdi->udev, i, buf, urb->transfer_dma);
2045                 usb_free_urb(urb);
2046                 return -ENOMEM;
2047         }
2048         usb_free_urb(urb);
2049         return 0;
2050 }
2051
2052 static int ftdi_elan_synchronize(struct usb_ftdi *ftdi)
2053 {
2054         int retval;
2055         int long_stop = 10;
2056         int retry_on_timeout = 5;
2057         int retry_on_empty = 10;
2058         int err_count = 0;
2059         retval = ftdi_elan_flush_input_fifo(ftdi);
2060         if (retval)
2061                 return retval;
2062         ftdi->bulk_in_left = 0;
2063         ftdi->bulk_in_last = -1;
2064         while (long_stop-- > 0) {
2065                 int read_stop;
2066                 int read_stuck;
2067                 retval = ftdi_elan_synchronize_flush(ftdi);
2068                 if (retval)
2069                         return retval;
2070                 retval = ftdi_elan_flush_input_fifo(ftdi);
2071                 if (retval)
2072                         return retval;
2073               reset:retval = ftdi_elan_synchronize_reset(ftdi);
2074                 if (retval)
2075                         return retval;
2076                 read_stop = 100;
2077                 read_stuck = 10;
2078               read:{
2079                         int packet_bytes = 0;
2080                         retval = usb_bulk_msg(ftdi->udev,
2081                                 usb_rcvbulkpipe(ftdi->udev,
2082                                 ftdi->bulk_in_endpointAddr),
2083                                 ftdi->bulk_in_buffer, ftdi->bulk_in_size,
2084                                 &packet_bytes, msecs_to_jiffies(500));
2085                         if (packet_bytes > 2) {
2086                                 char diag[30 *3 + 4];
2087                                 char *d = diag;
2088                                 int m = (sizeof(diag) - 1) / 3;
2089                                 char *b = ftdi->bulk_in_buffer;
2090                                 int bytes_read = 0;
2091                                 unsigned char c = 0;
2092                                 diag[0] = 0;
2093                                 while (packet_bytes-- > 0) {
2094                                         c = *b++;
2095                                         if (bytes_read < m) {
2096                                                 d += sprintf(d, " %02X", c);
2097                                         } else if (bytes_read > m) {
2098                                         } else
2099                                                 d += sprintf(d, " ..");
2100                                         bytes_read += 1;
2101                                         continue;
2102                                 }
2103                                 if (c == 0x7E) {
2104                                         return 0;
2105                                 } else {
2106                                         if (c == 0x55) {
2107                                                 goto read;
2108                                         } else if (read_stop-- > 0) {
2109                                                 goto read;
2110                                         } else {
2111                                                 dev_err(&ftdi->udev->dev, "retr"
2112                                                         "y limit reached\n");
2113                                                 continue;
2114                                         }
2115                                 }
2116                         } else if (packet_bytes > 1) {
2117                                 unsigned char s1 = ftdi->bulk_in_buffer[0];
2118                                 unsigned char s2 = ftdi->bulk_in_buffer[1];
2119                                 if (s1 == 0x31 && s2 == 0x00) {
2120                                         if (read_stuck-- > 0) {
2121                                                 goto read;
2122                                         } else
2123                                                 goto reset;
2124                                 } else if (s1 == 0x31 && s2 == 0x60) {
2125                                         if (read_stop-- > 0) {
2126                                                 goto read;
2127                                         } else {
2128                                                 dev_err(&ftdi->udev->dev, "retr"
2129                                                         "y limit reached\n");
2130                                                 continue;
2131                                         }
2132                                 } else {
2133                                         if (read_stop-- > 0) {
2134                                                 goto read;
2135                                         } else {
2136                                                 dev_err(&ftdi->udev->dev, "retr"
2137                                                         "y limit reached\n");
2138                                                 continue;
2139                                         }
2140                                 }
2141                         } else if (packet_bytes > 0) {
2142                                 if (read_stop-- > 0) {
2143                                         goto read;
2144                                 } else {
2145                                         dev_err(&ftdi->udev->dev, "retry limit "
2146                                                 "reached\n");
2147                                         continue;
2148                                 }
2149                         } else if (retval == -ETIMEDOUT) {
2150                                 if (retry_on_timeout-- > 0) {
2151                                         goto read;
2152                                 } else {
2153                                         dev_err(&ftdi->udev->dev, "TIMED OUT re"
2154                                                 "try limit reached\n");
2155                                         continue;
2156                                 }
2157                         } else if (retval == 0) {
2158                                 if (retry_on_empty-- > 0) {
2159                                         goto read;
2160                                 } else {
2161                                         dev_err(&ftdi->udev->dev, "empty packet"
2162                                                 " retry limit reached\n");
2163                                         continue;
2164                                 }
2165                         } else {
2166                                 err_count += 1;
2167                                 dev_err(&ftdi->udev->dev, "error = %d\n",
2168                                         retval);
2169                                 if (read_stop-- > 0) {
2170                                         goto read;
2171                                 } else {
2172                                         dev_err(&ftdi->udev->dev, "retry limit "
2173                                                 "reached\n");
2174                                         continue;
2175                                 }
2176                         }
2177                 }
2178         }
2179         dev_err(&ftdi->udev->dev, "failed to synchronize\n");
2180         return -EFAULT;
2181 }
2182
2183 static int ftdi_elan_stuck_waiting(struct usb_ftdi *ftdi)
2184 {
2185         int retry_on_empty = 10;
2186         int retry_on_timeout = 5;
2187         int retry_on_status = 50;
2188       more:{
2189                 int packet_bytes = 0;
2190                 int retval = usb_bulk_msg(ftdi->udev,
2191                         usb_rcvbulkpipe(ftdi->udev, ftdi->bulk_in_endpointAddr),
2192                          ftdi->bulk_in_buffer, ftdi->bulk_in_size,
2193                         &packet_bytes, msecs_to_jiffies(1000));
2194                 if (packet_bytes > 2) {
2195                         char diag[30 *3 + 4];
2196                         char *d = diag;
2197                         int m = (sizeof(diag) - 1) / 3;
2198                         char *b = ftdi->bulk_in_buffer;
2199                         int bytes_read = 0;
2200                         diag[0] = 0;
2201                         while (packet_bytes-- > 0) {
2202                                 char c = *b++;
2203                                 if (bytes_read < m) {
2204                                         d += sprintf(d, " %02X",
2205                                                 0x000000FF & c);
2206                                 } else if (bytes_read > m) {
2207                                 } else
2208                                         d += sprintf(d, " ..");
2209                                 bytes_read += 1;
2210                                 continue;
2211                         }
2212                         goto more;
2213                 } else if (packet_bytes > 1) {
2214                         char s1 = ftdi->bulk_in_buffer[0];
2215                         char s2 = ftdi->bulk_in_buffer[1];
2216                         if (s1 == 0x31 && s2 == 0x60) {
2217                                 return 0;
2218                         } else if (retry_on_status-- > 0) {
2219                                 msleep(5);
2220                                 goto more;
2221                         } else
2222                                 return -EFAULT;
2223                 } else if (packet_bytes > 0) {
2224                         char b1 = ftdi->bulk_in_buffer[0];
2225                         dev_err(&ftdi->udev->dev, "only one byte flushed from F"
2226                                 "TDI = %02X\n", b1);
2227                         if (retry_on_status-- > 0) {
2228                                 msleep(5);
2229                                 goto more;
2230                         } else {
2231                                 dev_err(&ftdi->udev->dev, "STATUS ERROR retry l"
2232                                         "imit reached\n");
2233                                 return -EFAULT;
2234                         }
2235                 } else if (retval == -ETIMEDOUT) {
2236                         if (retry_on_timeout-- > 0) {
2237                                 goto more;
2238                         } else {
2239                                 dev_err(&ftdi->udev->dev, "TIMED OUT retry limi"
2240                                         "t reached\n");
2241                                 return -ENOMEM;
2242                         }
2243                 } else if (retval == 0) {
2244                         if (retry_on_empty-- > 0) {
2245                                 goto more;
2246                         } else {
2247                                 dev_err(&ftdi->udev->dev, "empty packet retry l"
2248                                         "imit reached\n");
2249                                 return -ENOMEM;
2250                         }
2251                 } else {
2252                         dev_err(&ftdi->udev->dev, "error = %d\n", retval);
2253                         return -ENOMEM;
2254                 }
2255         }
2256         return -1;
2257 }
2258
2259 static int ftdi_elan_checkingPCI(struct usb_ftdi *ftdi)
2260 {
2261         int UxxxStatus = ftdi_elan_read_reg(ftdi, &ftdi->controlreg);
2262         if (UxxxStatus)
2263                 return UxxxStatus;
2264         if (ftdi->controlreg & 0x00400000) {
2265                 if (ftdi->card_ejected) {
2266                 } else {
2267                         ftdi->card_ejected = 1;
2268                         dev_err(&ftdi->udev->dev, "CARD EJECTED - controlreg = "
2269                                 "%08X\n", ftdi->controlreg);
2270                 }
2271                 return -ENODEV;
2272         } else {
2273                 u8 fn = ftdi->function - 1;
2274                 int activePCIfn = fn << 8;
2275                 u32 pcidata;
2276                 u32 pciVID;
2277                 u32 pciPID;
2278                 int reg = 0;
2279                 UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
2280                         &pcidata);
2281                 if (UxxxStatus)
2282                         return UxxxStatus;
2283                 pciVID = pcidata & 0xFFFF;
2284                 pciPID = (pcidata >> 16) & 0xFFFF;
2285                 if (pciVID == ftdi->platform_data.vendor && pciPID ==
2286                         ftdi->platform_data.device) {
2287                         return 0;
2288                 } else {
2289                         dev_err(&ftdi->udev->dev, "vendor=%04X pciVID=%04X devi"
2290                                 "ce=%04X pciPID=%04X\n",
2291                                 ftdi->platform_data.vendor, pciVID,
2292                                 ftdi->platform_data.device, pciPID);
2293                         return -ENODEV;
2294                 }
2295         }
2296 }
2297
2298
2299 #define ftdi_read_pcimem(ftdi, member, data) ftdi_elan_read_pcimem(ftdi, \
2300         offsetof(struct ohci_regs, member), 0, data);
2301 #define ftdi_write_pcimem(ftdi, member, data) ftdi_elan_write_pcimem(ftdi, \
2302         offsetof(struct ohci_regs, member), 0, data);
2303 #define OHCI_QUIRK_AMD756 0x01
2304 #define OHCI_QUIRK_SUPERIO 0x02
2305 #define OHCI_QUIRK_INITRESET 0x04
2306 #define OHCI_BIG_ENDIAN 0x08
2307 #define OHCI_CONTROL_INIT OHCI_CTRL_CBSR
2308 #define OHCI_INTR_INIT (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD | \
2309         OHCI_INTR_WDH)
2310 static int ftdi_elan_check_controller(struct usb_ftdi *ftdi, int quirk)
2311 {
2312         int devices = 0;
2313         int retval;
2314         u32 hc_control;
2315         int num_ports;
2316         u32 control;
2317         u32 rh_a = -1;
2318         u32 status;
2319         u32 fminterval;
2320         u32 hc_fminterval;
2321         u32 periodicstart;
2322         u32 cmdstatus;
2323         u32 roothub_a;
2324         int mask = OHCI_INTR_INIT;
2325         int sleep_time = 0;
2326         int reset_timeout = 30;        /* ... allow extra time */
2327         int temp;
2328         retval = ftdi_write_pcimem(ftdi, intrdisable, OHCI_INTR_MIE);
2329         if (retval)
2330                 return retval;
2331         retval = ftdi_read_pcimem(ftdi, control, &control);
2332         if (retval)
2333                 return retval;
2334         retval = ftdi_read_pcimem(ftdi, roothub.a, &rh_a);
2335         if (retval)
2336                 return retval;
2337         num_ports = rh_a & RH_A_NDP;
2338         retval = ftdi_read_pcimem(ftdi, fminterval, &hc_fminterval);
2339         if (retval)
2340                 return retval;
2341         hc_fminterval &= 0x3fff;
2342         if (hc_fminterval != FI) {
2343         }
2344         hc_fminterval |= FSMP(hc_fminterval) << 16;
2345         retval = ftdi_read_pcimem(ftdi, control, &hc_control);
2346         if (retval)
2347                 return retval;
2348         switch (hc_control & OHCI_CTRL_HCFS) {
2349         case OHCI_USB_OPER:
2350                 sleep_time = 0;
2351                 break;
2352         case OHCI_USB_SUSPEND:
2353         case OHCI_USB_RESUME:
2354                 hc_control &= OHCI_CTRL_RWC;
2355                 hc_control |= OHCI_USB_RESUME;
2356                 sleep_time = 10;
2357                 break;
2358         default:
2359                 hc_control &= OHCI_CTRL_RWC;
2360                 hc_control |= OHCI_USB_RESET;
2361                 sleep_time = 50;
2362                 break;
2363         }
2364         retval = ftdi_write_pcimem(ftdi, control, hc_control);
2365         if (retval)
2366                 return retval;
2367         retval = ftdi_read_pcimem(ftdi, control, &control);
2368         if (retval)
2369                 return retval;
2370         msleep(sleep_time);
2371         retval = ftdi_read_pcimem(ftdi, roothub.a, &roothub_a);
2372         if (retval)
2373                 return retval;
2374         if (!(roothub_a & RH_A_NPS)) {        /* power down each port */
2375                 for (temp = 0; temp < num_ports; temp++) {
2376                         retval = ftdi_write_pcimem(ftdi,
2377                                 roothub.portstatus[temp], RH_PS_LSDA);
2378                         if (retval)
2379                                 return retval;
2380                 }
2381         }
2382         retval = ftdi_read_pcimem(ftdi, control, &control);
2383         if (retval)
2384                 return retval;
2385       retry:retval = ftdi_read_pcimem(ftdi, cmdstatus, &status);
2386         if (retval)
2387                 return retval;
2388         retval = ftdi_write_pcimem(ftdi, cmdstatus, OHCI_HCR);
2389         if (retval)
2390                 return retval;
2391       extra:{
2392                 retval = ftdi_read_pcimem(ftdi, cmdstatus, &status);
2393                 if (retval)
2394                         return retval;
2395                 if (0 != (status & OHCI_HCR)) {
2396                         if (--reset_timeout == 0) {
2397                                 dev_err(&ftdi->udev->dev, "USB HC reset timed o"
2398                                         "ut!\n");
2399                                 return -ENODEV;
2400                         } else {
2401                                 msleep(5);
2402                                 goto extra;
2403                         }
2404                 }
2405         }
2406         if (quirk & OHCI_QUIRK_INITRESET) {
2407                 retval = ftdi_write_pcimem(ftdi, control, hc_control);
2408                 if (retval)
2409                         return retval;
2410                 retval = ftdi_read_pcimem(ftdi, control, &control);
2411                 if (retval)
2412                         return retval;
2413         }
2414         retval = ftdi_write_pcimem(ftdi, ed_controlhead, 0x00000000);
2415         if (retval)
2416                 return retval;
2417         retval = ftdi_write_pcimem(ftdi, ed_bulkhead, 0x11000000);
2418         if (retval)
2419                 return retval;
2420         retval = ftdi_write_pcimem(ftdi, hcca, 0x00000000);
2421         if (retval)
2422                 return retval;
2423         retval = ftdi_read_pcimem(ftdi, fminterval, &fminterval);
2424         if (retval)
2425                 return retval;
2426         retval = ftdi_write_pcimem(ftdi, fminterval,
2427                 ((fminterval & FIT) ^ FIT) | hc_fminterval);
2428         if (retval)
2429                 return retval;
2430         retval = ftdi_write_pcimem(ftdi, periodicstart,
2431                 ((9 *hc_fminterval) / 10) & 0x3fff);
2432         if (retval)
2433                 return retval;
2434         retval = ftdi_read_pcimem(ftdi, fminterval, &fminterval);
2435         if (retval)
2436                 return retval;
2437         retval = ftdi_read_pcimem(ftdi, periodicstart, &periodicstart);
2438         if (retval)
2439                 return retval;
2440         if (0 == (fminterval & 0x3fff0000) || 0 == periodicstart) {
2441                 if (!(quirk & OHCI_QUIRK_INITRESET)) {
2442                         quirk |= OHCI_QUIRK_INITRESET;
2443                         goto retry;
2444                 } else
2445                         dev_err(&ftdi->udev->dev, "init err(%08x %04x)\n",
2446                                 fminterval, periodicstart);
2447         }                        /* start controller operations */
2448         hc_control &= OHCI_CTRL_RWC;
2449         hc_control |= OHCI_CONTROL_INIT | OHCI_CTRL_BLE | OHCI_USB_OPER;
2450         retval = ftdi_write_pcimem(ftdi, control, hc_control);
2451         if (retval)
2452                 return retval;
2453         retval = ftdi_write_pcimem(ftdi, cmdstatus, OHCI_BLF);
2454         if (retval)
2455                 return retval;
2456         retval = ftdi_read_pcimem(ftdi, cmdstatus, &cmdstatus);
2457         if (retval)
2458                 return retval;
2459         retval = ftdi_read_pcimem(ftdi, control, &control);
2460         if (retval)
2461                 return retval;
2462         retval = ftdi_write_pcimem(ftdi, roothub.status, RH_HS_DRWE);
2463         if (retval)
2464                 return retval;
2465         retval = ftdi_write_pcimem(ftdi, intrstatus, mask);
2466         if (retval)
2467                 return retval;
2468         retval = ftdi_write_pcimem(ftdi, intrdisable,
2469                 OHCI_INTR_MIE | OHCI_INTR_OC | OHCI_INTR_RHSC | OHCI_INTR_FNO |
2470                 OHCI_INTR_UE | OHCI_INTR_RD | OHCI_INTR_SF | OHCI_INTR_WDH |
2471                 OHCI_INTR_SO);
2472         if (retval)
2473                 return retval;        /* handle root hub init quirks ... */
2474         retval = ftdi_read_pcimem(ftdi, roothub.a, &roothub_a);
2475         if (retval)
2476                 return retval;
2477         roothub_a &= ~(RH_A_PSM | RH_A_OCPM);
2478         if (quirk & OHCI_QUIRK_SUPERIO) {
2479                 roothub_a |= RH_A_NOCP;
2480                 roothub_a &= ~(RH_A_POTPGT | RH_A_NPS);
2481                 retval = ftdi_write_pcimem(ftdi, roothub.a, roothub_a);
2482                 if (retval)
2483                         return retval;
2484         } else if ((quirk & OHCI_QUIRK_AMD756) || distrust_firmware) {
2485                 roothub_a |= RH_A_NPS;
2486                 retval = ftdi_write_pcimem(ftdi, roothub.a, roothub_a);
2487                 if (retval)
2488                         return retval;
2489         }
2490         retval = ftdi_write_pcimem(ftdi, roothub.status, RH_HS_LPSC);
2491         if (retval)
2492                 return retval;
2493         retval = ftdi_write_pcimem(ftdi, roothub.b,
2494                 (roothub_a & RH_A_NPS) ? 0 : RH_B_PPCM);
2495         if (retval)
2496                 return retval;
2497         retval = ftdi_read_pcimem(ftdi, control, &control);
2498         if (retval)
2499                 return retval;
2500         mdelay((roothub_a >> 23) & 0x1fe);
2501         for (temp = 0; temp < num_ports; temp++) {
2502                 u32 portstatus;
2503                 retval = ftdi_read_pcimem(ftdi, roothub.portstatus[temp],
2504                         &portstatus);
2505                 if (retval)
2506                         return retval;
2507                 if (1 & portstatus)
2508                         devices += 1;
2509         }
2510         return devices;
2511 }
2512
2513 static int ftdi_elan_setup_controller(struct usb_ftdi *ftdi, int fn)
2514 {
2515         u32 latence_timer;
2516         int UxxxStatus;
2517         u32 pcidata;
2518         int reg = 0;
2519         int activePCIfn = fn << 8;
2520         UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000025FL | 0x2800);
2521         if (UxxxStatus)
2522                 return UxxxStatus;
2523         reg = 16;
2524         UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0,
2525                 0xFFFFFFFF);
2526         if (UxxxStatus)
2527                 return UxxxStatus;
2528         UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
2529                 &pcidata);
2530         if (UxxxStatus)
2531                 return UxxxStatus;
2532         UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0,
2533                 0xF0000000);
2534         if (UxxxStatus)
2535                 return UxxxStatus;
2536         UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
2537                 &pcidata);
2538         if (UxxxStatus)
2539                 return UxxxStatus;
2540         reg = 12;
2541         UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
2542                 &latence_timer);
2543         if (UxxxStatus)
2544                 return UxxxStatus;
2545         latence_timer &= 0xFFFF00FF;
2546         latence_timer |= 0x00001600;
2547         UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0x00,
2548                 latence_timer);
2549         if (UxxxStatus)
2550                 return UxxxStatus;
2551         UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
2552                 &pcidata);
2553         if (UxxxStatus)
2554                 return UxxxStatus;
2555         reg = 4;
2556         UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0x00,
2557                 0x06);
2558         if (UxxxStatus)
2559                 return UxxxStatus;
2560         UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
2561                 &pcidata);
2562         if (UxxxStatus)
2563                 return UxxxStatus;
2564         for (reg = 0; reg <= 0x54; reg += 4) {
2565                 UxxxStatus = ftdi_elan_read_pcimem(ftdi, reg, 0, &pcidata);
2566                 if (UxxxStatus)
2567                         return UxxxStatus;
2568         }
2569         return 0;
2570 }
2571
2572 static int ftdi_elan_close_controller(struct usb_ftdi *ftdi, int fn)
2573 {
2574         u32 latence_timer;
2575         int UxxxStatus;
2576         u32 pcidata;
2577         int reg = 0;
2578         int activePCIfn = fn << 8;
2579         UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000025FL | 0x2800);
2580         if (UxxxStatus)
2581                 return UxxxStatus;
2582         reg = 16;
2583         UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0,
2584                 0xFFFFFFFF);
2585         if (UxxxStatus)
2586                 return UxxxStatus;
2587         UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
2588                 &pcidata);
2589         if (UxxxStatus)
2590                 return UxxxStatus;
2591         UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0,
2592                 0x00000000);
2593         if (UxxxStatus)
2594                 return UxxxStatus;
2595         UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
2596                 &pcidata);
2597         if (UxxxStatus)
2598                 return UxxxStatus;
2599         reg = 12;
2600         UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
2601                 &latence_timer);
2602         if (UxxxStatus)
2603                 return UxxxStatus;
2604         latence_timer &= 0xFFFF00FF;
2605         latence_timer |= 0x00001600;
2606         UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0x00,
2607                 latence_timer);
2608         if (UxxxStatus)
2609                 return UxxxStatus;
2610         UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
2611                 &pcidata);
2612         if (UxxxStatus)
2613                 return UxxxStatus;
2614         reg = 4;
2615         UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0x00,
2616                 0x00);
2617         if (UxxxStatus)
2618                 return UxxxStatus;
2619         UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
2620                 &pcidata);
2621         if (UxxxStatus)
2622                 return UxxxStatus;
2623         return 0;
2624 }
2625
2626 static int ftdi_elan_found_controller(struct usb_ftdi *ftdi, int fn, int quirk)
2627 {
2628         int result;
2629         int UxxxStatus;
2630         UxxxStatus = ftdi_elan_setup_controller(ftdi, fn);
2631         if (UxxxStatus)
2632                 return UxxxStatus;
2633         result = ftdi_elan_check_controller(ftdi, quirk);
2634         UxxxStatus = ftdi_elan_close_controller(ftdi, fn);
2635         if (UxxxStatus)
2636                 return UxxxStatus;
2637         return result;
2638 }
2639
2640 static int ftdi_elan_enumeratePCI(struct usb_ftdi *ftdi)
2641 {
2642         u32 controlreg;
2643         u8 sensebits;
2644         int UxxxStatus;
2645         UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
2646         if (UxxxStatus)
2647                 return UxxxStatus;
2648         UxxxStatus = ftdi_elan_write_reg(ftdi, 0x00000000L);
2649         if (UxxxStatus)
2650                 return UxxxStatus;
2651         msleep(750);
2652         UxxxStatus = ftdi_elan_write_reg(ftdi, 0x00000200L | 0x100);
2653         if (UxxxStatus)
2654                 return UxxxStatus;
2655         UxxxStatus = ftdi_elan_write_reg(ftdi, 0x00000200L | 0x500);
2656         if (UxxxStatus)
2657                 return UxxxStatus;
2658         UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
2659         if (UxxxStatus)
2660                 return UxxxStatus;
2661         UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000020CL | 0x000);
2662         if (UxxxStatus)
2663                 return UxxxStatus;
2664         UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000020DL | 0x000);
2665         if (UxxxStatus)
2666                 return UxxxStatus;
2667         msleep(250);
2668         UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000020FL | 0x000);
2669         if (UxxxStatus)
2670                 return UxxxStatus;
2671         UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
2672         if (UxxxStatus)
2673                 return UxxxStatus;
2674         UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000025FL | 0x800);
2675         if (UxxxStatus)
2676                 return UxxxStatus;
2677         UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
2678         if (UxxxStatus)
2679                 return UxxxStatus;
2680         UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
2681         if (UxxxStatus)
2682                 return UxxxStatus;
2683         msleep(1000);
2684         sensebits = (controlreg >> 16) & 0x000F;
2685         if (0x0D == sensebits)
2686                 return 0;
2687         else
2688                 return - ENXIO;
2689 }
2690
2691 static int ftdi_elan_setupOHCI(struct usb_ftdi *ftdi)
2692 {
2693         int UxxxStatus;
2694         u32 pcidata;
2695         int reg = 0;
2696         u8 fn;
2697         int activePCIfn = 0;
2698         int max_devices = 0;
2699         int controllers = 0;
2700         int unrecognized = 0;
2701         ftdi->function = 0;
2702         for (fn = 0; (fn < 4); fn++) {
2703                 u32 pciVID = 0;
2704                 u32 pciPID = 0;
2705                 int devices = 0;
2706                 activePCIfn = fn << 8;
2707                 UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
2708                         &pcidata);
2709                 if (UxxxStatus)
2710                         return UxxxStatus;
2711                 pciVID = pcidata & 0xFFFF;
2712                 pciPID = (pcidata >> 16) & 0xFFFF;
2713                 if ((pciVID == PCI_VENDOR_ID_OPTI) && (pciPID == 0xc861)) {
2714                         devices = ftdi_elan_found_controller(ftdi, fn, 0);
2715                         controllers += 1;
2716                 } else if ((pciVID == PCI_VENDOR_ID_NEC) && (pciPID == 0x0035))
2717                         {
2718                         devices = ftdi_elan_found_controller(ftdi, fn, 0);
2719                         controllers += 1;
2720                 } else if ((pciVID == PCI_VENDOR_ID_AL) && (pciPID == 0x5237)) {
2721                         devices = ftdi_elan_found_controller(ftdi, fn, 0);
2722                         controllers += 1;
2723                 } else if ((pciVID == PCI_VENDOR_ID_ATT) && (pciPID == 0x5802))
2724                         {
2725                         devices = ftdi_elan_found_controller(ftdi, fn, 0);
2726                         controllers += 1;
2727                 } else if (pciVID == PCI_VENDOR_ID_AMD && pciPID == 0x740c) {
2728                         devices = ftdi_elan_found_controller(ftdi, fn,
2729                                 OHCI_QUIRK_AMD756);
2730                         controllers += 1;
2731                 } else if (pciVID == PCI_VENDOR_ID_COMPAQ && pciPID == 0xa0f8) {
2732                         devices = ftdi_elan_found_controller(ftdi, fn,
2733                                 OHCI_QUIRK_ZFMICRO);
2734                         controllers += 1;
2735                 } else if (0 == pcidata) {
2736                 } else
2737                         unrecognized += 1;
2738                 if (devices > max_devices) {
2739                         max_devices = devices;
2740                         ftdi->function = fn + 1;
2741                         ftdi->platform_data.vendor = pciVID;
2742                         ftdi->platform_data.device = pciPID;
2743                 }
2744         }
2745         if (ftdi->function > 0) {
2746                 UxxxStatus = ftdi_elan_setup_controller(ftdi,
2747                         ftdi->function - 1);
2748                 if (UxxxStatus)
2749                         return UxxxStatus;
2750                 return 0;
2751         } else if (controllers > 0) {
2752                 return -ENXIO;
2753         } else if (unrecognized > 0) {
2754                 return -ENXIO;
2755         } else {
2756                 ftdi->enumerated = 0;
2757                 return -ENXIO;
2758         }
2759 }
2760
2761
2762 /*
2763 * we use only the first bulk-in and bulk-out endpoints
2764 */
2765 static int ftdi_elan_probe(struct usb_interface *interface,
2766         const struct usb_device_id *id)
2767 {
2768         struct usb_host_interface *iface_desc;
2769         struct usb_endpoint_descriptor *endpoint;
2770         size_t buffer_size;
2771         int i;
2772         int retval = -ENOMEM;
2773         struct usb_ftdi *ftdi = kmalloc(sizeof(struct usb_ftdi), GFP_KERNEL);
2774         if (ftdi == NULL) {
2775                 printk(KERN_ERR "Out of memory\n");
2776                 return -ENOMEM;
2777         }
2778         memset(ftdi, 0x00, sizeof(struct usb_ftdi));
2779         down(&ftdi_module_lock);
2780         list_add_tail(&ftdi->ftdi_list, &ftdi_static_list);
2781         ftdi->sequence_num = ++ftdi_instances;
2782         up(&ftdi_module_lock);
2783         ftdi_elan_init_kref(ftdi);
2784         init_MUTEX(&ftdi->sw_lock);
2785         ftdi->udev = usb_get_dev(interface_to_usbdev(interface));
2786         ftdi->interface = interface;
2787         init_MUTEX(&ftdi->u132_lock);
2788         ftdi->expected = 4;
2789         iface_desc = interface->cur_altsetting;
2790         for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
2791                 endpoint = &iface_desc->endpoint[i].desc;
2792                 if (!ftdi->bulk_in_endpointAddr &&
2793                     usb_endpoint_is_bulk_in(endpoint)) {
2794                         buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
2795                         ftdi->bulk_in_size = buffer_size;
2796                         ftdi->bulk_in_endpointAddr = endpoint->bEndpointAddress;
2797                         ftdi->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
2798                         if (!ftdi->bulk_in_buffer) {
2799                                 dev_err(&ftdi->udev->dev, "Could not allocate b"
2800                                         "ulk_in_buffer\n");
2801                                 retval = -ENOMEM;
2802                                 goto error;
2803                         }
2804                 }
2805                 if (!ftdi->bulk_out_endpointAddr &&
2806                     usb_endpoint_is_bulk_out(endpoint)) {
2807                         ftdi->bulk_out_endpointAddr =
2808                                 endpoint->bEndpointAddress;
2809                 }
2810         }
2811         if (!(ftdi->bulk_in_endpointAddr && ftdi->bulk_out_endpointAddr)) {
2812                 dev_err(&ftdi->udev->dev, "Could not find both bulk-in and bulk"
2813                         "-out endpoints\n");
2814                 retval = -ENODEV;
2815                 goto error;
2816         }
2817         dev_info(&ftdi->udev->dev, "interface %d has I=%02X O=%02X\n",
2818                 iface_desc->desc.bInterfaceNumber, ftdi->bulk_in_endpointAddr,
2819                 ftdi->bulk_out_endpointAddr);
2820         usb_set_intfdata(interface, ftdi);
2821         if (iface_desc->desc.bInterfaceNumber == 0 &&
2822                 ftdi->bulk_in_endpointAddr == 0x81 &&
2823                 ftdi->bulk_out_endpointAddr == 0x02) {
2824                 retval = usb_register_dev(interface, &ftdi_elan_jtag_class);
2825                 if (retval) {
2826                         dev_err(&ftdi->udev->dev, "Not able to get a minor for "
2827                                 "this device.\n");
2828                         usb_set_intfdata(interface, NULL);
2829                         retval = -ENOMEM;
2830                         goto error;
2831                 } else {
2832                         ftdi->class = &ftdi_elan_jtag_class;
2833                         dev_info(&ftdi->udev->dev, "USB FDTI=%p JTAG interface "
2834                                 "%d now attached to ftdi%d\n", ftdi,
2835                                 iface_desc->desc.bInterfaceNumber,
2836                                 interface->minor);
2837                         return 0;
2838                 }
2839         } else if (iface_desc->desc.bInterfaceNumber == 1 &&
2840                 ftdi->bulk_in_endpointAddr == 0x83 &&
2841                 ftdi->bulk_out_endpointAddr == 0x04) {
2842                 ftdi->class = NULL;
2843                 dev_info(&ftdi->udev->dev, "USB FDTI=%p ELAN interface %d now a"
2844                         "ctivated\n", ftdi, iface_desc->desc.bInterfaceNumber);
2845                 INIT_DELAYED_WORK(&ftdi->status_work, ftdi_elan_status_work);
2846                 INIT_DELAYED_WORK(&ftdi->command_work, ftdi_elan_command_work);
2847                 INIT_DELAYED_WORK(&ftdi->respond_work, ftdi_elan_respond_work);
2848                 ftdi_status_queue_work(ftdi, msecs_to_jiffies(3 *1000));
2849                 return 0;
2850         } else {
2851                 dev_err(&ftdi->udev->dev,
2852                         "Could not find ELAN's U132 device\n");
2853                 retval = -ENODEV;
2854                 goto error;
2855         }
2856       error:if (ftdi) {
2857                 ftdi_elan_put_kref(ftdi);
2858         }
2859         return retval;
2860 }
2861
2862 static void ftdi_elan_disconnect(struct usb_interface *interface)
2863 {
2864         struct usb_ftdi *ftdi = usb_get_intfdata(interface);
2865         ftdi->disconnected += 1;
2866         if (ftdi->class) {
2867                 int minor = interface->minor;
2868                 struct usb_class_driver *class = ftdi->class;
2869                 usb_set_intfdata(interface, NULL);
2870                 usb_deregister_dev(interface, class);
2871                 dev_info(&ftdi->udev->dev, "USB FTDI U132 jtag interface on min"
2872                         "or %d now disconnected\n", minor);
2873         } else {
2874                 ftdi_status_cancel_work(ftdi);
2875                 ftdi_command_cancel_work(ftdi);
2876                 ftdi_response_cancel_work(ftdi);
2877                 ftdi_elan_abandon_completions(ftdi);
2878                 ftdi_elan_abandon_targets(ftdi);
2879                 if (ftdi->registered) {
2880                         platform_device_unregister(&ftdi->platform_dev);
2881                         ftdi->synchronized = 0;
2882                         ftdi->enumerated = 0;
2883                         ftdi->initialized = 0;
2884                         ftdi->registered = 0;
2885                 }
2886                 flush_workqueue(status_queue);
2887                 flush_workqueue(command_queue);
2888                 flush_workqueue(respond_queue);
2889                 ftdi->disconnected += 1;
2890                 usb_set_intfdata(interface, NULL);
2891                 dev_info(&ftdi->udev->dev, "USB FTDI U132 host controller inter"
2892                         "face now disconnected\n");
2893         }
2894         ftdi_elan_put_kref(ftdi);
2895 }
2896
2897 static struct usb_driver ftdi_elan_driver = {
2898         .name = "ftdi-elan",
2899         .probe = ftdi_elan_probe,
2900         .disconnect = ftdi_elan_disconnect,
2901         .id_table = ftdi_elan_table,
2902 };
2903 static int __init ftdi_elan_init(void)
2904 {
2905         int result;
2906         printk(KERN_INFO "driver %s built at %s on %s\n", ftdi_elan_driver.name,
2907                __TIME__, __DATE__);
2908         init_MUTEX(&ftdi_module_lock);
2909         INIT_LIST_HEAD(&ftdi_static_list);
2910         status_queue = create_singlethread_workqueue("ftdi-status-control");
2911         if (!status_queue)
2912                 goto err_status_queue;
2913         command_queue = create_singlethread_workqueue("ftdi-command-engine");
2914         if (!command_queue)
2915                 goto err_command_queue;
2916         respond_queue = create_singlethread_workqueue("ftdi-respond-engine");
2917         if (!respond_queue)
2918                 goto err_respond_queue;
2919         result = usb_register(&ftdi_elan_driver);
2920         if (result) {
2921                 destroy_workqueue(status_queue);
2922                 destroy_workqueue(command_queue);
2923                 destroy_workqueue(respond_queue);
2924                 printk(KERN_ERR "usb_register failed. Error number %d\n",
2925                        result);
2926         }
2927         return result;
2928
2929  err_respond_queue:
2930         destroy_workqueue(command_queue);
2931  err_command_queue:
2932         destroy_workqueue(status_queue);
2933  err_status_queue:
2934         printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
2935         return -ENOMEM;
2936 }
2937
2938 static void __exit ftdi_elan_exit(void)
2939 {
2940         struct usb_ftdi *ftdi;
2941         struct usb_ftdi *temp;
2942         usb_deregister(&ftdi_elan_driver);
2943         printk(KERN_INFO "ftdi_u132 driver deregistered\n");
2944         list_for_each_entry_safe(ftdi, temp, &ftdi_static_list, ftdi_list) {
2945                 ftdi_status_cancel_work(ftdi);
2946                 ftdi_command_cancel_work(ftdi);
2947                 ftdi_response_cancel_work(ftdi);
2948         } flush_workqueue(status_queue);
2949         destroy_workqueue(status_queue);
2950         status_queue = NULL;
2951         flush_workqueue(command_queue);
2952         destroy_workqueue(command_queue);
2953         command_queue = NULL;
2954         flush_workqueue(respond_queue);
2955         destroy_workqueue(respond_queue);
2956         respond_queue = NULL;
2957 }
2958
2959
2960 module_init(ftdi_elan_init);
2961 module_exit(ftdi_elan_exit);