wlcore: Allow memory access when the FW crashes
authorIdo Yariv <ido@wizery.com>
Tue, 21 Aug 2012 14:17:13 +0000 (17:17 +0300)
committerLuciano Coelho <luca@coelho.fi>
Thu, 27 Sep 2012 09:13:53 +0000 (12:13 +0300)
When the no_recovery flag is used, the recovery work will not restart
the FW and the state will not be set to 'on'. To enable post-mortem
analysis, allow memory access in the 'restarting' state.

Also, since the FW might not be operational, don't fail the read/write
operations if elp_wakeup fails.

Reported-by: Arkady Miasnikov <a-miasnikov@ti.com>
Signed-off-by: Ido Yariv <ido@wizery.com>
Signed-off-by: Luciano Coelho <luca@coelho.fi>
drivers/net/wireless/ti/wlcore/debugfs.c

index 3d39784d639bc16b574a9cae770dfff187125964..c86bb00c24884d355e93af45917b30defe86f220 100644 (file)
@@ -1064,14 +1064,16 @@ static ssize_t dev_mem_read(struct file *file,
 
        mutex_lock(&wl->mutex);
 
-       if (unlikely(wl->state != WLCORE_STATE_ON)) {
+       if (unlikely(wl->state == WLCORE_STATE_OFF)) {
                ret = -EFAULT;
                goto skip_read;
        }
 
-       ret = wl1271_ps_elp_wakeup(wl);
-       if (ret < 0)
-               goto skip_read;
+       /*
+        * Don't fail if elp_wakeup returns an error, so the device's memory
+        * could be read even if the FW crashed
+        */
+       wl1271_ps_elp_wakeup(wl);
 
        /* store current partition and switch partition */
        memcpy(&old_part, &wl->curr_part, sizeof(old_part));
@@ -1149,14 +1151,16 @@ static ssize_t dev_mem_write(struct file *file, const char __user *user_buf,
 
        mutex_lock(&wl->mutex);
 
-       if (unlikely(wl->state != WLCORE_STATE_ON)) {
+       if (unlikely(wl->state == WLCORE_STATE_OFF)) {
                ret = -EFAULT;
                goto skip_write;
        }
 
-       ret = wl1271_ps_elp_wakeup(wl);
-       if (ret < 0)
-               goto skip_write;
+       /*
+        * Don't fail if elp_wakeup returns an error, so the device's memory
+        * could be read even if the FW crashed
+        */
+       wl1271_ps_elp_wakeup(wl);
 
        /* store current partition and switch partition */
        memcpy(&old_part, &wl->curr_part, sizeof(old_part));