summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorFranck Jullien <franck.jullien@gmail.com>2015-03-04 21:07:00 +0100
committerMarek Vasut <marex@denx.de>2015-04-14 05:47:47 +0200
commitcd749658d5994978579628a6333e5c2a6c8ec632 (patch)
treefc7ee8f5808de7f10d8c838963820c3c893b1b21 /common
parentf33cdaa4c3da4a8fd35aa2f9a3172f31cc887b35 (diff)
downloadu-boot-imx-cd749658d5994978579628a6333e5c2a6c8ec632.zip
u-boot-imx-cd749658d5994978579628a6333e5c2a6c8ec632.tar.gz
u-boot-imx-cd749658d5994978579628a6333e5c2a6c8ec632.tar.bz2
usb_storage : scan all interfaces to find a storage device
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>
Diffstat (limited to 'common')
-rw-r--r--common/usb_storage.c45
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",