#ifndef _SYS_USB_USBSER_KEYSPAN_VAR_H
#define _SYS_USB_USBSER_KEYSPAN_VAR_H
#include <sys/types.h>
#include <sys/dditypes.h>
#include <sys/note.h>
#include <sys/usb/clients/usbser/usbser_dsdi.h>
#include <sys/usb/clients/usbser/usbser_keyspan/usa90msg.h>
#include <sys/usb/clients/usbser/usbser_keyspan/usa49msg.h>
#ifdef __cplusplus
extern "C" {
#endif
#define KEYSPAN_USA19HS_PID 0x121
#define KEYSPAN_USA49WLC_PID 0x12a
#define KEYSPAN_USA49WG_PID 0x131
#define KEYSPAN_MAX_PORT_NUM 4
typedef struct keyspan_pre_state keyspan_pre_state_t;
typedef struct keyspan_state keyspan_state_t;
typedef struct keyspan_port keyspan_port_t;
#include <sys/usb/clients/usbser/usbser_keyspan/keyspan_pipe.h>
struct keyspan_pre_state {
dev_info_t *kb_dip;
int kb_instance;
usb_client_dev_data_t *kb_dev_data;
usb_log_handle_t kb_lh;
keyspan_pipe_t kb_def_pipe;
};
typedef struct usbser_keyspan_fw_record {
uint16_t address;
uint8_t data_len;
uint8_t data[64];
} usbser_keyspan_fw_record_t;
#define ezusb_hex_record usbser_keyspan_fw_record
typedef struct keyspan_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;
} keyspan_pm_t;
typedef struct keyspan_dev_spec {
uint16_t id_product;
uint8_t port_cnt;
uint8_t ctrl_ep_addr;
uint8_t stat_ep_addr;
uint8_t dataout_ep_addr[4];
uint8_t datain_ep_addr[4];
} keyspan_dev_spec_t;
typedef union keyspan_port_ctrl_msg {
keyspan_usa19hs_port_ctrl_msg_t usa19hs;
keyspan_usa49_port_ctrl_msg_t usa49;
} keyspan_port_ctrl_msg_t;
typedef union keyspan_port_status_msg {
keyspan_usa19hs_port_status_msg_t usa19hs;
keyspan_usa49_port_status_msg_t usa49;
} keyspan_port_status_msg_t;
struct keyspan_state {
kmutex_t ks_mutex;
dev_info_t *ks_dip;
keyspan_port_t *ks_ports;
keyspan_dev_spec_t ks_dev_spec;
ksema_t ks_pipes_sema;
usb_client_dev_data_t *ks_dev_data;
usb_event_t *ks_usb_events;
keyspan_pipe_t ks_def_pipe;
keyspan_pipe_t ks_statin_pipe;
keyspan_pipe_t ks_ctrlout_pipe;
usb_log_handle_t ks_lh;
int ks_dev_state;
keyspan_pm_t *ks_pm;
usb_pipe_handle_t ks_datain_pipe_handle;
uint8_t ks_datain_open_cnt;
uint8_t ks_reconnect_flag;
};
_NOTE(MUTEX_PROTECTS_DATA(keyspan_state::ks_mutex, keyspan_state))
_NOTE(DATA_READABLE_WITHOUT_LOCK(keyspan_state::{
ks_dip
ks_dev_data
ks_usb_events
ks_dev_spec
ks_ports
ks_def_pipe
ks_ctrlout_pipe.pipe_handle
ks_statin_pipe.pipe_handle
ks_lh
ks_pm
}))
struct keyspan_port {
kmutex_t kp_mutex;
keyspan_state_t *kp_ksp;
char kp_lh_name[16];
usb_log_handle_t kp_lh;
uint_t kp_port_num;
int kp_state;
int kp_flags;
ds_cb_t kp_cb;
kcondvar_t kp_tx_cv;
mblk_t *kp_rx_mp;
mblk_t *kp_tx_mp;
boolean_t kp_no_more_reads;
keyspan_port_ctrl_msg_t kp_ctrl_msg;
keyspan_port_status_msg_t kp_status_msg;
uint_t kp_baud;
uint8_t kp_lcr;
uint8_t kp_status_flag;
keyspan_pipe_t kp_datain_pipe;
keyspan_pipe_t kp_dataout_pipe;
uint_t kp_read_len;
uint_t kp_write_len;
};
_NOTE(MUTEX_PROTECTS_DATA(keyspan_port::kp_mutex, keyspan_port))
_NOTE(DATA_READABLE_WITHOUT_LOCK(keyspan_port::{
kp_ksp
kp_lh
kp_port_num
kp_read_len
kp_write_len
kp_cb
kp_datain_pipe.pipe_handle
kp_datain_pipe.pipe_ep_descr
}))
_NOTE(LOCK_ORDER(keyspan_state::ks_mutex keyspan_port::kp_mutex))
_NOTE(LOCK_ORDER(keyspan_port::kp_mutex keyspan_pipe::pipe_mutex))
enum {
KEYSPAN_PORT_ENABLE = 0x0001,
KEYSPAN_PORT_RTS = 0x0002,
KEYSPAN_PORT_DTR = 0x0004,
KEYSPAN_PORT_TXBREAK = 0x0008,
KEYSPAN_PORT_LOOPBACK = 0x0010,
KEYSPAN_PORT_CTRLRESP = 0x0020,
KEYSPAN_PORT_RXBREAK = 0x0040
};
enum {
KEYSPAN_PORT_NOT_INIT = 0,
KEYSPAN_PORT_CLOSED,
KEYSPAN_PORT_OPENING,
KEYSPAN_PORT_OPEN
};
enum {
KEYSPAN_PORT_TX_STOPPED = 0x0001
};
enum {
KEYSPAN_BULK_TIMEOUT = 3,
KEYSPAN_BULKIN_MAX_LEN = 64,
KEYSPAN_BULKIN_MAX_LEN_49WG = 512,
KEYSPAN_BULKOUT_MAX_LEN_19HS = 64,
KEYSPAN_BULKOUT_MAX_LEN_49WLC = 63,
KEYSPAN_BULKOUT_MAX_LEN_49WG = 504,
KEYSPAN_STATIN_MAX_LEN = 16
};
#define KEYSPAN_FW_FLAG 0x8000
#define KEYSPAN_REQ_SET 0xa0
#define KEYSPAN_SET_CONTROL_REQUEST 0xB0
#define DPRINT_ATTACH 0x00000001
#define DPRINT_OPEN 0x00000002
#define DPRINT_CLOSE 0x00000004
#define DPRINT_DEF_PIPE 0x00000010
#define DPRINT_IN_PIPE 0x00000020
#define DPRINT_OUT_PIPE 0x00000040
#define DPRINT_INTR_PIPE 0x00000080
#define DPRINT_PIPE_RESET 0x00000100
#define DPRINT_IN_DATA 0x00000200
#define DPRINT_OUT_DATA 0x00000400
#define DPRINT_CTLOP 0x00000800
#define DPRINT_HOTPLUG 0x00001000
#define DPRINT_PM 0x00002000
#define DPRINT_MASK_ALL 0xFFFFFFFF
#define NELEM(a) (sizeof (a) / sizeof (*(a)))
int keyspan_tx_copy_data(keyspan_port_t *, mblk_t *, int);
void keyspan_tx_start(keyspan_port_t *, int *);
void keyspan_put_tail(mblk_t **, mblk_t *);
void keyspan_put_head(mblk_t **, mblk_t *, keyspan_port_t *);
void keyspan_bulkin_cb(usb_pipe_handle_t, usb_bulk_req_t *);
void keyspan_bulkout_cb(usb_pipe_handle_t, usb_bulk_req_t *);
int keyspan_restore_device(keyspan_state_t *);
int keyspan_send_cmd(keyspan_port_t *);
int keyspan_dev_is_online(keyspan_state_t *);
#ifdef __cplusplus
}
#endif
#endif