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