Skip to content

Commit

Permalink
rtw88: pci: Move a mass of jobs in hw IRQ to soft IRQ
Browse files Browse the repository at this point in the history
There is a mass of jobs between spin lock and unlock in the hardware
IRQ which will occupy much time originally. To make system work more
efficiently, this patch moves the jobs to the soft IRQ (bottom half) to
reduce the time in hardware IRQ.

Signed-off-by: Jian-Hong Pan <[email protected]>
Signed-off-by: Yan-Hsuan Chuang <[email protected]>
Signed-off-by: Kalle Valo <[email protected]>
  • Loading branch information
starnight authored and Kalle Valo committed Sep 3, 2019
1 parent 9f7d65f commit b3d0773
Showing 1 changed file with 26 additions and 6 deletions.
32 changes: 26 additions & 6 deletions drivers/net/wireless/realtek/rtw88/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -866,12 +866,29 @@ static irqreturn_t rtw_pci_interrupt_handler(int irq, void *dev)
{
struct rtw_dev *rtwdev = dev;
struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
u32 irq_status[4];

spin_lock(&rtwpci->irq_lock);
if (!rtwpci->irq_enabled)
goto out;

/* disable RTW PCI interrupt to avoid more interrupts before the end of
* thread function
*/
rtw_pci_disable_interrupt(rtwdev, rtwpci);
out:
spin_unlock(&rtwpci->irq_lock);

return IRQ_WAKE_THREAD;
}

static irqreturn_t rtw_pci_interrupt_threadfn(int irq, void *dev)
{
struct rtw_dev *rtwdev = dev;
struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
unsigned long flags;
u32 irq_status[4];

spin_lock_irqsave(&rtwpci->irq_lock, flags);
rtw_pci_irq_recognized(rtwdev, rtwpci, irq_status);

if (irq_status[0] & IMR_MGNTDOK)
Expand All @@ -891,8 +908,9 @@ static irqreturn_t rtw_pci_interrupt_handler(int irq, void *dev)
if (irq_status[0] & IMR_ROK)
rtw_pci_rx_isr(rtwdev, rtwpci, RTW_RX_QUEUE_MPDU);

out:
spin_unlock(&rtwpci->irq_lock);
/* all of the jobs for this interrupt have been done */
rtw_pci_enable_interrupt(rtwdev, rtwpci);
spin_unlock_irqrestore(&rtwpci->irq_lock, flags);

return IRQ_HANDLED;
}
Expand Down Expand Up @@ -1152,8 +1170,10 @@ static int rtw_pci_probe(struct pci_dev *pdev,
goto err_destroy_pci;
}

ret = request_irq(pdev->irq, &rtw_pci_interrupt_handler,
IRQF_SHARED, KBUILD_MODNAME, rtwdev);
ret = devm_request_threaded_irq(rtwdev->dev, pdev->irq,
rtw_pci_interrupt_handler,
rtw_pci_interrupt_threadfn,
IRQF_SHARED, KBUILD_MODNAME, rtwdev);
if (ret) {
ieee80211_unregister_hw(hw);
goto err_destroy_pci;
Expand Down Expand Up @@ -1192,7 +1212,7 @@ static void rtw_pci_remove(struct pci_dev *pdev)
rtw_pci_disable_interrupt(rtwdev, rtwpci);
rtw_pci_destroy(rtwdev, pdev);
rtw_pci_declaim(rtwdev, pdev);
free_irq(rtwpci->pdev->irq, rtwdev);
devm_free_irq(rtwdev->dev, rtwpci->pdev->irq, rtwdev);
rtw_core_deinit(rtwdev);
ieee80211_free_hw(hw);
}
Expand Down

0 comments on commit b3d0773

Please sign in to comment.