1/*- 2 * Ioctl interface to Cronyx serial drivers. 3 * 4 * Copyright (C) 1997-2002 Cronyx Engineering. 5 * Author: Serge Vakulenko, <vak@cronyx.ru> 6 * 7 * Copyright (C) 2001-2005 Cronyx Engineering. 8 * Author: Roman Kurakin, <rik@FreeBSD.org> 9 * 10 * Copyright (C) 2004-2005 Cronyx Engineering. 11 * Author: Leo Yuriev, <ly@cronyx.ru> 12 * 13 * This software is distributed with NO WARRANTIES, not even the implied 14 * warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 15 * 16 * Authors grant any other persons or organisations permission to use 17 * or modify this software as long as this message is kept with the software, 18 * all derivative works or modified versions. 19 * 20 * Cronyx Id: cserial.h,v 1.4.2.2 2005/11/09 13:01:35 rik Exp $ 21 * $FreeBSD$ 22 */ 23 24/* 25 * General channel statistics. 26 */ 27struct serial_statistics { 28 unsigned long rintr; /* receive interrupts */ 29 unsigned long tintr; /* transmit interrupts */ 30 unsigned long mintr; /* modem interrupts */ 31 unsigned long ibytes; /* input bytes */ 32 unsigned long ipkts; /* input packets */ 33 unsigned long ierrs; /* input errors */ 34 unsigned long obytes; /* output bytes */ 35 unsigned long opkts; /* output packets */ 36 unsigned long oerrs; /* output errors */ 37}; 38 39/* 40 * Statistics for E1/G703 channels. 41 */ 42struct e1_counters { 43 unsigned long bpv; /* bipolar violations */ 44 unsigned long fse; /* frame sync errors */ 45 unsigned long crce; /* CRC errors */ 46 unsigned long rcrce; /* remote CRC errors (E-bit) */ 47 unsigned long uas; /* unavailable seconds */ 48 unsigned long les; /* line errored seconds */ 49 unsigned long es; /* errored seconds */ 50 unsigned long bes; /* bursty errored seconds */ 51 unsigned long ses; /* severely errored seconds */ 52 unsigned long oofs; /* out of frame seconds */ 53 unsigned long css; /* controlled slip seconds */ 54 unsigned long dm; /* degraded minutes */ 55}; 56 57struct e1_statistics { 58 unsigned long status; /* line status bit mask */ 59 unsigned long cursec; /* seconds in current interval */ 60 unsigned long totsec; /* total seconds elapsed */ 61 struct e1_counters currnt; /* current 15-min interval data */ 62 struct e1_counters total; /* total statistics data */ 63 struct e1_counters interval [48]; /* 12 hour period data */ 64}; 65 66struct e3_statistics { 67 unsigned long status; 68 unsigned long cursec; 69 unsigned long totsec; 70 unsigned long ccv; 71 unsigned long tcv; 72 unsigned long icv[48]; 73}; 74 75#define M_ASYNC 0 /* asynchronous mode */ 76#define M_HDLC 1 /* bit-sync mode (HDLC) */ 77#define M_G703 2 78#define M_E1 3 79 80/* 81 * Receive error codes. 82 */ 83#define ER_FRAMING 1 /* framing error */ 84#define ER_CHECKSUM 2 /* parity/CRC error */ 85#define ER_BREAK 3 /* break state */ 86#define ER_OVERFLOW 4 /* receive buffer overflow */ 87#define ER_OVERRUN 5 /* receive fifo overrun */ 88#define ER_UNDERRUN 6 /* transmit fifo underrun */ 89#define ER_SCC_FRAMING 7 /* subchannel framing error */ 90#define ER_SCC_OVERFLOW 8 /* subchannel receive buffer overflow */ 91#define ER_SCC_OVERRUN 9 /* subchannel receiver overrun */ 92#define ER_SCC_UNDERRUN 10 /* subchannel transmiter underrun */ 93#define ER_BUS 11 /* system bus is too busy (e.g PCI) */ 94 95/* 96 * E1 channel status. 97 */ 98#define E1_NOALARM 0x0001 /* no alarm present */ 99#define E1_FARLOF 0x0002 /* receiving far loss of framing */ 100#define E1_CRC4E 0x0004 /* crc4 errors */ 101#define E1_AIS 0x0008 /* receiving all ones */ 102#define E1_LOF 0x0020 /* loss of framing */ 103#define E1_LOS 0x0040 /* loss of signal */ 104#define E1_AIS16 0x0100 /* receiving all ones in timeslot 16 */ 105#define E1_FARLOMF 0x0200 /* receiving alarm in timeslot 16 */ 106#define E1_LOMF 0x0400 /* loss of multiframe sync */ 107#define E1_TSTREQ 0x0800 /* test code detected */ 108#define E1_TSTERR 0x1000 /* test error */ 109 110#define E3_LOS 0x00000002 /* Lost of synchronization */ 111#define E3_TXE 0x00000004 /* Transmit error */ 112 113/* 114 * Query the mask of all registered channels, max 128. 115 */ 116#define SERIAL_GETREGISTERED _IOR ('x', 0, char[16]) 117 118/* 119 * Attach/detach the protocol to the channel. 120 * The protocol is given by it's name, char[8]. 121 * For example "async", "hdlc", "cisco", "fr", "ppp". 122 */ 123#define SERIAL_GETPROTO _IOR ('x', 1, char [8]) 124#define SERIAL_SETPROTO _IOW ('x', 1, char [8]) 125 126/* 127 * Query/set the hardware mode for the channel. 128 */ 129#define SERIAL_GETMODE _IOR ('x', 2, int) 130#define SERIAL_SETMODE _IOW ('x', 2, int) 131 132#define SERIAL_ASYNC 1 133#define SERIAL_HDLC 2 134#define SERIAL_RAW 3 135 136/* 137 * Get/clear the channel statistics. 138 */ 139#define SERIAL_GETSTAT _IOR ('x', 3, struct serial_statistics) 140#define SERIAL_GETESTAT _IOR ('x', 3, struct e1_statistics) 141#define SERIAL_GETE3STAT _IOR ('x', 3, struct e3_statistics) 142#define SERIAL_CLRSTAT _IO ('x', 3) 143 144/* 145 * Query/set the synchronization mode and baud rate. 146 * If baud==0 then the external clock is used. 147 */ 148#define SERIAL_GETBAUD _IOR ('x', 4, long) 149#define SERIAL_SETBAUD _IOW ('x', 4, long) 150 151/* 152 * Query/set the internal loopback mode, 153 * useful for debugging purposes. 154 */ 155#define SERIAL_GETLOOP _IOR ('x', 5, int) 156#define SERIAL_SETLOOP _IOW ('x', 5, int) 157 158/* 159 * Query/set the DPLL mode, commonly used with NRZI 160 * for channels lacking synchro signals. 161 */ 162#define SERIAL_GETDPLL _IOR ('x', 6, int) 163#define SERIAL_SETDPLL _IOW ('x', 6, int) 164 165/* 166 * Query/set the NRZI encoding (default is NRZ). 167 */ 168#define SERIAL_GETNRZI _IOR ('x', 7, int) 169#define SERIAL_SETNRZI _IOW ('x', 7, int) 170 171/* 172 * Invert receive and transmit clock. 173 */ 174#define SERIAL_GETINVCLK _IOR ('x', 8, int) 175#define SERIAL_SETINVCLK _IOW ('x', 8, int) 176 177/* 178 * Query/set the E1/G703 synchronization mode. 179 */ 180#define SERIAL_GETCLK _IOR ('x', 9, int) 181#define SERIAL_SETCLK _IOW ('x', 9, int) 182 183#define E1CLK_RECOVERY -1 184#define E1CLK_INTERNAL 0 185#define E1CLK_RECEIVE 1 186#define E1CLK_RECEIVE_CHAN0 2 187#define E1CLK_RECEIVE_CHAN1 3 188#define E1CLK_RECEIVE_CHAN2 4 189#define E1CLK_RECEIVE_CHAN3 5 190 191/* 192 * Query/set the E1 timeslot mask. 193 */ 194#define SERIAL_GETTIMESLOTS _IOR ('x', 10, long) 195#define SERIAL_SETTIMESLOTS _IOW ('x', 10, long) 196 197/* 198 * Query/set the E1 subchannel timeslot mask. 199 */ 200#define SERIAL_GETSUBCHAN _IOR ('x', 11, long) 201#define SERIAL_SETSUBCHAN _IOW ('x', 11, long) 202 203/* 204 * Query/set the high input sensitivity mode (E1). 205 */ 206#define SERIAL_GETHIGAIN _IOR ('x', 12, int) 207#define SERIAL_SETHIGAIN _IOW ('x', 12, int) 208 209/* 210 * Query the input signal level in santibells. 211 */ 212#define SERIAL_GETLEVEL _IOR ('x', 13, int) 213 214/* 215 * Get the channel name. 216 */ 217#define SERIAL_GETNAME _IOR ('x', 14, char [32]) 218 219/* 220 * Get version string. 221 */ 222#define SERIAL_GETVERSIONSTRING _IOR ('x', 15, char [256]) 223 224/* 225 * Query/set master channel. 226 */ 227#define SERIAL_GETMASTER _IOR ('x', 16, char [16]) 228#define SERIAL_SETMASTER _IOW ('x', 16, char [16]) 229 230/* 231 * Query/set keepalive. 232 */ 233#define SERIAL_GETKEEPALIVE _IOR ('x', 17, int) 234#define SERIAL_SETKEEPALIVE _IOW ('x', 17, int) 235 236/* 237 * Query/set E1 configuration. 238 */ 239#define SERIAL_GETCFG _IOR ('x', 18, char) 240#define SERIAL_SETCFG _IOW ('x', 18, char) 241 242/* 243 * Query/set debug. 244 */ 245#define SERIAL_GETDEBUG _IOR ('x', 19, int) 246#define SERIAL_SETDEBUG _IOW ('x', 19, int) 247 248/* 249 * Query/set phony mode (E1). 250 */ 251#define SERIAL_GETPHONY _IOR ('x', 20, int) 252#define SERIAL_SETPHONY _IOW ('x', 20, int) 253 254/* 255 * Query/set timeslot 16 usage mode (E1). 256 */ 257#define SERIAL_GETUSE16 _IOR ('x', 21, int) 258#define SERIAL_SETUSE16 _IOW ('x', 21, int) 259 260/* 261 * Query/set crc4 mode (E1). 262 */ 263#define SERIAL_GETCRC4 _IOR ('x', 22, int) 264#define SERIAL_SETCRC4 _IOW ('x', 22, int) 265 266/* 267 * Query/set the timeout to recover after transmit interrupt loss. 268 * If timo==0 recover will be disabled. 269 */ 270#define SERIAL_GETTIMO _IOR ('x', 23, long) 271#define SERIAL_SETTIMO _IOW ('x', 23, long) 272 273/* 274 * Query/set port type for old models of Sigma 275 * -1 Fixed or cable select 276 * 0 RS-232 277 * 1 V35 278 * 2 RS-449 279 * 3 E1 (only for Windows 2000) 280 * 4 G.703 (only for Windows 2000) 281 * 5 DATA (only for Windows 2000) 282 * 6 E3 (only for Windows 2000) 283 * 7 T3 (only for Windows 2000) 284 * 8 STS1 (only for Windows 2000) 285 */ 286#define SERIAL_GETPORT _IOR ('x', 25, int) 287#define SERIAL_SETPORT _IOW ('x', 25, int) 288 289/* 290 * Add the virtual channel DLCI (Frame Relay). 291 */ 292#define SERIAL_ADDDLCI _IOW ('x', 26, int) 293 294/* 295 * Invert receive clock. 296 */ 297#define SERIAL_GETINVRCLK _IOR ('x', 27, int) 298#define SERIAL_SETINVRCLK _IOW ('x', 27, int) 299 300/* 301 * Invert transmit clock. 302 */ 303#define SERIAL_GETINVTCLK _IOR ('x', 28, int) 304#define SERIAL_SETINVTCLK _IOW ('x', 28, int) 305 306/* 307 * Unframed E1 mode. 308 */ 309#define SERIAL_GETUNFRAM _IOR ('x', 29, int) 310#define SERIAL_SETUNFRAM _IOW ('x', 29, int) 311 312/* 313 * E1 monitoring mode. 314 */ 315#define SERIAL_GETMONITOR _IOR ('x', 30, int) 316#define SERIAL_SETMONITOR _IOW ('x', 30, int) 317 318/* 319 * Interrupt number. 320 */ 321#define SERIAL_GETIRQ _IOR ('x', 31, int) 322 323/* 324 * Reset. 325 */ 326#define SERIAL_RESET _IO ('x', 32) 327 328/* 329 * Hard reset. 330 */ 331#define SERIAL_HARDRESET _IO ('x', 33) 332 333/* 334 * Query cable type. 335 */ 336#define SERIAL_GETCABLE _IOR ('x', 34, int) 337 338/* 339 * Assignment of HDLC ports to E1 channels. 340 */ 341#define SERIAL_GETDIR _IOR ('x', 35, int) 342#define SERIAL_SETDIR _IOW ('x', 35, int) 343 344struct dxc_table { /* cross-connector parameters */ 345 unsigned char ts [32]; /* timeslot number */ 346 unsigned char link [32]; /* E1 link number */ 347}; 348 349/* 350 * DXC cross-connector settings for E1 channels. 351 */ 352#define SERIAL_GETDXC _IOR ('x', 36, struct dxc_table) 353#define SERIAL_SETDXC _IOW ('x', 36, struct dxc_table) 354 355/* 356 * Scrambler for G.703. 357 */ 358#define SERIAL_GETSCRAMBLER _IOR ('x', 37, int) 359#define SERIAL_SETSCRAMBLER _IOW ('x', 37, int) 360 361/* 362 * Length of cable for T3 and STS-1. 363 */ 364#define SERIAL_GETCABLEN _IOR ('x', 38, int) 365#define SERIAL_SETCABLEN _IOW ('x', 38, int) 366 367/* 368 * Remote loopback for E3, T3 and STS-1. 369 */ 370#define SERIAL_GETRLOOP _IOR ('x', 39, int) 371#define SERIAL_SETRLOOP _IOW ('x', 39, int) 372 373/* 374 * G.703 line code 375 */ 376#define SERIAL_GETLCODE _IOR ('x', 40, int) 377#define SERIAL_SETLCODE _IOW ('x', 40, int) 378 379/* 380 * MTU 381 */ 382#define SERIAL_GETMTU _IOR ('x', 41, int) 383#define SERIAL_SETMTU _IOW ('x', 41, int) 384 385/* 386 * Receive Queue Length 387 */ 388#define SERIAL_GETRQLEN _IOR ('x', 42, int) 389#define SERIAL_SETRQLEN _IOW ('x', 42, int) 390 391#ifdef __KERNEL__ 392#ifdef CRONYX_LYSAP 393# define LYSAP_PEER_ADD _IOWR('x', 101, lysap_peer_config_t) 394# define LYSAP_PEER_REMOVE _IOW('x', 102, unsigned) 395# define LYSAP_PEER_INFO _IOWR('x', 103, lysap_peer_info_t) 396# define LYSAP_PEER_COUNT _IOR('x', 104, unsigned) 397# define LYSAP_PEER_ENUM _IOWR('x', 105, unsigned) 398# define LYSAP_PEER_CLEAR _IOW('x', 106, unsigned) 399 400# define LYSAP_CHAN_ADD _IOWR('x', 111, lysap_channel_config_t) 401# define LYSAP_CHAN_REMOVE _IO('x', 112) 402# define LYSAP_CHAN_INFO _IOR('x', 113, lysap_channel_info_t) 403# define LYSAP_CHAN_COUNT _IOR('x', 114, unsigned) 404# define LYSAP_CHAN_ENUM _IOWR('x', 115, unsigned) 405# define LYSAP_CHAN_CLEAR _IO('x', 116) 406# include "lysap-linux.h" 407#else /* CRONYX_LYSAP */ 408 typedef struct _lysap_channel_t lysap_channel_t; 409 typedef struct _lysap_channel_config_t lysap_channel_config_t; 410 typedef struct _LYSAP_DeviceInterfaceConfig LYSAP_DeviceInterfaceConfig; 411 typedef struct _LYSAP_ChannelConfig LYSAP_ChannelConfig; 412 typedef struct _lysap_buf_t lysap_buf_t; 413#endif /* !CRONYX_LYSAP */ 414 415/* 416 * Dynamic binder interface. 417 */ 418typedef struct _chan_t chan_t; 419typedef struct _proto_t proto_t; 420 421void binder_register_protocol (proto_t *p); 422void binder_unregister_protocol (proto_t *p); 423 424int binder_register_channel (chan_t *h, char *prefix, int minor); 425void binder_unregister_channel (chan_t *h); 426 427/* 428 * Hardware channel driver structure. 429 */ 430struct sk_buff; 431 432struct _chan_t { 433 char name [16]; 434 int mtu; /* max packet size */ 435 int fifosz; /* total hardware i/o buffer size */ 436 int port; /* hardware base i/o port */ 437 int irq; /* hardware interrupt line */ 438 int minor; /* minor number 0..127, assigned by binder */ 439 int debug; /* debug level, 0..2 */ 440 int running; /* running, 0..1 */ 441 struct _proto_t *proto; /* protocol interface data */ 442 void *sw; /* protocol private data */ 443 void *hw; /* hardware layer private data */ 444 445 /* Interface to protocol */ 446 int (*up) (chan_t *h); 447 void (*down) (chan_t *h); 448 int (*transmit) (chan_t *h, struct sk_buff *skb); 449 void (*set_dtr) (chan_t *h, int val); 450 void (*set_rts) (chan_t *h, int val); 451 int (*query_dtr) (chan_t *h); 452 int (*query_rts) (chan_t *h); 453 int (*query_dsr) (chan_t *h); 454 int (*query_cts) (chan_t *h); 455 int (*query_dcd) (chan_t *h); 456 457 /* Interface to async protocol */ 458 void (*set_async_param) (chan_t *h, int baud, int bits, int parity, 459 int stop2, int ignpar, int rtscts, 460 int ixon, int ixany, int symstart, int symstop); 461 void (*send_break) (chan_t *h, int msec); 462 void (*send_xon) (chan_t *h); 463 void (*send_xoff) (chan_t *h); 464 void (*start_transmitter) (chan_t *h); 465 void (*stop_transmitter) (chan_t *h); 466 void (*flush_transmit_buffer) (chan_t *h); 467 468 /* Control interface */ 469 int (*control) (chan_t *h, unsigned int cmd, unsigned long arg); 470 471 /* LYSAP interface */ 472 struct lysap_t 473 { 474 lysap_channel_t *link; 475 int (*inspect_config)(chan_t *h, lysap_channel_config_t *, 476 LYSAP_DeviceInterfaceConfig *, LYSAP_ChannelConfig *); 477 unsigned long (*probe_freq)(chan_t *h, unsigned long freq); 478 unsigned long (*set_freq)(chan_t *h, unsigned long freq); 479 unsigned (*get_status)(chan_t *h); 480 int (*transmit) (chan_t *h, lysap_buf_t *b); 481 lysap_buf_t* (*alloc_buf) (chan_t *h, unsigned len); 482 int (*set_clock_master)(chan_t *h, int enable); 483 unsigned long (*get_master_freq)(chan_t *h); 484 } lysap; 485}; 486 487/* 488 * Protocol driver structure. 489 */ 490struct _proto_t { 491 char *name; 492 struct _proto_t *next; 493 494 /* Interface to channel */ 495 void (*receive) (chan_t *h, struct sk_buff *skb); 496 void (*receive_error) (chan_t *h, int errcode); 497 void (*transmit) (chan_t *h); 498 void (*modem_event) (chan_t *h); 499 500 /* Interface to binder */ 501 int (*open) (chan_t *h); 502 void (*close) (chan_t *h); 503 int (*read) (chan_t *h, unsigned short flg, char *buf, int len); 504 int (*write) (chan_t *h, unsigned short flg, const char *buf, int len); 505 int (*select) (chan_t *h, int type, void *st, struct file *filp); 506 struct fasync_struct *fasync; 507 508 /* Control interface */ 509 int (*attach) (chan_t *h); 510 int (*detach) (chan_t *h); 511 int (*control) (chan_t *h, unsigned int cmd, unsigned long arg); 512 513 /* LYSAP interface */ 514 void (*transmit_error) (chan_t *h, int errcode); 515 void (*lysap_notify_receive) (chan_t *h, lysap_buf_t *b); 516 void (*lysap_notify_transmit) (chan_t *h); 517 lysap_buf_t* (*lysap_get_data)(chan_t *h); 518}; 519#endif /* KERNEL */ 520