mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-06 21:14:18 +00:00
wifi: ath12k: update regulatory rules when connection established
Once connection to AP established we know the exact power type, it is time to update regulatory rules based on such info. Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com> Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com> Link: https://patch.msgid.link/20250418-ath12k-6g-lp-vlp-v1-9-c869c86cad60@quicinc.com Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
This commit is contained in:
parent
4c546023d7
commit
7ed3e88664
@ -5772,12 +5772,15 @@ static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
|
|||||||
enum ieee80211_sta_state new_state)
|
enum ieee80211_sta_state new_state)
|
||||||
{
|
{
|
||||||
struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
|
struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
|
||||||
|
struct ieee80211_bss_conf *link_conf;
|
||||||
struct ath12k *ar = arvif->ar;
|
struct ath12k *ar = arvif->ar;
|
||||||
|
struct ath12k_reg_info *reg_info;
|
||||||
|
struct ath12k_base *ab = ar->ab;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
lockdep_assert_wiphy(hw->wiphy);
|
lockdep_assert_wiphy(hw->wiphy);
|
||||||
|
|
||||||
ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n",
|
ath12k_dbg(ab, ATH12K_DBG_MAC, "mac handle link %u sta %pM state %d -> %d\n",
|
||||||
arsta->link_id, arsta->addr, old_state, new_state);
|
arsta->link_id, arsta->addr, old_state, new_state);
|
||||||
|
|
||||||
/* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station
|
/* IEEE80211_STA_NONE -> IEEE80211_STA_NOTEXIST: Remove the station
|
||||||
@ -5787,7 +5790,7 @@ static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
|
|||||||
new_state == IEEE80211_STA_NOTEXIST)) {
|
new_state == IEEE80211_STA_NOTEXIST)) {
|
||||||
ret = ath12k_mac_station_remove(ar, arvif, arsta);
|
ret = ath12k_mac_station_remove(ar, arvif, arsta);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath12k_warn(ar->ab, "Failed to remove station: %pM for VDEV: %d\n",
|
ath12k_warn(ab, "Failed to remove station: %pM for VDEV: %d\n",
|
||||||
arsta->addr, arvif->vdev_id);
|
arsta->addr, arvif->vdev_id);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
@ -5798,7 +5801,7 @@ static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
|
|||||||
new_state == IEEE80211_STA_NONE) {
|
new_state == IEEE80211_STA_NONE) {
|
||||||
ret = ath12k_mac_station_add(ar, arvif, arsta);
|
ret = ath12k_mac_station_add(ar, arvif, arsta);
|
||||||
if (ret)
|
if (ret)
|
||||||
ath12k_warn(ar->ab, "Failed to add station: %pM for VDEV: %d\n",
|
ath12k_warn(ab, "Failed to add station: %pM for VDEV: %d\n",
|
||||||
arsta->addr, arvif->vdev_id);
|
arsta->addr, arvif->vdev_id);
|
||||||
|
|
||||||
/* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for
|
/* IEEE80211_STA_AUTH -> IEEE80211_STA_ASSOC: Send station assoc command for
|
||||||
@ -5811,7 +5814,7 @@ static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
|
|||||||
vif->type == NL80211_IFTYPE_ADHOC)) {
|
vif->type == NL80211_IFTYPE_ADHOC)) {
|
||||||
ret = ath12k_mac_station_assoc(ar, arvif, arsta, false);
|
ret = ath12k_mac_station_assoc(ar, arvif, arsta, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
ath12k_warn(ar->ab, "Failed to associate station: %pM\n",
|
ath12k_warn(ab, "Failed to associate station: %pM\n",
|
||||||
arsta->addr);
|
arsta->addr);
|
||||||
|
|
||||||
/* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as
|
/* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as
|
||||||
@ -5820,9 +5823,20 @@ static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
|
|||||||
} else if (old_state == IEEE80211_STA_ASSOC &&
|
} else if (old_state == IEEE80211_STA_ASSOC &&
|
||||||
new_state == IEEE80211_STA_AUTHORIZED) {
|
new_state == IEEE80211_STA_AUTHORIZED) {
|
||||||
ret = ath12k_mac_station_authorize(ar, arvif, arsta);
|
ret = ath12k_mac_station_authorize(ar, arvif, arsta);
|
||||||
if (ret)
|
if (ret) {
|
||||||
ath12k_warn(ar->ab, "Failed to authorize station: %pM\n",
|
ath12k_warn(ab, "Failed to authorize station: %pM\n",
|
||||||
arsta->addr);
|
arsta->addr);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ath12k_wmi_supports_6ghz_cc_ext(ar) &&
|
||||||
|
arvif->ahvif->vdev_type == WMI_VDEV_TYPE_STA) {
|
||||||
|
link_conf = ath12k_mac_get_link_bss_conf(arvif);
|
||||||
|
reg_info = ab->reg_info[ar->pdev_idx];
|
||||||
|
ath12k_dbg(ab, ATH12K_DBG_MAC, "connection done, update reg rules\n");
|
||||||
|
ath12k_reg_handle_chan_list(ab, reg_info, arvif->ahvif->vdev_type,
|
||||||
|
link_conf->power_type);
|
||||||
|
}
|
||||||
|
|
||||||
/* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal,
|
/* IEEE80211_STA_AUTHORIZED -> IEEE80211_STA_ASSOC: station may be in removal,
|
||||||
* deauthorize it.
|
* deauthorize it.
|
||||||
@ -5841,7 +5855,7 @@ static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
|
|||||||
vif->type == NL80211_IFTYPE_ADHOC)) {
|
vif->type == NL80211_IFTYPE_ADHOC)) {
|
||||||
ret = ath12k_mac_station_disassoc(ar, arvif, arsta);
|
ret = ath12k_mac_station_disassoc(ar, arvif, arsta);
|
||||||
if (ret)
|
if (ret)
|
||||||
ath12k_warn(ar->ab, "Failed to disassociate station: %pM\n",
|
ath12k_warn(ab, "Failed to disassociate station: %pM\n",
|
||||||
arsta->addr);
|
arsta->addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user