#ifndef _SYS_USB_USBPRN_H
#define _SYS_USB_USBPRN_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/usb/usba/usbai_private.h>
#define USBPRN_XFER_TIMEOUT 90
#define USBPRN_XFER_TIMEOUT_MIN 1
#define USBPRN_XFER_TIMEOUT_MAX 300
#define USBPRN_PS_IDLE 0x00
#define USBPRN_PS_NEED_TO_XFER 0x01
#define USBPRN_MAX_XFER_SIZE (8 * 1024)
typedef struct usbprn_ps {
usb_ep_descr_t ps_ept_descr;
usb_pipe_handle_t ps_handle;
usb_pipe_policy_t ps_policy;
int ps_flags;
int ps_cr;
} usbprn_ps_t;
_NOTE(SCHEME_PROTECTS_DATA("USBA", usbprn_ps::ps_handle))
typedef struct usbprn_power {
int usbprn_pm_busy;
uint8_t usbprn_wakeup_enabled;
uint8_t usbprn_pwr_states;
uint8_t usbprn_pm_capabilities;
uint8_t usbprn_current_power;
} usbprn_power_t;
typedef struct usbprn_state {
dev_info_t *usbprn_dip;
int usbprn_dev_state;
kmutex_t usbprn_mutex;
int usbprn_instance;
int usbprn_flags;
usb_client_dev_data_t *usbprn_dev_data;
size_t usbprn_max_bulk_xfer_size;
char *usbprn_device_id;
int usbprn_device_id_len;
usb_serialization_t usbprn_ser_acc;
usb_serialization_t usbprn_write_acc;
usb_serialization_t usbprn_dev_acc;
mblk_t *usbprn_bulk_mp;
struct buf *usbprn_bp;
usb_pipe_handle_t usbprn_def_ph;
usbprn_ps_t usbprn_bulk_out;
usbprn_ps_t usbprn_bulk_in;
usb_log_handle_t usbprn_log_handle;
usb_cfg_descr_t usbprn_config_descr;
usb_if_descr_t usbprn_if_descr;
char usbprn_last_status;
usbprn_power_t *usbprn_pm;
struct ecpp_transfer_parms usbprn_setparms;
struct prn_timeouts usbprn_prn_timeouts;
usb_ugen_hdl_t usbprn_ugen_hdl;
} usbprn_state_t;
_NOTE(MUTEX_PROTECTS_DATA(usbprn_state_t::usbprn_mutex, usbprn_state_t))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_dip))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_ugen_hdl))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_pm))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_instance))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_log_handle))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_if_descr))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_dev_data))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_ser_acc))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_write_acc))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_dev_acc))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_def_ph))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_device_id))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usbprn_state_t::usbprn_device_id_len))
_NOTE(SCHEME_PROTECTS_DATA("stable data", usb_pipe_policy))
_NOTE(SCHEME_PROTECTS_DATA("unshared data", mblk_t))
_NOTE(SCHEME_PROTECTS_DATA("unshared data", usb_bulk_req))
#define USBPRN_LOCKS_INIT_DONE 0x01
#define USBPRN_OPEN 0x02
#define USBPRN_DEVICE_ACCESS_OK(s) \
(((s)->usbprn_flags & USBPRN_OPEN) && \
(((s)->usbprn_dev_state == USB_DEV_ONLINE)))
#define USBPRN_PIPES_BUSY(s) \
(((s)->usbprn_default.ps_flags != USBPRN_PS_IDLE) || \
((s)->usbprn_bulk_out.ps_flags != USBPRN_PS_IDLE) || \
((s)->usbprn_bulk_in.ps_flags != USBPRN_PS_IDLE))
#define PRINT_MASK_ATTA 0x00000001
#define PRINT_MASK_OPEN 0x00000002
#define PRINT_MASK_CLOSE 0x00000004
#define PRINT_MASK_EVENTS 0x00000008
#define PRINT_MASK_PM 0x00000010
#define PRINT_MASK_CPR 0x00000020
#define PRINT_MASK_ALL 0xFFFFFFFF
#define USBPRN_PRINT_MAXLINE 80
#define USBPRN_MAX_DEVICE_ID_LENGTH 1024
#define USBPRN_MINOR_UGEN_BITS_MASK 0xff
#define USBPRN_MINOR_INSTANCE_SHIFT 8
#define USBPRN_MINOR_INSTANCE_MASK ~USBPRN_MINOR_UGEN_BITS_MASK
#define USBPRN_MINOR_TO_INSTANCE(minor) \
(((minor) & USBPRN_MINOR_INSTANCE_MASK) >> \
USBPRN_MINOR_INSTANCE_SHIFT)
#ifdef __cplusplus
}
#endif
#endif