The tulip driver fails to initialize in a Linux VM running on Hyper-V.
The following messages are logged in syslog when trying to load the tulip driver:
tulip: Linux Tulip drivers version 1.1.15 (Feb 27, 2007)
tulip: 0000:00:0a.0: PCI INT A: failed to register GSI
tulip: Cannot enable tulip board #0, aborting
tulip: probe of 0000:00:0a.0 failed with error -16
The tulip drivers initialization function tulip_init_one() calls pci_enable_device(). The call to pci_enable_device() eventually
results in a call to alloc_isa_irq_from_domain(), which returns -EBUSY (-16)
The message "tulip: 0000:00:0a.0: PCI INT A: failed to register GSI" is
logged by acpi_pci_irq_enable().
The flow of calls to the error is returned is:
acpi_pci_irq_enable() - Logs the message "PCI INT A: failed to register GSI"
acpi_register_gsi()
__acpi_register_gsi() is afunction pointer -> acpi_register_gsi_ioapic()
acpi_register_gsi_ioapic()
mp_map_gsi_to_irq() mp_map_ppin_to_irq() alloc_isa_irq_from_domain() Returning -EBUSY when mp_check_pin_attr() returns false.
mp_check_pin_attr() data->trigger = 1 data->polarity = 0 info->ioapic_trigger = 1 info->ioapic_polarity = 1 mp_check_pin_attr() returns false because the two polarity values do not match.
acpi_register_gsi_ioapic() is setting trigger and polarity to:
trigger = 1
polarity = 1
mp_check_pin_attr() is calling irq_get_chip_data(irq) which is returning a mp_chip_data structure with
trigger = 1
polarity = 0
Since the two polarity values do not match, mp_check_pin_attr() returns false.
Broken in 3.19.0 kernel
Works in 3.17 kernel.
Using commits to arch/x86/kernel/acpi/boot.c as reference, the commit where the issue appears is
cd68f6bd53cf89d1d5ed889b8aaf65e9c3574a079
x86, irq, acpi: Git rid of special handling of GSI for ACPI SCI
The tulip driver fails to initialize in a Linux VM running on Hyper-V.
The following messages are logged in syslog when trying to load the tulip driver:
tulip: Linux Tulip drivers version 1.1.15 (Feb 27, 2007)
tulip: 0000:00:0a.0: PCI INT A: failed to register GSI
tulip: Cannot enable tulip board #0, aborting
tulip: probe of 0000:00:0a.0 failed with error -16
The tulip drivers initialization function tulip_init_one() calls pci_enable_ device( ). The call to pci_enable_device() eventually irq_from_ domain( ), which returns -EBUSY (-16)
results in a call to alloc_isa_
The message "tulip: 0000:00:0a.0: PCI INT A: failed to register GSI" is irq_enable( ).
logged by acpi_pci_
The flow of calls to the error is returned is:
acpi_pci_ irq_enable( ) - Logs the message "PCI INT A: failed to register GSI" register_ gsi() register_ gsi() is afunction pointer -> acpi_register_ gsi_ioapic( ) register_ gsi_ioapic( ) map_gsi_ to_irq( )
mp_map_ ppin_to_ irq()
alloc_ isa_irq_ from_domain( )
Returning -EBUSY when mp_check_pin_attr() returns false.
acpi_
__acpi_
acpi_
mp_
acpi_register_ gsi_ioapic( ) is setting trigger and polarity to: chip_data( irq) which is returning a mp_chip_data structure with
trigger = 1
polarity = 1
mp_check_pin_attr() is calling irq_get_
trigger = 1
polarity = 0
Since the two polarity values do not match, mp_check_pin_attr() returns false.
Broken in 3.19.0 kernel
Works in 3.17 kernel.
Using commits to arch/x86/ kernel/ acpi/boot. c as reference, the commit where the issue appears is f89d1d5ed889b8a af65e9c3574a079
cd68f6bd53c
x86, irq, acpi: Git rid of special handling of GSI for ACPI SCI