|
楼主 |
发表于 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;
} |
|