diff mbox

[U-Boot] drivers: usb: dfu: set serial number from board code was: [ANN] U-Boot v2017.05-rc2 released

Message ID 20170626121706.611f417a@jawa
State Accepted
Delegated to: Lukasz Majewski
Headers show

Commit Message

Lukasz Majewski June 26, 2017, 10:17 a.m. UTC
Hi Heiko,

> Hello all,
> 
> Am 19.04.2017 um 14:07 schrieb Lukasz Majewski:
> > Dear All,
> >
> >> On 04/19/2017 12:39 PM, Heiko Schocher wrote:
> >>> Hello Marek,
> >>>
> >>> Am 19.04.2017 um 11:51 schrieb Marek Vasut:
> >>>> On 04/19/2017 11:46 AM, Heiko Schocher wrote:
> >>>>> Hello Marek,
> >>>>>
> >>>>> Am 19.04.2017 um 10:43 schrieb Marek Vasut:
> >>>>>> On 04/19/2017 07:29 AM, Heiko Schocher wrote:
> >>>>>>> Hello Tom,
> >>>>>>>
> >>>>>>> added Lukasz, Marek and Felipe,
> >>>>>>>
> >>>>>>> Am 18.04.2017 um 00:22 schrieb Tom Rini:
> >>>>>>>> Hey all,
> >>>>>>>>
> >>>>>>>> It's release day and v2017.05-rc2 is out.  I think my
> >>>>>>>> patchwork queue is
> >>>>>>>> looking good currently.  I have some outstanding removal
> >>>>>>>> patches to take
> >>>>>>>> from Masahiro related to architectures that I removed as
> >>>>>>>> promised.  The
> >>>>>>>> release is bigger than I really wanted, but since I was on
> >>>>>>>> vacation for
> >>>>>>>> most of the normal -rc1 window, stuff came in that would have
> >>>>>>>> come in then now, instead.  Things are on track for -rc3 on
> >>>>>>>> the 1st.
> >>>>>>>
> >>>>>>> My weekly dfu test on the siemens smartweb board failed with
> >>>>>>> current HEAD.
> >>>>>>>
> >>>>>>> I started an automated git bisect with tbot, and found:
> >>>>>>>
> >>>>>>> 2017-04-19 07:24:30,717:CON    :tbotlib   # tb_ctrl: git
> >>>>>>> bisect visualize
> >>>>>>> 2017-04-19 07:24:30,783:CON    :tbotlib   # tb_ctrl: commit
> >>>>>>> 842778a091047b0c868efa12229633959f711152
> >>>>>>> Author: Felipe Balbi <felipe.balbi@linux.intel.com>
> >>>>>>> Date:   Wed Feb 22 17:12:40 2017 +0200
> >>>>>>>        usb: gadget: g_dnl: only set iSerialNumber if we have a
> >>>>>>> serial#
> >>>>>>>
> >>>>>>>        We don't want to claim that we support a serial number
> >>>>>>> string and
> >>>>>>>        later return nothing. Because of that, if g_dnl_serial
> >>>>>>> is an empty
> >>>>>>>        string, let's skip setting iSerialNumber to a valid
> >>>>>>> number.
> >>>>>>>
> >>>>>>>        Signed-off-by: Felipe Balbi
> >>>>>>> <felipe.balbi@linux.intel.com> hs@pollux [ 7:24:30] ttbott>
> >>>>>>> 2017-04-19 07:24:31,769:CON    :tbotlib   # tb_ctrl: git
> >>>>>>> bisect log 2017-04-19 07:24:31,836:CON    :tbotlib   #
> >>>>>>> tb_ctrl: git bisect start
> >>>>> [...]
> >>>>>>>
> >>>>>>> Any ideas?
> >>>>>>
> >>>>>> Is your board setting up the serial number with
> >>>>>> g_dnl_set_serialnumber()
> >>>>>> correctly ?
> >>>>>
> >>>>> Hmm.. good question ... its done here:
> >>>>>
> >>>>> http://git.denx.de/?p=u-boot.git;a=blob;f=board/siemens/common/factoryset.c;h=6c869ed2b035a0e9f840e1f6f960fe0e6ac824e5;hb=f6c1df44b815a08585e7fd3805a1db51a5955d09#l313
> >>>>>
> >>>>>
> >>>>>
> >>>>> but may this does not work correct and now pops up.
> >>>>>
> >>>>> I try to find out more, thanks for the hint!
> >>>>
> >>>> Just check if you're not passing in NULL or empty string, that
> >>>> might be it. Otherwise the USB code is botched.
> >>>
> >>> Hmm... OK, on the smartweb board there is no factory set, so never
> >>> calling g_dnl_set_serialnumber()
> >>>
> >>> :-(
> >>>
> >>> why did this worked before commit 842778a091?
> >>>
> >>> So, I added for a fast dirty test:
> >>>
> >>> diff --git a/board/siemens/smartweb/smartweb.c
> >>> b/board/siemens/smartweb/smartweb.c
> >>> index 78a7946..01a3dd2 100644
> >>> --- a/board/siemens/smartweb/smartweb.c
> >>> +++ b/board/siemens/smartweb/smartweb.c
> >>> @@ -34,6 +34,7 @@
> >>>   #ifndef CONFIG_DM_ETH
> >>>   # include <netdev.h>
> >>>   #endif
> >>> +#include <g_dnl.h>
> >>>
> >>>   DECLARE_GLOBAL_DATA_PTR;
> >>>
> >>> @@ -265,3 +266,17 @@ U_BOOT_DEVICE(at91sam9260_serial) = {
> >>>          .name   = "serial_atmel",
> >>>          .platdata = &at91sam9260_serial_plat,
> >>>   };
> >>> +
> >>> +int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const
> >>> char *name) +{
> >>> +       printf("%s: *********\n", __func__);
> >>> +       g_dnl_set_serialnumber("0123456789");
> >>> +
> >>> +       return 0;
> >>> +}
> >>> +
> >>> +int g_dnl_get_board_bcd_device_number(int gcnum)
> >>> +{
> >>> +       return 0;
> >>> +}
> >>>
> >>> Now I see this printf:
> >>> (also enabled debug in ./drivers/usb/gadget/g_dnl.c)
> >>>
> >>> dfu 0 nand 0
> >>> using id 'nand0,4'
> >>> g_dnl_register: g_dnl_driver.name = usb_dnl_dfu
> >>> g_dnl_bind: gadget: 0x23adf6c0 cdev: 0x23b262d0
> >>> g_dnl_bind_fixup: *********
> >>> g_dnl_do_config: configuration: 0x23b263c0 composite dev:
> >>> 0x23b262d0 g_dnl_bind: calling usb_gadget_connect for controller
> >>> 'at91_udc'
> >>>
> >>> but result is the same:
> >>> # ./src/dfu-util -l
> >>> 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@lists.gnumonks.org
> >>> tb_ctrl: Found DFU: [0908:02d2] ver=0000, devnum=0, cfg=1, intf=0,
> >>> alt=0, name="Linux", serial="UNDEFINED"
> >>>
> >>> reverting commit 842778a091 and it works as before ... console
> >>> output for this case:
> >>>
> >>> ./src/dfu-util -l
> >>> 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@lists.gnumonks.org
> >>> tb_ctrl: Found DFU: [0908:02d2] ver=0000, devnum=0, cfg=1, intf=0,
> >>> alt=0, name="Linux", serial="0123456789"
> >>>
> >>> Ok, before commit 842778a091 is in mainline I had the follwoing
> >>> output:
> >>>
> >>> # tb_ctrl: ./src/dfu-util -l
> >>> # tb_ctrl: 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@lists.gnumonks.org
> >>>
> >>> Found DFU: [0908:02d2] ver=0212, devnum=0, cfg=1, intf=0, alt=0,
> >>>      name="Linux", serial=""
> >>>
> >>> serial is an empty string ... It seems to me, that commit
> >>> 842778a091 broke here something fundamental ...
> >>>
> >>> Hmm ... looking into drivers/usb/gadget/g_dnl.c g_dnl_bind()
> >>>
> >>> if (strlen(g_dnl_serial)) {
> >>>
> >>> is *before* g_dnl_bind_fixup() is called ... ?
> >>>
> >>> Yup, with patch:
> >>>
> >>> diff --git a/drivers/usb/gadget/g_dnl.c
> >>> b/drivers/usb/gadget/g_dnl.c index d4bee9b..813d4b8 100644
> >>> --- a/drivers/usb/gadget/g_dnl.c
> >>> +++ b/drivers/usb/gadget/g_dnl.c
> >>> @@ -224,6 +224,7 @@ static int g_dnl_bind(struct usb_composite_dev
> >>> *cdev) g_dnl_string_defs[1].id = id;
> >>>          device_desc.iProduct = id;
> >>>
> >>> +       g_dnl_bind_fixup(&device_desc, cdev->driver->name);
> >>>          if (strlen(g_dnl_serial)) {
> >>>                  id = usb_string_id(cdev);
> >>>                  if (id < 0)
> >>> @@ -233,7 +234,6 @@ static int g_dnl_bind(struct usb_composite_dev
> >>> *cdev) device_desc.iSerialNumber = id;
> >>>          }
> >>>
> >>> -       g_dnl_bind_fixup(&device_desc, cdev->driver->name);
> >>>          ret = g_dnl_config_register(cdev);
> >>>          if (ret)
> >>>                  goto error;
> >>>
> >>> and adding g_dnl_bind_fixup() in board/siemens/smartweb/smartweb.c
> >>> dfu work again for the smartweb board ... is this an valid fix?
> >>>
> >>> BTW: is an empty serial string not allowed?
> >>
> >> This is Lukasz's domain of expertise, so I'll pull out of this
> >> discussion and wait for a PR from him.
> >>
> >
> > The problem is with providing "iSerialNumber" visible (at USB
> > descriptor) only when it is defined.
> >
> > Before the Felipe commit (SHA1: 842778a091)  we had exposed it
> > unconditionally - even when we had a zeroed char table (which was
> > the "" string)
> >
> > Now we do not have the iStringNumber field defined in descriptor
> > when the "serial" string size is zero.
> >
> > I'm wondering which behavior is correct - i.e. comply with the USB
> > standard.
> >
> > Felipe - have you tried to run the USB compliance tests [1] (Windows
> > one) after applying this patch?

I was waiting for Felipe answer.....

> >
> >
> >
> > [1] http://www.usb.org/developers/tools/usb20_tools/
> >
> > Best regards,
> >
> > Lukasz Majewski
> 
> How to proceed here? If the current behaviour of U-Boot is correct,
> then I simple adapt my tbot testcase ... 

... but none was given.

However, IMHO it is better to not expose the string when it is empty.

> but I think, currently we
> have no way to set the serial number field, or?

:-( Yes, this commit has introduced regression (the g_dnl_serial is
always NULL there because we setup the serial number in a latter
function:

g_dnl_bind_fixup @ for example board/siemens/common/factoryreset.c

which calls: g_dnl_set_serialnumber() and only there the g_dnl_serial
is set.

Please find attached patch (if it fixes siemens boards).

> 
> bye,
> Heiko




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de

Comments

Felipe Balbi June 26, 2017, 10:22 a.m. UTC | #1
Hi,

Lukasz Majewski <lukma@denx.de> writes:
>> >>>>>>> My weekly dfu test on the siemens smartweb board failed with
>> >>>>>>> current HEAD.
>> >>>>>>>
>> >>>>>>> I started an automated git bisect with tbot, and found:
>> >>>>>>>
>> >>>>>>> 2017-04-19 07:24:30,717:CON    :tbotlib   # tb_ctrl: git
>> >>>>>>> bisect visualize
>> >>>>>>> 2017-04-19 07:24:30,783:CON    :tbotlib   # tb_ctrl: commit
>> >>>>>>> 842778a091047b0c868efa12229633959f711152
>> >>>>>>> Author: Felipe Balbi <felipe.balbi@linux.intel.com>
>> >>>>>>> Date:   Wed Feb 22 17:12:40 2017 +0200
>> >>>>>>>        usb: gadget: g_dnl: only set iSerialNumber if we have a
>> >>>>>>> serial#
>> >>>>>>>
>> >>>>>>>        We don't want to claim that we support a serial number
>> >>>>>>> string and
>> >>>>>>>        later return nothing. Because of that, if g_dnl_serial
>> >>>>>>> is an empty
>> >>>>>>>        string, let's skip setting iSerialNumber to a valid
>> >>>>>>> number.
>> >>>>>>>
>> >>>>>>>        Signed-off-by: Felipe Balbi
>> >>>>>>> <felipe.balbi@linux.intel.com> hs@pollux [ 7:24:30] ttbott>
>> >>>>>>> 2017-04-19 07:24:31,769:CON    :tbotlib   # tb_ctrl: git
>> >>>>>>> bisect log 2017-04-19 07:24:31,836:CON    :tbotlib   #
>> >>>>>>> tb_ctrl: git bisect start
>> >>>>> [...]
>> >>>>>>>
>> >>>>>>> Any ideas?
>> >>>>>>
>> >>>>>> Is your board setting up the serial number with
>> >>>>>> g_dnl_set_serialnumber()
>> >>>>>> correctly ?
>> >>>>>
>> >>>>> Hmm.. good question ... its done here:
>> >>>>>
>> >>>>> http://git.denx.de/?p=u-boot.git;a=blob;f=board/siemens/common/factoryset.c;h=6c869ed2b035a0e9f840e1f6f960fe0e6ac824e5;hb=f6c1df44b815a08585e7fd3805a1db51a5955d09#l313
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>> but may this does not work correct and now pops up.
>> >>>>>
>> >>>>> I try to find out more, thanks for the hint!
>> >>>>
>> >>>> Just check if you're not passing in NULL or empty string, that
>> >>>> might be it. Otherwise the USB code is botched.
>> >>>
>> >>> Hmm... OK, on the smartweb board there is no factory set, so never
>> >>> calling g_dnl_set_serialnumber()
>> >>>
>> >>> :-(
>> >>>
>> >>> why did this worked before commit 842778a091?
>> >>>
>> >>> So, I added for a fast dirty test:
>> >>>
>> >>> diff --git a/board/siemens/smartweb/smartweb.c
>> >>> b/board/siemens/smartweb/smartweb.c
>> >>> index 78a7946..01a3dd2 100644
>> >>> --- a/board/siemens/smartweb/smartweb.c
>> >>> +++ b/board/siemens/smartweb/smartweb.c
>> >>> @@ -34,6 +34,7 @@
>> >>>   #ifndef CONFIG_DM_ETH
>> >>>   # include <netdev.h>
>> >>>   #endif
>> >>> +#include <g_dnl.h>
>> >>>
>> >>>   DECLARE_GLOBAL_DATA_PTR;
>> >>>
>> >>> @@ -265,3 +266,17 @@ U_BOOT_DEVICE(at91sam9260_serial) = {
>> >>>          .name   = "serial_atmel",
>> >>>          .platdata = &at91sam9260_serial_plat,
>> >>>   };
>> >>> +
>> >>> +int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const
>> >>> char *name) +{
>> >>> +       printf("%s: *********\n", __func__);
>> >>> +       g_dnl_set_serialnumber("0123456789");
>> >>> +
>> >>> +       return 0;
>> >>> +}
>> >>> +
>> >>> +int g_dnl_get_board_bcd_device_number(int gcnum)
>> >>> +{
>> >>> +       return 0;
>> >>> +}
>> >>>
>> >>> Now I see this printf:
>> >>> (also enabled debug in ./drivers/usb/gadget/g_dnl.c)
>> >>>
>> >>> dfu 0 nand 0
>> >>> using id 'nand0,4'
>> >>> g_dnl_register: g_dnl_driver.name = usb_dnl_dfu
>> >>> g_dnl_bind: gadget: 0x23adf6c0 cdev: 0x23b262d0
>> >>> g_dnl_bind_fixup: *********
>> >>> g_dnl_do_config: configuration: 0x23b263c0 composite dev:
>> >>> 0x23b262d0 g_dnl_bind: calling usb_gadget_connect for controller
>> >>> 'at91_udc'
>> >>>
>> >>> but result is the same:
>> >>> # ./src/dfu-util -l
>> >>> 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@lists.gnumonks.org
>> >>> tb_ctrl: Found DFU: [0908:02d2] ver=0000, devnum=0, cfg=1, intf=0,
>> >>> alt=0, name="Linux", serial="UNDEFINED"
>> >>>
>> >>> reverting commit 842778a091 and it works as before ... console
>> >>> output for this case:
>> >>>
>> >>> ./src/dfu-util -l
>> >>> 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@lists.gnumonks.org
>> >>> tb_ctrl: Found DFU: [0908:02d2] ver=0000, devnum=0, cfg=1, intf=0,
>> >>> alt=0, name="Linux", serial="0123456789"
>> >>>
>> >>> Ok, before commit 842778a091 is in mainline I had the follwoing
>> >>> output:
>> >>>
>> >>> # tb_ctrl: ./src/dfu-util -l
>> >>> # tb_ctrl: 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@lists.gnumonks.org
>> >>>
>> >>> Found DFU: [0908:02d2] ver=0212, devnum=0, cfg=1, intf=0, alt=0,
>> >>>      name="Linux", serial=""
>> >>>
>> >>> serial is an empty string ... It seems to me, that commit
>> >>> 842778a091 broke here something fundamental ...
>> >>>
>> >>> Hmm ... looking into drivers/usb/gadget/g_dnl.c g_dnl_bind()
>> >>>
>> >>> if (strlen(g_dnl_serial)) {
>> >>>
>> >>> is *before* g_dnl_bind_fixup() is called ... ?
>> >>>
>> >>> Yup, with patch:
>> >>>
>> >>> diff --git a/drivers/usb/gadget/g_dnl.c
>> >>> b/drivers/usb/gadget/g_dnl.c index d4bee9b..813d4b8 100644
>> >>> --- a/drivers/usb/gadget/g_dnl.c
>> >>> +++ b/drivers/usb/gadget/g_dnl.c
>> >>> @@ -224,6 +224,7 @@ static int g_dnl_bind(struct usb_composite_dev
>> >>> *cdev) g_dnl_string_defs[1].id = id;
>> >>>          device_desc.iProduct = id;
>> >>>
>> >>> +       g_dnl_bind_fixup(&device_desc, cdev->driver->name);
>> >>>          if (strlen(g_dnl_serial)) {
>> >>>                  id = usb_string_id(cdev);
>> >>>                  if (id < 0)
>> >>> @@ -233,7 +234,6 @@ static int g_dnl_bind(struct usb_composite_dev
>> >>> *cdev) device_desc.iSerialNumber = id;
>> >>>          }
>> >>>
>> >>> -       g_dnl_bind_fixup(&device_desc, cdev->driver->name);
>> >>>          ret = g_dnl_config_register(cdev);
>> >>>          if (ret)
>> >>>                  goto error;
>> >>>
>> >>> and adding g_dnl_bind_fixup() in board/siemens/smartweb/smartweb.c
>> >>> dfu work again for the smartweb board ... is this an valid fix?
>> >>>
>> >>> BTW: is an empty serial string not allowed?
>> >>
>> >> This is Lukasz's domain of expertise, so I'll pull out of this
>> >> discussion and wait for a PR from him.
>> >>
>> >
>> > The problem is with providing "iSerialNumber" visible (at USB
>> > descriptor) only when it is defined.
>> >
>> > Before the Felipe commit (SHA1: 842778a091)  we had exposed it
>> > unconditionally - even when we had a zeroed char table (which was
>> > the "" string)
>> >
>> > Now we do not have the iStringNumber field defined in descriptor
>> > when the "serial" string size is zero.
>> >
>> > I'm wondering which behavior is correct - i.e. comply with the USB
>> > standard.
>> >
>> > Felipe - have you tried to run the USB compliance tests [1] (Windows
>> > one) after applying this patch?
>
> I was waiting for Felipe answer.....

sorry, I completely missed this.

if iSerialNumber is set to a non-zero value, then the actual string
should exist. if the string is empty, then iSerialNumber should be
cleared to zero in the device descriptor.

>> > [1] http://www.usb.org/developers/tools/usb20_tools/
>> >
>> > Best regards,
>> >
>> > Lukasz Majewski
>> 
>> How to proceed here? If the current behaviour of U-Boot is correct,
>> then I simple adapt my tbot testcase ... 
>
> ... but none was given.
>
> However, IMHO it is better to not expose the string when it is empty.

right

>> but I think, currently we
>> have no way to set the serial number field, or?
>
> :-( Yes, this commit has introduced regression (the g_dnl_serial is
> always NULL there because we setup the serial number in a latter
> function:
>
> g_dnl_bind_fixup @ for example board/siemens/common/factoryreset.c
>
> which calls: g_dnl_set_serialnumber() and only there the g_dnl_serial
> is set.
>
> Please find attached patch (if it fixes siemens boards).

> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
> From 5af562a7b43184ea5ab5bb5a18ff3b14f48b2475 Mon Sep 17 00:00:00 2001
> From: Lukasz Majewski <lukma@denx.de>
> Date: Mon, 26 Jun 2017 12:15:09 +0200
> Subject: [PATCH] usb: gadget: Call g_dnl_bind_fixup() before testing
>  g_dnl_serial length
>
> After the commit SHA1: 842778a091 - the serial number descriptor is only
> visible when we have non zero length of g_dnl_serial.
>
> However, on some platforms (e.g. Siemens) the serial number is set at
> g_dnl_bind_fixup(), so with the current code we will always omit the
> serial (since it is not set).
>
> This commit moves the g_dnl_bind_fixup() call before the g_dnl_serial
> length test.
>
> Signed-off-by: Lukasz Majewski <lukma@denx.de>

looks good to me.

> ---
>  drivers/usb/gadget/g_dnl.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/gadget/g_dnl.c b/drivers/usb/gadget/g_dnl.c
> index d4bee9b..0491a0e 100644
> --- a/drivers/usb/gadget/g_dnl.c
> +++ b/drivers/usb/gadget/g_dnl.c
> @@ -224,6 +224,8 @@ static int g_dnl_bind(struct usb_composite_dev *cdev)
>  	g_dnl_string_defs[1].id = id;
>  	device_desc.iProduct = id;
>  
> +	g_dnl_bind_fixup(&device_desc, cdev->driver->name);
> +
>  	if (strlen(g_dnl_serial)) {
>  		id = usb_string_id(cdev);
>  		if (id < 0)
> @@ -233,7 +235,6 @@ static int g_dnl_bind(struct usb_composite_dev *cdev)
>  		device_desc.iSerialNumber = id;
>  	}
>  
> -	g_dnl_bind_fixup(&device_desc, cdev->driver->name);
>  	ret = g_dnl_config_register(cdev);
>  	if (ret)
>  		goto error;
> -- 
> 2.1.4
>
Heiko Schocher June 26, 2017, 10:50 a.m. UTC | #2
Hello Felipe, Lukasz,

Am 26.06.2017 um 12:22 schrieb Felipe Balbi:
>
> Hi,
>
> Lukasz Majewski <lukma@denx.de> writes:
>>>>>>>>>> My weekly dfu test on the siemens smartweb board failed with
>>>>>>>>>> current HEAD.
>>>>>>>>>>
>>>>>>>>>> I started an automated git bisect with tbot, and found:
>>>>>>>>>>
>>>>>>>>>> 2017-04-19 07:24:30,717:CON    :tbotlib   # tb_ctrl: git
>>>>>>>>>> bisect visualize
>>>>>>>>>> 2017-04-19 07:24:30,783:CON    :tbotlib   # tb_ctrl: commit
>>>>>>>>>> 842778a091047b0c868efa12229633959f711152
>>>>>>>>>> Author: Felipe Balbi <felipe.balbi@linux.intel.com>
>>>>>>>>>> Date:   Wed Feb 22 17:12:40 2017 +0200
>>>>>>>>>>         usb: gadget: g_dnl: only set iSerialNumber if we have a
>>>>>>>>>> serial#
>>>>>>>>>>
>>>>>>>>>>         We don't want to claim that we support a serial number
>>>>>>>>>> string and
>>>>>>>>>>         later return nothing. Because of that, if g_dnl_serial
>>>>>>>>>> is an empty
>>>>>>>>>>         string, let's skip setting iSerialNumber to a valid
>>>>>>>>>> number.
>>>>>>>>>>
>>>>>>>>>>         Signed-off-by: Felipe Balbi
>>>>>>>>>> <felipe.balbi@linux.intel.com> hs@pollux [ 7:24:30] ttbott>
>>>>>>>>>> 2017-04-19 07:24:31,769:CON    :tbotlib   # tb_ctrl: git
>>>>>>>>>> bisect log 2017-04-19 07:24:31,836:CON    :tbotlib   #
>>>>>>>>>> tb_ctrl: git bisect start
>>>>>>>> [...]
>>>>>>>>>>
>>>>>>>>>> Any ideas?
>>>>>>>>>
>>>>>>>>> Is your board setting up the serial number with
>>>>>>>>> g_dnl_set_serialnumber()
>>>>>>>>> correctly ?
>>>>>>>>
>>>>>>>> Hmm.. good question ... its done here:
>>>>>>>>
>>>>>>>> http://git.denx.de/?p=u-boot.git;a=blob;f=board/siemens/common/factoryset.c;h=6c869ed2b035a0e9f840e1f6f960fe0e6ac824e5;hb=f6c1df44b815a08585e7fd3805a1db51a5955d09#l313
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> but may this does not work correct and now pops up.
>>>>>>>>
>>>>>>>> I try to find out more, thanks for the hint!
>>>>>>>
>>>>>>> Just check if you're not passing in NULL or empty string, that
>>>>>>> might be it. Otherwise the USB code is botched.
>>>>>>
>>>>>> Hmm... OK, on the smartweb board there is no factory set, so never
>>>>>> calling g_dnl_set_serialnumber()
>>>>>>
>>>>>> :-(
>>>>>>
>>>>>> why did this worked before commit 842778a091?
>>>>>>
>>>>>> So, I added for a fast dirty test:
>>>>>>
>>>>>> diff --git a/board/siemens/smartweb/smartweb.c
>>>>>> b/board/siemens/smartweb/smartweb.c
>>>>>> index 78a7946..01a3dd2 100644
>>>>>> --- a/board/siemens/smartweb/smartweb.c
>>>>>> +++ b/board/siemens/smartweb/smartweb.c
>>>>>> @@ -34,6 +34,7 @@
>>>>>>    #ifndef CONFIG_DM_ETH
>>>>>>    # include <netdev.h>
>>>>>>    #endif
>>>>>> +#include <g_dnl.h>
>>>>>>
>>>>>>    DECLARE_GLOBAL_DATA_PTR;
>>>>>>
>>>>>> @@ -265,3 +266,17 @@ U_BOOT_DEVICE(at91sam9260_serial) = {
>>>>>>           .name   = "serial_atmel",
>>>>>>           .platdata = &at91sam9260_serial_plat,
>>>>>>    };
>>>>>> +
>>>>>> +int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const
>>>>>> char *name) +{
>>>>>> +       printf("%s: *********\n", __func__);
>>>>>> +       g_dnl_set_serialnumber("0123456789");
>>>>>> +
>>>>>> +       return 0;
>>>>>> +}
>>>>>> +
>>>>>> +int g_dnl_get_board_bcd_device_number(int gcnum)
>>>>>> +{
>>>>>> +       return 0;
>>>>>> +}
>>>>>>
>>>>>> Now I see this printf:
>>>>>> (also enabled debug in ./drivers/usb/gadget/g_dnl.c)
>>>>>>
>>>>>> dfu 0 nand 0
>>>>>> using id 'nand0,4'
>>>>>> g_dnl_register: g_dnl_driver.name = usb_dnl_dfu
>>>>>> g_dnl_bind: gadget: 0x23adf6c0 cdev: 0x23b262d0
>>>>>> g_dnl_bind_fixup: *********
>>>>>> g_dnl_do_config: configuration: 0x23b263c0 composite dev:
>>>>>> 0x23b262d0 g_dnl_bind: calling usb_gadget_connect for controller
>>>>>> 'at91_udc'
>>>>>>
>>>>>> but result is the same:
>>>>>> # ./src/dfu-util -l
>>>>>> 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@lists.gnumonks.org
>>>>>> tb_ctrl: Found DFU: [0908:02d2] ver=0000, devnum=0, cfg=1, intf=0,
>>>>>> alt=0, name="Linux", serial="UNDEFINED"
>>>>>>
>>>>>> reverting commit 842778a091 and it works as before ... console
>>>>>> output for this case:
>>>>>>
>>>>>> ./src/dfu-util -l
>>>>>> 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@lists.gnumonks.org
>>>>>> tb_ctrl: Found DFU: [0908:02d2] ver=0000, devnum=0, cfg=1, intf=0,
>>>>>> alt=0, name="Linux", serial="0123456789"
>>>>>>
>>>>>> Ok, before commit 842778a091 is in mainline I had the follwoing
>>>>>> output:
>>>>>>
>>>>>> # tb_ctrl: ./src/dfu-util -l
>>>>>> # tb_ctrl: 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@lists.gnumonks.org
>>>>>>
>>>>>> Found DFU: [0908:02d2] ver=0212, devnum=0, cfg=1, intf=0, alt=0,
>>>>>>       name="Linux", serial=""
>>>>>>
>>>>>> serial is an empty string ... It seems to me, that commit
>>>>>> 842778a091 broke here something fundamental ...
>>>>>>
>>>>>> Hmm ... looking into drivers/usb/gadget/g_dnl.c g_dnl_bind()
>>>>>>
>>>>>> if (strlen(g_dnl_serial)) {
>>>>>>
>>>>>> is *before* g_dnl_bind_fixup() is called ... ?
>>>>>>
>>>>>> Yup, with patch:
>>>>>>
>>>>>> diff --git a/drivers/usb/gadget/g_dnl.c
>>>>>> b/drivers/usb/gadget/g_dnl.c index d4bee9b..813d4b8 100644
>>>>>> --- a/drivers/usb/gadget/g_dnl.c
>>>>>> +++ b/drivers/usb/gadget/g_dnl.c
>>>>>> @@ -224,6 +224,7 @@ static int g_dnl_bind(struct usb_composite_dev
>>>>>> *cdev) g_dnl_string_defs[1].id = id;
>>>>>>           device_desc.iProduct = id;
>>>>>>
>>>>>> +       g_dnl_bind_fixup(&device_desc, cdev->driver->name);
>>>>>>           if (strlen(g_dnl_serial)) {
>>>>>>                   id = usb_string_id(cdev);
>>>>>>                   if (id < 0)
>>>>>> @@ -233,7 +234,6 @@ static int g_dnl_bind(struct usb_composite_dev
>>>>>> *cdev) device_desc.iSerialNumber = id;
>>>>>>           }
>>>>>>
>>>>>> -       g_dnl_bind_fixup(&device_desc, cdev->driver->name);
>>>>>>           ret = g_dnl_config_register(cdev);
>>>>>>           if (ret)
>>>>>>                   goto error;
>>>>>>
>>>>>> and adding g_dnl_bind_fixup() in board/siemens/smartweb/smartweb.c
>>>>>> dfu work again for the smartweb board ... is this an valid fix?
>>>>>>
>>>>>> BTW: is an empty serial string not allowed?
>>>>>
>>>>> This is Lukasz's domain of expertise, so I'll pull out of this
>>>>> discussion and wait for a PR from him.
>>>>>
>>>>
>>>> The problem is with providing "iSerialNumber" visible (at USB
>>>> descriptor) only when it is defined.
>>>>
>>>> Before the Felipe commit (SHA1: 842778a091)  we had exposed it
>>>> unconditionally - even when we had a zeroed char table (which was
>>>> the "" string)
>>>>
>>>> Now we do not have the iStringNumber field defined in descriptor
>>>> when the "serial" string size is zero.
>>>>
>>>> I'm wondering which behavior is correct - i.e. comply with the USB
>>>> standard.
>>>>
>>>> Felipe - have you tried to run the USB compliance tests [1] (Windows
>>>> one) after applying this patch?
>>
>> I was waiting for Felipe answer.....
>
> sorry, I completely missed this.
>
> if iSerialNumber is set to a non-zero value, then the actual string
> should exist. if the string is empty, then iSerialNumber should be
> cleared to zero in the device descriptor.
>
>>>> [1] http://www.usb.org/developers/tools/usb20_tools/
>>>>
>>>> Best regards,
>>>>
>>>> Lukasz Majewski
>>>
>>> How to proceed here? If the current behaviour of U-Boot is correct,
>>> then I simple adapt my tbot testcase ...
>>
>> ... but none was given.
>>
>> However, IMHO it is better to not expose the string when it is empty.
>
> right
>
>>> but I think, currently we
>>> have no way to set the serial number field, or?
>>
>> :-( Yes, this commit has introduced regression (the g_dnl_serial is
>> always NULL there because we setup the serial number in a latter
>> function:
>>
>> g_dnl_bind_fixup @ for example board/siemens/common/factoryreset.c
>>
>> which calls: g_dnl_set_serialnumber() and only there the g_dnl_serial
>> is set.
>>
>> Please find attached patch (if it fixes siemens boards).
>
>> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
>> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
>> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
>>  From 5af562a7b43184ea5ab5bb5a18ff3b14f48b2475 Mon Sep 17 00:00:00 2001
>> From: Lukasz Majewski <lukma@denx.de>
>> Date: Mon, 26 Jun 2017 12:15:09 +0200
>> Subject: [PATCH] usb: gadget: Call g_dnl_bind_fixup() before testing
>>   g_dnl_serial length
>>
>> After the commit SHA1: 842778a091 - the serial number descriptor is only
>> visible when we have non zero length of g_dnl_serial.
>>
>> However, on some platforms (e.g. Siemens) the serial number is set at
>> g_dnl_bind_fixup(), so with the current code we will always omit the
>> serial (since it is not set).
>>
>> This commit moves the g_dnl_bind_fixup() call before the g_dnl_serial
>> length test.
>>
>> Signed-off-by: Lukasz Majewski <lukma@denx.de>
>
> looks good to me.

Acked-by: Heiko Schocher <hs@denx.de>

@Lukasz: Do you send this as a patch? (Or did I missed it?)

Thanks!

bye,
Heiko
>
>> ---
>>   drivers/usb/gadget/g_dnl.c | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/usb/gadget/g_dnl.c b/drivers/usb/gadget/g_dnl.c
>> index d4bee9b..0491a0e 100644
>> --- a/drivers/usb/gadget/g_dnl.c
>> +++ b/drivers/usb/gadget/g_dnl.c
>> @@ -224,6 +224,8 @@ static int g_dnl_bind(struct usb_composite_dev *cdev)
>>   	g_dnl_string_defs[1].id = id;
>>   	device_desc.iProduct = id;
>>
>> +	g_dnl_bind_fixup(&device_desc, cdev->driver->name);
>> +
>>   	if (strlen(g_dnl_serial)) {
>>   		id = usb_string_id(cdev);
>>   		if (id < 0)
>> @@ -233,7 +235,6 @@ static int g_dnl_bind(struct usb_composite_dev *cdev)
>>   		device_desc.iSerialNumber = id;
>>   	}
>>
>> -	g_dnl_bind_fixup(&device_desc, cdev->driver->name);
>>   	ret = g_dnl_config_register(cdev);
>>   	if (ret)
>>   		goto error;
>> --
>> 2.1.4
>>
>
Lukasz Majewski June 26, 2017, 10:55 a.m. UTC | #3
On Mon, 26 Jun 2017 12:50:34 +0200
Heiko Schocher <hs@denx.de> wrote:

> Hello Felipe, Lukasz,
> 
> Am 26.06.2017 um 12:22 schrieb Felipe Balbi:
> >
> > Hi,
> >
> > Lukasz Majewski <lukma@denx.de> writes:
> >>>>>>>>>> My weekly dfu test on the siemens smartweb board failed
> >>>>>>>>>> with current HEAD.
> >>>>>>>>>>
> >>>>>>>>>> I started an automated git bisect with tbot, and found:
> >>>>>>>>>>
> >>>>>>>>>> 2017-04-19 07:24:30,717:CON    :tbotlib   # tb_ctrl: git
> >>>>>>>>>> bisect visualize
> >>>>>>>>>> 2017-04-19 07:24:30,783:CON    :tbotlib   # tb_ctrl: commit
> >>>>>>>>>> 842778a091047b0c868efa12229633959f711152
> >>>>>>>>>> Author: Felipe Balbi <felipe.balbi@linux.intel.com>
> >>>>>>>>>> Date:   Wed Feb 22 17:12:40 2017 +0200
> >>>>>>>>>>         usb: gadget: g_dnl: only set iSerialNumber if we
> >>>>>>>>>> have a serial#
> >>>>>>>>>>
> >>>>>>>>>>         We don't want to claim that we support a serial
> >>>>>>>>>> number string and
> >>>>>>>>>>         later return nothing. Because of that, if
> >>>>>>>>>> g_dnl_serial is an empty
> >>>>>>>>>>         string, let's skip setting iSerialNumber to a valid
> >>>>>>>>>> number.
> >>>>>>>>>>
> >>>>>>>>>>         Signed-off-by: Felipe Balbi
> >>>>>>>>>> <felipe.balbi@linux.intel.com> hs@pollux [ 7:24:30] ttbott>
> >>>>>>>>>> 2017-04-19 07:24:31,769:CON    :tbotlib   # tb_ctrl: git
> >>>>>>>>>> bisect log 2017-04-19 07:24:31,836:CON    :tbotlib   #
> >>>>>>>>>> tb_ctrl: git bisect start
> >>>>>>>> [...]
> >>>>>>>>>>
> >>>>>>>>>> Any ideas?
> >>>>>>>>>
> >>>>>>>>> Is your board setting up the serial number with
> >>>>>>>>> g_dnl_set_serialnumber()
> >>>>>>>>> correctly ?
> >>>>>>>>
> >>>>>>>> Hmm.. good question ... its done here:
> >>>>>>>>
> >>>>>>>> http://git.denx.de/?p=u-boot.git;a=blob;f=board/siemens/common/factoryset.c;h=6c869ed2b035a0e9f840e1f6f960fe0e6ac824e5;hb=f6c1df44b815a08585e7fd3805a1db51a5955d09#l313
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> but may this does not work correct and now pops up.
> >>>>>>>>
> >>>>>>>> I try to find out more, thanks for the hint!
> >>>>>>>
> >>>>>>> Just check if you're not passing in NULL or empty string, that
> >>>>>>> might be it. Otherwise the USB code is botched.
> >>>>>>
> >>>>>> Hmm... OK, on the smartweb board there is no factory set, so
> >>>>>> never calling g_dnl_set_serialnumber()
> >>>>>>
> >>>>>> :-(
> >>>>>>
> >>>>>> why did this worked before commit 842778a091?
> >>>>>>
> >>>>>> So, I added for a fast dirty test:
> >>>>>>
> >>>>>> diff --git a/board/siemens/smartweb/smartweb.c
> >>>>>> b/board/siemens/smartweb/smartweb.c
> >>>>>> index 78a7946..01a3dd2 100644
> >>>>>> --- a/board/siemens/smartweb/smartweb.c
> >>>>>> +++ b/board/siemens/smartweb/smartweb.c
> >>>>>> @@ -34,6 +34,7 @@
> >>>>>>    #ifndef CONFIG_DM_ETH
> >>>>>>    # include <netdev.h>
> >>>>>>    #endif
> >>>>>> +#include <g_dnl.h>
> >>>>>>
> >>>>>>    DECLARE_GLOBAL_DATA_PTR;
> >>>>>>
> >>>>>> @@ -265,3 +266,17 @@ U_BOOT_DEVICE(at91sam9260_serial) = {
> >>>>>>           .name   = "serial_atmel",
> >>>>>>           .platdata = &at91sam9260_serial_plat,
> >>>>>>    };
> >>>>>> +
> >>>>>> +int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const
> >>>>>> char *name) +{
> >>>>>> +       printf("%s: *********\n", __func__);
> >>>>>> +       g_dnl_set_serialnumber("0123456789");
> >>>>>> +
> >>>>>> +       return 0;
> >>>>>> +}
> >>>>>> +
> >>>>>> +int g_dnl_get_board_bcd_device_number(int gcnum)
> >>>>>> +{
> >>>>>> +       return 0;
> >>>>>> +}
> >>>>>>
> >>>>>> Now I see this printf:
> >>>>>> (also enabled debug in ./drivers/usb/gadget/g_dnl.c)
> >>>>>>
> >>>>>> dfu 0 nand 0
> >>>>>> using id 'nand0,4'
> >>>>>> g_dnl_register: g_dnl_driver.name = usb_dnl_dfu
> >>>>>> g_dnl_bind: gadget: 0x23adf6c0 cdev: 0x23b262d0
> >>>>>> g_dnl_bind_fixup: *********
> >>>>>> g_dnl_do_config: configuration: 0x23b263c0 composite dev:
> >>>>>> 0x23b262d0 g_dnl_bind: calling usb_gadget_connect for
> >>>>>> controller 'at91_udc'
> >>>>>>
> >>>>>> but result is the same:
> >>>>>> # ./src/dfu-util -l
> >>>>>> 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@lists.gnumonks.org
> >>>>>> tb_ctrl: Found DFU: [0908:02d2] ver=0000, devnum=0, cfg=1,
> >>>>>> intf=0, alt=0, name="Linux", serial="UNDEFINED"
> >>>>>>
> >>>>>> reverting commit 842778a091 and it works as before ... console
> >>>>>> output for this case:
> >>>>>>
> >>>>>> ./src/dfu-util -l
> >>>>>> 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@lists.gnumonks.org
> >>>>>> tb_ctrl: Found DFU: [0908:02d2] ver=0000, devnum=0, cfg=1,
> >>>>>> intf=0, alt=0, name="Linux", serial="0123456789"
> >>>>>>
> >>>>>> Ok, before commit 842778a091 is in mainline I had the follwoing
> >>>>>> output:
> >>>>>>
> >>>>>> # tb_ctrl: ./src/dfu-util -l
> >>>>>> # tb_ctrl: 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@lists.gnumonks.org
> >>>>>>
> >>>>>> Found DFU: [0908:02d2] ver=0212, devnum=0, cfg=1, intf=0,
> >>>>>> alt=0, name="Linux", serial=""
> >>>>>>
> >>>>>> serial is an empty string ... It seems to me, that commit
> >>>>>> 842778a091 broke here something fundamental ...
> >>>>>>
> >>>>>> Hmm ... looking into drivers/usb/gadget/g_dnl.c g_dnl_bind()
> >>>>>>
> >>>>>> if (strlen(g_dnl_serial)) {
> >>>>>>
> >>>>>> is *before* g_dnl_bind_fixup() is called ... ?
> >>>>>>
> >>>>>> Yup, with patch:
> >>>>>>
> >>>>>> diff --git a/drivers/usb/gadget/g_dnl.c
> >>>>>> b/drivers/usb/gadget/g_dnl.c index d4bee9b..813d4b8 100644
> >>>>>> --- a/drivers/usb/gadget/g_dnl.c
> >>>>>> +++ b/drivers/usb/gadget/g_dnl.c
> >>>>>> @@ -224,6 +224,7 @@ static int g_dnl_bind(struct
> >>>>>> usb_composite_dev *cdev) g_dnl_string_defs[1].id = id;
> >>>>>>           device_desc.iProduct = id;
> >>>>>>
> >>>>>> +       g_dnl_bind_fixup(&device_desc, cdev->driver->name);
> >>>>>>           if (strlen(g_dnl_serial)) {
> >>>>>>                   id = usb_string_id(cdev);
> >>>>>>                   if (id < 0)
> >>>>>> @@ -233,7 +234,6 @@ static int g_dnl_bind(struct
> >>>>>> usb_composite_dev *cdev) device_desc.iSerialNumber = id;
> >>>>>>           }
> >>>>>>
> >>>>>> -       g_dnl_bind_fixup(&device_desc, cdev->driver->name);
> >>>>>>           ret = g_dnl_config_register(cdev);
> >>>>>>           if (ret)
> >>>>>>                   goto error;
> >>>>>>
> >>>>>> and adding g_dnl_bind_fixup() in
> >>>>>> board/siemens/smartweb/smartweb.c dfu work again for the
> >>>>>> smartweb board ... is this an valid fix?
> >>>>>>
> >>>>>> BTW: is an empty serial string not allowed?
> >>>>>
> >>>>> This is Lukasz's domain of expertise, so I'll pull out of this
> >>>>> discussion and wait for a PR from him.
> >>>>>
> >>>>
> >>>> The problem is with providing "iSerialNumber" visible (at USB
> >>>> descriptor) only when it is defined.
> >>>>
> >>>> Before the Felipe commit (SHA1: 842778a091)  we had exposed it
> >>>> unconditionally - even when we had a zeroed char table (which was
> >>>> the "" string)
> >>>>
> >>>> Now we do not have the iStringNumber field defined in descriptor
> >>>> when the "serial" string size is zero.
> >>>>
> >>>> I'm wondering which behavior is correct - i.e. comply with the
> >>>> USB standard.
> >>>>
> >>>> Felipe - have you tried to run the USB compliance tests [1]
> >>>> (Windows one) after applying this patch?
> >>
> >> I was waiting for Felipe answer.....
> >
> > sorry, I completely missed this.
> >
> > if iSerialNumber is set to a non-zero value, then the actual string
> > should exist. if the string is empty, then iSerialNumber should be
> > cleared to zero in the device descriptor.
> >
> >>>> [1] http://www.usb.org/developers/tools/usb20_tools/
> >>>>
> >>>> Best regards,
> >>>>
> >>>> Lukasz Majewski
> >>>
> >>> How to proceed here? If the current behaviour of U-Boot is
> >>> correct, then I simple adapt my tbot testcase ...
> >>
> >> ... but none was given.
> >>
> >> However, IMHO it is better to not expose the string when it is
> >> empty.
> >
> > right
> >
> >>> but I think, currently we
> >>> have no way to set the serial number field, or?
> >>
> >> :-( Yes, this commit has introduced regression (the g_dnl_serial is
> >> always NULL there because we setup the serial number in a latter
> >> function:
> >>
> >> g_dnl_bind_fixup @ for example board/siemens/common/factoryreset.c
> >>
> >> which calls: g_dnl_set_serialnumber() and only there the
> >> g_dnl_serial is set.
> >>
> >> Please find attached patch (if it fixes siemens boards).
> >
> >> DENX Software Engineering GmbH,      Managing Director: Wolfgang
> >> Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell,
> >> Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email:
> >> wd@denx.de From 5af562a7b43184ea5ab5bb5a18ff3b14f48b2475 Mon Sep
> >> 17 00:00:00 2001 From: Lukasz Majewski <lukma@denx.de>
> >> Date: Mon, 26 Jun 2017 12:15:09 +0200
> >> Subject: [PATCH] usb: gadget: Call g_dnl_bind_fixup() before
> >> testing g_dnl_serial length
> >>
> >> After the commit SHA1: 842778a091 - the serial number descriptor
> >> is only visible when we have non zero length of g_dnl_serial.
> >>
> >> However, on some platforms (e.g. Siemens) the serial number is set
> >> at g_dnl_bind_fixup(), so with the current code we will always
> >> omit the serial (since it is not set).
> >>
> >> This commit moves the g_dnl_bind_fixup() call before the
> >> g_dnl_serial length test.
> >>
> >> Signed-off-by: Lukasz Majewski <lukma@denx.de>
> >
> > looks good to me.
> 
> Acked-by: Heiko Schocher <hs@denx.de>
> 
> @Lukasz: Do you send this as a patch? (Or did I missed it?)

I will send it immediately to ML :-)

> 
> Thanks!
> 
> bye,
> Heiko
> >
> >> ---
> >>   drivers/usb/gadget/g_dnl.c | 3 ++-
> >>   1 file changed, 2 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/drivers/usb/gadget/g_dnl.c
> >> b/drivers/usb/gadget/g_dnl.c index d4bee9b..0491a0e 100644
> >> --- a/drivers/usb/gadget/g_dnl.c
> >> +++ b/drivers/usb/gadget/g_dnl.c
> >> @@ -224,6 +224,8 @@ static int g_dnl_bind(struct usb_composite_dev
> >> *cdev) g_dnl_string_defs[1].id = id;
> >>   	device_desc.iProduct = id;
> >>
> >> +	g_dnl_bind_fixup(&device_desc, cdev->driver->name);
> >> +
> >>   	if (strlen(g_dnl_serial)) {
> >>   		id = usb_string_id(cdev);
> >>   		if (id < 0)
> >> @@ -233,7 +235,6 @@ static int g_dnl_bind(struct usb_composite_dev
> >> *cdev) device_desc.iSerialNumber = id;
> >>   	}
> >>
> >> -	g_dnl_bind_fixup(&device_desc, cdev->driver->name);
> >>   	ret = g_dnl_config_register(cdev);
> >>   	if (ret)
> >>   		goto error;
> >> --
> >> 2.1.4
> >>
> >
> 




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
diff mbox

Patch

From 5af562a7b43184ea5ab5bb5a18ff3b14f48b2475 Mon Sep 17 00:00:00 2001
From: Lukasz Majewski <lukma@denx.de>
Date: Mon, 26 Jun 2017 12:15:09 +0200
Subject: [PATCH] usb: gadget: Call g_dnl_bind_fixup() before testing
 g_dnl_serial length

After the commit SHA1: 842778a091 - the serial number descriptor is only
visible when we have non zero length of g_dnl_serial.

However, on some platforms (e.g. Siemens) the serial number is set at
g_dnl_bind_fixup(), so with the current code we will always omit the
serial (since it is not set).

This commit moves the g_dnl_bind_fixup() call before the g_dnl_serial
length test.

Signed-off-by: Lukasz Majewski <lukma@denx.de>
---
 drivers/usb/gadget/g_dnl.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/gadget/g_dnl.c b/drivers/usb/gadget/g_dnl.c
index d4bee9b..0491a0e 100644
--- a/drivers/usb/gadget/g_dnl.c
+++ b/drivers/usb/gadget/g_dnl.c
@@ -224,6 +224,8 @@  static int g_dnl_bind(struct usb_composite_dev *cdev)
 	g_dnl_string_defs[1].id = id;
 	device_desc.iProduct = id;
 
+	g_dnl_bind_fixup(&device_desc, cdev->driver->name);
+
 	if (strlen(g_dnl_serial)) {
 		id = usb_string_id(cdev);
 		if (id < 0)
@@ -233,7 +235,6 @@  static int g_dnl_bind(struct usb_composite_dev *cdev)
 		device_desc.iSerialNumber = id;
 	}
 
-	g_dnl_bind_fixup(&device_desc, cdev->driver->name);
 	ret = g_dnl_config_register(cdev);
 	if (ret)
 		goto error;
-- 
2.1.4