📄 smsc9118.c
字号:
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 + -