Commit 4d66449a authored by Emmanuel Grumbach's avatar Emmanuel Grumbach

iwlwifi: mvm: BT Coex - send channel inhibition before association

The firmware needs to know on what channel we run before we
set the association bit in the MAC context. Change a bit the
flow to achieve this.
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent 1504f48d
...@@ -801,23 +801,10 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac, ...@@ -801,23 +801,10 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
switch (vif->type) { switch (vif->type) {
case NL80211_IFTYPE_STATION: case NL80211_IFTYPE_STATION:
/* Count BSSes vifs */
data->num_bss_ifaces++;
/* default smps_mode for BSS / P2P client is AUTOMATIC */ /* default smps_mode for BSS / P2P client is AUTOMATIC */
smps_mode = IEEE80211_SMPS_AUTOMATIC; smps_mode = IEEE80211_SMPS_AUTOMATIC;
data->num_bss_ifaces++;
/*
* Count unassoc BSSes, relax SMSP constraints
* and disable reduced Tx Power
*/
if (!vif->bss_conf.assoc) {
iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_BT_COEX,
smps_mode);
if (iwl_mvm_bt_coex_reduced_txp(mvm,
mvmvif->ap_sta_id,
false))
IWL_ERR(mvm, "Couldn't send BT_CONFIG cmd\n");
return;
}
break; break;
case NL80211_IFTYPE_AP: case NL80211_IFTYPE_AP:
/* default smps_mode for AP / GO is OFF */ /* default smps_mode for AP / GO is OFF */
...@@ -843,6 +830,7 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac, ...@@ -843,6 +830,7 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
/* ... relax constraints and disable rssi events */ /* ... relax constraints and disable rssi events */
iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_BT_COEX, iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_BT_COEX,
smps_mode); smps_mode);
data->reduced_tx_power = false;
if (vif->type == NL80211_IFTYPE_STATION) if (vif->type == NL80211_IFTYPE_STATION)
iwl_mvm_bt_coex_enable_rssi_event(mvm, vif, false, 0); iwl_mvm_bt_coex_enable_rssi_event(mvm, vif, false, 0);
return; return;
...@@ -855,6 +843,11 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac, ...@@ -855,6 +843,11 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
smps_mode = vif->type == NL80211_IFTYPE_AP ? smps_mode = vif->type == NL80211_IFTYPE_AP ?
IEEE80211_SMPS_OFF : IEEE80211_SMPS_OFF :
IEEE80211_SMPS_DYNAMIC; IEEE80211_SMPS_DYNAMIC;
/* relax SMPS contraints for next association */
if (!vif->bss_conf.assoc)
smps_mode = IEEE80211_SMPS_AUTOMATIC;
IWL_DEBUG_COEX(data->mvm, IWL_DEBUG_COEX(data->mvm,
"mac %d: bt_status %d bt_activity_grading %d smps_req %d\n", "mac %d: bt_status %d bt_activity_grading %d smps_req %d\n",
mvmvif->id, data->notif->bt_status, bt_activity_grading, mvmvif->id, data->notif->bt_status, bt_activity_grading,
...@@ -901,22 +894,17 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac, ...@@ -901,22 +894,17 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
/* if secondary is not NULL, it might be a GO */ /* if secondary is not NULL, it might be a GO */
data->secondary = chanctx_conf; data->secondary = chanctx_conf;
/* don't reduce the Tx power if in loose scheme */ /*
* don't reduce the Tx power if one of these is true:
* we are in LOOSE
* single share antenna product
* BT is active
* we are associated
*/
if (iwl_get_coex_type(mvm, vif) == BT_COEX_LOOSE_LUT || if (iwl_get_coex_type(mvm, vif) == BT_COEX_LOOSE_LUT ||
mvm->cfg->bt_shared_single_ant) { mvm->cfg->bt_shared_single_ant || !vif->bss_conf.assoc ||
data->reduced_tx_power = false; !data->notif->bt_status) {
iwl_mvm_bt_coex_enable_rssi_event(mvm, vif, false, 0);
return;
}
/* reduced Txpower only if BT is on, so ...*/
if (!data->notif->bt_status) {
/* ... cancel reduced Tx power ... */
if (iwl_mvm_bt_coex_reduced_txp(mvm, mvmvif->ap_sta_id, false))
IWL_ERR(mvm, "Couldn't send BT_CONFIG cmd\n");
data->reduced_tx_power = false; data->reduced_tx_power = false;
/* ... and there is no need to get reports on RSSI any more. */
iwl_mvm_bt_coex_enable_rssi_event(mvm, vif, false, 0); iwl_mvm_bt_coex_enable_rssi_event(mvm, vif, false, 0);
return; return;
} }
...@@ -1037,7 +1025,6 @@ static void iwl_mvm_bt_coex_notif_handle(struct iwl_mvm *mvm) ...@@ -1037,7 +1025,6 @@ static void iwl_mvm_bt_coex_notif_handle(struct iwl_mvm *mvm)
IWL_ERR(mvm, "Failed to update the ctrl_kill_msk\n"); IWL_ERR(mvm, "Failed to update the ctrl_kill_msk\n");
} }
/* upon association, the fw will send in BT Coex notification */
int iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm, int iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
struct iwl_rx_cmd_buffer *rxb, struct iwl_rx_cmd_buffer *rxb,
struct iwl_device_cmd *dev_cmd) struct iwl_device_cmd *dev_cmd)
......
...@@ -2186,10 +2186,10 @@ static void iwl_mvm_change_chanctx(struct ieee80211_hw *hw, ...@@ -2186,10 +2186,10 @@ static void iwl_mvm_change_chanctx(struct ieee80211_hw *hw,
return; return;
mutex_lock(&mvm->mutex); mutex_lock(&mvm->mutex);
iwl_mvm_bt_coex_vif_change(mvm);
iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &ctx->min_def, iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &ctx->min_def,
ctx->rx_chains_static, ctx->rx_chains_static,
ctx->rx_chains_dynamic); ctx->rx_chains_dynamic);
iwl_mvm_bt_coex_vif_change(mvm);
mutex_unlock(&mvm->mutex); mutex_unlock(&mvm->mutex);
} }
......
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