linux/drivers/usb/host/isp1362-hcd.c
<<
>>
Prefs
   1/*
   2 * ISP1362 HCD (Host Controller Driver) for USB.
   3 *
   4 * Copyright (C) 2005 Lothar Wassmann <LW@KARO-electronics.de>
   5 *
   6 * Derived from the SL811 HCD, rewritten for ISP116x.
   7 * Copyright (C) 2005 Olav Kongas <ok@artecdesign.ee>
   8 *
   9 * Portions:
  10 * Copyright (C) 2004 Psion Teklogix (for NetBook PRO)
  11 * Copyright (C) 2004 David Brownell
  12 */
  13
  14/*
  15 * The ISP1362 chip requires a large delay (300ns and 462ns) between
  16 * accesses to the address and data register.
  17 * The following timing options exist:
  18 *
  19 * 1. Configure your memory controller to add such delays if it can (the best)
  20 * 2. Implement platform-specific delay function possibly
  21 *    combined with configuring the memory controller; see
  22 *    include/linux/usb_isp1362.h for more info.
  23 * 3. Use ndelay (easiest, poorest).
  24 *
  25 * Use the corresponding macros USE_PLATFORM_DELAY and USE_NDELAY in the
  26 * platform specific section of isp1362.h to select the appropriate variant.
  27 *
  28 * Also note that according to the Philips "ISP1362 Errata" document
  29 * Rev 1.00 from 27 May data corruption may occur when the #WR signal
  30 * is reasserted (even with #CS deasserted) within 132ns after a
  31 * write cycle to any controller register. If the hardware doesn't
  32 * implement the recommended fix (gating the #WR with #CS) software
  33 * must ensure that no further write cycle (not necessarily to the chip!)
  34 * is issued by the CPU within this interval.
  35
  36 * For PXA25x this can be ensured by using VLIO with the maximum
  37 * recovery time (MSCx = 0x7f8c) with a memory clock of 99.53 MHz.
  38 */
  39
  40#ifdef CONFIG_USB_DEBUG
  41# define ISP1362_DEBUG
  42#else
  43# undef ISP1362_DEBUG
  44#endif
  45
  46/*
  47 * The PXA255 UDC apparently doesn't handle GET_STATUS, GET_CONFIG and
  48 * GET_INTERFACE requests correctly when the SETUP and DATA stages of the
  49 * requests are carried out in separate frames. This will delay any SETUP
  50 * packets until the start of the next frame so that this situation is
  51 * unlikely to occur (and makes usbtest happy running with a PXA255 target
  52 * device).
  53 */
  54#undef BUGGY_PXA2XX_UDC_USBTEST
  55
  56#undef PTD_TRACE
  57#undef URB_TRACE
  58#undef VERBOSE
  59#undef REGISTERS
  60
  61/* This enables a memory test on the ISP1362 chip memory to make sure the
  62 * chip access timing is correct.
  63 */
  64#undef CHIP_BUFFER_TEST
  65
  66#include <linux/module.h>
  67#include <linux/moduleparam.h>
  68#include <linux/kernel.h>
  69#include <linux/delay.h>
  70#include <linux/ioport.h>
  71#include <linux/sched.h>
  72#include <linux/slab.h>
  73#include <linux/errno.h>
  74#include <linux/init.h>
  75#include <linux/list.h>
  76#include <linux/interrupt.h>
  77#include <linux/usb.h>
  78#include <linux/usb/isp1362.h>
  79#include <linux/usb/hcd.h>
  80#include <linux/platform_device.h>
  81#include <linux/pm.h>
  82#include <linux/io.h>
  83#include <linux/bitmap.h>
  84#include <linux/prefetch.h>
  85
  86#include <asm/irq.h>
  87#include <asm/system.h>
  88#include <asm/byteorder.h>
  89#include <asm/unaligned.h>
  90
  91static int dbg_level;
  92#ifdef ISP1362_DEBUG
  93module_param(dbg_level, int, 0644);
  94#else
  95module_param(dbg_level, int, 0);
  96#define STUB_DEBUG_FILE
  97#endif
  98
  99#include "../core/usb.h"
 100#include "isp1362.h"
 101
 102
 103#define DRIVER_VERSION  "2005-04-04"
 104#define DRIVER_DESC     "ISP1362 USB Host Controller Driver"
 105
 106MODULE_DESCRIPTION(DRIVER_DESC);
 107MODULE_LICENSE("GPL");
 108
 109static const char hcd_name[] = "isp1362-hcd";
 110
 111static void isp1362_hc_stop(struct usb_hcd *hcd);
 112static int isp1362_hc_start(struct usb_hcd *hcd);
 113
 114/*-------------------------------------------------------------------------*/
 115
 116/*
 117 * When called from the interrupthandler only isp1362_hcd->irqenb is modified,
 118 * since the interrupt handler will write isp1362_hcd->irqenb to HCuPINT upon
 119 * completion.
 120 * We don't need a 'disable' counterpart, since interrupts will be disabled
 121 * only by the interrupt handler.
 122 */
 123static inline void isp1362_enable_int(struct isp1362_hcd *isp1362_hcd, u16 mask)
 124{
 125        if ((isp1362_hcd->irqenb | mask) == isp1362_hcd->irqenb)
 126                return;
 127        if (mask & ~isp1362_hcd->irqenb)
 128                isp1362_write_reg16(isp1362_hcd, HCuPINT, mask & ~isp1362_hcd->irqenb);
 129        isp1362_hcd->irqenb |= mask;
 130        if (isp1362_hcd->irq_active)
 131                return;
 132        isp1362_write_reg16(isp1362_hcd, HCuPINTENB, isp1362_hcd->irqenb);
 133}
 134
 135/*-------------------------------------------------------------------------*/
 136
 137static inline struct isp1362_ep_queue *get_ptd_queue(struct isp1362_hcd *isp1362_hcd,
 138                                                     u16 offset)
 139{
 140        struct isp1362_ep_queue *epq = NULL;
 141
 142        if (offset < isp1362_hcd->istl_queue[1].buf_start)
 143                epq = &isp1362_hcd->istl_queue[0];
 144        else if (offset < isp1362_hcd->intl_queue.buf_start)
 145                epq = &isp1362_hcd->istl_queue[1];
 146        else if (offset < isp1362_hcd->atl_queue.buf_start)
 147                epq = &isp1362_hcd->intl_queue;
 148        else if (offset < isp1362_hcd->atl_queue.buf_start +
 149                   isp1362_hcd->atl_queue.buf_size)
 150                epq = &isp1362_hcd->atl_queue;
 151
 152        if (epq)
 153                DBG(1, "%s: PTD $%04x is on %s queue\n", __func__, offset, epq->name);
 154        else
 155                pr_warning("%s: invalid PTD $%04x\n", __func__, offset);
 156
 157        return epq;
 158}
 159
 160static inline int get_ptd_offset(struct isp1362_ep_queue *epq, u8 index)
 161{
 162        int offset;
 163
 164        if (index * epq->blk_size > epq->buf_size) {
 165                pr_warning("%s: Bad %s index %d(%d)\n", __func__, epq->name, index,
 166                     epq->buf_size / epq->blk_size);
 167                return -EINVAL;
 168        }
 169        offset = epq->buf_start + index * epq->blk_size;
 170        DBG(3, "%s: %s PTD[%02x] # %04x\n", __func__, epq->name, index, offset);
 171
 172        return offset;
 173}
 174
 175/*-------------------------------------------------------------------------*/
 176
 177static inline u16 max_transfer_size(struct isp1362_ep_queue *epq, size_t size,
 178                                    int mps)
 179{
 180        u16 xfer_size = min_t(size_t, MAX_XFER_SIZE, size);
 181
 182        xfer_size = min_t(size_t, xfer_size, epq->buf_avail * epq->blk_size - PTD_HEADER_SIZE);
 183        if (xfer_size < size && xfer_size % mps)
 184                xfer_size -= xfer_size % mps;
 185
 186        return xfer_size;
 187}
 188
 189static int claim_ptd_buffers(struct isp1362_ep_queue *epq,
 190                             struct isp1362_ep *ep, u16 len)
 191{
 192        int ptd_offset = -EINVAL;
 193        int num_ptds = ((len + PTD_HEADER_SIZE - 1) / epq->blk_size) + 1;
 194        int found;
 195
 196        BUG_ON(len > epq->buf_size);
 197
 198        if (!epq->buf_avail)
 199                return -ENOMEM;
 200
 201        if (ep->num_ptds)
 202                pr_err("%s: %s len %d/%d num_ptds %d buf_map %08lx skip_map %08lx\n", __func__,
 203                    epq->name, len, epq->blk_size, num_ptds, epq->buf_map, epq->skip_map);
 204        BUG_ON(ep->num_ptds != 0);
 205
 206        found = bitmap_find_next_zero_area(&epq->buf_map, epq->buf_count, 0,
 207                                                num_ptds, 0);
 208        if (found >= epq->buf_count)
 209                return -EOVERFLOW;
 210
 211        DBG(1, "%s: Found %d PTDs[%d] for %d/%d byte\n", __func__,
 212            num_ptds, found, len, (int)(epq->blk_size - PTD_HEADER_SIZE));
 213        ptd_offset = get_ptd_offset(epq, found);
 214        WARN_ON(ptd_offset < 0);
 215        ep->ptd_offset = ptd_offset;
 216        ep->num_ptds += num_ptds;
 217        epq->buf_avail -= num_ptds;
 218        BUG_ON(epq->buf_avail > epq->buf_count);
 219        ep->ptd_index = found;
 220        bitmap_set(&epq->buf_map, found, num_ptds);
 221        DBG(1, "%s: Done %s PTD[%d] $%04x, avail %d count %d claimed %d %08lx:%08lx\n",
 222            __func__, epq->name, ep->ptd_index, ep->ptd_offset,
 223            epq->buf_avail, epq->buf_count, num_ptds, epq->buf_map, epq->skip_map);
 224
 225        return found;
 226}
 227
 228static inline void release_ptd_buffers(struct isp1362_ep_queue *epq, struct isp1362_ep *ep)
 229{
 230        int last = ep->ptd_index + ep->num_ptds;
 231
 232        if (last > epq->buf_count)
 233                pr_err("%s: ep %p req %d len %d %s PTD[%d] $%04x num_ptds %d buf_count %d buf_avail %d buf_map %08lx skip_map %08lx\n",
 234                    __func__, ep, ep->num_req, ep->length, epq->name, ep->ptd_index,
 235                    ep->ptd_offset, ep->num_ptds, epq->buf_count, epq->buf_avail,
 236                    epq->buf_map, epq->skip_map);
 237        BUG_ON(last > epq->buf_count);
 238
 239        bitmap_clear(&epq->buf_map, ep->ptd_index, ep->num_ptds);
 240        bitmap_set(&epq->skip_map, ep->ptd_index, ep->num_ptds);
 241        epq->buf_avail += ep->num_ptds;
 242        epq->ptd_count--;
 243
 244        BUG_ON(epq->buf_avail > epq->buf_count);
 245        BUG_ON(epq->ptd_count > epq->buf_count);
 246
 247        DBG(1, "%s: Done %s PTDs $%04x released %d avail %d count %d\n",
 248            __func__, epq->name,
 249            ep->ptd_offset, ep->num_ptds, epq->buf_avail, epq->buf_count);
 250        DBG(1, "%s: buf_map %08lx skip_map %08lx\n", __func__,
 251            epq->buf_map, epq->skip_map);
 252
 253        ep->num_ptds = 0;
 254        ep->ptd_offset = -EINVAL;
 255        ep->ptd_index = -EINVAL;
 256}
 257
 258/*-------------------------------------------------------------------------*/
 259
 260/*
 261  Set up PTD's.
 262*/
 263static void prepare_ptd(struct isp1362_hcd *isp1362_hcd, struct urb *urb,
 264                        struct isp1362_ep *ep, struct isp1362_ep_queue *epq,
 265                        u16 fno)
 266{
 267        struct ptd *ptd;
 268        int toggle;
 269        int dir;
 270        u16 len;
 271        size_t buf_len = urb->transfer_buffer_length - urb->actual_length;
 272
 273        DBG(3, "%s: %s ep %p\n", __func__, epq->name, ep);
 274
 275        ptd = &ep->ptd;
 276
 277        ep->data = (unsigned char *)urb->transfer_buffer + urb->actual_length;
 278
 279        switch (ep->nextpid) {
 280        case USB_PID_IN:
 281                toggle = usb_gettoggle(urb->dev, ep->epnum, 0);
 282                dir = PTD_DIR_IN;
 283                if (usb_pipecontrol(urb->pipe)) {
 284                        len = min_t(size_t, ep->maxpacket, buf_len);
 285                } else if (usb_pipeisoc(urb->pipe)) {
 286                        len = min_t(size_t, urb->iso_frame_desc[fno].length, MAX_XFER_SIZE);
 287                        ep->data = urb->transfer_buffer + urb->iso_frame_desc[fno].offset;
 288                } else
 289                        len = max_transfer_size(epq, buf_len, ep->maxpacket);
 290                DBG(1, "%s: IN    len %d/%d/%d from URB\n", __func__, len, ep->maxpacket,
 291                    (int)buf_len);
 292                break;
 293        case USB_PID_OUT:
 294                toggle = usb_gettoggle(urb->dev, ep->epnum, 1);
 295                dir = PTD_DIR_OUT;
 296                if (usb_pipecontrol(urb->pipe))
 297                        len = min_t(size_t, ep->maxpacket, buf_len);
 298                else if (usb_pipeisoc(urb->pipe))
 299                        len = min_t(size_t, urb->iso_frame_desc[0].length, MAX_XFER_SIZE);
 300                else
 301                        len = max_transfer_size(epq, buf_len, ep->maxpacket);
 302                if (len == 0)
 303                        pr_info("%s: Sending ZERO packet: %d\n", __func__,
 304                             urb->transfer_flags & URB_ZERO_PACKET);
 305                DBG(1, "%s: OUT   len %d/%d/%d from URB\n", __func__, len, ep->maxpacket,
 306                    (int)buf_len);
 307                break;
 308        case USB_PID_SETUP:
 309                toggle = 0;
 310                dir = PTD_DIR_SETUP;
 311                len = sizeof(struct usb_ctrlrequest);
 312                DBG(1, "%s: SETUP len %d\n", __func__, len);
 313                ep->data = urb->setup_packet;
 314                break;
 315        case USB_PID_ACK:
 316                toggle = 1;
 317                len = 0;
 318                dir = (urb->transfer_buffer_length && usb_pipein(urb->pipe)) ?
 319                        PTD_DIR_OUT : PTD_DIR_IN;
 320                DBG(1, "%s: ACK   len %d\n", __func__, len);
 321                break;
 322        default:
 323                toggle = dir = len = 0;
 324                pr_err("%s@%d: ep->nextpid %02x\n", __func__, __LINE__, ep->nextpid);
 325                BUG_ON(1);
 326        }
 327
 328        ep->length = len;
 329        if (!len)
 330                ep->data = NULL;
 331
 332        ptd->count = PTD_CC_MSK | PTD_ACTIVE_MSK | PTD_TOGGLE(toggle);
 333        ptd->mps = PTD_MPS(ep->maxpacket) | PTD_SPD(urb->dev->speed == USB_SPEED_LOW) |
 334                PTD_EP(ep->epnum);
 335        ptd->len = PTD_LEN(len) | PTD_DIR(dir);
 336        ptd->faddr = PTD_FA(usb_pipedevice(urb->pipe));
 337
 338        if (usb_pipeint(urb->pipe)) {
 339                ptd->faddr |= PTD_SF_INT(ep->branch);
 340                ptd->faddr |= PTD_PR(ep->interval ? __ffs(ep->interval) : 0);
 341        }
 342        if (usb_pipeisoc(urb->pipe))
 343                ptd->faddr |= PTD_SF_ISO(fno);
 344
 345        DBG(1, "%s: Finished\n", __func__);
 346}
 347
 348static void isp1362_write_ptd(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep,
 349                              struct isp1362_ep_queue *epq)
 350{
 351        struct ptd *ptd = &ep->ptd;
 352        int len = PTD_GET_DIR(ptd) == PTD_DIR_IN ? 0 : ep->length;
 353
 354        _BUG_ON(ep->ptd_offset < 0);
 355
 356        prefetch(ptd);
 357        isp1362_write_buffer(isp1362_hcd, ptd, ep->ptd_offset, PTD_HEADER_SIZE);
 358        if (len)
 359                isp1362_write_buffer(isp1362_hcd, ep->data,
 360                                     ep->ptd_offset + PTD_HEADER_SIZE, len);
 361
 362        dump_ptd(ptd);
 363        dump_ptd_out_data(ptd, ep->data);
 364}
 365
 366static void isp1362_read_ptd(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep,
 367                             struct isp1362_ep_queue *epq)
 368{
 369        struct ptd *ptd = &ep->ptd;
 370        int act_len;
 371
 372        WARN_ON(list_empty(&ep->active));
 373        BUG_ON(ep->ptd_offset < 0);
 374
 375        list_del_init(&ep->active);
 376        DBG(1, "%s: ep %p removed from active list %p\n", __func__, ep, &epq->active);
 377
 378        prefetchw(ptd);
 379        isp1362_read_buffer(isp1362_hcd, ptd, ep->ptd_offset, PTD_HEADER_SIZE);
 380        dump_ptd(ptd);
 381        act_len = PTD_GET_COUNT(ptd);
 382        if (PTD_GET_DIR(ptd) != PTD_DIR_IN || act_len == 0)
 383                return;
 384        if (act_len > ep->length)
 385                pr_err("%s: ep %p PTD $%04x act_len %d ep->length %d\n", __func__, ep,
 386                         ep->ptd_offset, act_len, ep->length);
 387        BUG_ON(act_len > ep->length);
 388        /* Only transfer the amount of data that has actually been overwritten
 389         * in the chip buffer. We don't want any data that doesn't belong to the
 390         * transfer to leak out of the chip to the callers transfer buffer!
 391         */
 392        prefetchw(ep->data);
 393        isp1362_read_buffer(isp1362_hcd, ep->data,
 394                            ep->ptd_offset + PTD_HEADER_SIZE, act_len);
 395        dump_ptd_in_data(ptd, ep->data);
 396}
 397
 398/*
 399 * INT PTDs will stay in the chip until data is available.
 400 * This function will remove a PTD from the chip when the URB is dequeued.
 401 * Must be called with the spinlock held and IRQs disabled
 402 */
 403static void remove_ptd(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep)
 404
 405{
 406        int index;
 407        struct isp1362_ep_queue *epq;
 408
 409        DBG(1, "%s: ep %p PTD[%d] $%04x\n", __func__, ep, ep->ptd_index, ep->ptd_offset);
 410        BUG_ON(ep->ptd_offset < 0);
 411
 412        epq = get_ptd_queue(isp1362_hcd, ep->ptd_offset);
 413        BUG_ON(!epq);
 414
 415        /* put ep in remove_list for cleanup */
 416        WARN_ON(!list_empty(&ep->remove_list));
 417        list_add_tail(&ep->remove_list, &isp1362_hcd->remove_list);
 418        /* let SOF interrupt handle the cleanup */
 419        isp1362_enable_int(isp1362_hcd, HCuPINT_SOF);
 420
 421        index = ep->ptd_index;
 422        if (index < 0)
 423                /* ISO queues don't have SKIP registers */
 424                return;
 425
 426        DBG(1, "%s: Disabling PTD[%02x] $%04x %08lx|%08x\n", __func__,
 427            index, ep->ptd_offset, epq->skip_map, 1 << index);
 428
 429        /* prevent further processing of PTD (will be effective after next SOF) */
 430        epq->skip_map |= 1 << index;
 431        if (epq == &isp1362_hcd->atl_queue) {
 432                DBG(2, "%s: ATLSKIP = %08x -> %08lx\n", __func__,
 433                    isp1362_read_reg32(isp1362_hcd, HCATLSKIP), epq->skip_map);
 434                isp1362_write_reg32(isp1362_hcd, HCATLSKIP, epq->skip_map);
 435                if (~epq->skip_map == 0)
 436                        isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ATL_ACTIVE);
 437        } else if (epq == &isp1362_hcd->intl_queue) {
 438                DBG(2, "%s: INTLSKIP = %08x -> %08lx\n", __func__,
 439                    isp1362_read_reg32(isp1362_hcd, HCINTLSKIP), epq->skip_map);
 440                isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, epq->skip_map);
 441                if (~epq->skip_map == 0)
 442                        isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_INTL_ACTIVE);
 443        }
 444}
 445
 446/*
 447  Take done or failed requests out of schedule. Give back
 448  processed urbs.
 449*/
 450static void finish_request(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep,
 451                           struct urb *urb, int status)
 452     __releases(isp1362_hcd->lock)
 453     __acquires(isp1362_hcd->lock)
 454{
 455        urb->hcpriv = NULL;
 456        ep->error_count = 0;
 457
 458        if (usb_pipecontrol(urb->pipe))
 459                ep->nextpid = USB_PID_SETUP;
 460
 461        URB_DBG("%s: req %d FA %d ep%d%s %s: len %d/%d %s stat %d\n", __func__,
 462                ep->num_req, usb_pipedevice(urb->pipe),
 463                usb_pipeendpoint(urb->pipe),
 464                !usb_pipein(urb->pipe) ? "out" : "in",
 465                usb_pipecontrol(urb->pipe) ? "ctrl" :
 466                        usb_pipeint(urb->pipe) ? "int" :
 467                        usb_pipebulk(urb->pipe) ? "bulk" :
 468                        "iso",
 469                urb->actual_length, urb->transfer_buffer_length,
 470                !(urb->transfer_flags & URB_SHORT_NOT_OK) ?
 471                "short_ok" : "", urb->status);
 472
 473
 474        usb_hcd_unlink_urb_from_ep(isp1362_hcd_to_hcd(isp1362_hcd), urb);
 475        spin_unlock(&isp1362_hcd->lock);
 476        usb_hcd_giveback_urb(isp1362_hcd_to_hcd(isp1362_hcd), urb, status);
 477        spin_lock(&isp1362_hcd->lock);
 478
 479        /* take idle endpoints out of the schedule right away */
 480        if (!list_empty(&ep->hep->urb_list))
 481                return;
 482
 483        /* async deschedule */
 484        if (!list_empty(&ep->schedule)) {
 485                list_del_init(&ep->schedule);
 486                return;
 487        }
 488
 489
 490        if (ep->interval) {
 491                /* periodic deschedule */
 492                DBG(1, "deschedule qh%d/%p branch %d load %d bandwidth %d -> %d\n", ep->interval,
 493                    ep, ep->branch, ep->load,
 494                    isp1362_hcd->load[ep->branch],
 495                    isp1362_hcd->load[ep->branch] - ep->load);
 496                isp1362_hcd->load[ep->branch] -= ep->load;
 497                ep->branch = PERIODIC_SIZE;
 498        }
 499}
 500
 501/*
 502 * Analyze transfer results, handle partial transfers and errors
 503*/
 504static void postproc_ep(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep *ep)
 505{
 506        struct urb *urb = get_urb(ep);
 507        struct usb_device *udev;
 508        struct ptd *ptd;
 509        int short_ok;
 510        u16 len;
 511        int urbstat = -EINPROGRESS;
 512        u8 cc;
 513
 514        DBG(2, "%s: ep %p req %d\n", __func__, ep, ep->num_req);
 515
 516        udev = urb->dev;
 517        ptd = &ep->ptd;
 518        cc = PTD_GET_CC(ptd);
 519        if (cc == PTD_NOTACCESSED) {
 520                pr_err("%s: req %d PTD %p Untouched by ISP1362\n", __func__,
 521                    ep->num_req, ptd);
 522                cc = PTD_DEVNOTRESP;
 523        }
 524
 525        short_ok = !(urb->transfer_flags & URB_SHORT_NOT_OK);
 526        len = urb->transfer_buffer_length - urb->actual_length;
 527
 528        /* Data underrun is special. For allowed underrun
 529           we clear the error and continue as normal. For
 530           forbidden underrun we finish the DATA stage
 531           immediately while for control transfer,
 532           we do a STATUS stage.
 533        */
 534        if (cc == PTD_DATAUNDERRUN) {
 535                if (short_ok) {
 536                        DBG(1, "%s: req %d Allowed data underrun short_%sok %d/%d/%d byte\n",
 537                            __func__, ep->num_req, short_ok ? "" : "not_",
 538                            PTD_GET_COUNT(ptd), ep->maxpacket, len);
 539                        cc = PTD_CC_NOERROR;
 540                        urbstat = 0;
 541                } else {
 542                        DBG(1, "%s: req %d Data Underrun %s nextpid %02x short_%sok %d/%d/%d byte\n",
 543                            __func__, ep->num_req,
 544                            usb_pipein(urb->pipe) ? "IN" : "OUT", ep->nextpid,
 545                            short_ok ? "" : "not_",
 546                            PTD_GET_COUNT(ptd), ep->maxpacket, len);
 547                        if (usb_pipecontrol(urb->pipe)) {
 548                                ep->nextpid = USB_PID_ACK;
 549                                /* save the data underrun error code for later and
 550                                 * proceed with the status stage
 551                                 */
 552                                urb->actual_length += PTD_GET_COUNT(ptd);
 553                                BUG_ON(urb->actual_length > urb->transfer_buffer_length);
 554
 555                                if (urb->status == -EINPROGRESS)
 556                                        urb->status = cc_to_error[PTD_DATAUNDERRUN];
 557                        } else {
 558                                usb_settoggle(udev, ep->epnum, ep->nextpid == USB_PID_OUT,
 559                                              PTD_GET_TOGGLE(ptd));
 560                                urbstat = cc_to_error[PTD_DATAUNDERRUN];
 561                        }
 562                        goto out;
 563                }
 564        }
 565
 566        if (cc != PTD_CC_NOERROR) {
 567                if (++ep->error_count >= 3 || cc == PTD_CC_STALL || cc == PTD_DATAOVERRUN) {
 568                        urbstat = cc_to_error[cc];
 569                        DBG(1, "%s: req %d nextpid %02x, status %d, error %d, error_count %d\n",
 570                            __func__, ep->num_req, ep->nextpid, urbstat, cc,
 571                            ep->error_count);
 572                }
 573                goto out;
 574        }
 575
 576        switch (ep->nextpid) {
 577        case USB_PID_OUT:
 578                if (PTD_GET_COUNT(ptd) != ep->length)
 579                        pr_err("%s: count=%d len=%d\n", __func__,
 580                           PTD_GET_COUNT(ptd), ep->length);
 581                BUG_ON(PTD_GET_COUNT(ptd) != ep->length);
 582                urb->actual_length += ep->length;
 583                BUG_ON(urb->actual_length > urb->transfer_buffer_length);
 584                usb_settoggle(udev, ep->epnum, 1, PTD_GET_TOGGLE(ptd));
 585                if (urb->actual_length == urb->transfer_buffer_length) {
 586                        DBG(3, "%s: req %d xfer complete %d/%d status %d -> 0\n", __func__,
 587                            ep->num_req, len, ep->maxpacket, urbstat);
 588                        if (usb_pipecontrol(urb->pipe)) {
 589                                DBG(3, "%s: req %d %s Wait for ACK\n", __func__,
 590                                    ep->num_req,
 591                                    usb_pipein(urb->pipe) ? "IN" : "OUT");
 592                                ep->nextpid = USB_PID_ACK;
 593                        } else {
 594                                if (len % ep->maxpacket ||
 595                                    !(urb->transfer_flags & URB_ZERO_PACKET)) {
 596                                        urbstat = 0;
 597                                        DBG(3, "%s: req %d URB %s status %d count %d/%d/%d\n",
 598                                            __func__, ep->num_req, usb_pipein(urb->pipe) ? "IN" : "OUT",
 599                                            urbstat, len, ep->maxpacket, urb->actual_length);
 600                                }
 601                        }
 602                }
 603                break;
 604        case USB_PID_IN:
 605                len = PTD_GET_COUNT(ptd);
 606                BUG_ON(len > ep->length);
 607                urb->actual_length += len;
 608                BUG_ON(urb->actual_length > urb->transfer_buffer_length);
 609                usb_settoggle(udev, ep->epnum, 0, PTD_GET_TOGGLE(ptd));
 610                /* if transfer completed or (allowed) data underrun */
 611                if ((urb->transfer_buffer_length == urb->actual_length) ||
 612                    len % ep->maxpacket) {
 613                        DBG(3, "%s: req %d xfer complete %d/%d status %d -> 0\n", __func__,
 614                            ep->num_req, len, ep->maxpacket, urbstat);
 615                        if (usb_pipecontrol(urb->pipe)) {
 616                                DBG(3, "%s: req %d %s Wait for ACK\n", __func__,
 617                                    ep->num_req,
 618                                    usb_pipein(urb->pipe) ? "IN" : "OUT");
 619                                ep->nextpid = USB_PID_ACK;
 620                        } else {
 621                                urbstat = 0;
 622                                DBG(3, "%s: req %d URB %s status %d count %d/%d/%d\n",
 623                                    __func__, ep->num_req, usb_pipein(urb->pipe) ? "IN" : "OUT",
 624                                    urbstat, len, ep->maxpacket, urb->actual_length);
 625                        }
 626                }
 627                break;
 628        case USB_PID_SETUP:
 629                if (urb->transfer_buffer_length == urb->actual_length) {
 630                        ep->nextpid = USB_PID_ACK;
 631                } else if (usb_pipeout(urb->pipe)) {
 632                        usb_settoggle(udev, 0, 1, 1);
 633                        ep->nextpid = USB_PID_OUT;
 634                } else {
 635                        usb_settoggle(udev, 0, 0, 1);
 636                        ep->nextpid = USB_PID_IN;
 637                }
 638                break;
 639        case USB_PID_ACK:
 640                DBG(3, "%s: req %d got ACK %d -> 0\n", __func__, ep->num_req,
 641                    urbstat);
 642                WARN_ON(urbstat != -EINPROGRESS);
 643                urbstat = 0;
 644                ep->nextpid = 0;
 645                break;
 646        default:
 647                BUG_ON(1);
 648        }
 649
 650 out:
 651        if (urbstat != -EINPROGRESS) {
 652                DBG(2, "%s: Finishing ep %p req %d urb %p status %d\n", __func__,
 653                    ep, ep->num_req, urb, urbstat);
 654                finish_request(isp1362_hcd, ep, urb, urbstat);
 655        }
 656}
 657
 658static void finish_unlinks(struct isp1362_hcd *isp1362_hcd)
 659{
 660        struct isp1362_ep *ep;
 661        struct isp1362_ep *tmp;
 662
 663        list_for_each_entry_safe(ep, tmp, &isp1362_hcd->remove_list, remove_list) {
 664                struct isp1362_ep_queue *epq =
 665                        get_ptd_queue(isp1362_hcd, ep->ptd_offset);
 666                int index = ep->ptd_index;
 667
 668                BUG_ON(epq == NULL);
 669                if (index >= 0) {
 670                        DBG(1, "%s: remove PTD[%d] $%04x\n", __func__, index, ep->ptd_offset);
 671                        BUG_ON(ep->num_ptds == 0);
 672                        release_ptd_buffers(epq, ep);
 673                }
 674                if (!list_empty(&ep->hep->urb_list)) {
 675                        struct urb *urb = get_urb(ep);
 676
 677                        DBG(1, "%s: Finishing req %d ep %p from remove_list\n", __func__,
 678                            ep->num_req, ep);
 679                        finish_request(isp1362_hcd, ep, urb, -ESHUTDOWN);
 680                }
 681                WARN_ON(list_empty(&ep->active));
 682                if (!list_empty(&ep->active)) {
 683                        list_del_init(&ep->active);
 684                        DBG(1, "%s: ep %p removed from active list\n", __func__, ep);
 685                }
 686                list_del_init(&ep->remove_list);
 687                DBG(1, "%s: ep %p removed from remove_list\n", __func__, ep);
 688        }
 689        DBG(1, "%s: Done\n", __func__);
 690}
 691
 692static inline void enable_atl_transfers(struct isp1362_hcd *isp1362_hcd, int count)
 693{
 694        if (count > 0) {
 695                if (count < isp1362_hcd->atl_queue.ptd_count)
 696                        isp1362_write_reg16(isp1362_hcd, HCATLDTC, count);
 697                isp1362_enable_int(isp1362_hcd, HCuPINT_ATL);
 698                isp1362_write_reg32(isp1362_hcd, HCATLSKIP, isp1362_hcd->atl_queue.skip_map);
 699                isp1362_set_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ATL_ACTIVE);
 700        } else
 701                isp1362_enable_int(isp1362_hcd, HCuPINT_SOF);
 702}
 703
 704static inline void enable_intl_transfers(struct isp1362_hcd *isp1362_hcd)
 705{
 706        isp1362_enable_int(isp1362_hcd, HCuPINT_INTL);
 707        isp1362_set_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_INTL_ACTIVE);
 708        isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, isp1362_hcd->intl_queue.skip_map);
 709}
 710
 711static inline void enable_istl_transfers(struct isp1362_hcd *isp1362_hcd, int flip)
 712{
 713        isp1362_enable_int(isp1362_hcd, flip ? HCuPINT_ISTL1 : HCuPINT_ISTL0);
 714        isp1362_set_mask16(isp1362_hcd, HCBUFSTAT, flip ?
 715                           HCBUFSTAT_ISTL1_FULL : HCBUFSTAT_ISTL0_FULL);
 716}
 717
 718static int submit_req(struct isp1362_hcd *isp1362_hcd, struct urb *urb,
 719                      struct isp1362_ep *ep, struct isp1362_ep_queue *epq)
 720{
 721        int index = epq->free_ptd;
 722
 723        prepare_ptd(isp1362_hcd, urb, ep, epq, 0);
 724        index = claim_ptd_buffers(epq, ep, ep->length);
 725        if (index == -ENOMEM) {
 726                DBG(1, "%s: req %d No free %s PTD available: %d, %08lx:%08lx\n", __func__,
 727                    ep->num_req, epq->name, ep->num_ptds, epq->buf_map, epq->skip_map);
 728                return index;
 729        } else if (index == -EOVERFLOW) {
 730                DBG(1, "%s: req %d Not enough space for %d byte %s PTD %d %08lx:%08lx\n",
 731                    __func__, ep->num_req, ep->length, epq->name, ep->num_ptds,
 732                    epq->buf_map, epq->skip_map);
 733                return index;
 734        } else
 735                BUG_ON(index < 0);
 736        list_add_tail(&ep->active, &epq->active);
 737        DBG(1, "%s: ep %p req %d len %d added to active list %p\n", __func__,
 738            ep, ep->num_req, ep->length, &epq->active);
 739        DBG(1, "%s: Submitting %s PTD $%04x for ep %p req %d\n", __func__, epq->name,
 740            ep->ptd_offset, ep, ep->num_req);
 741        isp1362_write_ptd(isp1362_hcd, ep, epq);
 742        __clear_bit(ep->ptd_index, &epq->skip_map);
 743
 744        return 0;
 745}
 746
 747static void start_atl_transfers(struct isp1362_hcd *isp1362_hcd)
 748{
 749        int ptd_count = 0;
 750        struct isp1362_ep_queue *epq = &isp1362_hcd->atl_queue;
 751        struct isp1362_ep *ep;
 752        int defer = 0;
 753
 754        if (atomic_read(&epq->finishing)) {
 755                DBG(1, "%s: finish_transfers is active for %s\n", __func__, epq->name);
 756                return;
 757        }
 758
 759        list_for_each_entry(ep, &isp1362_hcd->async, schedule) {
 760                struct urb *urb = get_urb(ep);
 761                int ret;
 762
 763                if (!list_empty(&ep->active)) {
 764                        DBG(2, "%s: Skipping active %s ep %p\n", __func__, epq->name, ep);
 765                        continue;
 766                }
 767
 768                DBG(1, "%s: Processing %s ep %p req %d\n", __func__, epq->name,
 769                    ep, ep->num_req);
 770
 771                ret = submit_req(isp1362_hcd, urb, ep, epq);
 772                if (ret == -ENOMEM) {
 773                        defer = 1;
 774                        break;
 775                } else if (ret == -EOVERFLOW) {
 776                        defer = 1;
 777                        continue;
 778                }
 779#ifdef BUGGY_PXA2XX_UDC_USBTEST
 780                defer = ep->nextpid == USB_PID_SETUP;
 781#endif
 782                ptd_count++;
 783        }
 784
 785        /* Avoid starving of endpoints */
 786        if (isp1362_hcd->async.next != isp1362_hcd->async.prev) {
 787                DBG(2, "%s: Cycling ASYNC schedule %d\n", __func__, ptd_count);
 788                list_move(&isp1362_hcd->async, isp1362_hcd->async.next);
 789        }
 790        if (ptd_count || defer)
 791                enable_atl_transfers(isp1362_hcd, defer ? 0 : ptd_count);
 792
 793        epq->ptd_count += ptd_count;
 794        if (epq->ptd_count > epq->stat_maxptds) {
 795                epq->stat_maxptds = epq->ptd_count;
 796                DBG(0, "%s: max_ptds: %d\n", __func__, epq->stat_maxptds);
 797        }
 798}
 799
 800static void start_intl_transfers(struct isp1362_hcd *isp1362_hcd)
 801{
 802        int ptd_count = 0;
 803        struct isp1362_ep_queue *epq = &isp1362_hcd->intl_queue;
 804        struct isp1362_ep *ep;
 805
 806        if (atomic_read(&epq->finishing)) {
 807                DBG(1, "%s: finish_transfers is active for %s\n", __func__, epq->name);
 808                return;
 809        }
 810
 811        list_for_each_entry(ep, &isp1362_hcd->periodic, schedule) {
 812                struct urb *urb = get_urb(ep);
 813                int ret;
 814
 815                if (!list_empty(&ep->active)) {
 816                        DBG(1, "%s: Skipping active %s ep %p\n", __func__,
 817                            epq->name, ep);
 818                        continue;
 819                }
 820
 821                DBG(1, "%s: Processing %s ep %p req %d\n", __func__,
 822                    epq->name, ep, ep->num_req);
 823                ret = submit_req(isp1362_hcd, urb, ep, epq);
 824                if (ret == -ENOMEM)
 825                        break;
 826                else if (ret == -EOVERFLOW)
 827                        continue;
 828                ptd_count++;
 829        }
 830
 831        if (ptd_count) {
 832                static int last_count;
 833
 834                if (ptd_count != last_count) {
 835                        DBG(0, "%s: ptd_count: %d\n", __func__, ptd_count);
 836                        last_count = ptd_count;
 837                }
 838                enable_intl_transfers(isp1362_hcd);
 839        }
 840
 841        epq->ptd_count += ptd_count;
 842        if (epq->ptd_count > epq->stat_maxptds)
 843                epq->stat_maxptds = epq->ptd_count;
 844}
 845
 846static inline int next_ptd(struct isp1362_ep_queue *epq, struct isp1362_ep *ep)
 847{
 848        u16 ptd_offset = ep->ptd_offset;
 849        int num_ptds = (ep->length + PTD_HEADER_SIZE + (epq->blk_size - 1)) / epq->blk_size;
 850
 851        DBG(2, "%s: PTD offset $%04x + %04x => %d * %04x -> $%04x\n", __func__, ptd_offset,
 852            ep->length, num_ptds, epq->blk_size, ptd_offset + num_ptds * epq->blk_size);
 853
 854        ptd_offset += num_ptds * epq->blk_size;
 855        if (ptd_offset < epq->buf_start + epq->buf_size)
 856                return ptd_offset;
 857        else
 858                return -ENOMEM;
 859}
 860
 861static void start_iso_transfers(struct isp1362_hcd *isp1362_hcd)
 862{
 863        int ptd_count = 0;
 864        int flip = isp1362_hcd->istl_flip;
 865        struct isp1362_ep_queue *epq;
 866        int ptd_offset;
 867        struct isp1362_ep *ep;
 868        struct isp1362_ep *tmp;
 869        u16 fno = isp1362_read_reg32(isp1362_hcd, HCFMNUM);
 870
 871 fill2:
 872        epq = &isp1362_hcd->istl_queue[flip];
 873        if (atomic_read(&epq->finishing)) {
 874                DBG(1, "%s: finish_transfers is active for %s\n", __func__, epq->name);
 875                return;
 876        }
 877
 878        if (!list_empty(&epq->active))
 879                return;
 880
 881        ptd_offset = epq->buf_start;
 882        list_for_each_entry_safe(ep, tmp, &isp1362_hcd->isoc, schedule) {
 883                struct urb *urb = get_urb(ep);
 884                s16 diff = fno - (u16)urb->start_frame;
 885
 886                DBG(1, "%s: Processing %s ep %p\n", __func__, epq->name, ep);
 887
 888                if (diff > urb->number_of_packets) {
 889                        /* time frame for this URB has elapsed */
 890                        finish_request(isp1362_hcd, ep, urb, -EOVERFLOW);
 891                        continue;
 892                } else if (diff < -1) {
 893                        /* URB is not due in this frame or the next one.
 894                         * Comparing with '-1' instead of '0' accounts for double
 895                         * buffering in the ISP1362 which enables us to queue the PTD
 896                         * one frame ahead of time
 897                         */
 898                } else if (diff == -1) {
 899                        /* submit PTD's that are due in the next frame */
 900                        prepare_ptd(isp1362_hcd, urb, ep, epq, fno);
 901                        if (ptd_offset + PTD_HEADER_SIZE + ep->length >
 902                            epq->buf_start + epq->buf_size) {
 903                                pr_err("%s: Not enough ISO buffer space for %d byte PTD\n",
 904                                    __func__, ep->length);
 905                                continue;
 906                        }
 907                        ep->ptd_offset = ptd_offset;
 908                        list_add_tail(&ep->active, &epq->active);
 909
 910                        ptd_offset = next_ptd(epq, ep);
 911                        if (ptd_offset < 0) {
 912                                pr_warning("%s: req %d No more %s PTD buffers available\n", __func__,
 913                                     ep->num_req, epq->name);
 914                                break;
 915                        }
 916                }
 917        }
 918        list_for_each_entry(ep, &epq->active, active) {
 919                if (epq->active.next == &ep->active)
 920                        ep->ptd.mps |= PTD_LAST_MSK;
 921                isp1362_write_ptd(isp1362_hcd, ep, epq);
 922                ptd_count++;
 923        }
 924
 925        if (ptd_count)
 926                enable_istl_transfers(isp1362_hcd, flip);
 927
 928        epq->ptd_count += ptd_count;
 929        if (epq->ptd_count > epq->stat_maxptds)
 930                epq->stat_maxptds = epq->ptd_count;
 931
 932        /* check, whether the second ISTL buffer may also be filled */
 933        if (!(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) &
 934              (flip ? HCBUFSTAT_ISTL0_FULL : HCBUFSTAT_ISTL1_FULL))) {
 935                fno++;
 936                ptd_count = 0;
 937                flip = 1 - flip;
 938                goto fill2;
 939        }
 940}
 941
 942static void finish_transfers(struct isp1362_hcd *isp1362_hcd, unsigned long done_map,
 943                             struct isp1362_ep_queue *epq)
 944{
 945        struct isp1362_ep *ep;
 946        struct isp1362_ep *tmp;
 947
 948        if (list_empty(&epq->active)) {
 949                DBG(1, "%s: Nothing to do for %s queue\n", __func__, epq->name);
 950                return;
 951        }
 952
 953        DBG(1, "%s: Finishing %s transfers %08lx\n", __func__, epq->name, done_map);
 954
 955        atomic_inc(&epq->finishing);
 956        list_for_each_entry_safe(ep, tmp, &epq->active, active) {
 957                int index = ep->ptd_index;
 958
 959                DBG(1, "%s: Checking %s PTD[%02x] $%04x\n", __func__, epq->name,
 960                    index, ep->ptd_offset);
 961
 962                BUG_ON(index < 0);
 963                if (__test_and_clear_bit(index, &done_map)) {
 964                        isp1362_read_ptd(isp1362_hcd, ep, epq);
 965                        epq->free_ptd = index;
 966                        BUG_ON(ep->num_ptds == 0);
 967                        release_ptd_buffers(epq, ep);
 968
 969                        DBG(1, "%s: ep %p req %d removed from active list\n", __func__,
 970                            ep, ep->num_req);
 971                        if (!list_empty(&ep->remove_list)) {
 972                                list_del_init(&ep->remove_list);
 973                                DBG(1, "%s: ep %p removed from remove list\n", __func__, ep);
 974                        }
 975                        DBG(1, "%s: Postprocessing %s ep %p req %d\n", __func__, epq->name,
 976                            ep, ep->num_req);
 977                        postproc_ep(isp1362_hcd, ep);
 978                }
 979                if (!done_map)
 980                        break;
 981        }
 982        if (done_map)
 983                pr_warning("%s: done_map not clear: %08lx:%08lx\n", __func__, done_map,
 984                     epq->skip_map);
 985        atomic_dec(&epq->finishing);
 986}
 987
 988static void finish_iso_transfers(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep_queue *epq)
 989{
 990        struct isp1362_ep *ep;
 991        struct isp1362_ep *tmp;
 992
 993        if (list_empty(&epq->active)) {
 994                DBG(1, "%s: Nothing to do for %s queue\n", __func__, epq->name);
 995                return;
 996        }
 997
 998        DBG(1, "%s: Finishing %s transfers\n", __func__, epq->name);
 999
1000        atomic_inc(&epq->finishing);
1001        list_for_each_entry_safe(ep, tmp, &epq->active, active) {
1002                DBG(1, "%s: Checking PTD $%04x\n", __func__, ep->ptd_offset);
1003
1004                isp1362_read_ptd(isp1362_hcd, ep, epq);
1005                DBG(1, "%s: Postprocessing %s ep %p\n", __func__, epq->name, ep);
1006                postproc_ep(isp1362_hcd, ep);
1007        }
1008        WARN_ON(epq->blk_size != 0);
1009        atomic_dec(&epq->finishing);
1010}
1011
1012static irqreturn_t isp1362_irq(struct usb_hcd *hcd)
1013{
1014        int handled = 0;
1015        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1016        u16 irqstat;
1017        u16 svc_mask;
1018
1019        spin_lock(&isp1362_hcd->lock);
1020
1021        BUG_ON(isp1362_hcd->irq_active++);
1022
1023        isp1362_write_reg16(isp1362_hcd, HCuPINTENB, 0);
1024
1025        irqstat = isp1362_read_reg16(isp1362_hcd, HCuPINT);
1026        DBG(3, "%s: got IRQ %04x:%04x\n", __func__, irqstat, isp1362_hcd->irqenb);
1027
1028        /* only handle interrupts that are currently enabled */
1029        irqstat &= isp1362_hcd->irqenb;
1030        isp1362_write_reg16(isp1362_hcd, HCuPINT, irqstat);
1031        svc_mask = irqstat;
1032
1033        if (irqstat & HCuPINT_SOF) {
1034                isp1362_hcd->irqenb &= ~HCuPINT_SOF;
1035                isp1362_hcd->irq_stat[ISP1362_INT_SOF]++;
1036                handled = 1;
1037                svc_mask &= ~HCuPINT_SOF;
1038                DBG(3, "%s: SOF\n", __func__);
1039                isp1362_hcd->fmindex = isp1362_read_reg32(isp1362_hcd, HCFMNUM);
1040                if (!list_empty(&isp1362_hcd->remove_list))
1041                        finish_unlinks(isp1362_hcd);
1042                if (!list_empty(&isp1362_hcd->async) && !(irqstat & HCuPINT_ATL)) {
1043                        if (list_empty(&isp1362_hcd->atl_queue.active)) {
1044                                start_atl_transfers(isp1362_hcd);
1045                        } else {
1046                                isp1362_enable_int(isp1362_hcd, HCuPINT_ATL);
1047                                isp1362_write_reg32(isp1362_hcd, HCATLSKIP,
1048                                                    isp1362_hcd->atl_queue.skip_map);
1049                                isp1362_set_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ATL_ACTIVE);
1050                        }
1051                }
1052        }
1053
1054        if (irqstat & HCuPINT_ISTL0) {
1055                isp1362_hcd->irq_stat[ISP1362_INT_ISTL0]++;
1056                handled = 1;
1057                svc_mask &= ~HCuPINT_ISTL0;
1058                isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ISTL0_FULL);
1059                DBG(1, "%s: ISTL0\n", __func__);
1060                WARN_ON((int)!!isp1362_hcd->istl_flip);
1061                WARN_ON(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) &
1062                        HCBUFSTAT_ISTL0_ACTIVE);
1063                WARN_ON(!(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) &
1064                        HCBUFSTAT_ISTL0_DONE));
1065                isp1362_hcd->irqenb &= ~HCuPINT_ISTL0;
1066        }
1067
1068        if (irqstat & HCuPINT_ISTL1) {
1069                isp1362_hcd->irq_stat[ISP1362_INT_ISTL1]++;
1070                handled = 1;
1071                svc_mask &= ~HCuPINT_ISTL1;
1072                isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ISTL1_FULL);
1073                DBG(1, "%s: ISTL1\n", __func__);
1074                WARN_ON(!(int)isp1362_hcd->istl_flip);
1075                WARN_ON(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) &
1076                        HCBUFSTAT_ISTL1_ACTIVE);
1077                WARN_ON(!(isp1362_read_reg16(isp1362_hcd, HCBUFSTAT) &
1078                        HCBUFSTAT_ISTL1_DONE));
1079                isp1362_hcd->irqenb &= ~HCuPINT_ISTL1;
1080        }
1081
1082        if (irqstat & (HCuPINT_ISTL0 | HCuPINT_ISTL1)) {
1083                WARN_ON((irqstat & (HCuPINT_ISTL0 | HCuPINT_ISTL1)) ==
1084                        (HCuPINT_ISTL0 | HCuPINT_ISTL1));
1085                finish_iso_transfers(isp1362_hcd,
1086                                     &isp1362_hcd->istl_queue[isp1362_hcd->istl_flip]);
1087                start_iso_transfers(isp1362_hcd);
1088                isp1362_hcd->istl_flip = 1 - isp1362_hcd->istl_flip;
1089        }
1090
1091        if (irqstat & HCuPINT_INTL) {
1092                u32 done_map = isp1362_read_reg32(isp1362_hcd, HCINTLDONE);
1093                u32 skip_map = isp1362_read_reg32(isp1362_hcd, HCINTLSKIP);
1094                isp1362_hcd->irq_stat[ISP1362_INT_INTL]++;
1095
1096                DBG(2, "%s: INTL\n", __func__);
1097
1098                svc_mask &= ~HCuPINT_INTL;
1099
1100                isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, skip_map | done_map);
1101                if (~(done_map | skip_map) == 0)
1102                        /* All PTDs are finished, disable INTL processing entirely */
1103                        isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_INTL_ACTIVE);
1104
1105                handled = 1;
1106                WARN_ON(!done_map);
1107                if (done_map) {
1108                        DBG(3, "%s: INTL done_map %08x\n", __func__, done_map);
1109                        finish_transfers(isp1362_hcd, done_map, &isp1362_hcd->intl_queue);
1110                        start_intl_transfers(isp1362_hcd);
1111                }
1112        }
1113
1114        if (irqstat & HCuPINT_ATL) {
1115                u32 done_map = isp1362_read_reg32(isp1362_hcd, HCATLDONE);
1116                u32 skip_map = isp1362_read_reg32(isp1362_hcd, HCATLSKIP);
1117                isp1362_hcd->irq_stat[ISP1362_INT_ATL]++;
1118
1119                DBG(2, "%s: ATL\n", __func__);
1120
1121                svc_mask &= ~HCuPINT_ATL;
1122
1123                isp1362_write_reg32(isp1362_hcd, HCATLSKIP, skip_map | done_map);
1124                if (~(done_map | skip_map) == 0)
1125                        isp1362_clr_mask16(isp1362_hcd, HCBUFSTAT, HCBUFSTAT_ATL_ACTIVE);
1126                if (done_map) {
1127                        DBG(3, "%s: ATL done_map %08x\n", __func__, done_map);
1128                        finish_transfers(isp1362_hcd, done_map, &isp1362_hcd->atl_queue);
1129                        start_atl_transfers(isp1362_hcd);
1130                }
1131                handled = 1;
1132        }
1133
1134        if (irqstat & HCuPINT_OPR) {
1135                u32 intstat = isp1362_read_reg32(isp1362_hcd, HCINTSTAT);
1136                isp1362_hcd->irq_stat[ISP1362_INT_OPR]++;
1137
1138                svc_mask &= ~HCuPINT_OPR;
1139                DBG(2, "%s: OPR %08x:%08x\n", __func__, intstat, isp1362_hcd->intenb);
1140                intstat &= isp1362_hcd->intenb;
1141                if (intstat & OHCI_INTR_UE) {
1142                        pr_err("Unrecoverable error\n");
1143                        /* FIXME: do here reset or cleanup or whatever */
1144                }
1145                if (intstat & OHCI_INTR_RHSC) {
1146                        isp1362_hcd->rhstatus = isp1362_read_reg32(isp1362_hcd, HCRHSTATUS);
1147                        isp1362_hcd->rhport[0] = isp1362_read_reg32(isp1362_hcd, HCRHPORT1);
1148                        isp1362_hcd->rhport[1] = isp1362_read_reg32(isp1362_hcd, HCRHPORT2);
1149                }
1150                if (intstat & OHCI_INTR_RD) {
1151                        pr_info("%s: RESUME DETECTED\n", __func__);
1152                        isp1362_show_reg(isp1362_hcd, HCCONTROL);
1153                        usb_hcd_resume_root_hub(hcd);
1154                }
1155                isp1362_write_reg32(isp1362_hcd, HCINTSTAT, intstat);
1156                irqstat &= ~HCuPINT_OPR;
1157                handled = 1;
1158        }
1159
1160        if (irqstat & HCuPINT_SUSP) {
1161                isp1362_hcd->irq_stat[ISP1362_INT_SUSP]++;
1162                handled = 1;
1163                svc_mask &= ~HCuPINT_SUSP;
1164
1165                pr_info("%s: SUSPEND IRQ\n", __func__);
1166        }
1167
1168        if (irqstat & HCuPINT_CLKRDY) {
1169                isp1362_hcd->irq_stat[ISP1362_INT_CLKRDY]++;
1170                handled = 1;
1171                isp1362_hcd->irqenb &= ~HCuPINT_CLKRDY;
1172                svc_mask &= ~HCuPINT_CLKRDY;
1173                pr_info("%s: CLKRDY IRQ\n", __func__);
1174        }
1175
1176        if (svc_mask)
1177                pr_err("%s: Unserviced interrupt(s) %04x\n", __func__, svc_mask);
1178
1179        isp1362_write_reg16(isp1362_hcd, HCuPINTENB, isp1362_hcd->irqenb);
1180        isp1362_hcd->irq_active--;
1181        spin_unlock(&isp1362_hcd->lock);
1182
1183        return IRQ_RETVAL(handled);
1184}
1185
1186/*-------------------------------------------------------------------------*/
1187
1188#define MAX_PERIODIC_LOAD       900     /* out of 1000 usec */
1189static int balance(struct isp1362_hcd *isp1362_hcd, u16 interval, u16 load)
1190{
1191        int i, branch = -ENOSPC;
1192
1193        /* search for the least loaded schedule branch of that interval
1194         * which has enough bandwidth left unreserved.
1195         */
1196        for (i = 0; i < interval; i++) {
1197                if (branch < 0 || isp1362_hcd->load[branch] > isp1362_hcd->load[i]) {
1198                        int j;
1199
1200                        for (j = i; j < PERIODIC_SIZE; j += interval) {
1201                                if ((isp1362_hcd->load[j] + load) > MAX_PERIODIC_LOAD) {
1202                                        pr_err("%s: new load %d load[%02x] %d max %d\n", __func__,
1203                                            load, j, isp1362_hcd->load[j], MAX_PERIODIC_LOAD);
1204                                        break;
1205                                }
1206                        }
1207                        if (j < PERIODIC_SIZE)
1208                                continue;
1209                        branch = i;
1210                }
1211        }
1212        return branch;
1213}
1214
1215/* NB! ALL the code above this point runs with isp1362_hcd->lock
1216   held, irqs off
1217*/
1218
1219/*-------------------------------------------------------------------------*/
1220
1221static int isp1362_urb_enqueue(struct usb_hcd *hcd,
1222                               struct urb *urb,
1223                               gfp_t mem_flags)
1224{
1225        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1226        struct usb_device *udev = urb->dev;
1227        unsigned int pipe = urb->pipe;
1228        int is_out = !usb_pipein(pipe);
1229        int type = usb_pipetype(pipe);
1230        int epnum = usb_pipeendpoint(pipe);
1231        struct usb_host_endpoint *hep = urb->ep;
1232        struct isp1362_ep *ep = NULL;
1233        unsigned long flags;
1234        int retval = 0;
1235
1236        DBG(3, "%s: urb %p\n", __func__, urb);
1237
1238        if (type == PIPE_ISOCHRONOUS) {
1239                pr_err("Isochronous transfers not supported\n");
1240                return -ENOSPC;
1241        }
1242
1243        URB_DBG("%s: FA %d ep%d%s %s: len %d %s%s\n", __func__,
1244                usb_pipedevice(pipe), epnum,
1245                is_out ? "out" : "in",
1246                usb_pipecontrol(pipe) ? "ctrl" :
1247                        usb_pipeint(pipe) ? "int" :
1248                        usb_pipebulk(pipe) ? "bulk" :
1249                        "iso",
1250                urb->transfer_buffer_length,
1251                (urb->transfer_flags & URB_ZERO_PACKET) ? "ZERO_PACKET " : "",
1252                !(urb->transfer_flags & URB_SHORT_NOT_OK) ?
1253                "short_ok" : "");
1254
1255        /* avoid all allocations within spinlocks: request or endpoint */
1256        if (!hep->hcpriv) {
1257                ep = kzalloc(sizeof *ep, mem_flags);
1258                if (!ep)
1259                        return -ENOMEM;
1260        }
1261        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1262
1263        /* don't submit to a dead or disabled port */
1264        if (!((isp1362_hcd->rhport[0] | isp1362_hcd->rhport[1]) &
1265              USB_PORT_STAT_ENABLE) ||
1266            !HC_IS_RUNNING(hcd->state)) {
1267                kfree(ep);
1268                retval = -ENODEV;
1269                goto fail_not_linked;
1270        }
1271
1272        retval = usb_hcd_link_urb_to_ep(hcd, urb);
1273        if (retval) {
1274                kfree(ep);
1275                goto fail_not_linked;
1276        }
1277
1278        if (hep->hcpriv) {
1279                ep = hep->hcpriv;
1280        } else {
1281                INIT_LIST_HEAD(&ep->schedule);
1282                INIT_LIST_HEAD(&ep->active);
1283                INIT_LIST_HEAD(&ep->remove_list);
1284                ep->udev = usb_get_dev(udev);
1285                ep->hep = hep;
1286                ep->epnum = epnum;
1287                ep->maxpacket = usb_maxpacket(udev, urb->pipe, is_out);
1288                ep->ptd_offset = -EINVAL;
1289                ep->ptd_index = -EINVAL;
1290                usb_settoggle(udev, epnum, is_out, 0);
1291
1292                if (type == PIPE_CONTROL)
1293                        ep->nextpid = USB_PID_SETUP;
1294                else if (is_out)
1295                        ep->nextpid = USB_PID_OUT;
1296                else
1297                        ep->nextpid = USB_PID_IN;
1298
1299                switch (type) {
1300                case PIPE_ISOCHRONOUS:
1301                case PIPE_INTERRUPT:
1302                        if (urb->interval > PERIODIC_SIZE)
1303                                urb->interval = PERIODIC_SIZE;
1304                        ep->interval = urb->interval;
1305                        ep->branch = PERIODIC_SIZE;
1306                        ep->load = usb_calc_bus_time(udev->speed, !is_out,
1307                                                     (type == PIPE_ISOCHRONOUS),
1308                                                     usb_maxpacket(udev, pipe, is_out)) / 1000;
1309                        break;
1310                }
1311                hep->hcpriv = ep;
1312        }
1313        ep->num_req = isp1362_hcd->req_serial++;
1314
1315        /* maybe put endpoint into schedule */
1316        switch (type) {
1317        case PIPE_CONTROL:
1318        case PIPE_BULK:
1319                if (list_empty(&ep->schedule)) {
1320                        DBG(1, "%s: Adding ep %p req %d to async schedule\n",
1321                                __func__, ep, ep->num_req);
1322                        list_add_tail(&ep->schedule, &isp1362_hcd->async);
1323                }
1324                break;
1325        case PIPE_ISOCHRONOUS:
1326        case PIPE_INTERRUPT:
1327                urb->interval = ep->interval;
1328
1329                /* urb submitted for already existing EP */
1330                if (ep->branch < PERIODIC_SIZE)
1331                        break;
1332
1333                retval = balance(isp1362_hcd, ep->interval, ep->load);
1334                if (retval < 0) {
1335                        pr_err("%s: balance returned %d\n", __func__, retval);
1336                        goto fail;
1337                }
1338                ep->branch = retval;
1339                retval = 0;
1340                isp1362_hcd->fmindex = isp1362_read_reg32(isp1362_hcd, HCFMNUM);
1341                DBG(1, "%s: Current frame %04x branch %02x start_frame %04x(%04x)\n",
1342                    __func__, isp1362_hcd->fmindex, ep->branch,
1343                    ((isp1362_hcd->fmindex + PERIODIC_SIZE - 1) &
1344                     ~(PERIODIC_SIZE - 1)) + ep->branch,
1345                    (isp1362_hcd->fmindex & (PERIODIC_SIZE - 1)) + ep->branch);
1346
1347                if (list_empty(&ep->schedule)) {
1348                        if (type == PIPE_ISOCHRONOUS) {
1349                                u16 frame = isp1362_hcd->fmindex;
1350
1351                                frame += max_t(u16, 8, ep->interval);
1352                                frame &= ~(ep->interval - 1);
1353                                frame |= ep->branch;
1354                                if (frame_before(frame, isp1362_hcd->fmindex))
1355                                        frame += ep->interval;
1356                                urb->start_frame = frame;
1357
1358                                DBG(1, "%s: Adding ep %p to isoc schedule\n", __func__, ep);
1359                                list_add_tail(&ep->schedule, &isp1362_hcd->isoc);
1360                        } else {
1361                                DBG(1, "%s: Adding ep %p to periodic schedule\n", __func__, ep);
1362                                list_add_tail(&ep->schedule, &isp1362_hcd->periodic);
1363                        }
1364                } else
1365                        DBG(1, "%s: ep %p already scheduled\n", __func__, ep);
1366
1367                DBG(2, "%s: load %d bandwidth %d -> %d\n", __func__,
1368                    ep->load / ep->interval, isp1362_hcd->load[ep->branch],
1369                    isp1362_hcd->load[ep->branch] + ep->load);
1370                isp1362_hcd->load[ep->branch] += ep->load;
1371        }
1372
1373        urb->hcpriv = hep;
1374        ALIGNSTAT(isp1362_hcd, urb->transfer_buffer);
1375
1376        switch (type) {
1377        case PIPE_CONTROL:
1378        case PIPE_BULK:
1379                start_atl_transfers(isp1362_hcd);
1380                break;
1381        case PIPE_INTERRUPT:
1382                start_intl_transfers(isp1362_hcd);
1383                break;
1384        case PIPE_ISOCHRONOUS:
1385                start_iso_transfers(isp1362_hcd);
1386                break;
1387        default:
1388                BUG();
1389        }
1390 fail:
1391        if (retval)
1392                usb_hcd_unlink_urb_from_ep(hcd, urb);
1393
1394
1395 fail_not_linked:
1396        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1397        if (retval)
1398                DBG(0, "%s: urb %p failed with %d\n", __func__, urb, retval);
1399        return retval;
1400}
1401
1402static int isp1362_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
1403{
1404        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1405        struct usb_host_endpoint *hep;
1406        unsigned long flags;
1407        struct isp1362_ep *ep;
1408        int retval = 0;
1409
1410        DBG(3, "%s: urb %p\n", __func__, urb);
1411
1412        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1413        retval = usb_hcd_check_unlink_urb(hcd, urb, status);
1414        if (retval)
1415                goto done;
1416
1417        hep = urb->hcpriv;
1418
1419        if (!hep) {
1420                spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1421                return -EIDRM;
1422        }
1423
1424        ep = hep->hcpriv;
1425        if (ep) {
1426                /* In front of queue? */
1427                if (ep->hep->urb_list.next == &urb->urb_list) {
1428                        if (!list_empty(&ep->active)) {
1429                                DBG(1, "%s: urb %p ep %p req %d active PTD[%d] $%04x\n", __func__,
1430                                    urb, ep, ep->num_req, ep->ptd_index, ep->ptd_offset);
1431                                /* disable processing and queue PTD for removal */
1432                                remove_ptd(isp1362_hcd, ep);
1433                                urb = NULL;
1434                        }
1435                }
1436                if (urb) {
1437                        DBG(1, "%s: Finishing ep %p req %d\n", __func__, ep,
1438                            ep->num_req);
1439                        finish_request(isp1362_hcd, ep, urb, status);
1440                } else
1441                        DBG(1, "%s: urb %p active; wait4irq\n", __func__, urb);
1442        } else {
1443                pr_warning("%s: No EP in URB %p\n", __func__, urb);
1444                retval = -EINVAL;
1445        }
1446done:
1447        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1448
1449        DBG(3, "%s: exit\n", __func__);
1450
1451        return retval;
1452}
1453
1454static void isp1362_endpoint_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep)
1455{
1456        struct isp1362_ep *ep = hep->hcpriv;
1457        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1458        unsigned long flags;
1459
1460        DBG(1, "%s: ep %p\n", __func__, ep);
1461        if (!ep)
1462                return;
1463        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1464        if (!list_empty(&hep->urb_list)) {
1465                if (!list_empty(&ep->active) && list_empty(&ep->remove_list)) {
1466                        DBG(1, "%s: Removing ep %p req %d PTD[%d] $%04x\n", __func__,
1467                            ep, ep->num_req, ep->ptd_index, ep->ptd_offset);
1468                        remove_ptd(isp1362_hcd, ep);
1469                        pr_info("%s: Waiting for Interrupt to clean up\n", __func__);
1470                }
1471        }
1472        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1473        /* Wait for interrupt to clear out active list */
1474        while (!list_empty(&ep->active))
1475                msleep(1);
1476
1477        DBG(1, "%s: Freeing EP %p\n", __func__, ep);
1478
1479        usb_put_dev(ep->udev);
1480        kfree(ep);
1481        hep->hcpriv = NULL;
1482}
1483
1484static int isp1362_get_frame(struct usb_hcd *hcd)
1485{
1486        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1487        u32 fmnum;
1488        unsigned long flags;
1489
1490        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1491        fmnum = isp1362_read_reg32(isp1362_hcd, HCFMNUM);
1492        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1493
1494        return (int)fmnum;
1495}
1496
1497/*-------------------------------------------------------------------------*/
1498
1499/* Adapted from ohci-hub.c */
1500static int isp1362_hub_status_data(struct usb_hcd *hcd, char *buf)
1501{
1502        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1503        int ports, i, changed = 0;
1504        unsigned long flags;
1505
1506        if (!HC_IS_RUNNING(hcd->state))
1507                return -ESHUTDOWN;
1508
1509        /* Report no status change now, if we are scheduled to be
1510           called later */
1511        if (timer_pending(&hcd->rh_timer))
1512                return 0;
1513
1514        ports = isp1362_hcd->rhdesca & RH_A_NDP;
1515        BUG_ON(ports > 2);
1516
1517        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1518        /* init status */
1519        if (isp1362_hcd->rhstatus & (RH_HS_LPSC | RH_HS_OCIC))
1520                buf[0] = changed = 1;
1521        else
1522                buf[0] = 0;
1523
1524        for (i = 0; i < ports; i++) {
1525                u32 status = isp1362_hcd->rhport[i];
1526
1527                if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC |
1528                              RH_PS_OCIC | RH_PS_PRSC)) {
1529                        changed = 1;
1530                        buf[0] |= 1 << (i + 1);
1531                        continue;
1532                }
1533
1534                if (!(status & RH_PS_CCS))
1535                        continue;
1536        }
1537        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1538        return changed;
1539}
1540
1541static void isp1362_hub_descriptor(struct isp1362_hcd *isp1362_hcd,
1542                                   struct usb_hub_descriptor *desc)
1543{
1544        u32 reg = isp1362_hcd->rhdesca;
1545
1546        DBG(3, "%s: enter\n", __func__);
1547
1548        desc->bDescriptorType = 0x29;
1549        desc->bDescLength = 9;
1550        desc->bHubContrCurrent = 0;
1551        desc->bNbrPorts = reg & 0x3;
1552        /* Power switching, device type, overcurrent. */
1553        desc->wHubCharacteristics = cpu_to_le16((reg >> 8) & 0x1f);
1554        DBG(0, "%s: hubcharacteristics = %02x\n", __func__, cpu_to_le16((reg >> 8) & 0x1f));
1555        desc->bPwrOn2PwrGood = (reg >> 24) & 0xff;
1556        /* ports removable, and legacy PortPwrCtrlMask */
1557        desc->u.hs.DeviceRemovable[0] = desc->bNbrPorts == 1 ? 1 << 1 : 3 << 1;
1558        desc->u.hs.DeviceRemovable[1] = ~0;
1559
1560        DBG(3, "%s: exit\n", __func__);
1561}
1562
1563/* Adapted from ohci-hub.c */
1564static int isp1362_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
1565                               u16 wIndex, char *buf, u16 wLength)
1566{
1567        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1568        int retval = 0;
1569        unsigned long flags;
1570        unsigned long t1;
1571        int ports = isp1362_hcd->rhdesca & RH_A_NDP;
1572        u32 tmp = 0;
1573
1574        switch (typeReq) {
1575        case ClearHubFeature:
1576                DBG(0, "ClearHubFeature: ");
1577                switch (wValue) {
1578                case C_HUB_OVER_CURRENT:
1579                        _DBG(0, "C_HUB_OVER_CURRENT\n");
1580                        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1581                        isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_OCIC);
1582                        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1583                case C_HUB_LOCAL_POWER:
1584                        _DBG(0, "C_HUB_LOCAL_POWER\n");
1585                        break;
1586                default:
1587                        goto error;
1588                }
1589                break;
1590        case SetHubFeature:
1591                DBG(0, "SetHubFeature: ");
1592                switch (wValue) {
1593                case C_HUB_OVER_CURRENT:
1594                case C_HUB_LOCAL_POWER:
1595                        _DBG(0, "C_HUB_OVER_CURRENT or C_HUB_LOCAL_POWER\n");
1596                        break;
1597                default:
1598                        goto error;
1599                }
1600                break;
1601        case GetHubDescriptor:
1602                DBG(0, "GetHubDescriptor\n");
1603                isp1362_hub_descriptor(isp1362_hcd, (struct usb_hub_descriptor *)buf);
1604                break;
1605        case GetHubStatus:
1606                DBG(0, "GetHubStatus\n");
1607                put_unaligned(cpu_to_le32(0), (__le32 *) buf);
1608                break;
1609        case GetPortStatus:
1610#ifndef VERBOSE
1611                DBG(0, "GetPortStatus\n");
1612#endif
1613                if (!wIndex || wIndex > ports)
1614                        goto error;
1615                tmp = isp1362_hcd->rhport[--wIndex];
1616                put_unaligned(cpu_to_le32(tmp), (__le32 *) buf);
1617                break;
1618        case ClearPortFeature:
1619                DBG(0, "ClearPortFeature: ");
1620                if (!wIndex || wIndex > ports)
1621                        goto error;
1622                wIndex--;
1623
1624                switch (wValue) {
1625                case USB_PORT_FEAT_ENABLE:
1626                        _DBG(0, "USB_PORT_FEAT_ENABLE\n");
1627                        tmp = RH_PS_CCS;
1628                        break;
1629                case USB_PORT_FEAT_C_ENABLE:
1630                        _DBG(0, "USB_PORT_FEAT_C_ENABLE\n");
1631                        tmp = RH_PS_PESC;
1632                        break;
1633                case USB_PORT_FEAT_SUSPEND:
1634                        _DBG(0, "USB_PORT_FEAT_SUSPEND\n");
1635                        tmp = RH_PS_POCI;
1636                        break;
1637                case USB_PORT_FEAT_C_SUSPEND:
1638                        _DBG(0, "USB_PORT_FEAT_C_SUSPEND\n");
1639                        tmp = RH_PS_PSSC;
1640                        break;
1641                case USB_PORT_FEAT_POWER:
1642                        _DBG(0, "USB_PORT_FEAT_POWER\n");
1643                        tmp = RH_PS_LSDA;
1644
1645                        break;
1646                case USB_PORT_FEAT_C_CONNECTION:
1647                        _DBG(0, "USB_PORT_FEAT_C_CONNECTION\n");
1648                        tmp = RH_PS_CSC;
1649                        break;
1650                case USB_PORT_FEAT_C_OVER_CURRENT:
1651                        _DBG(0, "USB_PORT_FEAT_C_OVER_CURRENT\n");
1652                        tmp = RH_PS_OCIC;
1653                        break;
1654                case USB_PORT_FEAT_C_RESET:
1655                        _DBG(0, "USB_PORT_FEAT_C_RESET\n");
1656                        tmp = RH_PS_PRSC;
1657                        break;
1658                default:
1659                        goto error;
1660                }
1661
1662                spin_lock_irqsave(&isp1362_hcd->lock, flags);
1663                isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + wIndex, tmp);
1664                isp1362_hcd->rhport[wIndex] =
1665                        isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + wIndex);
1666                spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1667                break;
1668        case SetPortFeature:
1669                DBG(0, "SetPortFeature: ");
1670                if (!wIndex || wIndex > ports)
1671                        goto error;
1672                wIndex--;
1673                switch (wValue) {
1674                case USB_PORT_FEAT_SUSPEND:
1675                        _DBG(0, "USB_PORT_FEAT_SUSPEND\n");
1676                        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1677                        isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + wIndex, RH_PS_PSS);
1678                        isp1362_hcd->rhport[wIndex] =
1679                                isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + wIndex);
1680                        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1681                        break;
1682                case USB_PORT_FEAT_POWER:
1683                        _DBG(0, "USB_PORT_FEAT_POWER\n");
1684                        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1685                        isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + wIndex, RH_PS_PPS);
1686                        isp1362_hcd->rhport[wIndex] =
1687                                isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + wIndex);
1688                        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1689                        break;
1690                case USB_PORT_FEAT_RESET:
1691                        _DBG(0, "USB_PORT_FEAT_RESET\n");
1692                        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1693
1694                        t1 = jiffies + msecs_to_jiffies(USB_RESET_WIDTH);
1695                        while (time_before(jiffies, t1)) {
1696                                /* spin until any current reset finishes */
1697                                for (;;) {
1698                                        tmp = isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + wIndex);
1699                                        if (!(tmp & RH_PS_PRS))
1700                                                break;
1701                                        udelay(500);
1702                                }
1703                                if (!(tmp & RH_PS_CCS))
1704                                        break;
1705                                /* Reset lasts 10ms (claims datasheet) */
1706                                isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + wIndex, (RH_PS_PRS));
1707
1708                                spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1709                                msleep(10);
1710                                spin_lock_irqsave(&isp1362_hcd->lock, flags);
1711                        }
1712
1713                        isp1362_hcd->rhport[wIndex] = isp1362_read_reg32(isp1362_hcd,
1714                                                                         HCRHPORT1 + wIndex);
1715                        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1716                        break;
1717                default:
1718                        goto error;
1719                }
1720                break;
1721
1722        default:
1723 error:
1724                /* "protocol stall" on error */
1725                _DBG(0, "PROTOCOL STALL\n");
1726                retval = -EPIPE;
1727        }
1728
1729        return retval;
1730}
1731
1732#ifdef  CONFIG_PM
1733static int isp1362_bus_suspend(struct usb_hcd *hcd)
1734{
1735        int status = 0;
1736        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1737        unsigned long flags;
1738
1739        if (time_before(jiffies, isp1362_hcd->next_statechange))
1740                msleep(5);
1741
1742        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1743
1744        isp1362_hcd->hc_control = isp1362_read_reg32(isp1362_hcd, HCCONTROL);
1745        switch (isp1362_hcd->hc_control & OHCI_CTRL_HCFS) {
1746        case OHCI_USB_RESUME:
1747                DBG(0, "%s: resume/suspend?\n", __func__);
1748                isp1362_hcd->hc_control &= ~OHCI_CTRL_HCFS;
1749                isp1362_hcd->hc_control |= OHCI_USB_RESET;
1750                isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control);
1751                /* FALL THROUGH */
1752        case OHCI_USB_RESET:
1753                status = -EBUSY;
1754                pr_warning("%s: needs reinit!\n", __func__);
1755                goto done;
1756        case OHCI_USB_SUSPEND:
1757                pr_warning("%s: already suspended?\n", __func__);
1758                goto done;
1759        }
1760        DBG(0, "%s: suspend root hub\n", __func__);
1761
1762        /* First stop any processing */
1763        hcd->state = HC_STATE_QUIESCING;
1764        if (!list_empty(&isp1362_hcd->atl_queue.active) ||
1765            !list_empty(&isp1362_hcd->intl_queue.active) ||
1766            !list_empty(&isp1362_hcd->istl_queue[0] .active) ||
1767            !list_empty(&isp1362_hcd->istl_queue[1] .active)) {
1768                int limit;
1769
1770                isp1362_write_reg32(isp1362_hcd, HCATLSKIP, ~0);
1771                isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, ~0);
1772                isp1362_write_reg16(isp1362_hcd, HCBUFSTAT, 0);
1773                isp1362_write_reg16(isp1362_hcd, HCuPINTENB, 0);
1774                isp1362_write_reg32(isp1362_hcd, HCINTSTAT, OHCI_INTR_SF);
1775
1776                DBG(0, "%s: stopping schedules ...\n", __func__);
1777                limit = 2000;
1778                while (limit > 0) {
1779                        udelay(250);
1780                        limit -= 250;
1781                        if (isp1362_read_reg32(isp1362_hcd, HCINTSTAT) & OHCI_INTR_SF)
1782                                break;
1783                }
1784                mdelay(7);
1785                if (isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_ATL) {
1786                        u32 done_map = isp1362_read_reg32(isp1362_hcd, HCATLDONE);
1787                        finish_transfers(isp1362_hcd, done_map, &isp1362_hcd->atl_queue);
1788                }
1789                if (isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_INTL) {
1790                        u32 done_map = isp1362_read_reg32(isp1362_hcd, HCINTLDONE);
1791                        finish_transfers(isp1362_hcd, done_map, &isp1362_hcd->intl_queue);
1792                }
1793                if (isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_ISTL0)
1794                        finish_iso_transfers(isp1362_hcd, &isp1362_hcd->istl_queue[0]);
1795                if (isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_ISTL1)
1796                        finish_iso_transfers(isp1362_hcd, &isp1362_hcd->istl_queue[1]);
1797        }
1798        DBG(0, "%s: HCINTSTAT: %08x\n", __func__,
1799                    isp1362_read_reg32(isp1362_hcd, HCINTSTAT));
1800        isp1362_write_reg32(isp1362_hcd, HCINTSTAT,
1801                            isp1362_read_reg32(isp1362_hcd, HCINTSTAT));
1802
1803        /* Suspend hub */
1804        isp1362_hcd->hc_control = OHCI_USB_SUSPEND;
1805        isp1362_show_reg(isp1362_hcd, HCCONTROL);
1806        isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control);
1807        isp1362_show_reg(isp1362_hcd, HCCONTROL);
1808
1809#if 1
1810        isp1362_hcd->hc_control = isp1362_read_reg32(isp1362_hcd, HCCONTROL);
1811        if ((isp1362_hcd->hc_control & OHCI_CTRL_HCFS) != OHCI_USB_SUSPEND) {
1812                pr_err("%s: controller won't suspend %08x\n", __func__,
1813                    isp1362_hcd->hc_control);
1814                status = -EBUSY;
1815        } else
1816#endif
1817        {
1818                /* no resumes until devices finish suspending */
1819                isp1362_hcd->next_statechange = jiffies + msecs_to_jiffies(5);
1820        }
1821done:
1822        if (status == 0) {
1823                hcd->state = HC_STATE_SUSPENDED;
1824                DBG(0, "%s: HCD suspended: %08x\n", __func__,
1825                    isp1362_read_reg32(isp1362_hcd, HCCONTROL));
1826        }
1827        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1828        return status;
1829}
1830
1831static int isp1362_bus_resume(struct usb_hcd *hcd)
1832{
1833        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
1834        u32 port;
1835        unsigned long flags;
1836        int status = -EINPROGRESS;
1837
1838        if (time_before(jiffies, isp1362_hcd->next_statechange))
1839                msleep(5);
1840
1841        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1842        isp1362_hcd->hc_control = isp1362_read_reg32(isp1362_hcd, HCCONTROL);
1843        pr_info("%s: HCCONTROL: %08x\n", __func__, isp1362_hcd->hc_control);
1844        if (hcd->state == HC_STATE_RESUMING) {
1845                pr_warning("%s: duplicate resume\n", __func__);
1846                status = 0;
1847        } else
1848                switch (isp1362_hcd->hc_control & OHCI_CTRL_HCFS) {
1849                case OHCI_USB_SUSPEND:
1850                        DBG(0, "%s: resume root hub\n", __func__);
1851                        isp1362_hcd->hc_control &= ~OHCI_CTRL_HCFS;
1852                        isp1362_hcd->hc_control |= OHCI_USB_RESUME;
1853                        isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control);
1854                        break;
1855                case OHCI_USB_RESUME:
1856                        /* HCFS changes sometime after INTR_RD */
1857                        DBG(0, "%s: remote wakeup\n", __func__);
1858                        break;
1859                case OHCI_USB_OPER:
1860                        DBG(0, "%s: odd resume\n", __func__);
1861                        status = 0;
1862                        hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1863                        break;
1864                default:                /* RESET, we lost power */
1865                        DBG(0, "%s: root hub hardware reset\n", __func__);
1866                        status = -EBUSY;
1867                }
1868        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1869        if (status == -EBUSY) {
1870                DBG(0, "%s: Restarting HC\n", __func__);
1871                isp1362_hc_stop(hcd);
1872                return isp1362_hc_start(hcd);
1873        }
1874        if (status != -EINPROGRESS)
1875                return status;
1876        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1877        port = isp1362_read_reg32(isp1362_hcd, HCRHDESCA) & RH_A_NDP;
1878        while (port--) {
1879                u32 stat = isp1362_read_reg32(isp1362_hcd, HCRHPORT1 + port);
1880
1881                /* force global, not selective, resume */
1882                if (!(stat & RH_PS_PSS)) {
1883                        DBG(0, "%s: Not Resuming RH port %d\n", __func__, port);
1884                        continue;
1885                }
1886                DBG(0, "%s: Resuming RH port %d\n", __func__, port);
1887                isp1362_write_reg32(isp1362_hcd, HCRHPORT1 + port, RH_PS_POCI);
1888        }
1889        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1890
1891        /* Some controllers (lucent) need extra-long delays */
1892        hcd->state = HC_STATE_RESUMING;
1893        mdelay(20 /* usb 11.5.1.10 */ + 15);
1894
1895        isp1362_hcd->hc_control = OHCI_USB_OPER;
1896        spin_lock_irqsave(&isp1362_hcd->lock, flags);
1897        isp1362_show_reg(isp1362_hcd, HCCONTROL);
1898        isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control);
1899        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
1900        /* TRSMRCY */
1901        msleep(10);
1902
1903        /* keep it alive for ~5x suspend + resume costs */
1904        isp1362_hcd->next_statechange = jiffies + msecs_to_jiffies(250);
1905
1906        hcd->self.root_hub->dev.power.power_state = PMSG_ON;
1907        hcd->state = HC_STATE_RUNNING;
1908        return 0;
1909}
1910#else
1911#define isp1362_bus_suspend     NULL
1912#define isp1362_bus_resume      NULL
1913#endif
1914
1915/*-------------------------------------------------------------------------*/
1916
1917#ifdef STUB_DEBUG_FILE
1918
1919static inline void create_debug_file(struct isp1362_hcd *isp1362_hcd)
1920{
1921}
1922static inline void remove_debug_file(struct isp1362_hcd *isp1362_hcd)
1923{
1924}
1925
1926#else
1927
1928#include <linux/proc_fs.h>
1929#include <linux/seq_file.h>
1930
1931static void dump_irq(struct seq_file *s, char *label, u16 mask)
1932{
1933        seq_printf(s, "%-15s %04x%s%s%s%s%s%s\n", label, mask,
1934                   mask & HCuPINT_CLKRDY ? " clkrdy" : "",
1935                   mask & HCuPINT_SUSP ? " susp" : "",
1936                   mask & HCuPINT_OPR ? " opr" : "",
1937                   mask & HCuPINT_EOT ? " eot" : "",
1938                   mask & HCuPINT_ATL ? " atl" : "",
1939                   mask & HCuPINT_SOF ? " sof" : "");
1940}
1941
1942static void dump_int(struct seq_file *s, char *label, u32 mask)
1943{
1944        seq_printf(s, "%-15s %08x%s%s%s%s%s%s%s\n", label, mask,
1945                   mask & OHCI_INTR_MIE ? " MIE" : "",
1946                   mask & OHCI_INTR_RHSC ? " rhsc" : "",
1947                   mask & OHCI_INTR_FNO ? " fno" : "",
1948                   mask & OHCI_INTR_UE ? " ue" : "",
1949                   mask & OHCI_INTR_RD ? " rd" : "",
1950                   mask & OHCI_INTR_SF ? " sof" : "",
1951                   mask & OHCI_INTR_SO ? " so" : "");
1952}
1953
1954static void dump_ctrl(struct seq_file *s, char *label, u32 mask)
1955{
1956        seq_printf(s, "%-15s %08x%s%s%s\n", label, mask,
1957                   mask & OHCI_CTRL_RWC ? " rwc" : "",
1958                   mask & OHCI_CTRL_RWE ? " rwe" : "",
1959                   ({
1960                           char *hcfs;
1961                           switch (mask & OHCI_CTRL_HCFS) {
1962                           case OHCI_USB_OPER:
1963                                   hcfs = " oper";
1964                                   break;
1965                           case OHCI_USB_RESET:
1966                                   hcfs = " reset";
1967                                   break;
1968                           case OHCI_USB_RESUME:
1969                                   hcfs = " resume";
1970                                   break;
1971                           case OHCI_USB_SUSPEND:
1972                                   hcfs = " suspend";
1973                                   break;
1974                           default:
1975                                   hcfs = " ?";
1976                           }
1977                           hcfs;
1978                   }));
1979}
1980
1981static void dump_regs(struct seq_file *s, struct isp1362_hcd *isp1362_hcd)
1982{
1983        seq_printf(s, "HCREVISION [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCREVISION),
1984                   isp1362_read_reg32(isp1362_hcd, HCREVISION));
1985        seq_printf(s, "HCCONTROL  [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCCONTROL),
1986                   isp1362_read_reg32(isp1362_hcd, HCCONTROL));
1987        seq_printf(s, "HCCMDSTAT  [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCCMDSTAT),
1988                   isp1362_read_reg32(isp1362_hcd, HCCMDSTAT));
1989        seq_printf(s, "HCINTSTAT  [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCINTSTAT),
1990                   isp1362_read_reg32(isp1362_hcd, HCINTSTAT));
1991        seq_printf(s, "HCINTENB   [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCINTENB),
1992                   isp1362_read_reg32(isp1362_hcd, HCINTENB));
1993        seq_printf(s, "HCFMINTVL  [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCFMINTVL),
1994                   isp1362_read_reg32(isp1362_hcd, HCFMINTVL));
1995        seq_printf(s, "HCFMREM    [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCFMREM),
1996                   isp1362_read_reg32(isp1362_hcd, HCFMREM));
1997        seq_printf(s, "HCFMNUM    [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCFMNUM),
1998                   isp1362_read_reg32(isp1362_hcd, HCFMNUM));
1999        seq_printf(s, "HCLSTHRESH [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCLSTHRESH),
2000                   isp1362_read_reg32(isp1362_hcd, HCLSTHRESH));
2001        seq_printf(s, "HCRHDESCA  [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCRHDESCA),
2002                   isp1362_read_reg32(isp1362_hcd, HCRHDESCA));
2003        seq_printf(s, "HCRHDESCB  [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCRHDESCB),
2004                   isp1362_read_reg32(isp1362_hcd, HCRHDESCB));
2005        seq_printf(s, "HCRHSTATUS [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCRHSTATUS),
2006                   isp1362_read_reg32(isp1362_hcd, HCRHSTATUS));
2007        seq_printf(s, "HCRHPORT1  [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCRHPORT1),
2008                   isp1362_read_reg32(isp1362_hcd, HCRHPORT1));
2009        seq_printf(s, "HCRHPORT2  [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCRHPORT2),
2010                   isp1362_read_reg32(isp1362_hcd, HCRHPORT2));
2011        seq_printf(s, "\n");
2012        seq_printf(s, "HCHWCFG    [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCHWCFG),
2013                   isp1362_read_reg16(isp1362_hcd, HCHWCFG));
2014        seq_printf(s, "HCDMACFG   [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCDMACFG),
2015                   isp1362_read_reg16(isp1362_hcd, HCDMACFG));
2016        seq_printf(s, "HCXFERCTR  [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCXFERCTR),
2017                   isp1362_read_reg16(isp1362_hcd, HCXFERCTR));
2018        seq_printf(s, "HCuPINT    [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCuPINT),
2019                   isp1362_read_reg16(isp1362_hcd, HCuPINT));
2020        seq_printf(s, "HCuPINTENB [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCuPINTENB),
2021                   isp1362_read_reg16(isp1362_hcd, HCuPINTENB));
2022        seq_printf(s, "HCCHIPID   [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCCHIPID),
2023                   isp1362_read_reg16(isp1362_hcd, HCCHIPID));
2024        seq_printf(s, "HCSCRATCH  [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCSCRATCH),
2025                   isp1362_read_reg16(isp1362_hcd, HCSCRATCH));
2026        seq_printf(s, "HCBUFSTAT  [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCBUFSTAT),
2027                   isp1362_read_reg16(isp1362_hcd, HCBUFSTAT));
2028        seq_printf(s, "HCDIRADDR  [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCDIRADDR),
2029                   isp1362_read_reg32(isp1362_hcd, HCDIRADDR));
2030#if 0
2031        seq_printf(s, "HCDIRDATA  [%02x]     %04x\n", ISP1362_REG_NO(HCDIRDATA),
2032                   isp1362_read_reg16(isp1362_hcd, HCDIRDATA));
2033#endif
2034        seq_printf(s, "HCISTLBUFSZ[%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCISTLBUFSZ),
2035                   isp1362_read_reg16(isp1362_hcd, HCISTLBUFSZ));
2036        seq_printf(s, "HCISTLRATE [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCISTLRATE),
2037                   isp1362_read_reg16(isp1362_hcd, HCISTLRATE));
2038        seq_printf(s, "\n");
2039        seq_printf(s, "HCINTLBUFSZ[%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCINTLBUFSZ),
2040                   isp1362_read_reg16(isp1362_hcd, HCINTLBUFSZ));
2041        seq_printf(s, "HCINTLBLKSZ[%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCINTLBLKSZ),
2042                   isp1362_read_reg16(isp1362_hcd, HCINTLBLKSZ));
2043        seq_printf(s, "HCINTLDONE [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCINTLDONE),
2044                   isp1362_read_reg32(isp1362_hcd, HCINTLDONE));
2045        seq_printf(s, "HCINTLSKIP [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCINTLSKIP),
2046                   isp1362_read_reg32(isp1362_hcd, HCINTLSKIP));
2047        seq_printf(s, "HCINTLLAST [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCINTLLAST),
2048                   isp1362_read_reg32(isp1362_hcd, HCINTLLAST));
2049        seq_printf(s, "HCINTLCURR [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCINTLCURR),
2050                   isp1362_read_reg16(isp1362_hcd, HCINTLCURR));
2051        seq_printf(s, "\n");
2052        seq_printf(s, "HCATLBUFSZ [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCATLBUFSZ),
2053                   isp1362_read_reg16(isp1362_hcd, HCATLBUFSZ));
2054        seq_printf(s, "HCATLBLKSZ [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCATLBLKSZ),
2055                   isp1362_read_reg16(isp1362_hcd, HCATLBLKSZ));
2056#if 0
2057        seq_printf(s, "HCATLDONE  [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCATLDONE),
2058                   isp1362_read_reg32(isp1362_hcd, HCATLDONE));
2059#endif
2060        seq_printf(s, "HCATLSKIP  [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCATLSKIP),
2061                   isp1362_read_reg32(isp1362_hcd, HCATLSKIP));
2062        seq_printf(s, "HCATLLAST  [%02x] %08x\n", ISP1362_REG_NO(ISP1362_REG_HCATLLAST),
2063                   isp1362_read_reg32(isp1362_hcd, HCATLLAST));
2064        seq_printf(s, "HCATLCURR  [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCATLCURR),
2065                   isp1362_read_reg16(isp1362_hcd, HCATLCURR));
2066        seq_printf(s, "\n");
2067        seq_printf(s, "HCATLDTC   [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCATLDTC),
2068                   isp1362_read_reg16(isp1362_hcd, HCATLDTC));
2069        seq_printf(s, "HCATLDTCTO [%02x]     %04x\n", ISP1362_REG_NO(ISP1362_REG_HCATLDTCTO),
2070                   isp1362_read_reg16(isp1362_hcd, HCATLDTCTO));
2071}
2072
2073static int proc_isp1362_show(struct seq_file *s, void *unused)
2074{
2075        struct isp1362_hcd *isp1362_hcd = s->private;
2076        struct isp1362_ep *ep;
2077        int i;
2078
2079        seq_printf(s, "%s\n%s version %s\n",
2080                   isp1362_hcd_to_hcd(isp1362_hcd)->product_desc, hcd_name, DRIVER_VERSION);
2081
2082        /* collect statistics to help estimate potential win for
2083         * DMA engines that care about alignment (PXA)
2084         */
2085        seq_printf(s, "alignment:  16b/%ld 8b/%ld 4b/%ld 2b/%ld 1b/%ld\n",
2086                   isp1362_hcd->stat16, isp1362_hcd->stat8, isp1362_hcd->stat4,
2087                   isp1362_hcd->stat2, isp1362_hcd->stat1);
2088        seq_printf(s, "max # ptds in ATL  fifo: %d\n", isp1362_hcd->atl_queue.stat_maxptds);
2089        seq_printf(s, "max # ptds in INTL fifo: %d\n", isp1362_hcd->intl_queue.stat_maxptds);
2090        seq_printf(s, "max # ptds in ISTL fifo: %d\n",
2091                   max(isp1362_hcd->istl_queue[0] .stat_maxptds,
2092                       isp1362_hcd->istl_queue[1] .stat_maxptds));
2093
2094        /* FIXME: don't show the following in suspended state */
2095        spin_lock_irq(&isp1362_hcd->lock);
2096
2097        dump_irq(s, "hc_irq_enable", isp1362_read_reg16(isp1362_hcd, HCuPINTENB));
2098        dump_irq(s, "hc_irq_status", isp1362_read_reg16(isp1362_hcd, HCuPINT));
2099        dump_int(s, "ohci_int_enable", isp1362_read_reg32(isp1362_hcd, HCINTENB));
2100        dump_int(s, "ohci_int_status", isp1362_read_reg32(isp1362_hcd, HCINTSTAT));
2101        dump_ctrl(s, "ohci_control", isp1362_read_reg32(isp1362_hcd, HCCONTROL));
2102
2103        for (i = 0; i < NUM_ISP1362_IRQS; i++)
2104                if (isp1362_hcd->irq_stat[i])
2105                        seq_printf(s, "%-15s: %d\n",
2106                                   ISP1362_INT_NAME(i), isp1362_hcd->irq_stat[i]);
2107
2108        dump_regs(s, isp1362_hcd);
2109        list_for_each_entry(ep, &isp1362_hcd->async, schedule) {
2110                struct urb *urb;
2111
2112                seq_printf(s, "%p, ep%d%s, maxpacket %d:\n", ep, ep->epnum,
2113                           ({
2114                                   char *s;
2115                                   switch (ep->nextpid) {
2116                                   case USB_PID_IN:
2117                                           s = "in";
2118                                           break;
2119                                   case USB_PID_OUT:
2120                                           s = "out";
2121                                           break;
2122                                   case USB_PID_SETUP:
2123                                           s = "setup";
2124                                           break;
2125                                   case USB_PID_ACK:
2126                                           s = "status";
2127                                           break;
2128                                   default:
2129                                           s = "?";
2130                                           break;
2131                                   };
2132                                   s;}), ep->maxpacket) ;
2133                list_for_each_entry(urb, &ep->hep->urb_list, urb_list) {
2134                        seq_printf(s, "  urb%p, %d/%d\n", urb,
2135                                   urb->actual_length,
2136                                   urb->transfer_buffer_length);
2137                }
2138        }
2139        if (!list_empty(&isp1362_hcd->async))
2140                seq_printf(s, "\n");
2141        dump_ptd_queue(&isp1362_hcd->atl_queue);
2142
2143        seq_printf(s, "periodic size= %d\n", PERIODIC_SIZE);
2144
2145        list_for_each_entry(ep, &isp1362_hcd->periodic, schedule) {
2146                seq_printf(s, "branch:%2d load:%3d PTD[%d] $%04x:\n", ep->branch,
2147                           isp1362_hcd->load[ep->branch], ep->ptd_index, ep->ptd_offset);
2148
2149                seq_printf(s, "   %d/%p (%sdev%d ep%d%s max %d)\n",
2150                           ep->interval, ep,
2151                           (ep->udev->speed == USB_SPEED_FULL) ? "" : "ls ",
2152                           ep->udev->devnum, ep->epnum,
2153                           (ep->epnum == 0) ? "" :
2154                           ((ep->nextpid == USB_PID_IN) ?
2155                            "in" : "out"), ep->maxpacket);
2156        }
2157        dump_ptd_queue(&isp1362_hcd->intl_queue);
2158
2159        seq_printf(s, "ISO:\n");
2160
2161        list_for_each_entry(ep, &isp1362_hcd->isoc, schedule) {
2162                seq_printf(s, "   %d/%p (%sdev%d ep%d%s max %d)\n",
2163                           ep->interval, ep,
2164                           (ep->udev->speed == USB_SPEED_FULL) ? "" : "ls ",
2165                           ep->udev->devnum, ep->epnum,
2166                           (ep->epnum == 0) ? "" :
2167                           ((ep->nextpid == USB_PID_IN) ?
2168                            "in" : "out"), ep->maxpacket);
2169        }
2170
2171        spin_unlock_irq(&isp1362_hcd->lock);
2172        seq_printf(s, "\n");
2173
2174        return 0;
2175}
2176
2177static int proc_isp1362_open(struct inode *inode, struct file *file)
2178{
2179        return single_open(file, proc_isp1362_show, PDE(inode)->data);
2180}
2181
2182static const struct file_operations proc_ops = {
2183        .open = proc_isp1362_open,
2184        .read = seq_read,
2185        .llseek = seq_lseek,
2186        .release = single_release,
2187};
2188
2189/* expect just one isp1362_hcd per system */
2190static const char proc_filename[] = "driver/isp1362";
2191
2192static void create_debug_file(struct isp1362_hcd *isp1362_hcd)
2193{
2194        struct proc_dir_entry *pde;
2195
2196        pde = create_proc_entry(proc_filename, 0, NULL);
2197        if (pde == NULL) {
2198                pr_warning("%s: Failed to create debug file '%s'\n", __func__, proc_filename);
2199                return;
2200        }
2201
2202        pde->proc_fops = &proc_ops;
2203        pde->data = isp1362_hcd;
2204        isp1362_hcd->pde = pde;
2205}
2206
2207static void remove_debug_file(struct isp1362_hcd *isp1362_hcd)
2208{
2209        if (isp1362_hcd->pde)
2210                remove_proc_entry(proc_filename, NULL);
2211}
2212
2213#endif
2214
2215/*-------------------------------------------------------------------------*/
2216
2217static void __isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd)
2218{
2219        int tmp = 20;
2220
2221        isp1362_write_reg16(isp1362_hcd, HCSWRES, HCSWRES_MAGIC);
2222        isp1362_write_reg32(isp1362_hcd, HCCMDSTAT, OHCI_HCR);
2223        while (--tmp) {
2224                mdelay(1);
2225                if (!(isp1362_read_reg32(isp1362_hcd, HCCMDSTAT) & OHCI_HCR))
2226                        break;
2227        }
2228        if (!tmp)
2229                pr_err("Software reset timeout\n");
2230}
2231
2232static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd)
2233{
2234        unsigned long flags;
2235
2236        spin_lock_irqsave(&isp1362_hcd->lock, flags);
2237        __isp1362_sw_reset(isp1362_hcd);
2238        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2239}
2240
2241static int isp1362_mem_config(struct usb_hcd *hcd)
2242{
2243        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2244        unsigned long flags;
2245        u32 total;
2246        u16 istl_size = ISP1362_ISTL_BUFSIZE;
2247        u16 intl_blksize = ISP1362_INTL_BLKSIZE + PTD_HEADER_SIZE;
2248        u16 intl_size = ISP1362_INTL_BUFFERS * intl_blksize;
2249        u16 atl_blksize = ISP1362_ATL_BLKSIZE + PTD_HEADER_SIZE;
2250        u16 atl_buffers = (ISP1362_BUF_SIZE - (istl_size + intl_size)) / atl_blksize;
2251        u16 atl_size;
2252        int i;
2253
2254        WARN_ON(istl_size & 3);
2255        WARN_ON(atl_blksize & 3);
2256        WARN_ON(intl_blksize & 3);
2257        WARN_ON(atl_blksize < PTD_HEADER_SIZE);
2258        WARN_ON(intl_blksize < PTD_HEADER_SIZE);
2259
2260        BUG_ON((unsigned)ISP1362_INTL_BUFFERS > 32);
2261        if (atl_buffers > 32)
2262                atl_buffers = 32;
2263        atl_size = atl_buffers * atl_blksize;
2264        total = atl_size + intl_size + istl_size;
2265        dev_info(hcd->self.controller, "ISP1362 Memory usage:\n");
2266        dev_info(hcd->self.controller, "  ISTL:    2 * %4d:     %4d @ $%04x:$%04x\n",
2267                 istl_size / 2, istl_size, 0, istl_size / 2);
2268        dev_info(hcd->self.controller, "  INTL: %4d * (%3zu+8):  %4d @ $%04x\n",
2269                 ISP1362_INTL_BUFFERS, intl_blksize - PTD_HEADER_SIZE,
2270                 intl_size, istl_size);
2271        dev_info(hcd->self.controller, "  ATL : %4d * (%3zu+8):  %4d @ $%04x\n",
2272                 atl_buffers, atl_blksize - PTD_HEADER_SIZE,
2273                 atl_size, istl_size + intl_size);
2274        dev_info(hcd->self.controller, "  USED/FREE:   %4d      %4d\n", total,
2275                 ISP1362_BUF_SIZE - total);
2276
2277        if (total > ISP1362_BUF_SIZE) {
2278                dev_err(hcd->self.controller, "%s: Memory requested: %d, available %d\n",
2279                        __func__, total, ISP1362_BUF_SIZE);
2280                return -ENOMEM;
2281        }
2282
2283        total = istl_size + intl_size + atl_size;
2284        spin_lock_irqsave(&isp1362_hcd->lock, flags);
2285
2286        for (i = 0; i < 2; i++) {
2287                isp1362_hcd->istl_queue[i].buf_start = i * istl_size / 2,
2288                isp1362_hcd->istl_queue[i].buf_size = istl_size / 2;
2289                isp1362_hcd->istl_queue[i].blk_size = 4;
2290                INIT_LIST_HEAD(&isp1362_hcd->istl_queue[i].active);
2291                snprintf(isp1362_hcd->istl_queue[i].name,
2292                         sizeof(isp1362_hcd->istl_queue[i].name), "ISTL%d", i);
2293                DBG(3, "%s: %5s buf $%04x %d\n", __func__,
2294                     isp1362_hcd->istl_queue[i].name,
2295                     isp1362_hcd->istl_queue[i].buf_start,
2296                     isp1362_hcd->istl_queue[i].buf_size);
2297        }
2298        isp1362_write_reg16(isp1362_hcd, HCISTLBUFSZ, istl_size / 2);
2299
2300        isp1362_hcd->intl_queue.buf_start = istl_size;
2301        isp1362_hcd->intl_queue.buf_size = intl_size;
2302        isp1362_hcd->intl_queue.buf_count = ISP1362_INTL_BUFFERS;
2303        isp1362_hcd->intl_queue.blk_size = intl_blksize;
2304        isp1362_hcd->intl_queue.buf_avail = isp1362_hcd->intl_queue.buf_count;
2305        isp1362_hcd->intl_queue.skip_map = ~0;
2306        INIT_LIST_HEAD(&isp1362_hcd->intl_queue.active);
2307
2308        isp1362_write_reg16(isp1362_hcd, HCINTLBUFSZ,
2309                            isp1362_hcd->intl_queue.buf_size);
2310        isp1362_write_reg16(isp1362_hcd, HCINTLBLKSZ,
2311                            isp1362_hcd->intl_queue.blk_size - PTD_HEADER_SIZE);
2312        isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, ~0);
2313        isp1362_write_reg32(isp1362_hcd, HCINTLLAST,
2314                            1 << (ISP1362_INTL_BUFFERS - 1));
2315
2316        isp1362_hcd->atl_queue.buf_start = istl_size + intl_size;
2317        isp1362_hcd->atl_queue.buf_size = atl_size;
2318        isp1362_hcd->atl_queue.buf_count = atl_buffers;
2319        isp1362_hcd->atl_queue.blk_size = atl_blksize;
2320        isp1362_hcd->atl_queue.buf_avail = isp1362_hcd->atl_queue.buf_count;
2321        isp1362_hcd->atl_queue.skip_map = ~0;
2322        INIT_LIST_HEAD(&isp1362_hcd->atl_queue.active);
2323
2324        isp1362_write_reg16(isp1362_hcd, HCATLBUFSZ,
2325                            isp1362_hcd->atl_queue.buf_size);
2326        isp1362_write_reg16(isp1362_hcd, HCATLBLKSZ,
2327                            isp1362_hcd->atl_queue.blk_size - PTD_HEADER_SIZE);
2328        isp1362_write_reg32(isp1362_hcd, HCATLSKIP, ~0);
2329        isp1362_write_reg32(isp1362_hcd, HCATLLAST,
2330                            1 << (atl_buffers - 1));
2331
2332        snprintf(isp1362_hcd->atl_queue.name,
2333                 sizeof(isp1362_hcd->atl_queue.name), "ATL");
2334        snprintf(isp1362_hcd->intl_queue.name,
2335                 sizeof(isp1362_hcd->intl_queue.name), "INTL");
2336        DBG(3, "%s: %5s buf $%04x %2d * %4d = %4d\n", __func__,
2337             isp1362_hcd->intl_queue.name,
2338             isp1362_hcd->intl_queue.buf_start,
2339             ISP1362_INTL_BUFFERS, isp1362_hcd->intl_queue.blk_size,
2340             isp1362_hcd->intl_queue.buf_size);
2341        DBG(3, "%s: %5s buf $%04x %2d * %4d = %4d\n", __func__,
2342             isp1362_hcd->atl_queue.name,
2343             isp1362_hcd->atl_queue.buf_start,
2344             atl_buffers, isp1362_hcd->atl_queue.blk_size,
2345             isp1362_hcd->atl_queue.buf_size);
2346
2347        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2348
2349        return 0;
2350}
2351
2352static int isp1362_hc_reset(struct usb_hcd *hcd)
2353{
2354        int ret = 0;
2355        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2356        unsigned long t;
2357        unsigned long timeout = 100;
2358        unsigned long flags;
2359        int clkrdy = 0;
2360
2361        pr_debug("%s:\n", __func__);
2362
2363        if (isp1362_hcd->board && isp1362_hcd->board->reset) {
2364                isp1362_hcd->board->reset(hcd->self.controller, 1);
2365                msleep(20);
2366                if (isp1362_hcd->board->clock)
2367                        isp1362_hcd->board->clock(hcd->self.controller, 1);
2368                isp1362_hcd->board->reset(hcd->self.controller, 0);
2369        } else
2370                isp1362_sw_reset(isp1362_hcd);
2371
2372        /* chip has been reset. First we need to see a clock */
2373        t = jiffies + msecs_to_jiffies(timeout);
2374        while (!clkrdy && time_before_eq(jiffies, t)) {
2375                spin_lock_irqsave(&isp1362_hcd->lock, flags);
2376                clkrdy = isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_CLKRDY;
2377                spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2378                if (!clkrdy)
2379                        msleep(4);
2380        }
2381
2382        spin_lock_irqsave(&isp1362_hcd->lock, flags);
2383        isp1362_write_reg16(isp1362_hcd, HCuPINT, HCuPINT_CLKRDY);
2384        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2385        if (!clkrdy) {
2386                pr_err("Clock not ready after %lums\n", timeout);
2387                ret = -ENODEV;
2388        }
2389        return ret;
2390}
2391
2392static void isp1362_hc_stop(struct usb_hcd *hcd)
2393{
2394        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2395        unsigned long flags;
2396        u32 tmp;
2397
2398        pr_debug("%s:\n", __func__);
2399
2400        del_timer_sync(&hcd->rh_timer);
2401
2402        spin_lock_irqsave(&isp1362_hcd->lock, flags);
2403
2404        isp1362_write_reg16(isp1362_hcd, HCuPINTENB, 0);
2405
2406        /* Switch off power for all ports */
2407        tmp = isp1362_read_reg32(isp1362_hcd, HCRHDESCA);
2408        tmp &= ~(RH_A_NPS | RH_A_PSM);
2409        isp1362_write_reg32(isp1362_hcd, HCRHDESCA, tmp);
2410        isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_LPS);
2411
2412        /* Reset the chip */
2413        if (isp1362_hcd->board && isp1362_hcd->board->reset)
2414                isp1362_hcd->board->reset(hcd->self.controller, 1);
2415        else
2416                __isp1362_sw_reset(isp1362_hcd);
2417
2418        if (isp1362_hcd->board && isp1362_hcd->board->clock)
2419                isp1362_hcd->board->clock(hcd->self.controller, 0);
2420
2421        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2422}
2423
2424#ifdef CHIP_BUFFER_TEST
2425static int isp1362_chip_test(struct isp1362_hcd *isp1362_hcd)
2426{
2427        int ret = 0;
2428        u16 *ref;
2429        unsigned long flags;
2430
2431        ref = kmalloc(2 * ISP1362_BUF_SIZE, GFP_KERNEL);
2432        if (ref) {
2433                int offset;
2434                u16 *tst = &ref[ISP1362_BUF_SIZE / 2];
2435
2436                for (offset = 0; offset < ISP1362_BUF_SIZE / 2; offset++) {
2437                        ref[offset] = ~offset;
2438                        tst[offset] = offset;
2439                }
2440
2441                for (offset = 0; offset < 4; offset++) {
2442                        int j;
2443
2444                        for (j = 0; j < 8; j++) {
2445                                spin_lock_irqsave(&isp1362_hcd->lock, flags);
2446                                isp1362_write_buffer(isp1362_hcd, (u8 *)ref + offset, 0, j);
2447                                isp1362_read_buffer(isp1362_hcd, (u8 *)tst + offset, 0, j);
2448                                spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2449
2450                                if (memcmp(ref, tst, j)) {
2451                                        ret = -ENODEV;
2452                                        pr_err("%s: memory check with %d byte offset %d failed\n",
2453                                            __func__, j, offset);
2454                                        dump_data((u8 *)ref + offset, j);
2455                                        dump_data((u8 *)tst + offset, j);
2456                                }
2457                        }
2458                }
2459
2460                spin_lock_irqsave(&isp1362_hcd->lock, flags);
2461                isp1362_write_buffer(isp1362_hcd, ref, 0, ISP1362_BUF_SIZE);
2462                isp1362_read_buffer(isp1362_hcd, tst, 0, ISP1362_BUF_SIZE);
2463                spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2464
2465                if (memcmp(ref, tst, ISP1362_BUF_SIZE)) {
2466                        ret = -ENODEV;
2467                        pr_err("%s: memory check failed\n", __func__);
2468                        dump_data((u8 *)tst, ISP1362_BUF_SIZE / 2);
2469                }
2470
2471                for (offset = 0; offset < 256; offset++) {
2472                        int test_size = 0;
2473
2474                        yield();
2475
2476                        memset(tst, 0, ISP1362_BUF_SIZE);
2477                        spin_lock_irqsave(&isp1362_hcd->lock, flags);
2478                        isp1362_write_buffer(isp1362_hcd, tst, 0, ISP1362_BUF_SIZE);
2479                        isp1362_read_buffer(isp1362_hcd, tst, 0, ISP1362_BUF_SIZE);
2480                        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2481                        if (memcmp(tst, tst + (ISP1362_BUF_SIZE / (2 * sizeof(*tst))),
2482                                   ISP1362_BUF_SIZE / 2)) {
2483                                pr_err("%s: Failed to clear buffer\n", __func__);
2484                                dump_data((u8 *)tst, ISP1362_BUF_SIZE);
2485                                break;
2486                        }
2487                        spin_lock_irqsave(&isp1362_hcd->lock, flags);
2488                        isp1362_write_buffer(isp1362_hcd, ref, offset * 2, PTD_HEADER_SIZE);
2489                        isp1362_write_buffer(isp1362_hcd, ref + PTD_HEADER_SIZE / sizeof(*ref),
2490                                             offset * 2 + PTD_HEADER_SIZE, test_size);
2491                        isp1362_read_buffer(isp1362_hcd, tst, offset * 2,
2492                                            PTD_HEADER_SIZE + test_size);
2493                        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2494                        if (memcmp(ref, tst, PTD_HEADER_SIZE + test_size)) {
2495                                dump_data(((u8 *)ref) + offset, PTD_HEADER_SIZE + test_size);
2496                                dump_data((u8 *)tst, PTD_HEADER_SIZE + test_size);
2497                                spin_lock_irqsave(&isp1362_hcd->lock, flags);
2498                                isp1362_read_buffer(isp1362_hcd, tst, offset * 2,
2499                                                    PTD_HEADER_SIZE + test_size);
2500                                spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2501                                if (memcmp(ref, tst, PTD_HEADER_SIZE + test_size)) {
2502                                        ret = -ENODEV;
2503                                        pr_err("%s: memory check with offset %02x failed\n",
2504                                            __func__, offset);
2505                                        break;
2506                                }
2507                                pr_warning("%s: memory check with offset %02x ok after second read\n",
2508                                     __func__, offset);
2509                        }
2510                }
2511                kfree(ref);
2512        }
2513        return ret;
2514}
2515#endif
2516
2517static int isp1362_hc_start(struct usb_hcd *hcd)
2518{
2519        int ret;
2520        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2521        struct isp1362_platform_data *board = isp1362_hcd->board;
2522        u16 hwcfg;
2523        u16 chipid;
2524        unsigned long flags;
2525
2526        pr_debug("%s:\n", __func__);
2527
2528        spin_lock_irqsave(&isp1362_hcd->lock, flags);
2529        chipid = isp1362_read_reg16(isp1362_hcd, HCCHIPID);
2530        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2531
2532        if ((chipid & HCCHIPID_MASK) != HCCHIPID_MAGIC) {
2533                pr_err("%s: Invalid chip ID %04x\n", __func__, chipid);
2534                return -ENODEV;
2535        }
2536
2537#ifdef CHIP_BUFFER_TEST
2538        ret = isp1362_chip_test(isp1362_hcd);
2539        if (ret)
2540                return -ENODEV;
2541#endif
2542        spin_lock_irqsave(&isp1362_hcd->lock, flags);
2543        /* clear interrupt status and disable all interrupt sources */
2544        isp1362_write_reg16(isp1362_hcd, HCuPINT, 0xff);
2545        isp1362_write_reg16(isp1362_hcd, HCuPINTENB, 0);
2546
2547        /* HW conf */
2548        hwcfg = HCHWCFG_INT_ENABLE | HCHWCFG_DBWIDTH(1);
2549        if (board->sel15Kres)
2550                hwcfg |= HCHWCFG_PULLDOWN_DS2 |
2551                        ((MAX_ROOT_PORTS > 1) ? HCHWCFG_PULLDOWN_DS1 : 0);
2552        if (board->clknotstop)
2553                hwcfg |= HCHWCFG_CLKNOTSTOP;
2554        if (board->oc_enable)
2555                hwcfg |= HCHWCFG_ANALOG_OC;
2556        if (board->int_act_high)
2557                hwcfg |= HCHWCFG_INT_POL;
2558        if (board->int_edge_triggered)
2559                hwcfg |= HCHWCFG_INT_TRIGGER;
2560        if (board->dreq_act_high)
2561                hwcfg |= HCHWCFG_DREQ_POL;
2562        if (board->dack_act_high)
2563                hwcfg |= HCHWCFG_DACK_POL;
2564        isp1362_write_reg16(isp1362_hcd, HCHWCFG, hwcfg);
2565        isp1362_show_reg(isp1362_hcd, HCHWCFG);
2566        isp1362_write_reg16(isp1362_hcd, HCDMACFG, 0);
2567        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2568
2569        ret = isp1362_mem_config(hcd);
2570        if (ret)
2571                return ret;
2572
2573        spin_lock_irqsave(&isp1362_hcd->lock, flags);
2574
2575        /* Root hub conf */
2576        isp1362_hcd->rhdesca = 0;
2577        if (board->no_power_switching)
2578                isp1362_hcd->rhdesca |= RH_A_NPS;
2579        if (board->power_switching_mode)
2580                isp1362_hcd->rhdesca |= RH_A_PSM;
2581        if (board->potpg)
2582                isp1362_hcd->rhdesca |= (board->potpg << 24) & RH_A_POTPGT;
2583        else
2584                isp1362_hcd->rhdesca |= (25 << 24) & RH_A_POTPGT;
2585
2586        isp1362_write_reg32(isp1362_hcd, HCRHDESCA, isp1362_hcd->rhdesca & ~RH_A_OCPM);
2587        isp1362_write_reg32(isp1362_hcd, HCRHDESCA, isp1362_hcd->rhdesca | RH_A_OCPM);
2588        isp1362_hcd->rhdesca = isp1362_read_reg32(isp1362_hcd, HCRHDESCA);
2589
2590        isp1362_hcd->rhdescb = RH_B_PPCM;
2591        isp1362_write_reg32(isp1362_hcd, HCRHDESCB, isp1362_hcd->rhdescb);
2592        isp1362_hcd->rhdescb = isp1362_read_reg32(isp1362_hcd, HCRHDESCB);
2593
2594        isp1362_read_reg32(isp1362_hcd, HCFMINTVL);
2595        isp1362_write_reg32(isp1362_hcd, HCFMINTVL, (FSMP(FI) << 16) | FI);
2596        isp1362_write_reg32(isp1362_hcd, HCLSTHRESH, LSTHRESH);
2597
2598        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2599
2600        isp1362_hcd->hc_control = OHCI_USB_OPER;
2601        hcd->state = HC_STATE_RUNNING;
2602
2603        spin_lock_irqsave(&isp1362_hcd->lock, flags);
2604        /* Set up interrupts */
2605        isp1362_hcd->intenb = OHCI_INTR_MIE | OHCI_INTR_RHSC | OHCI_INTR_UE;
2606        isp1362_hcd->intenb |= OHCI_INTR_RD;
2607        isp1362_hcd->irqenb = HCuPINT_OPR | HCuPINT_SUSP;
2608        isp1362_write_reg32(isp1362_hcd, HCINTENB, isp1362_hcd->intenb);
2609        isp1362_write_reg16(isp1362_hcd, HCuPINTENB, isp1362_hcd->irqenb);
2610
2611        /* Go operational */
2612        isp1362_write_reg32(isp1362_hcd, HCCONTROL, isp1362_hcd->hc_control);
2613        /* enable global power */
2614        isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_LPSC | RH_HS_DRWE);
2615
2616        spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2617
2618        return 0;
2619}
2620
2621/*-------------------------------------------------------------------------*/
2622
2623static struct hc_driver isp1362_hc_driver = {
2624        .description =          hcd_name,
2625        .product_desc =         "ISP1362 Host Controller",
2626        .hcd_priv_size =        sizeof(struct isp1362_hcd),
2627
2628        .irq =                  isp1362_irq,
2629        .flags =                HCD_USB11 | HCD_MEMORY,
2630
2631        .reset =                isp1362_hc_reset,
2632        .start =                isp1362_hc_start,
2633        .stop =                 isp1362_hc_stop,
2634
2635        .urb_enqueue =          isp1362_urb_enqueue,
2636        .urb_dequeue =          isp1362_urb_dequeue,
2637        .endpoint_disable =     isp1362_endpoint_disable,
2638
2639        .get_frame_number =     isp1362_get_frame,
2640
2641        .hub_status_data =      isp1362_hub_status_data,
2642        .hub_control =          isp1362_hub_control,
2643        .bus_suspend =          isp1362_bus_suspend,
2644        .bus_resume =           isp1362_bus_resume,
2645};
2646
2647/*-------------------------------------------------------------------------*/
2648
2649static int __devexit isp1362_remove(struct platform_device *pdev)
2650{
2651        struct usb_hcd *hcd = platform_get_drvdata(pdev);
2652        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2653        struct resource *res;
2654
2655        remove_debug_file(isp1362_hcd);
2656        DBG(0, "%s: Removing HCD\n", __func__);
2657        usb_remove_hcd(hcd);
2658
2659        DBG(0, "%s: Unmapping data_reg @ %p\n", __func__,
2660            isp1362_hcd->data_reg);
2661        iounmap(isp1362_hcd->data_reg);
2662
2663        DBG(0, "%s: Unmapping addr_reg @ %p\n", __func__,
2664            isp1362_hcd->addr_reg);
2665        iounmap(isp1362_hcd->addr_reg);
2666
2667        res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
2668        DBG(0, "%s: release mem_region: %08lx\n", __func__, (long unsigned int)res->start);
2669        if (res)
2670                release_mem_region(res->start, resource_size(res));
2671
2672        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2673        DBG(0, "%s: release mem_region: %08lx\n", __func__, (long unsigned int)res->start);
2674        if (res)
2675                release_mem_region(res->start, resource_size(res));
2676
2677        DBG(0, "%s: put_hcd\n", __func__);
2678        usb_put_hcd(hcd);
2679        DBG(0, "%s: Done\n", __func__);
2680
2681        return 0;
2682}
2683
2684static int __devinit isp1362_probe(struct platform_device *pdev)
2685{
2686        struct usb_hcd *hcd;
2687        struct isp1362_hcd *isp1362_hcd;
2688        struct resource *addr, *data;
2689        void __iomem *addr_reg;
2690        void __iomem *data_reg;
2691        int irq;
2692        int retval = 0;
2693        struct resource *irq_res;
2694        unsigned int irq_flags = 0;
2695
2696        /* basic sanity checks first.  board-specific init logic should
2697         * have initialized this the three resources and probably board
2698         * specific platform_data.  we don't probe for IRQs, and do only
2699         * minimal sanity checking.
2700         */
2701        if (pdev->num_resources < 3) {
2702                retval = -ENODEV;
2703                goto err1;
2704        }
2705
2706        data = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2707        addr = platform_get_resource(pdev, IORESOURCE_MEM, 1);
2708        irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
2709        if (!addr || !data || !irq_res) {
2710                retval = -ENODEV;
2711                goto err1;
2712        }
2713        irq = irq_res->start;
2714
2715        if (pdev->dev.dma_mask) {
2716                DBG(1, "won't do DMA");
2717                retval = -ENODEV;
2718                goto err1;
2719        }
2720
2721        if (!request_mem_region(addr->start, resource_size(addr), hcd_name)) {
2722                retval = -EBUSY;
2723                goto err1;
2724        }
2725        addr_reg = ioremap(addr->start, resource_size(addr));
2726        if (addr_reg == NULL) {
2727                retval = -ENOMEM;
2728                goto err2;
2729        }
2730
2731        if (!request_mem_region(data->start, resource_size(data), hcd_name)) {
2732                retval = -EBUSY;
2733                goto err3;
2734        }
2735        data_reg = ioremap(data->start, resource_size(data));
2736        if (data_reg == NULL) {
2737                retval = -ENOMEM;
2738                goto err4;
2739        }
2740
2741        /* allocate and initialize hcd */
2742        hcd = usb_create_hcd(&isp1362_hc_driver, &pdev->dev, dev_name(&pdev->dev));
2743        if (!hcd) {
2744                retval = -ENOMEM;
2745                goto err5;
2746        }
2747        hcd->rsrc_start = data->start;
2748        isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2749        isp1362_hcd->data_reg = data_reg;
2750        isp1362_hcd->addr_reg = addr_reg;
2751
2752        isp1362_hcd->next_statechange = jiffies;
2753        spin_lock_init(&isp1362_hcd->lock);
2754        INIT_LIST_HEAD(&isp1362_hcd->async);
2755        INIT_LIST_HEAD(&isp1362_hcd->periodic);
2756        INIT_LIST_HEAD(&isp1362_hcd->isoc);
2757        INIT_LIST_HEAD(&isp1362_hcd->remove_list);
2758        isp1362_hcd->board = pdev->dev.platform_data;
2759#if USE_PLATFORM_DELAY
2760        if (!isp1362_hcd->board->delay) {
2761                dev_err(hcd->self.controller, "No platform delay function given\n");
2762                retval = -ENODEV;
2763                goto err6;
2764        }
2765#endif
2766
2767        if (irq_res->flags & IORESOURCE_IRQ_HIGHEDGE)
2768                irq_flags |= IRQF_TRIGGER_RISING;
2769        if (irq_res->flags & IORESOURCE_IRQ_LOWEDGE)
2770                irq_flags |= IRQF_TRIGGER_FALLING;
2771        if (irq_res->flags & IORESOURCE_IRQ_HIGHLEVEL)
2772                irq_flags |= IRQF_TRIGGER_HIGH;
2773        if (irq_res->flags & IORESOURCE_IRQ_LOWLEVEL)
2774                irq_flags |= IRQF_TRIGGER_LOW;
2775
2776        retval = usb_add_hcd(hcd, irq, irq_flags | IRQF_SHARED);
2777        if (retval != 0)
2778                goto err6;
2779        pr_info("%s, irq %d\n", hcd->product_desc, irq);
2780
2781        create_debug_file(isp1362_hcd);
2782
2783        return 0;
2784
2785 err6:
2786        DBG(0, "%s: Freeing dev %p\n", __func__, isp1362_hcd);
2787        usb_put_hcd(hcd);
2788 err5:
2789        DBG(0, "%s: Unmapping data_reg @ %p\n", __func__, data_reg);
2790        iounmap(data_reg);
2791 err4:
2792        DBG(0, "%s: Releasing mem region %08lx\n", __func__, (long unsigned int)data->start);
2793        release_mem_region(data->start, resource_size(data));
2794 err3:
2795        DBG(0, "%s: Unmapping addr_reg @ %p\n", __func__, addr_reg);
2796        iounmap(addr_reg);
2797 err2:
2798        DBG(0, "%s: Releasing mem region %08lx\n", __func__, (long unsigned int)addr->start);
2799        release_mem_region(addr->start, resource_size(addr));
2800 err1:
2801        pr_err("%s: init error, %d\n", __func__, retval);
2802
2803        return retval;
2804}
2805
2806#ifdef  CONFIG_PM
2807static int isp1362_suspend(struct platform_device *pdev, pm_message_t state)
2808{
2809        struct usb_hcd *hcd = platform_get_drvdata(pdev);
2810        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2811        unsigned long flags;
2812        int retval = 0;
2813
2814        DBG(0, "%s: Suspending device\n", __func__);
2815
2816        if (state.event == PM_EVENT_FREEZE) {
2817                DBG(0, "%s: Suspending root hub\n", __func__);
2818                retval = isp1362_bus_suspend(hcd);
2819        } else {
2820                DBG(0, "%s: Suspending RH ports\n", __func__);
2821                spin_lock_irqsave(&isp1362_hcd->lock, flags);
2822                isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_LPS);
2823                spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2824        }
2825        if (retval == 0)
2826                pdev->dev.power.power_state = state;
2827        return retval;
2828}
2829
2830static int isp1362_resume(struct platform_device *pdev)
2831{
2832        struct usb_hcd *hcd = platform_get_drvdata(pdev);
2833        struct isp1362_hcd *isp1362_hcd = hcd_to_isp1362_hcd(hcd);
2834        unsigned long flags;
2835
2836        DBG(0, "%s: Resuming\n", __func__);
2837
2838        if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
2839                DBG(0, "%s: Resume RH ports\n", __func__);
2840                spin_lock_irqsave(&isp1362_hcd->lock, flags);
2841                isp1362_write_reg32(isp1362_hcd, HCRHSTATUS, RH_HS_LPSC);
2842                spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
2843                return 0;
2844        }
2845
2846        pdev->dev.power.power_state = PMSG_ON;
2847
2848        return isp1362_bus_resume(isp1362_hcd_to_hcd(isp1362_hcd));
2849}
2850#else
2851#define isp1362_suspend NULL
2852#define isp1362_resume  NULL
2853#endif
2854
2855static struct platform_driver isp1362_driver = {
2856        .probe = isp1362_probe,
2857        .remove = __devexit_p(isp1362_remove),
2858
2859        .suspend = isp1362_suspend,
2860        .resume = isp1362_resume,
2861        .driver = {
2862                .name = (char *)hcd_name,
2863                .owner = THIS_MODULE,
2864        },
2865};
2866
2867/*-------------------------------------------------------------------------*/
2868
2869static int __init isp1362_init(void)
2870{
2871        if (usb_disabled())
2872                return -ENODEV;
2873        pr_info("driver %s, %s\n", hcd_name, DRIVER_VERSION);
2874        return platform_driver_register(&isp1362_driver);
2875}
2876module_init(isp1362_init);
2877
2878static void __exit isp1362_cleanup(void)
2879{
2880        platform_driver_unregister(&isp1362_driver);
2881}
2882module_exit(isp1362_cleanup);
2883
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.