Commit 58550cdd authored by Kalle Valo's avatar Kalle Valo Committed by Jeff Johnson
Browse files

wifi: ath12k: convert struct ath12k_sta::update_wk to use struct wiphy_work



For preparation to switch ath12k to use wiphy_lock() we can convert
ath12k_sta_rc_update_wk() to use wiphy_work_queue() for consistency. To avoid
any deadlocks do the struct ath12k_sta::update_wk conversion before switching
to using wiphy_lock() throughout the driver.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
Link: https://patch.msgid.link/20241007165932.78081-3-kvalo@kernel.org


Signed-off-by: default avatarJeff Johnson <quic_jjohnson@quicinc.com>
parent 8fac3266
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -451,7 +451,7 @@ struct ath12k_sta {
	u32 smps;
	enum hal_pn_type pn_type;

	struct work_struct update_wk;
	struct wiphy_work update_wk;
	struct rate_info txrate;
	struct rate_info last_txrate;
	u64 rx_duration;
+7 −5
Original line number Diff line number Diff line
@@ -4273,7 +4273,7 @@ static int ath12k_station_disassoc(struct ath12k *ar,
	return 0;
}

static void ath12k_sta_rc_update_wk(struct work_struct *wk)
static void ath12k_sta_rc_update_wk(struct wiphy *wiphy, struct wiphy_work *wk)
{
	struct ath12k *ar;
	struct ath12k_vif *arvif;
@@ -4289,6 +4289,8 @@ static void ath12k_sta_rc_update_wk(struct work_struct *wk)
	struct ath12k_wmi_peer_assoc_arg peer_arg;
	enum wmi_phy_mode peer_phymode;

	lockdep_assert_wiphy(wiphy);

	arsta = container_of(wk, struct ath12k_sta, update_wk);
	sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
	arvif = arsta->arvif;
@@ -4586,7 +4588,7 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
	/* cancel must be done outside the mutex to avoid deadlock */
	if ((old_state == IEEE80211_STA_NONE &&
	     new_state == IEEE80211_STA_NOTEXIST))
		cancel_work_sync(&arsta->update_wk);
		wiphy_work_cancel(hw->wiphy, &arsta->update_wk);

	ar = ath12k_get_ar_by_vif(hw, vif);
	if (!ar) {
@@ -4600,7 +4602,7 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
	    new_state == IEEE80211_STA_NONE) {
		memset(arsta, 0, sizeof(*arsta));
		arsta->arvif = arvif;
		INIT_WORK(&arsta->update_wk, ath12k_sta_rc_update_wk);
		wiphy_work_init(&arsta->update_wk, ath12k_sta_rc_update_wk);

		ret = ath12k_mac_station_add(ar, vif, sta);
		if (ret)
@@ -4811,7 +4813,7 @@ static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,

	spin_unlock_bh(&ar->data_lock);

	ieee80211_queue_work(hw, &arsta->update_wk);
	wiphy_work_queue(hw->wiphy, &arsta->update_wk);
}

static int ath12k_conf_tx_uapsd(struct ath12k_vif *arvif,
@@ -8113,7 +8115,7 @@ static void ath12k_mac_set_bitrate_mask_iter(void *data,
	arsta->changed |= IEEE80211_RC_SUPP_RATES_CHANGED;
	spin_unlock_bh(&ar->data_lock);

	ieee80211_queue_work(ath12k_ar_to_hw(ar), &arsta->update_wk);
	wiphy_work_queue(ath12k_ar_to_hw(ar)->wiphy, &arsta->update_wk);
}

static void ath12k_mac_disable_peer_fixed_rate(void *data,