waitdisk(void)
{
// Wait for disk ready.
- while((inb(IDE_DATA_PRIMARY+IDE_REG_STATUS) & 0xC0) != 0x40)
+ while((inb(IDE_DATA_PRIMARY+IDE_REG_STATUS) & (IDE_BSY|IDE_DRDY)) != IDE_DRDY)
;
}
{
// Issue command.
waitdisk();
- outb(IDE_DATA_PRIMARY+IDE_REG_SECTORS, 1); // count = 1
- outb(IDE_DATA_PRIMARY+IDE_REG_LBA0, offset);
- outb(IDE_DATA_PRIMARY+IDE_REG_LBA1, offset >> 8);
- outb(IDE_DATA_PRIMARY+IDE_REG_LBA2, offset >> 16);
- outb(IDE_DATA_PRIMARY+IDE_REG_DISK, (offset >> 24) | 0xE0);
- outb(IDE_DATA_PRIMARY+IDE_REG_COMMAND, IDE_CMD_READ); // cmd 0x20 - read sectors
+ outb(IDE_DATA_PRIMARY+IDE_REG_SECTORS, 1);
+ outb(IDE_DATA_PRIMARY+IDE_REG_LBA0, offset & 0xff);
+ outb(IDE_DATA_PRIMARY+IDE_REG_LBA1, (offset >> 8) & 0xff);
+ outb(IDE_DATA_PRIMARY+IDE_REG_LBA2, (offset >> 16) & 0xff);
+ outb(IDE_DATA_PRIMARY+IDE_REG_DISK, ((offset >> 24) & 0x0f) | IDE_DISK_LBA);
+ outb(IDE_DATA_PRIMARY+IDE_REG_COMMAND, IDE_CMD_READ);
// Read data.
waitdisk();
idewait(0);
// Check if disk 1 is present
- outb(IDE_DATA_PRIMARY+IDE_REG_DISK, 0xe0 | (1<<4));
+ outb(IDE_DATA_PRIMARY+IDE_REG_DISK, IDE_DISK_LBA | (1<<4));
for(i=0; i<1000; i++){
if(inb(IDE_DATA_PRIMARY+IDE_REG_STATUS) != 0){
havedisk1 = 1;
}
// Switch back to disk 0.
- outb(IDE_DATA_PRIMARY+IDE_REG_DISK, 0xe0 | (0<<4));
+ outb(IDE_DATA_PRIMARY+IDE_REG_DISK, IDE_DISK_LBA | (0<<4));
}
// Start the request for b. Caller must hold idelock.
outb(IDE_DATA_PRIMARY+IDE_REG_LBA0, sector & 0xff);
outb(IDE_DATA_PRIMARY+IDE_REG_LBA1, (sector >> 8) & 0xff);
outb(IDE_DATA_PRIMARY+IDE_REG_LBA2, (sector >> 16) & 0xff);
- outb(IDE_DATA_PRIMARY+IDE_REG_DISK, 0xe0 | ((b->dev&1)<<4) | ((sector>>24)&0x0f));
+ outb(IDE_DATA_PRIMARY+IDE_REG_DISK, IDE_DISK_LBA | ((b->dev&1)<<4) | ((sector>>24)&0x0f));
if(b->flags & B_DIRTY){
outb(IDE_DATA_PRIMARY+IDE_REG_COMMAND, IDE_CMD_WRITE);
outsl(IDE_DATA_PRIMARY+IDE_REG_DATA, b->data, BSIZE/4);