- struct pci_device* ahci_dev = container_of(dev, struct pci_device, dev);
-
- struct pci_base_addr* bar6 = &ahci_dev->bar[5];
- assert_msg(bar6->type & BAR_TYPE_MMIO, "AHCI: BAR#6 is not MMIO.");
-
- pci_reg_t cmd = pci_read_cspace(ahci_dev->cspace_base, PCI_REG_STATUS_CMD);
-
- // 禁用传统中断(因为我们使用MSI),启用MMIO访问,允许PCI设备间访问
- cmd |= (PCI_RCMD_MM_ACCESS | PCI_RCMD_DISABLE_INTR | PCI_RCMD_BUS_MASTER);
-
- pci_write_cspace(ahci_dev->cspace_base, PCI_REG_STATUS_CMD, cmd);
-
- int iv = isrm_ivexalloc(ahci_hba_isr);
- pci_setup_msi(ahci_dev, iv);
+ struct pci_device* ahci_dev;
+ struct pci_base_addr* bar6;
+ struct ahci_driver* ahci_drv;
+ msi_vector_t msiv;
+
+ ahci_dev = PCI_DEVICE(dev);
+ bar6 = pci_device_bar(ahci_dev, 5);
+ assert_msg(pci_bar_mmio_space(bar6), "AHCI: BAR#6 is not MMIO.");
+
+ pci_reg_t cmd = 0;
+ pci_cmd_set_bus_master(&cmd);
+ pci_cmd_set_mmio(&cmd);
+ pci_cmd_set_msi(&cmd);
+ pci_apply_command(ahci_dev, cmd);
+
+ assert(pci_capability_msi(ahci_dev));
+
+ msiv = isrm_msialloc(ahci_hba_isr);
+ pci_setup_msi(ahci_dev, msiv);