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 * This program is distributed in the hope that it will be useful,
  15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 * GNU General Public License for more details.
  18 *
  19 * You should have received a copy of the GNU General Public License
  20 * along with this program; if not, write to the Free Software
  21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22 */
  23
  24
  25/*
  26 * This exposes a device side "USB gadget" API, driven by requests to a
  27 * Linux-USB host controller driver.  USB traffic is simulated; there's
  28 * no need for USB hardware.  Use this with two other drivers:
  29 *
  30 *  - Gadget driver, responding to requests (slave);
  31 *  - Host-side device driver, as already familiar in Linux.
  32 *
  33 * Having this all in one kernel can help some stages of development,
  34 * bypassing some hardware (and driver) issues.  UML could help too.
  35 */
  36
  37#include <linux/module.h>
  38#include <linux/kernel.h>
  39#include <linux/delay.h>
  40#include <linux/ioport.h>
  41#include <linux/slab.h>
  42#include <linux/errno.h>
  43#include <linux/init.h>
  44#include <linux/timer.h>
  45#include <linux/list.h>
  46#include <linux/interrupt.h>
  47#include <linux/platform_device.h>
  48#include <linux/usb.h>
  49#include <linux/usb/gadget.h>
  50
  51#include <asm/byteorder.h>
  52#include <asm/io.h>
  53#include <asm/irq.h>
  54#include <asm/system.h>
  55#include <asm/unaligned.h>
  56
  57
  58#include "../core/hcd.h"
  59
  60
  61#define DRIVER_DESC     "USB Host+Gadget Emulator"
  62#define DRIVER_VERSION  "02 May 2005"
  63
  64#define POWER_BUDGET    500     /* in mA; use 8 for low-power port testing */
  65
  66static const char       driver_name [] = "dummy_hcd";
  67static const char       driver_desc [] = "USB Host+Gadget Emulator";
  68
  69static const char       gadget_name [] = "dummy_udc";
  70
  71MODULE_DESCRIPTION (DRIVER_DESC);
  72MODULE_AUTHOR ("David Brownell");
  73MODULE_LICENSE ("GPL");
  74
  75/*-------------------------------------------------------------------------*/
  76
  77/* gadget side driver data structres */
  78struct dummy_ep {
  79        struct list_head                queue;
  80        unsigned long                   last_io;        /* jiffies timestamp */
  81        struct usb_gadget               *gadget;
  82        const struct usb_endpoint_descriptor *desc;
  83        struct usb_ep                   ep;
  84        unsigned                        halted : 1;
  85        unsigned                        already_seen : 1;
  86        unsigned                        setup_stage : 1;
  87};
  88
  89struct dummy_request {
  90        struct list_head                queue;          /* ep's requests */
  91        struct usb_request              req;
  92};
  93
  94static inline struct dummy_ep *usb_ep_to_dummy_ep (struct usb_ep *_ep)
  95{
  96        return container_of (_ep, struct dummy_ep, ep);
  97}
  98
  99static inline struct dummy_request *usb_request_to_dummy_request
 100                (struct usb_request *_req)
 101{
 102        return container_of (_req, struct dummy_request, req);
 103}
 104
 105/*-------------------------------------------------------------------------*/
 106
 107/*
 108 * Every device has ep0 for control requests, plus up to 30 more endpoints,
 109 * in one of two types:
 110 *
 111 *   - Configurable:  direction (in/out), type (bulk, iso, etc), and endpoint
 112 *     number can be changed.  Names like "ep-a" are used for this type.
 113 *
 114 *   - Fixed Function:  in other cases.  some characteristics may be mutable;
 115 *     that'd be hardware-specific.  Names like "ep12out-bulk" are used.
 116 *
 117 * Gadget drivers are responsible for not setting up conflicting endpoint
 118 * configurations, illegal or unsupported packet lengths, and so on.
 119 */
 120
 121static const char ep0name [] = "ep0";
 122
 123static const char *const ep_name [] = {
 124        ep0name,                                /* everyone has ep0 */
 125
 126        /* act like a net2280: high speed, six configurable endpoints */
 127        "ep-a", "ep-b", "ep-c", "ep-d", "ep-e", "ep-f",
 128
 129        /* or like pxa250: fifteen fixed function endpoints */
 130        "ep1in-bulk", "ep2out-bulk", "ep3in-iso", "ep4out-iso", "ep5in-int",
 131        "ep6in-bulk", "ep7out-bulk", "ep8in-iso", "ep9out-iso", "ep10in-int",
 132        "ep11in-bulk", "ep12out-bulk", "ep13in-iso", "ep14out-iso",
 133                "ep15in-int",
 134
 135        /* or like sa1100: two fixed function endpoints */
 136        "ep1out-bulk", "ep2in-bulk",
 137};
 138#define DUMMY_ENDPOINTS ARRAY_SIZE(ep_name)
 139
 140/*-------------------------------------------------------------------------*/
 141
 142#define FIFO_SIZE               64
 143
 144struct urbp {
 145        struct urb              *urb;
 146        struct list_head        urbp_list;
 147};
 148
 149
 150enum dummy_rh_state {
 151        DUMMY_RH_RESET,
 152        DUMMY_RH_SUSPENDED,
 153        DUMMY_RH_RUNNING
 154};
 155
 156struct dummy {
 157        spinlock_t                      lock;
 158
 159        /*
 160         * SLAVE/GADGET side support
 161         */
 162        struct dummy_ep                 ep [DUMMY_ENDPOINTS];
 163        int                             address;
 164        struct usb_gadget               gadget;
 165        struct usb_gadget_driver        *driver;
 166        struct dummy_request            fifo_req;
 167        u8                              fifo_buf [FIFO_SIZE];
 168        u16                             devstatus;
 169        unsigned                        udc_suspended:1;
 170        unsigned                        pullup:1;
 171        unsigned                        active:1;
 172        unsigned                        old_active:1;
 173
 174        /*
 175         * MASTER/HOST side support
 176         */
 177        enum dummy_rh_state             rh_state;
 178        struct timer_list               timer;
 179        u32                             port_status;
 180        u32                             old_status;
 181        unsigned                        resuming:1;
 182        unsigned long                   re_timeout;
 183
 184        struct usb_device               *udev;
 185        struct list_head                urbp_list;
 186};
 187
 188static inline struct dummy *hcd_to_dummy (struct usb_hcd *hcd)
 189{
 190        return (struct dummy *) (hcd->hcd_priv);
 191}
 192
 193static inline struct usb_hcd *dummy_to_hcd (struct dummy *dum)
 194{
 195        return container_of((void *) dum, struct usb_hcd, hcd_priv);
 196}
 197
 198static inline struct device *dummy_dev (struct dummy *dum)
 199{
 200        return dummy_to_hcd(dum)->self.controller;
 201}
 202
 203static inline struct device *udc_dev (struct dummy *dum)
 204{
 205        return dum->gadget.dev.parent;
 206}
 207
 208static inline struct dummy *ep_to_dummy (struct dummy_ep *ep)
 209{
 210        return container_of (ep->gadget, struct dummy, gadget);
 211}
 212
 213static inline struct dummy *gadget_to_dummy (struct usb_gadget *gadget)
 214{
 215        return container_of (gadget, struct dummy, gadget);
 216}
 217
 218static inline struct dummy *gadget_dev_to_dummy (struct device *dev)
 219{
 220        return container_of (dev, struct dummy, gadget.dev);
 221}
 222
 223static struct dummy                     *the_controller;
 224
 225/*-------------------------------------------------------------------------*/
 226
 227/* SLAVE/GADGET SIDE UTILITY ROUTINES */
 228
 229/* called with spinlock held */
 230static void nuke (struct dummy *dum, struct dummy_ep *ep)
 231{
 232        while (!list_empty (&ep->queue)) {
 233                struct dummy_request    *req;
 234
 235                req = list_entry (ep->queue.next, struct dummy_request, queue);
 236                list_del_init (&req->queue);
 237                req->req.status = -ESHUTDOWN;
 238
 239                spin_unlock (&dum->lock);
 240                req->req.complete (&ep->ep, &req->req);
 241                spin_lock (&dum->lock);
 242        }
 243}
 244
 245/* caller must hold lock */
 246static void
 247stop_activity (struct dummy *dum)
 248{
 249        struct dummy_ep *ep;
 250
 251        /* prevent any more requests */
 252        dum->address = 0;
 253
 254        /* The timer is left running so that outstanding URBs can fail */
 255
 256        /* nuke any pending requests first, so driver i/o is quiesced */
 257        list_for_each_entry (ep, &dum->gadget.ep_list, ep.ep_list)
 258                nuke (dum, ep);
 259
 260        /* driver now does any non-usb quiescing necessary */
 261}
 262
 263/* caller must hold lock */
 264static void
 265set_link_state (struct dummy *dum)
 266{
 267        dum->active = 0;
 268        if ((dum->port_status & USB_PORT_STAT_POWER) == 0)
 269                dum->port_status = 0;
 270
 271        /* UDC suspend must cause a disconnect */
 272        else if (!dum->pullup || dum->udc_suspended) {
 273                dum->port_status &= ~(USB_PORT_STAT_CONNECTION |
 274                                        USB_PORT_STAT_ENABLE |
 275                                        USB_PORT_STAT_LOW_SPEED |
 276                                        USB_PORT_STAT_HIGH_SPEED |
 277                                        USB_PORT_STAT_SUSPEND);
 278                if ((dum->old_status & USB_PORT_STAT_CONNECTION) != 0)
 279                        dum->port_status |= (USB_PORT_STAT_C_CONNECTION << 16);
 280        } else {
 281                dum->port_status |= USB_PORT_STAT_CONNECTION;
 282                if ((dum->old_status & USB_PORT_STAT_CONNECTION) == 0)
 283                        dum->port_status |= (USB_PORT_STAT_C_CONNECTION << 16);
 284                if ((dum->port_status & USB_PORT_STAT_ENABLE) == 0)
 285                        dum->port_status &= ~USB_PORT_STAT_SUSPEND;
 286                else if ((dum->port_status & USB_PORT_STAT_SUSPEND) == 0 &&
 287                                dum->rh_state != DUMMY_RH_SUSPENDED)
 288                        dum->active = 1;
 289        }
 290
 291        if ((dum->port_status & USB_PORT_STAT_ENABLE) == 0 || dum->active)
 292                dum->resuming = 0;
 293
 294        if ((dum->port_status & USB_PORT_STAT_CONNECTION) == 0 ||
 295                        (dum->port_status & USB_PORT_STAT_RESET) != 0) {
 296                if ((dum->old_status & USB_PORT_STAT_CONNECTION) != 0 &&
 297                                (dum->old_status & USB_PORT_STAT_RESET) == 0 &&
 298                                dum->driver) {
 299                        stop_activity (dum);
 300                        spin_unlock (&dum->lock);
 301                        dum->driver->disconnect (&dum->gadget);
 302                        spin_lock (&dum->lock);
 303                }
 304        } else if (dum->active != dum->old_active) {
 305                if (dum->old_active && dum->driver->suspend) {
 306                        spin_unlock (&dum->lock);
 307                        dum->driver->suspend (&dum->gadget);
 308                        spin_lock (&dum->lock);
 309                } else if (!dum->old_active && dum->driver->resume) {
 310                        spin_unlock (&dum->lock);
 311                        dum->driver->resume (&dum->gadget);
 312                        spin_lock (&dum->lock);
 313                }
 314        }
 315
 316        dum->old_status = dum->port_status;
 317        dum->old_active = dum->active;
 318}
 319
 320/*-------------------------------------------------------------------------*/
 321
 322/* SLAVE/GADGET SIDE DRIVER
 323 *
 324 * This only tracks gadget state.  All the work is done when the host
 325 * side tries some (emulated) i/o operation.  Real device controller
 326 * drivers would do real i/o using dma, fifos, irqs, timers, etc.
 327 */
 328
 329#define is_enabled(dum) \
 330        (dum->port_status & USB_PORT_STAT_ENABLE)
 331
 332static int
 333dummy_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
 334{
 335        struct dummy            *dum;
 336        struct dummy_ep         *ep;
 337        unsigned                max;
 338        int                     retval;
 339
 340        ep = usb_ep_to_dummy_ep (_ep);
 341        if (!_ep || !desc || ep->desc || _ep->name == ep0name
 342                        || desc->bDescriptorType != USB_DT_ENDPOINT)
 343                return -EINVAL;
 344        dum = ep_to_dummy (ep);
 345        if (!dum->driver || !is_enabled (dum))
 346                return -ESHUTDOWN;
 347        max = le16_to_cpu(desc->wMaxPacketSize) & 0x3ff;
 348
 349        /* drivers must not request bad settings, since lower levels
 350         * (hardware or its drivers) may not check.  some endpoints
 351         * can't do iso, many have maxpacket limitations, etc.
 352         *
 353         * since this "hardware" driver is here to help debugging, we
 354         * have some extra sanity checks.  (there could be more though,
 355         * especially for "ep9out" style fixed function ones.)
 356         */
 357        retval = -EINVAL;
 358        switch (desc->bmAttributes & 0x03) {
 359        case USB_ENDPOINT_XFER_BULK:
 360                if (strstr (ep->ep.name, "-iso")
 361                                || strstr (ep->ep.name, "-int")) {
 362                        goto done;
 363                }
 364                switch (dum->gadget.speed) {
 365                case USB_SPEED_HIGH:
 366                        if (max == 512)
 367                                break;
 368                        goto done;
 369                case USB_SPEED_FULL:
 370                        if (max == 8 || max == 16 || max == 32 || max == 64)
 371                                /* we'll fake any legal size */
 372                                break;
 373                        /* save a return statement */
 374                default:
 375                        goto done;
 376                }
 377                break;
 378        case USB_ENDPOINT_XFER_INT:
 379                if (strstr (ep->ep.name, "-iso")) /* bulk is ok */
 380                        goto done;
 381                /* real hardware might not handle all packet sizes */
 382                switch (dum->gadget.speed) {
 383                case USB_SPEED_HIGH:
 384                        if (max <= 1024)
 385                                break;
 386                        /* save a return statement */
 387                case USB_SPEED_FULL:
 388                        if (max <= 64)
 389                                break;
 390                        /* save a return statement */
 391                default:
 392                        if (max <= 8)
 393                                break;
 394                        goto done;
 395                }
 396                break;
 397        case USB_ENDPOINT_XFER_ISOC:
 398                if (strstr (ep->ep.name, "-bulk")
 399                                || strstr (ep->ep.name, "-int"))
 400                        goto done;
 401                /* real hardware might not handle all packet sizes */
 402                switch (dum->gadget.speed) {
 403                case USB_SPEED_HIGH:
 404                        if (max <= 1024)
 405                                break;
 406                        /* save a return statement */
 407                case USB_SPEED_FULL:
 408                        if (max <= 1023)
 409                                break;
 410                        /* save a return statement */
 411                default:
 412                        goto done;
 413                }
 414                break;
 415        default:
 416                /* few chips support control except on ep0 */
 417                goto done;
 418        }
 419
 420        _ep->maxpacket = max;
 421        ep->desc = desc;
 422
 423        dev_dbg (udc_dev(dum), "enabled %s (ep%d%s-%s) maxpacket %d\n",
 424                _ep->name,
 425                desc->bEndpointAddress & 0x0f,
 426                (desc->bEndpointAddress & USB_DIR_IN) ? "in" : "out",
 427                ({ char *val;
 428                 switch (desc->bmAttributes & 0x03) {
 429                 case USB_ENDPOINT_XFER_BULK: val = "bulk"; break;
 430                 case USB_ENDPOINT_XFER_ISOC: val = "iso"; break;
 431                 case USB_ENDPOINT_XFER_INT: val = "intr"; break;
 432                 default: val = "ctrl"; break;
 433                 }; val; }),
 434                max);
 435
 436        /* at this point real hardware should be NAKing transfers
 437         * to that endpoint, until a buffer is queued to it.
 438         */
 439        retval = 0;
 440done:
 441        return retval;
 442}
 443
 444static int dummy_disable (struct usb_ep *_ep)
 445{
 446        struct dummy_ep         *ep;
 447        struct dummy            *dum;
 448        unsigned long           flags;
 449        int                     retval;
 450
 451        ep = usb_ep_to_dummy_ep (_ep);
 452        if (!_ep || !ep->desc || _ep->name == ep0name)
 453                return -EINVAL;
 454        dum = ep_to_dummy (ep);
 455
 456        spin_lock_irqsave (&dum->lock, flags);
 457        ep->desc = NULL;
 458        retval = 0;
 459        nuke (dum, ep);
 460        spin_unlock_irqrestore (&dum->lock, flags);
 461
 462        dev_dbg (udc_dev(dum), "disabled %s\n", _ep->name);
 463        return retval;
 464}
 465
 466static struct usb_request *
 467dummy_alloc_request (struct usb_ep *_ep, gfp_t mem_flags)
 468{
 469        struct dummy_ep         *ep;
 470        struct dummy_request    *req;
 471
 472        if (!_ep)
 473                return NULL;
 474        ep = usb_ep_to_dummy_ep (_ep);
 475
 476        req = kzalloc(sizeof(*req), mem_flags);
 477        if (!req)
 478                return NULL;
 479        INIT_LIST_HEAD (&req->queue);
 480        return &req->req;
 481}
 482
 483static void
 484dummy_free_request (struct usb_ep *_ep, struct usb_request *_req)
 485{
 486        struct dummy_ep         *ep;
 487        struct dummy_request    *req;
 488
 489        ep = usb_ep_to_dummy_ep (_ep);
 490        if (!ep || !_req || (!ep->desc && _ep->name != ep0name))
 491                return;
 492
 493        req = usb_request_to_dummy_request (_req);
 494        WARN_ON (!list_empty (&req->queue));
 495        kfree (req);
 496}
 497
 498static void
 499fifo_complete (struct usb_ep *ep, struct usb_request *req)
 500{
 501}
 502
 503static int
 504dummy_queue (struct usb_ep *_ep, struct usb_request *_req,
 505                gfp_t mem_flags)
 506{
 507        struct dummy_ep         *ep;
 508        struct dummy_request    *req;
 509        struct dummy            *dum;
 510        unsigned long           flags;
 511
 512        req = usb_request_to_dummy_request (_req);
 513        if (!_req || !list_empty (&req->queue) || !_req->complete)
 514                return -EINVAL;
 515
 516        ep = usb_ep_to_dummy_ep (_ep);
 517        if (!_ep || (!ep->desc && _ep->name != ep0name))
 518                return -EINVAL;
 519
 520        dum = ep_to_dummy (ep);
 521        if (!dum->driver || !is_enabled (dum))
 522                return -ESHUTDOWN;
 523
 524#if 0
 525        dev_dbg (udc_dev(dum), "ep %p queue req %p to %s, len %d buf %p\n",
 526                        ep, _req, _ep->name, _req->length, _req->buf);
 527#endif
 528
 529        _req->status = -EINPROGRESS;
 530        _req->actual = 0;
 531        spin_lock_irqsave (&dum->lock, flags);
 532
 533        /* implement an emulated single-request FIFO */
 534        if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) &&
 535                        list_empty (&dum->fifo_req.queue) &&
 536                        list_empty (&ep->queue) &&
 537                        _req->length <= FIFO_SIZE) {
 538                req = &dum->fifo_req;
 539                req->req = *_req;
 540                req->req.buf = dum->fifo_buf;
 541                memcpy (dum->fifo_buf, _req->buf, _req->length);
 542                req->req.context = dum;
 543                req->req.complete = fifo_complete;
 544
 545                list_add_tail(&req->queue, &ep->queue);
 546                spin_unlock (&dum->lock);
 547                _req->actual = _req->length;
 548                _req->status = 0;
 549                _req->complete (_ep, _req);
 550                spin_lock (&dum->lock);
 551        }  else
 552                list_add_tail(&req->queue, &ep->queue);
 553        spin_unlock_irqrestore (&dum->lock, flags);
 554
 555        /* real hardware would likely enable transfers here, in case
 556         * it'd been left NAKing.
 557         */
 558        return 0;
 559}
 560
 561static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
 562{
 563        struct dummy_ep         *ep;
 564        struct dummy            *dum;
 565        int                     retval = -EINVAL;
 566        unsigned long           flags;
 567        struct dummy_request    *req = NULL;
 568
 569        if (!_ep || !_req)
 570                return retval;
 571        ep = usb_ep_to_dummy_ep (_ep);
 572        dum = ep_to_dummy (ep);
 573
 574        if (!dum->driver)
 575                return -ESHUTDOWN;
 576
 577        local_irq_save (flags);
 578        spin_lock (&dum->lock);
 579        list_for_each_entry (req, &ep->queue, queue) {
 580                if (&req->req == _req) {
 581                        list_del_init (&req->queue);
 582                        _req->status = -ECONNRESET;
 583                        retval = 0;
 584                        break;
 585                }
 586        }
 587        spin_unlock (&dum->lock);
 588
 589        if (retval == 0) {
 590                dev_dbg (udc_dev(dum),
 591                                "dequeued req %p from %s, len %d buf %p\n",
 592                                req, _ep->name, _req->length, _req->buf);
 593                _req->complete (_ep, _req);
 594        }
 595        local_irq_restore (flags);
 596        return retval;
 597}
 598
 599static int
 600dummy_set_halt (struct usb_ep *_ep, int value)
 601{
 602        struct dummy_ep         *ep;
 603        struct dummy            *dum;
 604
 605        if (!_ep)
 606                return -EINVAL;
 607        ep = usb_ep_to_dummy_ep (_ep);
 608        dum = ep_to_dummy (ep);
 609        if (!dum->driver)
 610                return -ESHUTDOWN;
 611        if (!value)
 612                ep->halted = 0;
 613        else if (ep->desc && (ep->desc->bEndpointAddress & USB_DIR_IN) &&
 614                        !list_empty (&ep->queue))
 615                return -EAGAIN;
 616        else
 617                ep->halted = 1;
 618        /* FIXME clear emulated data toggle too */
 619        return 0;
 620}
 621
 622static const struct usb_ep_ops dummy_ep_ops = {
 623        .enable         = dummy_enable,
 624        .disable        = dummy_disable,
 625
 626        .alloc_request  = dummy_alloc_request,
 627        .free_request   = dummy_free_request,
 628
 629        .queue          = dummy_queue,
 630        .dequeue        = dummy_dequeue,
 631
 632        .set_halt       = dummy_set_halt,
 633};
 634
 635/*-------------------------------------------------------------------------*/
 636
 637/* there are both host and device side versions of this call ... */
 638static int dummy_g_get_frame (struct usb_gadget *_gadget)
 639{
 640        struct timeval  tv;
 641
 642        do_gettimeofday (&tv);
 643        return tv.tv_usec / 1000;
 644}
 645
 646static int dummy_wakeup (struct usb_gadget *_gadget)
 647{
 648        struct dummy    *dum;
 649
 650        dum = gadget_to_dummy (_gadget);
 651        if (!(dum->devstatus &  ( (1 << USB_DEVICE_B_HNP_ENABLE)
 652                                | (1 << USB_DEVICE_REMOTE_WAKEUP))))
 653                return -EINVAL;
 654        if ((dum->port_status & USB_PORT_STAT_CONNECTION) == 0)
 655                return -ENOLINK;
 656        if ((dum->port_status & USB_PORT_STAT_SUSPEND) == 0 &&
 657                         dum->rh_state != DUMMY_RH_SUSPENDED)
 658                return -EIO;
 659
 660        /* FIXME: What if the root hub is suspended but the port isn't? */
 661
 662        /* hub notices our request, issues downstream resume, etc */
 663        dum->resuming = 1;
 664        dum->re_timeout = jiffies + msecs_to_jiffies(20);
 665        mod_timer (&dummy_to_hcd (dum)->rh_timer, dum->re_timeout);
 666        return 0;
 667}
 668
 669static int dummy_set_selfpowered (struct usb_gadget *_gadget, int value)
 670{
 671        struct dummy    *dum;
 672
 673        dum = gadget_to_dummy (_gadget);
 674        if (value)
 675                dum->devstatus |= (1 << USB_DEVICE_SELF_POWERED);
 676        else
 677                dum->devstatus &= ~(1 << USB_DEVICE_SELF_POWERED);
 678        return 0;
 679}
 680
 681static int dummy_pullup (struct usb_gadget *_gadget, int value)
 682{
 683        struct dummy    *dum;
 684        unsigned long   flags;
 685
 686        dum = gadget_to_dummy (_gadget);
 687        spin_lock_irqsave (&dum->lock, flags);
 688        dum->pullup = (value != 0);
 689        set_link_state (dum);
 690        spin_unlock_irqrestore (&dum->lock, flags);
 691
 692        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
 693        return 0;
 694}
 695
 696static const struct usb_gadget_ops dummy_ops = {
 697        .get_frame      = dummy_g_get_frame,
 698        .wakeup         = dummy_wakeup,
 699        .set_selfpowered = dummy_set_selfpowered,
 700        .pullup         = dummy_pullup,
 701};
 702
 703/*-------------------------------------------------------------------------*/
 704
 705/* "function" sysfs attribute */
 706static ssize_t
 707show_function (struct device *dev, struct device_attribute *attr, char *buf)
 708{
 709        struct dummy    *dum = gadget_dev_to_dummy (dev);
 710
 711        if (!dum->driver || !dum->driver->function)
 712                return 0;
 713        return scnprintf (buf, PAGE_SIZE, "%s\n", dum->driver->function);
 714}
 715static DEVICE_ATTR (function, S_IRUGO, show_function, NULL);
 716
 717/*-------------------------------------------------------------------------*/
 718
 719/*
 720 * Driver registration/unregistration.
 721 *
 722 * This is basically hardware-specific; there's usually only one real USB
 723 * device (not host) controller since that's how USB devices are intended
 724 * to work.  So most implementations of these api calls will rely on the
 725 * fact that only one driver will ever bind to the hardware.  But curious
 726 * hardware can be built with discrete components, so the gadget API doesn't
 727 * require that assumption.
 728 *
 729 * For this emulator, it might be convenient to create a usb slave device
 730 * for each driver that registers:  just add to a big root hub.
 731 */
 732
 733int
 734usb_gadget_register_driver (struct usb_gadget_driver *driver)
 735{
 736        struct dummy    *dum = the_controller;
 737        int             retval, i;
 738
 739        if (!dum)
 740                return -EINVAL;
 741        if (dum->driver)
 742                return -EBUSY;
 743        if (!driver->bind || !driver->setup
 744                        || driver->speed == USB_SPEED_UNKNOWN)
 745                return -EINVAL;
 746
 747        /*
 748         * SLAVE side init ... the layer above hardware, which
 749         * can't enumerate without help from the driver we're binding.
 750         */
 751
 752        dum->devstatus = 0;
 753
 754        INIT_LIST_HEAD (&dum->gadget.ep_list);
 755        for (i = 0; i < DUMMY_ENDPOINTS; i++) {
 756                struct dummy_ep *ep = &dum->ep [i];
 757
 758                if (!ep_name [i])
 759                        break;
 760                ep->ep.name = ep_name [i];
 761                ep->ep.ops = &dummy_ep_ops;
 762                list_add_tail (&ep->ep.ep_list, &dum->gadget.ep_list);
 763                ep->halted = ep->already_seen = ep->setup_stage = 0;
 764                ep->ep.maxpacket = ~0;
 765                ep->last_io = jiffies;
 766                ep->gadget = &dum->gadget;
 767                ep->desc = NULL;
 768                INIT_LIST_HEAD (&ep->queue);
 769        }
 770
 771        dum->gadget.ep0 = &dum->ep [0].ep;
 772        dum->ep [0].ep.maxpacket = 64;
 773        list_del_init (&dum->ep [0].ep.ep_list);
 774        INIT_LIST_HEAD(&dum->fifo_req.queue);
 775
 776        driver->driver.bus = NULL;
 777        dum->driver = driver;
 778        dum->gadget.dev.driver = &driver->driver;
 779        dev_dbg (udc_dev(dum), "binding gadget driver '%s'\n",
 780                        driver->driver.name);
 781        retval = driver->bind(&dum->gadget);
 782        if (retval) {
 783                dum->driver = NULL;
 784                dum->gadget.dev.driver = NULL;
 785                return retval;
 786        }
 787
 788        /* khubd will enumerate this in a while */
 789        spin_lock_irq (&dum->lock);
 790        dum->pullup = 1;
 791        set_link_state (dum);
 792        spin_unlock_irq (&dum->lock);
 793
 794        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
 795        return 0;
 796}
 797EXPORT_SYMBOL (usb_gadget_register_driver);
 798
 799int
 800usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
 801{
 802        struct dummy    *dum = the_controller;
 803        unsigned long   flags;
 804
 805        if (!dum)
 806                return -ENODEV;
 807        if (!driver || driver != dum->driver || !driver->unbind)
 808                return -EINVAL;
 809
 810        dev_dbg (udc_dev(dum), "unregister gadget driver '%s'\n",
 811                        driver->driver.name);
 812
 813        spin_lock_irqsave (&dum->lock, flags);
 814        dum->pullup = 0;
 815        set_link_state (dum);
 816        spin_unlock_irqrestore (&dum->lock, flags);
 817
 818        driver->unbind (&dum->gadget);
 819        dum->gadget.dev.driver = NULL;
 820        dum->driver = NULL;
 821
 822        spin_lock_irqsave (&dum->lock, flags);
 823        dum->pullup = 0;
 824        set_link_state (dum);
 825        spin_unlock_irqrestore (&dum->lock, flags);
 826
 827        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
 828        return 0;
 829}
 830EXPORT_SYMBOL (usb_gadget_unregister_driver);
 831
 832#undef is_enabled
 833
 834/* just declare this in any driver that really need it */
 835extern int net2280_set_fifo_mode (struct usb_gadget *gadget, int mode);
 836
 837int net2280_set_fifo_mode (struct usb_gadget *gadget, int mode)
 838{
 839        return -ENOSYS;
 840}
 841EXPORT_SYMBOL (net2280_set_fifo_mode);
 842
 843
 844/* The gadget structure is stored inside the hcd structure and will be
 845 * released along with it. */
 846static void
 847dummy_gadget_release (struct device *dev)
 848{
 849        struct dummy    *dum = gadget_dev_to_dummy (dev);
 850
 851        usb_put_hcd (dummy_to_hcd (dum));
 852}
 853
 854static int dummy_udc_probe (struct platform_device *pdev)
 855{
 856        struct dummy    *dum = the_controller;
 857        int             rc;
 858
 859        dum->gadget.name = gadget_name;
 860        dum->gadget.ops = &dummy_ops;
 861        dum->gadget.is_dualspeed = 1;
 862
 863        /* maybe claim OTG support, though we won't complete HNP */
 864        dum->gadget.is_otg = (dummy_to_hcd(dum)->self.otg_port != 0);
 865
 866        dev_set_name(&dum->gadget.dev, "gadget");
 867        dum->gadget.dev.parent = &pdev->dev;
 868        dum->gadget.dev.release = dummy_gadget_release;
 869        rc = device_register (&dum->gadget.dev);
 870        if (rc < 0)
 871                return rc;
 872
 873        usb_get_hcd (dummy_to_hcd (dum));
 874
 875        platform_set_drvdata (pdev, dum);
 876        rc = device_create_file (&dum->gadget.dev, &dev_attr_function);
 877        if (rc < 0)
 878                device_unregister (&dum->gadget.dev);
 879        return rc;
 880}
 881
 882static int dummy_udc_remove (struct platform_device *pdev)
 883{
 884        struct dummy    *dum = platform_get_drvdata (pdev);
 885
 886        platform_set_drvdata (pdev, NULL);
 887        device_remove_file (&dum->gadget.dev, &dev_attr_function);
 888        device_unregister (&dum->gadget.dev);
 889        return 0;
 890}
 891
 892static int dummy_udc_suspend (struct platform_device *pdev, pm_message_t state)
 893{
 894        struct dummy    *dum = platform_get_drvdata(pdev);
 895
 896        dev_dbg (&pdev->dev, "%s\n", __func__);
 897        spin_lock_irq (&dum->lock);
 898        dum->udc_suspended = 1;
 899        set_link_state (dum);
 900        spin_unlock_irq (&dum->lock);
 901
 902        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
 903        return 0;
 904}
 905
 906static int dummy_udc_resume (struct platform_device *pdev)
 907{
 908        struct dummy    *dum = platform_get_drvdata(pdev);
 909
 910        dev_dbg (&pdev->dev, "%s\n", __func__);
 911        spin_lock_irq (&dum->lock);
 912        dum->udc_suspended = 0;
 913        set_link_state (dum);
 914        spin_unlock_irq (&dum->lock);
 915
 916        usb_hcd_poll_rh_status (dummy_to_hcd (dum));
 917        return 0;
 918}
 919
 920static struct platform_driver dummy_udc_driver = {
 921        .probe          = dummy_udc_probe,
 922        .remove         = dummy_udc_remove,
 923        .suspend        = dummy_udc_suspend,
 924        .resume         = dummy_udc_resume,
 925        .driver         = {
 926                .name   = (char *) gadget_name,
 927                .owner  = THIS_MODULE,
 928        },
 929};
 930
 931/*-------------------------------------------------------------------------*/
 932
 933/* MASTER/HOST SIDE DRIVER
 934 *
 935 * this uses the hcd framework to hook up to host side drivers.
 936 * its root hub will only have one device, otherwise it acts like
 937 * a normal host controller.
 938 *
 939 * when urbs are queued, they're just stuck on a list that we
 940 * scan in a timer callback.  that callback connects writes from
 941 * the host with reads from the device, and so on, based on the
 942 * usb 2.0 rules.
 943 */
 944
 945static int dummy_urb_enqueue (
 946        struct usb_hcd                  *hcd,
 947        struct urb                      *urb,
 948        gfp_t                           mem_flags
 949) {
 950        struct dummy    *dum;
 951        struct urbp     *urbp;
 952        unsigned long   flags;
 953        int             rc;
 954
 955        if (!urb->transfer_buffer && urb->transfer_buffer_length)
 956                return -EINVAL;
 957
 958        urbp = kmalloc (sizeof *urbp, mem_flags);
 959        if (!urbp)
 960                return -ENOMEM;
 961        urbp->urb = urb;
 962
 963        dum = hcd_to_dummy (hcd);
 964        spin_lock_irqsave (&dum->lock, flags);
 965        rc = usb_hcd_link_urb_to_ep(hcd, urb);
 966        if (rc) {
 967                kfree(urbp);
 968                goto done;
 969        }
 970
 971        if (!dum->udev) {
 972                dum->udev = urb->dev;
 973                usb_get_dev (dum->udev);
 974        } else if (unlikely (dum->udev != urb->dev))
 975                dev_err (dummy_dev(dum), "usb_device address has changed!\n");
 976
 977        list_add_tail (&urbp->urbp_list, &dum->urbp_list);
 978        urb->hcpriv = urbp;
 979        if (usb_pipetype (urb->pipe) == PIPE_CONTROL)
 980                urb->error_count = 1;           /* mark as a new urb */
 981
 982        /* kick the scheduler, it'll do the rest */
 983        if (!timer_pending (&dum->timer))
 984                mod_timer (&dum->timer, jiffies + 1);
 985
 986 done:
 987        spin_unlock_irqrestore(&dum->lock, flags);
 988        return rc;
 989}
 990
 991static int dummy_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
 992{
 993        struct dummy    *dum;
 994        unsigned long   flags;
 995        int             rc;
 996
 997        /* giveback happens automatically in timer callback,
 998         * so make sure the callback happens */
 999        dum = hcd_to_dummy (hcd);
1000        spin_lock_irqsave (&dum->lock, flags);
1001
1002        rc = usb_hcd_check_unlink_urb(hcd, urb, status);
1003        if (!rc && dum->rh_state != DUMMY_RH_RUNNING &&
1004                        !list_empty(&dum->urbp_list))
1005                mod_timer (&dum->timer, jiffies);
1006
1007        spin_unlock_irqrestore (&dum->lock, flags);
1008        return rc;
1009}
1010
1011/* transfer up to a frame's worth; caller must own lock */
1012static int
1013transfer(struct dummy *dum, struct urb *urb, struct dummy_ep *ep, int limit,
1014                int *status)
1015{
1016        struct dummy_request    *req;
1017
1018top:
1019        /* if there's no request queued, the device is NAKing; return */
1020        list_for_each_entry (req, &ep->queue, queue) {
1021                unsigned        host_len, dev_len, len;
1022                int             is_short, to_host;
1023                int             rescan = 0;
1024
1025                /* 1..N packets of ep->ep.maxpacket each ... the last one
1026                 * may be short (including zero length).
1027                 *
1028                 * writer can send a zlp explicitly (length 0) or implicitly
1029                 * (length mod maxpacket zero, and 'zero' flag); they always
1030                 * terminate reads.
1031                 */
1032                host_len = urb->transfer_buffer_length - urb->actual_length;
1033                dev_len = req->req.length - req->req.actual;
1034                len = min (host_len, dev_len);
1035
1036                /* FIXME update emulated data toggle too */
1037
1038                to_host = usb_pipein (urb->pipe);
1039                if (unlikely (len == 0))
1040                        is_short = 1;
1041                else {
1042                        char            *ubuf, *rbuf;
1043
1044                        /* not enough bandwidth left? */
1045                        if (limit < ep->ep.maxpacket && limit < len)
1046                                break;
1047                        len = min (len, (unsigned) limit);
1048                        if (len == 0)
1049                                break;
1050
1051                        /* use an extra pass for the final short packet */
1052                        if (len > ep->ep.maxpacket) {
1053                                rescan = 1;
1054                                len -= (len % ep->ep.maxpacket);
1055                        }
1056                        is_short = (len % ep->ep.maxpacket) != 0;
1057
1058                        /* else transfer packet(s) */
1059                        ubuf = urb->transfer_buffer + urb->actual_length;
1060                        rbuf = req->req.buf + req->req.actual;
1061                        if (to_host)
1062                                memcpy (ubuf, rbuf, len);
1063                        else
1064                                memcpy (rbuf, ubuf, len);
1065                        ep->last_io = jiffies;
1066
1067                        limit -= len;
1068                        urb->actual_length += len;
1069                        req->req.actual += len;
1070                }
1071
1072                /* short packets terminate, maybe with overflow/underflow.
1073                 * it's only really an error to write too much.
1074                 *
1075                 * partially filling a buffer optionally blocks queue advances
1076                 * (so completion handlers can clean up the queue) but we don't
1077                 * need to emulate such data-in-flight.
1078                 */
1079                if (is_short) {
1080                        if (host_len == dev_len) {
1081                                req->req.status = 0;
1082                                *status = 0;
1083                        } else if (to_host) {
1084                                req->req.status = 0;
1085                                if (dev_len > host_len)
1086                                        *status = -EOVERFLOW;
1087                                else
1088                                        *status = 0;
1089                        } else if (!to_host) {
1090                                *status = 0;
1091                                if (host_len > dev_len)
1092                                        req->req.status = -EOVERFLOW;
1093                                else
1094                                        req->req.status = 0;
1095                        }
1096
1097                /* many requests terminate without a short packet */
1098                } else {
1099                        if (req->req.length == req->req.actual
1100                                        && !req->req.zero)
1101                                req->req.status = 0;
1102                        if (urb->transfer_buffer_length == urb->actual_length
1103                                        && !(urb->transfer_flags
1104                                                & URB_ZERO_PACKET))
1105                                *status = 0;
1106                }
1107
1108                /* device side completion --> continuable */
1109                if (req->req.status != -EINPROGRESS) {
1110                        list_del_init (&req->queue);
1111
1112                        spin_unlock (&dum->lock);
1113                        req->req.complete (&ep->ep, &req->req);
1114                        spin_lock (&dum->lock);
1115
1116                        /* requests might have been unlinked... */
1117                        rescan = 1;
1118                }
1119
1120                /* host side completion --> terminate */
1121                if (*status != -EINPROGRESS)
1122                        break;
1123
1124                /* rescan to continue with any other queued i/o */
1125                if (rescan)
1126                        goto top;
1127        }
1128        return limit;
1129}
1130
1131static int periodic_bytes (struct dummy *dum, struct dummy_ep *ep)
1132{
1133        int     limit = ep->ep.maxpacket;
1134
1135        if (dum->gadget.speed == USB_SPEED_HIGH) {
1136                int     tmp;
1137
1138                /* high bandwidth mode */
1139                tmp = le16_to_cpu(ep->desc->wMaxPacketSize);
1140                tmp = (tmp >> 11) & 0x03;
1141                tmp *= 8 /* applies to entire frame */;
1142                limit += limit * tmp;
1143        }
1144        return limit;
1145}
1146
1147#define is_active(dum)  ((dum->port_status & \
1148                (USB_PORT_STAT_CONNECTION | USB_PORT_STAT_ENABLE | \
1149                        USB_PORT_STAT_SUSPEND)) \
1150                == (USB_PORT_STAT_CONNECTION | USB_PORT_STAT_ENABLE))
1151
1152static struct dummy_ep *find_endpoint (struct dummy *dum, u8 address)
1153{
1154        int             i;
1155
1156        if (!is_active (dum))
1157                return NULL;
1158        if ((address & ~USB_DIR_IN) == 0)
1159                return &dum->ep [0];
1160        for (i = 1; i < DUMMY_ENDPOINTS; i++) {
1161                struct dummy_ep *ep = &dum->ep [i];
1162
1163                if (!ep->desc)
1164                        continue;
1165                if (ep->desc->bEndpointAddress == address)
1166                        return ep;
1167        }
1168        return NULL;
1169}
1170
1171#undef is_active
1172
1173#define Dev_Request     (USB_TYPE_STANDARD | USB_RECIP_DEVICE)
1174#define Dev_InRequest   (Dev_Request | USB_DIR_IN)
1175#define Intf_Request    (USB_TYPE_STANDARD | USB_RECIP_INTERFACE)
1176#define Intf_InRequest  (Intf_Request | USB_DIR_IN)
1177#define Ep_Request      (USB_TYPE_STANDARD | USB_RECIP_ENDPOINT)
1178#define Ep_InRequest    (Ep_Request | USB_DIR_IN)
1179
1180/* drive both sides of the transfers; looks like irq handlers to
1181 * both drivers except the callbacks aren't in_irq().
1182 */
1183static void dummy_timer (unsigned long _dum)
1184{
1185        struct dummy            *dum = (struct dummy *) _dum;
1186        struct urbp             *urbp, *tmp;
1187        unsigned long           flags;
1188        int                     limit, total;
1189        int                     i;
1190
1191        /* simplistic model for one frame's bandwidth */
1192        switch (dum->gadget.speed) {
1193        case USB_SPEED_LOW:
1194                total = 8/*bytes*/ * 12/*packets*/;
1195                break;
1196        case USB_SPEED_FULL:
1197                total = 64/*bytes*/ * 19/*packets*/;
1198                break;
1199        case USB_SPEED_HIGH:
1200                total = 512/*bytes*/ * 13/*packets*/ * 8/*uframes*/;
1201                break;
1202        default:
1203                dev_err (dummy_dev(dum), "bogus device speed\n");
1204                return;
1205        }
1206
1207        /* FIXME if HZ != 1000 this will probably misbehave ... */
1208
1209        /* look at each urb queued by the host side driver */
1210        spin_lock_irqsave (&dum->lock, flags);
1211
1212        if (!dum->udev) {
1213                dev_err (dummy_dev(dum),
1214                                "timer fired with no URBs pending?\n");
1215                spin_unlock_irqrestore (&dum->lock, flags);
1216                return;
1217        }
1218
1219        for (i = 0; i < DUMMY_ENDPOINTS; i++) {
1220                if (!ep_name [i])
1221                        break;
1222                dum->ep [i].already_seen = 0;
1223        }
1224
1225restart:
1226        list_for_each_entry_safe (urbp, tmp, &dum->urbp_list, urbp_list) {
1227                struct urb              *urb;
1228                struct dummy_request    *req;
1229                u8                      address;
1230                struct dummy_ep         *ep = NULL;
1231                int                     type;
1232                int                     status = -EINPROGRESS;
1233
1234                urb = urbp->urb;
1235                if (urb->unlinked)
1236                        goto return_urb;
1237                else if (dum->rh_state != DUMMY_RH_RUNNING)
1238                        continue;
1239                type = usb_pipetype (urb->pipe);
1240
1241                /* used up this frame's non-periodic bandwidth?
1242                 * FIXME there's infinite bandwidth for control and
1243                 * periodic transfers ... unrealistic.
1244                 */
1245                if (total <= 0 && type == PIPE_BULK)
1246                        continue;
1247
1248                /* find the gadget's ep for this request (if configured) */
1249                address = usb_pipeendpoint (urb->pipe);
1250                if (usb_pipein (urb->pipe))
1251                        address |= USB_DIR_IN;
1252                ep = find_endpoint(dum, address);
1253                if (!ep) {
1254                        /* set_configuration() disagreement */
1255                        dev_dbg (dummy_dev(dum),
1256                                "no ep configured for urb %p\n",
1257                                urb);
1258                        status = -EPROTO;
1259                        goto return_urb;
1260                }
1261
1262                if (ep->already_seen)
1263                        continue;
1264                ep->already_seen = 1;
1265                if (ep == &dum->ep [0] && urb->error_count) {
1266                        ep->setup_stage = 1;    /* a new urb */
1267                        urb->error_count = 0;
1268                }
1269                if (ep->halted && !ep->setup_stage) {
1270                        /* NOTE: must not be iso! */
1271                        dev_dbg (dummy_dev(dum), "ep %s halted, urb %p\n",
1272                                        ep->ep.name, urb);
1273                        status = -EPIPE;
1274                        goto return_urb;
1275                }
1276                /* FIXME make sure both ends agree on maxpacket */
1277
1278                /* handle control requests */
1279                if (ep == &dum->ep [0] && ep->setup_stage) {
1280                        struct usb_ctrlrequest          setup;
1281                        int                             value = 1;
1282                        struct dummy_ep                 *ep2;
1283                        unsigned                        w_index;
1284                        unsigned                        w_value;
1285
1286                        setup = *(struct usb_ctrlrequest*) urb->setup_packet;
1287                        w_index = le16_to_cpu(setup.wIndex);
1288                        w_value = le16_to_cpu(setup.wValue);
1289                        if (le16_to_cpu(setup.wLength) !=
1290                                        urb->transfer_buffer_length) {
1291                                status = -EOVERFLOW;
1292                                goto return_urb;
1293                        }
1294
1295                        /* paranoia, in case of stale queued data */
1296                        list_for_each_entry (req, &ep->queue, queue) {
1297                                list_del_init (&req->queue);
1298                                req->req.status = -EOVERFLOW;
1299                                dev_dbg (udc_dev(dum), "stale req = %p\n",
1300                                                req);
1301
1302                                spin_unlock (&dum->lock);
1303                                req->req.complete (&ep->ep, &req->req);
1304                                spin_lock (&dum->lock);
1305                                ep->already_seen = 0;
1306                                goto restart;
1307                        }
1308
1309                        /* gadget driver never sees set_address or operations
1310                         * on standard feature flags.  some hardware doesn't
1311                         * even expose them.
1312                         */
1313                        ep->last_io = jiffies;
1314                        ep->setup_stage = 0;
1315                        ep->halted = 0;
1316                        switch (setup.bRequest) {
1317                        case USB_REQ_SET_ADDRESS:
1318                                if (setup.bRequestType != Dev_Request)
1319                                        break;
1320                                dum->address = w_value;
1321                                status = 0;
1322                                dev_dbg (udc_dev(dum), "set_address = %d\n",
1323                                                w_value);
1324                                value = 0;
1325                                break;
1326                        case USB_REQ_SET_FEATURE:
1327                                if (setup.bRequestType == Dev_Request) {
1328                                        value = 0;
1329                                        switch (w_value) {
1330                                        case USB_DEVICE_REMOTE_WAKEUP:
1331                                                break;
1332                                        case USB_DEVICE_B_HNP_ENABLE:
1333                                                dum->gadget.b_hnp_enable = 1;
1334                                                break;
1335                                        case USB_DEVICE_A_HNP_SUPPORT:
1336                                                dum->gadget.a_hnp_support = 1;
1337                                                break;
1338                                        case USB_DEVICE_A_ALT_HNP_SUPPORT:
1339                                                dum->gadget.a_alt_hnp_support
1340                                                        = 1;
1341                                                break;
1342                                        default:
1343                                                value = -EOPNOTSUPP;
1344                                        }
1345                                        if (value == 0) {
1346                                                dum->devstatus |=
1347                                                        (1 << w_value);
1348                                                status = 0;
1349                                        }
1350
1351                                } else if (setup.bRequestType == Ep_Request) {
1352                                        // endpoint halt
1353                                        ep2 = find_endpoint (dum, w_index);
1354                                        if (!ep2) {
1355                                                value = -EOPNOTSUPP;
1356                                                break;
1357                                        }
1358                                        ep2->halted = 1;
1359                                        value = 0;
1360                                        status = 0;
1361                                }
1362                                break;
1363                        case USB_REQ_CLEAR_FEATURE:
1364                                if (setup.bRequestType == Dev_Request) {
1365                                        switch (w_value) {
1366                                        case USB_DEVICE_REMOTE_WAKEUP:
1367                                                dum->devstatus &= ~(1 <<
1368                                                        USB_DEVICE_REMOTE_WAKEUP);
1369                                                value = 0;
1370                                                status = 0;
1371                                                break;
1372                                        default:
1373                                                value = -EOPNOTSUPP;
1374                                                break;
1375                                        }
1376                                } else if (setup.bRequestType == Ep_Request) {
1377                                        // endpoint halt
1378                                        ep2 = find_endpoint (dum, w_index);
1379                                        if (!ep2) {
1380                                                value = -EOPNOTSUPP;
1381                                                break;
1382                                        }
1383                                        ep2->halted = 0;
1384                                        value = 0;
1385                                        status = 0;
1386                                }
1387                                break;
1388                        case USB_REQ_GET_STATUS:
1389                                if (setup.bRequestType == Dev_InRequest
1390                                                || setup.bRequestType
1391                                                        == Intf_InRequest
1392                                                || setup.bRequestType
1393                                                        == Ep_InRequest
1394                                                ) {
1395                                        char *buf;
1396
1397                                        // device: remote wakeup, selfpowered
1398                                        // interface: nothing
1399                                        // endpoint: halt
1400                                        buf = (char *)urb->transfer_buffer;
1401                                        if (urb->transfer_buffer_length > 0) {
1402                                                if (setup.bRequestType ==
1403                                                                Ep_InRequest) {
1404        ep2 = find_endpoint (dum, w_index);
1405        if (!ep2) {
1406                value = -EOPNOTSUPP;
1407                break;
1408        }
1409        buf [0] = ep2->halted;
1410                                                } else if (setup.bRequestType ==
1411                                                                Dev_InRequest) {
1412                                                        buf [0] = (u8)
1413                                                                dum->devstatus;
1414                                                } else
1415                                                        buf [0] = 0;
1416                                        }
1417                                        if (urb->transfer_buffer_length > 1)
1418                                                buf [1] = 0;
1419                                        urb->actual_length = min (2,
1420                                                urb->transfer_buffer_length);
1421                                        value = 0;
1422                                        status = 0;
1423                                }
1424                                break;
1425                        }
1426
1427                        /* gadget driver handles all other requests.  block
1428                         * until setup() returns; no reentrancy issues etc.
1429                         */
1430                        if (value > 0) {
1431                                spin_unlock (&dum->lock);
1432                                value = dum->driver->setup (&dum->gadget,
1433                                                &setup);
1434                                spin_lock (&dum->lock);
1435
1436                                if (value >= 0) {
1437                                        /* no delays (max 64KB data stage) */
1438                                        limit = 64*1024;
1439                                        goto treat_control_like_bulk;
1440                                }
1441                                /* error, see below */
1442                        }
1443
1444                        if (value < 0) {
1445                                if (value != -EOPNOTSUPP)
1446                                        dev_dbg (udc_dev(dum),
1447                                                "setup --> %d\n",
1448                                                value);
1449                                status = -EPIPE;
1450                                urb->actual_length = 0;
1451                        }
1452
1453                        goto return_urb;
1454                }
1455
1456                /* non-control requests */
1457                limit = total;
1458                switch (usb_pipetype (urb->pipe)) {
1459                case PIPE_ISOCHRONOUS:
1460                        /* FIXME is it urb->interval since the last xfer?
1461                         * use urb->iso_frame_desc[i].
1462                         * complete whether or not ep has requests queued.
1463                         * report random errors, to debug drivers.
1464                         */
1465                        limit = max (limit, periodic_bytes (dum, ep));
1466                        status = -ENOSYS;
1467                        break;
1468
1469                case PIPE_INTERRUPT:
1470                        /* FIXME is it urb->interval since the last xfer?
1471                         * this almost certainly polls too fast.
1472                         */
1473                        limit = max (limit, periodic_bytes (dum, ep));
1474                        /* FALLTHROUGH */
1475
1476                // case PIPE_BULK:  case PIPE_CONTROL:
1477                default:
1478                treat_control_like_bulk:
1479                        ep->last_io = jiffies;
1480                        total = transfer(dum, urb, ep, limit, &status);
1481                        break;
1482                }
1483
1484                /* incomplete transfer? */
1485                if (status == -EINPROGRESS)
1486                        continue;
1487
1488return_urb:
1489                list_del (&urbp->urbp_list);
1490                kfree (urbp);
1491                if (ep)
1492                        ep->already_seen = ep->setup_stage = 0;
1493
1494                usb_hcd_unlink_urb_from_ep(dummy_to_hcd(dum), urb);
1495                spin_unlock (&dum->lock);
1496                usb_hcd_giveback_urb(dummy_to_hcd(dum), urb, status);
1497                spin_lock (&dum->lock);
1498
1499                goto restart;
1500        }
1501
1502        if (list_empty (&dum->urbp_list)) {
1503                usb_put_dev (dum->udev);
1504                dum->udev = NULL;
1505        } else if (dum->rh_state == DUMMY_RH_RUNNING) {
1506                /* want a 1 msec delay here */
1507                mod_timer (&dum->timer, jiffies + msecs_to_jiffies(1));
1508        }
1509
1510        spin_unlock_irqrestore (&dum->lock, flags);
1511}
1512
1513/*-------------------------------------------------------------------------*/
1514
1515#define PORT_C_MASK \
1516        ((USB_PORT_STAT_C_CONNECTION \
1517        | USB_PORT_STAT_C_ENABLE \
1518        | USB_PORT_STAT_C_SUSPEND \
1519        | USB_PORT_STAT_C_OVERCURRENT \
1520        | USB_PORT_STAT_C_RESET) << 16)
1521
1522static int dummy_hub_status (struct usb_hcd *hcd, char *buf)
1523{
1524        struct dummy            *dum;
1525        unsigned long           flags;
1526        int                     retval = 0;
1527
1528        dum = hcd_to_dummy (hcd);
1529
1530        spin_lock_irqsave (&dum->lock, flags);
1531        if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))
1532                goto done;
1533
1534        if (dum->resuming && time_after_eq (jiffies, dum->re_timeout)) {
1535                dum->port_status |= (USB_PORT_STAT_C_SUSPEND << 16);
1536                dum->port_status &= ~USB_PORT_STAT_SUSPEND;
1537                set_link_state (dum);
1538        }
1539
1540        if ((dum->port_status & PORT_C_MASK) != 0) {
1541                *buf = (1 << 1);
1542                dev_dbg (dummy_dev(dum), "port status 0x%08x has changes\n",
1543                                dum->port_status);
1544                retval = 1;
1545                if (dum->rh_state == DUMMY_RH_SUSPENDED)
1546                        usb_hcd_resume_root_hub (hcd);
1547        }
1548done:
1549        spin_unlock_irqrestore (&dum->lock, flags);
1550        return retval;
1551}
1552
1553static inline void
1554hub_descriptor (struct usb_hub_descriptor *desc)
1555{
1556        memset (desc, 0, sizeof *desc);
1557        desc->bDescriptorType = 0x29;
1558        desc->bDescLength = 9;
1559        desc->wHubCharacteristics = cpu_to_le16(0x0001);
1560        desc->bNbrPorts = 1;
1561        desc->bitmap [0] = 0xff;
1562        desc->bitmap [1] = 0xff;
1563}
1564
1565static int dummy_hub_control (
1566        struct usb_hcd  *hcd,
1567        u16             typeReq,
1568        u16             wValue,
1569        u16             wIndex,
1570        char            *buf,
1571        u16             wLength
1572) {
1573        struct dummy    *dum;
1574        int             retval = 0;
1575        unsigned long   flags;
1576
1577        if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))
1578                return -ETIMEDOUT;
1579
1580        dum = hcd_to_dummy (hcd);
1581        spin_lock_irqsave (&dum->lock, flags);
1582        switch (typeReq) {
1583        case ClearHubFeature:
1584                break;
1585        case ClearPortFeature:
1586                switch (wValue) {
1587                case USB_PORT_FEAT_SUSPEND:
1588                        if (dum->port_status & USB_PORT_STAT_SUSPEND) {
1589                                /* 20msec resume signaling */
1590                                dum->resuming = 1;
1591                                dum->re_timeout = jiffies +
1592                                                msecs_to_jiffies(20);
1593                        }
1594                        break;
1595                case USB_PORT_FEAT_POWER:
1596                        if (dum->port_status & USB_PORT_STAT_POWER)
1597                                dev_dbg (dummy_dev(dum), "power-off\n");
1598                        /* FALLS THROUGH */
1599                default:
1600                        dum->port_status &= ~(1 << wValue);
1601                        set_link_state (dum);
1602                }
1603                break;
1604        case GetHubDescriptor:
1605                hub_descriptor ((struct usb_hub_descriptor *) buf);
1606                break;
1607        case GetHubStatus:
1608                *(__le32 *) buf = __constant_cpu_to_le32 (0);
1609                break;
1610        case GetPortStatus:
1611                if (wIndex != 1)
1612                        retval = -EPIPE;
1613
1614                /* whoever resets or resumes must GetPortStatus to
1615                 * complete it!!
1616                 */
1617                if (dum->resuming &&
1618                                time_after_eq (jiffies, dum->re_timeout)) {
1619                        dum->port_status |= (USB_PORT_STAT_C_SUSPEND << 16);
1620                        dum->port_status &= ~USB_PORT_STAT_SUSPEND;
1621                }
1622                if ((dum->port_status & USB_PORT_STAT_RESET) != 0 &&
1623                                time_after_eq (jiffies, dum->re_timeout)) {
1624                        dum->port_status |= (USB_PORT_STAT_C_RESET << 16);
1625                        dum->port_status &= ~USB_PORT_STAT_RESET;
1626                        if (dum->pullup) {
1627                                dum->port_status |= USB_PORT_STAT_ENABLE;
1628                                /* give it the best speed we agree on */
1629                                dum->gadget.speed = dum->driver->speed;
1630                                dum->gadget.ep0->maxpacket = 64;
1631                                switch (dum->gadget.speed) {
1632                                case USB_SPEED_HIGH:
1633                                        dum->port_status |=
1634                                                USB_PORT_STAT_HIGH_SPEED;
1635                                        break;
1636                                case USB_SPEED_LOW:
1637                                        dum->gadget.ep0->maxpacket = 8;
1638                                        dum->port_status |=
1639                                                USB_PORT_STAT_LOW_SPEED;
1640                                        break;
1641                                default:
1642                                        dum->gadget.speed = USB_SPEED_FULL;
1643                                        break;
1644                                }
1645                        }
1646                }
1647                set_link_state (dum);
1648                ((__le16 *) buf)[0] = cpu_to_le16 (dum->port_status);
1649                ((__le16 *) buf)[1] = cpu_to_le16 (dum->port_status >> 16);
1650                break;
1651        case SetHubFeature:
1652                retval = -EPIPE;
1653                break;
1654        case SetPortFeature:
1655                switch (wValue) {
1656                case USB_PORT_FEAT_SUSPEND:
1657                        if (dum->active) {
1658                                dum->port_status |= USB_PORT_STAT_SUSPEND;
1659
1660                                /* HNP would happen here; for now we
1661                                 * assume b_bus_req is always true.
1662                                 */
1663                                set_link_state (dum);
1664                                if (((1 << USB_DEVICE_B_HNP_ENABLE)
1665                                                & dum->devstatus) != 0)
1666                                        dev_dbg (dummy_dev(dum),
1667                                                        "no HNP yet!\n");
1668                        }
1669                        break;
1670                case USB_PORT_FEAT_POWER:
1671                        dum->port_status |= USB_PORT_STAT_POWER;
1672                        set_link_state (dum);
1673                        break;
1674                case USB_PORT_FEAT_RESET:
1675                        /* if it's already enabled, disable */
1676                        dum->port_status &= ~(USB_PORT_STAT_ENABLE
1677                                        | USB_PORT_STAT_LOW_SPEED
1678                                        | USB_PORT_STAT_HIGH_SPEED);
1679                        dum->devstatus = 0;
1680                        /* 50msec reset signaling */
1681                        dum->re_timeout = jiffies + msecs_to_jiffies(50);
1682                        /* FALLS THROUGH */
1683                default:
1684                        if ((dum->port_status & USB_PORT_STAT_POWER) != 0) {
1685                                dum->port_status |= (1 << wValue);
1686                                set_link_state (dum);
1687                        }
1688                }
1689                break;
1690
1691        default:
1692                dev_dbg (dummy_dev(dum),
1693                        "hub control req%04x v%04x i%04x l%d\n",
1694                        typeReq, wValue, wIndex, wLength);
1695
1696                /* "protocol stall" on error */
1697                retval = -EPIPE;
1698        }
1699        spin_unlock_irqrestore (&dum->lock, flags);
1700
1701        if ((dum->port_status & PORT_C_MASK) != 0)
1702                usb_hcd_poll_rh_status (hcd);
1703        return retval;
1704}
1705
1706static int dummy_bus_suspend (struct usb_hcd *hcd)
1707{
1708        struct dummy *dum = hcd_to_dummy (hcd);
1709
1710        dev_dbg (&hcd->self.root_hub->dev, "%s\n", __func__);
1711
1712        spin_lock_irq (&dum->lock);
1713        dum->rh_state = DUMMY_RH_SUSPENDED;
1714        set_link_state (dum);
1715        hcd->state = HC_STATE_SUSPENDED;
1716        spin_unlock_irq (&dum->lock);
1717        return 0;
1718}
1719
1720static int dummy_bus_resume (struct usb_hcd *hcd)
1721{
1722        struct dummy *dum = hcd_to_dummy (hcd);
1723        int rc = 0;
1724
1725        dev_dbg (&hcd->self.root_hub->dev, "%s\n", __func__);
1726
1727        spin_lock_irq (&dum->lock);
1728        if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
1729                rc = -ESHUTDOWN;
1730        } else {
1731                dum->rh_state = DUMMY_RH_RUNNING;
1732                set_link_state (dum);
1733                if (!list_empty(&dum->urbp_list))
1734                        mod_timer (&dum->timer, jiffies);
1735                hcd->state = HC_STATE_RUNNING;
1736        }
1737        spin_unlock_irq (&dum->lock);
1738        return rc;
1739}
1740
1741/*-------------------------------------------------------------------------*/
1742
1743static inline ssize_t
1744show_urb (char *buf, size_t size, struct urb *urb)
1745{
1746        int ep = usb_pipeendpoint (urb->pipe);
1747
1748        return snprintf (buf, size,
1749                "urb/%p %s ep%d%s%s len %d/%d\n",
1750                urb,
1751                ({ char *s;
1752                 switch (urb->dev->speed) {
1753                 case USB_SPEED_LOW:    s = "ls"; break;
1754                 case USB_SPEED_FULL:   s = "fs"; break;
1755                 case USB_SPEED_HIGH:   s = "hs"; break;
1756                 default:               s = "?"; break;
1757                 }; s; }),
1758                ep, ep ? (usb_pipein (urb->pipe) ? "in" : "out") : "",
1759                ({ char *s; \
1760                 switch (usb_pipetype (urb->pipe)) { \
1761                 case PIPE_CONTROL:     s = ""; break; \
1762                 case PIPE_BULK:        s = "-bulk"; break; \
1763                 case PIPE_INTERRUPT:   s = "-int"; break; \
1764                 default:               s = "-iso"; break; \
1765                }; s;}),
1766                urb->actual_length, urb->transfer_buffer_length);
1767}
1768
1769static ssize_t
1770show_urbs (struct device *dev, struct device_attribute *attr, char *buf)
1771{
1772        struct usb_hcd          *hcd = dev_get_drvdata (dev);
1773        struct dummy            *dum = hcd_to_dummy (hcd);
1774        struct urbp             *urbp;
1775        size_t                  size = 0;
1776        unsigned long           flags;
1777
1778        spin_lock_irqsave (&dum->lock, flags);
1779        list_for_each_entry (urbp, &dum->urbp_list, urbp_list) {
1780                size_t          temp;
1781
1782                temp = show_urb (buf, PAGE_SIZE - size, urbp->urb);
1783                buf += temp;
1784                size += temp;
1785        }
1786        spin_unlock_irqrestore (&dum->lock, flags);
1787
1788        return size;
1789}
1790static DEVICE_ATTR (urbs, S_IRUGO, show_urbs, NULL);
1791
1792static int dummy_start (struct usb_hcd *hcd)
1793{
1794        struct dummy            *dum;
1795
1796        dum = hcd_to_dummy (hcd);
1797
1798        /*
1799         * MASTER side init ... we emulate a root hub that'll only ever
1800         * talk to one device (the slave side).  Also appears in sysfs,
1801         * just like more familiar pci-based HCDs.
1802         */
1803        spin_lock_init (&dum->lock);
1804        init_timer (&dum->timer);
1805        dum->timer.function = dummy_timer;
1806        dum->timer.data = (unsigned long) dum;
1807        dum->rh_state = DUMMY_RH_RUNNING;
1808
1809        INIT_LIST_HEAD (&dum->urbp_list);
1810
1811        hcd->power_budget = POWER_BUDGET;
1812        hcd->state = HC_STATE_RUNNING;
1813        hcd->uses_new_polling = 1;
1814
1815#ifdef CONFIG_USB_OTG
1816        hcd->self.otg_port = 1;
1817#endif
1818
1819        /* FIXME 'urbs' should be a per-device thing, maybe in usbcore */
1820        return device_create_file (dummy_dev(dum), &dev_attr_urbs);
1821}
1822
1823static void dummy_stop (struct usb_hcd *hcd)
1824{
1825        struct dummy            *dum;
1826
1827        dum = hcd_to_dummy (hcd);
1828
1829        device_remove_file (dummy_dev(dum), &dev_attr_urbs);
1830        usb_gadget_unregister_driver (dum->driver);
1831        dev_info (dummy_dev(dum), "stopped\n");
1832}
1833
1834/*-------------------------------------------------------------------------*/
1835
1836static int dummy_h_get_frame (struct usb_hcd *hcd)
1837{
1838        return dummy_g_get_frame (NULL);
1839}
1840
1841static const struct hc_driver dummy_hcd = {
1842        .description =          (char *) driver_name,
1843        .product_desc =         "Dummy host controller",
1844        .hcd_priv_size =        sizeof(struct dummy),
1845
1846        .flags =                HCD_USB2,
1847
1848        .start =                dummy_start,
1849        .stop =                 dummy_stop,
1850
1851        .urb_enqueue =          dummy_urb_enqueue,
1852        .urb_dequeue =          dummy_urb_dequeue,
1853
1854        .get_frame_number =     dummy_h_get_frame,
1855
1856        .hub_status_data =      dummy_hub_status,
1857        .hub_control =          dummy_hub_control,
1858        .bus_suspend =          dummy_bus_suspend,
1859        .bus_resume =           dummy_bus_resume,
1860};
1861
1862static int dummy_hcd_probe(struct platform_device *pdev)
1863{
1864        struct usb_hcd          *hcd;
1865        int                     retval;
1866
1867        dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
1868
1869        hcd = usb_create_hcd(&dummy_hcd, &pdev->dev, dev_name(&pdev->dev));
1870        if (!hcd)
1871                return -ENOMEM;
1872        the_controller = hcd_to_dummy (hcd);
1873
1874        retval = usb_add_hcd(hcd, 0, 0);
1875        if (retval != 0) {
1876                usb_put_hcd (hcd);
1877                the_controller = NULL;
1878        }
1879        return retval;
1880}
1881
1882static int dummy_hcd_remove (struct platform_device *pdev)
1883{
1884        struct usb_hcd          *hcd;
1885
1886        hcd = platform_get_drvdata (pdev);
1887        usb_remove_hcd (hcd);
1888        usb_put_hcd (hcd);
1889        the_controller = NULL;
1890        return 0;
1891}
1892
1893static int dummy_hcd_suspend (struct platform_device *pdev, pm_message_t state)
1894{
1895        struct usb_hcd          *hcd;
1896        struct dummy            *dum;
1897        int                     rc = 0;
1898
1899        dev_dbg (&pdev->dev, "%s\n", __func__);
1900
1901        hcd = platform_get_drvdata (pdev);
1902        dum = hcd_to_dummy (hcd);
1903        if (dum->rh_state == DUMMY_RH_RUNNING) {
1904                dev_warn(&pdev->dev, "Root hub isn't suspended!\n");
1905                rc = -EBUSY;
1906        } else
1907                clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
1908        return rc;
1909}
1910
1911static int dummy_hcd_resume (struct platform_device *pdev)
1912{
1913        struct usb_hcd          *hcd;
1914
1915        dev_dbg (&pdev->dev, "%s\n", __func__);
1916
1917        hcd = platform_get_drvdata (pdev);
1918        set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
1919        usb_hcd_poll_rh_status (hcd);
1920        return 0;
1921}
1922
1923static struct platform_driver dummy_hcd_driver = {
1924        .probe          = dummy_hcd_probe,
1925        .remove         = dummy_hcd_remove,
1926        .suspend        = dummy_hcd_suspend,
1927        .resume         = dummy_hcd_resume,
1928        .driver         = {
1929                .name   = (char *) driver_name,
1930                .owner  = THIS_MODULE,
1931        },
1932};
1933
1934/*-------------------------------------------------------------------------*/
1935
1936static struct platform_device *the_udc_pdev;
1937static struct platform_device *the_hcd_pdev;
1938
1939static int __init init (void)
1940{
1941        int     retval = -ENOMEM;
1942
1943        if (usb_disabled ())
1944                return -ENODEV;
1945
1946        the_hcd_pdev = platform_device_alloc(driver_name, -1);
1947        if (!the_hcd_pdev)
1948                return retval;
1949        the_udc_pdev = platform_device_alloc(gadget_name, -1);
1950        if (!the_udc_pdev)
1951                goto err_alloc_udc;
1952
1953        retval = platform_driver_register(&dummy_hcd_driver);
1954        if (retval < 0)
1955                goto err_register_hcd_driver;
1956        retval = platform_driver_register(&dummy_udc_driver);
1957        if (retval < 0)
1958                goto err_register_udc_driver;
1959
1960        retval = platform_device_add(the_hcd_pdev);
1961        if (retval < 0)
1962                goto err_add_hcd;
1963        retval = platform_device_add(the_udc_pdev);
1964        if (retval < 0)
1965                goto err_add_udc;
1966        return retval;
1967
1968err_add_udc:
1969        platform_device_del(the_hcd_pdev);
1970err_add_hcd:
1971        platform_driver_unregister(&dummy_udc_driver);
1972err_register_udc_driver:
1973        platform_driver_unregister(&dummy_hcd_driver);
1974err_register_hcd_driver:
1975        platform_device_put(the_udc_pdev);
1976err_alloc_udc:
1977        platform_device_put(the_hcd_pdev);
1978        return retval;
1979}
1980module_init (init);
1981
1982static void __exit cleanup (void)
1983{
1984        platform_device_unregister(the_udc_pdev);
1985        platform_device_unregister(the_hcd_pdev);
1986        platform_driver_unregister(&dummy_udc_driver);
1987        platform_driver_unregister(&dummy_hcd_driver);
1988}
1989module_exit (cleanup);
1990
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.