linux/drivers/usb/gadget/dummy_hcd.c
<<
>>
Prefs
   1/*
   2 * dummy_hcd.c -- Dummy/Loopback USB host and device emulator driver.
   3 *
   4 * Maintainer: Alan Stern <stern@rowland.harvard.edu>
   5 *
   6 * Copyright (C) 2003 David Brownell
   7 * Copyright (C) 2003-2005 Alan Stern
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License as published by
  11 * the Free Software Foundation; either version 2 of the License, or
  12 * (at your option) any later version.
  13 */
  14
  15
  16/*
  17 * This exposes a device side "USB gadget" API, driven by requests to a
  18 * Linux-USB host controller driver.  USB traffic is simulated; there's
  19 * no need for USB hardware.  Use this with two other drivers:
  20 *
  21 *  - Gadget driver, responding to requests (slave);
  22 *  - Host-side device driver, as already familiar in Linux.
  23 *
  24 * Having this all in one kernel can help some stages of development,
  25 * bypassing some hardware (and driver) issues.  UML could help too.
  26 */
  27
  28#include <linux/module.h>
  29#include <linux/kernel.h>
  30#include <linux/delay.h>
  31#include <linux/ioport.h>
  32#include <linux/slab.h>
  33#include <linux/errno.h>
  34#include <linux/init.h>
  35#include <linux/timer.h>
  36#include <linux/list.h>
  37#include <linux/interrupt.h>
  38#include <linux/platform_device.h>
  39#include <linux/usb.h>
  40#include <linux/usb/gadget.h>
  41#include <linux/usb/hcd.h>
  42#include <linux/scatterlist.h>
  43
  44#include <asm/byteorder.h>
  45#include <linux/io.h>
  46#include <asm/irq.h>
  47#include <asm/unaligned.h>
  48
  49#define DRIVER_DESC     "USB Host+Gadget Emulator"
  50#define DRIVER_VERSION  "02 May 2005"
  51
  52#define POWER_BUDGET    500     /* in mA; use 8 for low-power port testing */
  53
  54static const char       driver_name[] = "dummy_hcd";
  55static const char       driver_desc[] = "USB Host+Gadget Emulator";
  56
  57static const char       gadget_name[] = "dummy_udc";
  58
  59MODULE_DESCRIPTION(DRIVER_DESC);
  60MODULE_AUTHOR("David Brownell");
  61MODULE_LICENSE("GPL");
  62
  63struct dummy_hcd_module_parameters {
  64        bool is_super_speed;
  65        bool is_high_speed;
  66        unsigned int num;
  67};
  68
  69static struct dummy_hcd_module_parameters mod_data = {
  70        .is_super_speed = false,
  71        .is_high_speed = true,
  72        .num = 1,
  73};
  74module_param_named(is_super_speed, mod_data.is_super_speed, bool, S_IRUGO);
  75MODULE_PARM_DESC(is_super_speed, "true to simulate SuperSpeed connection");
  76module_param_named(is_high_speed, mod_data.is_high_speed, bool, S_IRUGO);
  77MODULE_PARM_DESC(is_high_speed, "true to simulate HighSpeed connection");
  78module_param_named(num, mod_data.num, uint, S_IRUGO);
  79MODULE_PARM_DESC(num, "number of emulated controllers");
  80/*-------------------------------------------------------------------------*/
  81
  82/* gadget side driver data structres */
  83struct dummy_ep {
  84        struct list_head                queue;
  85        unsigned long                   last_io;        /* jiffies timestamp */
  86        struct usb_gadget               *gadget;
  87        const struct usb_endpoint_descriptor *desc;
  88        struct usb_ep                   ep;
  89        unsigned                        halted:1;
  90        unsigned                        wedged:1;
  91        unsigned                        already_seen:1;
  92        unsigned                        setup_stage:1;
  93        unsigned                        stream_en:1;
  94};
  95
  96struct dummy_request {
  97        struct list_head                queue;          /* ep's requests */
  98        struct usb_request              req;
  99};
 100
 101static inline struct dummy_ep *usb_ep_to_dummy_ep(struct usb_ep *_ep)
 102{
 103        return container_of(_ep, struct dummy_ep, ep);
 104}
 105
 106static inline struct dummy_request *usb_request_to_dummy_request
 107                (struct usb_request *_req)
 108{
 109        return container_of(_req, struct dummy_request, req);
 110}
 111
 112/*-------------------------------------------------------------------------*/
 113
 114/*
 115 * Every device has ep0 for control requests, plus up to 30 more endpoints,
 116 * in one of two types:
 117 *
 118 *   - Configurable:  direction (in/out), type (bulk, iso, etc), and endpoint
 119 *     number can be changed.  Names like "ep-a" are used for this type.
 120 *
 121 *   - Fixed Function:  in other cases.  some characteristics may be mutable;
 122 *     that'd be hardware-specific.  Names like "ep12out-bulk" are used.
 123 *
 124 * Gadget drivers are responsible for not setting up conflicting endpoint
 125 * configurations, illegal or unsupported packet lengths, and so on.
 126 */
 127
 128static const char ep0name[] = "ep0";
 129
 130static const char *const ep_name[] = {
 131        ep0name,                                /* everyone has ep0 */
 132
 133        /* act like a pxa250: fifteen fixed function endpoints */
 134        "ep1in-bulk", "ep2out-bulk", "ep3in-iso", "ep4out-iso", "ep5in-int",
 135        "ep6in-bulk", "ep7out-bulk", "ep8in-iso", "ep9out-iso", "ep10in-int",
 136        "ep11in-bulk", "ep12out-bulk", "ep13in-iso", "ep14out-iso",
 137                "ep15in-int",
 138
 139        /* or like sa1100: two fixed function endpoints */
 140        "ep1out-bulk", "ep2in-bulk",
 141
 142        /* and now some generic EPs so we have enough in multi config */
 143        "ep3out", "ep4in", "ep5out", "ep6out", "ep7in", "ep8out", "ep9in",
 144        "ep10out", "ep11out", "ep12in", "ep13out", "ep14in", "ep15out",
 145};
 146#define DUMMY_ENDPOINTS ARRAY_SIZE(ep_name)
 147
 148/*-------------------------------------------------------------------------*/
 149
 150#define FIFO_SIZE               64
 151
 152struct urbp {
 153        struct urb              *urb;
 154        struct list_head        urbp_list;
 155        struct sg_mapping_iter  miter;
 156        u32                     miter_started;
 157};
 158
 159
 160enum dummy_rh_state {
 161        DUMMY_RH_RESET,
 162        DUMMY_RH_SUSPENDED,
 163        DUMMY_RH_RUNNING
 164};
 165
 166struct dummy_hcd {
 167        struct dummy                    *dum;
 168        enum dummy_rh_state             rh_state;
 169        struct timer_list               timer;
 170        u32                             port_status;
 171        u32                             old_status;
 172        unsigned long                   re_timeout;
 173
 174        struct usb_device               *udev;
 175        struct list_head                urbp_list;
 176        u32                             stream_en_ep;
 177        u8                              num_stream[30 / 2];
 178
 179        unsigned                        active:1;
 180        unsigned                        old_active:1;
 181        unsigned                        resuming:1;
 182};
 183
 184struct dummy {
 185        spinlock_t                      lock;
 186
 187        /*
 188         * SLAVE/GADGET side support
 189         */
 190        struct dummy_ep                 ep[DUMMY_ENDPOINTS];
 191        int                             address;
 192        struct usb_gadget               gadget;
 193        struct usb_gadget_driver        *driver;
 194        struct dummy_request            fifo_req;
 195        u8                              fifo_buf[FIFO_SIZE];
 196        u16                             devstatus;
 197        unsigned                        udc_suspended:1;
 198        unsigned                        pullup:1;
 199
 200        /*
 201         * MASTER/HOST side support
 202         */
 203        struct dummy_hcd                *hs_hcd;
 204        struct dummy_hcd                *ss_hcd;
 205};
 206
 207static inline struct dummy_hcd *hcd_to_dummy_hcd(struct usb_hcd *hcd)
 208{
 209        return (struct dummy_hcd *) (hcd->hcd_priv);
 210}
 211
 212static inline struct usb_hcd *dummy_hcd_to_hcd(struct dummy_hcd *dum)
 213{
 214        return container_of((void *) dum, struct usb_hcd, hcd_priv);
 215}
 216
 217static inline struct device *dummy_dev(struct dummy_hcd *dum)
 218{
 219        return dummy_hcd_to_hcd(dum)->self.controller;
 220}
 221
 222static inline struct device *udc_dev(struct dummy *dum)
 223{
 224        return dum->gadget.dev.parent;
 225}
 226
 227static inline struct dummy *ep_to_dummy(struct dummy_ep *ep)
 228{
 229        return container_of(ep->gadget, struct dummy, gadget);
 230}
 231
 232static inline struct dummy_hcd *gadget_to_dummy_hcd(struct usb_gadget *gadget)
 233{
 234        struct dummy *dum = container_of(gadget, struct dummy, gadget);
 235        if (dum->gadget.speed == USB_SPEED_SUPER)
 236                return dum->ss_hcd;
 237        else
 238                return dum->hs_hcd;
 239}
 240
 241static inline struct dummy *gadget_dev_to_dummy(struct device *dev)
 242{
 243        return container_of(dev, struct dummy, gadget.dev);
 244}
 245
 246/*-------------------------------------------------------------------------*/
 247
 248/* SLAVE/GADGET SIDE UTILITY ROUTINES */
 249
 250/* called with spinlock held */
 251static void nuke(struct dummy *dum, struct dummy_ep *ep)
 252{
 253        while (!list_empty(&ep->queue)) {
 254                struct dummy_request    *req;
 255
 256                req = list_entry(ep->queue.next, struct dummy_request, queue);
 257                list_del_init(&req->queue);
 258                req->req.status = -ESHUTDOWN;
 259
 260                spin_unlock(&dum->lock);
 261                req->req.complete(&ep->ep, &req->req);
 262                spin_lock(&dum->lock);
 263        }
 264}
 265
 266/* caller must hold lock */
 267static void stop_activity(struct dummy *dum)
 268{
 269        struct dummy_ep *ep;
 270
 271        /* prevent any more requests */
 272        dum->address = 0;
 273
 274        /* The timer is left running so that outstanding URBs can fail */
 275
 276        /* nuke any pending requests first, so driver i/o is quiesced */
 277        list_for_each_entry(ep, &dum->gadget.ep_list, ep.ep_list)
 278                nuke(dum, ep);
 279
 280        /* driver now does any non-usb quiescing necessary */
 281}
 282
 283/**
 284 * set_link_state_by_speed() - Sets the current state of the link according to
 285 *      the hcd speed
 286 * @dum_hcd: pointer to the dummy_hcd structure to update the link state for
 287 *
 288 * This function updates the port_status according to the link state and the
 289 * speed of the hcd.
 290 */
 291static void set_link_state_by_speed(struct dummy_hcd *dum_hcd)
 292{
 293        struct dummy *dum = dum_hcd->dum;
 294
 295        if (dummy_hcd_to_hcd(dum_hcd)->speed == HCD_USB3) {
 296                if ((dum_hcd->port_status & USB_SS_PORT_STAT_POWER) == 0) {
 297                        dum_hcd->port_status = 0;
 298                } else if (!dum->pullup || dum->udc_suspended) {
 299                        /* UDC suspend must cause a disconnect */
 300                        dum_hcd->port_status &= ~(USB_PORT_STAT_CONNECTION |
 301                                                USB_PORT_STAT_ENABLE);
 302                        if ((dum_hcd->old_status &
 303                             USB_PORT_STAT_CONNECTION) != 0)
 304                                dum_hcd->port_status |=
 305                                        (USB_PORT_STAT_C_CONNECTION << 16);
 306                } else {
 307                        /* device is connected and not suspended */
 308                        dum_hcd->port_status |= (USB_PORT_STAT_CONNECTION |
 309                                                 USB_PORT_STAT_SPEED_5GBPS) ;
 310                        if ((dum_hcd->old_status &
 311                             USB_PORT_STAT_CONNECTION) == 0)
 312                                dum_hcd->port_status |=
 313                                        (USB_PORT_STAT_C_CONNECTION << 16);
 314                        if ((dum_hcd->port_status &
 315                             USB_PORT_STAT_ENABLE) == 1 &&
 316                                (dum_hcd->port_status &
 317                                 USB_SS_PORT_LS_U0) == 1 &&
 318                                dum_hcd->rh_state != DUMMY_RH_SUSPENDED)
 319                                dum_hcd->active = 1;
 320                }
 321        } else {
 322                if ((dum_hcd->port_status & USB_PORT_STAT_POWER) == 0) {
 323                        dum_hcd->port_status = 0;
 324                } else if (!dum->pullup || dum->udc_suspended) {
 325                        /* UDC suspend must cause a disconnect */
 326                        dum_hcd->port_status &= ~(USB_PORT_STAT_CONNECTION |
 327                                                USB_PORT_STAT_ENABLE |
 328                                                USB_PORT_STAT_LOW_SPEED |
 329                                                USB_PORT_STAT_HIGH_SPEED |
 330                                                USB_PORT_STAT_SUSPEND);
 331                        if ((dum_hcd->old_status &
 332                             USB_PORT_STAT_CONNECTION) != 0)
 333                                dum_hcd->port_status |=
 334                                        (USB_PORT_STAT_C_CONNECTION << 16);
 335                } else {
 336                        dum_hcd->port_status |= USB_PORT_STAT_CONNECTION;
 337                        if ((dum_hcd->old_status &
 338                             USB_PORT_STAT_CONNECTION) == 0)
 339                                dum_hcd->port_status |=
 340                                        (USB_PORT_STAT_C_CONNECTION << 16);
 341                        if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) == 0)
 342                                dum_hcd->port_status &= ~USB_PORT_STAT_SUSPEND;
 343                        else if ((dum_hcd->port_status &
 344                                  USB_PORT_STAT_SUSPEND) == 0 &&
 345                                        dum_hcd->rh_state != DUMMY_RH_SUSPENDED)
 346                                dum_hcd->active = 1;
 347                }
 348        }
 349}
 350
 351/* caller must hold lock */
 352static void set_link_state(struct dummy_hcd *dum_hcd)
 353{
 354        struct dummy *dum = dum_hcd->dum;
 355
 356        dum_hcd->active = 0;
 357        if (dum->pullup)
 358                if ((dummy_hcd_to_hcd(dum_hcd)->speed == HCD_USB3 &&
 359                     dum->gadget.speed != USB_SPEED_SUPER) ||
 360                    (dummy_hcd_to_hcd(dum_hcd)->speed != HCD_USB3 &&
 361                     dum->gadget.speed == USB_SPEED_SUPER))
 362                        return;
 363
 364        set_link_state_by_speed(dum_hcd);
 365
 366        if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) == 0 ||
 367             dum_hcd->active)
 368                dum_hcd->resuming = 0;
 369
 370        /* if !connected or reset */
 371        if ((dum_hcd->port_status & USB_PORT_STAT_CONNECTION) == 0 ||
 372                        (dum_hcd->port_status & USB_PORT_STAT_RESET) != 0) {
 373                /*
 374                 * We're connected and not reset (reset occurred now),
 375                 * and driver attached - disconnect!
 376                 */
 377                if ((dum_hcd->old_status & USB_PORT_STAT_CONNECTION) != 0 &&
 378                    (dum_hcd->old_status & USB_PORT_STAT_RESET) == 0 &&
 379                    dum->driver) {
 380                        stop_activity(dum);
 381                        spin_unlock(&dum->lock);
 382                        dum->driver->disconnect(&dum->gadget);
 383                        spin_lock(&dum->lock);
 384                }
 385        } else if (dum_hcd->active != dum_hcd->old_active) {
 386                if (dum_hcd->old_active && dum->driver->suspend) {
 387                        spin_unlock(&dum->lock);
 388                        dum->driver->suspend(&dum->gadget);
 389                        spin_lock(&dum->lock);
 390                } else if (!dum_hcd->old_active &&  dum->driver->resume) {
 391                        spin_unlock(&dum->lock);
 392                        dum->driver->resume(&dum->gadget);
 393                        spin_lock(&dum->lock);
 394                }
 395        }
 396
 397        dum_hcd->old_status = dum_hcd->port_status;
 398        dum_hcd->old_active = dum_hcd->active;
 399}
 400
 401/*-------------------------------------------------------------------------*/
 402
 403/* SLAVE/GADGET SIDE DRIVER
 404 *
 405 * This only tracks gadget state.  All the work is done when the host
 406 * side tries some (emulated) i/o operation.  Real device controller
 407 * drivers would do real i/o using dma, fifos, irqs, timers, etc.
 408 */
 409
 410#define is_enabled(dum) \
 411        (dum->port_status & USB_PORT_STAT_ENABLE)
 412
 413static int dummy_enable(struct usb_ep *_ep,
 414                const struct usb_endpoint_descriptor *desc)
 415{
 416        struct dummy            *dum;
 417        struct dummy_hcd        *dum_hcd;
 418        struct dummy_ep         *ep;
 419        unsigned                max;
 420        int                     retval;
 421
 422        ep = usb_ep_to_dummy_ep(_ep);
 423        if (!_ep || !desc || ep->desc || _ep->name == ep0name
 424                        || desc->bDescriptorType != USB_DT_ENDPOINT)
 425                return -EINVAL;
 426        dum = ep_to_dummy(ep);
 427        if (!dum->driver)
 428                return -ESHUTDOWN;
 429
 430        dum_hcd = gadget_to_dummy_hcd(&dum->gadget);
 431        if (!is_enabled(dum_hcd))
 432                return -ESHUTDOWN;
 433
 434        /*
 435         * For HS/FS devices only bits 0..10 of the wMaxPacketSize represent the
 436         * maximum packet size.
 437         * For SS devices the wMaxPacketSize is limited by 1024.
 438         */
 439        max = usb_endpoint_maxp(desc) & 0x7ff;
 440
 441        /* drivers must not request bad settings, since lower levels
 442         * (hardware or its drivers) may not check.  some endpoints
 443         * can't do iso, many have maxpacket limitations, etc.
 444         *
 445         * since this "hardware" driver is here to help debugging, we
 446         * have some extra sanity checks.  (there could be more though,
 447         * especially for "ep9out" style fixed function ones.)
 448         */
 449        retval = -EINVAL;
 450        switch (usb_endpoint_type(desc)) {
 451        case USB_ENDPOINT_XFER_BULK:
 452                if (strstr(ep->ep.name, "-iso")
 453                                || strstr(ep->ep.name, "-int")) {
 454                        goto done;
 455                }
 456                switch (dum->gadget.speed) {
 457                case USB_SPEED_SUPER:
 458                        if (max == 1024)
 459                                break;
 460                        goto done;
 461                case USB_SPEED_HIGH:
 462                        if (max == 512)
 463                                break;
 464                        goto done;
 465                case USB_SPEED_FULL:
 466                        if (max == 8 || max == 16 || max == 32 || max == 64)
 467                                /* we'll fake any legal size */
 468                                break;
 469                        /* save a return statement */
 470                default:
 471                        goto done;
 472                }
 473                break;
 474        case USB_ENDPOINT_XFER_INT:
 475                if (strstr(ep->ep.name, "-iso")) /* bulk is ok */
 476                        goto done;
 477                /* real hardware might not handle all packet sizes */
 478                switch (dum->gadget.speed) {
 479                case USB_SPEED_SUPER:
 480                case USB_SPEED_HIGH:
 481                        if (max <= 1024)
 482                                break;
 483                        /* save a return statement */
 484                case USB_SPEED_FULL:
 485                        if (max <= 64)
 486                                break;
 487                        /* save a return statement */
 488                default:
 489                        if (max <= 8)
 490                                break;
 491                        goto done;
 492                }
 493                break;
 494        case USB_ENDPOINT_XFER_ISOC:
 495                if (strstr(ep->ep.name, "-bulk")
 496                                || strstr(ep->ep.name, "-int"))
 497                        goto done;
 498                /* real hardware might not handle all packet sizes */
 499                switch (dum->gadget.speed) {
 500                case USB_SPEED_SUPER:
 501                case USB_SPEED_HIGH:
 502                        if (max <= 1024)
 503                                break;
 504                        /* save a return statement */
 505                case USB_SPEED_FULL:
 506                        if (max <= 1023)
 507                                break;
 508                        /* save a return statement */
 509                default:
 510                        goto done;
 511                }
 512                break;
 513        default:
 514                /* few chips support control except on ep0 */
 515                goto done;
 516        }
 517
 518        _ep->maxpacket = max;
 519        if (usb_ss_max_streams(_ep->comp_desc)) {
 520                if (!usb_endpoint_xfer_bulk(desc)) {
 521                        dev_err(udc_dev(dum), "Can't enable stream support on "
 522                                        "non-bulk ep %s\n", _ep->name);
 523                        return -EINVAL;
 524                }
 525                ep->stream_en = 1;
 526        }
 527        ep->desc = desc;
 528
 529        dev_dbg(udc_dev(dum), "enabled %s (ep%d%s-%s) maxpacket %d stream %s\n",
 530                _ep->name,
 531                desc->bEndpointAddress & 0x0f,
 532                (desc->bEndpointAddress & USB_DIR_IN) ? "in" : "out",
 533                ({ char *val;
 534                 switch (usb_endpoint_type(desc)) {
 535                 case USB_ENDPOINT_XFER_BULK:
 536                         val = "bulk";
 537                         break;
 538                 case USB_ENDPOINT_XFER_ISOC:
 539                         val = "iso";
 540                         break;
 541                 case USB_ENDPOINT_XFER_INT:
 542                         val = "intr";
 543                         break;
 544                 default:
 545                         val = "ctrl";
 546                         break;
 547                 }; val; }),
 548                max, ep->stream_en ? "enabled" : "disabled");
 549
 550        /* at this point real hardware should be NAKing transfers
 551         * to that endpoint, until a buffer is queued to it.
 552         */
 553        ep->halted = ep->wedged = 0;
 554        retval = 0;
 555done:
 556        return retval;
 557}
 558
 559static int dummy_disable(struct usb_ep *_ep)
 560{
 561        struct dummy_ep         *ep;
 562        struct dummy            *dum;
 563        unsigned long           flags;
 564        int                     retval;
 565
 566        ep = usb_ep_to_dummy_ep(_ep);
 567        if (!_ep || !ep->desc || _ep->name == ep0name)
 568                return -EINVAL;
 569        dum = ep_to_dummy(ep);
 570
 571        spin_lock_irqsave(&dum->lock, flags);
 572        ep->desc = NULL;
 573        ep->stream_en = 0;
 574        retval = 0;
 575        nuke(dum, ep);
 576        spin_unlock_irqrestore(&dum->lock, flags);
 577
 578        dev_dbg(udc_dev(dum), "disabled %s\n", _ep->name);
 579        return retval;
 580}
 581
 582static struct usb_request *dummy_alloc_request(struct usb_ep *_ep,
 583                gfp_t mem_flags)
 584{
 585        struct dummy_ep         *ep;
 586        struct dummy_request    *req;
 587
 588        if (!_ep)
 589                return NULL;
 590        ep = usb_ep_to_dummy_ep(_ep);
 591
 592        req = kzalloc(sizeof(*req), mem_flags);
 593        if (!req)
 594                return NULL;
 595        INIT_LIST_HEAD(&req->queue);
 596        return &req->req;
 597}
 598
 599static void dummy_free_request(struct usb_ep *_ep, struct usb_request *_req)
 600{
 601        struct dummy_request    *req;
 602
 603        if (!_ep || !_req) {
 604                WARN_ON(1);
 605                return;
 606        }
 607
 608        req = usb_request_to_dummy_request(_req);
 609        WARN_ON(!list_empty(&req->queue));
 610        kfree(req);
 611}
 612
 613static void fifo_complete(struct usb_ep *ep, struct usb_request *req)
 614{
 615}
 616
 617static int dummy_queue(struct usb_ep *_ep, struct usb_request *_req,
 618                gfp_t mem_flags)
 619{
 620        struct dummy_ep         *ep;
 621        struct dummy_request    *req;
 622        struct dummy            *dum;
 623        struct dummy_hcd        *dum_hcd;
 624        unsigned long           flags;
 625
 626        req = usb_request_to_dummy_request(_req);
 627        if (!_req || !list_empty(&req->queue) || !_req->complete)
 628                return -EINVAL;
 629
 630        ep = usb_ep_to_dummy_ep(_ep);
 631        if (!_ep || (!ep->desc && _ep->name != ep0name))
 632                return -EINVAL;
 633
 634        dum = ep_to_dummy(ep);
 635        dum_hcd = gadget_to_dummy_hcd(&dum->gadget);
 636        if (!dum->driver || !is_enabled(dum_hcd))
 637                return -ESHUTDOWN;
 638
 639#if 0
 640        dev_dbg(udc_dev(dum), "ep %p queue req %p to %s, len %d buf %p\n",
 641                        ep, _req, _ep->name, _req->length, _req->buf);
 642#endif
 643        _req->status = -EINPROGRESS;
 644        _req->actual = 0;
 645        spin_lock_irqsave(&dum->lock, flags);
 646
 647        /* implement an emulated single-request FIFO */
 648        if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) &&
 649                        list_empty(&dum->fifo_req.queue) &&
 650                        list_empty(&ep->queue) &&
 651                        _req->length <= FIFO_SIZE) {
 652                req = &dum->fifo_req;
 653                req->req = *_req;
 654                req->req.buf = dum->fifo_buf;
 655                memcpy(dum->fifo_buf, _req->buf, _req->length);
 656                req->req.context = dum;
 657                req->req.complete = fifo_complete;
 658
 659                list_add_tail(&req->queue, &ep->queue);
 660                spin_unlock(&dum->lock);
 661                _req->actual = _req->length;
 662                _req->status = 0;
 663                _req->complete(_ep, _req);
 664                spin_lock(&dum->lock);
 665        }  else
 666                list_add_tail(&req->queue, &ep->queue);
 667        spin_unlock_irqrestore(&dum->lock, flags);
 668
 669        /* real hardware would likely enable transfers here, in case
 670         * it'd been left NAKing.
 671         */
 672        return 0;
 673}
 674
 675static int dummy_dequeue(struct usb_ep *_ep, struct usb_request *_req)
 676{
 677        struct dummy_ep         *ep;
 678        struct dummy            *dum;
 679        int                     retval = -EINVAL;
 680        unsigned long           flags;
 681        struct dummy_request    *req = NULL;
 682
 683        if (!_ep || !_req)
 684                return retval;
 685        ep = usb_ep_to_dummy_ep(_ep);
 686        dum = ep_to_dummy(ep);
 687
 688        if (!dum->driver)
 689                return -ESHUTDOWN;
 690
 691        local_irq_save(flags);
 692        spin_lock(&dum->lock);
 693        list_for_each_entry(req, &ep->queue, queue) {
 694                if (&req->req == _req) {
 695                        list_del_init(&req->queue);
 696                        _req->status = -ECONNRESET;
 697                        retval = 0;
 698                        break;
 699                }
 700        }
 701        spin_unlock(&dum->lock);
 702
 703        if (retval == 0) {
 704                dev_dbg(udc_dev(dum),
 705                                "dequeued req %p from %s, len %d buf %p\n",
 706                                req, _ep->name, _req->length, _req->buf);
 707                _req->complete(_ep, _req);
 708        }
 709        local_irq_restore(flags);
 710        return retval;
 711}
 712
 713static int
 714dummy_set_halt_and_wedge(struct usb_ep *_ep, int value, int wedged)
 715{
 716        struct dummy_ep         *ep;
 717        struct dummy            *dum;
 718
 719        if (!_ep)
 720                return -EINVAL;
 721        ep = usb_ep_to_dummy_ep(_ep);
 722        dum = ep_to_dummy(ep);
 723        if (!dum->driver)
 724                return -ESHUTDOWN;
 725        if (!value)
 726                ep->halted = ep->wedged = 0;
 727        else if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) &&
 728                        !list_empty(&ep->queue))
 729                return -EAGAIN;
 730        else {
 731                ep->halted = 1;
 732                if (wedged)
 733                        ep->wedged = 1;
 734        }
 735        /* FIXME clear emulated data toggle too */
 736        return 0;
 737}
 738
 739static int
 740dummy_set_halt(struct usb_ep *_ep, int value)
 741{
 742        return dummy_set_halt_and_wedge(_ep, value, 0);
 743}
 744
 745static int dummy_set_wedge(struct usb_ep *_ep)
 746{
 747        if (!_ep || _ep->name == ep0name)
 748                return -EINVAL;
 749        return dummy_set_halt_and_wedge(_ep, 1, 1);
 750}
 751
 752static const struct usb_ep_ops dummy_ep_ops = {
 753        .enable         = dummy_enable,
 754        .disable        = dummy_disable,
 755
 756        .alloc_request  = dummy_alloc_request,
 757        .free_request   = dummy_free_request,
 758
 759        .queue          = dummy_queue,
 760        .dequeue        = dummy_dequeue,
 761
 762        .set_halt       = dummy_set_halt,
 763        .set_wedge      = dummy_set_wedge,
 764};
 765
 766/*-------------------------------------------------------------------------*/
 767
 768/* there are both host and device side versions of this call ... */
 769static int dummy_g_get_frame(struct usb_gadget *_gadget)
 770{
 771        struct timeval  tv;
 772
 773        do_gettimeofday(&tv);
 774        return tv.tv_usec / 1000;
 775}
 776
 777static int dummy_wakeup(struct usb_gadget *_gadget)
 778{
 779        struct dummy_hcd *dum_hcd;
 780
 781        dum_hcd = gadget_to_dummy_hcd(_gadget);
 782        if (!(dum_hcd->dum->devstatus & ((1 << USB_DEVICE_B_HNP_ENABLE)
 783                                | (1 << USB_DEVICE_REMOTE_WAKEUP))))
 784                return -EINVAL;
 785        if ((dum_hcd->port_status & USB_PORT_STAT_CONNECTION) == 0)
 786                return -ENOLINK;
 787        if ((dum_hcd->port_status & USB_PORT_STAT_SUSPEND) == 0 &&
 788                         dum_hcd->rh_state != DUMMY_RH_SUSPENDED)
 789                return -EIO;
 790
 791        /* FIXME: What if the root hub is suspended but the port isn't? */
 792
 793        /* hub notices our request, issues downstream resume, etc */
 794        dum_hcd->resuming = 1;
 795        dum_hcd->re_timeout = jiffies + msecs_to_jiffies(20);
 796        mod_timer(&dummy_hcd_to_hcd(dum_hcd)->rh_timer, dum_hcd->re_timeout);
 797        return 0;
 798}
 799
 800static int dummy_set_selfpowered(struct usb_gadget *_gadget, int value)
 801{
 802        struct dummy    *dum;
 803
 804        dum = gadget_to_dummy_hcd(_gadget)->dum;
 805        if (value)
 806                dum->devstatus |= (1 << USB_DEVICE_SELF_POWERED);
 807        else
 808                dum->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED);
 809        return 0;
 810}
 811
 812static void dummy_udc_update_ep0(struct dummy *dum)
 813{
 814        if (dum->gadget.speed == USB_SPEED_SUPER)
 815                dum->ep[0].ep.maxpacket = 9;
 816        else
 817                dum->ep[0].ep.maxpacket = 64;
 818}
 819
 820static int dummy_pullup(struct usb_gadget *_gadget, int value)
 821{
 822        struct dummy_hcd *dum_hcd;
 823        struct dummy    *dum;
 824        unsigned long   flags;
 825
 826        dum = gadget_dev_to_dummy(&_gadget->dev);
 827
 828        if (value && dum->driver) {
 829                if (mod_data.is_super_speed)
 830                        dum->gadget.speed = dum->driver->max_speed;
 831                else if (mod_data.is_high_speed)
 832                        dum->gadget.speed = min_t(u8, USB_SPEED_HIGH,
 833                                        dum->driver->max_speed);
 834                else
 835                        dum->gadget.speed = USB_SPEED_FULL;
 836                dummy_udc_update_ep0(dum);
 837
 838                if (dum->gadget.speed < dum->driver->max_speed)
 839                        dev_dbg(udc_dev(dum), "This device can perform faster"
 840                                " if you connect it to a %s port...\n",
 841                                usb_speed_string(dum->driver->max_speed));
 842        }
 843        dum_hcd = gadget_to_dummy_hcd(_gadget);
 844
 845        spin_lock_irqsave(&dum->lock, flags);
 846        dum->pullup = (value != 0);
 847        set_link_state(dum_hcd);
 848        spin_unlock_irqrestore(&dum->lock, flags);
 849
 850        usb_hcd_poll_rh_status(dummy_hcd_to_hcd(dum_hcd));
 851        return 0;
 852}
 853
 854static int dummy_udc_start(struct usb_gadget *g,
 855                struct usb_gadget_driver *driver);
 856static int dummy_udc_stop(struct usb_gadget *g,
 857                struct usb_gadget_driver *driver);
 858
 859static const struct usb_gadget_ops dummy_ops = {
 860        .get_frame      = dummy_g_get_frame,
 861        .wakeup         = dummy_wakeup,
 862        .set_selfpowered = dummy_set_selfpowered,
 863        .pullup         = dummy_pullup,
 864        .udc_start      = dummy_udc_start,
 865        .udc_stop       = dummy_udc_stop,
 866};
 867
 868/*-------------------------------------------------------------------------*/
 869
 870/* "function" sysfs attribute */
 871static ssize_t show_function(struct device *dev, struct device_attribute *attr,
 872                char *buf)
 873{
 874        struct dummy    *dum = gadget_dev_to_dummy(dev);
 875
 876        if (!dum->driver || !dum->driver->function)
 877                return 0;
 878        return scnprintf(buf, PAGE_SIZE, "%s\n", dum->driver->function);
 879}
 880static DEVICE_ATTR(function, S_IRUGO, show_function, NULL);
 881
 882/*-------------------------------------------------------------------------*/
 883
 884/*
 885 * Driver registration/unregistration.
 886 *
 887 * This is basically hardware-specific; there's usually only one real USB
 888 * device (not host) controller since that's how USB devices are intended
 889 * to work.  So most implementations of these api calls will rely on the
 890 * fact that only one driver will ever bind to the hardware.  But curious
 891 * hardware can be built with discrete components, so the gadget API doesn't
 892 * require that assumption.
 893 *
 894 * For this emulator, it might be convenient to create a usb slave device
 895 * for each driver that registers:  just add to a big root hub.
 896 */
 897
 898static int dummy_udc_start(struct usb_gadget *g,
 899                struct usb_gadget_driver *driver)
 900{
 901        struct dummy_hcd        *dum_hcd = gadget_to_dummy_hcd(g);
 902        struct dummy            *dum = dum_hcd->dum;
 903
 904        if (driver->max_speed == USB_SPEED_UNKNOWN)
 905                return -EINVAL;
 906
 907        /*
 908         * SLAVE side init ... the layer above hardware, which
 909         * can't enumerate without help from the driver we're binding.
 910         */
 911
 912        dum->devstatus = 0;
 913
 914        dum->driver = driver;
 915        dum->gadget.dev.driver = &driver->driver;
 916        dev_dbg(udc_dev(dum), "binding gadget driver '%s'\n",
 917                        driver->driver.name);
 918        return 0;
 919}
 920
 921static int dummy_udc_stop(struct usb_gadget *g,
 922                struct usb_gadget_driver *driver)
 923{
 924        struct dummy_hcd        *dum_hcd = gadget_to_dummy_hcd(g);
 925        struct dummy            *dum = dum_hcd->dum;
 926
 927        dev_dbg(udc_dev(dum), "unregister gadget driver '%s'\n",
 928                        driver->driver.name);
 929
 930        dum->gadget.dev.driver = NULL;
 931        dum->driver = NULL;
 932
 933        return 0;
 934}
 935
 936#undef is_enabled
 937
 938/* The gadget structure is stored inside the hcd structure and will be
 939 * released along with it. */
 940static void dummy_gadget_release(struct device *dev)
 941{
 942        return;
 943}
 944
 945static void init_dummy_udc_hw(struct dummy *dum)
 946{
 947        int i;
 948
 949        INIT_LIST_HEAD(&dum->gadget.ep_list);
 950        for (i = 0; i < DUMMY_ENDPOINTS; i++) {
 951                struct dummy_ep *ep = &dum->ep[i];
 952
 953                if (!ep_name[i])
 954                        break;
 955                ep->ep.name = ep_name[i];
 956                ep->ep.ops = &dummy_ep_ops;
 957                list_add_tail(&ep->ep.ep_list, &dum->gadget.ep_list);
 958                ep->halted = ep->wedged = ep->already_seen =
 959                                ep->setup_stage = 0;
 960                ep->ep.maxpacket = ~0;
 961                ep->ep.max_streams = 16;
 962                ep->last_io = jiffies;
 963                ep->gadget = &dum->gadget;
 964                ep->desc = NULL;
 965                INIT_LIST_HEAD(&ep->queue);
 966        }
 967
 968        dum->gadget.ep0 = &dum->ep[0].ep;
 969        list_del_init(&dum->ep[0].ep.ep_list);
 970        INIT_LIST_HEAD(&dum->fifo_req.queue);
 971
 972#ifdef CONFIG_USB_OTG
 973        dum->gadget.is_otg = 1;
 974#endif
 975}
 976
 977static int dummy_udc_probe(struct platform_device *pdev)
 978{
 979        struct dummy    *dum;
 980        int             rc;
 981
 982        dum = *((void **)dev_get_platdata(&pdev->dev));
 983        dum->gadget.name = gadget_name;
 984        dum->gadget.ops = &dummy_ops;
 985        dum->gadget.max_speed = USB_SPEED_SUPER;
 986
 987        dev_set_name(&dum->gadget.dev, "gadget");
 988        dum->gadget.dev.parent = &pdev->dev;
 989        dum->gadget.dev.release = dummy_gadget_release;
 990        rc = device_register(&dum->gadget.dev);
 991        if (rc < 0) {
 992                put_device(&dum->gadget.dev);
 993                return rc;
 994        }
 995
 996        init_dummy_udc_hw(dum);
 997
 998        rc = usb_add_gadget_udc(&pdev->dev, &dum->gadget);
 999        if (rc < 0)
1000                goto err_udc;
1001
1002        rc = device_create_file(&dum->gadget.dev, &dev_attr_function);
1003        if (rc < 0)
1004                goto err_dev;
1005        platform_set_drvdata(pdev, dum);
1006        return rc;
1007
1008err_dev:
1009        usb_del_gadget_udc(&dum->gadget);
1010err_udc:
1011        device_unregister(&dum->gadget.dev);
1012        return rc;
1013}
1014
1015static int dummy_udc_remove(struct platform_device *pdev)
1016{
1017        struct dummy    *dum = platform_get_drvdata(pdev);
1018
1019        usb_del_gadget_udc(&dum->gadget);
1020        platform_set_drvdata(pdev, NULL);
1021        device_remove_file(&dum->gadget.dev, &dev_attr_function);
1022        device_unregister(&dum->gadget.dev);
1023        return 0;
1024}
1025
1026static void dummy_udc_pm(struct dummy *dum, struct dummy_hcd *dum_hcd,
1027                int suspend)
1028{
1029        spin_lock_irq(&dum->lock);
1030        dum->udc_suspended = suspend;
1031        set_link_state(dum_hcd);
1032        spin_unlock_irq(&dum->lock);
1033}
1034
1035static int dummy_udc_suspend(struct platform_device *pdev, pm_message_t state)
1036{
1037        struct dummy            *dum = platform_get_drvdata(pdev);
1038        struct dummy_hcd        *dum_hcd = gadget_to_dummy_hcd(&dum->gadget);
1039
1040        dev_dbg(&pdev->dev, "%s\n", __func__);
1041        dummy_udc_pm(dum, dum_hcd, 1);
1042        usb_hcd_poll_rh_status(dummy_hcd_to_hcd(dum_hcd));
1043        return 0;
1044}
1045
1046static int dummy_udc_resume(struct platform_device *pdev)
1047{
1048        struct dummy            *dum = platform_get_drvdata(pdev);
1049        struct dummy_hcd        *dum_hcd = gadget_to_dummy_hcd(&dum->gadget);
1050
1051        dev_dbg(&pdev->dev, "%s\n", __func__);
1052        dummy_udc_pm(dum, dum_hcd, 0);
1053        usb_hcd_poll_rh_status(dummy_hcd_to_hcd(dum_hcd));
1054        return 0;
1055}
1056
1057static struct platform_driver dummy_udc_driver = {
1058        .probe          = dummy_udc_probe,
1059        .remove         = dummy_udc_remove,
1060        .suspend        = dummy_udc_suspend,
1061        .resume         = dummy_udc_resume,
1062        .driver         = {
1063                .name   = (char *) gadget_name,
1064                .owner  = THIS_MODULE,
1065        },
1066};
1067
1068/*-------------------------------------------------------------------------*/
1069
1070static unsigned int dummy_get_ep_idx(const struct usb_endpoint_descriptor *desc)
1071{
1072        unsigned int index;
1073
1074        index = usb_endpoint_num(desc) << 1;
1075        if (usb_endpoint_dir_in(desc))
1076                index |= 1;
1077        return index;
1078}
1079
1080/* MASTER/HOST SIDE DRIVER
1081 *
1082 * this uses the hcd framework to hook up to host side drivers.
1083 * its root hub will only have one device, otherwise it acts like
1084 * a normal host controller.
1085 *
1086 * when urbs are queued, they're just stuck on a list that we
1087 * scan in a timer callback.  that callback connects writes from
1088 * the host with reads from the device, and so on, based on the
1089 * usb 2.0 rules.
1090 */
1091
1092static int dummy_ep_stream_en(struct dummy_hcd *dum_hcd, struct urb *urb)
1093{
1094        const struct usb_endpoint_descriptor *desc = &urb->ep->desc;
1095        u32 index;
1096
1097        if (!usb_endpoint_xfer_bulk(desc))
1098                return 0;
1099
1100        index = dummy_get_ep_idx(desc);
1101        return (1 << index) & dum_hcd->stream_en_ep;
1102}
1103
1104/*
1105 * The max stream number is saved as a nibble so for the 30 possible endpoints
1106 * we only 15 bytes of memory. Therefore we are limited to max 16 streams (0
1107 * means we use only 1 stream). The maximum according to the spec is 16bit so
1108 * if the 16 stream limit is about to go, the array size should be incremented
1109 * to 30 elements of type u16.
1110 */
1111static int get_max_streams_for_pipe(struct dummy_hcd *dum_hcd,
1112                unsigned int pipe)
1113{
1114        int max_streams;
1115
1116        max_streams = dum_hcd->num_stream[usb_pipeendpoint(pipe)];
1117        if (usb_pipeout(pipe))
1118                max_streams >>= 4;
1119        else
1120                max_streams &= 0xf;
1121        max_streams++;
1122        return max_streams;
1123}
1124
1125static void set_max_streams_for_pipe(struct dummy_hcd *dum_hcd,
1126                unsigned int pipe, unsigned int streams)
1127{
1128        int max_streams;
1129
1130        streams--;
1131        max_streams = dum_hcd->num_stream[usb_pipeendpoint(pipe)];
1132        if (usb_pipeout(pipe)) {
1133                streams <<= 4;
1134                max_streams &= 0xf;
1135        } else {
1136                max_streams &= 0xf0;
1137        }
1138        max_streams |= streams;
1139        dum_hcd->num_stream[usb_pipeendpoint(pipe)] = max_streams;
1140}
1141
1142static int dummy_validate_stream(struct dummy_hcd *dum_hcd, struct urb *urb)
1143{
1144        unsigned int max_streams;
1145        int enabled;
1146
1147        enabled = dummy_ep_stream_en(dum_hcd, urb);
1148        if (!urb->stream_id) {
1149                if (enabled)
1150                        return -EINVAL;
1151                return 0;
1152        }
1153        if (!enabled)
1154                return -EINVAL;
1155
1156        max_streams = get_max_streams_for_pipe(dum_hcd,
1157                        usb_pipeendpoint(urb->pipe));
1158        if (urb->stream_id > max_streams) {
1159                dev_err(dummy_dev(dum_hcd), "Stream id %d is out of range.\n",
1160                                urb->stream_id);
1161                BUG();
1162                return -EINVAL;
1163        }
1164        return 0;
1165}
1166
1167static int dummy_urb_enqueue(
1168        struct usb_hcd                  *hcd,
1169        struct urb                      *urb,
1170        gfp_t                           mem_flags
1171) {
1172        struct dummy_hcd *dum_hcd;
1173        struct urbp     *urbp;
1174        unsigned long   flags;
1175        int             rc;
1176
1177        urbp = kmalloc(sizeof *urbp, mem_flags);
1178        if (!urbp)
1179                return -ENOMEM;
1180        urbp->urb = urb;
1181        urbp->miter_started = 0;
1182
1183        dum_hcd = hcd_to_dummy_hcd(hcd);
1184        spin_lock_irqsave(&dum_hcd->dum->lock, flags);
1185
1186        rc = dummy_validate_stream(dum_hcd, urb);
1187        if (rc) {
1188                kfree(urbp);
1189                goto done;
1190        }
1191
1192        rc = usb_hcd_link_urb_to_ep(hcd, urb);
1193        if (rc) {
1194                kfree(urbp);
1195                goto done;
1196        }
1197
1198        if (!dum_hcd->udev) {
1199                dum_hcd->udev = urb->dev;
1200                usb_get_dev(dum_hcd->udev);
1201        } else if (unlikely(dum_hcd->udev != urb->dev))
1202                dev_err(dummy_dev(dum_hcd), "usb_device address has changed!\n");
1203
1204        list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list);
1205        urb->hcpriv = urbp;
1206        if (usb_pipetype(urb->pipe) == PIPE_CONTROL)
1207                urb->error_count = 1;           /* mark as a new urb */
1208
1209        /* kick the scheduler, it'll do the rest */
1210        if (!timer_pending(&dum_hcd->timer))
1211                mod_timer(&dum_hcd->timer, jiffies + 1);
1212
1213 done:
1214        spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
1215        return rc;
1216}
1217
1218static int dummy_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
1219{
1220        struct dummy_hcd *dum_hcd;
1221        unsigned long   flags;
1222        int             rc;
1223
1224        /* giveback happens automatically in timer callback,
1225         * so make sure the callback happens */
1226        dum_hcd = hcd_to_dummy_hcd(hcd);
1227        spin_lock_irqsave(&dum_hcd->dum->lock, flags);
1228
1229        rc = usb_hcd_check_unlink_urb(hcd, urb, status);
1230        if (!rc && dum_hcd->rh_state != DUMMY_RH_RUNNING &&
1231                        !list_empty(&dum_hcd->urbp_list))
1232                mod_timer(&dum_hcd->timer, jiffies);
1233
1234        spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
1235        return rc;
1236}
1237
1238static int dummy_perform_transfer(struct urb *urb, struct dummy_request *req,
1239                u32 len)
1240{
1241        void *ubuf, *rbuf;
1242        struct urbp *urbp = urb->hcpriv;
1243        int to_host;
1244        struct sg_mapping_iter *miter = &urbp->miter;
1245        u32 trans = 0;
1246        u32 this_sg;
1247        bool next_sg;
1248
1249        to_host = usb_pipein(urb->pipe);
1250        rbuf = req->req.buf + req->req.actual;
1251
1252        if (!urb->num_sgs) {
1253                ubuf = urb->transfer_buffer + urb->actual_length;
1254                if (to_host)
1255                        memcpy(ubuf, rbuf, len);
1256                else
1257                        memcpy(rbuf, ubuf, len);
1258                return len;
1259        }
1260
1261        if (!urbp->miter_started) {
1262                u32 flags = SG_MITER_ATOMIC;
1263
1264                if (to_host)
1265                        flags |= SG_MITER_TO_SG;
1266                else
1267                        flags |= SG_MITER_FROM_SG;
1268
1269                sg_miter_start(miter, urb->sg, urb->num_sgs, flags);
1270                urbp->miter_started = 1;
1271        }
1272        next_sg = sg_miter_next(miter);
1273        if (next_sg == false) {
1274                WARN_ON_ONCE(1);
1275                return -EINVAL;
1276        }
1277        do {
1278                ubuf = miter->addr;
1279                this_sg = min_t(u32, len, miter->length);
1280                miter->consumed = this_sg;
1281                trans += this_sg;
1282
1283                if (to_host)
1284                        memcpy(ubuf, rbuf, this_sg);
1285                else
1286                        memcpy(rbuf, ubuf, this_sg);
1287                len -= this_sg;
1288
1289                if (!len)
1290                        break;
1291                next_sg = sg_miter_next(miter);
1292                if (next_sg == false) {
1293                        WARN_ON_ONCE(1);
1294                        return -EINVAL;
1295                }
1296
1297                rbuf += this_sg;
1298        } while (1);
1299
1300        sg_miter_stop(miter);
1301        return trans;
1302}
1303
1304/* transfer up to a frame's worth; caller must own lock */
1305static int transfer(struct dummy_hcd *dum_hcd, struct urb *urb,
1306                struct dummy_ep *ep, int limit, int *status)
1307{
1308        struct dummy            *dum = dum_hcd->dum;
1309        struct dummy_request    *req;
1310
1311top:
1312        /* if there's no request queued, the device is NAKing; return */
1313        list_for_each_entry(req, &ep->queue, queue) {
1314                unsigned        host_len, dev_len, len;
1315                int             is_short, to_host;
1316                int             rescan = 0;
1317
1318                if (dummy_ep_stream_en(dum_hcd, urb)) {
1319                        if ((urb->stream_id != req->req.stream_id))
1320                                continue;
1321                }
1322
1323                /* 1..N packets of ep->ep.maxpacket each ... the last one
1324                 * may be short (including zero length).
1325                 *
1326                 * writer can send a zlp explicitly (length 0) or implicitly
1327                 * (length mod maxpacket zero, and 'zero' flag); they always
1328                 * terminate reads.
1329                 */
1330                host_len = urb->transfer_buffer_length - urb->actual_length;
1331                dev_len = req->req.length - req->req.actual;
1332                len = min(host_len, dev_len);
1333
1334                /* FIXME update emulated data toggle too */
1335
1336                to_host = usb_pipein(urb->pipe);
1337                if (unlikely(len == 0))
1338                        is_short = 1;
1339                else {
1340                        /* not enough bandwidth left? */
1341                        if (limit < ep->ep.maxpacket && limit < len)
1342                                break;
1343                        len = min_t(unsigned, len, limit);
1344                        if (len == 0)
1345                                break;
1346
1347                        /* use an extra pass for the final short packet */
1348                        if (len > ep->ep.maxpacket) {
1349                                rescan = 1;
1350                                len -= (len % ep->ep.maxpacket);
1351                        }
1352                        is_short = (len % ep->ep.maxpacket) != 0;
1353
1354                        len = dummy_perform_transfer(urb, req, len);
1355
1356                        ep->last_io = jiffies;
1357                        if ((int)len < 0) {
1358                                req->req.status = len;
1359                        } else {
1360                                limit -= len;
1361                                urb->actual_length += len;
1362                                req->req.actual += len;
1363                        }
1364                }
1365
1366                /* short packets terminate, maybe with overflow/underflow.
1367                 * it's only really an error to write too much.
1368                 *
1369                 * partially filling a buffer optionally blocks queue advances
1370                 * (so completion handlers can clean up the queue) but we don't
1371                 * need to emulate such data-in-flight.
1372                 */
1373                if (is_short) {
1374                        if (host_len == dev_len) {
1375                                req->req.status = 0;
1376                                *status = 0;
1377                        } else if (to_host) {
1378                                req->req.status = 0;
1379                                if (dev_len > host_len)
1380                                        *status = -EOVERFLOW;
1381                                else
1382                                        *status = 0;
1383                        } else if (!to_host) {
1384                                *status = 0;
1385                                if (host_len > dev_len)
1386                                        req->req.status = -EOVERFLOW;
1387                                else
1388                                        req->req.status = 0;
1389                        }
1390
1391                /* many requests terminate without a short packet */
1392                } else {
1393                        if (req->req.length == req->req.actual
1394                                        && !req->req.zero)
1395                                req->req.status = 0;
1396                        if (urb->transfer_buffer_length == urb->actual_length
1397                                        && !(urb->transfer_flags
1398                                                & URB_ZERO_PACKET))
1399                                *status = 0;
1400                }
1401
1402                /* device side completion --> continuable */
1403                if (req->req.status != -EINPROGRESS) {
1404                        list_del_init(&req->queue);
1405
1406                        spin_unlock(&dum->lock);
1407                        req->req.complete(&ep->ep, &req->req);
1408                        spin_lock(&dum->lock);
1409
1410                        /* requests might have been unlinked... */
1411                        rescan = 1;
1412                }
1413
1414                /* host side completion --> terminate */
1415                if (*status != -EINPROGRESS)
1416                        break;
1417
1418                /* rescan to continue with any other queued i/o */
1419                if (rescan)
1420                        goto top;
1421        }
1422        return limit;
1423}
1424
1425static int periodic_bytes(struct dummy *dum, struct dummy_ep *ep)
1426{
1427        int     limit = ep->ep.maxpacket;
1428
1429        if (dum->gadget.speed == USB_SPEED_HIGH) {
1430                int     tmp;
1431
1432                /* high bandwidth mode */
1433                tmp = usb_endpoint_maxp(ep->desc);
1434                tmp = (tmp >> 11) & 0x03;
1435                tmp *= 8 /* applies to entire frame */;
1436                limit += limit * tmp;
1437        }
1438        if (dum->gadget.speed == USB_SPEED_SUPER) {
1439                switch (usb_endpoint_type(ep->desc)) {
1440                case USB_ENDPOINT_XFER_ISOC:
1441                        /* Sec. 4.4.8.2 USB3.0 Spec */
1442                        limit = 3 * 16 * 1024 * 8;
1443                        break;
1444                case USB_ENDPOINT_XFER_INT:
1445                        /* Sec. 4.4.7.2 USB3.0 Spec */
1446                        limit = 3 * 1024 * 8;
1447                        break;
1448                case USB_ENDPOINT_XFER_BULK:
1449                default:
1450                        break;
1451                }
1452        }
1453        return limit;
1454}
1455
1456#define is_active(dum_hcd)      ((dum_hcd->port_status & \
1457                (USB_PORT_STAT_CONNECTION | USB_PORT_STAT_ENABLE | \
1458                        USB_PORT_STAT_SUSPEND)) \
1459                == (USB_PORT_STAT_CONNECTION | USB_PORT_STAT_ENABLE))
1460
1461static struct dummy_ep *find_endpoint(struct dummy *dum, u8 address)
1462{
1463        int             i;
1464
1465        if (!is_active((dum->gadget.speed == USB_SPEED_SUPER ?
1466                        dum->ss_hcd : dum->hs_hcd)))
1467                return NULL;
1468        if ((address & ~USB_DIR_IN) == 0)
1469                return &dum->ep[0];
1470        for (i = 1; i < DUMMY_ENDPOINTS; i++) {
1471                struct dummy_ep *ep = &dum->ep[i];
1472
1473                if (!ep->desc)
1474                        continue;
1475                if (ep->desc->bEndpointAddress == address)
1476                        return ep;
1477        }
1478        return NULL;
1479}
1480
1481#undef is_active
1482
1483#define Dev_Request     (USB_TYPE_STANDARD | USB_RECIP_DEVICE)
1484#define Dev_InRequest   (Dev_Request | USB_DIR_IN)
1485#define Intf_Request    (USB_TYPE_STANDARD | USB_RECIP_INTERFACE)
1486#define Intf_InRequest  (Intf_Request | USB_DIR_IN)
1487#define Ep_Request      (USB_TYPE_STANDARD | USB_RECIP_ENDPOINT)
1488#define Ep_InRequest    (Ep_Request | USB_DIR_IN)
1489
1490
1491/**
1492 * handle_control_request() - handles all control transfers
1493 * @dum: pointer to dummy (the_controller)
1494 * @urb: the urb request to handle
1495 * @setup: pointer to the setup data for a USB device control
1496 *       request
1497 * @status: pointer to request handling status
1498 *
1499 * Return 0 - if the request was handled
1500 *        1 - if the request wasn't handles
1501 *        error code on error
1502 */
1503static int handle_control_request(struct dummy_hcd *dum_hcd, struct urb *urb,
1504                                  struct usb_ctrlrequest *setup,
1505                                  int *status)
1506{
1507        struct dummy_ep         *ep2;
1508        struct dummy            *dum = dum_hcd->dum;
1509        int                     ret_val = 1;
1510        unsigned        w_index;
1511        unsigned        w_value;
1512
1513        w_index = le16_to_cpu(setup->wIndex);
1514        w_value = le16_to_cpu(setup->wValue);
1515        switch (setup->bRequest) {
1516        case USB_REQ_SET_ADDRESS:
1517                if (setup->bRequestType != Dev_Request)
1518                        break;
1519                dum->address = w_value;
1520                *status = 0;
1521                dev_dbg(udc_dev(dum), "set_address = %d\n",
1522                                w_value);
1523                ret_val = 0;
1524                break;
1525        case USB_REQ_SET_FEATURE:
1526                if (setup->bRequestType == Dev_Request) {
1527                        ret_val = 0;
1528                        switch (w_value) {
1529                        case USB_DEVICE_REMOTE_WAKEUP:
1530                                break;
1531                        case USB_DEVICE_B_HNP_ENABLE:
1532                                dum->gadget.b_hnp_enable = 1;
1533                                break;
1534                        case USB_DEVICE_A_HNP_SUPPORT:
1535                                dum->gadget.a_hnp_support = 1;
1536                                break;
1537                        case USB_DEVICE_A_ALT_HNP_SUPPORT:
1538                                dum->gadget.a_alt_hnp_support = 1;
1539                                break;
1540                        case USB_DEVICE_U1_ENABLE:
1541                                if (dummy_hcd_to_hcd(dum_hcd)->speed ==
1542                                    HCD_USB3)
1543                                        w_value = USB_DEV_STAT_U1_ENABLED;
1544                                else
1545                                        ret_val = -EOPNOTSUPP;
1546                                break;
1547                        case USB_DEVICE_U2_ENABLE:
1548                                if (dummy_hcd_to_hcd(dum_hcd)->speed ==
1549                                    HCD_USB3)
1550                                        w_value = USB_DEV_STAT_U2_ENABLED;
1551                                else
1552                                        ret_val = -EOPNOTSUPP;
1553                                break;
1554                        case USB_DEVICE_LTM_ENABLE:
1555                                if (dummy_hcd_to_hcd(dum_hcd)->speed ==
1556                                    HCD_USB3)
1557                                        w_value = USB_DEV_STAT_LTM_ENABLED;
1558                                else
1559                                        ret_val = -EOPNOTSUPP;
1560                                break;
1561                        default:
1562                                ret_val = -EOPNOTSUPP;
1563                        }
1564                        if (ret_val == 0) {
1565                                dum->devstatus |= (1 << w_value);
1566                                *status = 0;
1567                        }
1568                } else if (setup->bRequestType == Ep_Request) {
1569                        /* endpoint halt */
1570                        ep2 = find_endpoint(dum, w_index);
1571                        if (!ep2 || ep2->ep.name == ep0name) {
1572                                ret_val = -EOPNOTSUPP;
1573                                break;
1574                        }
1575                        ep2->halted = 1;
1576                        ret_val = 0;
1577                        *status = 0;
1578                }
1579                break;
1580        case USB_REQ_CLEAR_FEATURE:
1581                if (setup->bRequestType == Dev_Request) {
1582                        ret_val = 0;
1583                        switch (w_value) {
1584                        case USB_DEVICE_REMOTE_WAKEUP:
1585                                w_value = USB_DEVICE_REMOTE_WAKEUP;
1586                                break;
1587                        case USB_DEVICE_U1_ENABLE:
1588                                if (dummy_hcd_to_hcd(dum_hcd)->speed ==
1589                                    HCD_USB3)
1590                                        w_value = USB_DEV_STAT_U1_ENABLED;
1591                                else
1592                                        ret_val = -EOPNOTSUPP;
1593                                break;
1594                        case USB_DEVICE_U2_ENABLE:
1595                                if (dummy_hcd_to_hcd(dum_hcd)->speed ==
1596                                    HCD_USB3)
1597                                        w_value = USB_DEV_STAT_U2_ENABLED;
1598                                else
1599                                        ret_val = -EOPNOTSUPP;
1600                                break;
1601                        case USB_DEVICE_LTM_ENABLE:
1602                                if (dummy_hcd_to_hcd(dum_hcd)->speed ==
1603                                    HCD_USB3)
1604                                        w_value = USB_DEV_STAT_LTM_ENABLED;
1605                                else
1606                                        ret_val = -EOPNOTSUPP;
1607                                break;
1608                        default:
1609                                ret_val = -EOPNOTSUPP;
1610                                break;
1611                        }
1612                        if (ret_val == 0) {
1613                                dum->devstatus &= ~(1 << w_value);
1614                                *status = 0;
1615                        }
1616                } else if (setup->bRequestType == Ep_Request) {
1617                        /* endpoint halt */
1618                        ep2 = find_endpoint(dum, w_index);
1619                        if (!ep2) {
1620                                ret_val = -EOPNOTSUPP;
1621                                break;
1622                        }
1623                        if (!ep2->wedged)
1624                                ep2->halted = 0;
1625                        ret_val = 0;
1626                        *status = 0;
1627                }
1628                break;
1629        case USB_REQ_GET_STATUS:
1630                if (setup->bRequestType == Dev_InRequest
1631                                || setup->bRequestType == Intf_InRequest
1632                                || setup->bRequestType == Ep_InRequest) {
1633                        char *buf;
1634                        /*
1635                         * device: remote wakeup, selfpowered
1636                         * interface: nothing
1637                         * endpoint: halt
1638                         */
1639                        buf = (char *)urb->transfer_buffer;
1640                        if (urb->transfer_buffer_length > 0) {
1641                                if (setup->bRequestType == Ep_InRequest) {
1642                                        ep2 = find_endpoint(dum, w_index);
1643                                        if (!ep2) {
1644                                                ret_val = -EOPNOTSUPP;
1645                                                break;
1646                                        }
1647                                        buf[0] = ep2->halted;
1648                                } else if (setup->bRequestType ==
1649                                           Dev_InRequest) {
1650                                        buf[0] = (u8)dum->devstatus;
1651                                } else
1652                                        buf[0] = 0;
1653                        }
1654                        if (urb->transfer_buffer_length > 1)
1655                                buf[1] = 0;
1656                        urb->actual_length = min_t(u32, 2,
1657                                urb->transfer_buffer_length);
1658                        ret_val = 0;
1659                        *status = 0;
1660                }
1661                break;
1662        }
1663        return ret_val;
1664}
1665
1666/* drive both sides of the transfers; looks like irq handlers to
1667 * both drivers except the callbacks aren't in_irq().
1668 */
1669static void dummy_timer(unsigned long _dum_hcd)
1670{
1671        struct dummy_hcd        *dum_hcd = (struct dummy_hcd *) _dum_hcd;
1672        struct dummy            *dum = dum_hcd->dum;
1673        struct urbp             *urbp, *tmp;
1674        unsigned long           flags;
1675        int                     limit, total;
1676        int                     i;
1677
1678        /* simplistic model for one frame's bandwidth */
1679        switch (dum->gadget.speed) {
1680        case USB_SPEED_LOW:
1681                total = 8/*bytes*/ * 12/*packets*/;
1682                break;
1683        case USB_SPEED_FULL:
1684                total = 64/*bytes*/ * 19/*packets*/;
1685                break;
1686        case USB_SPEED_HIGH:
1687                total = 512/*bytes*/ * 13/*packets*/ * 8/*uframes*/;
1688                break;
1689        case USB_SPEED_SUPER:
1690                /* Bus speed is 500000 bytes/ms, so use a little less */
1691                total = 490000;
1692                break;
1693        default:
1694                dev_err(dummy_dev(dum_hcd), "bogus device speed\n");
1695                return;
1696        }
1697
1698        /* FIXME if HZ != 1000 this will probably misbehave ... */
1699
1700        /* look at each urb queued by the host side driver */
1701        spin_lock_irqsave(&dum->lock, flags);
1702
1703        if (!dum_hcd->udev) {
1704                dev_err(dummy_dev(dum_hcd),
1705                                "timer fired with no URBs pending?\n");
1706                spin_unlock_irqrestore(&dum->lock, flags);
1707                return;
1708        }
1709
1710        for (i = 0; i < DUMMY_ENDPOINTS; i++) {
1711                if (!ep_name[i])
1712                        break;
1713                dum->ep[i].already_seen = 0;
1714        }
1715
1716restart:
1717        list_for_each_entry_safe(urbp, tmp, &dum_hcd->urbp_list, urbp_list) {
1718                struct urb              *urb;
1719                struct dummy_request    *req;
1720                u8                      address;
1721                struct dummy_ep         *ep = NULL;
1722                int                     type;
1723                int                     status = -EINPROGRESS;
1724
1725                urb = urbp->urb;
1726                if (urb->unlinked)
1727                        goto return_urb;
1728                else if (dum_hcd->rh_state != DUMMY_RH_RUNNING)
1729                        continue;
1730                type = usb_pipetype(urb->pipe);
1731
1732                /* used up this frame's non-periodic bandwidth?
1733                 * FIXME there's infinite bandwidth for control and
1734                 * periodic transfers ... unrealistic.
1735                 */
1736                if (total <= 0 && type == PIPE_BULK)
1737                        continue;
1738
1739                /* find the gadget's ep for this request (if configured) */
1740                address = usb_pipeendpoint (urb->pipe);
1741                if (usb_pipein(urb->pipe))
1742                        address |= USB_DIR_IN;
1743                ep = find_endpoint(dum, address);
1744                if (!ep) {
1745                        /* set_configuration() disagreement */
1746                        dev_dbg(dummy_dev(dum_hcd),
1747                                "no ep configured for urb %p\n",
1748                                urb);
1749                        status = -EPROTO;
1750                        goto return_urb;
1751                }
1752
1753                if (ep->already_seen)
1754                        continue;
1755                ep->already_seen = 1;
1756                if (ep == &dum->ep[0] && urb->error_count) {
1757                        ep->setup_stage = 1;    /* a new urb */
1758                        urb->error_count = 0;
1759                }
1760                if (ep->halted && !ep->setup_stage) {
1761                        /* NOTE: must not be iso! */
1762                        dev_dbg(dummy_dev(dum_hcd), "ep %s halted, urb %p\n",
1763                                        ep->ep.name, urb);
1764                        status = -EPIPE;
1765                        goto return_urb;
1766                }
1767                /* FIXME make sure both ends agree on maxpacket */
1768
1769                /* handle control requests */
1770                if (ep == &dum->ep[0] && ep->setup_stage) {
1771                        struct usb_ctrlrequest          setup;
1772                        int                             value = 1;
1773
1774                        setup = *(struct usb_ctrlrequest *) urb->setup_packet;
1775                        /* paranoia, in case of stale queued data */
1776                        list_for_each_entry(req, &ep->queue, queue) {
1777                                list_del_init(&req->queue);
1778                                req->req.status = -EOVERFLOW;
1779                                dev_dbg(udc_dev(dum), "stale req = %p\n",
1780                                                req);
1781
1782                                spin_unlock(&dum->lock);
1783                                req->req.complete(&ep->ep, &req->req);
1784                                spin_lock(&dum->lock);
1785                                ep->already_seen = 0;
1786                                goto restart;
1787                        }
1788
1789                        /* gadget driver never sees set_address or operations
1790                         * on standard feature flags.  some hardware doesn't
1791                         * even expose them.
1792                         */
1793                        ep->last_io = jiffies;
1794                        ep->setup_stage = 0;
1795                        ep->halted = 0;
1796
1797                        value = handle_control_request(dum_hcd, urb, &setup,
1798                                                       &status);
1799
1800                        /* gadget driver handles all other requests.  block
1801                         * until setup() returns; no reentrancy issues etc.
1802                         */
1803                        if (value > 0) {
1804                                spin_unlock(&dum->lock);
1805                                value = dum->driver->setup(&dum->gadget,
1806                                                &setup);
1807                                spin_lock(&dum->lock);
1808
1809                                if (value >= 0) {
1810                                        /* no delays (max 64KB data stage) */
1811                                        limit = 64*1024;
1812                                        goto treat_control_like_bulk;
1813                                }
1814                                /* error, see below */
1815                        }
1816
1817                        if (value < 0) {
1818                                if (value != -EOPNOTSUPP)
1819                                        dev_dbg(udc_dev(dum),
1820                                                "setup --> %d\n",
1821                                                value);
1822                                status = -EPIPE;
1823                                urb->actual_length = 0;
1824                        }
1825
1826                        goto return_urb;
1827                }
1828
1829                /* non-control requests */
1830                limit = total;
1831                switch (usb_pipetype(urb->pipe)) {
1832                case PIPE_ISOCHRONOUS:
1833                        /* FIXME is it urb->interval since the last xfer?
1834                         * use urb->iso_frame_desc[i].
1835                         * complete whether or not ep has requests queued.
1836                         * report random errors, to debug drivers.
1837                         */
1838                        limit = max(limit, periodic_bytes(dum, ep));
1839                        status = -ENOSYS;
1840                        break;
1841
1842                case PIPE_INTERRUPT:
1843                        /* FIXME is it urb->interval since the last xfer?
1844                         * this almost certainly polls too fast.
1845                         */
1846                        limit = max(limit, periodic_bytes(dum, ep));
1847                        /* FALLTHROUGH */
1848
1849                default:
1850treat_control_like_bulk:
1851                        ep->last_io = jiffies;
1852                        total = transfer(dum_hcd, urb, ep, limit, &status);
1853                        break;
1854                }
1855
1856                /* incomplete transfer? */
1857                if (status == -EINPROGRESS)
1858                        continue;
1859
1860return_urb:
1861                list_del(&urbp->urbp_list);
1862                kfree(urbp);
1863                if (ep)
1864                        ep->already_seen = ep->setup_stage = 0;
1865
1866                usb_hcd_unlink_urb_from_ep(dummy_hcd_to_hcd(dum_hcd), urb);
1867                spin_unlock(&dum->lock);
1868                usb_hcd_giveback_urb(dummy_hcd_to_hcd(dum_hcd), urb, status);
1869                spin_lock(&dum->lock);
1870
1871                goto restart;
1872        }
1873
1874        if (list_empty(&dum_hcd->urbp_list)) {
1875                usb_put_dev(dum_hcd->udev);
1876                dum_hcd->udev = NULL;
1877        } else if (dum_hcd->rh_state == DUMMY_RH_RUNNING) {
1878                /* want a 1 msec delay here */
1879                mod_timer(&dum_hcd->timer, jiffies + msecs_to_jiffies(1));
1880        }
1881
1882        spin_unlock_irqrestore(&dum->lock, flags);
1883}
1884
1885/*-------------------------------------------------------------------------*/
1886
1887#define PORT_C_MASK \
1888        ((USB_PORT_STAT_C_CONNECTION \
1889        | USB_PORT_STAT_C_ENABLE \
1890        | USB_PORT_STAT_C_SUSPEND \
1891        | USB_PORT_STAT_C_OVERCURRENT \
1892        | USB_PORT_STAT_C_RESET) << 16)
1893
1894static int dummy_hub_status(struct usb_hcd *hcd, char *buf)
1895{
1896        struct dummy_hcd        *dum_hcd;
1897        unsigned long           flags;
1898        int                     retval = 0;
1899
1900        dum_hcd = hcd_to_dummy_hcd(hcd);
1901
1902        spin_lock_irqsave(&dum_hcd->dum->lock, flags);
1903        if (!HCD_HW_ACCESSIBLE(hcd))
1904                goto done;
1905
1906        if (dum_hcd->resuming && time_after_eq(jiffies, dum_hcd->re_timeout)) {
1907                dum_hcd->port_status |= (USB_PORT_STAT_C_SUSPEND << 16);
1908                dum_hcd->port_status &= ~USB_PORT_STAT_SUSPEND;
1909                set_link_state(dum_hcd);
1910        }
1911
1912        if ((dum_hcd->port_status & PORT_C_MASK) != 0) {
1913                *buf = (1 << 1);
1914                dev_dbg(dummy_dev(dum_hcd), "port status 0x%08x has changes\n",
1915                                dum_hcd->port_status);
1916                retval = 1;
1917                if (dum_hcd->rh_state == DUMMY_RH_SUSPENDED)
1918                        usb_hcd_resume_root_hub(hcd);
1919        }
1920done:
1921        spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
1922        return retval;
1923}
1924
1925/* usb 3.0 root hub device descriptor */
1926struct {
1927        struct usb_bos_descriptor bos;
1928        struct usb_ss_cap_descriptor ss_cap;
1929} __packed usb3_bos_desc = {
1930
1931        .bos = {
1932                .bLength                = USB_DT_BOS_SIZE,
1933                .bDescriptorType        = USB_DT_BOS,
1934                .wTotalLength           = cpu_to_le16(sizeof(usb3_bos_desc)),
1935                .bNumDeviceCaps         = 1,
1936        },
1937        .ss_cap = {
1938                .bLength                = USB_DT_USB_SS_CAP_SIZE,
1939                .bDescriptorType        = USB_DT_DEVICE_CAPABILITY,
1940                .bDevCapabilityType     = USB_SS_CAP_TYPE,
1941                .wSpeedSupported        = cpu_to_le16(USB_5GBPS_OPERATION),
1942                .bFunctionalitySupport  = ilog2(USB_5GBPS_OPERATION),
1943        },
1944};
1945
1946static inline void
1947ss_hub_descriptor(struct usb_hub_descriptor *desc)
1948{
1949        memset(desc, 0, sizeof *desc);
1950        desc->bDescriptorType = 0x2a;
1951        desc->bDescLength = 12;
1952        desc->wHubCharacteristics = cpu_to_le16(0x0001);
1953        desc->bNbrPorts = 1;
1954        desc->u.ss.bHubHdrDecLat = 0x04; /* Worst case: 0.4 micro sec*/
1955        desc->u.ss.DeviceRemovable = 0xffff;
1956}
1957
1958static inline void hub_descriptor(struct usb_hub_descriptor *desc)
1959{
1960        memset(desc, 0, sizeof *desc);
1961        desc->bDescriptorType = 0x29;
1962        desc->bDescLength = 9;
1963        desc->wHubCharacteristics = cpu_to_le16(0x0001);
1964        desc->bNbrPorts = 1;
1965        desc->u.hs.DeviceRemovable[0] = 0xff;
1966        desc->u.hs.DeviceRemovable[1] = 0xff;
1967}
1968
1969static int dummy_hub_control(
1970        struct usb_hcd  *hcd,
1971        u16             typeReq,
1972        u16             wValue,
1973        u16             wIndex,
1974        char            *buf,
1975        u16             wLength
1976) {
1977        struct dummy_hcd *dum_hcd;
1978        int             retval = 0;
1979        unsigned long   flags;
1980
1981        if (!HCD_HW_ACCESSIBLE(hcd))
1982                return -ETIMEDOUT;
1983
1984        dum_hcd = hcd_to_dummy_hcd(hcd);
1985
1986        spin_lock_irqsave(&dum_hcd->dum->lock, flags);
1987        switch (typeReq) {
1988        case ClearHubFeature:
1989                break;
1990        case ClearPortFeature:
1991                switch (wValue) {
1992                case USB_PORT_FEAT_SUSPEND:
1993                        if (hcd->speed == HCD_USB3) {
1994                                dev_dbg(dummy_dev(dum_hcd),
1995                                         "USB_PORT_FEAT_SUSPEND req not "
1996                                         "supported for USB 3.0 roothub\n");
1997                                goto error;
1998                        }
1999                        if (dum_hcd->port_status & USB_PORT_STAT_SUSPEND) {
2000                                /* 20msec resume signaling */
2001                                dum_hcd->resuming = 1;
2002                                dum_hcd->re_timeout = jiffies +
2003                                                msecs_to_jiffies(20);
2004                        }
2005                        break;
2006                case USB_PORT_FEAT_POWER:
2007                        if (hcd->speed == HCD_USB3) {
2008                                if (dum_hcd->port_status & USB_PORT_STAT_POWER)
2009                                        dev_dbg(dummy_dev(dum_hcd),
2010                                                "power-off\n");
2011                        } else
2012                                if (dum_hcd->port_status &
2013                                                        USB_SS_PORT_STAT_POWER)
2014                                        dev_dbg(dummy_dev(dum_hcd),
2015                                                "power-off\n");
2016                        /* FALLS THROUGH */
2017                default:
2018                        dum_hcd->port_status &= ~(1 << wValue);
2019                        set_link_state(dum_hcd);
2020                }
2021                break;
2022        case GetHubDescriptor:
2023                if (hcd->speed == HCD_USB3 &&
2024                                (wLength < USB_DT_SS_HUB_SIZE ||
2025                                 wValue != (USB_DT_SS_HUB << 8))) {
2026                        dev_dbg(dummy_dev(dum_hcd),
2027                                "Wrong hub descriptor type for "
2028                                "USB 3.0 roothub.\n");
2029                        goto error;
2030                }
2031                if (hcd->speed == HCD_USB3)
2032                        ss_hub_descriptor((struct usb_hub_descriptor *) buf);
2033                else
2034                        hub_descriptor((struct usb_hub_descriptor *) buf);
2035                break;
2036
2037        case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
2038                if (hcd->speed != HCD_USB3)
2039                        goto error;
2040
2041                if ((wValue >> 8) != USB_DT_BOS)
2042                        goto error;
2043
2044                memcpy(buf, &usb3_bos_desc, sizeof(usb3_bos_desc));
2045                retval = sizeof(usb3_bos_desc);
2046                break;
2047
2048        case GetHubStatus:
2049                *(__le32 *) buf = cpu_to_le32(0);
2050                break;
2051        case GetPortStatus:
2052                if (wIndex != 1)
2053                        retval = -EPIPE;
2054
2055                /* whoever resets or resumes must GetPortStatus to
2056                 * complete it!!
2057                 */
2058                if (dum_hcd->resuming &&
2059                                time_after_eq(jiffies, dum_hcd->re_timeout)) {
2060                        dum_hcd->port_status |= (USB_PORT_STAT_C_SUSPEND << 16);
2061                        dum_hcd->port_status &= ~USB_PORT_STAT_SUSPEND;
2062                }
2063                if ((dum_hcd->port_status & USB_PORT_STAT_RESET) != 0 &&
2064                                time_after_eq(jiffies, dum_hcd->re_timeout)) {
2065                        dum_hcd->port_status |= (USB_PORT_STAT_C_RESET << 16);
2066                        dum_hcd->port_status &= ~USB_PORT_STAT_RESET;
2067                        if (dum_hcd->dum->pullup) {
2068                                dum_hcd->port_status |= USB_PORT_STAT_ENABLE;
2069
2070                                if (hcd->speed < HCD_USB3) {
2071                                        switch (dum_hcd->dum->gadget.speed) {
2072                                        case USB_SPEED_HIGH:
2073                                                dum_hcd->port_status |=
2074                                                      USB_PORT_STAT_HIGH_SPEED;
2075                                                break;
2076                                        case USB_SPEED_LOW:
2077                                                dum_hcd->dum->gadget.ep0->
2078                                                        maxpacket = 8;
2079                                                dum_hcd->port_status |=
2080                                                        USB_PORT_STAT_LOW_SPEED;
2081                                                break;
2082                                        default:
2083                                                dum_hcd->dum->gadget.speed =
2084                                                        USB_SPEED_FULL;
2085                                                break;
2086                                        }
2087                                }
2088                        }
2089                }
2090                set_link_state(dum_hcd);
2091                ((__le16 *) buf)[0] = cpu_to_le16(dum_hcd->port_status);
2092                ((__le16 *) buf)[1] = cpu_to_le16(dum_hcd->port_status >> 16);
2093                break;
2094        case SetHubFeature:
2095                retval = -EPIPE;
2096                break;
2097        case SetPortFeature:
2098                switch (wValue) {
2099                case USB_PORT_FEAT_LINK_STATE:
2100                        if (hcd->speed != HCD_USB3) {
2101                                dev_dbg(dummy_dev(dum_hcd),
2102                                         "USB_PORT_FEAT_LINK_STATE req not "
2103                                         "supported for USB 2.0 roothub\n");
2104                                goto error;
2105                        }
2106                        /*
2107                         * Since this is dummy we don't have an actual link so
2108                         * there is nothing to do for the SET_LINK_STATE cmd
2109                         */
2110                        break;
2111                case USB_PORT_FEAT_U1_TIMEOUT:
2112                case USB_PORT_FEAT_U2_TIMEOUT:
2113                        /* TODO: add suspend/resume support! */
2114                        if (hcd->speed != HCD_USB3) {
2115                                dev_dbg(dummy_dev(dum_hcd),
2116                                         "USB_PORT_FEAT_U1/2_TIMEOUT req not "
2117                                         "supported for USB 2.0 roothub\n");
2118                                goto error;
2119                        }
2120                        break;
2121                case USB_PORT_FEAT_SUSPEND:
2122                        /* Applicable only for USB2.0 hub */
2123                        if (hcd->speed == HCD_USB3) {
2124                                dev_dbg(dummy_dev(dum_hcd),
2125                                         "USB_PORT_FEAT_SUSPEND req not "
2126                                         "supported for USB 3.0 roothub\n");
2127                                goto error;
2128                        }
2129                        if (dum_hcd->active) {
2130                                dum_hcd->port_status |= USB_PORT_STAT_SUSPEND;
2131
2132                                /* HNP would happen here; for now we
2133                                 * assume b_bus_req is always true.
2134                                 */
2135                                set_link_state(dum_hcd);
2136                                if (((1 << USB_DEVICE_B_HNP_ENABLE)
2137                                                & dum_hcd->dum->devstatus) != 0)
2138                                        dev_dbg(dummy_dev(dum_hcd),
2139                                                        "no HNP yet!\n");
2140                        }
2141                        break;
2142                case USB_PORT_FEAT_POWER:
2143                        if (hcd->speed == HCD_USB3)
2144                                dum_hcd->port_status |= USB_SS_PORT_STAT_POWER;
2145                        else
2146                                dum_hcd->port_status |= USB_PORT_STAT_POWER;
2147                        set_link_state(dum_hcd);
2148                        break;
2149                case USB_PORT_FEAT_BH_PORT_RESET:
2150                        /* Applicable only for USB3.0 hub */
2151                        if (hcd->speed != HCD_USB3) {
2152                                dev_dbg(dummy_dev(dum_hcd),
2153                                         "USB_PORT_FEAT_BH_PORT_RESET req not "
2154                                         "supported for USB 2.0 roothub\n");
2155                                goto error;
2156                        }
2157                        /* FALLS THROUGH */
2158                case USB_PORT_FEAT_RESET:
2159                        /* if it's already enabled, disable */
2160                        if (hcd->speed == HCD_USB3) {
2161                                dum_hcd->port_status = 0;
2162                                dum_hcd->port_status =
2163                                        (USB_SS_PORT_STAT_POWER |
2164                                         USB_PORT_STAT_CONNECTION |
2165                                         USB_PORT_STAT_RESET);
2166                        } else
2167                                dum_hcd->port_status &= ~(USB_PORT_STAT_ENABLE
2168                                        | USB_PORT_STAT_LOW_SPEED
2169                                        | USB_PORT_STAT_HIGH_SPEED);
2170                        /*
2171                         * We want to reset device status. All but the
2172                         * Self powered feature
2173                         */
2174                        dum_hcd->dum->devstatus &=
2175                                (1 << USB_DEVICE_SELF_POWERED);
2176                        /*
2177                         * FIXME USB3.0: what is the correct reset signaling
2178                         * interval? Is it still 50msec as for HS?
2179                         */
2180                        dum_hcd->re_timeout = jiffies + msecs_to_jiffies(50);
2181                        /* FALLS THROUGH */
2182                default:
2183                        if (hcd->speed == HCD_USB3) {
2184                                if ((dum_hcd->port_status &
2185                                     USB_SS_PORT_STAT_POWER) != 0) {
2186                                        dum_hcd->port_status |= (1 << wValue);
2187                                        set_link_state(dum_hcd);
2188                                }
2189                        } else
2190                                if ((dum_hcd->port_status &
2191                                     USB_PORT_STAT_POWER) != 0) {
2192                                        dum_hcd->port_status |= (1 << wValue);
2193                                        set_link_state(dum_hcd);
2194                                }
2195                }
2196                break;
2197        case GetPortErrorCount:
2198                if (hcd->speed != HCD_USB3) {
2199                        dev_dbg(dummy_dev(dum_hcd),
2200                                 "GetPortErrorCount req not "
2201                                 "supported for USB 2.0 roothub\n");
2202                        goto error;
2203                }
2204                /* We'll always return 0 since this is a dummy hub */
2205                *(__le32 *) buf = cpu_to_le32(0);
2206                break;
2207        case SetHubDepth:
2208                if (hcd->speed != HCD_USB3) {
2209                        dev_dbg(dummy_dev(dum_hcd),
2210                                 "SetHubDepth req not supported for "
2211                                 "USB 2.0 roothub\n");
2212                        goto error;
2213                }
2214                break;
2215        default:
2216                dev_dbg(dummy_dev(dum_hcd),
2217                        "hub control req%04x v%04x i%04x l%d\n",
2218                        typeReq, wValue, wIndex, wLength);
2219error:
2220                /* "protocol stall" on error */
2221                retval = -EPIPE;
2222        }
2223        spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
2224
2225        if ((dum_hcd->port_status & PORT_C_MASK) != 0)
2226                usb_hcd_poll_rh_status(hcd);
2227        return retval;
2228}
2229
2230static int dummy_bus_suspend(struct usb_hcd *hcd)
2231{
2232        struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd);
2233
2234        dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__);
2235
2236        spin_lock_irq(&dum_hcd->dum->lock);
2237        dum_hcd->rh_state = DUMMY_RH_SUSPENDED;
2238        set_link_state(dum_hcd);
2239        hcd->state = HC_STATE_SUSPENDED;
2240        spin_unlock_irq(&dum_hcd->dum->lock);
2241        return 0;
2242}
2243
2244static int dummy_bus_resume(struct usb_hcd *hcd)
2245{
2246        struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd);
2247        int rc = 0;
2248
2249        dev_dbg(&hcd->self.root_hub->dev, "%s\n", __func__);
2250
2251        spin_lock_irq(&dum_hcd->dum->lock);
2252        if (!HCD_HW_ACCESSIBLE(hcd)) {
2253                rc = -ESHUTDOWN;
2254        } else {
2255                dum_hcd->rh_state = DUMMY_RH_RUNNING;
2256                set_link_state(dum_hcd);
2257                if (!list_empty(&dum_hcd->urbp_list))
2258                        mod_timer(&dum_hcd->timer, jiffies);
2259                hcd->state = HC_STATE_RUNNING;
2260        }
2261        spin_unlock_irq(&dum_hcd->dum->lock);
2262        return rc;
2263}
2264
2265/*-------------------------------------------------------------------------*/
2266
2267static inline ssize_t show_urb(char *buf, size_t size, struct urb *urb)
2268{
2269        int ep = usb_pipeendpoint(urb->pipe);
2270
2271        return snprintf(buf, size,
2272                "urb/%p %s ep%d%s%s len %d/%d\n",
2273                urb,
2274                ({ char *s;
2275                switch (urb->dev->speed) {
2276                case USB_SPEED_LOW:
2277                        s = "ls";
2278                        break;
2279                case USB_SPEED_FULL:
2280                        s = "fs";
2281                        break;
2282                case USB_SPEED_HIGH:
2283                        s = "hs";
2284                        break;
2285                case USB_SPEED_SUPER:
2286                        s = "ss";
2287                        break;
2288                default:
2289                        s = "?";
2290                        break;
2291                 }; s; }),
2292                ep, ep ? (usb_pipein(urb->pipe) ? "in" : "out") : "",
2293                ({ char *s; \
2294                switch (usb_pipetype(urb->pipe)) { \
2295                case PIPE_CONTROL: \
2296                        s = ""; \
2297                        break; \
2298                case PIPE_BULK: \
2299                        s = "-bulk"; \
2300                        break; \
2301                case PIPE_INTERRUPT: \
2302                        s = "-int"; \
2303                        break; \
2304                default: \
2305                        s = "-iso"; \
2306                        break; \
2307                }; s; }),
2308                urb->actual_length, urb->transfer_buffer_length);
2309}
2310
2311static ssize_t show_urbs(struct device *dev, struct device_attribute *attr,
2312                char *buf)
2313{
2314        struct usb_hcd          *hcd = dev_get_drvdata(dev);
2315        struct dummy_hcd        *dum_hcd = hcd_to_dummy_hcd(hcd);
2316        struct urbp             *urbp;
2317        size_t                  size = 0;
2318        unsigned long           flags;
2319
2320        spin_lock_irqsave(&dum_hcd->dum->lock, flags);
2321        list_for_each_entry(urbp, &dum_hcd->urbp_list, urbp_list) {
2322                size_t          temp;
2323
2324                temp = show_urb(buf, PAGE_SIZE - size, urbp->urb);
2325                buf += temp;
2326                size += temp;
2327        }
2328        spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
2329
2330        return size;
2331}
2332static DEVICE_ATTR(urbs, S_IRUGO, show_urbs, NULL);
2333
2334static int dummy_start_ss(struct dummy_hcd *dum_hcd)
2335{
2336        init_timer(&dum_hcd->timer);
2337        dum_hcd->timer.function = dummy_timer;
2338        dum_hcd->timer.data = (unsigned long)dum_hcd;
2339        dum_hcd->rh_state = DUMMY_RH_RUNNING;
2340        dum_hcd->stream_en_ep = 0;
2341        INIT_LIST_HEAD(&dum_hcd->urbp_list);
2342        dummy_hcd_to_hcd(dum_hcd)->power_budget = POWER_BUDGET;
2343        dummy_hcd_to_hcd(dum_hcd)->state = HC_STATE_RUNNING;
2344        dummy_hcd_to_hcd(dum_hcd)->uses_new_polling = 1;
2345#ifdef CONFIG_USB_OTG
2346        dummy_hcd_to_hcd(dum_hcd)->self.otg_port = 1;
2347#endif
2348        return 0;
2349
2350        /* FIXME 'urbs' should be a per-device thing, maybe in usbcore */
2351        return device_create_file(dummy_dev(dum_hcd), &dev_attr_urbs);
2352}
2353
2354static int dummy_start(struct usb_hcd *hcd)
2355{
2356        struct dummy_hcd        *dum_hcd = hcd_to_dummy_hcd(hcd);
2357
2358        /*
2359         * MASTER side init ... we emulate a root hub that'll only ever
2360         * talk to one device (the slave side).  Also appears in sysfs,
2361         * just like more familiar pci-based HCDs.
2362         */
2363        if (!usb_hcd_is_primary_hcd(hcd))
2364                return dummy_start_ss(dum_hcd);
2365
2366        spin_lock_init(&dum_hcd->dum->lock);
2367        init_timer(&dum_hcd->timer);
2368        dum_hcd->timer.function = dummy_timer;
2369        dum_hcd->timer.data = (unsigned long)dum_hcd;
2370        dum_hcd->rh_state = DUMMY_RH_RUNNING;
2371
2372        INIT_LIST_HEAD(&dum_hcd->urbp_list);
2373
2374        hcd->power_budget = POWER_BUDGET;
2375        hcd->state = HC_STATE_RUNNING;
2376        hcd->uses_new_polling = 1;
2377
2378#ifdef CONFIG_USB_OTG
2379        hcd->self.otg_port = 1;
2380#endif
2381
2382        /* FIXME 'urbs' should be a per-device thing, maybe in usbcore */
2383        return device_create_file(dummy_dev(dum_hcd), &dev_attr_urbs);
2384}
2385
2386static void dummy_stop(struct usb_hcd *hcd)
2387{
2388        struct dummy            *dum;
2389
2390        dum = hcd_to_dummy_hcd(hcd)->dum;
2391        device_remove_file(dummy_dev(hcd_to_dummy_hcd(hcd)), &dev_attr_urbs);
2392        usb_gadget_unregister_driver(dum->driver);
2393        dev_info(dummy_dev(hcd_to_dummy_hcd(hcd)), "stopped\n");
2394}
2395
2396/*-------------------------------------------------------------------------*/
2397
2398static int dummy_h_get_frame(struct usb_hcd *hcd)
2399{
2400        return dummy_g_get_frame(NULL);
2401}
2402
2403static int dummy_setup(struct usb_hcd *hcd)
2404{
2405        struct dummy *dum;
2406
2407        dum = *((void **)dev_get_platdata(hcd->self.controller));
2408        hcd->self.sg_tablesize = ~0;
2409        if (usb_hcd_is_primary_hcd(hcd)) {
2410                dum->hs_hcd = hcd_to_dummy_hcd(hcd);
2411                dum->hs_hcd->dum = dum;
2412                /*
2413                 * Mark the first roothub as being USB 2.0.
2414                 * The USB 3.0 roothub will be registered later by
2415                 * dummy_hcd_probe()
2416                 */
2417                hcd->speed = HCD_USB2;
2418                hcd->self.root_hub->speed = USB_SPEED_HIGH;
2419        } else {
2420                dum->ss_hcd = hcd_to_dummy_hcd(hcd);
2421                dum->ss_hcd->dum = dum;
2422                hcd->speed = HCD_USB3;
2423                hcd->self.root_hub->speed = USB_SPEED_SUPER;
2424        }
2425        return 0;
2426}
2427
2428/* Change a group of bulk endpoints to support multiple stream IDs */
2429static int dummy_alloc_streams(struct usb_hcd *hcd, struct usb_device *udev,
2430        struct usb_host_endpoint **eps, unsigned int num_eps,
2431        unsigned int num_streams, gfp_t mem_flags)
2432{
2433        struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd);
2434        unsigned long flags;
2435        int max_stream;
2436        int ret_streams = num_streams;
2437        unsigned int index;
2438        unsigned int i;
2439
2440        if (!num_eps)
2441                return -EINVAL;
2442
2443        spin_lock_irqsave(&dum_hcd->dum->lock, flags);
2444        for (i = 0; i < num_eps; i++) {
2445                index = dummy_get_ep_idx(&eps[i]->desc);
2446                if ((1 << index) & dum_hcd->stream_en_ep) {
2447                        ret_streams = -EINVAL;
2448                        goto out;
2449                }
2450                max_stream = usb_ss_max_streams(&eps[i]->ss_ep_comp);
2451                if (!max_stream) {
2452                        ret_streams = -EINVAL;
2453                        goto out;
2454                }
2455                if (max_stream < ret_streams) {
2456                        dev_dbg(dummy_dev(dum_hcd), "Ep 0x%x only supports %u "
2457                                        "stream IDs.\n",
2458                                        eps[i]->desc.bEndpointAddress,
2459                                        max_stream);
2460                        ret_streams = max_stream;
2461                }
2462        }
2463
2464        for (i = 0; i < num_eps; i++) {
2465                index = dummy_get_ep_idx(&eps[i]->desc);
2466                dum_hcd->stream_en_ep |= 1 << index;
2467                set_max_streams_for_pipe(dum_hcd,
2468                                usb_endpoint_num(&eps[i]->desc), ret_streams);
2469        }
2470out:
2471        spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
2472        return ret_streams;
2473}
2474
2475/* Reverts a group of bulk endpoints back to not using stream IDs. */
2476static int dummy_free_streams(struct usb_hcd *hcd, struct usb_device *udev,
2477        struct usb_host_endpoint **eps, unsigned int num_eps,
2478        gfp_t mem_flags)
2479{
2480        struct dummy_hcd *dum_hcd = hcd_to_dummy_hcd(hcd);
2481        unsigned long flags;
2482        int ret;
2483        unsigned int index;
2484        unsigned int i;
2485
2486        spin_lock_irqsave(&dum_hcd->dum->lock, flags);
2487        for (i = 0; i < num_eps; i++) {
2488                index = dummy_get_ep_idx(&eps[i]->desc);
2489                if (!((1 << index) & dum_hcd->stream_en_ep)) {
2490                        ret = -EINVAL;
2491                        goto out;
2492                }
2493        }
2494
2495        for (i = 0; i < num_eps; i++) {
2496                index = dummy_get_ep_idx(&eps[i]->desc);
2497                dum_hcd->stream_en_ep &= ~(1 << index);
2498                set_max_streams_for_pipe(dum_hcd,
2499                                usb_endpoint_num(&eps[i]->desc), 0);
2500        }
2501        ret = 0;
2502out:
2503        spin_unlock_irqrestore(&dum_hcd->dum->lock, flags);
2504        return ret;
2505}
2506
2507static struct hc_driver dummy_hcd = {
2508        .description =          (char *) driver_name,
2509        .product_desc =         "Dummy host controller",
2510        .hcd_priv_size =        sizeof(struct dummy_hcd),
2511
2512        .flags =                HCD_USB3 | HCD_SHARED,
2513
2514        .reset =                dummy_setup,
2515        .start =                dummy_start,
2516        .stop =                 dummy_stop,
2517
2518        .urb_enqueue =          dummy_urb_enqueue,
2519        .urb_dequeue =          dummy_urb_dequeue,
2520
2521        .get_frame_number =     dummy_h_get_frame,
2522
2523        .hub_status_data =      dummy_hub_status,
2524        .hub_control =          dummy_hub_control,
2525        .bus_suspend =          dummy_bus_suspend,
2526        .bus_resume =           dummy_bus_resume,
2527
2528        .alloc_streams =        dummy_alloc_streams,
2529        .free_streams =         dummy_free_streams,
2530};
2531
2532static int dummy_hcd_probe(struct platform_device *pdev)
2533{
2534        struct dummy            *dum;
2535        struct usb_hcd          *hs_hcd;
2536        struct usb_hcd          *ss_hcd;
2537        int                     retval;
2538
2539        dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
2540        dum = *((void **)dev_get_platdata(&pdev->dev));
2541
2542        if (!mod_data.is_super_speed)
2543                dummy_hcd.flags = HCD_USB2;
2544        hs_hcd = usb_create_hcd(&dummy_hcd, &pdev->dev, dev_name(&pdev->dev));
2545        if (!hs_hcd)
2546                return -ENOMEM;
2547        hs_hcd->has_tt = 1;
2548
2549        retval = usb_add_hcd(hs_hcd, 0, 0);
2550        if (retval)
2551                goto put_usb2_hcd;
2552
2553        if (mod_data.is_super_speed) {
2554                ss_hcd = usb_create_shared_hcd(&dummy_hcd, &pdev->dev,
2555                                        dev_name(&pdev->dev), hs_hcd);
2556                if (!ss_hcd) {
2557                        retval = -ENOMEM;
2558                        goto dealloc_usb2_hcd;
2559                }
2560
2561                retval = usb_add_hcd(ss_hcd, 0, 0);
2562                if (retval)
2563                        goto put_usb3_hcd;
2564        }
2565        return 0;
2566
2567put_usb3_hcd:
2568        usb_put_hcd(ss_hcd);
2569dealloc_usb2_hcd:
2570        usb_remove_hcd(hs_hcd);
2571put_usb2_hcd:
2572        usb_put_hcd(hs_hcd);
2573        dum->hs_hcd = dum->ss_hcd = NULL;
2574        return retval;
2575}
2576
2577static int dummy_hcd_remove(struct platform_device *pdev)
2578{
2579        struct dummy            *dum;
2580
2581        dum = hcd_to_dummy_hcd(platform_get_drvdata(pdev))->dum;
2582
2583        if (dum->ss_hcd) {
2584                usb_remove_hcd(dummy_hcd_to_hcd(dum->ss_hcd));
2585                usb_put_hcd(dummy_hcd_to_hcd(dum->ss_hcd));
2586        }
2587
2588        usb_remove_hcd(dummy_hcd_to_hcd(dum->hs_hcd));
2589        usb_put_hcd(dummy_hcd_to_hcd(dum->hs_hcd));
2590
2591        dum->hs_hcd = NULL;
2592        dum->ss_hcd = NULL;
2593
2594        return 0;
2595}
2596
2597static int dummy_hcd_suspend(struct platform_device *pdev, pm_message_t state)
2598{
2599        struct usb_hcd          *hcd;
2600        struct dummy_hcd        *dum_hcd;
2601        int                     rc = 0;
2602
2603        dev_dbg(&pdev->dev, "%s\n", __func__);
2604
2605        hcd = platform_get_drvdata(pdev);
2606        dum_hcd = hcd_to_dummy_hcd(hcd);
2607        if (dum_hcd->rh_state == DUMMY_RH_RUNNING) {
2608                dev_warn(&pdev->dev, "Root hub isn't suspended!\n");
2609                rc = -EBUSY;
2610        } else
2611                clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
2612        return rc;
2613}
2614
2615static int dummy_hcd_resume(struct platform_device *pdev)
2616{
2617        struct usb_hcd          *hcd;
2618
2619        dev_dbg(&pdev->dev, "%s\n", __func__);
2620
2621        hcd = platform_get_drvdata(pdev);
2622        set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
2623        usb_hcd_poll_rh_status(hcd);
2624        return 0;
2625}
2626
2627static struct platform_driver dummy_hcd_driver = {
2628        .probe          = dummy_hcd_probe,
2629        .remove         = dummy_hcd_remove,
2630        .suspend        = dummy_hcd_suspend,
2631        .resume         = dummy_hcd_resume,
2632        .driver         = {
2633                .name   = (char *) driver_name,
2634                .owner  = THIS_MODULE,
2635        },
2636};
2637
2638/*-------------------------------------------------------------------------*/
2639#define MAX_NUM_UDC     2
2640static struct platform_device *the_udc_pdev[MAX_NUM_UDC];
2641static struct platform_device *the_hcd_pdev[MAX_NUM_UDC];
2642
2643static int __init init(void)
2644{
2645        int     retval = -ENOMEM;
2646        int     i;
2647        struct  dummy *dum[MAX_NUM_UDC];
2648
2649        if (usb_disabled())
2650                return -ENODEV;
2651
2652        if (!mod_data.is_high_speed && mod_data.is_super_speed)
2653                return -EINVAL;
2654
2655        if (mod_data.num < 1 || mod_data.num > MAX_NUM_UDC) {
2656                pr_err("Number of emulated UDC must be in range of 1…%d\n",
2657                                MAX_NUM_UDC);
2658                return -EINVAL;
2659        }
2660
2661        for (i = 0; i < mod_data.num; i++) {
2662                the_hcd_pdev[i] = platform_device_alloc(driver_name, i);
2663                if (!the_hcd_pdev[i]) {
2664                        i--;
2665                        while (i >= 0)
2666                                platform_device_put(the_hcd_pdev[i--]);
2667                        return retval;
2668                }
2669        }
2670        for (i = 0; i < mod_data.num; i++) {
2671                the_udc_pdev[i] = platform_device_alloc(gadget_name, i);
2672                if (!the_udc_pdev[i]) {
2673                        i--;
2674                        while (i >= 0)
2675                                platform_device_put(the_udc_pdev[i--]);
2676                        goto err_alloc_udc;
2677                }
2678        }
2679        for (i = 0; i < mod_data.num; i++) {
2680                dum[i] = kzalloc(sizeof(struct dummy), GFP_KERNEL);
2681                if (!dum[i])
2682                        goto err_add_pdata;
2683                retval = platform_device_add_data(the_hcd_pdev[i], &dum[i],
2684                                sizeof(void *));
2685                if (retval)
2686                        goto err_add_pdata;
2687                retval = platform_device_add_data(the_udc_pdev[i], &dum[i],
2688                                sizeof(void *));
2689                if (retval)
2690                        goto err_add_pdata;
2691        }
2692
2693        retval = platform_driver_register(&dummy_hcd_driver);
2694        if (retval < 0)
2695                goto err_add_pdata;
2696        retval = platform_driver_register(&dummy_udc_driver);
2697        if (retval < 0)
2698                goto err_register_udc_driver;
2699
2700        for (i = 0; i < mod_data.num; i++) {
2701                retval = platform_device_add(the_hcd_pdev[i]);
2702                if (retval < 0) {
2703                        i--;
2704                        while (i >= 0)
2705                                platform_device_del(the_hcd_pdev[i--]);
2706                        goto err_add_hcd;
2707                }
2708        }
2709        for (i = 0; i < mod_data.num; i++) {
2710                if (!dum[i]->hs_hcd ||
2711                                (!dum[i]->ss_hcd && mod_data.is_super_speed)) {
2712                        /*
2713                         * The hcd was added successfully but its probe
2714                         * function failed for some reason.
2715                         */
2716                        retval = -EINVAL;
2717                        goto err_add_udc;
2718                }
2719        }
2720
2721        for (i = 0; i < mod_data.num; i++) {
2722                retval = platform_device_add(the_udc_pdev[i]);
2723                if (retval < 0) {
2724                        i--;
2725                        while (i >= 0)
2726                                platform_device_del(the_udc_pdev[i]);
2727                        goto err_add_udc;
2728                }
2729        }
2730
2731        for (i = 0; i < mod_data.num; i++) {
2732                if (!platform_get_drvdata(the_udc_pdev[i])) {
2733                        /*
2734                         * The udc was added successfully but its probe
2735                         * function failed for some reason.
2736                         */
2737                        retval = -EINVAL;
2738                        goto err_probe_udc;
2739                }
2740        }
2741        return retval;
2742
2743err_probe_udc:
2744        for (i = 0; i < mod_data.num; i++)
2745                platform_device_del(the_udc_pdev[i]);
2746err_add_udc:
2747        for (i = 0; i < mod_data.num; i++)
2748                platform_device_del(the_hcd_pdev[i]);
2749err_add_hcd:
2750        platform_driver_unregister(&dummy_udc_driver);
2751err_register_udc_driver:
2752        platform_driver_unregister(&dummy_hcd_driver);
2753err_add_pdata:
2754        for (i = 0; i < mod_data.num; i++)
2755                kfree(dum[i]);
2756        for (i = 0; i < mod_data.num; i++)
2757                platform_device_put(the_udc_pdev[i]);
2758err_alloc_udc:
2759        for (i = 0; i < mod_data.num; i++)
2760                platform_device_put(the_hcd_pdev[i]);
2761        return retval;
2762}
2763module_init(init);
2764
2765static void __exit cleanup(void)
2766{
2767        int i;
2768
2769        for (i = 0; i < mod_data.num; i++) {
2770                struct dummy *dum;
2771
2772                dum = *((void **)dev_get_platdata(&the_udc_pdev[i]->dev));
2773
2774                platform_device_unregister(the_udc_pdev[i]);
2775                platform_device_unregister(the_hcd_pdev[i]);
2776                kfree(dum);
2777        }
2778        platform_driver_unregister(&dummy_udc_driver);
2779        platform_driver_unregister(&dummy_hcd_driver);
2780}
2781module_exit(cleanup);
2782
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.