6 * Hub Class feature numbers
8 #define C_HUB_LOCAL_POWER 0
9 #define C_HUB_OVER_CURRENT 1
12 * Port feature numbers
14 #define USB_PORT_FEAT_CONNECTION 0
15 #define USB_PORT_FEAT_ENABLE 1
16 #define USB_PORT_FEAT_SUSPEND 2
17 #define USB_PORT_FEAT_OVER_CURRENT 3
18 #define USB_PORT_FEAT_RESET 4
19 #define USB_PORT_FEAT_POWER 8
20 #define USB_PORT_FEAT_LOWSPEED 9
21 #define USB_PORT_FEAT_C_CONNECTION 16
22 #define USB_PORT_FEAT_C_ENABLE 17
23 #define USB_PORT_FEAT_C_SUSPEND 18
24 #define USB_PORT_FEAT_C_OVER_CURRENT 19
25 #define USB_PORT_FEAT_C_RESET 20
27 /* wPortStatus bits */
28 #define USB_PORT_STAT_CONNECTION 0x0001
29 #define USB_PORT_STAT_ENABLE 0x0002
30 #define USB_PORT_STAT_SUSPEND 0x0004
31 #define USB_PORT_STAT_OVERCURRENT 0x0008
32 #define USB_PORT_STAT_RESET 0x0010
33 #define USB_PORT_STAT_POWER 0x0100
34 #define USB_PORT_STAT_LOW_SPEED 0x0200
36 /* usb 2.0 features */
37 #define USB_PORT_STAT_HIGH_SPEED 0x0400
38 #define USB_PORT_STAT_PORT_TEST 0x0800
39 #define USB_PORT_STAT_PORT_INDICATOR 0x1000
41 /* wPortChange bits */
42 #define USB_PORT_STAT_C_CONNECTION 0x0001
43 #define USB_PORT_STAT_C_ENABLE 0x0002
44 #define USB_PORT_STAT_C_SUSPEND 0x0004
45 #define USB_PORT_STAT_C_OVERCURRENT 0x0008
46 #define USB_PORT_STAT_C_RESET 0x0010
48 /* wHubCharacteristics (masks) */
49 #define HUB_CHAR_LPSM 0x0003
50 #define HUB_CHAR_COMPOUND 0x0004
51 #define HUB_CHAR_OCPM 0x0018
54 *Hub Status & Hub Change bit masks
56 #define HUB_STATUS_LOCAL_POWER 0x0001
57 #define HUB_STATUS_OVERCURRENT 0x0002
59 #define HUB_CHANGE_LOCAL_POWER 0x0001
60 #define HUB_CHANGE_OVERCURRENT 0x0002
62 #define HUB_DESCRIPTOR_MAX_SIZE 39 /* enough for 127 ports on a hub */
64 #define MAX_HUB_PORTS 8
65 #define USB_HUB_INTERVAL 0xff
67 #define USB_PORT_FLAG_STATE_MASK ( 0xf << 16 )
68 #define USB_PORT_FLAG_ENABLE ( 0x1 << 16 )
69 #define USB_PORT_FLAG_DISABLE ( 0x2 << 16 )
70 #define USB_PORT_FLAG_DISCONNECT ( 0x3 << 16 )
72 #define USB_PORT_QUE_STATE_MASK 0xff // for detail, refer to document.txt
73 #define STATE_IDLE 0x00
74 #define STATE_EXAMINE_STATUS_QUE 0x01 // set when post a event to examine the status queue
75 #define STATE_WAIT_STABLE 0x02 // set when a new connection comes and about to wait some ms
76 #define STATE_WAIT_RESET 0x03 // set when dev stable and about to reset, may pending in the event queue
77 #define STATE_WAIT_RESET_COMPLETE 0x04 // set when reset signal is about to assert on the port
78 #define STATE_WAIT_ADDRESSED 0x05 // set when reset complete and before address is assigned
80 #define port_state( port_FLAG ) \
81 ( port_FLAG & USB_PORT_QUE_STATE_MASK )
83 #define set_port_state( port_FLAG, stATE ) \
84 { port_FLAG = ( port_FLAG & (~USB_PORT_QUE_STATE_MASK ) ) | ( stATE & USB_PORT_QUE_STATE_MASK ) ;}
86 #define default_endp_handle( endp_HANDLE ) \
87 ( ( endp_HANDLE & 0xffff ) == 0xffff )
89 #define is_if_dev( pdev ) ( pdev->flags & USB_DEV_FLAG_IF_DEV )
91 #define is_composite_dev( pdev ) \
92 ( is_if_dev( pdev ) == FALSE \
93 && pdev->pusb_dev_desc->bDeviceClass == 0 \
94 && pdev->pusb_dev_desc->bDeviceSubClass == 0 )
96 #define dev_handle_from_dev( pdev ) ( pdev->dev_id << 16 )
97 #define hub_ext_from_dev( pdEV ) ( ( PHUB2_EXTENSION )pdEV->dev_ext )
99 #pragma pack( push, hub_align, 1 )
100 typedef struct _USB_PORT_STATUS
105 } USB_PORT_STATUS
, *PUSB_PORT_STATUS
;
108 typedef struct _USB_HUB_STATUS
113 } USB_HUB_STATUS
, *PUSB_HUB_STATUS
;
116 typedef struct _USB_HUB_DESCRIPTOR
119 BYTE bDescriptorType
;
121 USHORT wHubCharacteristics
;
123 BYTE bHubContrCurrent
;
125 /* DeviceRemovable and PortPwrCtrlMask want to be variable-length
126 bitmaps that hold max 256 entries, but for now they're ignored */
128 } USB_HUB_DESCRIPTOR
, *PUSB_HUB_DESCRIPTOR
;
129 #pragma pack( pop, hub_align )
131 typedef struct _PORT_STATUS_QUEUE
133 USB_PORT_STATUS port_status
[ 4 ];
137 } PORT_STATUS_QUEUE
, *PPORT_STATUS_QUEUE
;
141 PPORT_STATUS_QUEUE psq
146 PPORT_STATUS_QUEUE psq
,
151 PPORT_STATUS_QUEUE psq
152 ); //return 0xffffffff if no element
156 PPORT_STATUS_QUEUE psq
,
160 #define psq_is_empty( pSQ ) ( ( pSQ )->status_count == 0 )
161 #define psq_is_full( pSQ ) ( ( pSQ )->status_count == 4 )
162 #define psq_count( psq ) ( ( psq )->status_count )
163 #define psq_peek( psq, i ) \
164 ( ( ( ULONG )i ) < 3 ? ( psq )->port_status[ i ] : ( psq )->port_status[ 3 ] )
167 #define EHCI_MAX_ROOT_PORTS 15
169 typedef struct _HUB_EXTENSION
173 PUSB_DEV child_dev
[ MAX_HUB_PORTS
+ 1 ];
175 PORT_STATUS_QUEUE port_status_queue
[ MAX_HUB_PORTS
+ 1];
178 BYTE int_data_buf
[ 64 ];
180 USB_HUB_STATUS hub_status
;
181 USB_PORT_STATUS port_status
; //working data buf for get port feature
183 USB_PORT_STATUS rh_port1_status
; //working buf for get rh port1 feature
184 USB_PORT_STATUS rh_port2_status
; //working buf for get rh port2 feature
186 USB_HUB_DESCRIPTOR hub_desc
;
188 } HUB_EXTENSION
, *PHUB_EXTENSION
;
190 typedef struct _HUB2_PORT_TT
194 } HUB2_PORT_TT
, *PHUB2_PORT_TT
;
196 typedef struct _HUB2_EXTENSION
200 PUSB_DEV child_dev
[ MAX_HUB_PORTS
+ 1 ];
202 PORT_STATUS_QUEUE port_status_queue
[ MAX_HUB_PORTS
+ 1];
206 BYTE int_data_buf
[ 32 ]; // for ports up to 127
208 USB_HUB_STATUS hub_status
;
209 USB_PORT_STATUS port_status
; //working data buf for get port feature
211 USB_PORT_STATUS rh_port_status
[ EHCI_MAX_ROOT_PORTS
+ 1 ]; //working buf for get rh ports feature
213 UCHAR multiple_tt
; // boolean
214 ULONG tt_status_map
[ 4 ]; // bit map to indicate the indexed tt's periodic buffer busy or not
215 ULONG tt_bulk_map
[ 4 ]; // bit map to indicate the indexed tt's bulk/control buffer busy or not
216 USB_HUB_DESCRIPTOR hub_desc
;
218 } HUB2_EXTENSION
, *PHUB2_EXTENSION
;
222 event_list_default_process_queue(
223 PLIST_HEAD event_list
,
224 PUSB_EVENT_POOL event_pool
,
225 PUSB_EVENT usb_event
,
230 event_list_default_process_event(
237 // root hub routines and definitions
239 #define RH_INTERVAL ( USB_HUB_INTERVAL / DEV_MGR_TIMER_INTERVAL_MS )
243 PUSB_DEV_MANAGER dev_mgr
,
249 PUSB_DEV_MANAGER dev_mgr
,
284 UCHAR type
// transfer type
296 hub_post_clear_tt_event(
304 PUSB_DEV_MANAGER dev_mgr
,
309 compdev_driver_destroy(
310 PUSB_DEV_MANAGER dev_mgr
,
316 PUSB_DEV_MANAGER dev_mgr
,
321 gendrv_driver_destroy(
322 PUSB_DEV_MANAGER dev_mgr
,
327 gendrv_if_driver_init(
328 PUSB_DEV_MANAGER dev_mgr
,
333 gendrv_if_driver_destroy(
334 PUSB_DEV_MANAGER dev_mgr
,
338 BOOLEAN
hub_driver_init(PUSB_DEV_MANAGER dev_mgr
, PUSB_DRIVER pdriver
);
339 BOOLEAN
hub_driver_destroy(PUSB_DEV_MANAGER dev_mgr
, PUSB_DRIVER pdriver
);
340 BOOLEAN
hub_remove_reset_event(PUSB_DEV pdev
, ULONG port_idx
, BOOLEAN from_dpc
);
341 BOOLEAN
hub_start_next_reset_port(PUSB_DEV_MANAGER dev_mgr
, BOOLEAN from_dpc
);
342 NTSTATUS
hub_start_int_request(PUSB_DEV pdev
);