[PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
Upon PSM watchdog event received from firmware the driver will obtain a memory snapshot of the device and expose it to user-space through the devcoredump framework. This will trigger a uevent. Reviewed-by: Hante Meuleman Reviewed-by: Franky (Zhenhui) Lin Reviewed-by: Pieter-Paul Giesberts Signed-off-by: Arend van Spriel --- drivers/net/wireless/brcm80211/Kconfig | 1 + drivers/net/wireless/brcm80211/brcmfmac/bus.h | 21 drivers/net/wireless/brcm80211/brcmfmac/core.c | 6 +-- drivers/net/wireless/brcm80211/brcmfmac/debug.c | 42 ++-- drivers/net/wireless/brcm80211/brcmfmac/debug.h | 8 +-- drivers/net/wireless/brcm80211/brcmfmac/pcie.c | 65 + drivers/net/wireless/brcm80211/brcmfmac/sdio.c | 49 ++- 7 files changed, 181 insertions(+), 11 deletions(-) diff --git a/drivers/net/wireless/brcm80211/Kconfig b/drivers/net/wireless/brcm80211/Kconfig index fe3dc12..ab42b1f 100644 --- a/drivers/net/wireless/brcm80211/Kconfig +++ b/drivers/net/wireless/brcm80211/Kconfig @@ -82,5 +82,6 @@ config BRCM_TRACING config BRCMDBG bool "Broadcom driver debug functions" depends on BRCMSMAC || BRCMFMAC + select WANT_DEV_COREDUMP ---help--- Selecting this enables additional code for debug purposes. diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/brcm80211/brcmfmac/bus.h index 89e6a4d..230cad7 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/bus.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/bus.h @@ -65,6 +65,8 @@ struct brcmf_bus_dcmd { * @rxctl: receive a control response message from dongle. * @gettxq: obtain a reference of bus transmit queue (optional). * @wowl_config: specify if dongle is configured for wowl when going to suspend + * @get_ramsize: obtain size of device memory. + * @get_memdump: obtain device memory dump in provided buffer. * * This structure provides an abstract interface towards the * bus specific driver. For control messages to common driver @@ -79,6 +81,8 @@ struct brcmf_bus_ops { int (*rxctl)(struct device *dev, unsigned char *msg, uint len); struct pktq * (*gettxq)(struct device *dev); void (*wowl_config)(struct device *dev, bool enabled); + size_t (*get_ramsize)(struct device *dev); + int (*get_memdump)(struct device *dev, void *data, size_t len); }; @@ -185,6 +189,23 @@ void brcmf_bus_wowl_config(struct brcmf_bus *bus, bool enabled) bus->ops->wowl_config(bus->dev, enabled); } +static inline size_t brcmf_bus_get_ramsize(struct brcmf_bus *bus) +{ + if (!bus->ops->get_ramsize) + return 0; + + return bus->ops->get_ramsize(bus->dev); +} + +static inline +int brcmf_bus_get_memdump(struct brcmf_bus *bus, void *data, size_t len) +{ + if (!bus->ops->get_memdump) + return -EOPNOTSUPP; + + return bus->ops->get_memdump(bus->dev, data, len); +} + /* * interface functions from common layer */ diff --git a/drivers/net/wireless/brcm80211/brcmfmac/core.c b/drivers/net/wireless/brcm80211/brcmfmac/core.c index 8c2a280..a1d39b196 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c @@ -957,8 +957,8 @@ int brcmf_attach(struct device *dev) drvr->bus_if = dev_get_drvdata(dev); drvr->bus_if->drvr = drvr; - /* create device debugfs folder */ - brcmf_debugfs_attach(drvr); + /* attach debug facilities */ + brcmf_debug_attach(drvr); /* Attach and link in the protocol */ ret = brcmf_proto_attach(drvr); @@ -1155,7 +1155,7 @@ void brcmf_detach(struct device *dev) brcmf_proto_detach(drvr); - brcmf_debugfs_detach(drvr); + brcmf_debug_detach(drvr); bus_if->drvr = NULL; kfree(drvr); } diff --git a/drivers/net/wireless/brcm80211/brcmfmac/debug.c b/drivers/net/wireless/brcm80211/brcmfmac/debug.c index 2d6d005..1299dcc 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/debug.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/debug.c @@ -16,15 +16,45 @@ #include #include #include +#include #include #include #include "core.h" #include "bus.h" +#include "fweh.h" #include "debug.h" static struct dentry *root_folder; +static int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data, + size_t len) +{ + void *dump; + size_t ramsize; + + ramsize = brcmf_bus_get_ramsize(bus); + if (ramsize) { + dump = vzalloc(len + ramsize); + if (!dump) + return -ENOMEM; + memcpy(dump, data, len); + brcmf_bus_get_memdump(bus, dump + len, ramsize); + dev_coredumpv(bus->dev, dump, len + ramsize, GFP_KERNEL); + } + return 0; +} + +static int brcmf_debug_psm_watchdog_notify(struct brcmf_if *ifp, +
Re: [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
Hi Arend, [auto build test ERROR on next-20151008 -- if it's inappropriate base, please ignore] config: x86_64-randconfig-x011-201540 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All errors (new ones prefixed by >>): drivers/net/wireless/brcm80211/brcmfmac/debug.c:58:6: error: redefinition of 'brcmf_debugfs_init' void brcmf_debugfs_init(void) ^ In file included from drivers/net/wireless/brcm80211/brcmfmac/bus.h:20:0, from drivers/net/wireless/brcm80211/brcmfmac/debug.c:24: drivers/net/wireless/brcm80211/brcmfmac/debug.h:118:20: note: previous definition of 'brcmf_debugfs_init' was here static inline void brcmf_debugfs_init(void) ^ drivers/net/wireless/brcm80211/brcmfmac/debug.c:65:6: error: redefinition of 'brcmf_debugfs_exit' void brcmf_debugfs_exit(void) ^ In file included from drivers/net/wireless/brcm80211/brcmfmac/bus.h:20:0, from drivers/net/wireless/brcm80211/brcmfmac/debug.c:24: drivers/net/wireless/brcm80211/brcmfmac/debug.h:121:20: note: previous definition of 'brcmf_debugfs_exit' was here static inline void brcmf_debugfs_exit(void) ^ >> drivers/net/wireless/brcm80211/brcmfmac/debug.c:74:5: error: redefinition of >> 'brcmf_debug_attach' int brcmf_debug_attach(struct brcmf_pub *drvr) ^ In file included from drivers/net/wireless/brcm80211/brcmfmac/bus.h:20:0, from drivers/net/wireless/brcm80211/brcmfmac/debug.c:24: drivers/net/wireless/brcm80211/brcmfmac/debug.h:124:19: note: previous definition of 'brcmf_debug_attach' was here static inline int brcmf_debug_attach(struct brcmf_pub *drvr) ^ drivers/net/wireless/brcm80211/brcmfmac/debug.c: In function 'brcmf_debug_attach': drivers/net/wireless/brcm80211/brcmfmac/debug.c:81:6: error: 'struct brcmf_pub' has no member named 'dbgfs_dir' drvr->dbgfs_dir = debugfs_create_dir(dev_name(dev), root_folder); ^ drivers/net/wireless/brcm80211/brcmfmac/debug.c:82:17: error: 'struct brcmf_pub' has no member named 'dbgfs_dir' if (IS_ERR(drvr->dbgfs_dir)) ^ drivers/net/wireless/brcm80211/brcmfmac/debug.c:83:22: error: 'struct brcmf_pub' has no member named 'dbgfs_dir' return PTR_ERR(drvr->dbgfs_dir); ^ drivers/net/wireless/brcm80211/brcmfmac/debug.c: At top level: >> drivers/net/wireless/brcm80211/brcmfmac/debug.c:90:6: error: redefinition of >> 'brcmf_debug_detach' void brcmf_debug_detach(struct brcmf_pub *drvr) ^ In file included from drivers/net/wireless/brcm80211/brcmfmac/bus.h:20:0, from drivers/net/wireless/brcm80211/brcmfmac/debug.c:24: drivers/net/wireless/brcm80211/brcmfmac/debug.h:128:20: note: previous definition of 'brcmf_debug_detach' was here static inline void brcmf_debug_detach(struct brcmf_pub *drvr) ^ drivers/net/wireless/brcm80211/brcmfmac/debug.c: In function 'brcmf_debug_detach': drivers/net/wireless/brcm80211/brcmfmac/debug.c:94:26: error: 'struct brcmf_pub' has no member named 'dbgfs_dir' if (!IS_ERR_OR_NULL(drvr->dbgfs_dir)) ^ drivers/net/wireless/brcm80211/brcmfmac/debug.c:95:32: error: 'struct brcmf_pub' has no member named 'dbgfs_dir' debugfs_remove_recursive(drvr->dbgfs_dir); ^ drivers/net/wireless/brcm80211/brcmfmac/debug.c: In function 'brcmf_debugfs_get_devdir': drivers/net/wireless/brcm80211/brcmfmac/debug.c:100:13: error: 'struct brcmf_pub' has no member named 'dbgfs_dir' return drvr->dbgfs_dir; ^ drivers/net/wireless/brcm80211/brcmfmac/debug.c: At top level: drivers/net/wireless/brcm80211/brcmfmac/debug.c:103:5: error: redefinition of 'brcmf_debugfs_add_entry' int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn, ^ In file included from drivers/net/wireless/brcm80211/brcmfmac/bus.h:20:0, from drivers/net/wireless/brcm80211/brcmfmac/debug.c:24: drivers/net/wireless/brcm80211/brcmfmac/debug.h:132:5: note: previous definition of 'brcmf_debugfs_add_entry' was here int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn, ^ drivers/net/wireless/brcm80211/brcmfmac/debug.c: In function 'brcmf_debugfs_add_entry': drivers/net/wireless/brcm80211/brcmfmac/debug.c:109:10: error: 'struct brcmf_pub' has no member named 'dbgfs_dir' drvr->dbgfs_dir, read_fn); ^ drivers/net/wireless/brcm80211/brcmfmac/debug.c: In function 'brcmf_debugfs_get_devdir': drivers/net/wireless/brcm80211/brcmfmac/debug.c:101:1: warning: control reaches end of non-void function [-Wreturn-type] } ^ vim +/brcmf_debug_attach +74 drivers/net/wireless/brcm80211/brcmfmac/debug.c 59 { 60 root
Re: [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
kbuild test robot writes: > Hi Arend, > > [auto build test ERROR on next-20151008 -- if it's inappropriate base, please > ignore] > > config: x86_64-randconfig-x011-201540 (attached as .config) > reproduce: > # save the attached .config to linux build tree > make ARCH=x86_64 > > All errors (new ones prefixed by >>): > >drivers/net/wireless/brcm80211/brcmfmac/debug.c:58:6: error: redefinition > of 'brcmf_debugfs_init' > void brcmf_debugfs_init(void) > ^ >In file included from drivers/net/wireless/brcm80211/brcmfmac/bus.h:20:0, > from drivers/net/wireless/brcm80211/brcmfmac/debug.c:24: >drivers/net/wireless/brcm80211/brcmfmac/debug.h:118:20: note: previous > definition of 'brcmf_debugfs_init' was here > static inline void brcmf_debugfs_init(void) >^ Arend, are the kbuild errors valid? I would guess they are as wireless-drivers-next should be in linux-next. -- Kalle Valo -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
On 10/12/2015 10:59 AM, Kalle Valo wrote: kbuild test robot writes: Hi Arend, [auto build test ERROR on next-20151008 -- if it's inappropriate base, please ignore] config: x86_64-randconfig-x011-201540 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All errors (new ones prefixed by >>): drivers/net/wireless/brcm80211/brcmfmac/debug.c:58:6: error: redefinition of 'brcmf_debugfs_init' void brcmf_debugfs_init(void) ^ In file included from drivers/net/wireless/brcm80211/brcmfmac/bus.h:20:0, from drivers/net/wireless/brcm80211/brcmfmac/debug.c:24: drivers/net/wireless/brcm80211/brcmfmac/debug.h:118:20: note: previous definition of 'brcmf_debugfs_init' was here static inline void brcmf_debugfs_init(void) ^ Arend, are the kbuild errors valid? I would guess they are as wireless-drivers-next should be in linux-next. Hi Kalle, Actually they are not. I am not sure about the build infrastructure, but the errors above can only occur when CONFIG_BRCMDBG is set, but DEBUG is not. However, that can not happen as we have following line in drivers/net/wireless/brcm80211/Makefile: subdir-ccflags-$(CONFIG_BRCMDBG)+= -DDEBUG Regards, Arend -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
Arend van Spriel writes: > On 10/12/2015 10:59 AM, Kalle Valo wrote: >> kbuild test robot writes: >> >>> Hi Arend, >>> >>> [auto build test ERROR on next-20151008 -- if it's inappropriate base, >>> please ignore] >>> >>> config: x86_64-randconfig-x011-201540 (attached as .config) >>> reproduce: >>> # save the attached .config to linux build tree >>> make ARCH=x86_64 >>> >>> All errors (new ones prefixed by >>): >>> >>> drivers/net/wireless/brcm80211/brcmfmac/debug.c:58:6: error: >>> redefinition of 'brcmf_debugfs_init' >>> void brcmf_debugfs_init(void) >>> ^ >>> In file included from >>> drivers/net/wireless/brcm80211/brcmfmac/bus.h:20:0, >>> from >>> drivers/net/wireless/brcm80211/brcmfmac/debug.c:24: >>> drivers/net/wireless/brcm80211/brcmfmac/debug.h:118:20: note: previous >>> definition of 'brcmf_debugfs_init' was here >>> static inline void brcmf_debugfs_init(void) >>> ^ >> >> Arend, are the kbuild errors valid? I would guess they are as >> wireless-drivers-next should be in linux-next. > > Actually they are not. I am not sure about the build infrastructure, > but the errors above can only occur when CONFIG_BRCMDBG is set, but > DEBUG is not. However, that can not happen as we have following line > in drivers/net/wireless/brcm80211/Makefile: > > subdir-ccflags-$(CONFIG_BRCMDBG) += -DDEBUG I didn't check the details but I'm still not convinced :) In my opinion the code should always compile, with and without -DDEBUG. Anyways, I pushed this script to the pending branch to get kbuild test this patch once again. -- Kalle Valo -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
On 10/14/2015 01:01 PM, Kalle Valo wrote: Arend van Spriel writes: On 10/12/2015 10:59 AM, Kalle Valo wrote: kbuild test robot writes: Hi Arend, [auto build test ERROR on next-20151008 -- if it's inappropriate base, please ignore] config: x86_64-randconfig-x011-201540 (attached as .config) reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All errors (new ones prefixed by >>): drivers/net/wireless/brcm80211/brcmfmac/debug.c:58:6: error: redefinition of 'brcmf_debugfs_init' void brcmf_debugfs_init(void) ^ In file included from drivers/net/wireless/brcm80211/brcmfmac/bus.h:20:0, from drivers/net/wireless/brcm80211/brcmfmac/debug.c:24: drivers/net/wireless/brcm80211/brcmfmac/debug.h:118:20: note: previous definition of 'brcmf_debugfs_init' was here static inline void brcmf_debugfs_init(void) ^ Arend, are the kbuild errors valid? I would guess they are as wireless-drivers-next should be in linux-next. Actually they are not. I am not sure about the build infrastructure, but the errors above can only occur when CONFIG_BRCMDBG is set, but DEBUG is not. However, that can not happen as we have following line in drivers/net/wireless/brcm80211/Makefile: subdir-ccflags-$(CONFIG_BRCMDBG)+= -DDEBUG I didn't check the details but I'm still not convinced :) In my opinion the code should always compile, with and without -DDEBUG. Anyways, I pushed this script to the pending branch to get kbuild test this patch once again. Ok, Kalle Let me try to be a bit more convincing ;-) I checked out linux-next/master, taken the provided .config and ran: $ make prepare $ make M=scripts $ make M=drivers/net/wireless/brcm80211 WARNING: Symbol version dump ./Module.symvers is missing; modules will have no dependencies and modversions. CC drivers/net/wireless/brcm80211/brcmfmac/cfg80211.o CC drivers/net/wireless/brcm80211/brcmfmac/chip.o CC drivers/net/wireless/brcm80211/brcmfmac/fwil.o CC drivers/net/wireless/brcm80211/brcmfmac/fweh.o CC drivers/net/wireless/brcm80211/brcmfmac/fwsignal.o CC drivers/net/wireless/brcm80211/brcmfmac/p2p.o CC drivers/net/wireless/brcm80211/brcmfmac/proto.o CC drivers/net/wireless/brcm80211/brcmfmac/common.o CC drivers/net/wireless/brcm80211/brcmfmac/core.o CC drivers/net/wireless/brcm80211/brcmfmac/firmware.o CC drivers/net/wireless/brcm80211/brcmfmac/feature.o CC drivers/net/wireless/brcm80211/brcmfmac/btcoex.o CC drivers/net/wireless/brcm80211/brcmfmac/vendor.o CC drivers/net/wireless/brcm80211/brcmfmac/bcdc.o CC drivers/net/wireless/brcm80211/brcmfmac/sdio.o CC drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.o CC drivers/net/wireless/brcm80211/brcmfmac/debug.o CC drivers/net/wireless/brcm80211/brcmfmac/tracepoint.o CC drivers/net/wireless/brcm80211/brcmfmac/of.o LD drivers/net/wireless/brcm80211/brcmfmac/brcmfmac.o LD drivers/net/wireless/brcm80211/brcmfmac/built-in.o CC drivers/net/wireless/brcm80211/brcmutil/utils.o CC drivers/net/wireless/brcm80211/brcmutil/d11.o LD drivers/net/wireless/brcm80211/brcmutil/brcmutil.o LD drivers/net/wireless/brcm80211/brcmutil/built-in.o LD drivers/net/wireless/brcm80211/built-in.o Building modules, stage 2. MODPOST 0 modules No compile issues. Regards, Arend -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
Arend van Spriel writes: > On 10/14/2015 01:01 PM, Kalle Valo wrote: >> Arend van Spriel writes: >> >>> On 10/12/2015 10:59 AM, Kalle Valo wrote: >>> Arend, are the kbuild errors valid? I would guess they are as wireless-drivers-next should be in linux-next. >>> >>> Actually they are not. I am not sure about the build infrastructure, >>> but the errors above can only occur when CONFIG_BRCMDBG is set, but >>> DEBUG is not. However, that can not happen as we have following line >>> in drivers/net/wireless/brcm80211/Makefile: >>> >>> subdir-ccflags-$(CONFIG_BRCMDBG)+= -DDEBUG >> >> I didn't check the details but I'm still not convinced :) In my opinion >> the code should always compile, with and without -DDEBUG. Anyways, I >> pushed this script to the pending branch to get kbuild test this patch >> once again. > > Ok, Kalle > > Let me try to be a bit more convincing ;-) > > I checked out linux-next/master, taken the provided .config and ran: > > $ make prepare > $ make M=scripts > $ make M=drivers/net/wireless/brcm80211 Thanks, I'm convinced now :) But the kbuild found this warning (I guess you also got an email about that): drivers/net/wireless/brcm80211/brcmfmac/sdio.c:3562:2: warning: format '%zu' expects argument of type 'size_t', but argument 5 has type 'unsigned int' [-Wformat=] Can you fix that and respin, please? -- Kalle Valo -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html