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

📄 skge.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
/****************************************************************************** * * Name:	skge.c * Project:	GEnesis, PCI Gigabit Ethernet Adapter * Version:	$Revision: 1.45 $ * Date:       	$Date: 2004/02/12 14:41:02 $ * Purpose:	The main driver source module * ******************************************************************************//****************************************************************************** * *	(C)Copyright 1998-2002 SysKonnect GmbH. *	(C)Copyright 2002-2003 Marvell. * *	Driver for Marvell Yukon chipset and SysKonnect Gigabit Ethernet  *      Server Adapters. * *	Created 10-Feb-1999, based on Linux' acenic.c, 3c59x.c and *	SysKonnects GEnesis Solaris driver *	Author: Christoph Goos (cgoos@syskonnect.de) *	        Mirko Lindner (mlindner@syskonnect.de) * *	Address all question to: linux@syskonnect.de * *	The technical manual for the adapters is available from SysKonnect's *	web pages: www.syskonnect.com *	Goto "Support" and search Knowledge Base for "manual". *	 *	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. * *	The information in this file is provided "AS IS" without warranty. * ******************************************************************************//****************************************************************************** * * Possible compiler options (#define xxx / -Dxxx): * *	debugging can be enable by changing SK_DEBUG_CHKMOD and *	SK_DEBUG_CHKCAT in makefile (described there). * ******************************************************************************//****************************************************************************** * * Description: * *	This is the main module of the Linux GE driver. *	 *	All source files except skge.c, skdrv1st.h, skdrv2nd.h and sktypes.h *	are part of SysKonnect's COMMON MODULES for the SK-98xx adapters. *	Those are used for drivers on multiple OS', so some thing may seem *	unnecessary complicated on Linux. Please do not try to 'clean up' *	them without VERY good reasons, because this will make it more *	difficult to keep the Linux driver in synchronisation with the *	other versions. * * Include file hierarchy: * *	<linux/module.h> * *	"h/skdrv1st.h" *		<linux/types.h> *		<linux/kernel.h> *		<linux/string.h> *		<linux/errno.h> *		<linux/ioport.h> *		<linux/slab.h> *		<linux/interrupt.h> *		<linux/pci.h> *		<linux/bitops.h> *		<asm/byteorder.h> *		<asm/io.h> *		<linux/netdevice.h> *		<linux/etherdevice.h> *		<linux/skbuff.h> *	    those three depending on kernel version used: *		<linux/bios32.h> *		<linux/init.h> *		<asm/uaccess.h> *		<net/checksum.h> * *		"h/skerror.h" *		"h/skdebug.h" *		"h/sktypes.h" *		"h/lm80.h" *		"h/xmac_ii.h" * *      "h/skdrv2nd.h" *		"h/skqueue.h" *		"h/skgehwt.h" *		"h/sktimer.h" *		"h/ski2c.h" *		"h/skgepnmi.h" *		"h/skvpd.h" *		"h/skgehw.h" *		"h/skgeinit.h" *		"h/skaddr.h" *		"h/skgesirq.h" *		"h/skrlmt.h" * ******************************************************************************/#include	"h/skversion.h"#include	<linux/module.h>#include	<linux/moduleparam.h>#include	<linux/init.h>#include 	<linux/proc_fs.h>#include	<linux/dma-mapping.h>#include	<linux/ip.h>#include	"h/skdrv1st.h"#include	"h/skdrv2nd.h"/******************************************************************************* * * Defines * ******************************************************************************//* for debuging on x86 only *//* #define BREAKPOINT() asm(" int $3"); *//* use the transmit hw checksum driver functionality */#define USE_SK_TX_CHECKSUM/* use the receive hw checksum driver functionality */#define USE_SK_RX_CHECKSUM/* use the scatter-gather functionality with sendfile() */#define SK_ZEROCOPY/* use of a transmit complete interrupt */#define USE_TX_COMPLETE/* * threshold for copying small receive frames * set to 0 to avoid copying, set to 9001 to copy all frames */#define SK_COPY_THRESHOLD	50/* number of adapters that can be configured via command line params */#define SK_MAX_CARD_PARAM	16/* * use those defines for a compile-in version of the driver instead * of command line parameters */// #define LINK_SPEED_A	{"Auto", }// #define LINK_SPEED_B	{"Auto", }// #define AUTO_NEG_A	{"Sense", }// #define AUTO_NEG_B	{"Sense", }// #define DUP_CAP_A	{"Both", }// #define DUP_CAP_B	{"Both", }// #define FLOW_CTRL_A	{"SymOrRem", }// #define FLOW_CTRL_B	{"SymOrRem", }// #define ROLE_A	{"Auto", }// #define ROLE_B	{"Auto", }// #define PREF_PORT	{"A", }// #define CON_TYPE 	{"Auto", }// #define RLMT_MODE	{"CheckLinkState", }#define DEV_KFREE_SKB(skb) dev_kfree_skb(skb)#define DEV_KFREE_SKB_IRQ(skb) dev_kfree_skb_irq(skb)#define DEV_KFREE_SKB_ANY(skb) dev_kfree_skb_any(skb)/* Set blink mode*/#define OEM_CONFIG_VALUE (	SK_ACT_LED_BLINK | \				SK_DUP_LED_NORMAL | \				SK_LED_LINK100_ON)/* Isr return value */#define SkIsrRetVar	irqreturn_t#define SkIsrRetNone	IRQ_NONE#define SkIsrRetHandled	IRQ_HANDLED/******************************************************************************* * * Local Function Prototypes * ******************************************************************************/static void	FreeResources(struct SK_NET_DEVICE *dev);static int	SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC);static SK_BOOL	BoardAllocMem(SK_AC *pAC);static void	BoardFreeMem(SK_AC *pAC);static void	BoardInitMem(SK_AC *pAC);static void	SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**, int*, SK_BOOL);static SkIsrRetVar	SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs);static SkIsrRetVar	SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs);static int	SkGeOpen(struct SK_NET_DEVICE *dev);static int	SkGeClose(struct SK_NET_DEVICE *dev);static int	SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev);static int	SkGeSetMacAddr(struct SK_NET_DEVICE *dev, void *p);static void	SkGeSetRxMode(struct SK_NET_DEVICE *dev);static struct	net_device_stats *SkGeStats(struct SK_NET_DEVICE *dev);static int	SkGeIoctl(struct SK_NET_DEVICE *dev, struct ifreq *rq, int cmd);static void	GetConfiguration(SK_AC*);static void	ProductStr(SK_AC*);static int	XmitFrame(SK_AC*, TX_PORT*, struct sk_buff*);static void	FreeTxDescriptors(SK_AC*pAC, TX_PORT*);static void	FillRxRing(SK_AC*, RX_PORT*);static SK_BOOL	FillRxDescriptor(SK_AC*, RX_PORT*);static void	ReceiveIrq(SK_AC*, RX_PORT*, SK_BOOL);static void	ClearAndStartRx(SK_AC*, int);static void	ClearTxIrq(SK_AC*, int, int);static void	ClearRxRing(SK_AC*, RX_PORT*);static void	ClearTxRing(SK_AC*, TX_PORT*);static int	SkGeChangeMtu(struct SK_NET_DEVICE *dev, int new_mtu);static void	PortReInitBmu(SK_AC*, int);static int	SkGeIocMib(DEV_NET*, unsigned int, int);static int	SkGeInitPCI(SK_AC *pAC);static void	StartDrvCleanupTimer(SK_AC *pAC);static void	StopDrvCleanupTimer(SK_AC *pAC);static int	XmitFrameSG(SK_AC*, TX_PORT*, struct sk_buff*);#ifdef SK_DIAG_SUPPORTstatic SK_U32   ParseDeviceNbrFromSlotName(const char *SlotName);static int      SkDrvInitAdapter(SK_AC *pAC, int devNbr);static int      SkDrvDeInitAdapter(SK_AC *pAC, int devNbr);#endif/******************************************************************************* * * Extern Function Prototypes * ******************************************************************************/static const char 	SKRootName[] = "net/sk98lin";static struct		proc_dir_entry *pSkRootDir;extern struct	file_operations sk_proc_fops;static inline void SkGeProcCreate(struct net_device *dev){	struct proc_dir_entry *pe;	if (pSkRootDir && 	    (pe = create_proc_entry(dev->name, S_IRUGO, pSkRootDir))) {		pe->proc_fops = &sk_proc_fops;		pe->data = dev;		pe->owner = THIS_MODULE;	}} static inline void SkGeProcRemove(struct net_device *dev){	if (pSkRootDir)		remove_proc_entry(dev->name, pSkRootDir);}extern void SkDimEnableModerationIfNeeded(SK_AC *pAC);	extern void SkDimDisplayModerationSettings(SK_AC *pAC);extern void SkDimStartModerationTimer(SK_AC *pAC);extern void SkDimModerate(SK_AC *pAC);extern void SkGeBlinkTimer(unsigned long data);#ifdef DEBUGstatic void	DumpMsg(struct sk_buff*, char*);static void	DumpData(char*, int);static void	DumpLong(char*, int);#endif/* global variables *********************************************************/static SK_BOOL DoPrintInterfaceChange = SK_TRUE;extern  struct ethtool_ops SkGeEthtoolOps;/* local variables **********************************************************/static uintptr_t TxQueueAddr[SK_MAX_MACS][2] = {{0x680, 0x600},{0x780, 0x700}};static uintptr_t RxQueueAddr[SK_MAX_MACS] = {0x400, 0x480};/***************************************************************************** * * 	SkGeInitPCI - Init the PCI resources * * Description: *	This function initialize the PCI resources and IO * * Returns: N/A *	 */int SkGeInitPCI(SK_AC *pAC){	struct SK_NET_DEVICE *dev = pAC->dev[0];	struct pci_dev *pdev = pAC->PciDev;	int retval;	if (pci_enable_device(pdev) != 0) {		return 1;	}	dev->mem_start = pci_resource_start (pdev, 0);	pci_set_master(pdev);	if (pci_request_regions(pdev, pAC->Name) != 0) {		retval = 2;		goto out_disable;	}#ifdef SK_BIG_ENDIAN	/*	 * On big endian machines, we use the adapter's aibility of	 * reading the descriptors as big endian.	 */	{		SK_U32		our2;		SkPciReadCfgDWord(pAC, PCI_OUR_REG_2, &our2);		our2 |= PCI_REV_DESC;		SkPciWriteCfgDWord(pAC, PCI_OUR_REG_2, our2);	}#endif	/*	 * Remap the regs into kernel space.	 */	pAC->IoBase = ioremap_nocache(dev->mem_start, 0x4000);	if (!pAC->IoBase){		retval = 3;		goto out_release;	}	return 0; out_release:	pci_release_regions(pdev); out_disable:	pci_disable_device(pdev);	return retval;}/***************************************************************************** * * 	FreeResources - release resources allocated for adapter * * Description: *	This function releases the IRQ, unmaps the IO and *	frees the desriptor ring. * * Returns: N/A *	 */static void FreeResources(struct SK_NET_DEVICE *dev){SK_U32 AllocFlag;DEV_NET		*pNet;SK_AC		*pAC;	pNet = netdev_priv(dev);	pAC = pNet->pAC;	AllocFlag = pAC->AllocFlag;	if (pAC->PciDev) {		pci_release_regions(pAC->PciDev);	}	if (AllocFlag & SK_ALLOC_IRQ) {		free_irq(dev->irq, dev);	}	if (pAC->IoBase) {		iounmap(pAC->IoBase);	}	if (pAC->pDescrMem) {		BoardFreeMem(pAC);	}	} /* FreeResources */MODULE_AUTHOR("Mirko Lindner <mlindner@syskonnect.de>");MODULE_DESCRIPTION("SysKonnect SK-NET Gigabit Ethernet SK-98xx driver");MODULE_LICENSE("GPL");#ifdef LINK_SPEED_Astatic char *Speed_A[SK_MAX_CARD_PARAM] = LINK_SPEED;#elsestatic char *Speed_A[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef LINK_SPEED_Bstatic char *Speed_B[SK_MAX_CARD_PARAM] = LINK_SPEED;#elsestatic char *Speed_B[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef AUTO_NEG_Astatic char *AutoNeg_A[SK_MAX_CARD_PARAM] = AUTO_NEG_A;#elsestatic char *AutoNeg_A[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef DUP_CAP_Astatic char *DupCap_A[SK_MAX_CARD_PARAM] = DUP_CAP_A;#elsestatic char *DupCap_A[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef FLOW_CTRL_Astatic char *FlowCtrl_A[SK_MAX_CARD_PARAM] = FLOW_CTRL_A;#elsestatic char *FlowCtrl_A[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef ROLE_Astatic char *Role_A[SK_MAX_CARD_PARAM] = ROLE_A;#elsestatic char *Role_A[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef AUTO_NEG_Bstatic char *AutoNeg_B[SK_MAX_CARD_PARAM] = AUTO_NEG_B;#elsestatic char *AutoNeg_B[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef DUP_CAP_Bstatic char *DupCap_B[SK_MAX_CARD_PARAM] = DUP_CAP_B;#elsestatic char *DupCap_B[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef FLOW_CTRL_Bstatic char *FlowCtrl_B[SK_MAX_CARD_PARAM] = FLOW_CTRL_B;#elsestatic char *FlowCtrl_B[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef ROLE_Bstatic char *Role_B[SK_MAX_CARD_PARAM] = ROLE_B;#elsestatic char *Role_B[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef CON_TYPEstatic char *ConType[SK_MAX_CARD_PARAM] = CON_TYPE;#elsestatic char *ConType[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef PREF_PORTstatic char *PrefPort[SK_MAX_CARD_PARAM] = PREF_PORT;#elsestatic char *PrefPort[SK_MAX_CARD_PARAM] = {"", };#endif#ifdef RLMT_MODEstatic char *RlmtMode[SK_MAX_CARD_PARAM] = RLMT_MODE;#elsestatic char *RlmtMode[SK_MAX_CARD_PARAM] = {"", };

⌨️ 快捷键说明

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