hcd.h 26.6 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0+
Linus Torvalds's avatar
Linus Torvalds committed
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
 * Copyright (c) 2001-2002 by David Brownell
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

20
21
#ifndef __USB_CORE_HCD_H
#define __USB_CORE_HCD_H
Linus Torvalds's avatar
Linus Torvalds committed
22
23
24

#ifdef __KERNEL__

25
#include <linux/rwsem.h>
26
#include <linux/interrupt.h>
27
#include <linux/idr.h>
28

29
30
#define MAX_TOPO_LEVEL		6

Linus Torvalds's avatar
Linus Torvalds committed
31
32
33
34
35
36
37
/* This file contains declarations of usbcore internals that are mostly
 * used or exposed by Host Controller Drivers.
 */

/*
 * USB Packet IDs (PIDs)
 */
38
#define USB_PID_EXT			0xf0	/* USB 2.0 LPM ECN */
Linus Torvalds's avatar
Linus Torvalds committed
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#define USB_PID_OUT			0xe1
#define USB_PID_ACK			0xd2
#define USB_PID_DATA0			0xc3
#define USB_PID_PING			0xb4	/* USB 2.0 */
#define USB_PID_SOF			0xa5
#define USB_PID_NYET			0x96	/* USB 2.0 */
#define USB_PID_DATA2			0x87	/* USB 2.0 */
#define USB_PID_SPLIT			0x78	/* USB 2.0 */
#define USB_PID_IN			0x69
#define USB_PID_NAK			0x5a
#define USB_PID_DATA1			0x4b
#define USB_PID_PREAMBLE		0x3c	/* Token mode */
#define USB_PID_ERR			0x3c	/* USB 2.0: handshake mode */
#define USB_PID_SETUP			0x2d
#define USB_PID_STALL			0x1e
#define USB_PID_MDATA			0x0f	/* USB 2.0 */

/*-------------------------------------------------------------------------*/

/*
 * USB Host Controller Driver (usb_hcd) framework
 *
 * Since "struct usb_bus" is so thin, you can't share much code in it.
 * This framework is a layer over that, and should be more sharable.
 */

/*-------------------------------------------------------------------------*/

67
68
69
70
71
struct giveback_urb_bh {
	bool running;
	spinlock_t lock;
	struct list_head  head;
	struct tasklet_struct bh;
72
	struct usb_host_endpoint *completing_ep;
73
74
};

75
76
77
78
79
80
enum usb_dev_authorize_policy {
	USB_DEVICE_AUTHORIZE_NONE	= 0,
	USB_DEVICE_AUTHORIZE_ALL	= 1,
	USB_DEVICE_AUTHORIZE_INTERNAL	= 2,
};

81
struct usb_hcd {
Linus Torvalds's avatar
Linus Torvalds committed
82
83
84
85
86

	/*
	 * housekeeping
	 */
	struct usb_bus		self;		/* hcd is-a bus */
87
	struct kref		kref;		/* reference counter */
Linus Torvalds's avatar
Linus Torvalds committed
88
89

	const char		*product_desc;	/* product/vendor string */
90
91
92
93
	int			speed;		/* Speed for this roothub.
						 * May be different from
						 * hcd->driver->flags & HCD_MASK
						 */
Linus Torvalds's avatar
Linus Torvalds committed
94
95
	char			irq_descr[24];	/* driver + bus # */

96
97
	struct timer_list	rh_timer;	/* drives root-hub polling */
	struct urb		*status_urb;	/* the current status urb */
98
#ifdef CONFIG_PM
99
100
	struct work_struct	wakeup_work;	/* for remote wakeup */
#endif
101
	struct work_struct	died_work;	/* for when the device dies */
Linus Torvalds's avatar
Linus Torvalds committed
102
103
104
105
106

	/*
	 * hardware info/state
	 */
	const struct hc_driver	*driver;	/* hw-specific hooks */
107

108
109
110
111
	/*
	 * OTG and some Host controllers need software interaction with phys;
	 * other external phys should be software-transparent
	 */
112
	struct usb_phy		*usb_phy;
113
	struct usb_phy_roothub	*phy_roothub;
114

115
116
117
118
	/* Flags that need to be manipulated atomically because they can
	 * change while the host controller is running.  Always use
	 * set_bit() or clear_bit() to change their values.
	 */
119
	unsigned long		flags;
120
121
122
#define HCD_FLAG_HW_ACCESSIBLE		0	/* at full power */
#define HCD_FLAG_POLL_RH		2	/* poll for rh status? */
#define HCD_FLAG_POLL_PENDING		3	/* status has changed? */
123
#define HCD_FLAG_WAKEUP_PENDING		4	/* root hub is resuming? */
124
125
#define HCD_FLAG_RH_RUNNING		5	/* root hub is running? */
#define HCD_FLAG_DEAD			6	/* controller has died? */
126
#define HCD_FLAG_INTF_AUTHORIZED	7	/* authorize interfaces? */
127
128
129
130
131
132
133

