新闻  |   论坛  |   博客  |   在线研讨会
DM9003 驱动学习(三)Linux driver 01
0750long | 2009-05-26 18:52:49    阅读:2767   发布文章

DM9003 驱动学习(三)Linux driver 01

 

初始化部分,

从系统申请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;
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客