diff --git a/sys/denali/ahci/ahci_port.cpp b/sys/denali/ahci/ahci_port.cpp index e2cc974..43579d8 100644 --- a/sys/denali/ahci/ahci_port.cpp +++ b/sys/denali/ahci/ahci_port.cpp @@ -55,10 +55,20 @@ glcr::ErrorCode AhciPort::Identify() { ASSIGN_OR_RETURN(auto* sem, IssueCommand(identify)); sem->Wait(); uint16_t* ident = reinterpret_cast(region.vaddr()); - uint32_t* sector_size = reinterpret_cast(ident + 117); - dbgln("Sector size: {}", *sector_size); - uint64_t* lbas = reinterpret_cast(ident + 100); - dbgln("LBA Count: {}", *lbas); + if (ident[106] & (1 << 12)) { + sector_size_ = *reinterpret_cast(ident + 117); + } else { + sector_size_ = 512; + } + + if (ident[83] & (1 << 10)) { + lba_count_ = *reinterpret_cast(ident + 100); + } else { + lba_count_ = *reinterpret_cast(ident + 60); + } + dbgln("Sector size: {x}", sector_size_); + dbgln("LBA Count: {x}", lba_count_); + is_init_ = true; } return glcr::OK; } diff --git a/sys/denali/ahci/ahci_port.h b/sys/denali/ahci/ahci_port.h index a5e5f0e..fc9b2df 100644 --- a/sys/denali/ahci/ahci_port.h +++ b/sys/denali/ahci/ahci_port.h @@ -20,7 +20,7 @@ class AhciPort { void DumpInfo(); bool IsSata() { return port_struct_->signature == 0x101; } - bool IsInit() { return port_struct_ != nullptr && command_structures_; } + bool IsInit() { return is_init_; } glcr::ErrorCode Identify(); @@ -43,5 +43,9 @@ class AhciPort { glcr::Array command_signals_; uint32_t commands_issued_ = 0; + bool is_init_ = false; + uint64_t lba_count_ = 0; + uint32_t sector_size_ = 0; + glcr::ErrorOr IssueCommand(const CommandInfo& command); };