summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/ser_sync.h
blob: 1c82f0db0791363b5a6c073d7593fceac9f2c8a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (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) 1991,1997-1998 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef	_SYS_SER_SYNC_H
#define	_SYS_SER_SYNC_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

/*
 * Initial port setup parameters for sync lines
 */

#include <sys/stream.h>
#include <sys/time_impl.h>
#include <sys/ioccom.h>

#ifdef	__cplusplus
extern "C" {
#endif

#define	zIOC	('z' << 8)

#define	S_IOCGETMODE	(zIOC|01)	/* return struct scc_mode */
#define	S_IOCSETMODE	(zIOC|02)	/* set SCC from struct scc_mode */
#define	S_IOCGETSTATS	(zIOC|03)	/* return sync data stats */
#define	S_IOCCLRSTATS	(zIOC|04)	/* clear sync stats */
#define	S_IOCGETSPEED	(zIOC|05)	/* return int baudrate */
#define	S_IOCGETMRU	(zIOC|06)	/* return int max receive unit */
#define	S_IOCSETMRU	(zIOC|07)	/* set max receive unit */
#define	S_IOCGETMTU	(zIOC|010)	/* return int max transmission unit */
#define	S_IOCSETMTU	(zIOC|011)	/* set max transmission unit */
#define	S_IOCGETMCTL	(zIOC|012)	/* return current CD/CTS state */
#define	S_IOCSETDTR	(zIOC|013)	/* Drive DTR signal */

/* reason codes for IOCSETMODE */
#define	SMERR_TXC	0x0001		/* transmit clock source not valid */
#define	SMERR_RXC	0x0002		/* receive clock source not valid */
#define	SMERR_IFLAGS	0x0004		/* inversion flags not valid */
#define	SMERR_HDX	0x0008		/* CONN_HDX set without CONN_IBM */
#define	SMERR_MPT	0x0010		/* CONN_MPT set without CONN_IBM */
#define	SMERR_LPBKS	0x0020		/* invalid loopback/echo combination */
#define	SMERR_BAUDRATE	0x0040		/* baudrate translates to 0 timeconst */
#define	SMERR_PLL	0x0080		/* PLL set with BRG or w/o NRZI */

/*
 * Definitions for modes of operations of
 * synchronous lines, both RS-232 and RS-449
 */
struct scc_mode {
	char	sm_txclock;	/* enum - transmit clock sources */
	char	sm_rxclock;	/* enum - receive clock sources */
	char    sm_iflags;	/* data and clock invert flags: see hsparam.h */
	uchar_t	sm_config;	/* see CONN defines below */
	int	sm_baudrate;
	int	sm_retval;	/* SMERR codes go here, query with GETMODE */
};

/*
 * defines for txclock
 */
#define	TXC_IS_TXC	0	/* use incoming transmit clock */
#define	TXC_IS_RXC	1	/* use incoming receive clock */
#define	TXC_IS_BAUD	2	/* use baud rate generator */
#define	TXC_IS_PLL	3	/* use phase-lock loop output */

/*
 * defines for rxclock
 */
#define	RXC_IS_RXC	0	/* use incoming receive clock */
#define	RXC_IS_TXC	1	/* use incoming transmit clock */
#define	RXC_IS_BAUD	2	/* use baud rate - only good for loopback */
#define	RXC_IS_PLL	3	/* use phase-lock loop */

/*
 * defines for clock/data inversion: from hsparam.h
 */
#define	TXC_IS_SYSCLK	4
#define	RXC_IS_SYSCLK	4
#define	TXC_IS_INVERT	5
#define	RXC_IS_INVERT	5
#define	TRXD_NO_INVERT	0
#define	RXD_IS_INVERT	1
#define	TXD_IS_INVERT	2
#define	TRXD_IS_INVERT	3

/*
 * defines for config
 */
#define	CONN_HDX    0x01    /* half-duplex if set, else full-duplex */
#define	CONN_MPT    0x02    /* multipoint if set, else point-point */
#define	CONN_IBM    0x04    /* set up in IBM-SDLC mode */
#define	CONN_SIGNAL 0x08    /* report modem signal changes asynchronously */
#define	CONN_NRZI   0x10    /* boolean - use NRZI */
#define	CONN_LPBK   0x20    /* do internal loopback */
#define	CONN_ECHO   0x40    /* place in auto echo mode */

struct sl_status {
	int		type;
	int		status;
	timestruc_t	tstamp;
};

#if defined(_SYSCALL32)

struct sl_status32 {
	int32_t		type;
	int32_t		status;
	timestruc32_t	tstamp;
};

#endif	/* _SYSCALL32 */

/*
 * defines for type field in sl_status
 */
#define	SLS_MDMSTAT	0x01	/* Non-IBM modem line status change */
#define	SLS_LINKERR	0x02	/* IBM mode Link Error, usually modem line. */

/*
 * defines for status field in sl_status
 * DO NOT change the values for CS_(DCD|CTS)_(UP|DOWN)!!!
 */
#define	CS_DCD_DOWN   	0x08
#define	CS_DCD_UP   	0x0c
#define	CS_DCD_DROP   	0x10
#define	CS_CTS_DOWN	0x20
#define	CS_CTS_UP	0x30
#define	CS_CTS_DROP   	0x40
#define	CS_CTS_TO   	0x80
#define	CS_DCD		CS_DCD_DOWN
#define	CS_CTS		CS_CTS_DOWN

/*
 * Event statistics reported by hardware.
 */
struct sl_stats {
	int	ipack;		/* input packets */
	int	opack;		/* output packets */
	int	ichar;		/* input bytes */
	int	ochar;		/* output bytes */
	int	abort;		/* abort received */
	int	crc;		/* CRC error */
	int	cts;		/* CTS timeouts */
	int	dcd;		/* Carrier drops */
	int	overrun;	/* receiver overrun */
	int	underrun;	/* xmitter underrun */
	int	ierror;		/* input error (rxbad) */
	int	oerror;		/* output error (watchdog timeout) */
	int	nobuffers;	/* no active receive block available */
};



/*
 * Per-stream structure.  Each of these points to only one device instance,
 * but there may be more than one doing so.  If marked as ST_CLONE, it has
 * been opened throught the clone device, and cannot have the data path.
 */
struct ser_str {
	queue_t		*str_rq;	/* This stream's read queue */
	caddr_t		str_com;	/* Back pointer to device struct */
	int		str_inst;	/* Device instance (unit) number */
	int		str_state;	/* see below */
};

/*
 * Synchronous Protocol Private Data Structure
 */
#define	ZSH_MAX_RSTANDBY	6
#define	ZSH_RDONE_MAX		20
struct syncline {
	struct ser_str	sl_stream;	/* data path device points thru here */
	struct scc_mode	sl_mode;	/* clock, etc. modes */
	struct sl_stats	sl_st;		/* Data and error statistics */
	mblk_t		*sl_rhead;	/* receive: head of active message */
	mblk_t		*sl_ractb;	/* receive: active message block */
	mblk_t		*sl_rstandby[ZSH_MAX_RSTANDBY];
					/* receive: standby message blocks */
	mblk_t		*sl_xhead;	/* transmit: head of active message */
	mblk_t		*sl_xactb;	/* transmit: active message block */
	mblk_t		*sl_xstandby;	/* transmit: next available message */
	mblk_t		*sl_rdone[ZSH_RDONE_MAX];
					/* complete messages to be sent up */
	int		sl_rdone_wptr;
	int		sl_rdone_rptr;
	mblk_t		*sl_mstat;	/* most recent modem status change */
	bufcall_id_t	sl_bufcid;	/* pending bufcall ID */
	timeout_id_t	sl_wd_id;	/* watchdog timeout ID */
	int		sl_wd_count;	/* watchdog counter */
	int		sl_ocnt;	/* output message size */
	int		sl_mru;		/* Maximum Receive Unit */
	int		sl_bad_count_int;
	uchar_t		sl_rr0;		/* saved RR0 */
	uchar_t		sl_address;	/* station address */
	uchar_t		sl_txstate;	/* transmit state */
	uchar_t		sl_flags;	/* see below */
	uchar_t		sl_m_error;
	volatile uchar_t sl_soft_active; /*  */
};

/*
 * Bit definitions for sl_txstate.
 */
#define	TX_OFF		0x0		/* Not available */
#define	TX_IDLE		0x1		/* Initialized */
#define	TX_RTS		0x2		/* IBM: RTS up, okay to transmit */
#define	TX_ACTIVE	0x4		/* Transmission in progress */
#define	TX_CRC		0x8		/* Sent all Data */
#define	TX_FLAG		0x10		/* Sent CRC bytes */
#define	TX_LAST		0x20		/* End-Of-Frame, OK to start new msg */
#define	TX_ABORTED	0x40		/* Transmit was aborted */

/*
 * Bit definitions for sl_flags.
 */
#define	SF_FDXPTP	0x1	/* Full duplex AND Point-To-Point */
#define	SF_XMT_INPROG	0x2	/* Write queue is not empty */
#define	SF_LINKERR	0x4	/* Underrun or CTS/DCD drop */
#define	SF_FLUSH_WQ	0x8	/*  */
#define	SF_INITIALIZED	0x10	/* This channel programmed for this protocol */
#define	SF_PHONY	0x20	/* Dummy frame has been sent to close frame */
#define	SF_ZSH_START	0x40	/*  */
/*
 * Bit definitions for str_state.
 */
#define	STR_CLONE	1	/* This was opened thru clone device */

extern int hz;
#define	SIO_WATCHDOG_TICK	(2 * hz)	/* Two second timeout */
#define	SIO_WATCHDOG_ON		(zss->sl_wd_id > 0)	/* Is it on? */


#ifdef	__cplusplus
}
#endif

#endif	/* !_SYS_SER_SYNC_H */