	/* The flags can be tested using these macros; they are likely to
	 * be slightly faster than test_bit().
	 */
#define HCD_HW_ACCESSIBLE(hcd)	((hcd)->flags & (1U << HCD_FLAG_HW_ACCESSIBLE))
#define HCD_POLL_RH(hcd)	((hcd)->flags & (1U << HCD_FLAG_POLL_RH))
#define HCD_POLL_PENDING(hcd)	((hcd)->flags & (1U << HCD_FLAG_POLL_PENDING))
134
#define HCD_WAKEUP_PENDING(hcd)	((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING))
135
136
#define HCD_RH_RUNNING(hcd)	((hcd)->flags & (1U << HCD_FLAG_RH_RUNNING))
#define HCD_DEAD(hcd)		((hcd)->flags & (1U << HCD_FLAG_DEAD))
137

138
139
140
141
142
143
144
145
	/*
	 * Specifies if interfaces are authorized by default
	 * or they require explicit user space authorization; this bit is
	 * settable through /sys/class/usb_host/X/interface_authorized_default
	 */
#define HCD_INTF_AUTHORIZED(hcd) \
	((hcd)->flags & (1U << HCD_FLAG_INTF_AUTHORIZED))

146
147
148
149
150
	/*
	 * Specifies if devices are authorized by default
	 * or they require explicit user space authorization; this bit is
	 * settable through /sys/class/usb_host/X/authorized_default
	 */
151
	enum usb_dev_authorize_policy dev_policy;
152

153
	/* Flags that get set only during HCD registration or removal. */
Linus Torvalds's avatar
Linus Torvalds committed
154
	unsigned		rh_registered:1;/* is root hub registered? */
155
	unsigned		rh_pollable:1;	/* may we poll the root hub? */
156
	unsigned		msix_enabled:1;	/* driver has MSI-X enabled? */
157
	unsigned		msi_enabled:1;	/* driver has MSI enabled? */
158
159
160
161
162
163
	/*
	 * do not manage the PHY state in the HCD core, instead let the driver
	 * handle this (for example if the PHY can only be turned on after a
	 * specific event)
	 */
	unsigned		skip_phy_initialization:1;
Linus Torvalds's avatar
Linus Torvalds committed
164

165
166
167
	/* The next flag is a stopgap, to be removed when all the HCDs
	 * support the new root-hub polling mechanism. */
	unsigned		uses_new_polling:1;
168
	unsigned		wireless:1;	/* Wireless USB HCD */
169
	unsigned		has_tt:1;	/* Integrated TT in root hub */
170
	unsigned		amd_resume_bug:1; /* AMD remote wakeup quirk */
171
	unsigned		can_do_streams:1; /* HC supports streams */
Peter Chen's avatar
Peter Chen committed
172
	unsigned		tpl_support:1; /* OTG & EH TPL support */
173
174
	unsigned		cant_recv_wakeups:1;
			/* wakeup requests from downstream aren't received */
175

176
	unsigned int		irq;		/* irq allocated */
Linus Torvalds's avatar
Linus Torvalds committed
177
	void __iomem		*regs;		/* device memory/io */
178
179
	resource_size_t		rsrc_start;	/* memory/io resource start */
	resource_size_t		rsrc_len;	/* memory/io resource length */
180
	unsigned		power_budget;	/* in mA, 0 = no limit */
Linus Torvalds's avatar
Linus Torvalds committed
181

182
183
184
	struct giveback_urb_bh  high_prio_bh;
	struct giveback_urb_bh  low_prio_bh;

185
186
187
188
189
190
191
192
193
194
195
	/* bandwidth_mutex should be taken before adding or removing
	 * any new bus bandwidth constraints:
	 *   1. Before adding a configuration for a new device.
	 *   2. Before removing the configuration to put the device into
	 *      the addressed state.
	 *   3. Before selecting a different configuration.
	 *   4. Before selecting an alternate interface setting.
	 *
	 * bandwidth_mutex should be dropped after a successful control message
	 * to the device, or resetting the bandwidth after a failed attempt.
	 */
196
	struct mutex		*address0_mutex;
197
	struct mutex		*bandwidth_mutex;
198
199
	struct usb_hcd		*shared_hcd;
	struct usb_hcd		*primary_hcd;
200
201


Linus Torvalds's avatar
Linus Torvalds committed
202
#define HCD_BUFFER_POOLS	4
203
	struct dma_pool		*pool[HCD_BUFFER_POOLS];
Linus Torvalds's avatar
Linus Torvalds committed
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218

