Compare commits
31 Commits
d67fcd2ec0
...
e50d23790e
Author | SHA1 | Date | |
---|---|---|---|
e50d23790e | |||
2ffdc6f539 | |||
2ddec76061 | |||
4cbdea954a | |||
ec256e058d | |||
6388672d00 | |||
36c1374c16 | |||
2dff2c9934 | |||
4b47a24bb1 | |||
2c1e476e4b | |||
6138e8ef66 | |||
747c720159 | |||
49d5930912 | |||
8d4eab1600 | |||
d78cc52d22 | |||
d9557e5089 | |||
a5d33fdf44 | |||
653b2074c0 | |||
25cbaf4f90 | |||
37731d2a95 | |||
8bff3d647e | |||
4b797367dd | |||
a48d6fe001 | |||
76be0058da | |||
63a30cc056 | |||
a1c0aab4e0 | |||
7b5d7d4ac6 | |||
fbb238cb5d | |||
967affdffe | |||
60cc9dcd0e | |||
5d992ceb99 |
@ -161,7 +161,7 @@ namespace ATA
|
|||||||
{
|
{
|
||||||
if (!(read_bm(BusmasterRegister::Status) & BMS_IRQPending)) return;
|
if (!(read_bm(BusmasterRegister::Status) & BMS_IRQPending)) return;
|
||||||
|
|
||||||
if (m_current_drive < 2 && m_drives[m_current_drive].has_value()) m_drives[m_current_drive]->irq_handler();
|
if (m_current_drive < 2 && m_drives[m_current_drive]) m_drives[m_current_drive]->irq_handler();
|
||||||
|
|
||||||
m_irq_called = true;
|
m_irq_called = true;
|
||||||
|
|
||||||
@ -307,7 +307,14 @@ namespace ATA
|
|||||||
|
|
||||||
kinfoln("ata: Channel %d has a drive on slot %d!", m_channel_index, drive);
|
kinfoln("ata: Channel %d has a drive on slot %d!", m_channel_index, drive);
|
||||||
|
|
||||||
m_drives[drive] = Drive { this, drive, {} };
|
auto rc = adopt_shared_if_nonnull(new (std::nothrow) Drive(this, drive, {}));
|
||||||
|
if (rc.has_error())
|
||||||
|
{
|
||||||
|
kinfoln("ata: Failed to create drive object: %s", rc.error_string());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_drives[drive] = rc.release_value();
|
||||||
|
|
||||||
if (!m_drives[drive]->initialize())
|
if (!m_drives[drive]->initialize())
|
||||||
{
|
{
|
||||||
@ -320,7 +327,7 @@ namespace ATA
|
|||||||
|
|
||||||
for (u8 drive = 0; drive < 2; drive++)
|
for (u8 drive = 0; drive < 2; drive++)
|
||||||
{
|
{
|
||||||
if (m_drives[drive].has_value())
|
if (m_drives[drive])
|
||||||
{
|
{
|
||||||
if (!m_drives[drive]->post_initialize())
|
if (!m_drives[drive]->post_initialize())
|
||||||
{
|
{
|
||||||
@ -328,7 +335,7 @@ namespace ATA
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto rc = ATADevice::create(m_drives[drive].value_ptr());
|
auto rc = ATADevice::create(m_drives[drive]);
|
||||||
|
|
||||||
if (rc.has_error())
|
if (rc.has_error())
|
||||||
{
|
{
|
||||||
@ -716,7 +723,7 @@ namespace ATA
|
|||||||
|
|
||||||
static u32 next_minor = 0;
|
static u32 next_minor = 0;
|
||||||
|
|
||||||
Result<String> ATA::Drive::create_drive_name(ATA::Drive* drive)
|
Result<String> ATA::Drive::create_drive_name(SharedPtr<ATA::Drive> drive)
|
||||||
{
|
{
|
||||||
static u32 cd_index = 0;
|
static u32 cd_index = 0;
|
||||||
static u32 sd_index = 0;
|
static u32 sd_index = 0;
|
||||||
@ -724,7 +731,7 @@ Result<String> ATA::Drive::create_drive_name(ATA::Drive* drive)
|
|||||||
return String::format("%s%d"_sv, drive->m_is_atapi ? "cd" : "sd", drive->m_is_atapi ? cd_index++ : sd_index++);
|
return String::format("%s%d"_sv, drive->m_is_atapi ? "cd" : "sd", drive->m_is_atapi ? cd_index++ : sd_index++);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<SharedPtr<Device>> ATADevice::create(ATA::Drive* drive)
|
Result<SharedPtr<Device>> ATADevice::create(SharedPtr<ATA::Drive> drive)
|
||||||
{
|
{
|
||||||
auto device = TRY(adopt_shared_if_nonnull(new (std::nothrow) ATADevice()));
|
auto device = TRY(adopt_shared_if_nonnull(new (std::nothrow) ATADevice()));
|
||||||
device->m_drive = drive;
|
device->m_drive = drive;
|
||||||
|
@ -131,7 +131,7 @@ namespace ATA
|
|||||||
|
|
||||||
static constexpr u16 END_OF_PRDT = (1 << 15);
|
static constexpr u16 END_OF_PRDT = (1 << 15);
|
||||||
|
|
||||||
class Drive
|
class Drive : public Shareable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Drive(Channel* channel, u8 drive_index, Badge<Channel>);
|
Drive(Channel* channel, u8 drive_index, Badge<Channel>);
|
||||||
@ -164,7 +164,7 @@ namespace ATA
|
|||||||
|
|
||||||
Result<void> read_lba(u64 lba, void* out, usize nblocks);
|
Result<void> read_lba(u64 lba, void* out, usize nblocks);
|
||||||
|
|
||||||
static Result<String> create_drive_name(ATA::Drive* drive);
|
static Result<String> create_drive_name(SharedPtr<ATA::Drive> drive);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool identify_ata();
|
bool identify_ata();
|
||||||
@ -271,7 +271,7 @@ namespace ATA
|
|||||||
|
|
||||||
u8 m_current_drive = (u8)-1;
|
u8 m_current_drive = (u8)-1;
|
||||||
|
|
||||||
Option<Drive> m_drives[2];
|
SharedPtr<Drive> m_drives[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
class Controller : public Shareable
|
class Controller : public Shareable
|
||||||
@ -301,7 +301,7 @@ class ATADevice : public Device
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Initializer for DeviceRegistry.
|
// Initializer for DeviceRegistry.
|
||||||
static Result<SharedPtr<Device>> create(ATA::Drive* drive);
|
static Result<SharedPtr<Device>> create(SharedPtr<ATA::Drive> drive);
|
||||||
|
|
||||||
Result<usize> read(u8*, usize, usize) const override;
|
Result<usize> read(u8*, usize, usize) const override;
|
||||||
|
|
||||||
@ -339,6 +339,6 @@ class ATADevice : public Device
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
ATADevice() = default;
|
ATADevice() = default;
|
||||||
ATA::Drive* m_drive;
|
SharedPtr<ATA::Drive> m_drive;
|
||||||
String m_device_path;
|
String m_device_path;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user