RE: [PATCH v2 1/2] HID: intel-thc-hid: quickspi: quiesce IRQs during teardown
From: Xu, Even
Date: Tue Nov 10 2026 - 00:59:57 EST
> -----Original Message-----
> From: Myeonghun Pak <mhun512@xxxxxxxxx>
> Sent: Tuesday, November 10, 2026 12:47 PM
> To: Xu, Even <even.xu@xxxxxxxxx>; Sun, Xinpeng <xinpeng.sun@xxxxxxxxx>; Jiri
> Kosina <jikos@xxxxxxxxxx>; Benjamin Tissoires <bentiss@xxxxxxxxxx>
> Cc: Myeonghun Pak <mhun512@xxxxxxxxx>; Srinivas Pandruvada
> <srinivas.pandruvada@xxxxxxxxxxxxxxx>; Mark Pearson <mpearson-
> lenovo@xxxxxxxxx>; linux-input@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx;
> Ijae Kim <ae878000@xxxxxxxxx>
> Subject: [PATCH v2 1/2] HID: intel-thc-hid: quickspi: quiesce IRQs during
> teardown
>
> The managed IRQ can access HID/DMA buffers or queue recovery work while
> remove or probe unwind tears down those resources.
>
> Disable and synchronize the IRQ, drain recovery work, then mask THC interrupts
> before freeing the IRQ and releasing HID/DMA resources.
> Track IRQ/DMA initialization for conditional probe cleanup.
>
> Disable the IRQ before shutdown deinit as well. Keep IRQ disabling and release
> outside the shared hibernation helper.
>
> This issue was found by our static analysis tool under development.
>
> Fixes: 4138f21115ae ("HID: intel-thc-hid: intel-quickspi: Complete THC QuickSPI
> driver")
> Co-developed-by: Ijae Kim <ae878000@xxxxxxxxx>
> Signed-off-by: Ijae Kim <ae878000@xxxxxxxxx>
> Signed-off-by: Myeonghun Pak <mhun512@xxxxxxxxx>
> ---
> No hardware testing.
>
> Changes in v2:
> - Rebase on mainline b3dfbde62cf1. No source changes from v1.
>
> .../intel-thc-hid/intel-quickspi/pci-quickspi.c | 28 +++++++++++++++++-----
> 1 file changed, 22 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/hid/intel-thc-hid/intel-quickspi/pci-quickspi.c
> b/drivers/hid/intel-thc-hid/intel-quickspi/pci-quickspi.c
> index
> bf49d8ce5f07bed092339e46c444538d78cffe26..acb4d2716ea7450d2852a900c3f
> 0acc1d7570421 100644
> --- a/drivers/hid/intel-thc-hid/intel-quickspi/pci-quickspi.c
> +++ b/drivers/hid/intel-thc-hid/intel-quickspi/pci-quickspi.c
> @@ -600,6 +600,8 @@ static int quickspi_probe(struct pci_dev *pdev,
> const struct pci_device_id *id)
> {
> struct quickspi_device *qsdev;
> + bool dma_initialized = false;
> + bool irq_requested = false;
> void __iomem *mem_addr;
> int ret;
>
> @@ -652,6 +654,7 @@ static int quickspi_probe(struct pci_dev *pdev,
> qsdev);
> if (ret)
> goto dev_deinit;
> + irq_requested = true;
>
> ret = reset_tic(qsdev);
> if (ret) {
> @@ -670,17 +673,18 @@ static int quickspi_probe(struct pci_dev *pdev,
> dev_err(&pdev->dev, "Setup THC DMA failed, ret= %d\n", ret);
> goto dev_deinit;
> }
> + dma_initialized = true;
>
> ret = quickspi_get_report_descriptor(qsdev);
> if (ret) {
> dev_err(&pdev->dev, "Get report descriptor failed, ret = %d\n",
> ret);
> - goto dma_deinit;
> + goto dev_deinit;
> }
>
> ret = quickspi_hid_probe(qsdev);
> if (ret) {
> dev_err(&pdev->dev, "Failed to register HID device, ret = %d\n",
> ret);
> - goto dma_deinit;
> + goto dev_deinit;
> }
>
> qsdev->state = QUICKSPI_ENABLED;
> @@ -695,10 +699,16 @@ static int quickspi_probe(struct pci_dev *pdev,
>
> return 0;
>
> -dma_deinit:
> - quickspi_dma_deinit(qsdev);
> dev_deinit:
> + if (irq_requested) {
> + WRITE_ONCE(qsdev->recovery_disabled, true);
> + disable_irq(pdev->irq);
> + }
Add a blank line here.
> quickspi_dev_deinit(qsdev);
Blank line.
> + if (irq_requested)
> + devm_free_irq(&pdev->dev, pdev->irq, qsdev);
Here.
> + if (dma_initialized)
> + quickspi_dma_deinit(qsdev);
Here too.
And do the same thing for Quickspi driver.
Thanks!
Best Regards,
Even Xu
> disable_pci_device:
> pci_clear_master(pdev);
>
> @@ -721,9 +731,12 @@ static void quickspi_remove(struct pci_dev *pdev)
> if (!qsdev)
> return;
>
> - quickspi_hid_remove(qsdev);
> -
> + WRITE_ONCE(qsdev->recovery_disabled, true);
> + disable_irq(pdev->irq);
> quickspi_dev_deinit(qsdev);
> + devm_free_irq(&pdev->dev, pdev->irq, qsdev);
> +
> + quickspi_hid_remove(qsdev);
>
> quickspi_dma_deinit(qsdev);
>
> @@ -750,6 +763,9 @@ static void quickspi_shutdown(struct pci_dev *pdev)
> if (!qsdev)
> return;
>
> + WRITE_ONCE(qsdev->recovery_disabled, true);
> + disable_irq(pdev->irq);
> +
> quickspi_dev_deinit(qsdev);
>
> /* Must stop DMA before reboot to avoid DMA entering into unknown
> state */
>
> base-commit: b3dfbde62cf1981c4638939c159dfd087b7a72e9
> --
> 2.53.0