Suggested fix for atapi. The atapi driver wants whole sectors, but the ext2 driver sometimes attempts an incomplete write. Here we fill the remaineder of the sector with zeros. This isn't the most elegant way to do it but illustrates the problem. I'm committing this here because it's a branch. Modified: branches/ext2/reactos/drivers/storage/atapi/atapi.c _____
Modified: branches/ext2/reactos/drivers/storage/atapi/atapi.c --- branches/ext2/reactos/drivers/storage/atapi/atapi.c 2005-01-27 04:15:14 UTC (rev 13335) +++ branches/ext2/reactos/drivers/storage/atapi/atapi.c 2005-01-27 08:16:42 UTC (rev 13336) @@ -2000,12 +2000,12 @@
UCHAR CylinderLow; UCHAR DrvHead; UCHAR SectorNumber; - UCHAR Command; + UCHAR Command = 0; ULONG Retries; UCHAR Status; BOOLEAN FASTCALL (*Handler)(PATAPI_MINIPORT_EXTENSION DevExt);
- DPRINT("AtapiReadWrite() called!\n"); + DPRINT("AtaiReadWrite() called!\n"); DPRINT("SCSIOP_WRITE: TargetId: %lu\n", Srb->TargetId);
@@ -2144,13 +2144,16 @@ if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_MULTI_SECTOR_CMD) { Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ_MULTIPLE : IDE_CMD_WRITE_MULTIPLE; + DPRINT("Command = %x\n", Command); } else { Command = Srb->SrbFlags & SRB_FLAGS_DATA_IN ? IDE_CMD_READ : IDE_CMD_WRITE; + DPRINT("Command = %x\n", Command); } }
+ DPRINT("Executing Command = %x\n", Command); AtapiExecuteCommand(DeviceExtension, Command, Handler);
#ifdef ENABLE_DMA @@ -2182,7 +2185,7 @@ } if (Retries >= IDE_MAX_WRITE_RETRIES) { - DPRINT1("Drive is BUSY for too long after sending write command\n"); + DPRINT("Drive is BUSY for too long after sending write command\n"); return(SRB_STATUS_BUSY); }
@@ -2200,12 +2203,47 @@ /* Write data block */ if (DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_DWORD_IO) { - IDEWriteBlock32(DeviceExtension->CommandPortBase, - TargetAddress, - TransferSize); + UINT Temp = 0; + UINT ExtraWord = TransferSize & (sizeof(UINT)-1); + UINT EndOfBlock; + + DPRINT("IDEWriteBlock32(%x, %d)\n", + DeviceExtension->CommandPortBase, + TransferSize); + IDEWriteBlock32(DeviceExtension->CommandPortBase, + TargetAddress, + TransferSize); + if( ExtraWord ) { + RtlCopyMemory( &Temp, + TargetAddress + + (TransferSize & (sizeof(UINT)-1)), + ExtraWord ); + IDEWriteBlock32(DeviceExtension->CommandPortBase, + &Temp, + sizeof(Temp)); + TransferSize = (TransferSize + sizeof(UINT)) & + ~(sizeof(UINT) - 1); + } + + Temp = 0; + + DPRINT("TransferSize = %d (BPS %d)\n", + TransferSize, DeviceParams->BytesPerSector); + + EndOfBlock = DeviceParams->BytesPerSector - + (TransferSize & (DeviceParams->BytesPerSector - 1)); + + while( EndOfBlock ) { + DPRINT("Zeros Remaining %d\n", EndOfBlock); + IDEWriteBlock32(DeviceExtension->CommandPortBase, + &Temp, + sizeof(Temp)); + EndOfBlock -= sizeof(Temp); + } } else { + DPRINT1("IDEWriteBlock(%x)\n", DeviceExtension->CommandPortBase); IDEWriteBlock(DeviceExtension->CommandPortBase, TargetAddress, TransferSize);