* gPCI was never set anymore after my changes. I replaced it now by a fPCI

member in AHCIController, since, at least in theory, every PCI device could
  come with its own module.
* Fixed exported module names to indicate compliance with the new device
  manager.
* Apparently, GCC4 doesn't like mixing C++/C linkage even for variables anymore,
  though it really shouldn't care about that.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25699 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2008-05-29 12:17:22 +00:00
parent c61ea1148f
commit 1a4dcbd8de
5 changed files with 47 additions and 40 deletions
@@ -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)
@@ -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;
}
@@ -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;
@@ -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;
@@ -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;