"); //-->
初始化部分,
从系统申请IO空间
注册IO地址及驱动相应的API
从EEPROM读MAC Address进行MAC地址初始化
===============================================
int __init dm9013_probe(struct net_device *dev)
{
struct board_info *db;/* Point a board information structure */
u32 pid_vid_ID;
u16 i, dm9013_found = FALSE;
u8 MAC_addr[6]={0x00,0x60,0x6E,0x33,0x44,0x55};
DM9013_DBUG(0, "dm9013_probe()",0);
/* Search All DM9013 serial NIC */
//查找板上所有DM9003/DM9013 IC
do {
/* get DM9013 ID */
outb(DM9013_VID_L, iobase);
pid_vid_ID = inb(iobase + 4);
outb(DM9013_VID_H, iobase);
pid_vid_ID |= inb(iobase + 4) << 8;
outb(DM9013_PID_L, iobase);
pid_vid_ID |= inb(iobase + 4) << 16;
outb(DM9013_PID_H, iobase);
pid_vid_ID |= inb(iobase + 4) << 24;
pe.id_val= pid_vid_ID; // SAVE
for (i=0;i<DM9013_MAX_NUM_IPHY;i++) pe.n4HangCounts_port[i]= 0;
if ((pe.id_val == DM9013_ID)||(pe.id_val == DM9003_ID))
{
/* Request IO from system */
if(!request_region(iobase, 2, dev->name)) //从系统请求IO地址空间
return -ENODEV;
printk("<DM9013> I/O: %x, VID: %x \n",iobase, pe.id_val);
dm9013_found = TRUE;
/* Allocated board information structure */
memset(dev->priv, 0, sizeof(struct board_info));
db = (board_info_t *)dev->priv;
dm9013_dev = dev;
db->io_addr = iobase;
db->io_data = iobase + 4;/* this value depends on CMD pin of DM9013 */
// 初始化总线及数据地址空间
/* driver system function */
dev->base_addr = iobase;
dev->irq = irq; // 中断号
dev->open = &dm9013_open;
dev->hard_start_xmit = &dm9013_start_xmit;
dev->watchdog_timeo = DM9013_TX_TIMEOUT;
dev->tx_timeout = dm9013_timeout;
dev->stop = &dm9013_stop;
dev->get_stats = &dm9013_get_stats;
dev->set_multicast_list = &dm9013_hash_table;
dev->do_ioctl = &dm9013_do_ioctl;
//以上部分初始化DM9003操作API
#ifdef NAPI /* Experiment */
dev->weight = 16;
dev->poll = dm9013_poll;
#endif
#ifdef CHECKSUM
dev->features |= NETIF_F_IP_CSUM;
#endif
/* Read EEPROM content */
for (i=0; i<64; i++)
((u16 *)db->srom)[i] = dm9013_read_eeprom_word(db, i);
/* Detect EEPROM */
db->HasEEPROM = 0;
if(((u16 *)db->srom)[5] == 0x9013) db->HasEEPROM = 1;
/* Set Node Address */
for (i=0; i<6; i++)
{
//#if 0
//dev->dev_addr[i] = MAC_addr[i];
//#endif
if (db->HasEEPROM)
dev->dev_addr[i] = db->srom[i];
else
dev->dev_addr[i] = MAC_addr[i];
printk("<9003> Fix-MAC Addr: %02x \n",
dev->dev_addr[i]);
}
}//end of if()
//以上部分从EEPROM读MAC并用EEPROM中的MAC初始化
iobase += 0x10;
}while(!dm9013_found && iobase <= DM9013_MAX_IO);
return dm9013_found ? 0:-ENODEV;
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。