cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ftdi-elan.c (79671B)


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