[U-Boot] [PATCH v3] usb_storage : scan all interfaces to find a storage device

From: Franck Jullien franck.jullien@gmail.com
Mass storage is not necessary present on interface 0. This patch allow usb_stor_scan to look in every available interface.
Signed-off-by: Franck Jullien franck.jullien@gmail.com ---
v2: create a new function to improve indentation
v3: more indentation improvement
common/usb_storage.c | 45 ++++++++++++++++++++++++++++----------------- 1 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/common/usb_storage.c b/common/usb_storage.c index 1411737..05c96a8 100644 --- a/common/usb_storage.c +++ b/common/usb_storage.c @@ -208,6 +208,30 @@ static unsigned int usb_get_max_lun(struct us_data *us) return (len > 0) ? *result : 0; }
+static int usb_storage_register(struct usb_device *dev, unsigned char iface) +{ + int lun, max_lun, start = usb_max_devs; + int nb_dev = 0; + + if (!usb_storage_probe(dev, iface, &usb_stor[usb_max_devs])) + return nb_dev; + + /* + * OK, it's a storage device. Iterate over its LUNs + * and populate `usb_dev_desc'. + */ + max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]); + for (lun = 0; lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV; lun++) { + usb_dev_desc[usb_max_devs].lun = lun; + if (usb_stor_get_info(dev, &usb_stor[start], + &usb_dev_desc[usb_max_devs]) == 1) { + nb_dev++; + } + } + + return nb_dev; +} + /******************************************************************************* * scan the usb and reports device info * to the user if mode = 1 @@ -215,7 +239,7 @@ static unsigned int usb_get_max_lun(struct us_data *us) */ int usb_stor_scan(int mode) { - unsigned char i; + unsigned char i, iface; struct usb_device *dev;
if (mode == 1) @@ -241,23 +265,10 @@ int usb_stor_scan(int mode) if (dev == NULL) break; /* no more devices available */
- if (usb_storage_probe(dev, 0, &usb_stor[usb_max_devs])) { - /* OK, it's a storage device. Iterate over its LUNs - * and populate `usb_dev_desc'. - */ - int lun, max_lun, start = usb_max_devs; - - max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]); - for (lun = 0; - lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV; - lun++) { - usb_dev_desc[usb_max_devs].lun = lun; - if (usb_stor_get_info(dev, &usb_stor[start], - &usb_dev_desc[usb_max_devs]) == 1) { - usb_max_devs++; - } - } + for (iface = 0; iface < dev->config.no_of_if; iface++) { + usb_max_devs += usb_storage_register(dev, iface); } + /* if storage device */ if (usb_max_devs == USB_MAX_STOR_DEV) { printf("max USB Storage Device reached: %d stopping\n",

On Wednesday, March 04, 2015 at 09:07:00 PM, franck.jullien@gmail.com wrote:
From: Franck Jullien franck.jullien@gmail.com
Mass storage is not necessary present on interface 0. This patch allow usb_stor_scan to look in every available interface.
Signed-off-by: Franck Jullien franck.jullien@gmail.com
Thanks!
Acked-by: Marek Vasut marex@denx.de
Are you OK if I apply this for -next (that is, after 2015.04 is out) ?
Best regards, Marek Vasut

2015-03-05 14:52 GMT+01:00 Marek Vasut marex@denx.de:
On Wednesday, March 04, 2015 at 09:07:00 PM, franck.jullien@gmail.com wrote:
From: Franck Jullien franck.jullien@gmail.com
Mass storage is not necessary present on interface 0. This patch allow usb_stor_scan to look in every available interface.
Signed-off-by: Franck Jullien franck.jullien@gmail.com
Thanks!
Acked-by: Marek Vasut marex@denx.de
Are you OK if I apply this for -next (that is, after 2015.04 is out) ?
Best regards, Marek Vasut
Sure, there is no hurry.
Franck.

On Thursday, March 05, 2015 at 03:11:25 PM, Franck Jullien wrote:
2015-03-05 14:52 GMT+01:00 Marek Vasut marex@denx.de:
On Wednesday, March 04, 2015 at 09:07:00 PM, franck.jullien@gmail.com wrote:
From: Franck Jullien franck.jullien@gmail.com
Mass storage is not necessary present on interface 0. This patch allow usb_stor_scan to look in every available interface.
Signed-off-by: Franck Jullien franck.jullien@gmail.com
Thanks!
Acked-by: Marek Vasut marex@denx.de
Are you OK if I apply this for -next (that is, after 2015.04 is out) ?
Best regards, Marek Vasut
Sure, there is no hurry.
Applied for -next , thanks!
Best regards, Marek Vasut

+Tom
Hi Franck,
On 4 March 2015 at 13:07, franck.jullien@gmail.com wrote:
From: Franck Jullien franck.jullien@gmail.com
Mass storage is not necessary present on interface 0. This patch allow usb_stor_scan to look in every available interface.
Signed-off-by: Franck Jullien franck.jullien@gmail.com
v2: create a new function to improve indentation
v3: more indentation improvement
common/usb_storage.c | 45 ++++++++++++++++++++++++++++----------------- 1 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/common/usb_storage.c b/common/usb_storage.c index 1411737..05c96a8 100644 --- a/common/usb_storage.c +++ b/common/usb_storage.c @@ -208,6 +208,30 @@ static unsigned int usb_get_max_lun(struct us_data *us) return (len > 0) ? *result : 0; }
+static int usb_storage_register(struct usb_device *dev, unsigned char iface) +{
int lun, max_lun, start = usb_max_devs;
int nb_dev = 0;
if (!usb_storage_probe(dev, iface, &usb_stor[usb_max_devs]))
return nb_dev;
/*
* OK, it's a storage device. Iterate over its LUNs
* and populate `usb_dev_desc'.
*/
max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]);
for (lun = 0; lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV; lun++) {
usb_dev_desc[usb_max_devs].lun = lun;
if (usb_stor_get_info(dev, &usb_stor[start],
&usb_dev_desc[usb_max_devs]) == 1) {
nb_dev++;
Should start or usb_max_devs increase here? This will use the same block_dev_desc_t for each device, won't it?
}
}
return nb_dev;
+}
/*******************************************************************************
- scan the usb and reports device info
- to the user if mode = 1
@@ -215,7 +239,7 @@ static unsigned int usb_get_max_lun(struct us_data *us) */ int usb_stor_scan(int mode) {
unsigned char i;
unsigned char i, iface; struct usb_device *dev; if (mode == 1)
@@ -241,23 +265,10 @@ int usb_stor_scan(int mode) if (dev == NULL) break; /* no more devices available */
if (usb_storage_probe(dev, 0, &usb_stor[usb_max_devs])) {
/* OK, it's a storage device. Iterate over its LUNs
* and populate `usb_dev_desc'.
*/
int lun, max_lun, start = usb_max_devs;
max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]);
for (lun = 0;
lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV;
lun++) {
usb_dev_desc[usb_max_devs].lun = lun;
if (usb_stor_get_info(dev, &usb_stor[start],
&usb_dev_desc[usb_max_devs]) == 1) {
usb_max_devs++;
}
}
for (iface = 0; iface < dev->config.no_of_if; iface++) {
usb_max_devs += usb_storage_register(dev, iface); }
/* if storage device */ if (usb_max_devs == USB_MAX_STOR_DEV) { printf("max USB Storage Device reached: %d stopping\n",
-- 1.7.1
Regards, Simon

Hi Simon,
2015-04-17 18:33 GMT+02:00 Simon Glass sjg@chromium.org:
+Tom
Hi Franck,
On 4 March 2015 at 13:07, franck.jullien@gmail.com wrote:
From: Franck Jullien franck.jullien@gmail.com
Mass storage is not necessary present on interface 0. This patch allow usb_stor_scan to look in every available interface.
Signed-off-by: Franck Jullien franck.jullien@gmail.com
v2: create a new function to improve indentation
v3: more indentation improvement
common/usb_storage.c | 45 ++++++++++++++++++++++++++++----------------- 1 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/common/usb_storage.c b/common/usb_storage.c index 1411737..05c96a8 100644 --- a/common/usb_storage.c +++ b/common/usb_storage.c @@ -208,6 +208,30 @@ static unsigned int usb_get_max_lun(struct us_data *us) return (len > 0) ? *result : 0; }
+static int usb_storage_register(struct usb_device *dev, unsigned char iface) +{
int lun, max_lun, start = usb_max_devs;
int nb_dev = 0;
if (!usb_storage_probe(dev, iface, &usb_stor[usb_max_devs]))
return nb_dev;
/*
* OK, it's a storage device. Iterate over its LUNs
* and populate `usb_dev_desc'.
*/
max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]);
for (lun = 0; lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV; lun++) {
usb_dev_desc[usb_max_devs].lun = lun;
if (usb_stor_get_info(dev, &usb_stor[start],
&usb_dev_desc[usb_max_devs]) == 1) {
nb_dev++;
Should start or usb_max_devs increase here? This will use the same block_dev_desc_t for each device, won't it?
Good catch. I'll write a patch when I have some time (or someone can do that). However, I won't be able to test it on hardware because I don't have access to it anymore.
We could also revert this patch. Sorry for my mistake.
Franck.
participants (4)
-
Franck Jullien
-
franck.jullien@gmail.com
-
Marek Vasut
-
Simon Glass