免费注册 查看新帖 |

Chinaunix

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

RTL8139 programming guide [复制链接]

论坛徽章:
0
71 [报告]
发表于 2009-11-18 02:47 |只看该作者

回复 #69 accessory 的帖子

这个已经写了.....不行

另,写入 txstatus0 里面的值有限定吗?

论坛徽章:
0
72 [报告]
发表于 2009-11-18 03:06 |只看该作者

回复 #70 sherf 的帖子

再次 review并检查ISR后,发现,每发一个数据包后,ISR的值总是3E。已查过spec,但是还是搞不懂到底哪里出了问题...........

论坛徽章:
0
73 [报告]
发表于 2009-11-18 03:41 |只看该作者
你说的ISR 是INTRSTATUS (62) 吧? 0x3E表示TX_OK 和TX_ERR 都出现了. 不过既然又TX_OK, 那么读下 TXSTATUS 寄存器看看到底是什么状态了. 类似如下代码:

        txstatus = RTL_R32 (TxStatus0 + (entry * sizeof (u32)));

                if (!(txstatus & (TxStatOK | TxUnderrun | TxAborted)))
                        break;        /* It still hasn't been Txed */

论坛徽章:
0
74 [报告]
发表于 2009-11-18 06:31 |只看该作者
原帖由 accessory 于 2009-11-18 03:41 发表
你说的ISR 是INTRSTATUS (62) 吧? 0x3E表示TX_OK 和TX_ERR 都出现了. 不过既然又TX_OK, 那么读下 TXSTATUS 寄存器看看到底是什么状态了. 类似如下代码:

        txstatus = RTL_R32 (TxStatus0 + (entry * sizeof ( ...


谢谢,已能接收中断,原因是读写函数的取值不对(位数),真是搞死人........

另,目前还碰到一些其他的问题:

1、在进入中断程序后就一直在里面循环不出来。你们调试DEMO里的程序都会碰到这样的情况吗?我的理解是一次中断发一个包(忽略包的容量)或一次收一个包。

2、只能接收包,不能发送包。我起初怀疑是TCR的设置问题,我分别将8139too.c,8139cp.c,demo.c中对TCR的设置搬到我的程序中,并打开了发送屏蔽(IMR:0x04),但都不能引发发送中断。这里,我想再确认一下:

1)忽略数据包的大小和已打开发送中断屏蔽的情况下,一次发一个数据包就会引起一次发送中断,不可能是发了几个数据包才引发一次发送中断,是这样吗?

2)对于数据包的测试,我所建的数据包如下:

struct packet * buildpkg()
{
        struct packet *pkg;
        struct packet ppkg[1];
        u8 buf[64];
        int i;

        pkg = ppkg;

        pkg->length = 64;
        pkg->buffer = buf;

    //boardcast packet
        for(i=0; i<6; i++)
        {
                pkg->buffer= 0xFF;
        }

        pkg->buffer[6] = 0x00;
        pkg->buffer[7] = 0x33;
        pkg->buffer[8] = 0xaa;
        pkg->buffer[9] = 0xbb;
        pkg->buffer[10]= 0xcc;
        pkg->buffer[11]= 0xdd;

        // ethernet type
        pkg->buffer[12]= 0x08;
        pkg->buffer[13]= 0x06;

        // hardware type
        pkg->buffer[14]= 0x00;
        pkg->buffer[15]= 0x01;

        //ip protocal
        pkg->buffer[17]= 0x08;
        pkg->buffer[18]= 0x00;

        //mac and ip addr len
        pkg->buffer[19]= 0x06;
        pkg->buffer[20]= 0x04;

        //opcode
        pkg->buffer[21]= 0x00;
        pkg->buffer[22]= 0x01;

        //source mac
        pkg->buffer[23] = 0x00;
        pkg->buffer[24] = 0x33;
        pkg->buffer[25] = 0xaa;
        pkg->buffer[26] = 0xbb;
        pkg->buffer[27] = 0xcc;
        pkg->buffer[28] = 0xdd;

        //source ip
        pkg->buffer[29] = 192;
        pkg->buffer[30] = 168;
        pkg->buffer[31] = 1;
        pkg->buffer[32] = 31;

        //dest mac
        for(i=33; i<39; i++)
        {
                pkg->buffer= 0xFF;
        }

        //dest ip
        pkg->buffer[39] = 192;
        pkg->buffer[40] = 168;
        pkg->buffer[41] = 0;
        pkg->buffer[42] = 13;


        for(i=43; i<64; i++)
        {
                pkg->buffer= i & 0xFF;
        }

        return pkg;
}


这样建的数据包对吗?
 

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

论坛徽章:
0
75 [报告]
发表于 2009-11-18 10:32 |只看该作者
1) 不对。有可能发了好几个包之后,才来了一个中断。
2)对发送的包好象没什么要求。有个crc,我记得是接收时用的。

