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