LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1840|回复: 4

请教一个网卡驱动加载的问题,SIOCSIFFLAGS evice or resource busy!

[复制链接]
发表于 2005-5-8 15:54:35 | 显示全部楼层 |阅读模式
我现在做的是rtl8139的网卡驱动,可以很顺利的加载进去,可是每当ifconfig rtl8139 up的时候,系统就提示:SIOCSIFFLAGS evice or resource busy!
这究竟是啥原因呢?还请各位高手指点!
 楼主| 发表于 2005-5-8 16:06:10 | 显示全部楼层
我用dmesg看了一下,发现有一句:
pci:found IRQ 11 for device 01:01:0
我又用cat /proc/interrupts看了一下,发现
11 :0  XT-pci  usb-uhci
是不是11号中断被usb占用了呢?所以才有上面的问题?
回复 支持 反对

使用道具 举报

发表于 2005-5-10 12:22:04 | 显示全部楼层
有可能。。。

在BIOS中看看?没有IRQ冲突之类的。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-10 12:43:58 | 显示全部楼层
我用printk()跟踪了一下,发现这个地方错了
retval = request_irq (dev->irq, rtl8139_interrupt, 0, dev->name, dev);
里面的第三个参数应为SA_SHIRQ,也就是应当设成是共享中断。
这个问题解决了后,可以
insmod rtl8139
ifconfig rtl8139 up
ifconfig rtl8139 192.168.160.168
而且我也将以前的eth0以及驱动给
ifconfig eth0 down
rmmod 8139too
可是当ping 同网段的192.168.160.23时
却死机了。我改了很多次程序了,
现在已经数不清死了多少次了!
如果有哪位仁兄也做个这方面的驱动,希望能够探讨一下,
我的qq是:99763145
我感到ping的时候死机应该是硬件发送函数没处理好。下面是部分代码
static void rtl8139_hw_start (struct net_device *dev)
{
        struct rtl8139_private *tp = dev->priv;
        void *ioaddr = tp->mmio_addr;
        u32 i;

        rtl8139_chip_reset(ioaddr);//对芯片进行复位
        writeb(CmdTxEnb, ioaddr + CR);//保证芯片处于发送状态
        /* 发送设置 */
        writel(0x00000600, ioaddr + TCR); /* DMA burst size 1024 */

        /* init Tx buffer DMA addresses */
        for (i = 0; i < NUM_TX_DESC; i++)
{
        writel(tp->tx_bufs_dma + (tp->tx_buf - tp->tx_bufs),ioaddr + TSAD0 + (i * 4));
        (unsigned long)readl(ioaddr + TSAD0 + (i * 4)); ///////////添加的写操作
}       
       
        /*向中断屏蔽寄存器内写入由芯片产生的中断*/
        writew(INT_MASK, ioaddr + IMR);
   
        netif_start_queue (dev);//通知内核芯片已经准备好,可以发送数据包了
       
    return;
}
另外
static int rtl8139_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
        struct rtl8139_private *tp = dev->priv;
        void *ioaddr = tp->mmio_addr;
        unsigned int entry = tp->cur_tx;
        unsigned int len = skb->len;


        if (len < TX_BUF_SIZE)
     {
                /*如果有一个数据包的长度小于60则仍以60的长度填充*/
       if(len < ETH_MIN_LEN)
                   memset(tp->tx_buf[entry], 0, ETH_MIN_LEN);
                /*将数据包拷贝到可以进行DMA传送的内存*/
        skb_copy_and_csum_dev(skb, tp->tx_buf[entry]);
                dev_kfree_skb(skb);
        }
  else {
        dev_kfree_skb(skb);
                return 0;
           }
          
        writel(tp->tx_flag | max(len, (unsigned int)ETH_MIN_LEN),ioaddr + TSD0 + (entry * sizeof (u32)));
    (unsigned long)readl(ioaddr + TSD0 + (entry * sizeof (u32))); ///////////添加的写操作
        entry++;
        tp->cur_tx = entry % NUM_TX_DESC;//循环转入下一个发送寄存器

        if(tp->cur_tx == tp->dirty_tx)//如果发送缓冲区已满,则停止发送  
       netif_stop_queue(dev);
       
    return 0;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-10 19:50:24 | 显示全部楼层
没有做网卡驱动的兄弟吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表