Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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