#ifndef _SYS_USB_USBA_USBA_TYPES_H
#define _SYS_USB_USBA_USBA_TYPES_H
#include <sys/taskq.h>
#include <sys/usb/usba/usba_private.h>
#include <sys/usb/usba/usbai_private.h>
#include <sys/usb/usba/bos.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct usba_ph_impl {
kmutex_t usba_ph_mutex;
struct usba_pipe_handle_data *usba_ph_data;
dev_info_t *usba_ph_dip;
usb_ep_descr_t usba_ph_ep;
usb_pipe_policy_t usba_ph_policy;
uint_t usba_ph_flags;
int usba_ph_ref_count;
usb_pipe_state_t usba_ph_state;
int usba_ph_state_changing;
} usba_ph_impl_t;
_NOTE(MUTEX_PROTECTS_DATA(usba_ph_impl::usba_ph_mutex, usba_ph_impl))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_ph_impl::usba_ph_data))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_ph_impl::usba_ph_dip))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_ph_impl::usba_ph_ep))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_ph_impl::usba_ph_policy))
#define USBA_PH_DATA_TOGGLE 0x01
#define USBA_PH_DATA_PERSISTENT 0x02
typedef struct usba_pipe_handle_data {
struct usba_ph_impl *p_ph_impl;
usba_list_entry_t p_queue;
struct usba_device *p_usba_device;
usb_pipe_policy_t p_policy;
usb_ep_descr_t p_ep;
usb_ep_xdescr_t p_xep;
dev_info_t *p_dip;
kmutex_t p_mutex;
usb_opaque_t p_hcd_private;
usb_opaque_t p_client_private;
int p_req_count;
usb_opaque_t p_usba_private;
taskq_t *p_taskq;
kthread_t *p_thread_id;
usba_list_entry_t p_cb_queue;
uint_t p_soft_intr;
uint_t p_spec_flag;
} usba_pipe_handle_data_t;
#define USBA_PH_FLAG_USE_SOFT_INTR 0x1
#define USBA_PH_FLAG_TQ_SHARE 0x2
#define USBA_DEFAULT_PIPE_EP 0
#define USBA_PH2ENDPOINT(ph) (((usba_pipe_handle_data_t *)(ph))->p_ep)
#define USBA_PIPE_CLOSING(state) \
(((state) == USB_PIPE_STATE_CLOSING) || \
((state) == USB_PIPE_STATE_CLOSED))
#define USBA_IS_DEFAULT_PIPE(ph) ((ph) == \
(ph)->p_usba_device->usb_ph_list[USBA_DEFAULT_PIPE_EP].usba_ph_data)
_NOTE(MUTEX_PROTECTS_DATA(usba_pipe_handle_data::p_mutex, \
usba_pipe_handle_data))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_pipe_handle_data::p_ph_impl))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_pipe_handle_data::p_usba_device))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_pipe_handle_data::p_hcd_private))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_pipe_handle_data::p_client_private))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_pipe_handle_data::p_ep))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_pipe_handle_data::p_dip))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_pipe_handle_data::p_taskq))
typedef uchar_t usb_addr_t;
#define USBA_DEFAULT_ADDR 0
#define USBA_N_ENDPOINTS 32
#define USBA_N_PMCOMP 5
typedef uint8_t usb_port_status_t;
typedef uint16_t usb_port_t;
typedef uint32_t usb_port_mask_t;
#define USBA_LOW_SPEED_DEV 0x1
#define USBA_FULL_SPEED_DEV 0x2
#define USBA_HIGH_SPEED_DEV 0x3
#define USBA_SUPER_SPEED_DEV 0x4
typedef struct usba_evdata {
struct usba_evdata *ev_next;
dev_info_t *ev_dip;
ddi_callback_id_t ev_rm_cb_id;
ddi_callback_id_t ev_ins_cb_id;
ddi_callback_id_t ev_suspend_cb_id;
ddi_callback_id_t ev_resume_cb_id;
} usba_evdata_t;
typedef struct usb_client_dev_data_list {
struct usb_client_dev_data_list *cddl_next;
struct usb_client_dev_data_list *cddl_prev;
dev_info_t *cddl_dip;
usb_client_dev_data_t *cddl_dev_data;
uint_t cddl_ifno;
} usb_client_dev_data_list_t;
typedef struct usba_device {
usba_list_entry_t usb_device_list;
struct usba_ph_impl usb_ph_list[USBA_N_ENDPOINTS];
kmutex_t usb_mutex;
dev_info_t *usb_dip;
struct usba_hcdi_ops *usb_hcdi_ops;
struct usba_hubdi *usb_hubdi;
usb_addr_t usb_addr;
uchar_t usb_no_cpr;
dev_info_t *usb_root_hub_dip;
struct hubd *usb_root_hubd;
usb_dev_descr_t *usb_dev_descr;
uchar_t *usb_cfg;
size_t usb_cfg_length;
char *usb_mfg_str;
char *usb_product_str;
char *usb_serialno_str;
char *usb_preferred_driver;
usb_port_status_t usb_port_status;
usb_port_t usb_port;
struct usba_device *usb_hs_hub_usba_dev;
usb_addr_t usb_hs_hub_addr;
usb_port_t usb_hs_hub_port;
uint_t usb_hs_hub_min_bandwidth;
uint_t usb_hs_hub_bandwidth[32];
uchar_t **usb_cfg_array;
uint_t usb_cfg_array_length;
uint16_t *usb_cfg_array_len;
uint_t usb_cfg_array_len_length;
uint_t usb_cfg_value;
uint_t usb_active_cfg_ndx;
char **usb_cfg_str_descr;
uchar_t usb_n_cfgs;
uchar_t usb_n_ifs;
uint16_t usb_pwr_from_hub;
int usb_ref_count;
usba_list_entry_t usb_allocated;
ddi_eventcookie_t rm_cookie;
ddi_eventcookie_t ins_cookie;
ddi_eventcookie_t suspend_cookie;
ddi_eventcookie_t resume_cookie;
usba_evdata_t *usb_evdata;
uchar_t *usb_client_flags;
struct {
dev_info_t *dip;
} *usb_client_attach_list;
usb_client_dev_data_list_t usb_client_dev_data_list;
struct {
dev_info_t *dip;
usb_event_t *ev_data;
} *usb_client_ev_cb_list;
taskq_t *usb_shared_taskq[USBA_N_ENDPOINTS];
uchar_t usb_shared_taskq_ref_count
[USBA_N_ENDPOINTS];
struct usba_device *usb_parent_hub;
void *usb_hcd_private;
mblk_t *usb_bos_mp;
uint_t usb_bos_nalloc;
uint_t usb_bos_nents;
usb_bos_t *usb_bos;
} usba_device_t;
#define USBA_CLIENT_FLAG_SIZE 1
#define USBA_CLIENT_FLAG_ATTACH 0x01
#define USBA_CLIENT_FLAG_EV_CBS 0x02
#define USBA_CLIENT_FLAG_DEV_DATA 0x04
_NOTE(MUTEX_PROTECTS_DATA(usba_device::usb_mutex, usba_device))
_NOTE(MUTEX_PROTECTS_DATA(usba_device::usb_mutex, usba_evdata))
_NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
usba_evdata::ev_rm_cb_id))
_NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
usba_evdata::ev_ins_cb_id))
_NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
usba_evdata::ev_suspend_cb_id))
_NOTE(SCHEME_PROTECTS_DATA("chg at attach only",
usba_evdata::ev_resume_cb_id))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_serialno_str))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_root_hub_dip))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_root_hubd))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_product_str))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_preferred_driver))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_port))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_n_ifs))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_n_cfgs))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_mfg_str))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_dev_descr))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_ph_list))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_value))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_str_descr))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_length))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_array))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_array_len))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_array_length))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg_array_len_length))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_cfg))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_hcdi_ops))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_addr))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_port_status))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::rm_cookie))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::ins_cookie))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::suspend_cookie))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::resume_cookie))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_client_flags))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_client_attach_list))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_client_ev_cb_list))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usba_device::usb_dip))
_NOTE(SCHEME_PROTECTS_DATA("set at device creation",
usba_device::usb_shared_taskq))
_NOTE(SCHEME_PROTECTS_DATA("local use only",
usb_key_descr::bDescriptorType))
_NOTE(SCHEME_PROTECTS_DATA("local use only",
usb_key_descr::bLength))
typedef struct usba_serialization_impl {
dev_info_t *s_dip;
kcondvar_t s_cv;
kmutex_t s_mutex;
kthread_t *s_thread;
int s_count;
uint_t s_flag;
} usba_serialization_impl_t;
_NOTE(SCHEME_PROTECTS_DATA("unshared private data",
usba_serialization_impl))
#ifdef __cplusplus
}
#endif
#endif