新闻  |   论坛  |   博客  |   在线研讨会
DM9003 驱动学习(五)Linux driver 03
0750long | 2009-05-26 18:50:14    阅读:2001   发布文章

DM9003 驱动学习(五)Linux driver 03

 

中断状态寄存器 FEH
bit:0 接收中断
bit:1 发送中断
bit:2 接收溢出
bit:3 接收指针溢出
bit:4 MEM错误
bit:5 链接状态改变(两个port都包含)
bit:6
bit:7 数据模式 16bit/8bit

中断掩码寄存器 FFH
bit:0 接收包中断enbale/disable
bit:1 发送包中断enbale/disable
bit:2 接收溢出enbale/disable
bit:3 接收指针溢出enbale/disable
bit:4 MEM错误enbale/disable
bit:5 链接状态改变(两个port都包含)enbale/disable
bit:6
bit:7 SRAM读写指针用传送接收地址

static irqreturn_t dm9013_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
 struct net_device *dev = dev_id;
 board_info_t *db = (board_info_t *)dev->priv;
 int int_status;
 u8 reg_save;

 DM9013_DBUG(0, "dm9013_interrupt()", 0);
 /* A real interrupt coming */
 spin_lock(&db->lock); //互斥加锁

 /* Save previous register address */
 reg_save = inb(db->io_addr);

 /* disable IMR */
 dm9013_disable_interrupt(db); //清除中断

      //获取DM9003中断状态
 int_status = ior(db, DM9013_ISR); /* Got ISR */
 iow(db, DM9013_ISR, int_status);  /* Clear ISR status */

 /* Received the coming packet */
       //接收包中断
 if (int_status & ISR_RX_coming)
#ifdef NAPI  //轮询方式
 {
  if (netif_rx_schedule_prep(dev)) {
   iow(db, DM9013_IMR,DM9013_NO_RX_INTR);
         __netif_rx_schedule(dev);
                 }
 }
#else  //中断方式
 dm9013_packet_receive(dev);
#endif
 if (db->cont_rx_pkt_cnt>=CONT_RX_PKT_CNT)
 {
  printk("enable interrupt without RX\n");
  iow(db, DM9013_IMR, 0xa2);
 }
 else
  dm9013_enable_interrupt(db);
  
       //发送packet完成,中断
 /* Trnasmit Interrupt check */
 if (int_status & ISR_TX_complete)
  dm9013_tx_done(0);

      //恢复寄存器值
 /* Restore previous register address */
 outb(reg_save, db->io_addr);

       //解锁互斥
 spin_unlock(&db->lock);
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
 return IRQ_HANDLED;
#endif
}

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

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