Commit d01c08ed authored by Sriram R's avatar Sriram R Committed by Kalle Valo

wifi: ath12k: Modify add and remove chanctx ops for single wiphy support

Modify add and remove chanctx mac80211 ops to fetch the correct
radio(ar) based on channel context.

This change also introduces new helper function to fetch the
radio/ar based on channel context and ieee80211_chan which internally
uses the radio's low/high freq range.

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-3-quic_ramess@quicinc.com
parent ba12f08f
......@@ -605,6 +605,9 @@ struct ath12k {
bool monitor_vdev_created;
bool monitor_started;
int monitor_vdev_id;
u32 freq_low;
u32 freq_high;
};
struct ath12k_hw {
......
......@@ -614,6 +614,35 @@ struct ath12k *ath12k_mac_get_ar_by_pdev_id(struct ath12k_base *ab, u32 pdev_id)
return NULL;
}
static struct ath12k *ath12k_mac_get_ar_by_chan(struct ieee80211_hw *hw,
struct ieee80211_channel *channel)
{
struct ath12k_hw *ah = hw->priv;
struct ath12k *ar;
int i;
ar = ah->radio;
if (ah->num_radio == 1)
return ar;
for_each_ar(ah, ar, i) {
if (channel->center_freq >= ar->freq_low &&
channel->center_freq <= ar->freq_high)
return ar;
}
return NULL;
}
static struct ath12k *ath12k_get_ar_by_ctx(struct ieee80211_hw *hw,
struct ieee80211_chanctx_conf *ctx)
{
if (!ctx)
return NULL;
return ath12k_mac_get_ar_by_chan(hw, ctx->def.chan);
}
static void ath12k_pdev_caps_update(struct ath12k *ar)
{
struct ath12k_base *ab = ar->ab;
......@@ -6230,11 +6259,13 @@ static int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
struct ieee80211_chanctx_conf *ctx)
{
struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
struct ath12k *ar;
struct ath12k_base *ab;
ar = ath12k_ah_to_ar(ah, 0);
ar = ath12k_get_ar_by_ctx(hw, ctx);
if (!ar)
return -EINVAL;
ab = ar->ab;
ath12k_dbg(ab, ATH12K_DBG_MAC,
......@@ -6258,11 +6289,13 @@ static int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
static void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
struct ieee80211_chanctx_conf *ctx)
{
struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
struct ath12k *ar;
struct ath12k_base *ab;
ar = ath12k_ah_to_ar(ah, 0);
ar = ath12k_get_ar_by_ctx(hw, ctx);
if (!ar)
return;
ab = ar->ab;
ath12k_dbg(ab, ATH12K_DBG_MAC,
......@@ -6638,11 +6671,13 @@ static void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
struct ieee80211_chanctx_conf *ctx,
u32 changed)
{
struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
struct ath12k *ar;
struct ath12k_base *ab;
ar = ath12k_ah_to_ar(ah, 0);
ar = ath12k_get_ar_by_ctx(hw, ctx);
if (!ar)
return;
ab = ar->ab;
mutex_lock(&ar->conf_mutex);
......@@ -7644,6 +7679,9 @@ static void ath12k_mac_update_ch_list(struct ath12k *ar,
band->channels[i].center_freq > freq_high)
band->channels[i].flags |= IEEE80211_CHAN_DISABLED;
}
ar->freq_low = freq_low;
ar->freq_high = freq_high;
}
static u32 ath12k_get_phy_id(struct ath12k *ar, u32 band)
......
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