zhujy
驱动牛犊
驱动牛犊
  • 注册日期2005-06-20
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1201回复:2

请教一个linux下pci驱动的问题...

楼主#
更多 发布于:2005-08-04 20:00
  在写了一个pci的驱动,用ioctl读写寄存器已经正常,但是采用中断方式碰到麻烦,请指教!

1、芯片只用到INTA#,所以我在probe里面把pci配置空间的interrupt pin设为1;
2、然后在open函数里面申请中断,成功

   if(error = request_irq(card->irq, &des_interrupt, SA_SHIRQ, DES_NAME , card))    
         return error;

3、des_interrupt是中断处理函数,如下
   static void des_interrupt(int irq, void *dev_id, struct pt_regs *regs)
       {
              printk("<0>enter into des_interrupt!\n");
                                card = (struct des_card *)dev_id;
                       u32 status;
              spin_lock(&card->lock);
              status = readl(card->iobase0 + ISR);
              if(!(status & 0x00000001))
              {
                  spin_unlock(&card->lock);
                  return;  // not for us
              }
              writel(0x0, card->iobase0 + ISR);
              spin_unlock(&card->lock);
                                。。。
       }

现在的情况是,中断产生时立刻死机,提示消息是:
  EIP is at des_interrupt
   ......
   <0> kernel panic: Aice, killing interrupt handler
   In interrupt handler -- not syncing

这个是什么原因导致的啊?
本人已经被它困扰好多天了,请大虾们不吝赐教,感激不尽啊~~
sdren
驱动牛犊
驱动牛犊
  • 注册日期2004-06-24
  • 最后登录2005-08-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-08-09 16:10
确定 if(!(status & 0x00000001)) 没有问题,看看芯片资料关于中断状态标志位说明,有可能是把自己设备产生的中断错当成别的设备中断给抛弃掉,导致没有清中断而死机。这只是我个人的猜测
ubuntu_amateur
驱动牛犊
驱动牛犊
  • 注册日期2006-08-04
  • 最后登录2008-12-04
  • 粉丝0
  • 关注0
  • 积分970分
  • 威望98点
  • 贡献值0点
  • 好评度97点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-01-09 20:15
解决了么
there is a will,there is a way
游客

返回顶部