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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2. * sdla_fr.c WANPIPE(tm) Multiprotocol WAN Link Driver. Frame relay module.
  3. *
  4. * Author(s): 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. * Nov 23, 2000  Nenad Corbic    o Added support for 2.4.X kernels
  15. * Nov 15, 2000  David Rokavarg  
  16. *               Nenad Corbic o Added frame relay bridging support.
  17. *    Original code from Mark Wells and Kristian Hoffmann has
  18. *    been integrated into the frame relay driver.
  19. * Nov 13, 2000  Nenad Corbic    o Added true interface type encoding option.
  20. *    Tcpdump doesn't support Frame Relay inteface
  21. *    types, to fix this true type option will set
  22. *    the interface type to RAW IP mode.
  23. * Nov 07, 2000  Nenad Corbic o Added security features for UDP debugging:
  24. *                                 Deny all and specify allowed requests.
  25. * Nov 06, 2000  Nenad Corbic o Wanpipe interfaces conform to raw packet interfaces.  
  26. *                                 Moved the if_header into the if_send() routine.
  27. *                                 The if_header() was breaking the libpcap 
  28. *                                 support. i.e. support for tcpdump, ethereal ...
  29. * Oct 12. 2000  Nenad Corbic    o Added error message in fr_configure
  30. * Jul 31, 2000  Nenad Corbic o Fixed the Router UP Time.
  31. * Apr 28, 2000  Nenad Corbic o Added the option to shutdown an interface
  32. *                                 when the channel gets disconnected.
  33. * Apr 28, 2000  Nenad Corbic  o Added M.Grants patch: disallow duplicate
  34. *                                 interface setups. 
  35. * Apr 25, 2000  Nenad Corbic o Added M.Grants patch: dynamically add/remove 
  36. *                                 new dlcis/interfaces.
  37. * Mar 23, 2000  Nenad Corbic  o Improved task queue, bh handling.
  38. * Mar 16, 2000 Nenad Corbic o Added Inverse ARP support
  39. * Mar 13, 2000  Nenad Corbic o Added new socket API support.
  40. * Mar 06, 2000  Nenad Corbic o Bug Fix: corrupted mbox recovery.
  41. * Feb 24, 2000  Nenad Corbic    o Fixed up FT1 UDP debugging problem.
  42. * Dev 15, 1999  Nenad Corbic    o Fixed up header files for 2.0.X kernels
  43. *
  44. * Nov 08, 1999  Nenad Corbic    o Combined all debug UDP calls into one function
  45. *                               o Removed the ARP support. This has to be done
  46. *                                 in the next version.
  47. *                               o Only a Node can implement NO signalling.
  48. *                                 Initialize DLCI during if_open() if NO 
  49. *   signalling.
  50. * o Took out IPX support, implement in next
  51. *                                 version
  52. * Sep 29, 1999  Nenad Corbic o Added SMP support and changed the update
  53. *                                 function to use timer interrupt.
  54. * o Fixed the CIR bug:  Set the value of BC
  55. *                                 to CIR when the CIR is enabled.
  56. *   o Updated comments, statistics and tracing.
  57. * Jun 02, 1999 Gideon Hack o Updated for S514 support.
  58. * Sep 18, 1998 Jaspreet Singh o Updated for 2.2.X kernels.
  59. * Jul 31, 1998 Jaspreet Singh o Removed wpf_poll routine.  The channel/DLCI 
  60. *   status is received through an event interrupt.
  61. * Jul 08, 1998 David Fong o Added inverse ARP support.
  62. * Mar 26, 1997 Jaspreet Singh o Returning return codes for failed UDP cmds.
  63. * Jan 28, 1997 Jaspreet Singh  o Improved handling of inactive DLCIs.
  64. * Dec 30, 1997 Jaspreet Singh o Replaced dev_tint() with mark_bh(NET_BH)
  65. * Dec 16, 1997 Jaspreet Singh o Implemented Multiple IPX support.
  66. * Nov 26, 1997 Jaspreet Singh o Improved load sharing with multiple boards
  67. * o Added Cli() to protect enabling of interrupts
  68. *   while polling is called.
  69. * Nov 24, 1997 Jaspreet Singh o Added counters to avoid enabling of interrupts
  70. *   when they have been disabled by another
  71. *   interface or routine (eg. wpf_poll).
  72. * Nov 06, 1997 Jaspreet Singh o Added INTR_TEST_MODE to avoid polling
  73. *   routine disable interrupts during interrupt
  74. *   testing.
  75. * Oct 20, 1997  Jaspreet Singh  o Added hooks in for Router UP time.
  76. * Oct 16, 1997  Jaspreet Singh  o The critical flag is used to maintain flow
  77. *                                 control by avoiding RACE conditions.  The
  78. *                                 cli() and restore_flags() are taken out.
  79. *                                 The fr_channel structure is appended for 
  80. *                                 Driver Statistics.
  81. * Oct 15, 1997  Farhan Thawar    o updated if_send() and receive for IPX
  82. * Aug 29, 1997  Farhan Thawar    o Removed most of the cli() and sti()
  83. *                                o Abstracted the UDP management stuff
  84. *                                o Now use tbusy and critical more intelligently
  85. * Jul 21, 1997  Jaspreet Singh  o Can configure T391, T392, N391, N392 & N393
  86. *    through router.conf.
  87. *  o Protected calls to sdla_peek() by adDing 
  88. *    save_flags(), cli() and restore_flags().
  89. *  o Added error message for Inactive DLCIs in
  90. *    fr_event() and update_chan_state().
  91. *  o Fixed freeing up of buffers using kfree() 
  92. *            when packets are received.
  93. * Jul 07, 1997 Jaspreet Singh  o Added configurable TTL for UDP packets 
  94. *  o Added ability to discard multicast and 
  95. *    broadcast source addressed packets
  96. * Jun 27, 1997 Jaspreet Singh  o Added FT1 monitor capabilities 
  97. *    New case (0x44) statement in if_send routine 
  98. *    Added a global variable rCount to keep track
  99. *      of FT1 status enabled on the board.
  100. * May 29, 1997 Jaspreet Singh  o Fixed major Flow Control Problem
  101. *    With multiple boards a problem was seen where
  102. *    the second board always stopped transmitting
  103. *    packet after running for a while. The code
  104. *    got into a stage where the interrupts were
  105. *    disabled and dev->tbusy was set to 1.
  106. *                      This caused the If_send() routine to get into
  107. *                                  the if clause for it(0,dev->tbusy) 
  108. *    forever.
  109. *    The code got into this stage due to an 
  110. *    interrupt occuring within the if clause for 
  111. *    set_bit(0,dev->tbusy).  Since an interrupt 
  112. *    disables furhter transmit interrupt and 
  113. *     makes dev->tbusy = 0, this effect was undone 
  114. *                                  by making dev->tbusy = 1 in the if clause.
  115. *    The Fix checks to see if Transmit interrupts
  116. *    are disabled then do not make dev->tbusy = 1
  117. *         Introduced a global variable: int_occur and
  118. *    added tx_int_enabled in the wan_device 
  119. *    structure.
  120. * May 21, 1997  Jaspreet Singh   o Fixed UDP Management for multiple
  121. *                                  boards.
  122. *
  123. * Apr 25, 1997  Farhan Thawar    o added UDP Management stuff
  124. *                                o fixed bug in if_send() and tx_intr() to
  125. *                                  sleep and wakeup all devices
  126. * Mar 11, 1997  Farhan Thawar   Version 3.1.1
  127. *                                o fixed (+1) bug in fr508_rx_intr()
  128. *                                o changed if_send() to return 0 if
  129. *                                  wandev.critical() is true
  130. *                                o free socket buffer in if_send() if
  131. *                                  returning 0 
  132. *                                o added tx_intr() routine
  133. * Jan 30, 1997 Gene Kozin Version 3.1.0
  134. *  o implemented exec() entry point
  135. *  o fixed a bug causing driver configured as
  136. *    a FR switch to be stuck in WAN_
  137. *    mode
  138. * Jan 02, 1997 Gene Kozin Initial version.
  139. *****************************************************************************/
  140. #include <linux/module.h>
  141. #include <linux/version.h>
  142. #include <linux/kernel.h> /* printk(), and other useful stuff */
  143. #include <linux/stddef.h> /* offsetof(), etc. */
  144. #include <linux/errno.h> /* return codes */
  145. #include <linux/string.h> /* inline memset(), etc. */
  146. #include <linux/slab.h> /* kmalloc(), kfree() */
  147. #include <linux/wanrouter.h> /* WAN router definitions */
  148. #include <linux/wanpipe.h> /* WANPIPE common user API definitions */
  149. #include <linux/if_arp.h> /* ARPHRD_* defines */
  150. #include <asm/byteorder.h> /* htons(), etc. */
  151. #include <asm/io.h> /* for inb(), outb(), etc. */
  152. #include <linux/time.h>   /* for do_gettimeofday */
  153. #include <linux/in.h> /* sockaddr_in */
  154. #include <asm/errno.h>
  155. #include <linux/ip.h>
  156. #include <linux/if.h>
  157. #include <linux/if_wanpipe_common.h> /* Wanpipe Socket */
  158. #include <linux/if_wanpipe.h>
  159. #include <linux/sdla_fr.h> /* frame relay firmware API definitions */
  160. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  161.  #include <asm/uaccess.h>
  162.  #include <linux/inetdevice.h>
  163.  #include <linux/netdevice.h>
  164. #else
  165.  #include <asm/segment.h>
  166. #endif
  167. #include <net/route.h>           /* Dynamic Route Creation */
  168. #include <linux/etherdevice.h> /* eth_type_trans() used for bridging */
  169. #include <linux/random.h>
  170. /****** Defines & Macros ****************************************************/
  171. #define MAX_CMD_RETRY 10 /* max number of firmware retries */
  172. #define FR_HEADER_LEN 8 /* max encapsulation header size */
  173. #define FR_CHANNEL_MTU 1500 /* unfragmented logical channel MTU */
  174. /* Q.922 frame types */
  175. #define Q922_UI 0x03 /* Unnumbered Info frame */
  176. #define Q922_XID 0xAF
  177. /* DLCI configured or not */
  178. #define DLCI_NOT_CONFIGURED 0x00
  179. #define DLCI_CONFIG_PENDING 0x01
  180. #define DLCI_CONFIGURED 0x02
  181. /* CIR enabled or not */
  182. #define CIR_ENABLED 0x00
  183. #define CIR_DISABLED 0x01
  184. #define FRAME_RELAY_API 1
  185. #define MAX_BH_BUFF 10
  186. /* For handle_IPXWAN() */
  187. #define CVHexToAscii(b) (((unsigned char)(b) > (unsigned char)9) ? ((unsigned char)'A' + ((unsigned char)(b) - (unsigned char)10)) : ((unsigned char)'0' + (unsigned char)(b)))
  188.  
  189. /****** Data Structures *****************************************************/
  190. /* This is an extention of the 'struct device' we create for each network
  191.  * interface to keep the rest of channel-specific data.
  192.  */
  193. typedef struct fr_channel
  194. {
  195. wanpipe_common_t common;
  196. char name[WAN_IFNAME_SZ+1]; /* interface name, ASCIIZ */
  197. unsigned dlci_configured  ; /* check whether configured or not */
  198. unsigned cir_status; /* check whether CIR enabled or not */
  199. unsigned dlci; /* logical channel number */
  200. unsigned cir; /* committed information rate */
  201. unsigned bc; /* committed burst size */
  202. unsigned be; /* excess burst size */
  203. unsigned mc; /* multicast support on or off */
  204. unsigned tx_int_status; /* Transmit Interrupt Status */
  205. unsigned short pkt_length; /* Packet Length */
  206. unsigned long router_start_time;/* Router start time in seconds */
  207. unsigned long tick_counter; /* counter for transmit time out */
  208. char dev_pending_devtint; /* interface pending dev_tint() */
  209. void *dlci_int_interface; /* pointer to the DLCI Interface */ 
  210. unsigned long IB_addr; /* physical address of Interface Byte */
  211. unsigned long state_tick; /* time of the last state change */
  212. unsigned char enable_IPX; /* Enable/Disable the use of IPX */
  213. unsigned long network_number; /* Internal Network Number for IPX*/
  214. sdla_t *card; /* -> owner */
  215. unsigned route_flag; /* Add/Rem dest addr in route tables */
  216. unsigned inarp; /* Inverse Arp Request status */ 
  217. unsigned char inarp_ready; /* Ready to send requests */
  218. int inarp_interval; /* Time between InArp Requests */
  219. unsigned long inarp_tick; /* InArp jiffies tick counter */
  220. unsigned char interface_down; /* Bring interface down on disconnect */
  221.       #if defined(LINUX_2_1) || defined(LINUX_2_4)
  222. struct net_device_stats ifstats; /* interface statistics */
  223.       #else
  224. struct enet_statistics ifstats;
  225.       #endif
  226. if_send_stat_t drvstats_if_send;
  227.         rx_intr_stat_t drvstats_rx_intr;
  228.         pipe_mgmt_stat_t drvstats_gen;
  229. unsigned long router_up_time;
  230. unsigned short transmit_length;
  231. struct sk_buff *delay_skb;
  232.       #if defined(LINUX_2_1) || defined(LINUX_2_4)
  233. bh_data_t *bh_head;      /* Circular buffer for chdlc_bh */
  234. unsigned long  tq_working;
  235. volatile int  bh_write;
  236. volatile int  bh_read;
  237. atomic_t  bh_buff_used;
  238.       #endif
  239. /* Polling task queue. Each interface
  240.          * has its own task queue, which is used
  241.          * to defer events from the interrupt */
  242. struct tq_struct fr_poll_task;
  243. struct timer_list fr_arp_timer;
  244. u32 ip_local;
  245. u32 ip_remote;
  246. u8  config_dlci;
  247. u32 unconfig_dlci;
  248. /* Whether this interface should be setup as a gateway.
  249.  * Used by dynamic route setup code */
  250. u8  gateway;
  251. /* True interface type */
  252. u8 true_if_encoding;
  253. u8 fr_header[FR_HEADER_LEN];
  254. char fr_header_len;
  255. } fr_channel_t;
  256. /* Route Flag options */
  257. #define NO_ROUTE 0x00
  258. #define ADD_ROUTE  0x01
  259. #define ROUTE_ADDED 0x02
  260. #define REMOVE_ROUTE  0x03
  261. #define ARP_REQ 0x04
  262. /* inarp options */
  263. #define INARP_NONE 0x00
  264. #define INARP_REQUEST 0x01
  265. #define INARP_CONFIGURED 0x02
  266. /* reasons for enabling the timer interrupt on the adapter */
  267. #define TMR_INT_ENABLED_UDP    0x01
  268. #define TMR_INT_ENABLED_UPDATE  0x02
  269. #define TMR_INT_ENABLED_ARP 0x04
  270. #define TMR_INT_ENABLED_UPDATE_STATE  0x08
  271. #define TMR_INT_ENABLED_CONFIG 0x10
  272. #define TMR_INT_ENABLED_UNCONFIG 0x20
  273. typedef struct dlci_status
  274. {
  275. unsigned short dlci PACKED;
  276. unsigned char state PACKED;
  277. } dlci_status_t;
  278. typedef struct dlci_IB_mapping
  279. {
  280. unsigned short dlci PACKED;
  281. unsigned long  addr_value PACKED;
  282. } dlci_IB_mapping_t;
  283. /* This structure is used for DLCI list Tx interrupt mode.  It is used to
  284.    enable interrupt bit and set the packet length for transmission
  285.  */
  286. typedef struct fr_dlci_interface 
  287. {
  288. unsigned char gen_interrupt PACKED;
  289. unsigned short packet_length PACKED;
  290. unsigned char reserved PACKED;
  291. } fr_dlci_interface_t; 
  292. /* variable for keeping track of enabling/disabling FT1 monitor status */
  293. static int rCount = 0;
  294. extern void disable_irq(unsigned int);
  295. extern void enable_irq(unsigned int);
  296. /* variable for keeping track of number of interrupts generated during 
  297.  * interrupt test routine 
  298.  */
  299. static int Intr_test_counter;
  300. /****** Function Prototypes *************************************************/
  301. /* WAN link driver entry points. These are called by the WAN router module. */
  302. static int update(wan_device_t *wandev);
  303. static int new_if(wan_device_t *wandev, netdevice_t *dev, wanif_conf_t *conf);
  304. static int del_if(wan_device_t *wandev, netdevice_t *dev);
  305. static void disable_comm (sdla_t *card);
  306. /* WANPIPE-specific entry points */
  307. static int wpf_exec(struct sdla *card, void *u_cmd, void *u_data);
  308. /* Network device interface */
  309. static int if_init(netdevice_t *dev);
  310. static int if_open(netdevice_t *dev);
  311. static int if_close(netdevice_t *dev);
  312. #ifdef LINUX_2_4
  313. static void if_tx_timeout (netdevice_t *dev);
  314. #endif
  315. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  316. static int if_rebuild_hdr (struct sk_buff *skb);
  317. #else
  318. static int if_rebuild_hdr (void* hdr, netdevice_t* dev, unsigned long raddr,
  319.         struct sk_buff* skb);
  320. #endif
  321. static int if_send(struct sk_buff *skb, netdevice_t *dev);
  322. static int chk_bcast_mcast_addr(sdla_t *card, netdevice_t* dev,
  323.                                 struct sk_buff *skb);
  324. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  325. static struct net_device_stats *if_stats(netdevice_t *dev);
  326. #else
  327. static struct enet_statistics* if_stats (netdevice_t* dev);
  328. #endif
  329. /* Interrupt handlers */
  330. static void fr_isr(sdla_t *card);
  331. static void rx_intr(sdla_t *card);
  332. static void tx_intr(sdla_t *card);
  333. static void timer_intr(sdla_t *card);
  334. static void spur_intr(sdla_t *card);
  335. /* Frame relay firmware interface functions */
  336. static int fr_read_version(sdla_t *card, char *str);
  337. static int fr_configure(sdla_t *card, fr_conf_t *conf);
  338. static int fr_dlci_configure(sdla_t *card, fr_dlc_conf_t *conf, unsigned dlci);
  339. static int fr_init_dlci (sdla_t *card, fr_channel_t *chan);
  340. static int fr_set_intr_mode (sdla_t *card, unsigned mode, unsigned mtu, unsigned short timeout);
  341. static int fr_comm_enable(sdla_t *card);
  342. static void fr_comm_disable(sdla_t *card);
  343. static int fr_get_err_stats(sdla_t *card);
  344. static int fr_get_stats(sdla_t *card);
  345. static int fr_add_dlci(sdla_t *card, int dlci);
  346. static int fr_activate_dlci(sdla_t *card, int dlci);
  347. static int fr_delete_dlci (sdla_t* card, int dlci);
  348. static int fr_issue_isf(sdla_t *card, int isf);
  349. static int fr_send(sdla_t *card, int dlci, unsigned char attr, int len,
  350. void *buf);
  351. static int fr_send_data_header(sdla_t *card, int dlci, unsigned char attr, int len,
  352. void *buf,unsigned char hdr_len);
  353. static unsigned int fr_send_hdr(sdla_t *card, int dlci, unsigned int offset);
  354. static int check_dlci_config (sdla_t *card, fr_channel_t *chan);
  355. static void initialize_rx_tx_buffers (sdla_t *card);
  356. /* Firmware asynchronous event handlers */
  357. static int fr_event(sdla_t *card, int event, fr_mbox_t *mbox);
  358. static int fr_modem_failure(sdla_t *card, fr_mbox_t *mbox);
  359. static int fr_dlci_change(sdla_t *card, fr_mbox_t *mbox);
  360. /* Miscellaneous functions */
  361. static int update_chan_state(netdevice_t *dev);
  362. static void set_chan_state(netdevice_t *dev, int state);
  363. static netdevice_t *find_channel(sdla_t *card, unsigned dlci);
  364. static int is_tx_ready(sdla_t *card, fr_channel_t *chan);
  365. static unsigned int dec_to_uint(unsigned char *str, int len);
  366. static int reply_udp( unsigned char *data, unsigned int mbox_len );
  367. static int intr_test( sdla_t* card );
  368. static void init_chan_statistics( fr_channel_t* chan );
  369. static void init_global_statistics( sdla_t* card );
  370. static void read_DLCI_IB_mapping( sdla_t* card, fr_channel_t* chan );
  371. static int setup_for_delayed_transmit(netdevice_t* dev, struct sk_buff *skb);
  372. netdevice_t * move_dev_to_next (sdla_t *, netdevice_t *);
  373. static int check_tx_status(sdla_t *, netdevice_t *);
  374. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  375. /* Frame Relay Socket API */
  376. static void trigger_fr_bh (fr_channel_t *);
  377. static void fr_bh (netdevice_t *);
  378. static int fr_bh_cleanup (netdevice_t *);
  379. static int bh_enqueue (netdevice_t *, struct sk_buff *);
  380. #endif
  381. static void trigger_fr_poll (netdevice_t *);
  382. static void fr_poll (netdevice_t *);
  383. //static void add_gateway (netdevice_t *);
  384. static void trigger_unconfig_fr (netdevice_t *dev);
  385. static void unconfig_fr (sdla_t *);
  386. static void trigger_config_fr (sdla_t *);
  387. static void config_fr (sdla_t *);
  388. /* Inverse ARP and Dynamic routing functions */
  389. int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, netdevice_t *dev);
  390. int is_arp(void *buf);
  391. int send_inarp_request(sdla_t *card, netdevice_t *dev);
  392. static void trigger_fr_arp (netdevice_t *);
  393. static void fr_arp (unsigned long data);
  394. /* Udp management functions */
  395. static int process_udp_mgmt_pkt(sdla_t *card);
  396. static int udp_pkt_type( struct sk_buff *skb, sdla_t *card );
  397. static int store_udp_mgmt_pkt(int udp_type, char udp_pkt_src, sdla_t* card,
  398.                                 struct sk_buff *skb, int dlci);
  399. /* IPX functions */
  400. static void switch_net_numbers(unsigned char *sendpacket,
  401. unsigned long network_number, unsigned char incoming);
  402. static int handle_IPXWAN(unsigned char *sendpacket, char *devname,
  403. unsigned char enable_IPX, unsigned long network_number);
  404. /* Lock Functions: SMP supported */
  405. void  s508_s514_unlock(sdla_t *card, unsigned long *smp_flags);
  406. void  s508_s514_lock(sdla_t *card, unsigned long *smp_flags);
  407. unsigned short calc_checksum (char *, int);
  408. static int setup_fr_header(struct sk_buff** skb, netdevice_t* dev, char op_mode);
  409. /****** Public Functions ****************************************************/
  410. /*============================================================================
  411.  * Frame relay protocol initialization routine.
  412.  *
  413.  * This routine is called by the main WANPIPE module during setup.  At this
  414.  * point adapter is completely initialized and firmware is running.
  415.  *  o read firmware version (to make sure it's alive)
  416.  *  o configure adapter
  417.  *  o initialize protocol-specific fields of the adapter data space.
  418.  *
  419.  * Return: 0 o.k.
  420.  * < 0 failure.
  421.  */
  422. int wpf_init(sdla_t *card, wandev_conf_t *conf)
  423. {
  424. int err;
  425. fr508_flags_t* flags;
  426. union
  427. {
  428. char str[80];
  429. fr_conf_t cfg;
  430. } u;
  431. fr_buf_info_t* buf_info;
  432. int i;
  433. printk(KERN_INFO "n");
  434. /* Verify configuration ID */
  435. if (conf->config_id != WANCONFIG_FR) {
  436. printk(KERN_INFO "%s: invalid configuration ID %u!n",
  437. card->devname, conf->config_id);
  438. return -EINVAL;
  439. }
  440. /* Initialize protocol-specific fields of adapter data space */
  441. switch (card->hw.fwid) {
  442. case SFID_FR508:
  443. card->mbox  = (void*)(card->hw.dpmbase + 
  444. FR508_MBOX_OFFS);
  445. card->flags = (void*)(card->hw.dpmbase + 
  446. FR508_FLAG_OFFS);
  447. if(card->hw.type == SDLA_S514) {
  448. card->mbox += FR_MB_VECTOR;
  449.                                 card->flags += FR_MB_VECTOR;
  450. }
  451.                         card->isr = &fr_isr;
  452. break;
  453. default:
  454. return -EINVAL;
  455. }
  456. flags = card->flags;
  457. /* Read firmware version.  Note that when adapter initializes, it
  458.  * clears the mailbox, so it may appear that the first command was
  459.  * executed successfully when in fact it was merely erased. To work
  460.  * around this, we execute the first command twice.
  461.  */
  462. if (fr_read_version(card, NULL) || fr_read_version(card, u.str))
  463. return -EIO;
  464. printk(KERN_INFO "%s: running frame relay firmware v%sn",
  465. card->devname, u.str);
  466. /* Adjust configuration */
  467. conf->mtu += FR_HEADER_LEN;
  468. conf->mtu = (conf->mtu >= MIN_LGTH_FR_DATA_CFG) ?
  469. min_t(unsigned int, conf->mtu, FR_MAX_NO_DATA_BYTES_IN_FRAME) :
  470.                         FR_CHANNEL_MTU + FR_HEADER_LEN;
  471.      
  472. conf->bps = min_t(unsigned int, conf->bps, 2048000);
  473. /* Initialze the configuration structure sent to the board to zero */
  474. memset(&u.cfg, 0, sizeof(u.cfg));
  475. memset(card->u.f.dlci_to_dev_map, 0, sizeof(card->u.f.dlci_to_dev_map));
  476.  
  477. /* Configure adapter firmware */
  478. u.cfg.mtu = conf->mtu;
  479. u.cfg.kbps = conf->bps / 1000;
  480.      u.cfg.cir_fwd = u.cfg.cir_bwd = 16;
  481.         u.cfg.bc_fwd  = u.cfg.bc_bwd = 16;
  482. u.cfg.options = 0x0000;
  483. printk(KERN_INFO "%s: Global CIR enabled by Defaultn", card->devname);
  484. switch (conf->u.fr.signalling) {
  485. case WANOPT_FR_ANSI:
  486. u.cfg.options = 0x0000; 
  487. break;
  488. case WANOPT_FR_Q933:
  489. u.cfg.options |= 0x0200; 
  490. break;
  491. case WANOPT_FR_LMI:
  492. u.cfg.options |= 0x0400; 
  493. break;
  494. case WANOPT_NO:
  495. u.cfg.options |= 0x0800; 
  496. break;
  497. default:
  498. printk(KERN_INFO "%s: Illegal Signalling optionn",
  499. card->wandev.name);
  500. return -EINVAL;
  501. }
  502. card->wandev.signalling = conf->u.fr.signalling;
  503. if (conf->station == WANOPT_CPE) {
  504. if (conf->u.fr.signalling == WANOPT_NO){
  505. printk(KERN_INFO 
  506. "%s: ERROR - For NO signalling, station must be set to Node!",
  507.    card->devname);
  508. return -EINVAL;
  509. }
  510. u.cfg.station = 0;
  511. u.cfg.options |= 0x8000; /* auto config DLCI */
  512. card->u.f.dlci_num  = 0;
  513. } else {
  514. u.cfg.station = 1; /* switch emulation mode */
  515. /* For switch emulation we have to create a list of dlci(s)
  516.  * that will be sent to be global SET_DLCI_CONFIGURATION 
  517.  * command in fr_configure() routine. 
  518.  */
  519. card->u.f.dlci_num  = min_t(unsigned int, max_t(unsigned int, conf->u.fr.dlci_num, 1), 100);
  520. for ( i = 0; i < card->u.f.dlci_num; i++) {
  521. card->u.f.node_dlci[i] = (unsigned short) 
  522. conf->u.fr.dlci[i] ? conf->u.fr.dlci[i] : 16;
  523. }
  524. }
  525. if (conf->clocking == WANOPT_INTERNAL)
  526. u.cfg.port |= 0x0001;
  527. if (conf->interface == WANOPT_RS232)
  528. u.cfg.port |= 0x0002;
  529. if (conf->u.fr.t391)
  530. u.cfg.t391 = min_t(unsigned int, conf->u.fr.t391, 30);
  531. else
  532. u.cfg.t391 = 5;
  533. if (conf->u.fr.t392)
  534. u.cfg.t392 = min_t(unsigned int, conf->u.fr.t392, 30);
  535. else
  536. u.cfg.t392 = 15;
  537. if (conf->u.fr.n391)
  538. u.cfg.n391 = min_t(unsigned int, conf->u.fr.n391, 255);
  539. else
  540. u.cfg.n391 = 2;
  541. if (conf->u.fr.n392)
  542. u.cfg.n392 = min_t(unsigned int, conf->u.fr.n392, 10);
  543. else
  544. u.cfg.n392 = 3;
  545. if (conf->u.fr.n393)
  546. u.cfg.n393 = min_t(unsigned int, conf->u.fr.n393, 10);
  547. else
  548. u.cfg.n393 = 4;
  549. if (fr_configure(card, &u.cfg))
  550. return -EIO;
  551. if (card->hw.type == SDLA_S514) {
  552.                 buf_info = (void*)(card->hw.dpmbase + FR_MB_VECTOR +
  553. FR508_RXBC_OFFS);
  554.                 card->rxmb = (void*)(buf_info->rse_next + card->hw.dpmbase);
  555.                 card->u.f.rxmb_base =
  556.                         (void*)(buf_info->rse_base + card->hw.dpmbase); 
  557.                 card->u.f.rxmb_last =
  558.                         (void*)(buf_info->rse_base +
  559.                         (buf_info->rse_num - 1) * sizeof(fr_rx_buf_ctl_t) +
  560.                         card->hw.dpmbase);
  561. }else{
  562. buf_info = (void*)(card->hw.dpmbase + FR508_RXBC_OFFS);
  563. card->rxmb = (void*)(buf_info->rse_next -
  564. FR_MB_VECTOR + card->hw.dpmbase);
  565. card->u.f.rxmb_base =
  566. (void*)(buf_info->rse_base -
  567. FR_MB_VECTOR + card->hw.dpmbase);
  568. card->u.f.rxmb_last =
  569. (void*)(buf_info->rse_base +
  570. (buf_info->rse_num - 1) * sizeof(fr_rx_buf_ctl_t) -
  571. FR_MB_VECTOR + card->hw.dpmbase);
  572. }
  573. card->u.f.rx_base = buf_info->buf_base;
  574. card->u.f.rx_top  = buf_info->buf_top;
  575. card->u.f.tx_interrupts_pending = 0;
  576. card->wandev.mtu = conf->mtu;
  577. card->wandev.bps = conf->bps;
  578. card->wandev.interface = conf->interface;
  579. card->wandev.clocking = conf->clocking;
  580. card->wandev.station = conf->station;
  581. card->poll = NULL; 
  582. card->exec = &wpf_exec;
  583. card->wandev.update = &update;
  584. card->wandev.new_if = &new_if;
  585. card->wandev.del_if = &del_if;
  586. card->wandev.state = WAN_DISCONNECTED;
  587. card->wandev.ttl = conf->ttl;
  588.         card->wandev.udp_port  = conf->udp_port;       
  589. card->disable_comm = &disable_comm;
  590. card->u.f.arp_dev  = NULL;
  591. /* Intialize global statistics for a card */
  592. init_global_statistics( card );
  593.         card->TracingEnabled          = 0;
  594. /* Interrupt Test */
  595. Intr_test_counter = 0;
  596. card->intr_mode = INTR_TEST_MODE;
  597. err = intr_test( card );
  598. printk(KERN_INFO "%s: End of Interrupt Test rc=0x%x  count=%in",
  599. card->devname,err,Intr_test_counter); 
  600. if (err || (Intr_test_counter < MAX_INTR_TEST_COUNTER)) {
  601. printk(KERN_ERR "%s: Interrupt Test Failed, Counter: %in", 
  602. card->devname, Intr_test_counter);
  603. printk(KERN_ERR "Please choose another interruptn");
  604. err = -EIO;
  605. return err;
  606. }
  607. printk(KERN_INFO "%s: Interrupt Test Passed, Counter: %in",
  608. card->devname, Intr_test_counter);
  609. /* Apr 28 2000. Nenad Corbic
  610.  * Enable commnunications here, not in if_open or new_if, since
  611.          * interfaces come down when the link is disconnected. 
  612.          */
  613.  
  614. /* If you enable comms and then set ints, you get a Tx int as you
  615.  * perform the SET_INT_TRIGGERS command. So, we only set int
  616.  * triggers and then adjust the interrupt mask (to disable Tx ints)
  617.  * before enabling comms. 
  618.  */
  619.         if (fr_set_intr_mode(card, (FR_INTR_RXRDY | FR_INTR_TXRDY |
  620. FR_INTR_DLC | FR_INTR_TIMER | FR_INTR_TX_MULT_DLCIs) ,
  621. card->wandev.mtu, 0)) {
  622. return -EIO;
  623. }
  624. flags->imask &= ~(FR_INTR_TXRDY | FR_INTR_TIMER);
  625.  
  626. if (fr_comm_enable(card)) {
  627. return -EIO;
  628. }
  629. wanpipe_set_state(card, WAN_CONNECTED);
  630. spin_lock_init(&card->u.f.if_send_lock);
  631. printk(KERN_INFO "n");
  632.         return 0;
  633. }
  634. /******* WAN Device Driver Entry Points *************************************/
  635. /*============================================================================
  636.  * Update device status & statistics.
  637.  */
  638. static int update (wan_device_t* wandev)
  639. {
  640. volatile sdla_t* card;
  641. unsigned long timeout;
  642. fr508_flags_t* flags;
  643. /* sanity checks */
  644. if ((wandev == NULL) || (wandev->private == NULL))
  645. return -EFAULT;
  646. if (wandev->state == WAN_UNCONFIGURED)
  647. return -ENODEV;
  648. card = wandev->private;
  649. flags = card->flags;
  650. card->u.f.update_comms_stats = 1;
  651. card->u.f.timer_int_enabled |= TMR_INT_ENABLED_UPDATE;
  652. flags->imask |= FR_INTR_TIMER;
  653.         timeout = jiffies;
  654.         for(;;) {
  655. if(card->u.f.update_comms_stats == 0)
  656. break;
  657.                 if ((jiffies - timeout) > (1 * HZ)){
  658.      card->u.f.update_comms_stats = 0;
  659.   return -EAGAIN;
  660. }
  661.         }
  662. return 0;
  663. }
  664. /*============================================================================
  665.  * Create new logical channel.
  666.  * This routine is called by the router when ROUTER_IFNEW IOCTL is being
  667.  * handled.
  668.  * o parse media- and hardware-specific configuration
  669.  * o make sure that a new channel can be created
  670.  * o allocate resources, if necessary
  671.  * o prepare network device structure for registaration.
  672.  *
  673.  * Return: 0 o.k.
  674.  * < 0 failure (channel will not be created)
  675.  */
  676. static int new_if (wan_device_t* wandev, netdevice_t* dev, wanif_conf_t* conf)
  677. {
  678. sdla_t* card = wandev->private;
  679. fr_channel_t* chan;
  680. int dlci = 0;
  681. int err = 0;
  682. if ((conf->name[0] == '') || (strlen(conf->name) > WAN_IFNAME_SZ)) {
  683. printk(KERN_INFO "%s: Invalid interface name!n",
  684. card->devname);
  685. return -EINVAL;
  686. }
  687. /* allocate and initialize private data */
  688. chan = kmalloc(sizeof(fr_channel_t), GFP_KERNEL);
  689. if (chan == NULL)
  690. return -ENOMEM;
  691. memset(chan, 0, sizeof(fr_channel_t));
  692. strcpy(chan->name, conf->name);
  693. chan->card = card;
  694. /* verify media address */
  695. if (is_digit(conf->addr[0])) {
  696. dlci = dec_to_uint(conf->addr, 0);
  697. if (dlci && (dlci <= HIGHEST_VALID_DLCI)) {
  698. chan->dlci = dlci;
  699. } else {
  700. printk(KERN_ERR
  701. "%s: Invalid DLCI %u on interface %s!n",
  702. wandev->name, dlci, chan->name);
  703. err = -EINVAL;
  704. }
  705. } else {
  706. printk(KERN_ERR
  707. "%s: Invalid media address on interface %s!n",
  708. wandev->name, chan->name);
  709. err = -EINVAL;
  710. }
  711. if ((chan->true_if_encoding = conf->true_if_encoding) == WANOPT_YES){
  712. printk(KERN_INFO 
  713. "%s: Enabling, true interface type encoding.n",
  714. card->devname);
  715. }
  716.     /* Setup wanpipe as a router (WANPIPE) even if it is
  717.  * a bridged DLCI, or as an API 
  718.  */
  719.         if (strcmp(conf->usedby, "WANPIPE")  == 0  || 
  720.     strcmp(conf->usedby, "BRIDGE")   == 0  ||
  721.     strcmp(conf->usedby, "BRIDGE_N") == 0){
  722. if(strcmp(conf->usedby, "WANPIPE") == 0){
  723. chan->common.usedby = WANPIPE;
  724.                 printk(KERN_INFO "%s: Running in WANPIPE mode.n", 
  725. card->devname);
  726. }else if(strcmp(conf->usedby, "BRIDGE") == 0){
  727. chan->common.usedby = BRIDGE;
  728. #if defined(LINUX_2_1) || defined(LINUX_2_4) 
  729. printk(KERN_INFO "%s: Running in WANPIPE (BRIDGE) mode.n", 
  730. card->devname);
  731. #else
  732. printk(KERN_INFO "%s: WANPIPE Bridging mode not supported in 2.0.X kernels.n",
  733. card->devname);
  734. err = -EPROTONOSUPPORT;
  735. #endif
  736. }else if( strcmp(conf->usedby, "BRIDGE_N") == 0 ){
  737. chan->common.usedby = BRIDGE_NODE;
  738. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  739. printk(KERN_INFO "%s: Running in WANPIPE (BRIDGE_NODE) mode.n", 
  740. card->devname);
  741. #else
  742. printk(KERN_INFO "%s: WANPIPE Bridging mode not supported in 2.0.X kernels.n",
  743. card->devname);
  744. err = -EPROTONOSUPPORT;
  745. #endif
  746. }
  747. if (!err){
  748. /* Dynamic interface configuration option.
  749.  * On disconnect, if the options is selected,
  750.  * the interface will be brought down */
  751. if (conf->if_down == WANOPT_YES){ 
  752. set_bit(DYN_OPT_ON,&chan->interface_down);
  753. printk(KERN_INFO 
  754.     "%s: Dynamic interface configuration enabled.n",
  755. card->devname);
  756. }
  757. }
  758.         } else if(strcmp(conf->usedby, "API") == 0){
  759. #if defined(LINUX_2_1) || defined(LINUX_2_4) 
  760.                 chan->common.usedby = API;
  761.                 printk(KERN_INFO "%s: Running in API mode.n",
  762. wandev->name);
  763. #else
  764.                 printk(KERN_INFO "%s: The API Mode is not supported for"
  765.  "kernels lower than 2.2.X !n",
  766. wandev->name);
  767. printk(KERN_INFO "%s: Please upgrade to a 2.2.X kernel for the API supportn",
  768. wandev->name);
  769.                 err = -EINVAL;
  770. #endif
  771.         }
  772. if (err) {
  773. kfree(chan);
  774. return err;
  775. }
  776. /* place cir,be,bc and other channel specific information into the
  777.  * chan structure 
  778.          */
  779. if (conf->cir) {
  780. chan->cir = max_t(unsigned int, 1,
  781. min_t(unsigned int, conf->cir, 512));
  782. chan->cir_status = CIR_ENABLED; 
  783. /* If CIR is enabled, force BC to equal CIR
  784.                  * this solves number of potential problems if CIR is 
  785.                  * set and BC is not 
  786.  */
  787. chan->bc = chan->cir;
  788. if (conf->be){
  789. chan->be = max_t(unsigned int,
  790.        0, min_t(unsigned int, conf->be, 511));
  791. }else{
  792. conf->be = 0;
  793. }
  794. printk (KERN_INFO "%s: CIR enabled for DLCI %i n",
  795. wandev->name,chan->dlci);
  796. printk (KERN_INFO "%s:     CIR = %i ; BC = %i ; BE = %in",
  797. wandev->name,chan->cir,chan->bc,chan->be);
  798. }else{
  799. chan->cir_status = CIR_DISABLED;
  800. printk (KERN_INFO "%s: CIR disabled for DLCI %in",
  801. wandev->name,chan->dlci);
  802. }
  803. chan->mc = conf->mc;
  804. if (conf->inarp == WANOPT_YES){
  805. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  806. printk(KERN_INFO "%s: Inverse ARP Support Enabledn",card->devname);
  807. chan->inarp = conf->inarp ? INARP_REQUEST : INARP_NONE;
  808. chan->inarp_interval = conf->inarp_interval ? conf->inarp_interval : 10;
  809. #else
  810. printk(KERN_INFO "%s: Warning, Inverse ARP Support not available for 2.0.X kernels!n",
  811. card->devname);
  812. chan->inarp = INARP_NONE;
  813. chan->inarp_interval = 10;
  814. #endif
  815. }else{
  816. printk(KERN_INFO "%s: Inverse ARP Support Disabledn",card->devname);
  817. chan->inarp = INARP_NONE;
  818. chan->inarp_interval = 10;
  819. }
  820. chan->dlci_configured = DLCI_NOT_CONFIGURED;
  821. /*FIXME: IPX disabled in this WANPIPE version */
  822. if (conf->enable_IPX == WANOPT_YES){
  823. printk(KERN_INFO "%s: ERROR - This version of WANPIPE doesn't support IPXn",
  824. card->devname);
  825. kfree(chan);
  826. return -EINVAL;
  827. }else{
  828. chan->enable_IPX = WANOPT_NO;
  829. }
  830. if (conf->network_number){
  831. chan->network_number = conf->network_number;
  832. }else{
  833. chan->network_number = 0xDEADBEEF;
  834. }
  835. chan->route_flag = NO_ROUTE;
  836. init_chan_statistics(chan);
  837. chan->transmit_length = 0;
  838. /* prepare network device data space for registration */
  839. #ifdef LINUX_2_4
  840. strcpy(dev->name,chan->name);
  841. #else
  842. dev->name = (char *)kmalloc(strlen(chan->name) + 2, GFP_KERNEL); 
  843. if(dev->name == NULL)
  844. {
  845. kfree(chan);
  846. return -ENOMEM;
  847. }
  848. sprintf(dev->name, "%s", chan->name);
  849. #endif
  850. dev->init = &if_init;
  851. dev->priv = chan;
  852. /* Initialize FR Polling Task Queue
  853.          * We need a poll routine for each network
  854.          * interface. 
  855.          */
  856. #ifndef LINUX_2_4
  857. chan->fr_poll_task.next = NULL;
  858. #endif
  859. chan->fr_poll_task.sync = 0;
  860. chan->fr_poll_task.routine = (void *)(void *)fr_poll;
  861. chan->fr_poll_task.data = dev;
  862. init_timer(&chan->fr_arp_timer);
  863. chan->fr_arp_timer.data=(unsigned long)dev;
  864. chan->fr_arp_timer.function = fr_arp;
  865. wandev->new_if_cnt++;
  866. /* Tells us that if this interface is a
  867.          * gateway or not */
  868. if ((chan->gateway = conf->gateway) == WANOPT_YES){
  869. printk(KERN_INFO "%s: Interface %s is set as a gateway.n",
  870. card->devname,dev->name);
  871. }
  872. /* M. Grant Patch Apr 28 2000 
  873.          * Disallow duplicate dlci configurations. */
  874. if (card->u.f.dlci_to_dev_map[chan->dlci] != NULL) {
  875. kfree(chan);
  876. return -EBUSY;
  877. }
  878. /* Configure this dlci at a later date, when
  879.          * the interface comes up. i.e. when if_open() 
  880.          * executes */
  881. set_bit(0,&chan->config_dlci);
  882. printk(KERN_INFO "n");
  883. return 0;
  884. }
  885. /*============================================================================
  886.  * Delete logical channel.
  887.  */
  888. static int del_if (wan_device_t* wandev, netdevice_t* dev)
  889. {
  890. fr_channel_t* chan = dev->priv;
  891. unsigned long smp_flags=0;
  892. /* This interface is dead, make sure the 
  893.  * ARP timer is stopped */
  894. del_timer(&chan->fr_arp_timer);
  895. /* If we are a NODE, we must unconfigure this DLCI
  896.  * Trigger an unconfigure command that will
  897.  * be executed in timer interrupt. We must wait
  898.  * for the command to complete. */
  899. trigger_unconfig_fr(dev);
  900. lock_adapter_irq(&wandev->lock, &smp_flags);
  901. wandev->new_if_cnt--;
  902. unlock_adapter_irq(&wandev->lock, &smp_flags);
  903. return 0;
  904. }
  905. /*=====================================================================
  906.  * disable_comm
  907.  *
  908.  * Description:
  909.  * Disable communications.
  910.  *  This code runs in shutdown (sdlamain.c)
  911.  *      under critical flag. Therefore it is not
  912.  *      necessary to set a critical flag here 
  913.  *
  914.  * Usage:
  915.  *  Commnunications are disabled only on a card
  916.  *      shutdown.
  917.  */
  918. static void disable_comm (sdla_t *card)
  919. {
  920. printk(KERN_INFO "%s: Disabling Communications!n",
  921. card->devname);
  922. fr_comm_disable(card);
  923. }
  924. /****** WANPIPE-specific entry points ***************************************/
  925. /*============================================================================
  926.  * Execute adapter interface command.
  927.  */
  928. static int wpf_exec (struct sdla* card, void* u_cmd, void* u_data)
  929. {
  930. fr_mbox_t* mbox = card->mbox;
  931. int retry = MAX_CMD_RETRY;
  932. int err, len;
  933. fr_cmd_t cmd;
  934. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  935. if(copy_from_user((void*)&cmd, u_cmd, sizeof(cmd)))
  936. return -EFAULT;
  937. /* execute command */
  938. do
  939. {
  940. memcpy(&mbox->cmd, &cmd, sizeof(cmd));
  941. if (cmd.length){
  942. if( copy_from_user((void*)&mbox->data, u_data, cmd.length))
  943. return -EFAULT;
  944. }
  945. if (sdla_exec(mbox))
  946. err = mbox->cmd.result;
  947. else return -EIO;
  948. } while (err && retry-- && fr_event(card, err, mbox));
  949. /* return result */
  950. if (copy_to_user(u_cmd, (void*)&mbox->cmd, sizeof(fr_cmd_t)))
  951. return -EFAULT;
  952. len = mbox->cmd.length;
  953. if (len && u_data && !copy_to_user(u_data, (void*)&mbox->data, len))
  954. return -EFAULT;
  955. return 0;
  956. #else
  957.         if (!u_cmd || verify_area(VERIFY_WRITE, u_cmd, sizeof(fr_cmd_t)))
  958.                 return -EFAULT;
  959.         memcpy_fromfs((void*)&cmd, u_cmd, sizeof(cmd));
  960.         if (cmd.length) {
  961.                 if (!u_data || verify_area(VERIFY_READ, u_data, cmd.length))
  962.                         return -EFAULT;
  963.         }
  964.         /* execute command */
  965.         do
  966.         {
  967.                 memcpy(&mbox->cmd, &cmd, sizeof(cmd));
  968.                 if (cmd.length)
  969.                         memcpy_fromfs((void*)&mbox->data, u_data, cmd.length);
  970.                 if (sdla_exec(mbox))
  971.                         err = mbox->cmd.result;
  972.                 else return -EIO;
  973.         } while (err && retry-- && fr_event(card, err, mbox));
  974.         /* return result */
  975.         memcpy_tofs(u_cmd, (void*)&mbox->cmd, sizeof(fr_cmd_t));
  976.         len = mbox->cmd.length;
  977.         if (len && u_data && !verify_area(VERIFY_WRITE, u_data, len))
  978.                 memcpy_tofs(u_data, (void*)&mbox->data, len);
  979.         return 0;
  980. #endif
  981. }
  982. /****** Network Device Interface ********************************************/
  983. /*============================================================================
  984.  * Initialize Linux network interface.
  985.  *
  986.  * This routine is called only once for each interface, during Linux network
  987.  * interface registration.  Returning anything but zero will fail interface
  988.  * registration.
  989.  */
  990. static int if_init (netdevice_t* dev)
  991. {
  992. fr_channel_t* chan = dev->priv;
  993. sdla_t* card = chan->card;
  994. wan_device_t* wandev = &card->wandev;
  995. #ifdef LINUX_2_0
  996. int i;
  997. #endif
  998. /* Initialize device driver entry points */
  999. dev->open = &if_open;
  1000. dev->stop = &if_close;
  1001. dev->hard_header = NULL;
  1002. dev->rebuild_header = &if_rebuild_hdr;
  1003. dev->hard_start_xmit = &if_send;
  1004. dev->get_stats = &if_stats;
  1005. #ifdef LINUX_2_4
  1006. dev->tx_timeout = &if_tx_timeout;
  1007. dev->watchdog_timeo = TX_TIMEOUT;
  1008. #endif
  1009. if (chan->common.usedby == WANPIPE || chan->common.usedby == API){
  1010. #ifdef LINUX_2_0
  1011. dev->family = AF_INET;
  1012. #endif
  1013. /* Initialize media-specific parameters */
  1014. if (chan->true_if_encoding){
  1015. dev->type  = ARPHRD_DLCI;  /* This breaks tcpdump */
  1016. }else{
  1017. dev->type = ARPHRD_PPP;  /* ARP h/w type */
  1018. }
  1019. dev->flags |= IFF_POINTOPOINT;
  1020. dev->flags |= IFF_NOARP;
  1021. /* Enable Multicast addressing */
  1022. if (chan->mc == WANOPT_YES){
  1023. dev->flags  |= IFF_MULTICAST;
  1024. }
  1025. dev->mtu = wandev->mtu - FR_HEADER_LEN;
  1026. /* For an API, the maximum number of bytes that the stack will pass
  1027.    to the driver is (dev->mtu + dev->hard_header_len). So, adjust the
  1028.    mtu so that a frame of maximum size can be transmitted by the API. 
  1029. */
  1030. if(chan->common.usedby == API) {
  1031. dev->mtu += (sizeof(api_tx_hdr_t) - FR_HEADER_LEN);
  1032. }
  1033. dev->hard_header_len = FR_HEADER_LEN;/* media header length */
  1034. dev->addr_len = 2;  /* hardware address length */
  1035. *(unsigned short*)dev->dev_addr = htons(chan->dlci);
  1036. /* Set transmit buffer queue length */
  1037.          dev->tx_queue_len = 100;
  1038. /* Initialize socket buffers */
  1039. #if !defined(LINUX_2_1) && !defined(LINUX_2_4)
  1040.         for (i = 0; i < DEV_NUMBUFFS; ++i)
  1041. skb_queue_head_init(&dev->buffs[i]);
  1042. #endif
  1043. }else{
  1044. /* Setup the interface for Bridging */
  1045. int hw_addr=0;
  1046. ether_setup(dev);
  1047. /* Use a random number to generate the MAC address */
  1048. memcpy(dev->dev_addr, "xFExFCx00x00x00x00", 6);
  1049. get_random_bytes(&hw_addr, sizeof(hw_addr));
  1050. *(int *)(dev->dev_addr + 2) += hw_addr;
  1051. }
  1052. /* Initialize hardware parameters (just for reference) */
  1053. dev->irq = wandev->irq;
  1054. dev->dma = wandev->dma;
  1055. dev->base_addr = wandev->ioport;
  1056. dev->mem_start = wandev->maddr;
  1057. dev->mem_end = wandev->maddr + wandev->msize - 1;
  1058. return 0;
  1059. }
  1060. /*============================================================================
  1061.  * Open network interface.
  1062.  * o if this is the first open, then enable communications and interrupts.
  1063.  * o prevent module from unloading by incrementing use count
  1064.  *
  1065.  * Return 0 if O.k. or errno.
  1066.  */
  1067. static int if_open (netdevice_t* dev)
  1068. {
  1069. fr_channel_t* chan = dev->priv;
  1070. sdla_t* card = chan->card;
  1071. int err = 0;
  1072. struct timeval tv;
  1073. if (is_dev_running(dev))
  1074. return -EBUSY;
  1075. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1076. /* Initialize the task queue */
  1077. chan->tq_working=0;
  1078. #ifndef LINUX_2_4
  1079. chan->common.wanpipe_task.next = NULL;
  1080. #endif
  1081. chan->common.wanpipe_task.sync = 0;
  1082. chan->common.wanpipe_task.routine = (void *)(void *)fr_bh;
  1083. chan->common.wanpipe_task.data = dev;
  1084. /* Allocate and initialize BH circular buffer */
  1085. chan->bh_head = kmalloc((sizeof(bh_data_t)*MAX_BH_BUFF),GFP_ATOMIC);
  1086. memset(chan->bh_head,0,(sizeof(bh_data_t)*MAX_BH_BUFF));
  1087. atomic_set(&chan->bh_buff_used, 0);
  1088. #endif
  1089. #ifdef LINUX_2_4
  1090. netif_start_queue(dev);
  1091. #else
  1092. dev->interrupt = 0;
  1093. dev->tbusy = 0;
  1094. dev->start = 1;
  1095. #endif
  1096. wanpipe_open(card);
  1097. do_gettimeofday( &tv );
  1098. chan->router_start_time = tv.tv_sec;
  1099. if (test_bit(0,&chan->config_dlci)){
  1100. trigger_config_fr (card);
  1101. }else if (chan->inarp == INARP_REQUEST){
  1102. trigger_fr_arp(dev);
  1103. }
  1104. return err;
  1105. }
  1106. /*============================================================================
  1107.  * Close network interface.
  1108.  * o if this is the last open, then disable communications and interrupts.
  1109.  * o reset flags.
  1110.  */
  1111. static int if_close (netdevice_t* dev)
  1112. {
  1113. fr_channel_t* chan = dev->priv;
  1114. sdla_t* card = chan->card;
  1115. if (chan->inarp == INARP_CONFIGURED) {
  1116. chan->inarp = INARP_REQUEST;
  1117. }
  1118. stop_net_queue(dev);
  1119. #ifndef LINUX_2_4
  1120. dev->start=0;
  1121. #endif
  1122. wanpipe_close(card);
  1123. return 0;
  1124. }
  1125. /*============================================================================
  1126.  * Re-build media header.
  1127.  *
  1128.  * Return: 1 physical address resolved.
  1129.  * 0 physical address not resolved
  1130.  */
  1131. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1132. static int if_rebuild_hdr (struct sk_buff* skb)
  1133. {
  1134. #else
  1135. static int if_rebuild_hdr (void* hdr, netdevice_t* dev, unsigned long raddr,
  1136.                            struct sk_buff* skb)
  1137. {
  1138. #endif
  1139. #if defined(LINUX_2_1) || defined(LINUX_2_4) 
  1140. netdevice_t *dev = skb->dev;
  1141. #endif
  1142. fr_channel_t* chan = dev->priv;
  1143. sdla_t* card = chan->card;
  1144. printk(KERN_INFO "%s: rebuild_header() called for interface %s!n",
  1145. card->devname, dev->name);
  1146. return 1;
  1147. }
  1148. #ifdef LINUX_2_4
  1149. /*============================================================================
  1150.  * Handle transmit timeout event from netif watchdog
  1151.  */
  1152. static void if_tx_timeout (netdevice_t *dev)
  1153. {
  1154.      fr_channel_t* chan = dev->priv;
  1155. sdla_t *card = chan->card;
  1156. /* If our device stays busy for at least 5 seconds then we will
  1157.  * kick start the device by making dev->tbusy = 0.  We expect
  1158.  * that our device never stays busy more than 5 seconds. So this                 
  1159.  * is only used as a last resort.
  1160.  */
  1161. chan->drvstats_if_send.if_send_tbusy++;
  1162. ++chan->ifstats.collisions;
  1163. printk (KERN_INFO "%s: Transmit timed out on %sn", 
  1164. card->devname, dev->name);
  1165. chan->drvstats_if_send.if_send_tbusy_timeout++;
  1166. netif_wake_queue (dev);
  1167. }
  1168. #endif
  1169. /*============================================================================
  1170.  * Send a packet on a network interface.
  1171.  * o set tbusy flag (marks start of the transmission) to block a timer-based
  1172.  *   transmit from overlapping.
  1173.  * o set critical flag when accessing board.
  1174.  * o check link state. If link is not up, then drop the packet.
  1175.  * o check channel status. If it's down then initiate a call.
  1176.  * o pass a packet to corresponding WAN device.
  1177.  * o free socket buffer
  1178.  *
  1179.  * Return: 0 complete (socket buffer must be freed)
  1180.  * non-0 packet may be re-transmitted (tbusy must be set)
  1181.  *
  1182.  * Notes:
  1183.  * 1. This routine is called either by the protocol stack or by the "net
  1184.  *    bottom half" (with interrupts enabled).
  1185.  * 
  1186.  * 2. Using the start_net_queue() and stop_net_queue() MACROS
  1187.  *    will inhibit further transmit requests from the protocol stack 
  1188.  *    and can be used for flow control with protocol layer.
  1189.  */
  1190. static int if_send (struct sk_buff* skb, netdevice_t* dev)
  1191. {
  1192.      fr_channel_t* chan = dev->priv;
  1193.      sdla_t* card = chan->card;
  1194.         int err;
  1195.      unsigned char *sendpacket;
  1196.      fr508_flags_t* adptr_flags = card->flags;
  1197. int udp_type, delay_tx_queued=0;
  1198. unsigned long smp_flags=0;
  1199. unsigned char attr = 0;
  1200. chan->drvstats_if_send.if_send_entry++;
  1201. #ifdef LINUX_2_4
  1202. netif_stop_queue(dev);
  1203. #endif
  1204.         if (skb == NULL) {             
  1205. /* if we get here, some higher layer thinks we've missed an
  1206.  * tx-done interrupt.
  1207.  */
  1208. printk(KERN_INFO "%s: interface %s got kicked!n", 
  1209. card->devname, dev->name);
  1210. chan->drvstats_if_send.if_send_skb_null ++;
  1211. wake_net_dev(dev);
  1212. return 0;
  1213. }
  1214. /* If a peripheral task is running just drop packets */
  1215. if (test_bit(PERI_CRIT, &card->wandev.critical)){
  1216. printk(KERN_INFO "%s: Critical in if_send(): Peripheral running!n",
  1217. card->devname);
  1218. wan_dev_kfree_skb(skb,FREE_WRITE);
  1219. start_net_queue(dev);
  1220. return 0;
  1221. }
  1222. /* We must set the 'tbusy' flag if we already have a packet queued for
  1223.    transmission in the transmit interrupt handler. However, we must
  1224.    ensure that the transmit interrupt does not reset the 'tbusy' flag
  1225.    just before we set it, as this will result in a "transmit timeout".
  1226. */
  1227. set_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical);
  1228.         if(chan->transmit_length) {
  1229. stop_net_queue(dev);
  1230. chan->tick_counter = jiffies;
  1231.   clear_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical);
  1232. return 1;
  1233. }
  1234.         clear_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical);
  1235.  
  1236. #ifndef LINUX_2_4
  1237.      if (dev->tbusy) {
  1238. /* If our device stays busy for at least 5 seconds then we will
  1239.                  * kick start the device by making dev->tbusy = 0.  We expect
  1240.                  * that our device never stays busy more than 5 seconds. So this                 
  1241.  * is only used as a last resort.
  1242.                  */
  1243. chan->drvstats_if_send.if_send_tbusy++;
  1244. ++chan->ifstats.collisions;
  1245. if ((jiffies - chan->tick_counter) < (5 * HZ)) {
  1246. return 1;
  1247. }
  1248. printk(KERN_INFO "%s: Transmit timed out on %sn", 
  1249. card->devname, chan->name);
  1250. chan->drvstats_if_send.if_send_tbusy_timeout ++;
  1251. dev->tbusy = 0;
  1252.      }
  1253. #endif
  1254. /* Move the if_header() code to here. By inserting frame
  1255.  * relay header in if_header() we would break the
  1256.  * tcpdump and other packet sniffers */
  1257. chan->fr_header_len = setup_fr_header(&skb,dev,chan->common.usedby);
  1258. if (chan->fr_header_len < 0 ){
  1259. ++chan->ifstats.tx_dropped;
  1260. ++card->wandev.stats.tx_dropped;
  1261. wan_dev_kfree_skb(skb,FREE_WRITE);
  1262. start_net_queue(dev);
  1263. return 0;
  1264. }
  1265. sendpacket = skb->data;
  1266. udp_type = udp_pkt_type(skb, card);
  1267.         if(udp_type != UDP_INVALID_TYPE) {
  1268. if(store_udp_mgmt_pkt(udp_type, UDP_PKT_FRM_STACK, card, skb,
  1269.                         chan->dlci)) {
  1270.                         adptr_flags->imask |= FR_INTR_TIMER;
  1271.                         if (udp_type == UDP_FPIPE_TYPE){
  1272.                                 chan->drvstats_if_send.
  1273. if_send_PIPE_request ++;
  1274. }
  1275.                 }
  1276. start_net_queue(dev);
  1277. return 0;
  1278. }
  1279. //FIXME: can we do better than sendpacket[2]?
  1280.    if ((chan->common.usedby == WANPIPE) && (sendpacket[2] == 0x45)) {
  1281.                 /* check to see if the source IP address is a broadcast or */
  1282.                 /* multicast IP address */
  1283.                 if(chk_bcast_mcast_addr(card, dev, skb)){
  1284.              ++chan->ifstats.tx_dropped;
  1285. ++card->wandev.stats.tx_dropped;
  1286.                  wan_dev_kfree_skb(skb, FREE_WRITE);
  1287. start_net_queue(dev);
  1288. return 0;
  1289. }
  1290. }
  1291. /* Lock the S514/S508 card: SMP Supported */
  1292.      s508_s514_lock(card,&smp_flags);
  1293. if (test_and_set_bit(SEND_CRIT, (void*)&card->wandev.critical)) {
  1294. chan->drvstats_if_send.if_send_critical_non_ISR ++;
  1295. chan->ifstats.tx_dropped ++;
  1296. printk(KERN_INFO "%s Critical in IF_SEND: if_send() already running!n", 
  1297. card->devname);
  1298. goto if_send_start_and_exit;
  1299. }
  1300. /* API packet check: minimum packet size must be greater than 
  1301.  * 16 byte API header */
  1302. if((chan->common.usedby == API) && (skb->len <= sizeof(api_tx_hdr_t))) {
  1303. ++chan->ifstats.tx_dropped;
  1304. ++card->wandev.stats.tx_dropped;
  1305.     
  1306. goto if_send_start_and_exit;
  1307.   }else{
  1308. /* During API transmission, get rid of the API header */
  1309. if (chan->common.usedby == API) {
  1310. api_tx_hdr_t* api_tx_hdr;
  1311. api_tx_hdr = (api_tx_hdr_t*)&skb->data[0x00];
  1312. attr = api_tx_hdr->attr;
  1313. skb_pull(skb,sizeof(api_tx_hdr_t));
  1314. }
  1315. }
  1316. if (card->wandev.state != WAN_CONNECTED) {
  1317. chan->drvstats_if_send.if_send_wan_disconnected ++;
  1318. ++chan->ifstats.tx_dropped;
  1319.          ++card->wandev.stats.tx_dropped;
  1320. } else if (chan->common.state != WAN_CONNECTED) {
  1321. chan->drvstats_if_send.if_send_dlci_disconnected ++;
  1322. /* Update the DLCI state in timer interrupt */
  1323. card->u.f.timer_int_enabled |= TMR_INT_ENABLED_UPDATE_STATE;
  1324. adptr_flags->imask |= FR_INTR_TIMER;
  1325.          ++chan->ifstats.tx_dropped;
  1326.          ++card->wandev.stats.tx_dropped;
  1327. } else if (!is_tx_ready(card, chan)) {
  1328. /* No tx buffers available, store for delayed transmit */
  1329. if (!setup_for_delayed_transmit(dev, skb)){
  1330. set_bit(1,&delay_tx_queued);
  1331. }
  1332. chan->drvstats_if_send.if_send_no_bfrs++;
  1333. } else if (!skb->protocol) {
  1334. /* No protocols drop packet */
  1335. chan->drvstats_if_send.if_send_protocol_error ++;
  1336. ++card->wandev.stats.tx_errors;
  1337. } else if (test_bit(ARP_CRIT,&card->wandev.critical)){
  1338. /* We are trying to send an ARP Packet, block IP data until
  1339.  * ARP is sent */
  1340. ++chan->ifstats.tx_dropped;
  1341.          ++card->wandev.stats.tx_dropped;
  1342. } else {
  1343. //FIXME: IPX is not implemented in this version of Frame Relay ?
  1344. if((chan->common.usedby == WANPIPE) &&
  1345.   sendpacket[1] == 0x00 &&
  1346.      sendpacket[2] == 0x80 &&
  1347.      sendpacket[6] == 0x81 &&
  1348.      sendpacket[7] == 0x37) {
  1349. if( chan->enable_IPX ) {
  1350. switch_net_numbers(sendpacket, 
  1351. chan->network_number, 0);
  1352. } else {
  1353. //FIXME: Take this out when IPX is fixed 
  1354. printk(KERN_INFO 
  1355. "%s: WARNING: Unsupported IPX data in send, packet droppedn",
  1356. card->devname);
  1357. }
  1358. }else{
  1359.          err = fr_send_data_header(card, chan->dlci, attr, skb->len, skb->data, chan->fr_header_len);
  1360. if (err) {
  1361. switch(err) {
  1362. case FRRES_CIR_OVERFLOW:
  1363. case FRRES_BUFFER_OVERFLOW:
  1364.                  if (!setup_for_delayed_transmit(dev, skb)){
  1365. set_bit(1,&delay_tx_queued);
  1366. }
  1367.             chan->drvstats_if_send.
  1368. if_send_adptr_bfrs_full ++;
  1369. break;
  1370. case FRRES_TOO_LONG:
  1371. if (net_ratelimit()){
  1372. printk(KERN_INFO 
  1373. "%s: Error: Frame too long, transmission failed %in",
  1374.  card->devname, (unsigned int)skb->len);
  1375. }
  1376. /* Drop down to default */
  1377. default:
  1378. chan->drvstats_if_send.
  1379. if_send_dlci_disconnected ++;
  1380.          ++chan->ifstats.tx_dropped;
  1381.          ++card->wandev.stats.tx_dropped;
  1382. break;
  1383. }
  1384. } else {
  1385. chan->drvstats_if_send.
  1386. if_send_bfr_passed_to_adptr++;
  1387. ++chan->ifstats.tx_packets;
  1388. ++card->wandev.stats.tx_packets;
  1389. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1390.                                 chan->ifstats.tx_bytes += skb->len;
  1391.                                 card->wandev.stats.tx_bytes += skb->len;
  1392. #endif
  1393. #ifdef LINUX_2_4
  1394. dev->trans_start = jiffies;
  1395. #endif
  1396. }
  1397. }
  1398. }
  1399. if_send_start_and_exit:
  1400. start_net_queue(dev);
  1401. /* If we queued the packet for transmission, we must not
  1402.  * deallocate it. The packet is unlinked from the IP stack
  1403.  * not copied. Therefore, we must keep the original packet */
  1404. if (!test_bit(1,&delay_tx_queued)) {
  1405.                 wan_dev_kfree_skb(skb, FREE_WRITE);
  1406. }else{
  1407. adptr_flags->imask |= FR_INTR_TXRDY;
  1408. card->u.f.tx_interrupts_pending ++;
  1409. }
  1410.         clear_bit(SEND_CRIT, (void*)&card->wandev.critical);
  1411. s508_s514_unlock(card,&smp_flags);
  1412. return 0;
  1413. }
  1414. /*============================================================================
  1415.  * Setup so that a frame can be transmitted on the occurence of a transmit
  1416.  * interrupt.
  1417.  */
  1418. static int setup_for_delayed_transmit (netdevice_t* dev, struct sk_buff *skb)
  1419. {
  1420.         fr_channel_t* chan = dev->priv;
  1421.         sdla_t* card = chan->card;
  1422.         fr_dlci_interface_t* dlci_interface;
  1423. int len = skb->len;
  1424. /* Check that the dlci is properly configured,
  1425.          * before using tx interrupt */
  1426. if (!chan->dlci_int_interface){
  1427. if (net_ratelimit()){ 
  1428. printk(KERN_INFO 
  1429. "%s: ERROR on DLCI %i: Not configured properly !n",
  1430. card->devname, chan->dlci);
  1431. printk(KERN_INFO "%s: Please contact Sangoma Technologiesn",
  1432. card->devname);
  1433. }
  1434. return 1;
  1435. }
  1436. dlci_interface = chan->dlci_int_interface;
  1437.         if(chan->transmit_length) {
  1438.                 printk(KERN_INFO "%s: Big mess in setup_for_del...n",
  1439. card->devname);
  1440.                 return 1;
  1441.         }
  1442. if(len > FR_MAX_NO_DATA_BYTES_IN_FRAME) {
  1443. //FIXME: increment some statistic */
  1444. return 1;
  1445. }
  1446. skb_unlink(skb);
  1447.         chan->transmit_length = len;
  1448. chan->delay_skb = skb;
  1449.         
  1450.         dlci_interface->gen_interrupt |= FR_INTR_TXRDY;
  1451.         dlci_interface->packet_length = len;
  1452. /* Turn on TX interrupt at the end of if_send */
  1453. return 0;
  1454. }
  1455. /*============================================================================
  1456.  * Check to see if the packet to be transmitted contains a broadcast or
  1457.  * multicast source IP address.
  1458.  * Return 0 if not broadcast/multicast address, otherwise return 1.
  1459.  */
  1460. static int chk_bcast_mcast_addr(sdla_t *card, netdevice_t* dev,
  1461.                                 struct sk_buff *skb)
  1462. {
  1463.         u32 src_ip_addr;
  1464.         u32 broadcast_ip_addr = 0;
  1465. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1466.         struct in_device *in_dev;
  1467. #endif
  1468.         fr_channel_t* chan = dev->priv;
  1469.  
  1470.         /* read the IP source address from the outgoing packet */
  1471.         src_ip_addr = *(u32 *)(skb->data + 14);
  1472.         /* read the IP broadcast address for the device */
  1473. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1474.         in_dev = dev->ip_ptr;
  1475.         if(in_dev != NULL) {
  1476.                 struct in_ifaddr *ifa= in_dev->ifa_list;
  1477.                 if(ifa != NULL)
  1478.                         broadcast_ip_addr = ifa->ifa_broadcast;
  1479.                 else
  1480.                         return 0;
  1481.         }
  1482. #else
  1483.         broadcast_ip_addr = dev->pa_brdaddr;
  1484. #endif
  1485.         /* check if the IP Source Address is a Broadcast address */
  1486.         if((dev->flags & IFF_BROADCAST) && (src_ip_addr == broadcast_ip_addr)) {
  1487.                 printk(KERN_INFO
  1488.                         "%s: Broadcast Source Address silently discardedn",
  1489.                         card->devname);
  1490.                 return 1;
  1491.         }
  1492.         /* check if the IP Source Address is a Multicast address */
  1493.         if((chan->mc == WANOPT_NO) && (ntohl(src_ip_addr) >= 0xE0000001) &&
  1494.                 (ntohl(src_ip_addr) <= 0xFFFFFFFE)) {
  1495.                 printk(KERN_INFO
  1496.                         "%s: Multicast Source Address silently discardedn",
  1497.                         card->devname);
  1498.                 return 1;
  1499.         }
  1500.         return 0;
  1501. }
  1502. /*============================================================================
  1503.  * Reply to UDP Management system.
  1504.  * Return nothing.
  1505.  */
  1506. static int reply_udp( unsigned char *data, unsigned int mbox_len ) 
  1507. {
  1508. unsigned short len, udp_length, temp, ip_length;
  1509. unsigned long ip_temp;
  1510. int even_bound = 0;
  1511.   
  1512. fr_udp_pkt_t *fr_udp_pkt = (fr_udp_pkt_t *)data; 
  1513. /* Set length of packet */
  1514. len = //sizeof(fr_encap_hdr_t)+
  1515.       sizeof(ip_pkt_t)+ 
  1516.       sizeof(udp_pkt_t)+
  1517.       sizeof(wp_mgmt_t)+
  1518.       sizeof(cblock_t)+
  1519.       mbox_len;
  1520.  
  1521. /* fill in UDP reply */
  1522. fr_udp_pkt->wp_mgmt.request_reply = UDPMGMT_REPLY;
  1523.   
  1524. /* fill in UDP length */
  1525. udp_length = sizeof(udp_pkt_t)+ 
  1526.      sizeof(wp_mgmt_t)+
  1527.      sizeof(cblock_t)+
  1528.      mbox_len; 
  1529. /* put it on an even boundary */
  1530. if ( udp_length & 0x0001 ) {
  1531. udp_length += 1;
  1532. len += 1;
  1533. even_bound = 1;
  1534. }
  1535. temp = (udp_length<<8)|(udp_length>>8);
  1536. fr_udp_pkt->udp_pkt.udp_length = temp;
  1537.  
  1538. /* swap UDP ports */
  1539. temp = fr_udp_pkt->udp_pkt.udp_src_port;
  1540. fr_udp_pkt->udp_pkt.udp_src_port = 
  1541. fr_udp_pkt->udp_pkt.udp_dst_port; 
  1542. fr_udp_pkt->udp_pkt.udp_dst_port = temp;
  1543. /* add UDP pseudo header */
  1544. temp = 0x1100;
  1545. *((unsigned short *)
  1546. (fr_udp_pkt->data+mbox_len+even_bound)) = temp;
  1547. temp = (udp_length<<8)|(udp_length>>8);
  1548. *((unsigned short *)
  1549. (fr_udp_pkt->data+mbox_len+even_bound+2)) = temp;
  1550.  
  1551. /* calculate UDP checksum */
  1552. fr_udp_pkt->udp_pkt.udp_checksum = 0;
  1553. fr_udp_pkt->udp_pkt.udp_checksum = 
  1554. calc_checksum(&data[UDP_OFFSET/*+sizeof(fr_encap_hdr_t)*/],
  1555.       udp_length+UDP_OFFSET);
  1556. /* fill in IP length */
  1557. ip_length = udp_length + sizeof(ip_pkt_t);
  1558. temp = (ip_length<<8)|(ip_length>>8);
  1559. fr_udp_pkt->ip_pkt.total_length = temp;
  1560.   
  1561. /* swap IP addresses */
  1562. ip_temp = fr_udp_pkt->ip_pkt.ip_src_address;
  1563. fr_udp_pkt->ip_pkt.ip_src_address = 
  1564. fr_udp_pkt->ip_pkt.ip_dst_address;
  1565. fr_udp_pkt->ip_pkt.ip_dst_address = ip_temp;
  1566.  
  1567. /* fill in IP checksum */
  1568. fr_udp_pkt->ip_pkt.hdr_checksum = 0;
  1569. fr_udp_pkt->ip_pkt.hdr_checksum = 
  1570. calc_checksum(&data[/*sizeof(fr_encap_hdr_t)*/0],
  1571.              sizeof(ip_pkt_t));
  1572. return len;
  1573. } /* reply_udp */
  1574. unsigned short calc_checksum (char *data, int len)
  1575. {
  1576. unsigned short temp; 
  1577. unsigned long sum=0;
  1578. int i;
  1579. for( i = 0; i <len; i+=2 ) {
  1580. memcpy(&temp,&data[i],2);
  1581. sum += (unsigned long)temp;
  1582. }
  1583. while (sum >> 16 ) {
  1584. sum = (sum & 0xffffUL) + (sum >> 16);
  1585. }
  1586. temp = (unsigned short)sum;
  1587. temp = ~temp;
  1588. if( temp == 0 ) 
  1589. temp = 0xffff;
  1590. return temp;
  1591. }
  1592. /*
  1593.    If incoming is 0 (outgoing)- if the net numbers is ours make it 0
  1594.    if incoming is 1 - if the net number is 0 make it ours 
  1595. */
  1596. static void switch_net_numbers(unsigned char *sendpacket, unsigned long network_number, unsigned char incoming)
  1597. {
  1598. unsigned long pnetwork_number;
  1599. pnetwork_number = (unsigned long)((sendpacket[14] << 24) + 
  1600.   (sendpacket[15] << 16) + (sendpacket[16] << 8) + 
  1601.   sendpacket[17]);
  1602. if (!incoming) {
  1603. /* If the destination network number is ours, make it 0 */
  1604. if( pnetwork_number == network_number) {
  1605. sendpacket[14] = sendpacket[15] = sendpacket[16] = 
  1606.  sendpacket[17] = 0x00;
  1607. }
  1608. } else {
  1609. /* If the incoming network is 0, make it ours */
  1610. if( pnetwork_number == 0) {
  1611. sendpacket[14] = (unsigned char)(network_number >> 24);
  1612. sendpacket[15] = (unsigned char)((network_number & 
  1613.  0x00FF0000) >> 16);
  1614. sendpacket[16] = (unsigned char)((network_number & 
  1615.  0x0000FF00) >> 8);
  1616. sendpacket[17] = (unsigned char)(network_number & 
  1617.  0x000000FF);
  1618. }
  1619. }
  1620. pnetwork_number = (unsigned long)((sendpacket[26] << 24) + 
  1621.   (sendpacket[27] << 16) + (sendpacket[28] << 8) + 
  1622.   sendpacket[29]);
  1623. if( !incoming ) {
  1624. /* If the source network is ours, make it 0 */
  1625. if( pnetwork_number == network_number) {
  1626. sendpacket[26] = sendpacket[27] = sendpacket[28] = 
  1627.  sendpacket[29] = 0x00;
  1628. }
  1629. } else {
  1630. /* If the source network is 0, make it ours */
  1631. if( pnetwork_number == 0 ) {
  1632. sendpacket[26] = (unsigned char)(network_number >> 24);
  1633. sendpacket[27] = (unsigned char)((network_number & 
  1634.  0x00FF0000) >> 16);
  1635. sendpacket[28] = (unsigned char)((network_number & 
  1636.  0x0000FF00) >> 8);
  1637. sendpacket[29] = (unsigned char)(network_number & 
  1638.  0x000000FF);
  1639. }
  1640. }
  1641. } /* switch_net_numbers */
  1642. /*============================================================================
  1643.  * Get ethernet-style interface statistics.
  1644.  * Return a pointer to struct enet_statistics.
  1645.  */
  1646. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1647. static struct net_device_stats *if_stats(netdevice_t *dev)
  1648. #else
  1649. static struct enet_statistics* if_stats (netdevice_t* dev)
  1650. #endif
  1651. {
  1652. fr_channel_t* chan = dev->priv;
  1653. if(chan == NULL)
  1654. return NULL;
  1655. return &chan->ifstats;
  1656. }
  1657. /****** Interrupt Handlers **************************************************/
  1658. /*============================================================================
  1659.  * fr_isr: S508 frame relay interrupt service routine.
  1660.  *
  1661.  * Description:
  1662.  * Frame relay main interrupt service route. This
  1663.  *      function check the interrupt type and takes
  1664.  *      the appropriate action.
  1665.  */
  1666. static void fr_isr (sdla_t* card)
  1667. {
  1668. fr508_flags_t* flags = card->flags;
  1669. char *ptr = &flags->iflag;
  1670. int i,err;
  1671. fr_mbox_t* mbox = card->mbox;
  1672. /* This flag prevents nesting of interrupts.  See sdla_isr() routine
  1673.          * in sdlamain.c.  */
  1674. card->in_isr = 1;
  1675. ++card->statistics.isr_entry;
  1676. /* All peripheral (configuraiton, re-configuration) events
  1677.  * take presidence over the ISR.  Thus, retrigger */
  1678. if (test_bit(PERI_CRIT, (void*)&card->wandev.critical)) {
  1679. ++card->statistics.isr_already_critical;
  1680. goto fr_isr_exit;
  1681. }
  1682.         if(card->hw.type != SDLA_S514) {
  1683. if (test_bit(SEND_CRIT, (void*)&card->wandev.critical)) {
  1684.                         printk(KERN_INFO "%s: Critical while in ISR: If Send Running!n",
  1685.                                 card->devname);
  1686. ++card->statistics.isr_already_critical;
  1687. goto fr_isr_exit;
  1688. }
  1689. }
  1690. switch (flags->iflag) {
  1691.                 case FR_INTR_RXRDY:  /* receive interrupt */
  1692.      ++card->statistics.isr_rx;
  1693.            rx_intr(card);
  1694.              break;
  1695.                 case FR_INTR_TXRDY:  /* transmit interrupt */
  1696.      ++ card->statistics.isr_tx; 
  1697. tx_intr(card); 
  1698.              break;
  1699.                 case FR_INTR_READY:  
  1700.      Intr_test_counter++;
  1701. ++card->statistics.isr_intr_test;
  1702.      break;
  1703.                 case FR_INTR_DLC: /* Event interrupt occured */
  1704. mbox->cmd.command = FR_READ_STATUS;
  1705. mbox->cmd.length = 0;
  1706. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  1707. if (err)
  1708. fr_event(card, err, mbox);
  1709. break;
  1710.                 case FR_INTR_TIMER:  /* Timer interrupt */
  1711. timer_intr(card);
  1712. break;
  1713. default:
  1714.      ++card->statistics.isr_spurious;
  1715.              spur_intr(card);
  1716.      printk(KERN_INFO "%s: Interrupt Type 0x%02X!n", 
  1717. card->devname, flags->iflag);
  1718.     
  1719. printk(KERN_INFO "%s: ID Bytes = ",card->devname);
  1720.        for(i = 0; i < 8; i ++)
  1721. printk(KERN_INFO "0x%02X ", *(ptr + 0x28 + i));
  1722.       printk(KERN_INFO "n");
  1723.             
  1724. break;
  1725.      }
  1726. fr_isr_exit:
  1727. card->in_isr = 0;
  1728. flags->iflag = 0;
  1729. return;
  1730. }
  1731. /*===========================================================
  1732.  * rx_intr Receive interrupt handler.
  1733.  *
  1734.  * Description
  1735.  *  Upon receiveing an interrupt: 
  1736.  * 1. Check that the firmware is in sync with 
  1737.  *         the driver. 
  1738.  *      2. Find an appropriate network interface
  1739.  *         based on the received dlci number.
  1740.  * 3. Check that the netowrk interface exists
  1741.  *         and that it's setup properly.
  1742.  * 4. Copy the data into an skb buffer.
  1743.  * 5. Check the packet type and take
  1744.  *         appropriate acton: UPD, API, ARP or Data.
  1745.  */
  1746. static void rx_intr (sdla_t* card)
  1747. {
  1748. fr_rx_buf_ctl_t* frbuf = card->rxmb;
  1749. fr508_flags_t* flags = card->flags;
  1750. fr_channel_t* chan;
  1751. char *ptr = &flags->iflag;
  1752. struct sk_buff* skb;
  1753. netdevice_t* dev;
  1754. void* buf;
  1755. unsigned dlci, len, offs, len_incl_hdr;
  1756. int i, udp_type;
  1757. /* Check that firmware buffers are in sync */
  1758. if (frbuf->flag != 0x01) {
  1759. printk(KERN_INFO 
  1760. "%s: corrupted Rx buffer @ 0x%X, flag = 0x%02X!n", 
  1761. card->devname, (unsigned)frbuf, frbuf->flag);
  1762.       
  1763. printk(KERN_INFO "%s: ID Bytes = ",card->devname);
  1764.   for(i = 0; i < 8; i ++)
  1765. printk(KERN_INFO "0x%02X ", *(ptr + 0x28 + i));
  1766. printk(KERN_INFO "n");
  1767. ++card->statistics.rx_intr_corrupt_rx_bfr;
  1768. /* Bug Fix: Mar 6 2000
  1769.                  * If we get a corrupted mailbox, it means that driver 
  1770.                  * is out of sync with the firmware. There is no recovery.
  1771.                  * If we don't turn off all interrupts for this card
  1772.                  * the machine will crash. 
  1773.                  */
  1774. printk(KERN_INFO "%s: Critical router failure ...!!!n", card->devname);
  1775. printk(KERN_INFO "Please contact Sangoma Technologies !n");
  1776. fr_set_intr_mode(card, 0, 0, 0);
  1777. return;
  1778. }
  1779. len  = frbuf->length;
  1780. dlci = frbuf->dlci;
  1781. offs = frbuf->offset;
  1782. /* Find the network interface for this packet */
  1783. dev = find_channel(card, dlci);
  1784.    
  1785. /* Check that the network interface is active and
  1786.          * properly setup */
  1787. if (dev == NULL) {
  1788.     if( net_ratelimit()) { 
  1789. printk(KERN_INFO "%s: received data on unconfigured DLCI %d!n",
  1790.                                                 card->devname, dlci);
  1791. }
  1792. ++card->statistics.rx_intr_on_orphaned_DLCI; 
  1793. ++card->wandev.stats.rx_dropped;
  1794. goto rx_done;
  1795. }
  1796. if ((chan = dev->priv) == NULL){
  1797. if( net_ratelimit()) { 
  1798. printk(KERN_INFO "%s: received data on unconfigured DLCI %d!n",
  1799.                                                 card->devname, dlci);
  1800. }
  1801. ++card->statistics.rx_intr_on_orphaned_DLCI; 
  1802. ++card->wandev.stats.rx_dropped;
  1803. goto rx_done;
  1804. }
  1805. skb = dev_alloc_skb(len); 
  1806. if (!is_dev_running(dev) || (skb == NULL)){
  1807. ++chan->ifstats.rx_dropped;
  1808. if(skb == NULL) {
  1809. if (net_ratelimit()) { 
  1810. printk(KERN_INFO 
  1811. "%s: no socket buffers available!n", 
  1812. card->devname);
  1813. }
  1814. chan->drvstats_rx_intr.rx_intr_no_socket ++;
  1815. if (!is_dev_running(dev)){
  1816. chan->drvstats_rx_intr.
  1817. rx_intr_dev_not_started ++;
  1818. if (skb){
  1819. wan_dev_kfree_skb(skb, FREE_READ);
  1820. }
  1821. }
  1822. goto rx_done;
  1823. }
  1824. /* Copy data from the board into the socket buffer */
  1825. if ((offs + len) > card->u.f.rx_top + 1) {
  1826. unsigned tmp = card->u.f.rx_top - offs + 1;
  1827. buf = skb_put(skb, tmp);
  1828. sdla_peek(&card->hw, offs, buf, tmp);
  1829. offs = card->u.f.rx_base;
  1830. len -= tmp;
  1831. }
  1832. buf = skb_put(skb, len);
  1833. sdla_peek(&card->hw, offs, buf, len);
  1834. /* We got the packet from the bard. 
  1835.          * Check the packet type and take appropriate action */
  1836. udp_type = udp_pkt_type( skb, card );
  1837. if(udp_type != UDP_INVALID_TYPE) {
  1838. /* UDP Debug packet received, store the
  1839.  * packet and handle it in timer interrupt */
  1840. skb_pull(skb, 1); 
  1841. if (wanrouter_type_trans(skb, dev)){ 
  1842. if(store_udp_mgmt_pkt(udp_type,UDP_PKT_FRM_NETWORK,card,skb,dlci)){
  1843. flags->imask |= FR_INTR_TIMER;
  1844. if (udp_type == UDP_FPIPE_TYPE){
  1845. ++chan->drvstats_rx_intr.rx_intr_PIPE_request;
  1846. }
  1847. }
  1848. }
  1849. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1850. }else if (chan->common.usedby == API) {
  1851. /* We are in API mode. 
  1852.                  * Add an API header to the RAW packet
  1853.                  * and queue it into a circular buffer.
  1854.                  * Then kick the fr_bh() bottom half handler */
  1855. api_rx_hdr_t* api_rx_hdr;
  1856. chan->drvstats_rx_intr.rx_intr_bfr_passed_to_stack ++;
  1857. chan->ifstats.rx_packets ++;
  1858. card->wandev.stats.rx_packets ++;
  1859. chan->ifstats.rx_bytes += skb->len;
  1860. card->wandev.stats.rx_bytes += skb->len;
  1861. skb_push(skb, sizeof(api_rx_hdr_t));
  1862. api_rx_hdr = (api_rx_hdr_t*)&skb->data[0x00];
  1863. api_rx_hdr->attr = frbuf->attr;
  1864. api_rx_hdr->time_stamp = frbuf->tmstamp;
  1865. skb->protocol = htons(ETH_P_IP);
  1866. skb->mac.raw  = skb->data;
  1867. skb->dev      = dev;
  1868. skb->pkt_type = WAN_PACKET_DATA;
  1869. bh_enqueue(dev, skb);
  1870. trigger_fr_bh(chan);
  1871. #endif
  1872. }else if (handle_IPXWAN(skb->data,chan->name,chan->enable_IPX, chan->network_number)){
  1873. //FIXME: Frame Relay IPX is not supported, Yet !
  1874. //if (chan->enable_IPX) {
  1875. // fr_send(card, dlci, 0, skb->len,skb->data);
  1876. //}
  1877. wan_dev_kfree_skb(skb, FREE_READ);
  1878. } else if (is_arp(skb->data)) {
  1879. /* ARP support enabled Mar 16 2000 
  1880.  * Process incoming ARP reply/request, setup
  1881.  * dynamic routes. */ 
  1882. if (process_ARP((arphdr_1490_t *)skb->data, card, dev)) {
  1883. if (net_ratelimit()){  
  1884. printk (KERN_INFO 
  1885.    "%s: Error processing ARP Packet.n", 
  1886. card->devname);
  1887. }
  1888. }
  1889. wan_dev_kfree_skb(skb, FREE_READ);
  1890. } else if (skb->data[0] != 0x03) {
  1891. if (net_ratelimit()) { 
  1892. printk(KERN_INFO "%s: Non IETF packet discarded.n", 
  1893. card->devname);
  1894. }
  1895. wan_dev_kfree_skb(skb, FREE_READ);
  1896. } else {
  1897. len_incl_hdr = skb->len;
  1898. /* Decapsulate packet and pass it up the
  1899.    protocol stack */
  1900. skb->dev = dev;
  1901. if (chan->common.usedby == BRIDGE || chan->common.usedby == BRIDGE_NODE){
  1902. /* Make sure it's an Ethernet frame, otherwise drop it */
  1903. if (!memcmp(skb->data, "x03x00x80x00x80xC2x00x07", 8)) {
  1904. skb_pull(skb, 8);
  1905. skb->protocol=eth_type_trans(skb,dev);
  1906. }else{
  1907. ++chan->drvstats_rx_intr.rx_intr_bfr_not_passed_to_stack;
  1908. ++chan->ifstats.rx_errors;
  1909. ++card->wandev.stats.rx_errors;
  1910. goto rx_done;
  1911. }
  1912. }else{
  1913. /* remove hardware header */
  1914. buf = skb_pull(skb, 1); 
  1915. if (!wanrouter_type_trans(skb, dev)) {
  1916. /* can't decapsulate packet */
  1917. wan_dev_kfree_skb(skb, FREE_READ);
  1918. ++chan->drvstats_rx_intr.rx_intr_bfr_not_passed_to_stack;
  1919. ++chan->ifstats.rx_errors;
  1920. ++card->wandev.stats.rx_errors;
  1921. goto rx_done;
  1922. }
  1923. skb->mac.raw = skb->data;
  1924. /* Send a packed up the IP stack */
  1925. netif_rx(skb);
  1926. ++chan->drvstats_rx_intr.rx_intr_bfr_passed_to_stack;
  1927. ++chan->ifstats.rx_packets;
  1928. ++card->wandev.stats.rx_packets;
  1929. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1930. chan->ifstats.rx_bytes += len_incl_hdr;
  1931. card->wandev.stats.rx_bytes += len_incl_hdr;
  1932. #endif
  1933. }
  1934. rx_done:
  1935.         /* Release buffer element and calculate a pointer to the next one */ 
  1936.         frbuf->flag = 0;
  1937. card->rxmb = ++frbuf;
  1938. if ((void*)frbuf > card->u.f.rxmb_last)
  1939. card->rxmb = card->u.f.rxmb_base;
  1940. }
  1941. /*==================================================================
  1942.  * tx_intr: Transmit interrupt handler.
  1943.  *
  1944.  * Rationale:
  1945.  *      If the board is busy transmitting, if_send() will
  1946.  *      buffers a single packet and turn on
  1947.  *      the tx interrupt. Tx interrupt will be called
  1948.  *      by the board, once the firmware can send more
  1949.  *      data. Thus, no polling is required.  
  1950.  *
  1951.  * Description:
  1952.  * Tx interrupt is called for each 
  1953.  *      configured dlci channel. Thus: 
  1954.  *  1. Obtain the netowrk interface based on the
  1955.  *         dlci number.
  1956.  *      2. Check that network interface is up and
  1957.  *         properly setup.
  1958.  *  3. Check for a buffered packed.
  1959.  *      4. Transmit the packed.
  1960.  * 5. If we are in WANPIPE mode, mark the 
  1961.  *         NET_BH handler. 
  1962.  *      6. If we are in API mode, kick
  1963.  *         the AF_WANPIPE socket for more data. 
  1964.  *    
  1965.  */
  1966. static void tx_intr(sdla_t *card)
  1967. {
  1968.         fr508_flags_t* flags = card->flags;
  1969.         fr_tx_buf_ctl_t* bctl;
  1970.         netdevice_t* dev;
  1971.         fr_channel_t* chan;
  1972.         if(card->hw.type == SDLA_S514){
  1973.                 bctl = (void*)(flags->tse_offs + card->hw.dpmbase);
  1974.         }else{
  1975.                 bctl = (void*)(flags->tse_offs - FR_MB_VECTOR +
  1976.                         card->hw.dpmbase);
  1977. }
  1978.         /* Find the structure and make it unbusy */
  1979.         dev = find_channel(card, flags->dlci);
  1980. if (dev == NULL){
  1981. printk(KERN_INFO "NO DEV IN TX Interruptn");
  1982. goto end_of_tx_intr;
  1983. }
  1984.         if ((chan = dev->priv) == NULL){
  1985. printk(KERN_INFO "NO CHAN IN TX Interruptn");
  1986. goto end_of_tx_intr;
  1987. }
  1988.         if(!chan->transmit_length || !chan->delay_skb) {
  1989.                 printk(KERN_INFO "%s: tx int error - transmit length zeron",
  1990. card->wandev.name);
  1991.                 goto end_of_tx_intr;
  1992.         }
  1993. /* If the 'if_send()' procedure is currently checking the 'tbusy'
  1994.    status, then we cannot transmit. Instead, we configure the microcode
  1995.    so as to re-issue this transmit interrupt at a later stage. 
  1996. */
  1997. if (test_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical)) {
  1998. fr_dlci_interface_t* dlci_interface = chan->dlci_int_interface;
  1999. bctl->flag = 0xA0;
  2000. dlci_interface->gen_interrupt |= FR_INTR_TXRDY;
  2001. return;
  2002.   }else{
  2003.          bctl->dlci = flags->dlci;
  2004.         bctl->length = chan->transmit_length+chan->fr_header_len;
  2005.          sdla_poke(&card->hw, 
  2006.           fr_send_hdr(card,bctl->dlci,bctl->offset), 
  2007.   chan->delay_skb->data,
  2008.                    chan->delay_skb->len);
  2009.         bctl->flag = 0xC0;
  2010. ++chan->ifstats.tx_packets;
  2011. ++card->wandev.stats.tx_packets;
  2012. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  2013. chan->ifstats.tx_bytes += chan->transmit_length;
  2014. card->wandev.stats.tx_bytes += chan->transmit_length;
  2015. #endif
  2016. /* We must free an sk buffer, which we used
  2017.  * for delayed transmission; Otherwise, the sock
  2018.  * will run out of memory */
  2019.                 wan_dev_kfree_skb(chan->delay_skb, FREE_WRITE);
  2020. chan->delay_skb = NULL;
  2021.          chan->transmit_length = 0;
  2022. #ifdef LINUX_2_4
  2023. dev->trans_start = jiffies;
  2024. #endif
  2025. #ifdef LINUX_2_0
  2026. wake_net_dev(dev);
  2027. #else
  2028. if (is_queue_stopped(dev)){
  2029. /* If using API, than wakeup socket BH handler */
  2030. if (chan->common.usedby == API){
  2031. start_net_queue(dev);
  2032. wakeup_sk_bh(dev);
  2033. }else{
  2034. wake_net_dev(dev);
  2035. }
  2036. }
  2037. #endif
  2038. }
  2039. end_of_tx_intr:
  2040.   /* if any other interfaces have transmit interrupts pending, 
  2041.  * do not disable the global transmit interrupt */
  2042. if(!(-- card->u.f.tx_interrupts_pending))
  2043.                 flags->imask &= ~FR_INTR_TXRDY;
  2044. }
  2045. /*============================================================================
  2046.  * timer_intr: Timer interrupt handler.
  2047.  *
  2048.  * Rationale:
  2049.  * All commans must be executed within the timer
  2050.  *      interrupt since no two commands should execute
  2051.  *      at the same time.
  2052.  *
  2053.  * Description:
  2054.  * The timer interrupt is used to:
  2055.  *     1. Processing udp calls from 'fpipemon'.
  2056.  *     2. Processing update calls from /proc file system
  2057.  *    3. Reading board-level statistics for 
  2058.  *         updating the proc file system.
  2059.  *     4. Sending inverse ARP request packets.
  2060.  * 5. Configure a dlci/channel.
  2061.  * 6. Unconfigure a dlci/channel. (Node only)
  2062.  */
  2063. static void timer_intr(sdla_t *card)
  2064. {
  2065. fr508_flags_t* flags = card->flags;
  2066. /* UDP Debuging: fpipemon call */
  2067.         if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_UDP) {
  2068. if(card->u.f.udp_type == UDP_FPIPE_TYPE) {
  2069.                      if(process_udp_mgmt_pkt(card)) {
  2070.                 card->u.f.timer_int_enabled &=
  2071. ~TMR_INT_ENABLED_UDP;
  2072. }
  2073. }
  2074.         }
  2075. /* /proc update call : triggered from update() */
  2076. if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_UPDATE) {
  2077. fr_get_err_stats(card);
  2078. fr_get_stats(card);
  2079. card->u.f.update_comms_stats = 0;
  2080. card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UPDATE;
  2081. }
  2082. /* Update the channel state call.  This is call is
  2083.          * triggered by if_send() function */
  2084. if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_UPDATE_STATE){
  2085. netdevice_t *dev;
  2086. if (card->wandev.state == WAN_CONNECTED){
  2087. for (dev=card->wandev.dev; dev; dev = *((netdevice_t **)dev->priv)){
  2088. fr_channel_t *chan = dev->priv;
  2089. if (chan->common.state != WAN_CONNECTED){
  2090. update_chan_state(dev);
  2091. }
  2092. }
  2093. }
  2094. card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UPDATE_STATE;
  2095. }
  2096. /* configure a dlci/channel */
  2097. if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_CONFIG){
  2098. config_fr(card);
  2099. card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_CONFIG;
  2100. }
  2101. /* unconfigure a dlci/channel */
  2102. if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_UNCONFIG){
  2103. unconfig_fr(card);
  2104. card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UNCONFIG;
  2105. }
  2106. /* Transmit ARP packets */
  2107. if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_ARP){
  2108. int i=0;
  2109. netdevice_t *dev;
  2110. if (card->u.f.arp_dev == NULL)
  2111. card->u.f.arp_dev = card->wandev.dev;
  2112. dev = card->u.f.arp_dev;
  2113. for (;;){ 
  2114. fr_channel_t *chan = dev->priv;
  2115. /* If the interface is brought down cancel sending In-ARPs */
  2116. if (!(dev->flags&IFF_UP)){
  2117. clear_bit(0,&chan->inarp_ready);
  2118. }
  2119. if (test_bit(0,&chan->inarp_ready)){
  2120. if (check_tx_status(card,dev)){
  2121. set_bit(ARP_CRIT,&card->wandev.critical);
  2122. break;
  2123. }
  2124. if (!send_inarp_request(card,dev)){
  2125. trigger_fr_arp(dev);
  2126. chan->inarp_tick = jiffies;
  2127. }
  2128. clear_bit(0,&chan->inarp_ready);
  2129. dev = move_dev_to_next(card,dev);
  2130. break;
  2131. }
  2132. dev = move_dev_to_next(card,dev);
  2133. if (++i == card->wandev.new_if_cnt){
  2134. card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_ARP;
  2135. break;
  2136. }
  2137. }
  2138. card->u.f.arp_dev = dev;
  2139. }
  2140.         if(!card->u.f.timer_int_enabled)
  2141.                 flags->imask &= ~FR_INTR_TIMER;
  2142. }
  2143. /*============================================================================
  2144.  * spur_intr: Spurious interrupt handler.
  2145.  * 
  2146.  * Description:
  2147.  *   We don't know this interrupt.
  2148.  *      Print a warning.
  2149.  */
  2150. static void spur_intr (sdla_t* card)
  2151. {
  2152. if (net_ratelimit()){ 
  2153. printk(KERN_INFO "%s: spurious interrupt!n", card->devname);
  2154. }
  2155. }
  2156. //FIXME: Fix the IPX in next version
  2157. /*===========================================================================
  2158.  *  Return 0 for non-IPXWAN packet
  2159.  *         1 for IPXWAN packet or IPX is not enabled!
  2160.  *  FIXME: Use a IPX structure here not offsets
  2161.  */
  2162. static int handle_IPXWAN(unsigned char *sendpacket, 
  2163.  char *devname, unsigned char enable_IPX, 
  2164.  unsigned long network_number)
  2165. {
  2166. int i;
  2167. if( sendpacket[1] == 0x00 && sendpacket[2] == 0x80 &&
  2168.     sendpacket[6] == 0x81 && sendpacket[7] == 0x37) { 
  2169. /* It's an IPX packet */
  2170. if (!enable_IPX){
  2171. /* Return 1 so we don't pass it up the stack. */
  2172. //FIXME: Take this out when IPX is fixed
  2173. if (net_ratelimit()){ 
  2174. printk (KERN_INFO 
  2175. "%s: WARNING: Unsupported IPX packet received and droppedn",
  2176. devname);
  2177. }
  2178. return 1;
  2179. }
  2180. } else {
  2181. /* It's not IPX so return and pass it up the stack. */
  2182. return 0;
  2183. }
  2184. if( sendpacket[24] == 0x90 && sendpacket[25] == 0x04){
  2185. /* It's IPXWAN */
  2186. if( sendpacket[10] == 0x02 && sendpacket[42] == 0x00){
  2187. /* It's a timer request packet */
  2188. printk(KERN_INFO "%s: Received IPXWAN Timer Request packetn",
  2189. devname);
  2190. /* Go through the routing options and answer no to every
  2191.  * option except Unnumbered RIP/SAP
  2192.  */
  2193. for(i = 49; sendpacket[i] == 0x00; i += 5){
  2194. /* 0x02 is the option for Unnumbered RIP/SAP */
  2195. if( sendpacket[i + 4] != 0x02){
  2196. sendpacket[i + 1] = 0;
  2197. }
  2198. }
  2199. /* Skip over the extended Node ID option */
  2200. if( sendpacket[i] == 0x04 ){
  2201. i += 8;
  2202. }
  2203. /* We also want to turn off all header compression opt.
  2204.  */
  2205. for(; sendpacket[i] == 0x80 ;){
  2206. sendpacket[i + 1] = 0;
  2207. i += (sendpacket[i + 2] << 8) + (sendpacket[i + 3]) + 4;
  2208. }
  2209. /* Set the packet type to timer response */
  2210. sendpacket[42] = 0x01;
  2211. printk(KERN_INFO "%s: Sending IPXWAN Timer Responsen",
  2212. devname);
  2213. } else if( sendpacket[42] == 0x02 ){
  2214. /* This is an information request packet */
  2215. printk(KERN_INFO 
  2216. "%s: Received IPXWAN Information Request packetn",
  2217. devname);
  2218. /* Set the packet type to information response */
  2219. sendpacket[42] = 0x03;
  2220. /* Set the router name */
  2221. sendpacket[59] = 'F';
  2222. sendpacket[60] = 'P';
  2223. sendpacket[61] = 'I';
  2224. sendpacket[62] = 'P';
  2225. sendpacket[63] = 'E';
  2226. sendpacket[64] = '-';
  2227. sendpacket[65] = CVHexToAscii(network_number >> 28);
  2228. sendpacket[66] = CVHexToAscii((network_number & 0x0F000000)>> 24);
  2229. sendpacket[67] = CVHexToAscii((network_number & 0x00F00000)>> 20);
  2230. sendpacket[68] = CVHexToAscii((network_number & 0x000F0000)>> 16);
  2231. sendpacket[69] = CVHexToAscii((network_number & 0x0000F000)>> 12);
  2232. sendpacket[70] = CVHexToAscii((network_number & 0x00000F00)>> 8);
  2233. sendpacket[71] = CVHexToAscii((network_number & 0x000000F0)>> 4);
  2234. sendpacket[72] = CVHexToAscii(network_number & 0x0000000F);
  2235. for(i = 73; i < 107; i+= 1)
  2236. {
  2237. sendpacket[i] = 0;
  2238. }
  2239. printk(KERN_INFO "%s: Sending IPXWAN Information Response packetn",
  2240. devname);
  2241. } else {