Commit 0148e40c authored by Sriram R's avatar Sriram R Committed by Kalle Valo

wifi: ath12k: fetch correct radio based on vdev status

For ops which passes the vif info, fetch the radio(ar)
to be used for corresponding functions based on the
the vdev creation status. If the vdev is not created yet,
which could happen when the ops are called before channel
is assigned for the vif, the data needs to be cached and this
is done in followup changes.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
Signed-off-by: default avatarSriram R <quic_srirrama@quicinc.com>
Signed-off-by: default avatarRameshkumar Sundaram <quic_ramess@quicinc.com>
Acked-by: default avatarJeff Johnson <quic_jjohnson@quicinc.com>
Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/20240405194519.1337906-7-quic_ramess@quicinc.com
parent 0d6e6736
...@@ -646,6 +646,24 @@ static struct ath12k *ath12k_get_ar_by_ctx(struct ieee80211_hw *hw, ...@@ -646,6 +646,24 @@ static struct ath12k *ath12k_get_ar_by_ctx(struct ieee80211_hw *hw,
return ath12k_mac_get_ar_by_chan(hw, ctx->def.chan); return ath12k_mac_get_ar_by_chan(hw, ctx->def.chan);
} }
static struct ath12k *ath12k_get_ar_by_vif(struct ieee80211_hw *hw,
struct ieee80211_vif *vif)
{
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
/* If there is one pdev within ah, then we return
* ar directly.
*/
if (ah->num_radio == 1)
return ah->radio;
if (arvif->is_created)
return arvif->ar;
return NULL;
}
static void ath12k_pdev_caps_update(struct ath12k *ar) static void ath12k_pdev_caps_update(struct ath12k *ar)
{ {
struct ath12k_base *ab = ar->ab; struct ath12k_base *ab = ar->ab;
...@@ -2999,11 +3017,17 @@ static void ath12k_mac_op_bss_info_changed(struct ieee80211_hw *hw, ...@@ -2999,11 +3017,17 @@ static void ath12k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
struct ieee80211_bss_conf *info, struct ieee80211_bss_conf *info,
u64 changed) u64 changed)
{ {
struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
struct ath12k *ar; struct ath12k *ar;
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif); struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
ar = ath12k_ah_to_ar(ah, 0); ar = ath12k_get_ar_by_vif(hw, vif);
/* TODO if the vdev is not created on a certain radio,
* cache the info to be updated later on vdev creation
*/
if (!ar)
return;
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
...@@ -3498,7 +3522,6 @@ static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, ...@@ -3498,7 +3522,6 @@ static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
struct ieee80211_vif *vif, struct ieee80211_sta *sta, struct ieee80211_vif *vif, struct ieee80211_sta *sta,
struct ieee80211_key_conf *key) struct ieee80211_key_conf *key)
{ {
struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
struct ath12k *ar; struct ath12k *ar;
struct ath12k_base *ab; struct ath12k_base *ab;
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif); struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
...@@ -3515,7 +3538,11 @@ static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, ...@@ -3515,7 +3538,11 @@ static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256) key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
return 1; return 1;
ar = ath12k_ah_to_ar(ah, 0); ar = ath12k_get_ar_by_vif(hw, vif);
if (!ar) {
WARN_ON_ONCE(1);
return -EINVAL;
}
ab = ar->ab; ab = ar->ab;
if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags)) if (test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags))
...@@ -4093,7 +4120,6 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw, ...@@ -4093,7 +4120,6 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
enum ieee80211_sta_state old_state, enum ieee80211_sta_state old_state,
enum ieee80211_sta_state new_state) enum ieee80211_sta_state new_state)
{ {
struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
struct ath12k *ar; struct ath12k *ar;
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif); struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta); struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
...@@ -4105,7 +4131,11 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw, ...@@ -4105,7 +4131,11 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
new_state == IEEE80211_STA_NOTEXIST)) new_state == IEEE80211_STA_NOTEXIST))
cancel_work_sync(&arsta->update_wk); cancel_work_sync(&arsta->update_wk);
ar = ath12k_ah_to_ar(ah, 0); ar = ath12k_get_ar_by_vif(hw, vif);
if (!ar) {
WARN_ON_ONCE(1);
return -EINVAL;
}
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
...@@ -4256,14 +4286,17 @@ static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw, ...@@ -4256,14 +4286,17 @@ static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
struct ieee80211_sta *sta, struct ieee80211_sta *sta,
u32 changed) u32 changed)
{ {
struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
struct ath12k *ar; struct ath12k *ar;
struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta); struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif); struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
struct ath12k_peer *peer; struct ath12k_peer *peer;
u32 bw, smps; u32 bw, smps;
ar = ath12k_ah_to_ar(ah, 0); ar = ath12k_get_ar_by_vif(hw, vif);
if (!ar) {
WARN_ON_ONCE(1);
return;
}
spin_lock_bh(&ar->ab->base_lock); spin_lock_bh(&ar->ab->base_lock);
...@@ -4439,12 +4472,15 @@ static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw, ...@@ -4439,12 +4472,15 @@ static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
unsigned int link_id, u16 ac, unsigned int link_id, u16 ac,
const struct ieee80211_tx_queue_params *params) const struct ieee80211_tx_queue_params *params)
{ {
struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
struct ath12k *ar; struct ath12k *ar;
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif); struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
int ret; int ret;
ar = ath12k_ah_to_ar(ah, 0); ar = ath12k_get_ar_by_vif(hw, vif);
if (!ar) {
/* TODO cache the info and apply after vdev is created */
return -EINVAL;
}
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
ret = ath12k_mac_conf_tx(arvif, link_id, ac, params); ret = ath12k_mac_conf_tx(arvif, link_id, ac, params);
...@@ -6455,6 +6491,10 @@ static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw, ...@@ -6455,6 +6491,10 @@ static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif); struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
int ret = -EINVAL; int ret = -EINVAL;
ar = ath12k_get_ar_by_vif(hw, vif);
if (!ar)
return -EINVAL;
ar = ath12k_ah_to_ar(ah, 0); ar = ath12k_ah_to_ar(ah, 0);
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
...@@ -7210,11 +7250,24 @@ static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *v ...@@ -7210,11 +7250,24 @@ static void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *v
u32 queues, bool drop) u32 queues, bool drop)
{ {
struct ath12k_hw *ah = ath12k_hw_to_ah(hw); struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
struct ath12k *ar = ath12k_ah_to_ar(ah, 0); struct ath12k *ar;
int i;
if (drop) if (drop)
return; return;
/* vif can be NULL when flush() is considered for hw */
if (!vif) {
for_each_ar(ah, ar, i)
ath12k_mac_flush(ar);
return;
}
ar = ath12k_get_ar_by_vif(hw, vif);
if (!ar)
return;
ath12k_mac_flush(ar); ath12k_mac_flush(ar);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment