90f050286227cf4c4f8aa425555d04723d331d48yq/*
90f050286227cf4c4f8aa425555d04723d331d48yq * CDDL HEADER START
90f050286227cf4c4f8aa425555d04723d331d48yq *
90f050286227cf4c4f8aa425555d04723d331d48yq * The contents of this file are subject to the terms of the
90f050286227cf4c4f8aa425555d04723d331d48yq * Common Development and Distribution License (the "License").
90f050286227cf4c4f8aa425555d04723d331d48yq * You may not use this file except in compliance with the License.
90f050286227cf4c4f8aa425555d04723d331d48yq *
90f050286227cf4c4f8aa425555d04723d331d48yq * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90f050286227cf4c4f8aa425555d04723d331d48yq * or http://www.opensolaris.org/os/licensing.
90f050286227cf4c4f8aa425555d04723d331d48yq * See the License for the specific language governing permissions
90f050286227cf4c4f8aa425555d04723d331d48yq * and limitations under the License.
90f050286227cf4c4f8aa425555d04723d331d48yq *
90f050286227cf4c4f8aa425555d04723d331d48yq * When distributing Covered Code, include this CDDL HEADER in each
90f050286227cf4c4f8aa425555d04723d331d48yq * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
90f050286227cf4c4f8aa425555d04723d331d48yq * If applicable, add the following below this CDDL HEADER, with the
90f050286227cf4c4f8aa425555d04723d331d48yq * fields enclosed by brackets "[]" replaced with your own identifying
90f050286227cf4c4f8aa425555d04723d331d48yq * information: Portions Copyright [yyyy] [name of copyright owner]
90f050286227cf4c4f8aa425555d04723d331d48yq *
90f050286227cf4c4f8aa425555d04723d331d48yq * CDDL HEADER END
90f050286227cf4c4f8aa425555d04723d331d48yq */
90f050286227cf4c4f8aa425555d04723d331d48yq/*
d29f5a711240f866521445b1656d114da090335ezhigang lu - Sun Microsystems - Beijing China * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
90f050286227cf4c4f8aa425555d04723d331d48yq * Use is subject to license terms.
90f050286227cf4c4f8aa425555d04723d331d48yq */
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq#ifndef _SYS_USB_USBSACM_H
90f050286227cf4c4f8aa425555d04723d331d48yq#define _SYS_USB_USBSACM_H
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq#include <sys/types.h>
90f050286227cf4c4f8aa425555d04723d331d48yq#include <sys/dditypes.h>
90f050286227cf4c4f8aa425555d04723d331d48yq#include <sys/note.h>
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq#include <sys/usb/clients/usbser/usbser_dsdi.h>
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq#ifdef __cplusplus
90f050286227cf4c4f8aa425555d04723d331d48yqextern "C" {
90f050286227cf4c4f8aa425555d04723d331d48yq#endif
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yqtypedef struct usbsacm_port usbsacm_port_t;
90f050286227cf4c4f8aa425555d04723d331d48yqtypedef struct usbsacm_state usbsacm_state_t;
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq/*
90f050286227cf4c4f8aa425555d04723d331d48yq * PM support
90f050286227cf4c4f8aa425555d04723d331d48yq */
90f050286227cf4c4f8aa425555d04723d331d48yqtypedef struct usbsacm_power {
90f050286227cf4c4f8aa425555d04723d331d48yq uint8_t pm_wakeup_enabled; /* remote wakeup enabled */
90f050286227cf4c4f8aa425555d04723d331d48yq uint8_t pm_pwr_states; /* bit mask of power states */
90f050286227cf4c4f8aa425555d04723d331d48yq boolean_t pm_raise_power; /* driver is about to raise power */
90f050286227cf4c4f8aa425555d04723d331d48yq uint8_t pm_cur_power; /* current power level */
90f050286227cf4c4f8aa425555d04723d331d48yq uint_t pm_busy_cnt; /* number of set_busy requests */
90f050286227cf4c4f8aa425555d04723d331d48yq} usbsacm_pm_t;
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq/*
90f050286227cf4c4f8aa425555d04723d331d48yq * per bulk in/out structure
90f050286227cf4c4f8aa425555d04723d331d48yq */
90f050286227cf4c4f8aa425555d04723d331d48yqstruct usbsacm_port {
90f050286227cf4c4f8aa425555d04723d331d48yq kmutex_t acm_port_mutex; /* structure lock */
90f050286227cf4c4f8aa425555d04723d331d48yq usbsacm_state_t *acm_device; /* back pointer */
90f050286227cf4c4f8aa425555d04723d331d48yq usb_pipe_handle_t acm_bulkin_ph; /* in pipe hdl */
90f050286227cf4c4f8aa425555d04723d331d48yq int acm_bulkin_state; /* in pipe state */
90f050286227cf4c4f8aa425555d04723d331d48yq usb_pipe_handle_t acm_bulkout_ph; /* out pipe hdl */
90f050286227cf4c4f8aa425555d04723d331d48yq int acm_bulkout_state; /* out pipe state */
90f050286227cf4c4f8aa425555d04723d331d48yq usb_pipe_handle_t acm_intr_ph; /* intr pipe hdl */
90f050286227cf4c4f8aa425555d04723d331d48yq int acm_intr_state; /* intr pipe state */
90f050286227cf4c4f8aa425555d04723d331d48yq usb_ep_descr_t acm_intr_ep_descr; /* ep descriptor */
90f050286227cf4c4f8aa425555d04723d331d48yq int acm_ctrl_if_no; /* control interface */
90f050286227cf4c4f8aa425555d04723d331d48yq int acm_data_if_no; /* data interface */
90f050286227cf4c4f8aa425555d04723d331d48yq int acm_data_port_no; /* which data port */
90f050286227cf4c4f8aa425555d04723d331d48yq ds_cb_t acm_cb; /* DSD callbacks */
90f050286227cf4c4f8aa425555d04723d331d48yq mblk_t *acm_rx_mp; /* rx data */
90f050286227cf4c4f8aa425555d04723d331d48yq mblk_t *acm_tx_mp; /* tx data */
90f050286227cf4c4f8aa425555d04723d331d48yq kcondvar_t acm_tx_cv; /* tx completion */
90f050286227cf4c4f8aa425555d04723d331d48yq uint8_t acm_mctlout; /* controls out */
90f050286227cf4c4f8aa425555d04723d331d48yq uint8_t acm_mctlin; /* controls in */
90f050286227cf4c4f8aa425555d04723d331d48yq int acm_cap; /* port capabilities */
90f050286227cf4c4f8aa425555d04723d331d48yq usb_cdc_line_coding_t acm_line_coding; /* port line coding */
90f050286227cf4c4f8aa425555d04723d331d48yq int acm_port_state; /* port state */
90f050286227cf4c4f8aa425555d04723d331d48yq size_t acm_bulkin_size; /* bulkin xfer size */
90f050286227cf4c4f8aa425555d04723d331d48yq};
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq_NOTE(MUTEX_PROTECTS_DATA(usbsacm_port::acm_port_mutex, usbsacm_port))
90f050286227cf4c4f8aa425555d04723d331d48yq_NOTE(DATA_READABLE_WITHOUT_LOCK(usbsacm_port::{
90f050286227cf4c4f8aa425555d04723d331d48yq acm_device
90f050286227cf4c4f8aa425555d04723d331d48yq acm_cb.cb_rx
90f050286227cf4c4f8aa425555d04723d331d48yq acm_cb.cb_tx
90f050286227cf4c4f8aa425555d04723d331d48yq acm_cb.cb_arg
90f050286227cf4c4f8aa425555d04723d331d48yq acm_bulkin_ph
90f050286227cf4c4f8aa425555d04723d331d48yq acm_bulkout_ph
90f050286227cf4c4f8aa425555d04723d331d48yq acm_intr_ph
90f050286227cf4c4f8aa425555d04723d331d48yq acm_ctrl_if_no
90f050286227cf4c4f8aa425555d04723d331d48yq acm_data_if_no
90f050286227cf4c4f8aa425555d04723d331d48yq acm_data_port_no
90f050286227cf4c4f8aa425555d04723d331d48yq acm_port_state
90f050286227cf4c4f8aa425555d04723d331d48yq}))
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yqstruct usbsacm_state {
90f050286227cf4c4f8aa425555d04723d331d48yq kmutex_t acm_mutex; /* structure lock */
90f050286227cf4c4f8aa425555d04723d331d48yq dev_info_t *acm_dip; /* device info */
90f050286227cf4c4f8aa425555d04723d331d48yq usb_client_dev_data_t *acm_dev_data; /* registration data */
90f050286227cf4c4f8aa425555d04723d331d48yq usb_event_t *acm_usb_events; /* usb events */
90f050286227cf4c4f8aa425555d04723d331d48yq usb_pipe_handle_t acm_def_ph; /* default pipe hdl */
90f050286227cf4c4f8aa425555d04723d331d48yq usb_log_handle_t acm_lh; /* USBA log handle */
90f050286227cf4c4f8aa425555d04723d331d48yq int acm_dev_state; /* USB device state */
90f050286227cf4c4f8aa425555d04723d331d48yq size_t acm_xfer_sz; /* bulk xfer size */
90f050286227cf4c4f8aa425555d04723d331d48yq boolean_t acm_compatibility; /* if conform to spec */
90f050286227cf4c4f8aa425555d04723d331d48yq usbsacm_port_t *acm_ports; /* per port structs */
90f050286227cf4c4f8aa425555d04723d331d48yq int acm_port_cnt; /* port number */
90f050286227cf4c4f8aa425555d04723d331d48yq usbsacm_pm_t *acm_pm; /* PM support */
90f050286227cf4c4f8aa425555d04723d331d48yq};
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq_NOTE(MUTEX_PROTECTS_DATA(usbsacm_state::acm_mutex, usbsacm_state))
90f050286227cf4c4f8aa425555d04723d331d48yq_NOTE(DATA_READABLE_WITHOUT_LOCK(usbsacm_state::{
90f050286227cf4c4f8aa425555d04723d331d48yq acm_dip
90f050286227cf4c4f8aa425555d04723d331d48yq acm_dev_data
90f050286227cf4c4f8aa425555d04723d331d48yq acm_usb_events
90f050286227cf4c4f8aa425555d04723d331d48yq acm_def_ph
90f050286227cf4c4f8aa425555d04723d331d48yq acm_lh
90f050286227cf4c4f8aa425555d04723d331d48yq acm_dev_state
90f050286227cf4c4f8aa425555d04723d331d48yq acm_xfer_sz
90f050286227cf4c4f8aa425555d04723d331d48yq acm_compatibility
90f050286227cf4c4f8aa425555d04723d331d48yq acm_ports
90f050286227cf4c4f8aa425555d04723d331d48yq acm_port_cnt
90f050286227cf4c4f8aa425555d04723d331d48yq acm_pm
90f050286227cf4c4f8aa425555d04723d331d48yq}))
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq/* port state */
90f050286227cf4c4f8aa425555d04723d331d48yqenum {
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_PORT_CLOSED, /* port is closed */
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_PORT_OPEN, /* port is open */
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_PORT_CLOSING
90f050286227cf4c4f8aa425555d04723d331d48yq};
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq/* pipe state */
90f050286227cf4c4f8aa425555d04723d331d48yqenum {
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_PIPE_CLOSED, /* pipe is closed */
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_PIPE_IDLE, /* open but no requests */
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_PIPE_BUSY, /* servicing request */
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_PIPE_CLOSING /* pipe is closing */
90f050286227cf4c4f8aa425555d04723d331d48yq};
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq/* various tunables */
90f050286227cf4c4f8aa425555d04723d331d48yqenum {
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_BULKOUT_TIMEOUT = 15, /* bulkout timeout */
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_BULKIN_TIMEOUT = 0 /* bulkin timeout */
90f050286227cf4c4f8aa425555d04723d331d48yq};
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq/* hardware definitions */
90f050286227cf4c4f8aa425555d04723d331d48yqenum {
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_REQ_OUT = USB_DEV_REQ_TYPE_CLASS| USB_DEV_REQ_HOST_TO_DEV,
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_REQ_IN = USB_DEV_REQ_TYPE_CLASS | USB_DEV_REQ_DEV_TO_HOST,
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_REQ_WRITE_IF = USBSACM_REQ_OUT | USB_DEV_REQ_RCPT_IF,
90f050286227cf4c4f8aa425555d04723d331d48yq USBSACM_REQ_READ_IF = USBSACM_REQ_IN | USB_DEV_REQ_RCPT_IF
90f050286227cf4c4f8aa425555d04723d331d48yq};
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq#define PRINT_MASK_ATTA 0x00000001
90f050286227cf4c4f8aa425555d04723d331d48yq#define PRINT_MASK_CLOSE 0x00000002
90f050286227cf4c4f8aa425555d04723d331d48yq#define PRINT_MASK_OPEN 0x00000004
90f050286227cf4c4f8aa425555d04723d331d48yq#define PRINT_MASK_EVENTS 0x00000008
90f050286227cf4c4f8aa425555d04723d331d48yq#define PRINT_MASK_PM 0x00000010
90f050286227cf4c4f8aa425555d04723d331d48yq#define PRINT_MASK_CB 0x00000020
90f050286227cf4c4f8aa425555d04723d331d48yq#define PRINT_MASK_ALL 0xFFFFFFFF
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq#define NELEM(a) (sizeof (a) / sizeof (*(a)))
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq#ifdef __cplusplus
90f050286227cf4c4f8aa425555d04723d331d48yq}
90f050286227cf4c4f8aa425555d04723d331d48yq#endif
90f050286227cf4c4f8aa425555d04723d331d48yq
90f050286227cf4c4f8aa425555d04723d331d48yq#endif /* _SYS_USB_USBSACM_H */