Implementation of the USB mass storage Bulk-Only Transport protocol,\r
according to USB Mass Storage Class Bulk-Only Transport, Revision 1.0.\r
\r
-Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
-#include "UsbMassBoot.h"\r
-#include "UsbMassBot.h"\r
+#include "UsbMass.h"\r
\r
//\r
// Definition of USB BOT Transport Protocol\r
);\r
if (EFI_ERROR (Status)) {\r
if (USB_IS_ERROR (Result, EFI_USB_ERR_STALL)) {\r
- DEBUG ((EFI_D_INFO, "UsbBotDataTransfer: (%r)\n", Status)); \r
- DEBUG ((EFI_D_INFO, "UsbBotDataTransfer: DataIn Stall\n"));\r
+ DEBUG ((DEBUG_INFO, "UsbBotDataTransfer: (%r)\n", Status));\r
+ DEBUG ((DEBUG_INFO, "UsbBotDataTransfer: DataIn Stall\n"));\r
UsbClearEndpointStall (UsbBot->UsbIo, Endpoint->EndpointAddress);\r
} else if (USB_IS_ERROR (Result, EFI_USB_ERR_NAK)) {\r
Status = EFI_NOT_READY;\r
} else {\r
- DEBUG ((EFI_D_ERROR, "UsbBotDataTransfer: (%r)\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "UsbBotDataTransfer: (%r)\n", Status));\r
}\r
if(Status == EFI_TIMEOUT){\r
UsbBotResetDevice(UsbBot, FALSE);\r
\r
for (Index = 0; Index < USB_BOT_RECV_CSW_RETRY; Index++) {\r
//\r
- // Attemp to the read Command Status Wrapper from bulk in endpoint\r
+ // Attempt to the read Command Status Wrapper from bulk in endpoint\r
//\r
ZeroMem (&Csw, sizeof (USB_BOT_CSW));\r
Result = 0;\r
@param CmdStatus The result of high level command execution\r
\r
@retval EFI_SUCCESS The command is executed successfully.\r
- @retval Other Failed to excute command\r
+ @retval Other Failed to execute command\r
\r
**/\r
EFI_STATUS\r
//\r
Status = UsbBotSendCommand (UsbBot, Cmd, CmdLen, DataDir, DataLen, Lun);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "UsbBotExecCommand: UsbBotSendCommand (%r)\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "UsbBotExecCommand: UsbBotSendCommand (%r)\n", Status));\r
return Status;\r
}\r
\r
//\r
Status = UsbBotGetStatus (UsbBot, DataLen, &Result);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "UsbBotExecCommand: UsbBotGetStatus (%r)\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "UsbBotExecCommand: UsbBotGetStatus (%r)\n", Status));\r
return Status;\r
}\r
\r
UINT32 Result;\r
UINT32 Timeout;\r
\r
- ASSERT (Context);\r
- \r
+ if (Context == NULL || MaxLun == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
UsbBot = (USB_BOT_PROTOCOL *) Context;\r
\r
//\r
- // Issue a class specific Bulk-Only Mass Storage get max lun reqest.\r
+ // Issue a class specific Bulk-Only Mass Storage get max lun request.\r
// according to section 3.2 of USB Mass Storage Class Bulk-Only Transport Spec, v1.0.\r
//\r
Request.RequestType = 0xA1;\r
1,\r
&Result\r
);\r
+ if (EFI_ERROR (Status) || *MaxLun > USB_BOT_MAX_LUN) {\r
+ //\r
+ // If the Get LUN request returns an error or the MaxLun is larger than\r
+ // the maximum LUN value (0x0f) supported by the USB Mass Storage Class\r
+ // Bulk-Only Transport Spec, then set MaxLun to 0.\r
+ //\r
+ // This improves compatibility with USB FLASH drives that have a single LUN\r
+ // and either do not return a max LUN value or return an invalid maximum LUN\r
+ // value.\r
+ //\r
+ *MaxLun = 0;\r
+ }\r
\r
- return Status;\r
+ return EFI_SUCCESS;\r
}\r
\r
/**\r
FreePool (Context);\r
return EFI_SUCCESS;\r
}\r
-\r