#ifndef _SYS_USB_USBA_USBA_IMPL_H
#define _SYS_USB_USBA_USBA_IMPL_H
#include <sys/usb/usba.h>
#include <sys/usb/usba/hcdi.h>
#include <sys/usb/usba/hubdi.h>
#include <sys/usb/usba/usba_private.h>
#include <sys/usb/usba/usba_types.h>
#include <sys/usb/usba/bos.h>
#include <sys/taskq.h>
#include <sys/disp.h>
#ifdef __cplusplus
extern "C" {
#endif
#define USBA_UGEN_DEVICE_BINDING 1
#define USBA_UGEN_INTERFACE_BINDING 2
#define USBA_UGEN_INTERFACE_ASSOCIATION_BINDING 3
#define USBA_MAX_ADDRESS 127
#define USBA_ADDRESS_ARRAY_SIZE ((USBA_MAX_ADDRESS+8)/8)
typedef struct usba_pipe_async_req {
dev_info_t *dip;
struct usba_ph_impl *ph_impl;
usb_opaque_t arg;
usb_flags_t usb_flags;
void (*callback)(
usb_pipe_handle_t ph,
usb_opaque_t callback_arg,
int rval,
usb_cb_flags_t error_code);
usb_opaque_t callback_arg;
int (*sync_func)(dev_info_t *,
usba_ph_impl_t *,
struct usba_pipe_async_req *,
usb_flags_t);
} usba_pipe_async_req_t;
_NOTE(SCHEME_PROTECTS_DATA("unique per call", usba_pipe_async_req_t))
int usba_async_ph_req(usba_pipe_handle_data_t *, void (*func)(void *),
void *, usb_flags_t);
typedef struct usba_pm_req {
dev_info_t *dip;
int comp;
int old_level;
int level;
void (*cb)(void *, int);
void *arg;
uint_t flags;
} usba_pm_req_t;
_NOTE(SCHEME_PROTECTS_DATA("unique per call", usba_pm_req_t))
typedef struct usba_req_wrapper {
usba_list_entry_t wr_queue;
usb_opaque_t wr_req;
usba_list_entry_t wr_allocated_list;
kcondvar_t wr_cv;
boolean_t wr_done;
dev_info_t *wr_dip;
usb_opaque_t wr_hcd_private;
usba_pipe_handle_data_t *wr_ph_data;
usb_cr_t wr_cr;
usb_cb_flags_t wr_cb_flags;
usb_flags_t wr_usb_flags;
usb_req_attrs_t wr_attrs;
size_t wr_length;
} usba_req_wrapper_t;
_NOTE(SCHEME_PROTECTS_DATA("method", usba_req_wrapper))
_NOTE(SCHEME_PROTECTS_DATA("method", usb_ctrl_req))
_NOTE(SCHEME_PROTECTS_DATA("method", usb_bulk_req))
_NOTE(SCHEME_PROTECTS_DATA("method", usb_intr_req))
_NOTE(SCHEME_PROTECTS_DATA("method", usb_isoc_req))
#define USBA_WRP_FLAGS_WAIT 0x01
#define USBA_FLAGS_PRIVILEGED 0x02
#define USBA_WRP2REQ(wrp) ((wrp)->wr_req)
#define USBA_REQ2WRP(req) (usba_req_wrapper_t *)\
((uintptr_t)(req) - sizeof (usba_req_wrapper_t))
#define USBA_SETREQ_ADDR(wrp) ((uintptr_t)(wrp) + sizeof (*(wrp)))
#define USBA_WRP2CTRL_REQ(wrp) ((usb_ctrl_req_t *)USBA_WRP2REQ((wrp)))
#define USBA_WRP2INTR_REQ(wrp) ((usb_intr_req_t *)USBA_WRP2REQ((wrp)))
#define USBA_WRP2BULK_REQ(wrp) ((usb_bulk_req_t *)USBA_WRP2REQ((wrp)))
#define USBA_WRP2ISOC_REQ(wrp) ((usb_isoc_req_t *)USBA_WRP2REQ((wrp)))
#define USBA_WRP2PH_DATA(wrp) \
(usba_pipe_handle_data_t *)((wrp)->wr_ph_data)
#define USBA_WRQUEUE2WRP(queue) (usba_req_wrapper_t *)(queue)
#define USBA_ALLOCQ2WRP(queue) (usba_req_wrapper_t *)((uintptr_t) \
(queue) - sizeof (usba_list_entry_t) - sizeof (usb_opaque_t))
#define p_active_cntrl_req_wrp p_usba_private
usb_opaque_t usba_hcdi_get_ctrl_req_hcd_private(usb_ctrl_req_t *);
void usba_hcdi_set_ctrl_req_hcd_private(usb_ctrl_req_t *, usb_opaque_t);
int usba_set_usb_address(usba_device_t *);
void usba_unset_usb_address(usba_device_t *);
typedef struct usba_hubdi {
usba_list_entry_t hubdi_list;
dev_info_t *hubdi_dip;
int hubdi_flags;
} usba_hubdi_t;
char *usba_get_mfg_prod_sn_str(dev_info_t *, char *, int);
#define USBA_DEV_CONFIG_INDEX_UNDEFINED -1
void usba_usba_initialization();
void usba_usba_destroy();
void usba_usbai_register_initialization();
void usba_usbai_register_destroy();
void usba_usbai_initialization();
void usba_usbai_destroy();
void usba_hubdi_initialization();
void usba_hubdi_destroy();
void usba_devdb_initialization();
void usba_devdb_destroy();
int usba_hubdi_register(dev_info_t *, uint_t);
int usba_hubdi_unregister(dev_info_t *);
int usba_is_root_hub(dev_info_t *dip);
usba_device_t *usba_alloc_usba_device(dev_info_t *);
void usba_free_usba_device(usba_device_t *usba_device_t);
void usba_clear_data_toggle(usba_device_t *usba_device);
void usba_start_next_req(usba_pipe_handle_data_t *ph);
int usba_pipe_check_handle(usba_pipe_handle_data_t *);
int usba_drain_cbs(usba_pipe_handle_data_t *, usb_cb_flags_t,
usb_cr_t);
int usba_pipe_setup_func_call(dev_info_t *,
int (*sync_func)(dev_info_t *,
usba_ph_impl_t *, usba_pipe_async_req_t *,
usb_flags_t),
usba_ph_impl_t *,
usb_opaque_t,
usb_flags_t,
void (*cb)(usb_pipe_handle_t, usb_opaque_t,
int, usb_cb_flags_t),
usb_opaque_t);
void usba_pipe_new_state(usba_pipe_handle_data_t *, usb_pipe_state_t);
void usba_add_root_hub(dev_info_t *dip);
void usba_rem_root_hub(dev_info_t *dip);
void usba_get_dev_string_descrs(dev_info_t *, usba_device_t *);
void usba_get_binary_object_store(dev_info_t *, usba_device_t *);
void usba_add_binary_object_store_props(dev_info_t *, usba_device_t *);
void usba_free_binary_object_store(usba_device_t *);
#define USBA_CHECK_CONTEXT() ASSERT(!(servicing_interrupt()))
#define DPRINT_MASK_USBA 0x00000001
#define DPRINT_MASK_USBAI 0x00000002
#define DPRINT_MASK_HUBDI 0x00000004
#define DPRINT_MASK_HCDI 0x00000008
#define DPRINT_MASK_HCDI_DUMPING 0x00000010
#define DPRINT_MASK_HUBDI_DUMPING 0x00000020
#define DPRINT_MASK_REGISTER 0x00000040
#define DPRINT_MASK_DEVDB 0x00000080
#define DPRINT_MASK_WHCDI 0x00000100
#define DPRINT_MASK_ALL 0xFFFFFFFF
typedef struct usba_log_handle_impl {
dev_info_t *lh_dip;
char *lh_name;
uint_t *lh_errlevel;
uint_t *lh_mask;
uint_t *lh_instance_filter;
uint_t lh_flags;
} usba_log_handle_impl_t;
_NOTE(SCHEME_PROTECTS_DATA("USBA managed data", usba_log_handle_impl))
#define USBA_DRVNAME_LEN 40
#define USBA_PRINT_BUF_LEN 256
#define DONTCARE ((int16_t)-1)
#define FLAG_INTERFACE_NODE 0
#define FLAG_DEVICE_NODE 1
#define FLAG_COMBINED_NODE 2
#define FLAG_INTERFACE_ASSOCIATION_NODE 3
typedef struct node_name_entry {
int16_t class;
int16_t subclass;
int16_t protocol;
char *name;
} node_name_entry_t;
#define USBA_TOTAL_HOTPLUG_SUCCESS 0x01
#define USBA_HOTPLUG_SUCCESS 0x02
#define USBA_TOTAL_HOTPLUG_FAILURE 0x04
#define USBA_HOTPLUG_FAILURE 0x08
void usba_update_hotplug_stats(dev_info_t *, usb_flags_t);
void usba_get_hotplug_stats(dev_info_t *,
ulong_t *, ulong_t *, ulong_t *,
ulong_t *, uchar_t *);
void usba_reset_hotplug_stats(dev_info_t *);
extern usb_log_handle_t usbai_log_handle;
extern kmutex_t usbai_mutex;
void usba_req_normal_cb(usba_req_wrapper_t *);
void usba_req_exc_cb(usba_req_wrapper_t *, usb_cr_t, usb_cb_flags_t);
void usba_do_req_exc_cb(usba_req_wrapper_t *, usb_cr_t,
usb_cb_flags_t);
void usba_req_set_cb_flags(usba_req_wrapper_t *, usb_cb_flags_t);
int usba_create_child_devi(dev_info_t *, char *, usba_hcdi_ops_t *,
dev_info_t *, usb_port_status_t,
usba_device_t *, dev_info_t **);
int usba_destroy_child_devi(dev_info_t *, uint_t);
usb_cr_t usba_rval2cr(int);
usb_pipe_handle_t usba_get_dflt_pipe_handle(dev_info_t *);
dev_info_t *usba_get_dip(usb_pipe_handle_t);
usb_pipe_handle_t usba_usbdev_to_dflt_pipe_handle(usba_device_t *);
usb_pipe_handle_t usba_get_pipe_handle(usba_pipe_handle_data_t *);
usba_pipe_handle_data_t *usba_get_ph_data(usb_pipe_handle_t);
usb_pipe_state_t usba_get_ph_state(usba_pipe_handle_data_t *);
int usba_get_ph_ref_count(usba_pipe_handle_data_t *);
usba_pipe_handle_data_t *usba_hold_ph_data(usb_pipe_handle_t);
void usba_release_ph_data(usba_ph_impl_t *);
void usba_persistent_pipe_close(usba_device_t *);
int usba_persistent_pipe_open(usba_device_t *);
void usba_check_for_leaks(usba_device_t *);
void usba_req_wrapper_free(usba_req_wrapper_t *);
typedef struct usb_dev_cap {
dev_info_t *dip;
usb_dev_driver_callback_t usba_dev_driver_cb;
} usb_dev_cap_t;
extern usb_dev_cap_t usb_cap;
_NOTE(SCHEME_PROTECTS_DATA("unique device capture data", usb_cap))
#ifdef __cplusplus
}
#endif
#endif