| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* r3964 linediscipline for linux | 
|  | 2 | * | 
|  | 3 | * ----------------------------------------------------------- | 
|  | 4 | * Copyright by | 
|  | 5 | * Philips Automation Projects | 
|  | 6 | * Kassel (Germany) | 
|  | 7 | * http://www.pap-philips.de | 
|  | 8 | * ----------------------------------------------------------- | 
|  | 9 | * This software may be used and distributed according to the terms of | 
|  | 10 | * the GNU General Public License, incorporated herein by reference. | 
|  | 11 | * | 
|  | 12 | * Author: | 
|  | 13 | * L. Haag | 
|  | 14 | * | 
|  | 15 | * $Log: r3964.h,v $ | 
|  | 16 | * Revision 1.3  2001/03/18 13:02:24  dwmw2 | 
|  | 17 | * Fix timer usage, use spinlocks properly. | 
|  | 18 | * | 
|  | 19 | * Revision 1.2  2001/03/18 12:53:15  dwmw2 | 
|  | 20 | * Merge changes in 2.4.2 | 
|  | 21 | * | 
|  | 22 | * Revision 1.1.1.1  1998/10/13 16:43:14  dwmw2 | 
|  | 23 | * This'll screw the version control | 
|  | 24 | * | 
|  | 25 | * Revision 1.6  1998/09/30 00:40:38  dwmw2 | 
|  | 26 | * Updated to use kernel's N_R3964 if available | 
|  | 27 | * | 
|  | 28 | * Revision 1.4  1998/04/02 20:29:44  lhaag | 
|  | 29 | * select, blocking, ... | 
|  | 30 | * | 
|  | 31 | * Revision 1.3  1998/02/12 18:58:43  root | 
|  | 32 | * fixed some memory leaks | 
|  | 33 | * calculation of checksum characters | 
|  | 34 | * | 
|  | 35 | * Revision 1.2  1998/02/07 13:03:17  root | 
|  | 36 | * ioctl read_telegram | 
|  | 37 | * | 
|  | 38 | * Revision 1.1  1998/02/06 19:19:43  root | 
|  | 39 | * Initial revision | 
|  | 40 | * | 
|  | 41 | * | 
|  | 42 | */ | 
|  | 43 |  | 
|  | 44 | #ifndef __LINUX_N_R3964_H__ | 
|  | 45 | #define __LINUX_N_R3964_H__ | 
|  | 46 |  | 
|  | 47 | /* line disciplines for r3964 protocol */ | 
|  | 48 | #include <asm/termios.h> | 
|  | 49 |  | 
|  | 50 | #ifdef __KERNEL__ | 
|  | 51 | /* | 
|  | 52 | * Common ascii handshake characters: | 
|  | 53 | */ | 
|  | 54 |  | 
|  | 55 | #define STX 0x02 | 
|  | 56 | #define ETX 0x03 | 
|  | 57 | #define DLE 0x10 | 
|  | 58 | #define NAK 0x15 | 
|  | 59 |  | 
|  | 60 | /* | 
|  | 61 | * Timeouts (msecs/10 msecs per timer interrupt): | 
|  | 62 | */ | 
|  | 63 |  | 
|  | 64 | #define R3964_TO_QVZ 550/10 | 
|  | 65 | #define R3964_TO_ZVZ 220/10 | 
|  | 66 | #define R3964_TO_NO_BUF 400/10 | 
|  | 67 | #define R3964_NO_TX_ROOM 100/10 | 
|  | 68 | #define R3964_TO_RX_PANIC 4000/10 | 
|  | 69 | #define R3964_MAX_RETRIES 5 | 
|  | 70 |  | 
|  | 71 | #endif | 
|  | 72 |  | 
|  | 73 | /* | 
|  | 74 | * Ioctl-commands | 
|  | 75 | */ | 
|  | 76 |  | 
|  | 77 | #define R3964_ENABLE_SIGNALS      0x5301 | 
|  | 78 | #define R3964_SETPRIORITY         0x5302 | 
|  | 79 | #define R3964_USE_BCC             0x5303 | 
|  | 80 | #define R3964_READ_TELEGRAM       0x5304 | 
|  | 81 |  | 
|  | 82 | /* Options for R3964_SETPRIORITY */ | 
|  | 83 | #define R3964_MASTER   0 | 
|  | 84 | #define R3964_SLAVE    1 | 
|  | 85 |  | 
|  | 86 | /* Options for R3964_ENABLE_SIGNALS */ | 
|  | 87 | #define R3964_SIG_ACK   0x0001 | 
|  | 88 | #define R3964_SIG_DATA  0x0002 | 
|  | 89 | #define R3964_SIG_ALL   0x000f | 
|  | 90 | #define R3964_SIG_NONE  0x0000 | 
|  | 91 | #define R3964_USE_SIGIO 0x1000 | 
|  | 92 |  | 
|  | 93 | /* | 
|  | 94 | * r3964 operation states: | 
|  | 95 | */ | 
|  | 96 | #ifdef __KERNEL__ | 
|  | 97 |  | 
|  | 98 | enum { R3964_IDLE, | 
|  | 99 | R3964_TX_REQUEST, R3964_TRANSMITTING, | 
|  | 100 | R3964_WAIT_ZVZ_BEFORE_TX_RETRY, R3964_WAIT_FOR_TX_ACK, | 
|  | 101 | R3964_WAIT_FOR_RX_BUF, | 
|  | 102 | R3964_RECEIVING, R3964_WAIT_FOR_BCC, R3964_WAIT_FOR_RX_REPEAT | 
|  | 103 | }; | 
|  | 104 |  | 
|  | 105 | /* | 
|  | 106 | * All open file-handles are 'clients' and are stored in a linked list: | 
|  | 107 | */ | 
|  | 108 |  | 
|  | 109 | struct r3964_message; | 
|  | 110 |  | 
|  | 111 | struct r3964_client_info { | 
|  | 112 | spinlock_t     lock; | 
|  | 113 | pid_t          pid; | 
|  | 114 | unsigned int   sig_flags; | 
|  | 115 |  | 
|  | 116 | struct r3964_client_info *next; | 
|  | 117 |  | 
|  | 118 | struct r3964_message *first_msg; | 
|  | 119 | struct r3964_message *last_msg; | 
|  | 120 | struct r3964_block_header *next_block_to_read; | 
|  | 121 | int            msg_count; | 
|  | 122 | }; | 
|  | 123 |  | 
|  | 124 |  | 
|  | 125 | #endif | 
|  | 126 |  | 
|  | 127 | /* types for msg_id: */ | 
|  | 128 | enum {R3964_MSG_ACK=1, R3964_MSG_DATA }; | 
|  | 129 |  | 
|  | 130 | #define R3964_MAX_MSG_COUNT 32 | 
|  | 131 |  | 
|  | 132 | /* error codes for client messages */ | 
|  | 133 | #define R3964_OK 0        /* no error. */ | 
|  | 134 | #define R3964_TX_FAIL -1  /* transmission error, block NOT sent */ | 
|  | 135 | #define R3964_OVERFLOW -2 /* msg queue overflow */ | 
|  | 136 |  | 
|  | 137 | /* the client gets this struct when calling read(fd,...): */ | 
|  | 138 | struct r3964_client_message { | 
|  | 139 | int     msg_id; | 
|  | 140 | int     arg; | 
|  | 141 | int     error_code; | 
|  | 142 | }; | 
|  | 143 |  | 
|  | 144 | #define R3964_MTU      256 | 
|  | 145 |  | 
|  | 146 |  | 
|  | 147 | #ifdef __KERNEL__ | 
|  | 148 |  | 
|  | 149 | struct r3964_block_header; | 
|  | 150 |  | 
|  | 151 | /* internal version of client_message: */ | 
|  | 152 | struct r3964_message { | 
|  | 153 | int     msg_id; | 
|  | 154 | int     arg; | 
|  | 155 | int     error_code; | 
|  | 156 | struct r3964_block_header *block; | 
|  | 157 | struct r3964_message *next; | 
|  | 158 | }; | 
|  | 159 |  | 
|  | 160 | /* | 
|  | 161 | * Header of received block in rx_buf/tx_buf: | 
|  | 162 | */ | 
|  | 163 |  | 
|  | 164 | struct r3964_block_header | 
|  | 165 | { | 
|  | 166 | unsigned int length;             /* length in chars without header */ | 
|  | 167 | unsigned char *data;             /* usually data is located | 
|  | 168 | immediately behind this struct */ | 
|  | 169 | unsigned int locks;              /* only used in rx_buffer */ | 
|  | 170 |  | 
|  | 171 | struct r3964_block_header *next; | 
|  | 172 | struct r3964_client_info *owner;  /* =NULL in rx_buffer */ | 
|  | 173 | }; | 
|  | 174 |  | 
|  | 175 | /* | 
|  | 176 | * If rx_buf hasn't enough space to store R3964_MTU chars, | 
|  | 177 | * we will reject all incoming STX-requests by sending NAK. | 
|  | 178 | */ | 
|  | 179 |  | 
|  | 180 | #define RX_BUF_SIZE    4000 | 
|  | 181 | #define TX_BUF_SIZE    4000 | 
|  | 182 | #define R3964_MAX_BLOCKS_IN_RX_QUEUE 100 | 
|  | 183 |  | 
|  | 184 | #define R3964_PARITY 0x0001 | 
|  | 185 | #define R3964_FRAME  0x0002 | 
|  | 186 | #define R3964_OVERRUN 0x0004 | 
|  | 187 | #define R3964_UNKNOWN 0x0008 | 
|  | 188 | #define R3964_BREAK   0x0010 | 
|  | 189 | #define R3964_CHECKSUM 0x0020 | 
|  | 190 | #define R3964_ERROR  0x003f | 
|  | 191 | #define R3964_BCC   0x4000 | 
|  | 192 | #define R3964_DEBUG 0x8000 | 
|  | 193 |  | 
|  | 194 |  | 
|  | 195 | struct r3964_info { | 
|  | 196 | spinlock_t     lock; | 
|  | 197 | struct tty_struct *tty; | 
|  | 198 | unsigned char priority; | 
|  | 199 | unsigned char *rx_buf;            /* ring buffer */ | 
|  | 200 | unsigned char *tx_buf; | 
|  | 201 |  | 
|  | 202 | wait_queue_head_t read_wait; | 
|  | 203 | //struct wait_queue *read_wait; | 
|  | 204 |  | 
|  | 205 | struct r3964_block_header *rx_first; | 
|  | 206 | struct r3964_block_header *rx_last; | 
|  | 207 | struct r3964_block_header *tx_first; | 
|  | 208 | struct r3964_block_header *tx_last; | 
|  | 209 | unsigned int tx_position; | 
|  | 210 | unsigned int rx_position; | 
|  | 211 | unsigned char last_rx; | 
|  | 212 | unsigned char bcc; | 
|  | 213 | unsigned int  blocks_in_rx_queue; | 
|  | 214 |  | 
|  | 215 |  | 
|  | 216 | struct r3964_client_info *firstClient; | 
|  | 217 | unsigned int state; | 
|  | 218 | unsigned int flags; | 
|  | 219 |  | 
|  | 220 | struct timer_list tmr; | 
|  | 221 | int nRetry; | 
|  | 222 | }; | 
|  | 223 |  | 
|  | 224 | #endif | 
|  | 225 |  | 
|  | 226 | #endif |