当前位置: 代码迷 >> 驱动开发 >> linux下的网卡驱动有关问题
  详细解决方案

linux下的网卡驱动有关问题

热度:71   发布时间:2016-04-28 10:59:03.0
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协议两种,内容不多,完全可以打印出来,分析一下,数据是否正常,同时,使用一个抓包工具抓一下包,看是怎么回事,

做网卡驱动最重要的是用一个抓包工具,希望能够帮助你。
------解决方案--------------------