wifi: iwlwifi: mvm: add a debugfs for reading EMLSR blocking reasons
authorYedidya Benshimol <yedidya.ben.shimol@intel.com>
Mon, 6 May 2024 07:04:09 +0000 (10:04 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 6 May 2024 14:33:25 +0000 (16:33 +0200)
Add a reading for all active EMLSR blocking reasons for testing
purposes.

Signed-off-by: Yedidya Benshimol <yedidya.ben.shimol@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240506095953.6d494a335e81.Ic0fa6a9636e3c1a3b1420e85e704a19d4a56e8d9@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c
drivers/net/wireless/intel/iwlwifi/mvm/link.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h

index 213de638f132007990505e298d88b6bde7649851..17c97dfbc62aa25ad91d040aaef8d3bcb05e9e4e 100644 (file)
@@ -722,8 +722,41 @@ static ssize_t iwl_dbgfs_int_mlo_scan_write(struct ieee80211_vif *vif,
        return ret ?: count;
 }
 
-static ssize_t iwl_dbgfs_block_esr_write(struct ieee80211_vif *vif, char *buf,
-                                        size_t count, loff_t *ppos)
+static ssize_t iwl_dbgfs_esr_disable_reason_read(struct file *file,
+                                                char __user *user_buf,
+                                                size_t count, loff_t *ppos)
+{
+       struct ieee80211_vif *vif = file->private_data;
+       struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
+       struct iwl_mvm *mvm = mvmvif->mvm;
+       unsigned long esr_mask;
+       char *buf;
+       int bufsz, pos, i;
+       ssize_t rv;
+
+       mutex_lock(&mvm->mutex);
+       esr_mask = mvmvif->esr_disable_reason;
+       mutex_unlock(&mvm->mutex);
+
+       bufsz = hweight32(esr_mask) * 32 + 40;
+       buf = kmalloc(bufsz, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+
+       pos = scnprintf(buf, bufsz, "EMLSR state: '0x%lx'\nreasons:\n",
+                       esr_mask);
+       for_each_set_bit(i, &esr_mask, BITS_PER_LONG)
+               pos += scnprintf(buf + pos, bufsz - pos, " - %s\n",
+                                iwl_get_esr_state_string(BIT(i)));
+
+       rv = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
+       kfree(buf);
+       return rv;
+}
+
+static ssize_t iwl_dbgfs_esr_disable_reason_write(struct ieee80211_vif *vif,
+                                                 char *buf, size_t count,
+                                                 loff_t *ppos)
 {
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
        struct iwl_mvm *mvm = mvmvif->mvm;
@@ -769,7 +802,7 @@ MVM_DEBUGFS_READ_WRITE_FILE_OPS(rx_phyinfo, 10);
 MVM_DEBUGFS_READ_WRITE_FILE_OPS(quota_min, 32);
 MVM_DEBUGFS_READ_FILE_OPS(os_device_timediff);
 MVM_DEBUGFS_WRITE_FILE_OPS(int_mlo_scan, 32);
-MVM_DEBUGFS_WRITE_FILE_OPS(block_esr, 32);
+MVM_DEBUGFS_READ_WRITE_FILE_OPS(esr_disable_reason, 32);
 
 void iwl_mvm_vif_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 {
@@ -800,7 +833,7 @@ void iwl_mvm_vif_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
        debugfs_create_bool("ftm_unprotected", 0200, mvmvif->dbgfs_dir,
                            &mvmvif->ftm_unprotected);
        MVM_DEBUGFS_ADD_FILE_VIF(int_mlo_scan, mvmvif->dbgfs_dir, 0200);
-       MVM_DEBUGFS_ADD_FILE_VIF(block_esr, mvmvif->dbgfs_dir, 0600);
+       MVM_DEBUGFS_ADD_FILE_VIF(esr_disable_reason, mvmvif->dbgfs_dir, 0600);
 
        if (vif->type == NL80211_IFTYPE_STATION && !vif->p2p &&
            mvmvif == mvm->bf_allowed_vif)
index 0c00712fbeb8a9fe340f10834fe03f9f8c35add8..f24351c82263e2bf2a3c03379a1c35720044abf1 100644 (file)
@@ -22,7 +22,7 @@ static const char *const iwl_mvm_esr_states_names[] = {
        HANDLE_ESR_REASONS(NAME_ENTRY)
 };
 
-static const char *iwl_get_esr_state_string(enum iwl_mvm_esr_state state)
+const char *iwl_get_esr_state_string(enum iwl_mvm_esr_state state)
 {
        int offs = ilog2(state);
 
index 56467b9de7f1ec6d8826124af0c3ae103894ab2a..cb4088149d85242b0b6e394a3c66f6a78d68a2f5 100644 (file)
@@ -385,6 +385,8 @@ enum iwl_mvm_esr_state {
 
 #define IWL_MVM_BLOCK_ESR_REASONS 0xffff
 
+const char *iwl_get_esr_state_string(enum iwl_mvm_esr_state state);
+
 /**
  * struct iwl_mvm_esr_exit - details of the last exit from EMLSR mode.
  * @reason: The reason for the last exit from EMLSR.