mirror of https://gitee.com/openkylin/linux.git
iwlwifi: mvm: take the valid_{rx,tx}_ant from the TLV
This is the right source of information for the valid Tx antennas, not the NVM. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
d110cb51cf
commit
332235427a
|
@ -203,4 +203,16 @@ struct iwl_fw {
|
||||||
bool mvm_fw;
|
bool mvm_fw;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline u8 iwl_fw_valid_tx_ant(const struct iwl_fw *fw)
|
||||||
|
{
|
||||||
|
return (fw->phy_config & FW_PHY_CFG_TX_CHAIN) >>
|
||||||
|
FW_PHY_CFG_TX_CHAIN_POS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline u8 iwl_fw_valid_rx_ant(const struct iwl_fw *fw)
|
||||||
|
{
|
||||||
|
return (fw->phy_config & FW_PHY_CFG_RX_CHAIN) >>
|
||||||
|
FW_PHY_CFG_RX_CHAIN_POS;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __iwl_fw_h__ */
|
#endif /* __iwl_fw_h__ */
|
||||||
|
|
|
@ -114,7 +114,7 @@ static int iwl_send_tx_ant_cfg(struct iwl_mvm *mvm, u8 valid_tx_ant)
|
||||||
.valid = cpu_to_le32(valid_tx_ant),
|
.valid = cpu_to_le32(valid_tx_ant),
|
||||||
};
|
};
|
||||||
|
|
||||||
IWL_DEBUG_HC(mvm, "select valid tx ant: %u\n", valid_tx_ant);
|
IWL_DEBUG_FW(mvm, "select valid tx ant: %u\n", valid_tx_ant);
|
||||||
return iwl_mvm_send_cmd_pdu(mvm, TX_ANT_CONFIGURATION_CMD, CMD_SYNC,
|
return iwl_mvm_send_cmd_pdu(mvm, TX_ANT_CONFIGURATION_CMD, CMD_SYNC,
|
||||||
sizeof(tx_ant_cmd), &tx_ant_cmd);
|
sizeof(tx_ant_cmd), &tx_ant_cmd);
|
||||||
}
|
}
|
||||||
|
@ -327,7 +327,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
|
||||||
WARN_ON(ret);
|
WARN_ON(ret);
|
||||||
|
|
||||||
/* Send TX valid antennas before triggering calibrations */
|
/* Send TX valid antennas before triggering calibrations */
|
||||||
ret = iwl_send_tx_ant_cfg(mvm, mvm->nvm_data->valid_tx_ant);
|
ret = iwl_send_tx_ant_cfg(mvm, iwl_fw_valid_tx_ant(mvm->fw));
|
||||||
if (ret)
|
if (ret)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
@ -413,7 +413,7 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = iwl_send_tx_ant_cfg(mvm, mvm->nvm_data->valid_tx_ant);
|
ret = iwl_send_tx_ant_cfg(mvm, iwl_fw_valid_tx_ant(mvm->fw));
|
||||||
if (ret)
|
if (ret)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
@ -467,7 +467,7 @@ int iwl_mvm_load_d3_fw(struct iwl_mvm *mvm)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = iwl_send_tx_ant_cfg(mvm, mvm->nvm_data->valid_tx_ant);
|
ret = iwl_send_tx_ant_cfg(mvm, iwl_fw_valid_tx_ant(mvm->fw));
|
||||||
if (ret)
|
if (ret)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
|
|
@ -803,7 +803,7 @@ static int iwl_mvm_mac_ctxt_send_beacon(struct iwl_mvm *mvm,
|
||||||
TX_CMD_FLG_TSF);
|
TX_CMD_FLG_TSF);
|
||||||
|
|
||||||
mvm->mgmt_last_antenna_idx =
|
mvm->mgmt_last_antenna_idx =
|
||||||
iwl_mvm_next_antenna(mvm, mvm->nvm_data->valid_tx_ant,
|
iwl_mvm_next_antenna(mvm, iwl_fw_valid_tx_ant(mvm->fw),
|
||||||
mvm->mgmt_last_antenna_idx);
|
mvm->mgmt_last_antenna_idx);
|
||||||
|
|
||||||
beacon_cmd.tx.rate_n_flags =
|
beacon_cmd.tx.rate_n_flags =
|
||||||
|
|
|
@ -142,7 +142,7 @@ static void iwl_mvm_phy_ctxt_cmd_data(struct iwl_mvm *mvm,
|
||||||
struct cfg80211_chan_def *chandef,
|
struct cfg80211_chan_def *chandef,
|
||||||
u8 chains_static, u8 chains_dynamic)
|
u8 chains_static, u8 chains_dynamic)
|
||||||
{
|
{
|
||||||
u8 valid_rx_chains, active_cnt, idle_cnt;
|
u8 active_cnt, idle_cnt;
|
||||||
|
|
||||||
/* Set the channel info data */
|
/* Set the channel info data */
|
||||||
cmd->ci.band = (chandef->chan->band == IEEE80211_BAND_2GHZ ?
|
cmd->ci.band = (chandef->chan->band == IEEE80211_BAND_2GHZ ?
|
||||||
|
@ -158,17 +158,16 @@ static void iwl_mvm_phy_ctxt_cmd_data(struct iwl_mvm *mvm,
|
||||||
* Need to add on chain noise calibration limitations, and
|
* Need to add on chain noise calibration limitations, and
|
||||||
* BT coex considerations.
|
* BT coex considerations.
|
||||||
*/
|
*/
|
||||||
valid_rx_chains = mvm->nvm_data->valid_rx_ant;
|
|
||||||
idle_cnt = chains_static;
|
idle_cnt = chains_static;
|
||||||
active_cnt = chains_dynamic;
|
active_cnt = chains_dynamic;
|
||||||
|
|
||||||
cmd->rxchain_info = cpu_to_le32(valid_rx_chains <<
|
cmd->rxchain_info = cpu_to_le32(iwl_fw_valid_rx_ant(mvm->fw) <<
|
||||||
PHY_RX_CHAIN_VALID_POS);
|
PHY_RX_CHAIN_VALID_POS);
|
||||||
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);
|
||||||
|
|
||||||
cmd->txchain_info = cpu_to_le32(mvm->nvm_data->valid_tx_ant);
|
cmd->txchain_info = cpu_to_le32(iwl_fw_valid_tx_ant(mvm->fw));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -74,7 +74,7 @@
|
||||||
static inline __le16 iwl_mvm_scan_rx_chain(struct iwl_mvm *mvm)
|
static inline __le16 iwl_mvm_scan_rx_chain(struct iwl_mvm *mvm)
|
||||||
{
|
{
|
||||||
u16 rx_chain;
|
u16 rx_chain;
|
||||||
u8 rx_ant = mvm->nvm_data->valid_rx_ant;
|
u8 rx_ant = iwl_fw_valid_rx_ant(mvm->fw);
|
||||||
|
|
||||||
rx_chain = rx_ant << PHY_RX_CHAIN_VALID_POS;
|
rx_chain = rx_ant << PHY_RX_CHAIN_VALID_POS;
|
||||||
rx_chain |= rx_ant << PHY_RX_CHAIN_FORCE_MIMO_SEL_POS;
|
rx_chain |= rx_ant << PHY_RX_CHAIN_FORCE_MIMO_SEL_POS;
|
||||||
|
@ -115,7 +115,7 @@ iwl_mvm_scan_rate_n_flags(struct iwl_mvm *mvm, enum ieee80211_band band,
|
||||||
u32 tx_ant;
|
u32 tx_ant;
|
||||||
|
|
||||||
mvm->scan_last_antenna_idx =
|
mvm->scan_last_antenna_idx =
|
||||||
iwl_mvm_next_antenna(mvm, mvm->nvm_data->valid_tx_ant,
|
iwl_mvm_next_antenna(mvm, iwl_fw_valid_tx_ant(mvm->fw),
|
||||||
mvm->scan_last_antenna_idx);
|
mvm->scan_last_antenna_idx);
|
||||||
tx_ant = BIT(mvm->scan_last_antenna_idx) << RATE_MCS_ANT_POS;
|
tx_ant = BIT(mvm->scan_last_antenna_idx) << RATE_MCS_ANT_POS;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue