|
|
@@ -2053,25 +2053,10 @@ static void ath10k_pci_hif_power_down(struct ath10k *ar)
|
|
|
|
|
|
#ifdef CONFIG_PM
|
|
|
|
|
|
-#define ATH10K_PCI_PM_CONTROL 0x44
|
|
|
-
|
|
|
static int ath10k_pci_hif_suspend(struct ath10k *ar)
|
|
|
{
|
|
|
- struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
|
|
|
- struct pci_dev *pdev = ar_pci->pdev;
|
|
|
- u32 val;
|
|
|
-
|
|
|
ath10k_pci_sleep(ar);
|
|
|
|
|
|
- pci_read_config_dword(pdev, ATH10K_PCI_PM_CONTROL, &val);
|
|
|
-
|
|
|
- if ((val & 0x000000ff) != 0x3) {
|
|
|
- pci_save_state(pdev);
|
|
|
- pci_disable_device(pdev);
|
|
|
- pci_write_config_dword(pdev, ATH10K_PCI_PM_CONTROL,
|
|
|
- (val & 0xffffff00) | 0x03);
|
|
|
- }
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -2088,22 +2073,14 @@ static int ath10k_pci_hif_resume(struct ath10k *ar)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- pci_read_config_dword(pdev, ATH10K_PCI_PM_CONTROL, &val);
|
|
|
-
|
|
|
- if ((val & 0x000000ff) != 0) {
|
|
|
- pci_restore_state(pdev);
|
|
|
- pci_write_config_dword(pdev, ATH10K_PCI_PM_CONTROL,
|
|
|
- val & 0xffffff00);
|
|
|
- /*
|
|
|
- * Suspend/Resume resets the PCI configuration space,
|
|
|
- * so we have to re-disable the RETRY_TIMEOUT register (0x41)
|
|
|
- * to keep PCI Tx retries from interfering with C3 CPU state
|
|
|
- */
|
|
|
- pci_read_config_dword(pdev, 0x40, &val);
|
|
|
-
|
|
|
- if ((val & 0x0000ff00) != 0)
|
|
|
- pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
|
|
|
- }
|
|
|
+ /* Suspend/Resume resets the PCI configuration space, so we have to
|
|
|
+ * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
|
|
|
+ * from interfering with C3 CPU state. pci_restore_state won't help
|
|
|
+ * here since it only restores the first 64 bytes pci config header.
|
|
|
+ */
|
|
|
+ pci_read_config_dword(pdev, 0x40, &val);
|
|
|
+ if ((val & 0x0000ff00) != 0)
|
|
|
+ pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
|
|
|
|
|
|
return ret;
|
|
|
}
|