Read transaction not work for EHCI host controller

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

I used the USB-serial driver option.c to communicate with the GSM modem 
device through usb, the used host controller is EHCI. The problem is that 
nothing appear on the screen when type characters after using "microcom -s 
115200 /dev/ttyUSB3" command to access the ttyUSB3 device node. In normal 
case, typing characters is eqaul to request the EHCI to do a write 
transaction to transmit the typed characters to the device, after that a 
read trasaction should be followed to read the typed characters received by 
the device. But in this case, the read trasaction is not executed after the 
write transaction is done. The evidence is that the "Active status" bit 
and "Total Bytes to Transfer" bits of hw_token member in ehci_qtd structure 
are not modified by the EHCI for a completion of the read transaction. 
Parts of successfull and failed case logs for ehci-hcd.c are listed 
below with different flags passed to open_or_warn() at microcom.c:

-----------------------------------------------
Failed case: type a character 'a', the write transaction completed but the 
read transaction malfunctioned 
flags of open_or_warn() at microcom.c: O_RDWR | O_NOCTTY | O_NONBLOCK

[  693.508000] usb_hcd_submit_urb: enqueue!!!!
[  693.512000] ehci_urb_enqueue: PIPE_BULK, urb->complete: 86e0d3cc
[  693.516000] In qh_urb_transaction, USB_DIR_OUT at line 720, PID: 0, 
hw_token = 18c80, qtd_dma = 6e08180
[  693.524000] ath-ehci ath-ehci.0: submit_async 1 urb 86e510c0 ep4out len 
1, qtd a6e08180 [qh (null)]
[  693.524000] In qh_make: assign qh to qh_make_out_debug = a6e09300
[  693.524000] In qh_make: qh address a6e09300
[  693.524000] In qh_append_tds: qtd_list is not empty!
[  693.524000] In qh_append_tds: qh->qtd_list is not empty
[  693.524000] In qh_append_tds: Urb bulk out
[  693.524000] submit_async: at line 1086
[  693.524000] In qh_link_async: ehci->regs->command = 10025
[  693.676000] In ehci_irq: interrupt occurs
[  693.676000] ath-ehci ath-ehci.0: irq status ca089 Async Recl FLR INT
[  693.676000] At line 1372, In scan_async: qh->qtd_list is not empty
[  693.676000] At line 382(write), In qh_completions: qtd->hw_token = 
80008c01, qtd->hw_alt_next = 1
[  693.676000] In qh_completions: qh->hw_alt_next = 7, qh->hw_token = 
80008c01, qh->hw_info1 = 42002402, qh->hw_info2 = 40000000
[  693.676000] In qh_completions: at line 410
[  693.676000] In ehci_urb_done
[  693.676000] ath-ehci ath-ehci.0: ehci_urb_done 1 urb 86e510c0 ep4out 
status 0 len 1/1
[  693.676000] In usb_hcd_giveback_urb: urb->transfer_buffer = a [before 
unmap_urb_for_dma()]
[  693.676000] call complete function: 86e0d3cc
[  693.676000] In option_outdat_callback
[  693.676000] At line 1383, In scan_async: After qh_completions(), temp = 
1, qh_make_debug = a6e09280
[  693.676000] At line 1409, In scan_async: process the next qh, qh address: 
a6e09280
[  693.676000] At line 1372, In scan_async: qh->qtd_list is not empty
[  693.676000] At line 372(read), In qh_completions: qtd->hw_token = 
10008d80, qtd->hw_alt_next = 1
[  693.676000] In qh_completions: qh->hw_alt_next = 1, qh->hw_token = 
10008d80, qh->hw_info1 = 42002502, qh->hw_info2 = 40000000
[  693.676000] In qh_completions: at line 440
[  693.676000] At line 1383, In scan_async: After qh_completions(), temp = 
0, qh_make_debug = a6e09280
[  693.676000] At line 1409, In scan_async: process the next qh, qh address: 
0
[  694.020000] At line 1409, In scan_async: process the next qh, qh address: 
a6e09280
[  694.020000] At line 1372, In scan_async: qh->qtd_list is not empty
[  694.020000] In qh_completions: at line 440
[  694.020000] At line 1383, In scan_async: After qh_completions(), temp = 
0, qh_make_debug = a6e09280
[  694.020000] At line 1409, In scan_async: process the next qh, qh address: 
0
[  694.056000] In ehci_irq: interrupt occurs
[  694.056000] ath-ehci ath-ehci.0: irq status c80a8 Async IAA FLR
[  694.056000] At line 330, In qh_completions: qh->qth_list is empty
[  694.120000] At line 1372, In scan_async: qh->qtd_list is not empty
[  694.120000] In qh_completions: at line 440
-----------------------------------------------

