From 70d69f4d03d3939774a65e8aa71f825caa56be11 Mon Sep 17 00:00:00 2001 From: Minep Date: Tue, 9 Aug 2022 16:08:11 +0100 Subject: [PATCH] fix: remove unwanted interrupts during disk init and probing process. --- lunaix-os/hal/ahci/ahci.c | 15 +++++++++++---- lunaix-os/includes/hal/ahci/hba.h | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lunaix-os/hal/ahci/ahci.c b/lunaix-os/hal/ahci/ahci.c index aadb41b..ee52156 100644 --- a/lunaix-os/hal/ahci/ahci.c +++ b/lunaix-os/hal/ahci/ahci.c @@ -160,8 +160,6 @@ ahci_init() // 需要通过全部置位去清空这些寄存器(相当的奇怪……) port_regs[HBA_RPxSERR] = -1; - port_regs[HBA_RPxIE] |= (HBA_PxINTR_DPS); - hba.ports[i] = port; if (!HBA_RPxSSTS_IF(port->ssts)) { @@ -186,7 +184,8 @@ char sata_ifs[][20] = { "Not detected", void __ahci_hba_isr(isr_param param) { - // TODO: hba interrupt + // TODO: clear the interrupt status + // TODO: I/O-operation scheduler should be here kprintf(KDEBUG "HBA INTR\n"); } @@ -290,7 +289,7 @@ hba_prepare_cmd(struct hba_port* port, cmd_header->prdt_len = 1; cmd_table->entries[0] = (struct hba_prdte){ .data_base = vmm_v2p(buffer), - .byte_count = (size - 1) | (0x80000000) }; + .byte_count = size - 1 }; } *cmdh = cmd_header; @@ -306,6 +305,9 @@ ahci_init_device(struct hba_port* port) struct hba_cmdt* cmd_table; struct hba_cmdh* cmd_header; + // mask DHR interrupt + port->regs[HBA_RPxIE] &= ~HBA_PxINTR_DHR; + // 确保端口是空闲的 wait_until(!(port->regs[HBA_RPxTFD] & (HBA_PxTFD_BSY))); @@ -398,6 +400,9 @@ ahci_init_device(struct hba_port* port) scsi_parse_capacity(port->device, (uint32_t*)data_in); done: + // reset interrupt status and unmask D2HR interrupt + port->regs[HBA_RPxIS] = -1; + port->regs[HBA_RPxIE] |= HBA_PxINTR_DHR; achi_register_ops(port); vfree_dma(data_in); @@ -406,6 +411,8 @@ done: return 1; fail: + port->regs[HBA_RPxIS] = -1; + port->regs[HBA_RPxIE] |= HBA_PxINTR_DHR; vfree_dma(data_in); vfree_dma(cmd_table); diff --git a/lunaix-os/includes/hal/ahci/hba.h b/lunaix-os/includes/hal/ahci/hba.h index f65a93d..9ca688d 100644 --- a/lunaix-os/includes/hal/ahci/hba.h +++ b/lunaix-os/includes/hal/ahci/hba.h @@ -31,7 +31,7 @@ #define HBA_PxCMD_FR (1 << 14) #define HBA_PxCMD_ST (1) #define HBA_PxINTR_DMA (1 << 2) -#define HBA_PxINTR_D2HR (1) +#define HBA_PxINTR_DHR (1) #define HBA_PxINTR_DPS (1 << 5) #define HBA_PxTFD_ERR (1) #define HBA_PxTFD_BSY (1 << 7) -- 2.27.0