iwlwifi: mvm: add a debugfs entry to set a fixed size AMSDU for all TX packets
authorMordechay Goodstein <mordechay.goodstein@intel.com>
Sun, 21 Apr 2019 13:37:38 +0000 (16:37 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Sat, 29 Jun 2019 07:08:06 +0000 (10:08 +0300)
The current debugfs entry only limits the max AMSDU for TCP.  Add a new
debugfs entry to allow setting a fixed AMSDU size for all TX packets,
including UDP and ICMP

Signed-off-by: Mordechay Goodstein <mordechay.goodstein@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c
drivers/net/wireless/intel/iwlwifi/mvm/sta.h

index 5b1bb76..8483640 100644 (file)
@@ -467,6 +467,46 @@ static ssize_t iwl_dbgfs_rs_data_read(struct file *file, char __user *user_buf,
        return ret;
 }
 
+static ssize_t iwl_dbgfs_amsdu_len_write(struct ieee80211_sta *sta,
+                                        char *buf, size_t count,
+                                        loff_t *ppos)
+{
+       struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
+       int i;
+       u16 amsdu_len;
+
+       if (kstrtou16(buf, 0, &amsdu_len))
+               return -EINVAL;
+
+       if (amsdu_len) {
+               mvmsta->orig_amsdu_len = sta->max_amsdu_len;
+               sta->max_amsdu_len = amsdu_len;
+               for (i = 0; i < ARRAY_SIZE(sta->max_tid_amsdu_len); i++)
+                       sta->max_tid_amsdu_len[i] = amsdu_len;
+       } else {
+               sta->max_amsdu_len = mvmsta->orig_amsdu_len;
+               mvmsta->orig_amsdu_len = 0;
+       }
+       return count;
+}
+
+static ssize_t iwl_dbgfs_amsdu_len_read(struct file *file,
+                                       char __user *user_buf,
+                                       size_t count, loff_t *ppos)
+{
+       struct ieee80211_sta *sta = file->private_data;
+       struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
+
+       char buf[32];
+       int pos;
+
+       pos = scnprintf(buf, sizeof(buf), "current %d ", sta->max_amsdu_len);
+       pos += scnprintf(buf + pos, sizeof(buf) - pos, "stored %d\n",
+                        mvmsta->orig_amsdu_len);
+
+       return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
+}
+
 static ssize_t iwl_dbgfs_disable_power_off_read(struct file *file,
                                                char __user *user_buf,
                                                size_t count, loff_t *ppos)
@@ -1891,6 +1931,8 @@ MVM_DEBUGFS_READ_WRITE_FILE_OPS(bcast_filters_macs, 256);
 MVM_DEBUGFS_READ_FILE_OPS(sar_geo_profile);
 #endif
 
+MVM_DEBUGFS_READ_WRITE_STA_FILE_OPS(amsdu_len, 16);
+
 MVM_DEBUGFS_READ_WRITE_FILE_OPS(he_sniffer_params, 32);
 
 static ssize_t iwl_dbgfs_mem_read(struct file *file, char __user *user_buf,
@@ -2032,8 +2074,10 @@ void iwl_mvm_sta_add_debugfs(struct ieee80211_hw *hw,
 {
        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
 
-       if (iwl_mvm_has_tlc_offload(mvm))
+       if (iwl_mvm_has_tlc_offload(mvm)) {
                MVM_DEBUGFS_ADD_STA_FILE(rs_data, dir, 0400);
+       }
+       MVM_DEBUGFS_ADD_STA_FILE(amsdu_len, dir, 0600);
 }
 
 void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir)
index be62f49..4962818 100644 (file)
@@ -344,7 +344,7 @@ void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm,
                               lq_sta->last_rate_n_flags);
        }
 
-       if (flags & IWL_TLC_NOTIF_FLAG_AMSDU) {
+       if (flags & IWL_TLC_NOTIF_FLAG_AMSDU && !mvmsta->orig_amsdu_len) {
                u16 size = le32_to_cpu(notif->amsdu_size);
                int i;
 
index b4d4071..4487cc3 100644 (file)
@@ -386,6 +386,9 @@ struct iwl_mvm_rxq_dup_data {
  * @amsdu_enabled: bitmap of TX AMSDU allowed TIDs.
  *     In case TLC offload is not active it is either 0xFFFF or 0.
  * @max_amsdu_len: max AMSDU length
+ * @orig_amsdu_len: used to save the original amsdu_len when it is changed via
+ *      debugfs.  If it's set to 0, it means that it is it's not set via
+ *      debugfs.
  * @agg_tids: bitmap of tids whose status is operational aggregated (IWL_AGG_ON)
  * @sleep_tx_count: the number of frames that we told the firmware to let out
  *     even when that station is asleep. This is useful in case the queue
@@ -434,6 +437,7 @@ struct iwl_mvm_sta {
        bool disable_tx;
        u16 amsdu_enabled;
        u16 max_amsdu_len;
+       u16 orig_amsdu_len;
        bool sleeping;
        u8 agg_tids;
        u8 sleep_tx_count;