diff options
Diffstat (limited to 'Source/Kernel/Devices')
-rw-r--r-- | Source/Kernel/Devices/ATA/ATAController.class.cpp | 4 | ||||
-rw-r--r-- | Source/Kernel/Devices/ATA/ATAController.class.h | 3 | ||||
-rw-r--r-- | Source/Kernel/Devices/ATA/ATADrive.class.cpp | 4 |
3 files changed, 9 insertions, 2 deletions
diff --git a/Source/Kernel/Devices/ATA/ATAController.class.cpp b/Source/Kernel/Devices/ATA/ATAController.class.cpp index 69a18a4..d8073d0 100644 --- a/Source/Kernel/Devices/ATA/ATAController.class.cpp +++ b/Source/Kernel/Devices/ATA/ATAController.class.cpp @@ -27,14 +27,16 @@ void ATAController::detect() { } } -ATAController::ATAController(u32int base, u8int number) { +ATAController::ATAController(u32int base, u8int number) : Mutex(MUTEX_TRUE) { m_base = base; m_number = number; m_drives[0] = NULL; m_drives[1] = NULL; identify(false); //Identify master device identify(true); //Identify slave device + unlock(); } void ATAController::identify(bool slave) { + if (!locked()) return; if (m_drives[(slave ? 1 : 0)] != NULL) return; writeByte(ATA_PORT_DRIVE_SELECT, (slave ? 0xB0 : 0xA0)); writeByte(ATA_PORT_COMMAND, ATA_CMD_IDENTIFY); diff --git a/Source/Kernel/Devices/ATA/ATAController.class.h b/Source/Kernel/Devices/ATA/ATAController.class.h index a12b835..89176c9 100644 --- a/Source/Kernel/Devices/ATA/ATAController.class.h +++ b/Source/Kernel/Devices/ATA/ATAController.class.h @@ -2,6 +2,7 @@ #define DEF_ATACONTROLLER_CLASS_H #include <Devices/Device.proto.h> +#include <Mutex.class.h> #define ATA_BUS1_BASE 0x1F0 #define ATA_BUS2_BASE 0x170 @@ -21,7 +22,7 @@ class ATADrive; -class ATAController : public Device { +class ATAController : public Device, public Mutex { friend class ATADrive; private: ATAController(u32int base, u8int number); diff --git a/Source/Kernel/Devices/ATA/ATADrive.class.cpp b/Source/Kernel/Devices/ATA/ATADrive.class.cpp index d9cc4a7..247e798 100644 --- a/Source/Kernel/Devices/ATA/ATADrive.class.cpp +++ b/Source/Kernel/Devices/ATA/ATADrive.class.cpp @@ -37,6 +37,7 @@ void ATADrive::cmdCommon(u32int numblock, u32int count) { bool ATADrive::readBlocks(u64int start, u32int count, u8int* data) { if (start + count >= m_blockCount) return false; + m_ctrlr->waitLock(); cmdCommon(start, count); m_ctrlr->writeByte(ATA_PORT_COMMAND, ATA_CMD_READ); @@ -47,6 +48,7 @@ bool ATADrive::readBlocks(u64int start, u32int count, u8int* data) { data[idx * 2] = (u8int)tmpword; data[idx * 2 + 1] = (u8int)(tmpword >> 8); } + m_ctrlr->unlock(); return true; } @@ -54,6 +56,7 @@ bool ATADrive::writeBlocks(u64int start, u32int count, u8int* data) { if (start + count >= m_blockCount) return false; if (readOnly()) return false; + m_ctrlr->waitLock(); cmdCommon(start, count); m_ctrlr->writeByte(ATA_PORT_COMMAND, ATA_CMD_WRITE); @@ -63,6 +66,7 @@ bool ATADrive::writeBlocks(u64int start, u32int count, u8int* data) { u16int tmpword = (data[idx * 2]) | (data[idx * 2 + 1] << 8); m_ctrlr->writeByte(ATA_PORT_DATA, tmpword); } + m_ctrlr->unlock(); return true; } |