免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123456789
最近访问板块 发新帖
楼主: sherf
打印 上一主题 下一主题

RTL8139 programming guide [复制链接]

论坛徽章:
0
81 [报告]
发表于 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[descriptor] & TxHostOwns)
    {
        DEBUG_PRINT(("RTL8139: +++ cannot transmit from descriptor %d: owned by host (%08x)\n",
                     descriptor, s->TxStatus[descriptor]));
        return 0;
    }

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

    int txsize = s->TxStatus[descriptor] & 0x1fff;
    uint8_t txbuffer[0x2000];

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

    cpu_physical_memory_read(s->TxAddr[descriptor], txbuffer, txsize);

    /* Mark descriptor as transferred */
    s->TxStatus[descriptor] |= TxHostOwns;
    s->TxStatus[descriptor] |= 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));
    }
}

论坛徽章:
0
82 [报告]
发表于 2009-11-20 06:12 |只看该作者
原帖由 accessory 于 2009-11-20 06:00 发表
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 编辑 ]

论坛徽章:
0
83 [报告]
发表于 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的介绍,但感觉我没使用嗯错,但却抓不到包.....)

论坛徽章:
0
84 [报告]
发表于 2009-11-20 07:34 |只看该作者

回复 #83 accessory 的帖子

accessory,

谢谢你的建议。

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

论坛徽章:
0
85 [报告]
发表于 2009-11-20 15:03 |只看该作者

回复 #84 sherf 的帖子

accessory,

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

论坛徽章:
0
86 [报告]
发表于 2009-11-21 02:38 |只看该作者
不客气. 终于搞定了啊

论坛徽章:
0
87 [报告]
发表于 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的存储空间到底怎么理解,谢谢。

论坛徽章:
0
88 [报告]
发表于 2009-11-23 22:59 |只看该作者

回复 #87 sherf 的帖子

顶一下

论坛徽章:
0
89 [报告]
发表于 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 空间.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP