[U-Boot] [PATCH v2 1/1] USB: EHCI: Initialize multiple USB controllers at once

Jim Lin jilin at nvidia.com
Mon Aug 13 12:25:44 CEST 2012


>-----Original Message-----
>From: Marek Vasut [mailto:marex at denx.de] 
>Sent: Sunday, August 12, 2012 7:47 AM
>To: Jim Lin
>Cc: u-boot at lists.denx.de; Wolfgang Denk; Tom Warren
>Subject: Re: [U-Boot] [PATCH v2 1/1] USB: EHCI: Initialize multiple USB controllers at once
>
>> diff --git a/common/cmd_usb.c b/common/cmd_usb.c index 
>> a8e3ae5..8d3093b 100644
>> --- a/common/cmd_usb.c
>> +++ b/common/cmd_usb.c
>> @@ -554,7 +554,17 @@ int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, 
>> char
>> * const argv[]) }
>>         if (strncmp(argv[1], "tree", 4) == 0) {
>>                 printf("\nDevice Tree:\n");
>> +#ifdef CONFIG_USB_MULTI
>
>How's this supposed to work? Shouldn't this call usb_show_tree on roots of all the trees?

You see the following  if dev->parent is NULL that means it's the only root hub under a controller
, then we show devices under this root hub of the controller by usb_show_tree.
Root hub under different controller is listed as separate device.

>> +               for (i = 0; i < USB_MAX_DEVICE; i++) {
>> +                       dev = usb_get_dev_index(i);
>> +                       if (dev == NULL)
>> +                               break;
>> +                       if (dev->parent == NULL)
>> +                               usb_show_tree(dev);
>> +               }
>> +#else
>>                 usb_show_tree(usb_get_dev_index(0));
>> +#endif
>>                 return 0;
>>         }
>>         if (strncmp(argv[1], "inf", 3) == 0) { diff --git 
>> a/common/usb.c b/common/usb.c index 1b40228..065c70c 100644
>> --- a/common/usb.c
>> +++ b/common/usb.c
>
>> +#endif
>> +       USB_PRINTF("scan end\n");
>> +               usb_started = 1;
>> +               return 0;
>> +       } else {
>> +               printf("Error, couldn't init Lowlevel part\n");
>> +               usb_started = 0;
>> +               return -1;
>> +       }
>> +}
>> +
>> +/********************************************************************
>> +*****
>> ***** + * Stop USB this stops the LowLevel Part and deregisters USB 
>> devices. + */
>> +int usb_stop(void)
>> +{
>> +       int i;
>> +
>> +       if (usb_started) {
>> +               asynch_allowed = 1;
>> +               usb_started = 0;
>> +               usb_hub_reset();
>> +               for (i = 0; i < CONFIG_USB_MAX_CONTROLLER_COUNT; i++)
>> +                       usb_lowlevel_stop(i);
>> +       }
>> +       return 0;
>> +}
>> +#else
>>  /**********************************************************************
>>   * some forward declerations...
>>   */
>> @@ -127,6 +210,7 @@ int usb_stop(void)
>>         }
>>         return res;
>>  }
>> +#endif
>> 
>>  /*
>>   * disables the asynch behaviour of the control message. This is used 
>> for data @@ -750,11 +834,18 @@ struct usb_device 
>> *usb_get_dev_index(int index) return &usb_dev[index];  }
>> 
>> -
>> +#ifdef CONFIG_USB_MULTI
>
>I still believe it's possible to get rid of this MULTI crap, simply set the "multiness" to 1 for non-multi setups. How big overhead will that generate?
I assume you want me to use code in ifdef CONFIG_USB_MULTI block,
remove CONFIG_USB_MULTI and if  CONFIG_USB_MAX_CONTROLLER_COUNT is 1
, then do non-multi setups.

nvpublic


More information about the U-Boot mailing list