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

ath9k_htc: Use atomic operations for op_flags

parent fb1c078e
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -453,7 +453,6 @@ struct ath9k_htc_priv {
	u8 num_sta_assoc_vif;
	u8 num_sta_assoc_vif;
	u8 num_ap_vif;
	u8 num_ap_vif;


	u16 op_flags;
	u16 curtxpow;
	u16 curtxpow;
	u16 txpowlimit;
	u16 txpowlimit;
	u16 nvifs;
	u16 nvifs;
@@ -461,6 +460,7 @@ struct ath9k_htc_priv {
	bool rearm_ani;
	bool rearm_ani;
	bool reconfig_beacon;
	bool reconfig_beacon;
	unsigned int rxfilter;
	unsigned int rxfilter;
	unsigned long op_flags;


	struct ath9k_hw_cal_data caldata;
	struct ath9k_hw_cal_data caldata;
	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
+5 −5
Original line number Original line Diff line number Diff line
@@ -207,9 +207,9 @@ static void ath9k_htc_beacon_config_ap(struct ath9k_htc_priv *priv,
	else
	else
		priv->ah->config.sw_beacon_response_time = MIN_SWBA_RESPONSE;
		priv->ah->config.sw_beacon_response_time = MIN_SWBA_RESPONSE;


	if (priv->op_flags & OP_TSF_RESET) {
	if (test_bit(OP_TSF_RESET, &priv->op_flags)) {
		ath9k_hw_reset_tsf(priv->ah);
		ath9k_hw_reset_tsf(priv->ah);
		priv->op_flags &= ~OP_TSF_RESET;
		clear_bit(OP_TSF_RESET, &priv->op_flags);
	} else {
	} else {
		/*
		/*
		 * Pull nexttbtt forward to reflect the current TSF.
		 * Pull nexttbtt forward to reflect the current TSF.
@@ -221,7 +221,7 @@ static void ath9k_htc_beacon_config_ap(struct ath9k_htc_priv *priv,
		} while (nexttbtt < tsftu);
		} while (nexttbtt < tsftu);
	}
	}


	if (priv->op_flags & OP_ENABLE_BEACON)
	if (test_bit(OP_ENABLE_BEACON, &priv->op_flags))
		imask |= ATH9K_INT_SWBA;
		imask |= ATH9K_INT_SWBA;


	ath_dbg(common, CONFIG,
	ath_dbg(common, CONFIG,
@@ -269,7 +269,7 @@ static void ath9k_htc_beacon_config_adhoc(struct ath9k_htc_priv *priv,
	else
	else
		priv->ah->config.sw_beacon_response_time = MIN_SWBA_RESPONSE;
		priv->ah->config.sw_beacon_response_time = MIN_SWBA_RESPONSE;


	if (priv->op_flags & OP_ENABLE_BEACON)
	if (test_bit(OP_ENABLE_BEACON, &priv->op_flags))
		imask |= ATH9K_INT_SWBA;
		imask |= ATH9K_INT_SWBA;


	ath_dbg(common, CONFIG,
	ath_dbg(common, CONFIG,
@@ -365,7 +365,7 @@ static void ath9k_htc_send_beacon(struct ath9k_htc_priv *priv,
	vif = priv->cur_beacon_conf.bslot[slot];
	vif = priv->cur_beacon_conf.bslot[slot];
	avp = (struct ath9k_htc_vif *)vif->drv_priv;
	avp = (struct ath9k_htc_vif *)vif->drv_priv;


	if (unlikely(priv->op_flags & OP_SCANNING)) {
	if (unlikely(test_bit(OP_SCANNING, &priv->op_flags))) {
		spin_unlock_bh(&priv->beacon_lock);
		spin_unlock_bh(&priv->beacon_lock);
		return;
		return;
	}
	}
+15 −15
Original line number Original line Diff line number Diff line
@@ -37,17 +37,18 @@ static void ath_detect_bt_priority(struct ath9k_htc_priv *priv)


	if (time_after(jiffies, btcoex->bt_priority_time +
	if (time_after(jiffies, btcoex->bt_priority_time +
			msecs_to_jiffies(ATH_BT_PRIORITY_TIME_THRESHOLD))) {
			msecs_to_jiffies(ATH_BT_PRIORITY_TIME_THRESHOLD))) {
		priv->op_flags &= ~(OP_BT_PRIORITY_DETECTED | OP_BT_SCAN);
		clear_bit(OP_BT_PRIORITY_DETECTED, &priv->op_flags);
		clear_bit(OP_BT_SCAN, &priv->op_flags);
		/* Detect if colocated bt started scanning */
		/* Detect if colocated bt started scanning */
		if (btcoex->bt_priority_cnt >= ATH_BT_CNT_SCAN_THRESHOLD) {
		if (btcoex->bt_priority_cnt >= ATH_BT_CNT_SCAN_THRESHOLD) {
			ath_dbg(ath9k_hw_common(ah), BTCOEX,
			ath_dbg(ath9k_hw_common(ah), BTCOEX,
				"BT scan detected\n");
				"BT scan detected\n");
			priv->op_flags |= (OP_BT_SCAN |
			set_bit(OP_BT_PRIORITY_DETECTED, &priv->op_flags);
					 OP_BT_PRIORITY_DETECTED);
			set_bit(OP_BT_SCAN, &priv->op_flags);
		} else if (btcoex->bt_priority_cnt >= ATH_BT_CNT_THRESHOLD) {
		} else if (btcoex->bt_priority_cnt >= ATH_BT_CNT_THRESHOLD) {
			ath_dbg(ath9k_hw_common(ah), BTCOEX,
			ath_dbg(ath9k_hw_common(ah), BTCOEX,
				"BT priority traffic detected\n");
				"BT priority traffic detected\n");
			priv->op_flags |= OP_BT_PRIORITY_DETECTED;
			set_bit(OP_BT_PRIORITY_DETECTED, &priv->op_flags);
		}
		}


		btcoex->bt_priority_cnt = 0;
		btcoex->bt_priority_cnt = 0;
@@ -67,26 +68,23 @@ static void ath_btcoex_period_work(struct work_struct *work)
	struct ath_btcoex *btcoex = &priv->btcoex;
	struct ath_btcoex *btcoex = &priv->btcoex;
	struct ath_common *common = ath9k_hw_common(priv->ah);
	struct ath_common *common = ath9k_hw_common(priv->ah);
	u32 timer_period;
	u32 timer_period;
	bool is_btscan;
	int ret;
	int ret;


	ath_detect_bt_priority(priv);
	ath_detect_bt_priority(priv);


	is_btscan = !!(priv->op_flags & OP_BT_SCAN);

	ret = ath9k_htc_update_cap_target(priv,
	ret = ath9k_htc_update_cap_target(priv,
				  !!(priv->op_flags & OP_BT_PRIORITY_DETECTED));
			  test_bit(OP_BT_PRIORITY_DETECTED, &priv->op_flags));
	if (ret) {
	if (ret) {
		ath_err(common, "Unable to set BTCOEX parameters\n");
		ath_err(common, "Unable to set BTCOEX parameters\n");
		return;
		return;
	}
	}


	ath9k_hw_btcoex_bt_stomp(priv->ah, is_btscan ? ATH_BTCOEX_STOMP_ALL :
	ath9k_hw_btcoex_bt_stomp(priv->ah, test_bit(OP_BT_SCAN, &priv->op_flags) ?
			btcoex->bt_stomp_type);
				 ATH_BTCOEX_STOMP_ALL : btcoex->bt_stomp_type);


	ath9k_hw_btcoex_enable(priv->ah);
	ath9k_hw_btcoex_enable(priv->ah);
	timer_period = is_btscan ? btcoex->btscan_no_stomp :
	timer_period = test_bit(OP_BT_SCAN, &priv->op_flags) ?
		btcoex->btcoex_no_stomp;
		btcoex->btscan_no_stomp : btcoex->btcoex_no_stomp;
	ieee80211_queue_delayed_work(priv->hw, &priv->duty_cycle_work,
	ieee80211_queue_delayed_work(priv->hw, &priv->duty_cycle_work,
				     msecs_to_jiffies(timer_period));
				     msecs_to_jiffies(timer_period));
	ieee80211_queue_delayed_work(priv->hw, &priv->coex_period_work,
	ieee80211_queue_delayed_work(priv->hw, &priv->coex_period_work,
@@ -104,14 +102,15 @@ static void ath_btcoex_duty_cycle_work(struct work_struct *work)
	struct ath_hw *ah = priv->ah;
	struct ath_hw *ah = priv->ah;
	struct ath_btcoex *btcoex = &priv->btcoex;
	struct ath_btcoex *btcoex = &priv->btcoex;
	struct ath_common *common = ath9k_hw_common(ah);
	struct ath_common *common = ath9k_hw_common(ah);
	bool is_btscan = priv->op_flags & OP_BT_SCAN;


	ath_dbg(common, BTCOEX, "time slice work for bt and wlan\n");
	ath_dbg(common, BTCOEX, "time slice work for bt and wlan\n");


	if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW || is_btscan)
	if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_LOW ||
	    test_bit(OP_BT_SCAN, &priv->op_flags))
		ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_NONE);
		ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_NONE);
	else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL)
	else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL)
		ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_LOW);
		ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_LOW);

	ath9k_hw_btcoex_enable(priv->ah);
	ath9k_hw_btcoex_enable(priv->ah);
}
}


