mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From: Vasanthakumar Thiagarajan <vthiagar@qti.qualcomm.com>
 | |
| Date: Fri, 3 Jul 2015 11:45:42 +0530
 | |
| Subject: [PATCH] ath10k: Delay device access after cold reset
 | |
| 
 | |
| It is observed that during cold reset pcie access right
 | |
| after a write operation to SOC_GLOBAL_RESET_ADDRESS causes
 | |
| Data Bus Error and system hard lockup. The reason
 | |
| for bus error is that pcie needs some time to get
 | |
| back to stable state for any transaction during cold reset. Add
 | |
| delay of 20 msecs after write of SOC_GLOBAL_RESET_ADDRESS
 | |
| to fix this issue.
 | |
| 
 | |
| Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qti.qualcomm.com>
 | |
| ---
 | |
| 
 | |
| --- a/drivers/net/wireless/ath/ath10k/pci.c
 | |
| +++ b/drivers/net/wireless/ath/ath10k/pci.c
 | |
| @@ -2761,7 +2761,6 @@ static int ath10k_pci_wait_for_target_in
 | |
|  
 | |
|  static int ath10k_pci_cold_reset(struct ath10k *ar)
 | |
|  {
 | |
| -	int i;
 | |
|  	u32 val;
 | |
|  
 | |
|  	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot cold reset\n");
 | |
| @@ -2777,23 +2776,18 @@ static int ath10k_pci_cold_reset(struct
 | |
|  	val |= 1;
 | |
|  	ath10k_pci_reg_write32(ar, SOC_GLOBAL_RESET_ADDRESS, val);
 | |
|  
 | |
| -	for (i = 0; i < ATH_PCI_RESET_WAIT_MAX; i++) {
 | |
| -		if (ath10k_pci_reg_read32(ar, RTC_STATE_ADDRESS) &
 | |
| -					  RTC_STATE_COLD_RESET_MASK)
 | |
| -			break;
 | |
| -		msleep(1);
 | |
| -	}
 | |
| +	/* After writing into SOC_GLOBAL_RESET to put device into
 | |
| +	 * reset and pulling out of reset pcie may not be stable
 | |
| +	 * for any immediate pcie register access and cause bus error,
 | |
| +	 * add delay before any pcie access request to fix this issue.
 | |
| +	 */
 | |
| +	msleep(20);
 | |
|  
 | |
|  	/* Pull Target, including PCIe, out of RESET. */
 | |
|  	val &= ~1;
 | |
|  	ath10k_pci_reg_write32(ar, SOC_GLOBAL_RESET_ADDRESS, val);
 | |
|  
 | |
| -	for (i = 0; i < ATH_PCI_RESET_WAIT_MAX; i++) {
 | |
| -		if (!(ath10k_pci_reg_read32(ar, RTC_STATE_ADDRESS) &
 | |
| -					    RTC_STATE_COLD_RESET_MASK))
 | |
| -			break;
 | |
| -		msleep(1);
 | |
| -	}
 | |
| +	msleep(20);
 | |
|  
 | |
|  	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot cold reset complete\n");
 | |
|  
 |