blob: 4de91653a2c7bbd9b4b92935f92a4db7a4aeb370 [file] [log] [blame]
Greg Kroah-Hartman5fd54ac2017-11-03 11:28:30 +01001// SPDX-License-Identifier: GPL-1.0+
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
Alan Stern578333a2011-06-15 16:32:46 -04003 * Open Host Controller Interface (OHCI) driver for USB.
4 *
5 * Maintainer: Alan Stern <stern@rowland.harvard.edu>
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 *
7 * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
8 * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net>
David Brownelldd9048a2006-12-05 03:18:31 -08009 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070010 * [ Initialisation is based on Linus' ]
11 * [ uhci code and gregs ohci fragments ]
12 * [ (C) Copyright 1999 Linus Torvalds ]
13 * [ (C) Copyright 1999 Gregory P. Smith]
David Brownelldd9048a2006-12-05 03:18:31 -080014 *
15 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070016 * OHCI is the main "non-Intel/VIA" standard for USB 1.1 host controller
17 * interfaces (though some non-x86 Intel chips use it). It supports
18 * smarter hardware than UHCI. A download link for the spec available
19 * through the http://www.usb.org website.
20 *
Linus Torvalds1da177e2005-04-16 15:20:36 -070021 * This file is licenced under the GPL.
22 */
David Brownelldd9048a2006-12-05 03:18:31 -080023
Linus Torvalds1da177e2005-04-16 15:20:36 -070024#include <linux/module.h>
25#include <linux/moduleparam.h>
26#include <linux/pci.h>
27#include <linux/kernel.h>
28#include <linux/delay.h>
29#include <linux/ioport.h>
30#include <linux/sched.h>
31#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/errno.h>
33#include <linux/init.h>
34#include <linux/timer.h>
35#include <linux/list.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070036#include <linux/usb.h>
David Brownell3a16f7b2006-06-29 12:27:23 -070037#include <linux/usb/otg.h>
Eric Lescouet27729aa2010-04-24 23:21:52 +020038#include <linux/usb/hcd.h>
David Brownelldd9048a2006-12-05 03:18:31 -080039#include <linux/dma-mapping.h>
David Brownellf4df0e32005-04-23 12:49:16 -070040#include <linux/dmapool.h>
Michael Hanselmannd576bb92007-05-31 23:34:27 +020041#include <linux/workqueue.h>
Tony Jones684c19e2007-09-11 14:07:31 -070042#include <linux/debugfs.h>
Laurentiu Tudorb0310c22019-05-29 13:28:40 +030043#include <linux/genalloc.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
45#include <asm/io.h>
46#include <asm/irq.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070047#include <asm/unaligned.h>
48#include <asm/byteorder.h>
49
50
Linus Torvalds1da177e2005-04-16 15:20:36 -070051#define DRIVER_AUTHOR "Roman Weissgaerber, David Brownell"
52#define DRIVER_DESC "USB 1.1 'Open' Host Controller (OHCI) Driver"
53
54/*-------------------------------------------------------------------------*/
55
Linus Torvalds1da177e2005-04-16 15:20:36 -070056/* For initializing controller (mask in an HCFS mode too) */
David Brownelld4139842006-08-04 11:31:55 -070057#define OHCI_CONTROL_INIT OHCI_CTRL_CBSR
Linus Torvalds1da177e2005-04-16 15:20:36 -070058#define OHCI_INTR_INIT \
David Brownelld4139842006-08-04 11:31:55 -070059 (OHCI_INTR_MIE | OHCI_INTR_RHSC | OHCI_INTR_UE \
60 | OHCI_INTR_RD | OHCI_INTR_WDH)
Linus Torvalds1da177e2005-04-16 15:20:36 -070061
62#ifdef __hppa__
63/* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */
64#define IR_DISABLE
65#endif
66
67#ifdef CONFIG_ARCH_OMAP
68/* OMAP doesn't support IR (no SMM; not needed) */
69#define IR_DISABLE
70#endif
71
72/*-------------------------------------------------------------------------*/
73
74static const char hcd_name [] = "ohci_hcd";
75
David Brownelld4139842006-08-04 11:31:55 -070076#define STATECHANGE_DELAY msecs_to_jiffies(300)
Bryan Paluched6d6f82016-10-17 08:54:46 -040077#define IO_WATCHDOG_DELAY msecs_to_jiffies(275)
Shigeru Yoshidab2685bd2018-02-02 13:51:39 +080078#define IO_WATCHDOG_OFF 0xffffff00
David Brownelld4139842006-08-04 11:31:55 -070079
Linus Torvalds1da177e2005-04-16 15:20:36 -070080#include "ohci.h"
Andiry Xuad935622011-03-01 14:57:05 +080081#include "pci-quirks.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070082
Alan Stern256dbcd2014-07-17 16:32:26 -040083static void ohci_dump(struct ohci_hcd *ohci);
84static void ohci_stop(struct usb_hcd *hcd);
Kees Cooke99e88a2017-10-16 14:43:17 -070085static void io_watchdog_func(struct timer_list *t);
Libin Yangab1666c2008-08-08 15:03:31 +080086
Linus Torvalds1da177e2005-04-16 15:20:36 -070087#include "ohci-hub.c"
88#include "ohci-dbg.c"
89#include "ohci-mem.c"
90#include "ohci-q.c"
91
92
93/*
94 * On architectures with edge-triggered interrupts we must never return
95 * IRQ_NONE.
96 */
97#if defined(CONFIG_SA1111) /* ... or other edge-triggered systems */
98#define IRQ_NOTMINE IRQ_HANDLED
99#else
100#define IRQ_NOTMINE IRQ_NONE
101#endif
102
103
104/* Some boards misreport power switching/overcurrent */
Geyslan G. Bem900937c2015-12-02 20:25:23 -0300105static bool distrust_firmware = true;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106module_param (distrust_firmware, bool, 0);
107MODULE_PARM_DESC (distrust_firmware,
108 "true to distrust firmware power/overcurrent setup");
109
110/* Some boards leave IR set wrongly, since they fail BIOS/SMM handshakes */
Geyslan G. Bem900937c2015-12-02 20:25:23 -0300111static bool no_handshake;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112module_param (no_handshake, bool, 0);
113MODULE_PARM_DESC (no_handshake, "true (not default) disables BIOS handshake");
114
115/*-------------------------------------------------------------------------*/
116
Alan Stern6f651262014-07-17 16:30:01 -0400117static int number_of_tds(struct urb *urb)
118{
119 int len, i, num, this_sg_len;
120 struct scatterlist *sg;
121
122 len = urb->transfer_buffer_length;
123 i = urb->num_mapped_sgs;
124
125 if (len > 0 && i > 0) { /* Scatter-gather transfer */
126 num = 0;
127 sg = urb->sg;
128 for (;;) {
129 this_sg_len = min_t(int, sg_dma_len(sg), len);
130 num += DIV_ROUND_UP(this_sg_len, 4096);
131 len -= this_sg_len;
132 if (--i <= 0 || len <= 0)
133 break;
134 sg = sg_next(sg);
135 }
136
137 } else { /* Non-SG transfer */
138 /* one TD for every 4096 Bytes (could be up to 8K) */
139 num = DIV_ROUND_UP(len, 4096);
140 }
141 return num;
142}
143
Linus Torvalds1da177e2005-04-16 15:20:36 -0700144/*
145 * queue up an urb for anything except the root hub
146 */
147static int ohci_urb_enqueue (
148 struct usb_hcd *hcd,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700149 struct urb *urb,
Al Viro55016f12005-10-21 03:21:58 -0400150 gfp_t mem_flags
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151) {
152 struct ohci_hcd *ohci = hcd_to_ohci (hcd);
153 struct ed *ed;
154 urb_priv_t *urb_priv;
155 unsigned int pipe = urb->pipe;
156 int i, size = 0;
157 unsigned long flags;
158 int retval = 0;
David Brownelldd9048a2006-12-05 03:18:31 -0800159
Linus Torvalds1da177e2005-04-16 15:20:36 -0700160 /* every endpoint has a ed, locate and maybe (re)initialize it */
Greg Kroah-Hartman71f46342015-04-30 11:33:00 +0200161 ed = ed_get(ohci, urb->ep, urb->dev, pipe, urb->interval);
162 if (! ed)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163 return -ENOMEM;
164
165 /* for the private part of the URB we need the number of TDs (size) */
166 switch (ed->type) {
167 case PIPE_CONTROL:
168 /* td_submit_urb() doesn't yet handle these */
169 if (urb->transfer_buffer_length > 4096)
170 return -EMSGSIZE;
171
172 /* 1 TD for setup, 1 for ACK, plus ... */
173 size = 2;
174 /* FALLTHROUGH */
175 // case PIPE_INTERRUPT:
176 // case PIPE_BULK:
177 default:
Alan Stern6f651262014-07-17 16:30:01 -0400178 size += number_of_tds(urb);
179 /* maybe a zero-length packet to wrap it up */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700180 if (size == 0)
181 size++;
182 else if ((urb->transfer_flags & URB_ZERO_PACKET) != 0
183 && (urb->transfer_buffer_length
184 % usb_maxpacket (urb->dev, pipe,
185 usb_pipeout (pipe))) == 0)
186 size++;
187 break;
188 case PIPE_ISOCHRONOUS: /* number of packets from URB */
189 size = urb->number_of_packets;
190 break;
191 }
192
193 /* allocate the private part of the URB */
Yoann Padioleaudd00cc42007-07-19 01:49:03 -0700194 urb_priv = kzalloc (sizeof (urb_priv_t) + size * sizeof (struct td *),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700195 mem_flags);
196 if (!urb_priv)
197 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198 INIT_LIST_HEAD (&urb_priv->pending);
199 urb_priv->length = size;
David Brownelldd9048a2006-12-05 03:18:31 -0800200 urb_priv->ed = ed;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201
202 /* allocate the TDs (deferring hash chain updates) */
203 for (i = 0; i < size; i++) {
204 urb_priv->td [i] = td_alloc (ohci, mem_flags);
205 if (!urb_priv->td [i]) {
206 urb_priv->length = i;
207 urb_free_priv (ohci, urb_priv);
208 return -ENOMEM;
209 }
David Brownelldd9048a2006-12-05 03:18:31 -0800210 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211
212 spin_lock_irqsave (&ohci->lock, flags);
213
214 /* don't submit to a dead HC */
Alan Stern541c7d42010-06-22 16:39:10 -0400215 if (!HCD_HW_ACCESSIBLE(hcd)) {
Benjamin Herrenschmidt8de98402005-11-25 09:59:46 +1100216 retval = -ENODEV;
217 goto fail;
218 }
Alan Sternb7463c72011-11-17 16:41:56 -0500219 if (ohci->rh_state != OHCI_RH_RUNNING) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700220 retval = -ENODEV;
221 goto fail;
222 }
Alan Sterne9df41c2007-08-08 11:48:02 -0400223 retval = usb_hcd_link_urb_to_ep(hcd, urb);
224 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225 goto fail;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226
227 /* schedule the ed if needed */
228 if (ed->state == ED_IDLE) {
229 retval = ed_schedule (ohci, ed);
Alan Sterne9df41c2007-08-08 11:48:02 -0400230 if (retval < 0) {
231 usb_hcd_unlink_urb_from_ep(hcd, urb);
232 goto fail;
233 }
Alan Stern81e38332014-07-18 16:26:12 -0400234
235 /* Start up the I/O watchdog timer, if it's not running */
Shigeru Yoshidab2685bd2018-02-02 13:51:39 +0800236 if (ohci->prev_frame_no == IO_WATCHDOG_OFF &&
Gerd Hoffmann21a60f62017-03-20 09:11:49 +0100237 list_empty(&ohci->eds_in_use) &&
238 !(ohci->flags & OHCI_QUIRK_QEMU)) {
Alan Stern499b3802014-07-18 16:26:17 -0400239 ohci->prev_frame_no = ohci_frame_no(ohci);
Alan Stern81e38332014-07-18 16:26:12 -0400240 mod_timer(&ohci->io_watchdog,
241 jiffies + IO_WATCHDOG_DELAY);
Alan Stern499b3802014-07-18 16:26:17 -0400242 }
Alan Stern81e38332014-07-18 16:26:12 -0400243 list_add(&ed->in_use_list, &ohci->eds_in_use);
244
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245 if (ed->type == PIPE_ISOCHRONOUS) {
246 u16 frame = ohci_frame_no(ohci);
247
248 /* delay a few frames before the first TD */
249 frame += max_t (u16, 8, ed->interval);
250 frame &= ~(ed->interval - 1);
251 frame |= ed->branch;
252 urb->start_frame = frame;
Alan Sterna8693422013-09-24 15:46:45 -0400253 ed->last_iso = frame + ed->interval * (size - 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254 }
Alan Stern6a41b4d2012-10-01 10:32:15 -0400255 } else if (ed->type == PIPE_ISOCHRONOUS) {
Alan Sterne19440172013-05-14 13:57:19 -0400256 u16 next = ohci_frame_no(ohci) + 1;
Alan Stern6a41b4d2012-10-01 10:32:15 -0400257 u16 frame = ed->last_iso + ed->interval;
Alan Sterna8693422013-09-24 15:46:45 -0400258 u16 length = ed->interval * (size - 1);
Alan Stern6a41b4d2012-10-01 10:32:15 -0400259
260 /* Behind the scheduling threshold? */
261 if (unlikely(tick_before(frame, next))) {
262
Alan Sterna8693422013-09-24 15:46:45 -0400263 /* URB_ISO_ASAP: Round up to the first available slot */
Alan Stern815fa7b2013-05-14 13:57:51 -0400264 if (urb->transfer_flags & URB_ISO_ASAP) {
Alan Stern6a41b4d2012-10-01 10:32:15 -0400265 frame += (next - frame + ed->interval - 1) &
266 -ed->interval;
267
268 /*
Alan Sterna8693422013-09-24 15:46:45 -0400269 * Not ASAP: Use the next slot in the stream,
270 * no matter what.
Alan Stern6a41b4d2012-10-01 10:32:15 -0400271 */
Alan Stern815fa7b2013-05-14 13:57:51 -0400272 } else {
Alan Stern815fa7b2013-05-14 13:57:51 -0400273 /*
274 * Some OHCI hardware doesn't handle late TDs
275 * correctly. After retiring them it proceeds
276 * to the next ED instead of the next TD.
277 * Therefore we have to omit the late TDs
278 * entirely.
279 */
280 urb_priv->td_cnt = DIV_ROUND_UP(
281 (u16) (next - frame),
282 ed->interval);
Alan Sterna8693422013-09-24 15:46:45 -0400283 if (urb_priv->td_cnt >= urb_priv->length) {
284 ++urb_priv->td_cnt; /* Mark it */
285 ohci_dbg(ohci, "iso underrun %p (%u+%u < %u)\n",
286 urb, frame, length,
287 next);
288 }
Alan Stern815fa7b2013-05-14 13:57:51 -0400289 }
Alan Stern6a41b4d2012-10-01 10:32:15 -0400290 }
291 urb->start_frame = frame;
Alan Sterna8693422013-09-24 15:46:45 -0400292 ed->last_iso = frame + length;
Alan Stern6a41b4d2012-10-01 10:32:15 -0400293 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294
295 /* fill the TDs and link them to the ed; and
296 * enable that part of the schedule, if needed
297 * and update count of queued periodic urbs
298 */
299 urb->hcpriv = urb_priv;
300 td_submit_urb (ohci, urb);
301
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302fail:
303 if (retval)
304 urb_free_priv (ohci, urb_priv);
305 spin_unlock_irqrestore (&ohci->lock, flags);
306 return retval;
307}
308
309/*
Alan Stern55d84962007-08-24 15:40:34 -0400310 * decouple the URB from the HC queues (TDs, urb_priv).
311 * reporting is always done
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312 * asynchronously, and we might be dealing with an urb that's
313 * partially transferred, or an ED with other urbs being unlinked.
314 */
Alan Sterne9df41c2007-08-08 11:48:02 -0400315static int ohci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700316{
317 struct ohci_hcd *ohci = hcd_to_ohci (hcd);
318 unsigned long flags;
Alan Sterne9df41c2007-08-08 11:48:02 -0400319 int rc;
Alan Stern8b3ab0e2014-07-18 16:25:49 -0400320 urb_priv_t *urb_priv;
David Brownelldd9048a2006-12-05 03:18:31 -0800321
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322 spin_lock_irqsave (&ohci->lock, flags);
Alan Sterne9df41c2007-08-08 11:48:02 -0400323 rc = usb_hcd_check_unlink_urb(hcd, urb, status);
Alan Stern8b3ab0e2014-07-18 16:25:49 -0400324 if (rc == 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325
326 /* Unless an IRQ completed the unlink while it was being
327 * handed to us, flag it for unlink and giveback, and force
328 * some upcoming INTR_SF to call finish_unlinks()
329 */
330 urb_priv = urb->hcpriv;
Alan Stern8b3ab0e2014-07-18 16:25:49 -0400331 if (urb_priv->ed->state == ED_OPER)
332 start_ed_unlink(ohci, urb_priv->ed);
333
334 if (ohci->rh_state != OHCI_RH_RUNNING) {
335 /* With HC dead, we can clean up right away */
Alan Sterncdb4dd12014-07-18 16:26:07 -0400336 ohci_work(ohci);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700337 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700338 }
339 spin_unlock_irqrestore (&ohci->lock, flags);
Alan Sterne9df41c2007-08-08 11:48:02 -0400340 return rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700341}
342
343/*-------------------------------------------------------------------------*/
344
345/* frees config/altsetting state for endpoints,
346 * including ED memory, dummy TD, and bulk/intr data toggle
347 */
348
349static void
350ohci_endpoint_disable (struct usb_hcd *hcd, struct usb_host_endpoint *ep)
351{
352 struct ohci_hcd *ohci = hcd_to_ohci (hcd);
353 unsigned long flags;
354 struct ed *ed = ep->hcpriv;
355 unsigned limit = 1000;
356
357 /* ASSERT: any requests/urbs are being unlinked */
358 /* ASSERT: nobody can be submitting urbs for this any more */
359
360 if (!ed)
361 return;
362
363rescan:
364 spin_lock_irqsave (&ohci->lock, flags);
365
Alan Sternb7463c72011-11-17 16:41:56 -0500366 if (ohci->rh_state != OHCI_RH_RUNNING) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367sanitize:
368 ed->state = ED_IDLE;
Alan Sterncdb4dd12014-07-18 16:26:07 -0400369 ohci_work(ohci);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700370 }
371
372 switch (ed->state) {
373 case ED_UNLINK: /* wait for hw to finish? */
374 /* major IRQ delivery trouble loses INTR_SF too... */
375 if (limit-- == 0) {
Mike Nuss89a0fd12007-08-01 13:24:30 -0700376 ohci_warn(ohci, "ED unlink timeout\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700377 goto sanitize;
378 }
379 spin_unlock_irqrestore (&ohci->lock, flags);
Nishanth Aravamudan22c43862005-08-15 11:30:11 -0700380 schedule_timeout_uninterruptible(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381 goto rescan;
382 case ED_IDLE: /* fully unlinked */
383 if (list_empty (&ed->td_list)) {
384 td_free (ohci, ed->dummy);
385 ed_free (ohci, ed);
386 break;
387 }
Gustavo A. R. Silvaf5a39082017-10-25 13:49:14 -0500388 /* fall through */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700389 default:
390 /* caller was supposed to have unlinked any requests;
391 * that's not our job. can't recover; must leak ed.
392 */
393 ohci_err (ohci, "leak ed %p (#%02x) state %d%s\n",
394 ed, ep->desc.bEndpointAddress, ed->state,
395 list_empty (&ed->td_list) ? "" : " (has tds)");
396 td_free (ohci, ed->dummy);
397 break;
398 }
399 ep->hcpriv = NULL;
400 spin_unlock_irqrestore (&ohci->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401}
402
403static int ohci_get_frame (struct usb_hcd *hcd)
404{
405 struct ohci_hcd *ohci = hcd_to_ohci (hcd);
406
407 return ohci_frame_no(ohci);
408}
409
410static void ohci_usb_reset (struct ohci_hcd *ohci)
411{
412 ohci->hc_control = ohci_readl (ohci, &ohci->regs->control);
413 ohci->hc_control &= OHCI_CTRL_RWC;
414 ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
Alan Sternb7463c72011-11-17 16:41:56 -0500415 ohci->rh_state = OHCI_RH_HALTED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416}
417
Aleksey Gorelov64a21d02006-08-08 17:24:08 -0700418/* ohci_shutdown forcibly disables IRQs and DMA, helping kexec and
David Brownellf4df0e32005-04-23 12:49:16 -0700419 * other cases where the next software may expect clean state from the
420 * "firmware". this is bus-neutral, unlike shutdown() methods.
421 */
Yoshihiro Shimodaa349b952019-08-27 12:51:50 +0900422static void _ohci_shutdown(struct usb_hcd *hcd)
David Brownellf4df0e32005-04-23 12:49:16 -0700423{
424 struct ohci_hcd *ohci;
425
Aleksey Gorelov64a21d02006-08-08 17:24:08 -0700426 ohci = hcd_to_ohci (hcd);
Alan Sternc6187592011-11-17 16:41:45 -0500427 ohci_writel(ohci, (u32) ~0, &ohci->regs->intrdisable);
Alan Stern3df71692010-09-10 16:37:05 -0400428
Alan Sternc6187592011-11-17 16:41:45 -0500429 /* Software reset, after which the controller goes into SUSPEND */
430 ohci_writel(ohci, OHCI_HCR, &ohci->regs->cmdstatus);
431 ohci_readl(ohci, &ohci->regs->cmdstatus); /* flush the writes */
432 udelay(10);
Alan Stern3df71692010-09-10 16:37:05 -0400433
Alan Sternc6187592011-11-17 16:41:45 -0500434 ohci_writel(ohci, ohci->fminterval, &ohci->regs->fminterval);
Alan Stern81e38332014-07-18 16:26:12 -0400435 ohci->rh_state = OHCI_RH_HALTED;
David Brownellf4df0e32005-04-23 12:49:16 -0700436}
437
Yoshihiro Shimodaa349b952019-08-27 12:51:50 +0900438static void ohci_shutdown(struct usb_hcd *hcd)
439{
440 struct ohci_hcd *ohci = hcd_to_ohci(hcd);
441 unsigned long flags;
442
443 spin_lock_irqsave(&ohci->lock, flags);
444 _ohci_shutdown(hcd);
445 spin_unlock_irqrestore(&ohci->lock, flags);
446}
447
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448/*-------------------------------------------------------------------------*
449 * HC functions
450 *-------------------------------------------------------------------------*/
451
452/* init memory, and kick BIOS/SMM off */
453
454static int ohci_init (struct ohci_hcd *ohci)
455{
456 int ret;
David Brownell6a9062f2006-01-23 15:28:07 -0800457 struct usb_hcd *hcd = ohci_to_hcd(ohci);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458
Alan Stern6f651262014-07-17 16:30:01 -0400459 /* Accept arbitrarily long scatter-gather lists */
Laurentiu Tudor2d7a3dc2019-05-29 13:28:43 +0300460 if (!hcd->localmem_pool)
Fredrik Noringd6c931e2018-03-09 18:34:34 +0100461 hcd->self.sg_tablesize = ~0;
Alan Stern6f651262014-07-17 16:30:01 -0400462
Dmitry Baryshkov1133cd82008-07-06 23:35:01 +0400463 if (distrust_firmware)
464 ohci->flags |= OHCI_QUIRK_HUB_POWER;
465
Alan Sternb7463c72011-11-17 16:41:56 -0500466 ohci->rh_state = OHCI_RH_HALTED;
David Brownell6a9062f2006-01-23 15:28:07 -0800467 ohci->regs = hcd->regs;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700468
David Brownell6a9062f2006-01-23 15:28:07 -0800469 /* REVISIT this BIOS handshake is now moved into PCI "quirks", and
470 * was never needed for most non-PCI systems ... remove the code?
471 */
472
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473#ifndef IR_DISABLE
474 /* SMM owns the HC? not for long! */
475 if (!no_handshake && ohci_readl (ohci,
476 &ohci->regs->control) & OHCI_CTRL_IR) {
477 u32 temp;
478
479 ohci_dbg (ohci, "USB HC TakeOver from BIOS/SMM\n");
480
481 /* this timeout is arbitrary. we make it long, so systems
482 * depending on usb keyboards may be usable even if the
483 * BIOS/SMM code seems pretty broken.
484 */
485 temp = 500; /* arbitrary: five seconds */
486
487 ohci_writel (ohci, OHCI_INTR_OC, &ohci->regs->intrenable);
488 ohci_writel (ohci, OHCI_OCR, &ohci->regs->cmdstatus);
489 while (ohci_readl (ohci, &ohci->regs->control) & OHCI_CTRL_IR) {
490 msleep (10);
491 if (--temp == 0) {
492 ohci_err (ohci, "USB HC takeover failed!"
493 " (BIOS/SMM bug)\n");
494 return -EBUSY;
495 }
496 }
497 ohci_usb_reset (ohci);
498 }
499#endif
500
501 /* Disable HC interrupts */
502 ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable);
David Brownell6a9062f2006-01-23 15:28:07 -0800503
504 /* flush the writes, and save key bits like RWC */
505 if (ohci_readl (ohci, &ohci->regs->control) & OHCI_CTRL_RWC)
506 ohci->hc_control |= OHCI_CTRL_RWC;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700507
David Brownellfdd13b32005-08-31 11:52:57 -0700508 /* Read the number of ports unless overridden */
509 if (ohci->num_ports == 0)
510 ohci->num_ports = roothub_a(ohci) & RH_A_NDP;
511
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512 if (ohci->hcca)
513 return 0;
514
Kees Cooke99e88a2017-10-16 14:43:17 -0700515 timer_setup(&ohci->io_watchdog, io_watchdog_func, 0);
Shigeru Yoshidab2685bd2018-02-02 13:51:39 +0800516 ohci->prev_frame_no = IO_WATCHDOG_OFF;
Alan Stern81e38332014-07-18 16:26:12 -0400517
Laurentiu Tudorb0310c22019-05-29 13:28:40 +0300518 if (hcd->localmem_pool)
Fredrik Noringff2437b2019-06-25 17:08:23 +0200519 ohci->hcca = gen_pool_dma_alloc_align(hcd->localmem_pool,
Laurentiu Tudorb0310c22019-05-29 13:28:40 +0300520 sizeof(*ohci->hcca),
Fredrik Noringff2437b2019-06-25 17:08:23 +0200521 &ohci->hcca_dma, 256);
Laurentiu Tudorb0310c22019-05-29 13:28:40 +0300522 else
523 ohci->hcca = dma_alloc_coherent(hcd->self.controller,
524 sizeof(*ohci->hcca),
525 &ohci->hcca_dma,
526 GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527 if (!ohci->hcca)
528 return -ENOMEM;
529
530 if ((ret = ohci_mem_init (ohci)) < 0)
David Brownell6a9062f2006-01-23 15:28:07 -0800531 ohci_stop (hcd);
532 else {
David Brownell6a9062f2006-01-23 15:28:07 -0800533 create_debug_files (ohci);
534 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700535
536 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537}
538
539/*-------------------------------------------------------------------------*/
540
541/* Start an OHCI controller, set the BUS operational
542 * resets USB and controller
David Brownelldd9048a2006-12-05 03:18:31 -0800543 * enable interrupts
Linus Torvalds1da177e2005-04-16 15:20:36 -0700544 */
545static int ohci_run (struct ohci_hcd *ohci)
546{
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400547 u32 mask, val;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548 int first = ohci->fminterval == 0;
David Brownell6a9062f2006-01-23 15:28:07 -0800549 struct usb_hcd *hcd = ohci_to_hcd(ohci);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550
Alan Sternb7463c72011-11-17 16:41:56 -0500551 ohci->rh_state = OHCI_RH_HALTED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552
553 /* boot firmware should have set this up (5.1.1.3.1) */
554 if (first) {
555
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400556 val = ohci_readl (ohci, &ohci->regs->fminterval);
557 ohci->fminterval = val & 0x3fff;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558 if (ohci->fminterval != FI)
559 ohci_dbg (ohci, "fminterval delta %d\n",
560 ohci->fminterval - FI);
561 ohci->fminterval |= FSMP (ohci->fminterval) << 16;
562 /* also: power/overcurrent flags in roothub.a */
563 }
564
Alan Stern6fd90862008-12-17 17:20:38 -0500565 /* Reset USB nearly "by the book". RemoteWakeupConnected has
566 * to be checked in case boot firmware (BIOS/SMM/...) has set up
567 * wakeup in a way the bus isn't aware of (e.g., legacy PCI PM).
568 * If the bus glue detected wakeup capability then it should
Alan Sternbcca06e2009-01-13 11:35:54 -0500569 * already be enabled; if so we'll just enable it again.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570 */
Alan Sternbcca06e2009-01-13 11:35:54 -0500571 if ((ohci->hc_control & OHCI_CTRL_RWC) != 0)
572 device_set_wakeup_capable(hcd->self.controller, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700573
574 switch (ohci->hc_control & OHCI_CTRL_HCFS) {
575 case OHCI_USB_OPER:
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400576 val = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577 break;
578 case OHCI_USB_SUSPEND:
579 case OHCI_USB_RESUME:
580 ohci->hc_control &= OHCI_CTRL_RWC;
581 ohci->hc_control |= OHCI_USB_RESUME;
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400582 val = 10 /* msec wait */;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583 break;
584 // case OHCI_USB_RESET:
585 default:
586 ohci->hc_control &= OHCI_CTRL_RWC;
587 ohci->hc_control |= OHCI_USB_RESET;
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400588 val = 50 /* msec wait */;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589 break;
590 }
591 ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
592 // flush the writes
593 (void) ohci_readl (ohci, &ohci->regs->control);
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400594 msleep(val);
Alan Stern383975d2007-05-04 11:52:40 -0400595
Linus Torvalds1da177e2005-04-16 15:20:36 -0700596 memset (ohci->hcca, 0, sizeof (struct ohci_hcca));
597
598 /* 2msec timelimit here means no irqs/preempt */
599 spin_lock_irq (&ohci->lock);
600
601retry:
602 /* HC Reset requires max 10 us delay */
603 ohci_writel (ohci, OHCI_HCR, &ohci->regs->cmdstatus);
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400604 val = 30; /* ... allow extra time */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700605 while ((ohci_readl (ohci, &ohci->regs->cmdstatus) & OHCI_HCR) != 0) {
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400606 if (--val == 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607 spin_unlock_irq (&ohci->lock);
608 ohci_err (ohci, "USB HC reset timed out!\n");
609 return -1;
610 }
611 udelay (1);
612 }
613
614 /* now we're in the SUSPEND state ... must go OPERATIONAL
615 * within 2msec else HC enters RESUME
616 *
617 * ... but some hardware won't init fmInterval "by the book"
618 * (SiS, OPTi ...), so reset again instead. SiS doesn't need
619 * this if we write fmInterval after we're OPERATIONAL.
620 * Unclear about ALi, ServerWorks, and others ... this could
621 * easily be a longstanding bug in chip init on Linux.
622 */
623 if (ohci->flags & OHCI_QUIRK_INITRESET) {
624 ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
625 // flush those writes
626 (void) ohci_readl (ohci, &ohci->regs->control);
627 }
628
629 /* Tell the controller where the control and bulk lists are
630 * The lists are empty now. */
631 ohci_writel (ohci, 0, &ohci->regs->ed_controlhead);
632 ohci_writel (ohci, 0, &ohci->regs->ed_bulkhead);
633
634 /* a reset clears this */
635 ohci_writel (ohci, (u32) ohci->hcca_dma, &ohci->regs->hcca);
636
637 periodic_reinit (ohci);
638
639 /* some OHCI implementations are finicky about how they init.
640 * bogus values here mean not even enumeration could work.
641 */
642 if ((ohci_readl (ohci, &ohci->regs->fminterval) & 0x3fff0000) == 0
643 || !ohci_readl (ohci, &ohci->regs->periodicstart)) {
644 if (!(ohci->flags & OHCI_QUIRK_INITRESET)) {
645 ohci->flags |= OHCI_QUIRK_INITRESET;
646 ohci_dbg (ohci, "enabling initreset quirk\n");
647 goto retry;
648 }
649 spin_unlock_irq (&ohci->lock);
650 ohci_err (ohci, "init err (%08x %04x)\n",
651 ohci_readl (ohci, &ohci->regs->fminterval),
652 ohci_readl (ohci, &ohci->regs->periodicstart));
653 return -EOVERFLOW;
654 }
655
Petr Mladek37ebb542014-09-19 17:32:23 +0200656 /* use rhsc irqs after hub_wq is allocated */
Alan Stern541c7d42010-06-22 16:39:10 -0400657 set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
David Brownelld4139842006-08-04 11:31:55 -0700658 hcd->uses_new_polling = 1;
659
660 /* start controller operations */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661 ohci->hc_control &= OHCI_CTRL_RWC;
David Brownelld4139842006-08-04 11:31:55 -0700662 ohci->hc_control |= OHCI_CONTROL_INIT | OHCI_USB_OPER;
663 ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
Alan Sternb7463c72011-11-17 16:41:56 -0500664 ohci->rh_state = OHCI_RH_RUNNING;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700665
666 /* wake on ConnectStatusChange, matching external hubs */
667 ohci_writel (ohci, RH_HS_DRWE, &ohci->regs->roothub.status);
668
669 /* Choose the interrupts we care about now, others later on demand */
670 mask = OHCI_INTR_INIT;
David Brownelld4139842006-08-04 11:31:55 -0700671 ohci_writel (ohci, ~0, &ohci->regs->intrstatus);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672 ohci_writel (ohci, mask, &ohci->regs->intrenable);
673
674 /* handle root hub init quirks ... */
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400675 val = roothub_a (ohci);
676 val &= ~(RH_A_PSM | RH_A_OCPM);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677 if (ohci->flags & OHCI_QUIRK_SUPERIO) {
678 /* NSC 87560 and maybe others */
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400679 val |= RH_A_NOCP;
680 val &= ~(RH_A_POTPGT | RH_A_NPS);
681 ohci_writel (ohci, val, &ohci->regs->roothub.a);
Dmitry Baryshkov1133cd82008-07-06 23:35:01 +0400682 } else if ((ohci->flags & OHCI_QUIRK_AMD756) ||
683 (ohci->flags & OHCI_QUIRK_HUB_POWER)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684 /* hub power always on; required for AMD-756 and some
685 * Mac platforms. ganged overcurrent reporting, if any.
686 */
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400687 val |= RH_A_NPS;
688 ohci_writel (ohci, val, &ohci->regs->roothub.a);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689 }
690 ohci_writel (ohci, RH_HS_LPSC, &ohci->regs->roothub.status);
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400691 ohci_writel (ohci, (val & RH_A_NPS) ? 0 : RH_B_PPCM,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692 &ohci->regs->roothub.b);
693 // flush those writes
694 (void) ohci_readl (ohci, &ohci->regs->control);
695
David Brownelld4139842006-08-04 11:31:55 -0700696 ohci->next_statechange = jiffies + STATECHANGE_DELAY;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700697 spin_unlock_irq (&ohci->lock);
698
699 // POTPGT delay is bits 24-31, in 2 ms units.
H Hartley Sweeten96f90a82009-04-22 16:18:59 -0400700 mdelay ((val >> 23) & 0x1fe);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701
Alan Stern256dbcd2014-07-17 16:32:26 -0400702 ohci_dump(ohci);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700703
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704 return 0;
705}
706
Manjunath Goudar95e44d42013-05-28 18:34:49 +0530707/* ohci_setup routine for generic controller initialization */
708
709int ohci_setup(struct usb_hcd *hcd)
710{
711 struct ohci_hcd *ohci = hcd_to_ohci(hcd);
712
713 ohci_hcd_init(ohci);
714
715 return ohci_init(ohci);
716}
717EXPORT_SYMBOL_GPL(ohci_setup);
718
719/* ohci_start routine for generic controller start of all OHCI bus glue */
720static int ohci_start(struct usb_hcd *hcd)
721{
722 struct ohci_hcd *ohci = hcd_to_ohci(hcd);
723 int ret;
724
725 ret = ohci_run(ohci);
726 if (ret < 0) {
727 ohci_err(ohci, "can't start\n");
728 ohci_stop(hcd);
729 }
730 return ret;
731}
732
Linus Torvalds1da177e2005-04-16 15:20:36 -0700733/*-------------------------------------------------------------------------*/
734
Alan Stern81e38332014-07-18 16:26:12 -0400735/*
736 * Some OHCI controllers are known to lose track of completed TDs. They
737 * don't add the TDs to the hardware done queue, which means we never see
738 * them as being completed.
739 *
740 * This watchdog routine checks for such problems. Without some way to
741 * tell when those TDs have completed, we would never take their EDs off
742 * the unlink list. As a result, URBs could never be dequeued and
743 * endpoints could never be released.
744 */
Kees Cooke99e88a2017-10-16 14:43:17 -0700745static void io_watchdog_func(struct timer_list *t)
Alan Stern81e38332014-07-18 16:26:12 -0400746{
Kees Cooke99e88a2017-10-16 14:43:17 -0700747 struct ohci_hcd *ohci = from_timer(ohci, t, io_watchdog);
Alan Stern81e38332014-07-18 16:26:12 -0400748 bool takeback_all_pending = false;
749 u32 status;
750 u32 head;
751 struct ed *ed;
752 struct td *td, *td_start, *td_next;
Shigeru Yoshidab2685bd2018-02-02 13:51:39 +0800753 unsigned frame_no, prev_frame_no = IO_WATCHDOG_OFF;
Alan Stern81e38332014-07-18 16:26:12 -0400754 unsigned long flags;
755
756 spin_lock_irqsave(&ohci->lock, flags);
757
758 /*
759 * One way to lose track of completed TDs is if the controller
760 * never writes back the done queue head. If it hasn't been
761 * written back since the last time this function ran and if it
762 * was non-empty at that time, something is badly wrong with the
763 * hardware.
764 */
765 status = ohci_readl(ohci, &ohci->regs->intrstatus);
766 if (!(status & OHCI_INTR_WDH) && ohci->wdh_cnt == ohci->prev_wdh_cnt) {
767 if (ohci->prev_donehead) {
768 ohci_err(ohci, "HcDoneHead not written back; disabled\n");
Alan Stern499b3802014-07-18 16:26:17 -0400769 died:
Alan Stern81e38332014-07-18 16:26:12 -0400770 usb_hc_died(ohci_to_hcd(ohci));
771 ohci_dump(ohci);
Yoshihiro Shimodaa349b952019-08-27 12:51:50 +0900772 _ohci_shutdown(ohci_to_hcd(ohci));
Alan Stern81e38332014-07-18 16:26:12 -0400773 goto done;
774 } else {
775 /* No write back because the done queue was empty */
776 takeback_all_pending = true;
777 }
778 }
779
780 /* Check every ED which might have pending TDs */
781 list_for_each_entry(ed, &ohci->eds_in_use, in_use_list) {
782 if (ed->pending_td) {
783 if (takeback_all_pending ||
784 OKAY_TO_TAKEBACK(ohci, ed)) {
785 unsigned tmp = hc32_to_cpu(ohci, ed->hwINFO);
786
787 ohci_dbg(ohci, "takeback pending TD for dev %d ep 0x%x\n",
788 0x007f & tmp,
789 (0x000f & (tmp >> 7)) +
790 ((tmp & ED_IN) >> 5));
791 add_to_done_list(ohci, ed->pending_td);
792 }
793 }
794
795 /* Starting from the latest pending TD, */
796 td = ed->pending_td;
797
798 /* or the last TD on the done list, */
799 if (!td) {
800 list_for_each_entry(td_next, &ed->td_list, td_list) {
801 if (!td_next->next_dl_td)
802 break;
803 td = td_next;
804 }
805 }
806
807 /* find the last TD processed by the controller. */
Mark Rutland6aa7de02017-10-23 14:07:29 -0700808 head = hc32_to_cpu(ohci, READ_ONCE(ed->hwHeadP)) & TD_MASK;
Alan Stern81e38332014-07-18 16:26:12 -0400809 td_start = td;
810 td_next = list_prepare_entry(td, &ed->td_list, td_list);
811 list_for_each_entry_continue(td_next, &ed->td_list, td_list) {
812 if (head == (u32) td_next->td_dma)
813 break;
814 td = td_next; /* head pointer has passed this TD */
815 }
816 if (td != td_start) {
817 /*
818 * In case a WDH cycle is in progress, we will wait
819 * for the next two cycles to complete before assuming
820 * this TD will never get on the done queue.
821 */
822 ed->takeback_wdh_cnt = ohci->wdh_cnt + 2;
823 ed->pending_td = td;
824 }
825 }
826
827 ohci_work(ohci);
828
829 if (ohci->rh_state == OHCI_RH_RUNNING) {
Alan Stern499b3802014-07-18 16:26:17 -0400830
831 /*
832 * Sometimes a controller just stops working. We can tell
833 * by checking that the frame counter has advanced since
834 * the last time we ran.
835 *
836 * But be careful: Some controllers violate the spec by
837 * stopping their frame counter when no ports are active.
838 */
839 frame_no = ohci_frame_no(ohci);
840 if (frame_no == ohci->prev_frame_no) {
841 int active_cnt = 0;
842 int i;
843 unsigned tmp;
844
845 for (i = 0; i < ohci->num_ports; ++i) {
846 tmp = roothub_portstatus(ohci, i);
847 /* Enabled and not suspended? */
848 if ((tmp & RH_PS_PES) && !(tmp & RH_PS_PSS))
849 ++active_cnt;
850 }
851
852 if (active_cnt > 0) {
853 ohci_err(ohci, "frame counter not updating; disabled\n");
854 goto died;
855 }
856 }
Alan Stern81e38332014-07-18 16:26:12 -0400857 if (!list_empty(&ohci->eds_in_use)) {
Shigeru Yoshidab2685bd2018-02-02 13:51:39 +0800858 prev_frame_no = frame_no;
Alan Stern81e38332014-07-18 16:26:12 -0400859 ohci->prev_wdh_cnt = ohci->wdh_cnt;
860 ohci->prev_donehead = ohci_readl(ohci,
861 &ohci->regs->donehead);
862 mod_timer(&ohci->io_watchdog,
863 jiffies + IO_WATCHDOG_DELAY);
864 }
865 }
866
867 done:
Shigeru Yoshidab2685bd2018-02-02 13:51:39 +0800868 ohci->prev_frame_no = prev_frame_no;
Alan Stern81e38332014-07-18 16:26:12 -0400869 spin_unlock_irqrestore(&ohci->lock, flags);
870}
871
Linus Torvalds1da177e2005-04-16 15:20:36 -0700872/* an interrupt happens */
873
David Howells7d12e782006-10-05 14:55:46 +0100874static irqreturn_t ohci_irq (struct usb_hcd *hcd)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875{
876 struct ohci_hcd *ohci = hcd_to_ohci (hcd);
877 struct ohci_regs __iomem *regs = ohci->regs;
Mike Nuss89a0fd12007-08-01 13:24:30 -0700878 int ints;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700879
Benjamin Herrenschmidt565227c2007-12-06 13:28:25 -0800880 /* Read interrupt status (and flush pending writes). We ignore the
881 * optimization of checking the LSB of hcca->done_head; it doesn't
882 * work on all systems (edge triggering for OHCI can be a factor).
Mike Nuss89a0fd12007-08-01 13:24:30 -0700883 */
Benjamin Herrenschmidt565227c2007-12-06 13:28:25 -0800884 ints = ohci_readl(ohci, &regs->intrstatus);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885
Benjamin Herrenschmidt565227c2007-12-06 13:28:25 -0800886 /* Check for an all 1's result which is a typical consequence
887 * of dead, unclocked, or unplugged (CardBus...) devices
888 */
889 if (ints == ~(u32)0) {
Alan Sternb7463c72011-11-17 16:41:56 -0500890 ohci->rh_state = OHCI_RH_HALTED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700891 ohci_dbg (ohci, "device removed!\n");
Alan Stern69fff592011-05-17 17:27:12 -0400892 usb_hc_died(hcd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893 return IRQ_HANDLED;
Benjamin Herrenschmidt565227c2007-12-06 13:28:25 -0800894 }
895
896 /* We only care about interrupts that are enabled */
897 ints &= ohci_readl(ohci, &regs->intrenable);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898
899 /* interrupt for some other device? */
Alan Sternb7463c72011-11-17 16:41:56 -0500900 if (ints == 0 || unlikely(ohci->rh_state == OHCI_RH_HALTED))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 return IRQ_NOTMINE;
David Brownelld4139842006-08-04 11:31:55 -0700902
Linus Torvalds1da177e2005-04-16 15:20:36 -0700903 if (ints & OHCI_INTR_UE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700904 // e.g. due to PCI Master/Target Abort
Mike Nuss89a0fd12007-08-01 13:24:30 -0700905 if (quirk_nec(ohci)) {
Michael Hanselmannd576bb92007-05-31 23:34:27 +0200906 /* Workaround for a silicon bug in some NEC chips used
907 * in Apple's PowerBooks. Adapted from Darwin code.
908 */
909 ohci_err (ohci, "OHCI Unrecoverable Error, scheduling NEC chip restart\n");
910
911 ohci_writel (ohci, OHCI_INTR_UE, &regs->intrdisable);
912
913 schedule_work (&ohci->nec_work);
914 } else {
Michael Hanselmannd576bb92007-05-31 23:34:27 +0200915 ohci_err (ohci, "OHCI Unrecoverable Error, disabled\n");
Alan Sternb7463c72011-11-17 16:41:56 -0500916 ohci->rh_state = OHCI_RH_HALTED;
Alan Stern69fff592011-05-17 17:27:12 -0400917 usb_hc_died(hcd);
Michael Hanselmannd576bb92007-05-31 23:34:27 +0200918 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919
Alan Stern256dbcd2014-07-17 16:32:26 -0400920 ohci_dump(ohci);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921 ohci_usb_reset (ohci);
922 }
923
Alan Stern583cead2006-10-24 12:04:22 -0400924 if (ints & OHCI_INTR_RHSC) {
Oliver Neukumd2c42542013-11-18 13:22:58 +0100925 ohci_dbg(ohci, "rhsc\n");
Alan Stern583cead2006-10-24 12:04:22 -0400926 ohci->next_statechange = jiffies + STATECHANGE_DELAY;
927 ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC,
928 &regs->intrstatus);
Alan Stern052ac012006-10-27 10:33:11 -0400929
930 /* NOTE: Vendors didn't always make the same implementation
931 * choices for RHSC. Many followed the spec; RHSC triggers
932 * on an edge, like setting and maybe clearing a port status
933 * change bit. With others it's level-triggered, active
Petr Mladek37ebb542014-09-19 17:32:23 +0200934 * until hub_wq clears all the port status change bits. We'll
935 * always disable it here and rely on polling until hub_wq
Alan Stern052ac012006-10-27 10:33:11 -0400936 * re-enables it.
937 */
938 ohci_writel(ohci, OHCI_INTR_RHSC, &regs->intrdisable);
Alan Stern583cead2006-10-24 12:04:22 -0400939 usb_hcd_poll_rh_status(hcd);
940 }
941
942 /* For connect and disconnect events, we expect the controller
943 * to turn on RHSC along with RD. But for remote wakeup events
944 * this might not happen.
945 */
946 else if (ints & OHCI_INTR_RD) {
Oliver Neukumd2c42542013-11-18 13:22:58 +0100947 ohci_dbg(ohci, "resume detect\n");
Alan Stern583cead2006-10-24 12:04:22 -0400948 ohci_writel(ohci, OHCI_INTR_RD, &regs->intrstatus);
Alan Stern541c7d42010-06-22 16:39:10 -0400949 set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
Alan Stern8d1a2432006-09-26 14:46:16 -0400950 if (ohci->autostop) {
951 spin_lock (&ohci->lock);
952 ohci_rh_resume (ohci);
953 spin_unlock (&ohci->lock);
954 } else
David Brownellf197b2c2005-09-22 22:42:53 -0700955 usb_hcd_resume_root_hub(hcd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700956 }
957
Alan Sternc6fcb852014-07-18 16:25:59 -0400958 spin_lock(&ohci->lock);
959 if (ints & OHCI_INTR_WDH)
960 update_done_list(ohci);
David Brownelldd9048a2006-12-05 03:18:31 -0800961
Linus Torvalds1da177e2005-04-16 15:20:36 -0700962 /* could track INTR_SO to reduce available PCI/... bandwidth */
963
964 /* handle any pending URB/ED unlinks, leaving INTR_SF enabled
965 * when there's still unlinking to be done (next frame).
966 */
Alan Sterncdb4dd12014-07-18 16:26:07 -0400967 ohci_work(ohci);
Alan Stern95d9a012014-07-18 16:25:36 -0400968 if ((ints & OHCI_INTR_SF) != 0 && !ohci->ed_rm_list
Alan Sternb7463c72011-11-17 16:41:56 -0500969 && ohci->rh_state == OHCI_RH_RUNNING)
David Brownelldd9048a2006-12-05 03:18:31 -0800970 ohci_writel (ohci, OHCI_INTR_SF, &regs->intrdisable);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700971
Alan Sternb7463c72011-11-17 16:41:56 -0500972 if (ohci->rh_state == OHCI_RH_RUNNING) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700973 ohci_writel (ohci, ints, &regs->intrstatus);
Alan Stern81e38332014-07-18 16:26:12 -0400974 if (ints & OHCI_INTR_WDH)
975 ++ohci->wdh_cnt;
976
David Brownelldd9048a2006-12-05 03:18:31 -0800977 ohci_writel (ohci, OHCI_INTR_MIE, &regs->intrenable);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700978 // flush those writes
979 (void) ohci_readl (ohci, &ohci->regs->control);
980 }
Alan Sternc6fcb852014-07-18 16:25:59 -0400981 spin_unlock(&ohci->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982
983 return IRQ_HANDLED;
984}
985
986/*-------------------------------------------------------------------------*/
987
988static void ohci_stop (struct usb_hcd *hcd)
David Brownelldd9048a2006-12-05 03:18:31 -0800989{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700990 struct ohci_hcd *ohci = hcd_to_ohci (hcd);
991
Alan Stern256dbcd2014-07-17 16:32:26 -0400992 ohci_dump(ohci);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700993
Tejun Heo569ff2d2010-12-24 16:14:20 +0100994 if (quirk_nec(ohci))
Tejun Heo43829732012-08-20 14:51:24 -0700995 flush_work(&ohci->nec_work);
Alan Stern81e38332014-07-18 16:26:12 -0400996 del_timer_sync(&ohci->io_watchdog);
Shigeru Yoshidab2685bd2018-02-02 13:51:39 +0800997 ohci->prev_frame_no = IO_WATCHDOG_OFF;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998
Linus Torvalds1da177e2005-04-16 15:20:36 -0700999 ohci_writel (ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable);
caizhiyong435932f2013-07-26 07:12:14 +00001000 ohci_usb_reset(ohci);
Pete Zaitcev71795c12006-09-18 22:57:22 -07001001 free_irq(hcd->irq, hcd);
Felipe Balbicd704692012-02-29 16:46:23 +02001002 hcd->irq = 0;
Pete Zaitcev71795c12006-09-18 22:57:22 -07001003
Libin Yangab1666c2008-08-08 15:03:31 +08001004 if (quirk_amdiso(ohci))
Andiry Xuad935622011-03-01 14:57:05 +08001005 usb_amd_dev_put();
Mike Nuss89a0fd12007-08-01 13:24:30 -07001006
Linus Torvalds1da177e2005-04-16 15:20:36 -07001007 remove_debug_files (ohci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008 ohci_mem_cleanup (ohci);
1009 if (ohci->hcca) {
Laurentiu Tudorb0310c22019-05-29 13:28:40 +03001010 if (hcd->localmem_pool)
1011 gen_pool_free(hcd->localmem_pool,
1012 (unsigned long)ohci->hcca,
1013 sizeof(*ohci->hcca));
1014 else
1015 dma_free_coherent(hcd->self.controller,
1016 sizeof(*ohci->hcca),
1017 ohci->hcca, ohci->hcca_dma);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018 ohci->hcca = NULL;
1019 ohci->hcca_dma = 0;
1020 }
1021}
1022
1023/*-------------------------------------------------------------------------*/
1024
yuan linyu2c93e792017-02-25 19:20:55 +08001025#if defined(CONFIG_PM) || defined(CONFIG_USB_PCI)
David Brownellda6fb572007-10-24 17:23:42 -07001026
Linus Torvalds1da177e2005-04-16 15:20:36 -07001027/* must not be called from interrupt context */
Manjunath Goudar95e44d42013-05-28 18:34:49 +05301028int ohci_restart(struct ohci_hcd *ohci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029{
1030 int temp;
1031 int i;
1032 struct urb_priv *priv;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001033
Manjunath Goudar95e44d42013-05-28 18:34:49 +05301034 ohci_init(ohci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035 spin_lock_irq(&ohci->lock);
Alan Sternb7463c72011-11-17 16:41:56 -05001036 ohci->rh_state = OHCI_RH_HALTED;
Michael Hanselmannd576bb92007-05-31 23:34:27 +02001037
1038 /* Recycle any "live" eds/tds (and urbs). */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039 if (!list_empty (&ohci->pending))
1040 ohci_dbg(ohci, "abort schedule...\n");
1041 list_for_each_entry (priv, &ohci->pending, pending) {
1042 struct urb *urb = priv->td[0]->urb;
1043 struct ed *ed = priv->ed;
1044
1045 switch (ed->state) {
1046 case ED_OPER:
1047 ed->state = ED_UNLINK;
1048 ed->hwINFO |= cpu_to_hc32(ohci, ED_DEQUEUE);
1049 ed_deschedule (ohci, ed);
1050
1051 ed->ed_next = ohci->ed_rm_list;
1052 ed->ed_prev = NULL;
1053 ohci->ed_rm_list = ed;
1054 /* FALLTHROUGH */
1055 case ED_UNLINK:
1056 break;
1057 default:
1058 ohci_dbg(ohci, "bogus ed %p state %d\n",
1059 ed, ed->state);
1060 }
1061
Alan Stern55d84962007-08-24 15:40:34 -04001062 if (!urb->unlinked)
1063 urb->unlinked = -ESHUTDOWN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064 }
Alan Sterncdb4dd12014-07-18 16:26:07 -04001065 ohci_work(ohci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066 spin_unlock_irq(&ohci->lock);
1067
1068 /* paranoia, in case that didn't work: */
1069
1070 /* empty the interrupt branches */
1071 for (i = 0; i < NUM_INTS; i++) ohci->load [i] = 0;
1072 for (i = 0; i < NUM_INTS; i++) ohci->hcca->int_table [i] = 0;
David Brownelldd9048a2006-12-05 03:18:31 -08001073
Linus Torvalds1da177e2005-04-16 15:20:36 -07001074 /* no EDs to remove */
1075 ohci->ed_rm_list = NULL;
1076
David Brownelldd9048a2006-12-05 03:18:31 -08001077 /* empty control and bulk lists */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078 ohci->ed_controltail = NULL;
1079 ohci->ed_bulktail = NULL;
1080
1081 if ((temp = ohci_run (ohci)) < 0) {
1082 ohci_err (ohci, "can't restart, %d\n", temp);
1083 return temp;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 }
Alan Stern383975d2007-05-04 11:52:40 -04001085 ohci_dbg(ohci, "restart complete\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086 return 0;
1087}
Manjunath Goudar95e44d42013-05-28 18:34:49 +05301088EXPORT_SYMBOL_GPL(ohci_restart);
Michael Hanselmannd576bb92007-05-31 23:34:27 +02001089
David Brownellda6fb572007-10-24 17:23:42 -07001090#endif
1091
Florian Fainellicd1965d2012-10-08 15:11:27 +02001092#ifdef CONFIG_PM
1093
Manjunath Goudar95e44d42013-05-28 18:34:49 +05301094int ohci_suspend(struct usb_hcd *hcd, bool do_wakeup)
Florian Fainellicd1965d2012-10-08 15:11:27 +02001095{
1096 struct ohci_hcd *ohci = hcd_to_ohci (hcd);
1097 unsigned long flags;
Majunath Goudare1bffbf2013-11-13 17:40:16 +05301098 int rc = 0;
Florian Fainellicd1965d2012-10-08 15:11:27 +02001099
Florian Fainellid4ae47d2012-10-08 15:11:28 +02001100 /* Disable irq emission and mark HW unaccessible. Use
Florian Fainellicd1965d2012-10-08 15:11:27 +02001101 * the spinlock to properly synchronize with possible pending
1102 * RH suspend or resume activity.
1103 */
1104 spin_lock_irqsave (&ohci->lock, flags);
Florian Fainellicd1965d2012-10-08 15:11:27 +02001105 ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrdisable);
1106 (void)ohci_readl(ohci, &ohci->regs->intrdisable);
1107
1108 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
Florian Fainellicd1965d2012-10-08 15:11:27 +02001109 spin_unlock_irqrestore (&ohci->lock, flags);
1110
Majunath Goudare1bffbf2013-11-13 17:40:16 +05301111 synchronize_irq(hcd->irq);
1112
1113 if (do_wakeup && HCD_WAKEUP_PENDING(hcd)) {
1114 ohci_resume(hcd, false);
1115 rc = -EBUSY;
1116 }
1117 return rc;
Florian Fainellicd1965d2012-10-08 15:11:27 +02001118}
Manjunath Goudar95e44d42013-05-28 18:34:49 +05301119EXPORT_SYMBOL_GPL(ohci_suspend);
Florian Fainellicd1965d2012-10-08 15:11:27 +02001120
1121
Manjunath Goudar95e44d42013-05-28 18:34:49 +05301122int ohci_resume(struct usb_hcd *hcd, bool hibernated)
Florian Fainellicd1965d2012-10-08 15:11:27 +02001123{
Florian Fainellicfa49b42012-10-08 15:11:29 +02001124 struct ohci_hcd *ohci = hcd_to_ohci(hcd);
1125 int port;
1126 bool need_reinit = false;
1127
Florian Fainellicd1965d2012-10-08 15:11:27 +02001128 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
1129
1130 /* Make sure resume from hibernation re-enumerates everything */
1131 if (hibernated)
Florian Fainellicfa49b42012-10-08 15:11:29 +02001132 ohci_usb_reset(ohci);
Florian Fainellicd1965d2012-10-08 15:11:27 +02001133
Florian Fainellicfa49b42012-10-08 15:11:29 +02001134 /* See if the controller is already running or has been reset */
1135 ohci->hc_control = ohci_readl(ohci, &ohci->regs->control);
1136 if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) {
1137 need_reinit = true;
1138 } else {
1139 switch (ohci->hc_control & OHCI_CTRL_HCFS) {
1140 case OHCI_USB_OPER:
1141 case OHCI_USB_RESET:
1142 need_reinit = true;
1143 }
1144 }
1145
1146 /* If needed, reinitialize and suspend the root hub */
1147 if (need_reinit) {
1148 spin_lock_irq(&ohci->lock);
1149 ohci_rh_resume(ohci);
1150 ohci_rh_suspend(ohci, 0);
1151 spin_unlock_irq(&ohci->lock);
1152 }
1153
1154 /* Normally just turn on port power and enable interrupts */
1155 else {
1156 ohci_dbg(ohci, "powerup ports\n");
1157 for (port = 0; port < ohci->num_ports; port++)
1158 ohci_writel(ohci, RH_PS_PPS,
1159 &ohci->regs->roothub.portstatus[port]);
1160
1161 ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrenable);
1162 ohci_readl(ohci, &ohci->regs->intrenable);
1163 msleep(20);
1164 }
1165
1166 usb_hcd_resume_root_hub(hcd);
1167
Florian Fainellicd1965d2012-10-08 15:11:27 +02001168 return 0;
1169}
Manjunath Goudar95e44d42013-05-28 18:34:49 +05301170EXPORT_SYMBOL_GPL(ohci_resume);
Florian Fainellicd1965d2012-10-08 15:11:27 +02001171
1172#endif
1173
Michael Hanselmannd576bb92007-05-31 23:34:27 +02001174/*-------------------------------------------------------------------------*/
1175
Manjunath Goudar95e44d42013-05-28 18:34:49 +05301176/*
1177 * Generic structure: This gets copied for platform drivers so that
1178 * individual entries can be overridden as needed.
1179 */
1180
1181static const struct hc_driver ohci_hc_driver = {
1182 .description = hcd_name,
1183 .product_desc = "OHCI Host Controller",
1184 .hcd_priv_size = sizeof(struct ohci_hcd),
1185
1186 /*
1187 * generic hardware linkage
1188 */
1189 .irq = ohci_irq,
Christoph Hellwig7b81cb62019-08-16 08:24:32 +02001190 .flags = HCD_MEMORY | HCD_DMA | HCD_USB11,
Manjunath Goudar95e44d42013-05-28 18:34:49 +05301191
1192 /*
1193 * basic lifecycle operations
1194 */
1195 .reset = ohci_setup,
1196 .start = ohci_start,
1197 .stop = ohci_stop,
1198 .shutdown = ohci_shutdown,
1199
1200 /*
1201 * managing i/o requests and associated device resources
1202 */
1203 .urb_enqueue = ohci_urb_enqueue,
1204 .urb_dequeue = ohci_urb_dequeue,
1205 .endpoint_disable = ohci_endpoint_disable,
1206
1207 /*
1208 * scheduling support
1209 */
1210 .get_frame_number = ohci_get_frame,
1211
1212 /*
1213 * root hub support
1214 */
1215 .hub_status_data = ohci_hub_status_data,
1216 .hub_control = ohci_hub_control,
1217#ifdef CONFIG_PM
1218 .bus_suspend = ohci_bus_suspend,
1219 .bus_resume = ohci_bus_resume,
1220#endif
1221 .start_port_reset = ohci_start_port_reset,
1222};
1223
1224void ohci_init_driver(struct hc_driver *drv,
1225 const struct ohci_driver_overrides *over)
1226{
1227 /* Copy the generic table to drv and then apply the overrides */
1228 *drv = ohci_hc_driver;
1229
Kevin Hilmanc80ad6d2013-09-27 08:10:32 -07001230 if (over) {
1231 drv->product_desc = over->product_desc;
1232 drv->hcd_priv_size += over->extra_priv_size;
1233 if (over->reset)
1234 drv->reset = over->reset;
1235 }
Manjunath Goudar95e44d42013-05-28 18:34:49 +05301236}
1237EXPORT_SYMBOL_GPL(ohci_init_driver);
1238
1239/*-------------------------------------------------------------------------*/
1240
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241MODULE_AUTHOR (DRIVER_AUTHOR);
Alan Stern2b70f072008-10-02 11:47:15 -04001242MODULE_DESCRIPTION(DRIVER_DESC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001243MODULE_LICENSE ("GPL");
1244
Eric Miao6381fad2008-06-02 10:05:30 +08001245#if defined(CONFIG_ARCH_SA1100) && defined(CONFIG_SA1111)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001246#include "ohci-sa1111.c"
Sylvain Munaut5e16fab2006-12-13 21:09:54 +01001247#define SA1111_DRIVER ohci_hcd_sa1111_driver
Linus Torvalds1da177e2005-04-16 15:20:36 -07001248#endif
1249
Sylvain Munaut495a6782006-12-13 21:09:55 +01001250#ifdef CONFIG_USB_OHCI_HCD_PPC_OF
1251#include "ohci-ppc-of.c"
1252#define OF_PLATFORM_DRIVER ohci_hcd_ppc_of_driver
1253#endif
1254
Geoff Levand6a6c9572007-01-15 20:12:10 -08001255#ifdef CONFIG_PPC_PS3
1256#include "ohci-ps3.c"
Geoff Levand7a4eb7f2007-06-05 20:04:35 -07001257#define PS3_SYSTEM_BUS_DRIVER ps3_ohci_driver
Geoff Levand6a6c9572007-01-15 20:12:10 -08001258#endif
1259
Magnus Dammf54aab62008-01-23 15:58:46 +09001260#ifdef CONFIG_MFD_SM501
1261#include "ohci-sm501.c"
Ben Dooks3ee38d82008-06-08 17:20:11 +01001262#define SM501_OHCI_DRIVER ohci_hcd_sm501_driver
Magnus Dammf54aab62008-01-23 15:58:46 +09001263#endif
1264
Dmitry Baryshkov78c73412008-10-08 16:14:23 +04001265#ifdef CONFIG_MFD_TC6393XB
1266#include "ohci-tmio.c"
1267#define TMIO_OHCI_DRIVER ohci_hcd_tmio_driver
1268#endif
1269
Sylvain Munaut5e16fab2006-12-13 21:09:54 +01001270static int __init ohci_hcd_mod_init(void)
1271{
1272 int retval = 0;
Sylvain Munaut5e16fab2006-12-13 21:09:54 +01001273
1274 if (usb_disabled())
1275 return -ENODEV;
1276
Alan Stern2b70f072008-10-02 11:47:15 -04001277 printk(KERN_INFO "%s: " DRIVER_DESC "\n", hcd_name);
Alexey Dobriyan5b5e0922017-02-27 14:30:02 -08001278 pr_debug ("%s: block sizes: ed %zd td %zd\n", hcd_name,
Sylvain Munaut5e16fab2006-12-13 21:09:54 +01001279 sizeof (struct ed), sizeof (struct td));
Alan Stern9beeee62008-10-02 11:48:13 -04001280 set_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
Sylvain Munaut5e16fab2006-12-13 21:09:54 +01001281
Greg Kroah-Hartman485f4f32009-04-24 15:14:38 -07001282 ohci_debug_root = debugfs_create_dir("ohci", usb_debug_root);
Tony Jones684c19e2007-09-11 14:07:31 -07001283
Geoff Levand6a6c9572007-01-15 20:12:10 -08001284#ifdef PS3_SYSTEM_BUS_DRIVER
Geoff Levand7a4eb7f2007-06-05 20:04:35 -07001285 retval = ps3_ohci_driver_register(&PS3_SYSTEM_BUS_DRIVER);
1286 if (retval < 0)
1287 goto error_ps3;
Geoff Levand6a6c9572007-01-15 20:12:10 -08001288#endif
1289
Sylvain Munaut495a6782006-12-13 21:09:55 +01001290#ifdef OF_PLATFORM_DRIVER
Grant Likelyd35fb642011-02-22 21:08:34 -07001291 retval = platform_driver_register(&OF_PLATFORM_DRIVER);
Sylvain Munaut495a6782006-12-13 21:09:55 +01001292 if (retval < 0)
Benjamin Herrenschmidtde447432007-01-15 20:12:06 -08001293 goto error_of_platform;
Sylvain Munaut495a6782006-12-13 21:09:55 +01001294#endif
1295
Sylvain Munaut5e16fab2006-12-13 21:09:54 +01001296#ifdef SA1111_DRIVER
1297 retval = sa1111_driver_register(&SA1111_DRIVER);
1298 if (retval < 0)
Benjamin Herrenschmidtde447432007-01-15 20:12:06 -08001299 goto error_sa1111;
Sylvain Munaut5e16fab2006-12-13 21:09:54 +01001300#endif
1301
Ben Dooks3ee38d82008-06-08 17:20:11 +01001302#ifdef SM501_OHCI_DRIVER
1303 retval = platform_driver_register(&SM501_OHCI_DRIVER);
1304 if (retval < 0)
1305 goto error_sm501;
1306#endif
1307
Dmitry Baryshkov78c73412008-10-08 16:14:23 +04001308#ifdef TMIO_OHCI_DRIVER
1309 retval = platform_driver_register(&TMIO_OHCI_DRIVER);
1310 if (retval < 0)
1311 goto error_tmio;
1312#endif
1313
Sylvain Munaut5e16fab2006-12-13 21:09:54 +01001314 return retval;
1315
1316 /* Error path */
Dmitry Baryshkov78c73412008-10-08 16:14:23 +04001317#ifdef TMIO_OHCI_DRIVER
1318 platform_driver_unregister(&TMIO_OHCI_DRIVER);
1319 error_tmio:
1320#endif
Ben Dooks3ee38d82008-06-08 17:20:11 +01001321#ifdef SM501_OHCI_DRIVER
Dmitry Baryshkov78c73412008-10-08 16:14:23 +04001322 platform_driver_unregister(&SM501_OHCI_DRIVER);
Ben Dooks3ee38d82008-06-08 17:20:11 +01001323 error_sm501:
1324#endif
Sylvain Munaut5e16fab2006-12-13 21:09:54 +01001325#ifdef SA1111_DRIVER
Benjamin Herrenschmidtde447432007-01-15 20:12:06 -08001326 sa1111_driver_unregister(&SA1111_DRIVER);
1327 error_sa1111:
1328#endif
1329#ifdef OF_PLATFORM_DRIVER
Grant Likelyd35fb642011-02-22 21:08:34 -07001330 platform_driver_unregister(&OF_PLATFORM_DRIVER);
Benjamin Herrenschmidtde447432007-01-15 20:12:06 -08001331 error_of_platform:
1332#endif
Geoff Levand6a6c9572007-01-15 20:12:10 -08001333#ifdef PS3_SYSTEM_BUS_DRIVER
Geoff Levand7a4eb7f2007-06-05 20:04:35 -07001334 ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
Geoff Levand6a6c9572007-01-15 20:12:10 -08001335 error_ps3:
1336#endif
Tony Jones684c19e2007-09-11 14:07:31 -07001337 debugfs_remove(ohci_debug_root);
1338 ohci_debug_root = NULL;
Tony Jones684c19e2007-09-11 14:07:31 -07001339
Alan Stern9beeee62008-10-02 11:48:13 -04001340 clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
Sylvain Munaut5e16fab2006-12-13 21:09:54 +01001341 return retval;
1342}
1343module_init(ohci_hcd_mod_init);
1344
1345static void __exit ohci_hcd_mod_exit(void)
1346{
Dmitry Baryshkov78c73412008-10-08 16:14:23 +04001347#ifdef TMIO_OHCI_DRIVER
1348 platform_driver_unregister(&TMIO_OHCI_DRIVER);
1349#endif
Ben Dooks3ee38d82008-06-08 17:20:11 +01001350#ifdef SM501_OHCI_DRIVER
1351 platform_driver_unregister(&SM501_OHCI_DRIVER);
1352#endif
Sylvain Munaut5e16fab2006-12-13 21:09:54 +01001353#ifdef SA1111_DRIVER
1354 sa1111_driver_unregister(&SA1111_DRIVER);
1355#endif
Sylvain Munaut495a6782006-12-13 21:09:55 +01001356#ifdef OF_PLATFORM_DRIVER
Grant Likelyd35fb642011-02-22 21:08:34 -07001357 platform_driver_unregister(&OF_PLATFORM_DRIVER);
Sylvain Munaut495a6782006-12-13 21:09:55 +01001358#endif
Geoff Levand6a6c9572007-01-15 20:12:10 -08001359#ifdef PS3_SYSTEM_BUS_DRIVER
Geoff Levand7a4eb7f2007-06-05 20:04:35 -07001360 ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
Geoff Levand6a6c9572007-01-15 20:12:10 -08001361#endif
Tony Jones684c19e2007-09-11 14:07:31 -07001362 debugfs_remove(ohci_debug_root);
Alan Stern9beeee62008-10-02 11:48:13 -04001363 clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
Sylvain Munaut5e16fab2006-12-13 21:09:54 +01001364}
1365module_exit(ohci_hcd_mod_exit);
1366