FTDI_SIO read URB chaining question

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

 



I'm trying to understand an issue I'm having with the ftdi_sio driver.
 Basically, I have a device which contains an FT2232D chip that I'm
trying to communicate with from an embedded controller.  When I open a
tty port on the device (using "screen /dev/ttyUSB1 115200") I'm able
to send characters to the device but I cannot read anything from it.
When I turn on debug logging in the ftdi driver I get the following:

[   44.630000] drivers/usb/serial/ftdi_sio.c: ftdi_read_bulk_callback - port 1
[   44.630000] drivers/usb/serial/ftdi_sio.c: ftdi_process_read - port 1
[   44.630000] drivers/usb/serial/ftdi_sio.c: Status only: 361o 140o
[   44.650000] drivers/usb/serial/ftdi_sio.c: ftdi_read_bulk_callback - port 1
[   44.650000] drivers/usb/serial/ftdi_sio.c: ftdi_process_read - port 1
[   44.650000] drivers/usb/serial/ftdi_sio.c: Status only: 361o 140o
[   44.670000] drivers/usb/serial/ftdi_sio.c: ftdi_read_bulk_callback - port 1
[   44.670000] drivers/usb/serial/ftdi_sio.c: ftdi_process_read - port 1
[   44.670000] drivers/usb/serial/ftdi_sio.c: Status only: 361o 140o
[   44.690000] drivers/usb/serial/ftdi_sio.c: ftdi_read_bulk_callback - port 1
[   44.690000] drivers/usb/serial/ftdi_sio.c: (this is ok on close)
nonzero read bulk status received: -75
[   45.250000] drivers/usb/serial/ftdi_sio.c: ftdi_ioctl cmd 0x5401
[   45.250000] drivers/usb/serial/ftdi_sio.c: ftdi_ioctl arg not
supported - it was 0x5401 - check /usr/include/asm/ioctls.h
[   45.270000] drivers/usb/serial/ftdi_sio.c: ftdi_ioctl cmd 0x5401
[   45.270000] drivers/usb/serial/ftdi_sio.c: ftdi_ioctl arg not
supported - it was 0x5401 - check /usr/include/asm/ioctls.h
[   45.290000] drivers/usb/serial/ftdi_sio.c: ftdi_ioctl cmd 0x5402
[   45.290000] drivers/usb/serial/ftdi_sio.c: ftdi_ioctl arg not
supported - it was 0x5402 - check /usr/include/asm/ioctls.h
[   45.310000] drivers/usb/serial/ftdi_sio.c: ftdi_set_termios
[   45.310000] drivers/usb/serial/ftdi_sio.c: Setting CS8
[   45.320000] drivers/usb/serial/ftdi_sio.c: get_ftdi_divisor -
tty_get_baud_rate reports speed 115200
[   45.330000] drivers/usb/serial/ftdi_sio.c: get_ftdi_divisor - Baud
rate set to 115200 (divisor 0x1A) on chip FT2232C
[   45.340000] drivers/usb/serial/ftdi_sio.c: ftdi_set_termios Turning
off hardware flow control
[   45.350000] drivers/usb/serial/ftdi_sio.c: ftdi_tiocmset TIOCMSET
[   45.360000] drivers/usb/serial/ftdi_sio.c: update_mctrl - DTR HIGH, RTS HIGH
[   45.370000] drivers/usb/serial/ftdi_sio.c: ftdi_write port 1, 2 bytes
[   45.380000] drivers/usb/serial/ftdi_sio.c: data_offset set to 0
[   45.390000] ftdi_sio ttyUSB1: ftdi_write - length = 2, data = 0d 0a
[   45.400000] drivers/usb/serial/ftdi_sio.c: ftdi_write write returning: 2
[   45.400000] drivers/usb/serial/ftdi_sio.c: ftdi_write_bulk_callback - port 1
[   45.520000] drivers/usb/serial/ftdi_sio.c: ftdi_ioctl cmd 0x541b
[   45.520000] drivers/usb/serial/ftdi_sio.c: ftdi_ioctl arg not
supported - it was 0x541b - check /usr/include/asm/ioctls.h
[   45.540000] drivers/usb/serial/ftdi_sio.c: ftdi_write port 1, 5 bytes
[   45.540000] drivers/usb/serial/ftdi_sio.c: data_offset set to 0
[   45.550000] ftdi_sio ttyUSB1: ftdi_write - length = 5, data = 6e 70 73 0d 0a
[   45.560000] drivers/usb/serial/ftdi_sio.c: ftdi_write write returning: 5
[   45.560000] drivers/usb/serial/ftdi_sio.c: ftdi_write_bulk_callback - port 1
[   45.580000] drivers/usb/serial/ftdi_sio.c: ftdi_chars_in_buffer - port 1
[   45.580000] drivers/usb/serial/ftdi_sio.c: ftdi_write_room - port 1
[   45.590000] drivers/usb/serial/ftdi_sio.c: ftdi_chars_in_buffer - port 1
[   45.600000] drivers/usb/serial/ftdi_sio.c: ftdi_write_room - port 1

When the driver starts there is an endless stream of read requests
until the URB failure at 44.690000 at which point all reading stops.
Looking at the ftdi code in ftdi_read_bulk_callback, it appears that
read requests are endlessly chained together until/unless a non-zero
URB status is received at which point the read chain comes to a
screeching halt.  I believe my fundamental problem is the HCD that
generates the -75 (overflow) error (which is probably related to
development of the HCD driver for the OXU210 on our controller), but
my question is this...

It seems that reading will always come to a halt if an URB error
occurs.  While this is probably a rare event, is this a good idea?
Why not restart the read URB chain after discarding the errant URB?

When I actually tried to restart the read chain in the event of URB
failure, I noticed was that while the reads continued, the baud rate
change ioctl never happened.  Not exactly sure why that is, but it
seems restarting the read chain involves more that simply
re-submitting the read URB to usb_submit_urb.

Has anyone had a problem similar to this or understands this driver
well enough to explain the proper way to restart reading?

Thanks,
Mike
--
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