Re: [U-Boot] [PATCH v4] usb: kbd: don't fail with iomux

2017-08-08 Thread Bin Meng
Hi Rob,

On Tue, Aug 8, 2017 at 6:48 PM, Rob Clark  wrote:
> On Tue, Aug 8, 2017 at 6:42 AM, Bin Meng  wrote:
>> Hi Rob,
>>
>> On Tue, Aug 8, 2017 at 3:51 AM, Rob Clark  wrote:
>>> stdin might not be set, which would cause iomux_doenv() to fail
>>> therefore causing probe_usb_keyboard() to fail.  Furthermore if we do
>>> have iomux enabled, the sensible thing (in terms of user experience)
>>> would be to simply add ourselves to the list of stdin devices.
>>>
>>> This fixes an issue with usbkbd on dragonboard410c with distro-
>>> bootcmd, where stdin is not set (so stdinname is null).
>>>
>>> Signed-off-by: Rob Clark 
>>> ---
>>> v2: address Bin's review comments
>>> v3: fix fail with free()ing if usbkbd is already in stdin env variable
>>> pointed out by Simon
>>> v4: use if (CONFIG_IS_ENABLED(CONSOLE_MUX)) { ... }
>>>
>>>  common/usb_kbd.c  | 46 +++---
>>>  include/console.h |  2 --
>>>  2 files changed, 31 insertions(+), 17 deletions(-)
>>>
>>> diff --git a/common/usb_kbd.c b/common/usb_kbd.c
>>> index d2d29cc98f..8edeb6c4f5 100644
>>> --- a/common/usb_kbd.c
>>> +++ b/common/usb_kbd.c
>>> @@ -516,23 +516,39 @@ static int probe_usb_keyboard(struct usb_device *dev)
>>> return error;
>>>
>>> stdinname = getenv("stdin");
>>> -#if CONFIG_IS_ENABLED(CONSOLE_MUX)
>>> -   error = iomux_doenv(stdin, stdinname);
>>> -   if (error)
>>> -   return error;
>>> -#else
>>> -   /* Check if this is the standard input device. */
>>> -   if (strcmp(stdinname, DEVNAME))
>>> -   return 1;
>>> +   if (CONFIG_IS_ENABLED(CONSOLE_MUX)) {
>>> +   char *devname = DEVNAME;
>>> +   char *newstdin = NULL;
>>> +   /*
>>> +* stdin might not be set yet.. either way, with console-
>>> +* mux the sensible thing to do is add ourselves to the
>>> +* list of stdio devices:
>>> +*/
>>> +   if (stdinname && !strstr(stdinname, DEVNAME)) {
>>> +   newstdin = malloc(strlen(stdinname) +
>>> + strlen(","DEVNAME) + 1);
>>> +   sprintf(newstdin, "%s,"DEVNAME, stdinname);
>>> +   stdinname = newstdin;
>>> +   } else if (!stdinname) {
>>> +   stdinname = devname;
>>> +   }
>>> +   error = iomux_doenv(stdin, stdinname);
>>> +   free(newstdin);
>>
>> Sorry I should have asked this before: isn't free(devname) OK? In
>> previous version, it has a test logic to see whether free is needed.
>
> it was in the first version of my patch, until I added the &&!strstr()
> bit to avoid adding usbkbd a second time to stdin if stdin already
> contained usbkbd.  Now we have a case where stdinname is the ptr
> returned from getenv() which we probably don't want to free() ;-)
>

Ah yes, I misread the codes. It's free(newstdin) not free(stdinname).
Thanks for the clarification.

Reviewed-by: Bin Meng 

Regards,
Bin
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [PATCH v4] usb: kbd: don't fail with iomux

2017-08-08 Thread Rob Clark
On Tue, Aug 8, 2017 at 6:42 AM, Bin Meng  wrote:
> Hi Rob,
>
> On Tue, Aug 8, 2017 at 3:51 AM, Rob Clark  wrote:
>> stdin might not be set, which would cause iomux_doenv() to fail
>> therefore causing probe_usb_keyboard() to fail.  Furthermore if we do
>> have iomux enabled, the sensible thing (in terms of user experience)
>> would be to simply add ourselves to the list of stdin devices.
>>
>> This fixes an issue with usbkbd on dragonboard410c with distro-
>> bootcmd, where stdin is not set (so stdinname is null).
>>
>> Signed-off-by: Rob Clark 
>> ---
>> v2: address Bin's review comments
>> v3: fix fail with free()ing if usbkbd is already in stdin env variable
>> pointed out by Simon
>> v4: use if (CONFIG_IS_ENABLED(CONSOLE_MUX)) { ... }
>>
>>  common/usb_kbd.c  | 46 +++---
>>  include/console.h |  2 --
>>  2 files changed, 31 insertions(+), 17 deletions(-)
>>
>> diff --git a/common/usb_kbd.c b/common/usb_kbd.c
>> index d2d29cc98f..8edeb6c4f5 100644
>> --- a/common/usb_kbd.c
>> +++ b/common/usb_kbd.c
>> @@ -516,23 +516,39 @@ static int probe_usb_keyboard(struct usb_device *dev)
>> return error;
>>
>> stdinname = getenv("stdin");
>> -#if CONFIG_IS_ENABLED(CONSOLE_MUX)
>> -   error = iomux_doenv(stdin, stdinname);
>> -   if (error)
>> -   return error;
>> -#else
>> -   /* Check if this is the standard input device. */
>> -   if (strcmp(stdinname, DEVNAME))
>> -   return 1;
>> +   if (CONFIG_IS_ENABLED(CONSOLE_MUX)) {
>> +   char *devname = DEVNAME;
>> +   char *newstdin = NULL;
>> +   /*
>> +* stdin might not be set yet.. either way, with console-
>> +* mux the sensible thing to do is add ourselves to the
>> +* list of stdio devices:
>> +*/
>> +   if (stdinname && !strstr(stdinname, DEVNAME)) {
>> +   newstdin = malloc(strlen(stdinname) +
>> + strlen(","DEVNAME) + 1);
>> +   sprintf(newstdin, "%s,"DEVNAME, stdinname);
>> +   stdinname = newstdin;
>> +   } else if (!stdinname) {
>> +   stdinname = devname;
>> +   }
>> +   error = iomux_doenv(stdin, stdinname);
>> +   free(newstdin);
>
> Sorry I should have asked this before: isn't free(devname) OK? In
> previous version, it has a test logic to see whether free is needed.

it was in the first version of my patch, until I added the &&!strstr()
bit to avoid adding usbkbd a second time to stdin if stdin already
contained usbkbd.  Now we have a case where stdinname is the ptr
returned from getenv() which we probably don't want to free() ;-)

BR,
-R

>> +   if (error)
>> +   return error;
>> +   } else {
>> +   /* Check if this is the standard input device. */
>> +   if (strcmp(stdinname, DEVNAME))
>> +   return 1;
>>
>> -   /* Reassign the console */
>> -   if (overwrite_console())
>> -   return 1;
>> +   /* Reassign the console */
>> +   if (overwrite_console())
>> +   return 1;
>>
>> -   error = console_assign(stdin, DEVNAME);
>> -   if (error)
>> -   return error;
>> -#endif
>> +   error = console_assign(stdin, DEVNAME);
>> +   if (error)
>> +   return error;
>> +   }
>>
>> return 0;
>>  }
>> diff --git a/include/console.h b/include/console.h
>> index cea29ed6dc..7dfd36d7d1 100644
>> --- a/include/console.h
>> +++ b/include/console.h
>> @@ -57,8 +57,6 @@ int console_announce_r(void);
>>  /*
>>   * CONSOLE multiplexing.
>>   */
>> -#ifdef CONFIG_CONSOLE_MUX
>>  #include 
>> -#endif
>>
>>  #endif
>> --
>
> Regards,
> Bin
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [PATCH v4] usb: kbd: don't fail with iomux