	int			state;
#	define	__ACTIVE		0x01
#	define	__SUSPEND		0x04
#	define	__TRANSIENT		0x80

#	define	HC_STATE_HALT		0
#	define	HC_STATE_RUNNING	(__ACTIVE)
#	define	HC_STATE_QUIESCING	(__SUSPEND|__TRANSIENT|__ACTIVE)
#	define	HC_STATE_RESUMING	(__SUSPEND|__TRANSIENT)
#	define	HC_STATE_SUSPENDED	(__SUSPEND)

#define	HC_IS_RUNNING(state) ((state) & __ACTIVE)
#define	HC_IS_SUSPENDED(state) ((state) & __SUSPEND)

219
220
221
	/* memory pool for HCs having local memory, or %NULL */
	struct gen_pool         *localmem_pool;

Linus Torvalds's avatar
Linus Torvalds committed
222
223
	/* more shared queuing code would be good; it should support
	 * smarter scheduling, handle transaction translators, etc;
224
	 * input size of periodic table to an interrupt scheduler.
Linus Torvalds's avatar
Linus Torvalds committed
225
226
227
228
229
230
231
	 * (ohci 32, uhci 1024, ehci 256/512/1024).
	 */

	/* The HC driver's private data is stored at the end of
	 * this structure.
	 */
	unsigned long hcd_priv[0]
Harro Haan's avatar
Harro Haan committed
232
			__attribute__ ((aligned(sizeof(s64))));
Linus Torvalds's avatar
Linus Torvalds committed
233
234
235
};

/* 2.4 does this a bit differently ... */
236
static inline struct usb_bus *hcd_to_bus(struct usb_hcd *hcd)
Linus Torvalds's avatar
Linus Torvalds committed
237
238
239
240
{
	return &hcd->self;
}

241
static inline struct usb_hcd *bus_to_hcd(struct usb_bus *bus)
242
243
244
{
	return container_of(bus, struct usb_hcd, self);
}
Linus Torvalds's avatar
Linus Torvalds committed
245
246
247
248
249
250
251
252
253
254

/*-------------------------------------------------------------------------*/


struct hc_driver {
	const char	*description;	/* "ehci-hcd" etc */
	const char	*product_desc;	/* product/vendor string */
	size_t		hcd_priv_size;	/* size of private data */

	/* irq handler */
255
	irqreturn_t	(*irq) (struct usb_hcd *hcd);
Linus Torvalds's avatar
Linus Torvalds committed
256
257
258

	int	flags;
#define	HCD_MEMORY	0x0001		/* HC regs use memory (else I/O) */
259
#define	HCD_SHARED	0x0004		/* Two (or more) usb_hcds share HW */
Linus Torvalds's avatar
Linus Torvalds committed
260
261
#define	HCD_USB11	0x0010		/* USB 1.1 */
#define	HCD_USB2	0x0020		/* USB 2.0 */
262
#define	HCD_USB25	0x0030		/* Wireless USB 1.0 (USB 2.5)*/
263
#define	HCD_USB3	0x0040		/* USB 3.0 */
264
#define	HCD_USB31	0x0050		/* USB 3.1 */
265
#define	HCD_USB32	0x0060		/* USB 3.2 */
266
#define	HCD_MASK	0x0070
267
#define	HCD_BH		0x0100		/* URB complete in BH context */
Linus Torvalds's avatar
Linus Torvalds committed
268
269
270
271
272
273

	/* called to init HCD and root hub */
	int	(*reset) (struct usb_hcd *hcd);
	int	(*start) (struct usb_hcd *hcd);

	/* NOTE:  these suspend/resume calls relate to the HC as
274
	 * a whole, not just the root hub; they're for PCI bus glue.
Linus Torvalds's avatar
Linus Torvalds committed
275
	 */
276
	/* called after suspending the hub, before entering D3 etc */
277
	int	(*pci_suspend)(struct usb_hcd *hcd, bool do_wakeup);
Linus Torvalds's avatar
Linus Torvalds committed
278

279
	/* called after entering D0 (etc), before resuming the hub */
280
	int	(*pci_resume)(struct usb_hcd *hcd, bool hibernated);
Linus Torvalds's avatar
Linus Torvalds committed
281
282
283
284

	/* cleanly make HCD stop writing memory and doing I/O */
	void	(*stop) (struct usb_hcd *hcd);

285
286
287
	/* shutdown HCD */
	void	(*shutdown) (struct usb_hcd *hcd);

Linus Torvalds's avatar
Linus Torvalds committed
288
289
290
291
	/* return current frame number */
	int	(*get_frame_number) (struct usb_hcd *hcd);

