Blame view
drivers/usb/host/ohci-hcd.c
31.8 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 |
/* * OHCI HCD (Host Controller Driver) for USB. * * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net> |
dd9048af4 USB: ohci whitesp... |
6 |
* |
1da177e4c Linux-2.6.12-rc2 |
7 8 9 10 |
* [ Initialisation is based on Linus' ] * [ uhci code and gregs ohci fragments ] * [ (C) Copyright 1999 Linus Torvalds ] * [ (C) Copyright 1999 Gregory P. Smith] |
dd9048af4 USB: ohci whitesp... |
11 12 |
* * |
1da177e4c Linux-2.6.12-rc2 |
13 14 15 16 17 |
* OHCI is the main "non-Intel/VIA" standard for USB 1.1 host controller * interfaces (though some non-x86 Intel chips use it). It supports * smarter hardware than UHCI. A download link for the spec available * through the http://www.usb.org website. * |
1da177e4c Linux-2.6.12-rc2 |
18 19 |
* This file is licenced under the GPL. */ |
dd9048af4 USB: ohci whitesp... |
20 |
|
1da177e4c Linux-2.6.12-rc2 |
21 22 23 24 25 26 27 28 |
#include <linux/module.h> #include <linux/moduleparam.h> #include <linux/pci.h> #include <linux/kernel.h> #include <linux/delay.h> #include <linux/ioport.h> #include <linux/sched.h> #include <linux/slab.h> |
1da177e4c Linux-2.6.12-rc2 |
29 30 31 32 |
#include <linux/errno.h> #include <linux/init.h> #include <linux/timer.h> #include <linux/list.h> |
1da177e4c Linux-2.6.12-rc2 |
33 |
#include <linux/usb.h> |
3a16f7b4a USB: move <linux/... |
34 |
#include <linux/usb/otg.h> |
dd9048af4 USB: ohci whitesp... |
35 |
#include <linux/dma-mapping.h> |
f4df0e334 [PATCH] USB: add ... |
36 |
#include <linux/dmapool.h> |
d576bb9f2 USB: Fix NEC OHCI... |
37 |
#include <linux/workqueue.h> |
684c19e0d USB: convert ohci... |
38 |
#include <linux/debugfs.h> |
1da177e4c Linux-2.6.12-rc2 |
39 40 41 42 43 44 |
#include <asm/io.h> #include <asm/irq.h> #include <asm/system.h> #include <asm/unaligned.h> #include <asm/byteorder.h> |
f4df0e334 [PATCH] USB: add ... |
45 |
#include "../core/hcd.h" |
1da177e4c Linux-2.6.12-rc2 |
46 |
|
1da177e4c Linux-2.6.12-rc2 |
47 48 49 50 |
#define DRIVER_AUTHOR "Roman Weissgaerber, David Brownell" #define DRIVER_DESC "USB 1.1 'Open' Host Controller (OHCI) Driver" /*-------------------------------------------------------------------------*/ |
8de984026 [PATCH] USB: Fix ... |
51 |
#undef OHCI_VERBOSE_DEBUG /* not always helpful */ |
1da177e4c Linux-2.6.12-rc2 |
52 53 |
/* For initializing controller (mask in an HCFS mode too) */ |
d413984ae USB: OHCI avoids ... |
54 |
#define OHCI_CONTROL_INIT OHCI_CTRL_CBSR |
1da177e4c Linux-2.6.12-rc2 |
55 |
#define OHCI_INTR_INIT \ |
d413984ae USB: OHCI avoids ... |
56 57 |
(OHCI_INTR_MIE | OHCI_INTR_RHSC | OHCI_INTR_UE \ | OHCI_INTR_RD | OHCI_INTR_WDH) |
1da177e4c Linux-2.6.12-rc2 |
58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#ifdef __hppa__ /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ #define IR_DISABLE #endif #ifdef CONFIG_ARCH_OMAP /* OMAP doesn't support IR (no SMM; not needed) */ #define IR_DISABLE #endif /*-------------------------------------------------------------------------*/ static const char hcd_name [] = "ohci_hcd"; |
d413984ae USB: OHCI avoids ... |
72 |
#define STATECHANGE_DELAY msecs_to_jiffies(300) |
1da177e4c Linux-2.6.12-rc2 |
73 74 75 76 77 |
#include "ohci.h" static void ohci_dump (struct ohci_hcd *ohci, int verbose); static int ohci_init (struct ohci_hcd *ohci); static void ohci_stop (struct usb_hcd *hcd); |
da6fb5704 USB: remove new O... |
78 79 |
#if defined(CONFIG_PM) || defined(CONFIG_PCI) |
d576bb9f2 USB: Fix NEC OHCI... |
80 |
static int ohci_restart (struct ohci_hcd *ohci); |
da6fb5704 USB: remove new O... |
81 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
82 |
|
ab1666c13 USB: quirk PLL po... |
83 84 85 |
#ifdef CONFIG_PCI static void quirk_amd_pll(int state); static void amd_iso_dev_put(void); |
a1f17a872 USB: ohci: quirk ... |
86 |
static void sb800_prefetch(struct ohci_hcd *ohci, int on); |
ab1666c13 USB: quirk PLL po... |
87 88 89 90 91 92 93 94 95 |
#else static inline void quirk_amd_pll(int state) { return; } static inline void amd_iso_dev_put(void) { return; } |
a1f17a872 USB: ohci: quirk ... |
96 97 98 99 |
static inline void sb800_prefetch(struct ohci_hcd *ohci, int on) { return; } |
ab1666c13 USB: quirk PLL po... |
100 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
#include "ohci-hub.c" #include "ohci-dbg.c" #include "ohci-mem.c" #include "ohci-q.c" /* * On architectures with edge-triggered interrupts we must never return * IRQ_NONE. */ #if defined(CONFIG_SA1111) /* ... or other edge-triggered systems */ #define IRQ_NOTMINE IRQ_HANDLED #else #define IRQ_NOTMINE IRQ_NONE #endif /* Some boards misreport power switching/overcurrent */ static int distrust_firmware = 1; module_param (distrust_firmware, bool, 0); MODULE_PARM_DESC (distrust_firmware, "true to distrust firmware power/overcurrent setup"); /* Some boards leave IR set wrongly, since they fail BIOS/SMM handshakes */ static int no_handshake = 0; module_param (no_handshake, bool, 0); MODULE_PARM_DESC (no_handshake, "true (not default) disables BIOS handshake"); /*-------------------------------------------------------------------------*/ /* * queue up an urb for anything except the root hub */ static int ohci_urb_enqueue ( struct usb_hcd *hcd, |
1da177e4c Linux-2.6.12-rc2 |
136 |
struct urb *urb, |
55016f10e [PATCH] gfp_t: dr... |
137 |
gfp_t mem_flags |
1da177e4c Linux-2.6.12-rc2 |
138 139 140 141 142 143 144 145 |
) { struct ohci_hcd *ohci = hcd_to_ohci (hcd); struct ed *ed; urb_priv_t *urb_priv; unsigned int pipe = urb->pipe; int i, size = 0; unsigned long flags; int retval = 0; |
dd9048af4 USB: ohci whitesp... |
146 |
|
1da177e4c Linux-2.6.12-rc2 |
147 |
#ifdef OHCI_VERBOSE_DEBUG |
55d849683 USB: reorganize u... |
148 |
urb_print(urb, "SUB", usb_pipein(pipe), -EINPROGRESS); |
1da177e4c Linux-2.6.12-rc2 |
149 |
#endif |
dd9048af4 USB: ohci whitesp... |
150 |
|
1da177e4c Linux-2.6.12-rc2 |
151 |
/* every endpoint has a ed, locate and maybe (re)initialize it */ |
e9df41c5c USB: make HCDs re... |
152 |
if (! (ed = ed_get (ohci, urb->ep, urb->dev, pipe, urb->interval))) |
1da177e4c Linux-2.6.12-rc2 |
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
return -ENOMEM; /* for the private part of the URB we need the number of TDs (size) */ switch (ed->type) { case PIPE_CONTROL: /* td_submit_urb() doesn't yet handle these */ if (urb->transfer_buffer_length > 4096) return -EMSGSIZE; /* 1 TD for setup, 1 for ACK, plus ... */ size = 2; /* FALLTHROUGH */ // case PIPE_INTERRUPT: // case PIPE_BULK: default: /* one TD for every 4096 Bytes (can be upto 8K) */ size += urb->transfer_buffer_length / 4096; /* ... and for any remaining bytes ... */ if ((urb->transfer_buffer_length % 4096) != 0) size++; /* ... and maybe a zero length packet to wrap it up */ if (size == 0) size++; else if ((urb->transfer_flags & URB_ZERO_PACKET) != 0 && (urb->transfer_buffer_length % usb_maxpacket (urb->dev, pipe, usb_pipeout (pipe))) == 0) size++; break; case PIPE_ISOCHRONOUS: /* number of packets from URB */ size = urb->number_of_packets; break; } /* allocate the private part of the URB */ |
dd00cc486 some kmalloc/mems... |
188 |
urb_priv = kzalloc (sizeof (urb_priv_t) + size * sizeof (struct td *), |
1da177e4c Linux-2.6.12-rc2 |
189 190 191 |
mem_flags); if (!urb_priv) return -ENOMEM; |
1da177e4c Linux-2.6.12-rc2 |
192 193 |
INIT_LIST_HEAD (&urb_priv->pending); urb_priv->length = size; |
dd9048af4 USB: ohci whitesp... |
194 |
urb_priv->ed = ed; |
1da177e4c Linux-2.6.12-rc2 |
195 196 197 198 199 200 201 202 203 |
/* allocate the TDs (deferring hash chain updates) */ for (i = 0; i < size; i++) { urb_priv->td [i] = td_alloc (ohci, mem_flags); if (!urb_priv->td [i]) { urb_priv->length = i; urb_free_priv (ohci, urb_priv); return -ENOMEM; } |
dd9048af4 USB: ohci whitesp... |
204 |
} |
1da177e4c Linux-2.6.12-rc2 |
205 206 207 208 |
spin_lock_irqsave (&ohci->lock, flags); /* don't submit to a dead HC */ |
8de984026 [PATCH] USB: Fix ... |
209 210 211 212 |
if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) { retval = -ENODEV; goto fail; } |
1da177e4c Linux-2.6.12-rc2 |
213 214 215 216 |
if (!HC_IS_RUNNING(hcd->state)) { retval = -ENODEV; goto fail; } |
e9df41c5c USB: make HCDs re... |
217 218 |
retval = usb_hcd_link_urb_to_ep(hcd, urb); if (retval) |
1da177e4c Linux-2.6.12-rc2 |
219 |
goto fail; |
1da177e4c Linux-2.6.12-rc2 |
220 221 222 223 |
/* schedule the ed if needed */ if (ed->state == ED_IDLE) { retval = ed_schedule (ohci, ed); |
e9df41c5c USB: make HCDs re... |
224 225 226 227 |
if (retval < 0) { usb_hcd_unlink_urb_from_ep(hcd, urb); goto fail; } |
1da177e4c Linux-2.6.12-rc2 |
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 |
if (ed->type == PIPE_ISOCHRONOUS) { u16 frame = ohci_frame_no(ohci); /* delay a few frames before the first TD */ frame += max_t (u16, 8, ed->interval); frame &= ~(ed->interval - 1); frame |= ed->branch; urb->start_frame = frame; /* yes, only URB_ISO_ASAP is supported, and * urb->start_frame is never used as input. */ } } else if (ed->type == PIPE_ISOCHRONOUS) urb->start_frame = ed->last_iso + ed->interval; /* fill the TDs and link them to the ed; and * enable that part of the schedule, if needed * and update count of queued periodic urbs */ urb->hcpriv = urb_priv; td_submit_urb (ohci, urb); |
1da177e4c Linux-2.6.12-rc2 |
250 251 252 253 254 255 256 257 |
fail: if (retval) urb_free_priv (ohci, urb_priv); spin_unlock_irqrestore (&ohci->lock, flags); return retval; } /* |
55d849683 USB: reorganize u... |
258 259 |
* decouple the URB from the HC queues (TDs, urb_priv). * reporting is always done |
1da177e4c Linux-2.6.12-rc2 |
260 261 262 |
* asynchronously, and we might be dealing with an urb that's * partially transferred, or an ED with other urbs being unlinked. */ |
e9df41c5c USB: make HCDs re... |
263 |
static int ohci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) |
1da177e4c Linux-2.6.12-rc2 |
264 265 266 |
{ struct ohci_hcd *ohci = hcd_to_ohci (hcd); unsigned long flags; |
e9df41c5c USB: make HCDs re... |
267 |
int rc; |
dd9048af4 USB: ohci whitesp... |
268 |
|
1da177e4c Linux-2.6.12-rc2 |
269 |
#ifdef OHCI_VERBOSE_DEBUG |
55d849683 USB: reorganize u... |
270 |
urb_print(urb, "UNLINK", 1, status); |
dd9048af4 USB: ohci whitesp... |
271 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
272 273 |
spin_lock_irqsave (&ohci->lock, flags); |
e9df41c5c USB: make HCDs re... |
274 275 276 277 |
rc = usb_hcd_check_unlink_urb(hcd, urb, status); if (rc) { ; /* Do nothing */ } else if (HC_IS_RUNNING(hcd->state)) { |
1da177e4c Linux-2.6.12-rc2 |
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 |
urb_priv_t *urb_priv; /* Unless an IRQ completed the unlink while it was being * handed to us, flag it for unlink and giveback, and force * some upcoming INTR_SF to call finish_unlinks() */ urb_priv = urb->hcpriv; if (urb_priv) { if (urb_priv->ed->state == ED_OPER) start_ed_unlink (ohci, urb_priv->ed); } } else { /* * with HC dead, we won't respect hc queue pointers * any more ... just clean up every urb's memory. */ if (urb->hcpriv) |
55d849683 USB: reorganize u... |
295 |
finish_urb(ohci, urb, status); |
1da177e4c Linux-2.6.12-rc2 |
296 297 |
} spin_unlock_irqrestore (&ohci->lock, flags); |
e9df41c5c USB: make HCDs re... |
298 |
return rc; |
1da177e4c Linux-2.6.12-rc2 |
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 |
} /*-------------------------------------------------------------------------*/ /* frees config/altsetting state for endpoints, * including ED memory, dummy TD, and bulk/intr data toggle */ static void ohci_endpoint_disable (struct usb_hcd *hcd, struct usb_host_endpoint *ep) { struct ohci_hcd *ohci = hcd_to_ohci (hcd); unsigned long flags; struct ed *ed = ep->hcpriv; unsigned limit = 1000; /* ASSERT: any requests/urbs are being unlinked */ /* ASSERT: nobody can be submitting urbs for this any more */ if (!ed) return; rescan: spin_lock_irqsave (&ohci->lock, flags); if (!HC_IS_RUNNING (hcd->state)) { sanitize: ed->state = ED_IDLE; |
89a0fd18a USB: OHCI handles... |
327 328 |
if (quirk_zfmicro(ohci) && ed->type == PIPE_INTERRUPT) ohci->eds_scheduled--; |
7d12e780e IRQ: Maintain reg... |
329 |
finish_unlinks (ohci, 0); |
1da177e4c Linux-2.6.12-rc2 |
330 331 332 333 334 335 |
} switch (ed->state) { case ED_UNLINK: /* wait for hw to finish? */ /* major IRQ delivery trouble loses INTR_SF too... */ if (limit-- == 0) { |
89a0fd18a USB: OHCI handles... |
336 337 338 339 340 341 342 343 |
ohci_warn(ohci, "ED unlink timeout "); if (quirk_zfmicro(ohci)) { ohci_warn(ohci, "Attempting ZF TD recovery "); ohci->ed_to_check = ed; ohci->zf_delay = 2; } |
1da177e4c Linux-2.6.12-rc2 |
344 345 346 |
goto sanitize; } spin_unlock_irqrestore (&ohci->lock, flags); |
22c438632 [PATCH] drivers/u... |
347 |
schedule_timeout_uninterruptible(1); |
1da177e4c Linux-2.6.12-rc2 |
348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 |
goto rescan; case ED_IDLE: /* fully unlinked */ if (list_empty (&ed->td_list)) { td_free (ohci, ed->dummy); ed_free (ohci, ed); break; } /* else FALL THROUGH */ default: /* caller was supposed to have unlinked any requests; * that's not our job. can't recover; must leak ed. */ ohci_err (ohci, "leak ed %p (#%02x) state %d%s ", ed, ep->desc.bEndpointAddress, ed->state, list_empty (&ed->td_list) ? "" : " (has tds)"); td_free (ohci, ed->dummy); break; } ep->hcpriv = NULL; spin_unlock_irqrestore (&ohci->lock, flags); return; } static int ohci_get_frame (struct usb_hcd *hcd) { struct ohci_hcd *ohci = hcd_to_ohci (hcd); return ohci_frame_no(ohci); } static void ohci_usb_reset (struct ohci_hcd *ohci) { ohci->hc_control = ohci_readl (ohci, &ohci->regs->control); ohci->hc_control &= OHCI_CTRL_RWC; ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); } |
64a21d025 USB: Properly unr... |
385 |
/* ohci_shutdown forcibly disables IRQs and DMA, helping kexec and |
f4df0e334 [PATCH] USB: add ... |
386 387 388 |
* other cases where the next software may expect clean state from the * "firmware". this is bus-neutral, unlike shutdown() methods. */ |
64a21d025 USB: Properly unr... |
389 390 |
static void ohci_shutdown (struct usb_hcd *hcd) |
f4df0e334 [PATCH] USB: add ... |
391 392 |
{ struct ohci_hcd *ohci; |
64a21d025 USB: Properly unr... |
393 |
ohci = hcd_to_ohci (hcd); |
f4df0e334 [PATCH] USB: add ... |
394 395 396 397 |
ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable); ohci_usb_reset (ohci); /* flush the writes */ (void) ohci_readl (ohci, &ohci->regs->control); |
f4df0e334 [PATCH] USB: add ... |
398 |
} |
89a0fd18a USB: OHCI handles... |
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 |
static int check_ed(struct ohci_hcd *ohci, struct ed *ed) { return (hc32_to_cpu(ohci, ed->hwINFO) & ED_IN) != 0 && (hc32_to_cpu(ohci, ed->hwHeadP) & TD_MASK) == (hc32_to_cpu(ohci, ed->hwTailP) & TD_MASK) && !list_empty(&ed->td_list); } /* ZF Micro watchdog timer callback. The ZF Micro chipset sometimes completes * an interrupt TD but neglects to add it to the donelist. On systems with * this chipset, we need to periodically check the state of the queues to look * for such "lost" TDs. */ static void unlink_watchdog_func(unsigned long _ohci) { |
da6fb5704 USB: remove new O... |
414 |
unsigned long flags; |
89a0fd18a USB: OHCI handles... |
415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 |
unsigned max; unsigned seen_count = 0; unsigned i; struct ed **seen = NULL; struct ohci_hcd *ohci = (struct ohci_hcd *) _ohci; spin_lock_irqsave(&ohci->lock, flags); max = ohci->eds_scheduled; if (!max) goto done; if (ohci->ed_to_check) goto out; seen = kcalloc(max, sizeof *seen, GFP_ATOMIC); if (!seen) goto out; for (i = 0; i < NUM_INTS; i++) { struct ed *ed = ohci->periodic[i]; while (ed) { unsigned temp; /* scan this branch of the periodic schedule tree */ for (temp = 0; temp < seen_count; temp++) { if (seen[temp] == ed) { /* we've checked it and what's after */ ed = NULL; break; } } if (!ed) break; seen[seen_count++] = ed; if (!check_ed(ohci, ed)) { ed = ed->ed_next; continue; } /* HC's TD list is empty, but HCD sees at least one * TD that's not been sent through the donelist. */ ohci->ed_to_check = ed; ohci->zf_delay = 2; /* The HC may wait until the next frame to report the * TD as done through the donelist and INTR_WDH. (We * just *assume* it's not a multi-TD interrupt URB; * those could defer the IRQ more than one frame, using * DI...) Check again after the next INTR_SF. */ ohci_writel(ohci, OHCI_INTR_SF, &ohci->regs->intrstatus); ohci_writel(ohci, OHCI_INTR_SF, &ohci->regs->intrenable); /* flush those writes */ (void) ohci_readl(ohci, &ohci->regs->control); goto out; } } out: kfree(seen); if (ohci->eds_scheduled) |
9cebcdc7f USB: ohci: fix 2 ... |
481 |
mod_timer(&ohci->unlink_watchdog, round_jiffies(jiffies + HZ)); |
89a0fd18a USB: OHCI handles... |
482 483 484 |
done: spin_unlock_irqrestore(&ohci->lock, flags); } |
1da177e4c Linux-2.6.12-rc2 |
485 486 487 488 489 490 491 492 493 |
/*-------------------------------------------------------------------------* * HC functions *-------------------------------------------------------------------------*/ /* init memory, and kick BIOS/SMM off */ static int ohci_init (struct ohci_hcd *ohci) { int ret; |
6a9062f39 [PATCH] USB: ohci... |
494 |
struct usb_hcd *hcd = ohci_to_hcd(ohci); |
1da177e4c Linux-2.6.12-rc2 |
495 |
|
1133cd8ad USB: ohci: make d... |
496 497 |
if (distrust_firmware) ohci->flags |= OHCI_QUIRK_HUB_POWER; |
1da177e4c Linux-2.6.12-rc2 |
498 |
disable (ohci); |
6a9062f39 [PATCH] USB: ohci... |
499 |
ohci->regs = hcd->regs; |
1da177e4c Linux-2.6.12-rc2 |
500 |
|
6a9062f39 [PATCH] USB: ohci... |
501 502 503 |
/* REVISIT this BIOS handshake is now moved into PCI "quirks", and * was never needed for most non-PCI systems ... remove the code? */ |
1da177e4c Linux-2.6.12-rc2 |
504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 |
#ifndef IR_DISABLE /* SMM owns the HC? not for long! */ if (!no_handshake && ohci_readl (ohci, &ohci->regs->control) & OHCI_CTRL_IR) { u32 temp; ohci_dbg (ohci, "USB HC TakeOver from BIOS/SMM "); /* this timeout is arbitrary. we make it long, so systems * depending on usb keyboards may be usable even if the * BIOS/SMM code seems pretty broken. */ temp = 500; /* arbitrary: five seconds */ ohci_writel (ohci, OHCI_INTR_OC, &ohci->regs->intrenable); ohci_writel (ohci, OHCI_OCR, &ohci->regs->cmdstatus); while (ohci_readl (ohci, &ohci->regs->control) & OHCI_CTRL_IR) { msleep (10); if (--temp == 0) { ohci_err (ohci, "USB HC takeover failed!" " (BIOS/SMM bug) "); return -EBUSY; } } ohci_usb_reset (ohci); } #endif /* Disable HC interrupts */ ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable); |
6a9062f39 [PATCH] USB: ohci... |
536 537 538 539 |
/* flush the writes, and save key bits like RWC */ if (ohci_readl (ohci, &ohci->regs->control) & OHCI_CTRL_RWC) ohci->hc_control |= OHCI_CTRL_RWC; |
1da177e4c Linux-2.6.12-rc2 |
540 |
|
fdd13b36c [PATCH] USB: OHCI... |
541 542 543 |
/* Read the number of ports unless overridden */ if (ohci->num_ports == 0) ohci->num_ports = roothub_a(ohci) & RH_A_NDP; |
1da177e4c Linux-2.6.12-rc2 |
544 545 |
if (ohci->hcca) return 0; |
6a9062f39 [PATCH] USB: ohci... |
546 |
ohci->hcca = dma_alloc_coherent (hcd->self.controller, |
1da177e4c Linux-2.6.12-rc2 |
547 548 549 550 551 |
sizeof *ohci->hcca, &ohci->hcca_dma, 0); if (!ohci->hcca) return -ENOMEM; if ((ret = ohci_mem_init (ohci)) < 0) |
6a9062f39 [PATCH] USB: ohci... |
552 553 |
ohci_stop (hcd); else { |
6a9062f39 [PATCH] USB: ohci... |
554 555 |
create_debug_files (ohci); } |
1da177e4c Linux-2.6.12-rc2 |
556 557 |
return ret; |
1da177e4c Linux-2.6.12-rc2 |
558 559 560 561 562 563 |
} /*-------------------------------------------------------------------------*/ /* Start an OHCI controller, set the BUS operational * resets USB and controller |
dd9048af4 USB: ohci whitesp... |
564 |
* enable interrupts |
1da177e4c Linux-2.6.12-rc2 |
565 566 567 |
*/ static int ohci_run (struct ohci_hcd *ohci) { |
96f90a8b0 USB: host/ohci-hc... |
568 |
u32 mask, val; |
1da177e4c Linux-2.6.12-rc2 |
569 |
int first = ohci->fminterval == 0; |
6a9062f39 [PATCH] USB: ohci... |
570 |
struct usb_hcd *hcd = ohci_to_hcd(ohci); |
1da177e4c Linux-2.6.12-rc2 |
571 572 573 574 575 |
disable (ohci); /* boot firmware should have set this up (5.1.1.3.1) */ if (first) { |
96f90a8b0 USB: host/ohci-hc... |
576 577 |
val = ohci_readl (ohci, &ohci->regs->fminterval); ohci->fminterval = val & 0x3fff; |
1da177e4c Linux-2.6.12-rc2 |
578 579 580 581 582 583 584 |
if (ohci->fminterval != FI) ohci_dbg (ohci, "fminterval delta %d ", ohci->fminterval - FI); ohci->fminterval |= FSMP (ohci->fminterval) << 16; /* also: power/overcurrent flags in roothub.a */ } |
6fd9086a5 USB: automaticall... |
585 586 587 588 |
/* Reset USB nearly "by the book". RemoteWakeupConnected has * to be checked in case boot firmware (BIOS/SMM/...) has set up * wakeup in a way the bus isn't aware of (e.g., legacy PCI PM). * If the bus glue detected wakeup capability then it should |
bcca06efe USB: don't enable... |
589 |
* already be enabled; if so we'll just enable it again. |
1da177e4c Linux-2.6.12-rc2 |
590 |
*/ |
bcca06efe USB: don't enable... |
591 592 |
if ((ohci->hc_control & OHCI_CTRL_RWC) != 0) device_set_wakeup_capable(hcd->self.controller, 1); |
1da177e4c Linux-2.6.12-rc2 |
593 594 595 |
switch (ohci->hc_control & OHCI_CTRL_HCFS) { case OHCI_USB_OPER: |
96f90a8b0 USB: host/ohci-hc... |
596 |
val = 0; |
1da177e4c Linux-2.6.12-rc2 |
597 598 599 600 601 |
break; case OHCI_USB_SUSPEND: case OHCI_USB_RESUME: ohci->hc_control &= OHCI_CTRL_RWC; ohci->hc_control |= OHCI_USB_RESUME; |
96f90a8b0 USB: host/ohci-hc... |
602 |
val = 10 /* msec wait */; |
1da177e4c Linux-2.6.12-rc2 |
603 604 605 606 607 |
break; // case OHCI_USB_RESET: default: ohci->hc_control &= OHCI_CTRL_RWC; ohci->hc_control |= OHCI_USB_RESET; |
96f90a8b0 USB: host/ohci-hc... |
608 |
val = 50 /* msec wait */; |
1da177e4c Linux-2.6.12-rc2 |
609 610 611 612 613 |
break; } ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); // flush the writes (void) ohci_readl (ohci, &ohci->regs->control); |
96f90a8b0 USB: host/ohci-hc... |
614 |
msleep(val); |
383975d76 USB: EHCI, OHCI: ... |
615 |
|
1da177e4c Linux-2.6.12-rc2 |
616 617 618 619 620 621 622 623 |
memset (ohci->hcca, 0, sizeof (struct ohci_hcca)); /* 2msec timelimit here means no irqs/preempt */ spin_lock_irq (&ohci->lock); retry: /* HC Reset requires max 10 us delay */ ohci_writel (ohci, OHCI_HCR, &ohci->regs->cmdstatus); |
96f90a8b0 USB: host/ohci-hc... |
624 |
val = 30; /* ... allow extra time */ |
1da177e4c Linux-2.6.12-rc2 |
625 |
while ((ohci_readl (ohci, &ohci->regs->cmdstatus) & OHCI_HCR) != 0) { |
96f90a8b0 USB: host/ohci-hc... |
626 |
if (--val == 0) { |
1da177e4c Linux-2.6.12-rc2 |
627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 |
spin_unlock_irq (&ohci->lock); ohci_err (ohci, "USB HC reset timed out! "); return -1; } udelay (1); } /* now we're in the SUSPEND state ... must go OPERATIONAL * within 2msec else HC enters RESUME * * ... but some hardware won't init fmInterval "by the book" * (SiS, OPTi ...), so reset again instead. SiS doesn't need * this if we write fmInterval after we're OPERATIONAL. * Unclear about ALi, ServerWorks, and others ... this could * easily be a longstanding bug in chip init on Linux. */ if (ohci->flags & OHCI_QUIRK_INITRESET) { ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); // flush those writes (void) ohci_readl (ohci, &ohci->regs->control); } /* Tell the controller where the control and bulk lists are * The lists are empty now. */ ohci_writel (ohci, 0, &ohci->regs->ed_controlhead); ohci_writel (ohci, 0, &ohci->regs->ed_bulkhead); /* a reset clears this */ ohci_writel (ohci, (u32) ohci->hcca_dma, &ohci->regs->hcca); periodic_reinit (ohci); /* some OHCI implementations are finicky about how they init. * bogus values here mean not even enumeration could work. */ if ((ohci_readl (ohci, &ohci->regs->fminterval) & 0x3fff0000) == 0 || !ohci_readl (ohci, &ohci->regs->periodicstart)) { if (!(ohci->flags & OHCI_QUIRK_INITRESET)) { ohci->flags |= OHCI_QUIRK_INITRESET; ohci_dbg (ohci, "enabling initreset quirk "); goto retry; } spin_unlock_irq (&ohci->lock); ohci_err (ohci, "init err (%08x %04x) ", ohci_readl (ohci, &ohci->regs->fminterval), ohci_readl (ohci, &ohci->regs->periodicstart)); return -EOVERFLOW; } |
d413984ae USB: OHCI avoids ... |
678 679 680 681 682 |
/* use rhsc irqs after khubd is fully initialized */ hcd->poll_rh = 1; hcd->uses_new_polling = 1; /* start controller operations */ |
1da177e4c Linux-2.6.12-rc2 |
683 |
ohci->hc_control &= OHCI_CTRL_RWC; |
d413984ae USB: OHCI avoids ... |
684 685 |
ohci->hc_control |= OHCI_CONTROL_INIT | OHCI_USB_OPER; ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); |
6a9062f39 [PATCH] USB: ohci... |
686 |
hcd->state = HC_STATE_RUNNING; |
1da177e4c Linux-2.6.12-rc2 |
687 688 689 690 691 692 |
/* wake on ConnectStatusChange, matching external hubs */ ohci_writel (ohci, RH_HS_DRWE, &ohci->regs->roothub.status); /* Choose the interrupts we care about now, others later on demand */ mask = OHCI_INTR_INIT; |
d413984ae USB: OHCI avoids ... |
693 |
ohci_writel (ohci, ~0, &ohci->regs->intrstatus); |
1da177e4c Linux-2.6.12-rc2 |
694 695 696 |
ohci_writel (ohci, mask, &ohci->regs->intrenable); /* handle root hub init quirks ... */ |
96f90a8b0 USB: host/ohci-hc... |
697 698 |
val = roothub_a (ohci); val &= ~(RH_A_PSM | RH_A_OCPM); |
1da177e4c Linux-2.6.12-rc2 |
699 700 |
if (ohci->flags & OHCI_QUIRK_SUPERIO) { /* NSC 87560 and maybe others */ |
96f90a8b0 USB: host/ohci-hc... |
701 702 703 |
val |= RH_A_NOCP; val &= ~(RH_A_POTPGT | RH_A_NPS); ohci_writel (ohci, val, &ohci->regs->roothub.a); |
1133cd8ad USB: ohci: make d... |
704 705 |
} else if ((ohci->flags & OHCI_QUIRK_AMD756) || (ohci->flags & OHCI_QUIRK_HUB_POWER)) { |
1da177e4c Linux-2.6.12-rc2 |
706 707 708 |
/* hub power always on; required for AMD-756 and some * Mac platforms. ganged overcurrent reporting, if any. */ |
96f90a8b0 USB: host/ohci-hc... |
709 710 |
val |= RH_A_NPS; ohci_writel (ohci, val, &ohci->regs->roothub.a); |
1da177e4c Linux-2.6.12-rc2 |
711 712 |
} ohci_writel (ohci, RH_HS_LPSC, &ohci->regs->roothub.status); |
96f90a8b0 USB: host/ohci-hc... |
713 |
ohci_writel (ohci, (val & RH_A_NPS) ? 0 : RH_B_PPCM, |
1da177e4c Linux-2.6.12-rc2 |
714 715 716 |
&ohci->regs->roothub.b); // flush those writes (void) ohci_readl (ohci, &ohci->regs->control); |
d413984ae USB: OHCI avoids ... |
717 |
ohci->next_statechange = jiffies + STATECHANGE_DELAY; |
1da177e4c Linux-2.6.12-rc2 |
718 719 720 |
spin_unlock_irq (&ohci->lock); // POTPGT delay is bits 24-31, in 2 ms units. |
96f90a8b0 USB: host/ohci-hc... |
721 |
mdelay ((val >> 23) & 0x1fe); |
6a9062f39 [PATCH] USB: ohci... |
722 |
hcd->state = HC_STATE_RUNNING; |
1da177e4c Linux-2.6.12-rc2 |
723 |
|
89a0fd18a USB: OHCI handles... |
724 725 726 727 728 729 730 731 |
if (quirk_zfmicro(ohci)) { /* Create timer to watch for bad queue state on ZF Micro */ setup_timer(&ohci->unlink_watchdog, unlink_watchdog_func, (unsigned long) ohci); ohci->eds_scheduled = 0; ohci->ed_to_check = NULL; } |
1da177e4c Linux-2.6.12-rc2 |
732 |
ohci_dump (ohci, 1); |
1da177e4c Linux-2.6.12-rc2 |
733 734 735 736 737 738 |
return 0; } /*-------------------------------------------------------------------------*/ /* an interrupt happens */ |
7d12e780e IRQ: Maintain reg... |
739 |
static irqreturn_t ohci_irq (struct usb_hcd *hcd) |
1da177e4c Linux-2.6.12-rc2 |
740 741 742 |
{ struct ohci_hcd *ohci = hcd_to_ohci (hcd); struct ohci_regs __iomem *regs = ohci->regs; |
89a0fd18a USB: OHCI handles... |
743 |
int ints; |
1da177e4c Linux-2.6.12-rc2 |
744 |
|
565227c08 usb: Remove broke... |
745 746 747 |
/* Read interrupt status (and flush pending writes). We ignore the * optimization of checking the LSB of hcca->done_head; it doesn't * work on all systems (edge triggering for OHCI can be a factor). |
89a0fd18a USB: OHCI handles... |
748 |
*/ |
565227c08 usb: Remove broke... |
749 |
ints = ohci_readl(ohci, ®s->intrstatus); |
1da177e4c Linux-2.6.12-rc2 |
750 |
|
565227c08 usb: Remove broke... |
751 752 753 754 |
/* Check for an all 1's result which is a typical consequence * of dead, unclocked, or unplugged (CardBus...) devices */ if (ints == ~(u32)0) { |
1da177e4c Linux-2.6.12-rc2 |
755 756 757 758 |
disable (ohci); ohci_dbg (ohci, "device removed! "); return IRQ_HANDLED; |
565227c08 usb: Remove broke... |
759 760 761 762 |
} /* We only care about interrupts that are enabled */ ints &= ohci_readl(ohci, ®s->intrenable); |
1da177e4c Linux-2.6.12-rc2 |
763 764 |
/* interrupt for some other device? */ |
565227c08 usb: Remove broke... |
765 |
if (ints == 0) |
1da177e4c Linux-2.6.12-rc2 |
766 |
return IRQ_NOTMINE; |
d413984ae USB: OHCI avoids ... |
767 |
|
1da177e4c Linux-2.6.12-rc2 |
768 |
if (ints & OHCI_INTR_UE) { |
1da177e4c Linux-2.6.12-rc2 |
769 |
// e.g. due to PCI Master/Target Abort |
89a0fd18a USB: OHCI handles... |
770 |
if (quirk_nec(ohci)) { |
d576bb9f2 USB: Fix NEC OHCI... |
771 772 773 774 775 776 777 778 779 780 781 782 783 784 |
/* Workaround for a silicon bug in some NEC chips used * in Apple's PowerBooks. Adapted from Darwin code. */ ohci_err (ohci, "OHCI Unrecoverable Error, scheduling NEC chip restart "); ohci_writel (ohci, OHCI_INTR_UE, ®s->intrdisable); schedule_work (&ohci->nec_work); } else { disable (ohci); ohci_err (ohci, "OHCI Unrecoverable Error, disabled "); } |
1da177e4c Linux-2.6.12-rc2 |
785 786 787 788 |
ohci_dump (ohci, 1); ohci_usb_reset (ohci); } |
583ceada0 USB: OHCI: fix ro... |
789 790 791 792 793 794 |
if (ints & OHCI_INTR_RHSC) { ohci_vdbg(ohci, "rhsc "); ohci->next_statechange = jiffies + STATECHANGE_DELAY; ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC, ®s->intrstatus); |
052ac01ae USB: OHCI: disabl... |
795 796 797 798 799 800 801 802 803 804 |
/* NOTE: Vendors didn't always make the same implementation * choices for RHSC. Many followed the spec; RHSC triggers * on an edge, like setting and maybe clearing a port status * change bit. With others it's level-triggered, active * until khubd clears all the port status change bits. We'll * always disable it here and rely on polling until khubd * re-enables it. */ ohci_writel(ohci, OHCI_INTR_RHSC, ®s->intrdisable); |
583ceada0 USB: OHCI: fix ro... |
805 806 807 808 809 810 811 812 813 814 815 |
usb_hcd_poll_rh_status(hcd); } /* For connect and disconnect events, we expect the controller * to turn on RHSC along with RD. But for remote wakeup events * this might not happen. */ else if (ints & OHCI_INTR_RD) { ohci_vdbg(ohci, "resume detect "); ohci_writel(ohci, OHCI_INTR_RD, ®s->intrstatus); |
8d1a243ba OHCI: add auto-st... |
816 817 818 819 820 821 |
hcd->poll_rh = 1; if (ohci->autostop) { spin_lock (&ohci->lock); ohci_rh_resume (ohci); spin_unlock (&ohci->lock); } else |
f197b2c54 [PATCH] OHCI PM u... |
822 |
usb_hcd_resume_root_hub(hcd); |
1da177e4c Linux-2.6.12-rc2 |
823 824 825 |
} if (ints & OHCI_INTR_WDH) { |
1da177e4c Linux-2.6.12-rc2 |
826 |
spin_lock (&ohci->lock); |
7d12e780e IRQ: Maintain reg... |
827 |
dl_done_list (ohci); |
1da177e4c Linux-2.6.12-rc2 |
828 |
spin_unlock (&ohci->lock); |
1da177e4c Linux-2.6.12-rc2 |
829 |
} |
dd9048af4 USB: ohci whitesp... |
830 |
|
89a0fd18a USB: OHCI handles... |
831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 |
if (quirk_zfmicro(ohci) && (ints & OHCI_INTR_SF)) { spin_lock(&ohci->lock); if (ohci->ed_to_check) { struct ed *ed = ohci->ed_to_check; if (check_ed(ohci, ed)) { /* HC thinks the TD list is empty; HCD knows * at least one TD is outstanding */ if (--ohci->zf_delay == 0) { struct td *td = list_entry( ed->td_list.next, struct td, td_list); ohci_warn(ohci, "Reclaiming orphan TD %p ", td); takeback_td(ohci, td); ohci->ed_to_check = NULL; } } else ohci->ed_to_check = NULL; } spin_unlock(&ohci->lock); } |
1da177e4c Linux-2.6.12-rc2 |
856 857 858 859 860 861 862 |
/* could track INTR_SO to reduce available PCI/... bandwidth */ /* handle any pending URB/ED unlinks, leaving INTR_SF enabled * when there's still unlinking to be done (next frame). */ spin_lock (&ohci->lock); if (ohci->ed_rm_list) |
7d12e780e IRQ: Maintain reg... |
863 |
finish_unlinks (ohci, ohci_frame_no(ohci)); |
89a0fd18a USB: OHCI handles... |
864 865 866 |
if ((ints & OHCI_INTR_SF) != 0 && !ohci->ed_rm_list && !ohci->ed_to_check |
1da177e4c Linux-2.6.12-rc2 |
867 |
&& HC_IS_RUNNING(hcd->state)) |
dd9048af4 USB: ohci whitesp... |
868 |
ohci_writel (ohci, OHCI_INTR_SF, ®s->intrdisable); |
1da177e4c Linux-2.6.12-rc2 |
869 870 871 872 |
spin_unlock (&ohci->lock); if (HC_IS_RUNNING(hcd->state)) { ohci_writel (ohci, ints, ®s->intrstatus); |
dd9048af4 USB: ohci whitesp... |
873 |
ohci_writel (ohci, OHCI_INTR_MIE, ®s->intrenable); |
1da177e4c Linux-2.6.12-rc2 |
874 875 876 877 878 879 880 881 882 883 |
// flush those writes (void) ohci_readl (ohci, &ohci->regs->control); } return IRQ_HANDLED; } /*-------------------------------------------------------------------------*/ static void ohci_stop (struct usb_hcd *hcd) |
dd9048af4 USB: ohci whitesp... |
884 |
{ |
1da177e4c Linux-2.6.12-rc2 |
885 |
struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
1da177e4c Linux-2.6.12-rc2 |
886 887 888 889 890 891 |
ohci_dump (ohci, 1); flush_scheduled_work(); ohci_usb_reset (ohci); ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable); |
71795c1df USB: ohci_usb can... |
892 893 |
free_irq(hcd->irq, hcd); hcd->irq = -1; |
89a0fd18a USB: OHCI handles... |
894 895 |
if (quirk_zfmicro(ohci)) del_timer(&ohci->unlink_watchdog); |
ab1666c13 USB: quirk PLL po... |
896 897 |
if (quirk_amdiso(ohci)) amd_iso_dev_put(); |
89a0fd18a USB: OHCI handles... |
898 |
|
1da177e4c Linux-2.6.12-rc2 |
899 900 901 |
remove_debug_files (ohci); ohci_mem_cleanup (ohci); if (ohci->hcca) { |
dd9048af4 USB: ohci whitesp... |
902 903 |
dma_free_coherent (hcd->self.controller, sizeof *ohci->hcca, |
1da177e4c Linux-2.6.12-rc2 |
904 905 906 907 908 909 910 |
ohci->hcca, ohci->hcca_dma); ohci->hcca = NULL; ohci->hcca_dma = 0; } } /*-------------------------------------------------------------------------*/ |
da6fb5704 USB: remove new O... |
911 |
#if defined(CONFIG_PM) || defined(CONFIG_PCI) |
1da177e4c Linux-2.6.12-rc2 |
912 |
/* must not be called from interrupt context */ |
1da177e4c Linux-2.6.12-rc2 |
913 914 915 916 917 |
static int ohci_restart (struct ohci_hcd *ohci) { int temp; int i; struct urb_priv *priv; |
1da177e4c Linux-2.6.12-rc2 |
918 |
|
1da177e4c Linux-2.6.12-rc2 |
919 920 |
spin_lock_irq(&ohci->lock); disable (ohci); |
d576bb9f2 USB: Fix NEC OHCI... |
921 922 |
/* Recycle any "live" eds/tds (and urbs). */ |
1da177e4c Linux-2.6.12-rc2 |
923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 |
if (!list_empty (&ohci->pending)) ohci_dbg(ohci, "abort schedule... "); list_for_each_entry (priv, &ohci->pending, pending) { struct urb *urb = priv->td[0]->urb; struct ed *ed = priv->ed; switch (ed->state) { case ED_OPER: ed->state = ED_UNLINK; ed->hwINFO |= cpu_to_hc32(ohci, ED_DEQUEUE); ed_deschedule (ohci, ed); ed->ed_next = ohci->ed_rm_list; ed->ed_prev = NULL; ohci->ed_rm_list = ed; /* FALLTHROUGH */ case ED_UNLINK: break; default: ohci_dbg(ohci, "bogus ed %p state %d ", ed, ed->state); } |
55d849683 USB: reorganize u... |
947 948 |
if (!urb->unlinked) urb->unlinked = -ESHUTDOWN; |
1da177e4c Linux-2.6.12-rc2 |
949 |
} |
7d12e780e IRQ: Maintain reg... |
950 |
finish_unlinks (ohci, 0); |
1da177e4c Linux-2.6.12-rc2 |
951 952 953 954 955 956 957 |
spin_unlock_irq(&ohci->lock); /* paranoia, in case that didn't work: */ /* empty the interrupt branches */ for (i = 0; i < NUM_INTS; i++) ohci->load [i] = 0; for (i = 0; i < NUM_INTS; i++) ohci->hcca->int_table [i] = 0; |
dd9048af4 USB: ohci whitesp... |
958 |
|
1da177e4c Linux-2.6.12-rc2 |
959 960 |
/* no EDs to remove */ ohci->ed_rm_list = NULL; |
dd9048af4 USB: ohci whitesp... |
961 |
/* empty control and bulk lists */ |
1da177e4c Linux-2.6.12-rc2 |
962 963 964 965 966 967 968 |
ohci->ed_controltail = NULL; ohci->ed_bulktail = NULL; if ((temp = ohci_run (ohci)) < 0) { ohci_err (ohci, "can't restart, %d ", temp); return temp; |
1da177e4c Linux-2.6.12-rc2 |
969 |
} |
383975d76 USB: EHCI, OHCI: ... |
970 971 |
ohci_dbg(ohci, "restart complete "); |
1da177e4c Linux-2.6.12-rc2 |
972 973 |
return 0; } |
d576bb9f2 USB: Fix NEC OHCI... |
974 |
|
da6fb5704 USB: remove new O... |
975 |
#endif |
d576bb9f2 USB: Fix NEC OHCI... |
976 |
/*-------------------------------------------------------------------------*/ |
1da177e4c Linux-2.6.12-rc2 |
977 |
MODULE_AUTHOR (DRIVER_AUTHOR); |
2b70f0734 USB: EHCI, OHCI, ... |
978 |
MODULE_DESCRIPTION(DRIVER_DESC); |
1da177e4c Linux-2.6.12-rc2 |
979 980 981 982 |
MODULE_LICENSE ("GPL"); #ifdef CONFIG_PCI #include "ohci-pci.c" |
5e16fabe5 ohci: Rework bus ... |
983 |
#define PCI_DRIVER ohci_pci_driver |
1da177e4c Linux-2.6.12-rc2 |
984 |
#endif |
6381fad77 USB: make SA1111 ... |
985 |
#if defined(CONFIG_ARCH_SA1100) && defined(CONFIG_SA1111) |
1da177e4c Linux-2.6.12-rc2 |
986 |
#include "ohci-sa1111.c" |
5e16fabe5 ohci: Rework bus ... |
987 |
#define SA1111_DRIVER ohci_hcd_sa1111_driver |
1da177e4c Linux-2.6.12-rc2 |
988 |
#endif |
3ba5f38f3 USB: ohci-hcd: Ad... |
989 |
#if defined(CONFIG_ARCH_S3C2410) || defined(CONFIG_ARCH_S3C64XX) |
3eb0c5f4b [PATCH] USB: add ... |
990 |
#include "ohci-s3c2410.c" |
5e16fabe5 ohci: Rework bus ... |
991 |
#define PLATFORM_DRIVER ohci_hcd_s3c2410_driver |
3eb0c5f4b [PATCH] USB: add ... |
992 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
993 994 |
#ifdef CONFIG_ARCH_OMAP #include "ohci-omap.c" |
5e16fabe5 ohci: Rework bus ... |
995 |
#define PLATFORM_DRIVER ohci_hcd_omap_driver |
1da177e4c Linux-2.6.12-rc2 |
996 997 998 999 |
#endif #ifdef CONFIG_ARCH_LH7A404 #include "ohci-lh7a404.c" |
5e16fabe5 ohci: Rework bus ... |
1000 |
#define PLATFORM_DRIVER ohci_hcd_lh7a404_driver |
1da177e4c Linux-2.6.12-rc2 |
1001 |
#endif |
e77ec1898 [ARM] USB: update... |
1002 |
#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx) |
1da177e4c Linux-2.6.12-rc2 |
1003 |
#include "ohci-pxa27x.c" |
5e16fabe5 ohci: Rework bus ... |
1004 |
#define PLATFORM_DRIVER ohci_hcd_pxa27x_driver |
1da177e4c Linux-2.6.12-rc2 |
1005 |
#endif |
a5b7474a0 [PATCH] USB: ohci... |
1006 1007 |
#ifdef CONFIG_ARCH_EP93XX #include "ohci-ep93xx.c" |
5e16fabe5 ohci: Rework bus ... |
1008 |
#define PLATFORM_DRIVER ohci_hcd_ep93xx_driver |
a5b7474a0 [PATCH] USB: ohci... |
1009 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
1010 1011 |
#ifdef CONFIG_SOC_AU1X00 #include "ohci-au1xxx.c" |
5e16fabe5 ohci: Rework bus ... |
1012 |
#define PLATFORM_DRIVER ohci_hcd_au1xxx_driver |
1da177e4c Linux-2.6.12-rc2 |
1013 |
#endif |
5151d0406 USB: OHCI support... |
1014 1015 |
#ifdef CONFIG_PNX8550 #include "ohci-pnx8550.c" |
5e16fabe5 ohci: Rework bus ... |
1016 |
#define PLATFORM_DRIVER ohci_hcd_pnx8550_driver |
5151d0406 USB: OHCI support... |
1017 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
1018 1019 |
#ifdef CONFIG_USB_OHCI_HCD_PPC_SOC #include "ohci-ppc-soc.c" |
5e16fabe5 ohci: Rework bus ... |
1020 |
#define PLATFORM_DRIVER ohci_hcd_ppc_soc_driver |
1da177e4c Linux-2.6.12-rc2 |
1021 |
#endif |
58a0cd788 [ARM] 3963/1: AT9... |
1022 |
#ifdef CONFIG_ARCH_AT91 |
39a269c09 [PATCH] USB: add ... |
1023 |
#include "ohci-at91.c" |
5e16fabe5 ohci: Rework bus ... |
1024 |
#define PLATFORM_DRIVER ohci_hcd_at91_driver |
39a269c09 [PATCH] USB: add ... |
1025 |
#endif |
60bbfc84b USB OHCI controll... |
1026 1027 |
#ifdef CONFIG_ARCH_PNX4008 #include "ohci-pnx4008.c" |
5e16fabe5 ohci: Rework bus ... |
1028 |
#define PLATFORM_DRIVER usb_hcd_pnx4008_driver |
60bbfc84b USB OHCI controll... |
1029 |
#endif |
828d55c58 USB: add support ... |
1030 1031 |
#if defined(CONFIG_CPU_SUBTYPE_SH7720) || \ defined(CONFIG_CPU_SUBTYPE_SH7721) || \ |
4c3f450ba sh: Add OHCI USB ... |
1032 1033 |
defined(CONFIG_CPU_SUBTYPE_SH7763) || \ defined(CONFIG_CPU_SUBTYPE_SH7786) |
828d55c58 USB: add support ... |
1034 1035 1036 |
#include "ohci-sh.c" #define PLATFORM_DRIVER ohci_hcd_sh_driver #endif |
5e16fabe5 ohci: Rework bus ... |
1037 |
|
495a678fc ohci: Add support... |
1038 1039 1040 1041 |
#ifdef CONFIG_USB_OHCI_HCD_PPC_OF #include "ohci-ppc-of.c" #define OF_PLATFORM_DRIVER ohci_hcd_ppc_of_driver #endif |
6a6c957eb USB: ps3 ohci bus... |
1042 1043 |
#ifdef CONFIG_PPC_PS3 #include "ohci-ps3.c" |
7a4eb7fd5 USB: PS3: USB sys... |
1044 |
#define PS3_SYSTEM_BUS_DRIVER ps3_ohci_driver |
6a6c957eb USB: ps3 ohci bus... |
1045 |
#endif |
c604e8514 USB: ohci SSB bus... |
1046 1047 1048 1049 |
#ifdef CONFIG_USB_OHCI_HCD_SSB #include "ohci-ssb.c" #define SSB_OHCI_DRIVER ssb_ohci_driver #endif |
f54aab6eb usb: ohci-sm501 d... |
1050 1051 |
#ifdef CONFIG_MFD_SM501 #include "ohci-sm501.c" |
3ee38d8bf OHCI: Fix problem... |
1052 |
#define SM501_OHCI_DRIVER ohci_hcd_sm501_driver |
f54aab6eb usb: ohci-sm501 d... |
1053 |
#endif |
78c73414f USB: ohci: add su... |
1054 1055 1056 1057 |
#ifdef CONFIG_MFD_TC6393XB #include "ohci-tmio.c" #define TMIO_OHCI_DRIVER ohci_hcd_tmio_driver #endif |
5e16fabe5 ohci: Rework bus ... |
1058 1059 |
#if !defined(PCI_DRIVER) && \ !defined(PLATFORM_DRIVER) && \ |
495a678fc ohci: Add support... |
1060 |
!defined(OF_PLATFORM_DRIVER) && \ |
6a6c957eb USB: ps3 ohci bus... |
1061 |
!defined(SA1111_DRIVER) && \ |
c604e8514 USB: ohci SSB bus... |
1062 |
!defined(PS3_SYSTEM_BUS_DRIVER) && \ |
3ee38d8bf OHCI: Fix problem... |
1063 |
!defined(SM501_OHCI_DRIVER) && \ |
78c73414f USB: ohci: add su... |
1064 |
!defined(TMIO_OHCI_DRIVER) && \ |
c604e8514 USB: ohci SSB bus... |
1065 |
!defined(SSB_OHCI_DRIVER) |
1da177e4c Linux-2.6.12-rc2 |
1066 1067 |
#error "missing bus glue for ohci-hcd" #endif |
5e16fabe5 ohci: Rework bus ... |
1068 1069 1070 1071 |
static int __init ohci_hcd_mod_init(void) { int retval = 0; |
5e16fabe5 ohci: Rework bus ... |
1072 1073 1074 |
if (usb_disabled()) return -ENODEV; |
2b70f0734 USB: EHCI, OHCI, ... |
1075 1076 |
printk(KERN_INFO "%s: " DRIVER_DESC " ", hcd_name); |
5e16fabe5 ohci: Rework bus ... |
1077 1078 1079 |
pr_debug ("%s: block sizes: ed %Zd td %Zd ", hcd_name, sizeof (struct ed), sizeof (struct td)); |
9beeee658 USB: EHCI: log a ... |
1080 |
set_bit(USB_OHCI_LOADED, &usb_hcds_loaded); |
5e16fabe5 ohci: Rework bus ... |
1081 |
|
684c19e0d USB: convert ohci... |
1082 |
#ifdef DEBUG |
485f4f397 USB: OHCI: use th... |
1083 |
ohci_debug_root = debugfs_create_dir("ohci", usb_debug_root); |
684c19e0d USB: convert ohci... |
1084 1085 1086 1087 1088 |
if (!ohci_debug_root) { retval = -ENOENT; goto error_debug; } #endif |
6a6c957eb USB: ps3 ohci bus... |
1089 |
#ifdef PS3_SYSTEM_BUS_DRIVER |
7a4eb7fd5 USB: PS3: USB sys... |
1090 1091 1092 |
retval = ps3_ohci_driver_register(&PS3_SYSTEM_BUS_DRIVER); if (retval < 0) goto error_ps3; |
6a6c957eb USB: ps3 ohci bus... |
1093 |
#endif |
5e16fabe5 ohci: Rework bus ... |
1094 1095 1096 |
#ifdef PLATFORM_DRIVER retval = platform_driver_register(&PLATFORM_DRIVER); if (retval < 0) |
de44743b0 USB: ohci error h... |
1097 |
goto error_platform; |
5e16fabe5 ohci: Rework bus ... |
1098 |
#endif |
495a678fc ohci: Add support... |
1099 1100 1101 |
#ifdef OF_PLATFORM_DRIVER retval = of_register_platform_driver(&OF_PLATFORM_DRIVER); if (retval < 0) |
de44743b0 USB: ohci error h... |
1102 |
goto error_of_platform; |
495a678fc ohci: Add support... |
1103 |
#endif |
5e16fabe5 ohci: Rework bus ... |
1104 1105 1106 |
#ifdef SA1111_DRIVER retval = sa1111_driver_register(&SA1111_DRIVER); if (retval < 0) |
de44743b0 USB: ohci error h... |
1107 |
goto error_sa1111; |
5e16fabe5 ohci: Rework bus ... |
1108 1109 1110 1111 1112 |
#endif #ifdef PCI_DRIVER retval = pci_register_driver(&PCI_DRIVER); if (retval < 0) |
de44743b0 USB: ohci error h... |
1113 |
goto error_pci; |
5e16fabe5 ohci: Rework bus ... |
1114 |
#endif |
c604e8514 USB: ohci SSB bus... |
1115 1116 1117 1118 1119 |
#ifdef SSB_OHCI_DRIVER retval = ssb_driver_register(&SSB_OHCI_DRIVER); if (retval) goto error_ssb; #endif |
3ee38d8bf OHCI: Fix problem... |
1120 1121 1122 1123 1124 |
#ifdef SM501_OHCI_DRIVER retval = platform_driver_register(&SM501_OHCI_DRIVER); if (retval < 0) goto error_sm501; #endif |
78c73414f USB: ohci: add su... |
1125 1126 1127 1128 1129 |
#ifdef TMIO_OHCI_DRIVER retval = platform_driver_register(&TMIO_OHCI_DRIVER); if (retval < 0) goto error_tmio; #endif |
5e16fabe5 ohci: Rework bus ... |
1130 1131 1132 |
return retval; /* Error path */ |
78c73414f USB: ohci: add su... |
1133 1134 1135 1136 |
#ifdef TMIO_OHCI_DRIVER platform_driver_unregister(&TMIO_OHCI_DRIVER); error_tmio: #endif |
3ee38d8bf OHCI: Fix problem... |
1137 |
#ifdef SM501_OHCI_DRIVER |
78c73414f USB: ohci: add su... |
1138 |
platform_driver_unregister(&SM501_OHCI_DRIVER); |
3ee38d8bf OHCI: Fix problem... |
1139 1140 |
error_sm501: #endif |
c604e8514 USB: ohci SSB bus... |
1141 |
#ifdef SSB_OHCI_DRIVER |
78c73414f USB: ohci: add su... |
1142 |
ssb_driver_unregister(&SSB_OHCI_DRIVER); |
c604e8514 USB: ohci SSB bus... |
1143 1144 |
error_ssb: #endif |
de44743b0 USB: ohci error h... |
1145 |
#ifdef PCI_DRIVER |
c604e8514 USB: ohci SSB bus... |
1146 |
pci_unregister_driver(&PCI_DRIVER); |
de44743b0 USB: ohci error h... |
1147 1148 1149 1150 1151 |
error_pci: #endif #ifdef SA1111_DRIVER sa1111_driver_unregister(&SA1111_DRIVER); error_sa1111: |
5e16fabe5 ohci: Rework bus ... |
1152 |
#endif |
495a678fc ohci: Add support... |
1153 |
#ifdef OF_PLATFORM_DRIVER |
de44743b0 USB: ohci error h... |
1154 1155 |
of_unregister_platform_driver(&OF_PLATFORM_DRIVER); error_of_platform: |
495a678fc ohci: Add support... |
1156 |
#endif |
de44743b0 USB: ohci error h... |
1157 1158 1159 |
#ifdef PLATFORM_DRIVER platform_driver_unregister(&PLATFORM_DRIVER); error_platform: |
5e16fabe5 ohci: Rework bus ... |
1160 |
#endif |
6a6c957eb USB: ps3 ohci bus... |
1161 |
#ifdef PS3_SYSTEM_BUS_DRIVER |
7a4eb7fd5 USB: PS3: USB sys... |
1162 |
ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); |
6a6c957eb USB: ps3 ohci bus... |
1163 1164 |
error_ps3: #endif |
684c19e0d USB: convert ohci... |
1165 1166 1167 1168 1169 |
#ifdef DEBUG debugfs_remove(ohci_debug_root); ohci_debug_root = NULL; error_debug: #endif |
9beeee658 USB: EHCI: log a ... |
1170 |
clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded); |
5e16fabe5 ohci: Rework bus ... |
1171 1172 1173 1174 1175 1176 |
return retval; } module_init(ohci_hcd_mod_init); static void __exit ohci_hcd_mod_exit(void) { |
78c73414f USB: ohci: add su... |
1177 1178 1179 |
#ifdef TMIO_OHCI_DRIVER platform_driver_unregister(&TMIO_OHCI_DRIVER); #endif |
3ee38d8bf OHCI: Fix problem... |
1180 1181 1182 |
#ifdef SM501_OHCI_DRIVER platform_driver_unregister(&SM501_OHCI_DRIVER); #endif |
c604e8514 USB: ohci SSB bus... |
1183 1184 1185 |
#ifdef SSB_OHCI_DRIVER ssb_driver_unregister(&SSB_OHCI_DRIVER); #endif |
5e16fabe5 ohci: Rework bus ... |
1186 1187 1188 1189 1190 1191 |
#ifdef PCI_DRIVER pci_unregister_driver(&PCI_DRIVER); #endif #ifdef SA1111_DRIVER sa1111_driver_unregister(&SA1111_DRIVER); #endif |
495a678fc ohci: Add support... |
1192 1193 1194 |
#ifdef OF_PLATFORM_DRIVER of_unregister_platform_driver(&OF_PLATFORM_DRIVER); #endif |
5e16fabe5 ohci: Rework bus ... |
1195 1196 1197 |
#ifdef PLATFORM_DRIVER platform_driver_unregister(&PLATFORM_DRIVER); #endif |
6a6c957eb USB: ps3 ohci bus... |
1198 |
#ifdef PS3_SYSTEM_BUS_DRIVER |
7a4eb7fd5 USB: PS3: USB sys... |
1199 |
ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); |
6a6c957eb USB: ps3 ohci bus... |
1200 |
#endif |
684c19e0d USB: convert ohci... |
1201 1202 1203 |
#ifdef DEBUG debugfs_remove(ohci_debug_root); #endif |
9beeee658 USB: EHCI: log a ... |
1204 |
clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded); |
5e16fabe5 ohci: Rework bus ... |
1205 1206 |
} module_exit(ohci_hcd_mod_exit); |