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