linux/drivers/usb/host/u132-hcd.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3* Host Controller Driver for the Elan Digital Systems U132 adapter
   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 host 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#include <linux/kernel.h>
  35#include <linux/module.h>
  36#include <linux/moduleparam.h>
  37#include <linux/delay.h>
  38#include <linux/ioport.h>
  39#include <linux/pci_ids.h>
  40#include <linux/sched.h>
  41#include <linux/slab.h>
  42#include <linux/errno.h>
  43#include <linux/init.h>
  44#include <linux/timer.h>
  45#include <linux/list.h>
  46#include <linux/interrupt.h>
  47#include <linux/usb.h>
  48#include <linux/usb/hcd.h>
  49#include <linux/workqueue.h>
  50#include <linux/platform_device.h>
  51#include <linux/mutex.h>
  52#include <asm/io.h>
  53#include <asm/irq.h>
  54#include <asm/byteorder.h>
  55
  56        /* FIXME ohci.h is ONLY for internal use by the OHCI driver.
  57         * If you're going to try stuff like this, you need to split
  58         * out shareable stuff (register declarations?) into its own
  59         * file, maybe name <linux/usb/ohci.h>
  60         */
  61
  62#include "ohci.h"
  63#define OHCI_CONTROL_INIT OHCI_CTRL_CBSR
  64#define OHCI_INTR_INIT (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD | \
  65        OHCI_INTR_WDH)
  66MODULE_AUTHOR("Tony Olech - Elan Digital Systems Limited");
  67MODULE_DESCRIPTION("U132 USB Host Controller Driver");
  68MODULE_LICENSE("GPL");
  69#define INT_MODULE_PARM(n, v) static int n = v;module_param(n, int, 0444)
  70INT_MODULE_PARM(testing, 0);
  71/* Some boards misreport power switching/overcurrent*/
  72static bool distrust_firmware = true;
  73module_param(distrust_firmware, bool, 0);
  74MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurrent"
  75        "t setup");
  76static DECLARE_WAIT_QUEUE_HEAD(u132_hcd_wait);
  77/*
  78* u132_module_lock exists to protect access to global variables
  79*
  80*/
  81static DEFINE_MUTEX(u132_module_lock);
  82static int u132_exiting;
  83static int u132_instances;
  84/*
  85* end of the global variables protected by u132_module_lock
  86*/
  87static struct workqueue_struct *workqueue;
  88#define MAX_U132_PORTS 7
  89#define MAX_U132_ADDRS 128
  90#define MAX_U132_UDEVS 4
  91#define MAX_U132_ENDPS 100
  92#define MAX_U132_RINGS 4
  93static const char *cc_to_text[16] = {
  94        "No Error ",
  95        "CRC Error ",
  96        "Bit Stuff ",
  97        "Data Togg ",
  98        "Stall ",
  99        "DevNotResp ",
 100        "PIDCheck ",
 101        "UnExpPID ",
 102        "DataOver ",
 103        "DataUnder ",
 104        "(for hw) ",
 105        "(for hw) ",
 106        "BufferOver ",
 107        "BuffUnder ",
 108        "(for HCD) ",
 109        "(for HCD) "
 110};
 111struct u132_port {
 112        struct u132 *u132;
 113        int reset;
 114        int enable;
 115        int power;
 116        int Status;
 117};
 118struct u132_addr {
 119        u8 address;
 120};
 121struct u132_udev {
 122        struct kref kref;
 123        struct usb_device *usb_device;
 124        u8 enumeration;
 125        u8 udev_number;
 126        u8 usb_addr;
 127        u8 portnumber;
 128        u8 endp_number_in[16];
 129        u8 endp_number_out[16];
 130};
 131#define ENDP_QUEUE_SHIFT 3
 132#define ENDP_QUEUE_SIZE (1<<ENDP_QUEUE_SHIFT)
 133#define ENDP_QUEUE_MASK (ENDP_QUEUE_SIZE-1)
 134struct u132_urbq {
 135        struct list_head urb_more;
 136        struct urb *urb;
 137};
 138struct u132_spin {
 139        spinlock_t slock;
 140};
 141struct u132_endp {
 142        struct kref kref;
 143        u8 udev_number;
 144        u8 endp_number;
 145        u8 usb_addr;
 146        u8 usb_endp;
 147        struct u132 *u132;
 148        struct list_head endp_ring;
 149        struct u132_ring *ring;
 150        unsigned toggle_bits:2;
 151        unsigned active:1;
 152        unsigned delayed:1;
 153        unsigned input:1;
 154        unsigned output:1;
 155        unsigned pipetype:2;
 156        unsigned dequeueing:1;
 157        unsigned edset_flush:1;
 158        unsigned spare_bits:14;
 159        unsigned long jiffies;
 160        struct usb_host_endpoint *hep;
 161        struct u132_spin queue_lock;
 162        u16 queue_size;
 163        u16 queue_last;
 164        u16 queue_next;
 165        struct urb *urb_list[ENDP_QUEUE_SIZE];
 166        struct list_head urb_more;
 167        struct delayed_work scheduler;
 168};
 169struct u132_ring {
 170        unsigned in_use:1;
 171        unsigned length:7;
 172        u8 number;
 173        struct u132 *u132;
 174        struct u132_endp *curr_endp;
 175        struct delayed_work scheduler;
 176};
 177struct u132 {
 178        struct kref kref;
 179        struct mutex sw_lock;
 180        struct mutex scheduler_lock;
 181        struct u132_platform_data *board;
 182        struct platform_device *platform_dev;
 183        struct u132_ring ring[MAX_U132_RINGS];
 184        int sequence_num;
 185        int going;
 186        int power;
 187        int reset;
 188        int num_ports;
 189        u32 hc_control;
 190        u32 hc_fminterval;
 191        u32 hc_roothub_status;
 192        u32 hc_roothub_a;
 193        u32 hc_roothub_portstatus[MAX_ROOT_PORTS];
 194        int flags;
 195        unsigned long next_statechange;
 196        struct delayed_work monitor;
 197        int num_endpoints;
 198        struct u132_addr addr[MAX_U132_ADDRS];
 199        struct u132_udev udev[MAX_U132_UDEVS];
 200        struct u132_port port[MAX_U132_PORTS];
 201        struct u132_endp *endp[MAX_U132_ENDPS];
 202};
 203
 204/*
 205* these cannot be inlines because we need the structure offset!!
 206* Does anyone have a better way?????
 207*/
 208#define ftdi_read_pcimem(pdev, member, data) usb_ftdi_elan_read_pcimem(pdev, \
 209        offsetof(struct ohci_regs, member), 0, data);
 210#define ftdi_write_pcimem(pdev, member, data) usb_ftdi_elan_write_pcimem(pdev, \
 211        offsetof(struct ohci_regs, member), 0, data)
 212#define u132_read_pcimem(u132, member, data) \
 213        usb_ftdi_elan_read_pcimem(u132->platform_dev, offsetof(struct \
 214        ohci_regs, member), 0, data)
 215#define u132_write_pcimem(u132, member, data) \
 216        usb_ftdi_elan_write_pcimem(u132->platform_dev, offsetof(struct \
 217        ohci_regs, member), 0, data)
 218static inline struct u132 *udev_to_u132(struct u132_udev *udev)
 219{
 220        u8 udev_number = udev->udev_number;
 221        return container_of(udev, struct u132, udev[udev_number]);
 222}
 223
 224static inline struct u132 *hcd_to_u132(struct usb_hcd *hcd)
 225{
 226        return (struct u132 *)(hcd->hcd_priv);
 227}
 228
 229static inline struct usb_hcd *u132_to_hcd(struct u132 *u132)
 230{
 231        return container_of((void *)u132, struct usb_hcd, hcd_priv);
 232}
 233
 234static inline void u132_disable(struct u132 *u132)
 235{
 236        u132_to_hcd(u132)->state = HC_STATE_HALT;
 237}
 238
 239
 240#define kref_to_u132(d) container_of(d, struct u132, kref)
 241#define kref_to_u132_endp(d) container_of(d, struct u132_endp, kref)
 242#define kref_to_u132_udev(d) container_of(d, struct u132_udev, kref)
 243#include "../misc/usb_u132.h"
 244static const char hcd_name[] = "u132_hcd";
 245#define PORT_C_MASK ((USB_PORT_STAT_C_CONNECTION | USB_PORT_STAT_C_ENABLE | \
 246        USB_PORT_STAT_C_SUSPEND | USB_PORT_STAT_C_OVERCURRENT | \
 247        USB_PORT_STAT_C_RESET) << 16)
 248static void u132_hcd_delete(struct kref *kref)
 249{
 250        struct u132 *u132 = kref_to_u132(kref);
 251        struct platform_device *pdev = u132->platform_dev;
 252        struct usb_hcd *hcd = u132_to_hcd(u132);
 253        u132->going += 1;
 254        mutex_lock(&u132_module_lock);
 255        u132_instances -= 1;
 256        mutex_unlock(&u132_module_lock);
 257        dev_warn(&u132->platform_dev->dev, "FREEING the hcd=%p and thus the u13"
 258                "2=%p going=%d pdev=%p\n", hcd, u132, u132->going, pdev);
 259        usb_put_hcd(hcd);
 260}
 261
 262static inline void u132_u132_put_kref(struct u132 *u132)
 263{
 264        kref_put(&u132->kref, u132_hcd_delete);
 265}
 266
 267static inline void u132_u132_init_kref(struct u132 *u132)
 268{
 269        kref_init(&u132->kref);
 270}
 271
 272static void u132_udev_delete(struct kref *kref)
 273{
 274        struct u132_udev *udev = kref_to_u132_udev(kref);
 275        udev->udev_number = 0;
 276        udev->usb_device = NULL;
 277        udev->usb_addr = 0;
 278        udev->enumeration = 0;
 279}
 280
 281static inline void u132_udev_put_kref(struct u132 *u132, struct u132_udev *udev)
 282{
 283        kref_put(&udev->kref, u132_udev_delete);
 284}
 285
 286static inline void u132_udev_get_kref(struct u132 *u132, struct u132_udev *udev)
 287{
 288        kref_get(&udev->kref);
 289}
 290
 291static inline void u132_udev_init_kref(struct u132 *u132,
 292        struct u132_udev *udev)
 293{
 294        kref_init(&udev->kref);
 295}
 296
 297static inline void u132_ring_put_kref(struct u132 *u132, struct u132_ring *ring)
 298{
 299        kref_put(&u132->kref, u132_hcd_delete);
 300}
 301
 302static void u132_ring_requeue_work(struct u132 *u132, struct u132_ring *ring,
 303        unsigned int delta)
 304{
 305        if (delta > 0) {
 306                if (queue_delayed_work(workqueue, &ring->scheduler, delta))
 307                        return;
 308        } else if (queue_delayed_work(workqueue, &ring->scheduler, 0))
 309                return;
 310        kref_put(&u132->kref, u132_hcd_delete);
 311}
 312
 313static void u132_ring_queue_work(struct u132 *u132, struct u132_ring *ring,
 314        unsigned int delta)
 315{
 316        kref_get(&u132->kref);
 317        u132_ring_requeue_work(u132, ring, delta);
 318}
 319
 320static void u132_ring_cancel_work(struct u132 *u132, struct u132_ring *ring)
 321{
 322        if (cancel_delayed_work(&ring->scheduler))
 323                kref_put(&u132->kref, u132_hcd_delete);
 324}
 325
 326static void u132_endp_delete(struct kref *kref)
 327{
 328        struct u132_endp *endp = kref_to_u132_endp(kref);
 329        struct u132 *u132 = endp->u132;
 330        u8 usb_addr = endp->usb_addr;
 331        u8 usb_endp = endp->usb_endp;
 332        u8 address = u132->addr[usb_addr].address;
 333        struct u132_udev *udev = &u132->udev[address];
 334        u8 endp_number = endp->endp_number;
 335        struct usb_host_endpoint *hep = endp->hep;
 336        struct u132_ring *ring = endp->ring;
 337        struct list_head *head = &endp->endp_ring;
 338        ring->length -= 1;
 339        if (endp == ring->curr_endp) {
 340                if (list_empty(head)) {
 341                        ring->curr_endp = NULL;
 342                        list_del(head);
 343                } else {
 344                        struct u132_endp *next_endp = list_entry(head->next,
 345                                struct u132_endp, endp_ring);
 346                        ring->curr_endp = next_endp;
 347                        list_del(head);
 348                }
 349        } else
 350                list_del(head);
 351        if (endp->input) {
 352                udev->endp_number_in[usb_endp] = 0;
 353                u132_udev_put_kref(u132, udev);
 354        }
 355        if (endp->output) {
 356                udev->endp_number_out[usb_endp] = 0;
 357                u132_udev_put_kref(u132, udev);
 358        }
 359        u132->endp[endp_number - 1] = NULL;
 360        hep->hcpriv = NULL;
 361        kfree(endp);
 362        u132_u132_put_kref(u132);
 363}
 364
 365static inline void u132_endp_put_kref(struct u132 *u132, struct u132_endp *endp)
 366{
 367        kref_put(&endp->kref, u132_endp_delete);
 368}
 369
 370static inline void u132_endp_get_kref(struct u132 *u132, struct u132_endp *endp)
 371{
 372        kref_get(&endp->kref);
 373}
 374
 375static inline void u132_endp_init_kref(struct u132 *u132,
 376        struct u132_endp *endp)
 377{
 378        kref_init(&endp->kref);
 379        kref_get(&u132->kref);
 380}
 381
 382static void u132_endp_queue_work(struct u132 *u132, struct u132_endp *endp,
 383        unsigned int delta)
 384{
 385        if (queue_delayed_work(workqueue, &endp->scheduler, delta))
 386                kref_get(&endp->kref);
 387}
 388
 389static void u132_endp_cancel_work(struct u132 *u132, struct u132_endp *endp)
 390{
 391        if (cancel_delayed_work(&endp->scheduler))
 392                kref_put(&endp->kref, u132_endp_delete);
 393}
 394
 395static inline void u132_monitor_put_kref(struct u132 *u132)
 396{
 397        kref_put(&u132->kref, u132_hcd_delete);
 398}
 399
 400static void u132_monitor_queue_work(struct u132 *u132, unsigned int delta)
 401{
 402        if (queue_delayed_work(workqueue, &u132->monitor, delta))
 403                kref_get(&u132->kref);
 404}
 405
 406static void u132_monitor_requeue_work(struct u132 *u132, unsigned int delta)
 407{
 408        if (!queue_delayed_work(workqueue, &u132->monitor, delta))
 409                kref_put(&u132->kref, u132_hcd_delete);
 410}
 411
 412static void u132_monitor_cancel_work(struct u132 *u132)
 413{
 414        if (cancel_delayed_work(&u132->monitor))
 415                kref_put(&u132->kref, u132_hcd_delete);
 416}
 417
 418static int read_roothub_info(struct u132 *u132)
 419{
 420        u32 revision;
 421        int retval;
 422        retval = u132_read_pcimem(u132, revision, &revision);
 423        if (retval) {
 424                dev_err(&u132->platform_dev->dev, "error %d accessing device co"
 425                        "ntrol\n", retval);
 426                return retval;
 427        } else if ((revision & 0xFF) == 0x10) {
 428        } else if ((revision & 0xFF) == 0x11) {
 429        } else {
 430                dev_err(&u132->platform_dev->dev, "device revision is not valid"
 431                        " %08X\n", revision);
 432                return -ENODEV;
 433        }
 434        retval = u132_read_pcimem(u132, control, &u132->hc_control);
 435        if (retval) {
 436                dev_err(&u132->platform_dev->dev, "error %d accessing device co"
 437                        "ntrol\n", retval);
 438                return retval;
 439        }
 440        retval = u132_read_pcimem(u132, roothub.status,
 441                &u132->hc_roothub_status);
 442        if (retval) {
 443                dev_err(&u132->platform_dev->dev, "error %d accessing device re"
 444                        "g roothub.status\n", retval);
 445                return retval;
 446        }
 447        retval = u132_read_pcimem(u132, roothub.a, &u132->hc_roothub_a);
 448        if (retval) {
 449                dev_err(&u132->platform_dev->dev, "error %d accessing device re"
 450                        "g roothub.a\n", retval);
 451                return retval;
 452        }
 453        {
 454                int I = u132->num_ports;
 455                int i = 0;
 456                while (I-- > 0) {
 457                        retval = u132_read_pcimem(u132, roothub.portstatus[i],
 458                                &u132->hc_roothub_portstatus[i]);
 459                        if (retval) {
 460                                dev_err(&u132->platform_dev->dev, "error %d acc"
 461                                        "essing device roothub.portstatus[%d]\n"
 462                                        , retval, i);
 463                                return retval;
 464                        } else
 465                                i += 1;
 466                }
 467        }
 468        return 0;
 469}
 470
 471static void u132_hcd_monitor_work(struct work_struct *work)
 472{
 473        struct u132 *u132 = container_of(work, struct u132, monitor.work);
 474        if (u132->going > 1) {
 475                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 476                        , u132->going);
 477                u132_monitor_put_kref(u132);
 478                return;
 479        } else if (u132->going > 0) {
 480                dev_err(&u132->platform_dev->dev, "device is being removed\n");
 481                u132_monitor_put_kref(u132);
 482                return;
 483        } else {
 484                int retval;
 485                mutex_lock(&u132->sw_lock);
 486                retval = read_roothub_info(u132);
 487                if (retval) {
 488                        struct usb_hcd *hcd = u132_to_hcd(u132);
 489                        u132_disable(u132);
 490                        u132->going = 1;
 491                        mutex_unlock(&u132->sw_lock);
 492                        usb_hc_died(hcd);
 493                        ftdi_elan_gone_away(u132->platform_dev);
 494                        u132_monitor_put_kref(u132);
 495                        return;
 496                } else {
 497                        u132_monitor_requeue_work(u132, 500);
 498                        mutex_unlock(&u132->sw_lock);
 499                        return;
 500                }
 501        }
 502}
 503
 504static void u132_hcd_giveback_urb(struct u132 *u132, struct u132_endp *endp,
 505        struct urb *urb, int status)
 506{
 507        struct u132_ring *ring;
 508        unsigned long irqs;
 509        struct usb_hcd *hcd = u132_to_hcd(u132);
 510        urb->error_count = 0;
 511        spin_lock_irqsave(&endp->queue_lock.slock, irqs);
 512        usb_hcd_unlink_urb_from_ep(hcd, urb);
 513        endp->queue_next += 1;
 514        if (ENDP_QUEUE_SIZE > --endp->queue_size) {
 515                endp->active = 0;
 516                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
 517        } else {
 518                struct list_head *next = endp->urb_more.next;
 519                struct u132_urbq *urbq = list_entry(next, struct u132_urbq,
 520                        urb_more);
 521                list_del(next);
 522                endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
 523                        urbq->urb;
 524                endp->active = 0;
 525                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
 526                kfree(urbq);
 527        }
 528        mutex_lock(&u132->scheduler_lock);
 529        ring = endp->ring;
 530        ring->in_use = 0;
 531        u132_ring_cancel_work(u132, ring);
 532        u132_ring_queue_work(u132, ring, 0);
 533        mutex_unlock(&u132->scheduler_lock);
 534        u132_endp_put_kref(u132, endp);
 535        usb_hcd_giveback_urb(hcd, urb, status);
 536}
 537
 538static void u132_hcd_forget_urb(struct u132 *u132, struct u132_endp *endp,
 539        struct urb *urb, int status)
 540{
 541        u132_endp_put_kref(u132, endp);
 542}
 543
 544static void u132_hcd_abandon_urb(struct u132 *u132, struct u132_endp *endp,
 545        struct urb *urb, int status)
 546{
 547        unsigned long irqs;
 548        struct usb_hcd *hcd = u132_to_hcd(u132);
 549        urb->error_count = 0;
 550        spin_lock_irqsave(&endp->queue_lock.slock, irqs);
 551        usb_hcd_unlink_urb_from_ep(hcd, urb);
 552        endp->queue_next += 1;
 553        if (ENDP_QUEUE_SIZE > --endp->queue_size) {
 554                endp->active = 0;
 555                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
 556        } else {
 557                struct list_head *next = endp->urb_more.next;
 558                struct u132_urbq *urbq = list_entry(next, struct u132_urbq,
 559                        urb_more);
 560                list_del(next);
 561                endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
 562                        urbq->urb;
 563                endp->active = 0;
 564                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
 565                kfree(urbq);
 566        }
 567        usb_hcd_giveback_urb(hcd, urb, status);
 568}
 569
 570static inline int edset_input(struct u132 *u132, struct u132_ring *ring,
 571        struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
 572        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
 573        int toggle_bits, int error_count, int condition_code, int repeat_number,
 574         int halted, int skipped, int actual, int non_null))
 575{
 576        return usb_ftdi_elan_edset_input(u132->platform_dev, ring->number, endp,
 577                 urb, address, endp->usb_endp, toggle_bits, callback);
 578}
 579
 580static inline int edset_setup(struct u132 *u132, struct u132_ring *ring,
 581        struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
 582        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
 583        int toggle_bits, int error_count, int condition_code, int repeat_number,
 584         int halted, int skipped, int actual, int non_null))
 585{
 586        return usb_ftdi_elan_edset_setup(u132->platform_dev, ring->number, endp,
 587                 urb, address, endp->usb_endp, toggle_bits, callback);
 588}
 589
 590static inline int edset_single(struct u132 *u132, struct u132_ring *ring,
 591        struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
 592        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
 593        int toggle_bits, int error_count, int condition_code, int repeat_number,
 594         int halted, int skipped, int actual, int non_null))
 595{
 596        return usb_ftdi_elan_edset_single(u132->platform_dev, ring->number,
 597                endp, urb, address, endp->usb_endp, toggle_bits, callback);
 598}
 599
 600static inline int edset_output(struct u132 *u132, struct u132_ring *ring,
 601        struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,
 602        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
 603        int toggle_bits, int error_count, int condition_code, int repeat_number,
 604         int halted, int skipped, int actual, int non_null))
 605{
 606        return usb_ftdi_elan_edset_output(u132->platform_dev, ring->number,
 607                endp, urb, address, endp->usb_endp, toggle_bits, callback);
 608}
 609
 610
 611/*
 612* must not LOCK sw_lock
 613*
 614*/
 615static void u132_hcd_interrupt_recv(void *data, struct urb *urb, u8 *buf,
 616        int len, int toggle_bits, int error_count, int condition_code,
 617        int repeat_number, int halted, int skipped, int actual, int non_null)
 618{
 619        struct u132_endp *endp = data;
 620        struct u132 *u132 = endp->u132;
 621        u8 address = u132->addr[endp->usb_addr].address;
 622        struct u132_udev *udev = &u132->udev[address];
 623        mutex_lock(&u132->scheduler_lock);
 624        if (u132->going > 1) {
 625                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 626                        , u132->going);
 627                mutex_unlock(&u132->scheduler_lock);
 628                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 629                return;
 630        } else if (endp->dequeueing) {
 631                endp->dequeueing = 0;
 632                mutex_unlock(&u132->scheduler_lock);
 633                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 634                return;
 635        } else if (u132->going > 0) {
 636                dev_err(&u132->platform_dev->dev, "device is being removed "
 637                                "urb=%p\n", urb);
 638                mutex_unlock(&u132->scheduler_lock);
 639                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 640                return;
 641        } else if (!urb->unlinked) {
 642                struct u132_ring *ring = endp->ring;
 643                u8 *u = urb->transfer_buffer + urb->actual_length;
 644                u8 *b = buf;
 645                int L = len;
 646
 647                while (L-- > 0)
 648                        *u++ = *b++;
 649
 650                urb->actual_length += len;
 651                if ((condition_code == TD_CC_NOERROR) &&
 652                        (urb->transfer_buffer_length > urb->actual_length)) {
 653                        endp->toggle_bits = toggle_bits;
 654                        usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 655                                1 & toggle_bits);
 656                        if (urb->actual_length > 0) {
 657                                int retval;
 658                                mutex_unlock(&u132->scheduler_lock);
 659                                retval = edset_single(u132, ring, endp, urb,
 660                                        address, endp->toggle_bits,
 661                                        u132_hcd_interrupt_recv);
 662                                if (retval != 0)
 663                                        u132_hcd_giveback_urb(u132, endp, urb,
 664                                                retval);
 665                        } else {
 666                                ring->in_use = 0;
 667                                endp->active = 0;
 668                                endp->jiffies = jiffies +
 669                                        msecs_to_jiffies(urb->interval);
 670                                u132_ring_cancel_work(u132, ring);
 671                                u132_ring_queue_work(u132, ring, 0);
 672                                mutex_unlock(&u132->scheduler_lock);
 673                                u132_endp_put_kref(u132, endp);
 674                        }
 675                        return;
 676                } else if ((condition_code == TD_DATAUNDERRUN) &&
 677                        ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0)) {
 678                        endp->toggle_bits = toggle_bits;
 679                        usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 680                                1 & toggle_bits);
 681                        mutex_unlock(&u132->scheduler_lock);
 682                        u132_hcd_giveback_urb(u132, endp, urb, 0);
 683                        return;
 684                } else {
 685                        if (condition_code == TD_CC_NOERROR) {
 686                                endp->toggle_bits = toggle_bits;
 687                                usb_settoggle(udev->usb_device, endp->usb_endp,
 688                                        0, 1 & toggle_bits);
 689                        } else if (condition_code == TD_CC_STALL) {
 690                                endp->toggle_bits = 0x2;
 691                                usb_settoggle(udev->usb_device, endp->usb_endp,
 692                                        0, 0);
 693                        } else {
 694                                endp->toggle_bits = 0x2;
 695                                usb_settoggle(udev->usb_device, endp->usb_endp,
 696                                        0, 0);
 697                                dev_err(&u132->platform_dev->dev, "urb=%p givin"
 698                                        "g back INTERRUPT %s\n", urb,
 699                                        cc_to_text[condition_code]);
 700                        }
 701                        mutex_unlock(&u132->scheduler_lock);
 702                        u132_hcd_giveback_urb(u132, endp, urb,
 703                                cc_to_error[condition_code]);
 704                        return;
 705                }
 706        } else {
 707                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 708                                "unlinked=%d\n", urb, urb->unlinked);
 709                mutex_unlock(&u132->scheduler_lock);
 710                u132_hcd_giveback_urb(u132, endp, urb, 0);
 711                return;
 712        }
 713}
 714
 715static void u132_hcd_bulk_output_sent(void *data, struct urb *urb, u8 *buf,
 716        int len, int toggle_bits, int error_count, int condition_code,
 717        int repeat_number, int halted, int skipped, int actual, int non_null)
 718{
 719        struct u132_endp *endp = data;
 720        struct u132 *u132 = endp->u132;
 721        u8 address = u132->addr[endp->usb_addr].address;
 722        mutex_lock(&u132->scheduler_lock);
 723        if (u132->going > 1) {
 724                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 725                        , u132->going);
 726                mutex_unlock(&u132->scheduler_lock);
 727                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 728                return;
 729        } else if (endp->dequeueing) {
 730                endp->dequeueing = 0;
 731                mutex_unlock(&u132->scheduler_lock);
 732                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 733                return;
 734        } else if (u132->going > 0) {
 735                dev_err(&u132->platform_dev->dev, "device is being removed "
 736                                "urb=%p\n", urb);
 737                mutex_unlock(&u132->scheduler_lock);
 738                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 739                return;
 740        } else if (!urb->unlinked) {
 741                struct u132_ring *ring = endp->ring;
 742                urb->actual_length += len;
 743                endp->toggle_bits = toggle_bits;
 744                if (urb->transfer_buffer_length > urb->actual_length) {
 745                        int retval;
 746                        mutex_unlock(&u132->scheduler_lock);
 747                        retval = edset_output(u132, ring, endp, urb, address,
 748                                endp->toggle_bits, u132_hcd_bulk_output_sent);
 749                        if (retval != 0)
 750                                u132_hcd_giveback_urb(u132, endp, urb, retval);
 751                        return;
 752                } else {
 753                        mutex_unlock(&u132->scheduler_lock);
 754                        u132_hcd_giveback_urb(u132, endp, urb, 0);
 755                        return;
 756                }
 757        } else {
 758                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 759                                "unlinked=%d\n", urb, urb->unlinked);
 760                mutex_unlock(&u132->scheduler_lock);
 761                u132_hcd_giveback_urb(u132, endp, urb, 0);
 762                return;
 763        }
 764}
 765
 766static void u132_hcd_bulk_input_recv(void *data, struct urb *urb, u8 *buf,
 767        int len, int toggle_bits, int error_count, int condition_code,
 768        int repeat_number, int halted, int skipped, int actual, int non_null)
 769{
 770        struct u132_endp *endp = data;
 771        struct u132 *u132 = endp->u132;
 772        u8 address = u132->addr[endp->usb_addr].address;
 773        struct u132_udev *udev = &u132->udev[address];
 774        mutex_lock(&u132->scheduler_lock);
 775        if (u132->going > 1) {
 776                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 777                        , u132->going);
 778                mutex_unlock(&u132->scheduler_lock);
 779                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 780                return;
 781        } else if (endp->dequeueing) {
 782                endp->dequeueing = 0;
 783                mutex_unlock(&u132->scheduler_lock);
 784                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 785                return;
 786        } else if (u132->going > 0) {
 787                dev_err(&u132->platform_dev->dev, "device is being removed "
 788                                "urb=%p\n", urb);
 789                mutex_unlock(&u132->scheduler_lock);
 790                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 791                return;
 792        } else if (!urb->unlinked) {
 793                struct u132_ring *ring = endp->ring;
 794                u8 *u = urb->transfer_buffer + urb->actual_length;
 795                u8 *b = buf;
 796                int L = len;
 797
 798                while (L-- > 0)
 799                        *u++ = *b++;
 800
 801                urb->actual_length += len;
 802                if ((condition_code == TD_CC_NOERROR) &&
 803                        (urb->transfer_buffer_length > urb->actual_length)) {
 804                        int retval;
 805                        endp->toggle_bits = toggle_bits;
 806                        usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 807                                1 & toggle_bits);
 808                        mutex_unlock(&u132->scheduler_lock);
 809                        retval = usb_ftdi_elan_edset_input(u132->platform_dev,
 810                                ring->number, endp, urb, address,
 811                                endp->usb_endp, endp->toggle_bits,
 812                                u132_hcd_bulk_input_recv);
 813                        if (retval != 0)
 814                                u132_hcd_giveback_urb(u132, endp, urb, retval);
 815                        return;
 816                } else if (condition_code == TD_CC_NOERROR) {
 817                        endp->toggle_bits = toggle_bits;
 818                        usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 819                                1 & toggle_bits);
 820                        mutex_unlock(&u132->scheduler_lock);
 821                        u132_hcd_giveback_urb(u132, endp, urb,
 822                                cc_to_error[condition_code]);
 823                        return;
 824                } else if ((condition_code == TD_DATAUNDERRUN) &&
 825                        ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0)) {
 826                        endp->toggle_bits = toggle_bits;
 827                        usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 828                                1 & toggle_bits);
 829                        mutex_unlock(&u132->scheduler_lock);
 830                        u132_hcd_giveback_urb(u132, endp, urb, 0);
 831                        return;
 832                } else if (condition_code == TD_DATAUNDERRUN) {
 833                        endp->toggle_bits = toggle_bits;
 834                        usb_settoggle(udev->usb_device, endp->usb_endp, 0,
 835                                1 & toggle_bits);
 836                        dev_warn(&u132->platform_dev->dev, "urb=%p(SHORT NOT OK"
 837                                ") giving back BULK IN %s\n", urb,
 838                                cc_to_text[condition_code]);
 839                        mutex_unlock(&u132->scheduler_lock);
 840                        u132_hcd_giveback_urb(u132, endp, urb, 0);
 841                        return;
 842                } else if (condition_code == TD_CC_STALL) {
 843                        endp->toggle_bits = 0x2;
 844                        usb_settoggle(udev->usb_device, endp->usb_endp, 0, 0);
 845                        mutex_unlock(&u132->scheduler_lock);
 846                        u132_hcd_giveback_urb(u132, endp, urb,
 847                                cc_to_error[condition_code]);
 848                        return;
 849                } else {
 850                        endp->toggle_bits = 0x2;
 851                        usb_settoggle(udev->usb_device, endp->usb_endp, 0, 0);
 852                        dev_err(&u132->platform_dev->dev, "urb=%p giving back B"
 853                                "ULK IN code=%d %s\n", urb, condition_code,
 854                                cc_to_text[condition_code]);
 855                        mutex_unlock(&u132->scheduler_lock);
 856                        u132_hcd_giveback_urb(u132, endp, urb,
 857                                cc_to_error[condition_code]);
 858                        return;
 859                }
 860        } else {
 861                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 862                                "unlinked=%d\n", urb, urb->unlinked);
 863                mutex_unlock(&u132->scheduler_lock);
 864                u132_hcd_giveback_urb(u132, endp, urb, 0);
 865                return;
 866        }
 867}
 868
 869static void u132_hcd_configure_empty_sent(void *data, struct urb *urb, u8 *buf,
 870        int len, int toggle_bits, int error_count, int condition_code,
 871        int repeat_number, int halted, int skipped, int actual, int non_null)
 872{
 873        struct u132_endp *endp = data;
 874        struct u132 *u132 = endp->u132;
 875        mutex_lock(&u132->scheduler_lock);
 876        if (u132->going > 1) {
 877                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 878                        , u132->going);
 879                mutex_unlock(&u132->scheduler_lock);
 880                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 881                return;
 882        } else if (endp->dequeueing) {
 883                endp->dequeueing = 0;
 884                mutex_unlock(&u132->scheduler_lock);
 885                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 886                return;
 887        } else if (u132->going > 0) {
 888                dev_err(&u132->platform_dev->dev, "device is being removed "
 889                                "urb=%p\n", urb);
 890                mutex_unlock(&u132->scheduler_lock);
 891                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 892                return;
 893        } else if (!urb->unlinked) {
 894                mutex_unlock(&u132->scheduler_lock);
 895                u132_hcd_giveback_urb(u132, endp, urb, 0);
 896                return;
 897        } else {
 898                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 899                                "unlinked=%d\n", urb, urb->unlinked);
 900                mutex_unlock(&u132->scheduler_lock);
 901                u132_hcd_giveback_urb(u132, endp, urb, 0);
 902                return;
 903        }
 904}
 905
 906static void u132_hcd_configure_input_recv(void *data, struct urb *urb, u8 *buf,
 907        int len, int toggle_bits, int error_count, int condition_code,
 908        int repeat_number, int halted, int skipped, int actual, int non_null)
 909{
 910        struct u132_endp *endp = data;
 911        struct u132 *u132 = endp->u132;
 912        u8 address = u132->addr[endp->usb_addr].address;
 913        mutex_lock(&u132->scheduler_lock);
 914        if (u132->going > 1) {
 915                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 916                        , u132->going);
 917                mutex_unlock(&u132->scheduler_lock);
 918                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 919                return;
 920        } else if (endp->dequeueing) {
 921                endp->dequeueing = 0;
 922                mutex_unlock(&u132->scheduler_lock);
 923                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 924                return;
 925        } else if (u132->going > 0) {
 926                dev_err(&u132->platform_dev->dev, "device is being removed "
 927                                "urb=%p\n", urb);
 928                mutex_unlock(&u132->scheduler_lock);
 929                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
 930                return;
 931        } else if (!urb->unlinked) {
 932                struct u132_ring *ring = endp->ring;
 933                u8 *u = urb->transfer_buffer;
 934                u8 *b = buf;
 935                int L = len;
 936
 937                while (L-- > 0)
 938                        *u++ = *b++;
 939
 940                urb->actual_length = len;
 941                if ((condition_code == TD_CC_NOERROR) || ((condition_code ==
 942                        TD_DATAUNDERRUN) && ((urb->transfer_flags &
 943                        URB_SHORT_NOT_OK) == 0))) {
 944                        int retval;
 945                        mutex_unlock(&u132->scheduler_lock);
 946                        retval = usb_ftdi_elan_edset_empty(u132->platform_dev,
 947                                ring->number, endp, urb, address,
 948                                endp->usb_endp, 0x3,
 949                                u132_hcd_configure_empty_sent);
 950                        if (retval != 0)
 951                                u132_hcd_giveback_urb(u132, endp, urb, retval);
 952                        return;
 953                } else if (condition_code == TD_CC_STALL) {
 954                        mutex_unlock(&u132->scheduler_lock);
 955                        dev_warn(&u132->platform_dev->dev, "giving back SETUP I"
 956                                "NPUT STALL urb %p\n", urb);
 957                        u132_hcd_giveback_urb(u132, endp, urb,
 958                                cc_to_error[condition_code]);
 959                        return;
 960                } else {
 961                        mutex_unlock(&u132->scheduler_lock);
 962                        dev_err(&u132->platform_dev->dev, "giving back SETUP IN"
 963                                "PUT %s urb %p\n", cc_to_text[condition_code],
 964                                urb);
 965                        u132_hcd_giveback_urb(u132, endp, urb,
 966                                cc_to_error[condition_code]);
 967                        return;
 968                }
 969        } else {
 970                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
 971                                "unlinked=%d\n", urb, urb->unlinked);
 972                mutex_unlock(&u132->scheduler_lock);
 973                u132_hcd_giveback_urb(u132, endp, urb, 0);
 974                return;
 975        }
 976}
 977
 978static void u132_hcd_configure_empty_recv(void *data, struct urb *urb, u8 *buf,
 979        int len, int toggle_bits, int error_count, int condition_code,
 980        int repeat_number, int halted, int skipped, int actual, int non_null)
 981{
 982        struct u132_endp *endp = data;
 983        struct u132 *u132 = endp->u132;
 984        mutex_lock(&u132->scheduler_lock);
 985        if (u132->going > 1) {
 986                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
 987                        , u132->going);
 988                mutex_unlock(&u132->scheduler_lock);
 989                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
 990                return;
 991        } else if (endp->dequeueing) {
 992                endp->dequeueing = 0;
 993                mutex_unlock(&u132->scheduler_lock);
 994                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
 995                return;
 996        } else if (u132->going > 0) {
 997                dev_err(&u132->platform_dev->dev, "device is being removed "
 998                                "urb=%p\n", urb);
 999                mutex_unlock(&u132->scheduler_lock);
1000                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1001                return;
1002        } else if (!urb->unlinked) {
1003                mutex_unlock(&u132->scheduler_lock);
1004                u132_hcd_giveback_urb(u132, endp, urb, 0);
1005                return;
1006        } else {
1007                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1008                                "unlinked=%d\n", urb, urb->unlinked);
1009                mutex_unlock(&u132->scheduler_lock);
1010                u132_hcd_giveback_urb(u132, endp, urb, 0);
1011                return;
1012        }
1013}
1014
1015static void u132_hcd_configure_setup_sent(void *data, struct urb *urb, u8 *buf,
1016        int len, int toggle_bits, int error_count, int condition_code,
1017        int repeat_number, int halted, int skipped, int actual, int non_null)
1018{
1019        struct u132_endp *endp = data;
1020        struct u132 *u132 = endp->u132;
1021        u8 address = u132->addr[endp->usb_addr].address;
1022        mutex_lock(&u132->scheduler_lock);
1023        if (u132->going > 1) {
1024                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1025                        , u132->going);
1026                mutex_unlock(&u132->scheduler_lock);
1027                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1028                return;
1029        } else if (endp->dequeueing) {
1030                endp->dequeueing = 0;
1031                mutex_unlock(&u132->scheduler_lock);
1032                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1033                return;
1034        } else if (u132->going > 0) {
1035                dev_err(&u132->platform_dev->dev, "device is being removed "
1036                                "urb=%p\n", urb);
1037                mutex_unlock(&u132->scheduler_lock);
1038                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1039                return;
1040        } else if (!urb->unlinked) {
1041                if (usb_pipein(urb->pipe)) {
1042                        int retval;
1043                        struct u132_ring *ring = endp->ring;
1044                        mutex_unlock(&u132->scheduler_lock);
1045                        retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1046                                ring->number, endp, urb, address,
1047                                endp->usb_endp, 0,
1048                                u132_hcd_configure_input_recv);
1049                        if (retval != 0)
1050                                u132_hcd_giveback_urb(u132, endp, urb, retval);
1051                        return;
1052                } else {
1053                        int retval;
1054                        struct u132_ring *ring = endp->ring;
1055                        mutex_unlock(&u132->scheduler_lock);
1056                        retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1057                                ring->number, endp, urb, address,
1058                                endp->usb_endp, 0,
1059                                u132_hcd_configure_empty_recv);
1060                        if (retval != 0)
1061                                u132_hcd_giveback_urb(u132, endp, urb, retval);
1062                        return;
1063                }
1064        } else {
1065                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1066                                "unlinked=%d\n", urb, urb->unlinked);
1067                mutex_unlock(&u132->scheduler_lock);
1068                u132_hcd_giveback_urb(u132, endp, urb, 0);
1069                return;
1070        }
1071}
1072
1073static void u132_hcd_enumeration_empty_recv(void *data, struct urb *urb,
1074        u8 *buf, int len, int toggle_bits, int error_count, int condition_code,
1075        int repeat_number, int halted, int skipped, int actual, int non_null)
1076{
1077        struct u132_endp *endp = data;
1078        struct u132 *u132 = endp->u132;
1079        u8 address = u132->addr[endp->usb_addr].address;
1080        struct u132_udev *udev = &u132->udev[address];
1081        mutex_lock(&u132->scheduler_lock);
1082        if (u132->going > 1) {
1083                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1084                        , u132->going);
1085                mutex_unlock(&u132->scheduler_lock);
1086                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1087                return;
1088        } else if (endp->dequeueing) {
1089                endp->dequeueing = 0;
1090                mutex_unlock(&u132->scheduler_lock);
1091                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1092                return;
1093        } else if (u132->going > 0) {
1094                dev_err(&u132->platform_dev->dev, "device is being removed "
1095                                "urb=%p\n", urb);
1096                mutex_unlock(&u132->scheduler_lock);
1097                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1098                return;
1099        } else if (!urb->unlinked) {
1100                u132->addr[0].address = 0;
1101                endp->usb_addr = udev->usb_addr;
1102                mutex_unlock(&u132->scheduler_lock);
1103                u132_hcd_giveback_urb(u132, endp, urb, 0);
1104                return;
1105        } else {
1106                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1107                                "unlinked=%d\n", urb, urb->unlinked);
1108                mutex_unlock(&u132->scheduler_lock);
1109                u132_hcd_giveback_urb(u132, endp, urb, 0);
1110                return;
1111        }
1112}
1113
1114static void u132_hcd_enumeration_address_sent(void *data, struct urb *urb,
1115        u8 *buf, int len, int toggle_bits, int error_count, int condition_code,
1116        int repeat_number, int halted, int skipped, int actual, int non_null)
1117{
1118        struct u132_endp *endp = data;
1119        struct u132 *u132 = endp->u132;
1120        mutex_lock(&u132->scheduler_lock);
1121        if (u132->going > 1) {
1122                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1123                        , u132->going);
1124                mutex_unlock(&u132->scheduler_lock);
1125                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1126                return;
1127        } else if (endp->dequeueing) {
1128                endp->dequeueing = 0;
1129                mutex_unlock(&u132->scheduler_lock);
1130                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1131                return;
1132        } else if (u132->going > 0) {
1133                dev_err(&u132->platform_dev->dev, "device is being removed "
1134                                "urb=%p\n", urb);
1135                mutex_unlock(&u132->scheduler_lock);
1136                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1137                return;
1138        } else if (!urb->unlinked) {
1139                int retval;
1140                struct u132_ring *ring = endp->ring;
1141                mutex_unlock(&u132->scheduler_lock);
1142                retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1143                        ring->number, endp, urb, 0, endp->usb_endp, 0,
1144                        u132_hcd_enumeration_empty_recv);
1145                if (retval != 0)
1146                        u132_hcd_giveback_urb(u132, endp, urb, retval);
1147                return;
1148        } else {
1149                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1150                                "unlinked=%d\n", urb, urb->unlinked);
1151                mutex_unlock(&u132->scheduler_lock);
1152                u132_hcd_giveback_urb(u132, endp, urb, 0);
1153                return;
1154        }
1155}
1156
1157static void u132_hcd_initial_empty_sent(void *data, struct urb *urb, u8 *buf,
1158        int len, int toggle_bits, int error_count, int condition_code,
1159        int repeat_number, int halted, int skipped, int actual, int non_null)
1160{
1161        struct u132_endp *endp = data;
1162        struct u132 *u132 = endp->u132;
1163        mutex_lock(&u132->scheduler_lock);
1164        if (u132->going > 1) {
1165                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1166                        , u132->going);
1167                mutex_unlock(&u132->scheduler_lock);
1168                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1169                return;
1170        } else if (endp->dequeueing) {
1171                endp->dequeueing = 0;
1172                mutex_unlock(&u132->scheduler_lock);
1173                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1174                return;
1175        } else if (u132->going > 0) {
1176                dev_err(&u132->platform_dev->dev, "device is being removed "
1177                                "urb=%p\n", urb);
1178                mutex_unlock(&u132->scheduler_lock);
1179                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1180                return;
1181        } else if (!urb->unlinked) {
1182                mutex_unlock(&u132->scheduler_lock);
1183                u132_hcd_giveback_urb(u132, endp, urb, 0);
1184                return;
1185        } else {
1186                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1187                                "unlinked=%d\n", urb, urb->unlinked);
1188                mutex_unlock(&u132->scheduler_lock);
1189                u132_hcd_giveback_urb(u132, endp, urb, 0);
1190                return;
1191        }
1192}
1193
1194static void u132_hcd_initial_input_recv(void *data, struct urb *urb, u8 *buf,
1195        int len, int toggle_bits, int error_count, int condition_code,
1196        int repeat_number, int halted, int skipped, int actual, int non_null)
1197{
1198        struct u132_endp *endp = data;
1199        struct u132 *u132 = endp->u132;
1200        u8 address = u132->addr[endp->usb_addr].address;
1201        mutex_lock(&u132->scheduler_lock);
1202        if (u132->going > 1) {
1203                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1204                        , u132->going);
1205                mutex_unlock(&u132->scheduler_lock);
1206                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1207                return;
1208        } else if (endp->dequeueing) {
1209                endp->dequeueing = 0;
1210                mutex_unlock(&u132->scheduler_lock);
1211                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1212                return;
1213        } else if (u132->going > 0) {
1214                dev_err(&u132->platform_dev->dev, "device is being removed "
1215                                "urb=%p\n", urb);
1216                mutex_unlock(&u132->scheduler_lock);
1217                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1218                return;
1219        } else if (!urb->unlinked) {
1220                int retval;
1221                struct u132_ring *ring = endp->ring;
1222                u8 *u = urb->transfer_buffer;
1223                u8 *b = buf;
1224                int L = len;
1225
1226                while (L-- > 0)
1227                        *u++ = *b++;
1228
1229                urb->actual_length = len;
1230                mutex_unlock(&u132->scheduler_lock);
1231                retval = usb_ftdi_elan_edset_empty(u132->platform_dev,
1232                        ring->number, endp, urb, address, endp->usb_endp, 0x3,
1233                        u132_hcd_initial_empty_sent);
1234                if (retval != 0)
1235                        u132_hcd_giveback_urb(u132, endp, urb, retval);
1236                return;
1237        } else {
1238                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1239                                "unlinked=%d\n", urb, urb->unlinked);
1240                mutex_unlock(&u132->scheduler_lock);
1241                u132_hcd_giveback_urb(u132, endp, urb, 0);
1242                return;
1243        }
1244}
1245
1246static void u132_hcd_initial_setup_sent(void *data, struct urb *urb, u8 *buf,
1247        int len, int toggle_bits, int error_count, int condition_code,
1248        int repeat_number, int halted, int skipped, int actual, int non_null)
1249{
1250        struct u132_endp *endp = data;
1251        struct u132 *u132 = endp->u132;
1252        u8 address = u132->addr[endp->usb_addr].address;
1253        mutex_lock(&u132->scheduler_lock);
1254        if (u132->going > 1) {
1255                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1256                        , u132->going);
1257                mutex_unlock(&u132->scheduler_lock);
1258                u132_hcd_forget_urb(u132, endp, urb, -ENODEV);
1259                return;
1260        } else if (endp->dequeueing) {
1261                endp->dequeueing = 0;
1262                mutex_unlock(&u132->scheduler_lock);
1263                u132_hcd_giveback_urb(u132, endp, urb, -EINTR);
1264                return;
1265        } else if (u132->going > 0) {
1266                dev_err(&u132->platform_dev->dev, "device is being removed "
1267                                "urb=%p\n", urb);
1268                mutex_unlock(&u132->scheduler_lock);
1269                u132_hcd_giveback_urb(u132, endp, urb, -ENODEV);
1270                return;
1271        } else if (!urb->unlinked) {
1272                int retval;
1273                struct u132_ring *ring = endp->ring;
1274                mutex_unlock(&u132->scheduler_lock);
1275                retval = usb_ftdi_elan_edset_input(u132->platform_dev,
1276                        ring->number, endp, urb, address, endp->usb_endp, 0,
1277                        u132_hcd_initial_input_recv);
1278                if (retval != 0)
1279                        u132_hcd_giveback_urb(u132, endp, urb, retval);
1280                return;
1281        } else {
1282                dev_err(&u132->platform_dev->dev, "CALLBACK called urb=%p "
1283                                "unlinked=%d\n", urb, urb->unlinked);
1284                mutex_unlock(&u132->scheduler_lock);
1285                u132_hcd_giveback_urb(u132, endp, urb, 0);
1286                return;
1287        }
1288}
1289
1290/*
1291* this work function is only executed from the work queue
1292*
1293*/
1294static void u132_hcd_ring_work_scheduler(struct work_struct *work)
1295{
1296        struct u132_ring *ring =
1297                container_of(work, struct u132_ring, scheduler.work);
1298        struct u132 *u132 = ring->u132;
1299        mutex_lock(&u132->scheduler_lock);
1300        if (ring->in_use) {
1301                mutex_unlock(&u132->scheduler_lock);
1302                u132_ring_put_kref(u132, ring);
1303                return;
1304        } else if (ring->curr_endp) {
1305                struct u132_endp *endp, *last_endp = ring->curr_endp;
1306                unsigned long wakeup = 0;
1307                list_for_each_entry(endp, &last_endp->endp_ring, endp_ring) {
1308                        if (endp->queue_next == endp->queue_last) {
1309                        } else if ((endp->delayed == 0)
1310                                || time_after_eq(jiffies, endp->jiffies)) {
1311                                ring->curr_endp = endp;
1312                                u132_endp_cancel_work(u132, last_endp);
1313                                u132_endp_queue_work(u132, last_endp, 0);
1314                                mutex_unlock(&u132->scheduler_lock);
1315                                u132_ring_put_kref(u132, ring);
1316                                return;
1317                        } else {
1318                                unsigned long delta = endp->jiffies - jiffies;
1319                                if (delta > wakeup)
1320                                        wakeup = delta;
1321                        }
1322                }
1323                if (last_endp->queue_next == last_endp->queue_last) {
1324                } else if ((last_endp->delayed == 0) || time_after_eq(jiffies,
1325                        last_endp->jiffies)) {
1326                        u132_endp_cancel_work(u132, last_endp);
1327                        u132_endp_queue_work(u132, last_endp, 0);
1328                        mutex_unlock(&u132->scheduler_lock);
1329                        u132_ring_put_kref(u132, ring);
1330                        return;
1331                } else {
1332                        unsigned long delta = last_endp->jiffies - jiffies;
1333                        if (delta > wakeup)
1334                                wakeup = delta;
1335                }
1336                if (wakeup > 0) {
1337                        u132_ring_requeue_work(u132, ring, wakeup);
1338                        mutex_unlock(&u132->scheduler_lock);
1339                        return;
1340                } else {
1341                        mutex_unlock(&u132->scheduler_lock);
1342                        u132_ring_put_kref(u132, ring);
1343                        return;
1344                }
1345        } else {
1346                mutex_unlock(&u132->scheduler_lock);
1347                u132_ring_put_kref(u132, ring);
1348                return;
1349        }
1350}
1351
1352static void u132_hcd_endp_work_scheduler(struct work_struct *work)
1353{
1354        struct u132_ring *ring;
1355        struct u132_endp *endp =
1356                container_of(work, struct u132_endp, scheduler.work);
1357        struct u132 *u132 = endp->u132;
1358        mutex_lock(&u132->scheduler_lock);
1359        ring = endp->ring;
1360        if (endp->edset_flush) {
1361                endp->edset_flush = 0;
1362                if (endp->dequeueing)
1363                        usb_ftdi_elan_edset_flush(u132->platform_dev,
1364                                ring->number, endp);
1365                mutex_unlock(&u132->scheduler_lock);
1366                u132_endp_put_kref(u132, endp);
1367                return;
1368        } else if (endp->active) {
1369                mutex_unlock(&u132->scheduler_lock);
1370                u132_endp_put_kref(u132, endp);
1371                return;
1372        } else if (ring->in_use) {
1373                mutex_unlock(&u132->scheduler_lock);
1374                u132_endp_put_kref(u132, endp);
1375                return;
1376        } else if (endp->queue_next == endp->queue_last) {
1377                mutex_unlock(&u132->scheduler_lock);
1378                u132_endp_put_kref(u132, endp);
1379                return;
1380        } else if (endp->pipetype == PIPE_INTERRUPT) {
1381                u8 address = u132->addr[endp->usb_addr].address;
1382                if (ring->in_use) {
1383                        mutex_unlock(&u132->scheduler_lock);
1384                        u132_endp_put_kref(u132, endp);
1385                        return;
1386                } else {
1387                        int retval;
1388                        struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1389                                endp->queue_next];
1390                        endp->active = 1;
1391                        ring->curr_endp = endp;
1392                        ring->in_use = 1;
1393                        mutex_unlock(&u132->scheduler_lock);
1394                        retval = edset_single(u132, ring, endp, urb, address,
1395                                endp->toggle_bits, u132_hcd_interrupt_recv);
1396                        if (retval != 0)
1397                                u132_hcd_giveback_urb(u132, endp, urb, retval);
1398                        return;
1399                }
1400        } else if (endp->pipetype == PIPE_CONTROL) {
1401                u8 address = u132->addr[endp->usb_addr].address;
1402                if (ring->in_use) {
1403                        mutex_unlock(&u132->scheduler_lock);
1404                        u132_endp_put_kref(u132, endp);
1405                        return;
1406                } else if (address == 0) {
1407                        int retval;
1408                        struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1409                                endp->queue_next];
1410                        endp->active = 1;
1411                        ring->curr_endp = endp;
1412                        ring->in_use = 1;
1413                        mutex_unlock(&u132->scheduler_lock);
1414                        retval = edset_setup(u132, ring, endp, urb, address,
1415                                0x2, u132_hcd_initial_setup_sent);
1416                        if (retval != 0)
1417                                u132_hcd_giveback_urb(u132, endp, urb, retval);
1418                        return;
1419                } else if (endp->usb_addr == 0) {
1420                        int retval;
1421                        struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1422                                endp->queue_next];
1423                        endp->active = 1;
1424                        ring->curr_endp = endp;
1425                        ring->in_use = 1;
1426                        mutex_unlock(&u132->scheduler_lock);
1427                        retval = edset_setup(u132, ring, endp, urb, 0, 0x2,
1428                                u132_hcd_enumeration_address_sent);
1429                        if (retval != 0)
1430                                u132_hcd_giveback_urb(u132, endp, urb, retval);
1431                        return;
1432                } else {
1433                        int retval;
1434                        struct urb *urb = endp->urb_list[ENDP_QUEUE_MASK &
1435                                endp->queue_next];
1436                        address = u132->addr[endp->usb_addr].address;
1437                        endp->active = 1;
1438                        ring->curr_endp = endp;
1439                        ring->in_use = 1;
1440                        mutex_unlock(&u132->scheduler_lock);
1441                        retval = edset_setup(u132, ring, endp, urb, address,
1442                                0x2, u132_hcd_configure_setup_sent);
1443                        if (retval != 0)
1444                                u132_hcd_giveback_urb(u132, endp, urb, retval);
1445                        return;
1446                }
1447        } else {
1448                if (endp->input) {
1449                        u8 address = u132->addr[endp->usb_addr].address;
1450                        if (ring->in_use) {
1451                                mutex_unlock(&u132->scheduler_lock);
1452                                u132_endp_put_kref(u132, endp);
1453                                return;
1454                        } else {
1455                                int retval;
1456                                struct urb *urb = endp->urb_list[
1457                                        ENDP_QUEUE_MASK & endp->queue_next];
1458                                endp->active = 1;
1459                                ring->curr_endp = endp;
1460                                ring->in_use = 1;
1461                                mutex_unlock(&u132->scheduler_lock);
1462                                retval = edset_input(u132, ring, endp, urb,
1463                                        address, endp->toggle_bits,
1464                                        u132_hcd_bulk_input_recv);
1465                                if (retval == 0) {
1466                                } else
1467                                        u132_hcd_giveback_urb(u132, endp, urb,
1468                                                retval);
1469                                return;
1470                        }
1471                } else {        /* output pipe */
1472                        u8 address = u132->addr[endp->usb_addr].address;
1473                        if (ring->in_use) {
1474                                mutex_unlock(&u132->scheduler_lock);
1475                                u132_endp_put_kref(u132, endp);
1476                                return;
1477                        } else {
1478                                int retval;
1479                                struct urb *urb = endp->urb_list[
1480                                        ENDP_QUEUE_MASK & endp->queue_next];
1481                                endp->active = 1;
1482                                ring->curr_endp = endp;
1483                                ring->in_use = 1;
1484                                mutex_unlock(&u132->scheduler_lock);
1485                                retval = edset_output(u132, ring, endp, urb,
1486                                        address, endp->toggle_bits,
1487                                        u132_hcd_bulk_output_sent);
1488                                if (retval == 0) {
1489                                } else
1490                                        u132_hcd_giveback_urb(u132, endp, urb,
1491                                                retval);
1492                                return;
1493                        }
1494                }
1495        }
1496}
1497#ifdef CONFIG_PM
1498
1499static void port_power(struct u132 *u132, int pn, int is_on)
1500{
1501        u132->port[pn].power = is_on;
1502}
1503
1504#endif
1505
1506static void u132_power(struct u132 *u132, int is_on)
1507{
1508        struct usb_hcd *hcd = u132_to_hcd(u132)
1509                ;       /* hub is inactive unless the port is powered */
1510        if (is_on) {
1511                if (u132->power)
1512                        return;
1513                u132->power = 1;
1514        } else {
1515                u132->power = 0;
1516                hcd->state = HC_STATE_HALT;
1517        }
1518}
1519
1520static int u132_periodic_reinit(struct u132 *u132)
1521{
1522        int retval;
1523        u32 fi = u132->hc_fminterval & 0x03fff;
1524        u32 fit;
1525        u32 fminterval;
1526        retval = u132_read_pcimem(u132, fminterval, &fminterval);
1527        if (retval)
1528                return retval;
1529        fit = fminterval & FIT;
1530        retval = u132_write_pcimem(u132, fminterval,
1531                (fit ^ FIT) | u132->hc_fminterval);
1532        if (retval)
1533                return retval;
1534        return u132_write_pcimem(u132, periodicstart,
1535               ((9 * fi) / 10) & 0x3fff);
1536}
1537
1538static char *hcfs2string(int state)
1539{
1540        switch (state) {
1541        case OHCI_USB_RESET:
1542                return "reset";
1543        case OHCI_USB_RESUME:
1544                return "resume";
1545        case OHCI_USB_OPER:
1546                return "operational";
1547        case OHCI_USB_SUSPEND:
1548                return "suspend";
1549        }
1550        return "?";
1551}
1552
1553static int u132_init(struct u132 *u132)
1554{
1555        int retval;
1556        u32 control;
1557        u132_disable(u132);
1558        u132->next_statechange = jiffies;
1559        retval = u132_write_pcimem(u132, intrdisable, OHCI_INTR_MIE);
1560        if (retval)
1561                return retval;
1562        retval = u132_read_pcimem(u132, control, &control);
1563        if (retval)
1564                return retval;
1565        if (u132->num_ports == 0) {
1566                u32 rh_a = -1;
1567                retval = u132_read_pcimem(u132, roothub.a, &rh_a);
1568                if (retval)
1569                        return retval;
1570                u132->num_ports = rh_a & RH_A_NDP;
1571                retval = read_roothub_info(u132);
1572                if (retval)
1573                        return retval;
1574        }
1575        if (u132->num_ports > MAX_U132_PORTS)
1576                return -EINVAL;
1577
1578        return 0;
1579}
1580
1581
1582/* Start an OHCI controller, set the BUS operational
1583* resets USB and controller
1584* enable interrupts
1585*/
1586static int u132_run(struct u132 *u132)
1587{
1588        int retval;
1589        u32 control;
1590        u32 status;
1591        u32 fminterval;
1592        u32 periodicstart;
1593        u32 cmdstatus;
1594        u32 roothub_a;
1595        int mask = OHCI_INTR_INIT;
1596        int first = u132->hc_fminterval == 0;
1597        int sleep_time = 0;
1598        int reset_timeout = 30; /* ... allow extra time */
1599        u132_disable(u132);
1600        if (first) {
1601                u32 temp;
1602                retval = u132_read_pcimem(u132, fminterval, &temp);
1603                if (retval)
1604                        return retval;
1605                u132->hc_fminterval = temp & 0x3fff;
1606                u132->hc_fminterval |= FSMP(u132->hc_fminterval) << 16;
1607        }
1608        retval = u132_read_pcimem(u132, control, &u132->hc_control);
1609        if (retval)
1610                return retval;
1611        dev_info(&u132->platform_dev->dev, "resetting from state '%s', control "
1612                "= %08X\n", hcfs2string(u132->hc_control & OHCI_CTRL_HCFS),
1613                u132->hc_control);
1614        switch (u132->hc_control & OHCI_CTRL_HCFS) {
1615        case OHCI_USB_OPER:
1616                sleep_time = 0;
1617                break;
1618        case OHCI_USB_SUSPEND:
1619        case OHCI_USB_RESUME:
1620                u132->hc_control &= OHCI_CTRL_RWC;
1621                u132->hc_control |= OHCI_USB_RESUME;
1622                sleep_time = 10;
1623                break;
1624        default:
1625                u132->hc_control &= OHCI_CTRL_RWC;
1626                u132->hc_control |= OHCI_USB_RESET;
1627                sleep_time = 50;
1628                break;
1629        }
1630        retval = u132_write_pcimem(u132, control, u132->hc_control);
1631        if (retval)
1632                return retval;
1633        retval = u132_read_pcimem(u132, control, &control);
1634        if (retval)
1635                return retval;
1636        msleep(sleep_time);
1637        retval = u132_read_pcimem(u132, roothub.a, &roothub_a);
1638        if (retval)
1639                return retval;
1640        if (!(roothub_a & RH_A_NPS)) {
1641                int temp;       /* power down each port */
1642                for (temp = 0; temp < u132->num_ports; temp++) {
1643                        retval = u132_write_pcimem(u132,
1644                                roothub.portstatus[temp], RH_PS_LSDA);
1645                        if (retval)
1646                                return retval;
1647                }
1648        }
1649        retval = u132_read_pcimem(u132, control, &control);
1650        if (retval)
1651                return retval;
1652retry:
1653        retval = u132_read_pcimem(u132, cmdstatus, &status);
1654        if (retval)
1655                return retval;
1656        retval = u132_write_pcimem(u132, cmdstatus, OHCI_HCR);
1657        if (retval)
1658                return retval;
1659extra:  {
1660                retval = u132_read_pcimem(u132, cmdstatus, &status);
1661                if (retval)
1662                        return retval;
1663                if (0 != (status & OHCI_HCR)) {
1664                        if (--reset_timeout == 0) {
1665                                dev_err(&u132->platform_dev->dev, "USB HC reset"
1666                                        " timed out!\n");
1667                                return -ENODEV;
1668                        } else {
1669                                msleep(5);
1670                                goto extra;
1671                        }
1672                }
1673        }
1674        if (u132->flags & OHCI_QUIRK_INITRESET) {
1675                retval = u132_write_pcimem(u132, control, u132->hc_control);
1676                if (retval)
1677                        return retval;
1678                retval = u132_read_pcimem(u132, control, &control);
1679                if (retval)
1680                        return retval;
1681        }
1682        retval = u132_write_pcimem(u132, ed_controlhead, 0x00000000);
1683        if (retval)
1684                return retval;
1685        retval = u132_write_pcimem(u132, ed_bulkhead, 0x11000000);
1686        if (retval)
1687                return retval;
1688        retval = u132_write_pcimem(u132, hcca, 0x00000000);
1689        if (retval)
1690                return retval;
1691        retval = u132_periodic_reinit(u132);
1692        if (retval)
1693                return retval;
1694        retval = u132_read_pcimem(u132, fminterval, &fminterval);
1695        if (retval)
1696                return retval;
1697        retval = u132_read_pcimem(u132, periodicstart, &periodicstart);
1698        if (retval)
1699                return retval;
1700        if (0 == (fminterval & 0x3fff0000) || 0 == periodicstart) {
1701                if (!(u132->flags & OHCI_QUIRK_INITRESET)) {
1702                        u132->flags |= OHCI_QUIRK_INITRESET;
1703                        goto retry;
1704                } else
1705                        dev_err(&u132->platform_dev->dev, "init err(%08x %04x)"
1706                                "\n", fminterval, periodicstart);
1707        }                       /* start controller operations */
1708        u132->hc_control &= OHCI_CTRL_RWC;
1709        u132->hc_control |= OHCI_CONTROL_INIT | OHCI_CTRL_BLE | OHCI_USB_OPER;
1710        retval = u132_write_pcimem(u132, control, u132->hc_control);
1711        if (retval)
1712                return retval;
1713        retval = u132_write_pcimem(u132, cmdstatus, OHCI_BLF);
1714        if (retval)
1715                return retval;
1716        retval = u132_read_pcimem(u132, cmdstatus, &cmdstatus);
1717        if (retval)
1718                return retval;
1719        retval = u132_read_pcimem(u132, control, &control);
1720        if (retval)
1721                return retval;
1722        u132_to_hcd(u132)->state = HC_STATE_RUNNING;
1723        retval = u132_write_pcimem(u132, roothub.status, RH_HS_DRWE);
1724        if (retval)
1725                return retval;
1726        retval = u132_write_pcimem(u132, intrstatus, mask);
1727        if (retval)
1728                return retval;
1729        retval = u132_write_pcimem(u132, intrdisable,
1730                OHCI_INTR_MIE | OHCI_INTR_OC | OHCI_INTR_RHSC | OHCI_INTR_FNO |
1731                OHCI_INTR_UE | OHCI_INTR_RD | OHCI_INTR_SF | OHCI_INTR_WDH |
1732                OHCI_INTR_SO);
1733        if (retval)
1734                return retval;  /* handle root hub init quirks ... */
1735        retval = u132_read_pcimem(u132, roothub.a, &roothub_a);
1736        if (retval)
1737                return retval;
1738        roothub_a &= ~(RH_A_PSM | RH_A_OCPM);
1739        if (u132->flags & OHCI_QUIRK_SUPERIO) {
1740                roothub_a |= RH_A_NOCP;
1741                roothub_a &= ~(RH_A_POTPGT | RH_A_NPS);
1742                retval = u132_write_pcimem(u132, roothub.a, roothub_a);
1743                if (retval)
1744                        return retval;
1745        } else if ((u132->flags & OHCI_QUIRK_AMD756) || distrust_firmware) {
1746                roothub_a |= RH_A_NPS;
1747                retval = u132_write_pcimem(u132, roothub.a, roothub_a);
1748                if (retval)
1749                        return retval;
1750        }
1751        retval = u132_write_pcimem(u132, roothub.status, RH_HS_LPSC);
1752        if (retval)
1753                return retval;
1754        retval = u132_write_pcimem(u132, roothub.b,
1755                (roothub_a & RH_A_NPS) ? 0 : RH_B_PPCM);
1756        if (retval)
1757                return retval;
1758        retval = u132_read_pcimem(u132, control, &control);
1759        if (retval)
1760                return retval;
1761        mdelay((roothub_a >> 23) & 0x1fe);
1762        u132_to_hcd(u132)->state = HC_STATE_RUNNING;
1763        return 0;
1764}
1765
1766static void u132_hcd_stop(struct usb_hcd *hcd)
1767{
1768        struct u132 *u132 = hcd_to_u132(hcd);
1769        if (u132->going > 1) {
1770                dev_err(&u132->platform_dev->dev, "u132 device %p(hcd=%p) has b"
1771                        "een removed %d\n", u132, hcd, u132->going);
1772        } else if (u132->going > 0) {
1773                dev_err(&u132->platform_dev->dev, "device hcd=%p is being remov"
1774                        "ed\n", hcd);
1775        } else {
1776                mutex_lock(&u132->sw_lock);
1777                msleep(100);
1778                u132_power(u132, 0);
1779                mutex_unlock(&u132->sw_lock);
1780        }
1781}
1782
1783static int u132_hcd_start(struct usb_hcd *hcd)
1784{
1785        struct u132 *u132 = hcd_to_u132(hcd);
1786        if (u132->going > 1) {
1787                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1788                        , u132->going);
1789                return -ENODEV;
1790        } else if (u132->going > 0) {
1791                dev_err(&u132->platform_dev->dev, "device is being removed\n");
1792                return -ESHUTDOWN;
1793        } else if (hcd->self.controller) {
1794                int retval;
1795                struct platform_device *pdev =
1796                        to_platform_device(hcd->self.controller);
1797                u16 vendor = ((struct u132_platform_data *)
1798                        dev_get_platdata(&pdev->dev))->vendor;
1799                u16 device = ((struct u132_platform_data *)
1800                        dev_get_platdata(&pdev->dev))->device;
1801                mutex_lock(&u132->sw_lock);
1802                msleep(10);
1803                if (vendor == PCI_VENDOR_ID_AMD && device == 0x740c) {
1804                        u132->flags = OHCI_QUIRK_AMD756;
1805                } else if (vendor == PCI_VENDOR_ID_OPTI && device == 0xc861) {
1806                        dev_err(&u132->platform_dev->dev, "WARNING: OPTi workar"
1807                                "ounds unavailable\n");
1808                } else if (vendor == PCI_VENDOR_ID_COMPAQ && device == 0xa0f8)
1809                        u132->flags |= OHCI_QUIRK_ZFMICRO;
1810                retval = u132_run(u132);
1811                if (retval) {
1812                        u132_disable(u132);
1813                        u132->going = 1;
1814                }
1815                msleep(100);
1816                mutex_unlock(&u132->sw_lock);
1817                return retval;
1818        } else {
1819                dev_err(&u132->platform_dev->dev, "platform_device missing\n");
1820                return -ENODEV;
1821        }
1822}
1823
1824static int u132_hcd_reset(struct usb_hcd *hcd)
1825{
1826        struct u132 *u132 = hcd_to_u132(hcd);
1827        if (u132->going > 1) {
1828                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
1829                        , u132->going);
1830                return -ENODEV;
1831        } else if (u132->going > 0) {
1832                dev_err(&u132->platform_dev->dev, "device is being removed\n");
1833                return -ESHUTDOWN;
1834        } else {
1835                int retval;
1836                mutex_lock(&u132->sw_lock);
1837                retval = u132_init(u132);
1838                if (retval) {
1839                        u132_disable(u132);
1840                        u132->going = 1;
1841                }
1842                mutex_unlock(&u132->sw_lock);
1843                return retval;
1844        }
1845}
1846
1847static int create_endpoint_and_queue_int(struct u132 *u132,
1848        struct u132_udev *udev, struct urb *urb,
1849        struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp, u8 address,
1850        gfp_t mem_flags)
1851{
1852        struct u132_ring *ring;
1853        unsigned long irqs;
1854        int rc;
1855        u8 endp_number;
1856        struct u132_endp *endp = kmalloc(sizeof(struct u132_endp), mem_flags);
1857
1858        if (!endp)
1859                return -ENOMEM;
1860
1861        spin_lock_init(&endp->queue_lock.slock);
1862        spin_lock_irqsave(&endp->queue_lock.slock, irqs);
1863        rc = usb_hcd_link_urb_to_ep(u132_to_hcd(u132), urb);
1864        if (rc) {
1865                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
1866                kfree(endp);
1867                return rc;
1868        }
1869
1870        endp_number = ++u132->num_endpoints;
1871        urb->ep->hcpriv = u132->endp[endp_number - 1] = endp;
1872        INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
1873        INIT_LIST_HEAD(&endp->urb_more);
1874        ring = endp->ring = &u132->ring[0];
1875        if (ring->curr_endp) {
1876                list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
1877        } else {
1878                INIT_LIST_HEAD(&endp->endp_ring);
1879                ring->curr_endp = endp;
1880        }
1881        ring->length += 1;
1882        endp->dequeueing = 0;
1883        endp->edset_flush = 0;
1884        endp->active = 0;
1885        endp->delayed = 0;
1886        endp->endp_number = endp_number;
1887        endp->u132 = u132;
1888        endp->hep = urb->ep;
1889        endp->pipetype = usb_pipetype(urb->pipe);
1890        u132_endp_init_kref(u132, endp);
1891        if (usb_pipein(urb->pipe)) {
1892                endp->toggle_bits = 0x2;
1893                usb_settoggle(udev->usb_device, usb_endp, 0, 0);
1894                endp->input = 1;
1895                endp->output = 0;
1896                udev->endp_number_in[usb_endp] = endp_number;
1897                u132_udev_get_kref(u132, udev);
1898        } else {
1899                endp->toggle_bits = 0x2;
1900                usb_settoggle(udev->usb_device, usb_endp, 1, 0);
1901                endp->input = 0;
1902                endp->output = 1;
1903                udev->endp_number_out[usb_endp] = endp_number;
1904                u132_udev_get_kref(u132, udev);
1905        }
1906        urb->hcpriv = u132;
1907        endp->delayed = 1;
1908        endp->jiffies = jiffies + msecs_to_jiffies(urb->interval);
1909        endp->udev_number = address;
1910        endp->usb_addr = usb_addr;
1911        endp->usb_endp = usb_endp;
1912        endp->queue_size = 1;
1913        endp->queue_last = 0;
1914        endp->queue_next = 0;
1915        endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
1916        spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
1917        u132_endp_queue_work(u132, endp, msecs_to_jiffies(urb->interval));
1918        return 0;
1919}
1920
1921static int queue_int_on_old_endpoint(struct u132 *u132,
1922        struct u132_udev *udev, struct urb *urb,
1923        struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
1924        u8 usb_endp, u8 address)
1925{
1926        urb->hcpriv = u132;
1927        endp->delayed = 1;
1928        endp->jiffies = jiffies + msecs_to_jiffies(urb->interval);
1929        if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
1930                endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
1931        } else {
1932                struct u132_urbq *urbq = kmalloc(sizeof(struct u132_urbq),
1933                        GFP_ATOMIC);
1934                if (urbq == NULL) {
1935                        endp->queue_size -= 1;
1936                        return -ENOMEM;
1937                } else {
1938                        list_add_tail(&urbq->urb_more, &endp->urb_more);
1939                        urbq->urb = urb;
1940                }
1941        }
1942        return 0;
1943}
1944
1945static int create_endpoint_and_queue_bulk(struct u132 *u132,
1946        struct u132_udev *udev, struct urb *urb,
1947        struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp, u8 address,
1948        gfp_t mem_flags)
1949{
1950        int ring_number;
1951        struct u132_ring *ring;
1952        unsigned long irqs;
1953        int rc;
1954        u8 endp_number;
1955        struct u132_endp *endp = kmalloc(sizeof(struct u132_endp), mem_flags);
1956
1957        if (!endp)
1958                return -ENOMEM;
1959
1960        spin_lock_init(&endp->queue_lock.slock);
1961        spin_lock_irqsave(&endp->queue_lock.slock, irqs);
1962        rc = usb_hcd_link_urb_to_ep(u132_to_hcd(u132), urb);
1963        if (rc) {
1964                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
1965                kfree(endp);
1966                return rc;
1967        }
1968
1969        endp_number = ++u132->num_endpoints;
1970        urb->ep->hcpriv = u132->endp[endp_number - 1] = endp;
1971        INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
1972        INIT_LIST_HEAD(&endp->urb_more);
1973        endp->dequeueing = 0;
1974        endp->edset_flush = 0;
1975        endp->active = 0;
1976        endp->delayed = 0;
1977        endp->endp_number = endp_number;
1978        endp->u132 = u132;
1979        endp->hep = urb->ep;
1980        endp->pipetype = usb_pipetype(urb->pipe);
1981        u132_endp_init_kref(u132, endp);
1982        if (usb_pipein(urb->pipe)) {
1983                endp->toggle_bits = 0x2;
1984                usb_settoggle(udev->usb_device, usb_endp, 0, 0);
1985                ring_number = 3;
1986                endp->input = 1;
1987                endp->output = 0;
1988                udev->endp_number_in[usb_endp] = endp_number;
1989                u132_udev_get_kref(u132, udev);
1990        } else {
1991                endp->toggle_bits = 0x2;
1992                usb_settoggle(udev->usb_device, usb_endp, 1, 0);
1993                ring_number = 2;
1994                endp->input = 0;
1995                endp->output = 1;
1996                udev->endp_number_out[usb_endp] = endp_number;
1997                u132_udev_get_kref(u132, udev);
1998        }
1999        ring = endp->ring = &u132->ring[ring_number - 1];
2000        if (ring->curr_endp) {
2001                list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
2002        } else {
2003                INIT_LIST_HEAD(&endp->endp_ring);
2004                ring->curr_endp = endp;
2005        }
2006        ring->length += 1;
2007        urb->hcpriv = u132;
2008        endp->udev_number = address;
2009        endp->usb_addr = usb_addr;
2010        endp->usb_endp = usb_endp;
2011        endp->queue_size = 1;
2012        endp->queue_last = 0;
2013        endp->queue_next = 0;
2014        endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2015        spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2016        u132_endp_queue_work(u132, endp, 0);
2017        return 0;
2018}
2019
2020static int queue_bulk_on_old_endpoint(struct u132 *u132, struct u132_udev *udev,
2021        struct urb *urb,
2022        struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
2023        u8 usb_endp, u8 address)
2024{
2025        urb->hcpriv = u132;
2026        if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2027                endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2028        } else {
2029                struct u132_urbq *urbq = kmalloc(sizeof(struct u132_urbq),
2030                        GFP_ATOMIC);
2031                if (urbq == NULL) {
2032                        endp->queue_size -= 1;
2033                        return -ENOMEM;
2034                } else {
2035                        list_add_tail(&urbq->urb_more, &endp->urb_more);
2036                        urbq->urb = urb;
2037                }
2038        }
2039        return 0;
2040}
2041
2042static int create_endpoint_and_queue_control(struct u132 *u132,
2043        struct urb *urb,
2044        struct usb_device *usb_dev, u8 usb_addr, u8 usb_endp,
2045        gfp_t mem_flags)
2046{
2047        struct u132_ring *ring;
2048        unsigned long irqs;
2049        int rc;
2050        u8 endp_number;
2051        struct u132_endp *endp = kmalloc(sizeof(struct u132_endp), mem_flags);
2052
2053        if (!endp)
2054                return -ENOMEM;
2055
2056        spin_lock_init(&endp->queue_lock.slock);
2057        spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2058        rc = usb_hcd_link_urb_to_ep(u132_to_hcd(u132), urb);
2059        if (rc) {
2060                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2061                kfree(endp);
2062                return rc;
2063        }
2064
2065        endp_number = ++u132->num_endpoints;
2066        urb->ep->hcpriv = u132->endp[endp_number - 1] = endp;
2067        INIT_DELAYED_WORK(&endp->scheduler, u132_hcd_endp_work_scheduler);
2068        INIT_LIST_HEAD(&endp->urb_more);
2069        ring = endp->ring = &u132->ring[0];
2070        if (ring->curr_endp) {
2071                list_add_tail(&endp->endp_ring, &ring->curr_endp->endp_ring);
2072        } else {
2073                INIT_LIST_HEAD(&endp->endp_ring);
2074                ring->curr_endp = endp;
2075        }
2076        ring->length += 1;
2077        endp->dequeueing = 0;
2078        endp->edset_flush = 0;
2079        endp->active = 0;
2080        endp->delayed = 0;
2081        endp->endp_number = endp_number;
2082        endp->u132 = u132;
2083        endp->hep = urb->ep;
2084        u132_endp_init_kref(u132, endp);
2085        u132_endp_get_kref(u132, endp);
2086        if (usb_addr == 0) {
2087                u8 address = u132->addr[usb_addr].address;
2088                struct u132_udev *udev = &u132->udev[address];
2089                endp->udev_number = address;
2090                endp->usb_addr = usb_addr;
2091                endp->usb_endp = usb_endp;
2092                endp->input = 1;
2093                endp->output = 1;
2094                endp->pipetype = usb_pipetype(urb->pipe);
2095                u132_udev_init_kref(u132, udev);
2096                u132_udev_get_kref(u132, udev);
2097                udev->endp_number_in[usb_endp] = endp_number;
2098                udev->endp_number_out[usb_endp] = endp_number;
2099                urb->hcpriv = u132;
2100                endp->queue_size = 1;
2101                endp->queue_last = 0;
2102                endp->queue_next = 0;
2103                endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2104                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2105                u132_endp_queue_work(u132, endp, 0);
2106                return 0;
2107        } else {                /*(usb_addr > 0) */
2108                u8 address = u132->addr[usb_addr].address;
2109                struct u132_udev *udev = &u132->udev[address];
2110                endp->udev_number = address;
2111                endp->usb_addr = usb_addr;
2112                endp->usb_endp = usb_endp;
2113                endp->input = 1;
2114                endp->output = 1;
2115                endp->pipetype = usb_pipetype(urb->pipe);
2116                u132_udev_get_kref(u132, udev);
2117                udev->enumeration = 2;
2118                udev->endp_number_in[usb_endp] = endp_number;
2119                udev->endp_number_out[usb_endp] = endp_number;
2120                urb->hcpriv = u132;
2121                endp->queue_size = 1;
2122                endp->queue_last = 0;
2123                endp->queue_next = 0;
2124                endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] = urb;
2125                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2126                u132_endp_queue_work(u132, endp, 0);
2127                return 0;
2128        }
2129}
2130
2131static int queue_control_on_old_endpoint(struct u132 *u132,
2132        struct urb *urb,
2133        struct usb_device *usb_dev, struct u132_endp *endp, u8 usb_addr,
2134        u8 usb_endp)
2135{
2136        if (usb_addr == 0) {
2137                if (usb_pipein(urb->pipe)) {
2138                        urb->hcpriv = u132;
2139                        if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2140                                endp->urb_list[ENDP_QUEUE_MASK &
2141                                        endp->queue_last++] = urb;
2142                        } else {
2143                                struct u132_urbq *urbq =
2144                                        kmalloc(sizeof(struct u132_urbq),
2145                                        GFP_ATOMIC);
2146                                if (urbq == NULL) {
2147                                        endp->queue_size -= 1;
2148                                        return -ENOMEM;
2149                                } else {
2150                                        list_add_tail(&urbq->urb_more,
2151                                                &endp->urb_more);
2152                                        urbq->urb = urb;
2153                                }
2154                        }
2155                        return 0;
2156                } else {        /* usb_pipeout(urb->pipe) */
2157                        struct u132_addr *addr = &u132->addr[usb_dev->devnum];
2158                        int I = MAX_U132_UDEVS;
2159                        int i = 0;
2160                        while (--I > 0) {
2161                                struct u132_udev *udev = &u132->udev[++i];
2162                                if (udev->usb_device) {
2163                                        continue;
2164                                } else {
2165                                        udev->enumeration = 1;
2166                                        u132->addr[0].address = i;
2167                                        endp->udev_number = i;
2168                                        udev->udev_number = i;
2169                                        udev->usb_addr = usb_dev->devnum;
2170                                        u132_udev_init_kref(u132, udev);
2171                                        udev->endp_number_in[usb_endp] =
2172                                                endp->endp_number;
2173                                        u132_udev_get_kref(u132, udev);
2174                                        udev->endp_number_out[usb_endp] =
2175                                                endp->endp_number;
2176                                        udev->usb_device = usb_dev;
2177                                        ((u8 *) (urb->setup_packet))[2] =
2178                                                addr->address = i;
2179                                        u132_udev_get_kref(u132, udev);
2180                                        break;
2181                                }
2182                        }
2183                        if (I == 0) {
2184                                dev_err(&u132->platform_dev->dev, "run out of d"
2185                                        "evice space\n");
2186                                return -EINVAL;
2187                        }
2188                        urb->hcpriv = u132;
2189                        if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2190                                endp->urb_list[ENDP_QUEUE_MASK &
2191                                        endp->queue_last++] = urb;
2192                        } else {
2193                                struct u132_urbq *urbq =
2194                                        kmalloc(sizeof(struct u132_urbq),
2195                                        GFP_ATOMIC);
2196                                if (urbq == NULL) {
2197                                        endp->queue_size -= 1;
2198                                        return -ENOMEM;
2199                                } else {
2200                                        list_add_tail(&urbq->urb_more,
2201                                                &endp->urb_more);
2202                                        urbq->urb = urb;
2203                                }
2204                        }
2205                        return 0;
2206                }
2207        } else {                /*(usb_addr > 0) */
2208                u8 address = u132->addr[usb_addr].address;
2209                struct u132_udev *udev = &u132->udev[address];
2210                urb->hcpriv = u132;
2211                if (udev->enumeration != 2)
2212                        udev->enumeration = 2;
2213                if (endp->queue_size++ < ENDP_QUEUE_SIZE) {
2214                        endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =
2215                                urb;
2216                } else {
2217                        struct u132_urbq *urbq =
2218                                kmalloc(sizeof(struct u132_urbq), GFP_ATOMIC);
2219                        if (urbq == NULL) {
2220                                endp->queue_size -= 1;
2221                                return -ENOMEM;
2222                        } else {
2223                                list_add_tail(&urbq->urb_more, &endp->urb_more);
2224                                urbq->urb = urb;
2225                        }
2226                }
2227                return 0;
2228        }
2229}
2230
2231static int u132_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
2232                gfp_t mem_flags)
2233{
2234        struct u132 *u132 = hcd_to_u132(hcd);
2235        if (irqs_disabled()) {
2236                if (gfpflags_allow_blocking(mem_flags)) {
2237                        printk(KERN_ERR "invalid context for function that might sleep\n");
2238                        return -EINVAL;
2239                }
2240        }
2241        if (u132->going > 1) {
2242                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2243                        , u132->going);
2244                return -ENODEV;
2245        } else if (u132->going > 0) {
2246                dev_err(&u132->platform_dev->dev, "device is being removed "
2247                                "urb=%p\n", urb);
2248                return -ESHUTDOWN;
2249        } else {
2250                u8 usb_addr = usb_pipedevice(urb->pipe);
2251                u8 usb_endp = usb_pipeendpoint(urb->pipe);
2252                struct usb_device *usb_dev = urb->dev;
2253                if (usb_pipetype(urb->pipe) == PIPE_INTERRUPT) {
2254                        u8 address = u132->addr[usb_addr].address;
2255                        struct u132_udev *udev = &u132->udev[address];
2256                        struct u132_endp *endp = urb->ep->hcpriv;
2257                        urb->actual_length = 0;
2258                        if (endp) {
2259                                unsigned long irqs;
2260                                int retval;
2261                                spin_lock_irqsave(&endp->queue_lock.slock,
2262                                        irqs);
2263                                retval = usb_hcd_link_urb_to_ep(hcd, urb);
2264                                if (retval == 0) {
2265                                        retval = queue_int_on_old_endpoint(
2266                                                        u132, udev, urb,
2267                                                        usb_dev, endp,
2268                                                        usb_addr, usb_endp,
2269                                                        address);
2270                                        if (retval)
2271                                                usb_hcd_unlink_urb_from_ep(
2272        hcd, urb);
2273                                }
2274                                spin_unlock_irqrestore(&endp->queue_lock.slock,
2275                                        irqs);
2276                                if (retval) {
2277                                        return retval;
2278                                } else {
2279                                        u132_endp_queue_work(u132, endp,
2280                                                msecs_to_jiffies(urb->interval))
2281                                                ;
2282                                        return 0;
2283                                }
2284                        } else if (u132->num_endpoints == MAX_U132_ENDPS) {
2285                                return -EINVAL;
2286                        } else {        /*(endp == NULL) */
2287                                return create_endpoint_and_queue_int(u132, udev,
2288                                                urb, usb_dev, usb_addr,
2289                                                usb_endp, address, mem_flags);
2290                        }
2291                } else if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
2292                        dev_err(&u132->platform_dev->dev, "the hardware does no"
2293                                "t support PIPE_ISOCHRONOUS\n");
2294                        return -EINVAL;
2295                } else if (usb_pipetype(urb->pipe) == PIPE_BULK) {
2296                        u8 address = u132->addr[usb_addr].address;
2297                        struct u132_udev *udev = &u132->udev[address];
2298                        struct u132_endp *endp = urb->ep->hcpriv;
2299                        urb->actual_length = 0;
2300                        if (endp) {
2301                                unsigned long irqs;
2302                                int retval;
2303                                spin_lock_irqsave(&endp->queue_lock.slock,
2304                                        irqs);
2305                                retval = usb_hcd_link_urb_to_ep(hcd, urb);
2306                                if (retval == 0) {
2307                                        retval = queue_bulk_on_old_endpoint(
2308                                                        u132, udev, urb,
2309                                                        usb_dev, endp,
2310                                                        usb_addr, usb_endp,
2311                                                        address);
2312                                        if (retval)
2313                                                usb_hcd_unlink_urb_from_ep(
2314        hcd, urb);
2315                                }
2316                                spin_unlock_irqrestore(&endp->queue_lock.slock,
2317                                        irqs);
2318                                if (retval) {
2319                                        return retval;
2320                                } else {
2321                                        u132_endp_queue_work(u132, endp, 0);
2322                                        return 0;
2323                                }
2324                        } else if (u132->num_endpoints == MAX_U132_ENDPS) {
2325                                return -EINVAL;
2326                        } else
2327                                return create_endpoint_and_queue_bulk(u132,
2328                                        udev, urb, usb_dev, usb_addr,
2329                                        usb_endp, address, mem_flags);
2330                } else {
2331                        struct u132_endp *endp = urb->ep->hcpriv;
2332                        u16 urb_size = 8;
2333                        u8 *b = urb->setup_packet;
2334                        int i = 0;
2335                        char data[30 * 3 + 4];
2336                        char *d = data;
2337                        int m = (sizeof(data) - 1) / 3;
2338                        int l = 0;
2339                        data[0] = 0;
2340                        while (urb_size-- > 0) {
2341                                if (i > m) {
2342                                } else if (i++ < m) {
2343                                        int w = sprintf(d, " %02X", *b++);
2344                                        d += w;
2345                                        l += w;
2346                                } else
2347                                        d += sprintf(d, " ..");
2348                        }
2349                        if (endp) {
2350                                unsigned long irqs;
2351                                int retval;
2352                                spin_lock_irqsave(&endp->queue_lock.slock,
2353                                        irqs);
2354                                retval = usb_hcd_link_urb_to_ep(hcd, urb);
2355                                if (retval == 0) {
2356                                        retval = queue_control_on_old_endpoint(
2357                                                        u132, urb, usb_dev,
2358                                                        endp, usb_addr,
2359                                                        usb_endp);
2360                                        if (retval)
2361                                                usb_hcd_unlink_urb_from_ep(
2362                                                                hcd, urb);
2363                                }
2364                                spin_unlock_irqrestore(&endp->queue_lock.slock,
2365                                        irqs);
2366                                if (retval) {
2367                                        return retval;
2368                                } else {
2369                                        u132_endp_queue_work(u132, endp, 0);
2370                                        return 0;
2371                                }
2372                        } else if (u132->num_endpoints == MAX_U132_ENDPS) {
2373                                return -EINVAL;
2374                        } else
2375                                return create_endpoint_and_queue_control(u132,
2376                                        urb, usb_dev, usb_addr, usb_endp,
2377                                        mem_flags);
2378                }
2379        }
2380}
2381
2382static int dequeue_from_overflow_chain(struct u132 *u132,
2383        struct u132_endp *endp, struct urb *urb)
2384{
2385        struct u132_urbq *urbq;
2386
2387        list_for_each_entry(urbq, &endp->urb_more, urb_more) {
2388                if (urbq->urb == urb) {
2389                        struct usb_hcd *hcd = u132_to_hcd(u132);
2390                        list_del(&urbq->urb_more);
2391                        endp->queue_size -= 1;
2392                        urb->error_count = 0;
2393                        usb_hcd_giveback_urb(hcd, urb, 0);
2394                        return 0;
2395                }
2396        }
2397        dev_err(&u132->platform_dev->dev, "urb=%p not found in endp[%d]=%p ring"
2398                "[%d] %c%c usb_endp=%d usb_addr=%d size=%d next=%04X last=%04X"
2399                "\n", urb, endp->endp_number, endp, endp->ring->number,
2400                endp->input ? 'I' : ' ', endp->output ? 'O' : ' ',
2401                endp->usb_endp, endp->usb_addr, endp->queue_size,
2402                endp->queue_next, endp->queue_last);
2403        return -EINVAL;
2404}
2405
2406static int u132_endp_urb_dequeue(struct u132 *u132, struct u132_endp *endp,
2407                struct urb *urb, int status)
2408{
2409        unsigned long irqs;
2410        int rc;
2411
2412        spin_lock_irqsave(&endp->queue_lock.slock, irqs);
2413        rc = usb_hcd_check_unlink_urb(u132_to_hcd(u132), urb, status);
2414        if (rc) {
2415                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2416                return rc;
2417        }
2418        if (endp->queue_size == 0) {
2419                dev_err(&u132->platform_dev->dev, "urb=%p not found in endp[%d]"
2420                        "=%p ring[%d] %c%c usb_endp=%d usb_addr=%d\n", urb,
2421                        endp->endp_number, endp, endp->ring->number,
2422                        endp->input ? 'I' : ' ', endp->output ? 'O' : ' ',
2423                        endp->usb_endp, endp->usb_addr);
2424                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2425                return -EINVAL;
2426        }
2427        if (urb == endp->urb_list[ENDP_QUEUE_MASK & endp->queue_next]) {
2428                if (endp->active) {
2429                        endp->dequeueing = 1;
2430                        endp->edset_flush = 1;
2431                        u132_endp_queue_work(u132, endp, 0);
2432                        spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2433                        return 0;
2434                } else {
2435                        spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2436                        u132_hcd_abandon_urb(u132, endp, urb, status);
2437                        return 0;
2438                }
2439        } else {
2440                u16 queue_list = 0;
2441                u16 queue_size = endp->queue_size;
2442                u16 queue_scan = endp->queue_next;
2443                struct urb **urb_slot = NULL;
2444                while (++queue_list < ENDP_QUEUE_SIZE && --queue_size > 0) {
2445                        if (urb == endp->urb_list[ENDP_QUEUE_MASK &
2446                                ++queue_scan]) {
2447                                urb_slot = &endp->urb_list[ENDP_QUEUE_MASK &
2448                                        queue_scan];
2449                                break;
2450                        }
2451                }
2452                while (++queue_list < ENDP_QUEUE_SIZE && --queue_size > 0) {
2453                        *urb_slot = endp->urb_list[ENDP_QUEUE_MASK &
2454                                ++queue_scan];
2455                        urb_slot = &endp->urb_list[ENDP_QUEUE_MASK &
2456                                queue_scan];
2457                }
2458                if (urb_slot) {
2459                        struct usb_hcd *hcd = u132_to_hcd(u132);
2460
2461                        usb_hcd_unlink_urb_from_ep(hcd, urb);
2462                        endp->queue_size -= 1;
2463                        if (list_empty(&endp->urb_more)) {
2464                                spin_unlock_irqrestore(&endp->queue_lock.slock,
2465                                        irqs);
2466                        } else {
2467                                struct list_head *next = endp->urb_more.next;
2468                                struct u132_urbq *urbq = list_entry(next,
2469                                        struct u132_urbq, urb_more);
2470                                list_del(next);
2471                                *urb_slot = urbq->urb;
2472                                spin_unlock_irqrestore(&endp->queue_lock.slock,
2473                                        irqs);
2474                                kfree(urbq);
2475                        }
2476                        urb->error_count = 0;
2477                        usb_hcd_giveback_urb(hcd, urb, status);
2478                        return 0;
2479                } else if (list_empty(&endp->urb_more)) {
2480                        dev_err(&u132->platform_dev->dev, "urb=%p not found in "
2481                                "endp[%d]=%p ring[%d] %c%c usb_endp=%d usb_addr"
2482                                "=%d size=%d next=%04X last=%04X\n", urb,
2483                                endp->endp_number, endp, endp->ring->number,
2484                                endp->input ? 'I' : ' ',
2485                                endp->output ? 'O' : ' ', endp->usb_endp,
2486                                endp->usb_addr, endp->queue_size,
2487                                endp->queue_next, endp->queue_last);
2488                        spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2489                        return -EINVAL;
2490                } else {
2491                        int retval;
2492
2493                        usb_hcd_unlink_urb_from_ep(u132_to_hcd(u132), urb);
2494                        retval = dequeue_from_overflow_chain(u132, endp,
2495                                urb);
2496                        spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);
2497                        return retval;
2498                }
2499        }
2500}
2501
2502static int u132_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
2503{
2504        struct u132 *u132 = hcd_to_u132(hcd);
2505        if (u132->going > 2) {
2506                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2507                        , u132->going);
2508                return -ENODEV;
2509        } else {
2510                u8 usb_addr = usb_pipedevice(urb->pipe);
2511                u8 usb_endp = usb_pipeendpoint(urb->pipe);
2512                u8 address = u132->addr[usb_addr].address;
2513                struct u132_udev *udev = &u132->udev[address];
2514                if (usb_pipein(urb->pipe)) {
2515                        u8 endp_number = udev->endp_number_in[usb_endp];
2516                        struct u132_endp *endp = u132->endp[endp_number - 1];
2517                        return u132_endp_urb_dequeue(u132, endp, urb, status);
2518                } else {
2519                        u8 endp_number = udev->endp_number_out[usb_endp];
2520                        struct u132_endp *endp = u132->endp[endp_number - 1];
2521                        return u132_endp_urb_dequeue(u132, endp, urb, status);
2522                }
2523        }
2524}
2525
2526static void u132_endpoint_disable(struct usb_hcd *hcd,
2527        struct usb_host_endpoint *hep)
2528{
2529        struct u132 *u132 = hcd_to_u132(hcd);
2530        if (u132->going > 2) {
2531                dev_err(&u132->platform_dev->dev, "u132 device %p(hcd=%p hep=%p"
2532                        ") has been removed %d\n", u132, hcd, hep,
2533                        u132->going);
2534        } else {
2535                struct u132_endp *endp = hep->hcpriv;
2536                if (endp)
2537                        u132_endp_put_kref(u132, endp);
2538        }
2539}
2540
2541static int u132_get_frame(struct usb_hcd *hcd)
2542{
2543        struct u132 *u132 = hcd_to_u132(hcd);
2544        if (u132->going > 1) {
2545                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2546                        , u132->going);
2547                return -ENODEV;
2548        } else if (u132->going > 0) {
2549                dev_err(&u132->platform_dev->dev, "device is being removed\n");
2550                return -ESHUTDOWN;
2551        } else {
2552                dev_err(&u132->platform_dev->dev, "TODO: u132_get_frame\n");
2553                mdelay(100);
2554                return 0;
2555        }
2556}
2557
2558static int u132_roothub_descriptor(struct u132 *u132,
2559        struct usb_hub_descriptor *desc)
2560{
2561        int retval;
2562        u16 temp;
2563        u32 rh_a = -1;
2564        u32 rh_b = -1;
2565        retval = u132_read_pcimem(u132, roothub.a, &rh_a);
2566        if (retval)
2567                return retval;
2568        desc->bDescriptorType = USB_DT_HUB;
2569        desc->bPwrOn2PwrGood = (rh_a & RH_A_POTPGT) >> 24;
2570        desc->bHubContrCurrent = 0;
2571        desc->bNbrPorts = u132->num_ports;
2572        temp = 1 + (u132->num_ports / 8);
2573        desc->bDescLength = 7 + 2 * temp;
2574        temp = HUB_CHAR_COMMON_LPSM | HUB_CHAR_COMMON_OCPM;
2575        if (rh_a & RH_A_NPS)
2576                temp |= HUB_CHAR_NO_LPSM;
2577        if (rh_a & RH_A_PSM)
2578                temp |= HUB_CHAR_INDV_PORT_LPSM;
2579        if (rh_a & RH_A_NOCP)
2580                temp |= HUB_CHAR_NO_OCPM;
2581        else if (rh_a & RH_A_OCPM)
2582                temp |= HUB_CHAR_INDV_PORT_OCPM;
2583        desc->wHubCharacteristics = cpu_to_le16(temp);
2584        retval = u132_read_pcimem(u132, roothub.b, &rh_b);
2585        if (retval)
2586                return retval;
2587        memset(desc->u.hs.DeviceRemovable, 0xff,
2588                        sizeof(desc->u.hs.DeviceRemovable));
2589        desc->u.hs.DeviceRemovable[0] = rh_b & RH_B_DR;
2590        if (u132->num_ports > 7) {
2591                desc->u.hs.DeviceRemovable[1] = (rh_b & RH_B_DR) >> 8;
2592                desc->u.hs.DeviceRemovable[2] = 0xff;
2593        } else
2594                desc->u.hs.DeviceRemovable[1] = 0xff;
2595        return 0;
2596}
2597
2598static int u132_roothub_status(struct u132 *u132, __le32 *desc)
2599{
2600        u32 rh_status = -1;
2601        int ret_status = u132_read_pcimem(u132, roothub.status, &rh_status);
2602        *desc = cpu_to_le32(rh_status);
2603        return ret_status;
2604}
2605
2606static int u132_roothub_portstatus(struct u132 *u132, __le32 *desc, u16 wIndex)
2607{
2608        if (wIndex == 0 || wIndex > u132->num_ports) {
2609                return -EINVAL;
2610        } else {
2611                int port = wIndex - 1;
2612                u32 rh_portstatus = -1;
2613                int ret_portstatus = u132_read_pcimem(u132,
2614                        roothub.portstatus[port], &rh_portstatus);
2615                *desc = cpu_to_le32(rh_portstatus);
2616                if (*(u16 *) (desc + 2)) {
2617                        dev_info(&u132->platform_dev->dev, "Port %d Status Chan"
2618                                "ge = %08X\n", port, *desc);
2619                }
2620                return ret_portstatus;
2621        }
2622}
2623
2624
2625/* this timer value might be vendor-specific ... */
2626#define PORT_RESET_HW_MSEC 10
2627#define PORT_RESET_MSEC 10
2628/* wrap-aware logic morphed from <linux/jiffies.h> */
2629#define tick_before(t1, t2) ((s16)(((s16)(t1))-((s16)(t2))) < 0)
2630static int u132_roothub_portreset(struct u132 *u132, int port_index)
2631{
2632        int retval;
2633        u32 fmnumber;
2634        u16 now;
2635        u16 reset_done;
2636        retval = u132_read_pcimem(u132, fmnumber, &fmnumber);
2637        if (retval)
2638                return retval;
2639        now = fmnumber;
2640        reset_done = now + PORT_RESET_MSEC;
2641        do {
2642                u32 portstat;
2643                do {
2644                        retval = u132_read_pcimem(u132,
2645                                roothub.portstatus[port_index], &portstat);
2646                        if (retval)
2647                                return retval;
2648                        if (RH_PS_PRS & portstat)
2649                                continue;
2650                        else
2651                                break;
2652                } while (tick_before(now, reset_done));
2653                if (RH_PS_PRS & portstat)
2654                        return -ENODEV;
2655                if (RH_PS_CCS & portstat) {
2656                        if (RH_PS_PRSC & portstat) {
2657                                retval = u132_write_pcimem(u132,
2658                                        roothub.portstatus[port_index],
2659                                        RH_PS_PRSC);
2660                                if (retval)
2661                                        return retval;
2662                        }
2663                } else
2664                        break;  /* start the next reset,
2665                                sleep till it's probably done */
2666                retval = u132_write_pcimem(u132, roothub.portstatus[port_index],
2667                         RH_PS_PRS);
2668                if (retval)
2669                        return retval;
2670                msleep(PORT_RESET_HW_MSEC);
2671                retval = u132_read_pcimem(u132, fmnumber, &fmnumber);
2672                if (retval)
2673                        return retval;
2674                now = fmnumber;
2675        } while (tick_before(now, reset_done));
2676        return 0;
2677}
2678
2679static int u132_roothub_setportfeature(struct u132 *u132, u16 wValue,
2680        u16 wIndex)
2681{
2682        if (wIndex == 0 || wIndex > u132->num_ports) {
2683                return -EINVAL;
2684        } else {
2685                int port_index = wIndex - 1;
2686                struct u132_port *port = &u132->port[port_index];
2687                port->Status &= ~(1 << wValue);
2688                switch (wValue) {
2689                case USB_PORT_FEAT_SUSPEND:
2690                        return u132_write_pcimem(u132,
2691                               roothub.portstatus[port_index], RH_PS_PSS);
2692                case USB_PORT_FEAT_POWER:
2693                        return u132_write_pcimem(u132,
2694                               roothub.portstatus[port_index], RH_PS_PPS);
2695                case USB_PORT_FEAT_RESET:
2696                        return u132_roothub_portreset(u132, port_index);
2697                default:
2698                        return -EPIPE;
2699                }
2700        }
2701}
2702
2703static int u132_roothub_clearportfeature(struct u132 *u132, u16 wValue,
2704        u16 wIndex)
2705{
2706        if (wIndex == 0 || wIndex > u132->num_ports) {
2707                return -EINVAL;
2708        } else {
2709                int port_index = wIndex - 1;
2710                u32 temp;
2711                struct u132_port *port = &u132->port[port_index];
2712                port->Status &= ~(1 << wValue);
2713                switch (wValue) {
2714                case USB_PORT_FEAT_ENABLE:
2715                        temp = RH_PS_CCS;
2716                        break;
2717                case USB_PORT_FEAT_C_ENABLE:
2718                        temp = RH_PS_PESC;
2719                        break;
2720                case USB_PORT_FEAT_SUSPEND:
2721                        temp = RH_PS_POCI;
2722                        if ((u132->hc_control & OHCI_CTRL_HCFS)
2723                                != OHCI_USB_OPER) {
2724                                dev_err(&u132->platform_dev->dev, "TODO resume_"
2725                                        "root_hub\n");
2726                        }
2727                        break;
2728                case USB_PORT_FEAT_C_SUSPEND:
2729                        temp = RH_PS_PSSC;
2730                        break;
2731                case USB_PORT_FEAT_POWER:
2732                        temp = RH_PS_LSDA;
2733                        break;
2734                case USB_PORT_FEAT_C_CONNECTION:
2735                        temp = RH_PS_CSC;
2736                        break;
2737                case USB_PORT_FEAT_C_OVER_CURRENT:
2738                        temp = RH_PS_OCIC;
2739                        break;
2740                case USB_PORT_FEAT_C_RESET:
2741                        temp = RH_PS_PRSC;
2742                        break;
2743                default:
2744                        return -EPIPE;
2745                }
2746                return u132_write_pcimem(u132, roothub.portstatus[port_index],
2747                       temp);
2748        }
2749}
2750
2751
2752/* the virtual root hub timer IRQ checks for hub status*/
2753static int u132_hub_status_data(struct usb_hcd *hcd, char *buf)
2754{
2755        struct u132 *u132 = hcd_to_u132(hcd);
2756        if (u132->going > 1) {
2757                dev_err(&u132->platform_dev->dev, "device hcd=%p has been remov"
2758                        "ed %d\n", hcd, u132->going);
2759                return -ENODEV;
2760        } else if (u132->going > 0) {
2761                dev_err(&u132->platform_dev->dev, "device hcd=%p is being remov"
2762                        "ed\n", hcd);
2763                return -ESHUTDOWN;
2764        } else {
2765                int i, changed = 0, length = 1;
2766                if (u132->flags & OHCI_QUIRK_AMD756) {
2767                        if ((u132->hc_roothub_a & RH_A_NDP) > MAX_ROOT_PORTS) {
2768                                dev_err(&u132->platform_dev->dev, "bogus NDP, r"
2769                                        "ereads as NDP=%d\n",
2770                                        u132->hc_roothub_a & RH_A_NDP);
2771                                goto done;
2772                        }
2773                }
2774                if (u132->hc_roothub_status & (RH_HS_LPSC | RH_HS_OCIC))
2775                        buf[0] = changed = 1;
2776                else
2777                        buf[0] = 0;
2778                if (u132->num_ports > 7) {
2779                        buf[1] = 0;
2780                        length++;
2781                }
2782                for (i = 0; i < u132->num_ports; i++) {
2783                        if (u132->hc_roothub_portstatus[i] & (RH_PS_CSC |
2784                                RH_PS_PESC | RH_PS_PSSC | RH_PS_OCIC |
2785                                RH_PS_PRSC)) {
2786                                changed = 1;
2787                                if (i < 7)
2788                                        buf[0] |= 1 << (i + 1);
2789                                else
2790                                        buf[1] |= 1 << (i - 7);
2791                                continue;
2792                        }
2793                        if (!(u132->hc_roothub_portstatus[i] & RH_PS_CCS))
2794                                continue;
2795
2796                        if ((u132->hc_roothub_portstatus[i] & RH_PS_PSS))
2797                                continue;
2798                }
2799done:
2800                return changed ? length : 0;
2801        }
2802}
2803
2804static int u132_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
2805        u16 wIndex, char *buf, u16 wLength)
2806{
2807        struct u132 *u132 = hcd_to_u132(hcd);
2808        if (u132->going > 1) {
2809                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2810                        , u132->going);
2811                return -ENODEV;
2812        } else if (u132->going > 0) {
2813                dev_err(&u132->platform_dev->dev, "device is being removed\n");
2814                return -ESHUTDOWN;
2815        } else {
2816                int retval = 0;
2817                mutex_lock(&u132->sw_lock);
2818                switch (typeReq) {
2819                case ClearHubFeature:
2820                        switch (wValue) {
2821                        case C_HUB_OVER_CURRENT:
2822                        case C_HUB_LOCAL_POWER:
2823                                break;
2824                        default:
2825                                goto stall;
2826                        }
2827                        break;
2828                case SetHubFeature:
2829                        switch (wValue) {
2830                        case C_HUB_OVER_CURRENT:
2831                        case C_HUB_LOCAL_POWER:
2832                                break;
2833                        default:
2834                                goto stall;
2835                        }
2836                        break;
2837                case ClearPortFeature:{
2838                                retval = u132_roothub_clearportfeature(u132,
2839                                        wValue, wIndex);
2840                                if (retval)
2841                                        goto error;
2842                                break;
2843                        }
2844                case GetHubDescriptor:{
2845                                retval = u132_roothub_descriptor(u132,
2846                                        (struct usb_hub_descriptor *)buf);
2847                                if (retval)
2848                                        goto error;
2849                                break;
2850                        }
2851                case GetHubStatus:{
2852                                retval = u132_roothub_status(u132,
2853                                        (__le32 *) buf);
2854                                if (retval)
2855                                        goto error;
2856                                break;
2857                        }
2858                case GetPortStatus:{
2859                                retval = u132_roothub_portstatus(u132,
2860                                        (__le32 *) buf, wIndex);
2861                                if (retval)
2862                                        goto error;
2863                                break;
2864                        }
2865                case SetPortFeature:{
2866                                retval = u132_roothub_setportfeature(u132,
2867                                        wValue, wIndex);
2868                                if (retval)
2869                                        goto error;
2870                                break;
2871                        }
2872                default:
2873                        goto stall;
2874                error:
2875                        u132_disable(u132);
2876                        u132->going = 1;
2877                        break;
2878                stall:
2879                        retval = -EPIPE;
2880                        break;
2881                }
2882                mutex_unlock(&u132->sw_lock);
2883                return retval;
2884        }
2885}
2886
2887static int u132_start_port_reset(struct usb_hcd *hcd, unsigned port_num)
2888{
2889        struct u132 *u132 = hcd_to_u132(hcd);
2890        if (u132->going > 1) {
2891                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2892                        , u132->going);
2893                return -ENODEV;
2894        } else if (u132->going > 0) {
2895                dev_err(&u132->platform_dev->dev, "device is being removed\n");
2896                return -ESHUTDOWN;
2897        } else
2898                return 0;
2899}
2900
2901
2902#ifdef CONFIG_PM
2903static int u132_bus_suspend(struct usb_hcd *hcd)
2904{
2905        struct u132 *u132 = hcd_to_u132(hcd);
2906        if (u132->going > 1) {
2907                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2908                        , u132->going);
2909                return -ENODEV;
2910        } else if (u132->going > 0) {
2911                dev_err(&u132->platform_dev->dev, "device is being removed\n");
2912                return -ESHUTDOWN;
2913        } else
2914                return 0;
2915}
2916
2917static int u132_bus_resume(struct usb_hcd *hcd)
2918{
2919        struct u132 *u132 = hcd_to_u132(hcd);
2920        if (u132->going > 1) {
2921                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
2922                        , u132->going);
2923                return -ENODEV;
2924        } else if (u132->going > 0) {
2925                dev_err(&u132->platform_dev->dev, "device is being removed\n");
2926                return -ESHUTDOWN;
2927        } else
2928                return 0;
2929}
2930
2931#else
2932#define u132_bus_suspend NULL
2933#define u132_bus_resume NULL
2934#endif
2935static const struct hc_driver u132_hc_driver = {
2936        .description = hcd_name,
2937        .hcd_priv_size = sizeof(struct u132),
2938        .irq = NULL,
2939        .flags = HCD_USB11 | HCD_MEMORY,
2940        .reset = u132_hcd_reset,
2941        .start = u132_hcd_start,
2942        .stop = u132_hcd_stop,
2943        .urb_enqueue = u132_urb_enqueue,
2944        .urb_dequeue = u132_urb_dequeue,
2945        .endpoint_disable = u132_endpoint_disable,
2946        .get_frame_number = u132_get_frame,
2947        .hub_status_data = u132_hub_status_data,
2948        .hub_control = u132_hub_control,
2949        .bus_suspend = u132_bus_suspend,
2950        .bus_resume = u132_bus_resume,
2951        .start_port_reset = u132_start_port_reset,
2952};
2953
2954/*
2955* This function may be called by the USB core whilst the "usb_all_devices_rwsem"
2956* is held for writing, thus this module must not call usb_remove_hcd()
2957* synchronously - but instead should immediately stop activity to the
2958* device and asynchronously call usb_remove_hcd()
2959*/
2960static int u132_remove(struct platform_device *pdev)
2961{
2962        struct usb_hcd *hcd = platform_get_drvdata(pdev);
2963        if (hcd) {
2964                struct u132 *u132 = hcd_to_u132(hcd);
2965                if (u132->going++ > 1) {
2966                        dev_err(&u132->platform_dev->dev, "already being remove"
2967                                "d\n");
2968                        return -ENODEV;
2969                } else {
2970                        int rings = MAX_U132_RINGS;
2971                        int endps = MAX_U132_ENDPS;
2972                        dev_err(&u132->platform_dev->dev, "removing device u132"
2973                                ".%d\n", u132->sequence_num);
2974                        msleep(100);
2975                        mutex_lock(&u132->sw_lock);
2976                        u132_monitor_cancel_work(u132);
2977                        while (rings-- > 0) {
2978                                struct u132_ring *ring = &u132->ring[rings];
2979                                u132_ring_cancel_work(u132, ring);
2980                        }
2981                        while (endps-- > 0) {
2982                                struct u132_endp *endp = u132->endp[endps];
2983                                if (endp)
2984                                        u132_endp_cancel_work(u132, endp);
2985                        }
2986                        u132->going += 1;
2987                        printk(KERN_INFO "removing device u132.%d\n",
2988                                u132->sequence_num);
2989                        mutex_unlock(&u132->sw_lock);
2990                        usb_remove_hcd(hcd);
2991                        u132_u132_put_kref(u132);
2992                        return 0;
2993                }
2994        } else
2995                return 0;
2996}
2997
2998static void u132_initialise(struct u132 *u132, struct platform_device *pdev)
2999{
3000        int rings = MAX_U132_RINGS;
3001        int ports = MAX_U132_PORTS;
3002        int addrs = MAX_U132_ADDRS;
3003        int udevs = MAX_U132_UDEVS;
3004        int endps = MAX_U132_ENDPS;
3005        u132->board = dev_get_platdata(&pdev->dev);
3006        u132->platform_dev = pdev;
3007        u132->power = 0;
3008        u132->reset = 0;
3009        mutex_init(&u132->sw_lock);
3010        mutex_init(&u132->scheduler_lock);
3011        while (rings-- > 0) {
3012                struct u132_ring *ring = &u132->ring[rings];
3013                ring->u132 = u132;
3014                ring->number = rings + 1;
3015                ring->length = 0;
3016                ring->curr_endp = NULL;
3017                INIT_DELAYED_WORK(&ring->scheduler,
3018                                  u132_hcd_ring_work_scheduler);
3019        }
3020        mutex_lock(&u132->sw_lock);
3021        INIT_DELAYED_WORK(&u132->monitor, u132_hcd_monitor_work);
3022        while (ports-- > 0) {
3023                struct u132_port *port = &u132->port[ports];
3024                port->u132 = u132;
3025                port->reset = 0;
3026                port->enable = 0;
3027                port->power = 0;
3028                port->Status = 0;
3029        }
3030        while (addrs-- > 0) {
3031                struct u132_addr *addr = &u132->addr[addrs];
3032                addr->address = 0;
3033        }
3034        while (udevs-- > 0) {
3035                struct u132_udev *udev = &u132->udev[udevs];
3036                int i = ARRAY_SIZE(udev->endp_number_in);
3037                int o = ARRAY_SIZE(udev->endp_number_out);
3038                udev->usb_device = NULL;
3039                udev->udev_number = 0;
3040                udev->usb_addr = 0;
3041                udev->portnumber = 0;
3042                while (i-- > 0)
3043                        udev->endp_number_in[i] = 0;
3044
3045                while (o-- > 0)
3046                        udev->endp_number_out[o] = 0;
3047
3048        }
3049        while (endps-- > 0)
3050                u132->endp[endps] = NULL;
3051
3052        mutex_unlock(&u132->sw_lock);
3053}
3054
3055static int u132_probe(struct platform_device *pdev)
3056{
3057        struct usb_hcd *hcd;
3058        int retval;
3059        u32 control;
3060        u32 rh_a = -1;
3061
3062        msleep(100);
3063        if (u132_exiting > 0)
3064                return -ENODEV;
3065
3066        retval = ftdi_write_pcimem(pdev, intrdisable, OHCI_INTR_MIE);
3067        if (retval)
3068                return retval;
3069        retval = ftdi_read_pcimem(pdev, control, &control);
3070        if (retval)
3071                return retval;
3072        retval = ftdi_read_pcimem(pdev, roothub.a, &rh_a);
3073        if (retval)
3074                return retval;
3075
3076        hcd = usb_create_hcd(&u132_hc_driver, &pdev->dev, dev_name(&pdev->dev));
3077        if (!hcd) {
3078                printk(KERN_ERR "failed to create the usb hcd struct for U132\n"
3079                        );
3080                ftdi_elan_gone_away(pdev);
3081                return -ENOMEM;
3082        } else {
3083                struct u132 *u132 = hcd_to_u132(hcd);
3084                retval = 0;
3085                hcd->rsrc_start = 0;
3086                mutex_lock(&u132_module_lock);
3087                u132->sequence_num = ++u132_instances;
3088                mutex_unlock(&u132_module_lock);
3089                u132_u132_init_kref(u132);
3090                u132_initialise(u132, pdev);
3091                hcd->product_desc = "ELAN U132 Host Controller";
3092                retval = usb_add_hcd(hcd, 0, 0);
3093                if (retval != 0) {
3094                        dev_err(&u132->platform_dev->dev, "init error %d\n",
3095                                retval);
3096                        u132_u132_put_kref(u132);
3097                        return retval;
3098                } else {
3099                        device_wakeup_enable(hcd->self.controller);
3100                        u132_monitor_queue_work(u132, 100);
3101                        return 0;
3102                }
3103        }
3104}
3105
3106
3107#ifdef CONFIG_PM
3108/*
3109 * for this device there's no useful distinction between the controller
3110 * and its root hub.
3111 */
3112static int u132_suspend(struct platform_device *pdev, pm_message_t state)
3113{
3114        struct usb_hcd *hcd = platform_get_drvdata(pdev);
3115        struct u132 *u132 = hcd_to_u132(hcd);
3116        if (u132->going > 1) {
3117                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
3118                        , u132->going);
3119                return -ENODEV;
3120        } else if (u132->going > 0) {
3121                dev_err(&u132->platform_dev->dev, "device is being removed\n");
3122                return -ESHUTDOWN;
3123        } else {
3124                int retval = 0, ports;
3125
3126                switch (state.event) {
3127                case PM_EVENT_FREEZE:
3128                        retval = u132_bus_suspend(hcd);
3129                        break;
3130                case PM_EVENT_SUSPEND:
3131                case PM_EVENT_HIBERNATE:
3132                        ports = MAX_U132_PORTS;
3133                        while (ports-- > 0) {
3134                                port_power(u132, ports, 0);
3135                        }
3136                        break;
3137                }
3138                return retval;
3139        }
3140}
3141
3142static int u132_resume(struct platform_device *pdev)
3143{
3144        struct usb_hcd *hcd = platform_get_drvdata(pdev);
3145        struct u132 *u132 = hcd_to_u132(hcd);
3146        if (u132->going > 1) {
3147                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"
3148                        , u132->going);
3149                return -ENODEV;
3150        } else if (u132->going > 0) {
3151                dev_err(&u132->platform_dev->dev, "device is being removed\n");
3152                return -ESHUTDOWN;
3153        } else {
3154                int retval = 0;
3155                if (!u132->port[0].power) {
3156                        int ports = MAX_U132_PORTS;
3157                        while (ports-- > 0) {
3158                                port_power(u132, ports, 1);
3159                        }
3160                        retval = 0;
3161                } else {
3162                        retval = u132_bus_resume(hcd);
3163                }
3164                return retval;
3165        }
3166}
3167
3168#else
3169#define u132_suspend NULL
3170#define u132_resume NULL
3171#endif
3172/*
3173* this driver is loaded explicitly by ftdi_u132
3174*
3175* the platform_driver struct is static because it is per type of module
3176*/
3177static struct platform_driver u132_platform_driver = {
3178        .probe = u132_probe,
3179        .remove = u132_remove,
3180        .suspend = u132_suspend,
3181        .resume = u132_resume,
3182        .driver = {
3183                   .name = hcd_name,
3184                   },
3185};
3186static int __init u132_hcd_init(void)
3187{
3188        int retval;
3189        u132_instances = 0;
3190        u132_exiting = 0;
3191        if (usb_disabled())
3192                return -ENODEV;
3193        printk(KERN_INFO "driver %s\n", hcd_name);
3194        workqueue = create_singlethread_workqueue("u132");
3195        if (!workqueue)
3196                return -ENOMEM;
3197        retval = platform_driver_register(&u132_platform_driver);
3198        if (retval)
3199                destroy_workqueue(workqueue);
3200
3201        return retval;
3202}
3203
3204
3205module_init(u132_hcd_init);
3206static void __exit u132_hcd_exit(void)
3207{
3208        mutex_lock(&u132_module_lock);
3209        u132_exiting += 1;
3210        mutex_unlock(&u132_module_lock);
3211        platform_driver_unregister(&u132_platform_driver);
3212        printk(KERN_INFO "u132-hcd driver deregistered\n");
3213        wait_event(u132_hcd_wait, u132_instances == 0);
3214        destroy_workqueue(workqueue);
3215}
3216
3217
3218module_exit(u132_hcd_exit);
3219MODULE_LICENSE("GPL");
3220MODULE_ALIAS("platform:u132_hcd");
3221