at v2.6.13 17 kB view raw
1/***************************************************************************** 2* wanpipe.h WANPIPE(tm) Multiprotocol WAN Link Driver. 3* User-level API definitions. 4* 5* Author: Nenad Corbic <ncorbic@sangoma.com> 6* Gideon Hack 7* 8* Copyright: (c) 1995-2000 Sangoma Technologies Inc. 9* 10* This program is free software; you can redistribute it and/or 11* modify it under the terms of the GNU General Public License 12* as published by the Free Software Foundation; either version 13* 2 of the License, or (at your option) any later version. 14* ============================================================================ 15* Nov 3, 2000 Nenad Corbic Added config_id to sdla_t structure. 16* Used to determine the protocol running. 17* Jul 13, 2000 Nenad Corbic Added SyncPPP Support 18* Feb 24, 2000 Nenad Corbic Added support for x25api driver 19* Oct 04, 1999 Nenad Corbic New CHDLC and FRAME RELAY code, SMP support 20* Jun 02, 1999 Gideon Hack Added 'update_call_count' for Cisco HDLC 21* support 22* Jun 26, 1998 David Fong Added 'ip_mode' in sdla_t.u.p for dynamic IP 23* routing mode configuration 24* Jun 12, 1998 David Fong Added Cisco HDLC union member in sdla_t 25* Dec 08, 1997 Jaspreet Singh Added 'authenticator' in union of 'sdla_t' 26* Nov 26, 1997 Jaspreet Singh Added 'load_sharing' structure. Also added 27* 'devs_struct','dev_to_devtint_next' to 'sdla_t' 28* Nov 24, 1997 Jaspreet Singh Added 'irq_dis_if_send_count', 29* 'irq_dis_poll_count' to 'sdla_t'. 30* Nov 06, 1997 Jaspreet Singh Added a define called 'INTR_TEST_MODE' 31* Oct 20, 1997 Jaspreet Singh Added 'buff_intr_mode_unbusy' and 32* 'dlci_intr_mode_unbusy' to 'sdla_t' 33* Oct 18, 1997 Jaspreet Singh Added structure to maintain global driver 34* statistics. 35* Jan 15, 1997 Gene Kozin Version 3.1.0 36* o added UDP management stuff 37* Jan 02, 1997 Gene Kozin Version 3.0.0 38*****************************************************************************/ 39#ifndef _WANPIPE_H 40#define _WANPIPE_H 41 42#include <linux/wanrouter.h> 43 44/* Defines */ 45 46#ifndef PACKED 47#define PACKED __attribute__((packed)) 48#endif 49 50#define WANPIPE_MAGIC 0x414C4453L /* signature: 'SDLA' reversed */ 51 52/* IOCTL numbers (up to 16) */ 53#define WANPIPE_DUMP (ROUTER_USER+0) /* dump adapter's memory */ 54#define WANPIPE_EXEC (ROUTER_USER+1) /* execute firmware command */ 55 56#define TRACE_ALL 0x00 57#define TRACE_PROT 0x01 58#define TRACE_DATA 0x02 59 60/* values for request/reply byte */ 61#define UDPMGMT_REQUEST 0x01 62#define UDPMGMT_REPLY 0x02 63#define UDP_OFFSET 12 64 65#define MAX_CMD_BUFF 10 66#define MAX_X25_LCN 255 /* Maximum number of x25 channels */ 67#define MAX_LCN_NUM 4095 /* Maximum lcn number */ 68#define MAX_FT1_RETRY 100 69 70#ifndef AF_WANPIPE 71 #define AF_WANPIPE 25 72 #ifndef PF_WANPIPE 73 #define PF_WANPIPE AF_WANPIPE 74 #endif 75#endif 76 77 78#define TX_TIMEOUT 5*HZ 79 80/* General Critical Flags */ 81#define SEND_CRIT 0x00 82#define PERI_CRIT 0x01 83 84/* Chdlc and PPP polling critical flag */ 85#define POLL_CRIT 0x03 86 87/* Frame Relay Tx IRQ send critical flag */ 88#define SEND_TXIRQ_CRIT 0x02 89 90/* Frame Relay ARP critical flag */ 91#define ARP_CRIT 0x03 92 93/* Bit maps for dynamic interface configuration 94 * DYN_OPT_ON : turns this option on/off 95 * DEV_DOWN : device was shutdown by the driver not 96 * by user 97 */ 98#define DYN_OPT_ON 0x00 99#define DEV_DOWN 0x01 100 101/* 102 * Data structures for IOCTL calls. 103 */ 104 105typedef struct sdla_dump /* WANPIPE_DUMP */ 106{ 107 unsigned long magic; /* for verification */ 108 unsigned long offset; /* absolute adapter memory address */ 109 unsigned long length; /* block length */ 110 void* ptr; /* -> buffer */ 111} sdla_dump_t; 112 113typedef struct sdla_exec /* WANPIPE_EXEC */ 114{ 115 unsigned long magic; /* for verification */ 116 void* cmd; /* -> command structure */ 117 void* data; /* -> data buffer */ 118} sdla_exec_t; 119 120/* UDP management stuff */ 121 122typedef struct wum_header 123{ 124 unsigned char signature[8]; /* 00h: signature */ 125 unsigned char type; /* 08h: request/reply */ 126 unsigned char command; /* 09h: commnand */ 127 unsigned char reserved[6]; /* 0Ah: reserved */ 128} wum_header_t; 129 130/************************************************************************* 131 Data Structure for global statistics 132*************************************************************************/ 133 134typedef struct global_stats 135{ 136 unsigned long isr_entry; 137 unsigned long isr_already_critical; 138 unsigned long isr_rx; 139 unsigned long isr_tx; 140 unsigned long isr_intr_test; 141 unsigned long isr_spurious; 142 unsigned long isr_enable_tx_int; 143 unsigned long rx_intr_corrupt_rx_bfr; 144 unsigned long rx_intr_on_orphaned_DLCI; 145 unsigned long rx_intr_dev_not_started; 146 unsigned long tx_intr_dev_not_started; 147 unsigned long poll_entry; 148 unsigned long poll_already_critical; 149 unsigned long poll_processed; 150 unsigned long poll_tbusy_bad_status; 151 unsigned long poll_host_disable_irq; 152 unsigned long poll_host_enable_irq; 153 154} global_stats_t; 155 156 157typedef struct{ 158 unsigned short udp_src_port PACKED; 159 unsigned short udp_dst_port PACKED; 160 unsigned short udp_length PACKED; 161 unsigned short udp_checksum PACKED; 162} udp_pkt_t; 163 164 165typedef struct { 166 unsigned char ver_inet_hdr_length PACKED; 167 unsigned char service_type PACKED; 168 unsigned short total_length PACKED; 169 unsigned short identifier PACKED; 170 unsigned short flags_frag_offset PACKED; 171 unsigned char ttl PACKED; 172 unsigned char protocol PACKED; 173 unsigned short hdr_checksum PACKED; 174 unsigned long ip_src_address PACKED; 175 unsigned long ip_dst_address PACKED; 176} ip_pkt_t; 177 178 179typedef struct { 180 unsigned char signature[8] PACKED; 181 unsigned char request_reply PACKED; 182 unsigned char id PACKED; 183 unsigned char reserved[6] PACKED; 184} wp_mgmt_t; 185 186/************************************************************************* 187 Data Structure for if_send statistics 188*************************************************************************/ 189typedef struct if_send_stat{ 190 unsigned long if_send_entry; 191 unsigned long if_send_skb_null; 192 unsigned long if_send_broadcast; 193 unsigned long if_send_multicast; 194 unsigned long if_send_critical_ISR; 195 unsigned long if_send_critical_non_ISR; 196 unsigned long if_send_tbusy; 197 unsigned long if_send_tbusy_timeout; 198 unsigned long if_send_PIPE_request; 199 unsigned long if_send_wan_disconnected; 200 unsigned long if_send_dlci_disconnected; 201 unsigned long if_send_no_bfrs; 202 unsigned long if_send_adptr_bfrs_full; 203 unsigned long if_send_bfr_passed_to_adptr; 204 unsigned long if_send_protocol_error; 205 unsigned long if_send_bfr_not_passed_to_adptr; 206 unsigned long if_send_tx_int_enabled; 207 unsigned long if_send_consec_send_fail; 208} if_send_stat_t; 209 210typedef struct rx_intr_stat{ 211 unsigned long rx_intr_no_socket; 212 unsigned long rx_intr_dev_not_started; 213 unsigned long rx_intr_PIPE_request; 214 unsigned long rx_intr_bfr_not_passed_to_stack; 215 unsigned long rx_intr_bfr_passed_to_stack; 216} rx_intr_stat_t; 217 218typedef struct pipe_mgmt_stat{ 219 unsigned long UDP_PIPE_mgmt_kmalloc_err; 220 unsigned long UDP_PIPE_mgmt_direction_err; 221 unsigned long UDP_PIPE_mgmt_adptr_type_err; 222 unsigned long UDP_PIPE_mgmt_adptr_cmnd_OK; 223 unsigned long UDP_PIPE_mgmt_adptr_cmnd_timeout; 224 unsigned long UDP_PIPE_mgmt_adptr_send_passed; 225 unsigned long UDP_PIPE_mgmt_adptr_send_failed; 226 unsigned long UDP_PIPE_mgmt_not_passed_to_stack; 227 unsigned long UDP_PIPE_mgmt_passed_to_stack; 228 unsigned long UDP_PIPE_mgmt_no_socket; 229 unsigned long UDP_PIPE_mgmt_passed_to_adptr; 230} pipe_mgmt_stat_t; 231 232 233typedef struct { 234 struct sk_buff *skb; 235} bh_data_t, cmd_data_t; 236 237#define MAX_LGTH_UDP_MGNT_PKT 2000 238 239 240/* This is used for interrupt testing */ 241#define INTR_TEST_MODE 0x02 242 243#define WUM_SIGNATURE_L 0x50495046 244#define WUM_SIGNATURE_H 0x444E3845 245 246#define WUM_KILL 0x50 247#define WUM_EXEC 0x51 248 249#define WANPIPE 0x00 250#define API 0x01 251#define BRIDGE 0x02 252#define BRIDGE_NODE 0x03 253 254#ifdef __KERNEL__ 255/****** Kernel Interface ****************************************************/ 256 257#include <linux/sdladrv.h> /* SDLA support module API definitions */ 258#include <linux/sdlasfm.h> /* SDLA firmware module definitions */ 259#include <linux/workqueue.h> 260#include <linux/serial.h> 261#include <linux/serialP.h> 262#include <linux/serial_reg.h> 263#include <asm/serial.h> 264#include <linux/tty.h> 265#include <linux/tty_driver.h> 266#include <linux/tty_flip.h> 267 268 269#define is_digit(ch) (((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')?1:0) 270#define is_alpha(ch) ((((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'z')||\ 271 ((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'Z'))?1:0) 272#define is_hex_digit(ch) ((((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')||\ 273 ((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'f')||\ 274 ((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'F'))?1:0) 275 276 277/****** Data Structures *****************************************************/ 278 279/* Adapter Data Space. 280 * This structure is needed because we handle multiple cards, otherwise 281 * static data would do it. 282 */ 283typedef struct sdla 284{ 285 char devname[WAN_DRVNAME_SZ+1]; /* card name */ 286 sdlahw_t hw; /* hardware configuration */ 287 struct wan_device wandev; /* WAN device data space */ 288 289 unsigned open_cnt; /* number of open interfaces */ 290 unsigned long state_tick; /* link state timestamp */ 291 unsigned intr_mode; /* Type of Interrupt Mode */ 292 char in_isr; /* interrupt-in-service flag */ 293 char buff_int_mode_unbusy; /* flag for carrying out dev_tint */ 294 char dlci_int_mode_unbusy; /* flag for carrying out dev_tint */ 295 long configured; /* flag for previous configurations */ 296 297 unsigned short irq_dis_if_send_count; /* Disabling irqs in if_send*/ 298 unsigned short irq_dis_poll_count; /* Disabling irqs in poll routine*/ 299 unsigned short force_enable_irq; 300 char TracingEnabled; /* flag for enabling trace */ 301 global_stats_t statistics; /* global statistics */ 302 void* mbox; /* -> mailbox */ 303 void* rxmb; /* -> receive mailbox */ 304 void* flags; /* -> adapter status flags */ 305 void (*isr)(struct sdla* card); /* interrupt service routine */ 306 void (*poll)(struct sdla* card); /* polling routine */ 307 int (*exec)(struct sdla* card, void* u_cmd, void* u_data); 308 /* Used by the listen() system call */ 309 /* Wanpipe Socket Interface */ 310 int (*func) (struct sk_buff *, struct sock *); 311 struct sock *sk; 312 313 /* Shutdown function */ 314 void (*disable_comm) (struct sdla *card); 315 316 /* Secondary Port Device: Piggibacking */ 317 struct sdla *next; 318 319 /* TTY driver variables */ 320 unsigned char tty_opt; 321 struct tty_struct *tty; 322 unsigned int tty_minor; 323 unsigned int tty_open; 324 unsigned char *tty_buf; 325 unsigned char *tty_rx; 326 struct work_struct tty_work; 327 328 union 329 { 330 struct 331 { /****** X.25 specific data **********/ 332 u32 lo_pvc; 333 u32 hi_pvc; 334 u32 lo_svc; 335 u32 hi_svc; 336 struct net_device *svc_to_dev_map[MAX_X25_LCN]; 337 struct net_device *pvc_to_dev_map[MAX_X25_LCN]; 338 struct net_device *tx_dev; 339 struct net_device *cmd_dev; 340 u32 no_dev; 341 volatile u8 *hdlc_buf_status; 342 u32 tx_interrupts_pending; 343 u16 timer_int_enabled; 344 struct net_device *poll_device; 345 atomic_t command_busy; 346 347 u16 udp_pkt_lgth; 348 u32 udp_type; 349 u8 udp_pkt_src; 350 u32 udp_lcn; 351 struct net_device *udp_dev; 352 s8 udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT]; 353 354 u8 LAPB_hdlc; /* Option to turn off X25 and run only LAPB */ 355 u8 logging; /* Option to log call messages */ 356 u8 oob_on_modem; /* Option to send modem status to the api */ 357 u16 num_of_ch; /* Number of channels configured by the user */ 358 359 struct work_struct x25_poll_work; 360 struct timer_list x25_timer; 361 } x; 362 struct 363 { /****** frame relay specific data ***/ 364 void* rxmb_base; /* -> first Rx buffer */ 365 void* rxmb_last; /* -> last Rx buffer */ 366 unsigned rx_base; /* S508 receive buffer base */ 367 unsigned rx_top; /* S508 receive buffer end */ 368 unsigned short node_dlci[100]; 369 unsigned short dlci_num; 370 struct net_device *dlci_to_dev_map[991 + 1]; 371 unsigned tx_interrupts_pending; 372 unsigned short timer_int_enabled; 373 unsigned short udp_pkt_lgth; 374 int udp_type; 375 char udp_pkt_src; 376 unsigned udp_dlci; 377 char udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT]; 378 void* trc_el_base; /* first trace element */ 379 void* trc_el_last; /* last trace element */ 380 void *curr_trc_el; /* current trace element */ 381 unsigned short trc_bfr_space; /* trace buffer space */ 382 unsigned char update_comms_stats; 383 struct net_device *arp_dev; 384 spinlock_t if_send_lock; 385 } f; 386 struct /****** PPP-specific data ***********/ 387 { 388 char if_name[WAN_IFNAME_SZ+1]; /* interface name */ 389 void* txbuf; /* -> current Tx buffer */ 390 void* txbuf_base; /* -> first Tx buffer */ 391 void* txbuf_last; /* -> last Tx buffer */ 392 void* rxbuf_base; /* -> first Rx buffer */ 393 void* rxbuf_last; /* -> last Rx buffer */ 394 unsigned rx_base; /* S508 receive buffer base */ 395 unsigned rx_top; /* S508 receive buffer end */ 396 char ip_mode; /* STATIC/HOST/PEER IP Mode */ 397 char authenticator; /* Authenticator for PAP/CHAP */ 398 unsigned char comm_enabled; /* Is comm enabled or not */ 399 unsigned char peer_route; /* Process Peer Route */ 400 unsigned long *txbuf_next; /* Next Tx buffer to use */ 401 unsigned long *rxbuf_next; /* Next Rx buffer to use */ 402 } p; 403 struct /* Cisco HDLC-specific data */ 404 { 405 char if_name[WAN_IFNAME_SZ+1]; /* interface name */ 406 unsigned char comm_port;/* Communication Port O or 1 */ 407 unsigned char usedby; /* Used by WANPIPE or API */ 408 void* rxmb; /* Receive mail box */ 409 void* flags; /* flags */ 410 void* tx_status; /* Tx status element */ 411 void* rx_status; /* Rx status element */ 412 void* txbuf; /* -> current Tx buffer */ 413 void* txbuf_base; /* -> first Tx buffer */ 414 void* txbuf_last; /* -> last Tx buffer */ 415 void* rxbuf_base; /* -> first Rx buffer */ 416 void* rxbuf_last; /* -> last Rx buffer */ 417 unsigned rx_base; /* S508 receive buffer base */ 418 unsigned rx_top; /* S508 receive buffer end */ 419 unsigned char receive_only; /* high speed receivers */ 420 unsigned short protocol_options; 421 unsigned short kpalv_tx; /* Tx kpalv timer */ 422 unsigned short kpalv_rx; /* Rx kpalv timer */ 423 unsigned short kpalv_err; /* Error tolerance */ 424 unsigned short slarp_timer; /* SLARP req timer */ 425 unsigned state; /* state of the link */ 426 unsigned char api_status; 427 unsigned char update_call_count; 428 unsigned short api_options; /* for async config */ 429 unsigned char async_mode; 430 unsigned short tx_bits_per_char; 431 unsigned short rx_bits_per_char; 432 unsigned short stop_bits; 433 unsigned short parity; 434 unsigned short break_timer; 435 unsigned short inter_char_timer; 436 unsigned short rx_complete_length; 437 unsigned short xon_char; 438 unsigned short xoff_char; 439 unsigned char comm_enabled; /* Is comm enabled or not */ 440 unsigned char backup; 441 } c; 442 struct 443 { 444 void* tx_status; /* Tx status element */ 445 void* rx_status; /* Rx status element */ 446 void* trace_status; /* Trace status element */ 447 void* txbuf; /* -> current Tx buffer */ 448 void* txbuf_base; /* -> first Tx buffer */ 449 void* txbuf_last; /* -> last Tx buffer */ 450 void* rxbuf_base; /* -> first Rx buffer */ 451 void* rxbuf_last; /* -> last Rx buffer */ 452 void* tracebuf; /* -> current Trace buffer */ 453 void* tracebuf_base; /* -> current Trace buffer */ 454 void* tracebuf_last; /* -> current Trace buffer */ 455 unsigned rx_base; /* receive buffer base */ 456 unsigned rx_end; /* receive buffer end */ 457 unsigned trace_base; /* trace buffer base */ 458 unsigned trace_end; /* trace buffer end */ 459 460 } h; 461 } u; 462} sdla_t; 463 464/****** Public Functions ****************************************************/ 465 466void wanpipe_open (sdla_t* card); /* wpmain.c */ 467void wanpipe_close (sdla_t* card); /* wpmain.c */ 468void wanpipe_set_state (sdla_t* card, int state); /* wpmain.c */ 469 470int wpx_init (sdla_t* card, wandev_conf_t* conf); /* wpx.c */ 471int wpf_init (sdla_t* card, wandev_conf_t* conf); /* wpf.c */ 472int wpp_init (sdla_t* card, wandev_conf_t* conf); /* wpp.c */ 473int wpc_init (sdla_t* card, wandev_conf_t* conf); /* Cisco HDLC */ 474int bsc_init (sdla_t* card, wandev_conf_t* conf); /* BSC streaming */ 475int hdlc_init(sdla_t* card, wandev_conf_t* conf); /* HDLC support */ 476int wpft1_init (sdla_t* card, wandev_conf_t* conf); /* FT1 Config support */ 477int wsppp_init (sdla_t* card, wandev_conf_t* conf); /* Sync PPP on top of RAW CHDLC */ 478 479extern sdla_t * wanpipe_find_card(char *); 480extern sdla_t * wanpipe_find_card_num (int); 481 482extern void wanpipe_queue_work (struct work_struct *); 483extern void wanpipe_mark_bh (void); 484extern void wakeup_sk_bh(struct net_device *dev); 485extern int change_dev_flags(struct net_device *dev, unsigned flags); 486extern unsigned long get_ip_address(struct net_device *dev, int option); 487extern void add_gateway(sdla_t *card, struct net_device *dev); 488 489 490#endif /* __KERNEL__ */ 491#endif /* _WANPIPE_H */ 492