1*0Sstevel@tonic-gate /* 2*0Sstevel@tonic-gate * CDDL HEADER START 3*0Sstevel@tonic-gate * 4*0Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*0Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*0Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*0Sstevel@tonic-gate * with the License. 8*0Sstevel@tonic-gate * 9*0Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*0Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*0Sstevel@tonic-gate * See the License for the specific language governing permissions 12*0Sstevel@tonic-gate * and limitations under the License. 13*0Sstevel@tonic-gate * 14*0Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*0Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*0Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*0Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*0Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*0Sstevel@tonic-gate * 20*0Sstevel@tonic-gate * CDDL HEADER END 21*0Sstevel@tonic-gate */ 22*0Sstevel@tonic-gate /* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */ 23*0Sstevel@tonic-gate /* Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T */ 24*0Sstevel@tonic-gate /* All Rights Reserved */ 25*0Sstevel@tonic-gate 26*0Sstevel@tonic-gate /* 27*0Sstevel@tonic-gate * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 28*0Sstevel@tonic-gate * Use is subject to license terms. 29*0Sstevel@tonic-gate */ 30*0Sstevel@tonic-gate 31*0Sstevel@tonic-gate #ifndef _SYS_ASY_H 32*0Sstevel@tonic-gate #define _SYS_ASY_H 33*0Sstevel@tonic-gate 34*0Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 35*0Sstevel@tonic-gate 36*0Sstevel@tonic-gate #ifdef __cplusplus 37*0Sstevel@tonic-gate extern "C" { 38*0Sstevel@tonic-gate #endif 39*0Sstevel@tonic-gate 40*0Sstevel@tonic-gate #include <sys/tty.h> 41*0Sstevel@tonic-gate #include <sys/ksynch.h> 42*0Sstevel@tonic-gate #include <sys/dditypes.h> 43*0Sstevel@tonic-gate 44*0Sstevel@tonic-gate #define COM1_IOADDR 0x3f8 45*0Sstevel@tonic-gate #define COM2_IOADDR 0x2f8 46*0Sstevel@tonic-gate #define COM3_IOADDR 0x3e8 47*0Sstevel@tonic-gate #define COM4_IOADDR 0x2e8 48*0Sstevel@tonic-gate 49*0Sstevel@tonic-gate /* 50*0Sstevel@tonic-gate * Definitions for INS8250 / 16550 chips 51*0Sstevel@tonic-gate */ 52*0Sstevel@tonic-gate 53*0Sstevel@tonic-gate /* defined as offsets from the data register */ 54*0Sstevel@tonic-gate #define DAT 0 /* receive/transmit data */ 55*0Sstevel@tonic-gate #define ICR 1 /* interrupt control register */ 56*0Sstevel@tonic-gate #define ISR 2 /* interrupt status register */ 57*0Sstevel@tonic-gate #define LCR 3 /* line control register */ 58*0Sstevel@tonic-gate #define MCR 4 /* modem control register */ 59*0Sstevel@tonic-gate #define LSR 5 /* line status register */ 60*0Sstevel@tonic-gate #define MSR 6 /* modem status register */ 61*0Sstevel@tonic-gate #define SCR 7 /* scratch register */ 62*0Sstevel@tonic-gate #define DLL 0 /* divisor latch (lsb) */ 63*0Sstevel@tonic-gate #define DLH 1 /* divisor latch (msb) */ 64*0Sstevel@tonic-gate #define FIFOR ISR /* FIFO register for 16550 */ 65*0Sstevel@tonic-gate #define EFR ISR /* Enhanced feature register for 16650 */ 66*0Sstevel@tonic-gate 67*0Sstevel@tonic-gate /* 68*0Sstevel@tonic-gate * INTEL 8210-A/B & 16450/16550 Registers Structure. 69*0Sstevel@tonic-gate */ 70*0Sstevel@tonic-gate 71*0Sstevel@tonic-gate /* Line Control Register */ 72*0Sstevel@tonic-gate #define WLS0 0x01 /* word length select bit 0 */ 73*0Sstevel@tonic-gate #define WLS1 0x02 /* word length select bit 2 */ 74*0Sstevel@tonic-gate #define STB 0x04 /* number of stop bits */ 75*0Sstevel@tonic-gate #define PEN 0x08 /* parity enable */ 76*0Sstevel@tonic-gate #define EPS 0x10 /* even parity select */ 77*0Sstevel@tonic-gate #define SETBREAK 0x40 /* break key */ 78*0Sstevel@tonic-gate #define DLAB 0x80 /* divisor latch access bit */ 79*0Sstevel@tonic-gate #define RXLEN 0x03 /* # of data bits per received/xmitted char */ 80*0Sstevel@tonic-gate #define STOP1 0x00 81*0Sstevel@tonic-gate #define STOP2 0x04 82*0Sstevel@tonic-gate #define PAREN 0x08 83*0Sstevel@tonic-gate #define PAREVN 0x10 84*0Sstevel@tonic-gate #define PARMARK 0x20 85*0Sstevel@tonic-gate #define SNDBRK 0x40 86*0Sstevel@tonic-gate #define EFRACCESS 0xBF /* magic value for 16650 EFR access */ 87*0Sstevel@tonic-gate 88*0Sstevel@tonic-gate #define BITS5 0x00 /* 5 bits per char */ 89*0Sstevel@tonic-gate #define BITS6 0x01 /* 6 bits per char */ 90*0Sstevel@tonic-gate #define BITS7 0x02 /* 7 bits per char */ 91*0Sstevel@tonic-gate #define BITS8 0x03 /* 8 bits per char */ 92*0Sstevel@tonic-gate 93*0Sstevel@tonic-gate /* Line Status Register */ 94*0Sstevel@tonic-gate #define RCA 0x01 /* data ready */ 95*0Sstevel@tonic-gate #define OVRRUN 0x02 /* overrun error */ 96*0Sstevel@tonic-gate #define PARERR 0x04 /* parity error */ 97*0Sstevel@tonic-gate #define FRMERR 0x08 /* framing error */ 98*0Sstevel@tonic-gate #define BRKDET 0x10 /* a break has arrived */ 99*0Sstevel@tonic-gate #define XHRE 0x20 /* tx hold reg is now empty */ 100*0Sstevel@tonic-gate #define XSRE 0x40 /* tx shift reg is now empty */ 101*0Sstevel@tonic-gate #define RFBE 0x80 /* rx FIFO Buffer error */ 102*0Sstevel@tonic-gate 103*0Sstevel@tonic-gate /* Interrupt Id Regisger */ 104*0Sstevel@tonic-gate #define MSTATUS 0x00 /* modem status changed */ 105*0Sstevel@tonic-gate #define NOINTERRUPT 0x01 /* no interrupt pending */ 106*0Sstevel@tonic-gate #define TxRDY 0x02 /* Transmitter Holding Register Empty */ 107*0Sstevel@tonic-gate #define RxRDY 0x04 /* Receiver Data Available */ 108*0Sstevel@tonic-gate #define FFTMOUT 0x0c /* FIFO timeout - 16550AF */ 109*0Sstevel@tonic-gate #define RSTATUS 0x06 /* Receiver Line Status */ 110*0Sstevel@tonic-gate 111*0Sstevel@tonic-gate /* Interrupt Enable Register */ 112*0Sstevel@tonic-gate #define RIEN 0x01 /* Received Data Ready */ 113*0Sstevel@tonic-gate #define TIEN 0x02 /* Tx Hold Register Empty */ 114*0Sstevel@tonic-gate #define SIEN 0x04 /* Receiver Line Status */ 115*0Sstevel@tonic-gate #define MIEN 0x08 /* Modem Status */ 116*0Sstevel@tonic-gate 117*0Sstevel@tonic-gate /* Modem Control Register */ 118*0Sstevel@tonic-gate #define DTR 0x01 /* Data Terminal Ready */ 119*0Sstevel@tonic-gate #define RTS 0x02 /* Request To Send */ 120*0Sstevel@tonic-gate #define OUT1 0x04 /* Aux output - not used */ 121*0Sstevel@tonic-gate #define OUT2 0x08 /* turns intr to 386 on/off */ 122*0Sstevel@tonic-gate #define ASY_LOOP 0x10 /* loopback for diagnostics */ 123*0Sstevel@tonic-gate 124*0Sstevel@tonic-gate /* Modem Status Register */ 125*0Sstevel@tonic-gate #define DCTS 0x01 /* Delta Clear To Send */ 126*0Sstevel@tonic-gate #define DDSR 0x02 /* Delta Data Set Ready */ 127*0Sstevel@tonic-gate #define DRI 0x04 /* Trail Edge Ring Indicator */ 128*0Sstevel@tonic-gate #define DDCD 0x08 /* Delta Data Carrier Detect */ 129*0Sstevel@tonic-gate #define CTS 0x10 /* Clear To Send */ 130*0Sstevel@tonic-gate #define DSR 0x20 /* Data Set Ready */ 131*0Sstevel@tonic-gate #define RI 0x40 /* Ring Indicator */ 132*0Sstevel@tonic-gate #define DCD 0x80 /* Data Carrier Detect */ 133*0Sstevel@tonic-gate 134*0Sstevel@tonic-gate #define DELTAS(x) ((x)&(DCTS|DDSR|DRI|DDCD)) 135*0Sstevel@tonic-gate #define STATES(x) ((x)&(CTS|DSR|RI|DCD)) 136*0Sstevel@tonic-gate 137*0Sstevel@tonic-gate /* flags for FCR (FIFO Control register) */ 138*0Sstevel@tonic-gate #define FIFO_OFF 0x00 /* fifo disabled */ 139*0Sstevel@tonic-gate #define FIFO_ON 0x01 /* fifo enabled */ 140*0Sstevel@tonic-gate #define FIFORXFLSH 0x02 /* flush receiver FIFO */ 141*0Sstevel@tonic-gate #define FIFOTXFLSH 0x04 /* flush transmitter FIFO */ 142*0Sstevel@tonic-gate #define FIFODMA 0x08 /* DMA mode 1 */ 143*0Sstevel@tonic-gate #define FIFOEXTRA1 0x10 /* Longer fifos on some 16650's */ 144*0Sstevel@tonic-gate #define FIFOEXTRA2 0x20 /* Longer fifos on some 16650's and 16750 */ 145*0Sstevel@tonic-gate #define FIFO_TRIG_1 0x00 /* 1 byte trigger level */ 146*0Sstevel@tonic-gate #define FIFO_TRIG_4 0x40 /* 4 byte trigger level */ 147*0Sstevel@tonic-gate #define FIFO_TRIG_8 0x80 /* 8 byte trigger level */ 148*0Sstevel@tonic-gate #define FIFO_TRIG_14 0xC0 /* 14 byte trigger level */ 149*0Sstevel@tonic-gate 150*0Sstevel@tonic-gate /* Serial in/out requests */ 151*0Sstevel@tonic-gate 152*0Sstevel@tonic-gate #define OVERRUN 040000 153*0Sstevel@tonic-gate #define FRERROR 020000 154*0Sstevel@tonic-gate #define PERROR 010000 155*0Sstevel@tonic-gate #define S_ERRORS (PERROR|OVERRUN|FRERROR) 156*0Sstevel@tonic-gate 157*0Sstevel@tonic-gate /* EFR - Enhanced feature register for 16650 */ 158*0Sstevel@tonic-gate #define ENHENABLE 0x10 159*0Sstevel@tonic-gate 160*0Sstevel@tonic-gate /* SCR - scratch register */ 161*0Sstevel@tonic-gate #define SCRTEST 0x5a /* arbritrary value for testing SCR register */ 162*0Sstevel@tonic-gate 163*0Sstevel@tonic-gate /* 164*0Sstevel@tonic-gate * Ring buffer and async line management definitions. 165*0Sstevel@tonic-gate */ 166*0Sstevel@tonic-gate #define RINGBITS 10 /* # of bits in ring ptrs */ 167*0Sstevel@tonic-gate #define RINGSIZE (1<<RINGBITS) /* size of ring */ 168*0Sstevel@tonic-gate #define RINGMASK (RINGSIZE-1) 169*0Sstevel@tonic-gate #define RINGFRAC 8 /* fraction of ring to force flush */ 170*0Sstevel@tonic-gate 171*0Sstevel@tonic-gate #define RING_INIT(ap) ((ap)->async_rput = (ap)->async_rget = 0) 172*0Sstevel@tonic-gate #define RING_CNT(ap) (((ap)->async_rput >= (ap)->async_rget) ? \ 173*0Sstevel@tonic-gate ((ap)->async_rput - (ap)->async_rget):\ 174*0Sstevel@tonic-gate ((0x10000 - (ap)->async_rget) + (ap)->async_rput)) 175*0Sstevel@tonic-gate #define RING_FRAC(ap) ((int)RING_CNT(ap) >= (int)(RINGSIZE/RINGFRAC)) 176*0Sstevel@tonic-gate #define RING_POK(ap, n) ((int)RING_CNT(ap) < (int)(RINGSIZE-(n))) 177*0Sstevel@tonic-gate #define RING_PUT(ap, c) \ 178*0Sstevel@tonic-gate ((ap)->async_ring[(ap)->async_rput++ & RINGMASK] = (uchar_t)(c)) 179*0Sstevel@tonic-gate #define RING_UNPUT(ap) ((ap)->async_rput--) 180*0Sstevel@tonic-gate #define RING_GOK(ap, n) ((int)RING_CNT(ap) >= (int)(n)) 181*0Sstevel@tonic-gate #define RING_GET(ap) ((ap)->async_ring[(ap)->async_rget++ & RINGMASK]) 182*0Sstevel@tonic-gate #define RING_EAT(ap, n) ((ap)->async_rget += (n)) 183*0Sstevel@tonic-gate #define RING_MARK(ap, c, s) \ 184*0Sstevel@tonic-gate ((ap)->async_ring[(ap)->async_rput++ & RINGMASK] = ((uchar_t)(c)|(s))) 185*0Sstevel@tonic-gate #define RING_UNMARK(ap) \ 186*0Sstevel@tonic-gate ((ap)->async_ring[((ap)->async_rget) & RINGMASK] &= ~S_ERRORS) 187*0Sstevel@tonic-gate #define RING_ERR(ap, c) \ 188*0Sstevel@tonic-gate ((ap)->async_ring[((ap)->async_rget) & RINGMASK] & (c)) 189*0Sstevel@tonic-gate 190*0Sstevel@tonic-gate /* 191*0Sstevel@tonic-gate * Asy tracing macros. These are a bit similar to some macros in sys/vtrace.h . 192*0Sstevel@tonic-gate * 193*0Sstevel@tonic-gate * XXX - Needs review: would it be better to use the macros in sys/vtrace.h ? 194*0Sstevel@tonic-gate */ 195*0Sstevel@tonic-gate #ifdef DEBUG 196*0Sstevel@tonic-gate #define DEBUGWARN0(fac, format) \ 197*0Sstevel@tonic-gate if (debug & (fac)) \ 198*0Sstevel@tonic-gate cmn_err(CE_WARN, format) 199*0Sstevel@tonic-gate #define DEBUGNOTE0(fac, format) \ 200*0Sstevel@tonic-gate if (debug & (fac)) \ 201*0Sstevel@tonic-gate cmn_err(CE_NOTE, format) 202*0Sstevel@tonic-gate #define DEBUGNOTE1(fac, format, arg1) \ 203*0Sstevel@tonic-gate if (debug & (fac)) \ 204*0Sstevel@tonic-gate cmn_err(CE_NOTE, format, arg1) 205*0Sstevel@tonic-gate #define DEBUGNOTE2(fac, format, arg1, arg2) \ 206*0Sstevel@tonic-gate if (debug & (fac)) \ 207*0Sstevel@tonic-gate cmn_err(CE_NOTE, format, arg1, arg2) 208*0Sstevel@tonic-gate #define DEBUGNOTE3(fac, format, arg1, arg2, arg3) \ 209*0Sstevel@tonic-gate if (debug & (fac)) \ 210*0Sstevel@tonic-gate cmn_err(CE_NOTE, format, arg1, arg2, arg3) 211*0Sstevel@tonic-gate #define DEBUGCONT0(fac, format) \ 212*0Sstevel@tonic-gate if (debug & (fac)) \ 213*0Sstevel@tonic-gate cmn_err(CE_CONT, format) 214*0Sstevel@tonic-gate #define DEBUGCONT1(fac, format, arg1) \ 215*0Sstevel@tonic-gate if (debug & (fac)) \ 216*0Sstevel@tonic-gate cmn_err(CE_CONT, format, arg1) 217*0Sstevel@tonic-gate #define DEBUGCONT2(fac, format, arg1, arg2) \ 218*0Sstevel@tonic-gate if (debug & (fac)) \ 219*0Sstevel@tonic-gate cmn_err(CE_CONT, format, arg1, arg2) 220*0Sstevel@tonic-gate #define DEBUGCONT3(fac, format, arg1, arg2, arg3) \ 221*0Sstevel@tonic-gate if (debug & (fac)) \ 222*0Sstevel@tonic-gate cmn_err(CE_CONT, format, arg1, arg2, arg3) 223*0Sstevel@tonic-gate #define DEBUGCONT4(fac, format, arg1, arg2, arg3, arg4) \ 224*0Sstevel@tonic-gate if (debug & (fac)) \ 225*0Sstevel@tonic-gate cmn_err(CE_CONT, format, arg1, arg2, arg3, arg4) 226*0Sstevel@tonic-gate #define DEBUGCONT10(fac, format, \ 227*0Sstevel@tonic-gate arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) \ 228*0Sstevel@tonic-gate if (debug & (fac)) \ 229*0Sstevel@tonic-gate cmn_err(CE_CONT, format, \ 230*0Sstevel@tonic-gate arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) 231*0Sstevel@tonic-gate #else 232*0Sstevel@tonic-gate #define DEBUGWARN0(fac, format) 233*0Sstevel@tonic-gate #define DEBUGNOTE0(fac, format) 234*0Sstevel@tonic-gate #define DEBUGNOTE1(fac, format, arg1) 235*0Sstevel@tonic-gate #define DEBUGNOTE2(fac, format, arg1, arg2) 236*0Sstevel@tonic-gate #define DEBUGNOTE3(fac, format, arg1, arg2, arg3) 237*0Sstevel@tonic-gate #define DEBUGCONT0(fac, format) 238*0Sstevel@tonic-gate #define DEBUGCONT1(fac, format, arg1) 239*0Sstevel@tonic-gate #define DEBUGCONT2(fac, format, arg1, arg2) 240*0Sstevel@tonic-gate #define DEBUGCONT3(fac, format, arg1, arg2, arg3) 241*0Sstevel@tonic-gate #define DEBUGCONT4(fac, format, arg1, arg2, arg3, arg4) 242*0Sstevel@tonic-gate #define DEBUGCONT10(fac, format, \ 243*0Sstevel@tonic-gate arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) 244*0Sstevel@tonic-gate #endif 245*0Sstevel@tonic-gate 246*0Sstevel@tonic-gate /* 247*0Sstevel@tonic-gate * Hardware channel common data. One structure per port. 248*0Sstevel@tonic-gate * Each of the fields in this structure is required to be protected by a 249*0Sstevel@tonic-gate * mutex lock at the highest priority at which it can be altered. 250*0Sstevel@tonic-gate * The asy_flags, and asy_next fields can be altered by interrupt 251*0Sstevel@tonic-gate * handling code that must be protected by the mutex whose handle is 252*0Sstevel@tonic-gate * stored in asy_excl_hi. All others can be protected by the asy_excl 253*0Sstevel@tonic-gate * mutex, which is lower priority and adaptive. 254*0Sstevel@tonic-gate */ 255*0Sstevel@tonic-gate 256*0Sstevel@tonic-gate struct asycom { 257*0Sstevel@tonic-gate int asy_flags; /* random flags */ 258*0Sstevel@tonic-gate /* protected by asy_excl_hi lock */ 259*0Sstevel@tonic-gate uint_t asy_hwtype; /* HW type: ASY16550A, etc. */ 260*0Sstevel@tonic-gate uint_t asy_use_fifo; /* HW FIFO use it or not ?? */ 261*0Sstevel@tonic-gate uint_t asy_fifo_buf; /* With FIFO = 16, otherwise = 1 */ 262*0Sstevel@tonic-gate uint_t asy_flags2; /* flags which don't change, no lock */ 263*0Sstevel@tonic-gate uint8_t *asy_ioaddr; /* i/o address of ASY port */ 264*0Sstevel@tonic-gate struct asyncline *asy_priv; /* protocol private data -- asyncline */ 265*0Sstevel@tonic-gate dev_info_t *asy_dip; /* dev_info */ 266*0Sstevel@tonic-gate int asy_unit; /* which port */ 267*0Sstevel@tonic-gate ddi_iblock_cookie_t asy_iblock; 268*0Sstevel@tonic-gate kmutex_t asy_excl; /* asy adaptive mutex */ 269*0Sstevel@tonic-gate kmutex_t asy_excl_hi; /* asy spinlock mutex */ 270*0Sstevel@tonic-gate uchar_t asy_msr; /* saved modem status */ 271*0Sstevel@tonic-gate uchar_t asy_mcr; /* soft carrier bits */ 272*0Sstevel@tonic-gate uchar_t asy_lcr; /* console lcr bits */ 273*0Sstevel@tonic-gate uchar_t asy_bidx; /* console baud rate index */ 274*0Sstevel@tonic-gate tcflag_t asy_cflag; /* console mode bits */ 275*0Sstevel@tonic-gate struct cons_polledio polledio; /* polled I/O functions */ 276*0Sstevel@tonic-gate ddi_acc_handle_t asy_iohandle; /* Data access handle */ 277*0Sstevel@tonic-gate tcflag_t asy_ocflag; /* old console mode bits */ 278*0Sstevel@tonic-gate uchar_t asy_com_port; /* COM port number, or zero */ 279*0Sstevel@tonic-gate uchar_t asy_fifor; /* FIFOR register setting */ 280*0Sstevel@tonic-gate #ifdef DEBUG 281*0Sstevel@tonic-gate int asy_msint_cnt; /* number of times in async_msint */ 282*0Sstevel@tonic-gate #endif 283*0Sstevel@tonic-gate }; 284*0Sstevel@tonic-gate 285*0Sstevel@tonic-gate /* 286*0Sstevel@tonic-gate * Asychronous protocol private data structure for ASY. 287*0Sstevel@tonic-gate * Each of the fields in the structure is required to be protected by 288*0Sstevel@tonic-gate * the lower priority lock except the fields that are set only at 289*0Sstevel@tonic-gate * base level but cleared (with out lock) at interrupt level. 290*0Sstevel@tonic-gate */ 291*0Sstevel@tonic-gate 292*0Sstevel@tonic-gate struct asyncline { 293*0Sstevel@tonic-gate int async_flags; /* random flags */ 294*0Sstevel@tonic-gate kcondvar_t async_flags_cv; /* condition variable for flags */ 295*0Sstevel@tonic-gate dev_t async_dev; /* device major/minor numbers */ 296*0Sstevel@tonic-gate mblk_t *async_xmitblk; /* transmit: active msg block */ 297*0Sstevel@tonic-gate struct asycom *async_common; /* device common data */ 298*0Sstevel@tonic-gate tty_common_t async_ttycommon; /* tty driver common data */ 299*0Sstevel@tonic-gate bufcall_id_t async_wbufcid; /* id for pending write-side bufcall */ 300*0Sstevel@tonic-gate timeout_id_t async_polltid; /* softint poll timeout id */ 301*0Sstevel@tonic-gate timeout_id_t async_dtrtid; /* delaying DTR turn on */ 302*0Sstevel@tonic-gate timeout_id_t async_utbrktid; /* hold minimum untimed break time id */ 303*0Sstevel@tonic-gate 304*0Sstevel@tonic-gate /* 305*0Sstevel@tonic-gate * The following fields are protected by the asy_excl_hi lock. 306*0Sstevel@tonic-gate * Some, such as async_flowc, are set only at the base level and 307*0Sstevel@tonic-gate * cleared (without the lock) only by the interrupt level. 308*0Sstevel@tonic-gate */ 309*0Sstevel@tonic-gate uchar_t *async_optr; /* output pointer */ 310*0Sstevel@tonic-gate int async_ocnt; /* output count */ 311*0Sstevel@tonic-gate ushort_t async_rput; /* producing pointer for input */ 312*0Sstevel@tonic-gate ushort_t async_rget; /* consuming pointer for input */ 313*0Sstevel@tonic-gate 314*0Sstevel@tonic-gate /* 315*0Sstevel@tonic-gate * Each character stuffed into the ring has two bytes associated 316*0Sstevel@tonic-gate * with it. The first byte is used to indicate special conditions 317*0Sstevel@tonic-gate * and the second byte is the actual data. The ring buffer 318*0Sstevel@tonic-gate * needs to be defined as ushort_t to accomodate this. 319*0Sstevel@tonic-gate */ 320*0Sstevel@tonic-gate ushort_t async_ring[RINGSIZE]; 321*0Sstevel@tonic-gate 322*0Sstevel@tonic-gate short async_break; /* break count */ 323*0Sstevel@tonic-gate int async_inflow_source; /* input flow control type */ 324*0Sstevel@tonic-gate 325*0Sstevel@tonic-gate union { 326*0Sstevel@tonic-gate struct { 327*0Sstevel@tonic-gate uchar_t _hw; /* overrun (hw) */ 328*0Sstevel@tonic-gate uchar_t _sw; /* overrun (sw) */ 329*0Sstevel@tonic-gate } _a; 330*0Sstevel@tonic-gate ushort_t uover_overrun; 331*0Sstevel@tonic-gate } async_uover; 332*0Sstevel@tonic-gate #define async_overrun async_uover._a.uover_overrun 333*0Sstevel@tonic-gate #define async_hw_overrun async_uover._a._hw 334*0Sstevel@tonic-gate #define async_sw_overrun async_uover._a._sw 335*0Sstevel@tonic-gate short async_ext; /* modem status change count */ 336*0Sstevel@tonic-gate short async_work; /* work to do flag */ 337*0Sstevel@tonic-gate timeout_id_t async_timer; /* close drain progress timer */ 338*0Sstevel@tonic-gate }; 339*0Sstevel@tonic-gate 340*0Sstevel@tonic-gate /* definitions for async_flags field */ 341*0Sstevel@tonic-gate #define ASYNC_EXCL_OPEN 0x10000000 /* exclusive open */ 342*0Sstevel@tonic-gate #define ASYNC_WOPEN 0x00000001 /* waiting for open to complete */ 343*0Sstevel@tonic-gate #define ASYNC_ISOPEN 0x00000002 /* open is complete */ 344*0Sstevel@tonic-gate #define ASYNC_OUT 0x00000004 /* line being used for dialout */ 345*0Sstevel@tonic-gate #define ASYNC_CARR_ON 0x00000008 /* carrier on last time we looked */ 346*0Sstevel@tonic-gate #define ASYNC_STOPPED 0x00000010 /* output is stopped */ 347*0Sstevel@tonic-gate #define ASYNC_DELAY 0x00000020 /* waiting for delay to finish */ 348*0Sstevel@tonic-gate #define ASYNC_BREAK 0x00000040 /* waiting for break to finish */ 349*0Sstevel@tonic-gate #define ASYNC_BUSY 0x00000080 /* waiting for transmission to finish */ 350*0Sstevel@tonic-gate #define ASYNC_DRAINING 0x00000100 /* waiting for output to drain */ 351*0Sstevel@tonic-gate #define ASYNC_SERVICEIMM 0x00000200 /* queue soft interrupt as soon as */ 352*0Sstevel@tonic-gate #define ASYNC_HW_IN_FLOW 0x00000400 /* input flow control in effect */ 353*0Sstevel@tonic-gate #define ASYNC_HW_OUT_FLW 0x00000800 /* output flow control in effect */ 354*0Sstevel@tonic-gate #define ASYNC_PROGRESS 0x00001000 /* made progress on output effort */ 355*0Sstevel@tonic-gate #define ASYNC_CLOSING 0x00002000 /* processing close on stream */ 356*0Sstevel@tonic-gate #define ASYNC_OUT_SUSPEND 0x00004000 /* waiting for TIOCSBRK to finish */ 357*0Sstevel@tonic-gate #define ASYNC_HOLD_UTBRK 0x00008000 /* waiting for untimed break hold */ 358*0Sstevel@tonic-gate /* the minimum time */ 359*0Sstevel@tonic-gate #define ASYNC_DTR_DELAY 0x00010000 /* delaying DTR turn on */ 360*0Sstevel@tonic-gate #define ASYNC_SW_IN_FLOW 0x00020000 /* sw input flow control in effect */ 361*0Sstevel@tonic-gate #define ASYNC_SW_OUT_FLW 0x00040000 /* sw output flow control in effect */ 362*0Sstevel@tonic-gate #define ASYNC_SW_IN_NEEDED 0x00080000 /* sw input flow control char is */ 363*0Sstevel@tonic-gate /* needed to be sent */ 364*0Sstevel@tonic-gate #define ASYNC_OUT_FLW_RESUME 0x00100000 /* output need to be resumed */ 365*0Sstevel@tonic-gate /* because of transition of flow */ 366*0Sstevel@tonic-gate /* control from stop to start */ 367*0Sstevel@tonic-gate 368*0Sstevel@tonic-gate /* asy_hwtype definitions */ 369*0Sstevel@tonic-gate #define ASY8250A 0x2 /* 8250A or 16450 */ 370*0Sstevel@tonic-gate #define ASY16550 0x3 /* broken FIFO which must not be used */ 371*0Sstevel@tonic-gate #define ASY16550A 0x4 /* usable FIFO */ 372*0Sstevel@tonic-gate #define ASY16650 0x5 373*0Sstevel@tonic-gate #define ASY16750 0x6 374*0Sstevel@tonic-gate 375*0Sstevel@tonic-gate /* definitions for asy_flags field */ 376*0Sstevel@tonic-gate #define ASY_NEEDSOFT 0x00000001 377*0Sstevel@tonic-gate #define ASY_DOINGSOFT 0x00000002 378*0Sstevel@tonic-gate #define ASY_PPS 0x00000004 379*0Sstevel@tonic-gate #define ASY_PPS_EDGE 0x00000008 380*0Sstevel@tonic-gate #define ASY_DOINGSOFT_RETRY 0x00000010 381*0Sstevel@tonic-gate #define ASY_RTS_DTR_OFF 0x00000020 382*0Sstevel@tonic-gate #define ASY_IGNORE_CD 0x00000040 383*0Sstevel@tonic-gate #define ASY_CONSOLE 0x00000080 384*0Sstevel@tonic-gate 385*0Sstevel@tonic-gate /* definitions for asy_flags2 field */ 386*0Sstevel@tonic-gate #define ASY2_NO_LOOPBACK 0x00000001 /* Device doesn't support loopback */ 387*0Sstevel@tonic-gate 388*0Sstevel@tonic-gate /* definitions for async_inflow_source field in struct asyncline */ 389*0Sstevel@tonic-gate #define IN_FLOW_NULL 0x00000000 390*0Sstevel@tonic-gate #define IN_FLOW_RINGBUFF 0x00000001 391*0Sstevel@tonic-gate #define IN_FLOW_STREAMS 0x00000002 392*0Sstevel@tonic-gate #define IN_FLOW_USER 0x00000004 393*0Sstevel@tonic-gate 394*0Sstevel@tonic-gate /* 395*0Sstevel@tonic-gate * OUTLINE defines the high-order flag bit in the minor device number that 396*0Sstevel@tonic-gate * controls use of a tty line for dialin and dialout simultaneously. 397*0Sstevel@tonic-gate */ 398*0Sstevel@tonic-gate #ifdef _LP64 399*0Sstevel@tonic-gate #define OUTLINE (1 << (NBITSMINOR32 - 1)) 400*0Sstevel@tonic-gate #else 401*0Sstevel@tonic-gate #define OUTLINE (1 << (NBITSMINOR - 1)) 402*0Sstevel@tonic-gate #endif 403*0Sstevel@tonic-gate #define UNIT(x) (getminor(x) & ~OUTLINE) 404*0Sstevel@tonic-gate 405*0Sstevel@tonic-gate /* 406*0Sstevel@tonic-gate * ASYSETSOFT macro to pend a soft interrupt if one isn't already pending. 407*0Sstevel@tonic-gate */ 408*0Sstevel@tonic-gate 409*0Sstevel@tonic-gate extern kmutex_t asy_soft_lock; /* ptr to lock for asysoftpend */ 410*0Sstevel@tonic-gate extern int asysoftpend; /* secondary interrupt pending */ 411*0Sstevel@tonic-gate 412*0Sstevel@tonic-gate #define ASYSETSOFT(asy) { \ 413*0Sstevel@tonic-gate mutex_enter(&asy_soft_lock); \ 414*0Sstevel@tonic-gate asy->asy_flags |= ASY_NEEDSOFT; \ 415*0Sstevel@tonic-gate if (!asysoftpend) { \ 416*0Sstevel@tonic-gate asysoftpend = 1; \ 417*0Sstevel@tonic-gate mutex_exit(&asy_soft_lock); \ 418*0Sstevel@tonic-gate ddi_trigger_softintr(asy_softintr_id); \ 419*0Sstevel@tonic-gate } \ 420*0Sstevel@tonic-gate else \ 421*0Sstevel@tonic-gate mutex_exit(&asy_soft_lock); \ 422*0Sstevel@tonic-gate } 423*0Sstevel@tonic-gate 424*0Sstevel@tonic-gate #ifdef __cplusplus 425*0Sstevel@tonic-gate } 426*0Sstevel@tonic-gate #endif 427*0Sstevel@tonic-gate 428*0Sstevel@tonic-gate #endif /* _SYS_ASY_H */ 429