|
内核版本:2.4.18
开发板:HHARM2410--4COM-CDMA
gcc:华恒提供,经验证就是2.95.3
驱动版本RT73_Linux_STA_Drv1.0.4.0
无线网卡 -Link的DWL-G122
首先在PC机上编译和加载都成功,无线网卡使用正常,PC机使用RH9,内核版本2.4.20-8.
然后开始移植,编译过程无错误,生成rt73.o拷贝到板子上,用insmod rt73.o加载无问题,显示:
rtusb init ====>
usb.c: registered new driver rt73
但是使用ifconfig rausb0 显示网卡信息时发现
rausb0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:64
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
物理地址显然不正确.并且在使用ifconfig rausb0 up命令之后,会显示
rt73 driver version - 1.0.4.0
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c0aa8000
*pgd = 30add801, *pmd = 30add801, *pte = 00000000, *ppte = 00000000
Internal error: Oops: ffffffff
CPU: 0
pc : [] lr : [] Not tainted
sp : c0aaddfc ip : 000001f0 fp : c0aade20
r10: 00000000 r9 : c73a7130 r8 : 00000000
r7 : 00000001 r6 : c025c6c0 r5 : 000001f0 r4 : c025c6c0
r3 : 000001f0 r2 : 00000000 r1 : 00000000 r0 : c025c6c0
Flags: nzCv IRQs on FIQs on Mode SVC_32 Segment user
Control: C000317F Table: 30AA8000 DAC: 00000015
Process ifconfig (pid: 67, stackpage=c0aad000)
Stack: (0xc0aaddec to 0xc0aae000)
dde0: c0042594 c0042154 20000013 ffffffff c025c6c0
de00: 000001f0 00000018 00000001 00000000 00000000 c0aade38 c0aade24 c0042594
de20: c0042110 00000978 c73a7148 c0aade98 c0aade3c c7338308 c0042498 c73a70b0
de40: c73a7080 c73a7098 c7380000 c0227ea0 c7380000 00000000 00000000 c0aadf0c
de60: bffffc84 c09fc400 c7320398 00000000 c0227ea0 00000000 00001002 00000000
de80: c0aadf0c 00000000 c0155458 c0aadeac c0aade9c c015547c c0155430 c09fc400
dea0: c0aadec4 c0aadeb0 c0152a2c c015546c c09fc400 00001043 c0aadee4 c0aadec8
dec0: c0154188 c0152970 00000000 c09fc400 00000000 c0aadf1c c0aadf54 c0aadee8
dee0: c0189244 c0154138 00000014 00000000 00000000 00000000 00008914 00031043
df00: 00000000 000d9d28 bffffed4 73756172 00003062 00000000 00000000 00031043
df20: 00000000 000d9d28 bffffed4 00008914 bffffc84 c09eab60 bffffc84 ffffffe7
df40: c0aac000 000b82b0 c0aadf70 c0aadf58 c018b82c c0188f30 c3968d20 00008914
df60: 00000003 c0aadf80 c0aadf74 c014b6f4 c018b508 c0aadfa4 c0aadf84 c0059e00
df80: c014b6dc bffffc84 bffffedc 00000004 00000036 c001d9a4 00000000 c0aadfa8
dfa0: c001d820 c0059c14 bffffc84 c00238fc 00000003 00008914 bffffc84 00001043
dfc0: bffffc84 bffffedc 00000004 000b8238 00000000 0003c298 000b82b0 00000003
dfe0: 00000002 bffffbb8 00019bd0 00072824 20000010 00000003 bf7ff5ff f7ff7eff
Backtrace:
Function entered at [] from []
Function entered at [] from []
r5 = C73A7148 r4 = 00000978
Function entered at [] from []
Function entered at [] from []
r4 = C09FC400
Function entered at [] from []
r5 = 00001043 r4 = C09FC400
Function entered at [] from []
r7 = C0AADF1C r6 = 00000000 r5 = C09FC400 r4 = 00000000
Function entered at [] from []
Function entered at [] from []
r6 = 00000003 r5 = 00008914 r4 = C3968D20
Function entered at [] from []
Function entered at [] from []
r8 = C001D9A4 r7 = 00000036 r6 = 00000004 r5 = BFFFFEDC
r4 = BFFFFC84
Code: e3530000 0a000002 e20c3e1f e3530020 (15822000)
Kernel panic: Aiee, killing interrupt handler!
In interrupt handler - not syncing
跟踪驱动程序的源码,在rtmp_init.c文件中凡事用kmalloc的都报这个错误,然后我把kmalloc的第二个参数改成GFP_ATOMIC(原来是GFP_KERNEL),编译能通过而且在使用ifconfig rausb0 up在kmalloc处不报错了,但是报Scheduling in interrupt,而且依然不能识别mac地址,发现错误是函数RTUSBReadMACRegister的返回值不对,而RTUSBReadMACRegister是在rtusb_io.c里实现的,它的返回值事实上是由函数RTUSB_VendorRequest决定的......然后又找到RTUSB_VendorRequest的实现,也是在rtusb_io.c里,其中有一句if (in_interrupt()),显然问题就在这里了,但是不太明白为什么.我知道GFP_ATOMIC和GFP_KERNEL的区别,但是不使用GFP_ATOMIC的话,kmalloc就报错,太郁闷了,不知道有没有人遇到过类似的问题.希望能指点一下,谢谢!! |
|