The oldest kernel I've got is 2.4.20, which might not be the same as your
2.4.17.  However, in my kernel usb_get_port_status() doesn't return a
32-bit value at all.  What it returns is the status of the transfer (which
should be 0) -- the data itself is stored using a pointer to a struct
usb_port_status, which defines the first 16-bit part as wHubStatus and the
second 16-bit part as the wHubChange.  There's no way these values can get
interchanged.

Thank you for noticing my quesion.Yes,2.4.17 usb_get_port_status() doesn't return a 32-bit value.It works same as 2.4.20.


I read datasheet & our kernel source again and found that there is a control
in our ochi controller.It was set to perform endian swap.So I cleared it to
deny endian swap by ohci controller.When some usb device connect to 2-port hub,
2-port hub can read correct hub port status.But when usb_set_address was called,
there is a oops. ksymoops out as following:


[root@(none) root]# /opt/hardhat/devkit/mips/lexra_fp_be/bin/mips_lexra_fp_be-ksymoops -m ./System.map < oops.txt
ksymoops 2.4.3 on i686 2.4.20-8. Options used
-V (default)
-K (default)
-L (default)
-O (default)
-m ./System.map (specified)


Unable to handle kernel paging request at virtual address 00000004, epc == 800f9ab0, ra =cOops in fault.c:do_page_fault, line 204:
$0 : 00000000 1000ff00 00000000 00000000 a0926080 00000000 a0926080 00000003
$8 : a0926080 a0926080 00000800 801e0450 30000000 0f000000 00ff0000 00000001
$16: 00000000 00000000 b8001400 00000000 a0926040 ff000000 00ff0000 00000001
$24: 0000000a 00000000 80016000 80017dc0 8036c000 800fabfc
epc : 800f9ab0 Not tainted
Using defaults from ksymoops -t elf32-little -a unknown
Status: 1000ff04
Cause : 10000008
Process swapper (pid: 0, stackpage=80016000)
Stack: 800f9f30 800f9f08 80017dd0 8035e2d8 00000002 8036c000 b8001400 80017e98
00000002 00000000 00000000 00000000 00000000 800fabfc 803e2b40 80300248
801d9f24 801dcc04 8002d4d4 801b6740 80366960 00000000 801eb130 803e2820
00000001 801d2060 80348400 00000001 00000014 80017e98 801dcc04 00000000
801b6088 00000024 b8001800 00670040 801d1020 801d9f24 801d1280 80348400
00000014 ...
Call Trace: [<800f9f30>] [<800f9f08>] [<80017dd0>] [<80017e98>] [<800fabfc>] [<8002d4d4>]
[<801b6740>] [<80017e98>] [<801b6088>] [<80017e98>] [<801b61a8>] [<801858cc>]
[<8009cc4c>] [<8001de64>] [<80017f58>] [<80017fe0>] [<801858cc>] [<80016000>]
[<80017f50>] [<800187f0>] [<800187b8>] [<801858cc>] [<8001802c>] [<80184494>]
[<8018589c>] [<80010840>]
Code: 02038025 00b52824 00052e02 <8e320004> 0c03e308 02058025 00108702 24020004 160
Error (Oops_code_values): invalid value 0x160 in Code line, must be 2, 4, 8 or 16 digits, value ignored
Error (Oops_bfd_perror): scan_arch for specified architecture Success


???; 800f9ab0 <dl_done_list+7c/2a4> <=====
Trace; 800f9f30 <rh_int_timer_do+94/a4>
Trace; 800f9f08 <rh_int_timer_do+6c/a4>
Trace; 80017dd0 <dummy+1dd0/2000>
Trace; 80017e98 <dummy+1e98/2000>
Trace; 800fabfc <hc_interrupt+108/1dc>
Trace; 8002d4d4 <tasklet_hi_action+120/1a8>
Trace; 801b6740 <do_timer+ac/140>
Trace; 80017e98 <dummy+1e98/2000>
Trace; 801b6088 <__start_cpu_imem+88/100>
Trace; 80017e98 <dummy+1e98/2000>
Trace; 801b61a8 <do_IRQ+a8/12c>
Trace; 801858cc <mips_io_port_base+24c/37ec>
Trace; 8009cc4c <return_+0/8>
Trace; 8001de64 <stack_done+20/3c>
Trace; 80017f58 <dummy+1f58/2000>
Trace; 80017fe0 <dummy+1fe0/2000>
Trace; 801858cc <mips_io_port_base+24c/37ec>
Trace; 80016000 <init_task_union+0/0>
Trace; 80017f50 <dummy+1f50/2000>
Trace; 800187f0 <cpu_idle+60/68>
Trace; 800187b8 <cpu_idle+28/68>
Trace; 801858cc <mips_io_port_base+24c/37ec>
Trace; 8001802c <rest_init+2c/3c>
Trace; 80184494 <adler32+610/17fc>
Trace; 8018589c <mips_io_port_base+21c/37ec>
Trace; 80010840 <stext+40/800>

Kernel panic: Aiee, killing interrupt handler!

2 errors issued. Results may not be reliable.


I digged more and found that there is a urb point to 0 in function dl_done_list().


...
while (td_list) {
td_list_next = td_list->next_dl_td;

urb = td_list->urb; ----> urb is 0;
urb_priv = urb->hcpriv;
...
If I enable endian swap by ohci controller,urb is correct value.
I think that some urb is freed but didn't unlink from td_list.
But why endian cause such problem?



You can try using a later kernel.

Sorry,I can't update kernel now because there are many modification & porting
for our board based on this version.


Best regards
yfw

_________________________________________________________________
享用世界上最大的电子邮件系统― MSN Hotmail。 http://www.hotmail.com




-------------------------------------------------------
This SF.Net email is sponsored by: SourceForge.net Broadband
Sign-up now for SourceForge Broadband and get the fastest
6.0/768 connection for only $19.95/mo for the first 3 months!
http://ads.osdn.com/?ad_id=2562&alloc_id=6184&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to