accessory 发表于 2009-11-20 06:00

TxUnderrun 和 TxAborted 在QEMU里根本就不会出现. 反正我在代码里没找到使用的地方.
发送相关的函数如下, 你也可以自己去QEMU/HW/RTL8139.C里面去看


static int rtl8139_transmit_one(RTL8139State *s, int descriptor)
{
    if (!rtl8139_transmitter_enabled(s))
    {
      DEBUG_PRINT(("RTL8139: +++ cannot transmit from descriptor %d: transmitter disabled\n",
                     descriptor));
      return 0;
    }

    if (s->TxStatus & TxHostOwns)
    {
      DEBUG_PRINT(("RTL8139: +++ cannot transmit from descriptor %d: owned by host (%08x)\n",
                     descriptor, s->TxStatus));
      return 0;
    }

    DEBUG_PRINT(("RTL8139: +++ transmitting from descriptor %d\n", descriptor));

    int txsize = s->TxStatus & 0x1fff;
    uint8_t txbuffer;

    DEBUG_PRINT(("RTL8139: +++ transmit reading %d bytes from host memory at 0x%08x\n",
               txsize, s->TxAddr));

    cpu_physical_memory_read(s->TxAddr, txbuffer, txsize);

    /* Mark descriptor as transferred */
    s->TxStatus |= TxHostOwns;
    s->TxStatus |= TxStatOK;

    rtl8139_transfer_frame(s, txbuffer, txsize, 0);

    DEBUG_PRINT(("RTL8139: +++ transmitted %d bytes from descriptor %d\n", txsize, descriptor));

    /* update interrupt */
    s->IntrStatus |= TxOK;
    rtl8139_update_irq(s);

    return 1;
}




static void rtl8139_transmit(RTL8139State *s)
{
    int descriptor = s->currTxDesc, txcount = 0;

    /*while*/
    if (rtl8139_transmit_one(s, descriptor))
    {
      ++s->currTxDesc;
      s->currTxDesc %= 4;
      ++txcount;
    }

    /* Mark transfer completed */
    if (!txcount)
    {
      DEBUG_PRINT(("RTL8139: transmitter queue stalled, current TxDesc = %d\n", s->currTxDesc));
    }
}

sherf 发表于 2009-11-20 06:12

原帖由 accessory 于 2009-11-20 06:00 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
TxUnderrun 和 TxAborted 在QEMU里根本就不会出现. 反正我在代码里没找到使用的地方.
发送相关的函数如下, 你也可以自己去QEMU/HW/RTL8139.C里面去看


static int rtl8139_transmit_one(RTL8139State *s,...


accessory,

不用查了,我知道原因了,真的挺令人沮丧的,居然是头文件中对TSD_TOK | TxUnderrun | TxAbortedT 出错!(都多了个0)。因为头文件都是copy过来的,之前没细看......(发那个例子(不是demo,demo里是对的)的人居然能调试出来.........)

[ 本帖最后由 sherf 于 2009-11-20 06:45 编辑 ]

sherf 发表于 2009-11-20 06:55

回复 #81 sherf 的帖子

accessory,

另,对于抓包的问题,因为在tap0里已经发现我发的包,因此我想利用tcpdump抓出来,到网上翻了一下找了个命令(tap0的 ip 是 192.168.0.11):

sudo tcpdump -s 0 -w pakect.tmp host 192.168.0.11

我先执行了这个命令,然后运行我的程序,当发包完了以后过一会我停了程序,并打开 packet.tmp 查看,但发现是空的,没抓到包。

疑问:上面tcpdump命令使用正确吗?(我看到网上有很多关于tcpdump的介绍,但感觉我没使用嗯错,但却抓不到包.....)

sherf 发表于 2009-11-20 07:34

回复 #83 accessory 的帖子

accessory,

谢谢你的建议。

我在你的命令里改了一下(加了输出文件):sudo tcpdump -s 0 -w packet.txt -i tap0,文件有内容,但是是乱码,在ubuntu里用 textedit 打开,换了几种编码显示都不行,你平常是用那种编码格式打开的?

sherf 发表于 2009-11-20 15:03

回复 #84 sherf 的帖子

accessory,

已解决(ethereal)。谢谢之前你的回复。

accessory 发表于 2009-11-21 02:38

不客气. 终于搞定了啊

sherf 发表于 2009-11-23 16:24

回复 #86 accessory 的帖子

accessory,

还有一点想请教一下,是关于PCI的存储空间方面的。例如:

1)通过PCI配置空间获得 iobase
for(dev=0; dev<32; dev++)
{
        base = 0x80000000 + (dev << 11);
        out_dword(0xCF8, base);
        data = in_dword(0xCFC);

        if(data != 0xFFFFFFFF)
        {
                dev1->device_id = data >> 16 ;
                dev1->vendor_id = data & 0x0000FFFF;
               
                //注:获得iobase
                out_dword(0xCF8, base + 0x10);
                dev1->iobase    = in_dword(0xCFC) & 0xFFFFFFFC;
                .....
        }       
}

2)基于iobase 对网卡芯片做 reset 操作
out_byte(rd->iobase + CR, CR_RST);

------------------------------
PCI存储空间包括 I/O Space 和 Memory Space,该怎么区分?比如,像上面 1) 和 2) 是不是都使用了 I/O Space ? 我对硬件了解不是很多(只是看了一些PCI方面的资料),对我而言,1)和 2)更多的只是端口的读写。但了解到,如果多个PCI设备共存的话,它们的存储空间是不能重叠的,因此想搞清楚 PCI的存储空间到底怎么理解,谢谢。

sherf 发表于 2009-11-23 22:59

回复 #87 sherf 的帖子

顶一下

accessory 发表于 2009-11-24 00:06

关于PCI 可以看看这个连接: http://tldp.org/LDP/tlk/dd/pci.html

总的来说PCI有3个空间, 配置, IO, MEMORY 空间. 你的87贴里的1) 是在访问配置空间. 不过是通过INTEL X86 的IO指令来访问的. 可以理解为 CF8, CFC 是2个比较特殊的IO端口,通过他们可以访问到PCI的配置空间.
87贴里的2)是访问I/O 空间.
页: 1 2 3 4 5 6 7 8 [9]
查看完整版本: RTL8139 programming guide