1 /****************************************************************************
2 * sdla_fr.c WANPIPE(tm) Multiprotocol WAN Link Driver. Frame relay module.
4 * Author(s): Gene Kozin
5 * Jaspreet Singh <jaspreet@sangoma.com>
7 * Copyright: (c) 1995-1997 Sangoma Technologies Inc.
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 26, 1997 Jaspreet Singh o Improved load sharing with multiple boards
15 * o Added Cli() to protect enabling of interrupts
16 * while polling is called.
17 * Nov 24, 1997 Jaspreet Singh o Added counters to avoid enabling of interrupts
18 * when they have been disabled by another
19 * interface or routine (eg. wpf_poll).
20 * Nov 06, 1997 Jaspreet Singh o Added INTR_TEST_MODE to avoid polling
21 * routine disable interrupts during interrupt
23 * Oct 20, 1997 Jaspreet Singh o Added hooks in for Router UP time.
24 * Oct 16, 1997 Jaspreet Singh o The critical flag is used to maintain flow
25 * control by avoiding RACE conditions. The
26 * cli() and restore_flags() are taken out.
27 * The fr_channel structure is appended for
29 * Oct 15, 1997 Farhan Thawar o updated if_send() and receive for IPX
30 * Aug 29, 1997 Farhan Thawar o Removed most of the cli() and sti()
31 * o Abstracted the UDP management stuff
32 * o Now use tbusy and critical more intelligently
33 * Jul 21, 1997 Jaspreet Singh o Can configure T391, T392, N391, N392 & N393
34 * through router.conf.
35 * o Protected calls to sdla_peek() by adDing
36 * save_flags(), cli() and restore_flags().
37 * o Added error message for Inactive DLCIs in
38 * fr_event() and update_chan_state().
39 * o Fixed freeing up of buffers using kfree()
40 * when packets are received.
41 * Jul 07, 1997 Jaspreet Singh o Added configurable TTL for UDP packets
42 * o Added ability to discard multicast and
43 * broadcast source addressed packets
44 * Jun 27, 1997 Jaspreet Singh o Added FT1 monitor capabilities
45 * New case (0x44) statement in if_send routine * Added a global variable rCount to keep track
46 * of FT1 status enabled on the board.
47 * May 29, 1997 Jaspreet Singh o Fixed major Flow Control Problem
48 * With multiple boards a problem was seen where
49 * the second board always stopped transmitting
50 * packet after running for a while. The code
51 * got into a stage where the interrupts were
52 * disabled and dev->tbusy was set to 1.
53 * This caused the If_send() routine to get into* the if clause for it(0,dev->tbusy)
55 * The code got into this stage due to an
56 * interrupt occuring within the if clause for
57 * set_bit(0,dev->tbusy). Since an interrupt
58 * disables furhter transmit interrupt and
59 * makes dev->tbusy = 0, this effect was undone * by making dev->tbusy = 1 in the if clause.
60 * The Fix checks to see if Transmit interrupts
61 * are disabled then do not make dev->tbusy = 1
62 * Introduced a global variable: int_occur and
63 * added tx_int_enabled in the wan_device
65 * May 21, 1997 Jaspreet Singh o Fixed UDP Management for multiple
68 * Apr 25, 1997 Farhan Thawar o added UDP Management stuff
69 * o fixed bug in if_send() and tx_intr() to
70 * sleep and wakeup all devices
71 * Mar 11, 1997 Farhan Thawar Version 3.1.1
72 * o fixed (+1) bug in fr508_rx_intr()
73 * o changed if_send() to return 0 if
74 * wandev.critical() is true
75 * o free socket buffer in if_send() if
77 * o added tx_intr() routine
78 * Jan 30, 1997 Gene Kozin Version 3.1.0
79 * o implemented exec() entry point
80 * o fixed a bug causing driver configured as
81 * a FR switch to be stuck in WAN_
83 * Jan 02, 1997 Gene Kozin Initial version.
84 *****************************************************************************/
86 #if !defined(__KERNEL__) || !defined(MODULE)
87 #error This code MUST be compiled as a kernel module!
90 #include <linux/config.h> /* OS configuration options */
91 #include <linux/kernel.h> /* printk(), and other useful stuff */
92 #include <linux/stddef.h> /* offsetof(), etc. */
93 #include <linux/errno.h> /* return codes */
94 #include <linux/string.h> /* inline memset(), etc. */
95 #include <linux/malloc.h> /* kmalloc(), kfree() */
96 #include <linux/init.h> /* __initfunc */
97 #include <linux/wanrouter.h> /* WAN router definitions */
98 #include <linux/wanpipe.h> /* WANPIPE common user API definitions */
99 #include <linux/if_arp.h> /* ARPHRD_* defines */
100 #include <asm/byteorder.h> /* htons(), etc. */
101 #include <asm/io.h> /* for inb(), outb(), etc. */
102 #include <asm/uaccess.h>
103 #include <linux/time.h> /* for do_gettimeofday */
106 #include <linux/sdla_fr.h> /* frame relay firmware API definitions */
107 /****** Defines & Macros ****************************************************/
109 #define MAX_CMD_RETRY 10 /* max number of firmware retries */
111 #define FR_HEADER_LEN 8 /* max encapsulation header size */
112 #define FR_CHANNEL_MTU 1500 /* unfragmented logical channel MTU */
114 /* Q.922 frame types */
115 #define Q922_UI 0x03 /* Unnumbered Info frame */
116 #define Q922_XID 0xAF /* ??? */
118 /* DLCI configured or not */
119 #define DLCI_NOT_CONFIGURED 0x00
120 #define DLCI_CONFIG_PENDING 0x01
121 #define DLCI_CONFIGURED 0x02
123 /* CIR enabled or not */
124 #define CIR_ENABLED 0x00
125 #define CIR_DISABLED 0x01
127 /* Interrupt mode for DLCI = 0 */
128 #define BUFFER_INTR_MODE 0x00
129 #define DLCI_LIST_INTR_MODE 0x01
131 /* Transmit Interrupt Status */
132 #define DISABLED 0x00
133 #define WAITING_TO_BE_ENABLED 0x01
135 /* For handle_IPXWAN() */
136 #define CVHexToAscii(b) (((unsigned char)(b) > (unsigned char)9) ? ((unsigned char)'A' + ((unsigned char)(b) - (unsigned char)10)) : ((unsigned char)'0' + (unsigned char)(b)))
138 /****** Data Structures *****************************************************/
140 /* This is an extention of the 'struct device' we create for each network
141 * interface to keep the rest of channel-specific data.
143 typedef struct fr_channel
145 char name
[WAN_IFNAME_SZ
+1]; /* interface name, ASCIIZ */
146 unsigned dlci_configured
; /* check whether configured or not */
147 unsigned cir_status
; /* check whether CIR enabled or not */
148 unsigned dlci
; /* logical channel number */
149 unsigned cir
; /* committed information rate */
150 unsigned bc
; /* committed burst size */
151 unsigned be
; /* excess burst size */
152 unsigned mc
; /* multicast support on or off */
153 unsigned tx_int_status
; /* Transmit Interrupt Status */
154 unsigned short pkt_length
; /* Packet Length */
155 unsigned long router_start_time
;/* Router start time in seconds */
156 unsigned long tick_counter
; /* counter for transmit time out */
157 char dev_pending_devtint
; /* interface pending dev_tint() */
158 char state
; /* channel state */
159 void* dlci_int_interface
; /* pointer to the DLCI Interface */
160 unsigned long IB_addr
; /* physical address of Interface Byte */
161 unsigned long state_tick
; /* time of the last state change */
162 sdla_t
* card
; /* -> owner */
163 struct enet_statistics ifstats
; /* interface statistics */
165 unsigned long if_send_entry
;
166 unsigned long if_send_skb_null
;
167 unsigned long if_send_broadcast
;
168 unsigned long if_send_multicast
;
169 unsigned long if_send_critical_ISR
;
170 unsigned long if_send_critical_non_ISR
;
171 unsigned long if_send_busy
;
172 unsigned long if_send_busy_timeout
;
173 unsigned long if_send_FPIPE_request
;
174 unsigned long if_send_DRVSTATS_request
;
175 unsigned long if_send_wan_disconnected
;
176 unsigned long if_send_dlci_disconnected
;
177 unsigned long if_send_no_bfrs
;
178 unsigned long if_send_adptr_bfrs_full
;
179 unsigned long if_send_bfrs_passed_to_adptr
;
181 unsigned long rx_intr_no_socket
;
182 unsigned long rx_intr_dev_not_started
;
183 unsigned long rx_intr_FPIPE_request
;
184 unsigned long rx_intr_DRVSTATS_request
;
185 unsigned long rx_intr_bfr_not_passed_to_stack
;
186 unsigned long rx_intr_bfr_passed_to_stack
;
188 unsigned long UDP_FPIPE_mgmt_kmalloc_err
;
189 unsigned long UDP_FPIPE_mgmt_direction_err
;
190 unsigned long UDP_FPIPE_mgmt_adptr_type_err
;
191 unsigned long UDP_FPIPE_mgmt_adptr_cmnd_OK
;
192 unsigned long UDP_FPIPE_mgmt_adptr_cmnd_timeout
;
193 unsigned long UDP_FPIPE_mgmt_adptr_send_passed
;
194 unsigned long UDP_FPIPE_mgmt_adptr_send_failed
;
195 unsigned long UDP_FPIPE_mgmt_not_passed_to_stack
;
196 unsigned long UDP_FPIPE_mgmt_passed_to_stack
;
197 unsigned long UDP_FPIPE_mgmt_no_socket
;
198 unsigned long UDP_DRVSTATS_mgmt_kmalloc_err
;
199 unsigned long UDP_DRVSTATS_mgmt_adptr_cmnd_OK
;
200 unsigned long UDP_DRVSTATS_mgmt_adptr_cmnd_timeout
;
201 unsigned long UDP_DRVSTATS_mgmt_adptr_send_passed
;
202 unsigned long UDP_DRVSTATS_mgmt_adptr_send_failed
;
203 unsigned long UDP_DRVSTATS_mgmt_not_passed_to_stack
;
204 unsigned long UDP_DRVSTATS_mgmt_passed_to_stack
;
205 unsigned long UDP_DRVSTATS_mgmt_no_socket
;
206 unsigned long router_up_time
;
209 typedef struct dlci_status
211 unsigned short dlci PACKED
;
212 unsigned char state PACKED
;
215 typedef struct dlci_IB_mapping
217 unsigned short dlci PACKED
;
218 unsigned long addr_value PACKED
;
221 /* This structure is used for DLCI list Tx interrupt mode. It is used to
222 enable interrupt bit and set the packet length for transmission
224 typedef struct fr_dlci_interface
226 unsigned char gen_interrupt PACKED
;
227 unsigned short packet_length PACKED
;
228 unsigned char reserved PACKED
;
229 } fr_dlci_interface_t
;
231 static unsigned short num_frames
;
232 static unsigned long curr_trace_addr
;
233 static unsigned long start_trace_addr
;
234 static unsigned short available_buffer_space
;
235 static char TracingEnabled
;
237 /* variable for keeping track of enabling/disabling FT1 monitor status */
238 static int rCount
= 0;
240 extern void disable_irq(unsigned int);
241 extern void enable_irq(unsigned int);
243 /* variable for keeping track of number of interrupts generated during
244 * interrupt test routine
246 static int Intr_test_counter
;
248 /****** Function Prototypes *************************************************/
250 /* WAN link driver entry points. These are called by the WAN router module. */
251 static int update (wan_device_t
* wandev
);
252 static int new_if (wan_device_t
* wandev
, struct device
* dev
,
254 static int del_if (wan_device_t
* wandev
, struct device
* dev
);
256 /* WANPIPE-specific entry points */
257 static int wpf_exec (struct sdla
* card
, void* u_cmd
, void* u_data
);
259 /* Network device interface */
260 static int if_init (struct device
* dev
);
261 static int if_open (struct device
* dev
);
262 static int if_close (struct device
* dev
);
263 static int if_header (struct sk_buff
* skb
, struct device
* dev
,
264 unsigned short type
, void* daddr
, void* saddr
, unsigned len
);
265 static int if_rebuild_hdr (struct sk_buff
* skb
);
266 static int if_send (struct sk_buff
* skb
, struct device
* dev
);
267 static struct enet_statistics
* if_stats (struct device
* dev
);
269 /* Interrupt handlers */
270 static void fr502_isr (sdla_t
* card
);
271 static void fr508_isr (sdla_t
* card
);
272 static void fr502_rx_intr (sdla_t
* card
);
273 static void fr508_rx_intr (sdla_t
* card
);
274 static void tx_intr (sdla_t
* card
);
275 static void spur_intr (sdla_t
* card
);
277 /* Background polling routines */
278 static void wpf_poll (sdla_t
* card
);
280 /* Frame relay firmware interface functions */
281 static int fr_read_version (sdla_t
* card
, char* str
);
282 static int fr_configure (sdla_t
* card
, fr_conf_t
*conf
);
283 static int fr_dlci_configure (sdla_t
* card
, fr_dlc_conf_t
*conf
, unsigned dlci
);
284 static int fr_set_intr_mode (sdla_t
* card
, unsigned mode
, unsigned mtu
);
285 static int fr_comm_enable (sdla_t
* card
);
286 static int fr_comm_disable (sdla_t
* card
);
287 static int fr_get_err_stats (sdla_t
* card
);
288 static int fr_get_stats (sdla_t
* card
);
289 static int fr_add_dlci (sdla_t
* card
, int dlci
, int num
);
290 static int fr_activate_dlci (sdla_t
* card
, int dlci
, int num
);
291 static int fr_issue_isf (sdla_t
* card
, int isf
);
292 static int fr502_send (sdla_t
* card
, int dlci
, int attr
, int len
, void *buf
);
293 static int fr508_send (sdla_t
* card
, int dlci
, int attr
, int len
, void *buf
);
295 /* Firmware asynchronous event handlers */
296 static int fr_event (sdla_t
* card
, int event
, fr_mbox_t
* mbox
);
297 static int fr_modem_failure (sdla_t
*card
, fr_mbox_t
* mbox
);
298 static int fr_dlci_change (sdla_t
*card
, fr_mbox_t
* mbox
);
300 /* Miscellaneous functions */
301 static int update_chan_state (struct device
* dev
);
302 static void set_chan_state (struct device
* dev
, int state
);
303 static struct device
* find_channel (sdla_t
* card
, unsigned dlci
);
304 static int is_tx_ready (sdla_t
* card
, fr_channel_t
* chan
);
305 static unsigned int dec_to_uint (unsigned char* str
, int len
);
306 static int reply_udp( unsigned char *data
, unsigned int mbox_len
);
308 static int intr_test( sdla_t
* card
);
309 static void init_chan_statistics( fr_channel_t
* chan
);
310 static void init_global_statistics( sdla_t
* card
);
311 static void read_DLCI_IB_mapping( sdla_t
* card
, fr_channel_t
* chan
);
313 /* Udp management functions */
314 static int process_udp_mgmt_pkt(char udp_pkt_src
, sdla_t
* card
, struct sk_buff
*skb
, struct device
* dev
, int dlci
, fr_channel_t
* chan
);
315 static int process_udp_driver_call(char udp_pkt_src
, sdla_t
* card
, struct sk_buff
*skb
, struct device
* dev
, int dlci
, fr_channel_t
* chan
);
316 static int udp_pkt_type( struct sk_buff
*skb
, sdla_t
* card
);
319 static void switch_net_numbers(unsigned char *sendpacket
, unsigned long network_number
, unsigned char incoming
);
320 static int handle_IPXWAN(unsigned char *sendpacket
, char *devname
, unsigned char enable_IPX
, unsigned long network_number
);
322 /****** Public Functions ****************************************************/
324 /*============================================================================
325 * Frame relay protocol initialization routine.
327 * This routine is called by the main WANPIPE module during setup. At this
328 * point adapter is completely initialized and firmware is running.
329 * o read firmware version (to make sure it's alive)
330 * o configure adapter
331 * o initialize protocol-specific fields of the adapter data space.
336 __initfunc(int wpf_init(sdla_t
* card
, wandev_conf_t
* conf
))
343 /* Verify configuration ID */
344 if (conf
->config_id
!= WANCONFIG_FR
) {
345 printk(KERN_INFO
"%s: invalid configuration ID %u!\n",
346 card
->devname
, conf
->config_id
);
349 /* Initialize protocol-specific fields of adapter data space */
350 switch (card
->hw
.fwid
)
353 card
->mbox
= (void *) (card
->hw
.dpmbase
+ FR502_MBOX_OFFS
);
354 card
->rxmb
= (void *) (card
->hw
.dpmbase
+ FR502_RXMB_OFFS
);
355 card
->flags
= (void *) (card
->hw
.dpmbase
+ FR502_FLAG_OFFS
);
356 card
->isr
= &fr502_isr
;
360 card
->mbox
= (void *) (card
->hw
.dpmbase
+ FR508_MBOX_OFFS
);
361 card
->flags
= (void *) (card
->hw
.dpmbase
+ FR508_FLAG_OFFS
);
362 card
->isr
= &fr508_isr
;
369 /* Read firmware version. Note that when adapter initializes, it
370 * clears the mailbox, so it may appear that the first command was
371 * executed successfully when in fact it was merely erased. To work
372 * around this, we execute the first command twice.
374 if (fr_read_version(card
, NULL
) || fr_read_version(card
, u
.str
))
377 printk(KERN_INFO
"%s: running frame relay firmware v%s\n",
378 card
->devname
, u
.str
);
380 /* Adjust configuration */
381 conf
->mtu
= max(min(conf
->mtu
, 4080), FR_CHANNEL_MTU
+ FR_HEADER_LEN
);
382 conf
->bps
= min(conf
->bps
, 2048000);
384 /* Configure adapter firmware */
385 memset(&u
.cfg
, 0, sizeof(u
.cfg
));
386 u
.cfg
.mtu
= conf
->mtu
;
392 u
.cfg
.kbps
= conf
->bps
/ 1000;
394 u
.cfg
.cir_bwd
= u
.cfg
.bc_fwd
= u
.cfg
.bc_bwd
= u
.cfg
.cir_fwd
;
395 u
.cfg
.options
= 0x0081; /* direct Rx, no CIR check */
397 switch (conf
->u
.fr
.signalling
)
400 u
.cfg
.options
|= 0x0200;
403 u
.cfg
.options
|= 0x0400;
407 if (conf
->station
== WANOPT_CPE
)
409 u
.cfg
.options
|= 0x8000; /* auto config DLCI */
413 u
.cfg
.station
= 1; /* switch emulation mode */
414 card
->u
.f
.node_dlci
= conf
->u
.fr
.dlci
? conf
->u
.fr
.dlci
: 16;
415 card
->u
.f
.dlci_num
= min(max(conf
->u
.fr
.dlci_num
, 1), 100);
418 if (conf
->clocking
== WANOPT_INTERNAL
)
421 if (conf
->interface
== WANOPT_RS232
)
425 u
.cfg
.t391
= min(conf
->u
.fr
.t391
, 30);
427 u
.cfg
.t392
= min(conf
->u
.fr
.t392
, 30);
429 u
.cfg
.n391
= min(conf
->u
.fr
.n391
, 255);
431 u
.cfg
.n392
= min(conf
->u
.fr
.n392
, 10);
433 u
.cfg
.n393
= min(conf
->u
.fr
.n393
, 10);
435 if (fr_configure(card
, &u
.cfg
))
439 if (card
->hw
.fwid
== SFID_FR508
)
441 fr_buf_info_t
*buf_info
=
442 (void *) (card
->hw
.dpmbase
+ FR508_RXBC_OFFS
);
445 (void *) (buf_info
->rse_next
-
446 FR_MB_VECTOR
+ card
->hw
.dpmbase
);
447 card
->u
.f
.rxmb_base
=
448 (void *) (buf_info
->rse_base
-
449 FR_MB_VECTOR
+ card
->hw
.dpmbase
);
450 card
->u
.f
.rxmb_last
=
451 (void *) (buf_info
->rse_base
+
452 (buf_info
->rse_num
- 1) * sizeof(fr_buf_ctl_t
) -
453 FR_MB_VECTOR
+ card
->hw
.dpmbase
);
454 card
->u
.f
.rx_base
= buf_info
->buf_base
;
455 card
->u
.f
.rx_top
= buf_info
->buf_top
;
457 card
->wandev
.mtu
= conf
->mtu
;
458 card
->wandev
.bps
= conf
->bps
;
459 card
->wandev
.interface
= conf
->interface
;
460 card
->wandev
.clocking
= conf
->clocking
;
461 card
->wandev
.station
= conf
->station
;
462 card
->poll
= &wpf_poll
;
463 card
->exec
= &wpf_exec
;
464 card
->wandev
.update
= &update
;
465 card
->wandev
.new_if
= &new_if
;
466 card
->wandev
.del_if
= &del_if
;
467 card
->wandev
.state
= WAN_DISCONNECTED
;
468 card
->wandev
.udp_port
= conf
->udp_port
;
469 TracingEnabled
= '0';
473 /******* WAN Device Driver Entry Points *************************************/
475 /*============================================================================
476 * Update device status & statistics.
478 static int update(wan_device_t
* wandev
)
483 if ((wandev
== NULL
) || (wandev
->private == NULL
))
486 if (wandev
->state
== WAN_UNCONFIGURED
)
489 if (test_and_set_bit(0, (void *) &wandev
->critical
))
492 card
= wandev
->private;
493 fr_get_err_stats(card
);
495 wandev
->critical
= 0;
499 /*============================================================================
500 * Create new logical channel.
501 * This routine is called by the router when ROUTER_IFNEW IOCTL is being
503 * o parse media- and hardware-specific configuration
504 * o make sure that a new channel can be created
505 * o allocate resources, if necessary
506 * o prepare network device structure for registaration.
509 * < 0 failure (channel will not be created)
511 static int new_if(wan_device_t
* wandev
, struct device
*dev
, wanif_conf_t
* conf
)
513 sdla_t
*card
= wandev
->private;
517 if ((conf
->name
[0] == '\0') || (strlen(conf
->name
) > WAN_IFNAME_SZ
)) {
518 printk(KERN_INFO
"%s: invalid interface name!\n",
522 /* allocate and initialize private data */
523 chan
= kmalloc(sizeof(fr_channel_t
), GFP_KERNEL
);
527 memset(chan
, 0, sizeof(fr_channel_t
));
528 strcpy(chan
->name
, conf
->name
);
531 /* verify media address */
532 if (is_digit(conf
->addr
[0])) {
533 int dlci
= dec_to_uint(conf
->addr
, 0);
535 if (dlci
&& (dlci
<= 4095)) {
539 "%s: invalid DLCI %u on interface %s!\n",
540 wandev
->name
, dlci
, chan
->name
);
545 "%s: invalid media address on interface %s!\n",
546 wandev
->name
, chan
->name
);
554 /* place cir,be,bc and other channel specific information into the
559 chan
->cir
= max( 1, min( conf
->cir
, 512 ) );
560 chan
->cir_status
= CIR_ENABLED
;
563 chan
->bc
= max( 1, min( conf
->bc
, 512 ) );
565 chan
->be
= max( 0, min( conf
->be
, 511) );
569 chan
->cir_status
= CIR_DISABLED
;
573 chan
->dlci_configured
= DLCI_NOT_CONFIGURED
;
575 chan
->tx_int_status
= DISABLED
;
577 init_chan_statistics( chan
);
579 /* prepare network device data space for registration */
580 dev
->name
= chan
->name
;
581 dev
->init
= &if_init
;
586 /*============================================================================
587 * Delete logical channel.
589 static int del_if(wan_device_t
* wandev
, struct device
*dev
)
598 /****** WANPIPE-specific entry points ***************************************/
600 /*============================================================================
601 * Execute adapter interface command.
603 static int wpf_exec(struct sdla
*card
, void *u_cmd
, void *u_data
)
605 fr_mbox_t
*mbox
= card
->mbox
;
606 int retry
= MAX_CMD_RETRY
;
610 if (copy_from_user((void *) &cmd
, u_cmd
, sizeof(cmd
)))
612 /* execute command */
614 memcpy(&mbox
->cmd
, &cmd
, sizeof(cmd
));
616 if (copy_from_user((void *) &mbox
->data
, u_data
, cmd
.length
))
619 err
= mbox
->cmd
.result
;
623 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
626 if (copy_to_user(u_cmd
, (void *) &mbox
->cmd
, sizeof(fr_cmd_t
)))
628 len
= mbox
->cmd
.length
;
629 if (len
&& u_data
&& copy_to_user(u_data
, (void *) &mbox
->data
, len
))
634 /****** Network Device Interface ********************************************/
636 /*============================================================================
637 * Initialize Linux network interface.
639 * This routine is called only once for each interface, during Linux network
640 * interface registration. Returning anything but zero will fail interface
643 static int if_init(struct device
*dev
)
645 fr_channel_t
*chan
= dev
->priv
;
646 sdla_t
*card
= chan
->card
;
647 wan_device_t
*wandev
= &card
->wandev
;
650 /* Initialize device driver entry points */
651 dev
->open
= &if_open
;
652 dev
->stop
= &if_close
;
653 dev
->hard_header
= &if_header
;
654 dev
->rebuild_header
= &if_rebuild_hdr
;
655 dev
->hard_start_xmit
= &if_send
;
656 dev
->get_stats
= &if_stats
;
658 /* Initialize media-specific parameters */
659 dev
->family
= AF_INET
; /* address family */
660 dev
->type
= ARPHRD_DLCI
; /* ARP h/w type */
661 dev
->mtu
= FR_CHANNEL_MTU
;
662 dev
->hard_header_len
= FR_HEADER_LEN
; /* media header length */
663 dev
->addr_len
= 2; /* hardware address length */
664 *(unsigned short *) dev
->dev_addr
= htons(chan
->dlci
);
666 /* Initialize hardware parameters (just for reference) */
667 dev
->irq
= wandev
->irq
;
668 dev
->dma
= wandev
->dma
;
669 dev
->base_addr
= wandev
->ioport
;
670 dev
->mem_start
= wandev
->maddr
;
671 dev
->mem_end
= wandev
->maddr
+ wandev
->msize
- 1;
673 /* Set transmit buffer queue length */
674 dev
->tx_queue_len
= 30;
676 dev_init_buffers(dev
);
678 set_chan_state(dev
, WAN_DISCONNECTED
);
682 /*============================================================================
683 * Open network interface.
684 * o if this is the first open, then enable communications and interrupts.
685 * o prevent module from unloading by incrementing use count
687 * Return 0 if O.k. or errno.
690 static int if_open(struct device
*dev
)
692 fr_channel_t
*chan
= dev
->priv
;
693 sdla_t
*card
= chan
->card
;
696 fr508_flags_t
*flags
= card
->flags
;
700 return -EBUSY
; /* only one open is allowed */
702 if (test_and_set_bit(0, (void *) &card
->wandev
.critical
))
707 Intr_test_counter
= 0;
708 card
->intr_mode
= INTR_TEST_MODE
;
709 err
= intr_test( card
);
711 if ((err
) || (Intr_test_counter
!=(MAX_INTR_TEST_COUNTER
+1))) {
713 "%s: Interrupt Test Failed, Counter: %i\n",
714 card
->devname
, Intr_test_counter
);
716 card
->wandev
.critical
= 0;
720 printk(KERN_INFO
"%s: Interrupt Test Passed, Counter: %i\n"
721 ,card
->devname
, Intr_test_counter
);
723 /* The following allocates and intializes a circular
724 * link list of interfaces per card.
727 card
->devs_struct
= kmalloc(sizeof(load_sharing_t
), GFP_KERNEL
);
728 if (card
->devs_struct
== NULL
)
730 card
->dev_to_devtint_next
= card
->devs_struct
;
732 for (dev2
= card
->wandev
.dev
; dev2
; dev2
= dev2
->slave
) {
733 (card
->devs_struct
)->dev_ptr
= dev2
;
734 if(dev2
->slave
== NULL
)
735 (card
->devs_struct
)->next
= card
->dev_to_devtint_next
;
737 (card
->devs_struct
)->next
= kmalloc(
738 sizeof(load_sharing_t
), GFP_KERNEL
);
739 if ((card
->devs_struct
)->next
== NULL
)
741 card
->devs_struct
= (card
->devs_struct
)->next
;
745 card
->devs_struct
= card
->dev_to_devtint_next
;
747 card
->intr_mode
= BUFFER_INTR_MODE
;
750 check all the interfaces for the device to see if CIR has
751 been enabled for any DLCI(s). If so then use the DLCI list
752 Interrupt mode for fr_set_intr_mode(), otherwise use the default global interrupt mode
755 for (dev2
= card
->wandev
.dev
; dev2
; dev2
= dev2
->slave
) {
757 if( ((fr_channel_t
*)dev2
->priv
)->cir_status
759 card
->intr_mode
= DLCI_LIST_INTR_MODE
;
765 * If you enable comms and then set ints, you get a Tx int as you
766 * perform the SET_INT_TRIGGERS command. So, we only set int
767 * triggers and then adjust the interrupt mask (to disable Tx ints) before enabling comms.
769 if (card
->intr_mode
== BUFFER_INTR_MODE
)
771 if (fr_set_intr_mode(card
, 0x03, card
->wandev
.mtu
))
774 card
->wandev
.critical
= 0;
779 "%s: Global Buffering Tx Interrupt Mode\n"
783 else if (card
->intr_mode
== DLCI_LIST_INTR_MODE
)
785 if (fr_set_intr_mode(card
, 0x83, card
->wandev
.mtu
))
788 card
->wandev
.critical
= 0;
792 printk( KERN_INFO
"%s: DLCI list Tx Interrupt Mode\n",
797 flags
->imask
&= ~0x02;
799 if (fr_comm_enable(card
))
802 card
->wandev
.critical
= 0;
806 wanpipe_set_state(card
, WAN_CONNECTED
);
808 if (card
->wandev
.station
== WANOPT_CPE
)
810 /* CPE: issue full status enquiry */
811 fr_issue_isf(card
, FR_ISF_FSE
);
814 { /* FR switch: activate DLCI(s) */
816 /* For Switch emulation we have to ADD and ACTIVATE
817 * the DLCI(s) that were configured with the SET_DLCI_
818 * CONFIGURATION command. Add and Activate will fail if
819 * DLCI specified is not included in the list.
821 * Also If_open is called once for each interface. But
822 * it does not get in here for all the interface. So
823 * we have to pass the entire list of DLCI(s) to add
827 fr_add_dlci(card
, card
->u
.f
.node_dlci
[0], card
->u
.f
.dlci_num
);
828 fr_activate_dlci(card
, card
->u
.f
.node_dlci
, card
->u
.f
.dlci_num
);
831 dev
->mtu
= min(dev
->mtu
, card
->wandev
.mtu
- FR_HEADER_LEN
);
836 update_chan_state(dev
);
838 do_gettimeofday( &tv
);
839 chan
->router_start_time
= tv
.tv_sec
;
840 card
->wandev
.critical
= 0;
844 /*============================================================================
845 * Close network interface.
846 * o if this is the last open, then disable communications and interrupts.
849 static int if_close(struct device
*dev
)
851 fr_channel_t
*chan
= dev
->priv
;
852 sdla_t
*card
= chan
->card
;
854 if (test_and_set_bit(0, (void *) &card
->wandev
.critical
))
859 if (!card
->open_cnt
) {
860 wanpipe_set_state(card
, WAN_DISCONNECTED
);
861 fr_set_intr_mode(card
, 0, 0);
862 fr_comm_disable(card
);
864 card
->wandev
.critical
= 0;
868 /*============================================================================
869 * Build media header.
870 * o encapsulate packet according to encapsulation type.
872 * The trick here is to put packet type (Ethertype) into 'protocol' field of
873 * the socket buffer, so that we don't forget it. If encapsulation fails,
874 * set skb->protocol to 0 and discard packet later.
876 * Return: media header length.
878 static int if_header(struct sk_buff
*skb
, struct device
*dev
,
879 unsigned short type
, void *daddr
, void *saddr
, unsigned len
)
883 skb
->protocol
= type
;
884 hdr_len
= wan_encapsulate(skb
, dev
);
890 skb
->data
[0] = Q922_UI
;
895 /*============================================================================
896 * Re-build media header.
898 * Return: 1 physical address resolved.
899 * 0 physical address not resolved
901 static int if_rebuild_hdr(struct sk_buff
*skb
)
903 fr_channel_t
*chan
= skb
->dev
->priv
;
904 sdla_t
*card
= chan
->card
;
906 printk(KERN_INFO
"%s: rebuild_header() called for interface %s!\n",
907 card
->devname
, skb
->dev
->name
);
911 /*============================================================================
912 * Send a packet on a network interface.
913 * o set tbusy flag (marks start of the transmission) to block a timer-based
914 * transmit from overlapping.
915 * o check link state. If link is not up, then drop the packet.
916 * o check channel status. If it's down then initiate a call.
917 * o pass a packet to corresponding WAN device.
918 * o free socket buffer
920 * Return: 0 complete (socket buffer must be freed)
921 * non-0 packet may be re-transmitted (tbusy must be set)
924 * 1. This routine is called either by the protocol stack or by the "net
925 * bottom half" (with interrupts enabled).
926 * 2. Setting tbusy flag will inhibit further transmit requests from the
927 * protocol stack and can be used for flow control with protocol layer.
929 static int if_send(struct sk_buff
*skb
, struct device
*dev
)
931 fr_channel_t
*chan
= dev
->priv
;
932 sdla_t
*card
= chan
->card
;
935 fr508_flags_t
* adptr_flags
= card
->flags
;
936 fr_dlci_interface_t
* dlci_interface
= chan
->dlci_int_interface
;
937 unsigned long host_cpu_flags
;
939 ++chan
->if_send_entry
;
943 /* If our device stays busy for at least 5 seconds then we will
944 * kick start the device by making dev->tbusy = 0. We expect
945 * that our device never stays busy more than 5 seconds. So this * is only used as a last resort.
948 ++chan
->if_send_busy
;
949 ++chan
->ifstats
.collisions
;
951 if ((jiffies
- chan
->tick_counter
) < (5*HZ
))
954 printk(KERN_INFO
"%s: Transmit timed out\n", chan
->name
);
956 ++chan
->if_send_busy_timeout
;
958 /* unbusy all the interfaces on the card */
959 for (dev2
= card
->wandev
.dev
; dev2
; dev2
= dev2
->slave
)
963 if (test_and_set_bit(0, (void *) &card
->wandev
.critical
)) {
965 printk(KERN_INFO
"%s: if_send() hit critical section!\n",
968 dev_kfree_skb(skb
, FREE_WRITE
);
971 disable_irq(card
->hw
.irq
);
972 ++card
->irq_dis_if_send_count
;
974 if (test_and_set_bit(0, (void*)&card
->wandev
.critical
))
976 if (card
->wandev
.critical
== CRITICAL_IN_ISR
)
978 ++chan
->if_send_critical_ISR
;
980 if (card
->intr_mode
== DLCI_LIST_INTR_MODE
)
982 /* The enable_tx_int flag is set here so that if
983 * the critical flag is set due to an interrupt
984 * then we want to enable transmit interrupts
988 card
->wandev
.enable_tx_int
= 1;
990 /* Setting this flag to WAITING_TO_BE_ENABLED
991 * specifies that interrupt bit has to be
992 * enabled for that particular interface.
993 * (delayed interrupt)
996 chan
->tx_int_status
= WAITING_TO_BE_ENABLED
;
998 /* This is used for enabling dynamic calculation
999 * of CIRs relative to the packet length.
1002 chan
->pkt_length
= skb
->len
;
1004 chan
->tick_counter
= jiffies
;
1008 card
->wandev
.enable_tx_int
= 1;
1010 chan
->tick_counter
= jiffies
;
1012 save_flags(host_cpu_flags
);
1014 if ((!(--card
->irq_dis_if_send_count
)) &&
1015 (!card
->irq_dis_poll_count
))
1016 enable_irq(card
->hw
.irq
);
1017 restore_flags(host_cpu_flags
);
1021 ++chan
->if_send_critical_non_ISR
;
1022 ++chan
->ifstats
.tx_dropped
;
1023 dev_kfree_skb(skb
, FREE_WRITE
);
1024 save_flags(host_cpu_flags
);
1026 if ((!(--card
->irq_dis_if_send_count
)) &&
1027 (!card
->irq_dis_poll_count
))
1028 enable_irq(card
->hw
.irq
);
1029 restore_flags(host_cpu_flags
);
1033 card
->wandev
.critical
= 0x21;
1035 if (card
->wandev
.state
!= WAN_CONNECTED
)
1037 ++chan
->if_send_wan_disconnected
;
1038 ++chan
->ifstats
.tx_dropped
;
1039 ++card
->wandev
.stats
.tx_dropped
;
1041 else if (chan
->state
!= WAN_CONNECTED
)
1043 ++chan
->if_send_dlci_disconnected
;
1044 update_chan_state(dev
);
1045 ++chan
->ifstats
.tx_dropped
;
1046 ++card
->wandev
.stats
.tx_dropped
;
1048 else if (!is_tx_ready(card
, chan
))
1050 if (card
->intr_mode
== DLCI_LIST_INTR_MODE
)
1052 dlci_interface
->gen_interrupt
|= 0x40;
1053 dlci_interface
->packet_length
= skb
->len
;
1056 chan
->tick_counter
= jiffies
;
1058 adptr_flags
->imask
|= 0x02;
1060 ++ chan
->if_send_no_bfrs
;
1066 /* If it's an IPX packet */
1067 if( sendpacket
[1] == 0x00 &&
1068 sendpacket
[2] == 0x80 &&
1069 sendpacket
[6] == 0x81 &&
1070 sendpacket
[7] == 0x37)
1072 if( card
->wandev
.enable_IPX
)
1074 switch_net_numbers(sendpacket
,
1075 card
->wandev
.network_number
, 0);
1079 /* increment some statistic here! */
1086 err
= (card
->hw
.fwid
== SFID_FR508
) ?
1087 fr508_send(card
, chan
->dlci
, 0, skb
->len
, skb
->data
) :
1088 fr502_send(card
, chan
->dlci
, 0, skb
->len
, skb
->data
);
1092 if (card
->intr_mode
== DLCI_LIST_INTR_MODE
)
1094 dlci_interface
->gen_interrupt
|= 0x40;
1095 dlci_interface
->packet_length
= skb
->len
;
1098 chan
->tick_counter
= jiffies
;
1099 adptr_flags
->imask
|= 0x02;
1101 ++ chan
->if_send_adptr_bfrs_full
;
1102 ++ chan
->ifstats
.tx_errors
;
1103 ++ card
->wandev
.stats
.tx_errors
;
1107 ++ chan
->if_send_bfrs_passed_to_adptr
;
1108 ++chan
->ifstats
.tx_packets
;
1109 ++card
->wandev
.stats
.tx_packets
;
1115 dev_kfree_skb(skb
, FREE_WRITE
);
1117 card
->wandev
.critical
= 0;
1118 save_flags(host_cpu_flags
);
1120 if ((!(--card
->irq_dis_if_send_count
)) && (!card
->irq_dis_poll_count
))
1121 enable_irq(card
->hw
.irq
);
1122 restore_flags(host_cpu_flags
);
1127 * If incoming is 0 (outgoing)- if the net numbers is ours make it 0
1128 * if incoming is 1 - if the net number is 0 make it ours
1132 static void switch_net_numbers(unsigned char *sendpacket
, unsigned long network_number
, unsigned char incoming
)
1134 unsigned long pnetwork_number
;
1136 pnetwork_number
= (unsigned long)((sendpacket
[14] << 24) +
1137 (sendpacket
[15] << 16) + (sendpacket
[16] << 8) +
1141 if( pnetwork_number
== network_number
) {
1142 sendpacket
[14] = sendpacket
[15] = sendpacket
[16] =
1143 sendpacket
[17] = 0x00;
1146 if( pnetwork_number
== 0) {
1147 sendpacket
[14] = (unsigned char)(network_number
>> 24);
1148 sendpacket
[15] = (unsigned char)((network_number
&
1150 sendpacket
[16] = (unsigned char)((network_number
&
1152 sendpacket
[17] = (unsigned char)(network_number
&
1158 pnetwork_number
= (unsigned long)((sendpacket
[26] << 24) +
1159 (sendpacket
[27] << 16) + (sendpacket
[28] << 8) +
1163 if( pnetwork_number
== network_number
) {
1164 sendpacket
[26] = sendpacket
[27] = sendpacket
[28] =
1165 sendpacket
[29] = 0x00;
1168 if( pnetwork_number
== 0 ) {
1169 sendpacket
[26] = (unsigned char)(network_number
>> 24);
1170 sendpacket
[27] = (unsigned char)((network_number
&
1172 sendpacket
[28] = (unsigned char)((network_number
&
1174 sendpacket
[29] = (unsigned char)(network_number
&
1178 } /* switch_net_numbers */
1181 /*============================================================================
1182 * Get ethernet-style interface statistics.
1183 * Return a pointer to struct enet_statistics.
1185 static struct net_device_stats
*if_stats(struct device
*dev
)
1187 fr_channel_t
*chan
= dev
->priv
;
1189 return &chan
->ifstats
;
1192 /****** Interrupt Handlers **************************************************/
1194 /*============================================================================
1195 * S502 frame relay interrupt service routine.
1197 static void fr502_isr(sdla_t
* card
)
1199 fr502_flags_t
*flags
= card
->flags
;
1201 switch (flags
->iflag
)
1203 case 0x01: /* receive interrupt */
1204 fr502_rx_intr(card
);
1207 case 0x02: /* transmit interrupt */
1208 flags
->imask
&= ~0x02;
1218 /*============================================================================
1219 * S508 frame relay interrupt service routine.
1221 static void fr508_isr(sdla_t
* card
)
1223 fr508_flags_t
*flags
= card
->flags
;
1225 char *ptr
= &flags
->iflag
;
1226 struct device
* dev
= card
->wandev
.dev
;
1227 struct device
* dev2
;
1229 unsigned long host_cpu_flags
;
1230 unsigned disable_tx_intr
=1;
1232 fr_dlci_interface_t
* dlci_interface
;
1234 /* This flag prevents nesting of interrupts. See sdla_isr() routine
1239 ++card
->statistics
.isr_entry
;
1241 if (test_and_set_bit(0, (void*)&card
->wandev
.critical
))
1243 printk(KERN_INFO
"fr508_isr: %s, wandev.critical set to 0x%02X, int type = 0x%02X\n", card
->devname
, card
->wandev
.critical
, flags
->iflag
);
1244 ++card
->statistics
.isr_already_critical
;
1250 /* For all interrupts set the critical flag to CRITICAL_RX_INTR.
1251 * If the if_send routine is called with this flag set it will set
1252 * the enable transmit flag to 1. (for a delayed interrupt)
1254 card
->wandev
.critical
= CRITICAL_IN_ISR
;
1256 card
->dlci_int_mode_unbusy
= 0;
1257 card
->buff_int_mode_unbusy
= 0;
1259 switch (flags
->iflag
) {
1260 case 0x01: /* receive interrupt */
1261 ++card
->statistics
.isr_rx
;
1262 fr508_rx_intr(card
);
1265 case 0x02: /* transmit interrupt */
1266 ++card
->statistics
.isr_tx
;
1267 bctl
= (void*)(flags
->tse_offs
- FR_MB_VECTOR
+
1271 if (card
->intr_mode
== DLCI_LIST_INTR_MODE
)
1273 /* Find the structure and make it unbusy */
1274 dev
= find_channel( card
, flags
->dlci
);
1277 /* This is used to perform devtint at the
1280 card
->dlci_int_mode_unbusy
= 1;
1282 /* check to see if any other interfaces are
1283 * busy. If so then do not disable the tx
1286 for (dev2
= card
->wandev
.dev
; dev2
;
1289 if ( dev2
->tbusy
== 1)
1291 disable_tx_intr
= 0;
1295 if (disable_tx_intr
)
1296 flags
->imask
&= ~0x02;
1299 else if (card
->intr_mode
== BUFFER_INTR_MODE
)
1301 for (dev2
= card
->wandev
.dev
; dev2
;
1304 if ( !dev2
|| !dev2
->start
)
1307 tx_intr_dev_not_started
;
1312 card
->buff_int_mode_unbusy
= 1;
1313 ((fr_channel_t
*)dev2
->priv
)->dev_pending_devtint
= 1;
1316 ((fr_channel_t
*)dev2
->priv
)->dev_pending_devtint
= 0;
1318 flags
->imask
&= ~0x02;
1323 Intr_test_counter
++;
1324 ++card
->statistics
.isr_intr_test
;
1328 ++card
->statistics
.isr_spurious
;
1330 printk(KERN_INFO
"%s: Interrupt Type 0x%02X!\n",
1331 card
->devname
, flags
->iflag
);
1333 printk(KERN_INFO
"%s: ID Bytes = ",card
->devname
);
1334 for(i
= 0; i
< 8; i
++)
1335 printk(KERN_INFO
"0x%02X ", *(ptr
+ 0x28 + i
));
1336 printk(KERN_INFO
"\n");
1341 card
->wandev
.critical
= CRITICAL_INTR_HANDLED
;
1342 if (card
->wandev
.enable_tx_int
)
1344 if( card
->intr_mode
== DLCI_LIST_INTR_MODE
)
1346 for (dev2
= card
->wandev
.dev
; dev2
; dev2
= dev2
->slave
)
1349 if ( chan
->tx_int_status
==
1350 WAITING_TO_BE_ENABLED
)
1353 chan
->dlci_int_interface
;
1354 dlci_interface
->gen_interrupt
|= 0x40;
1355 dlci_interface
->packet_length
=
1357 chan
->tx_int_status
= DISABLED
;
1361 card
->wandev
.enable_tx_int
= 0;
1362 flags
->imask
|= 0x02;
1363 ++card
->statistics
.isr_enable_tx_int
;
1365 save_flags(host_cpu_flags
);
1368 card
->wandev
.critical
= 0xD1;
1370 card
->wandev
.critical
= 0;
1371 restore_flags(host_cpu_flags
);
1374 * Device is now ready to send. The instant this is executed the If_Send
1375 * routine is called. That is why this is put at the bottom of the ISR
1376 * to prevent a endless loop condition caused by repeated Interrupts and
1377 * enable_tx_int flag.
1380 if(card
->dlci_int_mode_unbusy
)
1383 if(card
->buff_int_mode_unbusy
)
1387 if (((fr_channel_t
*)((card
->devs_struct
)->dev_ptr
)->priv
)->dev_pending_devtint
== 1){
1389 ((fr_channel_t
*)((card
->devs_struct
)->dev_ptr
)->priv
)->dev_pending_devtint
=0;
1390 dev_tint((card
->devs_struct
)->dev_ptr
);
1392 if ((card
->devs_struct
)->next
== card
->dev_to_devtint_next
)
1394 card
->devs_struct
= (card
->devs_struct
)->next
;
1396 card
->devs_struct
= (card
->dev_to_devtint_next
)->next
;
1397 card
->dev_to_devtint_next
= card
->devs_struct
;
1401 /*============================================================================
1402 * Receive interrupt handler.
1405 static void fr502_rx_intr(sdla_t
* card
)
1407 fr_mbox_t
*mbox
= card
->rxmb
;
1408 struct sk_buff
*skb
;
1414 sdla_mapmem(&card
->hw
, FR502_RX_VECTOR
);
1416 dlci
= mbox
->cmd
.dlci
;
1417 len
= mbox
->cmd
.length
;
1419 /* Find network interface for this packet */
1420 dev
= find_channel(card
, dlci
);
1422 /* Invalid channel, discard packet */
1423 printk(KERN_INFO
"%s: receiving on orphaned DLCI %d!\n",
1424 card
->devname
, dlci
);
1425 sdla_mapmem(&card
->hw
, FR_MB_VECTOR
);
1429 ++chan
->ifstats
.rx_dropped
;
1430 sdla_mapmem(&card
->hw
, FR_MB_VECTOR
);
1432 /* Allocate socket buffer */
1433 skb
= dev_alloc_skb(len
);
1435 printk(KERN_INFO
"%s: no socket buffers available!\n",
1437 ++chan
->ifstats
.rx_dropped
;
1438 sdla_mapmem(&card
->hw
, FR_MB_VECTOR
);
1440 /* Copy data to the socket buffer */
1441 buf
= skb_put(skb
, len
);
1442 memcpy(buf
, mbox
->data
, len
);
1443 sdla_mapmem(&card
->hw
, FR_MB_VECTOR
);
1445 /* Decapsulate packet and pass it up the protocol stack */
1447 buf
= skb_pull(skb
, 1); /* remove hardware header */
1448 if (!wan_type_trans(skb
, dev
)) {
1449 /* can't decapsulate packet */
1450 dev_kfree_skb(skb
, FREE_READ
);
1451 ++chan
->ifstats
.rx_errors
;
1452 ++card
->wandev
.stats
.rx_errors
;
1455 ++chan
->ifstats
.rx_packets
;
1456 ++card
->wandev
.stats
.rx_packets
;
1458 sdla_mapmem(&card
->hw
, FR_MB_VECTOR
);
1461 /*============================================================================
1462 * Receive interrupt handler.
1464 static void fr508_rx_intr(sdla_t
* card
)
1466 fr_buf_ctl_t
*frbuf
= card
->rxmb
;
1467 struct sk_buff
*skb
;
1470 unsigned dlci
, len
, offs
;
1472 unsigned rx_count
= 0;
1473 fr508_flags_t
* flags
= card
->flags
;
1474 char *ptr
= &flags
->iflag
;
1477 if (frbuf
->flag
!= 0x01) {
1478 printk(KERN_INFO
"%s: corrupted Rx buffer @ 0x%X!\n",
1479 card
->devname
, (unsigned) frbuf
);
1480 printk(KERN_INFO
"%s: ID Bytes = ",card
->devname
);
1481 for(i
= 0; i
< 8; i
++)
1482 printk(KERN_INFO
"0x%02X ", *(ptr
+ 0x28 + i
));
1483 printk(KERN_INFO
"\n");
1485 ++card
->statistics
.rx_intr_corrupt_rx_bfr
;
1491 len
= frbuf
->length
;
1493 offs
= frbuf
->offset
;
1495 /* Find network interface for this packet */
1496 dev
= find_channel(card
, dlci
);
1501 /* Invalid channel, discard packet */
1502 printk(KERN_INFO
"%s: receiving on orphaned DLCI %d!\n"
1503 , card
->devname
, dlci
);
1504 ++card
->statistics
.rx_intr_on_orphaned_DLCI
;
1508 skb
= dev_alloc_skb(len
);
1509 if (!dev
->start
|| (skb
== NULL
))
1511 ++chan
->ifstats
.rx_dropped
;
1515 "%s: no socket buffers available!\n",
1517 ++chan
->rx_intr_no_socket
;
1521 ++ chan
->rx_intr_dev_not_started
;
1525 /* Copy data to the socket buffer */
1526 if ((offs
+ len
) > card
->u
.f
.rx_top
+ 1)
1528 unsigned tmp
= card
->u
.f
.rx_top
-
1531 buf
= skb_put(skb
, tmp
);
1532 sdla_peek(&card
->hw
, offs
, buf
, tmp
);
1533 offs
= card
->u
.f
.rx_base
;
1537 buf
= skb_put(skb
, len
);
1538 sdla_peek(&card
->hw
, offs
, buf
, len
);
1539 #ifdef CONFIG_SANGOMA_MANAGER
1540 if (management_check(skb
,card
))
1542 ++chan
->rx_intr_DRVSTATS_request
;
1546 if (handle_IPXWAN(skb
->data
,card
->devname
, card
->wandev
.enable_IPX
, card
->wandev
.network_number
))
1548 if (card
->wandev
.enable_IPX
)
1550 fr508_send(card
, dlci
, 0, skb
->len
, skb
->data
);
1552 /* increment some statistic! */
1557 /* Decapsulate packet and pass it up the
1561 /* remove hardware header */
1562 buf
= skb_pull(skb
, 1);
1564 if (!wan_type_trans(skb
, dev
))
1566 /* can't decapsulate packet */
1567 dev_kfree_skb(skb
, FREE_READ
);
1568 ++chan
->rx_intr_bfr_not_passed_to_stack
;
1569 ++chan
->ifstats
.rx_errors
;
1570 ++card
->wandev
.stats
.rx_errors
;
1575 ++ chan
->rx_intr_bfr_passed_to_stack
;
1576 ++ chan
->ifstats
.rx_packets
;
1577 ++ card
->wandev
.stats
.rx_packets
;
1583 /* Release buffer element and calculate a pointer to the next
1586 card
->rxmb
= ++frbuf
;
1588 if ((void*)frbuf
> card
->u
.f
.rxmb_last
)
1589 card
->rxmb
= card
->u
.f
.rxmb_base
;
1591 /* The loop put in is temporary, that is why the break is
1592 * placed here. (?????)
1598 } while (frbuf
->flag
&& ((++ rx_count
) < 4));
1601 /*============================================================================
1602 * Transmit interrupt handler.
1605 * If number of spurious interrupts exceeded some limit, then ???
1607 static void tx_intr(sdla_t
* card
)
1609 struct device
*dev
= card
->wandev
.dev
;
1611 if (card
->intr_mode
== BUFFER_INTR_MODE
)
1613 for (; dev
; dev
= dev
->slave
)
1615 if ( !dev
|| !dev
->start
)
1617 ++ card
->statistics
.tx_intr_dev_not_started
;
1632 /*============================================================================
1633 * Spurious interrupt handler.
1636 * If number of spurious interrupts exceeded some limit, then ???
1638 static void spur_intr(sdla_t
* card
)
1640 printk(KERN_INFO
"%s: spurious interrupt!\n", card
->devname
);
1644 Return 0 for non-IPXWAN packet
1645 1 for IPXWAN packet or IPX is not enabled!
1649 static int handle_IPXWAN(unsigned char *sendpacket
, char *devname
, unsigned char enable_IPX
, unsigned long network_number
)
1653 if( sendpacket
[1] == 0x00 &&
1654 sendpacket
[2] == 0x80 &&
1655 sendpacket
[6] == 0x81 &&
1656 sendpacket
[7] == 0x37) {
1665 if( sendpacket
[24] == 0x90 &&
1666 sendpacket
[25] == 0x04)
1668 if( sendpacket
[10] == 0x02 &&
1669 sendpacket
[42] == 0x00)
1671 printk(KERN_INFO
"%s: Received IPXWAN Timer Request packet\n",devname
);
1673 for(i
= 49; sendpacket
[i
] == 0x00; i
+= 5)
1675 if( sendpacket
[i
+ 4] != 0x02)
1677 sendpacket
[i
+ 1] = 0;
1681 if( sendpacket
[i
] == 0x04 )
1686 for(; sendpacket
[i
] == 0x80 ;)
1688 sendpacket
[i
+ 1] = 0;
1689 i
+= (sendpacket
[i
+ 2] << 8) + (sendpacket
[i
+ 3]) + 4;
1692 sendpacket
[42] = 0x01;
1694 printk(KERN_INFO
"%s: Sending IPXWAN Timer Response\n",devname
);
1696 else if( sendpacket
[42] == 0x02 )
1698 printk(KERN_INFO
"%s: Received IPXWAN Information Request packet\n",devname
);
1700 sendpacket
[42] = 0x03;
1702 sendpacket
[59] = 'F';
1703 sendpacket
[60] = 'P';
1704 sendpacket
[61] = 'I';
1705 sendpacket
[62] = 'P';
1706 sendpacket
[63] = 'E';
1707 sendpacket
[64] = '-';
1708 sendpacket
[65] = CVHexToAscii(network_number
>> 28);
1709 sendpacket
[66] = CVHexToAscii((network_number
& 0x0F000000)>> 24);
1710 sendpacket
[67] = CVHexToAscii((network_number
& 0x00F00000)>> 20);
1711 sendpacket
[68] = CVHexToAscii((network_number
& 0x000F0000)>> 16);
1712 sendpacket
[69] = CVHexToAscii((network_number
& 0x0000F000)>> 12);
1713 sendpacket
[70] = CVHexToAscii((network_number
& 0x00000F00)>> 8);
1714 sendpacket
[71] = CVHexToAscii((network_number
& 0x000000F0)>> 4);
1715 sendpacket
[72] = CVHexToAscii(network_number
& 0x0000000F);
1716 for(i
= 73; i
< 107; i
+= 1)
1721 printk(KERN_INFO
"%s: Sending IPXWAN Information Response packet\n",devname
);
1725 printk(KERN_INFO
"%s: Unknown IPXWAN packet!\n",devname
);
1729 sendpacket
[43] = (unsigned char)(network_number
>> 24);
1730 sendpacket
[44] = (unsigned char)((network_number
& 0x00FF0000) >> 16);
1731 sendpacket
[45] = (unsigned char)((network_number
& 0x0000FF00) >> 8);
1732 sendpacket
[46] = (unsigned char)(network_number
& 0x000000FF);
1737 switch_net_numbers(sendpacket
, network_number
,1);
1742 /****** Background Polling Routines ****************************************/
1744 /*============================================================================
1745 * Main polling routine.
1746 * This routine is repeatedly called by the WANPIPE 'thead' to allow for
1747 * time-dependent housekeeping work.
1749 * o fetch asynchronous network events.
1752 * 1. This routine may be called on interrupt context with all interrupts
1756 static void wpf_poll(sdla_t
* card
)
1758 fr508_flags_t
*flags
;
1759 unsigned long host_cpu_flags
;
1761 ++card
->statistics
.poll_entry
;
1763 if (((jiffies
- card
->state_tick
) < HZ
) ||
1764 (card
->intr_mode
== INTR_TEST_MODE
))
1767 disable_irq(card
->hw
.irq
);
1768 ++card
->irq_dis_poll_count
;
1770 if (test_and_set_bit(0, (void *)&card
->wandev
.critical
))
1772 ++ card
->statistics
.poll_already_critical
;
1773 save_flags(host_cpu_flags
);
1775 if ((!card
->irq_dis_if_send_count
) &&
1776 (!(--card
->irq_dis_poll_count
)))
1777 enable_irq(card
->hw
.irq
);
1778 restore_flags(host_cpu_flags
);
1783 card
->wandev
.critical
= 0x11;
1785 ++ card
->statistics
.poll_processed
;
1788 fr_mbox_t
* mbox
= card
->mbox
;
1791 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
1792 mbox
->cmd
.command
= FR_READ_STATUS
;
1793 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
1795 fr_event(card
, err
, mbox
);
1798 card
->wandev
.critical
= 0;
1800 save_flags(host_cpu_flags
);
1802 if ((!card
->irq_dis_if_send_count
) && (!(--card
->irq_dis_poll_count
)))
1803 enable_irq(card
->hw
.irq
);
1804 restore_flags(host_cpu_flags
);
1806 card
->state_tick
= jiffies
;
1810 /****** Frame Relay Firmware-Specific Functions *****************************/
1812 /*============================================================================
1813 * Read firmware code version.
1814 * o fill string str with firmware version info.
1816 static int fr_read_version(sdla_t
* card
, char *str
)
1818 fr_mbox_t
*mbox
= card
->mbox
;
1819 int retry
= MAX_CMD_RETRY
;
1823 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
1824 mbox
->cmd
.command
= FR_READ_CODE_VERSION
;
1825 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
1827 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
1829 int len
= mbox
->cmd
.length
;
1831 memcpy(str
, mbox
->data
, len
);
1837 /*============================================================================
1838 * Set global configuration.
1840 static int fr_configure(sdla_t
* card
, fr_conf_t
* conf
)
1842 fr_mbox_t
*mbox
= card
->mbox
;
1843 int retry
= MAX_CMD_RETRY
;
1844 int dlci_num
= card
->u
.f
.dlci_num
;
1848 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
1849 memcpy(mbox
->data
, conf
, sizeof(fr_conf_t
));
1851 if (dlci_num
) for (i
= 0; i
< dlci_num
; ++i
)
1852 ((fr_conf_t
*)mbox
->data
)->dlci
[i
] =
1853 card
->u
.f
.node_dlci
[i
];
1855 mbox
->cmd
.command
= FR_SET_CONFIG
;
1857 sizeof(fr_conf_t
) + dlci_num
* sizeof(short);
1858 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
1860 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
1864 /*============================================================================
1865 * Set DLCI configuration.
1867 static int fr_dlci_configure (sdla_t
* card
, fr_dlc_conf_t
*conf
, unsigned dlci
)
1869 fr_mbox_t
* mbox
= card
->mbox
;
1870 int retry
= MAX_CMD_RETRY
;
1875 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
1876 memcpy(mbox
->data
, conf
, sizeof(fr_dlc_conf_t
));
1877 mbox
->cmd
.dlci
= (unsigned short) dlci
;
1878 mbox
->cmd
.command
= FR_SET_CONFIG
;
1879 mbox
->cmd
.length
= 0x0E;
1881 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
1883 } while (err
&& retry
--);
1888 /*============================================================================
1889 * Set interrupt mode.
1891 static int fr_set_intr_mode(sdla_t
* card
, unsigned mode
, unsigned mtu
)
1893 fr_mbox_t
*mbox
= card
->mbox
;
1894 int retry
= MAX_CMD_RETRY
;
1898 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
1899 if (card
->hw
.fwid
== SFID_FR502
) {
1900 fr502_intr_ctl_t
*ictl
= (void *) mbox
->data
;
1902 memset(ictl
, 0, sizeof(fr502_intr_ctl_t
));
1905 mbox
->cmd
.length
= sizeof(fr502_intr_ctl_t
);
1907 fr508_intr_ctl_t
*ictl
= (void *) mbox
->data
;
1909 memset(ictl
, 0, sizeof(fr508_intr_ctl_t
));
1912 ictl
->irq
= card
->hw
.irq
;
1913 mbox
->cmd
.length
= sizeof(fr508_intr_ctl_t
);
1915 mbox
->cmd
.command
= FR_SET_INTR_MODE
;
1916 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
1918 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
1922 /*============================================================================
1923 * Enable communications.
1925 static int fr_comm_enable(sdla_t
* card
)
1927 fr_mbox_t
*mbox
= card
->mbox
;
1928 int retry
= MAX_CMD_RETRY
;
1932 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
1933 mbox
->cmd
.command
= FR_COMM_ENABLE
;
1934 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
1936 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
1940 /*============================================================================
1941 * Disable communications.
1943 static int fr_comm_disable(sdla_t
* card
)
1945 fr_mbox_t
*mbox
= card
->mbox
;
1946 int retry
= MAX_CMD_RETRY
;
1950 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
1951 mbox
->cmd
.command
= FR_COMM_DISABLE
;
1952 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
1954 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
1958 /*============================================================================
1959 * Get communications error statistics.
1961 static int fr_get_err_stats(sdla_t
* card
)
1963 fr_mbox_t
*mbox
= card
->mbox
;
1964 int retry
= MAX_CMD_RETRY
;
1968 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
1969 mbox
->cmd
.command
= FR_READ_ERROR_STATS
;
1970 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
1972 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
1975 fr_comm_stat_t
* stats
= (void*)mbox
->data
;
1977 card
->wandev
.stats
.rx_over_errors
= stats
->rx_overruns
;
1978 card
->wandev
.stats
.rx_crc_errors
= stats
->rx_bad_crc
;
1979 card
->wandev
.stats
.rx_missed_errors
= stats
->rx_aborts
;
1980 card
->wandev
.stats
.rx_length_errors
= stats
->rx_too_long
;
1981 card
->wandev
.stats
.tx_aborted_errors
= stats
->tx_aborts
;
1986 /*============================================================================
1989 static int fr_get_stats(sdla_t
* card
)
1991 fr_mbox_t
*mbox
= card
->mbox
;
1992 int retry
= MAX_CMD_RETRY
;
1996 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
1997 mbox
->cmd
.command
= FR_READ_STATISTICS
;
1998 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
2000 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
2003 fr_link_stat_t
*stats
= (void *) mbox
->data
;
2005 card
->wandev
.stats
.rx_frame_errors
= stats
->rx_bad_format
;
2006 card
->wandev
.stats
.rx_dropped
=
2007 stats
->rx_dropped
+ stats
->rx_dropped2
2013 /*============================================================================
2014 * Add DLCI(s) (Access Node only!).
2017 static int fr_add_dlci(sdla_t
* card
, int dlci
, int num
)
2019 fr_mbox_t
*mbox
= card
->mbox
;
2020 int retry
= MAX_CMD_RETRY
;
2024 unsigned short *dlci_list
= (void *) mbox
->data
;
2026 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
2027 for (i
= 0; i
< num
; ++i
)
2028 dlci_list
[i
] = card
->u
.f
.node_dlci
[i
];
2030 mbox
->cmd
.length
= num
* sizeof(short);
2031 mbox
->cmd
.command
= FR_ADD_DLCI
;
2032 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
2034 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
2038 /*============================================================================
2039 * Activate DLCI(s) (Access Node only!).
2041 static int fr_activate_dlci(sdla_t
* card
, int dlci
, int num
)
2043 fr_mbox_t
*mbox
= card
->mbox
;
2044 int retry
= MAX_CMD_RETRY
;
2048 unsigned short *dlci_list
= (void *) mbox
->data
;
2050 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
2051 for (i
= 0; i
< num
; ++i
)
2052 dlci_list
[i
] = card
->u
.f
.node_dlci
[i
];
2054 mbox
->cmd
.length
= num
* sizeof(short);
2055 mbox
->cmd
.command
= FR_ACTIVATE_DLCI
;
2056 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
2058 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
2062 /*============================================================================
2063 * Issue in-channel signalling frame.
2065 static int fr_issue_isf(sdla_t
* card
, int isf
)
2067 fr_mbox_t
*mbox
= card
->mbox
;
2068 int retry
= MAX_CMD_RETRY
;
2072 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
2073 mbox
->data
[0] = isf
;
2074 mbox
->cmd
.length
= 1;
2075 mbox
->cmd
.command
= FR_ISSUE_IS_FRAME
;
2076 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
2078 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
2082 /*============================================================================
2083 * Send a frame (S502 version).
2085 static int fr502_send(sdla_t
* card
, int dlci
, int attr
, int len
, void *buf
)
2087 fr_mbox_t
*mbox
= card
->mbox
;
2088 int retry
= MAX_CMD_RETRY
;
2092 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
2093 memcpy(mbox
->data
, buf
, len
);
2094 mbox
->cmd
.dlci
= dlci
;
2095 mbox
->cmd
.attr
= attr
;
2096 mbox
->cmd
.length
= len
;
2097 mbox
->cmd
.command
= FR_WRITE
;
2098 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
2100 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
2104 /*============================================================================
2105 * Send a frame (S508 version).
2107 static int fr508_send(sdla_t
* card
, int dlci
, int attr
, int len
, void *buf
)
2109 fr_mbox_t
*mbox
= card
->mbox
;
2110 int retry
= MAX_CMD_RETRY
;
2114 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
2115 mbox
->cmd
.dlci
= dlci
;
2116 mbox
->cmd
.attr
= attr
;
2117 mbox
->cmd
.length
= len
;
2118 mbox
->cmd
.command
= FR_WRITE
;
2119 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
2121 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
2124 fr_buf_ctl_t
*frbuf
= (void *) (*(unsigned long *) mbox
->data
-
2125 FR_MB_VECTOR
+ card
->hw
.dpmbase
);
2126 sdla_poke(&card
->hw
, frbuf
->offset
, buf
, len
);
2132 /****** Firmware Asynchronous Event Handlers ********************************/
2134 /*============================================================================
2135 * Main asyncronous event/error handler.
2136 * This routine is called whenever firmware command returns non-zero
2139 * Return zero if previous command has to be cancelled.
2141 static int fr_event(sdla_t
* card
, int event
, fr_mbox_t
* mbox
)
2143 fr508_flags_t
* flags
= card
->flags
;
2144 char *ptr
= &flags
->iflag
;
2149 case FRRES_MODEM_FAILURE
:
2150 return fr_modem_failure(card
, mbox
);
2152 case FRRES_CHANNEL_DOWN
:
2153 wanpipe_set_state(card
, WAN_DISCONNECTED
);
2156 case FRRES_CHANNEL_UP
:
2157 wanpipe_set_state(card
, WAN_CONNECTED
);
2160 case FRRES_DLCI_CHANGE
:
2161 return fr_dlci_change(card
, mbox
);
2163 case FRRES_DLCI_MISMATCH
:
2164 printk(KERN_INFO
"%s: DLCI list mismatch!\n", card
->devname
);
2168 printk(KERN_ERR
"%s: command 0x%02X timed out!\n",
2169 card
->devname
, mbox
->cmd
.command
);
2170 printk(KERN_INFO
"%s: ID Bytes = ",card
->devname
);
2171 for(i
= 0; i
< 8; i
++)
2172 printk(KERN_INFO
"0x%02X ", *(ptr
+ 0x28 + i
));
2173 printk(KERN_INFO
"\n");
2176 case FRRES_DLCI_INACTIVE
:
2177 printk(KERN_ERR
"%s: DLCI %u is inactive!\n",
2178 card
->devname
, mbox
->cmd
.dlci
);
2181 case FRRES_CIR_OVERFLOW
:
2183 case FRRES_BUFFER_OVERFLOW
:
2186 printk(KERN_INFO
"%s: command 0x%02X returned 0x%02X!\n",
2187 card
->devname
, mbox
->cmd
.command
, event
);
2192 /*============================================================================
2193 * Handle modem error.
2195 * Return zero if previous command has to be cancelled.
2197 static int fr_modem_failure(sdla_t
* card
, fr_mbox_t
* mbox
)
2199 printk(KERN_INFO
"%s: physical link down! (modem error 0x%02X)\n",
2200 card
->devname
, mbox
->data
[0]);
2201 switch (mbox
->cmd
.command
)
2210 /*============================================================================
2211 * Handle DLCI status change.
2213 * Return zero if previous command has to be cancelled.
2215 static int fr_dlci_change(sdla_t
* card
, fr_mbox_t
* mbox
)
2217 dlci_status_t
*status
= (void *) mbox
->data
;
2218 int cnt
= mbox
->cmd
.length
/ sizeof(dlci_status_t
);
2221 struct device
* dev2
;
2223 for (; cnt
; --cnt
, ++status
) {
2224 unsigned short dlci
= status
->dlci
;
2225 struct device
*dev
= find_channel(card
, dlci
);
2229 printk(KERN_INFO
"%s: CPE contains unconfigured DLCI= %d\n",
2230 card
->devname
, dlci
);
2234 if (status
->state
& 0x01)
2237 "%s: DLCI %u has been deleted!\n",
2238 card
->devname
, dlci
);
2239 if (dev
&& dev
->start
)
2240 set_chan_state(dev
, WAN_DISCONNECTED
);
2242 else if (status
->state
& 0x02)
2245 "%s: DLCI %u becomes active!\n",
2246 card
->devname
, dlci
);
2248 /* This flag is used for configuring specific
2249 DLCI(s) when they become active.
2251 chan
->dlci_configured
= DLCI_CONFIG_PENDING
;
2253 if (dev
&& dev
->start
)
2254 set_chan_state(dev
, WAN_CONNECTED
);
2259 for (dev2
=card
->wandev
.dev
; dev2
; dev2
= dev2
->slave
)
2263 if (chan
->dlci_configured
== DLCI_CONFIG_PENDING
)
2265 memset(&cfg
, 0, sizeof(cfg
));
2267 if ( chan
->cir_status
== CIR_DISABLED
)
2269 cfg
.cir_fwd
= cfg
.cir_bwd
= 16;
2270 cfg
.bc_fwd
= cfg
.bc_bwd
= 16;
2271 cfg
.conf_flags
= 0x0001;
2272 printk(KERN_INFO
"%s: CIR Disabled for %s\n",
2273 card
->devname
, chan
->name
);
2275 else if (chan
->cir_status
== CIR_ENABLED
)
2277 cfg
.cir_fwd
= cfg
.cir_bwd
= chan
->cir
;
2278 cfg
.bc_fwd
= cfg
.bc_bwd
= chan
->bc
;
2279 cfg
.be_fwd
= cfg
.be_bwd
= chan
->be
;
2280 cfg
.conf_flags
= 0x0000;
2281 printk(KERN_INFO
"%s: CIR Enabled for %s\n",
2282 card
->devname
, chan
->name
);
2286 if (fr_dlci_configure( card
, &cfg
, chan
->dlci
))
2289 "%s: DLCI Configure failed for %d\n",
2290 card
->devname
, chan
->dlci
);
2294 chan
->dlci_configured
= DLCI_CONFIGURED
;
2297 * Read the interface byte mapping into the channel
2300 if (card
->intr_mode
== DLCI_LIST_INTR_MODE
)
2301 read_DLCI_IB_mapping( card
, chan
);
2307 /******* Miscellaneous ******************************************************/
2309 /*============================================================================
2310 * Update channel state.
2312 static int update_chan_state(struct device
*dev
)
2314 fr_channel_t
*chan
= dev
->priv
;
2315 sdla_t
*card
= chan
->card
;
2316 fr_mbox_t
*mbox
= card
->mbox
;
2317 int retry
= MAX_CMD_RETRY
;
2322 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
2323 mbox
->cmd
.command
= FR_LIST_ACTIVE_DLCI
;
2324 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
2326 while (err
&& retry
-- && fr_event(card
, err
, mbox
));
2329 unsigned short *list
= (void *) mbox
->data
;
2330 int cnt
= mbox
->cmd
.length
/ sizeof(short);
2332 for (; cnt
; --cnt
, ++list
)
2334 if (*list
== chan
->dlci
)
2337 set_chan_state(dev
, WAN_CONNECTED
);
2343 printk(KERN_INFO
"%s: DLCI %u is inactive\n",
2344 card
->devname
, chan
->dlci
);
2349 /*============================================================================
2350 * Set channel state.
2352 static void set_chan_state(struct device
*dev
, int state
)
2354 fr_channel_t
*chan
= dev
->priv
;
2355 sdla_t
*card
= chan
->card
;
2356 unsigned long flags
;
2361 if (chan
->state
!= state
)
2366 printk(KERN_INFO
"%s: interface %s connected!\n"
2367 , card
->devname
, dev
->name
);
2369 case WAN_CONNECTING
:
2371 "%s: interface %s connecting...\n",
2372 card
->devname
, dev
->name
);
2374 case WAN_DISCONNECTED
:
2376 "%s: interface %s disconnected!\n",
2377 card
->devname
, dev
->name
);
2380 chan
->state
= state
;
2382 chan
->state_tick
= jiffies
;
2383 restore_flags(flags
);
2386 /*============================================================================
2387 * Find network device by its channel number.
2389 static struct device
*find_channel(sdla_t
* card
, unsigned dlci
)
2393 for (dev
= card
->wandev
.dev
; dev
; dev
= dev
->slave
)
2394 if (((fr_channel_t
*) dev
->priv
)->dlci
== dlci
)
2400 /*============================================================================
2401 * Check to see if a frame can be sent. If no transmit buffers available,
2402 * enable transmit interrupts.
2404 * Return: 1 - Tx buffer(s) available
2405 * 0 - no buffers available
2408 static int is_tx_ready(sdla_t
* card
)
2410 if (card
->hw
.fwid
== SFID_FR508
)
2412 unsigned char sb
= inb(card
->hw
.port
);
2417 fr502_flags_t
* flags
= card
->flags
;
2419 if (flags
->tx_ready
)
2421 flags
->imask
|= 0x02;
2426 /*============================================================================
2427 * Convert decimal string to unsigned integer.
2428 * If len != 0 then only 'len' characters of the string are converted.
2430 static unsigned int dec_to_uint(unsigned char *str
, int len
)
2436 for (val
= 0; len
&& is_digit(*str
); ++str
, --len
)
2437 val
= (val
* 10) + (*str
- (unsigned) '0');
2441 /*==============================================================================
2442 * Perform the Interrupt Test by running the READ_CODE_VERSION command MAX_INTR_
2443 * TEST_COUNTER times.
2445 static int intr_test( sdla_t
* card
)
2447 fr_mbox_t
* mb
= card
->mbox
;
2451 * The critical flag is unset here because we want to get into the
2452 * ISR without the flag already set. The If_open sets the flag.
2455 card
->wandev
.critical
= 0;
2457 err
= fr_set_intr_mode( card
, 0x08, card
->wandev
.mtu
);
2461 for ( i
= 0; i
< MAX_INTR_TEST_COUNTER
; i
++ )
2463 /* Run command READ_CODE_VERSION */
2464 memset(&mb
->cmd
, 0, sizeof(fr_cmd_t
));
2466 mb
->cmd
.command
= 0x40;
2467 err
= sdla_exec(mb
) ? mb
->cmd
.result
: CMD_TIMEOUT
;
2470 fr_event(card
, err
, mb
);
2476 err
= fr_set_intr_mode( card
, 0, card
->wandev
.mtu
);
2481 card
->wandev
.critical
= 1;
2485 /*==============================================================================
2486 * Initializes the Statistics values in the Sdla_t structure.
2489 void init_global_statistics( sdla_t
* card
)
2491 /* Intialize global statistics for a card */
2492 card
->statistics
.isr_entry
= 0;
2493 card
->statistics
.isr_already_critical
= 0;
2494 card
->statistics
.isr_rx
= 0;
2495 card
->statistics
.isr_tx
= 0;
2496 card
->statistics
.isr_intr_test
= 0;
2497 card
->statistics
.isr_spurious
= 0;
2498 card
->statistics
.isr_enable_tx_int
= 0;
2499 card
->statistics
.rx_intr_corrupt_rx_bfr
= 0;
2500 card
->statistics
.rx_intr_on_orphaned_DLCI
= 0;
2501 card
->statistics
.tx_intr_dev_not_started
= 0;
2502 card
->statistics
.poll_entry
= 0;
2503 card
->statistics
.poll_already_critical
= 0;
2504 card
->statistics
.poll_processed
= 0;
2507 static void read_DLCI_IB_mapping( sdla_t
* card
, fr_channel_t
* chan
)
2509 fr_mbox_t
* mbox
= card
->mbox
;
2510 int retry
= MAX_CMD_RETRY
;
2511 dlci_IB_mapping_t
* result
;
2512 int err
, counter
, found
;
2515 memset(&mbox
->cmd
, 0, sizeof(fr_cmd_t
));
2516 mbox
->cmd
.command
= FR_READ_DLCI_IB_MAPPING
;
2518 err
= sdla_exec(mbox
) ? mbox
->cmd
.result
: CMD_TIMEOUT
;
2520 } while (err
&& retry
-- && fr_event(card
, err
, mbox
));
2522 if( mbox
->cmd
.result
!= 0)
2523 printk(KERN_INFO
"%s: Read DLCI IB Mapping failed\n",
2526 counter
= mbox
->cmd
.length
/ sizeof(dlci_IB_mapping_t
);
2527 result
= (void *)mbox
->data
;
2530 for (; counter
; --counter
, ++result
) {
2531 if ( result
->dlci
== chan
->dlci
) {
2532 printk( KERN_INFO
"%s: DLCI= %d, IB addr = %lx for %s\n"
2533 ,card
->devname
,result
->dlci
, result
->addr_value
2535 chan
->IB_addr
= result
->addr_value
;
2536 chan
->dlci_int_interface
= (void*)(card
->hw
.dpmbase
+
2537 ( chan
->IB_addr
& 0x00001FFF));
2543 printk( KERN_INFO
"%s: DLCI %d not found by IB MAPPING cmd\n",
2544 card
->devname
, chan
->dlci
);
2547 /****** End *****************************************************************/