From 01f5b872f2c7a566a2588344aa0e9168ba848e44 Mon Sep 17 00:00:00 2001 From: Mathieu Maret Date: Tue, 21 Nov 2023 00:06:09 +0100 Subject: [PATCH] ata: fix read/write on 2nd/4th disk --- drivers/ata.c | 67 +++++++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/drivers/ata.c b/drivers/ata.c index 5476e91..fbd6aea 100644 --- a/drivers/ata.c +++ b/drivers/ata.c @@ -455,6 +455,10 @@ int ATAGetDeviceInfo(struct ata_device *dev) outb(ctl->base + ATA_PIO_DRIVE, ATA_PIO_DRIVE_IBM | (dev->isSlave ? ATA_PIO_DRIVE_SLAVE : ATA_PIO_DRIVE_MASTER)); + outb(ctl->base + ATA_PIO_SEC_COUNT, 0); + outb(ctl->base + ATA_PIO_LBALO, 0); + outb(ctl->base + ATA_PIO_LBAMID, 0); + outb(ctl->base + ATA_PIO_LBAHI, 0); outb(ctl->base + ATA_PIO_CMD, ATA_PIO_CMD_IDENTIFY); /* Wait for command completion (wait while busy bit is set) */ @@ -613,41 +617,42 @@ int ATAReadPartitionSector(struct ata_partition *part, int offset, uint nbSector int ATAReadSector(struct ata_device *dev, int lba, uint nb_sector, void *buf) { - struct ata_controller *ctl = dev->ctl; + struct ata_controller *ctl = dev->ctl; - mutexLock(&ctl->mutex); + mutexLock(&ctl->mutex); - if (ctl->last_device_used != dev->id) { - outb(ctl->base + ATA_PIO_DRIVE, ATA_PIO_DRIVE_IBM | dev->isSlave << 4); - while (inb(ctl->base + ATA_PIO_STATUS) & ATA_PIO_STATUS_DRIVE_BUSY) { - } - ctl->last_device_used = dev->id; - } - outb(ctl->base + ATA_PIO_DRIVE, lba >> 24 | ATA_PIO_DRIVE_IBM | ATA_PIO_DRIVE_LBA); - outb(ctl->base + ATA_PIO_SEC_COUNT, nb_sector); - outb(ctl->base + ATA_PIO_LBALO, lba & 0xff); - outb(ctl->base + ATA_PIO_LBAMID, (lba >> 8) & 0xff); - outb(ctl->base + ATA_PIO_LBAHI, (lba >> 16) & 0xff); - outb(ctl->base + ATA_PIO_CMD, ATA_PIO_CMD_READ); + if (ctl->last_device_used != dev->id) { + outb(ctl->base + ATA_PIO_DRIVE, + ATA_PIO_DRIVE_IBM | (dev->isSlave ? ATA_PIO_DRIVE_SLAVE : ATA_PIO_DRIVE_MASTER)); + while (inb(ctl->base + ATA_PIO_STATUS) & ATA_PIO_STATUS_DRIVE_BUSY) { + } + ctl->last_device_used = dev->id; + } + outb(ctl->base + ATA_PIO_DRIVE, lba >> 24 | ATA_PIO_DRIVE_IBM | ATA_PIO_DRIVE_LBA | (dev->isSlave ? ATA_PIO_DRIVE_SLAVE : ATA_PIO_DRIVE_MASTER)); + outb(ctl->base + ATA_PIO_SEC_COUNT, nb_sector); + outb(ctl->base + ATA_PIO_LBALO, lba & 0xff); + outb(ctl->base + ATA_PIO_LBAMID, (lba >> 8) & 0xff); + outb(ctl->base + ATA_PIO_LBAHI, (lba >> 16) & 0xff); + outb(ctl->base + ATA_PIO_CMD, ATA_PIO_CMD_READ); - uint16_t *ptr = (uint16_t *)buf; - for (uint sector = 0; sector < nb_sector; sector++) { - while (inb(ctl->base + ATA_PIO_STATUS) & ATA_PIO_STATUS_DRIVE_BUSY) { - } - if (inb(ctl->base + ATA_PIO_STATUS) & ATA_PIO_STATUS_REG_ERR) { - mutexUnlock(&ctl->mutex); - printf("ATA read error at sector %d\n", sector); - return -1; - } - for (uint i = 0; i < (DISK_SECTOR_SIZE / sizeof(uint16_t)); i++) { - *ptr = inw(ctl->base + ATA_PIO_DATA); - ptr++; - } - } + uint16_t *ptr = (uint16_t *)buf; + for (uint sector = 0; sector < nb_sector; sector++) { + while (inb(ctl->base + ATA_PIO_STATUS) & ATA_PIO_STATUS_DRIVE_BUSY) { + } + if (inb(ctl->base + ATA_PIO_STATUS) & ATA_PIO_STATUS_REG_ERR) { + mutexUnlock(&ctl->mutex); + printf("ATA read error at sector %d\n", sector); + return -1; + } + for (uint i = 0; i < (DISK_SECTOR_SIZE / sizeof(uint16_t)); i++) { + *ptr = inw(ctl->base + ATA_PIO_DATA); + ptr++; + } + } - mutexUnlock(&ctl->mutex); + mutexUnlock(&ctl->mutex); - return 0; + return 0; } int ATAWriteSector(struct ata_device *dev, int lba, uint nb_sector, void *buf) @@ -663,7 +668,7 @@ int ATAWriteSector(struct ata_device *dev, int lba, uint nb_sector, void *buf) } ctl->last_device_used = dev->id; } - outb(ctl->base + ATA_PIO_DRIVE, lba >> 24 | ATA_PIO_DRIVE_IBM | ATA_PIO_DRIVE_LBA); + outb(ctl->base + ATA_PIO_DRIVE, lba >> 24 | ATA_PIO_DRIVE_IBM | ATA_PIO_DRIVE_LBA | (dev->isSlave ? ATA_PIO_DRIVE_SLAVE : ATA_PIO_DRIVE_MASTER)); outb(ctl->base + ATA_PIO_SEC_COUNT, nb_sector); outb(ctl->base + ATA_PIO_LBALO, lba & 0xff); outb(ctl->base + ATA_PIO_LBAMID, (lba >> 8) & 0xff);