#ifndef _SYS_USB_USBSACM_H
#define _SYS_USB_USBSACM_H
#include <sys/types.h>
#include <sys/dditypes.h>
#include <sys/note.h>
#include <sys/usb/clients/usbser/usbser_dsdi.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct usbsacm_port usbsacm_port_t;
typedef struct usbsacm_state usbsacm_state_t;
typedef struct usbsacm_power {
uint8_t pm_wakeup_enabled;
uint8_t pm_pwr_states;
boolean_t pm_raise_power;
uint8_t pm_cur_power;
uint_t pm_busy_cnt;
} usbsacm_pm_t;
struct usbsacm_port {
kmutex_t acm_port_mutex;
usbsacm_state_t *acm_device;
usb_pipe_handle_t acm_bulkin_ph;
int acm_bulkin_state;
usb_pipe_handle_t acm_bulkout_ph;
int acm_bulkout_state;
usb_pipe_handle_t acm_intr_ph;
int acm_intr_state;
usb_ep_descr_t acm_intr_ep_descr;
int acm_ctrl_if_no;
int acm_data_if_no;
int acm_data_port_no;
ds_cb_t acm_cb;
mblk_t *acm_rx_mp;
mblk_t *acm_tx_mp;
kcondvar_t acm_tx_cv;
uint8_t acm_mctlout;
uint8_t acm_mctlin;
int acm_cap;
usb_cdc_line_coding_t acm_line_coding;
int acm_port_state;
size_t acm_bulkin_size;
};
_NOTE(MUTEX_PROTECTS_DATA(usbsacm_port::acm_port_mutex, usbsacm_port))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbsacm_port::{
acm_device
acm_cb.cb_rx
acm_cb.cb_tx
acm_cb.cb_arg
acm_bulkin_ph
acm_bulkout_ph
acm_intr_ph
acm_ctrl_if_no
acm_data_if_no
acm_data_port_no
acm_port_state
}))
struct usbsacm_state {
kmutex_t acm_mutex;
dev_info_t *acm_dip;
usb_client_dev_data_t *acm_dev_data;
usb_event_t *acm_usb_events;
usb_pipe_handle_t acm_def_ph;
usb_log_handle_t acm_lh;
int acm_dev_state;
size_t acm_xfer_sz;
boolean_t acm_compatibility;
usbsacm_port_t *acm_ports;
int acm_port_cnt;
usbsacm_pm_t *acm_pm;
};
_NOTE(MUTEX_PROTECTS_DATA(usbsacm_state::acm_mutex, usbsacm_state))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbsacm_state::{
acm_dip
acm_dev_data
acm_usb_events
acm_def_ph
acm_lh
acm_dev_state
acm_xfer_sz
acm_compatibility
acm_ports
acm_port_cnt
acm_pm
}))
enum {
USBSACM_PORT_CLOSED,
USBSACM_PORT_OPEN,
USBSACM_PORT_CLOSING
};
enum {
USBSACM_PIPE_CLOSED,
USBSACM_PIPE_IDLE,
USBSACM_PIPE_BUSY,
USBSACM_PIPE_CLOSING
};
enum {
USBSACM_BULKOUT_TIMEOUT = 15,
USBSACM_BULKIN_TIMEOUT = 0
};
enum {
USBSACM_REQ_OUT = USB_DEV_REQ_TYPE_CLASS| USB_DEV_REQ_HOST_TO_DEV,
USBSACM_REQ_IN = USB_DEV_REQ_TYPE_CLASS | USB_DEV_REQ_DEV_TO_HOST,
USBSACM_REQ_WRITE_IF = USBSACM_REQ_OUT | USB_DEV_REQ_RCPT_IF,
USBSACM_REQ_READ_IF = USBSACM_REQ_IN | USB_DEV_REQ_RCPT_IF
};
#define PRINT_MASK_ATTA 0x00000001
#define PRINT_MASK_CLOSE 0x00000002
#define PRINT_MASK_OPEN 0x00000004
#define PRINT_MASK_EVENTS 0x00000008
#define PRINT_MASK_PM 0x00000010
#define PRINT_MASK_CB 0x00000020
#define PRINT_MASK_ALL 0xFFFFFFFF
#define NELEM(a) (sizeof (a) / sizeof (*(a)))
#ifdef __cplusplus
}
#endif
#endif