	/* manage i/o requests, device state */
292
293
294
295
	int	(*urb_enqueue)(struct usb_hcd *hcd,
				struct urb *urb, gfp_t mem_flags);
	int	(*urb_dequeue)(struct usb_hcd *hcd,
				struct urb *urb, int status);
Linus Torvalds's avatar
Linus Torvalds committed
296

297
298
299
300
301
302
303
304
305
306
307
308
309
	/*
	 * (optional) these hooks allow an HCD to override the default DMA
	 * mapping and unmapping routines.  In general, they shouldn't be
	 * necessary unless the host controller has special DMA requirements,
	 * such as alignment contraints.  If these are not specified, the
	 * general usb_hcd_(un)?map_urb_for_dma functions will be used instead
	 * (and it may be a good idea to call these functions in your HCD
	 * implementation)
	 */
	int	(*map_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb,
				   gfp_t mem_flags);
	void    (*unmap_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb);

Linus Torvalds's avatar
Linus Torvalds committed
310
	/* hw synch, freeing endpoint resources that urb_dequeue can't */
311
	void	(*endpoint_disable)(struct usb_hcd *hcd,
Linus Torvalds's avatar
Linus Torvalds committed
312
313
			struct usb_host_endpoint *ep);

314
315
	/* (optional) reset any endpoint state such as sequence number
	   and current window */
316
	void	(*endpoint_reset)(struct usb_hcd *hcd,
317
318
			struct usb_host_endpoint *ep);

Linus Torvalds's avatar
Linus Torvalds committed
319
	/* root hub support */
320
321
	int	(*hub_status_data) (struct usb_hcd *hcd, char *buf);
	int	(*hub_control) (struct usb_hcd *hcd,
Linus Torvalds's avatar
Linus Torvalds committed
322
323
				u16 typeReq, u16 wValue, u16 wIndex,
				char *buf, u16 wLength);
324
325
326
	int	(*bus_suspend)(struct usb_hcd *);
	int	(*bus_resume)(struct usb_hcd *);
	int	(*start_port_reset)(struct usb_hcd *, unsigned port_num);
327
	unsigned long	(*get_resuming_ports)(struct usb_hcd *);
328
329

		/* force handover of high-speed port to full-speed companion */
330
	void	(*relinquish_port)(struct usb_hcd *, int);
331
332
		/* has a port been handed over to a companion? */
	int	(*port_handed_over)(struct usb_hcd *, int);
333

334
335
336
337
		/* CLEAR_TT_BUFFER completion callback */
	void	(*clear_tt_buffer_complete)(struct usb_hcd *,
				struct usb_host_endpoint *);

338
339
340
	/* xHCI specific functions */
		/* Called by usb_alloc_dev to alloc HC device structures */
	int	(*alloc_dev)(struct usb_hcd *, struct usb_device *);
341
		/* Called by usb_disconnect to free HC device structures */
342
	void	(*free_dev)(struct usb_hcd *, struct usb_device *);
343
344
345
346
347
348
349
350
351
352
	/* Change a group of bulk endpoints to support multiple stream IDs */
	int	(*alloc_streams)(struct usb_hcd *hcd, struct usb_device *udev,
		struct usb_host_endpoint **eps, unsigned int num_eps,
		unsigned int num_streams, gfp_t mem_flags);
	/* Reverts a group of bulk endpoints back to not using stream IDs.
	 * Can fail if we run out of memory.
	 */
	int	(*free_streams)(struct usb_hcd *hcd, struct usb_device *udev,
		struct usb_host_endpoint **eps, unsigned int num_eps,
		gfp_t mem_flags);
353
354
355
356
357

	/* Bandwidth computation functions */
	/* Note that add_endpoint() can only be called once per endpoint before
	 * check_bandwidth() or reset_bandwidth() must be called.
	 * drop_endpoint() can only be called once per endpoint also.
358
359
360
361
362
	 * A call to xhci_drop_endpoint() followed by a call to
	 * xhci_add_endpoint() will add the endpoint to the schedule with
	 * possibly new parameters denoted by a different endpoint descriptor
	 * in usb_host_endpoint.  A call to xhci_add_endpoint() followed by a
	 * call to xhci_drop_endpoint() is not allowed.
363
364
	 */
		/* Allocate endpoint resources and add them to a new schedule */
365
366
	int	(*add_endpoint)(struct usb_hcd *, struct usb_device *,
				struct usb_host_endpoint *);
367
		/* Drop an endpoint from a new schedule */
368
369
	int	(*drop_endpoint)(struct usb_hcd *, struct usb_device *,
				 struct usb_host_endpoint *);
370
371
372
373
374
375
376
377
378
379
380
381
382
383
		/* Check that a new hardware configuration, set using
		 * endpoint_enable and endpoint_disable, does not exceed bus
		 * bandwidth.  This must be called before any set configuration
		 * or set interface requests are sent to the device.
		 */
	int	(*check_bandwidth)(struct usb_hcd *, struct usb_device *);
		/* Reset the device schedule to the last known good schedule,
		 * which was set from a previous successful call to
		 * check_bandwidth().  This reverts any add_endpoint() and
		 * drop_endpoint() calls since that last successful call.
		 * Used for when a check_bandwidth() call fails due to resource
		 * or bandwidth constraints.
		 */
	void	(*reset_bandwidth)(struct usb_hcd *, struct usb_device *);
384
385
		/* Returns the hardware-chosen device address */
	int	(*address_device)(struct usb_hcd *, struct usb_device *udev);
386
387
		/* prepares the hardware to send commands to the device */
	int	(*enable_device)(struct usb_hcd *, struct usb_device *udev);
388
389
390
391
392
		/* Notifies the HCD after a hub descriptor is fetched.
		 * Will block.
		 */
	int	(*update_hub_device)(struct usb_hcd *, struct usb_device *hdev,
			struct usb_tt *tt, gfp_t mem_flags);
393
	int	(*reset_device)(struct usb_hcd *, struct usb_device *);
394
395
396
397
		/* Notifies the HCD after a device is connected and its
		 * address is set
		 */
	int	(*update_device)(struct usb_hcd *, struct usb_device *);
Andiry Xu's avatar
Andiry Xu committed
398
	int	(*set_usb2_hw_lpm)(struct usb_hcd *, struct usb_device *, int);
399
400
401
402
403
404
405
406
407
	/* USB 3.0 Link Power Management */
		/* Returns the USB3 hub-encoded value for the U1/U2 timeout. */
	int	(*enable_usb3_lpm_timeout)(struct usb_hcd *,
			struct usb_device *, enum usb3_link_state state);
		/* The xHCI host controller can still fail the command to
		 * disable the LPM timeouts, so this can return an error code.
		 */
	int	(*disable_usb3_lpm_timeout)(struct usb_hcd *,
			struct usb_device *, enum usb3_link_state state);
408
	int	(*find_raw_port_number)(struct usb_hcd *, int);
409
410
411
	/* Call for power on/off the port if necessary */
	int	(*port_power)(struct usb_hcd *hcd, int portnum, bool enable);

Linus Torvalds's avatar
Linus Torvalds committed
412
413
};

