|
@@ -87,6 +87,7 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
struct ath_softc *sc;
|
|
|
struct ieee80211_hw *hw;
|
|
|
u8 csz;
|
|
|
+ u32 val;
|
|
|
int ret = 0;
|
|
|
struct ath_hw *ah;
|
|
|
|
|
@@ -133,6 +134,14 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
|
|
|
pci_set_master(pdev);
|
|
|
|
|
|
+ /*
|
|
|
+ * 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);
|
|
|
+
|
|
|
ret = pci_request_region(pdev, 0, "ath9k");
|
|
|
if (ret) {
|
|
|
dev_err(&pdev->dev, "PCI memory region reserve error\n");
|
|
@@ -239,12 +248,21 @@ static int ath_pci_resume(struct pci_dev *pdev)
|
|
|
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
|
|
|
struct ath_wiphy *aphy = hw->priv;
|
|
|
struct ath_softc *sc = aphy->sc;
|
|
|
+ u32 val;
|
|
|
int err;
|
|
|
|
|
|
err = pci_enable_device(pdev);
|
|
|
if (err)
|
|
|
return err;
|
|
|
pci_restore_state(pdev);
|
|
|
+ /*
|
|
|
+ * 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);
|
|
|
|
|
|
/* Enable LED */
|
|
|
ath9k_hw_cfg_output(sc->sc_ah, ATH_LED_PIN,
|