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
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
//\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
\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
\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
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
UsbMassReadBlocks (\r
IN EFI_BLOCK_IO_PROTOCOL *This,\r
IN UINT32 MediaId,\r
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
// 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
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
UsbMassWriteBlocks (\r
IN EFI_BLOCK_IO_PROTOCOL *This,\r
IN UINT32 MediaId,\r
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
// 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
//\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
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
UsbMassFlushBlocks (\r
IN EFI_BLOCK_IO_PROTOCOL *This\r
)\r
}\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
//\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
}\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
(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