mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
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>
This commit is contained in:
parent
f33cdaa4c3
commit
cd749658d5
1 changed files with 28 additions and 17 deletions
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue