|
@@ -1372,6 +1372,59 @@ static ssize_t iwl_dbgfs_rx_phyinfo_read(struct file *file,
|
|
|
return simple_read_from_buffer(user_buf, count, ppos, buf, sizeof(buf));
|
|
|
}
|
|
|
|
|
|
+static void iwl_dbgfs_quota_check(void *data, u8 *mac,
|
|
|
+ struct ieee80211_vif *vif)
|
|
|
+{
|
|
|
+ struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
|
|
+ int *ret = data;
|
|
|
+
|
|
|
+ if (mvmvif->dbgfs_quota_min)
|
|
|
+ *ret = -EINVAL;
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t iwl_dbgfs_quota_min_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;
|
|
|
+ u16 value;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = kstrtou16(buf, 0, &value);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ if (value > 95)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ mutex_lock(&mvm->mutex);
|
|
|
+
|
|
|
+ mvmvif->dbgfs_quota_min = 0;
|
|
|
+ ieee80211_iterate_interfaces(mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
|
|
|
+ iwl_dbgfs_quota_check, &ret);
|
|
|
+ if (ret == 0) {
|
|
|
+ mvmvif->dbgfs_quota_min = value;
|
|
|
+ iwl_mvm_update_quotas(mvm, false, NULL);
|
|
|
+ }
|
|
|
+ mutex_unlock(&mvm->mutex);
|
|
|
+
|
|
|
+ return ret ?: count;
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t iwl_dbgfs_quota_min_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);
|
|
|
+ char buf[10];
|
|
|
+ int len;
|
|
|
+
|
|
|
+ len = snprintf(buf, sizeof(buf), "%d\n", mvmvif->dbgfs_quota_min);
|
|
|
+
|
|
|
+ return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
|
|
+}
|
|
|
+
|
|
|
#define MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz) \
|
|
|
_MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz, struct ieee80211_vif)
|
|
|
#define MVM_DEBUGFS_READ_WRITE_FILE_OPS(name, bufsz) \
|
|
@@ -1395,6 +1448,7 @@ MVM_DEBUGFS_READ_WRITE_FILE_OPS(tof_range_req_ext, 32);
|
|
|
MVM_DEBUGFS_READ_WRITE_FILE_OPS(tof_range_abort, 32);
|
|
|
MVM_DEBUGFS_READ_FILE_OPS(tof_range_response);
|
|
|
MVM_DEBUGFS_READ_WRITE_FILE_OPS(tof_responder_params, 32);
|
|
|
+MVM_DEBUGFS_READ_WRITE_FILE_OPS(quota_min, 32);
|
|
|
|
|
|
void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
|
|
{
|
|
@@ -1432,6 +1486,8 @@ void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
|
|
S_IRUSR | S_IWUSR);
|
|
|
MVM_DEBUGFS_ADD_FILE_VIF(rx_phyinfo, mvmvif->dbgfs_dir,
|
|
|
S_IRUSR | S_IWUSR);
|
|
|
+ MVM_DEBUGFS_ADD_FILE_VIF(quota_min, mvmvif->dbgfs_dir,
|
|
|
+ S_IRUSR | S_IWUSR);
|
|
|
|
|
|
if (vif->type == NL80211_IFTYPE_STATION && !vif->p2p &&
|
|
|
mvmvif == mvm->bf_allowed_vif)
|