sdla_chdlc.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:129k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2. * sdla_chdlc.c WANPIPE(tm) Multiprotocol WAN Link Driver. Cisco HDLC module.
  3. *
  4. * Authors:  Nenad Corbic <ncorbic@sangoma.com>
  5. * Gideon Hack  
  6. *
  7. * Copyright: (c) 1995-2001 Sangoma Technologies Inc.
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License
  11. * as published by the Free Software Foundation; either version
  12. * 2 of the License, or (at your option) any later version.
  13. * ============================================================================
  14. * Feb 28, 2001  Nenad Corbic Updated if_tx_timeout() routine for 
  15. *  2.4.X kernels.
  16. * Jan 25, 2001  Nenad Corbic Added a TTY Sync serial driver over the
  17. *  HDLC streaming protocol
  18. *  Added a TTY Async serial driver over the
  19. *  Async protocol.
  20. * Dec 15, 2000  Nenad Corbic    Updated for 2.4.X Kernel support
  21. * Nov 13, 2000  Nenad Corbic    Added true interface type encoding option.
  22. *  Tcpdump doesn't support CHDLC inteface
  23. *  types, to fix this "true type" option will set
  24. *  the interface type to RAW IP mode.
  25. * Nov 07, 2000  Nenad Corbic Added security features for UDP debugging:
  26. *                               Deny all and specify allowed requests.
  27. * Jun 20, 2000  Nenad Corbic Fixed the API IP ERROR bug. Caused by the 
  28. *                               latest update.
  29. * May 09, 2000 Nenad Corbic Option to bring down an interface
  30. *                               upon disconnect.
  31. * Mar 23, 2000  Nenad Corbic Improved task queue, bh handling.
  32. * Mar 16, 2000 Nenad Corbic Fixed the SLARP Dynamic IP addressing.
  33. * Mar 06, 2000  Nenad Corbic Bug Fix: corrupted mbox recovery.
  34. * Feb 10, 2000  Gideon Hack     Added ASYNC support.
  35. * Feb 09, 2000  Nenad Corbic    Fixed two shutdown bugs in update() and
  36. *                               if_stats() functions.
  37. * Jan 24, 2000  Nenad Corbic    Fixed a startup wanpipe state racing,  
  38. *                               condition between if_open and isr. 
  39. * Jan 10, 2000  Nenad Corbic    Added new socket API support.
  40. * Dev 15, 1999  Nenad Corbic    Fixed up header files for 2.0.X kernels
  41. * Nov 20, 1999  Nenad Corbic  Fixed zero length API bug.
  42. * Sep 30, 1999  Nenad Corbic    Fixed dynamic IP and route setup.
  43. * Sep 23, 1999  Nenad Corbic    Added SMP support, fixed tracing 
  44. * Sep 13, 1999  Nenad Corbic Split up Port 0 and 1 into separate devices.
  45. * Jun 02, 1999  Gideon Hack     Added support for the S514 adapter.
  46. * Oct 30, 1998 Jaspreet Singh Added Support for CHDLC API (HDLC STREAMING).
  47. * Oct 28, 1998 Jaspreet Singh Added Support for Dual Port CHDLC.
  48. * Aug 07, 1998 David Fong Initial version.
  49. *****************************************************************************/
  50. #include <linux/module.h>
  51. #include <linux/version.h>
  52. #include <linux/kernel.h> /* printk(), and other useful stuff */
  53. #include <linux/stddef.h> /* offsetof(), etc. */
  54. #include <linux/errno.h> /* return codes */
  55. #include <linux/string.h> /* inline memset(), etc. */
  56. #include <linux/slab.h> /* kmalloc(), kfree() */
  57. #include <linux/wanrouter.h> /* WAN router definitions */
  58. #include <linux/wanpipe.h> /* WANPIPE common user API definitions */
  59. #include <linux/if_arp.h> /* ARPHRD_* defines */
  60. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  61.  #include <asm/uaccess.h>
  62.  #include <linux/inetdevice.h>
  63.  #include <linux/netdevice.h>
  64. #else 
  65.  #include <asm/segment.h>
  66.  #include <net/route.h>          /* Adding new route entries : 2.0.X kernels */
  67. #endif
  68. #include <linux/in.h> /* sockaddr_in */
  69. #include <linux/inet.h>
  70. #include <linux/if.h>
  71. #include <asm/byteorder.h> /* htons(), etc. */
  72. #include <linux/sdlapci.h>
  73. #include <asm/io.h>
  74. #include <linux/sdla_chdlc.h> /* CHDLC firmware API definitions */
  75. #include <linux/sdla_asy.h>            /* CHDLC (async) API definitions */
  76. #include <linux/if_wanpipe_common.h>    /* Socket Driver common area */
  77. #include <linux/if_wanpipe.h>
  78. /* TTY Includes */
  79. #include <linux/tty.h>
  80. #include <linux/tty_flip.h>
  81. #include <linux/serial.h>
  82. /****** Defines & Macros ****************************************************/
  83. /* reasons for enabling the timer interrupt on the adapter */
  84. #define TMR_INT_ENABLED_UDP    0x01
  85. #define TMR_INT_ENABLED_UPDATE 0x02
  86. #define TMR_INT_ENABLED_CONFIG 0x10
  87. #define MAX_IP_ERRORS 10
  88. #define TTY_CHDLC_MAX_MTU 2000
  89. #define CHDLC_DFLT_DATA_LEN 1500 /* default MTU */
  90. #define CHDLC_HDR_LEN 1
  91. #define CHDLC_API 0x01
  92. #define PORT(x)   (x == 0 ? "PRIMARY" : "SECONDARY" )
  93. #define MAX_BH_BUFF 10
  94. //#define PRINT_DEBUG
  95. #ifdef PRINT_DEBUG
  96. #define dbg_printk(format, a...) printk(format, ## a)
  97. #else
  98. #define dbg_printk(format, a...)
  99. #endif  
  100. /******Data Structures*****************************************************/
  101. /* This structure is placed in the private data area of the device structure.
  102.  * The card structure used to occupy the private area but now the following 
  103.  * structure will incorporate the card structure along with CHDLC specific data
  104.  */
  105. typedef struct chdlc_private_area
  106. {
  107. wanpipe_common_t common;
  108. sdla_t *card;
  109. int  TracingEnabled; /* For enabling Tracing */
  110. unsigned long  curr_trace_addr; /* Used for Tracing */
  111. unsigned long  start_trace_addr;
  112. unsigned long  end_trace_addr;
  113. unsigned long  base_addr_trace_buffer;
  114. unsigned long  end_addr_trace_buffer;
  115. unsigned short  number_trace_elements;
  116. unsigned   available_buffer_space;
  117. unsigned long  router_start_time;
  118. unsigned char  route_status;
  119. unsigned char  route_removed;
  120. unsigned long  tick_counter; /* For 5s timeout counter */
  121. unsigned long  router_up_time;
  122.         u32             IP_address; /* IP addressing */
  123.         u32             IP_netmask;
  124. u32 ip_local;
  125. u32 ip_remote;
  126. u32  ip_local_tmp;
  127. u32 ip_remote_tmp;
  128. u8 ip_error;
  129. u8 config_chdlc;
  130. u8  config_chdlc_timeout;
  131. unsigned char  mc; /* Mulitcast support on/off */
  132. unsigned short udp_pkt_lgth; /* udp packet processing */
  133. char udp_pkt_src;
  134. char udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT];
  135. unsigned short timer_int_enabled;
  136. char update_comms_stats; /* updating comms stats */
  137. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  138. bh_data_t *bh_head;      /* Circular buffer for chdlc_bh */
  139. unsigned long  tq_working;
  140. volatile int  bh_write;
  141. volatile int  bh_read;
  142. atomic_t  bh_buff_used;
  143. #endif
  144. unsigned char interface_down;
  145. /* Polling task queue. Each interface
  146.          * has its own task queue, which is used
  147.          * to defer events from the interrupt */
  148. struct tq_struct poll_task;
  149. struct timer_list poll_delay_timer;
  150. u8 gateway;
  151. u8 true_if_encoding;
  152. //FIXME: add driver stats as per frame relay!
  153. } chdlc_private_area_t;
  154. /* Route Status options */
  155. #define NO_ROUTE 0x00
  156. #define ADD_ROUTE 0x01
  157. #define ROUTE_ADDED 0x02
  158. #define REMOVE_ROUTE 0x03
  159. /* variable for keeping track of enabling/disabling FT1 monitor status */
  160. static int rCount = 0;
  161. /* variable for tracking how many interfaces to open for WANPIPE on the
  162.    two ports */
  163. extern void disable_irq(unsigned int);
  164. extern void enable_irq(unsigned int);
  165. /****** Function Prototypes *************************************************/
  166. /* WAN link driver entry points. These are called by the WAN router module. */
  167. static int update (wan_device_t* wandev);
  168. static int new_if (wan_device_t* wandev, netdevice_t* dev,
  169. wanif_conf_t* conf);
  170. /* Network device interface */
  171. static int if_init   (netdevice_t* dev);
  172. static int if_open   (netdevice_t* dev);
  173. static int if_close  (netdevice_t* dev);
  174. static int if_header (struct sk_buff* skb, netdevice_t* dev,
  175. unsigned short type, void* daddr, void* saddr, unsigned len);
  176. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  177.   static int if_rebuild_hdr (struct sk_buff *skb);
  178.   static struct net_device_stats* if_stats (netdevice_t* dev);
  179. #else
  180.   static int if_rebuild_hdr (void* hdr, netdevice_t* dev, unsigned long raddr,
  181.         struct sk_buff* skb);
  182.   static struct enet_statistics* if_stats (netdevice_t* dev);
  183. #endif
  184.   
  185. static int if_send (struct sk_buff* skb, netdevice_t* dev);
  186. /* CHDLC Firmware interface functions */
  187. static int chdlc_configure  (sdla_t* card, void* data);
  188. static int chdlc_comm_enable  (sdla_t* card);
  189. static int chdlc_read_version  (sdla_t* card, char* str);
  190. static int chdlc_set_intr_mode  (sdla_t* card, unsigned mode);
  191. static int chdlc_send (sdla_t* card, void* data, unsigned len);
  192. static int chdlc_read_comm_err_stats (sdla_t* card);
  193. static int chdlc_read_op_stats (sdla_t* card);
  194. static int chdlc_error (sdla_t *card, int err, CHDLC_MAILBOX_STRUCT *mb);
  195. static int chdlc_disable_comm_shutdown (sdla_t *card);
  196. #ifdef LINUX_2_4
  197.   static void if_tx_timeout (netdevice_t *dev);
  198. #endif
  199. /* Miscellaneous CHDLC Functions */
  200. static int set_chdlc_config (sdla_t* card);
  201. static void init_chdlc_tx_rx_buff( sdla_t* card);
  202. static int process_chdlc_exception(sdla_t *card);
  203. static int process_global_exception(sdla_t *card);
  204. static int update_comms_stats(sdla_t* card,
  205.         chdlc_private_area_t* chdlc_priv_area);
  206. static int configure_ip (sdla_t* card);
  207. static int unconfigure_ip (sdla_t* card);
  208. static void process_route(sdla_t *card);
  209. static void port_set_state (sdla_t *card, int);
  210. static int config_chdlc (sdla_t *card);
  211. static void disable_comm (sdla_t *card);
  212. static void trigger_chdlc_poll (netdevice_t *);
  213. static void chdlc_poll (netdevice_t *);
  214. static void chdlc_poll_delay (unsigned long dev_ptr);
  215. /* Miscellaneous asynchronous interface Functions */
  216. static int set_asy_config (sdla_t* card);
  217. static int asy_comm_enable (sdla_t* card);
  218. /* Interrupt handlers */
  219. static void wpc_isr (sdla_t* card);
  220. static void rx_intr (sdla_t* card);
  221. static void timer_intr(sdla_t *);
  222. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  223.   /* Bottom half handlers */
  224.   static void chdlc_bh (netdevice_t *);
  225.   static int chdlc_bh_cleanup (netdevice_t *);
  226.   static int bh_enqueue (netdevice_t *, struct sk_buff *);
  227. #endif
  228. /* Miscellaneous functions */
  229. static int chk_bcast_mcast_addr(sdla_t* card, netdevice_t* dev,
  230. struct sk_buff *skb);
  231. static int reply_udp( unsigned char *data, unsigned int mbox_len );
  232. static int intr_test( sdla_t* card);
  233. static int udp_pkt_type( struct sk_buff *skb , sdla_t* card);
  234. static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card,
  235.                                 struct sk_buff *skb, netdevice_t* dev,
  236.                                 chdlc_private_area_t* chdlc_priv_area);
  237. static int process_udp_mgmt_pkt(sdla_t* card, netdevice_t* dev,  
  238. chdlc_private_area_t* chdlc_priv_area);
  239. static unsigned short calc_checksum (char *, int);
  240. static void s508_lock (sdla_t *card, unsigned long *smp_flags);
  241. static void s508_unlock (sdla_t *card, unsigned long *smp_flags);
  242. static int  Intr_test_counter;
  243. /* TTY Global Definitions */
  244. #if defined(LINUX_2_4) || defined(LINUX_2_1)
  245. #define NR_PORTS 4
  246. #define WAN_TTY_MAJOR 226
  247. #define WAN_TTY_MINOR 0
  248. #define WAN_CARD(port) (tty_card_map[port])
  249. #define MIN_PORT 0
  250. #define MAX_PORT NR_PORTS-1 
  251. #define CRC_LENGTH 2
  252. static int wanpipe_tty_init(sdla_t *card);
  253. static void wanpipe_tty_receive(sdla_t *, unsigned, unsigned int);
  254. static void wanpipe_tty_trigger_poll(sdla_t *card);
  255. static struct tty_driver serial_driver, callout_driver;
  256. static int serial_refcount=1;
  257. static int tty_init_cnt=0;
  258. static struct serial_state rs_table[NR_PORTS];
  259. static struct tty_struct *serial_table[NR_PORTS];
  260. static struct termios *serial_termios[NR_PORTS];
  261. static struct termios *serial_termios_locked[NR_PORTS];
  262. static char tty_driver_mode=WANOPT_TTY_SYNC;
  263. static char *opt_decode[] = {"NONE","CRTSCTS","XONXOFF-RX",
  264.                 "CRTSCTS XONXOFF-RX","XONXOFF-TX",
  265.              "CRTSCTS XONXOFF-TX","CRTSCTS XONXOFF"};
  266. static char *p_decode[] = {"NONE","ODD","EVEN"};
  267. static void* tty_card_map[NR_PORTS] = {NULL,NULL,NULL,NULL};
  268. #endif
  269. /****** Public Functions ****************************************************/
  270. /*============================================================================
  271.  * Cisco HDLC protocol initialization routine.
  272.  *
  273.  * This routine is called by the main WANPIPE module during setup.  At this
  274.  * point adapter is completely initialized and firmware is running.
  275.  *  o read firmware version (to make sure it's alive)
  276.  *  o configure adapter
  277.  *  o initialize protocol-specific fields of the adapter data space.
  278.  *
  279.  * Return: 0 o.k.
  280.  * < 0 failure.
  281.  */
  282. int wpc_init (sdla_t* card, wandev_conf_t* conf)
  283. {
  284. unsigned char port_num;
  285. int err;
  286. unsigned long max_permitted_baud = 0;
  287. SHARED_MEMORY_INFO_STRUCT *flags;
  288. union
  289. {
  290. char str[80];
  291. } u;
  292. volatile CHDLC_MAILBOX_STRUCT* mb;
  293. CHDLC_MAILBOX_STRUCT* mb1;
  294. unsigned long timeout;
  295. /* Verify configuration ID */
  296. if (conf->config_id != WANCONFIG_CHDLC) {
  297. printk(KERN_INFO "%s: invalid configuration ID %u!n",
  298.   card->devname, conf->config_id);
  299. return -EINVAL;
  300. }
  301. /* Find out which Port to use */
  302. if ((conf->comm_port == WANOPT_PRI) || (conf->comm_port == WANOPT_SEC)){
  303. if (card->next){
  304. if (conf->comm_port != card->next->u.c.comm_port){
  305. card->u.c.comm_port = conf->comm_port;
  306. }else{
  307. printk(KERN_INFO "%s: ERROR - %s port used!n",
  308.                   card->wandev.name, PORT(conf->comm_port));
  309. return -EINVAL;
  310. }
  311. }else{
  312. card->u.c.comm_port = conf->comm_port;
  313. }
  314. }else{
  315. printk(KERN_INFO "%s: ERROR - Invalid Port Selected!n",
  316.                  card->wandev.name);
  317. return -EINVAL;
  318. }
  319. /* Initialize protocol-specific fields */
  320. if(card->hw.type != SDLA_S514){
  321. if (card->u.c.comm_port == WANOPT_PRI){
  322. card->mbox  = (void *) card->hw.dpmbase;
  323. }else{
  324. card->mbox  = (void *) card->hw.dpmbase + 
  325. SEC_BASE_ADDR_MB_STRUCT - PRI_BASE_ADDR_MB_STRUCT;
  326. }
  327. }else{ 
  328. /* for a S514 adapter, set a pointer to the actual mailbox in the */
  329. /* allocated virtual memory area */
  330. if (card->u.c.comm_port == WANOPT_PRI){
  331. card->mbox = (void *) card->hw.dpmbase + PRI_BASE_ADDR_MB_STRUCT;
  332. }else{
  333. card->mbox = (void *) card->hw.dpmbase + SEC_BASE_ADDR_MB_STRUCT;
  334. }
  335. }
  336. mb = mb1 = card->mbox;
  337. if (!card->configured){
  338. /* The board will place an 'I' in the return code to indicate that it is
  339.     ready to accept commands.  We expect this to be completed in less
  340.             than 1 second. */
  341. timeout = jiffies;
  342. while (mb->return_code != 'I') /* Wait 1s for board to initialize */
  343. if ((jiffies - timeout) > 1*HZ) break;
  344. if (mb->return_code != 'I') {
  345. printk(KERN_INFO
  346. "%s: Initialization not completed by adaptern",
  347. card->devname);
  348. printk(KERN_INFO "Please contact Sangoma representative.n");
  349. return -EIO;
  350. }
  351. }
  352. /* Read firmware version.  Note that when adapter initializes, it
  353.  * clears the mailbox, so it may appear that the first command was
  354.  * executed successfully when in fact it was merely erased. To work
  355.  * around this, we execute the first command twice.
  356.  */
  357. if (chdlc_read_version(card, u.str))
  358. return -EIO;
  359. printk(KERN_INFO "%s: Running Cisco HDLC firmware v%sn",
  360. card->devname, u.str); 
  361. card->isr = &wpc_isr;
  362. card->poll = NULL;
  363. card->exec = NULL;
  364. card->wandev.update = &update;
  365.   card->wandev.new_if = &new_if;
  366. card->wandev.del_if = NULL;
  367. card->wandev.udp_port    = conf->udp_port;
  368. card->disable_comm = &disable_comm;
  369. card->wandev.new_if_cnt = 0;
  370. /* reset the number of times the 'update()' proc has been called */
  371. card->u.c.update_call_count = 0;
  372. card->wandev.ttl = conf->ttl;
  373. card->wandev.interface = conf->interface; 
  374. if ((card->u.c.comm_port == WANOPT_SEC && conf->interface == WANOPT_V35)&&
  375.     card->hw.type != SDLA_S514){
  376. printk(KERN_INFO "%s: ERROR - V35 Interface not supported on S508 %s port n",
  377. card->devname, PORT(card->u.c.comm_port));
  378. return -EIO;
  379. }
  380. card->wandev.clocking = conf->clocking;
  381. port_num = card->u.c.comm_port;
  382. /* in API mode, we can configure for "receive only" buffering */
  383. if(card->hw.type == SDLA_S514) {
  384. card->u.c.receive_only = conf->receive_only;
  385. if(conf->receive_only) {
  386. printk(KERN_INFO
  387. "%s: Configured for 'receive only' moden",
  388.                                 card->devname);
  389. }
  390. }
  391. /* Setup Port Bps */
  392. if(card->wandev.clocking) {
  393. if((port_num == WANOPT_PRI) || card->u.c.receive_only) {
  394. /* For Primary Port 0 */
  395.                 max_permitted_baud =
  396. (card->hw.type == SDLA_S514) ?
  397. PRI_MAX_BAUD_RATE_S514 : 
  398. PRI_MAX_BAUD_RATE_S508;
  399. }else if(port_num == WANOPT_SEC) {
  400. /* For Secondary Port 1 */
  401.                         max_permitted_baud =
  402.                                (card->hw.type == SDLA_S514) ?
  403.                                 SEC_MAX_BAUD_RATE_S514 :
  404.                                 SEC_MAX_BAUD_RATE_S508;
  405.                         }
  406.   
  407. if(conf->bps > max_permitted_baud) {
  408. conf->bps = max_permitted_baud;
  409. printk(KERN_INFO "%s: Baud too high!n",
  410. card->wandev.name);
  411.   printk(KERN_INFO "%s: Baud rate set to %lu bpsn", 
  412. card->wandev.name, max_permitted_baud);
  413. }
  414. card->wandev.bps = conf->bps;
  415. }else{
  416.          card->wandev.bps = 0;
  417.    }
  418. /* Setup the Port MTU */
  419. if((port_num == WANOPT_PRI) || card->u.c.receive_only) {
  420. /* For Primary Port 0 */
  421. card->wandev.mtu =
  422. (conf->mtu >= MIN_LGTH_CHDLC_DATA_CFG) ?
  423. min_t(unsigned int, conf->mtu, PRI_MAX_NO_DATA_BYTES_IN_FRAME) :
  424. CHDLC_DFLT_DATA_LEN;
  425. } else if(port_num == WANOPT_SEC) { 
  426. /* For Secondary Port 1 */
  427. card->wandev.mtu =
  428. (conf->mtu >= MIN_LGTH_CHDLC_DATA_CFG) ?
  429. min_t(unsigned int, conf->mtu, SEC_MAX_NO_DATA_BYTES_IN_FRAME) :
  430. CHDLC_DFLT_DATA_LEN;
  431. }
  432. /* Set up the interrupt status area */
  433. /* Read the CHDLC Configuration and obtain: 
  434.  * Ptr to shared memory infor struct
  435.          * Use this pointer to calculate the value of card->u.c.flags !
  436.    */
  437. mb1->buffer_length = 0;
  438. mb1->command = READ_CHDLC_CONFIGURATION;
  439. err = sdla_exec(mb1) ? mb1->return_code : CMD_TIMEOUT;
  440. if(err != COMMAND_OK) {
  441.                 if(card->hw.type != SDLA_S514)
  442.                  enable_irq(card->hw.irq);
  443. chdlc_error(card, err, mb1);
  444. return -EIO;
  445. }
  446. if(card->hw.type == SDLA_S514){
  447.                 card->u.c.flags = (void *)(card->hw.dpmbase +
  448.                 (((CHDLC_CONFIGURATION_STRUCT *)mb1->data)->
  449. ptr_shared_mem_info_struct));
  450.         }else{
  451.                 card->u.c.flags = (void *)(card->hw.dpmbase +
  452.                         (((CHDLC_CONFIGURATION_STRUCT *)mb1->data)->
  453. ptr_shared_mem_info_struct % SDLA_WINDOWSIZE));
  454. }
  455. flags = card->u.c.flags;
  456. /* This is for the ports link state */
  457. card->wandev.state = WAN_DUALPORT;
  458. card->u.c.state = WAN_DISCONNECTED;
  459. if (!card->wandev.piggyback){
  460. int err;
  461. /* Perform interrupt testing */
  462. err = intr_test(card);
  463. if(err || (Intr_test_counter < MAX_INTR_TEST_COUNTER)) { 
  464. printk(KERN_INFO "%s: Interrupt test failed (%i)n",
  465. card->devname, Intr_test_counter);
  466. printk(KERN_INFO "%s: Please choose another interruptn",
  467. card->devname);
  468. return -EIO;
  469. }
  470. printk(KERN_INFO "%s: Interrupt test passed (%i)n", 
  471. card->devname, Intr_test_counter);
  472. card->configured = 1;
  473. }
  474. if ((card->tty_opt=conf->tty) == WANOPT_YES){
  475. #if defined(LINUX_2_4) || defined(LINUX_2_1)
  476. int err;
  477. card->tty_minor = conf->tty_minor;
  478. /* On ASYNC connections internal clocking 
  479.  * is mandatory */
  480. if ((card->u.c.async_mode = conf->tty_mode)){
  481. card->wandev.clocking = 1;
  482. }
  483. err=wanpipe_tty_init(card);
  484. if (err){
  485. return err;
  486. }
  487. #else
  488. printk(KERN_INFO "%s: Error: TTY driver is not supported on 2.0.X kernels!n",
  489. card->devname);
  490. return -EINVAL;  
  491. #endif
  492. }else{
  493. if (chdlc_set_intr_mode(card, APP_INT_ON_TIMER)){
  494. printk (KERN_INFO "%s: 
  495. Failed to set interrupt triggers!n",
  496. card->devname);
  497. return -EIO;
  498.          }
  499. /* Mask the Timer interrupt */
  500. flags->interrupt_info_struct.interrupt_permission &= 
  501. ~APP_INT_ON_TIMER;
  502. }
  503. /* If we are using CHDLC in backup mode, this flag will
  504.  * indicate not to look for IP addresses in config_chdlc()*/
  505. card->u.c.backup = conf->backup;
  506. printk(KERN_INFO "n");
  507. return 0;
  508. }
  509. /******* WAN Device Driver Entry Points *************************************/
  510. /*============================================================================
  511.  * Update device status & statistics
  512.  * This procedure is called when updating the PROC file system and returns
  513.  * various communications statistics. These statistics are accumulated from 3 
  514.  * different locations:
  515.  *  1) The 'if_stats' recorded for the device.
  516.  *  2) Communication error statistics on the adapter.
  517.  *      3) CHDLC operational statistics on the adapter.
  518.  * The board level statistics are read during a timer interrupt. Note that we 
  519.  * read the error and operational statistics during consecitive timer ticks so
  520.  * as to minimize the time that we are inside the interrupt handler.
  521.  *
  522.  */
  523. static int update (wan_device_t* wandev)
  524. {
  525. sdla_t* card = wandev->private;
  526.   netdevice_t* dev;
  527.         volatile chdlc_private_area_t* chdlc_priv_area;
  528.         SHARED_MEMORY_INFO_STRUCT *flags;
  529. unsigned long timeout;
  530. /* sanity checks */
  531. if((wandev == NULL) || (wandev->private == NULL))
  532. return -EFAULT;
  533. if(wandev->state == WAN_UNCONFIGURED)
  534. return -ENODEV;
  535. /* more sanity checks */
  536.         if(!card->u.c.flags)
  537.                 return -ENODEV;
  538. if(test_bit(PERI_CRIT, (void*)&card->wandev.critical))
  539.                 return -EAGAIN;
  540. if((dev=card->wandev.dev) == NULL)
  541. return -ENODEV;
  542. if((chdlc_priv_area=dev->priv) == NULL)
  543. return -ENODEV;
  544.        flags = card->u.c.flags;
  545.         if(chdlc_priv_area->update_comms_stats){
  546. return -EAGAIN;
  547. }
  548. /* we will need 2 timer interrupts to complete the */
  549. /* reading of the statistics */
  550. chdlc_priv_area->update_comms_stats = 2;
  551.         flags->interrupt_info_struct.interrupt_permission |= APP_INT_ON_TIMER;
  552. chdlc_priv_area->timer_int_enabled = TMR_INT_ENABLED_UPDATE;
  553.   
  554. /* wait a maximum of 1 second for the statistics to be updated */ 
  555.         timeout = jiffies;
  556.         for(;;) {
  557. if(chdlc_priv_area->update_comms_stats == 0)
  558. break;
  559.                 if ((jiffies - timeout) > (1 * HZ)){
  560.      chdlc_priv_area->update_comms_stats = 0;
  561.   chdlc_priv_area->timer_int_enabled &=
  562. ~TMR_INT_ENABLED_UPDATE; 
  563.   return -EAGAIN;
  564. }
  565.         }
  566. return 0;
  567. }
  568. /*============================================================================
  569.  * Create new logical channel.
  570.  * This routine is called by the router when ROUTER_IFNEW IOCTL is being
  571.  * handled.
  572.  * o parse media- and hardware-specific configuration
  573.  * o make sure that a new channel can be created
  574.  * o allocate resources, if necessary
  575.  * o prepare network device structure for registaration.
  576.  *
  577.  * Return: 0 o.k.
  578.  * < 0 failure (channel will not be created)
  579.  */
  580. static int new_if (wan_device_t* wandev, netdevice_t* dev, wanif_conf_t* conf)
  581. {
  582. sdla_t* card = wandev->private;
  583. chdlc_private_area_t* chdlc_priv_area;
  584. printk(KERN_INFO "%s: Configuring Interface: %sn",
  585. card->devname, conf->name);
  586.  
  587. if ((conf->name[0] == '') || (strlen(conf->name) > WAN_IFNAME_SZ)) {
  588. printk(KERN_INFO "%s: Invalid interface name!n",
  589. card->devname);
  590. return -EINVAL;
  591. }
  592. /* allocate and initialize private data */
  593. chdlc_priv_area = kmalloc(sizeof(chdlc_private_area_t), GFP_KERNEL);
  594. if(chdlc_priv_area == NULL) 
  595. return -ENOMEM;
  596. memset(chdlc_priv_area, 0, sizeof(chdlc_private_area_t));
  597. chdlc_priv_area->card = card; 
  598. chdlc_priv_area->common.sk = NULL;
  599. chdlc_priv_area->common.func = NULL;
  600. /* initialize data */
  601. strcpy(card->u.c.if_name, conf->name);
  602. if(card->wandev.new_if_cnt > 0) {
  603.                 kfree(chdlc_priv_area);
  604. return -EEXIST;
  605. }
  606. card->wandev.new_if_cnt++;
  607. chdlc_priv_area->TracingEnabled = 0;
  608. chdlc_priv_area->route_status = NO_ROUTE;
  609. chdlc_priv_area->route_removed = 0;
  610. card->u.c.async_mode = conf->async_mode;
  611. /* setup for asynchronous mode */
  612. if(conf->async_mode) {
  613. printk(KERN_INFO "%s: Configuring for asynchronous moden",
  614. wandev->name);
  615. if(card->u.c.comm_port == WANOPT_PRI) {
  616. printk(KERN_INFO
  617. "%s:Asynchronous mode on secondary port onlyn",
  618. wandev->name);
  619. kfree(chdlc_priv_area);
  620. return -EINVAL;
  621. }
  622.         if(strcmp(conf->usedby, "WANPIPE") == 0) {
  623. printk(KERN_INFO
  624.                                 "%s: Running in WANIPE Async Moden",                                         wandev->name);
  625. card->u.c.usedby = WANPIPE;
  626. }else{
  627. card->u.c.usedby = API;
  628. }
  629. if(!card->wandev.clocking) {
  630. printk(KERN_INFO
  631. "%s: Asynch. clocking must be 'Internal'n",
  632. wandev->name);
  633. kfree(chdlc_priv_area);
  634. return -EINVAL;
  635. }
  636. if((card->wandev.bps < MIN_ASY_BAUD_RATE) ||
  637. (card->wandev.bps > MAX_ASY_BAUD_RATE)) {
  638. printk(KERN_INFO "%s: Selected baud rate is invalid.n",
  639. wandev->name);
  640. printk(KERN_INFO "Must be between %u and %u bps.n",
  641. MIN_ASY_BAUD_RATE, MAX_ASY_BAUD_RATE);
  642. kfree(chdlc_priv_area);
  643. return -EINVAL;
  644. }
  645. card->u.c.api_options = 0;
  646.                 if (conf->asy_data_trans == WANOPT_YES) {
  647.                         card->u.c.api_options |= ASY_RX_DATA_TRANSPARENT;
  648.                 }
  649. card->u.c.protocol_options = 0;
  650. if (conf->rts_hs_for_receive == WANOPT_YES) {
  651. card->u.c.protocol_options |= ASY_RTS_HS_FOR_RX;
  652.         }
  653.                 if (conf->xon_xoff_hs_for_receive == WANOPT_YES) {
  654.                         card->u.c.protocol_options |= ASY_XON_XOFF_HS_FOR_RX;
  655.                 }
  656.                 if (conf->xon_xoff_hs_for_transmit == WANOPT_YES) {
  657.                         card->u.c.protocol_options |= ASY_XON_XOFF_HS_FOR_TX;
  658.                 }
  659.                 if (conf->dcd_hs_for_transmit == WANOPT_YES) {
  660.                         card->u.c.protocol_options |= ASY_DCD_HS_FOR_TX;
  661.                 }
  662.                 if (conf->cts_hs_for_transmit == WANOPT_YES) {
  663.                         card->u.c.protocol_options |= ASY_CTS_HS_FOR_TX;
  664.                 }
  665. card->u.c.tx_bits_per_char = conf->tx_bits_per_char;
  666.                 card->u.c.rx_bits_per_char = conf->rx_bits_per_char;
  667.                 card->u.c.stop_bits = conf->stop_bits;
  668. card->u.c.parity = conf->parity;
  669. card->u.c.break_timer = conf->break_timer;
  670. card->u.c.inter_char_timer = conf->inter_char_timer;
  671. card->u.c.rx_complete_length = conf->rx_complete_length;
  672. card->u.c.xon_char = conf->xon_char;
  673. } else { /* setup for synchronous mode */
  674. card->u.c.protocol_options = 0;
  675. if (conf->ignore_dcd == WANOPT_YES){
  676. card->u.c.protocol_options |= IGNORE_DCD_FOR_LINK_STAT;
  677. }
  678. if (conf->ignore_cts == WANOPT_YES){
  679. card->u.c.protocol_options |= IGNORE_CTS_FOR_LINK_STAT;
  680. }
  681. if (conf->ignore_keepalive == WANOPT_YES) {
  682. card->u.c.protocol_options |=
  683. IGNORE_KPALV_FOR_LINK_STAT;
  684. card->u.c.kpalv_tx  = MIN_Tx_KPALV_TIMER; 
  685. card->u.c.kpalv_rx  = MIN_Rx_KPALV_TIMER; 
  686. card->u.c.kpalv_err = MIN_KPALV_ERR_TOL; 
  687. } else {   /* Do not ignore keepalives */
  688. card->u.c.kpalv_tx =
  689. ((conf->keepalive_tx_tmr - MIN_Tx_KPALV_TIMER)
  690. >= 0) ?
  691.     min_t(unsigned int, conf->keepalive_tx_tmr,MAX_Tx_KPALV_TIMER) :
  692. DEFAULT_Tx_KPALV_TIMER;
  693. card->u.c.kpalv_rx =
  694.     ((conf->keepalive_rx_tmr - MIN_Rx_KPALV_TIMER)
  695. >= 0) ?
  696.     min_t(unsigned int, conf->keepalive_rx_tmr,MAX_Rx_KPALV_TIMER) :
  697. DEFAULT_Rx_KPALV_TIMER;
  698. card->u.c.kpalv_err =
  699.     ((conf->keepalive_err_margin-MIN_KPALV_ERR_TOL)
  700. >= 0) ?
  701.     min_t(unsigned int, conf->keepalive_err_margin,
  702. MAX_KPALV_ERR_TOL) : 
  703.     DEFAULT_KPALV_ERR_TOL;
  704. }
  705. /* Setup slarp timer to control delay between slarps */
  706. card->u.c.slarp_timer = 
  707. ((conf->slarp_timer - MIN_SLARP_REQ_TIMER) >= 0) ?
  708. min_t(unsigned int, conf->slarp_timer, MAX_SLARP_REQ_TIMER) :
  709. DEFAULT_SLARP_REQ_TIMER;
  710. #ifdef LINUX_2_0
  711. if (card->u.c.slarp_timer){
  712. printk(KERN_INFO 
  713. "%s: Error: Dynamic IP support not available for 2.0.X kernelsn",
  714. card->devname);
  715. printk(KERN_INFO "%s:        Defaulting to Static IP addressingn",
  716. card->devname);
  717. }
  718. card->u.c.slarp_timer=0;
  719. #endif
  720. if (conf->hdlc_streaming == WANOPT_YES) {
  721. printk(KERN_INFO "%s: Enabling HDLC STREAMING Moden",
  722. wandev->name);
  723. card->u.c.protocol_options = HDLC_STREAMING_MODE;
  724. }
  725. if ((chdlc_priv_area->true_if_encoding = conf->true_if_encoding) == WANOPT_YES){
  726. printk(KERN_INFO 
  727. "%s: Enabling, true interface type encoding.n",
  728. card->devname);
  729. }
  730.          /* Setup wanpipe as a router (WANPIPE) or as an API */
  731. if( strcmp(conf->usedby, "WANPIPE") == 0) {
  732. printk(KERN_INFO "%s: Running in WANPIPE mode!n",
  733. wandev->name);
  734. card->u.c.usedby = WANPIPE;
  735. /* Option to bring down the interface when 
  736.           * the link goes down */
  737. if (conf->if_down){
  738. set_bit(DYN_OPT_ON,&chdlc_priv_area->interface_down);
  739. printk(KERN_INFO 
  740.  "%s: Dynamic interface configuration enabledn",
  741.    card->devname);
  742. } else if( strcmp(conf->usedby, "API") == 0) {
  743. #if defined(LINUX_2_1) || defined(LINUX_2_4) 
  744. card->u.c.usedby = API;
  745. printk(KERN_INFO "%s: Running in API mode !n",
  746. wandev->name);
  747. #else
  748. printk(KERN_INFO "%s: API Mode is not supported for kernels lower than 2.2.X!n",
  749. wandev->name);
  750. printk(KERN_INFO "%s: Please upgrade to a 2.2.X kernel fro the API supportn",
  751. wandev->name);
  752.                 kfree(chdlc_priv_area);
  753. return -EINVAL;
  754. #endif
  755. }
  756. }
  757. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  758. /* Tells us that if this interface is a
  759.          * gateway or not */
  760. if ((chdlc_priv_area->gateway = conf->gateway) == WANOPT_YES){
  761. printk(KERN_INFO "%s: Interface %s is set as a gateway.n",
  762. card->devname,card->u.c.if_name);
  763. }
  764. #endif
  765. /* Get Multicast Information */
  766. chdlc_priv_area->mc = conf->mc;
  767. /* prepare network device data space for registration */
  768. #ifdef LINUX_2_4
  769. strcpy(dev->name,card->u.c.if_name);
  770. #else
  771. dev->name = (char *)kmalloc(strlen(card->u.c.if_name) + 2, GFP_KERNEL); 
  772. sprintf(dev->name, "%s", card->u.c.if_name);
  773. #endif
  774. dev->init = &if_init;
  775. dev->priv = chdlc_priv_area;
  776. /* Initialize the polling task routine */
  777. #ifndef LINUX_2_4
  778. chdlc_priv_area->poll_task.next = NULL;
  779. #endif
  780. chdlc_priv_area->poll_task.sync=0;
  781. chdlc_priv_area->poll_task.routine = (void*)(void*)chdlc_poll;
  782. chdlc_priv_area->poll_task.data = dev;
  783. /* Initialize the polling delay timer */
  784. init_timer(&chdlc_priv_area->poll_delay_timer);
  785. chdlc_priv_area->poll_delay_timer.data = (unsigned long)dev;
  786. chdlc_priv_area->poll_delay_timer.function = chdlc_poll_delay;
  787. printk(KERN_INFO "n");
  788. return 0;
  789. }
  790. /****** Network Device Interface ********************************************/
  791. /*============================================================================
  792.  * Initialize Linux network interface.
  793.  *
  794.  * This routine is called only once for each interface, during Linux network
  795.  * interface registration.  Returning anything but zero will fail interface
  796.  * registration.
  797.  */
  798. static int if_init (netdevice_t* dev)
  799. {
  800. chdlc_private_area_t* chdlc_priv_area = dev->priv;
  801. sdla_t* card = chdlc_priv_area->card;
  802. wan_device_t* wandev = &card->wandev;
  803. #ifdef LINUX_2_0
  804. int i;
  805. #endif
  806. /* Initialize device driver entry points */
  807. dev->open = &if_open;
  808. dev->stop = &if_close;
  809. dev->hard_header = &if_header;
  810. dev->rebuild_header = &if_rebuild_hdr;
  811. dev->hard_start_xmit = &if_send;
  812. dev->get_stats = &if_stats;
  813. #ifdef LINUX_2_4
  814. dev->tx_timeout = &if_tx_timeout;
  815. dev->watchdog_timeo = TX_TIMEOUT;
  816. #endif
  817. /* Initialize media-specific parameters */
  818. dev->flags |= IFF_POINTOPOINT;
  819. dev->flags |= IFF_NOARP;
  820. /* Enable Mulitcasting if user selected */
  821. if (chdlc_priv_area->mc == WANOPT_YES){
  822. dev->flags  |= IFF_MULTICAST;
  823. }
  824. #ifdef LINUX_2_0
  825. dev->family = AF_INET;
  826. #endif
  827. if (chdlc_priv_area->true_if_encoding){
  828. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  829. dev->type = ARPHRD_HDLC; /* This breaks the tcpdump */
  830. #else
  831. dev->type = ARPHRD_PPP;
  832. #endif
  833. }else{
  834. dev->type = ARPHRD_PPP;
  835. }
  836. dev->mtu = card->wandev.mtu;
  837. /* for API usage, add the API header size to the requested MTU size */
  838. if(card->u.c.usedby == API) {
  839. dev->mtu += sizeof(api_tx_hdr_t);
  840. }
  841.  
  842. dev->hard_header_len = CHDLC_HDR_LEN;
  843. /* Initialize hardware parameters */
  844. dev->irq = wandev->irq;
  845. dev->dma = wandev->dma;
  846. dev->base_addr = wandev->ioport;
  847. dev->mem_start = wandev->maddr;
  848. dev->mem_end = wandev->maddr + wandev->msize - 1;
  849. /* Set transmit buffer queue length 
  850.  * If too low packets will not be retransmitted 
  851.          * by stack.
  852.  */
  853.         dev->tx_queue_len = 100;
  854.    
  855. /* Initialize socket buffers */
  856. #if !defined(LINUX_2_1) && !defined(LINUX_2_4)
  857.         for (i = 0; i < DEV_NUMBUFFS; ++i)
  858.                 skb_queue_head_init(&dev->buffs[i]);
  859. #endif
  860. return 0;
  861. }
  862. /*============================================================================
  863.  * Open network interface.
  864.  * o enable communications and interrupts.
  865.  * o prevent module from unloading by incrementing use count
  866.  *
  867.  * Return 0 if O.k. or errno.
  868.  */
  869. static int if_open (netdevice_t* dev)
  870. {
  871. chdlc_private_area_t* chdlc_priv_area = dev->priv;
  872. sdla_t* card = chdlc_priv_area->card;
  873. struct timeval tv;
  874. int err = 0;
  875. /* Only one open per interface is allowed */
  876. if (is_dev_running(dev))
  877. return -EBUSY;
  878. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  879. /* Initialize the task queue */
  880. chdlc_priv_area->tq_working=0;
  881. #ifndef LINUX_2_4
  882. chdlc_priv_area->common.wanpipe_task.next = NULL;
  883. #endif
  884. chdlc_priv_area->common.wanpipe_task.sync = 0;
  885. chdlc_priv_area->common.wanpipe_task.routine = (void *)(void *)chdlc_bh;
  886. chdlc_priv_area->common.wanpipe_task.data = dev;
  887. /* Allocate and initialize BH circular buffer */
  888. /* Add 1 to MAX_BH_BUFF so we don't have test with (MAX_BH_BUFF-1) */
  889. chdlc_priv_area->bh_head = kmalloc((sizeof(bh_data_t)*(MAX_BH_BUFF+1)),GFP_ATOMIC);
  890. memset(chdlc_priv_area->bh_head,0,(sizeof(bh_data_t)*(MAX_BH_BUFF+1)));
  891. atomic_set(&chdlc_priv_area->bh_buff_used, 0);
  892. #endif
  893.  
  894. do_gettimeofday(&tv);
  895. chdlc_priv_area->router_start_time = tv.tv_sec;
  896. #ifdef LINUX_2_4
  897. netif_start_queue(dev);
  898. #else
  899. dev->interrupt = 0;
  900. dev->tbusy = 0;
  901. dev->start = 1;
  902. #endif
  903. wanpipe_open(card);
  904. /* TTY is configured during wanpipe_set_termios
  905.  * call, not here */
  906. if (card->tty_opt)
  907. return err;
  908. set_bit(0,&chdlc_priv_area->config_chdlc);
  909. chdlc_priv_area->config_chdlc_timeout=jiffies;
  910. del_timer(&chdlc_priv_area->poll_delay_timer);
  911. /* Start the CHDLC configuration after 1sec delay.
  912.  * This will give the interface initilization time
  913.  * to finish its configuration */
  914. chdlc_priv_area->poll_delay_timer.expires=jiffies+HZ;
  915. add_timer(&chdlc_priv_area->poll_delay_timer);
  916. return err;
  917. }
  918. /*============================================================================
  919.  * Close network interface.
  920.  * o if this is the last close, then disable communications and interrupts.
  921.  * o reset flags.
  922.  */
  923. static int if_close (netdevice_t* dev)
  924. {
  925. chdlc_private_area_t* chdlc_priv_area = dev->priv;
  926. sdla_t* card = chdlc_priv_area->card;
  927. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  928. if (chdlc_priv_area->bh_head){
  929. int i;
  930. struct sk_buff *skb;
  931. for (i=0; i<(MAX_BH_BUFF+1); i++){
  932. skb = ((bh_data_t *)&chdlc_priv_area->bh_head[i])->skb;
  933. if (skb != NULL){
  934.                  wan_dev_kfree_skb(skb, FREE_READ);
  935. }
  936. }
  937. kfree(chdlc_priv_area->bh_head);
  938. chdlc_priv_area->bh_head=NULL;
  939. }
  940. #endif
  941. stop_net_queue(dev);
  942. #ifndef LINUX_2_4
  943. dev->start=0;
  944. #endif
  945. wanpipe_close(card);
  946. del_timer(&chdlc_priv_area->poll_delay_timer);
  947. return 0;
  948. }
  949. static void disable_comm (sdla_t *card)
  950. {
  951. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  952. if (card->u.c.comm_enabled){
  953. chdlc_disable_comm_shutdown (card);
  954. }else{
  955. flags->interrupt_info_struct.interrupt_permission = 0;
  956. }
  957. #if defined(LINUX_2_4) || defined(LINUX_2_1)
  958. if (!tty_init_cnt)
  959. return;
  960. if (card->tty_opt){
  961. struct serial_state * state;
  962. if (!(--tty_init_cnt)){
  963. int e1,e2;
  964. *serial_driver.refcount=0;
  965. if ((e1 = tty_unregister_driver(&serial_driver)))
  966. printk("SERIAL: failed to unregister serial driver (%d)n",
  967.        e1);
  968. if ((e2 = tty_unregister_driver(&callout_driver)))
  969. printk("SERIAL: failed to unregister callout driver (%d)n", 
  970.        e2);
  971. printk(KERN_INFO "%s: Unregistering TTY Driver, Major %in",
  972. card->devname,WAN_TTY_MAJOR);
  973. }
  974. card->tty=NULL;
  975. tty_card_map[card->tty_minor]=NULL;
  976. state = &rs_table[card->tty_minor];
  977. memset(state,0,sizeof(state));
  978. }
  979. #endif
  980. return;
  981. }
  982. /*============================================================================
  983.  * Build media header.
  984.  *
  985.  * The trick here is to put packet type (Ethertype) into 'protocol' field of
  986.  * the socket buffer, so that we don't forget it.  If packet type is not
  987.  * supported, set skb->protocol to 0 and discard packet later.
  988.  *
  989.  * Return: media header length.
  990.  */
  991. static int if_header (struct sk_buff* skb, netdevice_t* dev,
  992. unsigned short type, void* daddr, void* saddr, unsigned len)
  993. {
  994. skb->protocol = htons(type);
  995. return CHDLC_HDR_LEN;
  996. }
  997. #ifdef LINUX_2_4
  998. /*============================================================================
  999.  * Handle transmit timeout event from netif watchdog
  1000.  */
  1001. static void if_tx_timeout (netdevice_t *dev)
  1002. {
  1003.      chdlc_private_area_t* chan = dev->priv;
  1004. sdla_t *card = chan->card;
  1005. /* If our device stays busy for at least 5 seconds then we will
  1006.  * kick start the device by making dev->tbusy = 0.  We expect
  1007.  * that our device never stays busy more than 5 seconds. So this                 
  1008.  * is only used as a last resort.
  1009.  */
  1010. ++card->wandev.stats.collisions;
  1011. printk (KERN_INFO "%s: Transmit timed out on %sn", card->devname,dev->name);
  1012. netif_wake_queue (dev);
  1013. }
  1014. #endif
  1015. /*============================================================================
  1016.  * Re-build media header.
  1017.  *
  1018.  * Return: 1 physical address resolved.
  1019.  * 0 physical address not resolved
  1020.  */
  1021. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1022. static int if_rebuild_hdr (struct sk_buff *skb)
  1023. {
  1024. return 1;
  1025. }
  1026. #else
  1027. static int if_rebuild_hdr (void* hdr, netdevice_t* dev, unsigned long raddr,
  1028.                            struct sk_buff* skb)
  1029. {
  1030.         return 1;
  1031. }
  1032. #endif
  1033. /*============================================================================
  1034.  * Send a packet on a network interface.
  1035.  * o set tbusy flag (marks start of the transmission) to block a timer-based
  1036.  *   transmit from overlapping.
  1037.  * o check link state. If link is not up, then drop the packet.
  1038.  * o execute adapter send command.
  1039.  * o free socket buffer
  1040.  *
  1041.  * Return: 0 complete (socket buffer must be freed)
  1042.  * non-0 packet may be re-transmitted (tbusy must be set)
  1043.  *
  1044.  * Notes:
  1045.  * 1. This routine is called either by the protocol stack or by the "net
  1046.  *    bottom half" (with interrupts enabled).
  1047.  * 2. Setting tbusy flag will inhibit further transmit requests from the
  1048.  *    protocol stack and can be used for flow control with protocol layer.
  1049.  */
  1050. static int if_send (struct sk_buff* skb, netdevice_t* dev)
  1051. {
  1052. chdlc_private_area_t *chdlc_priv_area = dev->priv;
  1053. sdla_t *card = chdlc_priv_area->card;
  1054. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  1055. INTERRUPT_INFORMATION_STRUCT *chdlc_int = &flags->interrupt_info_struct;
  1056. int udp_type = 0;
  1057. unsigned long smp_flags;
  1058. int err=0;
  1059. #ifdef LINUX_2_4
  1060. netif_stop_queue(dev);
  1061. #endif
  1062. if (skb == NULL){
  1063. /* If we get here, some higher layer thinks we've missed an
  1064.  * tx-done interrupt.
  1065.  */
  1066. printk(KERN_INFO "%s: interface %s got kicked!n",
  1067. card->devname, dev->name);
  1068. wake_net_dev(dev);
  1069. return 0;
  1070. }
  1071. #ifndef LINUX_2_4
  1072. if (dev->tbusy){
  1073. /* If our device stays busy for at least 5 seconds then we will
  1074.  * kick start the device by making dev->tbusy = 0.  We expect 
  1075.  * that our device never stays busy more than 5 seconds. So this
  1076.  * is only used as a last resort. 
  1077.  */
  1078.                 ++card->wandev.stats.collisions;
  1079. if((jiffies - chdlc_priv_area->tick_counter) < (5 * HZ)) {
  1080. return 1;
  1081. }
  1082. printk (KERN_INFO "%s: Transmit timeout !n",
  1083. card->devname);
  1084. /* unbusy the interface */
  1085. clear_bit(0,&dev->tbusy);
  1086. }
  1087. #endif
  1088.     if (ntohs(skb->protocol) != htons(PVC_PROT)){
  1089. /* check the udp packet type */
  1090. udp_type = udp_pkt_type(skb, card);
  1091. if (udp_type == UDP_CPIPE_TYPE){
  1092.                         if(store_udp_mgmt_pkt(UDP_PKT_FRM_STACK, card, skb, dev,
  1093.                                 chdlc_priv_area)){
  1094.                  chdlc_int->interrupt_permission |=
  1095. APP_INT_ON_TIMER;
  1096. }
  1097. start_net_queue(dev);
  1098. return 0;
  1099. }
  1100. /* check to see if the source IP address is a broadcast or */
  1101. /* multicast IP address */
  1102.                 if(chk_bcast_mcast_addr(card, dev, skb)){
  1103. ++card->wandev.stats.tx_dropped;
  1104. wan_dev_kfree_skb(skb,FREE_WRITE);
  1105. start_net_queue(dev);
  1106. return 0;
  1107. }
  1108.         }
  1109. /* Lock the 508 Card: SMP is supported */
  1110.        if(card->hw.type != SDLA_S514){
  1111. s508_lock(card,&smp_flags);
  1112.      if(test_and_set_bit(SEND_CRIT, (void*)&card->wandev.critical)) {
  1113. printk(KERN_INFO "%s: Critical in if_send: %lxn",
  1114. card->wandev.name,card->wandev.critical);
  1115.                 ++card->wandev.stats.tx_dropped;
  1116. start_net_queue(dev);
  1117. goto if_send_exit_crit;
  1118. }
  1119. if(card->u.c.state != WAN_CONNECTED){
  1120.         ++card->wandev.stats.tx_dropped;
  1121. start_net_queue(dev);
  1122. }else if(!skb->protocol){
  1123.          ++card->wandev.stats.tx_errors;
  1124. start_net_queue(dev);
  1125. }else {
  1126. void* data = skb->data;
  1127. unsigned len = skb->len;
  1128. unsigned char attr;
  1129. /* If it's an API packet pull off the API
  1130.  * header. Also check that the packet size
  1131.  * is larger than the API header
  1132.          */
  1133. if (card->u.c.usedby == API){
  1134. api_tx_hdr_t* api_tx_hdr;
  1135. /* discard the frame if we are configured for */
  1136. /* 'receive only' mode or if there is no data */
  1137. if (card->u.c.receive_only ||
  1138. (len <= sizeof(api_tx_hdr_t))) {
  1139. ++card->wandev.stats.tx_dropped;
  1140. start_net_queue(dev);
  1141. goto if_send_exit_crit;
  1142. }
  1143. api_tx_hdr = (api_tx_hdr_t *)data;
  1144. attr = api_tx_hdr->attr;
  1145. data += sizeof(api_tx_hdr_t);
  1146. len -= sizeof(api_tx_hdr_t);
  1147. }
  1148. if(chdlc_send(card, data, len)) {
  1149. stop_net_queue(dev);
  1150. }else{
  1151. ++card->wandev.stats.tx_packets;
  1152. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1153.                         card->wandev.stats.tx_bytes += len;
  1154. #endif
  1155. start_net_queue(dev);
  1156. #ifdef LINUX_2_4
  1157.   dev->trans_start = jiffies;
  1158. #endif
  1159. }
  1160. }
  1161. if_send_exit_crit:
  1162. if (!(err=is_queue_stopped(dev))) {
  1163. wan_dev_kfree_skb(skb, FREE_WRITE);
  1164. }else{
  1165. chdlc_priv_area->tick_counter = jiffies;
  1166. chdlc_int->interrupt_permission |= APP_INT_ON_TX_FRAME;
  1167. }
  1168. clear_bit(SEND_CRIT, (void*)&card->wandev.critical);
  1169. if(card->hw.type != SDLA_S514){
  1170. s508_unlock(card,&smp_flags);
  1171. }
  1172. return err;
  1173. }
  1174. /*============================================================================
  1175.  * Check to see if the packet to be transmitted contains a broadcast or
  1176.  * multicast source IP address.
  1177.  */
  1178. static int chk_bcast_mcast_addr(sdla_t *card, netdevice_t* dev,
  1179. struct sk_buff *skb)
  1180. {
  1181. u32 src_ip_addr;
  1182.         u32 broadcast_ip_addr = 0;
  1183. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1184.         struct in_device *in_dev;
  1185. #endif
  1186.         /* read the IP source address from the outgoing packet */
  1187.         src_ip_addr = *(u32 *)(skb->data + 12);
  1188. /* read the IP broadcast address for the device */
  1189. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1190.         in_dev = dev->ip_ptr;
  1191.         if(in_dev != NULL) {
  1192.                 struct in_ifaddr *ifa= in_dev->ifa_list;
  1193.                 if(ifa != NULL)
  1194.                         broadcast_ip_addr = ifa->ifa_broadcast;
  1195.                 else
  1196.                         return 0;
  1197.         }
  1198. #else
  1199.         broadcast_ip_addr = dev->pa_brdaddr;
  1200. #endif
  1201.  
  1202.         /* check if the IP Source Address is a Broadcast address */
  1203.         if((dev->flags & IFF_BROADCAST) && (src_ip_addr == broadcast_ip_addr)) {
  1204.                 printk(KERN_INFO "%s: Broadcast Source Address silently discardedn",
  1205. card->devname);
  1206.                 return 1;
  1207.         } 
  1208.         /* check if the IP Source Address is a Multicast address */
  1209.         if((ntohl(src_ip_addr) >= 0xE0000001) &&
  1210. (ntohl(src_ip_addr) <= 0xFFFFFFFE)) {
  1211.                 printk(KERN_INFO "%s: Multicast Source Address silently discardedn",
  1212. card->devname);
  1213.                 return 1;
  1214.         }
  1215.         return 0;
  1216. }
  1217. /*============================================================================
  1218.  * Reply to UDP Management system.
  1219.  * Return length of reply.
  1220.  */
  1221. static int reply_udp( unsigned char *data, unsigned int mbox_len )
  1222. {
  1223. unsigned short len, udp_length, temp, ip_length;
  1224. unsigned long ip_temp;
  1225. int even_bound = 0;
  1226.    chdlc_udp_pkt_t *c_udp_pkt = (chdlc_udp_pkt_t *)data;
  1227.  
  1228. /* Set length of packet */
  1229. len = sizeof(ip_pkt_t)+ 
  1230.       sizeof(udp_pkt_t)+
  1231.       sizeof(wp_mgmt_t)+
  1232.       sizeof(cblock_t)+
  1233.       sizeof(trace_info_t)+ 
  1234.       mbox_len;
  1235. /* fill in UDP reply */
  1236. c_udp_pkt->wp_mgmt.request_reply = UDPMGMT_REPLY;
  1237.    
  1238. /* fill in UDP length */
  1239. udp_length = sizeof(udp_pkt_t)+ 
  1240.      sizeof(wp_mgmt_t)+
  1241.      sizeof(cblock_t)+
  1242.              sizeof(trace_info_t)+
  1243.      mbox_len; 
  1244.   /* put it on an even boundary */
  1245. if ( udp_length & 0x0001 ) {
  1246. udp_length += 1;
  1247. len += 1;
  1248. even_bound = 1;
  1249. }  
  1250. temp = (udp_length<<8)|(udp_length>>8);
  1251. c_udp_pkt->udp_pkt.udp_length = temp;
  1252.  
  1253. /* swap UDP ports */
  1254. temp = c_udp_pkt->udp_pkt.udp_src_port;
  1255. c_udp_pkt->udp_pkt.udp_src_port = 
  1256. c_udp_pkt->udp_pkt.udp_dst_port; 
  1257. c_udp_pkt->udp_pkt.udp_dst_port = temp;
  1258. /* add UDP pseudo header */
  1259. temp = 0x1100;
  1260. *((unsigned short *)(c_udp_pkt->data+mbox_len+even_bound)) = temp;
  1261. temp = (udp_length<<8)|(udp_length>>8);
  1262. *((unsigned short *)(c_udp_pkt->data+mbox_len+even_bound+2)) = temp;
  1263.  
  1264. /* calculate UDP checksum */
  1265. c_udp_pkt->udp_pkt.udp_checksum = 0;
  1266. c_udp_pkt->udp_pkt.udp_checksum = calc_checksum(&data[UDP_OFFSET],udp_length+UDP_OFFSET);
  1267. /* fill in IP length */
  1268. ip_length = len;
  1269. temp = (ip_length<<8)|(ip_length>>8);
  1270. c_udp_pkt->ip_pkt.total_length = temp;
  1271.   
  1272. /* swap IP addresses */
  1273. ip_temp = c_udp_pkt->ip_pkt.ip_src_address;
  1274. c_udp_pkt->ip_pkt.ip_src_address = c_udp_pkt->ip_pkt.ip_dst_address;
  1275. c_udp_pkt->ip_pkt.ip_dst_address = ip_temp;
  1276. /* fill in IP checksum */
  1277. c_udp_pkt->ip_pkt.hdr_checksum = 0;
  1278. c_udp_pkt->ip_pkt.hdr_checksum = calc_checksum(data,sizeof(ip_pkt_t));
  1279. return len;
  1280. } /* reply_udp */
  1281. unsigned short calc_checksum (char *data, int len)
  1282. {
  1283. unsigned short temp; 
  1284. unsigned long sum=0;
  1285. int i;
  1286. for( i = 0; i <len; i+=2 ) {
  1287. memcpy(&temp,&data[i],2);
  1288. sum += (unsigned long)temp;
  1289. }
  1290. while (sum >> 16 ) {
  1291. sum = (sum & 0xffffUL) + (sum >> 16);
  1292. }
  1293. temp = (unsigned short)sum;
  1294. temp = ~temp;
  1295. if( temp == 0 ) 
  1296. temp = 0xffff;
  1297. return temp;
  1298. }
  1299. /*============================================================================
  1300.  * Get ethernet-style interface statistics.
  1301.  * Return a pointer to struct enet_statistics.
  1302.  */
  1303. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1304. static struct net_device_stats* if_stats (netdevice_t* dev)
  1305. {
  1306. sdla_t *my_card;
  1307. chdlc_private_area_t* chdlc_priv_area;
  1308. if ((chdlc_priv_area=dev->priv) == NULL)
  1309. return NULL;
  1310. my_card = chdlc_priv_area->card;
  1311. return &my_card->wandev.stats; 
  1312. }
  1313. #else
  1314. static struct enet_statistics* if_stats (netdevice_t* dev)
  1315. {
  1316.         sdla_t *my_card;
  1317.         chdlc_private_area_t* chdlc_priv_area = dev->priv;
  1318. if ((chdlc_priv_area=dev->priv) == NULL)
  1319. return NULL;
  1320.         my_card = chdlc_priv_area->card;
  1321.         return &my_card->wandev.stats;
  1322. }
  1323. #endif
  1324. /****** Cisco HDLC Firmware Interface Functions *******************************/
  1325. /*============================================================================
  1326.  * Read firmware code version.
  1327.  * Put code version as ASCII string in str. 
  1328.  */
  1329. static int chdlc_read_version (sdla_t* card, char* str)
  1330. {
  1331. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1332. int len;
  1333. char err;
  1334. mb->buffer_length = 0;
  1335. mb->command = READ_CHDLC_CODE_VERSION;
  1336. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1337. if(err != COMMAND_OK) {
  1338. chdlc_error(card,err,mb);
  1339. }
  1340. else if (str) {  /* is not null */
  1341. len = mb->buffer_length;
  1342. memcpy(str, mb->data, len);
  1343. str[len] = '';
  1344. }
  1345. return (err);
  1346. }
  1347. /*-----------------------------------------------------------------------------
  1348.  *  Configure CHDLC firmware.
  1349.  */
  1350. static int chdlc_configure (sdla_t* card, void* data)
  1351. {
  1352. int err;
  1353. CHDLC_MAILBOX_STRUCT *mailbox = card->mbox;
  1354. int data_length = sizeof(CHDLC_CONFIGURATION_STRUCT);
  1355. mailbox->buffer_length = data_length;  
  1356. memcpy(mailbox->data, data, data_length);
  1357. mailbox->command = SET_CHDLC_CONFIGURATION;
  1358. err = sdla_exec(mailbox) ? mailbox->return_code : CMD_TIMEOUT;
  1359. if (err != COMMAND_OK) chdlc_error (card, err, mailbox);
  1360.                            
  1361. return err;
  1362. }
  1363. /*============================================================================
  1364.  * Set interrupt mode -- HDLC Version.
  1365.  */
  1366. static int chdlc_set_intr_mode (sdla_t* card, unsigned mode)
  1367. {
  1368. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1369. CHDLC_INT_TRIGGERS_STRUCT* int_data =
  1370.  (CHDLC_INT_TRIGGERS_STRUCT *)mb->data;
  1371. int err;
  1372. int_data->CHDLC_interrupt_triggers  = mode;
  1373. int_data->IRQ = card->hw.irq;
  1374. int_data->interrupt_timer               = 1;
  1375.    
  1376. mb->buffer_length = sizeof(CHDLC_INT_TRIGGERS_STRUCT);
  1377. mb->command = SET_CHDLC_INTERRUPT_TRIGGERS;
  1378. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1379. if (err != COMMAND_OK)
  1380. chdlc_error (card, err, mb);
  1381. return err;
  1382. }
  1383. /*===========================================================
  1384.  * chdlc_disable_comm_shutdown
  1385.  *
  1386.  * Shutdown() disables the communications. We must
  1387.  * have a sparate functions, because we must not
  1388.  * call chdlc_error() hander since the private
  1389.  * area has already been replaced */
  1390. static int chdlc_disable_comm_shutdown (sdla_t *card)
  1391. {
  1392. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1393. CHDLC_INT_TRIGGERS_STRUCT* int_data =
  1394.  (CHDLC_INT_TRIGGERS_STRUCT *)mb->data;
  1395. int err;
  1396. /* Disable Interrutps */
  1397. int_data->CHDLC_interrupt_triggers  = 0;
  1398. int_data->IRQ = card->hw.irq;
  1399. int_data->interrupt_timer               = 1;
  1400.    
  1401. mb->buffer_length = sizeof(CHDLC_INT_TRIGGERS_STRUCT);
  1402. mb->command = SET_CHDLC_INTERRUPT_TRIGGERS;
  1403. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1404. /* Disable Communications */
  1405. if (card->u.c.async_mode) {
  1406. mb->command = DISABLE_ASY_COMMUNICATIONS;
  1407. }else{
  1408. mb->command = DISABLE_CHDLC_COMMUNICATIONS;
  1409. }
  1410. mb->buffer_length = 0;
  1411. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1412. card->u.c.comm_enabled = 0;
  1413. return 0;
  1414. }
  1415. /*============================================================================
  1416.  * Enable communications.
  1417.  */
  1418. static int chdlc_comm_enable (sdla_t* card)
  1419. {
  1420. int err;
  1421. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1422. mb->buffer_length = 0;
  1423. mb->command = ENABLE_CHDLC_COMMUNICATIONS;
  1424. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1425. if (err != COMMAND_OK)
  1426. chdlc_error(card, err, mb);
  1427. else
  1428. card->u.c.comm_enabled = 1;
  1429. return err;
  1430. }
  1431. /*============================================================================
  1432.  * Read communication error statistics.
  1433.  */
  1434. static int chdlc_read_comm_err_stats (sdla_t* card)
  1435. {
  1436.         int err;
  1437.         CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1438.         mb->buffer_length = 0;
  1439.         mb->command = READ_COMMS_ERROR_STATS;
  1440.         err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1441.         if (err != COMMAND_OK)
  1442.                 chdlc_error(card,err,mb);
  1443.         return err;
  1444. }
  1445. /*============================================================================
  1446.  * Read CHDLC operational statistics.
  1447.  */
  1448. static int chdlc_read_op_stats (sdla_t* card)
  1449. {
  1450.         int err;
  1451.         CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1452.         mb->buffer_length = 0;
  1453.         mb->command = READ_CHDLC_OPERATIONAL_STATS;
  1454.         err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1455.         if (err != COMMAND_OK)
  1456.                 chdlc_error(card,err,mb);
  1457.         return err;
  1458. }
  1459. /*============================================================================
  1460.  * Update communications error and general packet statistics.
  1461.  */
  1462. static int update_comms_stats(sdla_t* card,
  1463. chdlc_private_area_t* chdlc_priv_area)
  1464. {
  1465.         CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1466.    COMMS_ERROR_STATS_STRUCT* err_stats;
  1467.         CHDLC_OPERATIONAL_STATS_STRUCT *op_stats;
  1468. /* on the first timer interrupt, read the comms error statistics */
  1469. if(chdlc_priv_area->update_comms_stats == 2) {
  1470. if(chdlc_read_comm_err_stats(card))
  1471. return 1;
  1472. err_stats = (COMMS_ERROR_STATS_STRUCT *)mb->data;
  1473. card->wandev.stats.rx_over_errors = 
  1474. err_stats->Rx_overrun_err_count;
  1475. card->wandev.stats.rx_crc_errors = 
  1476. err_stats->CRC_err_count;
  1477. card->wandev.stats.rx_frame_errors = 
  1478. err_stats->Rx_abort_count;
  1479. card->wandev.stats.rx_fifo_errors = 
  1480. err_stats->Rx_dis_pri_bfrs_full_count; 
  1481. card->wandev.stats.rx_missed_errors =
  1482. card->wandev.stats.rx_fifo_errors;
  1483. card->wandev.stats.tx_aborted_errors =
  1484. err_stats->sec_Tx_abort_count;
  1485. }
  1486.         /* on the second timer interrupt, read the operational statistics */
  1487. else {
  1488.          if(chdlc_read_op_stats(card))
  1489.                  return 1;
  1490. op_stats = (CHDLC_OPERATIONAL_STATS_STRUCT *)mb->data;
  1491. card->wandev.stats.rx_length_errors =
  1492. (op_stats->Rx_Data_discard_short_count +
  1493. op_stats->Rx_Data_discard_long_count);
  1494. }
  1495. return 0;
  1496. }
  1497. /*============================================================================
  1498.  * Send packet.
  1499.  * Return: 0 - o.k.
  1500.  * 1 - no transmit buffers available
  1501.  */
  1502. static int chdlc_send (sdla_t* card, void* data, unsigned len)
  1503. {
  1504. CHDLC_DATA_TX_STATUS_EL_STRUCT *txbuf = card->u.c.txbuf;
  1505. if (txbuf->opp_flag)
  1506. return 1;
  1507. sdla_poke(&card->hw, txbuf->ptr_data_bfr, data, len);
  1508. txbuf->frame_length = len;
  1509. txbuf->opp_flag = 1; /* start transmission */
  1510. /* Update transmit buffer control fields */
  1511. card->u.c.txbuf = ++txbuf;
  1512. if ((void*)txbuf > card->u.c.txbuf_last)
  1513. card->u.c.txbuf = card->u.c.txbuf_base;
  1514. return 0;
  1515. }
  1516. /****** Firmware Error Handler **********************************************/
  1517. /*============================================================================
  1518.  * Firmware error handler.
  1519.  * This routine is called whenever firmware command returns non-zero
  1520.  * return code.
  1521.  *
  1522.  * Return zero if previous command has to be cancelled.
  1523.  */
  1524. static int chdlc_error (sdla_t *card, int err, CHDLC_MAILBOX_STRUCT *mb)
  1525. {
  1526. unsigned cmd = mb->command;
  1527. switch (err) {
  1528. case CMD_TIMEOUT:
  1529. printk(KERN_INFO "%s: command 0x%02X timed out!n",
  1530. card->devname, cmd);
  1531. break;
  1532. case S514_BOTH_PORTS_SAME_CLK_MODE:
  1533. if(cmd == SET_CHDLC_CONFIGURATION) {
  1534. printk(KERN_INFO
  1535.  "%s: Configure both ports for the same clock sourcen",
  1536. card->devname);
  1537. break;
  1538. }
  1539. default:
  1540. printk(KERN_INFO "%s: command 0x%02X returned 0x%02X!n",
  1541. card->devname, cmd, err);
  1542. }
  1543. return 0;
  1544. }
  1545. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1546. /********** Bottom Half Handlers ********************************************/
  1547. /* NOTE: There is no API, BH support for Kernels lower than 2.2.X.
  1548.  *       DO NOT INSERT ANY CODE HERE, NOTICE THE 
  1549.  *       PREPROCESSOR STATEMENT ABOVE, UNLESS YOU KNOW WHAT YOU ARE
  1550.  *       DOING */
  1551. static void chdlc_bh (netdevice_t * dev)
  1552. {
  1553. chdlc_private_area_t* chan = dev->priv;
  1554. sdla_t *card = chan->card;
  1555. struct sk_buff *skb;
  1556. if (atomic_read(&chan->bh_buff_used) == 0){
  1557. clear_bit(0, &chan->tq_working);
  1558. return;
  1559. }
  1560. while (atomic_read(&chan->bh_buff_used)){
  1561. skb  = ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb;
  1562. if (skb != NULL){
  1563. if (chan->common.sk == NULL || chan->common.func == NULL){
  1564. ++card->wandev.stats.rx_dropped;
  1565. wan_dev_kfree_skb(skb, FREE_READ);
  1566. chdlc_bh_cleanup(dev);
  1567. continue;
  1568. }
  1569. if (chan->common.func(skb,dev,chan->common.sk) != 0){
  1570. /* Sock full cannot send, queue us for another
  1571.                                  * try */
  1572. atomic_set(&chan->common.receive_block,1);
  1573. return;
  1574. }else{
  1575. chdlc_bh_cleanup(dev);
  1576. }
  1577. }else{
  1578. chdlc_bh_cleanup(dev);
  1579. }
  1580. }
  1581. clear_bit(0, &chan->tq_working);
  1582. return;
  1583. }
  1584. static int chdlc_bh_cleanup (netdevice_t *dev)
  1585. {
  1586. chdlc_private_area_t* chan = dev->priv;
  1587. ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb = NULL;
  1588. if (chan->bh_read == MAX_BH_BUFF){
  1589. chan->bh_read=0;
  1590. }else{
  1591. ++chan->bh_read;
  1592. }
  1593. atomic_dec(&chan->bh_buff_used);
  1594. return 0;
  1595. }
  1596. static int bh_enqueue (netdevice_t *dev, struct sk_buff *skb)
  1597. {
  1598. /* Check for full */
  1599. chdlc_private_area_t* chan = dev->priv;
  1600. sdla_t *card = chan->card;
  1601. if (atomic_read(&chan->bh_buff_used) == (MAX_BH_BUFF+1)){
  1602. ++card->wandev.stats.rx_dropped;
  1603. wan_dev_kfree_skb(skb, FREE_READ);
  1604. return 1; 
  1605. }
  1606. ((bh_data_t *)&chan->bh_head[chan->bh_write])->skb = skb;
  1607. if (chan->bh_write == MAX_BH_BUFF){
  1608. chan->bh_write=0;
  1609. }else{
  1610. ++chan->bh_write;
  1611. }
  1612. atomic_inc(&chan->bh_buff_used);
  1613. return 0;
  1614. }
  1615. /* END OF API BH Support */
  1616. #endif
  1617. /****** Interrupt Handlers **************************************************/
  1618. /*============================================================================
  1619.  * Cisco HDLC interrupt service routine.
  1620.  */
  1621. static void wpc_isr (sdla_t* card)
  1622. {
  1623. netdevice_t* dev;
  1624. SHARED_MEMORY_INFO_STRUCT* flags = NULL;
  1625. int i;
  1626. sdla_t *my_card;
  1627. /* Check for which port the interrupt has been generated
  1628.  * Since Secondary Port is piggybacking on the Primary
  1629.          * the check must be done here. 
  1630.  */
  1631. flags = card->u.c.flags;
  1632. if (!flags->interrupt_info_struct.interrupt_type){
  1633. /* Check for a second port (piggybacking) */
  1634. if ((my_card = card->next)){
  1635. flags = my_card->u.c.flags;
  1636. if (flags->interrupt_info_struct.interrupt_type){
  1637. card = my_card;
  1638. card->isr(card);
  1639. return;
  1640. }
  1641. }
  1642. }
  1643. flags = card->u.c.flags;
  1644. card->in_isr = 1;
  1645. dev = card->wandev.dev;
  1646. /* If we get an interrupt with no network device, stop the interrupts
  1647.  * and issue an error */
  1648. if (!card->tty_opt && !dev && 
  1649.     flags->interrupt_info_struct.interrupt_type != 
  1650.      COMMAND_COMPLETE_APP_INT_PEND){
  1651. goto isr_done;
  1652. }
  1653. /* if critical due to peripheral operations
  1654.  * ie. update() or getstats() then reset the interrupt and
  1655.  * wait for the board to retrigger.
  1656.  */
  1657. if(test_bit(PERI_CRIT, (void*)&card->wandev.critical)) {
  1658. printk(KERN_INFO "ISR CRIT TO PERIn");
  1659. goto isr_done;
  1660. }
  1661. /* On a 508 Card, if critical due to if_send 
  1662.          * Major Error !!! */
  1663. if(card->hw.type != SDLA_S514) {
  1664. if(test_bit(SEND_CRIT, (void*)&card->wandev.critical)) {
  1665. printk(KERN_INFO "%s: Critical while in ISR: %lxn",
  1666. card->devname, card->wandev.critical);
  1667. card->in_isr = 0;
  1668. flags->interrupt_info_struct.interrupt_type = 0;
  1669. return;
  1670. }
  1671. }
  1672. switch(flags->interrupt_info_struct.interrupt_type) {
  1673. case RX_APP_INT_PEND: /* 0x01: receive interrupt */
  1674. rx_intr(card);
  1675. break;
  1676. case TX_APP_INT_PEND: /* 0x02: transmit interrupt */
  1677. flags->interrupt_info_struct.interrupt_permission &=
  1678.  ~APP_INT_ON_TX_FRAME;
  1679. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1680. if (card->tty_opt){
  1681. wanpipe_tty_trigger_poll(card);
  1682. break;
  1683. }
  1684. if (dev && is_queue_stopped(dev)){
  1685. if (card->u.c.usedby == API){
  1686. start_net_queue(dev);
  1687. wakeup_sk_bh(dev);
  1688. }else{
  1689. wake_net_dev(dev);
  1690. }
  1691. }
  1692. #else
  1693. wake_net_dev(dev);
  1694. #endif
  1695. break;
  1696. case COMMAND_COMPLETE_APP_INT_PEND:/* 0x04: cmd cplt */
  1697. ++ Intr_test_counter;
  1698. break;
  1699. case CHDLC_EXCEP_COND_APP_INT_PEND: /* 0x20 */
  1700. process_chdlc_exception(card);
  1701. break;
  1702. case GLOBAL_EXCEP_COND_APP_INT_PEND:
  1703. process_global_exception(card);
  1704. break;
  1705. case TIMER_APP_INT_PEND:
  1706. timer_intr(card);
  1707. break;
  1708. default:
  1709. printk(KERN_INFO "%s: spurious interrupt 0x%02X!n", 
  1710. card->devname,
  1711. flags->interrupt_info_struct.interrupt_type);
  1712. printk(KERN_INFO "Code name: ");
  1713. for(i = 0; i < 4; i ++)
  1714. printk(KERN_INFO "%c",
  1715. flags->global_info_struct.codename[i]); 
  1716. printk(KERN_INFO "nCode version: ");
  1717.   for(i = 0; i < 4; i ++)
  1718. printk(KERN_INFO "%c", 
  1719. flags->global_info_struct.codeversion[i]); 
  1720. printk(KERN_INFO "n");
  1721. break;
  1722. }
  1723. isr_done:
  1724. card->in_isr = 0;
  1725. flags->interrupt_info_struct.interrupt_type = 0;
  1726. return;
  1727. }
  1728. /*============================================================================
  1729.  * Receive interrupt handler.
  1730.  */
  1731. static void rx_intr (sdla_t* card)
  1732. {
  1733. netdevice_t *dev;
  1734. chdlc_private_area_t *chdlc_priv_area;
  1735. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  1736. CHDLC_DATA_RX_STATUS_EL_STRUCT *rxbuf = card->u.c.rxmb;
  1737. struct sk_buff *skb;
  1738. unsigned len;
  1739. unsigned addr = rxbuf->ptr_data_bfr;
  1740. void *buf;
  1741. int i,udp_type;
  1742. if (rxbuf->opp_flag != 0x01) {
  1743. printk(KERN_INFO 
  1744. "%s: corrupted Rx buffer @ 0x%X, flag = 0x%02X!n", 
  1745. card->devname, (unsigned)rxbuf, rxbuf->opp_flag);
  1746.                 printk(KERN_INFO "Code name: ");
  1747.                 for(i = 0; i < 4; i ++)
  1748.                         printk(KERN_INFO "%c",
  1749.                                 flags->global_info_struct.codename[i]);
  1750.                 printk(KERN_INFO "nCode version: ");
  1751.                 for(i = 0; i < 4; i ++)
  1752.                         printk(KERN_INFO "%c",
  1753.                                 flags->global_info_struct.codeversion[i]);
  1754.                 printk(KERN_INFO "n");
  1755. /* Bug Fix: Mar 6 2000
  1756.                  * If we get a corrupted mailbox, it measn that driver 
  1757.                  * is out of sync with the firmware. There is no recovery.
  1758.                  * If we don't turn off all interrupts for this card
  1759.                  * the machine will crash. 
  1760.                  */
  1761. printk(KERN_INFO "%s: Critical router failure ...!!!n", card->devname);
  1762. printk(KERN_INFO "Please contact Sangoma Technologies !n");
  1763. chdlc_set_intr_mode(card,0);
  1764. return;
  1765. }
  1766. len  = rxbuf->frame_length;
  1767. #if defined(LINUX_2_4) || defined(LINUX_2_1)
  1768. if (card->tty_opt){
  1769. if (rxbuf->error_flag){
  1770. goto rx_exit;
  1771. }
  1772. if (len <= CRC_LENGTH){
  1773. goto rx_exit;
  1774. }
  1775. if (!card->u.c.async_mode){
  1776. len -= CRC_LENGTH;
  1777. }
  1778. wanpipe_tty_receive(card,addr,len);
  1779. goto rx_exit;
  1780. }
  1781. #endif
  1782. dev = card->wandev.dev;
  1783. if (!dev){
  1784. goto rx_exit;
  1785. }
  1786. if (!is_dev_running(dev))
  1787. goto rx_exit;
  1788. chdlc_priv_area = dev->priv;
  1789. /* Allocate socket buffer */
  1790. skb = dev_alloc_skb(len);
  1791. if (skb == NULL) {
  1792. printk(KERN_INFO "%s: no socket buffers available!n",
  1793. card->devname);
  1794. ++card->wandev.stats.rx_dropped;
  1795. goto rx_exit;
  1796. }
  1797. /* Copy data to the socket buffer */
  1798. if((addr + len) > card->u.c.rx_top + 1) {
  1799. unsigned tmp = card->u.c.rx_top - addr + 1;
  1800. buf = skb_put(skb, tmp);
  1801. sdla_peek(&card->hw, addr, buf, tmp);
  1802. addr = card->u.c.rx_base;
  1803. len -= tmp;
  1804. }
  1805. buf = skb_put(skb, len);
  1806. sdla_peek(&card->hw, addr, buf, len);
  1807. skb->protocol = htons(ETH_P_IP);
  1808. card->wandev.stats.rx_packets ++;
  1809. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1810. card->wandev.stats.rx_bytes += skb->len;
  1811. #endif
  1812. udp_type = udp_pkt_type( skb, card );
  1813. if(udp_type == UDP_CPIPE_TYPE) {
  1814. if(store_udp_mgmt_pkt(UDP_PKT_FRM_NETWORK,
  1815.           card, skb, dev, chdlc_priv_area)) {
  1816.               flags->interrupt_info_struct.
  1817. interrupt_permission |= 
  1818. APP_INT_ON_TIMER; 
  1819. }
  1820. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1821. } else if(card->u.c.usedby == API) {
  1822. api_rx_hdr_t* api_rx_hdr;
  1823.         skb_push(skb, sizeof(api_rx_hdr_t));
  1824.                 api_rx_hdr = (api_rx_hdr_t*)&skb->data[0x00];
  1825. api_rx_hdr->error_flag = rxbuf->error_flag;
  1826.       api_rx_hdr->time_stamp = rxbuf->time_stamp;
  1827.                 skb->protocol = htons(PVC_PROT);
  1828.       skb->mac.raw  = skb->data;
  1829. skb->dev      = dev;
  1830.                 skb->pkt_type = WAN_PACKET_DATA;
  1831. bh_enqueue(dev, skb);
  1832. if (!test_and_set_bit(0,&chdlc_priv_area->tq_working)){
  1833. wanpipe_queue_tq(&chdlc_priv_area->common.wanpipe_task);
  1834.         wanpipe_mark_bh();
  1835. }
  1836. #endif
  1837. }else{
  1838. /* FIXME: we should check to see if the received packet is a 
  1839.                           multicast packet so that we can increment the multicast 
  1840.                           statistic
  1841.                           ++ chdlc_priv_area->if_stats.multicast;
  1842. */
  1843.                 /* Pass it up the protocol stack */
  1844.                 skb->dev = dev;
  1845.                 skb->mac.raw  = skb->data;
  1846.                 netif_rx(skb);
  1847. }
  1848. rx_exit:
  1849. /* Release buffer element and calculate a pointer to the next one */
  1850. rxbuf->opp_flag = 0x00;
  1851. card->u.c.rxmb = ++ rxbuf;
  1852. if((void*)rxbuf > card->u.c.rxbuf_last){
  1853. card->u.c.rxmb = card->u.c.rxbuf_base;
  1854. }
  1855. }
  1856. /*============================================================================
  1857.  * Timer interrupt handler.
  1858.  * The timer interrupt is used for two purposes:
  1859.  *    1) Processing udp calls from 'cpipemon'.
  1860.  *    2) Reading board-level statistics for updating the proc file system.
  1861.  */
  1862. void timer_intr(sdla_t *card)
  1863. {
  1864.         netdevice_t* dev;
  1865.         chdlc_private_area_t* chdlc_priv_area = NULL;
  1866.         SHARED_MEMORY_INFO_STRUCT* flags = NULL;
  1867.         if ((dev = card->wandev.dev)==NULL){
  1868. flags = card->u.c.flags;
  1869.                 flags->interrupt_info_struct.interrupt_permission &=
  1870.                         ~APP_INT_ON_TIMER;
  1871. return;
  1872. }
  1873.         chdlc_priv_area = dev->priv;
  1874. if (chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_CONFIG) {
  1875. if (!config_chdlc(card)){
  1876. chdlc_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_CONFIG;
  1877. }
  1878. }
  1879. /* process a udp call if pending */
  1880.         if(chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_UDP) {
  1881.                 process_udp_mgmt_pkt(card, dev,
  1882.                        chdlc_priv_area);
  1883. chdlc_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_UDP;
  1884.         }
  1885. /* read the communications statistics if required */
  1886. if(chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_UPDATE) {
  1887. update_comms_stats(card, chdlc_priv_area);
  1888.                 if(!(-- chdlc_priv_area->update_comms_stats)) {
  1889. chdlc_priv_area->timer_int_enabled &= 
  1890. ~TMR_INT_ENABLED_UPDATE;
  1891. }
  1892.         }
  1893. /* only disable the timer interrupt if there are no udp or statistic */
  1894. /* updates pending */
  1895.         if(!chdlc_priv_area->timer_int_enabled) {
  1896.                 flags = card->u.c.flags;
  1897.                 flags->interrupt_info_struct.interrupt_permission &=
  1898.                         ~APP_INT_ON_TIMER;
  1899.         }
  1900. }
  1901. /*------------------------------------------------------------------------------
  1902.   Miscellaneous Functions
  1903. - set_chdlc_config() used to set configuration options on the board
  1904. ------------------------------------------------------------------------------*/
  1905. static int set_chdlc_config(sdla_t* card)
  1906. {
  1907. CHDLC_CONFIGURATION_STRUCT cfg;
  1908. memset(&cfg, 0, sizeof(CHDLC_CONFIGURATION_STRUCT));
  1909. if(card->wandev.clocking){
  1910. cfg.baud_rate = card->wandev.bps;
  1911. }
  1912. cfg.line_config_options = (card->wandev.interface == WANOPT_RS232) ?
  1913. INTERFACE_LEVEL_RS232 : INTERFACE_LEVEL_V35;
  1914. cfg.modem_config_options = 0;
  1915. cfg.modem_status_timer = 100;
  1916. cfg.CHDLC_protocol_options = card->u.c.protocol_options;
  1917. if (card->tty_opt){
  1918. cfg.CHDLC_API_options = DISCARD_RX_ERROR_FRAMES;
  1919. }
  1920. cfg.percent_data_buffer_for_Tx  = (card->u.c.receive_only) ? 0 : 50;
  1921. cfg.CHDLC_statistics_options = (CHDLC_TX_DATA_BYTE_COUNT_STAT |
  1922. CHDLC_RX_DATA_BYTE_COUNT_STAT);
  1923. if (card->tty_opt){
  1924. card->wandev.mtu = TTY_CHDLC_MAX_MTU;
  1925. }
  1926. cfg.max_CHDLC_data_field_length = card->wandev.mtu;
  1927. cfg.transmit_keepalive_timer = card->u.c.kpalv_tx;
  1928. cfg.receive_keepalive_timer = card->u.c.kpalv_rx;
  1929. cfg.keepalive_error_tolerance = card->u.c.kpalv_err;
  1930. cfg.SLARP_request_timer = card->u.c.slarp_timer;
  1931. if (cfg.SLARP_request_timer) {
  1932. cfg.IP_address = 0;
  1933. cfg.IP_netmask = 0;
  1934. }else if (card->wandev.dev){
  1935. netdevice_t * dev = card->wandev.dev;
  1936. chdlc_private_area_t *chdlc_priv_area = dev->priv;
  1937. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1938.                 struct in_device *in_dev = dev->ip_ptr;
  1939. if(in_dev != NULL) {
  1940. struct in_ifaddr *ifa = in_dev->ifa_list;
  1941. if (ifa != NULL ) {
  1942. cfg.IP_address = ntohl(ifa->ifa_local);
  1943. cfg.IP_netmask = ntohl(ifa->ifa_mask); 
  1944. chdlc_priv_area->IP_address = ntohl(ifa->ifa_local);
  1945. chdlc_priv_area->IP_netmask = ntohl(ifa->ifa_mask); 
  1946. }
  1947. }
  1948. #else
  1949.                 cfg.IP_address          = ntohl(dev->pa_addr);
  1950.                 cfg.IP_netmask          = ntohl(dev->pa_mask);
  1951. chdlc_priv_area->IP_address = ntohl(dev->pa_addr);
  1952. chdlc_priv_area->IP_netmask = ntohl(dev->pa_mask);
  1953. #endif
  1954. /* FIXME: We must re-think this message in next release
  1955. if((cfg.IP_address & 0x000000FF) > 2) {
  1956. printk(KERN_WARNING "n");
  1957.                 printk(KERN_WARNING "  WARNING:%s configured with ann",
  1958. card->devname);
  1959. printk(KERN_WARNING "  invalid local IP address.n");
  1960.                         printk(KERN_WARNING "  Slarp pragmatics will fail.n");
  1961.                         printk(KERN_WARNING "  IP address should be of then");
  1962. printk(KERN_WARNING "  format A.B.C.1 or A.B.C.2.n");
  1963. }
  1964. */
  1965. }