414
415
416
417
418
static inline int hcd_giveback_urb_in_bh(struct usb_hcd *hcd)
{
	return hcd->driver->flags & HCD_BH;
}

419
420
421
422
423
424
static inline bool hcd_periodic_completion_in_progress(struct usb_hcd *hcd,
		struct usb_host_endpoint *ep)
{
	return hcd->high_prio_bh.completing_ep == ep;
}

425
426
427
#define hcd_uses_dma(hcd) \
	(IS_ENABLED(CONFIG_HAS_DMA) && (hcd)->self.uses_dma)

428
429
430
431
432
extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb);
extern int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb,
		int status);
extern void usb_hcd_unlink_urb_from_ep(struct usb_hcd *hcd, struct urb *urb);

433
434
extern int usb_hcd_submit_urb(struct urb *urb, gfp_t mem_flags);
extern int usb_hcd_unlink_urb(struct urb *urb, int status);
Alan Stern's avatar
Alan Stern committed
435
436
extern void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb,
		int status);
437
438
extern int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,
		gfp_t mem_flags);
439
440
extern void usb_hcd_unmap_urb_setup_for_dma(struct usb_hcd *, struct urb *);
extern void usb_hcd_unmap_urb_for_dma(struct usb_hcd *, struct urb *);
441
442
443
extern void usb_hcd_flush_endpoint(struct usb_device *udev,
		struct usb_host_endpoint *ep);
extern void usb_hcd_disable_endpoint(struct usb_device *udev,
Alan Stern's avatar
Alan Stern committed
444
		struct usb_host_endpoint *ep);
445
446
extern void usb_hcd_reset_endpoint(struct usb_device *udev,
		struct usb_host_endpoint *ep);
447
extern void usb_hcd_synchronize_unlinks(struct usb_device *udev);
448
extern int usb_hcd_alloc_bandwidth(struct usb_device *udev,
449
		struct usb_host_config *new_config,
450
451
		struct usb_host_interface *old_alt,
		struct usb_host_interface *new_alt);
452
extern int usb_hcd_get_frame_number(struct usb_device *udev);
Linus Torvalds's avatar
Linus Torvalds committed
453

454
455
456
struct usb_hcd *__usb_create_hcd(const struct hc_driver *driver,
		struct device *sysdev, struct device *dev, const char *bus_name,
		struct usb_hcd *primary_hcd);
457
extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver,
458
		struct device *dev, const char *bus_name);
459
460
461
extern struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver,
		struct device *dev, const char *bus_name,
		struct usb_hcd *shared_hcd);
462
463
extern struct usb_hcd *usb_get_hcd(struct usb_hcd *hcd);
extern void usb_put_hcd(struct usb_hcd *hcd);
464
extern int usb_hcd_is_primary_hcd(struct usb_hcd *hcd);
Linus Torvalds's avatar
Linus Torvalds committed
465
466
467
extern int usb_add_hcd(struct usb_hcd *hcd,
		unsigned int irqnum, unsigned long irqflags);
extern void usb_remove_hcd(struct usb_hcd *hcd);
468
extern int usb_hcd_find_raw_port_number(struct usb_hcd *hcd, int port1);
469
470
int usb_hcd_setup_local_mem(struct usb_hcd *hcd, phys_addr_t phys_addr,
			    dma_addr_t dma, size_t size);
