X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/6fefc6f5af83f316e18b0cb9dbbde1cea0b98add..a5338b60e111972364a8bc6f07011c6defd213d2:/lunaix-os/hal/ahci/ahci.c diff --git a/lunaix-os/hal/ahci/ahci.c b/lunaix-os/hal/ahci/ahci.c index 53981a0..0551ee5 100644 --- a/lunaix-os/hal/ahci/ahci.c +++ b/lunaix-os/hal/ahci/ahci.c @@ -161,8 +161,6 @@ ahci_init() // 需要通过全部置位去清空这些寄存器(相当的奇怪……) port_regs[HBA_RPxSERR] = -1; - port_regs[HBA_RPxIE] |= (HBA_PxINTR_D2HR); - hba.ports[i] = port; if (!HBA_RPxSSTS_IF(port->ssts)) { @@ -189,7 +187,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"); } @@ -309,6 +308,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))); @@ -402,6 +404,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); @@ -410,6 +415,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);