2017-08-08 Thread Bin Meng
Hi Rob,

On Tue, Aug 8, 2017 at 3:51 AM, Rob Clark  wrote:
> stdin might not be set, which would cause iomux_doenv() to fail
> therefore causing probe_usb_keyboard() to fail.  Furthermore if we do
> have iomux enabled, the sensible thing (in terms of user experience)
> would be to simply add ourselves to the list of stdin devices.
>
> This fixes an issue with usbkbd on dragonboard410c with distro-
> bootcmd, where stdin is not set (so stdinname is null).
>
> Signed-off-by: Rob Clark 
> ---
> v2: address Bin's review comments
> v3: fix fail with free()ing if usbkbd is already in stdin env variable
> pointed out by Simon
> v4: use if (CONFIG_IS_ENABLED(CONSOLE_MUX)) { ... }
>
>  common/usb_kbd.c  | 46 +++---
>  include/console.h |  2 --
>  2 files changed, 31 insertions(+), 17 deletions(-)
>
> diff --git a/common/usb_kbd.c b/common/usb_kbd.c
> index d2d29cc98f..8edeb6c4f5 100644
> --- a/common/usb_kbd.c
> +++ b/common/usb_kbd.c
> @@ -516,23 +516,39 @@ static int probe_usb_keyboard(struct usb_device *dev)
> return error;
>
> stdinname = getenv("stdin");
> -#if CONFIG_IS_ENABLED(CONSOLE_MUX)
> -   error = iomux_doenv(stdin, stdinname);
> -   if (error)
> -   return error;
> -#else
> -   /* Check if this is the standard input device. */
> -   if (strcmp(stdinname, DEVNAME))
> -   return 1;
> +   if (CONFIG_IS_ENABLED(CONSOLE_MUX)) {
> +   char *devname = DEVNAME;
> +   char *newstdin = NULL;
> +   /*
> +* stdin might not be set yet.. either way, with console-
> +* mux the sensible thing to do is add ourselves to the
> +* list of stdio devices:
> +*/
> +   if (stdinname && !strstr(stdinname, DEVNAME)) {
> +   newstdin = malloc(strlen(stdinname) +
> + strlen(","DEVNAME) + 1);
> +   sprintf(newstdin, "%s,"DEVNAME, stdinname);
> +   stdinname = newstdin;
> +   } else if (!stdinname) {
> +   stdinname = devname;
> +   }
> +   error = iomux_doenv(stdin, stdinname);
> +   free(newstdin);

Sorry I should have asked this before: isn't free(devname) OK? In
previous version, it has a test logic to see whether free is needed.

> +   if (error)
> +   return error;
> +   } else {
> +   /* Check if this is the standard input device. */
> +   if (strcmp(stdinname, DEVNAME))
> +   return 1;
>
> -   /* Reassign the console */
> -   if (overwrite_console())
> -   return 1;
> +   /* Reassign the console */
> +   if (overwrite_console())
> +   return 1;
>
> -   error = console_assign(stdin, DEVNAME);
> -   if (error)
> -   return error;
> -#endif
> +   error = console_assign(stdin, DEVNAME);
> +   if (error)
> +   return error;
> +   }
>
> return 0;
>  }
> diff --git a/include/console.h b/include/console.h
> index cea29ed6dc..7dfd36d7d1 100644
> --- a/include/console.h
> +++ b/include/console.h
> @@ -57,8 +57,6 @@ int console_announce_r(void);
>  /*
>   * CONSOLE multiplexing.
>   */
> -#ifdef CONFIG_CONSOLE_MUX
>  #include 
> -#endif
>
>  #endif
> --

Regards,
Bin
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot