Comment 14 for bug 1440072

Revision history for this message
nmeier (nmeier) wrote :

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