"); //-->
中断状态寄存器 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
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。