feat: initial locking etc.
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include <libc/kprintf.h>
|
||||
#include <fs/blockdev.h>
|
||||
#include <mem/malloc.h>
|
||||
#include <tasks/locking.h>
|
||||
|
||||
#define ATA_SR_BSY 0x80 // Busy
|
||||
#define ATA_SR_DRDY 0x40 // Drive ready
|
||||
@@ -135,6 +136,8 @@ typedef struct {
|
||||
uint8_t print_error: 1;
|
||||
} ide_block_device_info;
|
||||
|
||||
mutex_t *ide_lock = NULL;
|
||||
|
||||
uint8_t ide_read(uint8_t channel, uint8_t reg);
|
||||
|
||||
void ide_write(uint8_t channel, uint8_t reg, uint8_t data);
|
||||
@@ -437,6 +440,12 @@ uint8_t ide_pci_initialize(pci_device *device) {
|
||||
return PCI_INIT_FAIL;
|
||||
}
|
||||
|
||||
if (ide_lock != NULL) {
|
||||
k_panics("IDE already initialized\n");
|
||||
}
|
||||
ide_lock = mutex_create();
|
||||
mutex_acquire(ide_lock);
|
||||
|
||||
// disable IRQ
|
||||
ide_write(ATA_PRIMARY, ATA_REG_CONTROL, 2);
|
||||
ide_write(ATA_SECONDARY, ATA_REG_CONTROL, 2);
|
||||
@@ -518,6 +527,7 @@ uint8_t ide_pci_initialize(pci_device *device) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
mutex_release(ide_lock);
|
||||
ide_register_block_devices();
|
||||
|
||||
return PCI_INIT_OK;
|
||||
@@ -673,5 +683,8 @@ uint8_t ide_access(uint8_t direction, uint8_t drive, uint32_t lba, uint8_t numse
|
||||
|| ide_devices[drive].type == IDE_ATAPI) {
|
||||
return 0xF1;
|
||||
}
|
||||
return ide_read_ata_access(direction, drive, lba, numsects, target);
|
||||
mutex_acquire(ide_lock);
|
||||
uint8_t result = ide_read_ata_access(direction, drive, lba, numsects, target);
|
||||
mutex_release(ide_lock);
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user