Linus Torvalds's avatar
Linus Torvalds committed
471

472
struct platform_device;
473
extern void usb_hcd_platform_shutdown(struct platform_device *dev);
474

475
#ifdef CONFIG_USB_PCI
Linus Torvalds's avatar
Linus Torvalds committed
476
477
struct pci_dev;
struct pci_device_id;
478
extern int usb_hcd_pci_probe(struct pci_dev *dev,
Linus Torvalds's avatar
Linus Torvalds committed
479
				const struct pci_device_id *id);
480
481
extern void usb_hcd_pci_remove(struct pci_dev *dev);
extern void usb_hcd_pci_shutdown(struct pci_dev *dev);
482

483
484
extern int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev);

485
#ifdef CONFIG_PM
486
extern const struct dev_pm_ops usb_hcd_pci_pm_ops;
487
#endif
488
#endif /* CONFIG_USB_PCI */
Linus Torvalds's avatar
Linus Torvalds committed
489
490

/* pci-ish (pdev null is ok) buffer alloc/mapping support */
491
void usb_init_pool_max(void);
492
493
int hcd_buffer_create(struct usb_hcd *hcd);
void hcd_buffer_destroy(struct usb_hcd *hcd);
Linus Torvalds's avatar
Linus Torvalds committed
494

495
void *hcd_buffer_alloc(struct usb_bus *bus, size_t size,
Al Viro's avatar
Al Viro committed
496
	gfp_t mem_flags, dma_addr_t *dma);
497
void hcd_buffer_free(struct usb_bus *bus, size_t size,
Linus Torvalds's avatar
Linus Torvalds committed
498
499
500
	void *addr, dma_addr_t dma);

/* generic bus glue, needed for host controllers that don't use PCI */
501
extern irqreturn_t usb_hcd_irq(int irq, void *__hcd);
502

503
extern void usb_hc_died(struct usb_hcd *hcd);
504
extern void usb_hcd_poll_rh_status(struct usb_hcd *hcd);
505
506
extern void usb_wakeup_notification(struct usb_device *hdev,
		unsigned int portnum);
Linus Torvalds's avatar
Linus Torvalds committed
507

508
509
510
extern void usb_hcd_start_port_resume(struct usb_bus *bus, int portnum);
extern void usb_hcd_end_port_resume(struct usb_bus *bus, int portnum);

511
512
513
514
515
516
517
/* The D0/D1 toggle bits ... USE WITH CAUTION (they're almost hcd-internal) */
#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> (ep)) & 1)
#define	usb_dotoggle(dev, ep, out)  ((dev)->toggle[out] ^= (1 << (ep)))
#define usb_settoggle(dev, ep, out, bit) \
		((dev)->toggle[out] = ((dev)->toggle[out] & ~(1 << (ep))) | \
		 ((bit) << (ep)))

Linus Torvalds's avatar
Linus Torvalds committed
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
/* -------------------------------------------------------------------------- */

/* Enumeration is only for the hub driver, or HCD virtual root hubs */
extern struct usb_device *usb_alloc_dev(struct usb_device *parent,
					struct usb_bus *, unsigned port);
extern int usb_new_device(struct usb_device *dev);
extern void usb_disconnect(struct usb_device **);

extern int usb_get_configuration(struct usb_device *dev);
extern void usb_destroy_configuration(struct usb_device *dev);

/*-------------------------------------------------------------------------*/

/*
 * HCD Root Hub support
 */

535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
#include <linux/usb/ch11.h>

/*
 * As of USB 2.0, full/low speed devices are segregated into trees.
 * One type grows from USB 1.1 host controllers (OHCI, UHCI etc).
 * The other type grows from high speed hubs when they connect to
 * full/low speed devices using "Transaction Translators" (TTs).
 *
 * TTs should only be known to the hub driver, and high speed bus
 * drivers (only EHCI for now).  They affect periodic scheduling and
 * sometimes control/bulk error recovery.
 */

struct usb_device;

struct usb_tt {
	struct usb_device	*hub;	/* upstream highspeed hub */
	int			multi;	/* true means one TT per port */
	unsigned		think_time;	/* think time in ns */
554
	void			*hcpriv;	/* HCD private data */
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571

	/* for control/bulk error recovery (CLEAR_TT_BUFFER) */
	spinlock_t		lock;
	struct list_head	clear_list;	/* of usb_tt_clear */
	struct work_struct	clear_work;
};

struct usb_tt_clear {
	struct list_head	clear_list;
	unsigned		tt;
	u16			devinfo;
	struct usb_hcd		*hcd;
	struct usb_host_endpoint	*ep;
};

extern int usb_hub_clear_tt_buffer(struct urb *urb);
extern void usb_ep0_reinit(struct usb_device *);
Linus Torvalds's avatar
Linus Torvalds committed
572
573
574
575
576
577
578
579
580
581
582

