]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassBot.c
MdeModulePkg: Change use of EFI_D_* to DEBUG_*
[mirror_edk2.git] / MdeModulePkg / Bus / Usb / UsbMassStorageDxe / UsbMassBot.c
index ab669463c8c1b62a43e7eb3ca82fc19251c36bfd..ce252e60fc4ee2c020a8c4e19aba2c085a71bdac 100644 (file)
@@ -2,19 +2,12 @@
   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 - 2008, Intel Corporation\r
-All rights reserved. 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
@@ -273,9 +266,16 @@ UsbBotDataTransfer (
                             );\r
   if (EFI_ERROR (Status)) {\r
     if (USB_IS_ERROR (Result, EFI_USB_ERR_STALL)) {\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 ((DEBUG_ERROR, "UsbBotDataTransfer: (%r)\n", Status));\r
+    }\r
+    if(Status == EFI_TIMEOUT){\r
+      UsbBotResetDevice(UsbBot, FALSE);\r
     }\r
   }\r
 \r
@@ -326,7 +326,7 @@ UsbBotGetStatus (
 \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
@@ -386,7 +386,7 @@ UsbBotGetStatus (
   @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
@@ -416,7 +416,7 @@ UsbBotExecCommand (
   //\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
@@ -433,7 +433,7 @@ UsbBotExecCommand (
   //\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
@@ -477,7 +477,7 @@ UsbBotResetDevice (
     //\r
     Status = UsbBot->UsbIo->UsbPortReset (UsbBot->UsbIo);\r
     if (EFI_ERROR (Status)) {\r
-      return Status;\r
+      return EFI_DEVICE_ERROR;\r
     }\r
   }\r
 \r
@@ -503,7 +503,7 @@ UsbBotResetDevice (
                             );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
   //\r
@@ -546,12 +546,14 @@ UsbBotGetMaxLun (
   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
@@ -570,8 +572,20 @@ UsbBotGetMaxLun (
                             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
@@ -590,4 +604,3 @@ UsbBotCleanUp (
   FreePool (Context);\r
   return EFI_SUCCESS;\r
 }\r
-\r