Print this page
5832 EOF wireless usb (aka UWB)
Reviewed by: TBD
Reviewed by: TBD
Approved by: TBD


   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",