From f53094e7eada5330f9f4da7abe832cc4d87cfb55 Mon Sep 17 00:00:00 2001 From: Marcus Overhagen Date: Sat, 10 Nov 2007 18:41:24 +0000 Subject: [PATCH] fail gracefully when base address register or irq hasn't been assigned. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22876 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../busses/scsi/ahci/ahci_controller.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) 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 99ffedc174..46ed6c6c50 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.cpp @@ -98,11 +98,21 @@ AHCIController::Init() gPCI->write_pci_config(fPCIDevice, PCI_JMICRON_CONTROLLER_CONTROL_1, 4, ctrl); } + fIRQ = pciInfo.u.h0.interrupt_line; + if (fIRQ == 0 || fIRQ == 0xff) { + TRACE("PCI IRQ not assigned\n"); + return B_ERROR; + } + void *addr = (void *)pciInfo.u.h0.base_registers[5]; size_t size = pciInfo.u.h0.base_register_sizes[5]; TRACE("registers at %p, size %#lx\n", addr, size); - + if (!addr) { + TRACE("PCI base address register 5 not assigned\n"); + return B_ERROR; + } + fRegsArea = map_mem((void **)&fRegs, addr, size, 0, "AHCI HBA regs"); if (fRegsArea < B_OK) { TRACE("mapping registers failed\n"); @@ -123,12 +133,6 @@ AHCIController::Init() goto err; } - fIRQ = gPCI->read_pci_config(fPCIDevice, PCI_interrupt_line, 1); - if (fIRQ == 0 || fIRQ == 0xff) { - TRACE("no IRQ assigned\n"); - goto err; - } - TRACE("cap: Interface Speed Support: generation %lu\n", (fRegs->cap >> CAP_ISS_SHIFT) & CAP_ISS_MASK); TRACE("cap: Number of Command Slots: %d (raw %#lx)\n", fCommandSlotCount, (fRegs->cap >> CAP_NCS_SHIFT) & CAP_NCS_MASK); TRACE("cap: Number of Ports: %d (raw %#lx)\n", fPortCountMax, (fRegs->cap >> CAP_NP_SHIFT) & CAP_NP_MASK);