Re: [PATCH 01/25] iwlwifi: mvm: add traffic condition monitoring (TCM)

2018-04-14 Thread Luciano Coelho
On Fri, 2018-04-13 at 15:42 +0300, Luca Coelho wrote:
> From: Luca Coelho 
> 
> Traffic condition monitor gathers data about the traffic load and
> other conditions and can be used to make decisions regarding latency,
> throughput etc.  This patch introduces the code and data structures
> to
> collect this data for future use.
> 
> Signed-off-by: Luca Coelho 
> ---

[...]

> diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
> b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h

[...]

> @@ -1906,6 +1956,16 @@ bool iwl_mvm_is_vif_assoc(struct iwl_mvm
> *mvm);
>  
>  void iwl_mvm_inactivity_check(struct iwl_mvm *mvm);
>  
> +#define MVM_TCM_PERIOD_MSEC 500
> +#define MVM_TCM_PERIOD (HZ * MVM_TCM_PERIOD_MSEC / 1000)
> +#define MVM_LL_PERIOD (10 * HZ)
> +void iwl_mvm_send_tcm_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif);

I accidentally left this function in, but it only sends a vendor
command event in our internal driver, so it's undefined in the mainline
(reported by kbuildbot).  I'll send v2.

--
Cheers,
Luca.


[PATCH 01/25] iwlwifi: mvm: add traffic condition monitoring (TCM)

2018-04-13 Thread Luca Coelho
From: Luca Coelho 

Traffic condition monitor gathers data about the traffic load and
other conditions and can be used to make decisions regarding latency,
throughput etc.  This patch introduces the code and data structures to
collect this data for future use.

Signed-off-by: Luca Coelho 
---
 drivers/net/wireless/intel/iwlwifi/mvm/constants.h |   3 +
 drivers/net/wireless/intel/iwlwifi/mvm/d3.c|   7 +
 .../net/wireless/intel/iwlwifi/mvm/debugfs-vif.c   |   2 +
 drivers/net/wireless/intel/iwlwifi/mvm/mvm.h   |  60 ++
 drivers/net/wireless/intel/iwlwifi/mvm/ops.c   |  10 +
 drivers/net/wireless/intel/iwlwifi/mvm/rx.c|  60 +-
 drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c  |   6 +
 drivers/net/wireless/intel/iwlwifi/mvm/scan.c  |  11 +-
 drivers/net/wireless/intel/iwlwifi/mvm/tx.c|  35 +++
 drivers/net/wireless/intel/iwlwifi/mvm/utils.c | 238 +
 10 files changed, 423 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/constants.h 
b/drivers/net/wireless/intel/iwlwifi/mvm/constants.h
index 96b52a275ee3..2763fc69f04b 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/constants.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/constants.h
@@ -112,6 +112,9 @@
 #define IWL_MVM_PARSE_NVM  0
 #define IWL_MVM_ADWELL_ENABLE  1
 #define IWL_MVM_ADWELL_MAX_BUDGET  0
+#define IWL_MVM_TCM_LOAD_MEDIUM_THRESH 10 /* percentage */
+#define IWL_MVM_TCM_LOAD_HIGH_THRESH   50 /* percentage */
+#define IWL_MVM_TCM_LOWLAT_ENABLE_THRESH   100 /* packets/10 seconds */
 #define IWL_MVM_RS_NUM_TRY_BEFORE_ANT_TOGGLE1
 #define IWL_MVM_RS_HT_VHT_RETRIES_PER_RATE  2
 #define IWL_MVM_RS_HT_VHT_RETRIES_PER_RATE_TW   1
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c 
b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
index 2efe9b099556..80a9a7cb83be 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
@@ -1097,6 +1097,7 @@ int iwl_mvm_suspend(struct ieee80211_hw *hw, struct 
cfg80211_wowlan *wowlan)
 
/* make sure the d0i3 exit work is not pending */
flush_work(>d0i3_exit_work);
+   iwl_mvm_pause_tcm(mvm, true);
 
iwl_fw_runtime_suspend(>fwrt);
 
@@ -2014,6 +2015,8 @@ int iwl_mvm_resume(struct ieee80211_hw *hw)
 
mvm->trans->system_pm_mode = IWL_PLAT_PM_MODE_DISABLED;
 
+   iwl_mvm_resume_tcm(mvm);
+
iwl_fw_runtime_resume(>fwrt);
 
return ret;
@@ -2042,6 +2045,8 @@ static int iwl_mvm_d3_test_open(struct inode *inode, 
struct file *file)
 
mvm->trans->system_pm_mode = IWL_PLAT_PM_MODE_D3;
 
+   iwl_mvm_pause_tcm(mvm, true);
+
iwl_fw_runtime_suspend(>fwrt);
 
/* start pseudo D3 */
@@ -2104,6 +2109,8 @@ static int iwl_mvm_d3_test_release(struct inode *inode, 
struct file *file)
__iwl_mvm_resume(mvm, true);
rtnl_unlock();
 
+   iwl_mvm_resume_tcm(mvm);
+
iwl_fw_runtime_resume(>fwrt);
 
mvm->trans->system_pm_mode = IWL_PLAT_PM_MODE_DISABLED;
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c 
b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c
index f7fcf700196b..798605c4f122 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c
@@ -269,6 +269,8 @@ static ssize_t iwl_dbgfs_mac_params_read(struct file *file,
 mvmvif->id, mvmvif->color);
pos += scnprintf(buf+pos, bufsz-pos, "bssid: %pM\n",
 vif->bss_conf.bssid);
+   pos += scnprintf(buf+pos, bufsz-pos, "Load: %d\n",
+mvm->tcm.result.load[mvmvif->id]);
pos += scnprintf(buf+pos, bufsz-pos, "QoS:\n");
for (i = 0; i < ARRAY_SIZE(mvmvif->queue_params); i++)
pos += scnprintf(buf+pos, bufsz-pos,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h 
b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index d2cf751db68d..8d1a8c6c8207 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -92,6 +92,8 @@
 #include "fw/acpi.h"
 #include "fw/debugfs.h"
 
+#include 
+
 #define IWL_MVM_MAX_ADDRESSES  5
 /* RSSI offset for WkP */
 #define IWL_RSSI_OFFSET 50
@@ -595,6 +597,51 @@ enum iwl_mvm_tdls_cs_state {
IWL_MVM_TDLS_SW_ACTIVE,
 };
 
+enum iwl_mvm_traffic_load {
+   IWL_MVM_TRAFFIC_LOW,
+   IWL_MVM_TRAFFIC_MEDIUM,
+   IWL_MVM_TRAFFIC_HIGH,
+};
+
+DECLARE_EWMA(rate, 16, 16)
+
+struct iwl_mvm_tcm_mac {
+   struct {
+   u32 pkts[IEEE80211_NUM_ACS];
+   u32 airtime;
+   } tx;
+   struct {
+   u32 pkts[IEEE80211_NUM_ACS];
+   u32 airtime;
+   u32 last_ampdu_ref;
+   } rx;
+   struct {
+   /* track AP's transfer in client mode */
+