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

Commit a39979a8 authored by Emmanuel Grumbach's avatar Emmanuel Grumbach
Browse files

iwlwifi: mvm: BT Coex - allow to force the antenna allocation



This can be used for testing.

Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent 5daddc99
Loading
Loading
Loading
Loading
+39 −0
Original line number Original line Diff line number Diff line
@@ -106,6 +106,9 @@ static const u8 iwl_bt_prio_tbl[BT_COEX_PRIO_TBL_EVT_MAX] = {


static int iwl_send_bt_prio_tbl(struct iwl_mvm *mvm)
static int iwl_send_bt_prio_tbl(struct iwl_mvm *mvm)
{
{
	if (unlikely(mvm->bt_force_ant_mode != BT_FORCE_ANT_DIS))
		return 0;

	return iwl_mvm_send_cmd_pdu(mvm, BT_COEX_PRIO_TABLE, 0,
	return iwl_mvm_send_cmd_pdu(mvm, BT_COEX_PRIO_TABLE, 0,
				    sizeof(struct iwl_bt_coex_prio_tbl_cmd),
				    sizeof(struct iwl_bt_coex_prio_tbl_cmd),
				    &iwl_bt_prio_tbl);
				    &iwl_bt_prio_tbl);
@@ -578,6 +581,29 @@ int iwl_send_bt_init_conf(struct iwl_mvm *mvm)
		return -ENOMEM;
		return -ENOMEM;
	cmd.data[0] = bt_cmd;
	cmd.data[0] = bt_cmd;


	lockdep_assert_held(&mvm->mutex);

	if (unlikely(mvm->bt_force_ant_mode != BT_FORCE_ANT_DIS)) {
		switch (mvm->bt_force_ant_mode) {
		case BT_FORCE_ANT_AUTO:
			flags = BT_COEX_AUTO;
			break;
		case BT_FORCE_ANT_BT:
			flags = BT_COEX_BT;
			break;
		case BT_FORCE_ANT_WIFI:
			flags = BT_COEX_WIFI;
			break;
		default:
			WARN_ON(1);
			flags = 0;
		}

		bt_cmd->flags = cpu_to_le32(flags);
		bt_cmd->valid_bit_msk = cpu_to_le32(BT_VALID_ENABLE);
		goto send_cmd;
	}

	bt_cmd->max_kill = 5;
	bt_cmd->max_kill = 5;
	bt_cmd->bt4_antenna_isolation_thr = BT_ANTENNA_COUPLING_THRESHOLD;
	bt_cmd->bt4_antenna_isolation_thr = BT_ANTENNA_COUPLING_THRESHOLD;
	bt_cmd->bt4_antenna_isolation = iwlwifi_mod_params.ant_coupling;
	bt_cmd->bt4_antenna_isolation = iwlwifi_mod_params.ant_coupling;
@@ -642,6 +668,7 @@ int iwl_send_bt_init_conf(struct iwl_mvm *mvm)
	bt_cmd->kill_cts_msk =
	bt_cmd->kill_cts_msk =
		cpu_to_le32(iwl_bt_cts_kill_msk[BT_KILL_MSK_DEFAULT]);
		cpu_to_le32(iwl_bt_cts_kill_msk[BT_KILL_MSK_DEFAULT]);


send_cmd:
	memset(&mvm->last_bt_notif, 0, sizeof(mvm->last_bt_notif));
	memset(&mvm->last_bt_notif, 0, sizeof(mvm->last_bt_notif));
	memset(&mvm->last_bt_ci_cmd, 0, sizeof(mvm->last_bt_ci_cmd));
	memset(&mvm->last_bt_ci_cmd, 0, sizeof(mvm->last_bt_ci_cmd));


@@ -955,6 +982,10 @@ static void iwl_mvm_bt_coex_notif_handle(struct iwl_mvm *mvm)
	struct iwl_bt_coex_ci_cmd cmd = {};
	struct iwl_bt_coex_ci_cmd cmd = {};
	u8 ci_bw_idx;
	u8 ci_bw_idx;


	/* Ignore updates if we are in force mode */
	if (unlikely(mvm->bt_force_ant_mode != BT_FORCE_ANT_DIS))
		return;

	rcu_read_lock();
	rcu_read_lock();
	ieee80211_iterate_active_interfaces_atomic(
	ieee80211_iterate_active_interfaces_atomic(
					mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
					mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
@@ -1121,6 +1152,10 @@ void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,


	lockdep_assert_held(&mvm->mutex);
	lockdep_assert_held(&mvm->mutex);


	/* Ignore updates if we are in force mode */
	if (unlikely(mvm->bt_force_ant_mode != BT_FORCE_ANT_DIS))
		return;

	/*
	/*
	 * Rssi update while not associated - can happen since the statistics
	 * Rssi update while not associated - can happen since the statistics
	 * are handled asynchronously
	 * are handled asynchronously
@@ -1274,6 +1309,10 @@ int iwl_mvm_rx_ant_coupling_notif(struct iwl_mvm *mvm,


	lockdep_assert_held(&mvm->mutex);
	lockdep_assert_held(&mvm->mutex);


	/* Ignore updates if we are in force mode */
	if (unlikely(mvm->bt_force_ant_mode != BT_FORCE_ANT_DIS))
		return 0;

	if (ant_isolation ==  mvm->last_ant_isol)
	if (ant_isolation ==  mvm->last_ant_isol)
		return 0;
		return 0;


+39 −0
Original line number Original line Diff line number Diff line
@@ -455,6 +455,43 @@ iwl_dbgfs_bt_tx_prio_write(struct iwl_mvm *mvm, char *buf,
	return count;
	return count;
}
}


static ssize_t
iwl_dbgfs_bt_force_ant_write(struct iwl_mvm *mvm, char *buf,
			     size_t count, loff_t *ppos)
{
	static const char * const modes_str[BT_FORCE_ANT_MAX] = {
		[BT_FORCE_ANT_DIS] = "dis",
		[BT_FORCE_ANT_AUTO] = "auto",
		[BT_FORCE_ANT_BT] = "bt",
		[BT_FORCE_ANT_WIFI] = "wifi",
	};
	int ret, bt_force_ant_mode;

	for (bt_force_ant_mode = 0;
	     bt_force_ant_mode < ARRAY_SIZE(modes_str);
	     bt_force_ant_mode++) {
		if (!strcmp(buf, modes_str[bt_force_ant_mode]))
			break;
	}

	if (bt_force_ant_mode >= ARRAY_SIZE(modes_str))
		return -EINVAL;

	ret = 0;
	mutex_lock(&mvm->mutex);
	if (mvm->bt_force_ant_mode == bt_force_ant_mode)
		goto out;

	mvm->bt_force_ant_mode = bt_force_ant_mode;
	IWL_DEBUG_COEX(mvm, "Force mode: %s\n",
		       modes_str[mvm->bt_force_ant_mode]);
	ret = iwl_send_bt_init_conf(mvm);

out:
	mutex_unlock(&mvm->mutex);
	return ret ?: count;
}

#define PRINT_STATS_LE32(_str, _val)					\
#define PRINT_STATS_LE32(_str, _val)					\
			 pos += scnprintf(buf + pos, bufsz - pos,	\
			 pos += scnprintf(buf + pos, bufsz - pos,	\
					  fmt_table, _str,		\
					  fmt_table, _str,		\
@@ -1101,6 +1138,7 @@ MVM_DEBUGFS_READ_FILE_OPS(drv_rx_stats);
MVM_DEBUGFS_WRITE_FILE_OPS(fw_restart, 10);
MVM_DEBUGFS_WRITE_FILE_OPS(fw_restart, 10);
MVM_DEBUGFS_WRITE_FILE_OPS(fw_nmi, 10);
MVM_DEBUGFS_WRITE_FILE_OPS(fw_nmi, 10);
MVM_DEBUGFS_WRITE_FILE_OPS(bt_tx_prio, 10);
MVM_DEBUGFS_WRITE_FILE_OPS(bt_tx_prio, 10);
MVM_DEBUGFS_WRITE_FILE_OPS(bt_force_ant, 10);
MVM_DEBUGFS_READ_WRITE_FILE_OPS(scan_ant_rxchain, 8);
MVM_DEBUGFS_READ_WRITE_FILE_OPS(scan_ant_rxchain, 8);
MVM_DEBUGFS_READ_WRITE_FILE_OPS(d0i3_refs, 8);
MVM_DEBUGFS_READ_WRITE_FILE_OPS(d0i3_refs, 8);


@@ -1142,6 +1180,7 @@ int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir)
	MVM_DEBUGFS_ADD_FILE(fw_restart, mvm->debugfs_dir, S_IWUSR);
	MVM_DEBUGFS_ADD_FILE(fw_restart, mvm->debugfs_dir, S_IWUSR);
	MVM_DEBUGFS_ADD_FILE(fw_nmi, mvm->debugfs_dir, S_IWUSR);
	MVM_DEBUGFS_ADD_FILE(fw_nmi, mvm->debugfs_dir, S_IWUSR);
	MVM_DEBUGFS_ADD_FILE(bt_tx_prio, mvm->debugfs_dir, S_IWUSR);
	MVM_DEBUGFS_ADD_FILE(bt_tx_prio, mvm->debugfs_dir, S_IWUSR);
	MVM_DEBUGFS_ADD_FILE(bt_force_ant, mvm->debugfs_dir, S_IWUSR);
	MVM_DEBUGFS_ADD_FILE(scan_ant_rxchain, mvm->debugfs_dir,
	MVM_DEBUGFS_ADD_FILE(scan_ant_rxchain, mvm->debugfs_dir,
			     S_IWUSR | S_IRUSR);
			     S_IWUSR | S_IRUSR);
	MVM_DEBUGFS_ADD_FILE(prph_reg, mvm->debugfs_dir, S_IWUSR | S_IRUSR);
	MVM_DEBUGFS_ADD_FILE(prph_reg, mvm->debugfs_dir, S_IWUSR | S_IRUSR);
+6 −0
Original line number Original line Diff line number Diff line
@@ -76,6 +76,9 @@
 * @BT_COEX_2W:
 * @BT_COEX_2W:
 * @BT_COEX_3W:
 * @BT_COEX_3W:
 * @BT_COEX_NW:
 * @BT_COEX_NW:
 * @BT_COEX_AUTO:
 * @BT_COEX_BT: Antenna is for BT (manufacuring tests)
 * @BT_COEX_WIFI: Antenna is for BT (manufacuring tests)
 * @BT_COEX_SYNC2SCO:
 * @BT_COEX_SYNC2SCO:
 * @BT_COEX_CORUNNING:
 * @BT_COEX_CORUNNING:
 * @BT_COEX_MPLUT:
 * @BT_COEX_MPLUT:
@@ -89,6 +92,9 @@ enum iwl_bt_coex_flags {
	BT_COEX_2W			= 0x1 << BT_COEX_MODE_POS,
	BT_COEX_2W			= 0x1 << BT_COEX_MODE_POS,
	BT_COEX_3W			= 0x2 << BT_COEX_MODE_POS,
	BT_COEX_3W			= 0x2 << BT_COEX_MODE_POS,
	BT_COEX_NW			= 0x3 << BT_COEX_MODE_POS,
	BT_COEX_NW			= 0x3 << BT_COEX_MODE_POS,
	BT_COEX_AUTO			= 0x5 << BT_COEX_MODE_POS,
	BT_COEX_BT			= 0x6 << BT_COEX_MODE_POS,
	BT_COEX_WIFI			= 0x7 << BT_COEX_MODE_POS,
	BT_COEX_SYNC2SCO		= BIT(7),
	BT_COEX_SYNC2SCO		= BIT(7),
	BT_COEX_CORUNNING		= BIT(8),
	BT_COEX_CORUNNING		= BIT(8),
	BT_COEX_MPLUT			= BIT(9),
	BT_COEX_MPLUT			= BIT(9),
+10 −0
Original line number Original line Diff line number Diff line
@@ -235,6 +235,15 @@ enum iwl_mvm_ref_type {
	IWL_MVM_REF_COUNT,
	IWL_MVM_REF_COUNT,
};
};


enum iwl_bt_force_ant_mode {
	BT_FORCE_ANT_DIS = 0,
	BT_FORCE_ANT_AUTO,
	BT_FORCE_ANT_BT,
	BT_FORCE_ANT_WIFI,

	BT_FORCE_ANT_MAX,
};

/**
/**
* struct iwl_mvm_vif_bf_data - beacon filtering related data
* struct iwl_mvm_vif_bf_data - beacon filtering related data
* @bf_enabled: indicates if beacon filtering is enabled
* @bf_enabled: indicates if beacon filtering is enabled
@@ -629,6 +638,7 @@ struct iwl_mvm {
	u32 last_ant_isol;
	u32 last_ant_isol;
	u8 last_corun_lut;
	u8 last_corun_lut;
	u8 bt_tx_prio;
	u8 bt_tx_prio;
	enum iwl_bt_force_ant_mode bt_force_ant_mode;


	/* Thermal Throttling and CTkill */
	/* Thermal Throttling and CTkill */
	struct iwl_mvm_tt_mgmt thermal_throttle;
	struct iwl_mvm_tt_mgmt thermal_throttle;