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
This commit is contained in:
Marcus Overhagen
2008-05-24 13:40:58 +00:00
parent 6607b17d6b
commit 33e9755153
2 changed files with 10 additions and 7 deletions
+1
View File
@@ -518,6 +518,7 @@ struct pci_module_info {
#define PCI_command_address_step 0x080 /* 1/0 address stepping en/disabled */ #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_serr 0x100 /* 1/0 SERR# en/disabled */
#define PCI_command_fastback 0x200 /* 1/0 fast back-to-back 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 */
/* --- /* ---
@@ -86,7 +86,8 @@ AHCIController::Init()
uint16 pcicmd = gPCI->read_pci_config(fPCIDevice, PCI_command, 2); uint16 pcicmd = gPCI->read_pci_config(fPCIDevice, PCI_command, 2);
TRACE("pcicmd old 0x%04x\n", pcicmd); 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); TRACE("pcicmd new 0x%04x\n", pcicmd);
gPCI->write_pci_config(fPCIDevice, PCI_command, 2, pcicmd); gPCI->write_pci_config(fPCIDevice, PCI_command, 2, pcicmd);
@@ -101,7 +102,7 @@ AHCIController::Init()
fIRQ = pciInfo.u.h0.interrupt_line; fIRQ = pciInfo.u.h0.interrupt_line;
if (fIRQ == 0 || fIRQ == 0xff) { if (fIRQ == 0 || fIRQ == 0xff) {
TRACE("PCI IRQ not assigned\n"); TRACE("Error: PCI IRQ not assigned\n");
return B_ERROR; return B_ERROR;
} }
@@ -274,12 +275,13 @@ int32
AHCIController::Interrupt(void *data) AHCIController::Interrupt(void *data)
{ {
AHCIController *self = (AHCIController *)data; AHCIController *self = (AHCIController *)data;
uint32 int_stat = self->fRegs->is & self->fPortImplementedMask; uint32 interruptPending = self->fRegs->is & self->fPortImplementedMask;
if (int_stat == 0)
if (interruptPending == 0)
return B_UNHANDLED_INTERRUPT; return B_UNHANDLED_INTERRUPT;
for (int i = 0; i < self->fPortCountMax; i++) { for (int i = 0; i < self->fPortCountMax; i++) {
if (int_stat & (1 << i)) { if (interruptPending & (1 << i)) {
if (self->fPort[i]) { if (self->fPort[i]) {
self->fPort[i]->Interrupt(); self->fPort[i]->Interrupt();
} else { } else {
@@ -288,8 +290,8 @@ AHCIController::Interrupt(void *data)
} }
} }
// clear interrupts // clear pending interrupts
self->fRegs->is = int_stat; self->fRegs->is = interruptPending;
return B_INVOKE_SCHEDULER; return B_INVOKE_SCHEDULER;
} }