if (ah->config.pcie_waen & AR_WA_D3_L1_DISABLE)
                                val |= AR_WA_D3_L1_DISABLE;
                } else {
-                       if (((AR_SREV_9285(ah) ||
-                             AR_SREV_9271(ah) ||
-                             AR_SREV_9287(ah)) &&
-                            (AR9285_WA_DEFAULT & AR_WA_D3_L1_DISABLE)) ||
-                           (AR_SREV_9280(ah) &&
-                            (AR9280_WA_DEFAULT & AR_WA_D3_L1_DISABLE))) {
-                               val |= AR_WA_D3_L1_DISABLE;
+                       if (AR_SREV_9285(ah) || AR_SREV_9271(ah) || AR_SREV_9287(ah)) {
+                               if (AR9285_WA_DEFAULT & AR_WA_D3_L1_DISABLE)
+                                       val |= AR_WA_D3_L1_DISABLE;
+                       } else if (AR_SREV_9280(ah)) {
+                               if (AR9280_WA_DEFAULT & AR_WA_D3_L1_DISABLE)
+                                       val |= AR_WA_D3_L1_DISABLE;
                        }
                }
 
        } else {
                if (ah->config.pcie_waen) {
                        val = ah->config.pcie_waen;
-                       if (!power_off)
-                               val &= (~AR_WA_D3_L1_DISABLE);
+                       val &= (~AR_WA_D3_L1_DISABLE);
                } else {
-                       if (AR_SREV_9285(ah) ||
-                           AR_SREV_9271(ah) ||
-                           AR_SREV_9287(ah)) {
+                       if (AR_SREV_9285(ah) || AR_SREV_9271(ah) || AR_SREV_9287(ah)) {
                                val = AR9285_WA_DEFAULT;
-                               if (!power_off)
-                                       val &= (~AR_WA_D3_L1_DISABLE);
-                       }
-                       else if (AR_SREV_9280(ah)) {
+                               val &= (~AR_WA_D3_L1_DISABLE);
+                       } else if (AR_SREV_9280(ah)) {
                                /*
                                 * For AR9280 chips, bit 22 of 0x4004
                                 * needs to be set.
                                 */
                                val = AR9280_WA_DEFAULT;
-                               if (!power_off)
-                                       val &= (~AR_WA_D3_L1_DISABLE);
+                               val &= (~AR_WA_D3_L1_DISABLE);
                        } else {
                                val = AR_WA_DEFAULT;
                        }
 
        if (!power_off /* !restore */) {
                /* set bit 19 to allow forcing of pcie core into L1 state */
                REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA);
-
-               /* Several PCIe massages to ensure proper behaviour */
-               if (ah->config.pcie_waen)
-                       REG_WRITE(ah, AR_WA, ah->config.pcie_waen);
-               else
-                       REG_WRITE(ah, AR_WA, ah->WARegVal);
+               REG_WRITE(ah, AR_WA, ah->WARegVal);
        }
 
        /*
 
 #define ATH9K_PCI_CUS217     0x0004
 #define ATH9K_PCI_WOW        0x0008
 #define ATH9K_PCI_BT_ANT_DIV 0x0010
+#define ATH9K_PCI_D3_L1_WAR  0x0020
 
 /*
  * Default cache line size, in bytes.
 
        ah->config.ack_6mb = 0x0;
        ah->config.cwm_ignore_extcca = 0;
        ah->config.pcie_clock_req = 0;
-       ah->config.pcie_waen = 0;
        ah->config.analog_shiftreg = 1;
 
        for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {
 
                pCap->hw_caps |= ATH9K_HW_CAP_BT_ANT_DIV;
                ath_info(common, "Set BT/WLAN RX diversity capability\n");
        }
+
+       if (sc->driver_data & ATH9K_PCI_D3_L1_WAR) {
+               ah->config.pcie_waen = 0x0040473b;
+               ath_info(common, "Enable WAR for ASPM D3/L1\n");
+       }
 }
 
 static void ath9k_eeprom_request_cb(const struct firmware *eeprom_blob,
 
        { PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI   */
        { PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */
 
+       { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
+                        0x002A,
+                        PCI_VENDOR_ID_AZWAVE,
+                        0x1C71),
+         .driver_data = ATH9K_PCI_D3_L1_WAR },
+       { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
+                        0x002A,
+                        PCI_VENDOR_ID_FOXCONN,
+                        0xE01F),
+         .driver_data = ATH9K_PCI_D3_L1_WAR },
+       { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
+                        0x002A,
+                        0x11AD, /* LITEON */
+                        0x6632),
+         .driver_data = ATH9K_PCI_D3_L1_WAR },
+       { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
+                        0x002A,
+                        0x11AD, /* LITEON */
+                        0x6642),
+         .driver_data = ATH9K_PCI_D3_L1_WAR },
+       { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
+                        0x002A,
+                        PCI_VENDOR_ID_QMI,
+                        0x0306),
+         .driver_data = ATH9K_PCI_D3_L1_WAR },
+       { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
+                        0x002A,
+                        0x185F, /* WNC */
+                        0x309D),
+         .driver_data = ATH9K_PCI_D3_L1_WAR },
+       { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
+                        0x002A,
+                        0x10CF, /* Fujitsu */
+                        0x147C),
+         .driver_data = ATH9K_PCI_D3_L1_WAR },
+       { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
+                        0x002A,
+                        0x10CF, /* Fujitsu */
+                        0x147D),
+         .driver_data = ATH9K_PCI_D3_L1_WAR },
+       { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
+                        0x002A,
+                        0x10CF, /* Fujitsu */
+                        0x1536),
+         .driver_data = ATH9K_PCI_D3_L1_WAR },
+
        /* AR9285 card for Asus */
        { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
                         0x002B,