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