Create a branch for header work.
[reactos.git] / drivers / usb / nt4compat / usbdriver / devmgr.h
1 #ifndef __DEVMGR_H__
2 #define __DEVMGR_H__
3
4 typedef struct _DEV_CONNECT_DATA
5 {
6 DEV_HANDLE dev_handle;
7 struct _USB_DRIVER *pdriver;
8 struct _USB_DEV_MANAGER *dev_mgr;
9 PUSB_INTERFACE_DESC if_desc;
10
11 } DEV_CONNECT_DATA, *PDEV_CONNECT_DATA;
12
13 typedef BOOLEAN ( *PDEV_CONNECT_EX )( PDEV_CONNECT_DATA init_param, DEV_HANDLE dev_handle );
14 typedef BOOLEAN ( *PDEV_CONNECT )( struct _USB_DEV_MANAGER *dev_mgr, DEV_HANDLE dev_handle );
15 typedef BOOLEAN ( *PDRVR_INIT )( struct _USB_DEV_MANAGER *dev_mgr, struct _USB_DRIVER *pdriver );
16
17 typedef struct _PNP_DISPATCH
18 {
19 ULONG version;
20 PDEV_CONNECT_EX dev_connect;
21 PDEV_CONNECT dev_reserved; //currently we do not use this entry
22 PDEV_CONNECT dev_stop;
23 PDEV_CONNECT dev_disconnect;
24
25 }PNP_DISPATCH, *PPNP_DISPATCH;
26
27 #define USB_DRIVER_FLAG_IF_CAPABLE 0x80000000
28 #define USB_DRIVER_FLAG_DEV_CAPABLE 0x40000000
29
30 typedef struct _USB_DRIVER_DESCRIPTION
31 {
32 // Device Info
33 DWORD flags;
34 WORD vendor_id; // USB Vendor ID
35 WORD product_id; // USB Product ID.
36 WORD release_num; // Release Number of Device
37
38 // Interface Info
39 BYTE config_val; // Configuration Value
40 BYTE if_num; // Interface Number
41 BYTE if_class; // Interface Class
42 BYTE if_sub_class; // Interface SubClass
43 BYTE if_protocol; // Interface Protocol
44
45 // Driver Info
46 const char *driver_name; // Driver name for Name Registry
47 BYTE dev_class; // Device Class (from SampleStorageDeviceID.h)
48 BYTE dev_sub_class; // Device Subclass
49 BYTE dev_protocol; // Protocol Info.
50
51 } USB_DRIVER_DESCRIPTION,*PUSB_DRIVER_DESCRIPTION;
52
53 #define RH_DRIVER_IDX 0
54 #define HUB_DRIVER_IDX 1
55 #define UMSS_DRIVER_IDX 2
56 #define COMP_DRIVER_IDX 3
57 #define GEN_DRIVER_IDX 4
58 #define GEN_IF_DRIVER_IDX 5
59 #define MOUSE_DRIVER_IDX 6
60 #define KEYBOARD_DRIVER_IDX 7
61 #define DEVMGR_MAX_DRIVERS 8
62
63 typedef struct _USB_DRIVER
64 {
65 USB_DRIVER_DESCRIPTION driver_desc;
66 PNP_DISPATCH disp_tbl;
67
68 PBYTE driver_ext;
69 LONG driver_ext_size;
70
71 PDRVR_INIT driver_init;
72 PDRVR_INIT driver_destroy;
73
74 } USB_DRIVER, *PUSB_DRIVER;
75
76 extern USB_DRIVER g_driver_list[ DEVMGR_MAX_DRIVERS ];
77
78 #define MAX_HCDS 8
79 #define dev_mgr_from_hcd( hCD ) ( ( hCD )->hcd_get_dev_mgr( hCD ) )
80 #define dev_mgr_from_dev( pdEV ) ( dev_mgr_from_hcd( pdEV->hcd ) )
81
82 typedef struct _USB_DEV_MANAGER
83 {
84 //BYTE dev_addr_map[ MAX_DEVS / 8 ]; //one bit per dev
85 struct _HCD *hcd_array[ MAX_HCDS ];
86 unsigned char hcd_count;
87
88 KSPIN_LOCK dev_list_lock;
89 LIST_HEAD dev_list;
90
91 //PDEVICE_EXTENSION pdev_ext;
92
93 PVOID pthread;
94 BOOLEAN term_flag;
95 KEVENT wake_up_event;
96
97 KSPIN_LOCK event_list_lock;
98 LIST_HEAD event_list;
99 USB_EVENT_POOL event_pool;
100
101 KEVENT drivers_inited;
102 KTIMER dev_mgr_timer;
103 KDPC dev_mgr_timer_dpc;
104 KSPIN_LOCK timer_svc_list_lock;
105 LIST_HEAD timer_svc_list;
106 TIMER_SVC_POOL timer_svc_pool;
107 LONG timer_click;
108 IRP_LIST irp_list;
109
110 PUSB_DRIVER driver_list;
111 LONG hub_count;
112 LIST_HEAD hub_list; //for reference only
113
114 //statistics
115 LONG conn_count; //will also be used to assign device id
116 PDRIVER_OBJECT usb_driver_obj; //this driver object
117 LONG open_count; //increment when IRP_MJ_CREATE arrives
118 //and decrement when IRP_MJ_CLOSE arrives
119
120 } USB_DEV_MANAGER, *PUSB_DEV_MANAGER;
121
122 BOOLEAN
123 dev_mgr_post_event(
124 PUSB_DEV_MANAGER dev_mgr,
125 PUSB_EVENT event
126 );
127
128 BOOLEAN
129 dev_mgr_init(
130 PUSB_DEV dev, //always null. we do not use this param
131 ULONG event,
132 ULONG dev_mgr
133 );
134
135 VOID
136 dev_mgr_destroy(
137 PUSB_DEV_MANAGER dev_mgr
138 );
139
140 VOID NTAPI
141 dev_mgr_thread(
142 PVOID dev_mgr
143 );
144
145 VOID NTAPI
146 dev_mgr_timer_dpc_callback(
147 PKDPC Dpc,
148 PVOID DeferredContext,
149 PVOID SystemArgument1,
150 PVOID SystemArgument2
151 );
152
153 BOOLEAN
154 dev_mgr_request_timer_svc(
155 PUSB_DEV_MANAGER dev_mgr,
156 PUSB_DEV pdev,
157 ULONG context,
158 ULONG due_time,
159 TIMER_SVC_HANDLER handler
160 );
161
162 BYTE
163 dev_mgr_alloc_addr(
164 PUSB_DEV_MANAGER dev_mgr,
165 PHCD hcd
166 );
167
168 BOOLEAN
169 dev_mgr_free_addr(
170 PUSB_DEV_MANAGER dev_mgr,
171 PUSB_DEV pdev,
172 BYTE addr
173 );
174
175 PUSB_DEV
176 dev_mgr_alloc_device(
177 PUSB_DEV_MANAGER dev_mgr,
178 PHCD hcd
179 );
180
181 VOID
182 dev_mgr_free_device(
183 PUSB_DEV_MANAGER dev_mgr,
184 PUSB_DEV pdev
185 );
186
187 VOID
188 dev_mgr_disconnect_dev(
189 PUSB_DEV pdev
190 );
191
192 BOOLEAN
193 dev_mgr_strobe(
194 PUSB_DEV_MANAGER dev_mgr
195 );
196
197 NTSTATUS
198 dev_mgr_build_usb_config(
199 PUSB_DEV pdev,
200 PBYTE pbuf,
201 ULONG config_val,
202 LONG config_count
203 );
204
205 UCHAR
206 dev_mgr_register_hcd(
207 PUSB_DEV_MANAGER dev_mgr,
208 PHCD hcd
209 );
210
211 NTSTATUS
212 dev_mgr_dispatch(
213 IN PUSB_DEV_MANAGER dev_mgr,
214 IN PIRP irp
215 );
216
217 BOOLEAN
218 dev_mgr_register_irp(
219 PUSB_DEV_MANAGER dev_mgr,
220 PIRP pirp,
221 PURB purb
222 );
223
224 PURB
225 dev_mgr_remove_irp(
226 PUSB_DEV_MANAGER dev_mgr,
227 PIRP pirp
228 );
229
230 LONG
231 dev_mgr_score_driver_for_if(
232 PUSB_DEV_MANAGER dev_mgr,
233 PUSB_DRIVER pdriver,
234 PUSB_INTERFACE_DESC pif_desc
235 );
236
237 BOOLEAN
238 dev_mgr_set_driver(
239 PUSB_DEV_MANAGER dev_mgr,
240 DEV_HANDLE dev_handle,
241 PUSB_DRIVER pdriver,
242 PUSB_DEV pdev //if pdev != NULL, we use pdev instead if_handle
243 );
244
245 BOOLEAN
246 dev_mgr_set_if_driver(
247 PUSB_DEV_MANAGER dev_mgr,
248 DEV_HANDLE if_handle,
249 PUSB_DRIVER pdriver,
250 PUSB_DEV pdev //if pdev != NULL, we use pdev instead if_handle
251 );
252
253 VOID
254 dev_mgr_release_hcd(
255 PUSB_DEV_MANAGER dev_mgr
256 );
257
258 VOID
259 dev_mgr_start_hcd(
260 PUSB_DEV_MANAGER dev_mgr
261 );
262
263 BOOLEAN dev_mgr_start_config_dev(PUSB_DEV pdev);
264 BOOLEAN dev_mgr_event_init(PUSB_DEV dev, //always null. we do not use this param
265 ULONG event,
266 ULONG context,
267 ULONG param);
268 VOID dev_mgr_get_desc_completion(PURB purb, PVOID context);
269 VOID dev_mgr_event_select_driver(PUSB_DEV pdev, ULONG event, ULONG context, ULONG param);
270 LONG dev_mgr_score_driver_for_dev(PUSB_DEV_MANAGER dev_mgr, PUSB_DRIVER pdriver, PUSB_DEVICE_DESC pdev_desc);
271 NTSTATUS dev_mgr_destroy_usb_config(PUSB_CONFIGURATION pcfg);
272 BOOLEAN dev_mgr_start_select_driver(PUSB_DEV pdev);
273 VOID dev_mgr_cancel_irp(PDEVICE_OBJECT pdev_obj, PIRP pirp);
274
275 #endif