diff options
Diffstat (limited to 'kernel/drivers/disk/sata.c')
-rw-r--r-- | kernel/drivers/disk/sata.c | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/kernel/drivers/disk/sata.c b/kernel/drivers/disk/sata.c index aa3ff41..d5ca117 100644 --- a/kernel/drivers/disk/sata.c +++ b/kernel/drivers/disk/sata.c @@ -488,8 +488,26 @@ void sata_init() long sata_read_block(blockdev_t *bdev, char *buf, blocknum_t block, size_t block_count) { - NOT_YET_IMPLEMENTED("DRIVERS: sata_read_block"); - return -1; + // NOT_YET_IMPLEMENTED("DRIVERS: sata_read_block"); + + // convert block to sector + ssize_t lba = block * SATA_SECTORS_PER_BLOCK; + ssize_t count = block_count * SATA_SECTORS_PER_BLOCK; + + // get the disk + ata_disk_t *disk = bdev_to_ata_disk(bdev); + if (disk == NULL) + { + dbg(DBG_DISK, "sata_read_block: disk is NULL\n"); + return -1; + } + + // call ahci_do_operation + long ret = ahci_do_operation(disk->port, lba, count, buf, + 0 // 0 for read + ); + + return ret; } /** @@ -507,6 +525,24 @@ long sata_read_block(blockdev_t *bdev, char *buf, blocknum_t block, long sata_write_block(blockdev_t *bdev, const char *buf, blocknum_t block, size_t block_count) { - NOT_YET_IMPLEMENTED("DRIVERS: sata_write_block"); - return -1; + // NOT_YET_IMPLEMENTED("DRIVERS: sata_write_block"); + + // convert block to sector + ssize_t lba = block * SATA_SECTORS_PER_BLOCK; + ssize_t count = block_count * SATA_SECTORS_PER_BLOCK; + + // get the disk + ata_disk_t *disk = bdev_to_ata_disk(bdev); + if (disk == NULL) + { + dbg(DBG_DISK, "sata_write_block: disk is NULL\n"); + return -1; + } + + // call ahci_do_operation + long ret = ahci_do_operation(disk->port, lba, count, (void *)buf, + 1 // 1 for write + ); + + return ret; } |