iwlwifi: mvm: rs: refactor to allow direct rs updating
Enable RS to get updated directly via iwl_mvm_rs_tx_status which will be called by the driver and not via mac80211 rate control. This is required for a following patch to report on BAs which do not cause the BA window to progress. Also this is a first step in decoupling rs from the mac80211 rate control. Signed-off-by: Eyal Shapira <eyalx.shapira@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
This commit is contained in:
parent
361dbec8ac
commit
1ebc8f2ef8
2 changed files with 52 additions and 50 deletions
|
@ -377,9 +377,9 @@ static int iwl_hwrate_to_plcp_idx(u32 rate_n_flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rs_rate_scale_perform(struct iwl_mvm *mvm,
|
static void rs_rate_scale_perform(struct iwl_mvm *mvm,
|
||||||
struct sk_buff *skb,
|
struct ieee80211_sta *sta,
|
||||||
struct ieee80211_sta *sta,
|
struct iwl_lq_sta *lq_sta,
|
||||||
struct iwl_lq_sta *lq_sta);
|
int tid);
|
||||||
static void rs_fill_lq_cmd(struct iwl_mvm *mvm,
|
static void rs_fill_lq_cmd(struct iwl_mvm *mvm,
|
||||||
struct ieee80211_sta *sta,
|
struct ieee80211_sta *sta,
|
||||||
struct iwl_lq_sta *lq_sta,
|
struct iwl_lq_sta *lq_sta,
|
||||||
|
@ -1007,27 +1007,35 @@ static u32 rs_ch_width_from_mac_flags(enum mac80211_rate_control_flags flags)
|
||||||
return RATE_MCS_CHAN_WIDTH_20;
|
return RATE_MCS_CHAN_WIDTH_20;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static u8 rs_get_tid(struct ieee80211_hdr *hdr)
|
||||||
* mac80211 sends us Tx status
|
{
|
||||||
*/
|
u8 tid = IWL_MAX_TID_COUNT;
|
||||||
static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband,
|
|
||||||
struct ieee80211_sta *sta, void *priv_sta,
|
if (ieee80211_is_data_qos(hdr->frame_control)) {
|
||||||
struct sk_buff *skb)
|
u8 *qc = ieee80211_get_qos_ctl(hdr);
|
||||||
|
tid = qc[0] & 0xf;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unlikely(tid > IWL_MAX_TID_COUNT))
|
||||||
|
tid = IWL_MAX_TID_COUNT;
|
||||||
|
|
||||||
|
return tid;
|
||||||
|
}
|
||||||
|
|
||||||
|
void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||||
|
int tid, struct ieee80211_tx_info *info)
|
||||||
{
|
{
|
||||||
int legacy_success;
|
int legacy_success;
|
||||||
int retries;
|
int retries;
|
||||||
int mac_index, i;
|
int mac_index, i;
|
||||||
struct iwl_lq_sta *lq_sta = priv_sta;
|
|
||||||
struct iwl_lq_cmd *table;
|
struct iwl_lq_cmd *table;
|
||||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
|
||||||
struct iwl_op_mode *op_mode = (struct iwl_op_mode *)mvm_r;
|
|
||||||
struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
|
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
||||||
enum mac80211_rate_control_flags mac_flags;
|
enum mac80211_rate_control_flags mac_flags;
|
||||||
u32 ucode_rate;
|
u32 ucode_rate;
|
||||||
struct rs_rate rate;
|
struct rs_rate rate;
|
||||||
struct iwl_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl;
|
struct iwl_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl;
|
||||||
u8 reduced_txp = (uintptr_t)info->status.status_driver_data[0];
|
u8 reduced_txp = (uintptr_t)info->status.status_driver_data[0];
|
||||||
|
struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
||||||
|
struct iwl_lq_sta *lq_sta = &mvmsta->lq_sta;
|
||||||
|
|
||||||
/* Treat uninitialized rate scaling data same as non-existing. */
|
/* Treat uninitialized rate scaling data same as non-existing. */
|
||||||
if (!lq_sta) {
|
if (!lq_sta) {
|
||||||
|
@ -1045,10 +1053,6 @@ static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!ieee80211_is_data(hdr->frame_control) ||
|
|
||||||
info->flags & IEEE80211_TX_CTL_NO_ACK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* This packet was aggregated but doesn't carry status info */
|
/* This packet was aggregated but doesn't carry status info */
|
||||||
if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
|
if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
|
||||||
!(info->flags & IEEE80211_TX_STAT_AMPDU))
|
!(info->flags & IEEE80211_TX_STAT_AMPDU))
|
||||||
|
@ -1094,7 +1098,7 @@ static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband,
|
||||||
for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++)
|
for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++)
|
||||||
ieee80211_stop_tx_ba_session(sta, tid);
|
ieee80211_stop_tx_ba_session(sta, tid);
|
||||||
|
|
||||||
iwl_mvm_rs_rate_init(mvm, sta, sband->band, false);
|
iwl_mvm_rs_rate_init(mvm, sta, info->band, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lq_sta->last_tx = jiffies;
|
lq_sta->last_tx = jiffies;
|
||||||
|
@ -1221,8 +1225,28 @@ static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband,
|
||||||
IWL_DEBUG_RATE(mvm, "reduced txpower: %d\n", reduced_txp);
|
IWL_DEBUG_RATE(mvm, "reduced txpower: %d\n", reduced_txp);
|
||||||
done:
|
done:
|
||||||
/* See if there's a better rate or modulation mode to try. */
|
/* See if there's a better rate or modulation mode to try. */
|
||||||
if (sta && sta->supp_rates[sband->band])
|
if (sta && sta->supp_rates[info->band])
|
||||||
rs_rate_scale_perform(mvm, skb, sta, lq_sta);
|
rs_rate_scale_perform(mvm, sta, lq_sta, tid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mac80211 sends us Tx status
|
||||||
|
*/
|
||||||
|
static void rs_mac80211_tx_status(void *mvm_r,
|
||||||
|
struct ieee80211_supported_band *sband,
|
||||||
|
struct ieee80211_sta *sta, void *priv_sta,
|
||||||
|
struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||||
|
struct iwl_op_mode *op_mode = (struct iwl_op_mode *)mvm_r;
|
||||||
|
struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
|
||||||
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
|
|
||||||
|
if (!ieee80211_is_data(hdr->frame_control) ||
|
||||||
|
info->flags & IEEE80211_TX_CTL_NO_ACK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
iwl_mvm_rs_tx_status(mvm, sta, rs_get_tid(hdr), info);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1493,22 +1517,6 @@ static void rs_update_rate_tbl(struct iwl_mvm *mvm,
|
||||||
iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, false);
|
iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 rs_get_tid(struct iwl_lq_sta *lq_data,
|
|
||||||
struct ieee80211_hdr *hdr)
|
|
||||||
{
|
|
||||||
u8 tid = IWL_MAX_TID_COUNT;
|
|
||||||
|
|
||||||
if (ieee80211_is_data_qos(hdr->frame_control)) {
|
|
||||||
u8 *qc = ieee80211_get_qos_ctl(hdr);
|
|
||||||
tid = qc[0] & 0xf;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (unlikely(tid > IWL_MAX_TID_COUNT))
|
|
||||||
tid = IWL_MAX_TID_COUNT;
|
|
||||||
|
|
||||||
return tid;
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum rs_column rs_get_next_column(struct iwl_mvm *mvm,
|
static enum rs_column rs_get_next_column(struct iwl_mvm *mvm,
|
||||||
struct iwl_lq_sta *lq_sta,
|
struct iwl_lq_sta *lq_sta,
|
||||||
struct ieee80211_sta *sta,
|
struct ieee80211_sta *sta,
|
||||||
|
@ -1947,12 +1955,10 @@ static bool rs_tpc_perform(struct iwl_mvm *mvm,
|
||||||
* Do rate scaling and search for new modulation mode.
|
* Do rate scaling and search for new modulation mode.
|
||||||
*/
|
*/
|
||||||
static void rs_rate_scale_perform(struct iwl_mvm *mvm,
|
static void rs_rate_scale_perform(struct iwl_mvm *mvm,
|
||||||
struct sk_buff *skb,
|
|
||||||
struct ieee80211_sta *sta,
|
struct ieee80211_sta *sta,
|
||||||
struct iwl_lq_sta *lq_sta)
|
struct iwl_lq_sta *lq_sta,
|
||||||
|
int tid)
|
||||||
{
|
{
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
||||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
|
||||||
int low = IWL_RATE_INVALID;
|
int low = IWL_RATE_INVALID;
|
||||||
int high = IWL_RATE_INVALID;
|
int high = IWL_RATE_INVALID;
|
||||||
int index;
|
int index;
|
||||||
|
@ -1969,19 +1975,11 @@ static void rs_rate_scale_perform(struct iwl_mvm *mvm,
|
||||||
u8 done_search = 0;
|
u8 done_search = 0;
|
||||||
u16 high_low;
|
u16 high_low;
|
||||||
s32 sr;
|
s32 sr;
|
||||||
u8 tid = IWL_MAX_TID_COUNT;
|
|
||||||
u8 prev_agg = lq_sta->is_agg;
|
u8 prev_agg = lq_sta->is_agg;
|
||||||
struct iwl_mvm_sta *sta_priv = (void *)sta->drv_priv;
|
struct iwl_mvm_sta *sta_priv = (void *)sta->drv_priv;
|
||||||
struct iwl_mvm_tid_data *tid_data;
|
struct iwl_mvm_tid_data *tid_data;
|
||||||
struct rs_rate *rate;
|
struct rs_rate *rate;
|
||||||
|
|
||||||
/* Send management frames and NO_ACK data using lowest rate. */
|
|
||||||
/* TODO: this could probably be improved.. */
|
|
||||||
if (!ieee80211_is_data(hdr->frame_control) ||
|
|
||||||
info->flags & IEEE80211_TX_CTL_NO_ACK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
tid = rs_get_tid(lq_sta, hdr);
|
|
||||||
if ((tid != IWL_MAX_TID_COUNT) &&
|
if ((tid != IWL_MAX_TID_COUNT) &&
|
||||||
(lq_sta->tx_agg_tid_en & (1 << tid))) {
|
(lq_sta->tx_agg_tid_en & (1 << tid))) {
|
||||||
tid_data = &sta_priv->tid_data[tid];
|
tid_data = &sta_priv->tid_data[tid];
|
||||||
|
@ -3323,7 +3321,7 @@ static void rs_rate_init_stub(void *mvm_r,
|
||||||
|
|
||||||
static const struct rate_control_ops rs_mvm_ops = {
|
static const struct rate_control_ops rs_mvm_ops = {
|
||||||
.name = RS_NAME,
|
.name = RS_NAME,
|
||||||
.tx_status = rs_tx_status,
|
.tx_status = rs_mac80211_tx_status,
|
||||||
.get_rate = rs_get_rate,
|
.get_rate = rs_get_rate,
|
||||||
.rate_init = rs_rate_init_stub,
|
.rate_init = rs_rate_init_stub,
|
||||||
.alloc = rs_alloc,
|
.alloc = rs_alloc,
|
||||||
|
|
|
@ -376,6 +376,10 @@ struct iwl_lq_sta {
|
||||||
void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||||
enum ieee80211_band band, bool init);
|
enum ieee80211_band band, bool init);
|
||||||
|
|
||||||
|
/* Notify RS about Tx status */
|
||||||
|
void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||||
|
int tid, struct ieee80211_tx_info *info);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* iwl_rate_control_register - Register the rate control algorithm callbacks
|
* iwl_rate_control_register - Register the rate control algorithm callbacks
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue