diff options
author | Alexander Bondar <alexander.bondar@intel.com> | 2013-12-04 03:13:24 -0500 |
---|---|---|
committer | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2013-12-17 12:39:43 -0500 |
commit | e45a941deb24b956c9b5a06461810b45882c3e1c (patch) | |
tree | b148a2b7c23c52dd51a4ba86c7bc0ca4da0173cf | |
parent | 51498cf6d8b42e89be77d48a2158825ca9bbd3bf (diff) |
iwlwifi: mvm: add per-vif power debugfs hooks
This allows to tweak the power parameters per vif.
Signed-off-by: Alexander Bondar <alexander.bondar@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c | 353 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/power.c | 7 |
2 files changed, 360 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c b/drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c index 67f6a2071653..747adffd4b07 100644 --- a/drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c +++ b/drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c | |||
@@ -63,6 +63,150 @@ | |||
63 | #include "mvm.h" | 63 | #include "mvm.h" |
64 | #include "debugfs.h" | 64 | #include "debugfs.h" |
65 | 65 | ||
66 | static void iwl_dbgfs_update_pm(struct iwl_mvm *mvm, | ||
67 | struct ieee80211_vif *vif, | ||
68 | enum iwl_dbgfs_pm_mask param, int val) | ||
69 | { | ||
70 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); | ||
71 | struct iwl_dbgfs_pm *dbgfs_pm = &mvmvif->dbgfs_pm; | ||
72 | |||
73 | dbgfs_pm->mask |= param; | ||
74 | |||
75 | switch (param) { | ||
76 | case MVM_DEBUGFS_PM_KEEP_ALIVE: { | ||
77 | struct ieee80211_hw *hw = mvm->hw; | ||
78 | int dtimper = hw->conf.ps_dtim_period ?: 1; | ||
79 | int dtimper_msec = dtimper * vif->bss_conf.beacon_int; | ||
80 | |||
81 | IWL_DEBUG_POWER(mvm, "debugfs: set keep_alive= %d sec\n", val); | ||
82 | if (val * MSEC_PER_SEC < 3 * dtimper_msec) | ||
83 | IWL_WARN(mvm, | ||
84 | "debugfs: keep alive period (%ld msec) is less than minimum required (%d msec)\n", | ||
85 | val * MSEC_PER_SEC, 3 * dtimper_msec); | ||
86 | dbgfs_pm->keep_alive_seconds = val; | ||
87 | break; | ||
88 | } | ||
89 | case MVM_DEBUGFS_PM_SKIP_OVER_DTIM: | ||
90 | IWL_DEBUG_POWER(mvm, "skip_over_dtim %s\n", | ||
91 | val ? "enabled" : "disabled"); | ||
92 | dbgfs_pm->skip_over_dtim = val; | ||
93 | break; | ||
94 | case MVM_DEBUGFS_PM_SKIP_DTIM_PERIODS: | ||
95 | IWL_DEBUG_POWER(mvm, "skip_dtim_periods=%d\n", val); | ||
96 | dbgfs_pm->skip_dtim_periods = val; | ||
97 | break; | ||
98 | case MVM_DEBUGFS_PM_RX_DATA_TIMEOUT: | ||
99 | IWL_DEBUG_POWER(mvm, "rx_data_timeout=%d\n", val); | ||
100 | dbgfs_pm->rx_data_timeout = val; | ||
101 | break; | ||
102 | case MVM_DEBUGFS_PM_TX_DATA_TIMEOUT: | ||
103 | IWL_DEBUG_POWER(mvm, "tx_data_timeout=%d\n", val); | ||
104 | dbgfs_pm->tx_data_timeout = val; | ||
105 | break; | ||
106 | case MVM_DEBUGFS_PM_DISABLE_POWER_OFF: | ||
107 | IWL_DEBUG_POWER(mvm, "disable_power_off=%d\n", val); | ||
108 | dbgfs_pm->disable_power_off = val; | ||
109 | break; | ||
110 | case MVM_DEBUGFS_PM_LPRX_ENA: | ||
111 | IWL_DEBUG_POWER(mvm, "lprx %s\n", val ? "enabled" : "disabled"); | ||
112 | dbgfs_pm->lprx_ena = val; | ||
113 | break; | ||
114 | case MVM_DEBUGFS_PM_LPRX_RSSI_THRESHOLD: | ||
115 | IWL_DEBUG_POWER(mvm, "lprx_rssi_threshold=%d\n", val); | ||
116 | dbgfs_pm->lprx_rssi_threshold = val; | ||
117 | break; | ||
118 | case MVM_DEBUGFS_PM_SNOOZE_ENABLE: | ||
119 | IWL_DEBUG_POWER(mvm, "snooze_enable=%d\n", val); | ||
120 | dbgfs_pm->snooze_ena = val; | ||
121 | break; | ||
122 | case MVM_DEBUGFS_PM_UAPSD_MISBEHAVING: | ||
123 | IWL_DEBUG_POWER(mvm, "uapsd_misbehaving_enable=%d\n", val); | ||
124 | dbgfs_pm->uapsd_misbehaving = val; | ||
125 | break; | ||
126 | } | ||
127 | } | ||
128 | |||
129 | static ssize_t iwl_dbgfs_pm_params_write(struct ieee80211_vif *vif, char *buf, | ||
130 | size_t count, loff_t *ppos) | ||
131 | { | ||
132 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); | ||
133 | struct iwl_mvm *mvm = mvmvif->mvm; | ||
134 | enum iwl_dbgfs_pm_mask param; | ||
135 | int val, ret; | ||
136 | |||
137 | if (!strncmp("keep_alive=", buf, 11)) { | ||
138 | if (sscanf(buf + 11, "%d", &val) != 1) | ||
139 | return -EINVAL; | ||
140 | param = MVM_DEBUGFS_PM_KEEP_ALIVE; | ||
141 | } else if (!strncmp("skip_over_dtim=", buf, 15)) { | ||
142 | if (sscanf(buf + 15, "%d", &val) != 1) | ||
143 | return -EINVAL; | ||
144 | param = MVM_DEBUGFS_PM_SKIP_OVER_DTIM; | ||
145 | } else if (!strncmp("skip_dtim_periods=", buf, 18)) { | ||
146 | if (sscanf(buf + 18, "%d", &val) != 1) | ||
147 | return -EINVAL; | ||
148 | param = MVM_DEBUGFS_PM_SKIP_DTIM_PERIODS; | ||
149 | } else if (!strncmp("rx_data_timeout=", buf, 16)) { | ||
150 | if (sscanf(buf + 16, "%d", &val) != 1) | ||
151 | return -EINVAL; | ||
152 | param = MVM_DEBUGFS_PM_RX_DATA_TIMEOUT; | ||
153 | } else if (!strncmp("tx_data_timeout=", buf, 16)) { | ||
154 | if (sscanf(buf + 16, "%d", &val) != 1) | ||
155 | return -EINVAL; | ||
156 | param = MVM_DEBUGFS_PM_TX_DATA_TIMEOUT; | ||
157 | } else if (!strncmp("disable_power_off=", buf, 18) && | ||
158 | !(mvm->fw->ucode_capa.flags & | ||
159 | IWL_UCODE_TLV_FLAGS_DEVICE_PS_CMD)) { | ||
160 | if (sscanf(buf + 18, "%d", &val) != 1) | ||
161 | return -EINVAL; | ||
162 | param = MVM_DEBUGFS_PM_DISABLE_POWER_OFF; | ||
163 | } else if (!strncmp("lprx=", buf, 5)) { | ||
164 | if (sscanf(buf + 5, "%d", &val) != 1) | ||
165 | return -EINVAL; | ||
166 | param = MVM_DEBUGFS_PM_LPRX_ENA; | ||
167 | } else if (!strncmp("lprx_rssi_threshold=", buf, 20)) { | ||
168 | if (sscanf(buf + 20, "%d", &val) != 1) | ||
169 | return -EINVAL; | ||
170 | if (val > POWER_LPRX_RSSI_THRESHOLD_MAX || val < | ||
171 | POWER_LPRX_RSSI_THRESHOLD_MIN) | ||
172 | return -EINVAL; | ||
173 | param = MVM_DEBUGFS_PM_LPRX_RSSI_THRESHOLD; | ||
174 | } else if (!strncmp("snooze_enable=", buf, 14)) { | ||
175 | if (sscanf(buf + 14, "%d", &val) != 1) | ||
176 | return -EINVAL; | ||
177 | param = MVM_DEBUGFS_PM_SNOOZE_ENABLE; | ||
178 | } else if (!strncmp("uapsd_misbehaving=", buf, 18)) { | ||
179 | if (sscanf(buf + 18, "%d", &val) != 1) | ||
180 | return -EINVAL; | ||
181 | param = MVM_DEBUGFS_PM_UAPSD_MISBEHAVING; | ||
182 | } else { | ||
183 | return -EINVAL; | ||
184 | } | ||
185 | |||
186 | mutex_lock(&mvm->mutex); | ||
187 | iwl_dbgfs_update_pm(mvm, vif, param, val); | ||
188 | ret = iwl_mvm_power_update_mode(mvm, vif); | ||
189 | mutex_unlock(&mvm->mutex); | ||
190 | |||
191 | return ret ?: count; | ||
192 | } | ||
193 | |||
194 | static ssize_t iwl_dbgfs_pm_params_read(struct file *file, | ||
195 | char __user *user_buf, | ||
196 | size_t count, loff_t *ppos) | ||
197 | { | ||
198 | struct ieee80211_vif *vif = file->private_data; | ||
199 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); | ||
200 | struct iwl_mvm *mvm = mvmvif->mvm; | ||
201 | char buf[512]; | ||
202 | int bufsz = sizeof(buf); | ||
203 | int pos; | ||
204 | |||
205 | pos = iwl_mvm_power_dbgfs_read(mvm, vif, buf, bufsz); | ||
206 | |||
207 | return simple_read_from_buffer(user_buf, count, ppos, buf, pos); | ||
208 | } | ||
209 | |||
66 | static ssize_t iwl_dbgfs_mac_params_read(struct file *file, | 210 | static ssize_t iwl_dbgfs_mac_params_read(struct file *file, |
67 | char __user *user_buf, | 211 | char __user *user_buf, |
68 | size_t count, loff_t *ppos) | 212 | size_t count, loff_t *ppos) |
@@ -122,6 +266,201 @@ static ssize_t iwl_dbgfs_mac_params_read(struct file *file, | |||
122 | return simple_read_from_buffer(user_buf, count, ppos, buf, pos); | 266 | return simple_read_from_buffer(user_buf, count, ppos, buf, pos); |
123 | } | 267 | } |
124 | 268 | ||
269 | static void iwl_dbgfs_update_bf(struct ieee80211_vif *vif, | ||
270 | enum iwl_dbgfs_bf_mask param, int value) | ||
271 | { | ||
272 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); | ||
273 | struct iwl_dbgfs_bf *dbgfs_bf = &mvmvif->dbgfs_bf; | ||
274 | |||
275 | dbgfs_bf->mask |= param; | ||
276 | |||
277 | switch (param) { | ||
278 | case MVM_DEBUGFS_BF_ENERGY_DELTA: | ||
279 | dbgfs_bf->bf_energy_delta = value; | ||
280 | break; | ||
281 | case MVM_DEBUGFS_BF_ROAMING_ENERGY_DELTA: | ||
282 | dbgfs_bf->bf_roaming_energy_delta = value; | ||
283 | break; | ||
284 | case MVM_DEBUGFS_BF_ROAMING_STATE: | ||
285 | dbgfs_bf->bf_roaming_state = value; | ||
286 | break; | ||
287 | case MVM_DEBUGFS_BF_TEMP_THRESHOLD: | ||
288 | dbgfs_bf->bf_temp_threshold = value; | ||
289 | break; | ||
290 | case MVM_DEBUGFS_BF_TEMP_FAST_FILTER: | ||
291 | dbgfs_bf->bf_temp_fast_filter = value; | ||
292 | break; | ||
293 | case MVM_DEBUGFS_BF_TEMP_SLOW_FILTER: | ||
294 | dbgfs_bf->bf_temp_slow_filter = value; | ||
295 | break; | ||
296 | case MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER: | ||
297 | dbgfs_bf->bf_enable_beacon_filter = value; | ||
298 | break; | ||
299 | case MVM_DEBUGFS_BF_DEBUG_FLAG: | ||
300 | dbgfs_bf->bf_debug_flag = value; | ||
301 | break; | ||
302 | case MVM_DEBUGFS_BF_ESCAPE_TIMER: | ||
303 | dbgfs_bf->bf_escape_timer = value; | ||
304 | break; | ||
305 | case MVM_DEBUGFS_BA_ENABLE_BEACON_ABORT: | ||
306 | dbgfs_bf->ba_enable_beacon_abort = value; | ||
307 | break; | ||
308 | case MVM_DEBUGFS_BA_ESCAPE_TIMER: | ||
309 | dbgfs_bf->ba_escape_timer = value; | ||
310 | break; | ||
311 | } | ||
312 | } | ||
313 | |||
314 | static ssize_t iwl_dbgfs_bf_params_write(struct ieee80211_vif *vif, char *buf, | ||
315 | size_t count, loff_t *ppos) | ||
316 | { | ||
317 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); | ||
318 | struct iwl_mvm *mvm = mvmvif->mvm; | ||
319 | enum iwl_dbgfs_bf_mask param; | ||
320 | int value, ret = 0; | ||
321 | |||
322 | if (!strncmp("bf_energy_delta=", buf, 16)) { | ||
323 | if (sscanf(buf+16, "%d", &value) != 1) | ||
324 | return -EINVAL; | ||
325 | if (value < IWL_BF_ENERGY_DELTA_MIN || | ||
326 | value > IWL_BF_ENERGY_DELTA_MAX) | ||
327 | return -EINVAL; | ||
328 | param = MVM_DEBUGFS_BF_ENERGY_DELTA; | ||
329 | } else if (!strncmp("bf_roaming_energy_delta=", buf, 24)) { | ||
330 | if (sscanf(buf+24, "%d", &value) != 1) | ||
331 | return -EINVAL; | ||
332 | if (value < IWL_BF_ROAMING_ENERGY_DELTA_MIN || | ||
333 | value > IWL_BF_ROAMING_ENERGY_DELTA_MAX) | ||
334 | return -EINVAL; | ||
335 | param = MVM_DEBUGFS_BF_ROAMING_ENERGY_DELTA; | ||
336 | } else if (!strncmp("bf_roaming_state=", buf, 17)) { | ||
337 | if (sscanf(buf+17, "%d", &value) != 1) | ||
338 | return -EINVAL; | ||
339 | if (value < IWL_BF_ROAMING_STATE_MIN || | ||
340 | value > IWL_BF_ROAMING_STATE_MAX) | ||
341 | return -EINVAL; | ||
342 | param = MVM_DEBUGFS_BF_ROAMING_STATE; | ||
343 | } else if (!strncmp("bf_temp_threshold=", buf, 18)) { | ||
344 | if (sscanf(buf+18, "%d", &value) != 1) | ||
345 | return -EINVAL; | ||
346 | if (value < IWL_BF_TEMP_THRESHOLD_MIN || | ||
347 | value > IWL_BF_TEMP_THRESHOLD_MAX) | ||
348 | return -EINVAL; | ||
349 | param = MVM_DEBUGFS_BF_TEMP_THRESHOLD; | ||
350 | } else if (!strncmp("bf_temp_fast_filter=", buf, 20)) { | ||
351 | if (sscanf(buf+20, "%d", &value) != 1) | ||
352 | return -EINVAL; | ||
353 | if (value < IWL_BF_TEMP_FAST_FILTER_MIN || | ||
354 | value > IWL_BF_TEMP_FAST_FILTER_MAX) | ||
355 | return -EINVAL; | ||
356 | param = MVM_DEBUGFS_BF_TEMP_FAST_FILTER; | ||
357 | } else if (!strncmp("bf_temp_slow_filter=", buf, 20)) { | ||
358 | if (sscanf(buf+20, "%d", &value) != 1) | ||
359 | return -EINVAL; | ||
360 | if (value < IWL_BF_TEMP_SLOW_FILTER_MIN || | ||
361 | value > IWL_BF_TEMP_SLOW_FILTER_MAX) | ||
362 | return -EINVAL; | ||
363 | param = MVM_DEBUGFS_BF_TEMP_SLOW_FILTER; | ||
364 | } else if (!strncmp("bf_enable_beacon_filter=", buf, 24)) { | ||
365 | if (sscanf(buf+24, "%d", &value) != 1) | ||
366 | return -EINVAL; | ||
367 | if (value < 0 || value > 1) | ||
368 | return -EINVAL; | ||
369 | param = MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER; | ||
370 | } else if (!strncmp("bf_debug_flag=", buf, 14)) { | ||
371 | if (sscanf(buf+14, "%d", &value) != 1) | ||
372 | return -EINVAL; | ||
373 | if (value < 0 || value > 1) | ||
374 | return -EINVAL; | ||
375 | param = MVM_DEBUGFS_BF_DEBUG_FLAG; | ||
376 | } else if (!strncmp("bf_escape_timer=", buf, 16)) { | ||
377 | if (sscanf(buf+16, "%d", &value) != 1) | ||
378 | return -EINVAL; | ||
379 | if (value < IWL_BF_ESCAPE_TIMER_MIN || | ||
380 | value > IWL_BF_ESCAPE_TIMER_MAX) | ||
381 | return -EINVAL; | ||
382 | param = MVM_DEBUGFS_BF_ESCAPE_TIMER; | ||
383 | } else if (!strncmp("ba_escape_timer=", buf, 16)) { | ||
384 | if (sscanf(buf+16, "%d", &value) != 1) | ||
385 | return -EINVAL; | ||
386 | if (value < IWL_BA_ESCAPE_TIMER_MIN || | ||
387 | value > IWL_BA_ESCAPE_TIMER_MAX) | ||
388 | return -EINVAL; | ||
389 | param = MVM_DEBUGFS_BA_ESCAPE_TIMER; | ||
390 | } else if (!strncmp("ba_enable_beacon_abort=", buf, 23)) { | ||
391 | if (sscanf(buf+23, "%d", &value) != 1) | ||
392 | return -EINVAL; | ||
393 | if (value < 0 || value > 1) | ||
394 | return -EINVAL; | ||
395 | param = MVM_DEBUGFS_BA_ENABLE_BEACON_ABORT; | ||
396 | } else { | ||
397 | return -EINVAL; | ||
398 | } | ||
399 | |||
400 | mutex_lock(&mvm->mutex); | ||
401 | iwl_dbgfs_update_bf(vif, param, value); | ||
402 | if (param == MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER && !value) | ||
403 | ret = iwl_mvm_disable_beacon_filter(mvm, vif); | ||
404 | else | ||
405 | ret = iwl_mvm_enable_beacon_filter(mvm, vif); | ||
406 | mutex_unlock(&mvm->mutex); | ||
407 | |||
408 | return ret ?: count; | ||
409 | } | ||
410 | |||
411 | static ssize_t iwl_dbgfs_bf_params_read(struct file *file, | ||
412 | char __user *user_buf, | ||
413 | size_t count, loff_t *ppos) | ||
414 | { | ||
415 | struct ieee80211_vif *vif = file->private_data; | ||
416 | struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); | ||
417 | char buf[256]; | ||
418 | int pos = 0; | ||
419 | const size_t bufsz = sizeof(buf); | ||
420 | struct iwl_beacon_filter_cmd cmd = { | ||
421 | IWL_BF_CMD_CONFIG_DEFAULTS, | ||
422 | .bf_enable_beacon_filter = | ||
423 | cpu_to_le32(IWL_BF_ENABLE_BEACON_FILTER_DEFAULT), | ||
424 | .ba_enable_beacon_abort = | ||
425 | cpu_to_le32(IWL_BA_ENABLE_BEACON_ABORT_DEFAULT), | ||
426 | }; | ||
427 | |||
428 | iwl_mvm_beacon_filter_debugfs_parameters(vif, &cmd); | ||
429 | if (mvmvif->bf_data.bf_enabled) | ||
430 | cmd.bf_enable_beacon_filter = cpu_to_le32(1); | ||
431 | else | ||
432 | cmd.bf_enable_beacon_filter = 0; | ||
433 | |||
434 | pos += scnprintf(buf+pos, bufsz-pos, "bf_energy_delta = %d\n", | ||
435 | le32_to_cpu(cmd.bf_energy_delta)); | ||
436 | pos += scnprintf(buf+pos, bufsz-pos, "bf_roaming_energy_delta = %d\n", | ||
437 | le32_to_cpu(cmd.bf_roaming_energy_delta)); | ||
438 | pos += scnprintf(buf+pos, bufsz-pos, "bf_roaming_state = %d\n", | ||
439 | le32_to_cpu(cmd.bf_roaming_state)); | ||
440 | pos += scnprintf(buf+pos, bufsz-pos, "bf_temp_threshold = %d\n", | ||
441 | le32_to_cpu(cmd.bf_temp_threshold)); | ||
442 | pos += scnprintf(buf+pos, bufsz-pos, "bf_temp_fast_filter = %d\n", | ||
443 | le32_to_cpu(cmd.bf_temp_fast_filter)); | ||
444 | pos += scnprintf(buf+pos, bufsz-pos, "bf_temp_slow_filter = %d\n", | ||
445 | le32_to_cpu(cmd.bf_temp_slow_filter)); | ||
446 | pos += scnprintf(buf+pos, bufsz-pos, "bf_enable_beacon_filter = %d\n", | ||
447 | le32_to_cpu(cmd.bf_enable_beacon_filter)); | ||
448 | pos += scnprintf(buf+pos, bufsz-pos, "bf_debug_flag = %d\n", | ||
449 | le32_to_cpu(cmd.bf_debug_flag)); | ||
450 | pos += scnprintf(buf+pos, bufsz-pos, "bf_escape_timer = %d\n", | ||
451 | le32_to_cpu(cmd.bf_escape_timer)); | ||
452 | pos += scnprintf(buf+pos, bufsz-pos, "ba_escape_timer = %d\n", | ||
453 | le32_to_cpu(cmd.ba_escape_timer)); | ||
454 | pos += scnprintf(buf+pos, bufsz-pos, "ba_enable_beacon_abort = %d\n", | ||
455 | le32_to_cpu(cmd.ba_enable_beacon_abort)); | ||
456 | |||
457 | return simple_read_from_buffer(user_buf, count, ppos, buf, pos); | ||
458 | } | ||
459 | |||
460 | #define MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz) \ | ||
461 | _MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz, struct ieee80211_vif) | ||
462 | #define MVM_DEBUGFS_READ_WRITE_FILE_OPS(name, bufsz) \ | ||
463 | _MVM_DEBUGFS_READ_WRITE_FILE_OPS(name, bufsz, struct ieee80211_vif) | ||
125 | #define MVM_DEBUGFS_ADD_FILE_VIF(name, parent, mode) do { \ | 464 | #define MVM_DEBUGFS_ADD_FILE_VIF(name, parent, mode) do { \ |
126 | if (!debugfs_create_file(#name, mode, parent, vif, \ | 465 | if (!debugfs_create_file(#name, mode, parent, vif, \ |
127 | &iwl_dbgfs_##name##_ops)) \ | 466 | &iwl_dbgfs_##name##_ops)) \ |
@@ -129,6 +468,8 @@ static ssize_t iwl_dbgfs_mac_params_read(struct file *file, | |||
129 | } while (0) | 468 | } while (0) |
130 | 469 | ||
131 | MVM_DEBUGFS_READ_FILE_OPS(mac_params); | 470 | MVM_DEBUGFS_READ_FILE_OPS(mac_params); |
471 | MVM_DEBUGFS_READ_WRITE_FILE_OPS(pm_params, 32); | ||
472 | MVM_DEBUGFS_READ_WRITE_FILE_OPS(bf_params, 256); | ||
132 | 473 | ||
133 | void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif) | 474 | void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif) |
134 | { | 475 | { |
@@ -152,9 +493,21 @@ void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif) | |||
152 | return; | 493 | return; |
153 | } | 494 | } |
154 | 495 | ||
496 | if (iwlmvm_mod_params.power_scheme != IWL_POWER_SCHEME_CAM && | ||
497 | ((vif->type == NL80211_IFTYPE_STATION && !vif->p2p) || | ||
498 | (vif->type == NL80211_IFTYPE_STATION && vif->p2p && | ||
499 | mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_P2P_PS))) | ||
500 | MVM_DEBUGFS_ADD_FILE_VIF(pm_params, mvmvif->dbgfs_dir, S_IWUSR | | ||
501 | S_IRUSR); | ||
502 | |||
155 | MVM_DEBUGFS_ADD_FILE_VIF(mac_params, mvmvif->dbgfs_dir, | 503 | MVM_DEBUGFS_ADD_FILE_VIF(mac_params, mvmvif->dbgfs_dir, |
156 | S_IRUSR); | 504 | S_IRUSR); |
157 | 505 | ||
506 | if (vif->type == NL80211_IFTYPE_STATION && !vif->p2p && | ||
507 | mvmvif == mvm->bf_allowed_vif) | ||
508 | MVM_DEBUGFS_ADD_FILE_VIF(bf_params, mvmvif->dbgfs_dir, | ||
509 | S_IRUSR | S_IWUSR); | ||
510 | |||
158 | /* | 511 | /* |
159 | * Create symlink for convenience pointing to interface specific | 512 | * Create symlink for convenience pointing to interface specific |
160 | * debugfs entries for the driver. For example, under | 513 | * debugfs entries for the driver. For example, under |
diff --git a/drivers/net/wireless/iwlwifi/mvm/power.c b/drivers/net/wireless/iwlwifi/mvm/power.c index 0ef467428064..d173ea27417e 100644 --- a/drivers/net/wireless/iwlwifi/mvm/power.c +++ b/drivers/net/wireless/iwlwifi/mvm/power.c | |||
@@ -406,6 +406,13 @@ static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm, | |||
406 | cmd->flags &= | 406 | cmd->flags &= |
407 | cpu_to_le16(~POWER_FLAGS_SNOOZE_ENA_MSK); | 407 | cpu_to_le16(~POWER_FLAGS_SNOOZE_ENA_MSK); |
408 | } | 408 | } |
409 | if (mvmvif->dbgfs_pm.mask & MVM_DEBUGFS_PM_UAPSD_MISBEHAVING) { | ||
410 | u16 flag = POWER_FLAGS_UAPSD_MISBEHAVING_ENA_MSK; | ||
411 | if (mvmvif->dbgfs_pm.uapsd_misbehaving) | ||
412 | cmd->flags |= cpu_to_le16(flag); | ||
413 | else | ||
414 | cmd->flags &= cpu_to_le16(flag); | ||
415 | } | ||
409 | #endif /* CONFIG_IWLWIFI_DEBUGFS */ | 416 | #endif /* CONFIG_IWLWIFI_DEBUGFS */ |
410 | } | 417 | } |
411 | 418 | ||