mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-19 10:44:14 +08:00
rtw88: pci: Move a mass of jobs in hw IRQ to soft IRQ
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 <jian-hong@endlessm.com> Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
9f7d65fb39
commit
b3d07736b3
@ -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)
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user