From 9781bd2e096f175d11598a550c7488e70bfa380d Mon Sep 17 00:00:00 2001 From: Marcus Overhagen Date: Mon, 31 Aug 2009 23:25:35 +0000 Subject: [PATCH] Enable busmaserting ans io decoder if not already done by the BIOS. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32878 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/generic/ata_adapter/ata_adapter.c | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/add-ons/kernel/generic/ata_adapter/ata_adapter.c b/src/add-ons/kernel/generic/ata_adapter/ata_adapter.c index 620077ed10..cd92dc43cf 100644 --- a/src/add-ons/kernel/generic/ata_adapter/ata_adapter.c +++ b/src/add-ons/kernel/generic/ata_adapter/ata_adapter.c @@ -482,6 +482,8 @@ ata_adapter_detect_channel(pci_device_module_info *pci, pci_device *pci_device, device_node **node, bool supports_compatibility_mode) { uint8 api; + uint16 pcicmdOld; + uint16 pcicmdNew; SHOW_FLOW0( 3, "" ); @@ -520,6 +522,24 @@ ata_adapter_detect_channel(pci_device_module_info *pci, pci_device *pci_device, command_block_base, control_block_base, intnum); } + + // this should be done in ata_adapter_init_controller but there is crashes + pcicmdOld = pcicmdNew = pci->read_pci_config(pci_device, PCI_command, 2); + if ((pcicmdNew & PCI_command_io) == 0) { + TRACE("PCI-ATA: enabling io decoder\n"); + pcicmdNew |= PCI_command_io; + } + if ((pcicmdNew & PCI_command_master) == 0) { + TRACE("PCI-ATA: enabling bus mastering\n"); + pcicmdNew |= PCI_command_master; + } + if (pcicmdOld != pcicmdNew) { + pci->write_pci_config(pci_device, PCI_command, 2, pcicmdNew); + TRACE("PCI-ATA: pcicmd old 0x%04x, new 0x%04x\n", + pcicmdOld, pcicmdNew); + } + + if (supports_compatibility_mode) { // read status of primary(!) channel to detect simplex uint8 status = pci->read_io_8(pci_device, bus_master_base