Merge tag 'iommu-config-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.git] / drivers / bluetooth / btmrvl_debugfs.c
index 023d35e3c7a75b573a52d99cbda5bd98c64e017f..1828ed8cae7a32119cba96b51c55c921bdea71d1 100644 (file)
@@ -167,6 +167,35 @@ static const struct file_operations btmrvl_hscmd_fops = {
        .llseek = default_llseek,
 };
 
+static ssize_t btmrvl_fwdump_write(struct file *file, const char __user *ubuf,
+                                  size_t count, loff_t *ppos)
+{
+       struct btmrvl_private *priv = file->private_data;
+       char buf[16];
+       bool result;
+
+       memset(buf, 0, sizeof(buf));
+
+       if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
+               return -EFAULT;
+
+       if (strtobool(buf, &result))
+               return -EINVAL;
+
+       if (!result)
+               return -EINVAL;
+
+       btmrvl_firmware_dump(priv);
+
+       return count;
+}
+
+static const struct file_operations btmrvl_fwdump_fops = {
+       .write  = btmrvl_fwdump_write,
+       .open   = simple_open,
+       .llseek = default_llseek,
+};
+
 void btmrvl_debugfs_init(struct hci_dev *hdev)
 {
        struct btmrvl_private *priv = hci_get_drvdata(hdev);
@@ -197,6 +226,8 @@ void btmrvl_debugfs_init(struct hci_dev *hdev)
                            priv, &btmrvl_hscmd_fops);
        debugfs_create_file("hscfgcmd", 0644, dbg->config_dir,
                            priv, &btmrvl_hscfgcmd_fops);
+       debugfs_create_file("fw_dump", 0200, dbg->config_dir,
+                           priv, &btmrvl_fwdump_fops);
 
        dbg->status_dir = debugfs_create_dir("status", hdev->debugfs);
        debugfs_create_u8("curpsmode", 0444, dbg->status_dir,