aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/mvm/debugfs.c
diff options
context:
space:
mode:
authorAlexander Bondar <alexander.bondar@intel.com>2013-09-03 07:18:03 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-10-11 03:56:57 -0400
commit64b928c4e2898dea07d5850a0708dceeb118fa3b (patch)
treed8a8f6c7b21326dadf7431e83ff4fb23f28342e2 /drivers/net/wireless/iwlwifi/mvm/debugfs.c
parent42550a53db232383ffe8d0c7d0ae9e72e2ca986b (diff)
iwlwifi: mvm: Add device wide power command
FW starts using legacy power table command (0x77) for device wide power settings. Currently this command contains only option flags field. It can configure the following: CAM (Continuous Active Mode) and POWER_SAVE_ENABLE debug option. Send this command when firmware is loaded - D0 and D3. Note: Setting this command is important to avoid unwanted FW behavior. It particularly fixes a bug when a device does not drop to low power after disassociation from AP. Signed-off-by: Alexander Bondar <alexander.bondar@intel.com> Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm/debugfs.c')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/debugfs.c82
1 files changed, 40 insertions, 42 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
index e943ee125d23..a5813437d262 100644
--- a/drivers/net/wireless/iwlwifi/mvm/debugfs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
@@ -246,60 +246,56 @@ static ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf,
246 return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 246 return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
247} 247}
248 248
249static ssize_t iwl_dbgfs_power_down_allow_write(struct file *file, 249static ssize_t iwl_dbgfs_disable_power_off_read(struct file *file,
250 const char __user *user_buf, 250 char __user *user_buf,
251 size_t count, loff_t *ppos) 251 size_t count, loff_t *ppos)
252{ 252{
253 struct iwl_mvm *mvm = file->private_data; 253 struct iwl_mvm *mvm = file->private_data;
254 char buf[8] = {}; 254 char buf[64];
255 int allow; 255 int bufsz = sizeof(buf);
256 256 int pos = 0;
257 if (!mvm->ucode_loaded)
258 return -EIO;
259
260 count = min_t(size_t, count, sizeof(buf) - 1);
261 if (copy_from_user(buf, user_buf, count))
262 return -EFAULT;
263
264 if (sscanf(buf, "%d", &allow) != 1)
265 return -EINVAL;
266 257
267 IWL_DEBUG_POWER(mvm, "%s device power down\n", 258 pos += scnprintf(buf+pos, bufsz-pos, "disable_power_off_d0=%d\n",
268 allow ? "allow" : "prevent"); 259 mvm->disable_power_off);
260 pos += scnprintf(buf+pos, bufsz-pos, "disable_power_off_d3=%d\n",
261 mvm->disable_power_off_d3);
269 262
270 /* 263 return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
271 * TODO: Send REPLY_DEBUG_CMD (0xf0) when FW support it
272 */
273
274 return count;
275} 264}
276 265
277static ssize_t iwl_dbgfs_power_down_d3_allow_write(struct file *file, 266static ssize_t iwl_dbgfs_disable_power_off_write(struct file *file,
278 const char __user *user_buf, 267 const char __user *user_buf,
279 size_t count, loff_t *ppos) 268 size_t count, loff_t *ppos)
280{ 269{
281 struct iwl_mvm *mvm = file->private_data; 270 struct iwl_mvm *mvm = file->private_data;
282 char buf[8] = {}; 271 char buf[64] = {};
283 int allow; 272 int ret;
273 int val;
274
275 if (!mvm->ucode_loaded)
276 return -EIO;
284 277
285 count = min_t(size_t, count, sizeof(buf) - 1); 278 count = min_t(size_t, count, sizeof(buf) - 1);
286 if (copy_from_user(buf, user_buf, count)) 279 if (copy_from_user(buf, user_buf, count))
287 return -EFAULT; 280 return -EFAULT;
288 281
289 if (sscanf(buf, "%d", &allow) != 1) 282 if (!strncmp("disable_power_off_d0=", buf, 21)) {
283 if (sscanf(buf + 21, "%d", &val) != 1)
284 return -EINVAL;
285 mvm->disable_power_off = val;
286 } else if (!strncmp("disable_power_off_d3=", buf, 21)) {
287 if (sscanf(buf + 21, "%d", &val) != 1)
288 return -EINVAL;
289 mvm->disable_power_off_d3 = val;
290 } else {
290 return -EINVAL; 291 return -EINVAL;
292 }
291 293
292 IWL_DEBUG_POWER(mvm, "%s device power down in d3\n", 294 mutex_lock(&mvm->mutex);
293 allow ? "allow" : "prevent"); 295 ret = iwl_mvm_power_update_device_mode(mvm);
294 296 mutex_unlock(&mvm->mutex);
295 /*
296 * TODO: When WoWLAN FW alive notification happens, driver will send
297 * REPLY_DEBUG_CMD setting power_down_allow flag according to
298 * mvm->prevent_power_down_d3
299 */
300 mvm->prevent_power_down_d3 = !allow;
301 297
302 return count; 298 return ret ?: count;
303} 299}
304 300
305static void iwl_dbgfs_update_pm(struct iwl_mvm *mvm, 301static void iwl_dbgfs_update_pm(struct iwl_mvm *mvm,
@@ -397,7 +393,9 @@ static ssize_t iwl_dbgfs_pm_params_write(struct file *file,
397 if (sscanf(buf + 16, "%d", &val) != 1) 393 if (sscanf(buf + 16, "%d", &val) != 1)
398 return -EINVAL; 394 return -EINVAL;
399 param = MVM_DEBUGFS_PM_TX_DATA_TIMEOUT; 395 param = MVM_DEBUGFS_PM_TX_DATA_TIMEOUT;
400 } else if (!strncmp("disable_power_off=", buf, 18)) { 396 } else if (!strncmp("disable_power_off=", buf, 18) &&
397 !(mvm->fw->ucode_capa.flags &
398 IWL_UCODE_TLV_FLAGS_DEVICE_PS_CMD)) {
401 if (sscanf(buf + 18, "%d", &val) != 1) 399 if (sscanf(buf + 18, "%d", &val) != 1)
402 return -EINVAL; 400 return -EINVAL;
403 param = MVM_DEBUGFS_PM_DISABLE_POWER_OFF; 401 param = MVM_DEBUGFS_PM_DISABLE_POWER_OFF;
@@ -1159,8 +1157,7 @@ MVM_DEBUGFS_READ_WRITE_FILE_OPS(sram);
1159MVM_DEBUGFS_READ_FILE_OPS(stations); 1157MVM_DEBUGFS_READ_FILE_OPS(stations);
1160MVM_DEBUGFS_READ_FILE_OPS(bt_notif); 1158MVM_DEBUGFS_READ_FILE_OPS(bt_notif);
1161MVM_DEBUGFS_READ_FILE_OPS(bt_cmd); 1159MVM_DEBUGFS_READ_FILE_OPS(bt_cmd);
1162MVM_DEBUGFS_WRITE_FILE_OPS(power_down_allow); 1160MVM_DEBUGFS_READ_WRITE_FILE_OPS(disable_power_off);
1163MVM_DEBUGFS_WRITE_FILE_OPS(power_down_d3_allow);
1164MVM_DEBUGFS_READ_FILE_OPS(fw_rx_stats); 1161MVM_DEBUGFS_READ_FILE_OPS(fw_rx_stats);
1165MVM_DEBUGFS_WRITE_FILE_OPS(fw_restart); 1162MVM_DEBUGFS_WRITE_FILE_OPS(fw_restart);
1166MVM_DEBUGFS_READ_WRITE_FILE_OPS(scan_ant_rxchain); 1163MVM_DEBUGFS_READ_WRITE_FILE_OPS(scan_ant_rxchain);
@@ -1186,8 +1183,9 @@ int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir)
1186 MVM_DEBUGFS_ADD_FILE(stations, dbgfs_dir, S_IRUSR); 1183 MVM_DEBUGFS_ADD_FILE(stations, dbgfs_dir, S_IRUSR);
1187 MVM_DEBUGFS_ADD_FILE(bt_notif, dbgfs_dir, S_IRUSR); 1184 MVM_DEBUGFS_ADD_FILE(bt_notif, dbgfs_dir, S_IRUSR);
1188 MVM_DEBUGFS_ADD_FILE(bt_cmd, dbgfs_dir, S_IRUSR); 1185 MVM_DEBUGFS_ADD_FILE(bt_cmd, dbgfs_dir, S_IRUSR);
1189 MVM_DEBUGFS_ADD_FILE(power_down_allow, mvm->debugfs_dir, S_IWUSR); 1186 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_DEVICE_PS_CMD)
1190 MVM_DEBUGFS_ADD_FILE(power_down_d3_allow, mvm->debugfs_dir, S_IWUSR); 1187 MVM_DEBUGFS_ADD_FILE(disable_power_off, mvm->debugfs_dir,
1188 S_IRUSR | S_IWUSR);
1191 MVM_DEBUGFS_ADD_FILE(fw_rx_stats, mvm->debugfs_dir, S_IRUSR); 1189 MVM_DEBUGFS_ADD_FILE(fw_rx_stats, mvm->debugfs_dir, S_IRUSR);
1192 MVM_DEBUGFS_ADD_FILE(fw_restart, mvm->debugfs_dir, S_IWUSR); 1190 MVM_DEBUGFS_ADD_FILE(fw_restart, mvm->debugfs_dir, S_IWUSR);
1193 MVM_DEBUGFS_ADD_FILE(scan_ant_rxchain, mvm->debugfs_dir, 1191 MVM_DEBUGFS_ADD_FILE(scan_ant_rxchain, mvm->debugfs_dir,