ath9k: Handle ASPM properly
authorSujith Manoharan <c_manoha@qca.qualcomm.com>
Mon, 4 Jun 2012 10:57:14 +0000 (16:27 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 6 Jun 2012 19:20:24 +0000 (15:20 -0400)
ASPM has to be disabled when BTCOEX is in use, do this properly
by calling the bus-specific ASPM init routine after the
BTCOEX scheme has been determined.

Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/init.c
drivers/net/wireless/ath/ath9k/pci.c

index 7db1890448f20fbfe85ccccea1966633de0d84ad..febf6971b40aafd7bf5bd8c3dc7dd2ca8dac9d0f 100644 (file)
@@ -390,14 +390,6 @@ static void ath9k_hw_disablepcie(struct ath_hw *ah)
        REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
 }
 
-static void ath9k_hw_aspm_init(struct ath_hw *ah)
-{
-       struct ath_common *common = ath9k_hw_common(ah);
-
-       if (common->bus_ops->aspm_init)
-               common->bus_ops->aspm_init(common);
-}
-
 /* This should work for all families including legacy */
 static bool ath9k_hw_chip_test(struct ath_hw *ah)
 {
@@ -693,9 +685,6 @@ static int __ath9k_hw_init(struct ath_hw *ah)
        if (r)
                return r;
 
-       if (ah->is_pciexpress)
-               ath9k_hw_aspm_init(ah);
-
        r = ath9k_hw_init_macaddr(ah);
        if (r) {
                ath_err(common, "Failed to initialize MAC address\n");
index 3e2283970ee3380d6ac351f03fdd01f12d163f18..9dfce1a69c73af0f493ef2acf6480710a211f750 100644 (file)
@@ -597,6 +597,9 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
        ath9k_cmn_init_crypto(sc->sc_ah);
        ath9k_init_misc(sc);
 
+       if (common->bus_ops->aspm_init)
+               common->bus_ops->aspm_init(common);
+
        return 0;
 
 err_btcoex:
index a856b51255f4aa0bc233c5af1176e667438324d8..6ec9f88712d0c7d46f231f4386f9697c241c26ce 100644 (file)
@@ -115,6 +115,9 @@ static void ath_pci_aspm_init(struct ath_common *common)
        int pos;
        u8 aspm;
 
+       if (!ah->is_pciexpress)
+               return;
+
        pos = pci_pcie_cap(pdev);
        if (!pos)
                return;
@@ -138,6 +141,7 @@ static void ath_pci_aspm_init(struct ath_common *common)
                aspm &= ~(PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1);
                pci_write_config_byte(parent, pos + PCI_EXP_LNKCTL, aspm);
 
+               ath_info(common, "Disabling ASPM since BTCOEX is enabled\n");
                return;
        }
 
@@ -147,6 +151,7 @@ static void ath_pci_aspm_init(struct ath_common *common)
                ah->aspm_enabled = true;
                /* Initialize PCIe PM and SERDES registers. */
                ath9k_hw_configpcipowersave(ah, false);
+               ath_info(common, "ASPM enabled: 0x%x\n", aspm);
        }
 }