MdeModulePkg/UsbMassStorageDxe: Check Get Max LUN status/value
https://bugzilla.tianocore.org/show_bug.cgi?id=767 If a USB Mass Storage device does not support the Get Max LUN command, then the USB I/O Protocol ControlTransfer() service may return an error. If an error is returned for this command, then assume that the device does not support multiple LUNs and return a maximum LUN value of 0. The USB Mass Storage Class Specification states that a maximum LUN value larger than 0x0F is invalid. Add a check to make sure this maximum LUN value is in this valid range, and if it is not, then assume that the device does not support multiple LUNs and return a maximum LUN value of 0. This change improves compatibility with USB FLASH drives that do not support the Get Max LUN command or return an invalid maximum LUN value. Cc: Star Zeng <star.zeng@intel.com> Cc: Eric Dong <eric.dong@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
parent
b4e96b82b4
commit
8d92f819f5
|
@ -2,7 +2,7 @@
|
||||||
Implementation of the USB mass storage Bulk-Only Transport protocol,
|
Implementation of the USB mass storage Bulk-Only Transport protocol,
|
||||||
according to USB Mass Storage Class Bulk-Only Transport, Revision 1.0.
|
according to USB Mass Storage Class Bulk-Only Transport, Revision 1.0.
|
||||||
|
|
||||||
Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -552,7 +552,9 @@ UsbBotGetMaxLun (
|
||||||
UINT32 Result;
|
UINT32 Result;
|
||||||
UINT32 Timeout;
|
UINT32 Timeout;
|
||||||
|
|
||||||
ASSERT (Context);
|
if (Context == NULL || MaxLun == NULL) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
UsbBot = (USB_BOT_PROTOCOL *) Context;
|
UsbBot = (USB_BOT_PROTOCOL *) Context;
|
||||||
|
|
||||||
|
@ -576,8 +578,20 @@ UsbBotGetMaxLun (
|
||||||
1,
|
1,
|
||||||
&Result
|
&Result
|
||||||
);
|
);
|
||||||
|
if (EFI_ERROR (Status) || *MaxLun > USB_BOT_MAX_LUN) {
|
||||||
|
//
|
||||||
|
// If the Get LUN request returns an error or the MaxLun is larger than
|
||||||
|
// the maximum LUN value (0x0f) supported by the USB Mass Storage Class
|
||||||
|
// Bulk-Only Transport Spec, then set MaxLun to 0.
|
||||||
|
//
|
||||||
|
// This improves compatibility with USB FLASH drives that have a single LUN
|
||||||
|
// and either do not return a max LUN value or return an invalid maximum LUN
|
||||||
|
// value.
|
||||||
|
//
|
||||||
|
*MaxLun = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return Status;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue