Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 039a0721 authored by Sujith Manoharan's avatar Sujith Manoharan Committed by John W. Linville
Browse files

ath9k_htc: Fix fast channel change



When returning to the operating channel, a full HW
reset has to be done instead of a fast channel change.
Since sw_scan_complete() is called after the config() call for the
home channel, we end up doing a FCC. Fix this issue by checking
the OFFCHANNEL flag to determine FCC.

Signed-off-by: default avatarSujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 73908674
Loading
Loading
Loading
Loading
+9 −10
Original line number Diff line number Diff line
@@ -331,16 +331,15 @@ void ath_htc_cancel_btcoex_work(struct ath9k_htc_priv *priv);

#define OP_INVALID		   BIT(0)
#define OP_SCANNING		   BIT(1)
#define OP_FULL_RESET		   BIT(2)
#define OP_LED_ASSOCIATED	   BIT(3)
#define OP_LED_ON		   BIT(4)
#define OP_PREAMBLE_SHORT	   BIT(5)
#define OP_PROTECT_ENABLE	   BIT(6)
#define OP_ASSOCIATED		   BIT(7)
#define OP_ENABLE_BEACON	   BIT(8)
#define OP_LED_DEINIT		   BIT(9)
#define OP_BT_PRIORITY_DETECTED    BIT(10)
#define OP_BT_SCAN                 BIT(11)
#define OP_LED_ASSOCIATED	   BIT(2)
#define OP_LED_ON		   BIT(3)
#define OP_PREAMBLE_SHORT	   BIT(4)
#define OP_PROTECT_ENABLE	   BIT(5)
#define OP_ASSOCIATED		   BIT(6)
#define OP_ENABLE_BEACON	   BIT(7)
#define OP_LED_DEINIT		   BIT(8)
#define OP_BT_PRIORITY_DETECTED    BIT(9)
#define OP_BT_SCAN                 BIT(10)

struct ath9k_htc_priv {
	struct device *dev;
+2 −6
Original line number Diff line number Diff line
@@ -177,7 +177,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
	struct ath_hw *ah = priv->ah;
	struct ath_common *common = ath9k_hw_common(ah);
	struct ieee80211_conf *conf = &common->hw->conf;
	bool fastcc = true;
	bool fastcc;
	struct ieee80211_channel *channel = hw->conf.channel;
	struct ath9k_hw_cal_data *caldata;
	enum htc_phymode mode;
@@ -188,8 +188,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
	if (priv->op_flags & OP_INVALID)
		return -EIO;

	if (priv->op_flags & OP_FULL_RESET)
		fastcc = false;
	fastcc = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL);

	ath9k_htc_ps_wakeup(priv);
	htc_stop(priv->htc);
@@ -231,8 +230,6 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
		goto err;

	htc_start(priv->htc);

	priv->op_flags &= ~OP_FULL_RESET;
err:
	ath9k_htc_ps_restore(priv);
	return ret;
@@ -1847,7 +1844,6 @@ static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw)
	spin_lock_bh(&priv->beacon_lock);
	priv->op_flags &= ~OP_SCANNING;
	spin_unlock_bh(&priv->beacon_lock);
	priv->op_flags |= OP_FULL_RESET;
	if (priv->op_flags & OP_ASSOCIATED) {
		ath9k_htc_beacon_config(priv, priv->vif);
		ath_start_ani(priv);