2 акт. обработчика PCI IRQ на разных линиях вешают систему

Internal structure and you change requests/suggestions
  • Mario_r4
    На PCI обычно надо прочитать или записать несколько бит в регистрах устройства, чтобы снять запрос прерывания. Проблемы возникают если драйвер этого не делает.
    Ну и надо учитывать что работа ядра в режиме обработчика прерывания сильно отличается от обычной. Многие функции ядра нельзя использовать.
  • Serge wrote:На PCI обычно надо прочитать или записать несколько бит в регистрах устройства, чтобы снять запрос прерывания. Проблемы возникают если драйвер этого не делает.
    Вообще-то подробности бы не помешали.
    Serge wrote:Ну и надо учитывать что работа ядра в режиме обработчика прерывания сильно отличается от обычной. Многие функции ядра нельзя использовать.
    Там всего-то обнуление переменной, да запись в порт IDE.

    И вообще в AHCI назначение не должно производиться вообще, т.к. контроллер не найден. Скорее всего у меня в коде нужны кое-какие проверки еще.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Вообще-то подробности бы не помешали.
    Это надо внимательно документацию на контроллер читать. С isa проблем нет, там прерывание выставлено по фронту. Импульс от чипа прошёл, и всё. А PCI по уровню. Контроллер его должен снять. У некоторых устройств достаточно прочитать регистр статуса прерываний и они автоматом сбросятся. У других надо эти биты переписать для сброса.
  • Serge wrote:Рестарт ядра снова виснет. Пишет установка обработчиков IDE и всё. Причем у меня установлен AHCI, и контроллеров IDE нет.
    Проверь пожалуйста SVN r.3785, если не прокатит, то теперь (благодаря усилиям yogev_ezra) есть отображение лога BOARD в черный фон при загрузке, вторым столбцом. Сделай фото экрана в этом случае.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Spoiler:K : Attach Interrupt 6 Handler 8003070B
    K : Set IDE IRQ6 return code 80059C10
    Intel videocard detected, PciId=8086:0102, which is known
    EDID successfully read:
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    K : edx=00036881
    K : has_ownership
    K : edx=00036881
    K : has_ownership
    K : HCSPARAMS=00200002, HCCPARAMS=00036881
    K : attaching to IRQ 0A
    K : Attach Interrupt 10 Handler 8002E3E0
    K : EHCI controller at 00:D0 with 2 ports initialized
    K : HCSPARAMS=00200002, HCCPARAMS=00036881
    K : attaching to IRQ 03
    K : Attach Interrupt 3 Handler 8002E3E0
    K : EHCI controller at 00:E8 with 2 ports initialized
    K : Attach Interrupt 1 Handler 800325D0
    K : IRQ1 error code 80059C4C
    K : kernel SVN r3785
    K : 4 CPU detected
    K : BAR0 01F0
    K : BAR1 03F4
    K : BAR2 0170
    K : BAR3 0374
    K : BAR4 0000
    K : IDEContrProgrammingInterface 0000
    K : IDE_Interrupt 0202
    K : [2] EHCI 80991094: status of port 0 changed to 00001803
    K : [2] EHCI 80995094: status of port 0 changed to 00001803
    Loading RTL8169 driver
    Hooking into device, dev:0, bus:3, irq:A, addr:0000DE00
    K : [12] EHCI 80991094 port 0 state is 00001801
    K : [12] EHCI 80991094: port 0 has HS or FS device, resetting
    K : [12] EHCI 80995094 port 0 state is 00001801
    K : [12] EHCI 80995094: port 0 has HS or FS device, resetting
    K : [14] EHCI 80991094: reset port 0 done
    K : [14] EHCI 80995094: reset port 0 done
    K : [16] EHCI 80991094 status of port 0 is 00001005
    K : [16] EHCI 80995094 status of port 0 is 00001005
    K : address set in device
    K : async advance doorbell
    K : address set in device
    K : async advance doorbell
    K : async advance int
    K : address set for controller
    K : async advance int
    K : address set for controller
    K : async advance doorbell
    K : async advance doorbell
    K : async advance int
    K : async advance int
    K : device descriptor: 12 01 00 02 09 00 01 40 87 80 24 00 00 00 00 00 00 01
    K : found USB device with ID 8087:0024, 1 configuration(s)
    K : device descriptor: 12 01 00 02 09 00 01 40 87 80 24 00 00 00 00 00 00 01
    K : found USB device with ID 8087:0024, 1 configuration(s)
    K : config descriptor: 09 02 19 00 01 01 00 E0 00 09 04 00 00 01 09 00 00 00 07 05 81 03 01 00 0C
    K : USB interface class/subclass/protocol = 09/00/00
    K : config descriptor: 09 02 19 00 01 01 00 E0 00 09 04 00 00 01 09 00 00 00 07 05 81 03 02 00 0C
    K : hub config: 09 29 06 09 00 32 00 00 FF
    K : found hub with 6 ports
    K : USB interface class/subclass/protocol = 09/00/00
    K : hub config: 0B 29 08 09 00 32 00 00 00 FF FF
    K : found hub with 8 ports
    ========= tmpdisk 0.45 =========
    trying to add disk
    disk size is not specified
    10% from free RAM will be used, new DiskSize: 324 MB
    operation completed successfully
    K : final: hub 808246D0 port 0 status 0101 change 01
    K : final: hub 808247D0 port 2 status 0101 change 01
    K : final: hub 808247D0 port 4 status 0101 change 01
    K : address set in device
    K : async advance doorbell
    K : async advance int
    K : address set for controller
    K : async advance doorbell
    K : async advance int
    K : device descriptor: 12 01 00 02 00 00 00 08 6D 04 62 C0 00 31 01 02 00 01
    K : found USB device with ID 046D:C062, 1 configuration(s)
    K : config descriptor: 09 02 22 00 01 01 00 A0 31 09 04 00 00 01 03 01 02 00 09 21 10 01 00 01 22 47 00 07 05 81 03 06 00 0A
    K : USB interface class/subclass/protocol = 03/01/02
    K : USB HID device detected
    K : report descriptor: 05 01 09 02 A1 01 09 01 A1 00 05 09 19 01 29 08 15 00 25 01 95 08 75 01 81 02 95 00 81 03 05 01 09 30 09 31 16 01 F8 26 FF 07 75 0C 95 02 81 06 09 38 15 81 25 7F 75 08 95 01 81 06 05 0C 0A 38 02 95 01 81 06 C0 C0
    K : address set in device
    K : async advance doorbell
    K : async advance int
    K : address set for controller
    K : async advance doorbell
    K : async advance int
    K : device descriptor: 12 01 10 01 00 00 00 08 2A 06 01 02 00 01 00 01 00 01
    K : found USB device with ID 062A:0201, 1 configuration(s)
    K : config descriptor: 09 02 3B 00 02 01 00 A0 32 09 04 00 00 01 03 01 01 00 09 21 10 01 00 01 22 41 00 07 05 81 03 08 00 0A 09 04 01 00 01 03 01 02 00 09 21 10 01 00 01 22 98 00 07 05 82 03 04 00 0A
    K : USB interface class/subclass/protocol = 03/01/01
    K : USB HID device detected
    K : USB interface class/subclass/protocol = 03/01/02
    K : USB HID device detected
    K : report descriptor: 05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01 75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 75 08 15 00 26 FF 00 05 07 19 00 2A FF 00 81 00 C0
    K : report descriptor: 05 01 09 02 A1 01 85 05 09 38 09 30 09 31 15 81 25 7F 75 08 95 03 81 06 C0 05 0C 09 01 A1 01 85 01 19 00 2A 3C 02 15 00 26 3C 02 95 01 75 10 81 00 C0 05 01 09 80 A1 01 85 02 19 81 29 83 25 01 75 01 95 03 81 02 95 05 81 01 C0 05 09 09 01 A1 01 85 04 0A 56 01 0A 57 01 0A 58 01 0A 59 01 0A 5A 01 0A 5B 01 0A B2 00 0A 06 02 15 00 25 01 75 01 95 08 81 02 C0 05 09 09 01 A1 01 85 06 15 00 25 01 75 01 95 15 81 01 0A 5C 01 75 01 95 01 81 02 75 01 95 02 81 01 C0
    K : final: hub 808247D0 port 4 status 0503 change 10
    K : address set in device
    K : async advance doorbell
    K : async advance int
    K : address set for controller
    K : async advance doorbell
    K : async advance int
    K : device descriptor: 12 01 00 02 00 00 00 40 51 09 42 16 00 01 01 02 03 01
    K : found USB device with ID 0951:1642, 1 configuration(s)
    K : config descriptor: 09 02 20 00 01 01 00 80 32 09 04 00 00 02 08 06 50 00 07 05 81 02 00 02 FF 07 05 02 02 00 02 FF
    K : USB interface class/subclass/protocol = 08/06/50
    K : USB mass storage device detected
    K : 1 logical unit(s)
    K : media is ready
    K : 0 attempts, 24 ticks
    K : peripheral device type is 00
    K : direct-access mass storage device detected
    K : sector size is 512, last sector is 30233587
    K : Attach Interrupt 10 Handler 809A4A54
    ETH_input: Unknown packet type=0018
    ETH_input: Unknown packet type=0888
    На рестарте после
    K : IDEContrProgrammingInterface 0000
    K : IDE_Interrupt 0202
    пишет
    'K : warning: relinking handler from IRQ3 to IRQ10
    и всё виснет.

    Update. Нашел ошибки в коде.

    Code: Select all

            stdcall attach_int_handler, 14, IDE_common_irq_handler, 0
            DEBUGF  1, "K : Set IDE IRQ14 return code %x\n", eax
            stdcall attach_int_handler, 15, IDE_common_irq_handler, 0
            DEBUGF  1, "K : Set IDE IRQ15 return code %x\n", eax
    
            stdcall enable_irq, 14 <<<<<<лишний вызов, attach_int_handler  уже размаскировала линию irq
            stdcall enable_irq, 15 <<<<<<лишний вызов
    
            jmp     .enable_IDE_interrupt
    ;--------------------------------------
    .sata_ide:
            cmp     ax, 0x0185
            je      .sata_ide_1
    
            cmp     ax, 0x018f
            jne     .end_set_interrupts
    ;--------------------------------------
    .sata_ide_1:
            cmp     [IDEContrRegsBaseAddr], 0
            je      .end_set_interrupts
    
            mov     ax, [IDE_Interrupt]
            movzx   eax, al
            stdcall attach_int_handler, eax, IDE_common_irq_handler, 0
            DEBUGF  1, "K : Set IDE IRQ%d return code %x\n", [IDE_Interrupt]:1, eax
    
            stdcall enable_irq, eax <<<<<<в eax содержится адрес структуры обработчика
    
    Update 2.
    Mario
    Думаю, твой код здесь ни при чём.
    Методом научного тыка установил, что рестарт с включённым APIC не приводит к зависанию ядра. Когда я правил sound.asm у меня в образе лежал devices.dat и ядро работало в режиме apic. Потом я обновлял образ, когда менял /addappl на /KolibriOS, ядро работало в дефолтном PIC и перестало рестартовать.
    Attachments
    restart-apic.txt (5.75 KiB)
    рестарт ядра в режиме apic
    Downloaded 286 times
  • stdcall enable_irq, eax <<<<<<в eax содержится адрес структуры обработчика
    Serge - ну, ты мозг! Я уже свой сломал почти, почему у меня DMA для такого режима не пашет. :-)
    Вот так вот тупейшая ошибка, а у меня глаз уже "замылился".

    З.Ы. В ревизии 3791 убрал лишние вызовы stdcall enable_irq. DMA все еще не хочет дружить с контроллерами SATA IDE, но по крайней мере теперь при включенном DMA у меня хотя бы Dell Inspiron загружаться начал.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Who is online

    Users browsing this forum: Ahrefs [Bot] and 2 guests