]> 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 f077e2aaad1e263cbc16acaff0110f8b9c9a8f56..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
@@ -102,7 +99,7 @@ UsbMassInitMedia (
 \r
     Status = UsbBootIsUnitReady (UsbMass);\r
     if (EFI_ERROR (Status)) {\r
-      gBS->Stall (USB_BOOT_RETRY_UNIT_READY_STALL * (Index + 1)); \r
+      gBS->Stall (USB_BOOT_RETRY_UNIT_READY_STALL * (Index + 1));\r
     }\r
 \r
   }\r
@@ -122,6 +119,7 @@ UsbMassInitMedia (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 UsbMassReset (\r
   IN EFI_BLOCK_IO_PROTOCOL    *This,\r
   IN BOOLEAN                  ExtendedVerification\r
@@ -162,6 +160,7 @@ UsbMassReset (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 UsbMassReadBlocks (\r
   IN EFI_BLOCK_IO_PROTOCOL    *This,\r
   IN UINT32                   MediaId,\r
@@ -175,7 +174,7 @@ UsbMassReadBlocks (
   EFI_STATUS          Status;\r
   EFI_TPL             OldTpl;\r
   UINTN               TotalBlock;\r
-  \r
+\r
   OldTpl  = gBS->RaiseTPL (USB_MASS_TPL);\r
   UsbMass = USB_MASS_DEVICE_FROM_BLOCKIO (This);\r
   Media   = &UsbMass->BlockIoMedia;\r
@@ -187,21 +186,21 @@ UsbMassReadBlocks (
     Status = EFI_INVALID_PARAMETER;\r
     goto ON_EXIT;\r
   }\r
-  \r
+\r
   //\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
+  // need to detect the media before each rw. While some of\r
   // Usb-Flash is marked as removable media.\r
-  // \r
-  // \r
+  //\r
+  //\r
   if (Media->RemovableMedia == TRUE) {\r
     Status = UsbBootDetectMedia (UsbMass);\r
     if (EFI_ERROR (Status)) {\r
-      DEBUG ((mUsbMscError, "UsbMassReadBlocks: UsbBootDetectMedia (%r)\n", Status));\r
+      DEBUG ((EFI_D_ERROR, "UsbMassReadBlocks: UsbBootDetectMedia (%r)\n", Status));\r
       goto ON_EXIT;\r
-    } \r
+    }\r
   }\r
-  \r
+\r
   //\r
   // Make sure BlockSize and LBA is consistent with BufferSize\r
   //\r
@@ -213,13 +212,23 @@ UsbMassReadBlocks (
   TotalBlock = BufferSize / Media->BlockSize;\r
 \r
   if (Lba + TotalBlock - 1 > Media->LastBlock) {\r
-    Status = 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
   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
@@ -249,6 +258,7 @@ ON_EXIT:
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 UsbMassWriteBlocks (\r
   IN EFI_BLOCK_IO_PROTOCOL    *This,\r
   IN UINT32                   MediaId,\r
@@ -274,21 +284,21 @@ UsbMassWriteBlocks (
     Status = EFI_INVALID_PARAMETER;\r
     goto ON_EXIT;\r
   }\r
-  \r
+\r
   //\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
+  // need to detect the media before each rw. While some of\r
   // Usb-Flash is marked as removable media.\r
-  // \r
-  // \r
+  //\r
+  //\r
   if (Media->RemovableMedia == TRUE) {\r
     Status = UsbBootDetectMedia (UsbMass);\r
     if (EFI_ERROR (Status)) {\r
-      DEBUG ((mUsbMscError, "UsbMassWriteBlocks: UsbBootDetectMedia (%r)\n", Status));\r
+      DEBUG ((EFI_D_ERROR, "UsbMassWriteBlocks: UsbBootDetectMedia (%r)\n", Status));\r
       goto ON_EXIT;\r
-    } \r
+    }\r
   }\r
-  \r
+\r
   //\r
   // Make sure BlockSize and LBA is consistent with BufferSize\r
   //\r
@@ -300,20 +310,30 @@ UsbMassWriteBlocks (
   TotalBlock = BufferSize / Media->BlockSize;\r
 \r
   if (Lba + TotalBlock - 1 > Media->LastBlock) {\r
-    Status = EFI_BAD_BUFFER_SIZE;\r
+    Status = EFI_INVALID_PARAMETER;\r
     goto ON_EXIT;\r
   }\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
   // Try to write the data even the device is marked as ReadOnly,\r
   // and clear the status should the write succeed.\r
   //\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
+\r
 ON_EXIT:\r
   gBS->RestoreTPL (OldTpl);\r
   return Status;\r
@@ -330,6 +350,7 @@ ON_EXIT:
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 UsbMassFlushBlocks (\r
   IN EFI_BLOCK_IO_PROTOCOL  *This\r
   )\r
@@ -402,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
@@ -467,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
@@ -484,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
@@ -508,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