@@ -141,7 +140,8 @@ static void ath_htc_resume_btcoex_work(struct ath9k_htc_priv *priv)


	btcoex->bt_priority_cnt = 0;
	btcoex->bt_priority_cnt = 0;
	btcoex->bt_priority_time = jiffies;
	btcoex->bt_priority_time = jiffies;
	priv->op_flags &= ~(OP_BT_PRIORITY_DETECTED | OP_BT_SCAN);
	clear_bit(OP_BT_PRIORITY_DETECTED, &priv->op_flags);
	clear_bit(OP_BT_SCAN, &priv->op_flags);
	ieee80211_queue_delayed_work(priv->hw, &priv->coex_period_work, 0);
	ieee80211_queue_delayed_work(priv->hw, &priv->coex_period_work, 0);
}
}


+1 −1
Original line number Original line Diff line number Diff line
@@ -611,7 +611,7 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv,
	struct ath_common *common;
	struct ath_common *common;
	int i, ret = 0, csz = 0;
	int i, ret = 0, csz = 0;


	priv->op_flags |= OP_INVALID;
	set_bit(OP_INVALID, &priv->op_flags);


	ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
	ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
	if (!ah)
	if (!ah)
+14 −14
Original line number Original line Diff line number Diff line
@@ -250,7 +250,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
	u8 cmd_rsp;
	u8 cmd_rsp;
	int ret;
	int ret;


	if (priv->op_flags & OP_INVALID)
	if (test_bit(OP_INVALID, &priv->op_flags))
		return -EIO;
		return -EIO;


	fastcc = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL);
	fastcc = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL);