论坛徽章:
0
76 [报告]
发表于 2009-11-19 04:44 |只看该作者
原帖由 accessory 于 2009-11-18 03:41 发表
你说的ISR 是INTRSTATUS (62) 吧? 0x3E表示TX_OK 和TX_ERR 都出现了. 不过既然又TX_OK, 那么读下 TXSTATUS 寄存器看看到底是什么状态了. 类似如下代码:

        txstatus = RTL_R32 (TxStatus0 + (entry * sizeof ( ...


accessory,

已经设了,就是从这里退出来的:

txstatus = in_dword(rd->iobase+ TSD0+ entry * 4);

if(!(txstatus & ((TxStatOK | TxUnderrun | TxAborted)))
{
     break;
}

我查了spec,但也没搞清楚造成 (TxStatOK | TxUnderrun | TxAborted) 的原因。是网络不通,导致的吗?如果是,那该如何设置?目前,我的网络配置应该是好的(另一个qemu模拟的winxp中验证过),但是由于我的程序是通过别的程序boot起来的,因此不能借助操作系统设置网络,只能通过qemu的启动脚本设置MAC地址和通过数据包里设置源、目的MAC和IP等信息,是否因为这个配置不够完善而导致网络不通?如果是,该如何配置qemu和设置数据包的信息(MAC、IP等)?

[ 本帖最后由 sherf 于 2009-11-19 05:03 编辑 ]

论坛徽章:
0
77 [报告]
发表于 2009-11-19 05:39 |只看该作者
sherf老兄,你是一个接收中断都没有发生过?还是发生过几次,后面的没有了?
网络一般来说应该通的. 你的网卡怎么设置的? 如果是连在TAP上面的,看看HOST 上面的TAP 设备有没有接收到包.
MAC, IP 那些地址假如不对的话, 结果是对方收不到包,而不是你发不出去.

论坛徽章:
0
78 [报告]
发表于 2009-11-19 15:47 |只看该作者
原帖由 accessory 于 2009-11-19 05:39 发表
sherf老兄,你是一个接收中断都没有发生过?还是发生过几次,后面的没有了?
网络一般来说应该通的. 你的网卡怎么设置的? 如果是连在TAP上面的,看看HOST 上面的TAP 设备有没有接收到包.
MAC, IP 那些地址假如不对 ...


accessory,

已能接收中断,接收中断是持续发生的(我试验了大概1分钟左右的时间,是持续发生接收中断的)。但是,有一点挺怪的,所有接收到的包的内容全为0(即从第一个字节(Dest Mac)开始到最后一个字节(第63个字节)都是0!感觉不是很正常,到网上翻了一下,也只是找到一些有关dest Mac为0的包的信息(里面的内容不为0)。accessory,你碰到过这种情况吗?

经你提醒,我重新做了几次模拟,每次都发一个数据包,然后立即ifconfig tap0(程序是连接在tap0上的),结果都能发现tap0收到一个包。这是否说明了网络是好的?其实我自己也认为网络应该没问题,毕竟能引发接收中断和发送中断.....但为何包没发送出去呢(TxStatOK | TxUnderrun | TxAborted)?

另,有关 qemu中的rtl8139虚拟网卡和接口tap0之间的关系还有些疑问。我个人认为就像主机上的物理网卡和上面的eth0,是一体的,网卡通过网路接口(eth0/tap0)发送数据包。同样,qemu中的8139虚拟网卡是通过tap0发送数据包的,那检查tap0上是否收到虚拟网卡发送的数据包有什么意义?(如果将tap0看成是另一张虚拟网卡,那检查tap0上是否收到从qemu8139虚拟网卡发过来的数据包是有意义的,毕竟是从“qemu中的8139虚拟网卡”发送成功才会转到“另一张虚拟网卡”tap0中去)......

[ 本帖最后由 sherf 于 2009-11-19 22:12 编辑 ]

论坛徽章:
0
79 [报告]
发表于 2009-11-20 00:38 |只看该作者
接收包的内容应该不是0. 有可能你接收部分的代码有问题.

关于8139 和 TAP0 之间的关系,可以好好看看QEMU的文档. 我觉得他们2个可以认为是分开的2块虚拟网卡. 可以用TCPDUMP 或者类似工具 看看TAP0上都有什么包.

论坛徽章:
0
80 [报告]
发表于 2009-11-20 01:35 |只看该作者
原帖由 accessory 于 2009-11-20 00:38 发表
接收包的内容应该不是0. 有可能你接收部分的代码有问题.

关于8139 和 TAP0 之间的关系,可以好好看看QEMU的文档. 我觉得他们2个可以认为是分开的2块虚拟网卡. 可以用TCPDUMP 或者类似工具 看看TAP0上都有什么包.



接收包的问题已解决,确如你所说是代码中有bug(在函数切换过程中buffer被清空了)。

另,还是那个发送的问题,TxUnderrun 和 TxAborted 到底是怎样造成的(或者说造成的原因可能有哪些,我自己可以逐个去试)?网络通了,为何发不出去?

[ 本帖最后由 sherf 于 2009-11-20 01:39 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP