Bluetooth: btmrvl: support sysfs initiated firmware coredump
Since commit 3c47d19ff4
("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 <arend.vanspriel@broadcom.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
hifive-unleashed-5.1
parent
803cdb8ce5
commit
45650499ee
|
@ -167,35 +167,6 @@ static const struct file_operations btmrvl_hscmd_fops = {
|
||||||
.llseek = default_llseek,
|
.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)
|
void btmrvl_debugfs_init(struct hci_dev *hdev)
|
||||||
{
|
{
|
||||||
struct btmrvl_private *priv = hci_get_drvdata(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);
|
priv, &btmrvl_hscmd_fops);
|
||||||
debugfs_create_file("hscfgcmd", 0644, dbg->config_dir,
|
debugfs_create_file("hscfgcmd", 0644, dbg->config_dir,
|
||||||
priv, &btmrvl_hscfgcmd_fops);
|
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);
|
dbg->status_dir = debugfs_create_dir("status", hdev->debugfs);
|
||||||
debugfs_create_u8("curpsmode", 0444, dbg->status_dir,
|
debugfs_create_u8("curpsmode", 0444, dbg->status_dir,
|
||||||
|
|
|
@ -110,7 +110,6 @@ struct btmrvl_private {
|
||||||
u8 *payload, u16 nb);
|
u8 *payload, u16 nb);
|
||||||
int (*hw_wakeup_firmware)(struct btmrvl_private *priv);
|
int (*hw_wakeup_firmware)(struct btmrvl_private *priv);
|
||||||
int (*hw_process_int_status)(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 */
|
spinlock_t driver_lock; /* spinlock used by driver */
|
||||||
#ifdef CONFIG_DEBUG_FS
|
#ifdef CONFIG_DEBUG_FS
|
||||||
void *debugfs_data;
|
void *debugfs_data;
|
||||||
|
@ -183,7 +182,6 @@ int btmrvl_send_hscfg_cmd(struct btmrvl_private *priv);
|
||||||
int btmrvl_enable_ps(struct btmrvl_private *priv);
|
int btmrvl_enable_ps(struct btmrvl_private *priv);
|
||||||
int btmrvl_prepare_command(struct btmrvl_private *priv);
|
int btmrvl_prepare_command(struct btmrvl_private *priv);
|
||||||
int btmrvl_enable_hs(struct btmrvl_private *priv);
|
int btmrvl_enable_hs(struct btmrvl_private *priv);
|
||||||
void btmrvl_firmware_dump(struct btmrvl_private *priv);
|
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_FS
|
#ifdef CONFIG_DEBUG_FS
|
||||||
void btmrvl_debugfs_init(struct hci_dev *hdev);
|
void btmrvl_debugfs_init(struct hci_dev *hdev);
|
||||||
|
|
|
@ -358,12 +358,6 @@ int btmrvl_prepare_command(struct btmrvl_private *priv)
|
||||||
return ret;
|
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)
|
static int btmrvl_tx_pkt(struct btmrvl_private *priv, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
|
@ -1311,9 +1311,11 @@ rdwr_status btmrvl_sdio_rdwr_firmware(struct btmrvl_private *priv,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function dump sdio register and memory data */
|
/* This function dump sdio register and memory data */
|
||||||
static void btmrvl_sdio_dump_firmware(struct btmrvl_private *priv)
|
static void 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;
|
int ret = 0;
|
||||||
unsigned int reg, reg_start, reg_end;
|
unsigned int reg, reg_start, reg_end;
|
||||||
enum rdwr_status stat;
|
enum rdwr_status stat;
|
||||||
|
@ -1321,6 +1323,9 @@ static void btmrvl_sdio_dump_firmware(struct btmrvl_private *priv)
|
||||||
u8 dump_num = 0, idx, i, read_reg, doneflag = 0;
|
u8 dump_num = 0, idx, i, read_reg, doneflag = 0;
|
||||||
u32 memory_size, fw_dump_len = 0;
|
u32 memory_size, fw_dump_len = 0;
|
||||||
|
|
||||||
|
card = sdio_get_drvdata(func);
|
||||||
|
priv = card->priv;
|
||||||
|
|
||||||
/* dump sdio register first */
|
/* dump sdio register first */
|
||||||
btmrvl_sdio_dump_regs(priv);
|
btmrvl_sdio_dump_regs(priv);
|
||||||
|
|
||||||
|
@ -1547,7 +1552,6 @@ static int btmrvl_sdio_probe(struct sdio_func *func,
|
||||||
priv->hw_host_to_card = btmrvl_sdio_host_to_card;
|
priv->hw_host_to_card = btmrvl_sdio_host_to_card;
|
||||||
priv->hw_wakeup_firmware = btmrvl_sdio_wakeup_fw;
|
priv->hw_wakeup_firmware = btmrvl_sdio_wakeup_fw;
|
||||||
priv->hw_process_int_status = btmrvl_sdio_process_int_status;
|
priv->hw_process_int_status = btmrvl_sdio_process_int_status;
|
||||||
priv->firmware_dump = btmrvl_sdio_dump_firmware;
|
|
||||||
|
|
||||||
if (btmrvl_register_hdev(priv)) {
|
if (btmrvl_register_hdev(priv)) {
|
||||||
BT_ERR("Register hdev failed!");
|
BT_ERR("Register hdev failed!");
|
||||||
|
@ -1717,6 +1721,7 @@ static struct sdio_driver bt_mrvl_sdio = {
|
||||||
.remove = btmrvl_sdio_remove,
|
.remove = btmrvl_sdio_remove,
|
||||||
.drv = {
|
.drv = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
|
.coredump = btmrvl_sdio_coredump,
|
||||||
.pm = &btmrvl_sdio_pm_ops,
|
.pm = &btmrvl_sdio_pm_ops,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue