diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/hw.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 302 | 
1 files changed, 157 insertions, 145 deletions
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index abe05ec85d5..cfa91ab7acf 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c @@ -342,6 +342,9 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah)  		val = REG_READ(ah, AR_SREV);  		ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);  		return; +	case AR9300_DEVID_QCA955X: +		ah->hw_version.macVersion = AR_SREV_VERSION_9550; +		return;  	}  	val = REG_READ(ah, AR_SREV) & AR_SREV_ID; @@ -390,14 +393,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)  { @@ -622,7 +617,7 @@ static int __ath9k_hw_init(struct ath_hw *ah)  	if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_AUTO) {  		if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI || -		    ((AR_SREV_9160(ah) || AR_SREV_9280(ah)) && +		    ((AR_SREV_9160(ah) || AR_SREV_9280(ah) || AR_SREV_9287(ah)) &&  		     !ah->is_pciexpress)) {  			ah->config.serialize_regmode =  				SER_REG_MODE_ON; @@ -654,6 +649,7 @@ static int __ath9k_hw_init(struct ath_hw *ah)  	case AR_SREV_VERSION_9485:  	case AR_SREV_VERSION_9340:  	case AR_SREV_VERSION_9462: +	case AR_SREV_VERSION_9550:  		break;  	default:  		ath_err(common, @@ -663,7 +659,7 @@ static int __ath9k_hw_init(struct ath_hw *ah)  	}  	if (AR_SREV_9271(ah) || AR_SREV_9100(ah) || AR_SREV_9340(ah) || -	    AR_SREV_9330(ah)) +	    AR_SREV_9330(ah) || AR_SREV_9550(ah))  		ah->is_pciexpress = false;  	ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID); @@ -675,10 +671,6 @@ static int __ath9k_hw_init(struct ath_hw *ah)  	if (!AR_SREV_9300_20_OR_LATER(ah))  		ah->ani_function &= ~ATH9K_ANI_MRC_CCK; -	/* disable ANI for 9340 */ -	if (AR_SREV_9340(ah)) -		ah->config.enable_ani = false; -  	ath9k_hw_init_mode_regs(ah);  	if (!ah->is_pciexpress) @@ -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"); @@ -738,6 +727,7 @@ int ath9k_hw_init(struct ath_hw *ah)  	case AR9300_DEVID_AR9485_PCIE:  	case AR9300_DEVID_AR9330:  	case AR9300_DEVID_AR9340: +	case AR9300_DEVID_QCA955X:  	case AR9300_DEVID_AR9580:  	case AR9300_DEVID_AR9462:  		break; @@ -784,13 +774,25 @@ static void ath9k_hw_init_qos(struct ath_hw *ah)  u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah)  { +	struct ath_common *common = ath9k_hw_common(ah); +	int i = 0; +  	REG_CLR_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);  	udelay(100);  	REG_SET_BIT(ah, PLL3, PLL3_DO_MEAS_MASK); -	while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0) +	while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0) { +  		udelay(100); +		if (WARN_ON_ONCE(i >= 100)) { +			ath_err(common, "PLL4 meaurement not done\n"); +			break; +		} + +		i++; +	} +  	return (REG_READ(ah, PLL3) & SQSUM_DVC_MASK) >> 3;  }  EXPORT_SYMBOL(ar9003_get_pll_sqsum_dvc); @@ -864,7 +866,7 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,  		/* program BB PLL phase_shift */  		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL3,  			      AR_CH0_BB_DPLL3_PHASE_SHIFT, 0x1); -	} else if (AR_SREV_9340(ah)) { +	} else if (AR_SREV_9340(ah) || AR_SREV_9550(ah)) {  		u32 regval, pll2_divint, pll2_divfrac, refdiv;  		REG_WRITE(ah, AR_RTC_PLL_CONTROL, 0x1142c); @@ -878,9 +880,15 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,  			pll2_divfrac = 0x1eb85;  			refdiv = 3;  		} else { -			pll2_divint = 88; -			pll2_divfrac = 0; -			refdiv = 5; +			if (AR_SREV_9340(ah)) { +				pll2_divint = 88; +				pll2_divfrac = 0; +				refdiv = 5; +			} else { +				pll2_divint = 0x11; +				pll2_divfrac = 0x26666; +				refdiv = 1; +			}  		}  		regval = REG_READ(ah, AR_PHY_PLL_MODE); @@ -893,8 +901,12 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,  		udelay(100);  		regval = REG_READ(ah, AR_PHY_PLL_MODE); -		regval = (regval & 0x80071fff) | (0x1 << 30) | (0x1 << 13) | -			 (0x4 << 26) | (0x18 << 19); +		if (AR_SREV_9340(ah)) +			regval = (regval & 0x80071fff) | (0x1 << 30) | +				 (0x1 << 13) | (0x4 << 26) | (0x18 << 19); +		else +			regval = (regval & 0x80071fff) | (0x3 << 30) | +				 (0x1 << 13) | (0x4 << 26) | (0x60 << 19);  		REG_WRITE(ah, AR_PHY_PLL_MODE, regval);  		REG_WRITE(ah, AR_PHY_PLL_MODE,  			  REG_READ(ah, AR_PHY_PLL_MODE) & 0xfffeffff); @@ -905,7 +917,8 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,  	REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll); -	if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah)) +	if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah) || +	    AR_SREV_9550(ah))  		udelay(1000);  	/* Switch the core clock for ar9271 to 117Mhz */ @@ -918,7 +931,7 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,  	REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_FORCE_DERIVED_CLK); -	if (AR_SREV_9340(ah)) { +	if (AR_SREV_9340(ah) || AR_SREV_9550(ah)) {  		if (ah->is_clk_25mhz) {  			REG_WRITE(ah, AR_RTC_DERIVED_CLK, 0x17c << 1);  			REG_WRITE(ah, AR_SLP32_MODE, 0x0010f3d7); @@ -942,7 +955,7 @@ static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah,  		AR_IMR_RXORN |  		AR_IMR_BCNMISC; -	if (AR_SREV_9340(ah)) +	if (AR_SREV_9340(ah) || AR_SREV_9550(ah))  		sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;  	if (AR_SREV_9300_20_OR_LATER(ah)) { @@ -1359,6 +1372,9 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)  		}  	} +	if (ath9k_hw_mci_is_enabled(ah)) +		ar9003_mci_check_gpm_offset(ah); +  	REG_WRITE(ah, AR_RTC_RC, rst_flags);  	REGWRITE_BUFFER_FLUSH(ah); @@ -1443,9 +1459,6 @@ static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type)  		break;  	} -	if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) -		REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2); -  	return ret;  } @@ -1468,6 +1481,9 @@ static bool ath9k_hw_chip_reset(struct ath_hw *ah,  		return false;  	ah->chip_fullsleep = false; + +	if (AR_SREV_9330(ah)) +		ar9003_hw_internal_regulator_apply(ah);  	ath9k_hw_init_pll(ah, chan);  	ath9k_hw_set_rfmode(ah, chan); @@ -1718,8 +1734,8 @@ static int ath9k_hw_do_fastcc(struct ath_hw *ah, struct ath9k_channel *chan)  	ath9k_hw_loadnf(ah, ah->curchan);  	ath9k_hw_start_nfcal(ah, true); -	if ((ah->caps.hw_caps & ATH9K_HW_CAP_MCI) && ar9003_mci_is_ready(ah)) -		ar9003_mci_2g5g_switch(ah, true); +	if (ath9k_hw_mci_is_enabled(ah)) +		ar9003_mci_2g5g_switch(ah, false);  	if (AR_SREV_9271(ah))  		ar9002_hw_load_ani_reg(ah, chan); @@ -1739,10 +1755,9 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	u64 tsf = 0;  	int i, r;  	bool start_mci_reset = false; -	bool mci = !!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI);  	bool save_fullsleep = ah->chip_fullsleep; -	if (mci) { +	if (ath9k_hw_mci_is_enabled(ah)) {  		start_mci_reset = ar9003_mci_start_reset(ah, chan);  		if (start_mci_reset)  			return 0; @@ -1771,7 +1786,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  			return r;  	} -	if (mci) +	if (ath9k_hw_mci_is_enabled(ah))  		ar9003_mci_stop_bt(ah, save_fullsleep);  	saveDefAntenna = REG_READ(ah, AR_DEF_ANTENNA); @@ -1829,7 +1844,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	if (r)  		return r; -	if (mci) +	if (ath9k_hw_mci_is_enabled(ah))  		ar9003_mci_reset(ah, false, IS_CHAN_2GHZ(chan), save_fullsleep);  	/* @@ -1924,7 +1939,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	ath9k_hw_set_dma(ah); -	REG_WRITE(ah, AR_OBS, 8); +	if (!ath9k_hw_mci_is_enabled(ah)) +		REG_WRITE(ah, AR_OBS, 8);  	if (ah->config.rx_intr_mitigation) {  		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500); @@ -1945,10 +1961,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	if (!ath9k_hw_init_cal(ah, chan))  		return -EIO; -	ath9k_hw_loadnf(ah, chan); -	ath9k_hw_start_nfcal(ah, true); - -	if (mci && ar9003_mci_end_reset(ah, chan, caldata)) +	if (ath9k_hw_mci_is_enabled(ah) && ar9003_mci_end_reset(ah, chan, caldata))  		return -EIO;  	ENABLE_REGWRITE_BUFFER(ah); @@ -1983,7 +1996,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  				REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);  		}  #ifdef __BIG_ENDIAN -		else if (AR_SREV_9330(ah) || AR_SREV_9340(ah)) +		else if (AR_SREV_9330(ah) || AR_SREV_9340(ah) || +			 AR_SREV_9550(ah))  			REG_RMW(ah, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB, 0);  		else  			REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD); @@ -1993,9 +2007,12 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,  	if (ath9k_hw_btcoex_is_enabled(ah))  		ath9k_hw_btcoex_enable(ah); -	if (mci) +	if (ath9k_hw_mci_is_enabled(ah))  		ar9003_mci_check_bt(ah); +	ath9k_hw_loadnf(ah, chan); +	ath9k_hw_start_nfcal(ah, true); +  	if (AR_SREV_9300_20_OR_LATER(ah)) {  		ar9003_hw_bb_watchdog_config(ah); @@ -2016,39 +2033,35 @@ EXPORT_SYMBOL(ath9k_hw_reset);   * Notify Power Mgt is disabled in self-generated frames.   * If requested, force chip to sleep.   */ -static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip) +static void ath9k_set_power_sleep(struct ath_hw *ah)  {  	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV); -	if (setChip) { -		if (AR_SREV_9462(ah)) { -			REG_WRITE(ah, AR_TIMER_MODE, -				  REG_READ(ah, AR_TIMER_MODE) & 0xFFFFFF00); -			REG_WRITE(ah, AR_NDP2_TIMER_MODE, REG_READ(ah, -				  AR_NDP2_TIMER_MODE) & 0xFFFFFF00); -			REG_WRITE(ah, AR_SLP32_INC, -				  REG_READ(ah, AR_SLP32_INC) & 0xFFF00000); -			/* xxx Required for WLAN only case ? */ -			REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 0); -			udelay(100); -		} -		/* -		 * Clear the RTC force wake bit to allow the -		 * mac to go to sleep. -		 */ -		REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN); +	if (AR_SREV_9462(ah)) { +		REG_CLR_BIT(ah, AR_TIMER_MODE, 0xff); +		REG_CLR_BIT(ah, AR_NDP2_TIMER_MODE, 0xff); +		REG_CLR_BIT(ah, AR_SLP32_INC, 0xfffff); +		/* xxx Required for WLAN only case ? */ +		REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 0); +		udelay(100); +	} -		if (AR_SREV_9462(ah)) -			udelay(100); +	/* +	 * Clear the RTC force wake bit to allow the +	 * mac to go to sleep. +	 */ +	REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN); -		if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah)) -			REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF); +	if (ath9k_hw_mci_is_enabled(ah)) +		udelay(100); -		/* Shutdown chip. Active low */ -		if (!AR_SREV_5416(ah) && !AR_SREV_9271(ah)) { -			REG_CLR_BIT(ah, AR_RTC_RESET, AR_RTC_RESET_EN); -			udelay(2); -		} +	if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah)) +		REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF); + +	/* Shutdown chip. Active low */ +	if (!AR_SREV_5416(ah) && !AR_SREV_9271(ah)) { +		REG_CLR_BIT(ah, AR_RTC_RESET, AR_RTC_RESET_EN); +		udelay(2);  	}  	/* Clear Bit 14 of AR_WA after putting chip into Full Sleep mode. */ @@ -2061,44 +2074,38 @@ static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip)   * frames. If request, set power mode of chip to   * auto/normal.  Duration in units of 128us (1/8 TU).   */ -static void ath9k_set_power_network_sleep(struct ath_hw *ah, int setChip) +static void ath9k_set_power_network_sleep(struct ath_hw *ah)  { -	u32 val; +	struct ath9k_hw_capabilities *pCap = &ah->caps;  	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV); -	if (setChip) { -		struct ath9k_hw_capabilities *pCap = &ah->caps; -		if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) { -			/* Set WakeOnInterrupt bit; clear ForceWake bit */ -			REG_WRITE(ah, AR_RTC_FORCE_WAKE, -				  AR_RTC_FORCE_WAKE_ON_INT); -		} else { +	if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) { +		/* Set WakeOnInterrupt bit; clear ForceWake bit */ +		REG_WRITE(ah, AR_RTC_FORCE_WAKE, +			  AR_RTC_FORCE_WAKE_ON_INT); +	} else { -			/* When chip goes into network sleep, it could be waken -			 * up by MCI_INT interrupt caused by BT's HW messages -			 * (LNA_xxx, CONT_xxx) which chould be in a very fast -			 * rate (~100us). This will cause chip to leave and -			 * re-enter network sleep mode frequently, which in -			 * consequence will have WLAN MCI HW to generate lots of -			 * SYS_WAKING and SYS_SLEEPING messages which will make -			 * BT CPU to busy to process. -			 */ -			if (AR_SREV_9462(ah)) { -				val = REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_EN) & -					~AR_MCI_INTERRUPT_RX_HW_MSG_MASK; -				REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, val); -			} -			/* -			 * Clear the RTC force wake bit to allow the -			 * mac to go to sleep. -			 */ -			REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, -				    AR_RTC_FORCE_WAKE_EN); +		/* When chip goes into network sleep, it could be waken +		 * up by MCI_INT interrupt caused by BT's HW messages +		 * (LNA_xxx, CONT_xxx) which chould be in a very fast +		 * rate (~100us). This will cause chip to leave and +		 * re-enter network sleep mode frequently, which in +		 * consequence will have WLAN MCI HW to generate lots of +		 * SYS_WAKING and SYS_SLEEPING messages which will make +		 * BT CPU to busy to process. +		 */ +		if (ath9k_hw_mci_is_enabled(ah)) +			REG_CLR_BIT(ah, AR_MCI_INTERRUPT_RX_MSG_EN, +				    AR_MCI_INTERRUPT_RX_HW_MSG_MASK); +		/* +		 * Clear the RTC force wake bit to allow the +		 * mac to go to sleep. +		 */ +		REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN); -			if (AR_SREV_9462(ah)) -				udelay(30); -		} +		if (ath9k_hw_mci_is_enabled(ah)) +			udelay(30);  	}  	/* Clear Bit 14 of AR_WA after putting chip into Net Sleep mode. */ @@ -2106,7 +2113,7 @@ static void ath9k_set_power_network_sleep(struct ath_hw *ah, int setChip)  		REG_WRITE(ah, AR_WA, ah->WARegVal & ~AR_WA_D3_L1_DISABLE);  } -static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip) +static bool ath9k_hw_set_power_awake(struct ath_hw *ah)  {  	u32 val;  	int i; @@ -2117,37 +2124,38 @@ static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip)  		udelay(10);  	} -	if (setChip) { -		if ((REG_READ(ah, AR_RTC_STATUS) & -		     AR_RTC_STATUS_M) == AR_RTC_STATUS_SHUTDOWN) { -			if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) { -				return false; -			} -			if (!AR_SREV_9300_20_OR_LATER(ah)) -				ath9k_hw_init_pll(ah, NULL); +	if ((REG_READ(ah, AR_RTC_STATUS) & +	     AR_RTC_STATUS_M) == AR_RTC_STATUS_SHUTDOWN) { +		if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) { +			return false;  		} -		if (AR_SREV_9100(ah)) -			REG_SET_BIT(ah, AR_RTC_RESET, -				    AR_RTC_RESET_EN); +		if (!AR_SREV_9300_20_OR_LATER(ah)) +			ath9k_hw_init_pll(ah, NULL); +	} +	if (AR_SREV_9100(ah)) +		REG_SET_BIT(ah, AR_RTC_RESET, +			    AR_RTC_RESET_EN); + +	REG_SET_BIT(ah, AR_RTC_FORCE_WAKE, +		    AR_RTC_FORCE_WAKE_EN); +	udelay(50); +	if (ath9k_hw_mci_is_enabled(ah)) +		ar9003_mci_set_power_awake(ah); + +	for (i = POWER_UP_TIME / 50; i > 0; i--) { +		val = REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M; +		if (val == AR_RTC_STATUS_ON) +			break; +		udelay(50);  		REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,  			    AR_RTC_FORCE_WAKE_EN); -		udelay(50); - -		for (i = POWER_UP_TIME / 50; i > 0; i--) { -			val = REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M; -			if (val == AR_RTC_STATUS_ON) -				break; -			udelay(50); -			REG_SET_BIT(ah, AR_RTC_FORCE_WAKE, -				    AR_RTC_FORCE_WAKE_EN); -		} -		if (i == 0) { -			ath_err(ath9k_hw_common(ah), -				"Failed to wakeup in %uus\n", -				POWER_UP_TIME / 20); -			return false; -		} +	} +	if (i == 0) { +		ath_err(ath9k_hw_common(ah), +			"Failed to wakeup in %uus\n", +			POWER_UP_TIME / 20); +		return false;  	}  	REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV); @@ -2158,7 +2166,7 @@ static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip)  bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)  {  	struct ath_common *common = ath9k_hw_common(ah); -	int status = true, setChip = true; +	int status = true;  	static const char *modes[] = {  		"AWAKE",  		"FULL-SLEEP", @@ -2174,25 +2182,17 @@ bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)  	switch (mode) {  	case ATH9K_PM_AWAKE: -		status = ath9k_hw_set_power_awake(ah, setChip); - -		if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) -			REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2); - +		status = ath9k_hw_set_power_awake(ah);  		break;  	case ATH9K_PM_FULL_SLEEP: -		if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) +		if (ath9k_hw_mci_is_enabled(ah))  			ar9003_mci_set_full_sleep(ah); -		ath9k_set_power_sleep(ah, setChip); +		ath9k_set_power_sleep(ah);  		ah->chip_fullsleep = true;  		break;  	case ATH9K_PM_NETWORK_SLEEP: - -		if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) -			REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2); - -		ath9k_set_power_network_sleep(ah, setChip); +		ath9k_set_power_network_sleep(ah);  		break;  	default:  		ath_err(common, "Unknown power mode %u\n", mode); @@ -2585,6 +2585,14 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)  	} +	if (AR_SREV_9280_20_OR_LATER(ah)) { +		pCap->hw_caps |= ATH9K_HW_WOW_DEVICE_CAPABLE | +				 ATH9K_HW_WOW_PATTERN_MATCH_EXACT; + +		if (AR_SREV_9280(ah)) +			pCap->hw_caps |= ATH9K_HW_WOW_PATTERN_MATCH_DWORD; +	} +  	return 0;  } @@ -2762,6 +2770,9 @@ EXPORT_SYMBOL(ath9k_hw_setrxfilter);  bool ath9k_hw_phy_disable(struct ath_hw *ah)  { +	if (ath9k_hw_mci_is_enabled(ah)) +		ar9003_mci_bt_gain_ctrl(ah); +  	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))  		return false; @@ -2901,9 +2912,9 @@ void ath9k_hw_reset_tsf(struct ath_hw *ah)  }  EXPORT_SYMBOL(ath9k_hw_reset_tsf); -void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting) +void ath9k_hw_set_tsfadjust(struct ath_hw *ah, bool set)  { -	if (setting) +	if (set)  		ah->misc_mode |= AR_PCU_TX_ADD_TSF;  	else  		ah->misc_mode &= ~AR_PCU_TX_ADD_TSF; @@ -3147,6 +3158,7 @@ static struct {  	{ AR_SREV_VERSION_9340,		"9340" },  	{ AR_SREV_VERSION_9485,         "9485" },  	{ AR_SREV_VERSION_9462,         "9462" }, +	{ AR_SREV_VERSION_9550,         "9550" },  };  /* For devices with external radios */  |