Commit 10bc8558 authored by Kalle Valo's avatar Kalle Valo

Merge tag 'ath-current-20240531' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath

Merge ath-current from git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git

ath.git fixes for 6.10. Two fixes for user reported regressions in
ath11k. One dependency fix and one error path fix.
parents 92ecbb3a 6e16782d
...@@ -45,6 +45,7 @@ config ATH10K_SNOC ...@@ -45,6 +45,7 @@ config ATH10K_SNOC
depends on ATH10K depends on ATH10K
depends on ARCH_QCOM || COMPILE_TEST depends on ARCH_QCOM || COMPILE_TEST
depends on QCOM_SMEM depends on QCOM_SMEM
depends on QCOM_RPROC_COMMON || QCOM_RPROC_COMMON=n
select QCOM_SCM select QCOM_SCM
select QCOM_QMI_HELPERS select QCOM_QMI_HELPERS
help help
......
...@@ -604,7 +604,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = { ...@@ -604,7 +604,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.coldboot_cal_ftm = true, .coldboot_cal_ftm = true,
.cbcal_restart_fw = false, .cbcal_restart_fw = false,
.fw_mem_mode = 0, .fw_mem_mode = 0,
.num_vdevs = 16 + 1, .num_vdevs = 3,
.num_peers = 512, .num_peers = 512,
.supports_suspend = false, .supports_suspend = false,
.hal_desc_sz = sizeof(struct hal_rx_desc_qcn9074), .hal_desc_sz = sizeof(struct hal_rx_desc_qcn9074),
......
...@@ -7988,8 +7988,6 @@ ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw, ...@@ -7988,8 +7988,6 @@ ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
struct ath11k_base *ab = ar->ab; struct ath11k_base *ab = ar->ab;
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
int ret; int ret;
struct cur_regulatory_info *reg_info;
enum ieee80211_ap_reg_power power_type;
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
...@@ -8000,17 +7998,6 @@ ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw, ...@@ -8000,17 +7998,6 @@ ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
if (ath11k_wmi_supports_6ghz_cc_ext(ar) && if (ath11k_wmi_supports_6ghz_cc_ext(ar) &&
ctx->def.chan->band == NL80211_BAND_6GHZ && ctx->def.chan->band == NL80211_BAND_6GHZ &&
arvif->vdev_type == WMI_VDEV_TYPE_STA) { arvif->vdev_type == WMI_VDEV_TYPE_STA) {
reg_info = &ab->reg_info_store[ar->pdev_idx];
power_type = vif->bss_conf.power_type;
ath11k_dbg(ab, ATH11K_DBG_MAC, "chanctx power type %d\n", power_type);
if (power_type == IEEE80211_REG_UNSET_AP) {
ret = -EINVAL;
goto out;
}
ath11k_reg_handle_chan_list(ab, reg_info, power_type);
arvif->chanctx = *ctx; arvif->chanctx = *ctx;
ath11k_mac_parse_tx_pwr_env(ar, vif, ctx); ath11k_mac_parse_tx_pwr_env(ar, vif, ctx);
} }
...@@ -9626,6 +9613,8 @@ static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw, ...@@ -9626,6 +9613,8 @@ static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
struct ath11k *ar = hw->priv; struct ath11k *ar = hw->priv;
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif); struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta); struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
enum ieee80211_ap_reg_power power_type;
struct cur_regulatory_info *reg_info;
struct ath11k_peer *peer; struct ath11k_peer *peer;
int ret = 0; int ret = 0;
...@@ -9705,6 +9694,29 @@ static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw, ...@@ -9705,6 +9694,29 @@ static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n", ath11k_warn(ar->ab, "Unable to authorize peer %pM vdev %d: %d\n",
sta->addr, arvif->vdev_id, ret); sta->addr, arvif->vdev_id, ret);
} }
if (!ret &&
ath11k_wmi_supports_6ghz_cc_ext(ar) &&
arvif->vdev_type == WMI_VDEV_TYPE_STA &&
arvif->chanctx.def.chan &&
arvif->chanctx.def.chan->band == NL80211_BAND_6GHZ) {
reg_info = &ar->ab->reg_info_store[ar->pdev_idx];
power_type = vif->bss_conf.power_type;
if (power_type == IEEE80211_REG_UNSET_AP) {
ath11k_warn(ar->ab, "invalid power type %d\n",
power_type);
ret = -EINVAL;
} else {
ret = ath11k_reg_handle_chan_list(ar->ab,
reg_info,
power_type);
if (ret)
ath11k_warn(ar->ab,
"failed to handle chan list with power type %d\n",
power_type);
}
}
} else if (old_state == IEEE80211_STA_AUTHORIZED && } else if (old_state == IEEE80211_STA_AUTHORIZED &&
new_state == IEEE80211_STA_ASSOC) { new_state == IEEE80211_STA_ASSOC) {
spin_lock_bh(&ar->ab->base_lock); spin_lock_bh(&ar->ab->base_lock);
......
...@@ -561,6 +561,7 @@ static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab) ...@@ -561,6 +561,7 @@ static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab)
{ {
int i, j, n, ret, num_vectors = 0; int i, j, n, ret, num_vectors = 0;
u32 user_base_data = 0, base_vector = 0; u32 user_base_data = 0, base_vector = 0;
struct ath11k_ext_irq_grp *irq_grp;
unsigned long irq_flags; unsigned long irq_flags;
ret = ath11k_pcic_get_user_msi_assignment(ab, "DP", &num_vectors, ret = ath11k_pcic_get_user_msi_assignment(ab, "DP", &num_vectors,
...@@ -574,14 +575,16 @@ static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab) ...@@ -574,14 +575,16 @@ static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab)
irq_flags |= IRQF_NOBALANCING; irq_flags |= IRQF_NOBALANCING;
for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) { for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i]; irq_grp = &ab->ext_irq_grp[i];
u32 num_irq = 0; u32 num_irq = 0;
irq_grp->ab = ab; irq_grp->ab = ab;
irq_grp->grp_id = i; irq_grp->grp_id = i;
irq_grp->napi_ndev = alloc_netdev_dummy(0); irq_grp->napi_ndev = alloc_netdev_dummy(0);
if (!irq_grp->napi_ndev) if (!irq_grp->napi_ndev) {
return -ENOMEM; ret = -ENOMEM;
goto fail_allocate;
}
netif_napi_add(irq_grp->napi_ndev, &irq_grp->napi, netif_napi_add(irq_grp->napi_ndev, &irq_grp->napi,
ath11k_pcic_ext_grp_napi_poll); ath11k_pcic_ext_grp_napi_poll);
...@@ -606,11 +609,8 @@ static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab) ...@@ -606,11 +609,8 @@ static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab)
int irq = ath11k_pcic_get_msi_irq(ab, vector); int irq = ath11k_pcic_get_msi_irq(ab, vector);
if (irq < 0) { if (irq < 0) {
for (n = 0; n <= i; n++) { ret = irq;
irq_grp = &ab->ext_irq_grp[n]; goto fail_irq;
free_netdev(irq_grp->napi_ndev);
}
return irq;
} }
ab->irq_num[irq_idx] = irq; ab->irq_num[irq_idx] = irq;
...@@ -635,6 +635,15 @@ static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab) ...@@ -635,6 +635,15 @@ static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab)
} }
return 0; return 0;
fail_irq:
/* i ->napi_ndev was properly allocated. Free it also */
i += 1;
fail_allocate:
for (n = 0; n < i; n++) {
irq_grp = &ab->ext_irq_grp[n];
free_netdev(irq_grp->napi_ndev);
}
return ret;
} }
int ath11k_pcic_config_irq(struct ath11k_base *ab) int ath11k_pcic_config_irq(struct ath11k_base *ab)
......
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