mirror of https://github.com/acidanthera/audk.git
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,
|
||||
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
|
||||
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
|
||||
|
@ -552,8 +552,10 @@ UsbBotGetMaxLun (
|
|||
UINT32 Result;
|
||||
UINT32 Timeout;
|
||||
|
||||
ASSERT (Context);
|
||||
|
||||
if (Context == NULL || MaxLun == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
UsbBot = (USB_BOT_PROTOCOL *) Context;
|
||||
|
||||
//
|
||||
|
@ -576,8 +578,20 @@ UsbBotGetMaxLun (
|
|||
1,
|
||||
&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