Hi, Ben, ok for me. thanks, Yu On Tue, 2015-11-24 at 22:33 +0000, Ben Hutchings wrote: > 3.2.74-rc1 review patch. If anyone has any objections, please let me know. > > ------------------ > > From: Chen Yu <yu.c.chen@xxxxxxxxx> > > commit 49e4b84333f338d4f183f28f1f3c1131b9fb2b5a upstream. > > Currently when the system is trying to uninstall the ACPI interrupt > handler, it uses acpi_gbl_FADT.sci_interrupt as the IRQ number. > However, the IRQ number that the ACPI interrupt handled is installed > for comes from acpi_gsi_to_irq() and that is the number that should > be used for the handler removal. > > Fix this problem by using the mapped IRQ returned from acpi_gsi_to_irq() > as appropriate. > > Acked-by: Lv Zheng <lv.zheng@xxxxxxxxx> > Signed-off-by: Chen Yu <yu.c.chen@xxxxxxxxx> > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > [bwh: Backported to 3.2: adjust context] > Signed-off-by: Ben Hutchings <ben@xxxxxxxxxxxxxxx> > --- > drivers/acpi/osl.c | 9 ++++++--- > include/linux/acpi.h | 6 ++++++ > 2 files changed, 12 insertions(+), 3 deletions(-) > > --- a/drivers/acpi/osl.c > +++ b/drivers/acpi/osl.c > @@ -82,6 +82,7 @@ static struct workqueue_struct *kacpid_w > static struct workqueue_struct *kacpi_notify_wq; > struct workqueue_struct *kacpi_hotplug_wq; > EXPORT_SYMBOL(kacpi_hotplug_wq); > +unsigned int acpi_sci_irq = INVALID_ACPI_IRQ; > > struct acpi_res_list { > resource_size_t start; > @@ -566,17 +567,19 @@ acpi_os_install_interrupt_handler(u32 gs > acpi_irq_handler = NULL; > return AE_NOT_ACQUIRED; > } > + acpi_sci_irq = irq; > > return AE_OK; > } > > -acpi_status acpi_os_remove_interrupt_handler(u32 irq, acpi_osd_handler handler) > +acpi_status acpi_os_remove_interrupt_handler(u32 gsi, acpi_osd_handler handler) > { > - if (irq != acpi_gbl_FADT.sci_interrupt) > + if (gsi != acpi_gbl_FADT.sci_interrupt || !acpi_sci_irq_valid()) > return AE_BAD_PARAMETER; > > - free_irq(irq, acpi_irq); > + free_irq(acpi_sci_irq, acpi_irq); > acpi_irq_handler = NULL; > + acpi_sci_irq = INVALID_ACPI_IRQ; > > return AE_OK; > } > --- a/include/linux/acpi.h > +++ b/include/linux/acpi.h > @@ -110,6 +110,12 @@ int acpi_unregister_ioapic(acpi_handle h > void acpi_irq_stats_init(void); > extern u32 acpi_irq_handled; > extern u32 acpi_irq_not_handled; > +extern unsigned int acpi_sci_irq; > +#define INVALID_ACPI_IRQ ((unsigned)-1) > +static inline bool acpi_sci_irq_valid(void) > +{ > + return acpi_sci_irq != INVALID_ACPI_IRQ; > +} > > extern int sbf_port; > extern unsigned long acpi_realmode_flags; > ��.n��������+%������w��{.n�����������ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f