Fix for IDE controller. Some weird controllers generate an interrupt even if IDE interrupts are disabled and no IDE devices. For example, notebook ASUS K72F - IDE controller 010185 generates false interrupt when we work with the IDE controller 01018f. For this reason, the interrupt handler does not need to be installed if both channel IDE controller running in PIO mode.

git-svn-id: svn://kolibrios.org@4838 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Marat Zakiyanov (Mario79) 2014-04-15 10:01:23 +00:00
parent 1c4e6a64d3
commit 26aad0cc40
2 changed files with 62 additions and 42 deletions

View File

@ -708,6 +708,7 @@ endg
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
align 4 align 4
IDE_irq_14_handler: IDE_irq_14_handler:
; DEBUGF 1, 'K : IDE_irq_14_handler %x\n', [IDE_common_irq_param]:2
cmp [IDE_common_irq_param], irq14_num cmp [IDE_common_irq_param], irq14_num
jne .exit jne .exit
@ -748,6 +749,7 @@ IDE_irq_14_handler:
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
align 4 align 4
IDE_irq_15_handler: IDE_irq_15_handler:
; DEBUGF 1, 'K : IDE_irq_15_handler %x\n', [IDE_common_irq_param]:2
cmp [IDE_common_irq_param], irq15_num cmp [IDE_common_irq_param], irq15_num
jne .exit jne .exit
@ -789,6 +791,7 @@ IDE_irq_15_handler:
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
align 4 align 4
IDE_common_irq_handler: IDE_common_irq_handler:
; DEBUGF 1, 'K : IDE_common_irq_handler %x\n', [IDE_common_irq_param]:2
cmp [IDE_common_irq_param], 0 cmp [IDE_common_irq_param], 0
je .exit je .exit

View File

@ -238,47 +238,8 @@ Init_IDE_ATA_controller_2:
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
; set interrupts for IDE Controller ; set interrupts for IDE Controller
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
mov esi, boot_set_int_IDE pushfd
call boot_log cli
.set_interrupts_for_IDE_controllers:
mov eax, [ecx+IDE_DATA.ProgrammingInterface]
cmp ax, 0x0180
je .pata_ide
cmp ax, 0x018a
jne .sata_ide
;--------------------------------------
.pata_ide:
cmp [ecx+IDE_DATA.RegsBaseAddres], 0
je .end_set_interrupts
push ecx
stdcall attach_int_handler, 14, IDE_irq_14_handler, 0
DEBUGF 1, "K : Set IDE IRQ14 return code %x\n", eax
stdcall attach_int_handler, 15, IDE_irq_15_handler, 0
DEBUGF 1, "K : Set IDE IRQ15 return code %x\n", eax
pop ecx
jmp .enable_IDE_interrupt
;--------------------------------------
.sata_ide:
cmp ax, 0x0185
je .sata_ide_1
cmp ax, 0x018f
jne .end_set_interrupts
;--------------------------------------
.sata_ide_1:
cmp [ecx+IDE_DATA.RegsBaseAddres], 0
je .end_set_interrupts
mov ax, [ecx+IDE_DATA.Interrupt]
movzx eax, al
push ecx
stdcall attach_int_handler, eax, IDE_common_irq_handler, 0
pop ecx
DEBUGF 1, "K : Set IDE IRQ%d return code %x\n", [ecx+IDE_DATA.Interrupt]:1, eax
;--------------------------------------
.enable_IDE_interrupt: .enable_IDE_interrupt:
mov esi, boot_enabling_ide mov esi, boot_enabling_ide
call boot_log call boot_log
@ -369,7 +330,7 @@ Init_IDE_ATA_controller_2:
;-------------------------------------- ;--------------------------------------
.ch2_pio_set_for_all: .ch2_pio_set_for_all:
mov [ecx+IDE_DATA.dma_hdd_channel_2], al mov [ecx+IDE_DATA.dma_hdd_channel_2], al
jmp .end_set_interrupts jmp .set_interrupts_for_IDE_controllers
;-------------------------------------- ;--------------------------------------
@@: @@:
mov ebx, 4 mov ebx, 4
@ -406,7 +367,63 @@ Init_IDE_ATA_controller_2:
DEBUGF 1, "K : IDE CH2 DMA enabled\n" DEBUGF 1, "K : IDE CH2 DMA enabled\n"
mov [ecx+IDE_DATA.dma_hdd_channel_2], byte 1 mov [ecx+IDE_DATA.dma_hdd_channel_2], byte 1
;-------------------------------------- ;--------------------------------------
.set_interrupts_for_IDE_controllers:
mov esi, boot_set_int_IDE
call boot_log
;--------------------------------------
mov eax, [ecx+IDE_DATA.ProgrammingInterface]
cmp ax, 0x0180
je .pata_ide
cmp ax, 0x018a
jne .sata_ide
;--------------------------------------
.pata_ide:
cmp [ecx+IDE_DATA.RegsBaseAddres], 0
je .end_set_interrupts
push ecx
stdcall attach_int_handler, 14, IDE_irq_14_handler, 0
DEBUGF 1, "K : Set IDE IRQ14 return code %x\n", eax
stdcall attach_int_handler, 15, IDE_irq_15_handler, 0
DEBUGF 1, "K : Set IDE IRQ15 return code %x\n", eax
pop ecx
jmp .end_set_interrupts
;--------------------------------------
.sata_ide:
cmp ax, 0x0185
je .sata_ide_1
cmp ax, 0x018f
jne .end_set_interrupts
;--------------------------------------
.sata_ide_1:
; Some weird controllers generate an interrupt even if IDE interrupts
; are disabled and no IDE devices. For example, notebook ASUS K72F -
; IDE controller 010185 generates false interrupt when we work with
; the IDE controller 01018f. For this reason, the interrupt handler
; does not need to be installed if both channel IDE controller
; running in PIO mode.
cmp [ecx+IDE_DATA.RegsBaseAddres], 0
je .end_set_interrupts
cmp [ecx+IDE_DATA.dma_hdd_channel_1], 0
jne @f
cmp [ecx+IDE_DATA.dma_hdd_channel_2], 0
je .end_set_interrupts
;--------------------------------------
@@:
mov ax, [ecx+IDE_DATA.Interrupt]
movzx eax, al
push ecx
stdcall attach_int_handler, eax, IDE_common_irq_handler, 0
pop ecx
DEBUGF 1, "K : Set IDE IRQ%d return code %x\n", [ecx+IDE_DATA.Interrupt]:1, eax
;--------------------------------------
.end_set_interrupts: .end_set_interrupts:
popfd
ret ret
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
; END of initialisation IDE ATA code ; END of initialisation IDE ATA code