]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassImpl.c
1. Added EFI_MEDIA_CHANGED and EFI_INVALID_PARAMETER returns in UsbMassReadBlocks().
[mirror_edk2.git] / MdeModulePkg / Bus / Usb / UsbMassStorageDxe / UsbMassImpl.c
index e3f5c763904c358069b3d5bae28350c6425ccc52..71ccfa9d10c2b34008af2c262b0292a42d164042 100644 (file)
@@ -40,10 +40,6 @@ USB_MASS_TRANSPORT *mUsbMassTransport[] = {
   NULL\r
 };\r
 \r
-UINTN mUsbMscInfo  = DEBUG_INFO;\r
-UINTN mUsbMscError = DEBUG_ERROR;\r
-\r
-\r
 /**\r
   Retrieve the media parameters such as disk gemotric for the\r
   device's BLOCK IO protocol.\r
@@ -84,6 +80,7 @@ UsbMassInitMedia (
   Media->ReadOnly         = FALSE;\r
   Media->WriteCaching     = FALSE;\r
   Media->IoAlign          = 0;\r
+  Media->MediaId          = 1;\r
 \r
   //\r
   // Some device may spend several seconds before it is ready.\r
@@ -91,7 +88,7 @@ UsbMassInitMedia (
   //\r
   Status = EFI_SUCCESS;\r
 \r
-  for (Index = 0; Index < USB_BOOT_WAIT_RETRY; Index++) {\r
+  for (Index = 0; Index < USB_BOOT_INIT_MEDIA_RETRY; Index++) {\r
 \r
     Status = UsbBootGetParams (UsbMass);\r
     if ((Status != EFI_MEDIA_CHANGED)\r
@@ -102,7 +99,7 @@ UsbMassInitMedia (
 \r
     Status = UsbBootIsUnitReady (UsbMass);\r
     if (EFI_ERROR (Status)) {\r
-      gBS->Stall (USB_BOOT_UNIT_READY_STALL * (Index + 1));\r
+      gBS->Stall (USB_BOOT_RETRY_UNIT_READY_STALL * (Index + 1));\r
     }\r
 \r
   }\r
@@ -122,15 +119,24 @@ UsbMassInitMedia (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 UsbMassReset (\r
   IN EFI_BLOCK_IO_PROTOCOL    *This,\r
   IN BOOLEAN                  ExtendedVerification\r
   )\r
 {\r
   USB_MASS_DEVICE *UsbMass;\r
+  EFI_TPL         OldTpl;\r
+  EFI_STATUS      Status;\r
+\r
+  OldTpl  = gBS->RaiseTPL (USB_MASS_TPL);\r
 \r
   UsbMass = USB_MASS_DEVICE_FROM_BLOCKIO (This);\r
-  return UsbMass->Transport->Reset (UsbMass->Context, ExtendedVerification);\r
+  Status  = UsbMass->Transport->Reset (UsbMass->Context, ExtendedVerification);\r
+\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
 }\r
 \r
 \r
@@ -154,6 +160,7 @@ UsbMassReset (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 UsbMassReadBlocks (\r
   IN EFI_BLOCK_IO_PROTOCOL    *This,\r
   IN UINT32                   MediaId,\r
@@ -165,8 +172,10 @@ UsbMassReadBlocks (
   USB_MASS_DEVICE     *UsbMass;\r
   EFI_BLOCK_IO_MEDIA  *Media;\r
   EFI_STATUS          Status;\r
+  EFI_TPL             OldTpl;\r
   UINTN               TotalBlock;\r
 \r
+  OldTpl  = gBS->RaiseTPL (USB_MASS_TPL);\r
   UsbMass = USB_MASS_DEVICE_FROM_BLOCKIO (This);\r
   Media   = &UsbMass->BlockIoMedia;\r
 \r
@@ -174,40 +183,57 @@ UsbMassReadBlocks (
   // First, validate the parameters\r
   //\r
   if ((Buffer == NULL) || (BufferSize == 0)) {\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto ON_EXIT;\r
   }\r
 \r
   //\r
-  // If it is a remoable media, such as CD-Rom or Usb-Floppy,\r
-  // if, need to detect the media before each rw, while Usb-Flash\r
-  // needn't. However, it's hard to identify Usb-Floppy between\r
-  // Usb-Flash by now, so detect media every time.\r
+  // If it is a removable media, such as CD-Rom or Usb-Floppy,\r
+  // need to detect the media before each rw. While some of\r
+  // Usb-Flash is marked as removable media.\r
   //\r
-  Status = UsbBootDetectMedia (UsbMass);\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((mUsbMscError, "UsbMassReadBlocks: UsbBootDetectMedia (%r)\n", Status));\r
-    return Status;\r
+  //\r
+  if (Media->RemovableMedia == TRUE) {\r
+    Status = UsbBootDetectMedia (UsbMass);\r
+    if (EFI_ERROR (Status)) {\r
+      DEBUG ((EFI_D_ERROR, "UsbMassReadBlocks: UsbBootDetectMedia (%r)\n", Status));\r
+      goto ON_EXIT;\r
+    }\r
   }\r
 \r
   //\r
   // Make sure BlockSize and LBA is consistent with BufferSize\r
   //\r
   if ((BufferSize % Media->BlockSize) != 0) {\r
-    return EFI_BAD_BUFFER_SIZE;\r
+    Status = EFI_BAD_BUFFER_SIZE;\r
+    goto ON_EXIT;\r
   }\r
 \r
   TotalBlock = BufferSize / Media->BlockSize;\r
 \r
   if (Lba + TotalBlock - 1 > Media->LastBlock) {\r
-    return EFI_BAD_BUFFER_SIZE;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto ON_EXIT;\r
+  }\r
+\r
+  if (!(Media->MediaPresent)) {\r
+    Status = EFI_NO_MEDIA;\r
+    goto ON_EXIT;\r
+  }\r
+\r
+  if (MediaId != Media->MediaId) {\r
+    Status = EFI_MEDIA_CHANGED;\r
+    goto ON_EXIT;\r
   }\r
 \r
   Status = UsbBootReadBlocks (UsbMass, (UINT32) Lba, TotalBlock, Buffer);\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((mUsbMscError, "UsbMassReadBlocks: UsbBootReadBlocks (%r) -> Reset\n", Status));\r
+    DEBUG ((EFI_D_ERROR, "UsbMassReadBlocks: UsbBootReadBlocks (%r) -> Reset\n", Status));\r
     UsbMassReset (This, TRUE);\r
   }\r
 \r
+ON_EXIT:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -232,6 +258,7 @@ UsbMassReadBlocks (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 UsbMassWriteBlocks (\r
   IN EFI_BLOCK_IO_PROTOCOL    *This,\r
   IN UINT32                   MediaId,\r
@@ -243,8 +270,10 @@ UsbMassWriteBlocks (
   USB_MASS_DEVICE     *UsbMass;\r
   EFI_BLOCK_IO_MEDIA  *Media;\r
   EFI_STATUS          Status;\r
+  EFI_TPL             OldTpl;\r
   UINTN               TotalBlock;\r
 \r
+  OldTpl  = gBS->RaiseTPL (USB_MASS_TPL);\r
   UsbMass = USB_MASS_DEVICE_FROM_BLOCKIO (This);\r
   Media   = &UsbMass->BlockIoMedia;\r
 \r
@@ -252,32 +281,47 @@ UsbMassWriteBlocks (
   // First, validate the parameters\r
   //\r
   if ((Buffer == NULL) || (BufferSize == 0)) {\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto ON_EXIT;\r
   }\r
 \r
   //\r
-  // If it is a remoable media, such as CD-Rom or Usb-Floppy,\r
-  // if, need to detect the media before each rw, while Usb-Flash\r
-  // needn't. However, it's hard to identify Usb-Floppy between\r
-  // Usb-Flash by now, so detect media every time.\r
+  // If it is a removable media, such as CD-Rom or Usb-Floppy,\r
+  // need to detect the media before each rw. While some of\r
+  // Usb-Flash is marked as removable media.\r
   //\r
-  Status = UsbBootDetectMedia (UsbMass);\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((mUsbMscError, "UsbMassWriteBlocks: UsbBootDetectMedia (%r)\n", Status));\r
-    return Status;\r
+  //\r
+  if (Media->RemovableMedia == TRUE) {\r
+    Status = UsbBootDetectMedia (UsbMass);\r
+    if (EFI_ERROR (Status)) {\r
+      DEBUG ((EFI_D_ERROR, "UsbMassWriteBlocks: UsbBootDetectMedia (%r)\n", Status));\r
+      goto ON_EXIT;\r
+    }\r
   }\r
 \r
   //\r
   // Make sure BlockSize and LBA is consistent with BufferSize\r
   //\r
   if ((BufferSize % Media->BlockSize) != 0) {\r
-    return EFI_BAD_BUFFER_SIZE;\r
+    Status = EFI_BAD_BUFFER_SIZE;\r
+    goto ON_EXIT;\r
   }\r
 \r
   TotalBlock = BufferSize / Media->BlockSize;\r
 \r
   if (Lba + TotalBlock - 1 > Media->LastBlock) {\r
-    return EFI_BAD_BUFFER_SIZE;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto ON_EXIT;\r
+  }\r
+\r
+  if (!(Media->MediaPresent)) {\r
+    Status = EFI_NO_MEDIA;\r
+    goto ON_EXIT;\r
+  }\r
+\r
+  if (MediaId != Media->MediaId) {\r
+    Status = EFI_MEDIA_CHANGED;\r
+    goto ON_EXIT;\r
   }\r
 \r
   //\r
@@ -286,10 +330,12 @@ UsbMassWriteBlocks (
   //\r
   Status = UsbBootWriteBlocks (UsbMass, (UINT32) Lba, TotalBlock, Buffer);\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((mUsbMscError, "UsbMassWriteBlocks: UsbBootWriteBlocks (%r) -> Reset\n", Status));\r
+    DEBUG ((EFI_D_ERROR, "UsbMassWriteBlocks: UsbBootWriteBlocks (%r) -> Reset\n", Status));\r
     UsbMassReset (This, TRUE);\r
   }\r
 \r
+ON_EXIT:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -304,6 +350,7 @@ UsbMassWriteBlocks (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 UsbMassFlushBlocks (\r
   IN EFI_BLOCK_IO_PROTOCOL  *This\r
   )\r
@@ -376,7 +423,7 @@ USBMassDriverBindingSupported (
     }\r
   }\r
 \r
-  DEBUG ((mUsbMscInfo, "Found a USB mass store device %r\n", Status));\r
+  DEBUG ((EFI_D_INFO, "Found a USB mass store device %r\n", Status));\r
 \r
 ON_EXIT:\r
   gBS->CloseProtocol (\r
@@ -441,7 +488,7 @@ USBMassDriverBindingStart (
   //\r
   Status = UsbIo->UsbGetInterfaceDescriptor (UsbIo, &Interface);\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((mUsbMscError, "USBMassDriverBindingStart: UsbIo->UsbGetInterfaceDescriptor (%r)\n", Status));\r
+    DEBUG ((EFI_D_ERROR, "USBMassDriverBindingStart: UsbIo->UsbGetInterfaceDescriptor (%r)\n", Status));\r
     goto ON_ERROR;\r
   }\r
 \r
@@ -458,7 +505,7 @@ USBMassDriverBindingStart (
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((mUsbMscError, "USBMassDriverBindingStart: Transport->Init (%r)\n", Status));\r
+    DEBUG ((EFI_D_ERROR, "USBMassDriverBindingStart: Transport->Init (%r)\n", Status));\r
     goto ON_ERROR;\r
   }\r
 \r
@@ -482,11 +529,11 @@ USBMassDriverBindingStart (
          (UsbMass->Pdt != USB_PDT_CDROM) &&\r
          (UsbMass->Pdt != USB_PDT_OPTICAL) &&\r
          (UsbMass->Pdt != USB_PDT_SIMPLE_DIRECT)) {\r
-      DEBUG ((mUsbMscError, "USBMassDriverBindingStart: Found an unsupported peripheral type[%d]\n", UsbMass->Pdt));\r
+      DEBUG ((EFI_D_ERROR, "USBMassDriverBindingStart: Found an unsupported peripheral type[%d]\n", UsbMass->Pdt));\r
       goto ON_ERROR;\r
     }\r
   } else if (Status != EFI_NO_MEDIA){\r
-    DEBUG ((mUsbMscError, "USBMassDriverBindingStart: UsbMassInitMedia (%r)\n", Status));\r
+    DEBUG ((EFI_D_ERROR, "USBMassDriverBindingStart: UsbMassInitMedia (%r)\n", Status));\r
     goto ON_ERROR;\r
   }\r
 \r