xref: /OK3568_Linux_fs/kernel/include/linux/n_r3964.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* r3964 linediscipline for linux
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * -----------------------------------------------------------
4*4882a593Smuzhiyun  * Copyright by
5*4882a593Smuzhiyun  * Philips Automation Projects
6*4882a593Smuzhiyun  * Kassel (Germany)
7*4882a593Smuzhiyun  * -----------------------------------------------------------
8*4882a593Smuzhiyun  * This software may be used and distributed according to the terms of
9*4882a593Smuzhiyun  * the GNU General Public License, incorporated herein by reference.
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * Author:
12*4882a593Smuzhiyun  * L. Haag
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * $Log: r3964.h,v $
15*4882a593Smuzhiyun  * Revision 1.4  2005/12/21 19:54:24  Kurt Huwig <kurt huwig de>
16*4882a593Smuzhiyun  * Fixed HZ usage on 2.6 kernels
17*4882a593Smuzhiyun  * Removed unnecessary include
18*4882a593Smuzhiyun  *
19*4882a593Smuzhiyun  * Revision 1.3  2001/03/18 13:02:24  dwmw2
20*4882a593Smuzhiyun  * Fix timer usage, use spinlocks properly.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  * Revision 1.2  2001/03/18 12:53:15  dwmw2
23*4882a593Smuzhiyun  * Merge changes in 2.4.2
24*4882a593Smuzhiyun  *
25*4882a593Smuzhiyun  * Revision 1.1.1.1  1998/10/13 16:43:14  dwmw2
26*4882a593Smuzhiyun  * This'll screw the version control
27*4882a593Smuzhiyun  *
28*4882a593Smuzhiyun  * Revision 1.6  1998/09/30 00:40:38  dwmw2
29*4882a593Smuzhiyun  * Updated to use kernel's N_R3964 if available
30*4882a593Smuzhiyun  *
31*4882a593Smuzhiyun  * Revision 1.4  1998/04/02 20:29:44  lhaag
32*4882a593Smuzhiyun  * select, blocking, ...
33*4882a593Smuzhiyun  *
34*4882a593Smuzhiyun  * Revision 1.3  1998/02/12 18:58:43  root
35*4882a593Smuzhiyun  * fixed some memory leaks
36*4882a593Smuzhiyun  * calculation of checksum characters
37*4882a593Smuzhiyun  *
38*4882a593Smuzhiyun  * Revision 1.2  1998/02/07 13:03:17  root
39*4882a593Smuzhiyun  * ioctl read_telegram
40*4882a593Smuzhiyun  *
41*4882a593Smuzhiyun  * Revision 1.1  1998/02/06 19:19:43  root
42*4882a593Smuzhiyun  * Initial revision
43*4882a593Smuzhiyun  *
44*4882a593Smuzhiyun  *
45*4882a593Smuzhiyun  */
46*4882a593Smuzhiyun #ifndef __LINUX_N_R3964_H__
47*4882a593Smuzhiyun #define __LINUX_N_R3964_H__
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #include <linux/param.h>
51*4882a593Smuzhiyun #include <uapi/linux/n_r3964.h>
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /*
54*4882a593Smuzhiyun  * Common ascii handshake characters:
55*4882a593Smuzhiyun  */
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #define STX 0x02
58*4882a593Smuzhiyun #define ETX 0x03
59*4882a593Smuzhiyun #define DLE 0x10
60*4882a593Smuzhiyun #define NAK 0x15
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /*
63*4882a593Smuzhiyun  * Timeouts (from milliseconds to jiffies)
64*4882a593Smuzhiyun  */
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define R3964_TO_QVZ ((550)*HZ/1000)
67*4882a593Smuzhiyun #define R3964_TO_ZVZ ((220)*HZ/1000)
68*4882a593Smuzhiyun #define R3964_TO_NO_BUF ((400)*HZ/1000)
69*4882a593Smuzhiyun #define R3964_NO_TX_ROOM ((100)*HZ/1000)
70*4882a593Smuzhiyun #define R3964_TO_RX_PANIC ((4000)*HZ/1000)
71*4882a593Smuzhiyun #define R3964_MAX_RETRIES 5
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun enum { R3964_IDLE,
75*4882a593Smuzhiyun 	   R3964_TX_REQUEST, R3964_TRANSMITTING,
76*4882a593Smuzhiyun 	   R3964_WAIT_ZVZ_BEFORE_TX_RETRY, R3964_WAIT_FOR_TX_ACK,
77*4882a593Smuzhiyun 	   R3964_WAIT_FOR_RX_BUF,
78*4882a593Smuzhiyun 	   R3964_RECEIVING, R3964_WAIT_FOR_BCC, R3964_WAIT_FOR_RX_REPEAT
79*4882a593Smuzhiyun 	   };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun /*
82*4882a593Smuzhiyun  * All open file-handles are 'clients' and are stored in a linked list:
83*4882a593Smuzhiyun  */
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun struct r3964_message;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun struct r3964_client_info {
88*4882a593Smuzhiyun 	spinlock_t     lock;
89*4882a593Smuzhiyun 	struct pid    *pid;
90*4882a593Smuzhiyun 	unsigned int   sig_flags;
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 	struct r3964_client_info *next;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	struct r3964_message *first_msg;
95*4882a593Smuzhiyun 	struct r3964_message *last_msg;
96*4882a593Smuzhiyun 	struct r3964_block_header *next_block_to_read;
97*4882a593Smuzhiyun 	int            msg_count;
98*4882a593Smuzhiyun };
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct r3964_block_header;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /* internal version of client_message: */
105*4882a593Smuzhiyun struct r3964_message {
106*4882a593Smuzhiyun 	  int     msg_id;
107*4882a593Smuzhiyun 	  int     arg;
108*4882a593Smuzhiyun 	  int     error_code;
109*4882a593Smuzhiyun 	  struct r3964_block_header *block;
110*4882a593Smuzhiyun 	  struct r3964_message *next;
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun /*
114*4882a593Smuzhiyun  * Header of received block in rx_buf/tx_buf:
115*4882a593Smuzhiyun  */
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun struct r3964_block_header
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun 	unsigned int length;             /* length in chars without header */
120*4882a593Smuzhiyun 	unsigned char *data;             /* usually data is located
121*4882a593Smuzhiyun                                         immediately behind this struct */
122*4882a593Smuzhiyun 	unsigned int locks;              /* only used in rx_buffer */
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun     struct r3964_block_header *next;
125*4882a593Smuzhiyun 	struct r3964_client_info *owner;  /* =NULL in rx_buffer */
126*4882a593Smuzhiyun };
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun /*
129*4882a593Smuzhiyun  * If rx_buf hasn't enough space to store R3964_MTU chars,
130*4882a593Smuzhiyun  * we will reject all incoming STX-requests by sending NAK.
131*4882a593Smuzhiyun  */
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun #define RX_BUF_SIZE    4000
134*4882a593Smuzhiyun #define TX_BUF_SIZE    4000
135*4882a593Smuzhiyun #define R3964_MAX_BLOCKS_IN_RX_QUEUE 100
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun #define R3964_PARITY 0x0001
138*4882a593Smuzhiyun #define R3964_FRAME  0x0002
139*4882a593Smuzhiyun #define R3964_OVERRUN 0x0004
140*4882a593Smuzhiyun #define R3964_UNKNOWN 0x0008
141*4882a593Smuzhiyun #define R3964_BREAK   0x0010
142*4882a593Smuzhiyun #define R3964_CHECKSUM 0x0020
143*4882a593Smuzhiyun #define R3964_ERROR  0x003f
144*4882a593Smuzhiyun #define R3964_BCC   0x4000
145*4882a593Smuzhiyun #define R3964_DEBUG 0x8000
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun struct r3964_info {
149*4882a593Smuzhiyun 	spinlock_t     lock;
150*4882a593Smuzhiyun 	struct tty_struct *tty;
151*4882a593Smuzhiyun 	unsigned char priority;
152*4882a593Smuzhiyun 	unsigned char *rx_buf;            /* ring buffer */
153*4882a593Smuzhiyun 	unsigned char *tx_buf;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	struct r3964_block_header *rx_first;
156*4882a593Smuzhiyun 	struct r3964_block_header *rx_last;
157*4882a593Smuzhiyun 	struct r3964_block_header *tx_first;
158*4882a593Smuzhiyun 	struct r3964_block_header *tx_last;
159*4882a593Smuzhiyun 	unsigned int tx_position;
160*4882a593Smuzhiyun         unsigned int rx_position;
161*4882a593Smuzhiyun 	unsigned char last_rx;
162*4882a593Smuzhiyun 	unsigned char bcc;
163*4882a593Smuzhiyun         unsigned int  blocks_in_rx_queue;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	struct mutex read_lock;		/* serialize r3964_read */
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	struct r3964_client_info *firstClient;
168*4882a593Smuzhiyun 	unsigned int state;
169*4882a593Smuzhiyun 	unsigned int flags;
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	struct timer_list tmr;
172*4882a593Smuzhiyun 	int nRetry;
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun #endif
176