From 33e9755153f1f988d77a3946ec6cc9936ebfd01b Mon Sep 17 00:00:00 2001 From: Marcus Overhagen Date: Sat, 24 May 2008 13:40:58 +0000 Subject: [PATCH] Small cleanup of ahci driver. Also clear the PCI interrupt disable bit during setup. Add PCI command ID (interrupt disable) define to PCI.h git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25634 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/drivers/PCI.h | 1 + .../kernel/busses/scsi/ahci/ahci_controller.cpp | 16 +++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/headers/os/drivers/PCI.h b/headers/os/drivers/PCI.h index 0211d0ba62..d1f1cb3c5a 100644 --- a/headers/os/drivers/PCI.h +++ b/headers/os/drivers/PCI.h @@ -518,6 +518,7 @@ struct pci_module_info { #define PCI_command_address_step 0x080 /* 1/0 address stepping en/disabled */ #define PCI_command_serr 0x100 /* 1/0 SERR# en/disabled */ #define PCI_command_fastback 0x200 /* 1/0 fast back-to-back en/disabled */ +#define PCI_command_int_disable 0x400 /* 1/0 interrupt generation dis/enabled */ /* --- 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 b48a5fbbdd..8ec84c017c 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_controller.cpp @@ -86,7 +86,8 @@ AHCIController::Init() uint16 pcicmd = gPCI->read_pci_config(fPCIDevice, PCI_command, 2); TRACE("pcicmd old 0x%04x\n", pcicmd); - pcicmd = PCI_command_master | PCI_command_memory | (pcicmd & ~PCI_command_io); + 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); @@ -101,7 +102,7 @@ AHCIController::Init() fIRQ = pciInfo.u.h0.interrupt_line; if (fIRQ == 0 || fIRQ == 0xff) { - TRACE("PCI IRQ not assigned\n"); + TRACE("Error: PCI IRQ not assigned\n"); return B_ERROR; } @@ -274,12 +275,13 @@ int32 AHCIController::Interrupt(void *data) { AHCIController *self = (AHCIController *)data; - uint32 int_stat = self->fRegs->is & self->fPortImplementedMask; - if (int_stat == 0) + uint32 interruptPending = self->fRegs->is & self->fPortImplementedMask; + + if (interruptPending == 0) return B_UNHANDLED_INTERRUPT; for (int i = 0; i < self->fPortCountMax; i++) { - if (int_stat & (1 << i)) { + if (interruptPending & (1 << i)) { if (self->fPort[i]) { self->fPort[i]->Interrupt(); } else { @@ -288,8 +290,8 @@ AHCIController::Interrupt(void *data) } } - // clear interrupts - self->fRegs->is = int_stat; + // clear pending interrupts + self->fRegs->is = interruptPending; return B_INVOKE_SCHEDULER; }