Home | History | Annotate | Download | only in sys
      1     0    stevel /*
      2     0    stevel  * CDDL HEADER START
      3     0    stevel  *
      4     0    stevel  * The contents of this file are subject to the terms of the
      5  2877   anovick  * Common Development and Distribution License (the "License").
      6  5973  zk194757  * You may not use this file except in compliance with the License.
      7     0    stevel  *
      8     0    stevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9     0    stevel  * or http://www.opensolaris.org/os/licensing.
     10     0    stevel  * See the License for the specific language governing permissions
     11     0    stevel  * and limitations under the License.
     12     0    stevel  *
     13     0    stevel  * When distributing Covered Code, include this CDDL HEADER in each
     14     0    stevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15     0    stevel  * If applicable, add the following below this CDDL HEADER, with the
     16     0    stevel  * fields enclosed by brackets "[]" replaced with your own identifying
     17     0    stevel  * information: Portions Copyright [yyyy] [name of copyright owner]
     18     0    stevel  *
     19     0    stevel  * CDDL HEADER END
     20     0    stevel  */
     21     0    stevel /*	Copyright (c) 1990, 1991 UNIX System Laboratories, Inc.	*/
     22     0    stevel /*	Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T	*/
     23     0    stevel /*	  All Rights Reserved 	*/
     24     0    stevel 
     25     0    stevel /*
     26  5973  zk194757  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     27     0    stevel  * Use is subject to license terms.
     28     0    stevel  */
     29     0    stevel 
     30     0    stevel #ifndef	_SYS_SUDEV_H
     31     0    stevel #define	_SYS_SUDEV_H
     32     0    stevel 
     33     0    stevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
     34     0    stevel 
     35     0    stevel #ifdef __cplusplus
     36     0    stevel extern "C" {
     37     0    stevel #endif
     38     0    stevel 
     39     0    stevel #include <sys/tty.h>
     40     0    stevel #include <sys/ksynch.h>
     41     0    stevel #include <sys/dditypes.h>
     42     0    stevel #include <sys/types.h>
     43     0    stevel #include <sys/kstat.h>
     44     0    stevel 
     45     0    stevel /*
     46     0    stevel  * Definitions for INS8250 / 16550  chips
     47     0    stevel  */
     48     0    stevel 
     49     0    stevel /* defined as offsets from the data register */
     50     0    stevel #define	DAT		0 	/* receive/transmit data */
     51     0    stevel #define	ICR		1  	/* interrupt control register */
     52     0    stevel #define	ISR		2   	/* interrupt status register */
     53     0    stevel #define	LCR		3   	/* line control register */
     54     0    stevel #define	MCR		4   	/* modem control register */
     55     0    stevel #define	LSR		5   	/* line status register */
     56     0    stevel #define	MSR		6   	/* modem status register */
     57  2877   anovick #define	SPR		7   	/* scratchpad register for ST16C554D */
     58     0    stevel #define	DLL		0   	/* divisor latch (lsb) */
     59     0    stevel #define	DLH		1   	/* divisor latch (msb) */
     60     0    stevel #define	FIFOR		ISR	/* FIFO register for 16550 */
     61     0    stevel #define	OUTB(offset, value)	ddi_put8(asy->asy_handle, \
     62     0    stevel 				    asy->asy_ioaddr+offset, value)
     63     0    stevel #define	INB(offset)	ddi_get8(asy->asy_handle, asy->asy_ioaddr+offset)
     64     0    stevel 
     65     0    stevel /*
     66     0    stevel  * INTEL 8210-A/B & 16450/16550 Registers Structure.
     67     0    stevel  */
     68     0    stevel 
     69     0    stevel /* Line Control Register */
     70     0    stevel #define	WLS0		0x01	/* word length select bit 0 */
     71     0    stevel #define	WLS1		0x02	/* word length select bit 2 */
     72     0    stevel #define	STB		0x04	/* number of stop bits */
     73     0    stevel #define	PEN		0x08	/* parity enable */
     74     0    stevel #define	EPS		0x10	/* even parity select */
     75     0    stevel #define	SETBREAK 	0x40	/* break key */
     76     0    stevel #define	DLAB		0x80	/* divisor latch access bit */
     77     0    stevel #define	RXLEN   	0x03   	/* # of data bits per received/xmitted char */
     78     0    stevel #define	STOP1   	0x00
     79     0    stevel #define	STOP2   	0x04
     80     0    stevel #define	PAREN   	0x08
     81     0    stevel #define	PAREVN  	0x10
     82     0    stevel #define	PARMARK 	0x20
     83     0    stevel #define	SNDBRK  	0x40
     84     0    stevel 
     85     0    stevel 
     86     0    stevel #define	BITS5		0x00	/* 5 bits per char */
     87     0    stevel #define	BITS6		0x01	/* 6 bits per char */
     88     0    stevel #define	BITS7		0x02	/* 7 bits per char */
     89     0    stevel #define	BITS8		0x03	/* 8 bits per char */
     90     0    stevel 
     91     0    stevel /* baud rate definitions */
     92     0    stevel #define	ASY110		1047	/* 110 baud rate for serial console */
     93     0    stevel #define	ASY150		768	/* 150 baud rate for serial console */
     94     0    stevel #define	ASY300		384	/* 300 baud rate for serial console */
     95     0    stevel #define	ASY600		192	/* 600 baud rate for serial console */
     96     0    stevel #define	ASY1200		96	/* 1200 baud rate for serial console */
     97     0    stevel #define	ASY2400		48	/* 2400 baud rate for serial console */
     98     0    stevel #define	ASY4800		24	/* 4800 baud rate for serial console */
     99     0    stevel #define	ASY9600		12	/* 9600 baud rate for serial console */
    100     0    stevel 
    101     0    stevel /* Line Status Register */
    102     0    stevel #define	RCA		0x01	/* data ready */
    103     0    stevel #define	OVRRUN		0x02	/* overrun error */
    104     0    stevel #define	PARERR		0x04	/* parity error */
    105     0    stevel #define	FRMERR		0x08	/* framing error */
    106     0    stevel #define	BRKDET  	0x10	/* a break has arrived */
    107     0    stevel #define	XHRE		0x20	/* tx hold reg is now empty */
    108     0    stevel #define	XSRE		0x40	/* tx shift reg is now empty */
    109     0    stevel #define	RFBE		0x80	/* rx FIFO Buffer error */
    110     0    stevel 
    111     0    stevel /* Interrupt Id Regisger */
    112     0    stevel #define	MSTATUS		0x00	/* modem status changed */
    113     0    stevel #define	NOINTERRUPT	0x01	/* no interrupt pending */
    114     0    stevel #define	TxRDY		0x02	/* Transmitter Holding Register Empty */
    115     0    stevel #define	RxRDY		0x04	/* Receiver Data Available */
    116     0    stevel #define	FFTMOUT 	0x0c	/* FIFO timeout - 16550AF */
    117     0    stevel #define	RSTATUS 	0x06	/* Receiver Line Status */
    118     0    stevel 
    119     0    stevel /* Interrupt Enable Register */
    120     0    stevel #define	RIEN		0x01	/* Received Data Ready */
    121     0    stevel #define	TIEN		0x02	/* Tx Hold Register Empty */
    122     0    stevel #define	SIEN		0x04	/* Receiver Line Status */
    123     0    stevel #define	MIEN		0x08	/* Modem Status */
    124     0    stevel 
    125     0    stevel /* Modem Control Register */
    126     0    stevel #define	DTR		0x01	/* Data Terminal Ready */
    127     0    stevel #define	RTS		0x02	/* Request To Send */
    128     0    stevel #define	OUT1		0x04	/* Aux output - not used */
    129     0    stevel #define	OUT2		0x08	/* dis/enable int per INO on ALI1535D+ */
    130     0    stevel #define	ASY_LOOP	0x10	/* loopback for diagnostics */
    131     0    stevel 
    132     0    stevel /* Modem Status Register */
    133     0    stevel #define	DCTS		0x01	/* Delta Clear To Send */
    134     0    stevel #define	DDSR		0x02	/* Delta Data Set Ready */
    135     0    stevel #define	DRI		0x04	/* Trail Edge Ring Indicator */
    136     0    stevel #define	DDCD		0x08	/* Delta Data Carrier Detect */
    137     0    stevel #define	CTS		0x10	/* Clear To Send */
    138     0    stevel #define	DSR		0x20	/* Data Set Ready */
    139     0    stevel #define	RI		0x40	/* Ring Indicator */
    140     0    stevel #define	DCD		0x80	/* Data Carrier Detect */
    141     0    stevel 
    142     0    stevel #define	DELTAS(x)	((x)&(DCTS|DDSR|DRI|DDCD))
    143     0    stevel #define	STATES(x)	((x)(CTS|DSR|RI|DCD))
    144     0    stevel 
    145     0    stevel /* flags for FCR (FIFO Control register) */
    146     0    stevel #define	FIFO_OFF	0x00	/* fifo disabled */
    147     0    stevel #define	FIFO_ON		0x01	/* fifo enabled */
    148     0    stevel #define	FIFOEN		0x8f	/* fifo enabled, w/ 8 byte trigger */
    149     0    stevel #define	FIFORCLR	0x8b	/* Clear receiver FIFO only */
    150     0    stevel 
    151     0    stevel #define	FIFORXFLSH	0x02	/* flush receiver FIFO */
    152     0    stevel #define	FIFOTXFLSH	0x04	/* flush transmitter FIFO */
    153     0    stevel #define	FIFODMA		0x08	/* DMA mode 1 */
    154     0    stevel #define	FIFO_TRIG_1	0x00	/* 1 byte trigger level */
    155     0    stevel #define	FIFO_TRIG_4	0x40	/* 4 byte trigger level */
    156     0    stevel #define	FIFO_TRIG_8	0x80	/* 8 byte trigger level */
    157     0    stevel #define	FIFO_TRIG_14	0xC0	/* 14 byte trigger level */
    158     0    stevel 
    159     0    stevel /*
    160     0    stevel  * Defines for ioctl calls (VP/ix)
    161     0    stevel  */
    162     0    stevel 
    163     0    stevel #define	AIOC		('A'<<8)
    164     0    stevel #define	AIOCINTTYPE	(AIOC|60)	/* set interrupt type */
    165     0    stevel #define	AIOCDOSMODE	(AIOC|61)	/* set DOS mode */
    166     0    stevel #define	AIOCNONDOSMODE	(AIOC|62)	/* reset DOS mode */
    167     0    stevel #define	AIOCSERIALOUT	(AIOC|63)	/* serial device data write */
    168     0    stevel #define	AIOCSERIALIN	(AIOC|64)	/* serial device data read */
    169     0    stevel #define	AIOCSETSS	(AIOC|65)	/* set start/stop chars */
    170     0    stevel #define	AIOCINFO	(AIOC|66)	/* tell usr what device we are */
    171     0    stevel 
    172     0    stevel /* Ioctl alternate names used by VP/ix */
    173     0    stevel #define	VPC_SERIAL_DOS		AIOCDOSMODE
    174     0    stevel #define	VPC_SERIAL_NONDOS	AIOCNONDOSMODE
    175     0    stevel #define	VPC_SERIAL_INFO		AIOCINFO
    176     0    stevel #define	VPC_SERIAL_OUT		AIOCSERIALOUT
    177     0    stevel #define	VPC_SERIAL_IN		AIOCSERIALIN
    178     0    stevel 
    179     0    stevel /* Serial in/out requests */
    180     0    stevel #define	SO_DIVLLSB	1
    181     0    stevel #define	SO_DIVLMSB	2
    182     0    stevel #define	SO_LCR		3
    183     0    stevel #define	SO_MCR		4
    184     0    stevel #define	SI_MSR		1
    185     0    stevel #define	SIO_MASK(elem)		(1<<((elem)-1))
    186     0    stevel 
    187     0    stevel #define	OVERRUN		040000
    188     0    stevel #define	FRERROR		020000
    189     0    stevel #define	PERROR		010000
    190     0    stevel #define	S_ERRORS	(PERROR|OVERRUN|FRERROR)
    191     0    stevel 
    192     0    stevel /*
    193     0    stevel  * Ring buffer and async line management definitions.
    194     0    stevel  */
    195     0    stevel #define	RINGBITS	16		/* # of bits in ring ptrs */
    196     0    stevel #define	RINGSIZE	(1<<RINGBITS)   /* size of ring */
    197     0    stevel #define	RINGMASK	(RINGSIZE-1)
    198     0    stevel #define	RINGFRAC	12		/* fraction of ring to force flush */
    199     0    stevel 
    200     0    stevel #define	RING_INIT(ap)  ((ap)->async_rput = (ap)->async_rget = 0)
    201     0    stevel #define	RING_CNT(ap)   (((ap)->async_rput - (ap)->async_rget) & RINGMASK)
    202     0    stevel #define	RING_FRAC(ap)  ((int)RING_CNT(ap) >= (int)(RINGSIZE/RINGFRAC))
    203     0    stevel #define	RING_POK(ap, n) ((int)RING_CNT(ap) < (int)(RINGSIZE-(n)))
    204     0    stevel #define	RING_PUT(ap, c) \
    205     0    stevel 	((ap)->async_ring[(ap)->async_rput++ & RINGMASK] =  (uchar_t)(c))
    206     0    stevel #define	RING_UNPUT(ap) ((ap)->async_rput--)
    207     0    stevel #define	RING_GOK(ap, n) ((int)RING_CNT(ap) >= (int)(n))
    208     0    stevel #define	RING_GET(ap)   ((ap)->async_ring[(ap)->async_rget++ & RINGMASK])
    209     0    stevel #define	RING_EAT(ap, n) ((ap)->async_rget += (n))
    210     0    stevel #define	RING_MARK(ap, c, s) \
    211     0    stevel 	((ap)->async_ring[(ap)->async_rput++ & RINGMASK] = ((uchar_t)(c)|(s)))
    212     0    stevel #define	RING_UNMARK(ap) \
    213     0    stevel 	((ap)->async_ring[((ap)->async_rget) & RINGMASK] &= ~S_ERRORS)
    214     0    stevel #define	RING_ERR(ap, c) \
    215     0    stevel 	((ap)->async_ring[((ap)->async_rget) & RINGMASK] & (c))
    216     0    stevel 
    217     0    stevel /*
    218     0    stevel  * Serial kstats structure and macro to increment an individual kstat
    219     0    stevel  */
    220     0    stevel struct serial_kstats {
    221     0    stevel 		kstat_named_t	ringover;	/* ring buffer overflow */
    222     0    stevel 		kstat_named_t	siloover;	/* silo overflow */
    223     0    stevel };
    224     0    stevel 
    225     0    stevel #define	INC64_KSTAT(asy, stat) (asy)->kstats.stat.value.ui64++;
    226     0    stevel 
    227     0    stevel /*
    228     0    stevel  * Hardware channel common data. One structure per port.
    229     0    stevel  * Each of the fields in this structure is required to be protected by a
    230     0    stevel  * mutex lock at the highest priority at which it can be altered.
    231     0    stevel  * The asy_flags, and asy_next fields can be altered by interrupt
    232     0    stevel  * handling code that must be protected by the mutex whose handle is
    233     0    stevel  * stored in asy_excl_hi.  All others can be protected by the asy_excl
    234     0    stevel  * mutex, which is lower priority and adaptive.
    235     0    stevel  */
    236     0    stevel struct asycom {
    237     0    stevel 	int		asy_flags;	/* random flags  */
    238     0    stevel 					/* protected by asy_excl_hi lock */
    239     0    stevel 	uint_t		asy_hwtype;	/* HW type: ASY82510, etc. */
    240     0    stevel 	uint_t		asy_use_fifo;	/* HW FIFO use it or not ?? */
    241     0    stevel 	uint_t		asy_fifo_buf;	/* With FIFO = 16, otherwise = 1 */
    242     0    stevel 	uchar_t		*asy_ioaddr;	/* i/o address of ASY port */
    243     0    stevel 	uint_t		asy_vect;	/* IRQ number */
    244     0    stevel 	boolean_t	suspended;	/* TRUE if driver suspended */
    245     0    stevel 	caddr_t		asy_priv;	/* protocol private data */
    246     0    stevel 	dev_info_t	*asy_dip;	/* dev_info */
    247     0    stevel 	long		asy_unit;	/* which port */
    248     0    stevel 	ddi_iblock_cookie_t asy_iblock;
    249     0    stevel 	kmutex_t	*asy_excl;	/* asy adaptive mutex */
    250     0    stevel 	kmutex_t	*asy_excl_hi;	/* asy spinlock mutex */
    251     0    stevel 	ddi_acc_handle_t asy_handle;    /* ddi_get/put handle */
    252     0    stevel 	ushort_t	asy_rsc_console;	/* RSC console port */
    253     0    stevel 	ushort_t	asy_rsc_control;	/* RSC control port */
    254     0    stevel 	ushort_t	asy_lom_console;	/* LOM console port */
    255     0    stevel 	uint_t		asy_xmit_count;	/* Count the no of xmits in one intr */
    256     0    stevel 	uint_t		asy_out_of_band_xmit; /* Out of band xmission */
    257     0    stevel 	uint_t		asy_rx_count;	/* No. of bytes rx'eved in one intr */
    258     0    stevel 	uchar_t		asy_device_type; /* Currently used for this device */
    259     0    stevel 	uchar_t		asy_trig_level;	/* Receive FIFO trig level */
    260     0    stevel 	kmutex_t	*asy_soft_lock;	/* soft lock for gaurding softpend. */
    261     0    stevel 	int		asysoftpend;	/* Flag indicating soft int pending. */
    262     0    stevel 	ddi_softintr_t asy_softintr_id;
    263     0    stevel 	ddi_iblock_cookie_t asy_soft_iblock;
    264     0    stevel 	int		asy_baud_divisor_factor; /* for different chips */
    265     0    stevel 	int		asy_ocflags; /* old cflags used in asy_program() */
    266     0    stevel 	uint_t		asy_cached_msr; /* a cache for the MSR register */
    267     0    stevel 	int		asy_speed_cap; /* maximum baud rate */
    268     0    stevel 	kstat_t		*sukstat;	/* ptr to serial kstats */
    269     0    stevel 	struct serial_kstats kstats;	/* serial kstats structure */
    270     0    stevel 	boolean_t	inperim;	/* in streams q perimeter */
    271  5973  zk194757 	cons_polledio_t polledio;	/* polled IO functios */
    272  5973  zk194757 	uchar_t		polled_icr;	/* the value of ICR on start of poll */
    273  5973  zk194757 	boolean_t	polled_enter;	/* if asy_polled_enter was called */
    274     0    stevel };
    275     0    stevel 
    276     0    stevel /*
    277     0    stevel  * Asychronous protocol private data structure for ASY.
    278     0    stevel  * Each of the fields in the structure is required to be protected by
    279     0    stevel  * the lower priority lock except the fields that are set only at
    280     0    stevel  * base level but cleared (with out lock) at interrupt level.
    281     0    stevel  */
    282     0    stevel struct asyncline {
    283     0    stevel 	int		async_flags;	/* random flags */
    284     0    stevel 	kcondvar_t	async_flags_cv; /* condition variable for flags */
    285     0    stevel 	dev_t		async_dev;	/* device major/minor numbers */
    286     0    stevel 	mblk_t		*async_xmitblk;	/* transmit: active msg block */
    287     0    stevel 	struct asycom	*async_common;	/* device common data */
    288     0    stevel 	tty_common_t 	async_ttycommon; /* tty driver common data */
    289     0    stevel 	bufcall_id_t	async_wbufcid;	/* id for pending write-side bufcall */
    290     0    stevel 	timeout_id_t	async_polltid;	/* softint poll timeout id */
    291     0    stevel 
    292     0    stevel 	/*
    293     0    stevel 	 * The following fields are protected by the asy_excl_hi lock.
    294     0    stevel 	 * Some, such as async_flowc, are set only at the base level and
    295     0    stevel 	 * cleared (without the lock) only by the interrupt level.
    296     0    stevel 	 */
    297     0    stevel 	uchar_t		*async_optr;	/* output pointer */
    298     0    stevel 	int		async_ocnt;	/* output count */
    299     0    stevel 	uint_t		async_rput;	/* producing pointer for input */
    300     0    stevel 	uint_t		async_rget;	/* consuming pointer for input */
    301     0    stevel 	uchar_t		async_flowc;	/* flow control char to send */
    302     0    stevel 
    303     0    stevel 	/*
    304     0    stevel 	 * Each character stuffed into the ring has two bytes associated
    305     0    stevel 	 * with it.  The first byte is used to indicate special conditions
    306     0    stevel 	 * and the second byte is the actual data.  The ring buffer
    307     0    stevel 	 * needs to be defined as ushort_t to accomodate this.
    308     0    stevel 	 */
    309     0    stevel 	ushort_t	async_ring[RINGSIZE];
    310     0    stevel 
    311     0    stevel 	short		async_break;	/* break count */
    312     0    stevel 
    313     0    stevel 	union {
    314     0    stevel 		struct {
    315     0    stevel 			uchar_t _hw;	/* overrun (hw) */
    316     0    stevel 			uchar_t _sw;	/* overrun (sw) */
    317     0    stevel 		} _a;
    318     0    stevel 		ushort_t uover_overrun;
    319     0    stevel 	} async_uover;
    320     0    stevel #define	async_overrun		async_uover._a.uover_overrun
    321     0    stevel #define	async_hw_overrun	async_uover._a._hw
    322     0    stevel #define	async_sw_overrun	async_uover._a._sw
    323     0    stevel 	short		async_ext;	/* modem status change count */
    324     0    stevel 	short		async_work;	/* work to do flag */
    325     0    stevel 	uchar_t		async_queue_full; /* Streams Queue Full */
    326     0    stevel 	uchar_t		async_ringbuf_overflow; /* when ring buffer overflows */
    327     0    stevel 	timeout_id_t	async_timer;	/* close drain progress timer */
    328     0    stevel };
    329     0    stevel 
    330     0    stevel /* definitions for async_flags field */
    331     0    stevel #define	ASYNC_EXCL_OPEN	 0x10000000	/* exclusive open */
    332     0    stevel #define	ASYNC_WOPEN	 0x00000001	/* waiting for open to complete */
    333     0    stevel #define	ASYNC_ISOPEN	 0x00000002	/* open is complete */
    334     0    stevel #define	ASYNC_OUT	 0x00000004	/* line being used for dialout */
    335     0    stevel #define	ASYNC_CARR_ON	 0x00000008	/* carrier on last time we looked */
    336     0    stevel #define	ASYNC_STOPPED	 0x00000010	/* output is stopped */
    337     0    stevel #define	ASYNC_DELAY	 0x00000020	/* waiting for delay to finish */
    338     0    stevel #define	ASYNC_BREAK	 0x00000040	/* waiting for break to finish */
    339     0    stevel #define	ASYNC_BUSY	 0x00000080	/* waiting for transmission to finish */
    340     0    stevel #define	ASYNC_DRAINING	 0x00000100	/* waiting for output to drain */
    341     0    stevel #define	ASYNC_SERVICEIMM 0x00000200	/* queue soft interrupt as soon as */
    342     0    stevel #define	ASYNC_HW_IN_FLOW 0x00000400	/* input flow control in effect */
    343     0    stevel #define	ASYNC_HW_OUT_FLW 0x00000800	/* output flow control in effect */
    344     0    stevel #define	ASYNC_PROGRESS	 0x00001000	/* made progress on output effort */
    345     0    stevel #define	ASYNC_CLOSING	 0x00002000	/* closing the stream */
    346     0    stevel 
    347     0    stevel /* asy_hwtype definitions */
    348     0    stevel #define	ASY82510	0x1
    349     0    stevel #define	ASY16550AF	0x2
    350     0    stevel #define	ASY8250		0x3		/* 8250 or 16450 or 16550 */
    351  2877   anovick #define	ASY16C554D	0x4		/* ST16C554D */
    352     0    stevel 
    353     0    stevel /* definitions for asy_flags field */
    354     0    stevel #define	ASY_NEEDSOFT	0x00000001
    355     0    stevel #define	ASY_DOINGSOFT	0x00000002
    356     0    stevel #define	ASY_PPS		0x00000004
    357     0    stevel #define	ASY_PPS_EDGE	0x00000008
    358     0    stevel #define	ASY_IGNORE_CD	0x00000040
    359     0    stevel 
    360     0    stevel /*
    361     0    stevel  * Different devices this driver supports and what it is used to drive
    362     0    stevel  * currently
    363     0    stevel  */
    364     0    stevel #define	ASY_KEYBOARD 	0x01
    365     0    stevel #define	ASY_MOUSE	0x02
    366     0    stevel #define	ASY_SERIAL	0x03
    367     0    stevel 
    368     0    stevel /*
    369     0    stevel  * RSC_DEVICE defines the bit in the minor device number that specifies
    370     0    stevel  * the tty line is to be used for console/controlling a RSC device.
    371     0    stevel  */
    372     0    stevel #define	RSC_DEVICE	(1 << (NBITSMINOR32 - 4))
    373     0    stevel 
    374     0    stevel /*
    375     0    stevel  * OUTLINE defines the high-order flag bit in the minor device number that
    376     0    stevel  * controls use of a tty line for dialin and dialout simultaneously.
    377     0    stevel  */
    378     0    stevel #define	OUTLINE		(1 << (NBITSMINOR32 - 1))
    379     0    stevel #define	UNIT(x)		(getminor(x) & ~(OUTLINE | RSC_DEVICE))
    380     0    stevel 
    381     0    stevel /* suggested number of soft state instances */
    382     0    stevel #define	SU_INITIAL_SOFT_ITEMS	0x02
    383     0    stevel 
    384     0    stevel /*
    385     0    stevel  * ASYSETSOFT macro to pend a soft interrupt if one isn't already pending.
    386     0    stevel  */
    387     0    stevel 
    388     0    stevel #define	ASYSETSOFT(asy)	{		\
    389     0    stevel 	if (mutex_tryenter(asy->asy_soft_lock)) {	\
    390     0    stevel 		asy->asy_flags |= ASY_NEEDSOFT;	\
    391     0    stevel 		if (!asy->asysoftpend) {		\
    392     0    stevel 			asy->asysoftpend = 1;	\
    393     0    stevel 			mutex_exit(asy->asy_soft_lock);\
    394     0    stevel 			ddi_trigger_softintr(asy->asy_softintr_id);\
    395     0    stevel 		} else					\
    396     0    stevel 			mutex_exit(asy->asy_soft_lock);\
    397     0    stevel 	}						\
    398     0    stevel }
    399     0    stevel 
    400     0    stevel #ifdef __cplusplus
    401     0    stevel }
    402     0    stevel #endif
    403     0    stevel 
    404     0    stevel #endif	/* _SYS_SUDEV_H */
    405