iwlwifi: dynamically allocate buffer for sram debugfs file
authorWey-Yi Guy <wey-yi.w.guy@intel.com>
Fri, 20 Nov 2009 20:05:00 +0000 (12:05 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 23 Nov 2009 22:05:34 +0000 (17:05 -0500)
Dynamically allocate memory for dumping SRAM based on the length of memory
to be displayed.

Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl-debugfs.c

index 4630094b4ca1f0e5570e2a03874dafc648e13c31..016ff4014a7b8b43da36f9535899fbfdf81f427b 100644 (file)
@@ -228,13 +228,21 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file,
                                        size_t count, loff_t *ppos)
 {
        u32 val;
-       char buf[1024];
+       char *buf;
        ssize_t ret;
        int i;
        int pos = 0;
        struct iwl_priv *priv = (struct iwl_priv *)file->private_data;
-       const size_t bufsz = sizeof(buf);
+       size_t bufsz;
 
+       bufsz =  30 + priv->dbgfs->sram_len * sizeof(char) * 12;
+       buf = kmalloc(bufsz, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+       pos += scnprintf(buf + pos, bufsz - pos, "sram_len: %d\n",
+                       priv->dbgfs->sram_len);
+       pos += scnprintf(buf + pos, bufsz - pos, "sram_offset: %d\n",
+                       priv->dbgfs->sram_offset);
        for (i = priv->dbgfs->sram_len; i > 0; i -= 4) {
                val = iwl_read_targ_mem(priv, priv->dbgfs->sram_offset + \
                                        priv->dbgfs->sram_len - i);
@@ -251,11 +259,14 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file,
                                break;
                        }
                }
+               if (!(i % 16))
+                       pos += scnprintf(buf + pos, bufsz - pos, "\n");
                pos += scnprintf(buf + pos, bufsz - pos, "0x%08x ", val);
        }
        pos += scnprintf(buf + pos, bufsz - pos, "\n");
 
        ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
+       kfree(buf);
        return ret;
 }