iwlwifi: mvm: allow to force the Rx chains from debugfs
This is useful to debug weird antenna problems. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
This commit is contained in:
parent
0522588d2f
commit
ddf89ab10a
|
@ -545,6 +545,57 @@ static ssize_t iwl_dbgfs_uapsd_misbehaving_write(struct ieee80211_vif *vif,
|
||||||
return ret ? count : -EINVAL;
|
return ret ? count : -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t iwl_dbgfs_rx_phyinfo_write(struct ieee80211_vif *vif, char *buf,
|
||||||
|
size_t count, loff_t *ppos)
|
||||||
|
{
|
||||||
|
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||||
|
struct iwl_mvm *mvm = mvmvif->mvm;
|
||||||
|
struct ieee80211_chanctx_conf *chanctx_conf;
|
||||||
|
struct iwl_mvm_phy_ctxt *phy_ctxt;
|
||||||
|
u16 value;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = kstrtou16(buf, 0, &value);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
mutex_lock(&mvm->mutex);
|
||||||
|
rcu_read_lock();
|
||||||
|
|
||||||
|
chanctx_conf = rcu_dereference(vif->chanctx_conf);
|
||||||
|
/* make sure the channel context is assigned */
|
||||||
|
if (!chanctx_conf) {
|
||||||
|
rcu_read_unlock();
|
||||||
|
mutex_unlock(&mvm->mutex);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
phy_ctxt = &mvm->phy_ctxts[*(u16 *)chanctx_conf->drv_priv];
|
||||||
|
rcu_read_unlock();
|
||||||
|
|
||||||
|
mvm->dbgfs_rx_phyinfo = value;
|
||||||
|
|
||||||
|
ret = iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &chanctx_conf->min_def,
|
||||||
|
chanctx_conf->rx_chains_static,
|
||||||
|
chanctx_conf->rx_chains_dynamic);
|
||||||
|
mutex_unlock(&mvm->mutex);
|
||||||
|
|
||||||
|
return ret ?: count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t iwl_dbgfs_rx_phyinfo_read(struct file *file,
|
||||||
|
char __user *user_buf,
|
||||||
|
size_t count, loff_t *ppos)
|
||||||
|
{
|
||||||
|
struct ieee80211_vif *vif = file->private_data;
|
||||||
|
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||||
|
char buf[8];
|
||||||
|
|
||||||
|
snprintf(buf, sizeof(buf), "0x%04x\n", mvmvif->mvm->dbgfs_rx_phyinfo);
|
||||||
|
|
||||||
|
return simple_read_from_buffer(user_buf, count, ppos, buf, sizeof(buf));
|
||||||
|
}
|
||||||
|
|
||||||
#define MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz) \
|
#define MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz) \
|
||||||
_MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz, struct ieee80211_vif)
|
_MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz, struct ieee80211_vif)
|
||||||
#define MVM_DEBUGFS_READ_WRITE_FILE_OPS(name, bufsz) \
|
#define MVM_DEBUGFS_READ_WRITE_FILE_OPS(name, bufsz) \
|
||||||
|
@ -560,6 +611,7 @@ MVM_DEBUGFS_READ_WRITE_FILE_OPS(pm_params, 32);
|
||||||
MVM_DEBUGFS_READ_WRITE_FILE_OPS(bf_params, 256);
|
MVM_DEBUGFS_READ_WRITE_FILE_OPS(bf_params, 256);
|
||||||
MVM_DEBUGFS_READ_WRITE_FILE_OPS(low_latency, 10);
|
MVM_DEBUGFS_READ_WRITE_FILE_OPS(low_latency, 10);
|
||||||
MVM_DEBUGFS_READ_WRITE_FILE_OPS(uapsd_misbehaving, 20);
|
MVM_DEBUGFS_READ_WRITE_FILE_OPS(uapsd_misbehaving, 20);
|
||||||
|
MVM_DEBUGFS_READ_WRITE_FILE_OPS(rx_phyinfo, 10);
|
||||||
|
|
||||||
void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
||||||
{
|
{
|
||||||
|
@ -595,6 +647,8 @@ void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
||||||
S_IRUSR | S_IWUSR);
|
S_IRUSR | S_IWUSR);
|
||||||
MVM_DEBUGFS_ADD_FILE_VIF(uapsd_misbehaving, mvmvif->dbgfs_dir,
|
MVM_DEBUGFS_ADD_FILE_VIF(uapsd_misbehaving, mvmvif->dbgfs_dir,
|
||||||
S_IRUSR | S_IWUSR);
|
S_IRUSR | S_IWUSR);
|
||||||
|
MVM_DEBUGFS_ADD_FILE_VIF(rx_phyinfo, mvmvif->dbgfs_dir,
|
||||||
|
S_IRUSR | S_IWUSR);
|
||||||
|
|
||||||
if (vif->type == NL80211_IFTYPE_STATION && !vif->p2p &&
|
if (vif->type == NL80211_IFTYPE_STATION && !vif->p2p &&
|
||||||
mvmvif == mvm->bf_allowed_vif)
|
mvmvif == mvm->bf_allowed_vif)
|
||||||
|
|
|
@ -681,6 +681,7 @@ struct iwl_mvm {
|
||||||
|
|
||||||
struct iwl_mvm_frame_stats drv_rx_stats;
|
struct iwl_mvm_frame_stats drv_rx_stats;
|
||||||
spinlock_t drv_stats_lock;
|
spinlock_t drv_stats_lock;
|
||||||
|
u16 dbgfs_rx_phyinfo;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct iwl_mvm_phy_ctxt phy_ctxts[NUM_PHY_CTX];
|
struct iwl_mvm_phy_ctxt phy_ctxts[NUM_PHY_CTX];
|
||||||
|
|
|
@ -175,6 +175,8 @@ static void iwl_mvm_phy_ctxt_cmd_data(struct iwl_mvm *mvm,
|
||||||
cmd->rxchain_info |= cpu_to_le32(idle_cnt << PHY_RX_CHAIN_CNT_POS);
|
cmd->rxchain_info |= cpu_to_le32(idle_cnt << PHY_RX_CHAIN_CNT_POS);
|
||||||
cmd->rxchain_info |= cpu_to_le32(active_cnt <<
|
cmd->rxchain_info |= cpu_to_le32(active_cnt <<
|
||||||
PHY_RX_CHAIN_MIMO_CNT_POS);
|
PHY_RX_CHAIN_MIMO_CNT_POS);
|
||||||
|
if (unlikely(mvm->dbgfs_rx_phyinfo))
|
||||||
|
cmd->rxchain_info = cpu_to_le32(mvm->dbgfs_rx_phyinfo);
|
||||||
|
|
||||||
cmd->txchain_info = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm));
|
cmd->txchain_info = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue