diff --git a/pci.c b/pci.c
index 786a486..0f1a886 100644
--- a/pci.c
+++ b/pci.c
@@ -581,23 +581,28 @@ static int rtw_pci_start(struct rtw_dev *rtwdev)
 {
 	struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
 
+	rtw_pci_napi_start(rtwdev);
+
 	spin_lock_bh(&rtwpci->irq_lock);
 	rtw_pci_enable_interrupt(rtwdev, rtwpci, false);
 	spin_unlock_bh(&rtwpci->irq_lock);
 
-	rtw_pci_napi_start(rtwdev);
-
 	return 0;
 }
 
 static void rtw_pci_stop(struct rtw_dev *rtwdev)
 {
 	struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
+	struct pci_dev *pdev = rtwpci->pdev;
+
+	spin_lock_bh(&rtwpci->irq_lock);
+	rtw_pci_disable_interrupt(rtwdev, rtwpci);
+//	synchronize_irq(pdev->irq);
+	spin_unlock_bh(&rtwpci->irq_lock);
 
 	rtw_pci_napi_stop(rtwdev);
 
 	spin_lock_bh(&rtwpci->irq_lock);
-	rtw_pci_disable_interrupt(rtwdev, rtwpci);
 	rtw_pci_dma_release(rtwdev, rtwpci);
 	spin_unlock_bh(&rtwpci->irq_lock);
 }
@@ -1558,7 +1569,8 @@ static int rtw_pci_napi_poll(struct napi_struct *napi, int budget)
 	if (work_done < budget) {
 		napi_complete_done(napi, work_done);
 		spin_lock_bh(&rtwpci->irq_lock);
-		rtw_pci_enable_interrupt(rtwdev, rtwpci, false);
+		if (rtwpci->irq_enabled)
+			rtw_pci_enable_interrupt(rtwdev, rtwpci, false);
 		spin_unlock_bh(&rtwpci->irq_lock);
 		/* When ISR happens during polling and before napi_complete
 		 * while no further data is received. Data on the dma_ring will
@@ -1566,7 +1578,7 @@ static int rtw_pci_napi_poll(struct napi_struct *napi, int budget)
 		 * empty and perform napi_schedule accordingly.
 		 */
 		if (rtw_pci_get_hw_rx_ring_nr(rtwdev, rtwpci))
-			napi_schedule(napi);
+			napi_reschedule(napi);
 	}
 
 	return work_done;
