AddressPacket->Zero = 0;\r
AddressPacket->NumberOfBlocks = (UINT8) NumberOfBlocks;\r
AddressPacket->Zero2 = 0;\r
- AddressPacket->SegOffset = EFI_SEGMENT (TransferBuffer) << 16;\r
- AddressPacket->SegOffset |= EFI_OFFSET (TransferBuffer);\r
+ //\r
+ // TransferBuffer has been 4KB alignment. Normalize TransferBuffer to make offset as 0 in seg:offset\r
+ // format to transfer maximum 127 blocks of data.\r
+ // Otherwise when offset adding data size exceeds 0xFFFF, if OpROM does not normalize TransferBuffer,\r
+ // INT13 function 42H will return data boundary error 09H.\r
+ //\r
+ AddressPacket->SegOffset = (UINT32) ((TransferBuffer >> 4) << 16);\r
AddressPacket->Lba = (UINT64) Lba;\r
\r
Regs.H.AH = 0x42;\r
AddressPacket->Zero = 0;\r
AddressPacket->NumberOfBlocks = (UINT8) NumberOfBlocks;\r
AddressPacket->Zero2 = 0;\r
- AddressPacket->SegOffset = EFI_SEGMENT (TransferBuffer) << 16;\r
- AddressPacket->SegOffset |= EFI_OFFSET (TransferBuffer);\r
+ //\r
+ // TransferBuffer has been 4KB alignment. Normalize TransferBuffer to make offset as 0 in seg:offset\r
+ // format to transfer maximum 127 blocks of data.\r
+ // Otherwise when offset adding data size exceeds 0xFFFF, if OpROM does not normalize TransferBuffer,\r
+ // INT13 function 42H will return data boundary error 09H.\r
+ //\r
+ AddressPacket->SegOffset = (UINT32) ((TransferBuffer >> 4) << 16);\r
AddressPacket->Lba = (UINT64) Lba;\r
\r
Regs.H.AH = 0x43;\r