/* (shifted) direction/type/recipient from the USB 2.0 spec, table 9.2 */
#define DeviceRequest \
	((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)
#define DeviceOutRequest \
	((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8)

#define InterfaceRequest \
	((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8)

#define EndpointRequest \
583
	((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8)
Linus Torvalds's avatar
Linus Torvalds committed
584
#define EndpointOutRequest \
585
	((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_ENDPOINT)<<8)
Linus Torvalds's avatar
Linus Torvalds committed
586
587

/* class requests from the USB 2.0 hub spec, table 11-15 */
588
#define HUB_CLASS_REQ(dir, type, request) ((((dir) | (type)) << 8) | (request))
Linus Torvalds's avatar
Linus Torvalds committed
589
/* GetBusState and SetHubDescriptor are optional, omitted */
590
591
592
593
594
595
596
#define ClearHubFeature		HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_HUB, USB_REQ_CLEAR_FEATURE)
#define ClearPortFeature	HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, USB_REQ_CLEAR_FEATURE)
#define GetHubDescriptor	HUB_CLASS_REQ(USB_DIR_IN, USB_RT_HUB, USB_REQ_GET_DESCRIPTOR)
#define GetHubStatus		HUB_CLASS_REQ(USB_DIR_IN, USB_RT_HUB, USB_REQ_GET_STATUS)
#define GetPortStatus		HUB_CLASS_REQ(USB_DIR_IN, USB_RT_PORT, USB_REQ_GET_STATUS)
#define SetHubFeature		HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_HUB, USB_REQ_SET_FEATURE)
#define SetPortFeature		HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_PORT, USB_REQ_SET_FEATURE)
Linus Torvalds's avatar
Linus Torvalds committed
597
598
599


/*-------------------------------------------------------------------------*/
600

601
/* class requests from USB 3.1 hub spec, table 10-7 */
602
603
#define SetHubDepth		HUB_CLASS_REQ(USB_DIR_OUT, USB_RT_HUB, HUB_SET_DEPTH)
#define GetPortErrorCount	HUB_CLASS_REQ(USB_DIR_IN, USB_RT_PORT, HUB_GET_PORT_ERR_COUNT)
Linus Torvalds's avatar
Linus Torvalds committed
604
605
606
607
608

/*
 * Generic bandwidth allocation constants/support
 */
#define FRAME_TIME_USECS	1000L
609
#define BitTime(bytecount) (7 * 8 * bytecount / 6) /* with integer truncation */
Linus Torvalds's avatar
Linus Torvalds committed
610
		/* Trying not to use worst-case bit-stuffing
611
		 * of (7/6 * 8 * bytecount) = 9.33 * bytecount */
Linus Torvalds's avatar
Linus Torvalds committed
612
613
		/* bytecount = data payload byte count */

Alan Stern's avatar
Alan Stern committed
614
615
#define NS_TO_US(ns)	DIV_ROUND_UP(ns, 1000L)
			/* convert nanoseconds to microseconds, rounding up */
Linus Torvalds's avatar
Linus Torvalds committed
616
617
618
619
620
621

/*
 * Full/low speed bandwidth allocation constants/support.
 */
#define BW_HOST_DELAY	1000L		/* nanoseconds */
#define BW_HUB_LS_SETUP	333L		/* nanoseconds */
622
			/* 4 full-speed bit times (est.) */
Linus Torvalds's avatar
Linus Torvalds committed
623

624
#define FRAME_TIME_BITS			12000L	/* frame = 1 millisecond */
Linus Torvalds's avatar
Linus Torvalds committed
625
626
627
628
#define FRAME_TIME_MAX_BITS_ALLOC	(90L * FRAME_TIME_BITS / 100L)
#define FRAME_TIME_MAX_USECS_ALLOC	(90L * FRAME_TIME_USECS / 100L)

/*
629
 * Ceiling [nano/micro]seconds (typical) for that many bytes at high speed
Linus Torvalds's avatar
Linus Torvalds committed
630
631
632
633
 * ISO is a bit less, no ACK ... from USB 2.0 spec, 5.11.3 (and needed
 * to preallocate bandwidth)
 */
#define USB2_HOST_DELAY	5	/* nsec, guess */
634
#define HS_NSECS(bytes) (((55 * 8 * 2083) \
635
	+ (2083UL * (3 + BitTime(bytes))))/1000 \
Linus Torvalds's avatar
Linus Torvalds committed
636
	+ USB2_HOST_DELAY)
637
#define HS_NSECS_ISO(bytes) (((38 * 8 * 2083) \
638
	+ (2083UL * (3 + BitTime(bytes))))/1000 \
Linus Torvalds's avatar
Linus Torvalds committed
639
	+ USB2_HOST_DELAY)