successfull case: type a character 'a', the write transaction completed 
followed by a completion of read transaction
flags of open_or_warn() at microcom.c: O_RDWR | O_NOCTTY

[  466.868000] usb_hcd_submit_urb: enqueue!!!!
[  466.872000] ehci_urb_enqueue: PIPE_BULK, urb->complete: 86e193cc
[  466.876000] In qh_urb_transaction, USB_DIR_OUT at line 720, PID: 0, 
hw_token = 18c80, qtd_dma = 6e0e4e0
[  466.884000] ath-ehci ath-ehci.0: submit_async 1 urb 86e080c0 ep4out len 
1, qtd a6e0e4e0 [qh (null)]
[  466.884000] In qh_make: assign qh to qh_make_out_debug = a6e0f300
[  466.884000] In qh_make: qh address a6e0f300
[  466.884000] In qh_append_tds: qtd_list is not empty!
[  466.884000] In qh_append_tds: qh->qtd_list is not empty
[  466.884000] In qh_append_tds: Urb bulk out
[  466.884000] submit_async: at line 1086
[  466.884000] In qh_link_async: ehci->regs->command = 10025
[  467.036000] In ehci_irq: interrupt occurs
[  467.036000] ath-ehci ath-ehci.0: irq status c8089 Async FLR INT
[  467.036000] At line 1372, In scan_async: qh->qtd_list is not empty
[  467.036000] At line 382(write), In qh_completions: qtd->hw_token = 
80008c01, qtd->hw_alt_next = 1
[  467.036000] In qh_completions: qh->hw_alt_next = 7, qh->hw_token = 
80008c01, qh->hw_info1 = 42002402, qh->hw_info2 = 40000000
[  467.036000] In qh_completions: at line 410
[  467.036000] In ehci_urb_done
[  467.036000] ath-ehci ath-ehci.0: ehci_urb_done 1 urb 86e080c0 ep4out 
status 0 len 1/1
[  467.036000] In usb_hcd_giveback_urb: urb->transfer_buffer = a [before 
unmap_urb_for_dma()]
[  467.036000] call complete function: 86e193cc
[  467.036000] In option_outdat_callback
[  467.036000] At line 1383, In scan_async: After qh_completions(), temp = 
1, qh_make_debug = a6e0f280
[  467.036000] At line 1409, In scan_async: process the next qh, qh address: 
a6e0f280
[  467.036000] At line 1372, In scan_async: qh->qtd_list is not empty
[  467.036000] At line 372(read), In qh_completions: qtd->hw_token = 
8fff8d00, qtd->hw_alt_next = 1
[  467.036000] In qh_completions: qh->hw_alt_next = 1, qh->hw_token = 
90008d80, qh->hw_info1 = 42002502, qh->hw_info2 = 40000000
[  467.036000] In qh_completions: at line 406
[  467.036000] In ehci_urb_done
[  467.036000] ath-ehci ath-ehci.0: ehci_urb_done 1 urb 86e082c0 ep5in 
status 0 len 1/4096
[  467.036000] In usb_hcd_giveback_urb: urb->transfer_buffer = a [before 
unmap_urb_for_dma()]
[  467.036000] call complete function: 86e194d0
[  467.036000] In option_indat_callback
-----------------------------------------------

Obviously, the read transaction works when open a device node in blocking 
mode with "microcom", but fails when open a device node 
in non-blocking mode with "microcom". I don't know how the user space 
program "microcom" affect the ehci-hcd driver running at kernel space. 
Finally, aditional information is provided here:
-----------------------------------------------
1. Kernel version: 2.6.31
2. 
# ls /sys/bus/usb/devices/
/sys/bus/usb/devices/1-0:1.0/  /sys/bus/usb/devices/1-1:1.3/
/sys/bus/usb/devices/1-1/      /sys/bus/usb/devices/1-1:1.4/
/sys/bus/usb/devices/1-1:1.0/  /sys/bus/usb/devices/1-1:1.5/
/sys/bus/usb/devices/1-1:1.1/  /sys/bus/usb/devices/usb1/
/sys/bus/usb/devices/1-1:1.2/
-----------------------------------------------

Any suggestion about how to fix the bug would be appreciated

sincerely
loki

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux