Fix ATA PIO driver not correctly detecting harddisk size.

This commit is contained in:
Jonas 'Sortie' Termansen 2014-05-06 18:24:29 +02:00
parent 7db2ea81ab
commit 23d9693261
1 changed files with 6 additions and 14 deletions

View File

@ -249,7 +249,7 @@ ATADrive* ATABus::Instatiate(unsigned driveid)
// Check for ATAPI device not following spec. // Check for ATAPI device not following spec.
if ( CPU::InPortB(iobase + LBA_MID) || CPU::InPortB(iobase + LBA_MID) ) if ( CPU::InPortB(iobase + LBA_MID) || CPU::InPortB(iobase + LBA_MID) )
return errno = ENODEV, (ATADrive*) NULL; return errno = ENODEV, (ATADrive*) NULL;
while ( !(status & STATUS_DATAREADY) && !(status & STATUS_ERROR) ) while ( (status & STATUS_BUSY) || (!(status & STATUS_DATAREADY) && !(status & STATUS_ERROR)) )
status = CPU::InPortB(iobase + STATUS); status = CPU::InPortB(iobase + STATUS);
if ( status & STATUS_ERROR ) if ( status & STATUS_ERROR )
{ {
@ -291,7 +291,7 @@ bool ATABus::SelectDrive(unsigned driveid)
const size_t META_LBA28 = 60; const size_t META_LBA28 = 60;
const size_t META_FLAGS = 83; const size_t META_FLAGS = 83;
const size_t META_LBA48 = 100; const size_t META_LBA48 = 100;
const uint16_t FLAG_LBA48 = (1<<10); const uint16_t FLAG_LBA48 = 1 << 10;
ATADrive::ATADrive(ATABus* bus, unsigned driveid, uint16_t portoffset, uint16_t altport) ATADrive::ATADrive(ATABus* bus, unsigned driveid, uint16_t portoffset, uint16_t altport)
{ {
@ -301,28 +301,20 @@ ATADrive::ATADrive(ATABus* bus, unsigned driveid, uint16_t portoffset, uint16_t
this->iobase = portoffset; this->iobase = portoffset;
this->altport = altport; this->altport = altport;
for ( size_t i = 0; i < 256; i++ ) for ( size_t i = 0; i < 256; i++ )
{
meta[i] = CPU::InPortW(iobase + DATA); meta[i] = CPU::InPortW(iobase + DATA);
}
lba48 = meta[META_FLAGS] & FLAG_LBA48; lba48 = meta[META_FLAGS] & FLAG_LBA48;
numsectors = 0; numsectors = 0;
if ( lba48 ) if ( lba48 )
{ {
numsectors = (uint64_t) meta[META_LBA48 + 0] << 0 numsectors = (uint64_t) meta[META_LBA48 + 0] << 0
| (uint64_t) meta[META_LBA48 + 1] << 8 | (uint64_t) meta[META_LBA48 + 1] << 16
| (uint64_t) meta[META_LBA48 + 2] << 16 | (uint64_t) meta[META_LBA48 + 2] << 32
| (uint64_t) meta[META_LBA48 + 3] << 24 | (uint64_t) meta[META_LBA48 + 3] << 48;
| (uint64_t) meta[META_LBA48 + 4] << 32
| (uint64_t) meta[META_LBA48 + 5] << 40
| (uint64_t) meta[META_LBA48 + 6] << 48
| (uint64_t) meta[META_LBA48 + 7] << 56;
} }
else else
{ {
numsectors = meta[META_LBA28 + 0] << 0 numsectors = meta[META_LBA28 + 0] << 0
| meta[META_LBA28 + 1] << 8 | meta[META_LBA28 + 1] << 16;
| meta[META_LBA28 + 2] << 16
| meta[META_LBA28 + 3] << 24;
} }
sectorsize = 512; // TODO: Detect this! sectorsize = 512; // TODO: Detect this!
Initialize(); Initialize();