Run tested: ath79, ipq40xx Build tested: ath79, ipq40xx Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
		
			
				
	
	
		
			61 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From c89d85a39df353290ea7af84a32d5ca692a3c27a Mon Sep 17 00:00:00 2001
 | 
						|
From: Fugang Duan <fugang.duan@nxp.com>
 | 
						|
Date: Sat, 2 Nov 2019 15:51:40 +0800
 | 
						|
Subject: [PATCH] PCI: dwc: Use interrupt disabling instead of masking
 | 
						|
 | 
						|
commit 830920e065e9("PCI: dwc: Use interrupt masking instead
 | 
						|
of disabling") break i.MX platform PCIe suspend/resume when
 | 
						|
MSI enabled.
 | 
						|
 | 
						|
Revert the commit to keep orinigal method that using interrupt
 | 
						|
disabling instead of masking.
 | 
						|
 | 
						|
Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
 | 
						|
---
 | 
						|
 drivers/pci/controller/dwc/pcie-designware-host.c | 19 +++++++------------
 | 
						|
 1 file changed, 7 insertions(+), 12 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
 | 
						|
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
 | 
						|
@@ -157,8 +157,8 @@ static void dw_pci_bottom_mask(struct ir
 | 
						|
 	bit = d->hwirq % MAX_MSI_IRQS_PER_CTRL;
 | 
						|
 
 | 
						|
 	pp->irq_mask[ctrl] |= BIT(bit);
 | 
						|
-	dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_MASK + res, 4,
 | 
						|
-			    pp->irq_mask[ctrl]);
 | 
						|
+	dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_ENABLE + res, 4,
 | 
						|
+			    ~pp->irq_mask[ctrl]);
 | 
						|
 
 | 
						|
 	raw_spin_unlock_irqrestore(&pp->lock, flags);
 | 
						|
 }
 | 
						|
@@ -176,8 +176,8 @@ static void dw_pci_bottom_unmask(struct
 | 
						|
 	bit = d->hwirq % MAX_MSI_IRQS_PER_CTRL;
 | 
						|
 
 | 
						|
 	pp->irq_mask[ctrl] &= ~BIT(bit);
 | 
						|
-	dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_MASK + res, 4,
 | 
						|
-			    pp->irq_mask[ctrl]);
 | 
						|
+	dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_ENABLE + res, 4,
 | 
						|
+			    ~pp->irq_mask[ctrl]);
 | 
						|
 
 | 
						|
 	raw_spin_unlock_irqrestore(&pp->lock, flags);
 | 
						|
 }
 | 
						|
@@ -659,15 +659,10 @@ void dw_pcie_setup_rc(struct pcie_port *
 | 
						|
 		num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL;
 | 
						|
 
 | 
						|
 		/* Initialize IRQ Status array */
 | 
						|
-		for (ctrl = 0; ctrl < num_ctrls; ctrl++) {
 | 
						|
-			pp->irq_mask[ctrl] = ~0;
 | 
						|
-			dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_MASK +
 | 
						|
+		for (ctrl = 0; ctrl < num_ctrls; ctrl++)
 | 
						|
+			dw_pcie_rd_own_conf(pp, PCIE_MSI_INTR0_ENABLE +
 | 
						|
 					    (ctrl * MSI_REG_CTRL_BLOCK_SIZE),
 | 
						|
-					    4, pp->irq_mask[ctrl]);
 | 
						|
-			dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_ENABLE +
 | 
						|
-					    (ctrl * MSI_REG_CTRL_BLOCK_SIZE),
 | 
						|
-					    4, ~0);
 | 
						|
-		}
 | 
						|
+					    4, &pp->irq_mask[ctrl]);
 | 
						|
 	}
 | 
						|
 
 | 
						|
 	/* Setup RC BARs */
 |