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

📄 skge.c

📁 F:worksip2440a board可启动u-boot-like.tar.gz F:worksip2440a board可启动u-boot-like.tar.gz
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 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] = {"", };#endif#if 0static int debug = 0; /* not used */static int options[SK_MAX_CARD_PARAM] = {0, }; /* not used *//***************************************************************************** * * 	skge_init_module - module initialization function * * Description: *	Very simple, only call skge_probe and return approriate result. * * Returns: *	0, if everything is ok *	!=0, on error */static int __init skge_init_module(void){	int cards;	SkGeRootDev = NULL;	/* just to avoid warnings ... */	debug = 0;	options[0] = 0;	cards = skge_probe();	if (cards == 0) {		printk("sk98lin: No adapter found.\n");	}	return cards ? 0 : -ENODEV;} /* skge_init_module *//***************************************************************************** * * 	skge_cleanup_module - module unload function * * Description: *	Disable adapter if it is still running, free resources, *	free device struct. * * Returns: N/A */static void __exit skge_cleanup_module(void){DEV_NET		*pNet;SK_AC		*pAC;struct SK_NET_DEVICE *next;unsigned long Flags;SK_EVPARA EvPara;	while (SkGeRootDev) {		pNet = (DEV_NET*) SkGeRootDev->priv;		pAC = pNet->pAC;		next = pAC->Next;		netif_stop_queue(SkGeRootDev);		SkGeYellowLED(pAC, pAC->IoBase, 0);		if(pAC->BoardLevel == 2) {			/* board is still alive */			spin_lock_irqsave(&pAC->SlowPathLock, Flags);			EvPara.Para32[0] = 0;			EvPara.Para32[1] = -1;			SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);			EvPara.Para32[0] = 1;			EvPara.Para32[1] = -1;			SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara);			SkEventDispatcher(pAC, pAC->IoBase);			/* disable interrupts */			SK_OUT32(pAC->IoBase, B0_IMSK, 0);			SkGeDeInit(pAC, pAC->IoBase);			spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);			pAC->BoardLevel = 0;			/* We do NOT check here, if IRQ was pending, of course*/		}		if(pAC->BoardLevel == 1) {			/* board is still alive */			SkGeDeInit(pAC, pAC->IoBase);			pAC->BoardLevel = 0;		}		if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 2){			unregister_netdev(pAC->dev[1]);			kfree(pAC->dev[1]);		}		FreeResources(SkGeRootDev);		SkGeRootDev->get_stats = NULL;		/*		 * otherwise unregister_netdev calls get_stats with		 * invalid IO ...  :-(		 */		unregister_netdev(SkGeRootDev);		kfree(SkGeRootDev);		kfree(pAC);		SkGeRootDev = next;	}	/* clear proc-dir */	remove_proc_entry(pSkRootDir->name, proc_net);} /* skge_cleanup_module */module_init(skge_init_module);module_exit(skge_cleanup_module);#endif/***************************************************************************** * * 	SkGeBoardInit - do level 0 and 1 initialization * * Description: *	This function prepares the board hardware for running. The desriptor *	ring is set up, the IRQ is allocated and the configuration settings *	are examined. * * Returns: *	0, if everything is ok *	!=0, on error */static int __init SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC){short	i;unsigned long Flags;char	*DescrString = "sk98lin: Driver for Linux"; /* this is given to PNMI */char	*VerStr	= VER_STRING;#if 0int	Ret;			/* return code of request_irq */#endifSK_BOOL	DualNet;	SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,		("IoBase: %08lX\n", (unsigned long)pAC->IoBase));	for (i=0; i<SK_MAX_MACS; i++) {		pAC->TxPort[i][0].HwAddr = pAC->IoBase + TxQueueAddr[i][0];		pAC->TxPort[i][0].PortIndex = i;		pAC->RxPort[i].HwAddr = pAC->IoBase + RxQueueAddr[i];		pAC->RxPort[i].PortIndex = i;	}	/* Initialize the mutexes */	for (i=0; i<SK_MAX_MACS; i++) {		spin_lock_init(&pAC->TxPort[i][0].TxDesRingLock);		spin_lock_init(&pAC->RxPort[i].RxDesRingLock);	}	spin_lock_init(&pAC->SlowPathLock);	/* level 0 init common modules here */	spin_lock_irqsave(&pAC->SlowPathLock, Flags);	/* Does a RESET on board ...*/	if (SkGeInit(pAC, pAC->IoBase, 0) != 0) {		printk("HWInit (0) failed.\n");		spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);		return(-EAGAIN);	}	SkI2cInit(  pAC, pAC->IoBase, 0);	SkEventInit(pAC, pAC->IoBase, 0);	SkPnmiInit( pAC, pAC->IoBase, 0);	SkAddrInit( pAC, pAC->IoBase, 0);	SkRlmtInit( pAC, pAC->IoBase, 0);	SkTimerInit(pAC, pAC->IoBase, 0);	pAC->BoardLevel = 0;	pAC->RxBufSize = ETH_BUF_SIZE;	SK_PNMI_SET_DRIVER_DESCR(pAC, DescrString);	SK_PNMI_SET_DRIVER_VER(pAC, VerStr);	spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);	/* level 1 init common modules here (HW init) */	spin_lock_irqsave(&pAC->SlowPathLock, Flags);	if (SkGeInit(pAC, pAC->IoBase, 1) != 0) {		printk("HWInit (1) failed.\n");		spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);		return(-EAGAIN);	}	SkI2cInit(  pAC, pAC->IoBase, 1);	SkEventInit(pAC, pAC->IoBase, 1);	SkPnmiInit( pAC, pAC->IoBase, 1);	SkAddrInit( pAC, pAC->IoBase, 1);	SkRlmtInit( pAC, pAC->IoBase, 1);	SkTimerInit(pAC, pAC->IoBase, 1);	GetConfiguration(pAC);	if (pAC->RlmtNets == 2) {		pAC->GIni.GIPortUsage = SK_MUL_LINK;	}	pAC->BoardLevel = 1;	spin_unlock_irqrestore(&pAC->SlowPathLock, Flags);#if 0	if (pAC->GIni.GIMacsFound == 2) {		 Ret = request_irq(dev->irq, SkGeIsr, SA_SHIRQ, pAC->Name, dev);	} else if (pAC->GIni.GIMacsFound == 1) {		Ret = request_irq(dev->irq, SkGeIsrOnePort, SA_SHIRQ,			pAC->Name, dev);	} else {		printk(KERN_WARNING "%s: Illegal number of ports: %d\n",		       dev->name, pAC->GIni.GIMacsFound);		return -EAGAIN;	}	if (Ret) {		printk(KERN_WARNING "%s: Requested IRQ %d is busy.\n",		       dev->name, dev->irq);		return -EAGAIN;	}#endif	pAC->AllocFlag |= SK_ALLOC_IRQ;	/* Alloc memory for this board (Mem for RxD/TxD) : */	if(!BoardAllocMem(pAC)) {		printk("No memory for descriptor rings.\n");		return(-EAGAIN);	}	SkCsSetReceiveFlags(pAC,		SKCS_PROTO_IP | SKCS_PROTO_TCP | SKCS_PROTO_UDP,		&pAC->CsOfs1, &pAC->CsOfs2, 0);	pAC->CsOfs = (pAC->CsOfs2 << 16) | pAC->CsOfs1;	BoardInitMem(pAC);#if 0	SetQueueSizes(pAC);#else	/* tschilling: New common function with minimum size check. */	DualNet = SK_FALSE;	if (pAC->RlmtNets == 2) {		DualNet = SK_TRUE;	}	if (SkGeInitAssignRamToQueues(		pAC,		pAC->ActivePort,		DualNet)) {		BoardFreeMem(pAC);		printk("SkGeInitAssignRamToQueues failed.\n");		return(-EAGAIN);	}#endif	/* Print adapter specific string from vpd */	ProductStr(pAC);#ifdef SK98_INFO	printk("%s: %s\n", dev->name, pAC->DeviceStr);	/* Print configuration settings */	printk("      PrefPort:%c  RlmtMode:%s\n",		'A' + pAC->Rlmt.Net[0].Port[pAC->Rlmt.Net[0].PrefPort]->PortNumber,		(pAC->RlmtMode==0)  ? "Check Link State" :		((pAC->RlmtMode==1) ? "Check Link State" :		((pAC->RlmtMode==3) ? "Check Local Port" :		((pAC->RlmtMode==7) ? "Check Segmentation" :		((pAC->RlmtMode==17) ? "Dual Check Link State" :"Error")))));#endif	SkGeYellowLED(pAC, pAC->IoBase, 1);	/*	 * Register the device here	 */	pAC->Next = SkGeRootDev;	SkGeRootDev = dev;	return (0);} /* SkGeBoardInit *//***************************************************************************** * * 	BoardAllocMem - allocate the memory for the descriptor rings * * Description: *	This function allocates the memory for all descriptor rings. *	Each ring is aligned for the desriptor alignment and no ring *	has a 4 GByte boundary in it (because the upper 32 bit must *	be constant for all descriptiors in one rings). * * Returns: *	SK_TRUE, if all memory could be allocated *	SK_FALSE, if not */static SK_BOOL BoardAllocMem(SK_AC	*pAC){caddr_t		pDescrMem;	/* pointer to descriptor memory area */size_t		AllocLength;	/* length of complete descriptor area */int		i;		/* loop counter */unsigned long	BusAddr;	/* rings plus one for alignment (do not cross 4 GB boundary) */	/* RX_RING_SIZE is assumed bigger than TX_RING_SIZE */#if (BITS_PER_LONG == 32)	AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound + 8;#else	AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound		+ RX_RING_SIZE + 8;#endif	pDescrMem = pci_alloc_consistent(pAC->PciDev, AllocLength,					 &pAC->pDescrMemDMA);	if (pDescrMem == NULL) {		return (SK_FALSE);	}	pAC->pDescrMem = pDescrMem;	BusAddr = (unsigned long) pAC->pDescrMemDMA;	/* Descriptors need 8 byte alignment, and this is ensured	 * by pci_alloc_consistent.	 */	for (i=0; i<pAC->GIni.GIMacsFound; i++) {		SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,			("TX%d/A: pDescrMem: %lX,   PhysDescrMem: %lX\n",			i, (unsigned long) pDescrMem,			BusAddr));		pAC->TxPort[i][0].pTxDescrRing = pDescrMem;		pAC->TxPort[i][0].VTxDescrRing = BusAddr;		pDescrMem += TX_RING_SIZE;		BusAddr += TX_RING_SIZE;		SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS,			("RX%d: pDescrMem: %lX,   PhysDescrMem: %lX\n",			i, (unsigned long) pDescrMem,			(unsigned long)BusAddr));		pAC->RxPort[i].pRxDescrRing = pDescrMem;		pAC->RxPort[i].VRxDescrRing = BusAddr;		pDescrMem += RX_RING_SIZE;		BusAddr += RX_RING_SIZE;	} /* for */	return (SK_TRUE);} /* BoardAllocMem *//**************************************************************************** * *	BoardFreeMem - reverse of BoardAllocMem * * Description: *	Free all memory allocated in BoardAllocMem: adapter context, *	descriptor rings, locks. * * Returns:	N/A */static void BoardFreeMem(SK_AC		*pAC){size_t		AllocLength;	/* length of complete descriptor area */	SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,		("BoardFreeMem\n"));#if (BITS_PER_LONG == 32)	AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound + 8;#else	AllocLength = (RX_RING_SIZE + TX_RING_SIZE) * pAC->GIni.GIMacsFound		+ RX_RING_SIZE + 8;#endif	pci_free_consistent(pAC->PciDev, AllocLength,			    pAC->pDescrMem, pAC->pDescrMemDMA);	pAC->pDescrMem = NULL;} /* BoardFreeMem *//***************************************************************************** * * 	BoardInitMem - initiate the descriptor rings * * Description: *	This function sets the descriptor rings up in memory. *	The adapter is initialized with the descriptor start addresses. * * Returns:	N/A */static void BoardInitMem(SK_AC	*pAC)	/* pointer to adapter context */{int	i;		/* loop counter */int	RxDescrSize;	/* the size of a rx descriptor rounded up to alignment*/int	TxDescrSize;	/* the size of a tx descriptor rounded up to alignment*/	SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,		("BoardInitMem\n"));	RxDescrSize = (((sizeof(RXD) - 1) / DESCR_ALIGN) + 1) * DESCR_ALIGN;	pAC->RxDescrPerRing = RX_RING_SIZE / RxDescrSize;	TxDescrSize = (((sizeof(TXD) - 1) / DESCR_ALIGN) + 1) * DESCR_ALIGN;	pAC->TxDescrPerRing = TX_RING_SIZE / RxDescrSize;	for (i=0; i<pAC->GIni.GIMacsFound; i++) {		SetupRing(			pAC,			pAC->TxPort[i][0].pTxDescrRing,			pAC->TxPort[i][0].VTxDescrRing,			(RXD**)&pAC->TxPort[i][0].pTxdRingHead,			(RXD**)&pAC->TxPort[i][0].pTxdRingTail,			(RXD**)&pAC->TxPort[i][0].pTxdRingPrev,			&pAC->TxPort[i][0].TxdRingFree,			SK_TRUE);		SetupRing(			pAC,			pAC->RxPort[i].pRxDescrRing,			pAC->RxPort[i].VRxDescrRing,			&pAC->RxPort[i].pRxdRingHead,			&pAC->RxPort[i].pRxdRingTail,			&pAC->RxPort[i].pRxdRingPrev,			&pAC->RxPort[i].RxdRingFree,			SK_FALSE);	}} /* BoardInitMem *//***************************************************************************** * * 	SetupRing - create one descriptor ring * * Description: *	This function creates one descriptor ring in the given memory area. *	The head, tail and number of free descriptors in the ring are set. * * Returns: *	none */

⌨️ 快捷键说明

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