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

Commit 36946ce6 authored by Emmanuel Grumbach's avatar Emmanuel Grumbach Committed by Johannes Berg
Browse files

iwlwifi: mvm: don't enable MIMO when BT is active



Another step in the rate control / BT Coex integration

Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 7c8e4159
Loading
Loading
Loading
Loading
+96 −1
Original line number Diff line number Diff line
@@ -1530,6 +1530,29 @@ static int rs_move_siso_to_other(struct iwl_mvm *mvm,
	u8 update_search_tbl_counter = 0;
	int ret;

	switch (BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD)) {
	case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
		/* nothing */
		break;
	case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
		/* avoid antenna B unless MIMO */
		if (tbl->action == IWL_SISO_SWITCH_ANTENNA2)
			tbl->action = IWL_SISO_SWITCH_MIMO2_AB;
		break;
	case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
	case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
		/* avoid antenna B and MIMO */
		valid_tx_ant =
			first_antenna(iwl_fw_valid_tx_ant(mvm->fw));
		if (tbl->action != IWL_SISO_SWITCH_ANTENNA1)
			tbl->action = IWL_SISO_SWITCH_ANTENNA1;
		break;
	default:
		IWL_ERR(mvm, "Invalid BT load %d",
			BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD));
		break;
	}

	start_action = tbl->action;
	while (1) {
		lq_sta->action_counter++;
@@ -1543,7 +1566,9 @@ static int rs_move_siso_to_other(struct iwl_mvm *mvm,
			     tx_chains_num <= 2))
				break;

			if (window->success_ratio >= IWL_RS_GOOD_RATIO)
			if (window->success_ratio >= IWL_RS_GOOD_RATIO &&
			    BT_MBOX_MSG(&mvm->last_bt_notif, 3,
					TRAFFIC_LOAD) == 0)
				break;

			memcpy(search_tbl, tbl, sz);
@@ -1665,6 +1690,28 @@ static int rs_move_mimo2_to_other(struct iwl_mvm *mvm,
	u8 update_search_tbl_counter = 0;
	int ret;

	switch (BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD)) {
	case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
		/* nothing */
		break;
	case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
	case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
		/* avoid antenna B and MIMO */
		if (tbl->action != IWL_MIMO2_SWITCH_SISO_A)
			tbl->action = IWL_MIMO2_SWITCH_SISO_A;
		break;
	case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
		/* avoid antenna B unless MIMO */
		if (tbl->action == IWL_MIMO2_SWITCH_SISO_B ||
		    tbl->action == IWL_MIMO2_SWITCH_SISO_C)
			tbl->action = IWL_MIMO2_SWITCH_SISO_A;
		break;
	default:
		IWL_ERR(mvm, "Invalid BT load %d",
			BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD));
		break;
	}

	start_action = tbl->action;
	while (1) {
		lq_sta->action_counter++;
@@ -1802,6 +1849,28 @@ static int rs_move_mimo3_to_other(struct iwl_mvm *mvm,
	int ret;
	u8 update_search_tbl_counter = 0;

	switch (BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD)) {
	case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
		/* nothing */
		break;
	case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
	case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
		/* avoid antenna B and MIMO */
		if (tbl->action != IWL_MIMO3_SWITCH_SISO_A)
			tbl->action = IWL_MIMO3_SWITCH_SISO_A;
		break;
	case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
		/* avoid antenna B unless MIMO */
		if (tbl->action == IWL_MIMO3_SWITCH_SISO_B ||
		    tbl->action == IWL_MIMO3_SWITCH_SISO_C)
			tbl->action = IWL_MIMO3_SWITCH_SISO_A;
		break;
	default:
		IWL_ERR(mvm, "Invalid BT load %d",
			BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD));
		break;
	}

	start_action = tbl->action;
	while (1) {
		lq_sta->action_counter++;
@@ -2313,6 +2382,32 @@ static void rs_rate_scale_perform(struct iwl_mvm *mvm,
	     (current_tpt > (100 * tbl->expected_tpt[low]))))
		scale_action = 0;

	if ((BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD) >=
	     IWL_BT_COEX_TRAFFIC_LOAD_HIGH) &&
	     (is_mimo2(tbl->lq_type) || is_mimo3(tbl->lq_type))) {
		if (lq_sta->last_bt_traffic >
		    BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD)) {
			/*
			 * don't set scale_action, don't want to scale up if
			 * the rate scale doesn't otherwise think that is a
			 * good idea.
			 */
		} else if (lq_sta->last_bt_traffic <=
			   BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD)) {
			scale_action = -1;
		}
	}
	lq_sta->last_bt_traffic =
		BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD);

	if ((BT_MBOX_MSG(&mvm->last_bt_notif, 3, TRAFFIC_LOAD) >=
	     IWL_BT_COEX_TRAFFIC_LOAD_HIGH) &&
	     (is_mimo2(tbl->lq_type) || is_mimo3(tbl->lq_type))) {
		/* search for a new modulation */
		rs_stay_in_table(lq_sta, true);
		goto lq_update;
	}

	switch (scale_action) {
	case -1:
		/* Decrease starting rate, update uCode's rate table */
+12 −0
Original line number Diff line number Diff line
@@ -358,6 +358,18 @@ struct iwl_lq_sta {
	u8 last_bt_traffic;
};

enum iwl_bt_coex_profile_traffic_load {
	IWL_BT_COEX_TRAFFIC_LOAD_NONE		= 0,
	IWL_BT_COEX_TRAFFIC_LOAD_LOW		= 1,
	IWL_BT_COEX_TRAFFIC_LOAD_HIGH		= 2,
	IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS	= 3,
/*
 * There are no more even though below is a u8, the
 * indication from the BT device only has two bits.
 */
};


static inline u8 num_of_ant(u8 mask)
{
	return  !!((mask) & ANT_A) +