summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/usb/hubd/hub.h
blob: 17962a64e30c7976164fdc07411a3680935b9f91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_USB_HUB_H
#define	_SYS_USB_HUB_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

#define	USB_DESCR_TYPE_SETUP_HUB	0x2900

/*
 * Section 11.11.2.1 allows up to 255 ports.
 * For simplicity, only a maximum of 31 ports is currently allowed
 */
#define	MAX_PORTS 31

typedef struct usb_hub_descr {
	uchar_t		bDescLength;	/* size of descriptor */
	uchar_t		bDescriptorType; /* descriptor type */
	uchar_t		bNbrPorts;	/* number of ports */
	uint16_t	wHubCharacteristics; /* hub characteristics */
	uchar_t		bPwrOn2PwrGood;	/* time in ms from the time */
				/* power on sequence begins on a port */
				/* until power is good on that port */
	uchar_t		bHubContrCurrent; /* max current requirements */
	uchar_t		DeviceRemovable;
					/* removable device attached */
	uchar_t		PortPwrCtrlMask;
					/* power control mask */
} usb_hub_descr_t;

#define	ROOT_HUB_DESCRIPTOR_LENGTH	9
#define	ROOT_HUB_DESCRIPTOR_TYPE	0x29
#define	ROOT_HUB_ADDR			0x01	/* address of root hub */

/* Values for wHubCharacteristics */
#define	HUB_CHARS_POWER_SWITCHING_MODE	0x03
#define	HUB_CHARS_GANGED_POWER		0x00
#define	HUB_CHARS_INDIVIDUAL_PORT_POWER	0x01
#define	HUB_CHARS_NO_POWER_SWITCHING	0x02
#define	HUB_CHARS_COMPOUND_DEV		0x04
#define	HUB_CHARS_GLOBAL_OVER_CURRENT	0x00
#define	HUB_CHARS_INDIV_OVER_CURRENT	0x08
#define	HUB_CHARS_NO_OVER_CURRENT	0x10
#define	HUB_CHARS_TT_THINK_TIME		0x60
#define	HUB_CHARS_TT_16FS_TIME		0x20
#define	HUB_CHARS_TT_24FS_TIME		0x40
#define	HUB_CHARS_TT_32FS_TIME		0x60
#define	HUB_CHARS_PORT_INDICATOR	0x80

/* Default Power On to Power Good time */
#define	HUB_DEFAULT_POPG	10

/* Hub Status */
#define	HUB_CHANGE_STATUS	0x01

/* Class Specific bmRequestType values Table 11-10 */
#define	HUB_HANDLE_PORT_FEATURE_TYPE	(USB_DEV_REQ_HOST_TO_DEV \
					|USB_DEV_REQ_TYPE_CLASS \
					|USB_DEV_REQ_RCPT_OTHER)

#define	HUB_GET_PORT_STATUS_TYPE	(USB_DEV_REQ_DEV_TO_HOST \
					|USB_DEV_REQ_TYPE_CLASS \
					|USB_DEV_REQ_RCPT_OTHER)

#define	HUB_CLASS_REQ_TYPE		(USB_DEV_REQ_DEV_TO_HOST \
					|USB_DEV_REQ_TYPE_CLASS)

#define	HUB_HANDLE_HUB_FEATURE_TYPE	USB_DEV_REQ_TYPE_CLASS

/* bmRequestType for getting device status */
#define	HUB_GET_DEVICE_STATUS_TYPE	(USB_DEV_REQ_DEV_TO_HOST \
					|USB_DEV_REQ_TYPE_STANDARD \
					|USB_DEV_REQ_RCPT_DEV)

/* Port Status Field Bits - Table 11-15 */
#define	PORT_STATUS_CCS		0x0001	/* port connection status */
#define	PORT_STATUS_PES		0x0002	/* port enable status */
#define	PORT_STATUS_PSS		0x0004	/* port suspend status */
#define	PORT_STATUS_POCI	0x0008	/* port over current indicator */
#define	PORT_STATUS_PRS		0x0010	/* port reset status */
#define	PORT_STATUS_PPS		0x0100	/* port power status */
#define	PORT_STATUS_LSDA	0x0200	/* low speed device */
#define	PORT_STATUS_HSDA	0x0400	/* high speed device */
#define	PORT_STATUS_PIC		0x1000	/* port indicator control */

#define	PORT_STATUS_MASK	0x171f
#define	PORT_STATUS_OK		0x103	/* connected, enabled, power */

/* Port Change Field Bits - Table 11-16 */
#define	PORT_CHANGE_CSC		0x0001	/* connect status change */
#define	PORT_CHANGE_PESC	0x0002	/* port enable change */
#define	PORT_CHANGE_PSSC	0x0004	/* port suspend change */
#define	PORT_CHANGE_OCIC	0x0008	/* over current change */
#define	PORT_CHANGE_PRSC	0x0010	/* port reset change */

#define	PORT_CHANGE_MASK	0x001f

/* Hub status Field Bits - Table 11-14 */
#define	HUB_LOCAL_POWER_STATUS	0x0001	/* state of the power supply */
#define	HUB_OVER_CURRENT	0x0002  /* global hub OC condition */

/* Hub change clear feature selectors - Table 11-15 */
#define	C_HUB_LOCAL_POWER_STATUS 0x0001 /* state of the power supply */
#define	C_HUB_OVER_CURRENT	 0x0002 /* global hub OC condition */

/* hub class feature selectors - Table 11-12 */
#define	CFS_C_HUB_LOCAL_POWER		0
#define	CFS_C_HUB_OVER_CURRENT		1
#define	CFS_PORT_CONNECTION		0
#define	CFS_PORT_ENABLE			1
#define	CFS_PORT_SUSPEND		2
#define	CFS_PORT_OVER_CURRENT		3
#define	CFS_PORT_RESET			4
#define	CFS_PORT_POWER			8
#define	CFS_PORT_LOW_SPEED		9
#define	CFS_C_PORT_CONNECTION		16
#define	CFS_C_PORT_ENABLE		17
#define	CFS_C_PORT_SUSPEND		18
#define	CFS_C_PORT_OVER_CURRENT 	19
#define	CFS_C_PORT_RESET		20

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_USB_HUB_H */