From: Ruiyu Ni <ruiyu.ni@intel.com>
To: edk2-devel@lists.01.org
Cc: Star Zeng <star.zeng@intel.com>
Subject: [PATCH v2 01/12] MdeModulePkg/UsbMass: Merge UsbBoot(Read|Write)Blocks(16)
Date: Tue, 16 Oct 2018 13:43:24 +0800 [thread overview]
Message-ID: <20181016054335.47460-2-ruiyu.ni@intel.com> (raw)
In-Reply-To: <20181016054335.47460-1-ruiyu.ni@intel.com>
The change doesn't have functionality impact.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
---
.../Bus/Usb/UsbMassStorageDxe/UsbMassBoot.c | 248 +++++----------------
.../Bus/Usb/UsbMassStorageDxe/UsbMassBoot.h | 76 ++-----
.../Bus/Usb/UsbMassStorageDxe/UsbMassImpl.c | 8 +-
3 files changed, 80 insertions(+), 252 deletions(-)
diff --git a/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassBoot.c b/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassBoot.c
index dd5950c54c..07a376440c 100644
--- a/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassBoot.c
+++ b/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassBoot.c
@@ -792,32 +792,34 @@ UsbBootDetectMedia (
/**
- Read some blocks from the device.
+ Read or write some blocks from the device.
- @param UsbMass The USB mass storage device to read from
+ @param UsbMass The USB mass storage device to access
+ @param Write TRUE for write operation.
@param Lba The start block number
- @param TotalBlock Total block number to read
- @param Buffer The buffer to read to
+ @param TotalBlock Total block number to read or write
+ @param Buffer The buffer to read to or write from
- @retval EFI_SUCCESS Data are read into the buffer
- @retval Others Failed to read all the data
+ @retval EFI_SUCCESS Data are read into the buffer or writen into the device.
+ @retval Others Failed to read or write all the data
**/
EFI_STATUS
-UsbBootReadBlocks (
+UsbBootReadWriteBlocks (
IN USB_MASS_DEVICE *UsbMass,
+ IN BOOLEAN Write,
IN UINT32 Lba,
IN UINTN TotalBlock,
- OUT UINT8 *Buffer
+ IN OUT UINT8 *Buffer
)
{
- USB_BOOT_READ10_CMD ReadCmd;
- EFI_STATUS Status;
- UINT16 Count;
- UINT16 CountMax;
- UINT32 BlockSize;
- UINT32 ByteSize;
- UINT32 Timeout;
+ USB_BOOT_READ_WRITE_10_CMD Cmd;
+ EFI_STATUS Status;
+ UINT16 Count;
+ UINT16 CountMax;
+ UINT32 BlockSize;
+ UINT32 ByteSize;
+ UINT32 Timeout;
BlockSize = UsbMass->BlockIoMedia.BlockSize;
CountMax = (UINT16)(USB_BOOT_MAX_CARRY_SIZE / BlockSize);
@@ -840,17 +842,17 @@ UsbBootReadBlocks (
//
// Fill in the command then execute
//
- ZeroMem (&ReadCmd, sizeof (USB_BOOT_READ10_CMD));
+ ZeroMem (&Cmd, sizeof (USB_BOOT_READ_WRITE_10_CMD));
- ReadCmd.OpCode = USB_BOOT_READ10_OPCODE;
- ReadCmd.Lun = (UINT8) (USB_BOOT_LUN (UsbMass->Lun));
- WriteUnaligned32 ((UINT32 *) ReadCmd.Lba, SwapBytes32 (Lba));
- WriteUnaligned16 ((UINT16 *) ReadCmd.TransferLen, SwapBytes16 (Count));
+ Cmd.OpCode = Write ? USB_BOOT_WRITE10_OPCODE : USB_BOOT_READ10_OPCODE;
+ Cmd.Lun = (UINT8) (USB_BOOT_LUN (UsbMass->Lun));
+ WriteUnaligned32 ((UINT32 *) Cmd.Lba, SwapBytes32 (Lba));
+ WriteUnaligned16 ((UINT16 *) Cmd.TransferLen, SwapBytes16 (Count));
Status = UsbBootExecCmdWithRetry (
UsbMass,
- &ReadCmd,
- (UINT8) sizeof (USB_BOOT_READ10_CMD),
+ &Cmd,
+ (UINT8) sizeof (USB_BOOT_READ_WRITE_10_CMD),
EfiUsbDataIn,
Buffer,
ByteSize,
@@ -859,86 +861,11 @@ UsbBootReadBlocks (
if (EFI_ERROR (Status)) {
return Status;
}
- DEBUG ((EFI_D_BLKIO, "UsbBootReadBlocks: LBA (0x%x), Blk (0x%x)\n", Lba, Count));
- Lba += Count;
- Buffer += Count * BlockSize;
- TotalBlock -= Count;
- }
-
- return Status;
-}
-
-
-/**
- Write some blocks to the device.
-
- @param UsbMass The USB mass storage device to write to
- @param Lba The start block number
- @param TotalBlock Total block number to write
- @param Buffer Pointer to the source buffer for the data.
-
- @retval EFI_SUCCESS Data are written into the buffer
- @retval Others Failed to write all the data
-
-**/
-EFI_STATUS
-UsbBootWriteBlocks (
- IN USB_MASS_DEVICE *UsbMass,
- IN UINT32 Lba,
- IN UINTN TotalBlock,
- IN UINT8 *Buffer
- )
-{
- USB_BOOT_WRITE10_CMD WriteCmd;
- EFI_STATUS Status;
- UINT16 Count;
- UINT16 CountMax;
- UINT32 BlockSize;
- UINT32 ByteSize;
- UINT32 Timeout;
-
- BlockSize = UsbMass->BlockIoMedia.BlockSize;
- CountMax = (UINT16)(USB_BOOT_MAX_CARRY_SIZE / BlockSize);
- Status = EFI_SUCCESS;
-
- while (TotalBlock > 0) {
- //
- // Split the total blocks into smaller pieces to ease the pressure
- // on the device. We must split the total block because the WRITE10
- // command only has 16 bit transfer length (in the unit of block).
- //
- Count = (UINT16)((TotalBlock < CountMax) ? TotalBlock : CountMax);
- ByteSize = (UINT32)Count * BlockSize;
-
- //
- // USB command's upper limit timeout is 5s. [USB2.0-9.2.6.1]
- //
- Timeout = (UINT32) USB_BOOT_GENERAL_CMD_TIMEOUT;
-
- //
- // Fill in the write10 command block
- //
- ZeroMem (&WriteCmd, sizeof (USB_BOOT_WRITE10_CMD));
-
- WriteCmd.OpCode = USB_BOOT_WRITE10_OPCODE;
- WriteCmd.Lun = (UINT8) (USB_BOOT_LUN (UsbMass->Lun));
- WriteUnaligned32 ((UINT32 *) WriteCmd.Lba, SwapBytes32 (Lba));
- WriteUnaligned16 ((UINT16 *) WriteCmd.TransferLen, SwapBytes16 (Count));
-
- Status = UsbBootExecCmdWithRetry (
- UsbMass,
- &WriteCmd,
- (UINT8) sizeof (USB_BOOT_WRITE10_CMD),
- EfiUsbDataOut,
- Buffer,
- ByteSize,
- Timeout
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- DEBUG ((EFI_D_BLKIO, "UsbBootWriteBlocks: LBA (0x%x), Blk (0x%x)\n", Lba, Count));
-
+ DEBUG ((
+ DEBUG_BLKIO, "UsbBoot%sBlocks: LBA (0x%lx), Blk (0x%x)\n",
+ Write ? L"Write" : L"Read",
+ Lba, Count
+ ));
Lba += Count;
Buffer += Count * BlockSize;
TotalBlock -= Count;
@@ -948,26 +875,27 @@ UsbBootWriteBlocks (
}
/**
- Read some blocks from the device by SCSI 16 byte cmd.
+ Read or write some blocks from the device by SCSI 16 byte cmd.
- @param UsbMass The USB mass storage device to read from
+ @param UsbMass The USB mass storage device to access
+ @param Write TRUE for write operation.
@param Lba The start block number
- @param TotalBlock Total block number to read
- @param Buffer The buffer to read to
-
- @retval EFI_SUCCESS Data are read into the buffer
- @retval Others Failed to read all the data
+ @param TotalBlock Total block number to read or write
+ @param Buffer The buffer to read to or write from
+ @retval EFI_SUCCESS Data are read into the buffer or writen into the device.
+ @retval Others Failed to read or write all the data
**/
EFI_STATUS
-UsbBootReadBlocks16 (
+UsbBootReadWriteBlocks16 (
IN USB_MASS_DEVICE *UsbMass,
+ IN BOOLEAN Write,
IN UINT64 Lba,
IN UINTN TotalBlock,
- OUT UINT8 *Buffer
+ IN OUT UINT8 *Buffer
)
{
- UINT8 ReadCmd[16];
+ UINT8 Cmd[16];
EFI_STATUS Status;
UINT16 Count;
UINT16 CountMax;
@@ -994,17 +922,17 @@ UsbBootReadBlocks16 (
//
// Fill in the command then execute
//
- ZeroMem (ReadCmd, sizeof (ReadCmd));
+ ZeroMem (Cmd, sizeof (Cmd));
- ReadCmd[0] = EFI_SCSI_OP_READ16;
- ReadCmd[1] = (UINT8) ((USB_BOOT_LUN (UsbMass->Lun) & 0xE0));
- WriteUnaligned64 ((UINT64 *) &ReadCmd[2], SwapBytes64 (Lba));
- WriteUnaligned32 ((UINT32 *) &ReadCmd[10], SwapBytes32 (Count));
+ Cmd[0] = Write ? EFI_SCSI_OP_WRITE16 : EFI_SCSI_OP_READ16;
+ Cmd[1] = (UINT8) ((USB_BOOT_LUN (UsbMass->Lun) & 0xE0));
+ WriteUnaligned64 ((UINT64 *) &Cmd[2], SwapBytes64 (Lba));
+ WriteUnaligned32 ((UINT32 *) &Cmd[10], SwapBytes32 (Count));
Status = UsbBootExecCmdWithRetry (
UsbMass,
- ReadCmd,
- (UINT8) sizeof (ReadCmd),
+ Cmd,
+ (UINT8) sizeof (Cmd),
EfiUsbDataIn,
Buffer,
ByteSize,
@@ -1013,83 +941,11 @@ UsbBootReadBlocks16 (
if (EFI_ERROR (Status)) {
return Status;
}
- DEBUG ((EFI_D_BLKIO, "UsbBootReadBlocks16: LBA (0x%lx), Blk (0x%x)\n", Lba, Count));
- Lba += Count;
- Buffer += Count * BlockSize;
- TotalBlock -= Count;
- }
-
- return Status;
-}
-
-
-/**
- Write some blocks to the device by SCSI 16 byte cmd.
-
- @param UsbMass The USB mass storage device to write to
- @param Lba The start block number
- @param TotalBlock Total block number to write
- @param Buffer Pointer to the source buffer for the data.
-
- @retval EFI_SUCCESS Data are written into the buffer
- @retval Others Failed to write all the data
-
-**/
-EFI_STATUS
-UsbBootWriteBlocks16 (
- IN USB_MASS_DEVICE *UsbMass,
- IN UINT64 Lba,
- IN UINTN TotalBlock,
- IN UINT8 *Buffer
- )
-{
- UINT8 WriteCmd[16];
- EFI_STATUS Status;
- UINT16 Count;
- UINT16 CountMax;
- UINT32 BlockSize;
- UINT32 ByteSize;
- UINT32 Timeout;
-
- BlockSize = UsbMass->BlockIoMedia.BlockSize;
- CountMax = (UINT16)(USB_BOOT_MAX_CARRY_SIZE / BlockSize);
- Status = EFI_SUCCESS;
-
- while (TotalBlock > 0) {
- //
- // Split the total blocks into smaller pieces.
- //
- Count = (UINT16)((TotalBlock < CountMax) ? TotalBlock : CountMax);
- ByteSize = (UINT32)Count * BlockSize;
-
- //
- // USB command's upper limit timeout is 5s. [USB2.0-9.2.6.1]
- //
- Timeout = (UINT32) USB_BOOT_GENERAL_CMD_TIMEOUT;
-
- //
- // Fill in the write16 command block
- //
- ZeroMem (WriteCmd, sizeof (WriteCmd));
-
- WriteCmd[0] = EFI_SCSI_OP_WRITE16;
- WriteCmd[1] = (UINT8) ((USB_BOOT_LUN (UsbMass->Lun) & 0xE0));
- WriteUnaligned64 ((UINT64 *) &WriteCmd[2], SwapBytes64 (Lba));
- WriteUnaligned32 ((UINT32 *) &WriteCmd[10], SwapBytes32 (Count));
-
- Status = UsbBootExecCmdWithRetry (
- UsbMass,
- WriteCmd,
- (UINT8) sizeof (WriteCmd),
- EfiUsbDataOut,
- Buffer,
- ByteSize,
- Timeout
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- DEBUG ((EFI_D_BLKIO, "UsbBootWriteBlocks: LBA (0x%lx), Blk (0x%x)\n", Lba, Count));
+ DEBUG ((
+ DEBUG_BLKIO, "UsbBoot%sBlocks16: LBA (0x%lx), Blk (0x%x)\n",
+ Write ? L"Write" : L"Read",
+ Lba, Count
+ ));
Lba += Count;
Buffer += Count * BlockSize;
TotalBlock -= Count;
diff --git a/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassBoot.h b/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassBoot.h
index d4042e320d..3f8213b3d7 100644
--- a/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassBoot.h
+++ b/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassBoot.h
@@ -161,17 +161,7 @@ typedef struct {
UINT8 TransferLen[2]; ///< Transfer length
UINT8 Reserverd1;
UINT8 Pad[2];
-} USB_BOOT_READ10_CMD;
-
-typedef struct {
- UINT8 OpCode;
- UINT8 Lun;
- UINT8 Lba[4];
- UINT8 Reserved0;
- UINT8 TransferLen[2];
- UINT8 Reserverd1;
- UINT8 Pad[2];
-} USB_BOOT_WRITE10_CMD;
+} USB_BOOT_READ_WRITE_10_CMD;
typedef struct {
UINT8 OpCode;
@@ -292,66 +282,48 @@ UsbBootReadBlocks (
);
/**
- Write some blocks to the device.
+ Read or write some blocks from the device.
- @param UsbMass The USB mass storage device to write to
+ @param UsbMass The USB mass storage device to access
+ @param Write TRUE for write operation.
@param Lba The start block number
- @param TotalBlock Total block number to write
- @param Buffer Pointer to the source buffer for the data.
+ @param TotalBlock Total block number to read or write
+ @param Buffer The buffer to read to or write from
- @retval EFI_SUCCESS Data are written into the buffer
- @retval Others Failed to write all the data
+ @retval EFI_SUCCESS Data are read into the buffer or writen into the device.
+ @retval Others Failed to read or write all the data
**/
EFI_STATUS
-UsbBootWriteBlocks (
- IN USB_MASS_DEVICE *UsbMass,
- IN UINT32 Lba,
- IN UINTN TotalBlock,
- IN UINT8 *Buffer
+UsbBootReadWriteBlocks (
+ IN USB_MASS_DEVICE *UsbMass,
+ IN BOOLEAN Write,
+ IN UINT32 Lba,
+ IN UINTN TotalBlock,
+ IN OUT UINT8 *Buffer
);
/**
- Read some blocks from the device by SCSI 16 byte cmd.
+ Read or write some blocks from the device by SCSI 16 byte cmd
- @param UsbMass The USB mass storage device to read from
+ @param UsbMass The USB mass storage device to access
+ @param Write TRUE for write operation.
@param Lba The start block number
- @param TotalBlock Total block number to read
- @param Buffer The buffer to read to
-
- @retval EFI_SUCCESS Data are read into the buffer
- @retval Others Failed to read all the data
+ @param TotalBlock Total block number to read or write
+ @param Buffer The buffer to read to or write from
+ @retval EFI_SUCCESS Data are read into the buffer or writen into the device.
+ @retval Others Failed to read or write all the data
**/
EFI_STATUS
-UsbBootReadBlocks16 (
+UsbBootReadWriteBlocks16 (
IN USB_MASS_DEVICE *UsbMass,
+ IN BOOLEAN Write,
IN UINT64 Lba,
IN UINTN TotalBlock,
- OUT UINT8 *Buffer
+ IN OUT UINT8 *Buffer
);
-/**
- Write some blocks to the device by SCSI 16 byte cmd.
-
- @param UsbMass The USB mass storage device to write to
- @param Lba The start block number
- @param TotalBlock Total block number to write
- @param Buffer Pointer to the source buffer for the data.
-
- @retval EFI_SUCCESS Data are written into the buffer
- @retval Others Failed to write all the data
-
-**/
-EFI_STATUS
-UsbBootWriteBlocks16 (
- IN USB_MASS_DEVICE *UsbMass,
- IN UINT64 Lba,
- IN UINTN TotalBlock,
- IN UINT8 *Buffer
- );
-
-
/**
Use the USB clear feature control transfer to clear the endpoint stall condition.
diff --git a/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassImpl.c b/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassImpl.c
index 62bf3c5883..9413b00680 100644
--- a/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassImpl.c
+++ b/MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassImpl.c
@@ -172,9 +172,9 @@ UsbMassReadBlocks (
}
if (UsbMass->Cdb16Byte) {
- Status = UsbBootReadBlocks16 (UsbMass, Lba, TotalBlock, Buffer);
+ Status = UsbBootReadWriteBlocks16 (UsbMass, FALSE, Lba, TotalBlock, Buffer);
} else {
- Status = UsbBootReadBlocks (UsbMass, (UINT32) Lba, TotalBlock, Buffer);
+ Status = UsbBootReadWriteBlocks (UsbMass, FALSE, (UINT32) Lba, TotalBlock, Buffer);
}
if (EFI_ERROR (Status)) {
@@ -292,9 +292,9 @@ UsbMassWriteBlocks (
// and clear the status should the write succeed.
//
if (UsbMass->Cdb16Byte) {
- Status = UsbBootWriteBlocks16 (UsbMass, Lba, TotalBlock, Buffer);
+ Status = UsbBootReadWriteBlocks16 (UsbMass, TRUE, Lba, TotalBlock, Buffer);
} else {
- Status = UsbBootWriteBlocks (UsbMass, (UINT32) Lba, TotalBlock, Buffer);
+ Status = UsbBootReadWriteBlocks (UsbMass, TRUE, (UINT32) Lba, TotalBlock, Buffer);
}
if (EFI_ERROR (Status)) {
--
2.16.1.windows.1
next prev parent reply other threads:[~2018-10-16 5:42 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-16 5:43 [PATCH v2 00/12] Need to validate data from HW Ruiyu Ni
2018-10-16 5:43 ` Ruiyu Ni [this message]
2018-10-16 5:43 ` [PATCH v2 02/12] MdeModulePkg/UsbMass: Fix integer overflow when BlockSize is 1 Ruiyu Ni
2018-10-16 5:43 ` [PATCH v2 03/12] MdeModulePkg/UsbBus: Fix out-of-bound read access to descriptors Ruiyu Ni
2018-10-16 5:43 ` [PATCH v2 04/12] MdeModulePkg/UsbBus: Reject descriptor whose length is bad Ruiyu Ni
2018-10-16 5:43 ` [PATCH v2 05/12] MdeModulePkg/Usb: Make sure data from HW is no more than expected Ruiyu Ni
2018-10-16 5:43 ` [PATCH v2 06/12] SourceLevelDebugPkg/Usb3: Make sure data from HW can fit in buffer Ruiyu Ni
2018-10-16 5:43 ` [PATCH v2 07/12] MdeModulePkg/UsbKb: Don't access key codes when length is wrong Ruiyu Ni
2018-10-16 5:43 ` [PATCH v2 08/12] MdeModulePkg/AbsPointer: " Ruiyu Ni
2018-10-16 5:43 ` [PATCH v2 09/12] MdeModulePkg/UsbMouse: " Ruiyu Ni
2018-10-16 5:43 ` [PATCH v2 10/12] MdeModulePkg/UsbBus: Deny when the string descriptor length is odd Ruiyu Ni
2018-10-16 5:43 ` [PATCH v2 11/12] MdeModulePkg/Bus/Ufs: Ensure device not return more data than expected Ruiyu Ni
2018-10-16 5:43 ` [PATCH v2 12/12] MdeModulePkg/UsbMass: Reject device whose block size is 0 or > 64K Ruiyu Ni
2018-10-17 2:43 ` [PATCH v2 00/12] Need to validate data from HW Zeng, Star
2018-10-17 2:46 ` Zeng, Star
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181016054335.47460-2-ruiyu.ni@intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox