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