162306a36Sopenharmony_ci// SPDX-License-Identifier: ISC
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2012 Broadcom Corporation
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#include <linux/debugfs.h>
662306a36Sopenharmony_ci#include <linux/netdevice.h>
762306a36Sopenharmony_ci#include <linux/module.h>
862306a36Sopenharmony_ci#include <linux/devcoredump.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <brcmu_wifi.h>
1162306a36Sopenharmony_ci#include <brcmu_utils.h>
1262306a36Sopenharmony_ci#include "core.h"
1362306a36Sopenharmony_ci#include "bus.h"
1462306a36Sopenharmony_ci#include "fweh.h"
1562306a36Sopenharmony_ci#include "debug.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciint brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data,
1862306a36Sopenharmony_ci			       size_t len)
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	void *dump;
2162306a36Sopenharmony_ci	size_t ramsize;
2262306a36Sopenharmony_ci	int err;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	ramsize = brcmf_bus_get_ramsize(bus);
2562306a36Sopenharmony_ci	if (!ramsize)
2662306a36Sopenharmony_ci		return -ENOTSUPP;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	dump = vzalloc(len + ramsize);
2962306a36Sopenharmony_ci	if (!dump)
3062306a36Sopenharmony_ci		return -ENOMEM;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	if (data && len > 0)
3362306a36Sopenharmony_ci		memcpy(dump, data, len);
3462306a36Sopenharmony_ci	err = brcmf_bus_get_memdump(bus, dump + len, ramsize);
3562306a36Sopenharmony_ci	if (err) {
3662306a36Sopenharmony_ci		vfree(dump);
3762306a36Sopenharmony_ci		return err;
3862306a36Sopenharmony_ci	}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	dev_coredumpv(bus->dev, dump, len + ramsize, GFP_KERNEL);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	return 0;
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistruct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	return drvr->wiphy->debugfsdir;
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_civoid brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
5162306a36Sopenharmony_ci			    int (*read_fn)(struct seq_file *seq, void *data))
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	WARN(!drvr->wiphy->debugfsdir, "wiphy not (yet) registered\n");
5462306a36Sopenharmony_ci	debugfs_create_devm_seqfile(drvr->bus_if->dev, fn,
5562306a36Sopenharmony_ci				    drvr->wiphy->debugfsdir, read_fn);
5662306a36Sopenharmony_ci}
57