/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T */ /* All Rights Reserved */ /* * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _SYS_XENCONS_H #define _SYS_XENCONS_H #pragma ident "%Z%%M% %I% %E% SMI" #ifdef __cplusplus extern "C" { #endif #include #include #include #include /* * Xencons tracing macros. These are a similar to some macros in sys/vtrace.h. * * XXX - Needs review: would it be better to use the macros in sys/vtrace.h ? */ #ifdef DEBUG #define DEBUGWARN0(fac, format) \ if (debug & (fac)) \ cmn_err(CE_WARN, format) #define DEBUGNOTE0(fac, format) \ if (debug & (fac)) \ cmn_err(CE_NOTE, format) #define DEBUGNOTE1(fac, format, arg1) \ if (debug & (fac)) \ cmn_err(CE_NOTE, format, arg1) #define DEBUGNOTE2(fac, format, arg1, arg2) \ if (debug & (fac)) \ cmn_err(CE_NOTE, format, arg1, arg2) #define DEBUGNOTE3(fac, format, arg1, arg2, arg3) \ if (debug & (fac)) \ cmn_err(CE_NOTE, format, arg1, arg2, arg3) #define DEBUGCONT0(fac, format) \ if (debug & (fac)) \ cmn_err(CE_CONT, format) #define DEBUGCONT1(fac, format, arg1) \ if (debug & (fac)) \ cmn_err(CE_CONT, format, arg1) #define DEBUGCONT2(fac, format, arg1, arg2) \ if (debug & (fac)) \ cmn_err(CE_CONT, format, arg1, arg2) #define DEBUGCONT3(fac, format, arg1, arg2, arg3) \ if (debug & (fac)) \ cmn_err(CE_CONT, format, arg1, arg2, arg3) #define DEBUGCONT4(fac, format, arg1, arg2, arg3, arg4) \ if (debug & (fac)) \ cmn_err(CE_CONT, format, arg1, arg2, arg3, arg4) #define DEBUGCONT10(fac, format, \ arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) \ if (debug & (fac)) \ cmn_err(CE_CONT, format, \ arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) #else #define DEBUGWARN0(fac, format) #define DEBUGNOTE0(fac, format) #define DEBUGNOTE1(fac, format, arg1) #define DEBUGNOTE2(fac, format, arg1, arg2) #define DEBUGNOTE3(fac, format, arg1, arg2, arg3) #define DEBUGCONT0(fac, format) #define DEBUGCONT1(fac, format, arg1) #define DEBUGCONT2(fac, format, arg1, arg2) #define DEBUGCONT3(fac, format, arg1, arg2, arg3) #define DEBUGCONT4(fac, format, arg1, arg2, arg3, arg4) #define DEBUGCONT10(fac, format, \ arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) #endif /* enum value for sw and hw flow control action */ typedef enum { FLOW_CHECK, FLOW_STOP, FLOW_START } async_flowc_action; #define async_stopc async_ttycommon.t_stopc #define async_startc async_ttycommon.t_startc /* * Console instance data. * Each of the fields in this structure is required to be protected by a * mutex lock at the highest priority at which it can be altered. */ struct xencons { int flags; /* random flags */ struct asyncline *priv; /* protocol private data -- asyncline */ dev_info_t *dip; /* dev_info */ int unit; /* which port */ kmutex_t excl; /* adaptive mutex */ kcondvar_t excl_cv; /* condition variable */ struct cons_polledio polledio; /* polled I/O functions */ unsigned char pollbuf[60]; /* polled I/O data */ int polldix; /* polled data buffer index */ int polllen; /* polled data buffer length */ volatile struct xencons_interface *ifp; /* console ring buffers */ int console_irq; /* dom0 console interrupt */ int evtchn; /* console event channel */ }; /* * Asychronous protocol private data structure for ASY. * Each of the fields in the structure is required to be protected by * the lower priority lock except the fields that are set only at * base level but cleared (with out lock) at interrupt level. */ struct asyncline { int async_flags; /* random flags */ kcondvar_t async_flags_cv; /* condition variable for flags */ dev_t async_dev; /* device major/minor numbers */ mblk_t *async_xmitblk; /* transmit: active msg block */ struct xencons *async_common; /* device common data */ tty_common_t async_ttycommon; /* tty driver common data */ bufcall_id_t async_wbufcid; /* id for pending write-side bufcall */ timeout_id_t async_polltid; /* softint poll timeout id */ timeout_id_t async_dtrtid; /* delaying DTR turn on */ timeout_id_t async_utbrktid; /* hold minimum untimed break time id */ /* * The following fields are protected by the excl_hi lock. * Some, such as async_flowc, are set only at the base level and * cleared (without the lock) only by the interrupt level. */ uchar_t *async_optr; /* output pointer */ int async_ocnt; /* output count */ ushort_t async_rput; /* producing pointer for input */ ushort_t async_rget; /* consuming pointer for input */ int async_inflow_source; /* input flow control type */ union { struct { uchar_t _hw; /* overrun (hw) */ uchar_t _sw; /* overrun (sw) */ } _a; ushort_t uover_overrun; } async_uover; #define async_overrun async_uover._a.uover_overrun #define async_hw_overrun async_uover._a._hw #define async_sw_overrun async_uover._a._sw short async_ext; /* modem status change count */ short async_work; /* work to do flag */ }; /* definitions for async_flags field */ #define ASYNC_EXCL_OPEN 0x10000000 /* exclusive open */ #define ASYNC_WOPEN 0x00000001 /* waiting for open to complete */ #define ASYNC_ISOPEN 0x00000002 /* open is complete */ #define ASYNC_STOPPED 0x00000010 /* output is stopped */ #define ASYNC_PROGRESS 0x00001000 /* made progress on output effort */ #define ASYNC_CLOSING 0x00002000 /* processing close on stream */ #define ASYNC_SW_IN_FLOW 0x00020000 /* sw input flow control in effect */ #define ASYNC_SW_OUT_FLW 0x00040000 /* sw output flow control in effect */ #define ASYNC_SW_IN_NEEDED 0x00080000 /* sw input flow control char is */ /* needed to be sent */ #define ASYNC_OUT_FLW_RESUME 0x00100000 /* output need to be resumed */ /* because of transition of flow */ /* control from stop to start */ /* definitions for asy_flags field */ #define ASY_CONSOLE 0x00000080 /* definitions for async_inflow_source field in struct asyncline */ #define IN_FLOW_NULL 0x00000000 #define IN_FLOW_STREAMS 0x00000002 #define IN_FLOW_USER 0x00000004 #define XENCONS_BURST 128 /* burst size for console writes */ #ifdef __cplusplus } #endif #endif /* _SYS_XENCONS_H */