/* Need to be called after we discover btcoex capabilities */ static void ath_pci_aspm_init(struct ath_common *common) { struct ath_softc *sc = (struct ath_softc *) common->priv; struct ath_hw *ah = sc->sc_ah; struct pci_dev *pdev = to_pci_dev(sc->dev); struct pci_dev *parent; u16 aspm; if (!ah->is_pciexpress) return; parent = pdev->bus->self; if (!parent) return; if ((ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) && (AR_SREV_9285(ah))) { /* Bluetooth coexistence requires disabling ASPM. */ pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1); /* * Both upstream and downstream PCIe components should * have the same ASPM settings. */ pcie_capability_clear_word(parent, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1); ath_info(common, "Disabling ASPM since BTCOEX is enabled\n"); return; } /* * 0x70c - Ack Frequency Register. * * Bits 27:29 - DEFAULT_L1_ENTRANCE_LATENCY. * * 000 : 1 us * 001 : 2 us * 010 : 4 us * 011 : 8 us * 100 : 16 us * 101 : 32 us * 110/111 : 64 us */ if (AR_SREV_9462(ah)) pci_read_config_dword(pdev, 0x70c, &ah->config.aspm_l1_fix); pcie_capability_read_word(parent, PCI_EXP_LNKCTL, &aspm); if (aspm & (PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1)) { ah->aspm_enabled = true; /* Initialize PCIe PM and SERDES registers. */ ath9k_hw_configpcipowersave(ah, false); ath_info(common, "ASPM enabled: 0x%x\n", aspm); } }
/* Need to be called after we discover btcoex capabilities */ static void ath_pci_aspm_init(struct ath_common *common) { struct ath_softc *sc = (struct ath_softc *) common->priv; struct ath_hw *ah = sc->sc_ah; struct pci_dev *pdev = to_pci_dev(sc->dev); struct pci_dev *parent; int pos; u8 aspm; if (!ah->is_pciexpress) return; pos = pci_pcie_cap(pdev); if (!pos) return; parent = pdev->bus->self; if (!parent) return; if ((ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) && (AR_SREV_9285(ah))) { /* Bluetooth coexistance requires disabling ASPM for AR9285. */ pci_read_config_byte(pdev, pos + PCI_EXP_LNKCTL, &aspm); aspm &= ~(PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1); pci_write_config_byte(pdev, pos + PCI_EXP_LNKCTL, aspm); /* * Both upstream and downstream PCIe components should * have the same ASPM settings. */ pos = pci_pcie_cap(parent); pci_read_config_byte(parent, pos + PCI_EXP_LNKCTL, &aspm); 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; } pos = pci_pcie_cap(parent); pci_read_config_byte(parent, pos + PCI_EXP_LNKCTL, &aspm); if (aspm & (PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1)) { ah->aspm_enabled = true; /* Initialize PCIe PM and SERDES registers. */ ath9k_hw_configpcipowersave(ah, false); ath_info(common, "ASPM enabled: 0x%x\n", aspm); } }
static void ath9k_init_platform(struct ath_softc *sc) { struct ath_hw *ah = sc->sc_ah; struct ath_common *common = ath9k_hw_common(ah); if (common->bus_ops->ath_bus_type != ATH_PCI) return; if (sc->driver_data & (ATH9K_PCI_CUS198 | ATH9K_PCI_CUS230)) { ah->config.xlna_gpio = 9; ah->config.xatten_margin_cfg = true; ath_info(common, "Set parameters for %s\n", (sc->driver_data & ATH9K_PCI_CUS198) ? "CUS198" : "CUS230"); } else if (sc->driver_data & ATH9K_PCI_CUS217) { ath_info(common, "CUS217 card detected\n"); } }
int ath9k_hw_nvram_swap_data(struct ath_hw *ah, bool *swap_needed, int size) { u16 magic; u16 *eepdata; int i; bool needs_byteswap = false; struct ath_common *common = ath9k_hw_common(ah); if (!ath9k_hw_nvram_read(ah, AR5416_EEPROM_MAGIC_OFFSET, &magic)) { ath_err(common, "Reading Magic # failed\n"); return -EIO; } if (swab16(magic) == AR5416_EEPROM_MAGIC) { needs_byteswap = true; ath_dbg(common, EEPROM, "EEPROM needs byte-swapping to correct endianness.\n"); } else if (magic != AR5416_EEPROM_MAGIC) { if (ath9k_hw_use_flash(ah)) { ath_dbg(common, EEPROM, "Ignoring invalid EEPROM magic (0x%04x).\n", magic); } else { ath_err(common, "Invalid EEPROM magic (0x%04x).\n", magic); return -EINVAL; } } if (needs_byteswap) { if (ah->ah_flags & AH_NO_EEP_SWAP) { ath_info(common, "Ignoring endianness difference in EEPROM magic bytes.\n"); } else { eepdata = (u16 *)(&ah->eeprom); for (i = 0; i < size; i++) eepdata[i] = swab16(eepdata[i]); } } if (ah->eep_ops->get_eepmisc(ah) & AR5416_EEPMISC_BIG_ENDIAN) { *swap_needed = true; ath_dbg(common, EEPROM, "Big Endian EEPROM detected according to EEPMISC register.\n"); } else { *swap_needed = false; } return 0; }
static void ath9k_init_pcoem_platform(struct ath_softc *sc) { struct ath_hw *ah = sc->sc_ah; struct ath9k_hw_capabilities *pCap = &ah->caps; struct ath_common *common = ath9k_hw_common(ah); if (!IS_ENABLED(CONFIG_ATH9K_PCOEM)) return; if (common->bus_ops->ath_bus_type != ATH_PCI) return; if (sc->driver_data & (ATH9K_PCI_CUS198 | ATH9K_PCI_CUS230)) { ah->config.xlna_gpio = 9; ah->config.xatten_margin_cfg = true; ah->config.alt_mingainidx = true; ah->config.ant_ctrl_comm2g_switch_enable = 0x000BBB88; sc->ant_comb.low_rssi_thresh = 20; sc->ant_comb.fast_div_bias = 3; ath_info(common, "Set parameters for %s\n", (sc->driver_data & ATH9K_PCI_CUS198) ? "CUS198" : "CUS230"); } if (sc->driver_data & ATH9K_PCI_CUS217) ath_info(common, "CUS217 card detected\n"); if (sc->driver_data & ATH9K_PCI_CUS252) ath_info(common, "CUS252 card detected\n"); if (sc->driver_data & ATH9K_PCI_AR9565_1ANT) ath_info(common, "WB335 1-ANT card detected\n"); if (sc->driver_data & ATH9K_PCI_AR9565_2ANT) ath_info(common, "WB335 2-ANT card detected\n"); if (sc->driver_data & ATH9K_PCI_KILLER) ath_info(common, "Killer Wireless card detected\n"); /* * Some WB335 cards do not support antenna diversity. Since * we use a hardcoded value for AR9565 instead of using the * EEPROM/OTP data, remove the combining feature from * the HW capabilities bitmap. */ if (sc->driver_data & (ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_AR9565_2ANT)) { if (!(sc->driver_data & ATH9K_PCI_BT_ANT_DIV)) pCap->hw_caps &= ~ATH9K_HW_CAP_ANT_DIV_COMB; } if (sc->driver_data & ATH9K_PCI_BT_ANT_DIV) { 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"); } /* * The default value of pll_pwrsave is 1. * For certain AR9485 cards, it is set to 0. * For AR9462, AR9565 it's set to 7. */ ah->config.pll_pwrsave = 1; if (sc->driver_data & ATH9K_PCI_NO_PLL_PWRSAVE) { ah->config.pll_pwrsave = 0; ath_info(common, "Disable PLL PowerSave\n"); } if (sc->driver_data & ATH9K_PCI_LED_ACT_HI) ah->config.led_active_high = true; }