| From foo@baz Fri Mar 16 15:43:16 CET 2018 |
| From: Emmanuel Grumbach <emmanuel.grumbach@intel.com> |
| Date: Thu, 19 Oct 2017 21:36:04 +0300 |
| Subject: iwlwifi: mvm: rs: don't override the rate history in the search cycle |
| |
| From: Emmanuel Grumbach <emmanuel.grumbach@intel.com> |
| |
| |
| [ Upstream commit 992172e3aec19e5b0ea5b757ba40a146b9282d1e ] |
| |
| When we are in a search cycle, we try different combinations |
| of parameters. Those combinations are called 'columns'. |
| When we switch to a new column, we first need to check if |
| this column has a suitable rate, if not, we can't try it. |
| This means we must not erase the statistics we gathered |
| for the previous column until we are sure that we are |
| indeed switching column. |
| |
| The code that tries to switch to a new column first sets |
| a whole bunch of things for the new column, and only then |
| checks that we can find suitable rates in that column. |
| While doing that, the code mistakenly erased the rate |
| statistics. This code was right until |
| struct iwl_scale_tbl_info grew up for TPC. |
| |
| Fix this to make sure we don't erase the rate statistics |
| until we are sure that we can indeed switch to the new |
| column. |
| |
| Note that this bug is really harmless since it causes a |
| change in the behavior only when we can't find any rate |
| in the new column which should really not happen. In the |
| case we do find a suitable we reset the rate statistics |
| a few lines later anyway. |
| |
| Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> |
| Signed-off-by: Luca Coelho <luciano.coelho@intel.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 4 +--- |
| 1 file changed, 1 insertion(+), 3 deletions(-) |
| |
| --- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c |
| +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c |
| @@ -1881,12 +1881,10 @@ static int rs_switch_to_column(struct iw |
| struct rs_rate *rate = &search_tbl->rate; |
| const struct rs_tx_column *column = &rs_tx_columns[col_id]; |
| const struct rs_tx_column *curr_column = &rs_tx_columns[tbl->column]; |
| - u32 sz = (sizeof(struct iwl_scale_tbl_info) - |
| - (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT)); |
| unsigned long rate_mask = 0; |
| u32 rate_idx = 0; |
| |
| - memcpy(search_tbl, tbl, sz); |
| + memcpy(search_tbl, tbl, offsetof(struct iwl_scale_tbl_info, win)); |
| |
| rate->sgi = column->sgi; |
| rate->ant = column->ant; |