]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
iwlwifi: LTR updates
authorAlex Malamud <alex.malamud@intel.com>
Wed, 22 May 2019 10:49:18 +0000 (13:49 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 6 Sep 2019 12:31:15 +0000 (15:31 +0300)
New FW versions introduces LTR feature enablement by default.
For such FW versions, driver (mvm/xvt) should not send
host command to enable LTR feature, also it should be possible to
override LTR configuration through the debugfs.

1. Send LTR feature enablement command only for FW versions
which does not advertises SET_LTR_GEN2 capability.
2. Implement ltr_config file in debugfs for LTR configuration override.

Signed-off-by: Alex Malamud <alex.malamud@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/file.h
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
drivers/net/wireless/intel/iwlwifi/mvm/fw.c

index ea2b3d77f84845da62abbdf770b70bc4e6c8482c..418064ced33763b4ed8ac4a5dd05615d4e103825 100644 (file)
@@ -441,9 +441,10 @@ enum iwl_ucode_tlv_capa {
        IWL_UCODE_TLV_CAPA_DYNAMIC_QUOTA                = (__force iwl_ucode_tlv_capa_t)44,
        IWL_UCODE_TLV_CAPA_COEX_SCHEMA_2                = (__force iwl_ucode_tlv_capa_t)45,
        IWL_UCODE_TLV_CAPA_CHANNEL_SWITCH_CMD           = (__force iwl_ucode_tlv_capa_t)46,
-       IWL_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS            = (__force iwl_ucode_tlv_capa_t)48,
        IWL_UCODE_TLV_CAPA_FTM_CALIBRATED               = (__force iwl_ucode_tlv_capa_t)47,
+       IWL_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS            = (__force iwl_ucode_tlv_capa_t)48,
        IWL_UCODE_TLV_CAPA_CS_MODIFY                    = (__force iwl_ucode_tlv_capa_t)49,
+       IWL_UCODE_TLV_CAPA_SET_LTR_GEN2                 = (__force iwl_ucode_tlv_capa_t)50,
 
        /* set 2 */
        IWL_UCODE_TLV_CAPA_EXTENDED_DTS_MEASURE         = (__force iwl_ucode_tlv_capa_t)64,
index 6d67d3da31e0e4a4ac0d086a160278c3e1be72bf..994a4ba0720470321263326698f8a5e39e286996 100644 (file)
@@ -1758,6 +1758,38 @@ iwl_dbgfs_uapsd_noagg_bssids_read(struct file *file, char __user *user_buf,
        return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
 }
 
+static ssize_t
+iwl_dbgfs_ltr_config_write(struct iwl_mvm *mvm,
+                          char *buf, size_t count, loff_t *ppos)
+{
+       int ret;
+       struct iwl_ltr_config_cmd ltr_config = {0};
+
+       if (!iwl_mvm_firmware_running(mvm))
+               return -EIO;
+
+       if (sscanf(buf, "%x,%x,%x,%x,%x,%x,%x",
+                  &ltr_config.flags,
+                  &ltr_config.static_long,
+                  &ltr_config.static_short,
+                  &ltr_config.ltr_cfg_values[0],
+                  &ltr_config.ltr_cfg_values[1],
+                  &ltr_config.ltr_cfg_values[2],
+                  &ltr_config.ltr_cfg_values[3]) != 7) {
+               return -EINVAL;
+       }
+
+       mutex_lock(&mvm->mutex);
+       ret = iwl_mvm_send_cmd_pdu(mvm, LTR_CONFIG, 0, sizeof(ltr_config),
+                                  &ltr_config);
+       mutex_unlock(&mvm->mutex);
+
+       if (ret)
+               IWL_ERR(mvm, "failed to send ltr configuration cmd\n");
+
+       return ret ?: count;
+}
+
 MVM_DEBUGFS_READ_WRITE_FILE_OPS(prph_reg, 64);
 
 /* Device wide debugfs entries */
@@ -1806,6 +1838,8 @@ MVM_DEBUGFS_READ_WRITE_STA_FILE_OPS(amsdu_len, 16);
 
 MVM_DEBUGFS_READ_WRITE_FILE_OPS(he_sniffer_params, 32);
 
+MVM_DEBUGFS_WRITE_FILE_OPS(ltr_config, 512);
+
 static ssize_t iwl_dbgfs_mem_read(struct file *file, char __user *user_buf,
                                  size_t count, loff_t *ppos)
 {
@@ -1993,6 +2027,9 @@ void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir)
 #endif
        MVM_DEBUGFS_ADD_FILE(he_sniffer_params, mvm->debugfs_dir, 0600);
 
+       if (fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SET_LTR_GEN2))
+               MVM_DEBUGFS_ADD_FILE(ltr_config, mvm->debugfs_dir, 0200);
+
        debugfs_create_bool("enable_scan_iteration_notif", 0600,
                            mvm->debugfs_dir, &mvm->scan_iter_notif_enabled);
        debugfs_create_bool("drop_bcn_ap_mode", 0600, mvm->debugfs_dir,
index 251e7c235aaa851b19c2a814bd6a46b591af9fb5..bb2aec9c673833e3c40eb8bb2f9f5f9d406313cf 100644 (file)
@@ -1302,7 +1302,8 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
        iwl_mvm_tt_tx_backoff(mvm, 0);
 #endif
 
-       WARN_ON(iwl_mvm_config_ltr(mvm));
+       if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SET_LTR_GEN2))
+               WARN_ON(iwl_mvm_config_ltr(mvm));
 
        ret = iwl_mvm_power_update_device(mvm);
        if (ret)