aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/mvm
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2013-10-06 04:41:20 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-10-11 03:58:52 -0400
commitffa6c7077c3f7a433312b733688b9b14f38de17e (patch)
tree91f2cff075d263b235424f0541d769da4c77b039 /drivers/net/wireless/iwlwifi/mvm
parente9fff7767e36d1ad993f9b4c0a2b5fc173268585 (diff)
iwlwifi: mvm: BT Coex - update integration with rate control
Remove code that is not needed and always allow MIMO when in tight mode. In loose mode, we should avoid MIMO since BT can use the other antenna to Rx while we Tx. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/bt-coex.c18
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mvm.h3
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rs.c45
3 files changed, 23 insertions, 43 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c
index 9fda0c7aa9c7..f3180cf63843 100644
--- a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c
+++ b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c
@@ -921,6 +921,24 @@ u16 iwl_mvm_bt_coex_agg_time_limit(struct iwl_mvm *mvm,
921 return LINK_QUAL_AGG_TIME_LIMIT_BT_ACT; 921 return LINK_QUAL_AGG_TIME_LIMIT_BT_ACT;
922} 922}
923 923
924bool iwl_mvm_bt_coex_is_mimo_allowed(struct iwl_mvm *mvm,
925 struct ieee80211_sta *sta)
926{
927 struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv;
928
929 if (le32_to_cpu(mvm->last_bt_notif.bt_activity_grading) <
930 BT_HIGH_TRAFFIC)
931 return true;
932
933 /*
934 * In Tight, BT can't Rx while we Tx, so use both antennas since BT is
935 * already killed.
936 * In Loose, BT can Rx while we Tx, so forbid MIMO to let BT Rx while we
937 * Tx.
938 */
939 return iwl_get_coex_type(mvm, mvmsta->vif) == BT_COEX_TIGHT_LUT;
940}
941
924void iwl_mvm_bt_coex_vif_change(struct iwl_mvm *mvm) 942void iwl_mvm_bt_coex_vif_change(struct iwl_mvm *mvm)
925{ 943{
926 if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_NEWBT_COEX)) 944 if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_NEWBT_COEX))
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
index 5b1c91c009b0..28d93051af2c 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
@@ -820,6 +820,9 @@ void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
820void iwl_mvm_bt_coex_vif_change(struct iwl_mvm *mvm); 820void iwl_mvm_bt_coex_vif_change(struct iwl_mvm *mvm);
821u16 iwl_mvm_bt_coex_agg_time_limit(struct iwl_mvm *mvm, 821u16 iwl_mvm_bt_coex_agg_time_limit(struct iwl_mvm *mvm,
822 struct ieee80211_sta *sta); 822 struct ieee80211_sta *sta);
823bool iwl_mvm_bt_coex_is_mimo_allowed(struct iwl_mvm *mvm,
824 struct ieee80211_sta *sta);
825
823enum iwl_bt_kill_msk { 826enum iwl_bt_kill_msk {
824 BT_KILL_MSK_DEFAULT, 827 BT_KILL_MSK_DEFAULT,
825 BT_KILL_MSK_SCO_HID_A2DP, 828 BT_KILL_MSK_SCO_HID_A2DP,
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c
index 0faeecc0ab1c..a0b4cc8d9c3b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.c
@@ -1402,29 +1402,9 @@ static int rs_move_siso_to_other(struct iwl_mvm *mvm,
1402 u8 update_search_tbl_counter = 0; 1402 u8 update_search_tbl_counter = 0;
1403 int ret; 1403 int ret;
1404 1404
1405 switch (le32_to_cpu(mvm->last_bt_notif.bt_activity_grading)) { 1405 if (tbl->action == IWL_SISO_SWITCH_MIMO2 &&
1406 case IWL_BT_COEX_TRAFFIC_LOAD_NONE: 1406 !iwl_mvm_bt_coex_is_mimo_allowed(mvm, sta))
1407 /* nothing */
1408 break;
1409 case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
1410 /* avoid switching to antenna B but allow MIMO */
1411 if (tbl->action == IWL_SISO_SWITCH_ANTENNA &&
1412 tbl->ant_type == ANT_A)
1413 tbl->action = IWL_SISO_SWITCH_MIMO2;
1414 break;
1415 case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
1416 case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
1417 /* A - avoid antenna B and MIMO. B - switch to A */
1418 if (tbl->ant_type == ANT_A)
1419 valid_tx_ant =
1420 first_antenna(iwl_fw_valid_tx_ant(mvm->fw));
1421 tbl->action = IWL_SISO_SWITCH_ANTENNA; 1407 tbl->action = IWL_SISO_SWITCH_ANTENNA;
1422 break;
1423 default:
1424 IWL_ERR(mvm, "Invalid BT load %d",
1425 le32_to_cpu(mvm->last_bt_notif.bt_activity_grading));
1426 break;
1427 }
1428 1408
1429 start_action = tbl->action; 1409 start_action = tbl->action;
1430 while (1) { 1410 while (1) {
@@ -1519,27 +1499,6 @@ static int rs_move_mimo2_to_other(struct iwl_mvm *mvm,
1519 u8 update_search_tbl_counter = 0; 1499 u8 update_search_tbl_counter = 0;
1520 int ret; 1500 int ret;
1521 1501
1522 switch (le32_to_cpu(mvm->last_bt_notif.bt_activity_grading)) {
1523 case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
1524 /* nothing */
1525 break;
1526 case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
1527 case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
1528 /* avoid antenna B and MIMO */
1529 if (tbl->action != IWL_MIMO2_SWITCH_SISO_A)
1530 tbl->action = IWL_MIMO2_SWITCH_SISO_A;
1531 break;
1532 case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
1533 /* avoid antenna B unless MIMO */
1534 if (tbl->action == IWL_MIMO2_SWITCH_SISO_B)
1535 tbl->action = IWL_MIMO2_SWITCH_SISO_A;
1536 break;
1537 default:
1538 IWL_ERR(mvm, "Invalid BT load %d",
1539 le32_to_cpu(mvm->last_bt_notif.bt_activity_grading));
1540 break;
1541 }
1542
1543 start_action = tbl->action; 1502 start_action = tbl->action;
1544 while (1) { 1503 while (1) {
1545 lq_sta->action_counter++; 1504 lq_sta->action_counter++;