usbser_dsdi.h revision 7492:2387323b838f
1179102Syongari/* 2179102Syongari * CDDL HEADER START 3179102Syongari * 4179102Syongari * The contents of this file are subject to the terms of the 5179102Syongari * Common Development and Distribution License (the "License"). 6179102Syongari * You may not use this file except in compliance with the License. 7179102Syongari * 8179102Syongari * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9179102Syongari * or http://www.opensolaris.org/os/licensing. 10179102Syongari * See the License for the specific language governing permissions 11179102Syongari * and limitations under the License. 12179102Syongari * 13179102Syongari * When distributing Covered Code, include this CDDL HEADER in each 14179102Syongari * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15179102Syongari * If applicable, add the following below this CDDL HEADER, with the 16179102Syongari * fields enclosed by brackets "[]" replaced with your own identifying 17179102Syongari * information: Portions Copyright [yyyy] [name of copyright owner] 18179102Syongari * 19179102Syongari * CDDL HEADER END 20179102Syongari */ 21179102Syongari/* 22179102Syongari * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23179102Syongari * Use is subject to license terms. 24179102Syongari */ 25179102Syongari 26179102Syongari#ifndef _SYS_USB_USBSER_DSDI_H 27183137Syongari#define _SYS_USB_USBSER_DSDI_H 28179102Syongari 29179102Syongari 30179102Syongari/* 31179102Syongari * USB-to-serial device-specific driver interface (DSDI) 32179102Syongari */ 33179102Syongari 34179102Syongari#include <sys/types.h> 35179102Syongari#include <sys/dditypes.h> 36179102Syongari#include <sys/usb/usba.h> 37179102Syongari#include <sys/usb/usba/usbai_private.h> 38179102Syongari 39179102Syongari#ifdef __cplusplus 40179102Syongariextern "C" { 41179102Syongari#endif 42179102Syongari 43179102Syongaritypedef void *ds_hdl_t; /* DSD device handler */ 44179102Syongari 45179102Syongari/* 46179102Syongari * interrupt emulation callbacks 47179102Syongari */ 48179102Syongaritypedef struct ds_cb { 49179102Syongari void (*cb_tx)(caddr_t); /* transmit callback */ 50179102Syongari void (*cb_rx)(caddr_t); /* receive callback */ 51179102Syongari void (*cb_status)(caddr_t); /* status change callback */ 52179102Syongari caddr_t cb_arg; /* callback argument */ 53179102Syongari} ds_cb_t; 54179102Syongari 55179102Syongaritypedef struct ds_port_params ds_port_params_t; /* see below */ 56179102Syongari 57179102Syongaritypedef struct ds_attach_info { 58179102Syongari /* 59179102Syongari * passed to DSD: 60179102Syongari */ 61179102Syongari dev_info_t *ai_dip; /* devinfo */ 62179102Syongari /* 63179102Syongari * these event callbacks should be registered by DSD 64179102Syongari * using usb_register_event_cbs() 65179102Syongari */ 66179102Syongari usb_event_t *ai_usb_events; 67179102Syongari /* 68179102Syongari * returned by DSD: 69179102Syongari */ 70179102Syongari ds_hdl_t *ai_hdl; /* handle to be used by GSD in other calls */ 71179102Syongari uint_t *ai_port_cnt; /* number of ports */ 72179102Syongari} ds_attach_info_t; 73179102Syongari 74179102Syongari/* 75179102Syongari * device operations used by Generic Serial Driver (GSD) 76179102Syongari * 77179102Syongari * ops returning int should return USB_SUCCESS on successful completion 78179102Syongari * or appropriate USB_* error code in case of failure 79179102Syongari * 80179102Syongari * ops can block unless otherwise indicated 81179102Syongari */ 82179102Syongaritypedef struct ds_ops { 83179102Syongari int ds_version; /* structure version */ 84179102Syongari 85179102Syongari /* 86179102Syongari * configuration operations 87179102Syongari * ------------------------ 88179102Syongari * 89179102Syongari * attach/detach device instance, called from GSD attach(9E)/detach(9E) 90179102Syongari */ 91179102Syongari int (*ds_attach)(ds_attach_info_t *aip); 92179102Syongari void (*ds_detach)(ds_hdl_t); 93179102Syongari 94179102Syongari /* 95179102Syongari * register/unregister interrupt callbacks for the given port 96179102Syongari */ 97179102Syongari int (*ds_register_cb)(ds_hdl_t, uint_t port_num, ds_cb_t *cb); 98179102Syongari void (*ds_unregister_cb)(ds_hdl_t, uint_t port_num); 99179102Syongari 100179102Syongari /* 101179102Syongari * open/close port 102179102Syongari */ 103179102Syongari int (*ds_open_port)(ds_hdl_t, uint_t port_num); 104179102Syongari int (*ds_close_port)(ds_hdl_t, uint_t port_num); 105179102Syongari 106179102Syongari /* 107179102Syongari * power management 108179102Syongari * ---------------- 109179102Syongari * 110179102Syongari * set power level of the component; 111179102Syongari * DSD should set new_state to the resulting USB device state 112179102Syongari */ 113179102Syongari int (*ds_usb_power)(ds_hdl_t, int comp, int level, int *new_state); 114179102Syongari 115179102Syongari /* 116179102Syongari * CPR suspend/resume 117179102Syongari */ 118179102Syongari int (*ds_suspend)(ds_hdl_t); 119179102Syongari int (*ds_resume)(ds_hdl_t); 120179102Syongari 121179102Syongari /* 122183137Syongari * USB device disconnect/reconnect 123183137Syongari */ 124179102Syongari int (*ds_disconnect)(ds_hdl_t); 125179102Syongari int (*ds_reconnect)(ds_hdl_t); 126179102Syongari 127179102Syongari /* 128179102Syongari * standard UART operations 129179102Syongari * ------------------------ 130179102Syongari * 131179102Syongari * set one or more port parameters: baud rate, parity, 132179102Syongari * stop bits, character size, xon/xoff char, flow control 133179102Syongari */ 134179102Syongari int (*ds_set_port_params)(ds_hdl_t, uint_t port_num, 135179348Syongari ds_port_params_t *tp); 136179348Syongari 137179102Syongari /* 138179102Syongari * set modem controls: each bit set to 1 in 'mask' will be set to the 139179102Syongari * value of corresponding bit in 'val'; other bits are not affected 140179102Syongari */ 141179102Syongari int (*ds_set_modem_ctl)(ds_hdl_t, uint_t port_num, 142179102Syongari int mask, int val); 143179102Syongari 144179102Syongari /* 145179102Syongari * get modem control/status: values of bits that correspond 146179102Syongari * to those set to 1 in 'mask' are returned in 'valp' 147179102Syongari */ 148179102Syongari int (*ds_get_modem_ctl)(ds_hdl_t, uint_t port_num, 149179102Syongari int mask, int *valp); 150179102Syongari 151179102Syongari /* 152179102Syongari * set/clear break ('ctl' is DS_ON/DS_OFF) 153179102Syongari */ 154179102Syongari int (*ds_break_ctl)(ds_hdl_t, uint_t port_num, int ctl); 155179102Syongari 156179102Syongari /* 157179102Syongari * set/clear internal loopback ('ctl' is DS_ON/DS_OFF) 158179102Syongari */ 159179102Syongari int (*ds_loopback)(ds_hdl_t, uint_t port_num, int ctl); 160179102Syongari 161179102Syongari /* 162179102Syongari * data xfer 163179102Syongari * --------- 164179102Syongari * 165179102Syongari * data transmit: DSD is *required* to accept mblk for transfer and 166179102Syongari * return USB_SUCCESS; after which GSD no longer owns the mblk 167179102Syongari */ 168179102Syongari int (*ds_tx)(ds_hdl_t, uint_t port_num, mblk_t *mp); 169179102Syongari 170179102Syongari /* 171179102Syongari * data receipt: DSD returns either received data mblk or NULL 172179102Syongari * if no data available. this op must not block as it is intended 173179102Syongari * to be called from is usually called GSD receive callback 174179102Syongari */ 175179102Syongari mblk_t *(*ds_rx)(ds_hdl_t, uint_t port_num); 176179102Syongari 177179102Syongari /* 178179102Syongari * stop/start data transmit or/and receive: 179179102Syongari * 'dir' can be an OR of DS_TX and DS_RX; must succeed. 180179102Syongari */ 181179102Syongari void (*ds_stop)(ds_hdl_t, uint_t port_num, int dir); 182179102Syongari void (*ds_start)(ds_hdl_t, uint_t port_num, int dir); 183179102Syongari 184179102Syongari /* 185179102Syongari * flush FIFOs: 'dir' can be an OR of DS_TX and DS_RX, 186179102Syongari * affecting transmit and received FIFO respectively 187179102Syongari */ 188 int (*ds_fifo_flush)(ds_hdl_t, uint_t port_num, int dir); 189 190 /* 191 * drain (wait until empty) output FIFO 192 * 193 * return failure if the FIFO does not get empty after at least 194 * 'timeout' seconds (zero timeout means wait forever) 195 */ 196 int (*ds_fifo_drain)(ds_hdl_t, uint_t port_num, int timeout); 197 198 /* V1 ops for polled I/O */ 199 usb_pipe_handle_t (*ds_out_pipe)(ds_hdl_t, uint_t port_num); 200 usb_pipe_handle_t (*ds_in_pipe)(ds_hdl_t, uint_t port_num); 201} ds_ops_t; 202 203/* 204 * ds_version 205 */ 206enum { 207 DS_OPS_VERSION_V0 = 0, 208 DS_OPS_VERSION_V1 = 1, 209 DS_OPS_VERSION = DS_OPS_VERSION_V1 210}; 211 212/* 213 * parameter type 214 */ 215typedef enum { 216 DS_PARAM_BAUD, /* baud rate */ 217 DS_PARAM_PARITY, /* parity */ 218 DS_PARAM_STOPB, /* stop bits */ 219 DS_PARAM_CHARSZ, /* char size */ 220 DS_PARAM_XON_XOFF, /* xon/xoff chars */ 221 DS_PARAM_FLOW_CTL /* flow control */ 222} ds_port_param_type_t; 223 224/* 225 * a single param entry, union used to pass various data types 226 */ 227typedef struct ds_port_param_entry { 228 ds_port_param_type_t param; /* parameter */ 229 union { 230 uint_t ui; 231 uchar_t uc[4]; 232 } val; /* parameter value(s) */ 233} ds_port_param_entry_t; 234 235/* 236 * port parameter array 237 */ 238struct ds_port_params { 239 ds_port_param_entry_t *tp_entries; /* entry array */ 240 int tp_cnt; /* entry count */ 241}; 242 243/* 244 * direction (ds_fifo_flush, ds_fifo_drain) 245 */ 246enum { 247 DS_TX = 0x01, /* transmit direction */ 248 DS_RX = 0x02 /* receive direction */ 249}; 250 251/* 252 * on/off (ds_break_ctl, ds_loopback) 253 */ 254enum { 255 DS_OFF, 256 DS_ON 257}; 258 259/* 260 * input error codes, returned by DSD in an M_BREAK message 261 */ 262enum { 263 DS_PARITY_ERR = 0x01, /* parity error */ 264 DS_FRAMING_ERR = 0x02, /* framing error */ 265 DS_OVERRUN_ERR = 0x03, /* data overrun */ 266 DS_BREAK_ERR = 0x04 /* break detected */ 267}; 268 269#ifdef __cplusplus 270} 271#endif 272 273#endif /* _SYS_USB_USBSER_DSDI_H */ 274