640
641
#define HS_USECS(bytes)		NS_TO_US(HS_NSECS(bytes))
#define HS_USECS_ISO(bytes)	NS_TO_US(HS_NSECS_ISO(bytes))
Linus Torvalds's avatar
Linus Torvalds committed
642

643
extern long usb_calc_bus_time(int speed, int is_input,
Linus Torvalds's avatar
Linus Torvalds committed
644
645
646
647
648
649
650
651
652
653
654
			int isoc, int bytecount);

/*-------------------------------------------------------------------------*/

extern void usb_set_device_state(struct usb_device *udev,
		enum usb_device_state new_state);

/*-------------------------------------------------------------------------*/

/* exported only within usbcore */

655
extern struct idr usb_bus_idr;
656
extern struct mutex usb_bus_idr_lock;
Linus Torvalds's avatar
Linus Torvalds committed
657
658
659
660
661
extern wait_queue_head_t usb_kill_urb_queue;


#define usb_endpoint_out(ep_dir)	(!((ep_dir) & USB_DIR_IN))

662
#ifdef CONFIG_PM
663
extern unsigned usb_wakeup_enabled_descendants(struct usb_device *udev);
664
extern void usb_root_hub_lost_power(struct usb_device *rhdev);
665
666
extern int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg);
extern int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg);
667
extern void usb_hcd_resume_root_hub(struct usb_hcd *hcd);
668
#else
669
670
671
672
static inline unsigned usb_wakeup_enabled_descendants(struct usb_device *udev)
{
	return 0;
}
673
674
675
676
static inline void usb_hcd_resume_root_hub(struct usb_hcd *hcd)
{
	return;
}
677
#endif /* CONFIG_PM */
678

Linus Torvalds's avatar
Linus Torvalds committed
679
680
/*-------------------------------------------------------------------------*/

681
#if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE)
Linus Torvalds's avatar
Linus Torvalds committed
682
683
684
685

struct usb_mon_operations {
	void (*urb_submit)(struct usb_bus *bus, struct urb *urb);
	void (*urb_submit_error)(struct usb_bus *bus, struct urb *urb, int err);
686
	void (*urb_complete)(struct usb_bus *bus, struct urb *urb, int status);
Linus Torvalds's avatar
Linus Torvalds committed
687
688
689
	/* void (*urb_unlink)(struct usb_bus *bus, struct urb *urb); */
};

690
extern const struct usb_mon_operations *mon_ops;
Linus Torvalds's avatar
Linus Torvalds committed
691
692
693
694
695
696
697
698
699
700
701
702
703
704

static inline void usbmon_urb_submit(struct usb_bus *bus, struct urb *urb)
{
	if (bus->monitored)
		(*mon_ops->urb_submit)(bus, urb);
}

static inline void usbmon_urb_submit_error(struct usb_bus *bus, struct urb *urb,
    int error)
{
	if (bus->monitored)
		(*mon_ops->urb_submit_error)(bus, urb, error);
}

705
706
static inline void usbmon_urb_complete(struct usb_bus *bus, struct urb *urb,
		int status)
Linus Torvalds's avatar
Linus Torvalds committed
707
708
{
	if (bus->monitored)
709
		(*mon_ops->urb_complete)(bus, urb, status);
Linus Torvalds's avatar
Linus Torvalds committed
710
711
}

712
int usb_mon_register(const struct usb_mon_operations *ops);
Linus Torvalds's avatar
Linus Torvalds committed
713
714
715
716
717
718
719
void usb_mon_deregister(void);

#else

static inline void usbmon_urb_submit(struct usb_bus *bus, struct urb *urb) {}
static inline void usbmon_urb_submit_error(struct usb_bus *bus, struct urb *urb,
    int error) {}
720
721
static inline void usbmon_urb_complete(struct usb_bus *bus, struct urb *urb,
		int status) {}
Linus Torvalds's avatar
Linus Torvalds committed
722

723
#endif /* CONFIG_USB_MON || CONFIG_USB_MON_MODULE */
Linus Torvalds's avatar
Linus Torvalds committed
724
725
726
727
728

/*-------------------------------------------------------------------------*/

/* random stuff */

729
730
#define	RUN_CONTEXT (in_irq() ? "in_irq" \
		: (in_interrupt() ? "in_interrupt" : "can sleep"))
Linus Torvalds's avatar
Linus Torvalds committed
731
732


733
734
735
736
/* This rwsem is for use only by the hub driver and ehci-hcd.
 * Nobody else should touch it.
 */
extern struct rw_semaphore ehci_cf_port_reset_rwsem;
Linus Torvalds's avatar
Linus Torvalds committed
737

738
739
740
741
742
743
/* Keep track of which host controller drivers are loaded */
#define USB_UHCI_LOADED		0
#define USB_OHCI_LOADED		1
#define USB_EHCI_LOADED		2
extern unsigned long usb_hcds_loaded;

744
#endif /* __KERNEL__ */
745
746

#endif /* __USB_CORE_HCD_H */