3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 *
21 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
22 * Use is subject to license terms.
23 */
24
25 #ifndef _SYS_USB_USBA_USBA_TYPES_H
26 #define _SYS_USB_USBA_USBA_TYPES_H
27
28
29 #include <sys/taskq.h>
30 #include <sys/usb/usba/usba_private.h>
31 #include <sys/usb/usba/usbai_private.h>
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 /* backup structure for opaque usb_pipe_handle_t */
38 typedef struct usba_ph_impl {
39 kmutex_t usba_ph_mutex;
40 struct usba_pipe_handle_data *usba_ph_data; /* actual pipe handle */
41 dev_info_t *usba_ph_dip; /* owner dip */
42 usb_ep_descr_t usba_ph_ep; /* save ep descr */
209 /* NDI evetn service callback ids */
210 ddi_callback_id_t ev_rm_cb_id;
211 ddi_callback_id_t ev_ins_cb_id;
212 ddi_callback_id_t ev_suspend_cb_id;
213 ddi_callback_id_t ev_resume_cb_id;
214 } usba_evdata_t;
215
216 /*
217 * a client may request dev_data multiple times (eg. for
218 * ugen support) so we need a linked list
219 */
220 typedef struct usb_client_dev_data_list {
221 struct usb_client_dev_data_list *cddl_next;
222 struct usb_client_dev_data_list *cddl_prev;
223 dev_info_t *cddl_dip;
224 usb_client_dev_data_t *cddl_dev_data;
225 uint_t cddl_ifno;
226 } usb_client_dev_data_list_t;
227
228 /*
229 * wireless usb specific data
230 */
231 typedef struct usba_wireless_data {
232 uint8_t *wusb_bos; /* raw bos descr */
233 uint_t wusb_bos_length; /* length of bos descr */
234 usb_uwb_cap_descr_t *uwb_descr; /* UWB capability descr */
235 } usba_wireless_data_t;
236
237
238 /*
239 * This structure uniquely identifies a USB device
240 * with all interfaces, or just one interface of a USB device.
241 * usba_device is associated with a devinfo node
242 *
243 * This structure is allocated and maintained by USBA and
244 * read-only for HCD
245 *
246 * There can be multiple clients per device (multi-class
247 * device) in which case this structure is shared.
248 */
249 typedef struct usba_device {
250 /* for linking all usba_devices on this bus */
251 usba_list_entry_t usb_device_list;
252
253 /* linked list of all pipe handles on this device per endpoint */
254 struct usba_ph_impl usb_ph_list[USBA_N_ENDPOINTS];
255
256 kmutex_t usb_mutex; /* protecting usba_device */
257
258 dev_info_t *usb_dip;
286 usb_addr_t usb_hs_hub_addr; /* High speed hub address */
287 usb_port_t usb_hs_hub_port; /* High speed hub port */
288
289 /* For high speed hub bandwidth allocation scheme */
290 uint_t usb_hs_hub_min_bandwidth;
291 uint_t usb_hs_hub_bandwidth[32];
292
293 /* store all config cloud here */
294 uchar_t **usb_cfg_array;
295 uint_t usb_cfg_array_length;
296
297 uint16_t *usb_cfg_array_len;
298 uint_t usb_cfg_array_len_length;
299
300 uint_t usb_cfg_value;
301 uint_t usb_active_cfg_ndx;
302 char **usb_cfg_str_descr;
303 uchar_t usb_n_cfgs;
304 uchar_t usb_n_ifs;
305
306 /* To support WUSB */
307 boolean_t usb_is_wa;
308 boolean_t usb_is_wireless;
309 usba_wireless_data_t *usb_wireless_data;
310
311 /*
312 * power drawn from hub, if > 0, the power has been
313 * subtracted from the parent hub's power budget
314 */
315 uint16_t usb_pwr_from_hub;
316
317 /* ref count, if > 0, this structure is in use */
318 int usb_ref_count;
319
320 /* list of requests allocated for this device, detects leaks */
321 usba_list_entry_t usb_allocated; /* alloc'ed reqs list */
322
323 /* NDI event service cookies */
324 ddi_eventcookie_t rm_cookie;
325 ddi_eventcookie_t ins_cookie;
326 ddi_eventcookie_t suspend_cookie;
327 ddi_eventcookie_t resume_cookie;
328
329 /* linked list of callid (per-devinfo) */
330 usba_evdata_t *usb_evdata;
339 usb_client_dev_data_list_t usb_client_dev_data_list;
340
341 struct {
342 dev_info_t *dip;
343 usb_event_t *ev_data;
344 } *usb_client_ev_cb_list;
345
346 /* Shared task queue implementation. */
347 taskq_t *usb_shared_taskq[USBA_N_ENDPOINTS];
348 uchar_t usb_shared_taskq_ref_count
349 [USBA_N_ENDPOINTS];
350 } usba_device_t;
351
352 #define USBA_CLIENT_FLAG_SIZE 1
353 #define USBA_CLIENT_FLAG_ATTACH 0x01
354 #define USBA_CLIENT_FLAG_EV_CBS 0x02
355 #define USBA_CLIENT_FLAG_DEV_DATA 0x04
356
357 _NOTE(MUTEX_PROTECTS_DATA(usba_device::usb_mutex, usba_device))
358 _NOTE(MUTEX_PROTECTS_DATA(usba_device::usb_mutex, usba_evdata))
359 _NOTE(MUTEX_PROTECTS_DATA(usba_device::usb_mutex, usba_wireless_data))
360
361 _NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
362 usba_evdata::ev_rm_cb_id))
363 _NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
364 usba_evdata::ev_ins_cb_id))
365 _NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
366 usba_evdata::ev_suspend_cb_id))
367 _NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
368 usba_evdata::ev_resume_cb_id))
369
370 _NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
371 usba_wireless_data::wusb_bos))
372 _NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
373 usba_wireless_data::wusb_bos_length))
374 _NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
375 usba_wireless_data::uwb_descr))
376
377 /* this should be really stable data */
378 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_serialno_str))
379 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_root_hub_dip))
380 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_root_hubd))
381 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_product_str))
382 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_preferred_driver))
383 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_port))
384 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_n_ifs))
385 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_n_cfgs))
386 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_mfg_str))
387 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_dev_descr))
388 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_ph_list))
389 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_value))
390 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_str_descr))
391 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_length))
392 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_array))
393 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_array_len))
394 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_array_length))
395 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_array_len_length))
396 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg))
397 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_hcdi_ops))
398 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_addr))
399 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_port_status))
400 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::rm_cookie))
401 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::ins_cookie))
402 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::suspend_cookie))
403 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::resume_cookie))
404 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_client_flags))
405 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_client_attach_list))
406 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_client_ev_cb_list))
407 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_dip))
408 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_is_wireless))
409 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_wireless_data))
410 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_is_wa))
411 _NOTE(SCHEME_PROTECTS_DATA("set at device creation",
412 usba_device::usb_shared_taskq))
413
414 _NOTE(SCHEME_PROTECTS_DATA("local use only",
415 usb_key_descr::bDescriptorType))
416 _NOTE(SCHEME_PROTECTS_DATA("local use only",
417 usb_key_descr::bLength))
418 /*
419 * serialization in drivers
420 */
421 typedef struct usba_serialization_impl {
422 dev_info_t *s_dip;
423 kcondvar_t s_cv;
424 kmutex_t s_mutex;
425 kthread_t *s_thread;
426 int s_count;
427 uint_t s_flag;
428 } usba_serialization_impl_t;
429
430 _NOTE(SCHEME_PROTECTS_DATA("unshared private data",
|
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 *
21 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
22 * Use is subject to license terms.
23 *
24 * Copyright 2014 Garrett D'Amore <garrett@damore.org>
25 */
26
27 #ifndef _SYS_USB_USBA_USBA_TYPES_H
28 #define _SYS_USB_USBA_USBA_TYPES_H
29
30
31 #include <sys/taskq.h>
32 #include <sys/usb/usba/usba_private.h>
33 #include <sys/usb/usba/usbai_private.h>
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 /* backup structure for opaque usb_pipe_handle_t */
40 typedef struct usba_ph_impl {
41 kmutex_t usba_ph_mutex;
42 struct usba_pipe_handle_data *usba_ph_data; /* actual pipe handle */
43 dev_info_t *usba_ph_dip; /* owner dip */
44 usb_ep_descr_t usba_ph_ep; /* save ep descr */
211 /* NDI evetn service callback ids */
212 ddi_callback_id_t ev_rm_cb_id;
213 ddi_callback_id_t ev_ins_cb_id;
214 ddi_callback_id_t ev_suspend_cb_id;
215 ddi_callback_id_t ev_resume_cb_id;
216 } usba_evdata_t;
217
218 /*
219 * a client may request dev_data multiple times (eg. for
220 * ugen support) so we need a linked list
221 */
222 typedef struct usb_client_dev_data_list {
223 struct usb_client_dev_data_list *cddl_next;
224 struct usb_client_dev_data_list *cddl_prev;
225 dev_info_t *cddl_dip;
226 usb_client_dev_data_t *cddl_dev_data;
227 uint_t cddl_ifno;
228 } usb_client_dev_data_list_t;
229
230 /*
231 * This structure uniquely identifies a USB device
232 * with all interfaces, or just one interface of a USB device.
233 * usba_device is associated with a devinfo node
234 *
235 * This structure is allocated and maintained by USBA and
236 * read-only for HCD
237 *
238 * There can be multiple clients per device (multi-class
239 * device) in which case this structure is shared.
240 */
241 typedef struct usba_device {
242 /* for linking all usba_devices on this bus */
243 usba_list_entry_t usb_device_list;
244
245 /* linked list of all pipe handles on this device per endpoint */
246 struct usba_ph_impl usb_ph_list[USBA_N_ENDPOINTS];
247
248 kmutex_t usb_mutex; /* protecting usba_device */
249
250 dev_info_t *usb_dip;
278 usb_addr_t usb_hs_hub_addr; /* High speed hub address */
279 usb_port_t usb_hs_hub_port; /* High speed hub port */
280
281 /* For high speed hub bandwidth allocation scheme */
282 uint_t usb_hs_hub_min_bandwidth;
283 uint_t usb_hs_hub_bandwidth[32];
284
285 /* store all config cloud here */
286 uchar_t **usb_cfg_array;
287 uint_t usb_cfg_array_length;
288
289 uint16_t *usb_cfg_array_len;
290 uint_t usb_cfg_array_len_length;
291
292 uint_t usb_cfg_value;
293 uint_t usb_active_cfg_ndx;
294 char **usb_cfg_str_descr;
295 uchar_t usb_n_cfgs;
296 uchar_t usb_n_ifs;
297
298 /*
299 * power drawn from hub, if > 0, the power has been
300 * subtracted from the parent hub's power budget
301 */
302 uint16_t usb_pwr_from_hub;
303
304 /* ref count, if > 0, this structure is in use */
305 int usb_ref_count;
306
307 /* list of requests allocated for this device, detects leaks */
308 usba_list_entry_t usb_allocated; /* alloc'ed reqs list */
309
310 /* NDI event service cookies */
311 ddi_eventcookie_t rm_cookie;
312 ddi_eventcookie_t ins_cookie;
313 ddi_eventcookie_t suspend_cookie;
314 ddi_eventcookie_t resume_cookie;
315
316 /* linked list of callid (per-devinfo) */
317 usba_evdata_t *usb_evdata;
326 usb_client_dev_data_list_t usb_client_dev_data_list;
327
328 struct {
329 dev_info_t *dip;
330 usb_event_t *ev_data;
331 } *usb_client_ev_cb_list;
332
333 /* Shared task queue implementation. */
334 taskq_t *usb_shared_taskq[USBA_N_ENDPOINTS];
335 uchar_t usb_shared_taskq_ref_count
336 [USBA_N_ENDPOINTS];
337 } usba_device_t;
338
339 #define USBA_CLIENT_FLAG_SIZE 1
340 #define USBA_CLIENT_FLAG_ATTACH 0x01
341 #define USBA_CLIENT_FLAG_EV_CBS 0x02
342 #define USBA_CLIENT_FLAG_DEV_DATA 0x04
343
344 _NOTE(MUTEX_PROTECTS_DATA(usba_device::usb_mutex, usba_device))
345 _NOTE(MUTEX_PROTECTS_DATA(usba_device::usb_mutex, usba_evdata))
346
347 _NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
348 usba_evdata::ev_rm_cb_id))
349 _NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
350 usba_evdata::ev_ins_cb_id))
351 _NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
352 usba_evdata::ev_suspend_cb_id))
353 _NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
354 usba_evdata::ev_resume_cb_id))
355
356 /* this should be really stable data */
357 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_serialno_str))
358 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_root_hub_dip))
359 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_root_hubd))
360 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_product_str))
361 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_preferred_driver))
362 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_port))
363 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_n_ifs))
364 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_n_cfgs))
365 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_mfg_str))
366 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_dev_descr))
367 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_ph_list))
368 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_value))
369 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_str_descr))
370 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_length))
371 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_array))
372 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_array_len))
373 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_array_length))
374 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_array_len_length))
375 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg))
376 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_hcdi_ops))
377 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_addr))
378 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_port_status))
379 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::rm_cookie))
380 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::ins_cookie))
381 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::suspend_cookie))
382 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::resume_cookie))
383 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_client_flags))
384 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_client_attach_list))
385 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_client_ev_cb_list))
386 _NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_dip))
387 _NOTE(SCHEME_PROTECTS_DATA("set at device creation",
388 usba_device::usb_shared_taskq))
389
390 _NOTE(SCHEME_PROTECTS_DATA("local use only",
391 usb_key_descr::bDescriptorType))
392 _NOTE(SCHEME_PROTECTS_DATA("local use only",
393 usb_key_descr::bLength))
394 /*
395 * serialization in drivers
396 */
397 typedef struct usba_serialization_impl {
398 dev_info_t *s_dip;
399 kcondvar_t s_cv;
400 kmutex_t s_mutex;
401 kthread_t *s_thread;
402 int s_count;
403 uint_t s_flag;
404 } usba_serialization_impl_t;
405
406 _NOTE(SCHEME_PROTECTS_DATA("unshared private data",
|