@@ -304,7 +304,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,


	htc_start(priv->htc);
	htc_start(priv->htc);


	if (!(priv->op_flags & OP_SCANNING) &&
	if (!test_bit(OP_SCANNING, &priv->op_flags) &&
	    !(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
	    !(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
		ath9k_htc_vif_reconfig(priv);
		ath9k_htc_vif_reconfig(priv);


@@ -750,7 +750,7 @@ void ath9k_htc_start_ani(struct ath9k_htc_priv *priv)
	common->ani.shortcal_timer = timestamp;
	common->ani.shortcal_timer = timestamp;
	common->ani.checkani_timer = timestamp;
	common->ani.checkani_timer = timestamp;


	priv->op_flags |= OP_ANI_RUNNING;
	set_bit(OP_ANI_RUNNING, &priv->op_flags);


	ieee80211_queue_delayed_work(common->hw, &priv->ani_work,
	ieee80211_queue_delayed_work(common->hw, &priv->ani_work,
				     msecs_to_jiffies(ATH_ANI_POLLINTERVAL));
				     msecs_to_jiffies(ATH_ANI_POLLINTERVAL));
@@ -759,7 +759,7 @@ void ath9k_htc_start_ani(struct ath9k_htc_priv *priv)
void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv)
void ath9k_htc_stop_ani(struct ath9k_htc_priv *priv)
{
{
	cancel_delayed_work_sync(&priv->ani_work);
	cancel_delayed_work_sync(&priv->ani_work);
	priv->op_flags &= ~OP_ANI_RUNNING;
	clear_bit(OP_ANI_RUNNING, &priv->op_flags);
}
}


void ath9k_htc_ani_work(struct work_struct *work)
void ath9k_htc_ani_work(struct work_struct *work)
@@ -944,7 +944,7 @@ static int ath9k_htc_start(struct ieee80211_hw *hw)
		ath_dbg(common, CONFIG,
		ath_dbg(common, CONFIG,
			"Failed to update capability in target\n");
			"Failed to update capability in target\n");


	priv->op_flags &= ~OP_INVALID;
	clear_bit(OP_INVALID, &priv->op_flags);
	htc_start(priv->htc);
	htc_start(priv->htc);


	spin_lock_bh(&priv->tx.tx_lock);
	spin_lock_bh(&priv->tx.tx_lock);
@@ -973,7 +973,7 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)


	mutex_lock(&priv->mutex);
	mutex_lock(&priv->mutex);


	if (priv->op_flags & OP_INVALID) {
	if (test_bit(OP_INVALID, &priv->op_flags)) {
		ath_dbg(common, ANY, "Device not present\n");
		ath_dbg(common, ANY, "Device not present\n");
		mutex_unlock(&priv->mutex);
		mutex_unlock(&priv->mutex);
		return;
		return;
@@ -1015,7 +1015,7 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)
	ath9k_htc_ps_restore(priv);
	ath9k_htc_ps_restore(priv);
	ath9k_htc_setpower(priv, ATH9K_PM_FULL_SLEEP);
	ath9k_htc_setpower(priv, ATH9K_PM_FULL_SLEEP);


	priv->op_flags |= OP_INVALID;
	set_bit(OP_INVALID, &priv->op_flags);


	ath_dbg(common, CONFIG, "Driver halt\n");
	ath_dbg(common, CONFIG, "Driver halt\n");
	mutex_unlock(&priv->mutex);
	mutex_unlock(&priv->mutex);
@@ -1105,7 +1105,7 @@ static int ath9k_htc_add_interface(struct ieee80211_hw *hw,
	ath9k_htc_set_opmode(priv);
	ath9k_htc_set_opmode(priv);


	if ((priv->ah->opmode == NL80211_IFTYPE_AP) &&
	if ((priv->ah->opmode == NL80211_IFTYPE_AP) &&
	    !(priv->op_flags & OP_ANI_RUNNING)) {
	    !test_bit(OP_ANI_RUNNING, &priv->op_flags)) {
		ath9k_hw_set_tsfadjust(priv->ah, 1);
		ath9k_hw_set_tsfadjust(priv->ah, 1);
		ath9k_htc_start_ani(priv);
		ath9k_htc_start_ani(priv);
	}
	}
@@ -1285,7 +1285,7 @@ static void ath9k_htc_configure_filter(struct ieee80211_hw *hw,
	changed_flags &= SUPPORTED_FILTERS;
	changed_flags &= SUPPORTED_FILTERS;
	*total_flags &= SUPPORTED_FILTERS;
	*total_flags &= SUPPORTED_FILTERS;


	if (priv->op_flags & OP_INVALID) {
	if (test_bit(OP_INVALID, &priv->op_flags)) {
		ath_dbg(ath9k_hw_common(priv->ah), ANY,
		ath_dbg(ath9k_hw_common(priv->ah), ANY,
			"Unable to configure filter on invalid state\n");
			"Unable to configure filter on invalid state\n");
		mutex_unlock(&priv->mutex);
		mutex_unlock(&priv->mutex);
@@ -1517,7 +1517,7 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
		ath_dbg(common, CONFIG, "Beacon enabled for BSS: %pM\n",
		ath_dbg(common, CONFIG, "Beacon enabled for BSS: %pM\n",
			bss_conf->bssid);
			bss_conf->bssid);
		ath9k_htc_set_tsfadjust(priv, vif);
		ath9k_htc_set_tsfadjust(priv, vif);
		priv->op_flags |= OP_ENABLE_BEACON;
		set_bit(OP_ENABLE_BEACON, &priv->op_flags);
		ath9k_htc_beacon_config(priv, vif);
		ath9k_htc_beacon_config(priv, vif);
	}
	}


@@ -1530,7 +1530,7 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
			ath_dbg(common, CONFIG,
			ath_dbg(common, CONFIG,
				"Beacon disabled for BSS: %pM\n",
				"Beacon disabled for BSS: %pM\n",
				bss_conf->bssid);
				bss_conf->bssid);
			priv->op_flags &= ~OP_ENABLE_BEACON;
			clear_bit(OP_ENABLE_BEACON, &priv->op_flags);
			ath9k_htc_beacon_config(priv, vif);
			ath9k_htc_beacon_config(priv, vif);
		}
		}
	}
	}
@@ -1543,7 +1543,7 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
		    (priv->nvifs == 1) &&
		    (priv->nvifs == 1) &&
		    (priv->num_ap_vif == 1) &&
		    (priv->num_ap_vif == 1) &&
		    (vif->type == NL80211_IFTYPE_AP)) {
		    (vif->type == NL80211_IFTYPE_AP)) {
			priv->op_flags |= OP_TSF_RESET;
			set_bit(OP_TSF_RESET, &priv->op_flags);
		}
		}
		ath_dbg(common, CONFIG,
		ath_dbg(common, CONFIG,
			"Beacon interval changed for BSS: %pM\n",
			"Beacon interval changed for BSS: %pM\n",
@@ -1655,7 +1655,7 @@ static void ath9k_htc_sw_scan_start(struct ieee80211_hw *hw)


	mutex_lock(&priv->mutex);
	mutex_lock(&priv->mutex);
	spin_lock_bh(&priv->beacon_lock);
	spin_lock_bh(&priv->beacon_lock);
	priv->op_flags |= OP_SCANNING;
	set_bit(OP_SCANNING, &priv->op_flags);
	spin_unlock_bh(&priv->beacon_lock);
	spin_unlock_bh(&priv->beacon_lock);
	cancel_work_sync(&priv->ps_work);
	cancel_work_sync(&priv->ps_work);
	ath9k_htc_stop_ani(priv);
	ath9k_htc_stop_ani(priv);
@@ -1668,7 +1668,7 @@ static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw)


	mutex_lock(&priv->mutex);
	mutex_lock(&priv->mutex);
	spin_lock_bh(&priv->beacon_lock);
	spin_lock_bh(&priv->beacon_lock);
	priv->op_flags &= ~OP_SCANNING;
	clear_bit(OP_SCANNING, &priv->op_flags);
	spin_unlock_bh(&priv->beacon_lock);
	spin_unlock_bh(&priv->beacon_lock);
	ath9k_htc_ps_wakeup(priv);
	ath9k_htc_ps_wakeup(priv);
	ath9k_htc_vif_reconfig(priv);
	ath9k_htc_vif_reconfig(priv);
Loading