diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci.c b/src/add-ons/kernel/busses/scsi/ahci/ahci.c index f32ca614c8..9de6880d54 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci.c +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci.c @@ -112,6 +112,10 @@ const device_info kSupportedDevices[] = { }; +device_manager_info *gDeviceManager; +scsi_for_sim_interface *gSCSI; + + status_t get_device_info(uint16 vendorID, uint16 deviceID, const char **name, uint32 *flags) diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.cpp b/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.cpp index 319449b4f0..a527e4a5e7 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.cpp @@ -15,18 +15,21 @@ #define FLOW(a...) dprintf("ahci: " a) -AHCIController::AHCIController(device_node *node, pci_device *device) - : fNode(node) - , fPCIDevice(device) - , fPCIVendorID(0xffff) - , fPCIDeviceID(0xffff) - , fFlags(0) - , fCommandSlotCount(0) - , fPortCountMax(0) - , fPortCountAvail(0) - , fPortImplementedMask(0) - , fIRQ(0) - , fInstanceCheck(-1) +AHCIController::AHCIController(device_node *node, + pci_device_module_info *pciModule, pci_device *device) + : + fNode(node), + fPCI(pciModule), + fPCIDevice(device), + fPCIVendorID(0xffff), + fPCIDeviceID(0xffff), + fFlags(0), + fCommandSlotCount(0), + fPortCountMax(0), + fPortCountAvail(0), + fPortImplementedMask(0), + fIRQ(0), + fInstanceCheck(-1) { memset(fPort, 0, sizeof(fPort)); @@ -48,7 +51,7 @@ status_t AHCIController::Init() { pci_info pciInfo; - gPCI->get_pci_info(fPCIDevice, &pciInfo); + fPCI->get_pci_info(fPCIDevice, &pciInfo); fPCIVendorID = pciInfo.vendor_id; fPCIDeviceID = pciInfo.device_id; @@ -70,30 +73,30 @@ AHCIController::Init() get_device_info(fPCIVendorID, fPCIDeviceID, NULL, &fFlags); uchar capabilityOffset; - status_t res = gPCI->find_pci_capability(fPCIDevice, PCI_cap_id_sata, &capabilityOffset); + status_t res = fPCI->find_pci_capability(fPCIDevice, PCI_cap_id_sata, &capabilityOffset); if (res == B_OK) { uint32 satacr0; uint32 satacr1; TRACE("PCI SATA capability found at offset 0x%x\n", capabilityOffset); - satacr0 = gPCI->read_pci_config(fPCIDevice, capabilityOffset, 4); - satacr1 = gPCI->read_pci_config(fPCIDevice, capabilityOffset + 4, 4); + satacr0 = fPCI->read_pci_config(fPCIDevice, capabilityOffset, 4); + satacr1 = fPCI->read_pci_config(fPCIDevice, capabilityOffset + 4, 4); TRACE("satacr0 = 0x%08lx, satacr1 = 0x%08lx\n", satacr0, satacr1); } - uint16 pcicmd = gPCI->read_pci_config(fPCIDevice, PCI_command, 2); + uint16 pcicmd = fPCI->read_pci_config(fPCIDevice, PCI_command, 2); TRACE("pcicmd old 0x%04x\n", pcicmd); pcicmd &= ~(PCI_command_io | PCI_command_int_disable); pcicmd |= PCI_command_master | PCI_command_memory; TRACE("pcicmd new 0x%04x\n", pcicmd); - gPCI->write_pci_config(fPCIDevice, PCI_command, 2, pcicmd); + fPCI->write_pci_config(fPCIDevice, PCI_command, 2, pcicmd); if (fPCIVendorID == PCI_VENDOR_JMICRON) { - uint32 ctrl = gPCI->read_pci_config(fPCIDevice, PCI_JMICRON_CONTROLLER_CONTROL_1, 4); + uint32 ctrl = fPCI->read_pci_config(fPCIDevice, PCI_JMICRON_CONTROLLER_CONTROL_1, 4); TRACE("Jmicron controller control 1 old 0x%08lx\n", ctrl); ctrl &= ~((1 << 9) | (1 << 12) | (1 << 14)); // disable SFF 8038i emulation ctrl |= (1 << 8) | (1 << 13) | (1 << 15); // enable AHCI controller TRACE("Jmicron controller control 1 new 0x%08lx\n", ctrl); - gPCI->write_pci_config(fPCIDevice, PCI_JMICRON_CONTROLLER_CONTROL_1, 4, ctrl); + fPCI->write_pci_config(fPCIDevice, PCI_JMICRON_CONTROLLER_CONTROL_1, 4, ctrl); } fIRQ = pciInfo.u.h0.interrupt_line; @@ -258,9 +261,9 @@ AHCIController::ResetController() int portCount = 1 + ((fRegs->cap >> CAP_NP_SHIFT) & CAP_NP_MASK); if (portCount > 8) panic("Intel AHCI: too many SATA ports! Please report at http://dev.haiku-os.org"); - uint16 pcs = gPCI->read_pci_config(fPCIDevice, 0x92, 2); + uint16 pcs = fPCI->read_pci_config(fPCIDevice, 0x92, 2); pcs |= (0xff >> (8 - portCount)); - gPCI->write_pci_config(fPCIDevice, 0x92, 2, pcs); + fPCI->write_pci_config(fPCIDevice, 0x92, 2, pcs); } return B_OK; } diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.h b/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.h index ebf9fc4ef3..9fd2a6b415 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.h +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.h @@ -12,17 +12,20 @@ class AHCIController { public: - AHCIController(device_node *node, pci_device *pciDevice); + AHCIController(device_node *node, + pci_device_module_info *pciModule, + pci_device *pciDevice); ~AHCIController(); - status_t Init(); - void Uninit(); + status_t Init(); + void Uninit(); - void ExecuteRequest(scsi_ccb *request); - uchar AbortRequest(scsi_ccb *request); - uchar TerminateRequest(scsi_ccb *request); - uchar ResetDevice(uchar targetID, uchar targetLUN); - void GetRestrictions(uchar targetID, bool *isATAPI, bool *noAutoSense, uint32 *maxBlocks); + void ExecuteRequest(scsi_ccb *request); + uchar AbortRequest(scsi_ccb *request); + uchar TerminateRequest(scsi_ccb *request); + uchar ResetDevice(uchar targetID, uchar targetLUN); + void GetRestrictions(uchar targetID, bool *isATAPI, + bool *noAutoSense, uint32 *maxBlocks); device_node * DeviceNode() { return fNode; } @@ -37,6 +40,7 @@ private: private: device_node * fNode; + pci_device_module_info *fPCI; pci_device * fPCIDevice; uint16 fPCIVendorID; uint16 fPCIDeviceID; diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_defs.h b/src/add-ons/kernel/busses/scsi/ahci/ahci_defs.h index 8324f18eb1..96faafa934 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_defs.h +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_defs.h @@ -12,8 +12,8 @@ extern "C" { #endif -#define AHCI_DEVICE_MODULE_NAME "busses/scsi/ahci/device_v1" -#define AHCI_SIM_MODULE_NAME "busses/scsi/ahci/sim/v1" +#define AHCI_DEVICE_MODULE_NAME "busses/scsi/ahci/driver_v1" +#define AHCI_SIM_MODULE_NAME "busses/scsi/ahci/sim/driver_v1" // RW1 = Write 1 to set bit (writing 0 is ignored) // RWC = Write 1 to clear bit (writing 0 is ignored) @@ -256,7 +256,6 @@ status_t get_device_info(uint16 vendorID, uint16 deviceID, const char **name, ui extern scsi_sim_interface gAHCISimInterface; extern device_manager_info *gDeviceManager; -extern pci_device_module_info *gPCI; extern scsi_for_sim_interface *gSCSI; diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_sim.cpp b/src/add-ons/kernel/busses/scsi/ahci/ahci_sim.cpp index b2b0ac32df..ce9683268b 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_sim.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_sim.cpp @@ -14,11 +14,6 @@ #define FLOW(a...) -pci_device_module_info *gPCI; -device_manager_info *gDeviceManager; -scsi_for_sim_interface *gSCSI; - - // #pragma mark - SIM module interface @@ -137,13 +132,15 @@ ahci_sim_init_bus(device_node *node, void **_cookie) device_node *pciParent = gDeviceManager->get_parent_node(parent); gDeviceManager->put_node(parent); + pci_device_module_info *pci; pci_device *pciDevice; - gDeviceManager->get_driver(pciParent, NULL, (void **)&pciDevice); + gDeviceManager->get_driver(pciParent, (driver_module_info **)&pci, + (void **)&pciDevice); gDeviceManager->put_node(pciParent); TRACE("ahci_sim_init_bus: pciDevice %p\n", pciDevice); - AHCIController *controller = new(std::nothrow) AHCIController(node, + AHCIController *controller = new(std::nothrow) AHCIController(node, pci, pciDevice); if (!controller) return B_NO_MEMORY;