⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdla_fr.c

📁 讲述linux的初始化过程
💻 C
📖 第 1 页 / 共 5 页
字号:
/****************************************************************************** sdla_fr.c	WANPIPE(tm) Multiprotocol WAN Link Driver. Frame relay module.** Author(s):	Nenad Corbic  <ncorbic@sangoma.com>*		Gideon Hack** Copyright:	(c) 1995-1999 Sangoma Technologies Inc.**		This program is free software; you can redistribute it and/or*		modify it under the terms of the GNU General Public License*		as published by the Free Software Foundation; either version*		2 of the License, or (at your option) any later version.* ============================================================================* Feb 28, 2000  Jeff Garzik	o softnet updates* Nov 08, 1999  Nenad Corbic    o Combined all debug UDP calls into one function*                               o Removed the ARP support. This has to be done*                                 in the next version.*                               o Only a Node can implement NO signalling.*                                 Initialize DLCI during if_open() if NO *				  signalling.*				o Took out IPX support, implement in next*                                 version* Sep 29, 1999  Nenad Corbic	o Added SMP support and changed the update*                                 function to use timer interrupt.*				o Fixed the CIR bug:  Set the value of BC*                                 to CIR when the CIR is enabled.*  				o Updated comments, statistics and tracing.* Jun 02, 1999	Gideon Hack	o Updated for S514 support.* Sep 18, 1998	Jaspreet Singh	o Updated for 2.2.X kernels.* Jul 31, 1998	Jaspreet Singh	o Removed wpf_poll routine.  The channel/DLCI *				  status is received through an event interrupt.* Jul 08, 1998	David Fong	o Added inverse ARP support.* Mar 26, 1997	Jaspreet Singh	o Returning return codes for failed UDP cmds.* Jan 28, 1997	Jaspreet Singh  o Improved handling of inactive DLCIs.* Dec 30, 1997	Jaspreet Singh	o Replaced dev_tint() with mark_bh(NET_BH)* Dec 16, 1997	Jaspreet Singh	o Implemented Multiple IPX support.* Nov 26, 1997	Jaspreet Singh	o Improved load sharing with multiple boards*				o Added Cli() to protect enabling of interrupts*				  while polling is called.* Nov 24, 1997	Jaspreet Singh	o Added counters to avoid enabling of interrupts*				  when they have been disabled by another*				  interface or routine (eg. wpf_poll).* Nov 06, 1997	Jaspreet Singh	o Added INTR_TEST_MODE to avoid polling	*				  routine disable interrupts during interrupt*				  testing.* Oct 20, 1997  Jaspreet Singh  o Added hooks in for Router UP time.* Oct 16, 1997  Jaspreet Singh  o The critical flag is used to maintain flow*                                 control by avoiding RACE conditions.  The*                                 cli() and restore_flags() are taken out.*                                 The fr_channel structure is appended for *                                 Driver Statistics.* Oct 15, 1997  Farhan Thawar    o updated if_send() and receive for IPX* Aug 29, 1997  Farhan Thawar    o Removed most of the cli() and sti()*                                o Abstracted the UDP management stuff*                                o Now use tbusy and critical more intelligently* Jul 21, 1997  Jaspreet Singh	 o Can configure T391, T392, N391, N392 & N393*				   through router.conf.*				 o Protected calls to sdla_peek() by adDing *				   save_flags(), cli() and restore_flags().*				 o Added error message for Inactive DLCIs in*				   fr_event() and update_chan_state().*				 o Fixed freeing up of buffers using kfree() *			           when packets are received.* Jul 07, 1997	Jaspreet Singh	 o Added configurable TTL for UDP packets *				 o Added ability to discard multicast and *				   broadcast source addressed packets* Jun 27, 1997	Jaspreet Singh	 o Added FT1 monitor capabilities *				   New case (0x44) statement in if_send routine *				   Added a global variable rCount to keep track*			 	   of FT1 status enabled on the board.* May 29, 1997	Jaspreet Singh	 o Fixed major Flow Control Problem*				   With multiple boards a problem was seen where*				   the second board always stopped transmitting*				   packet after running for a while. The code*				   got into a stage where the interrupts were*				   disabled and dev->tbusy was set to 1.*                  		   This caused the If_send() routine to get into*                                  the if clause for it(0,dev->tbusy) *				   forever.*				   The code got into this stage due to an *				   interrupt occuring within the if clause for *				   set_bit(0,dev->tbusy).  Since an interrupt *				   disables furhter transmit interrupt and * 				   makes dev->tbusy = 0, this effect was undone *                                  by making dev->tbusy = 1 in the if clause.*				   The Fix checks to see if Transmit interrupts*				   are disabled then do not make dev->tbusy = 1* 	   			   Introduced a global variable: int_occur and*				   added tx_int_enabled in the wan_device *				   structure.	* May 21, 1997  Jaspreet Singh   o Fixed UDP Management for multiple*                                  boards.** Apr 25, 1997  Farhan Thawar    o added UDP Management stuff*                                o fixed bug in if_send() and tx_intr() to*                                  sleep and wakeup all devices* Mar 11, 1997  Farhan Thawar   Version 3.1.1*                                o fixed (+1) bug in fr508_rx_intr()*                                o changed if_send() to return 0 if*                                  wandev.critical() is true*                                o free socket buffer in if_send() if*                                  returning 0 *                                o added tx_intr() routine* Jan 30, 1997	Gene Kozin	Version 3.1.0*				 o implemented exec() entry point*				 o fixed a bug causing driver configured as*				   a FR switch to be stuck in WAN_*				   mode* Jan 02, 1997	Gene Kozin	Initial version.*****************************************************************************/#include <linux/config.h>#include <linux/kernel.h>	/* printk(), and other useful stuff */#include <linux/stddef.h>	/* offsetof(), etc. */#include <linux/errno.h>	/* return codes */#include <linux/string.h>	/* inline memset(), etc. */#include <linux/malloc.h>	/* kmalloc(), kfree() */#include <linux/wanrouter.h>	/* WAN router definitions */#include <linux/wanpipe.h>	/* WANPIPE common user API definitions */#include <linux/if_arp.h>	/* ARPHRD_* defines */#include <asm/byteorder.h>	/* htons(), etc. */#include <asm/io.h>		/* for inb(), outb(), etc. */#include <linux/time.h>	 	/* for do_gettimeofday */	#include <linux/in.h>		/* sockaddr_in */#include <linux/inet.h>		/* in_ntoa(), etc... */#include <asm/uaccess.h>#include <linux/inetdevice.h>#include <linux/ip.h>#include <net/route.h>          /* Dynamic Route Creation */#include <linux/if.h>#include <linux/sdla_fr.h>	/* frame relay firmware API definitions */ /****** Defines & Macros ****************************************************/#define	MAX_CMD_RETRY	10		/* max number of firmware retries */#define	FR_HEADER_LEN	8		/* max encapsulation header size */#define	FR_CHANNEL_MTU	1500		/* unfragmented logical channel MTU *//* Q.922 frame types */#define	Q922_UI		0x03		/* Unnumbered Info frame */#define	Q922_XID	0xAF		/* DLCI configured or not */#define DLCI_NOT_CONFIGURED	0x00#define DLCI_CONFIG_PENDING	0x01#define DLCI_CONFIGURED		0x02/* CIR enabled or not */#define CIR_ENABLED	0x00#define CIR_DISABLED	0x01#define WANPIPE 0x00#define API     0x01#define FRAME_RELAY_API 1#define TX_TIMEOUT	(5*HZ)/* For handle_IPXWAN() */#define CVHexToAscii(b) (((unsigned char)(b) > (unsigned char)9) ? ((unsigned char)'A' + ((unsigned char)(b) - (unsigned char)10)) : ((unsigned char)'0' + (unsigned char)(b))) /****** Data Structures *****************************************************//* This is an extention of the 'struct net_device' we create for each network * interface to keep the rest of channel-specific data. */typedef struct fr_channel{	/* This member must be first. */	struct net_device *slave;	/* WAN slave */	char name[WAN_IFNAME_SZ+1];	/* interface name, ASCIIZ */	unsigned dlci_configured  ;	/* check whether configured or not */	unsigned cir_status;		/* check whether CIR enabled or not */	unsigned dlci;			/* logical channel number */	unsigned cir;			/* committed information rate */	unsigned bc;			/* committed burst size */	unsigned be;			/* excess burst size */	unsigned mc;			/* multicast support on or off */	unsigned tx_int_status;		/* Transmit Interrupt Status */		unsigned short pkt_length;	/* Packet Length */	unsigned long router_start_time;/* Router start time in seconds */	unsigned long tick_counter;	/* counter for transmit time out */	char dev_pending_devtint;	/* interface pending dev_tint() */	char state;			/* channel state */	void *dlci_int_interface;	/* pointer to the DLCI Interface */ 	unsigned long IB_addr;		/* physical address of Interface Byte */	unsigned long state_tick;	/* time of the last state change */	unsigned char enable_IPX;	/* Enable/Disable the use of IPX */	unsigned long network_number;	/* Internal Network Number for IPX*/	sdla_t *card;			/* -> owner */	unsigned route_flag;		/* Add/Rem dest addr in route tables */	unsigned inarp;			/* Inverse Arp Request status */ 	int inarp_interval;		/* Time between InArp Requests */	unsigned long inarp_tick;	/* InArp jiffies tick counter */	struct net_device_stats ifstats;	/* interface statistics */	if_send_stat_t drvstats_if_send;        rx_intr_stat_t drvstats_rx_intr;        pipe_mgmt_stat_t drvstats_gen;	unsigned char usedby;  /* Used by WANPIPE or API */	unsigned long router_up_time;	unsigned short transmit_length;	char transmit_buffer[FR_MAX_NO_DATA_BYTES_IN_FRAME];} fr_channel_t;/* Route Flag options */#define NO_ROUTE	0x00#define ADD_ROUTE 	0x01#define ROUTE_ADDED	0x02#define REMOVE_ROUTE 	0x03/* inarp options */#define INARP_NONE		0x00#define INARP_REQUEST		0x01#define INARP_CONFIGURED	0x02/* reasons for enabling the timer interrupt on the adapter */#define TMR_INT_ENABLED_UDP   	0x01#define TMR_INT_ENABLED_UPDATE 	0x02typedef struct dlci_status{	unsigned short dlci	PACKED;	unsigned char state	PACKED;} dlci_status_t;typedef struct dlci_IB_mapping{	unsigned short dlci		PACKED;	unsigned long  addr_value	PACKED;} dlci_IB_mapping_t;/* This structure is used for DLCI list Tx interrupt mode.  It is used to   enable interrupt bit and set the packet length for transmission */typedef struct fr_dlci_interface {	unsigned char gen_interrupt	PACKED;	unsigned short packet_length	PACKED;	unsigned char reserved		PACKED;} fr_dlci_interface_t; /* variable for keeping track of enabling/disabling FT1 monitor status */static int rCount = 0;extern int ip_rt_ioctl(unsigned int, void *);extern void disable_irq(unsigned int);extern void enable_irq(unsigned int);/* variable for keeping track of number of interrupts generated during  * interrupt test routine  */static int Intr_test_counter;/****** Function Prototypes *************************************************//* WAN link driver entry points. These are called by the WAN router module. */static int update(wan_device_t *wandev);static int new_if(wan_device_t *wandev, struct net_device *dev, wanif_conf_t *conf);static int del_if(wan_device_t *wandev, struct net_device *dev);/* WANPIPE-specific entry points */static int wpf_exec(struct sdla *card, void *u_cmd, void *u_data);/* Network device interface */static int if_init(struct net_device *dev);static int if_open(struct net_device *dev);static int if_close(struct net_device *dev);static int if_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, void *daddr, void *saddr, unsigned len);static int if_rebuild_hdr(struct sk_buff *skb);static int if_send(struct sk_buff *skb, struct net_device *dev);static void if_tx_timeout (struct net_device *dev);static int chk_bcast_mcast_addr(sdla_t *card, struct net_device* dev,                                struct sk_buff *skb);static struct net_device_stats *if_stats(struct net_device *dev);/* Interrupt handlers */static void fr_isr(sdla_t *card);static void rx_intr(sdla_t *card);static void tx_intr(sdla_t *card);static void timer_intr(sdla_t *card);static void spur_intr(sdla_t *card);/* Frame relay firmware interface functions */static int fr_read_version(sdla_t *card, char *str);static int fr_configure(sdla_t *card, fr_conf_t *conf);static int fr_dlci_configure(sdla_t *card, fr_dlc_conf_t *conf, unsigned dlci);static int fr_init_dlci (sdla_t *card, fr_channel_t *chan);static int fr_set_intr_mode (sdla_t *card, unsigned mode, unsigned mtu, unsigned short timeout);static int fr_comm_enable(sdla_t *card);static int fr_comm_disable(sdla_t *card);static int fr_get_err_stats(sdla_t *card);static int fr_get_stats(sdla_t *card);static int fr_add_dlci(sdla_t *card, int dlci);static int fr_activate_dlci(sdla_t *card, int dlci);static int fr_delete_dlci (sdla_t* card, int dlci);static int fr_issue_isf(sdla_t *card, int isf);static int fr_send(sdla_t *card, int dlci, unsigned char attr, int len,	void *buf);/* Firmware asynchronous event handlers */static int fr_event(sdla_t *card, int event, fr_mbox_t *mbox);static int fr_modem_failure(sdla_t *card, fr_mbox_t *mbox);static int fr_dlci_change(sdla_t *card, fr_mbox_t *mbox);/* Miscellaneous functions */static int update_chan_state(struct net_device *dev);static void set_chan_state(struct net_device *dev, int state);static struct net_device *find_channel(sdla_t *card, unsigned dlci);static int is_tx_ready(sdla_t *card, fr_channel_t *chan);static unsigned int dec_to_uint(unsigned char *str, int len);static int reply_udp( unsigned char *data, unsigned int mbox_len );static int intr_test( sdla_t* card );static void init_chan_statistics( fr_channel_t* chan );static void init_global_statistics( sdla_t* card );static void read_DLCI_IB_mapping( sdla_t* card, fr_channel_t* chan );static void setup_for_delayed_transmit(struct net_device* dev, void* buf,	unsigned len);/* Inverse ARP and Dynamic routing functions */int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, struct net_device *dev);int is_arp(void *buf);int send_inarp_request(sdla_t *card, struct net_device *dev);/* Udp management functions */static int process_udp_mgmt_pkt(sdla_t *card);static int udp_pkt_type( struct sk_buff *skb, sdla_t *card );static int store_udp_mgmt_pkt(int udp_type, char udp_pkt_src, sdla_t* card,                                struct sk_buff *skb, int dlci);/* IPX functions */static void switch_net_numbers(unsigned char *sendpacket,	unsigned long network_number, unsigned char incoming);static int handle_IPXWAN(unsigned char *sendpacket, char *devname,	unsigned char enable_IPX, unsigned long network_number);/* Lock Functions: SMP supported */void 	s508_s514_unlock(sdla_t *card, unsigned long *smp_flags);void 	s508_s514_lock(sdla_t *card, unsigned long *smp_flags);unsigned short calc_checksum (char *, int);/****** Public Functions ****************************************************//*============================================================================ * Frame relay protocol initialization routine. * * This routine is called by the main WANPIPE module during setup.  At this * point adapter is completely initialized and firmware is running. *  o read firmware version (to make sure it's alive) *  o configure adapter *  o initialize protocol-specific fields of the adapter data space. * * Return:	0	o.k. *		< 0	failure. */int wpf_init(sdla_t *card, wandev_conf_t *conf){	int err;	union	{		char str[80];		fr_conf_t cfg;	} u;	fr_buf_info_t* buf_info;	int i;	/* Verify configuration ID */	if (conf->config_id != WANCONFIG_FR) {				printk(KERN_INFO "%s: invalid configuration ID %u!\n",			card->devname, conf->config_id);		return -EINVAL;		}	/* Initialize protocol-specific fields of adapter data space */	switch (card->hw.fwid) {			case SFID_FR508:			card->mbox  = (void*)(card->hw.dpmbase + 					FR508_MBOX_OFFS);			card->flags = (void*)(card->hw.dpmbase + 					FR508_FLAG_OFFS);			if(card->hw.type == SDLA_S514) {				card->mbox += FR_MB_VECTOR;                                card->flags += FR_MB_VECTOR;			}                        card->isr = &fr_isr;			break;		default:			return -EINVAL;	}	/* Read firmware version.  Note that when adapter initializes, it	 * clears the mailbox, so it may appear that the first command was	 * executed successfully when in fact it was merely erased. To work	 * around this, we execute the first command twice.	 */	if (fr_read_version(card, NULL) || fr_read_version(card, u.str))		return -EIO;	printk(KERN_INFO "%s: running frame relay firmware v%s\n",		card->devname, u.str);	/* Adjust configuration */	conf->mtu += FR_HEADER_LEN;	conf->mtu = (conf->mtu >= MIN_LGTH_FR_DATA_CFG) ?			min(conf->mtu, FR_MAX_NO_DATA_BYTES_IN_FRAME) :                        FR_CHANNEL_MTU + FR_HEADER_LEN;     	conf->bps = min(conf->bps, 2048000);	/* Initialze the configuration structure sent to the board to zero */	memset(&u.cfg, 0, sizeof(u.cfg));	memset(card->u.f.dlci_to_dev_map, 0, sizeof(card->u.f.dlci_to_dev_map)); 		/* Configure adapter firmware */		u.cfg.mtu	= conf->mtu;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -