linux/drivers/staging/ozwpan/ozhcd.c
<<
>>
Prefs
   1/* -----------------------------------------------------------------------------
   2 * Copyright (c) 2011 Ozmo Inc
   3 * Released under the GNU General Public License Version 2 (GPLv2).
   4 *
   5 * This file provides the implementation of a USB host controller device that
   6 * does not have any associated hardware. Instead the virtual device is
   7 * connected to the WiFi network and emulates the operation of a USB hcd by
   8 * receiving and sending network frames.
   9 * Note:
  10 * We take great pains to reduce the amount of code where interrupts need to be
  11 * disabled and in this respect we are different from standard HCD's. In
  12 * particular we don't want in_irq() code bleeding over to the protocol side of
  13 * the driver.
  14 * The troublesome functions are the urb enqueue and dequeue functions both of
  15 * which can be called in_irq(). So for these functions we put the urbs into a
  16 * queue and request a tasklet to process them. This means that a spinlock with
  17 * interrupts disabled must be held for insertion and removal but most code is
  18 * is in tasklet or soft irq context. The lock that protects this list is called
  19 * the tasklet lock and serves the purpose of the 'HCD lock' which must be held
  20 * when calling the following functions.
  21 *   usb_hcd_link_urb_to_ep()
  22 *   usb_hcd_unlink_urb_from_ep()
  23 *   usb_hcd_flush_endpoint()
  24 *   usb_hcd_check_unlink_urb()
  25 * -----------------------------------------------------------------------------
  26 */
  27#include <linux/platform_device.h>
  28#include <linux/usb.h>
  29#include <linux/slab.h>
  30#include <linux/export.h>
  31#include "linux/usb/hcd.h"
  32#include <asm/unaligned.h>
  33#include "ozdbg.h"
  34#include "ozusbif.h"
  35#include "ozurbparanoia.h"
  36#include "ozhcd.h"
  37
  38/*
  39 * Number of units of buffering to capture for an isochronous IN endpoint before
  40 * allowing data to be indicated up.
  41 */
  42#define OZ_IN_BUFFERING_UNITS   100
  43
  44/* Name of our platform device.
  45 */
  46#define OZ_PLAT_DEV_NAME        "ozwpan"
  47
  48/* Maximum number of free urb links that can be kept in the pool.
  49 */
  50#define OZ_MAX_LINK_POOL_SIZE   16
  51
  52/* Get endpoint object from the containing link.
  53 */
  54#define ep_from_link(__e) container_of((__e), struct oz_endpoint, link)
  55
  56/*EP0 timeout before ep0 request is again added to TX queue. (13*8 = 98mSec)
  57 */
  58#define EP0_TIMEOUT_COUNTER 13
  59
  60/* Debounce time HCD driver should wait before unregistering.
  61 */
  62#define OZ_HUB_DEBOUNCE_TIMEOUT 1500
  63
  64/*
  65 * Used to link urbs together and also store some status information for each
  66 * urb.
  67 * A cache of these are kept in a pool to reduce number of calls to kmalloc.
  68 */
  69struct oz_urb_link {
  70        struct list_head link;
  71        struct urb *urb;
  72        struct oz_port *port;
  73        u8 req_id;
  74        u8 ep_num;
  75        unsigned submit_counter;
  76};
  77
  78/* Holds state information about a USB endpoint.
  79 */
  80#define OZ_EP_BUFFER_SIZE_ISOC  (1024 * 24)
  81#define OZ_EP_BUFFER_SIZE_INT   512
  82struct oz_endpoint {
  83        struct list_head urb_list;      /* List of oz_urb_link items. */
  84        struct list_head link;          /* For isoc ep, links in to isoc
  85                                           lists of oz_port. */
  86        struct timespec timestamp;
  87        int credit;
  88        int credit_ceiling;
  89        u8 ep_num;
  90        u8 attrib;
  91        u8 *buffer;
  92        int buffer_size;
  93        int in_ix;
  94        int out_ix;
  95        int buffered_units;
  96        unsigned flags;
  97        int start_frame;
  98};
  99
 100/* Bits in the flags field. */
 101#define OZ_F_EP_BUFFERING       0x1
 102#define OZ_F_EP_HAVE_STREAM     0x2
 103
 104/* Holds state information about a USB interface.
 105 */
 106struct oz_interface {
 107        unsigned ep_mask;
 108        u8 alt;
 109};
 110
 111/* Holds state information about an hcd port.
 112 */
 113#define OZ_NB_ENDPOINTS 16
 114struct oz_port {
 115        unsigned flags;
 116        unsigned status;
 117        void *hpd;
 118        struct oz_hcd *ozhcd;
 119        spinlock_t port_lock;
 120        u8 bus_addr;
 121        u8 next_req_id;
 122        u8 config_num;
 123        int num_iface;
 124        struct oz_interface *iface;
 125        struct oz_endpoint *out_ep[OZ_NB_ENDPOINTS];
 126        struct oz_endpoint *in_ep[OZ_NB_ENDPOINTS];
 127        struct list_head isoc_out_ep;
 128        struct list_head isoc_in_ep;
 129};
 130
 131#define OZ_PORT_F_PRESENT       0x1
 132#define OZ_PORT_F_CHANGED       0x2
 133#define OZ_PORT_F_DYING         0x4
 134
 135/* Data structure in the private context area of struct usb_hcd.
 136 */
 137#define OZ_NB_PORTS     8
 138struct oz_hcd {
 139        spinlock_t hcd_lock;
 140        struct list_head urb_pending_list;
 141        struct list_head urb_cancel_list;
 142        struct list_head orphanage;
 143        int conn_port; /* Port that is currently connecting, -1 if none.*/
 144        struct oz_port ports[OZ_NB_PORTS];
 145        uint flags;
 146        struct usb_hcd *hcd;
 147};
 148
 149/* Bits in flags field.
 150 */
 151#define OZ_HDC_F_SUSPENDED      0x1
 152
 153/*
 154 * Static function prototypes.
 155 */
 156static int oz_hcd_start(struct usb_hcd *hcd);
 157static void oz_hcd_stop(struct usb_hcd *hcd);
 158static void oz_hcd_shutdown(struct usb_hcd *hcd);
 159static int oz_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
 160                                gfp_t mem_flags);
 161static int oz_hcd_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status);
 162static void oz_hcd_endpoint_disable(struct usb_hcd *hcd,
 163                                struct usb_host_endpoint *ep);
 164static void oz_hcd_endpoint_reset(struct usb_hcd *hcd,
 165                                struct usb_host_endpoint *ep);
 166static int oz_hcd_get_frame_number(struct usb_hcd *hcd);
 167static int oz_hcd_hub_status_data(struct usb_hcd *hcd, char *buf);
 168static int oz_hcd_hub_control(struct usb_hcd *hcd, u16 req_type, u16 wvalue,
 169                                u16 windex, char *buf, u16 wlength);
 170static int oz_hcd_bus_suspend(struct usb_hcd *hcd);
 171static int oz_hcd_bus_resume(struct usb_hcd *hcd);
 172static int oz_plat_probe(struct platform_device *dev);
 173static int oz_plat_remove(struct platform_device *dev);
 174static void oz_plat_shutdown(struct platform_device *dev);
 175static int oz_plat_suspend(struct platform_device *dev, pm_message_t msg);
 176static int oz_plat_resume(struct platform_device *dev);
 177static void oz_urb_process_tasklet(unsigned long unused);
 178static int oz_build_endpoints_for_config(struct usb_hcd *hcd,
 179                struct oz_port *port, struct usb_host_config *config,
 180                gfp_t mem_flags);
 181static void oz_clean_endpoints_for_config(struct usb_hcd *hcd,
 182                                struct oz_port *port);
 183static int oz_build_endpoints_for_interface(struct usb_hcd *hcd,
 184                        struct oz_port *port,
 185                        struct usb_host_interface *intf, gfp_t mem_flags);
 186static void oz_clean_endpoints_for_interface(struct usb_hcd *hcd,
 187                        struct oz_port *port, int if_ix);
 188static void oz_process_ep0_urb(struct oz_hcd *ozhcd, struct urb *urb,
 189                gfp_t mem_flags);
 190static struct oz_urb_link *oz_remove_urb(struct oz_endpoint *ep,
 191                struct urb *urb);
 192static void oz_hcd_clear_orphanage(struct oz_hcd *ozhcd, int status);
 193
 194/*
 195 * Static external variables.
 196 */
 197static struct platform_device *g_plat_dev;
 198static struct oz_hcd *g_ozhcd;
 199static DEFINE_SPINLOCK(g_hcdlock);      /* Guards g_ozhcd. */
 200static const char g_hcd_name[] = "Ozmo WPAN";
 201static struct list_head *g_link_pool;
 202static int g_link_pool_size;
 203static DEFINE_SPINLOCK(g_link_lock);
 204static DEFINE_SPINLOCK(g_tasklet_lock);
 205static struct tasklet_struct g_urb_process_tasklet;
 206static struct tasklet_struct g_urb_cancel_tasklet;
 207static atomic_t g_pending_urbs = ATOMIC_INIT(0);
 208static atomic_t g_usb_frame_number = ATOMIC_INIT(0);
 209static const struct hc_driver g_oz_hc_drv = {
 210        .description =          g_hcd_name,
 211        .product_desc =         "Ozmo Devices WPAN",
 212        .hcd_priv_size =        sizeof(struct oz_hcd),
 213        .flags =                HCD_USB11,
 214        .start =                oz_hcd_start,
 215        .stop =                 oz_hcd_stop,
 216        .shutdown =             oz_hcd_shutdown,
 217        .urb_enqueue =          oz_hcd_urb_enqueue,
 218        .urb_dequeue =          oz_hcd_urb_dequeue,
 219        .endpoint_disable =     oz_hcd_endpoint_disable,
 220        .endpoint_reset =       oz_hcd_endpoint_reset,
 221        .get_frame_number =     oz_hcd_get_frame_number,
 222        .hub_status_data =      oz_hcd_hub_status_data,
 223        .hub_control =          oz_hcd_hub_control,
 224        .bus_suspend =          oz_hcd_bus_suspend,
 225        .bus_resume =           oz_hcd_bus_resume,
 226};
 227
 228static struct platform_driver g_oz_plat_drv = {
 229        .probe = oz_plat_probe,
 230        .remove = oz_plat_remove,
 231        .shutdown = oz_plat_shutdown,
 232        .suspend = oz_plat_suspend,
 233        .resume = oz_plat_resume,
 234        .driver = {
 235                .name = OZ_PLAT_DEV_NAME,
 236                .owner = THIS_MODULE,
 237        },
 238};
 239
 240/*
 241 * Gets our private context area (which is of type struct oz_hcd) from the
 242 * usb_hcd structure.
 243 * Context: any
 244 */
 245static inline struct oz_hcd *oz_hcd_private(struct usb_hcd *hcd)
 246{
 247        return (struct oz_hcd *)hcd->hcd_priv;
 248}
 249
 250/*
 251 * Searches list of ports to find the index of the one with a specified  USB
 252 * bus address. If none of the ports has the bus address then the connection
 253 * port is returned, if there is one or -1 otherwise.
 254 * Context: any
 255 */
 256static int oz_get_port_from_addr(struct oz_hcd *ozhcd, u8 bus_addr)
 257{
 258        int i;
 259
 260        for (i = 0; i < OZ_NB_PORTS; i++) {
 261                if (ozhcd->ports[i].bus_addr == bus_addr)
 262                        return i;
 263        }
 264        return ozhcd->conn_port;
 265}
 266
 267/*
 268 * Allocates an urb link, first trying the pool but going to heap if empty.
 269 * Context: any
 270 */
 271static struct oz_urb_link *oz_alloc_urb_link(void)
 272{
 273        struct oz_urb_link *urbl = NULL;
 274        unsigned long irq_state;
 275
 276        spin_lock_irqsave(&g_link_lock, irq_state);
 277        if (g_link_pool) {
 278                urbl = container_of(g_link_pool, struct oz_urb_link, link);
 279                g_link_pool = urbl->link.next;
 280                --g_link_pool_size;
 281        }
 282        spin_unlock_irqrestore(&g_link_lock, irq_state);
 283        if (urbl == NULL)
 284                urbl = kmalloc(sizeof(struct oz_urb_link), GFP_ATOMIC);
 285        return urbl;
 286}
 287
 288/*
 289 * Frees an urb link by putting it in the pool if there is enough space or
 290 * deallocating it to heap otherwise.
 291 * Context: any
 292 */
 293static void oz_free_urb_link(struct oz_urb_link *urbl)
 294{
 295        if (urbl) {
 296                unsigned long irq_state;
 297                spin_lock_irqsave(&g_link_lock, irq_state);
 298                if (g_link_pool_size < OZ_MAX_LINK_POOL_SIZE) {
 299                        urbl->link.next = g_link_pool;
 300                        g_link_pool = &urbl->link;
 301                        urbl = NULL;
 302                        g_link_pool_size++;
 303                }
 304                spin_unlock_irqrestore(&g_link_lock, irq_state);
 305                kfree(urbl);
 306        }
 307}
 308
 309/*
 310 * Deallocates all the urb links in the pool.
 311 * Context: unknown
 312 */
 313static void oz_empty_link_pool(void)
 314{
 315        struct list_head *e;
 316        unsigned long irq_state;
 317
 318        spin_lock_irqsave(&g_link_lock, irq_state);
 319        e = g_link_pool;
 320        g_link_pool = NULL;
 321        g_link_pool_size = 0;
 322        spin_unlock_irqrestore(&g_link_lock, irq_state);
 323        while (e) {
 324                struct oz_urb_link *urbl =
 325                        container_of(e, struct oz_urb_link, link);
 326                e = e->next;
 327                kfree(urbl);
 328        }
 329}
 330
 331/*
 332 * Allocates endpoint structure and optionally a buffer. If a buffer is
 333 * allocated it immediately follows the endpoint structure.
 334 * Context: softirq
 335 */
 336static struct oz_endpoint *oz_ep_alloc(int buffer_size, gfp_t mem_flags)
 337{
 338        struct oz_endpoint *ep =
 339                kzalloc(sizeof(struct oz_endpoint)+buffer_size, mem_flags);
 340        if (ep) {
 341                INIT_LIST_HEAD(&ep->urb_list);
 342                INIT_LIST_HEAD(&ep->link);
 343                ep->credit = -1;
 344                if (buffer_size) {
 345                        ep->buffer_size = buffer_size;
 346                        ep->buffer = (u8 *)(ep+1);
 347                }
 348        }
 349        return ep;
 350}
 351
 352/*
 353 * Pre-condition: Must be called with g_tasklet_lock held and interrupts
 354 * disabled.
 355 * Context: softirq or process
 356 */
 357static struct oz_urb_link *oz_uncancel_urb(struct oz_hcd *ozhcd, struct urb *urb)
 358{
 359        struct oz_urb_link *urbl;
 360        struct list_head *e;
 361
 362        list_for_each(e, &ozhcd->urb_cancel_list) {
 363                urbl = container_of(e, struct oz_urb_link, link);
 364                if (urb == urbl->urb) {
 365                        list_del_init(e);
 366                        return urbl;
 367                }
 368        }
 369        return NULL;
 370}
 371
 372/*
 373 * This is called when we have finished processing an urb. It unlinks it from
 374 * the ep and returns it to the core.
 375 * Context: softirq or process
 376 */
 377static void oz_complete_urb(struct usb_hcd *hcd, struct urb *urb,
 378                int status)
 379{
 380        struct oz_hcd *ozhcd = oz_hcd_private(hcd);
 381        unsigned long irq_state;
 382        struct oz_urb_link *cancel_urbl;
 383
 384        spin_lock_irqsave(&g_tasklet_lock, irq_state);
 385        usb_hcd_unlink_urb_from_ep(hcd, urb);
 386        /* Clear hcpriv which will prevent it being put in the cancel list
 387         * in the event that an attempt is made to cancel it.
 388         */
 389        urb->hcpriv = NULL;
 390        /* Walk the cancel list in case the urb is already sitting there.
 391         * Since we process the cancel list in a tasklet rather than in
 392         * the dequeue function this could happen.
 393         */
 394        cancel_urbl = oz_uncancel_urb(ozhcd, urb);
 395        /* Note: we release lock but do not enable local irqs.
 396         * It appears that usb_hcd_giveback_urb() expects irqs to be disabled,
 397         * or at least other host controllers disable interrupts at this point
 398         * so we do the same. We must, however, release the lock otherwise a
 399         * deadlock will occur if an urb is submitted to our driver in the urb
 400         * completion function. Because we disable interrupts it is possible
 401         * that the urb_enqueue function can be called with them disabled.
 402         */
 403        spin_unlock(&g_tasklet_lock);
 404        if (oz_forget_urb(urb)) {
 405                oz_dbg(ON, "ERROR Unknown URB %p\n", urb);
 406        } else {
 407                atomic_dec(&g_pending_urbs);
 408                usb_hcd_giveback_urb(hcd, urb, status);
 409        }
 410        spin_lock(&g_tasklet_lock);
 411        spin_unlock_irqrestore(&g_tasklet_lock, irq_state);
 412        if (cancel_urbl)
 413                oz_free_urb_link(cancel_urbl);
 414}
 415
 416/*
 417 * Deallocates an endpoint including deallocating any associated stream and
 418 * returning any queued urbs to the core.
 419 * Context: softirq
 420 */
 421static void oz_ep_free(struct oz_port *port, struct oz_endpoint *ep)
 422{
 423        if (port) {
 424                struct list_head list;
 425                struct oz_hcd *ozhcd = port->ozhcd;
 426                INIT_LIST_HEAD(&list);
 427                if (ep->flags & OZ_F_EP_HAVE_STREAM)
 428                        oz_usb_stream_delete(port->hpd, ep->ep_num);
 429                /* Transfer URBs to the orphanage while we hold the lock. */
 430                spin_lock_bh(&ozhcd->hcd_lock);
 431                /* Note: this works even if ep->urb_list is empty.*/
 432                list_replace_init(&ep->urb_list, &list);
 433                /* Put the URBs in the orphanage. */
 434                list_splice_tail(&list, &ozhcd->orphanage);
 435                spin_unlock_bh(&ozhcd->hcd_lock);
 436        }
 437        oz_dbg(ON, "Freeing endpoint memory\n");
 438        kfree(ep);
 439}
 440
 441/*
 442 * Context: softirq
 443 */
 444static void oz_complete_buffered_urb(struct oz_port *port,
 445                        struct oz_endpoint *ep,
 446                        struct urb *urb)
 447{
 448        int data_len, available_space, copy_len;
 449
 450        data_len = ep->buffer[ep->out_ix];
 451        if (data_len <= urb->transfer_buffer_length)
 452                available_space = data_len;
 453        else
 454                available_space = urb->transfer_buffer_length;
 455
 456        if (++ep->out_ix == ep->buffer_size)
 457                ep->out_ix = 0;
 458        copy_len = ep->buffer_size - ep->out_ix;
 459        if (copy_len >= available_space)
 460                copy_len = available_space;
 461        memcpy(urb->transfer_buffer, &ep->buffer[ep->out_ix], copy_len);
 462
 463        if (copy_len < available_space) {
 464                memcpy((urb->transfer_buffer + copy_len), ep->buffer,
 465                                                (available_space - copy_len));
 466                ep->out_ix = available_space - copy_len;
 467        } else {
 468                ep->out_ix += copy_len;
 469        }
 470        urb->actual_length = available_space;
 471        if (ep->out_ix == ep->buffer_size)
 472                ep->out_ix = 0;
 473
 474        ep->buffered_units--;
 475        oz_dbg(ON, "Trying to give back buffered frame of size=%d\n",
 476               available_space);
 477        oz_complete_urb(port->ozhcd->hcd, urb, 0);
 478}
 479
 480/*
 481 * Context: softirq
 482 */
 483static int oz_enqueue_ep_urb(struct oz_port *port, u8 ep_addr, int in_dir,
 484                        struct urb *urb, u8 req_id)
 485{
 486        struct oz_urb_link *urbl;
 487        struct oz_endpoint *ep = NULL;
 488        int err = 0;
 489
 490        if (ep_addr >= OZ_NB_ENDPOINTS) {
 491                oz_dbg(ON, "%s: Invalid endpoint number\n", __func__);
 492                return -EINVAL;
 493        }
 494        urbl = oz_alloc_urb_link();
 495        if (!urbl)
 496                return -ENOMEM;
 497        urbl->submit_counter = 0;
 498        urbl->urb = urb;
 499        urbl->req_id = req_id;
 500        urbl->ep_num = ep_addr;
 501        /* Hold lock while we insert the URB into the list within the
 502         * endpoint structure.
 503         */
 504        spin_lock_bh(&port->ozhcd->hcd_lock);
 505        /* If the urb has been unlinked while out of any list then
 506         * complete it now.
 507         */
 508        if (urb->unlinked) {
 509                spin_unlock_bh(&port->ozhcd->hcd_lock);
 510                oz_dbg(ON, "urb %p unlinked so complete immediately\n", urb);
 511                oz_complete_urb(port->ozhcd->hcd, urb, 0);
 512                oz_free_urb_link(urbl);
 513                return 0;
 514        }
 515
 516        if (in_dir)
 517                ep = port->in_ep[ep_addr];
 518        else
 519                ep = port->out_ep[ep_addr];
 520        if (!ep) {
 521                err = -ENOMEM;
 522                goto out;
 523        }
 524
 525        /*For interrupt endpoint check for buffered data
 526        * & complete urb
 527        */
 528        if (((ep->attrib & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)
 529                                                 && ep->buffered_units > 0) {
 530                oz_free_urb_link(urbl);
 531                spin_unlock_bh(&port->ozhcd->hcd_lock);
 532                oz_complete_buffered_urb(port, ep, urb);
 533                return 0;
 534        }
 535
 536        if (port->hpd) {
 537                list_add_tail(&urbl->link, &ep->urb_list);
 538                if (!in_dir && ep_addr && (ep->credit < 0)) {
 539                        getrawmonotonic(&ep->timestamp);
 540                        ep->credit = 0;
 541                }
 542        } else {
 543                err = -EPIPE;
 544        }
 545out:
 546        spin_unlock_bh(&port->ozhcd->hcd_lock);
 547        if (err)
 548                oz_free_urb_link(urbl);
 549        return err;
 550}
 551
 552/*
 553 * Removes an urb from the queue in the endpoint.
 554 * Returns 0 if it is found and -EIDRM otherwise.
 555 * Context: softirq
 556 */
 557static int oz_dequeue_ep_urb(struct oz_port *port, u8 ep_addr, int in_dir,
 558                        struct urb *urb)
 559{
 560        struct oz_urb_link *urbl = NULL;
 561        struct oz_endpoint *ep;
 562
 563        spin_lock_bh(&port->ozhcd->hcd_lock);
 564        if (in_dir)
 565                ep = port->in_ep[ep_addr];
 566        else
 567                ep = port->out_ep[ep_addr];
 568        if (ep) {
 569                struct list_head *e;
 570                list_for_each(e, &ep->urb_list) {
 571                        urbl = container_of(e, struct oz_urb_link, link);
 572                        if (urbl->urb == urb) {
 573                                list_del_init(e);
 574                                break;
 575                        }
 576                        urbl = NULL;
 577                }
 578        }
 579        spin_unlock_bh(&port->ozhcd->hcd_lock);
 580        if (urbl)
 581                oz_free_urb_link(urbl);
 582        return urbl ? 0 : -EIDRM;
 583}
 584
 585/*
 586 * Finds an urb given its request id.
 587 * Context: softirq
 588 */
 589static struct urb *oz_find_urb_by_id(struct oz_port *port, int ep_ix,
 590                u8 req_id)
 591{
 592        struct oz_hcd *ozhcd = port->ozhcd;
 593        struct urb *urb = NULL;
 594        struct oz_urb_link *urbl;
 595        struct oz_endpoint *ep;
 596
 597        spin_lock_bh(&ozhcd->hcd_lock);
 598        ep = port->out_ep[ep_ix];
 599        if (ep) {
 600                struct list_head *e;
 601                list_for_each(e, &ep->urb_list) {
 602                        urbl = container_of(e, struct oz_urb_link, link);
 603                        if (urbl->req_id == req_id) {
 604                                urb = urbl->urb;
 605                                list_del_init(e);
 606                                break;
 607                        }
 608                }
 609        }
 610        spin_unlock_bh(&ozhcd->hcd_lock);
 611        /* If urb is non-zero then we we must have an urb link to delete.
 612         */
 613        if (urb)
 614                oz_free_urb_link(urbl);
 615        return urb;
 616}
 617
 618/*
 619 * Pre-condition: Port lock must be held.
 620 * Context: softirq
 621 */
 622static void oz_acquire_port(struct oz_port *port, void *hpd)
 623{
 624        INIT_LIST_HEAD(&port->isoc_out_ep);
 625        INIT_LIST_HEAD(&port->isoc_in_ep);
 626        port->flags |= OZ_PORT_F_PRESENT | OZ_PORT_F_CHANGED;
 627        port->status |= USB_PORT_STAT_CONNECTION |
 628                        (USB_PORT_STAT_C_CONNECTION << 16);
 629        oz_usb_get(hpd);
 630        port->hpd = hpd;
 631}
 632
 633/*
 634 * Context: softirq
 635 */
 636static struct oz_hcd *oz_hcd_claim(void)
 637{
 638        struct oz_hcd *ozhcd;
 639
 640        spin_lock_bh(&g_hcdlock);
 641        ozhcd = g_ozhcd;
 642        if (ozhcd)
 643                usb_get_hcd(ozhcd->hcd);
 644        spin_unlock_bh(&g_hcdlock);
 645        return ozhcd;
 646}
 647
 648/*
 649 * Context: softirq
 650 */
 651static inline void oz_hcd_put(struct oz_hcd *ozhcd)
 652{
 653        if (ozhcd)
 654                usb_put_hcd(ozhcd->hcd);
 655}
 656
 657/*
 658 * This is called by the protocol handler to notify that a PD has arrived.
 659 * We allocate a port to associate with the PD and create a structure for
 660 * endpoint 0. This port is made the connection port.
 661 * In the event that one of the other port is already a connection port then
 662 * we fail.
 663 * TODO We should be able to do better than fail and should be able remember
 664 * that this port needs configuring and make it the connection port once the
 665 * current connection port has been assigned an address. Collisions here are
 666 * probably very rare indeed.
 667 * Context: softirq
 668 */
 669struct oz_port *oz_hcd_pd_arrived(void *hpd)
 670{
 671        int i;
 672        struct oz_port *hport;
 673        struct oz_hcd *ozhcd;
 674        struct oz_endpoint *ep;
 675
 676        ozhcd = oz_hcd_claim();
 677        if (!ozhcd)
 678                return NULL;
 679        /* Allocate an endpoint object in advance (before holding hcd lock) to
 680         * use for out endpoint 0.
 681         */
 682        ep = oz_ep_alloc(0, GFP_ATOMIC);
 683        if (!ep)
 684                goto err_put;
 685
 686        spin_lock_bh(&ozhcd->hcd_lock);
 687        if (ozhcd->conn_port >= 0)
 688                goto err_unlock;
 689
 690        for (i = 0; i < OZ_NB_PORTS; i++) {
 691                struct oz_port *port = &ozhcd->ports[i];
 692
 693                spin_lock(&port->port_lock);
 694                if (!(port->flags & (OZ_PORT_F_PRESENT | OZ_PORT_F_CHANGED))) {
 695                        oz_acquire_port(port, hpd);
 696                        spin_unlock(&port->port_lock);
 697                        break;
 698                }
 699                spin_unlock(&port->port_lock);
 700        }
 701        if (i == OZ_NB_PORTS)
 702                goto err_unlock;
 703
 704        ozhcd->conn_port = i;
 705        hport = &ozhcd->ports[i];
 706        hport->out_ep[0] = ep;
 707        spin_unlock_bh(&ozhcd->hcd_lock);
 708        if (ozhcd->flags & OZ_HDC_F_SUSPENDED)
 709                usb_hcd_resume_root_hub(ozhcd->hcd);
 710        usb_hcd_poll_rh_status(ozhcd->hcd);
 711        oz_hcd_put(ozhcd);
 712
 713        return hport;
 714
 715err_unlock:
 716        spin_unlock_bh(&ozhcd->hcd_lock);
 717        oz_ep_free(NULL, ep);
 718err_put:
 719        oz_hcd_put(ozhcd);
 720        return NULL;
 721}
 722
 723/*
 724 * This is called by the protocol handler to notify that the PD has gone away.
 725 * We need to deallocate all resources and then request that the root hub is
 726 * polled. We release the reference we hold on the PD.
 727 * Context: softirq
 728 */
 729void oz_hcd_pd_departed(struct oz_port *port)
 730{
 731        struct oz_hcd *ozhcd;
 732        void *hpd;
 733        struct oz_endpoint *ep = NULL;
 734
 735        if (port == NULL) {
 736                oz_dbg(ON, "%s: port = 0\n", __func__);
 737                return;
 738        }
 739        ozhcd = port->ozhcd;
 740        if (ozhcd == NULL)
 741                return;
 742        /* Check if this is the connection port - if so clear it.
 743         */
 744        spin_lock_bh(&ozhcd->hcd_lock);
 745        if ((ozhcd->conn_port >= 0) &&
 746                (port == &ozhcd->ports[ozhcd->conn_port])) {
 747                oz_dbg(ON, "Clearing conn_port\n");
 748                ozhcd->conn_port = -1;
 749        }
 750        spin_lock(&port->port_lock);
 751        port->flags |= OZ_PORT_F_DYING;
 752        spin_unlock(&port->port_lock);
 753        spin_unlock_bh(&ozhcd->hcd_lock);
 754
 755        oz_clean_endpoints_for_config(ozhcd->hcd, port);
 756        spin_lock_bh(&port->port_lock);
 757        hpd = port->hpd;
 758        port->hpd = NULL;
 759        port->bus_addr = 0xff;
 760        port->config_num = 0;
 761        port->flags &= ~(OZ_PORT_F_PRESENT | OZ_PORT_F_DYING);
 762        port->flags |= OZ_PORT_F_CHANGED;
 763        port->status &= ~(USB_PORT_STAT_CONNECTION | USB_PORT_STAT_ENABLE);
 764        port->status |= (USB_PORT_STAT_C_CONNECTION << 16);
 765        /* If there is an endpont 0 then clear the pointer while we hold
 766         * the spinlock be we deallocate it after releasing the lock.
 767         */
 768        if (port->out_ep[0]) {
 769                ep = port->out_ep[0];
 770                port->out_ep[0] = NULL;
 771        }
 772        spin_unlock_bh(&port->port_lock);
 773        if (ep)
 774                oz_ep_free(port, ep);
 775        usb_hcd_poll_rh_status(ozhcd->hcd);
 776        oz_usb_put(hpd);
 777}
 778
 779/*
 780 * Context: softirq
 781 */
 782void oz_hcd_pd_reset(void *hpd, void *hport)
 783{
 784        /* Cleanup the current configuration and report reset to the core.
 785         */
 786        struct oz_port *port = (struct oz_port *)hport;
 787        struct oz_hcd *ozhcd = port->ozhcd;
 788
 789        oz_dbg(ON, "PD Reset\n");
 790        spin_lock_bh(&port->port_lock);
 791        port->flags |= OZ_PORT_F_CHANGED;
 792        port->status |= USB_PORT_STAT_RESET;
 793        port->status |= (USB_PORT_STAT_C_RESET << 16);
 794        spin_unlock_bh(&port->port_lock);
 795        oz_clean_endpoints_for_config(ozhcd->hcd, port);
 796        usb_hcd_poll_rh_status(ozhcd->hcd);
 797}
 798
 799/*
 800 * Context: softirq
 801 */
 802void oz_hcd_get_desc_cnf(void *hport, u8 req_id, int status, const u8 *desc,
 803                        int length, int offset, int total_size)
 804{
 805        struct oz_port *port = (struct oz_port *)hport;
 806        struct urb *urb;
 807        int err = 0;
 808
 809        oz_dbg(ON, "oz_hcd_get_desc_cnf length = %d offs = %d tot_size = %d\n",
 810               length, offset, total_size);
 811        urb = oz_find_urb_by_id(port, 0, req_id);
 812        if (!urb)
 813                return;
 814        if (status == 0) {
 815                int copy_len;
 816                int required_size = urb->transfer_buffer_length;
 817                if (required_size > total_size)
 818                        required_size = total_size;
 819                copy_len = required_size-offset;
 820                if (length <= copy_len)
 821                        copy_len = length;
 822                memcpy(urb->transfer_buffer+offset, desc, copy_len);
 823                offset += copy_len;
 824                if (offset < required_size) {
 825                        struct usb_ctrlrequest *setup =
 826                                (struct usb_ctrlrequest *)urb->setup_packet;
 827                        unsigned wvalue = le16_to_cpu(setup->wValue);
 828                        if (oz_enqueue_ep_urb(port, 0, 0, urb, req_id))
 829                                err = -ENOMEM;
 830                        else if (oz_usb_get_desc_req(port->hpd, req_id,
 831                                        setup->bRequestType, (u8)(wvalue>>8),
 832                                        (u8)wvalue, setup->wIndex, offset,
 833                                        required_size-offset)) {
 834                                oz_dequeue_ep_urb(port, 0, 0, urb);
 835                                err = -ENOMEM;
 836                        }
 837                        if (err == 0)
 838                                return;
 839                }
 840        }
 841        urb->actual_length = total_size;
 842        oz_complete_urb(port->ozhcd->hcd, urb, 0);
 843}
 844
 845/*
 846 * Context: softirq
 847 */
 848static void oz_display_conf_type(u8 t)
 849{
 850        switch (t) {
 851        case USB_REQ_GET_STATUS:
 852                oz_dbg(ON, "USB_REQ_GET_STATUS - cnf\n");
 853                break;
 854        case USB_REQ_CLEAR_FEATURE:
 855                oz_dbg(ON, "USB_REQ_CLEAR_FEATURE - cnf\n");
 856                break;
 857        case USB_REQ_SET_FEATURE:
 858                oz_dbg(ON, "USB_REQ_SET_FEATURE - cnf\n");
 859                break;
 860        case USB_REQ_SET_ADDRESS:
 861                oz_dbg(ON, "USB_REQ_SET_ADDRESS - cnf\n");
 862                break;
 863        case USB_REQ_GET_DESCRIPTOR:
 864                oz_dbg(ON, "USB_REQ_GET_DESCRIPTOR - cnf\n");
 865                break;
 866        case USB_REQ_SET_DESCRIPTOR:
 867                oz_dbg(ON, "USB_REQ_SET_DESCRIPTOR - cnf\n");
 868                break;
 869        case USB_REQ_GET_CONFIGURATION:
 870                oz_dbg(ON, "USB_REQ_GET_CONFIGURATION - cnf\n");
 871                break;
 872        case USB_REQ_SET_CONFIGURATION:
 873                oz_dbg(ON, "USB_REQ_SET_CONFIGURATION - cnf\n");
 874                break;
 875        case USB_REQ_GET_INTERFACE:
 876                oz_dbg(ON, "USB_REQ_GET_INTERFACE - cnf\n");
 877                break;
 878        case USB_REQ_SET_INTERFACE:
 879                oz_dbg(ON, "USB_REQ_SET_INTERFACE - cnf\n");
 880                break;
 881        case USB_REQ_SYNCH_FRAME:
 882                oz_dbg(ON, "USB_REQ_SYNCH_FRAME - cnf\n");
 883                break;
 884        }
 885}
 886
 887/*
 888 * Context: softirq
 889 */
 890static void oz_hcd_complete_set_config(struct oz_port *port, struct urb *urb,
 891                u8 rcode, u8 config_num)
 892{
 893        int rc = 0;
 894        struct usb_hcd *hcd = port->ozhcd->hcd;
 895
 896        if (rcode == 0) {
 897                port->config_num = config_num;
 898                oz_clean_endpoints_for_config(hcd, port);
 899                if (oz_build_endpoints_for_config(hcd, port,
 900                        &urb->dev->config[port->config_num-1], GFP_ATOMIC)) {
 901                        rc = -ENOMEM;
 902                }
 903        } else {
 904                rc = -ENOMEM;
 905        }
 906        oz_complete_urb(hcd, urb, rc);
 907}
 908
 909/*
 910 * Context: softirq
 911 */
 912static void oz_hcd_complete_set_interface(struct oz_port *port, struct urb *urb,
 913                u8 rcode, u8 if_num, u8 alt)
 914{
 915        struct usb_hcd *hcd = port->ozhcd->hcd;
 916        int rc = 0;
 917
 918        if ((rcode == 0) && (port->config_num > 0)) {
 919                struct usb_host_config *config;
 920                struct usb_host_interface *intf;
 921                oz_dbg(ON, "Set interface %d alt %d\n", if_num, alt);
 922                oz_clean_endpoints_for_interface(hcd, port, if_num);
 923                config = &urb->dev->config[port->config_num-1];
 924                intf = &config->intf_cache[if_num]->altsetting[alt];
 925                if (oz_build_endpoints_for_interface(hcd, port, intf,
 926                        GFP_ATOMIC))
 927                        rc = -ENOMEM;
 928                else
 929                        port->iface[if_num].alt = alt;
 930        } else {
 931                rc = -ENOMEM;
 932        }
 933        oz_complete_urb(hcd, urb, rc);
 934}
 935
 936/*
 937 * Context: softirq
 938 */
 939void oz_hcd_control_cnf(void *hport, u8 req_id, u8 rcode, const u8 *data,
 940        int data_len)
 941{
 942        struct oz_port *port = (struct oz_port *)hport;
 943        struct urb *urb;
 944        struct usb_ctrlrequest *setup;
 945        struct usb_hcd *hcd = port->ozhcd->hcd;
 946        unsigned windex;
 947        unsigned wvalue;
 948
 949        oz_dbg(ON, "oz_hcd_control_cnf rcode=%u len=%d\n", rcode, data_len);
 950        urb = oz_find_urb_by_id(port, 0, req_id);
 951        if (!urb) {
 952                oz_dbg(ON, "URB not found\n");
 953                return;
 954        }
 955        setup = (struct usb_ctrlrequest *)urb->setup_packet;
 956        windex = le16_to_cpu(setup->wIndex);
 957        wvalue = le16_to_cpu(setup->wValue);
 958        if ((setup->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) {
 959                /* Standard requests */
 960                oz_display_conf_type(setup->bRequest);
 961                switch (setup->bRequest) {
 962                case USB_REQ_SET_CONFIGURATION:
 963                        oz_hcd_complete_set_config(port, urb, rcode,
 964                                (u8)wvalue);
 965                        break;
 966                case USB_REQ_SET_INTERFACE:
 967                        oz_hcd_complete_set_interface(port, urb, rcode,
 968                                (u8)windex, (u8)wvalue);
 969                        break;
 970                default:
 971                        oz_complete_urb(hcd, urb, 0);
 972                }
 973
 974        } else {
 975                int copy_len;
 976                oz_dbg(ON, "VENDOR-CLASS - cnf\n");
 977                if (data_len) {
 978                        if (data_len <= urb->transfer_buffer_length)
 979                                copy_len = data_len;
 980                        else
 981                                copy_len = urb->transfer_buffer_length;
 982                        memcpy(urb->transfer_buffer, data, copy_len);
 983                        urb->actual_length = copy_len;
 984                }
 985                oz_complete_urb(hcd, urb, 0);
 986        }
 987}
 988
 989/*
 990 * Context: softirq-serialized
 991 */
 992static int oz_hcd_buffer_data(struct oz_endpoint *ep, const u8 *data,
 993                              int data_len)
 994{
 995        int space;
 996        int copy_len;
 997
 998        if (!ep->buffer)
 999                return -1;
1000        space = ep->out_ix-ep->in_ix-1;
1001        if (space < 0)
1002                space += ep->buffer_size;
1003        if (space < (data_len+1)) {
1004                oz_dbg(ON, "Buffer full\n");
1005                return -1;
1006        }
1007        ep->buffer[ep->in_ix] = (u8)data_len;
1008        if (++ep->in_ix == ep->buffer_size)
1009                ep->in_ix = 0;
1010        copy_len = ep->buffer_size - ep->in_ix;
1011        if (copy_len > data_len)
1012                copy_len = data_len;
1013        memcpy(&ep->buffer[ep->in_ix], data, copy_len);
1014
1015        if (copy_len < data_len) {
1016                memcpy(ep->buffer, data+copy_len, data_len-copy_len);
1017                ep->in_ix = data_len-copy_len;
1018        } else {
1019                ep->in_ix += copy_len;
1020        }
1021        if (ep->in_ix == ep->buffer_size)
1022                ep->in_ix = 0;
1023        ep->buffered_units++;
1024        return 0;
1025}
1026
1027/*
1028 * Context: softirq-serialized
1029 */
1030void oz_hcd_data_ind(void *hport, u8 endpoint, const u8 *data, int data_len)
1031{
1032        struct oz_port *port = (struct oz_port *)hport;
1033        struct oz_endpoint *ep;
1034        struct oz_hcd *ozhcd = port->ozhcd;
1035
1036        spin_lock_bh(&ozhcd->hcd_lock);
1037        ep = port->in_ep[endpoint & USB_ENDPOINT_NUMBER_MASK];
1038        if (ep == NULL)
1039                goto done;
1040        switch (ep->attrib & USB_ENDPOINT_XFERTYPE_MASK) {
1041        case USB_ENDPOINT_XFER_INT:
1042        case USB_ENDPOINT_XFER_BULK:
1043                if (!list_empty(&ep->urb_list)) {
1044                        struct oz_urb_link *urbl =
1045                                list_first_entry(&ep->urb_list,
1046                                        struct oz_urb_link, link);
1047                        struct urb *urb;
1048                        int copy_len;
1049                        list_del_init(&urbl->link);
1050                        spin_unlock_bh(&ozhcd->hcd_lock);
1051                        urb = urbl->urb;
1052                        oz_free_urb_link(urbl);
1053                        if (data_len <= urb->transfer_buffer_length)
1054                                copy_len = data_len;
1055                        else
1056                                copy_len = urb->transfer_buffer_length;
1057                        memcpy(urb->transfer_buffer, data, copy_len);
1058                        urb->actual_length = copy_len;
1059                        oz_complete_urb(port->ozhcd->hcd, urb, 0);
1060                        return;
1061                } else {
1062                        oz_dbg(ON, "buffering frame as URB is not available\n");
1063                        oz_hcd_buffer_data(ep, data, data_len);
1064                }
1065                break;
1066        case USB_ENDPOINT_XFER_ISOC:
1067                oz_hcd_buffer_data(ep, data, data_len);
1068                break;
1069        }
1070done:
1071        spin_unlock_bh(&ozhcd->hcd_lock);
1072}
1073
1074/*
1075 * Context: unknown
1076 */
1077static inline int oz_usb_get_frame_number(void)
1078{
1079        return atomic_inc_return(&g_usb_frame_number);
1080}
1081
1082/*
1083 * Context: softirq
1084 */
1085int oz_hcd_heartbeat(void *hport)
1086{
1087        int rc = 0;
1088        struct oz_port *port = (struct oz_port *)hport;
1089        struct oz_hcd *ozhcd = port->ozhcd;
1090        struct oz_urb_link *urbl;
1091        struct list_head xfr_list;
1092        struct list_head *e;
1093        struct list_head *n;
1094        struct urb *urb;
1095        struct oz_endpoint *ep;
1096        struct timespec ts, delta;
1097
1098        getrawmonotonic(&ts);
1099        INIT_LIST_HEAD(&xfr_list);
1100        /* Check the OUT isoc endpoints to see if any URB data can be sent.
1101         */
1102        spin_lock_bh(&ozhcd->hcd_lock);
1103        list_for_each(e, &port->isoc_out_ep) {
1104                ep = ep_from_link(e);
1105                if (ep->credit < 0)
1106                        continue;
1107                delta = timespec_sub(ts, ep->timestamp);
1108                ep->credit += div_u64(timespec_to_ns(&delta), NSEC_PER_MSEC);
1109                if (ep->credit > ep->credit_ceiling)
1110                        ep->credit = ep->credit_ceiling;
1111                ep->timestamp = ts;
1112                while (ep->credit && !list_empty(&ep->urb_list)) {
1113                        urbl = list_first_entry(&ep->urb_list,
1114                                struct oz_urb_link, link);
1115                        urb = urbl->urb;
1116                        if ((ep->credit + 1) < urb->number_of_packets)
1117                                break;
1118                        ep->credit -= urb->number_of_packets;
1119                        if (ep->credit < 0)
1120                                ep->credit = 0;
1121                        list_move_tail(&urbl->link, &xfr_list);
1122                }
1123        }
1124        spin_unlock_bh(&ozhcd->hcd_lock);
1125        /* Send to PD and complete URBs.
1126         */
1127        list_for_each_safe(e, n, &xfr_list) {
1128                urbl = container_of(e, struct oz_urb_link, link);
1129                urb = urbl->urb;
1130                list_del_init(e);
1131                urb->error_count = 0;
1132                urb->start_frame = oz_usb_get_frame_number();
1133                oz_usb_send_isoc(port->hpd, urbl->ep_num, urb);
1134                oz_free_urb_link(urbl);
1135                oz_complete_urb(port->ozhcd->hcd, urb, 0);
1136        }
1137        /* Check the IN isoc endpoints to see if any URBs can be completed.
1138         */
1139        spin_lock_bh(&ozhcd->hcd_lock);
1140        list_for_each(e, &port->isoc_in_ep) {
1141                struct oz_endpoint *ep = ep_from_link(e);
1142                if (ep->flags & OZ_F_EP_BUFFERING) {
1143                        if (ep->buffered_units >= OZ_IN_BUFFERING_UNITS) {
1144                                ep->flags &= ~OZ_F_EP_BUFFERING;
1145                                ep->credit = 0;
1146                                ep->timestamp = ts;
1147                                ep->start_frame = 0;
1148                        }
1149                        continue;
1150                }
1151                delta = timespec_sub(ts, ep->timestamp);
1152                ep->credit += div_u64(timespec_to_ns(&delta), NSEC_PER_MSEC);
1153                ep->timestamp = ts;
1154                while (!list_empty(&ep->urb_list)) {
1155                        struct oz_urb_link *urbl =
1156                                list_first_entry(&ep->urb_list,
1157                                        struct oz_urb_link, link);
1158                        struct urb *urb = urbl->urb;
1159                        int len = 0;
1160                        int copy_len;
1161                        int i;
1162                        if (ep->credit  < urb->number_of_packets)
1163                                break;
1164                        if (ep->buffered_units < urb->number_of_packets)
1165                                break;
1166                        urb->actual_length = 0;
1167                        for (i = 0; i < urb->number_of_packets; i++) {
1168                                len = ep->buffer[ep->out_ix];
1169                                if (++ep->out_ix == ep->buffer_size)
1170                                        ep->out_ix = 0;
1171                                copy_len = ep->buffer_size - ep->out_ix;
1172                                if (copy_len > len)
1173                                        copy_len = len;
1174                                memcpy(urb->transfer_buffer,
1175                                        &ep->buffer[ep->out_ix], copy_len);
1176                                if (copy_len < len) {
1177                                        memcpy(urb->transfer_buffer+copy_len,
1178                                                ep->buffer, len-copy_len);
1179                                        ep->out_ix = len-copy_len;
1180                                } else
1181                                        ep->out_ix += copy_len;
1182                                if (ep->out_ix == ep->buffer_size)
1183                                        ep->out_ix = 0;
1184                                urb->iso_frame_desc[i].offset =
1185                                        urb->actual_length;
1186                                urb->actual_length += len;
1187                                urb->iso_frame_desc[i].actual_length = len;
1188                                urb->iso_frame_desc[i].status = 0;
1189                        }
1190                        ep->buffered_units -= urb->number_of_packets;
1191                        urb->error_count = 0;
1192                        urb->start_frame = ep->start_frame;
1193                        ep->start_frame += urb->number_of_packets;
1194                        list_move_tail(&urbl->link, &xfr_list);
1195                        ep->credit -= urb->number_of_packets;
1196                }
1197        }
1198        if (!list_empty(&port->isoc_out_ep) || !list_empty(&port->isoc_in_ep))
1199                rc = 1;
1200        spin_unlock_bh(&ozhcd->hcd_lock);
1201        /* Complete the filled URBs.
1202         */
1203        list_for_each_safe(e, n, &xfr_list) {
1204                urbl = container_of(e, struct oz_urb_link, link);
1205                urb = urbl->urb;
1206                list_del_init(e);
1207                oz_free_urb_link(urbl);
1208                oz_complete_urb(port->ozhcd->hcd, urb, 0);
1209        }
1210        /* Check if there are any ep0 requests that have timed out.
1211         * If so resent to PD.
1212         */
1213        ep = port->out_ep[0];
1214        if (ep) {
1215                struct list_head *e;
1216                struct list_head *n;
1217                spin_lock_bh(&ozhcd->hcd_lock);
1218                list_for_each_safe(e, n, &ep->urb_list) {
1219                        urbl = container_of(e, struct oz_urb_link, link);
1220                        if (urbl->submit_counter > EP0_TIMEOUT_COUNTER) {
1221                                oz_dbg(ON, "Request 0x%p timeout\n", urbl->urb);
1222                                list_move_tail(e, &xfr_list);
1223                                urbl->submit_counter = 0;
1224                        } else {
1225                                urbl->submit_counter++;
1226                        }
1227                }
1228                if (!list_empty(&ep->urb_list))
1229                        rc = 1;
1230                spin_unlock_bh(&ozhcd->hcd_lock);
1231                e = xfr_list.next;
1232                while (e != &xfr_list) {
1233                        urbl = container_of(e, struct oz_urb_link, link);
1234                        e = e->next;
1235                        oz_dbg(ON, "Resending request to PD\n");
1236                        oz_process_ep0_urb(ozhcd, urbl->urb, GFP_ATOMIC);
1237                        oz_free_urb_link(urbl);
1238                }
1239        }
1240        return rc;
1241}
1242
1243/*
1244 * Context: softirq
1245 */
1246static int oz_build_endpoints_for_interface(struct usb_hcd *hcd,
1247                struct oz_port *port,
1248                struct usb_host_interface *intf, gfp_t mem_flags)
1249{
1250        struct oz_hcd *ozhcd = port->ozhcd;
1251        int i;
1252        int if_ix = intf->desc.bInterfaceNumber;
1253        int request_heartbeat = 0;
1254
1255        oz_dbg(ON, "interface[%d] = %p\n", if_ix, intf);
1256        if (if_ix >= port->num_iface || port->iface == NULL)
1257                return -ENOMEM;
1258        for (i = 0; i < intf->desc.bNumEndpoints; i++) {
1259                struct usb_host_endpoint *hep = &intf->endpoint[i];
1260                u8 ep_addr = hep->desc.bEndpointAddress;
1261                u8 ep_num = ep_addr & USB_ENDPOINT_NUMBER_MASK;
1262                struct oz_endpoint *ep;
1263                int buffer_size = 0;
1264
1265                oz_dbg(ON, "%d bEndpointAddress = %x\n", i, ep_addr);
1266                if (ep_addr & USB_ENDPOINT_DIR_MASK) {
1267                        switch (hep->desc.bmAttributes &
1268                                                USB_ENDPOINT_XFERTYPE_MASK) {
1269                        case USB_ENDPOINT_XFER_ISOC:
1270                                buffer_size = OZ_EP_BUFFER_SIZE_ISOC;
1271                                break;
1272                        case USB_ENDPOINT_XFER_INT:
1273                                buffer_size = OZ_EP_BUFFER_SIZE_INT;
1274                                break;
1275                        }
1276                }
1277
1278                ep = oz_ep_alloc(buffer_size, mem_flags);
1279                if (!ep) {
1280                        oz_clean_endpoints_for_interface(hcd, port, if_ix);
1281                        return -ENOMEM;
1282                }
1283                ep->attrib = hep->desc.bmAttributes;
1284                ep->ep_num = ep_num;
1285                if ((ep->attrib & USB_ENDPOINT_XFERTYPE_MASK)
1286                        == USB_ENDPOINT_XFER_ISOC) {
1287                        oz_dbg(ON, "wMaxPacketSize = %d\n",
1288                               usb_endpoint_maxp(&hep->desc));
1289                        ep->credit_ceiling = 200;
1290                        if (ep_addr & USB_ENDPOINT_DIR_MASK) {
1291                                ep->flags |= OZ_F_EP_BUFFERING;
1292                        } else {
1293                                ep->flags |= OZ_F_EP_HAVE_STREAM;
1294                                if (oz_usb_stream_create(port->hpd, ep_num))
1295                                        ep->flags &= ~OZ_F_EP_HAVE_STREAM;
1296                        }
1297                }
1298                spin_lock_bh(&ozhcd->hcd_lock);
1299                if (ep_addr & USB_ENDPOINT_DIR_MASK) {
1300                        port->in_ep[ep_num] = ep;
1301                        port->iface[if_ix].ep_mask |=
1302                                (1<<(ep_num+OZ_NB_ENDPOINTS));
1303                        if ((ep->attrib & USB_ENDPOINT_XFERTYPE_MASK)
1304                                 == USB_ENDPOINT_XFER_ISOC) {
1305                                list_add_tail(&ep->link, &port->isoc_in_ep);
1306                                request_heartbeat = 1;
1307                        }
1308                } else {
1309                        port->out_ep[ep_num] = ep;
1310                        port->iface[if_ix].ep_mask |= (1<<ep_num);
1311                        if ((ep->attrib & USB_ENDPOINT_XFERTYPE_MASK)
1312                                == USB_ENDPOINT_XFER_ISOC) {
1313                                list_add_tail(&ep->link, &port->isoc_out_ep);
1314                                request_heartbeat = 1;
1315                        }
1316                }
1317                spin_unlock_bh(&ozhcd->hcd_lock);
1318                if (request_heartbeat && port->hpd)
1319                        oz_usb_request_heartbeat(port->hpd);
1320        }
1321        return 0;
1322}
1323
1324/*
1325 * Context: softirq
1326 */
1327static void oz_clean_endpoints_for_interface(struct usb_hcd *hcd,
1328                        struct oz_port *port, int if_ix)
1329{
1330        struct oz_hcd *ozhcd = port->ozhcd;
1331        unsigned mask;
1332        int i;
1333        struct list_head ep_list;
1334
1335        oz_dbg(ON, "Deleting endpoints for interface %d\n", if_ix);
1336        if (if_ix >= port->num_iface)
1337                return;
1338        INIT_LIST_HEAD(&ep_list);
1339        spin_lock_bh(&ozhcd->hcd_lock);
1340        mask = port->iface[if_ix].ep_mask;
1341        port->iface[if_ix].ep_mask = 0;
1342        for (i = 0; i < OZ_NB_ENDPOINTS; i++) {
1343                struct list_head *e;
1344                /* Gather OUT endpoints.
1345                 */
1346                if ((mask & (1<<i)) && port->out_ep[i]) {
1347                        e = &port->out_ep[i]->link;
1348                        port->out_ep[i] = NULL;
1349                        /* Remove from isoc list if present.
1350                         */
1351                        list_move_tail(e, &ep_list);
1352                }
1353                /* Gather IN endpoints.
1354                 */
1355                if ((mask & (1<<(i+OZ_NB_ENDPOINTS))) && port->in_ep[i]) {
1356                        e = &port->in_ep[i]->link;
1357                        port->in_ep[i] = NULL;
1358                        list_move_tail(e, &ep_list);
1359                }
1360        }
1361        spin_unlock_bh(&ozhcd->hcd_lock);
1362        while (!list_empty(&ep_list)) {
1363                struct oz_endpoint *ep =
1364                        list_first_entry(&ep_list, struct oz_endpoint, link);
1365                list_del_init(&ep->link);
1366                oz_ep_free(port, ep);
1367        }
1368}
1369
1370/*
1371 * Context: softirq
1372 */
1373static int oz_build_endpoints_for_config(struct usb_hcd *hcd,
1374                struct oz_port *port, struct usb_host_config *config,
1375                gfp_t mem_flags)
1376{
1377        struct oz_hcd *ozhcd = port->ozhcd;
1378        int i;
1379        int num_iface = config->desc.bNumInterfaces;
1380
1381        if (num_iface) {
1382                struct oz_interface *iface;
1383
1384                iface = kmalloc(num_iface*sizeof(struct oz_interface),
1385                                mem_flags | __GFP_ZERO);
1386                if (!iface)
1387                        return -ENOMEM;
1388                spin_lock_bh(&ozhcd->hcd_lock);
1389                port->iface = iface;
1390                port->num_iface = num_iface;
1391                spin_unlock_bh(&ozhcd->hcd_lock);
1392        }
1393        for (i = 0; i < num_iface; i++) {
1394                struct usb_host_interface *intf =
1395                        &config->intf_cache[i]->altsetting[0];
1396                if (oz_build_endpoints_for_interface(hcd, port, intf,
1397                        mem_flags))
1398                        goto fail;
1399        }
1400        return 0;
1401fail:
1402        oz_clean_endpoints_for_config(hcd, port);
1403        return -1;
1404}
1405
1406/*
1407 * Context: softirq
1408 */
1409static void oz_clean_endpoints_for_config(struct usb_hcd *hcd,
1410                        struct oz_port *port)
1411{
1412        struct oz_hcd *ozhcd = port->ozhcd;
1413        int i;
1414
1415        oz_dbg(ON, "Deleting endpoints for configuration\n");
1416        for (i = 0; i < port->num_iface; i++)
1417                oz_clean_endpoints_for_interface(hcd, port, i);
1418        spin_lock_bh(&ozhcd->hcd_lock);
1419        if (port->iface) {
1420                oz_dbg(ON, "Freeing interfaces object\n");
1421                kfree(port->iface);
1422                port->iface = NULL;
1423        }
1424        port->num_iface = 0;
1425        spin_unlock_bh(&ozhcd->hcd_lock);
1426}
1427
1428/*
1429 * Context: tasklet
1430 */
1431static void *oz_claim_hpd(struct oz_port *port)
1432{
1433        void *hpd;
1434        struct oz_hcd *ozhcd = port->ozhcd;
1435
1436        spin_lock_bh(&ozhcd->hcd_lock);
1437        hpd = port->hpd;
1438        if (hpd)
1439                oz_usb_get(hpd);
1440        spin_unlock_bh(&ozhcd->hcd_lock);
1441        return hpd;
1442}
1443
1444/*
1445 * Context: tasklet
1446 */
1447static void oz_process_ep0_urb(struct oz_hcd *ozhcd, struct urb *urb,
1448                gfp_t mem_flags)
1449{
1450        struct usb_ctrlrequest *setup;
1451        unsigned windex;
1452        unsigned wvalue;
1453        unsigned wlength;
1454        void *hpd;
1455        u8 req_id;
1456        int rc = 0;
1457        unsigned complete = 0;
1458
1459        int port_ix = -1;
1460        struct oz_port *port = NULL;
1461
1462        oz_dbg(URB, "[%s]:(%p)\n", __func__, urb);
1463        port_ix = oz_get_port_from_addr(ozhcd, urb->dev->devnum);
1464        if (port_ix < 0) {
1465                rc = -EPIPE;
1466                goto out;
1467        }
1468        port =  &ozhcd->ports[port_ix];
1469        if (((port->flags & OZ_PORT_F_PRESENT) == 0)
1470                || (port->flags & OZ_PORT_F_DYING)) {
1471                oz_dbg(ON, "Refusing URB port_ix = %d devnum = %d\n",
1472                       port_ix, urb->dev->devnum);
1473                rc = -EPIPE;
1474                goto out;
1475        }
1476        /* Store port in private context data.
1477         */
1478        urb->hcpriv = port;
1479        setup = (struct usb_ctrlrequest *)urb->setup_packet;
1480        windex = le16_to_cpu(setup->wIndex);
1481        wvalue = le16_to_cpu(setup->wValue);
1482        wlength = le16_to_cpu(setup->wLength);
1483        oz_dbg(CTRL_DETAIL, "bRequestType = %x\n", setup->bRequestType);
1484        oz_dbg(CTRL_DETAIL, "bRequest = %x\n", setup->bRequest);
1485        oz_dbg(CTRL_DETAIL, "wValue = %x\n", wvalue);
1486        oz_dbg(CTRL_DETAIL, "wIndex = %x\n", windex);
1487        oz_dbg(CTRL_DETAIL, "wLength = %x\n", wlength);
1488
1489        req_id = port->next_req_id++;
1490        hpd = oz_claim_hpd(port);
1491        if (hpd == NULL) {
1492                oz_dbg(ON, "Cannot claim port\n");
1493                rc = -EPIPE;
1494                goto out;
1495        }
1496
1497        if ((setup->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) {
1498                /* Standard requests
1499                 */
1500                switch (setup->bRequest) {
1501                case USB_REQ_GET_DESCRIPTOR:
1502                        oz_dbg(ON, "USB_REQ_GET_DESCRIPTOR - req\n");
1503                        break;
1504                case USB_REQ_SET_ADDRESS:
1505                        oz_dbg(ON, "USB_REQ_SET_ADDRESS - req\n");
1506                        oz_dbg(ON, "Port %d address is 0x%x\n",
1507                               ozhcd->conn_port,
1508                               (u8)le16_to_cpu(setup->wValue));
1509                        spin_lock_bh(&ozhcd->hcd_lock);
1510                        if (ozhcd->conn_port >= 0) {
1511                                ozhcd->ports[ozhcd->conn_port].bus_addr =
1512                                        (u8)le16_to_cpu(setup->wValue);
1513                                oz_dbg(ON, "Clearing conn_port\n");
1514                                ozhcd->conn_port = -1;
1515                        }
1516                        spin_unlock_bh(&ozhcd->hcd_lock);
1517                        complete = 1;
1518                        break;
1519                case USB_REQ_SET_CONFIGURATION:
1520                        oz_dbg(ON, "USB_REQ_SET_CONFIGURATION - req\n");
1521                        break;
1522                case USB_REQ_GET_CONFIGURATION:
1523                        /* We short circuit this case and reply directly since
1524                         * we have the selected configuration number cached.
1525                         */
1526                        oz_dbg(ON, "USB_REQ_GET_CONFIGURATION - reply now\n");
1527                        if (urb->transfer_buffer_length >= 1) {
1528                                urb->actual_length = 1;
1529                                *((u8 *)urb->transfer_buffer) =
1530                                        port->config_num;
1531                                complete = 1;
1532                        } else {
1533                                rc = -EPIPE;
1534                        }
1535                        break;
1536                case USB_REQ_GET_INTERFACE:
1537                        /* We short circuit this case and reply directly since
1538                         * we have the selected interface alternative cached.
1539                         */
1540                        oz_dbg(ON, "USB_REQ_GET_INTERFACE - reply now\n");
1541                        if (urb->transfer_buffer_length >= 1) {
1542                                urb->actual_length = 1;
1543                                *((u8 *)urb->transfer_buffer) =
1544                                        port->iface[(u8)windex].alt;
1545                                oz_dbg(ON, "interface = %d alt = %d\n",
1546                                       windex, port->iface[(u8)windex].alt);
1547                                complete = 1;
1548                        } else {
1549                                rc = -EPIPE;
1550                        }
1551                        break;
1552                case USB_REQ_SET_INTERFACE:
1553                        oz_dbg(ON, "USB_REQ_SET_INTERFACE - req\n");
1554                        break;
1555                }
1556        }
1557        if (!rc && !complete) {
1558                int data_len = 0;
1559                if ((setup->bRequestType & USB_DIR_IN) == 0)
1560                        data_len = wlength;
1561                urb->actual_length = data_len;
1562                if (oz_usb_control_req(port->hpd, req_id, setup,
1563                                urb->transfer_buffer, data_len)) {
1564                        rc = -ENOMEM;
1565                } else {
1566                        /* Note: we are queuing the request after we have
1567                         * submitted it to be transmitted. If the request were
1568                         * to complete before we queued it then it would not
1569                         * be found in the queue. It seems impossible for
1570                         * this to happen but if it did the request would
1571                         * be resubmitted so the problem would hopefully
1572                         * resolve itself. Putting the request into the
1573                         * queue before it has been sent is worse since the
1574                         * urb could be cancelled while we are using it
1575                         * to build the request.
1576                         */
1577                        if (oz_enqueue_ep_urb(port, 0, 0, urb, req_id))
1578                                rc = -ENOMEM;
1579                }
1580        }
1581        oz_usb_put(hpd);
1582out:
1583        if (rc || complete) {
1584                oz_dbg(ON, "Completing request locally\n");
1585                oz_complete_urb(ozhcd->hcd, urb, rc);
1586        } else {
1587                oz_usb_request_heartbeat(port->hpd);
1588        }
1589}
1590
1591/*
1592 * Context: tasklet
1593 */
1594static int oz_urb_process(struct oz_hcd *ozhcd, struct urb *urb)
1595{
1596        int rc = 0;
1597        struct oz_port *port = urb->hcpriv;
1598        u8 ep_addr;
1599
1600        /* When we are paranoid we keep a list of urbs which we check against
1601         * before handing one back. This is just for debugging during
1602         * development and should be turned off in the released driver.
1603         */
1604        oz_remember_urb(urb);
1605        /* Check buffer is valid.
1606         */
1607        if (!urb->transfer_buffer && urb->transfer_buffer_length)
1608                return -EINVAL;
1609        /* Check if there is a device at the port - refuse if not.
1610         */
1611        if ((port->flags & OZ_PORT_F_PRESENT) == 0)
1612                return -EPIPE;
1613        ep_addr = usb_pipeendpoint(urb->pipe);
1614        if (ep_addr) {
1615                /* If the request is not for EP0 then queue it.
1616                 */
1617                if (oz_enqueue_ep_urb(port, ep_addr, usb_pipein(urb->pipe),
1618                        urb, 0))
1619                        rc = -EPIPE;
1620        } else {
1621                oz_process_ep0_urb(ozhcd, urb, GFP_ATOMIC);
1622        }
1623        return rc;
1624}
1625
1626/*
1627 * Context: tasklet
1628 */
1629static void oz_urb_process_tasklet(unsigned long unused)
1630{
1631        unsigned long irq_state;
1632        struct urb *urb;
1633        struct oz_hcd *ozhcd = oz_hcd_claim();
1634        int rc = 0;
1635
1636        if (ozhcd == NULL)
1637                return;
1638        /* This is called from a tasklet so is in softirq context but the urb
1639         * list is filled from any context so we need to lock
1640         * appropriately while removing urbs.
1641         */
1642        spin_lock_irqsave(&g_tasklet_lock, irq_state);
1643        while (!list_empty(&ozhcd->urb_pending_list)) {
1644                struct oz_urb_link *urbl =
1645                        list_first_entry(&ozhcd->urb_pending_list,
1646                                struct oz_urb_link, link);
1647                list_del_init(&urbl->link);
1648                spin_unlock_irqrestore(&g_tasklet_lock, irq_state);
1649                urb = urbl->urb;
1650                oz_free_urb_link(urbl);
1651                rc = oz_urb_process(ozhcd, urb);
1652                if (rc)
1653                        oz_complete_urb(ozhcd->hcd, urb, rc);
1654                spin_lock_irqsave(&g_tasklet_lock, irq_state);
1655        }
1656        spin_unlock_irqrestore(&g_tasklet_lock, irq_state);
1657        oz_hcd_put(ozhcd);
1658}
1659
1660/*
1661 * This function searches for the urb in any of the lists it could be in.
1662 * If it is found it is removed from the list and completed. If the urb is
1663 * being processed then it won't be in a list so won't be found. However, the
1664 * call to usb_hcd_check_unlink_urb() will set the value of the unlinked field
1665 * to a non-zero value. When an attempt is made to put the urb back in a list
1666 * the unlinked field will be checked and the urb will then be completed.
1667 * Context: tasklet
1668 */
1669static void oz_urb_cancel(struct oz_port *port, u8 ep_num, struct urb *urb)
1670{
1671        struct oz_urb_link *urbl = NULL;
1672        struct list_head *e;
1673        struct oz_hcd *ozhcd;
1674        unsigned long irq_state;
1675        u8 ix;
1676
1677        if (port == NULL) {
1678                oz_dbg(ON, "%s: ERROR: (%p) port is null\n", __func__, urb);
1679                return;
1680        }
1681        ozhcd = port->ozhcd;
1682        if (ozhcd == NULL) {
1683                oz_dbg(ON, "%s; ERROR: (%p) ozhcd is null\n", __func__, urb);
1684                return;
1685        }
1686
1687        /* Look in the tasklet queue.
1688         */
1689        spin_lock_irqsave(&g_tasklet_lock, irq_state);
1690        list_for_each(e, &ozhcd->urb_cancel_list) {
1691                urbl = container_of(e, struct oz_urb_link, link);
1692                if (urb == urbl->urb) {
1693                        list_del_init(e);
1694                        spin_unlock_irqrestore(&g_tasklet_lock, irq_state);
1695                        goto out2;
1696                }
1697        }
1698        spin_unlock_irqrestore(&g_tasklet_lock, irq_state);
1699        urbl = NULL;
1700
1701        /* Look in the orphanage.
1702         */
1703        spin_lock_irqsave(&ozhcd->hcd_lock, irq_state);
1704        list_for_each(e, &ozhcd->orphanage) {
1705                urbl = container_of(e, struct oz_urb_link, link);
1706                if (urbl->urb == urb) {
1707                        list_del(e);
1708                        oz_dbg(ON, "Found urb in orphanage\n");
1709                        goto out;
1710                }
1711        }
1712        ix = (ep_num & 0xf);
1713        urbl = NULL;
1714        if ((ep_num & USB_DIR_IN) && ix)
1715                urbl = oz_remove_urb(port->in_ep[ix], urb);
1716        else
1717                urbl = oz_remove_urb(port->out_ep[ix], urb);
1718out:
1719        spin_unlock_irqrestore(&ozhcd->hcd_lock, irq_state);
1720out2:
1721        if (urbl) {
1722                urb->actual_length = 0;
1723                oz_free_urb_link(urbl);
1724                oz_complete_urb(ozhcd->hcd, urb, -EPIPE);
1725        }
1726}
1727
1728/*
1729 * Context: tasklet
1730 */
1731static void oz_urb_cancel_tasklet(unsigned long unused)
1732{
1733        unsigned long irq_state;
1734        struct urb *urb;
1735        struct oz_hcd *ozhcd = oz_hcd_claim();
1736
1737        if (ozhcd == NULL)
1738                return;
1739        spin_lock_irqsave(&g_tasklet_lock, irq_state);
1740        while (!list_empty(&ozhcd->urb_cancel_list)) {
1741                struct oz_urb_link *urbl =
1742                        list_first_entry(&ozhcd->urb_cancel_list,
1743                                struct oz_urb_link, link);
1744                list_del_init(&urbl->link);
1745                spin_unlock_irqrestore(&g_tasklet_lock, irq_state);
1746                urb = urbl->urb;
1747                if (urb->unlinked)
1748                        oz_urb_cancel(urbl->port, urbl->ep_num, urb);
1749                oz_free_urb_link(urbl);
1750                spin_lock_irqsave(&g_tasklet_lock, irq_state);
1751        }
1752        spin_unlock_irqrestore(&g_tasklet_lock, irq_state);
1753        oz_hcd_put(ozhcd);
1754}
1755
1756/*
1757 * Context: unknown
1758 */
1759static void oz_hcd_clear_orphanage(struct oz_hcd *ozhcd, int status)
1760{
1761        if (ozhcd) {
1762                struct oz_urb_link *urbl;
1763                while (!list_empty(&ozhcd->orphanage)) {
1764                        urbl = list_first_entry(&ozhcd->orphanage,
1765                                struct oz_urb_link, link);
1766                        list_del(&urbl->link);
1767                        oz_complete_urb(ozhcd->hcd, urbl->urb, status);
1768                        oz_free_urb_link(urbl);
1769                }
1770        }
1771}
1772
1773/*
1774 * Context: unknown
1775 */
1776static int oz_hcd_start(struct usb_hcd *hcd)
1777{
1778        hcd->power_budget = 200;
1779        hcd->state = HC_STATE_RUNNING;
1780        hcd->uses_new_polling = 1;
1781        return 0;
1782}
1783
1784/*
1785 * Context: unknown
1786 */
1787static void oz_hcd_stop(struct usb_hcd *hcd)
1788{
1789}
1790
1791/*
1792 * Context: unknown
1793 */
1794static void oz_hcd_shutdown(struct usb_hcd *hcd)
1795{
1796}
1797
1798/*
1799 * Called to queue an urb for the device.
1800 * This function should return a non-zero error code if it fails the urb but
1801 * should not call usb_hcd_giveback_urb().
1802 * Context: any
1803 */
1804static int oz_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
1805                                gfp_t mem_flags)
1806{
1807        struct oz_hcd *ozhcd = oz_hcd_private(hcd);
1808        int rc;
1809        int port_ix;
1810        struct oz_port *port;
1811        unsigned long irq_state;
1812        struct oz_urb_link *urbl;
1813
1814        oz_dbg(URB, "%s: (%p)\n",  __func__, urb);
1815        if (unlikely(ozhcd == NULL)) {
1816                oz_dbg(URB, "Refused urb(%p) not ozhcd\n", urb);
1817                return -EPIPE;
1818        }
1819        if (unlikely(hcd->state != HC_STATE_RUNNING)) {
1820                oz_dbg(URB, "Refused urb(%p) not running\n", urb);
1821                return -EPIPE;
1822        }
1823        port_ix = oz_get_port_from_addr(ozhcd, urb->dev->devnum);
1824        if (port_ix < 0)
1825                return -EPIPE;
1826        port =  &ozhcd->ports[port_ix];
1827        if (port == NULL)
1828                return -EPIPE;
1829        if (!(port->flags & OZ_PORT_F_PRESENT) ||
1830                                (port->flags & OZ_PORT_F_CHANGED)) {
1831                oz_dbg(ON, "Refusing URB port_ix = %d devnum = %d\n",
1832                       port_ix, urb->dev->devnum);
1833                return -EPIPE;
1834        }
1835        urb->hcpriv = port;
1836        /* Put request in queue for processing by tasklet.
1837         */
1838        urbl = oz_alloc_urb_link();
1839        if (unlikely(urbl == NULL))
1840                return -ENOMEM;
1841        urbl->urb = urb;
1842        spin_lock_irqsave(&g_tasklet_lock, irq_state);
1843        rc = usb_hcd_link_urb_to_ep(hcd, urb);
1844        if (unlikely(rc)) {
1845                spin_unlock_irqrestore(&g_tasklet_lock, irq_state);
1846                oz_free_urb_link(urbl);
1847                return rc;
1848        }
1849        list_add_tail(&urbl->link, &ozhcd->urb_pending_list);
1850        spin_unlock_irqrestore(&g_tasklet_lock, irq_state);
1851        tasklet_schedule(&g_urb_process_tasklet);
1852        atomic_inc(&g_pending_urbs);
1853        return 0;
1854}
1855
1856/*
1857 * Context: tasklet
1858 */
1859static struct oz_urb_link *oz_remove_urb(struct oz_endpoint *ep,
1860                                struct urb *urb)
1861{
1862        struct oz_urb_link *urbl;
1863        struct list_head *e;
1864
1865        if (unlikely(ep == NULL))
1866                return NULL;
1867        list_for_each(e, &ep->urb_list) {
1868                urbl = container_of(e, struct oz_urb_link, link);
1869                if (urbl->urb == urb) {
1870                        list_del_init(e);
1871                        if (usb_pipeisoc(urb->pipe)) {
1872                                ep->credit -= urb->number_of_packets;
1873                                if (ep->credit < 0)
1874                                        ep->credit = 0;
1875                        }
1876                        return urbl;
1877                }
1878        }
1879        return NULL;
1880}
1881
1882/*
1883 * Called to dequeue a previously submitted urb for the device.
1884 * Context: any
1885 */
1886static int oz_hcd_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
1887{
1888        struct oz_hcd *ozhcd = oz_hcd_private(hcd);
1889        struct oz_urb_link *urbl;
1890        int rc;
1891        unsigned long irq_state;
1892
1893        oz_dbg(URB, "%s: (%p)\n",  __func__, urb);
1894        urbl = oz_alloc_urb_link();
1895        if (unlikely(urbl == NULL))
1896                return -ENOMEM;
1897        spin_lock_irqsave(&g_tasklet_lock, irq_state);
1898        /* The following function checks the urb is still in the queue
1899         * maintained by the core and that the unlinked field is zero.
1900         * If both are true the function sets the unlinked field and returns
1901         * zero. Otherwise it returns an error.
1902         */
1903        rc = usb_hcd_check_unlink_urb(hcd, urb, status);
1904        /* We have to check we haven't completed the urb or are about
1905         * to complete it. When we do we set hcpriv to 0 so if this has
1906         * already happened we don't put the urb in the cancel queue.
1907         */
1908        if ((rc == 0) && urb->hcpriv) {
1909                urbl->urb = urb;
1910                urbl->port = (struct oz_port *)urb->hcpriv;
1911                urbl->ep_num = usb_pipeendpoint(urb->pipe);
1912                if (usb_pipein(urb->pipe))
1913                        urbl->ep_num |= USB_DIR_IN;
1914                list_add_tail(&urbl->link, &ozhcd->urb_cancel_list);
1915                spin_unlock_irqrestore(&g_tasklet_lock, irq_state);
1916                tasklet_schedule(&g_urb_cancel_tasklet);
1917        } else {
1918                spin_unlock_irqrestore(&g_tasklet_lock, irq_state);
1919                oz_free_urb_link(urbl);
1920        }
1921        return rc;
1922}
1923
1924/*
1925 * Context: unknown
1926 */
1927static void oz_hcd_endpoint_disable(struct usb_hcd *hcd,
1928                                struct usb_host_endpoint *ep)
1929{
1930}
1931
1932/*
1933 * Context: unknown
1934 */
1935static void oz_hcd_endpoint_reset(struct usb_hcd *hcd,
1936                                struct usb_host_endpoint *ep)
1937{
1938}
1939
1940/*
1941 * Context: unknown
1942 */
1943static int oz_hcd_get_frame_number(struct usb_hcd *hcd)
1944{
1945        oz_dbg(ON, "oz_hcd_get_frame_number\n");
1946        return oz_usb_get_frame_number();
1947}
1948
1949/*
1950 * Context: softirq
1951 * This is called as a consquence of us calling usb_hcd_poll_rh_status() and we
1952 * always do that in softirq context.
1953 */
1954static int oz_hcd_hub_status_data(struct usb_hcd *hcd, char *buf)
1955{
1956        struct oz_hcd *ozhcd = oz_hcd_private(hcd);
1957        int i;
1958
1959        buf[0] = 0;
1960        buf[1] = 0;
1961
1962        spin_lock_bh(&ozhcd->hcd_lock);
1963        for (i = 0; i < OZ_NB_PORTS; i++) {
1964                if (ozhcd->ports[i].flags & OZ_PORT_F_CHANGED) {
1965                        oz_dbg(HUB, "Port %d changed\n", i);
1966                        ozhcd->ports[i].flags &= ~OZ_PORT_F_CHANGED;
1967                        if (i < 7)
1968                                buf[0] |= 1 << (i + 1);
1969                        else
1970                                buf[1] |= 1 << (i - 7);
1971                }
1972        }
1973        spin_unlock_bh(&ozhcd->hcd_lock);
1974        if (buf[0] != 0 || buf[1] != 0)
1975                return 2;
1976        else
1977                return 0;
1978}
1979
1980/*
1981 * Context: process
1982 */
1983static void oz_get_hub_descriptor(struct usb_hcd *hcd,
1984                                struct usb_hub_descriptor *desc)
1985{
1986        memset(desc, 0, sizeof(*desc));
1987        desc->bDescriptorType = 0x29;
1988        desc->bDescLength = 9;
1989        desc->wHubCharacteristics = (__force __u16)
1990                        __constant_cpu_to_le16(0x0001);
1991        desc->bNbrPorts = OZ_NB_PORTS;
1992}
1993
1994/*
1995 * Context: process
1996 */
1997static int oz_set_port_feature(struct usb_hcd *hcd, u16 wvalue, u16 windex)
1998{
1999        struct oz_port *port;
2000        int err = 0;
2001        u8 port_id = (u8)windex;
2002        struct oz_hcd *ozhcd = oz_hcd_private(hcd);
2003        unsigned set_bits = 0;
2004        unsigned clear_bits = 0;
2005
2006        if ((port_id < 1) || (port_id > OZ_NB_PORTS))
2007                return -EPIPE;
2008        port = &ozhcd->ports[port_id-1];
2009        switch (wvalue) {
2010        case USB_PORT_FEAT_CONNECTION:
2011                oz_dbg(HUB, "USB_PORT_FEAT_CONNECTION\n");
2012                break;
2013        case USB_PORT_FEAT_ENABLE:
2014                oz_dbg(HUB, "USB_PORT_FEAT_ENABLE\n");
2015                break;
2016        case USB_PORT_FEAT_SUSPEND:
2017                oz_dbg(HUB, "USB_PORT_FEAT_SUSPEND\n");
2018                break;
2019        case USB_PORT_FEAT_OVER_CURRENT:
2020                oz_dbg(HUB, "USB_PORT_FEAT_OVER_CURRENT\n");
2021                break;
2022        case USB_PORT_FEAT_RESET:
2023                oz_dbg(HUB, "USB_PORT_FEAT_RESET\n");
2024                set_bits = USB_PORT_STAT_ENABLE | (USB_PORT_STAT_C_RESET<<16);
2025                clear_bits = USB_PORT_STAT_RESET;
2026                ozhcd->ports[port_id-1].bus_addr = 0;
2027                break;
2028        case USB_PORT_FEAT_POWER:
2029                oz_dbg(HUB, "USB_PORT_FEAT_POWER\n");
2030                set_bits |= USB_PORT_STAT_POWER;
2031                break;
2032        case USB_PORT_FEAT_LOWSPEED:
2033                oz_dbg(HUB, "USB_PORT_FEAT_LOWSPEED\n");
2034                break;
2035        case USB_PORT_FEAT_C_CONNECTION:
2036                oz_dbg(HUB, "USB_PORT_FEAT_C_CONNECTION\n");
2037                break;
2038        case USB_PORT_FEAT_C_ENABLE:
2039                oz_dbg(HUB, "USB_PORT_FEAT_C_ENABLE\n");
2040                break;
2041        case USB_PORT_FEAT_C_SUSPEND:
2042                oz_dbg(HUB, "USB_PORT_FEAT_C_SUSPEND\n");
2043                break;
2044        case USB_PORT_FEAT_C_OVER_CURRENT:
2045                oz_dbg(HUB, "USB_PORT_FEAT_C_OVER_CURRENT\n");
2046                break;
2047        case USB_PORT_FEAT_C_RESET:
2048                oz_dbg(HUB, "USB_PORT_FEAT_C_RESET\n");
2049                break;
2050        case USB_PORT_FEAT_TEST:
2051                oz_dbg(HUB, "USB_PORT_FEAT_TEST\n");
2052                break;
2053        case USB_PORT_FEAT_INDICATOR:
2054                oz_dbg(HUB, "USB_PORT_FEAT_INDICATOR\n");
2055                break;
2056        default:
2057                oz_dbg(HUB, "Other %d\n", wvalue);
2058                break;
2059        }
2060        if (set_bits || clear_bits) {
2061                spin_lock_bh(&port->port_lock);
2062                port->status &= ~clear_bits;
2063                port->status |= set_bits;
2064                spin_unlock_bh(&port->port_lock);
2065        }
2066        oz_dbg(HUB, "Port[%d] status = 0x%x\n", port_id, port->status);
2067        return err;
2068}
2069
2070/*
2071 * Context: process
2072 */
2073static int oz_clear_port_feature(struct usb_hcd *hcd, u16 wvalue, u16 windex)
2074{
2075        struct oz_port *port;
2076        int err = 0;
2077        u8 port_id = (u8)windex;
2078        struct oz_hcd *ozhcd = oz_hcd_private(hcd);
2079        unsigned clear_bits = 0;
2080
2081        if ((port_id < 1) || (port_id > OZ_NB_PORTS))
2082                return -EPIPE;
2083        port = &ozhcd->ports[port_id-1];
2084        switch (wvalue) {
2085        case USB_PORT_FEAT_CONNECTION:
2086                oz_dbg(HUB, "USB_PORT_FEAT_CONNECTION\n");
2087                break;
2088        case USB_PORT_FEAT_ENABLE:
2089                oz_dbg(HUB, "USB_PORT_FEAT_ENABLE\n");
2090                clear_bits = USB_PORT_STAT_ENABLE;
2091                break;
2092        case USB_PORT_FEAT_SUSPEND:
2093                oz_dbg(HUB, "USB_PORT_FEAT_SUSPEND\n");
2094                break;
2095        case USB_PORT_FEAT_OVER_CURRENT:
2096                oz_dbg(HUB, "USB_PORT_FEAT_OVER_CURRENT\n");
2097                break;
2098        case USB_PORT_FEAT_RESET:
2099                oz_dbg(HUB, "USB_PORT_FEAT_RESET\n");
2100                break;
2101        case USB_PORT_FEAT_POWER:
2102                oz_dbg(HUB, "USB_PORT_FEAT_POWER\n");
2103                clear_bits |= USB_PORT_STAT_POWER;
2104                break;
2105        case USB_PORT_FEAT_LOWSPEED:
2106                oz_dbg(HUB, "USB_PORT_FEAT_LOWSPEED\n");
2107                break;
2108        case USB_PORT_FEAT_C_CONNECTION:
2109                oz_dbg(HUB, "USB_PORT_FEAT_C_CONNECTION\n");
2110                clear_bits = (USB_PORT_STAT_C_CONNECTION << 16);
2111                break;
2112        case USB_PORT_FEAT_C_ENABLE:
2113                oz_dbg(HUB, "USB_PORT_FEAT_C_ENABLE\n");
2114                clear_bits = (USB_PORT_STAT_C_ENABLE << 16);
2115                break;
2116        case USB_PORT_FEAT_C_SUSPEND:
2117                oz_dbg(HUB, "USB_PORT_FEAT_C_SUSPEND\n");
2118                break;
2119        case USB_PORT_FEAT_C_OVER_CURRENT:
2120                oz_dbg(HUB, "USB_PORT_FEAT_C_OVER_CURRENT\n");
2121                break;
2122        case USB_PORT_FEAT_C_RESET:
2123                oz_dbg(HUB, "USB_PORT_FEAT_C_RESET\n");
2124                clear_bits = (USB_PORT_FEAT_C_RESET << 16);
2125                break;
2126        case USB_PORT_FEAT_TEST:
2127                oz_dbg(HUB, "USB_PORT_FEAT_TEST\n");
2128                break;
2129        case USB_PORT_FEAT_INDICATOR:
2130                oz_dbg(HUB, "USB_PORT_FEAT_INDICATOR\n");
2131                break;
2132        default:
2133                oz_dbg(HUB, "Other %d\n", wvalue);
2134                break;
2135        }
2136        if (clear_bits) {
2137                spin_lock_bh(&port->port_lock);
2138                port->status &= ~clear_bits;
2139                spin_unlock_bh(&port->port_lock);
2140        }
2141        oz_dbg(HUB, "Port[%d] status = 0x%x\n",
2142               port_id, ozhcd->ports[port_id-1].status);
2143        return err;
2144}
2145
2146/*
2147 * Context: process
2148 */
2149static int oz_get_port_status(struct usb_hcd *hcd, u16 windex, char *buf)
2150{
2151        struct oz_hcd *ozhcd;
2152        u32 status;
2153
2154        if ((windex < 1) || (windex > OZ_NB_PORTS))
2155                return -EPIPE;
2156        ozhcd = oz_hcd_private(hcd);
2157        oz_dbg(HUB, "GetPortStatus windex = %d\n", windex);
2158        status = ozhcd->ports[windex-1].status;
2159        put_unaligned(cpu_to_le32(status), (__le32 *)buf);
2160        oz_dbg(HUB, "Port[%d] status = %x\n", windex, status);
2161        return 0;
2162}
2163
2164/*
2165 * Context: process
2166 */
2167static int oz_hcd_hub_control(struct usb_hcd *hcd, u16 req_type, u16 wvalue,
2168                                u16 windex, char *buf, u16 wlength)
2169{
2170        int err = 0;
2171
2172        switch (req_type) {
2173        case ClearHubFeature:
2174                oz_dbg(HUB, "ClearHubFeature: %d\n", req_type);
2175                break;
2176        case ClearPortFeature:
2177                err = oz_clear_port_feature(hcd, wvalue, windex);
2178                break;
2179        case GetHubDescriptor:
2180                oz_get_hub_descriptor(hcd, (struct usb_hub_descriptor *)buf);
2181                break;
2182        case GetHubStatus:
2183                oz_dbg(HUB, "GetHubStatus: req_type = 0x%x\n", req_type);
2184                put_unaligned(__constant_cpu_to_le32(0), (__le32 *)buf);
2185                break;
2186        case GetPortStatus:
2187                err = oz_get_port_status(hcd, windex, buf);
2188                break;
2189        case SetHubFeature:
2190                oz_dbg(HUB, "SetHubFeature: %d\n", req_type);
2191                break;
2192        case SetPortFeature:
2193                err = oz_set_port_feature(hcd, wvalue, windex);
2194                break;
2195        default:
2196                oz_dbg(HUB, "Other: %d\n", req_type);
2197                break;
2198        }
2199        return err;
2200}
2201
2202/*
2203 * Context: process
2204 */
2205static int oz_hcd_bus_suspend(struct usb_hcd *hcd)
2206{
2207        struct oz_hcd *ozhcd;
2208
2209        ozhcd = oz_hcd_private(hcd);
2210        spin_lock_bh(&ozhcd->hcd_lock);
2211        hcd->state = HC_STATE_SUSPENDED;
2212        ozhcd->flags |= OZ_HDC_F_SUSPENDED;
2213        spin_unlock_bh(&ozhcd->hcd_lock);
2214        return 0;
2215}
2216
2217/*
2218 * Context: process
2219 */
2220static int oz_hcd_bus_resume(struct usb_hcd *hcd)
2221{
2222        struct oz_hcd *ozhcd;
2223
2224        ozhcd = oz_hcd_private(hcd);
2225        spin_lock_bh(&ozhcd->hcd_lock);
2226        ozhcd->flags &= ~OZ_HDC_F_SUSPENDED;
2227        hcd->state = HC_STATE_RUNNING;
2228        spin_unlock_bh(&ozhcd->hcd_lock);
2229        return 0;
2230}
2231
2232static void oz_plat_shutdown(struct platform_device *dev)
2233{
2234}
2235
2236/*
2237 * Context: process
2238 */
2239static int oz_plat_probe(struct platform_device *dev)
2240{
2241        int i;
2242        int err;
2243        struct usb_hcd *hcd;
2244        struct oz_hcd *ozhcd;
2245
2246        hcd = usb_create_hcd(&g_oz_hc_drv, &dev->dev, dev_name(&dev->dev));
2247        if (hcd == NULL) {
2248                oz_dbg(ON, "Failed to created hcd object OK\n");
2249                return -ENOMEM;
2250        }
2251        ozhcd = oz_hcd_private(hcd);
2252        memset(ozhcd, 0, sizeof(*ozhcd));
2253        INIT_LIST_HEAD(&ozhcd->urb_pending_list);
2254        INIT_LIST_HEAD(&ozhcd->urb_cancel_list);
2255        INIT_LIST_HEAD(&ozhcd->orphanage);
2256        ozhcd->hcd = hcd;
2257        ozhcd->conn_port = -1;
2258        spin_lock_init(&ozhcd->hcd_lock);
2259        for (i = 0; i < OZ_NB_PORTS; i++) {
2260                struct oz_port *port = &ozhcd->ports[i];
2261                port->ozhcd = ozhcd;
2262                port->flags = 0;
2263                port->status = 0;
2264                port->bus_addr = 0xff;
2265                spin_lock_init(&port->port_lock);
2266        }
2267        err = usb_add_hcd(hcd, 0, 0);
2268        if (err) {
2269                oz_dbg(ON, "Failed to add hcd object OK\n");
2270                usb_put_hcd(hcd);
2271                return -1;
2272        }
2273        spin_lock_bh(&g_hcdlock);
2274        g_ozhcd = ozhcd;
2275        spin_unlock_bh(&g_hcdlock);
2276        return 0;
2277}
2278
2279/*
2280 * Context: unknown
2281 */
2282static int oz_plat_remove(struct platform_device *dev)
2283{
2284        struct usb_hcd *hcd = platform_get_drvdata(dev);
2285        struct oz_hcd *ozhcd;
2286
2287        if (hcd == NULL)
2288                return -1;
2289        ozhcd = oz_hcd_private(hcd);
2290        spin_lock_bh(&g_hcdlock);
2291        if (ozhcd == g_ozhcd)
2292                g_ozhcd = NULL;
2293        spin_unlock_bh(&g_hcdlock);
2294        oz_dbg(ON, "Clearing orphanage\n");
2295        oz_hcd_clear_orphanage(ozhcd, -EPIPE);
2296        oz_dbg(ON, "Removing hcd\n");
2297        usb_remove_hcd(hcd);
2298        usb_put_hcd(hcd);
2299        oz_empty_link_pool();
2300        return 0;
2301}
2302
2303/*
2304 * Context: unknown
2305 */
2306static int oz_plat_suspend(struct platform_device *dev, pm_message_t msg)
2307{
2308        return 0;
2309}
2310
2311
2312/*
2313 * Context: unknown
2314 */
2315static int oz_plat_resume(struct platform_device *dev)
2316{
2317        return 0;
2318}
2319
2320/*
2321 * Context: process
2322 */
2323int oz_hcd_init(void)
2324{
2325        int err;
2326
2327        if (usb_disabled())
2328                return -ENODEV;
2329        tasklet_init(&g_urb_process_tasklet, oz_urb_process_tasklet, 0);
2330        tasklet_init(&g_urb_cancel_tasklet, oz_urb_cancel_tasklet, 0);
2331        err = platform_driver_register(&g_oz_plat_drv);
2332        oz_dbg(ON, "platform_driver_register() returned %d\n", err);
2333        if (err)
2334                goto error;
2335        g_plat_dev = platform_device_alloc(OZ_PLAT_DEV_NAME, -1);
2336        if (g_plat_dev == NULL) {
2337                err = -ENOMEM;
2338                goto error1;
2339        }
2340        oz_dbg(ON, "platform_device_alloc() succeeded\n");
2341        err = platform_device_add(g_plat_dev);
2342        if (err)
2343                goto error2;
2344        oz_dbg(ON, "platform_device_add() succeeded\n");
2345        return 0;
2346error2:
2347        platform_device_put(g_plat_dev);
2348error1:
2349        platform_driver_unregister(&g_oz_plat_drv);
2350error:
2351        tasklet_disable(&g_urb_process_tasklet);
2352        tasklet_disable(&g_urb_cancel_tasklet);
2353        oz_dbg(ON, "oz_hcd_init() failed %d\n", err);
2354        return err;
2355}
2356
2357/*
2358 * Context: process
2359 */
2360void oz_hcd_term(void)
2361{
2362        msleep(OZ_HUB_DEBOUNCE_TIMEOUT);
2363        tasklet_kill(&g_urb_process_tasklet);
2364        tasklet_kill(&g_urb_cancel_tasklet);
2365        platform_device_unregister(g_plat_dev);
2366        platform_driver_unregister(&g_oz_plat_drv);
2367        oz_dbg(ON, "Pending urbs:%d\n", atomic_read(&g_pending_urbs));
2368}
2369