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

📄 smsc9118.c

📁 SMSC NET controller 9218 driver software
💻 C
📖 第 1 页 / 共 5 页
字号:
		default:
			SMSC_TRACE("  LAN9117 Concord A1 identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=2;
			break;
		};break;

	case 0x01160000UL:
		if (Scatter_gather | tx_Csum | rx_Csum)
			SMSC_TRACE("This chip doesn't support checksum offload!!! Will use nonchecksum offload by default");
		privateData->UseScatterGather=FALSE;
		privateData->UseTxCsum=FALSE;
		privateData->UseRxCsum=FALSE;

		switch(dwIdRev&0x0000FFFFUL) {
		case 0UL:
			goto UNKNOWN_CHIP;
		case 1UL:
			SMSC_TRACE("  LAN9116 Concord A0 identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=1;
			break;
		case 2UL:
			SMSC_TRACE("  LAN9116 Concord A1 identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=2;
			break;
		default:
			SMSC_TRACE("  LAN9116 Concord A1 identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=2;
			break;
		};break;

	case 0x01150000UL:
		if (Scatter_gather | tx_Csum | rx_Csum)
			SMSC_TRACE("This chip doesn't support checksum offload!!! Will use nonchecksum offload by default");
		privateData->UseScatterGather=FALSE;
		privateData->UseTxCsum=FALSE;
		privateData->UseRxCsum=FALSE;

		switch(dwIdRev&0x0000FFFFUL) {
		case 0UL:
			goto UNKNOWN_CHIP;
		case 1UL:
			SMSC_TRACE("  LAN9115 Concord A0 identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=1;
			break;
		case 2UL:
			SMSC_TRACE("  LAN9115 Concord A1 identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=2;
			break;
		default:
			SMSC_TRACE("  LAN9115 Concord A1 identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=2;
			break;
		};break;

	case 0x118A0000UL:
		if (Scatter_gather | tx_Csum | rx_Csum)
			SMSC_TRACE("This chip doesn't support checksum offload!!! Will use nonchecksum offload by default");
		privateData->UseScatterGather=FALSE;
		privateData->UseTxCsum=FALSE;
		privateData->UseRxCsum=FALSE;		

		switch(dwIdRev&0x0000FFFFUL) {
		case 0UL:
			SMSC_TRACE("  LAN9218 Boylston identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=3;
			break;
		default:
			SMSC_TRACE("  LAN9218 Boylston identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=3;
			break;
		};break;

	case 0x117A0000UL:
		if (Scatter_gather | tx_Csum | rx_Csum)
			SMSC_TRACE("This chip doesn't support checksum offload!!! Will use nonchecksum offload by default");
		privateData->UseScatterGather=FALSE;
		privateData->UseTxCsum=FALSE;
		privateData->UseRxCsum=FALSE;

		switch(dwIdRev&0x0000FFFFUL) {
		case 0UL:
			SMSC_TRACE("  LAN9217 Boylston identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=3;
			break;
		default:
			SMSC_TRACE("  LAN9217 Boylston identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=3;
			break;
		};break;

	case 0x116A0000UL:
		if (Scatter_gather | tx_Csum | rx_Csum)
			SMSC_TRACE("This chip doesn't support checksum offload!!! Will use nonchecksum offload by default");
		privateData->UseScatterGather=FALSE;
		privateData->UseTxCsum=FALSE;
		privateData->UseRxCsum=FALSE;

		switch(dwIdRev&0x0000FFFFUL) {
		case 0UL:
			SMSC_TRACE("  LAN9216 Boylston identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=3;
			break;
		default:
			SMSC_TRACE("  LAN9216 Boylston identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=3;
			break;
		};break;

	case 0x115A0000UL:
		if (Scatter_gather | tx_Csum | rx_Csum)
			SMSC_TRACE("This chip doesn't support checksum offload!!! Will use nonchecksum offload by default");
		privateData->UseScatterGather=FALSE;
		privateData->UseTxCsum=FALSE;
		privateData->UseRxCsum=FALSE;
		
		switch(dwIdRev&0x0000FFFFUL) {
		case 0UL:
			SMSC_TRACE("  LAN9215 Boylston identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=3;
			break;
		default:
			SMSC_TRACE("  LAN9215 Boylston identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=3;
			break;
		};break;


	case 0x92100000UL:
		privateData->UseScatterGather=Scatter_gather;
		privateData->UseTxCsum=tx_Csum;
		privateData->UseRxCsum=rx_Csum;
		if (Scatter_gather)
			SMSC_TRACE("   Tx Scatter-Gather");
		if (tx_Csum)
			SMSC_TRACE("   Tx HW Checksum");
		if (rx_Csum)
			SMSC_TRACE("   Rx HW Checksum");

		switch(dwIdRev&0x0000FFFFUL) {
		case 0UL:
			SMSC_TRACE("  LAN9210 Boylston Lite identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=4;
			break;
	
		default:
			SMSC_TRACE("  LAN9210 Boylston Lite identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=4;
			break;
		};break;

	case 0x92110000UL:
		privateData->UseScatterGather=Scatter_gather;
		privateData->UseTxCsum=tx_Csum;
		privateData->UseRxCsum=rx_Csum;
		if (Scatter_gather)
			SMSC_TRACE("   Tx Scatter-Gather");
		if (tx_Csum)
			SMSC_TRACE("   Tx HW Checksum");
		if (rx_Csum)
			SMSC_TRACE("   Rx HW Checksum");

		switch(dwIdRev&0x0000FFFFUL) {
		case 0UL:
			SMSC_TRACE("  LAN9211 Boylston Lite identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=4;
			break;
	
		default:
			SMSC_TRACE("  LAN9211 Boylston Lite identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=4;
			break;
		};break;

	case 0x215A0000UL:
		privateData->UseScatterGather=Scatter_gather;
		privateData->UseTxCsum=tx_Csum;
		privateData->UseRxCsum=rx_Csum;
		if (Scatter_gather)
			SMSC_TRACE("   Tx Scatter-Gather");
		if (tx_Csum)
			SMSC_TRACE("   Tx HW Checksum");
		if (rx_Csum)
			SMSC_TRACE("   Rx HW Checksum");

		switch(dwIdRev&0x0000FFFFUL) {
		case 0UL:
			SMSC_TRACE("  LAN9215A Boylston Auto identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=4;
			break;
	
		default:
			SMSC_TRACE("  LAN9215A Boylston Auto identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=4;
			break;
		};break;

	case 0x216A0000UL:
		privateData->UseScatterGather=Scatter_gather;
		privateData->UseTxCsum=tx_Csum;
		privateData->UseRxCsum=rx_Csum;
		if (Scatter_gather)
			SMSC_TRACE("   Tx Scatter-Gather");
		if (tx_Csum)
			SMSC_TRACE("   Tx HW Checksum");
		if (rx_Csum)
			SMSC_TRACE("   Rx HW Checksum");

		switch(dwIdRev&0x0000FFFFUL) {
		case 0UL:
			SMSC_TRACE("  LAN9216A Boylston Auto identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=4;
			break;
	
		default:
			SMSC_TRACE("  LAN9216A Boylston Auto identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=4;
			break;
		};break;

	case 0x217A0000UL:
		privateData->UseScatterGather=Scatter_gather;
		privateData->UseTxCsum=tx_Csum;
		privateData->UseRxCsum=rx_Csum;
		if (Scatter_gather)
			SMSC_TRACE("   Tx Scatter-Gather");
		if (tx_Csum)
			SMSC_TRACE("   Tx HW Checksum");
		if (rx_Csum)
			SMSC_TRACE("   Rx HW Checksum");

		switch(dwIdRev&0x0000FFFFUL) {
		case 0UL:
			SMSC_TRACE("  LAN9217A Boylston Auto identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=4;
			break;
	
		default:
			SMSC_TRACE("  LAN9217A Boylston Auto identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=4;
			break;
		};break;


	case 0x218A0000UL:
		privateData->UseScatterGather=Scatter_gather;
		privateData->UseTxCsum=tx_Csum;
		privateData->UseRxCsum=rx_Csum;
		if (Scatter_gather)
			SMSC_TRACE("   Tx Scatter-Gather");
		if (tx_Csum)
			SMSC_TRACE("   Tx HW Checksum");
		if (rx_Csum)
			SMSC_TRACE("   Rx HW Checksum");

		switch(dwIdRev&0x0000FFFFUL) {
		case 0UL:
			SMSC_TRACE("  LAN9218A Boylston Auto identified, dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=4;
			break;
	
		default:
			SMSC_TRACE("  LAN9218A Boylston Auto identified (NEW), dwIdRev==0x%08lX",dwIdRev);
			privateData->dwGeneration=4;
			break;
		};break;

	default:
		//This is used for the new unkonw chip before we formally add them in the driver
			if (id_reg==dwIdRev) {
				if (Csum_Support) {
					privateData->UseScatterGather=Scatter_gather;
					privateData->UseTxCsum=tx_Csum;
					privateData->UseRxCsum=rx_Csum;
				} else {
					SMSC_TRACE("This chip doesn't support checksum offload!!! Will use nonchecksum offload by default");
					privateData->UseScatterGather=FALSE;
					privateData->UseTxCsum=FALSE;
					privateData->UseRxCsum=FALSE;
				}
					
				SMSC_TRACE("  New Chip identified, dwIdRev==0x%08lX",dwIdRev);
				privateData->dwGeneration=5;
				
			} else {
			
				SMSC_WARNING("unknow chip, dwIdRev==0x%08lX",dwIdRev);

			}; break;
			

	}

//printk("dwGeneration = %d\n", privateData->dwGeneration); 

	dwFpgaRev=Lan_GetRegDW(FPGA_REV);
	SMSC_TRACE("  FPGA_REV == 0x%08lX",dwFpgaRev);


	ether_setup(dev);
	dev->open=				Smsc9118_open;
	dev->stop=				Smsc9118_stop;
	dev->hard_start_xmit=	Smsc9118_hard_start_xmit;
	dev->get_stats=			Smsc9118_get_stats;
	dev->do_ioctl=			Smsc9118_do_ioctl;
	dev->set_multicast_list=Smsc9118_set_multicast_list;
	dev->flags|=IFF_MULTICAST;
#ifdef LINUX_2_6_OR_NEWER
	if (rx_mode==PROCESSING_MODE_NAPI) {
		dev->poll=Smsc9118_rx_poll;
		dev->weight=napi_weight;
	}
#endif
	if(privateData->UseScatterGather) {

		if(privateData->UseTxCsum)
		dev->features = (NETIF_F_HW_CSUM | NETIF_F_SG | NETIF_F_FRAGLIST);
		else
		dev->features = (NETIF_F_SG | NETIF_F_FRAGLIST);	// Kernel will turn off SG in this case.
	}

	else {

		if(privateData->UseTxCsum)
		dev->features = (NETIF_F_HW_CSUM);
		else
		dev->features = 0;
	}


//printk("dev->fearures (0x%08lx)\n", (DWORD) dev->features);

	SET_MODULE_OWNER(dev);

	privateData->dwIdRev=dwIdRev;
	privateData->dwFpgaRev=dwFpgaRev&(0x000000FFUL);
	privateData->dev=dev;

	sprintf(privateData->ifName,"%s",dev->name);
	result=0;
    
DONE:
	if(result!=0) {
		if(dev!=NULL) {
			if(dev->priv!=NULL) {
				if(platformInitialized) {
					Platform_CleanUp(platformData);
				}
				kfree(dev->priv);
				dev->priv=NULL;
			}
		}
	}
	SMSC_TRACE("<--Smsc9118_init(), result=%d",result);
//printk("dev->fearures (0x%08lx)\n", (DWORD) dev->features);

	return result;
}

int Smsc9118_open(struct net_device *dev)
{
	int i;
	int result=-ENODEV;
	PPRIVATE_DATA privateData=NULL;
	PPLATFORM_DATA platformData=NULL;
	BOOLEAN acquired_mem_region=FALSE;
	BOOLEAN acquired_isr=FALSE;
	SMSC_TRACE("-->Smsc9118_open(dev=0x%08lX)",(DWORD)dev);
	if(dev==NULL) {
		SMSC_WARNING("Smsc9118_open(dev==NULL)");
		result=-EFAULT;
		goto DONE;
	}
	privateData=(PPRIVATE_DATA)(dev->priv);
	if(privateData==NULL) {
		SMSC_WARNING("Smsc9118_open(privateData==NULL)");
		result=-EFAULT;
		goto DONE;
	}
	platformData=&(privateData->PlatformData);

	for (i = 0; i < GPT_SCHEDULE_DEPTH; i++) {
		privateData->GptFunction [i] = NULL;
	}
	privateData->Gpt_scheduled_slot_index = GPT_SCHEDULE_DEPTH;

	//get memory region
	if(check_mem_region(privateData->dwLanBase,LAN_REGISTER_EXTENT)!=0)
	{
		SMSC_WARNING("Device memory is already in use.");
		result=-ENOMEM;
		goto DONE;
	}
	request_mem_region(privateData->dwLanBase,LAN_REGISTER_EXTENT,

⌨️ 快捷键说明

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