Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9166b1ee authored by Emmanuel Grumbach's avatar Emmanuel Grumbach Committed by Johannes Berg
Browse files

iwlwifi: mvm: remove BT Coex constraints upon roaming to A band



When we roam to A band, we don't need to constraint WiFi
any more since it is operating on a different band.

Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 2b76ef13
Loading
Loading
Loading
Loading
+50 −17
Original line number Original line Diff line number Diff line
@@ -362,11 +362,13 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
		band = -1;
		band = -1;
	rcu_read_unlock();
	rcu_read_unlock();


	if (band != IEEE80211_BAND_2GHZ)
		return;

	smps_mode = IEEE80211_SMPS_AUTOMATIC;
	smps_mode = IEEE80211_SMPS_AUTOMATIC;


	if (band != IEEE80211_BAND_2GHZ) {
		ieee80211_request_smps(vif, smps_mode);
		return;
	}

	if (data->notif->bt_status)
	if (data->notif->bt_status)
		smps_mode = IEEE80211_SMPS_DYNAMIC;
		smps_mode = IEEE80211_SMPS_DYNAMIC;


@@ -432,13 +434,9 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
				      BT_ENABLE_REDUCED_TXPOWER_THRESHOLD);
				      BT_ENABLE_REDUCED_TXPOWER_THRESHOLD);
}
}


/* upon association, the fw will send in BT Coex notification */
static void iwl_mvm_new_bt_coex_notif(struct iwl_mvm *mvm,
int iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
				      struct iwl_bt_coex_profile_notif *notif)
			     struct iwl_rx_cmd_buffer *rxb,
			     struct iwl_device_cmd *dev_cmd)
{
{
	struct iwl_rx_packet *pkt = rxb_addr(rxb);
	struct iwl_bt_coex_profile_notif *notif = (void *)pkt->data;
	struct iwl_bt_iterator_data data = {
	struct iwl_bt_iterator_data data = {
		.mvm = mvm,
		.mvm = mvm,
		.notif = notif,
		.notif = notif,
@@ -446,14 +444,6 @@ int iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
	};
	};
	bool reduced_tx_power;
	bool reduced_tx_power;


	IWL_DEBUG_COEX(mvm, "BT Coex Notification received\n");
	IWL_DEBUG_COEX(mvm, "\tBT %salive\n", notif->bt_status ? "" : "not ");
	IWL_DEBUG_COEX(mvm, "\tBT open conn %d\n", notif->bt_open_conn);
	IWL_DEBUG_COEX(mvm, "\tBT traffic load %d\n", notif->bt_traffic_load);
	IWL_DEBUG_COEX(mvm, "\tBT agg traffic load %d\n",
		       notif->bt_agg_traffic_load);
	IWL_DEBUG_COEX(mvm, "\tBT ci compliance %d\n", notif->bt_ci_compliance);

	/* remember this notification for future use: rssi fluctuations */
	/* remember this notification for future use: rssi fluctuations */
	memcpy(&mvm->last_bt_notif, notif, sizeof(mvm->last_bt_notif));
	memcpy(&mvm->last_bt_notif, notif, sizeof(mvm->last_bt_notif));


@@ -474,6 +464,26 @@ int iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,


	if (iwl_mvm_bt_udpate_ctrl_kill_msk(mvm, reduced_tx_power))
	if (iwl_mvm_bt_udpate_ctrl_kill_msk(mvm, reduced_tx_power))
		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,
			     struct iwl_rx_cmd_buffer *rxb,
			     struct iwl_device_cmd *dev_cmd)
{
	struct iwl_rx_packet *pkt = rxb_addr(rxb);
	struct iwl_bt_coex_profile_notif *notif = (void *)pkt->data;


	IWL_DEBUG_COEX(mvm, "BT Coex Notification received\n");
	IWL_DEBUG_COEX(mvm, "\tBT %salive\n", notif->bt_status ? "" : "not ");
	IWL_DEBUG_COEX(mvm, "\tBT open conn %d\n", notif->bt_open_conn);
	IWL_DEBUG_COEX(mvm, "\tBT traffic load %d\n", notif->bt_traffic_load);
	IWL_DEBUG_COEX(mvm, "\tBT agg traffic load %d\n",
		       notif->bt_agg_traffic_load);
	IWL_DEBUG_COEX(mvm, "\tBT ci compliance %d\n", notif->bt_ci_compliance);

	iwl_mvm_new_bt_coex_notif(mvm, notif);


	/*
	/*
	 * This is an async handler for a notification, returning anything other
	 * This is an async handler for a notification, returning anything other
@@ -567,3 +577,26 @@ void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
 out_unlock:
 out_unlock:
	mutex_unlock(&mvm->mutex);
	mutex_unlock(&mvm->mutex);
}
}

void iwl_mvm_bt_coex_vif_assoc(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
{
	struct ieee80211_chanctx_conf *chanctx_conf;
	enum ieee80211_band band;

	rcu_read_lock();
	chanctx_conf = rcu_dereference(vif->chanctx_conf);
	if (chanctx_conf && chanctx_conf->def.chan)
		band = chanctx_conf->def.chan->band;
	else
		band = -1;
	rcu_read_unlock();

	/* if we are in 2GHz we will get a notification from the fw */
	if (band == IEEE80211_BAND_2GHZ)
		return;

	/* else, we can remove all the constraints */
	memset(&mvm->last_bt_notif, 0, sizeof(mvm->last_bt_notif));

	iwl_mvm_new_bt_coex_notif(mvm, &mvm->last_bt_notif);
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -716,6 +716,7 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
				IWL_ERR(mvm, "failed to update quotas\n");
				IWL_ERR(mvm, "failed to update quotas\n");
				return;
				return;
			}
			}
			iwl_mvm_bt_coex_vif_assoc(mvm, vif);
		} else if (mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) {
		} else if (mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) {
			/* remove AP station now that the MAC is unassoc */
			/* remove AP station now that the MAC is unassoc */
			ret = iwl_mvm_rm_sta_id(mvm, vif, mvmvif->ap_sta_id);
			ret = iwl_mvm_rm_sta_id(mvm, vif, mvmvif->ap_sta_id);
+1 −0
Original line number Original line Diff line number Diff line
@@ -524,5 +524,6 @@ int iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
			     struct iwl_device_cmd *cmd);
			     struct iwl_device_cmd *cmd);
void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
			   enum ieee80211_rssi_event rssi_event);
			   enum ieee80211_rssi_event rssi_event);
void iwl_mvm_bt_coex_vif_assoc(struct iwl_mvm *mvm, struct ieee80211_vif *vif);


#endif /* __IWL_MVM_H__ */
#endif /* __IWL_MVM_H__ */