[U-Boot] [PULL] u-boot-usb/master

Pantelis Antoniou
2012-12-17T14:38:03Z

Hi Lukasz,

Sorry for the slight delay, setting up the usb capture took a bit longer.

So we have two captures; one named bad (which is the tip of our internal tree
with the commit reverted.

cee8b859fdb9edc68c67624b2fa1c97a65d121e7
"dfu: Send correct DFU response from composite_setup"

With the commit reverted we get this:

> panto at sles11esa:~/ti/stuff/dfu-util$ sudo ./src/dfu-util -v -D ~/test.img -a rootfs
> dfu-util 0.7
>
> Copyright 2005-2008 Weston Schmidt, Harald Welte and OpenMoko Inc.
> Copyright 2010-2012 Tormod Volden and Stefan Schmidt
> This program is Free Software and has ABSOLUTELY NO WARRANTY
> Please report bugs to dfu-util at lists.gnumonks.org
>
> Opening DFU capable USB device... ID 0403:bd00
> Did not find cached descriptor
> WARNING: Can not find cached DFU functional descriptor
> Warning: Assuming DFU version 1.0
> Run-time device DFU version 0100
> Claiming USB DFU Runtime Interface...
> Determining device status: state = appIDLE, status = 0
> Device really in Runtime Mode, send DFU detach request...
> Resetting USB...
> Opening DFU USB Device...
> Found DFU: [0403:bd00] devnum=0, cfg=2, intf=0, alt=6, name="rootfs"
> Claiming USB DFU Interface...
> Setting Alternate Setting #6 ...
> Determining device status: state = dfuIDLE, status = 0
> dfuIDLE, continuing
> Did not find cached descriptor
> Error obtaining cached DFU functional descriptor
> **** DUMP of func_dfu ****
> bLength = 0
> bDescriptorType = 0
> bmAttributes = 0x00
> wDetachTimeOut = 0
> wTransferSize = 0
> bcdDFUVersion = 0x0000
> Error obtaining DFU functional descriptor
> Please report this as a bug!
> Warning: Assuming DFU version 1.0
> Warning: Transfer size can not be detected
> DFU mode device DFU version 0100
> Error: Transfer size must be specified
>

Looking at the capture file (usb-capture-bad-filter.pcap) we see the culprit at
packet 171 at bad capture and packet 169 at the good.

> USB URB
> URB id: 0xffff88032d9cbdc0
> URB type: URB_SUBMIT ('S')
> URB transfer type: URB_CONTROL (0x02)
> Endpoint: 0x80, Direction: IN
> 1... .... = Direction: IN (1)
> .000 0000 = Endpoint value: 0
> Device: 34
> URB bus id: 3
> Device setup request: relevant (0)
> Data: not present ('<')
> URB sec: 1355753000
> URB usec: 572483
> URB status: Operation now in progress (-EINPROGRESS) (-115)
> URB length [bytes]: 9
> Data length [bytes]: 0
> [Response in: 172]
> URB setup
> bmRequestType: 0x80
> 1... .... = Direction: Device-to-host
> .00. .... = Type: Standard (0x00)
> ...0 0000 = Recipient: Device (0x00)
> bRequest: GET DESCRIPTOR (6)
> Descriptor Index: 0x00
> bDescriptorType: HID (33)
> Language Id: no language specified (0x0000)
> wLength: 9
>
> 0000 c0 eb 99 28 03 88 ff ff 53 02 80 20 03 00 00 3c ...(....S.. ...<
> 0010 d6 0e cf 50 00 00 00 00 a3 bf 0a 00 8d ff ff ff ...P............
> 0020 09 00 00 00 00 00 00 00 80 06 00 21 00 00 09 00 ...........!....
> 0030 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 ................
>

The response generated when the fix is applied is correct:

> USB URB
> URB id: 0xffff88032899ebc0
> URB type: URB_COMPLETE ('C')
> URB transfer type: URB_CONTROL (0x02)
> Endpoint: 0x80, Direction: IN
> 1... .... = Direction: IN (1)
> .000 0000 = Endpoint value: 0
> Device: 32
> URB bus id: 3
> Device setup request: not relevant ('-')
> Data: present (0)
> URB sec: 1355747030
> URB usec: 704533
> URB status: Success (0)
> URB length [bytes]: 9
> Data length [bytes]: 9
> [Request in: 169]
> [Time from request: 0.000114000 seconds]
> [bInterfaceClass: Unknown (0xffff)]
> GET DESCRIPTOR data (unknown descriptor type 33)
>
> 0000 c0 eb 99 28 03 88 ff ff 43 02 80 20 03 00 2d 00 ...(....C.. ..-.
> 0010 d6 0e cf 50 00 00 00 00 15 c0 0a 00 00 00 00 00 ...P............
> 0020 09 00 00 00 09 00 00 00 00 00 00 00 00 00 00 00 ................
> 0030 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 ................
> 0040 09 21 0f 00 00 00 10 10 01 .!.......

Note that wireshark can't decode it - no DFU dissector.

And the dfu-util side:

> $ sudo ./src/dfu-util -v -D ~/test.img -a rootfs
> dfu-util 0.7
>
> Copyright 2005-2008 Weston Schmidt, Harald Welte and OpenMoko Inc.
> Copyright 2010-2012 Tormod Volden and Stefan Schmidt
> This program is Free Software and has ABSOLUTELY NO WARRANTY
> Please report bugs to dfu-util at lists.gnumonks.org
>
> Opening DFU capable USB device... ID 0403:bd00
> Did not find cached descriptor
> WARNING: Can not find cached DFU functional descriptor
> Warning: Assuming DFU version 1.0
> Run-time device DFU version 0100
> Claiming USB DFU Runtime Interface...
> Determining device status: state = appIDLE, status = 0
> Device really in Runtime Mode, send DFU detach request...
> Resetting USB...
> Opening DFU USB Device...
> Found DFU: [0403:bd00] devnum=0, cfg=2, intf=0, alt=6, name="rootfs"
> Claiming USB DFU Interface...
> Setting Alternate Setting #6 ...
> Determining device status: state = dfuIDLE, status = 0
> dfuIDLE, continuing
> Did not find cached descriptor
> Error obtaining cached DFU functional descriptor
> **** DUMP of func_dfu ****
> bLength = 9
> bDescriptorType = 33
> bmAttributes = 0x0f
> wDetachTimeOut = 0
> wTransferSize = 4096
> bcdDFUVersion = 0x0110
> DFU mode device DFU version 0110
> Device returned transfer size 4096
> No valid DFU suffix signature
> Warning: File has no DFU suffix
> bytes_per_hash=335554
> Copying data from PC to DFU device
> Starting download: [##################################################] finished!
> Sent a total of 16777728 bytes
> state(2) = dfuIDLE, status(0) = No error condition is present
> Done!
>
>

The response is malformed without the fix in the bad capture:

> USB URB
> URB id: 0xffff88032d9cbdc0
> URB type: URB_COMPLETE ('C')
> URB transfer type: URB_CONTROL (0x02)
> Endpoint: 0x80, Direction: IN
> 1... .... = Direction: IN (1)
> .000 0000 = Endpoint value: 0
> Device: 34
> URB bus id: 3
> Device setup request: not relevant ('-')
> Data: present (0)
> URB sec: 1355753000
> URB usec: 572591
> URB status: Broken pipe (-EPIPE) (-32)
> URB length [bytes]: 0
> Data length [bytes]: 0
> [Request in: 171]
> [Time from request: 0.000108000 seconds]
> [bInterfaceClass: Unknown (0xffff)]
> [Malformed Packet: USB]
> [Expert Info (Error/Malformed): Malformed Packet (Exception occurred)]
> [Message: Malformed Packet (Exception occurred)]
> [Severity level: Error]
> [Group: Malformed]
>
> 0000 c0 bd 9c 2d 03 88 ff ff 43 02 80 22 03 00 2d 00 ...-....C.."..-.
> 0010 28 26 cf 50 00 00 00 00 af bc 08 00 e0 ff ff ff (&.P............
> 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
> 0030 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 ................

And the dfu-util side at the host complains and fails:

> $ sudo ./src/dfu-util -v -D ~/test.img -a rootfs
> dfu-util 0.7
>
> Copyright 2005-2008 Weston Schmidt, Harald Welte and OpenMoko Inc.
> Copyright 2010-2012 Tormod Volden and Stefan Schmidt
> This program is Free Software and has ABSOLUTELY NO WARRANTY
> Please report bugs to dfu-util at lists.gnumonks.org
>
> Opening DFU capable USB device... ID 0403:bd00
> Did not find cached descriptor
> WARNING: Can not find cached DFU functional descriptor
> Warning: Assuming DFU version 1.0
> Run-time device DFU version 0100
> Claiming USB DFU Runtime Interface...
> Determining device status: state = appIDLE, status = 0
> Device really in Runtime Mode, send DFU detach request...
> Resetting USB...
> Opening DFU USB Device...
> Found DFU: [0403:bd00] devnum=0, cfg=2, intf=0, alt=6, name="rootfs"
> Claiming USB DFU Interface...
> Setting Alternate Setting #6 ...
> Determining device status: state = dfuIDLE, status = 0
> dfuIDLE, continuing
> Did not find cached descriptor
> Error obtaining cached DFU functional descriptor
> **** DUMP of func_dfu ****
> bLength = 0
> bDescriptorType = 0
> bmAttributes = 0x00
> wDetachTimeOut = 0
> wTransferSize = 0
> bcdDFUVersion = 0x0000
> Error obtaining DFU functional descriptor
> Please report this as a bug!
> Warning: Assuming DFU version 1.0
> Warning: Transfer size can not be detected
> DFU mode device DFU version 0100
> Error: Transfer size must be specified

The full set of captures (pcap format) is at

dfu - https://docs.google.com/folder/d/0B7yJhZ55fi8FOFR3TnVGdTBfbHM/edit

As to why it works for you Lukasz, I'm puzzled; maybe some difference
in the usb gadget peripheral? I would bet that it might refuse to send
a malformed response, dfu-util will eventually time out and then
the transfer can continue with some fail-safe defaults.

In either way, that's bad, and is a bug that the patchset fixes correctly.

Regards

-- Pantelis

On Dec 17, 2012, at 1:00 PM, Lukasz Majewski wrote:

> Hi Marek,
>
>> Pantelis Antoniou (9):
>> g_dnl: Issue connect/disconnect as appropriate
>> g_dnl: Properly terminate string list.
>> dfu: Only perform DFU board_usb_init() for TRATS
>> dfu: Fix crash when wrong number of arguments given
>> dfu: Send correct DFU response from composite_setup
>> dfu: Properly zero out timeout value
>> dfu: Add a partition type target
>> dfu: Support larger than memory transfers.
>> usb: Fix bug when both DFU & ETHER are defined
>
> Can we wait with pulling DFU related patches?
>
> I didn't received tcpdump from Pantelis, so I don't know what is going
> on (or how to tackle the DFU problem).
>
>
> --
> Best regards,
>
> Lukasz Majewski
>
> Samsung Poland R&D Center | Linux Platform Group