Received: by 10.223.185.116 with SMTP id b49csp673070wrg; Wed, 21 Feb 2018 05:11:01 -0800 (PST) X-Google-Smtp-Source: AH8x226UbUM5sZEOIC/h9I7wp2cxrkEDS+FM97WDIyO0xe6G6rDXWP1Qo1m4H0ULnA1S+4yIGOqU X-Received: by 10.98.152.86 with SMTP id q83mr3276601pfd.218.1519218661865; Wed, 21 Feb 2018 05:11:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519218661; cv=none; d=google.com; s=arc-20160816; b=MjHjJq3rjkKYzOdqmA5c9hc2C8zxvVuPeemyeVPaELomO3/qe7IMfnkf0Jw/u2qy1n OAv1Xwt6nRr+iirwDdmrAsNrB//4dYdZJsDt0SSg/Le2MVc08wYUOedpjf6MfiVDmZuM /iO6De7claH0dfe3cY6wrwiR+y3scVZwXUjdjB9Z8f+yGHfwE7F472IdOmdzzjz4bjQ0 7HDSqOq4ybqvilq3CBNy+FzDh5SI4S2Hsx3XiCL5C/jWSQLocV0L99fbc23HuKyDQPJr OutwJtO0+cLcWLNF0aUziJqbic5YTMGvJNHfomviA0IXC8ASLM6v2rMF2lMCIcdHf/+b 9qng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=JFL1UWdNvvwNfSWuKSTcxS0iY+jbR2m6ultW5AVgoNI=; b=gx0ya9KRGj02kB3Ato6ZJEfGQvguiXHKhh/KQmPP1tgWAfW/GTnHj3/7SPjIsiBwU5 bzez1EqUeMfYtSvvwN3Ll3BThHq9j8TLG259tUCnn+aeLh4heNDVLr5r98+kt6sGyrAu pTW0t+CZV0P94laCB9mkUOrozjhenkC1BgVdnc+vtSy09f3Myt7FpbQklme08//dE0lb 4H5Q0cLUOaj+hWHdwFI/HLi4ZEeS51HEOvx6gwPkZExmih6AJholVrd7NB1fywS4SM4a UTmEZnA3UC80aYfzoTLxzHcMPicNS4+3WY1muuz9AQHpdRjD2mGTGPvmM4dcFH1aoJ4T NfcQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=broadcom.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l18si1353898pgn.339.2018.02.21.05.10.47; Wed, 21 Feb 2018 05:11:01 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=broadcom.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933524AbeBUKu5 (ORCPT + 99 others); Wed, 21 Feb 2018 05:50:57 -0500 Received: from rnd-relay.smtp.broadcom.com ([192.19.229.170]:60968 "EHLO rnd-relay.smtp.broadcom.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753739AbeBUKuj (ORCPT ); Wed, 21 Feb 2018 05:50:39 -0500 Received: from mail-irv-17.broadcom.com (mail-irv-17.lvn.broadcom.net [10.75.224.233]) by rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id 65C4330C01E; Wed, 21 Feb 2018 02:50:38 -0800 (PST) Received: from bld-bun-01.bun.broadcom.com (bld-bun-01.bun.broadcom.com [10.176.128.83]) by mail-irv-17.broadcom.com (Postfix) with ESMTP id CA1BC81EBF; Wed, 21 Feb 2018 02:50:37 -0800 (PST) Received: by bld-bun-01.bun.broadcom.com (Postfix, from userid 25152) id 89AB2B02E34; Wed, 21 Feb 2018 11:50:36 +0100 (CET) From: Arend van Spriel To: Kalle Valo , Marcel Holtmann Cc: linux-wireless@vger.kernel.org, linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, Greg Kroah-Hartman , Arend van Spriel Subject: [PATCH 3/3] btmrvl: support sysfs initiated firmware coredump Date: Wed, 21 Feb 2018 11:50:20 +0100 Message-Id: <1519210220-22437-4-git-send-email-arend.vanspriel@broadcom.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1519210220-22437-1-git-send-email-arend.vanspriel@broadcom.com> References: <1519210220-22437-1-git-send-email-arend.vanspriel@broadcom.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since commit 3c47d19ff4dc ("drivers: base: add coredump driver ops") it is possible to initiate a device coredump from user-space. This patch adds support for it in btmrvl_sdio adding the .coredump() driver callback. This makes dump through debugfs obsolete so removing it. Signed-off-by: Arend van Spriel --- drivers/bluetooth/btmrvl_debugfs.c | 31 ------------------------------- drivers/bluetooth/btmrvl_drv.h | 2 -- drivers/bluetooth/btmrvl_main.c | 6 ------ drivers/bluetooth/btmrvl_sdio.c | 18 ++++++++++++------ 4 files changed, 12 insertions(+), 45 deletions(-) diff --git a/drivers/bluetooth/btmrvl_debugfs.c b/drivers/bluetooth/btmrvl_debugfs.c index 1828ed8..023d35e 100644 --- a/drivers/bluetooth/btmrvl_debugfs.c +++ b/drivers/bluetooth/btmrvl_debugfs.c @@ -167,35 +167,6 @@ static ssize_t btmrvl_hscmd_read(struct file *file, char __user *userbuf, .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); @@ -226,8 +197,6 @@ 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, diff --git a/drivers/bluetooth/btmrvl_drv.h b/drivers/bluetooth/btmrvl_drv.h index fc3caf4..f045454 100644 --- a/drivers/bluetooth/btmrvl_drv.h +++ b/drivers/bluetooth/btmrvl_drv.h @@ -110,7 +110,6 @@ struct btmrvl_private { u8 *payload, u16 nb); int (*hw_wakeup_firmware)(struct btmrvl_private *priv); int (*hw_process_int_status)(struct btmrvl_private *priv); - void (*firmware_dump)(struct btmrvl_private *priv); spinlock_t driver_lock; /* spinlock used by driver */ #ifdef CONFIG_DEBUG_FS void *debugfs_data; @@ -183,7 +182,6 @@ struct btmrvl_event { int btmrvl_enable_ps(struct btmrvl_private *priv); int btmrvl_prepare_command(struct btmrvl_private *priv); int btmrvl_enable_hs(struct btmrvl_private *priv); -void btmrvl_firmware_dump(struct btmrvl_private *priv); #ifdef CONFIG_DEBUG_FS void btmrvl_debugfs_init(struct hci_dev *hdev); diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c index b280d46..e5cf14d 100644 --- a/drivers/bluetooth/btmrvl_main.c +++ b/drivers/bluetooth/btmrvl_main.c @@ -358,12 +358,6 @@ int btmrvl_prepare_command(struct btmrvl_private *priv) return ret; } -void btmrvl_firmware_dump(struct btmrvl_private *priv) -{ - if (priv->firmware_dump) - priv->firmware_dump(priv); -} - static int btmrvl_tx_pkt(struct btmrvl_private *priv, struct sk_buff *skb) { int ret = 0; diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c index 7dbb446..0f02025 100644 --- a/drivers/bluetooth/btmrvl_sdio.c +++ b/drivers/bluetooth/btmrvl_sdio.c @@ -1311,9 +1311,11 @@ rdwr_status btmrvl_sdio_rdwr_firmware(struct btmrvl_private *priv, } /* This function dump sdio register and memory data */ -static void btmrvl_sdio_dump_firmware(struct btmrvl_private *priv) +static int btmrvl_sdio_coredump(struct device *dev) { - struct btmrvl_sdio_card *card = priv->btmrvl_dev.card; + struct sdio_func *func = dev_to_sdio_func(dev); + struct btmrvl_sdio_card *card; + struct btmrvl_private *priv; int ret = 0; unsigned int reg, reg_start, reg_end; enum rdwr_status stat; @@ -1321,12 +1323,15 @@ static void btmrvl_sdio_dump_firmware(struct btmrvl_private *priv) u8 dump_num = 0, idx, i, read_reg, doneflag = 0; u32 memory_size, fw_dump_len = 0; + card = sdio_get_drvdata(func); + priv = card->priv; + /* dump sdio register first */ btmrvl_sdio_dump_regs(priv); if (!card->supports_fw_dump) { BT_ERR("Firmware dump not supported for this card!"); - return; + return -ENODATA; } for (idx = 0; idx < ARRAY_SIZE(mem_type_mapping_tbl); idx++) { @@ -1445,12 +1450,12 @@ static void btmrvl_sdio_dump_firmware(struct btmrvl_private *priv) sdio_release_host(card->func); if (fw_dump_len == 0) - return; + return -ENODATA; fw_dump_data = vzalloc(fw_dump_len+1); if (!fw_dump_data) { BT_ERR("Vzalloc fw_dump_data fail!"); - return; + return -ENOMEM; } fw_dump_ptr = fw_dump_data; @@ -1487,6 +1492,7 @@ static void btmrvl_sdio_dump_firmware(struct btmrvl_private *priv) */ dev_coredumpv(&card->func->dev, fw_dump_data, fw_dump_len, GFP_KERNEL); BT_INFO("== btmrvl firmware dump to /sys/class/devcoredump end"); + return 0; } static int btmrvl_sdio_probe(struct sdio_func *func, @@ -1547,7 +1553,6 @@ static int btmrvl_sdio_probe(struct sdio_func *func, priv->hw_host_to_card = btmrvl_sdio_host_to_card; priv->hw_wakeup_firmware = btmrvl_sdio_wakeup_fw; priv->hw_process_int_status = btmrvl_sdio_process_int_status; - priv->firmware_dump = btmrvl_sdio_dump_firmware; if (btmrvl_register_hdev(priv)) { BT_ERR("Register hdev failed!"); @@ -1717,6 +1722,7 @@ static int btmrvl_sdio_resume(struct device *dev) .remove = btmrvl_sdio_remove, .drv = { .owner = THIS_MODULE, + .coredump = btmrvl_sdio_coredump, .pm = &btmrvl_sdio_pm_ops, } }; -- 1.9.1