linux下的网卡驱动问题
请教大家个困扰了很久的问题:
我所用的ARM处理器为LPC3250,linux版本为2.6.27.8,网卡芯片为ksz8842(两端口交换机)。
在调试驱动时出现错误:
通过ifconfig是可以看到网口已经存在并且ip和MAC地址都已经分配好,可是在发包时报错,比如使用ping命令时,出错,从打印信息来看,应该是发包超时,可是我反复阅读过datasheet,我的代码也按照上面的流程操作,可是不知道问题出在哪里,报错日志如下:
NETDEV WATCHDOG: eth1 (): transmit timed out
net_tx_timeout
ksz8842_reset_hw
BUG: scheduling while atomic: swapper/0/0x00000105
Modules linked in: ksz8842 rtc watchdog adc_pwr tmp125 led cpld
Pid: 0, comm: swapper
CPU: 0 Not tainted (2.6.27.8 #1)
PC is at default_idle+0x50/0x58
LR is at default_idle+0x44/0x58
pc : [<c00af464>] lr : [<c00af458>] psr: 60000013
sp : c0331f80 ip : 600000d3 fp : c0331f8c
r10: 8001b9f4 r9 : 41069264 r8 : 8001ba28
r7 : c0345ee8 r6 : c00af414 r5 : c0330000 r4 : c00af414
r3 : 60000013 r2 : 0005217f r1 : 0005317f r0 : 00000000
Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: 0005317f Table: 81c40000 DAC: 00000017
[<c00af354>] (show_regs+0x0/0x50) from [<c00c52e8>] (__schedule_bug+0x4c/0x60)
r4:c0331f38
[<c00c529c>] (__schedule_bug+0x0/0x60) from [<c02a9160>] (schedule+0x78/0x34c)
r4:ffff0cad
[<c02a90e8>] (schedule+0x0/0x34c) from [<c02a9b04>] (schedule_timeout+0x98/0xc4)
[<c02a9a6c>] (schedule_timeout+0x0/0xc4) from [<c02a9b54>] (schedule_timeout_uninterruptible+0x24/0x28)
r7:00000014 r6:00000000 r5:c1c80000 r4:fe300300
[<c02a9b30>] (schedule_timeout_uninterruptible+0x0/0x28) from [<c00d49c0>] (msleep+0x1c/0x2c)
[<c00d49a4>] (msleep+0x0/0x2c) from [<bf00c2b8>] (ksz8842_reset_hw+0x38/0x170 [ksz8842])
[<bf00c280>] (ksz8842_reset_hw+0x0/0x170 [ksz8842]) from [<bf00c544>] (net_tx_timeout+0xa4/0xd0 [ksz8842])
r8:ffffffff r7:00000014 r6:00000001 r5:c1c80000 r4:c1c80000
[<bf00c4a0>] (net_tx_timeout+0x0/0xd0 [ksz8842]) from [<c0237fbc>] (dev_watchdog+0x18c/0x280)
r4:c0351ea0
[<c0237e30>] (dev_watchdog+0x0/0x280) from [<c00d463c>] (run_timer_sof
。。。。。。。。。。。。。。
然后就一直打印一大堆错误...
百思不得其解,望大虾们指点,在此谢过!!
[解决办法]
你确定系统检测到ksz8842了吗?
[解决办法]
PC能ping到板子吗?不知道你这个mac地址有没有问题,你可以把E6改成00试试
[解决办法]
是不是ksz8842没有配置正确
[解决办法]
代码能贴上来吗?这样好分析。
[解决办法]
链路up起来了吗,你ping的目的地址是什么? 有完整的路由表吗?几个网络接口?
有抓包工具吗 看一下情况。
[解决办法]
(两端口交换机) 有2个端口吧,能mac学习吗?arp报文有吗?
[解决办法]
有完整的ifconfig信息吗 ping的目的地址是什么?
[解决办法]
两个查找方向,一个是看为啥调用了net_tx_timeout,二是查看ksz8842_reset_hw里执行哪步出现错误。
另外,把你的msleep改掉,改成用mdelay或者udelay试试
[解决办法]
感觉是网络情况,找不到目的地址,简单超时。先排除这样的错误,再查找深层次原因。。。。
[解决办法]
你看下net/sched/sch_generic.c的dev_watchdog函数, 分辨出超时的具体原因。
[解决办法]
哥们,你发了那么多,实际上网卡驱动,你只用关心发送和接受的数据就可以了,你可以使用printk来一个一个打印,因为ping的时候是使用arp请求和icmp协议两种,内容不多,完全可以打印出来,分析一下,数据是否正常,同时,使用一个抓包工具抓一下包,看是怎么回事,
做网卡驱动最重要的是用一个抓包工具,希望能够帮助你。
------解决方案--------------------
[解决办法]
pc上超时能提供详细信息,估计你的开发办上只是简单提示,也说明你的板子还是问题不大的。
比如找不到目标等,都可能超时。
既然有了arp,就可以跟踪arp信息,是否解析出对方mac,是否调了icmp。。。 之前要进行路由 interface查找,是否能够找到设备。。。
[解决办法]
[解决办法]
网络传输基本都是异步行为,只能通过事件来触发驱动,如果相应的事件长时间没有来,就要靠启动定时器来维护,以便下一步进行处理。。。。
[解决办法]
ping时有arp报文出去吗,能收到吗?这个通过抓包工具能看到。如果有,下面就是ping包了,究竟是发的问题还是收的问题。。。 然后再针对收发查找。。。
[解决办法]
能看到路由表吗? 感觉你的协议栈和你的接口结合这有问题。 arp报文能收到,也能回复,但不能处理icmp,这个是一条线。
直接arp发不出去,是所有接口都没有?这个是主动发,能否跟一下是否调了硬件驱动函数?硬件层次上,发送了而没有完毕中断,是否触发了你的定时器?还是发出去了,而对方没有回应而触发了软件上的超时?
[解决办法]
[解决办法]
你可以在你的源码目录搜索下dev->tx_timeout
[解决办法]
有arp报文,是pc发过来的 还是板子也有回复?在这个基础上才能有icmp报文,pc才能向板子发icmp报文。
如果仅仅pc发了arp,而板子也没回arp,说明板子问题还要多些,不过也可以这么跟一下问题,从接收角度来看。
就如板子主动发送一样,你可以看驱动的硬件收发函数是否调用了,调用之后是否有相应事件和中断产生。
这点你应该更清楚更好查。 如果这个都动作了,数据也对,看硬件。如果这个还没调到,看协议栈层为何没有调到底层。。。
[解决办法]
能看一下发送数据是什么?第一次应该是arp报文吧? 数据包格式是否对?触动硬件发送时是否正常?发送完成中断应该能有个状态寄存器来说明发送是否有错误。软件能跟的就到此了。
至于其他问题,phy状态是否对,链路是否协商上了,端口配置是否有过滤等。。。