All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump
@ 2015-10-08 18:33 Arend van Spriel
  2015-10-08 18:33 ` [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem Arend van Spriel
                   ` (10 more replies)
  0 siblings, 11 replies; 19+ messages in thread
From: Arend van Spriel @ 2015-10-08 18:33 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Arend van Spriel

This series provides following:

* using netdev carrier state.
* add and rework some cfg80211 callbacks mainly for AP mode.
* use devcoredump when triggered by firmware event.

The series is intended for 4.4 kernel and applies to the
master branch of wireless-drivers-next repository.

Arend van Spriel (2):
  brcmfmac: expose device memory to devcoredump subsystem
  brcmfmac: remove conversational comment

Franky Lin (1):
  brcmfmac: rename firmware_path to alternative_fw_path

Hante Meuleman (8):
  brcmfmac: Fix race condition between USB probe/load and disconnect.
  brcmfmac: Rework p2p attach, use single method for p2p dev creation.
  brcmfmac: Fix station info rate information.
  brcmfmac: Add RSSI information to get_station.
  brcmfmac: Add dump_station support to cfg80221 ops.
  brcmfmac: Move brcmf_c_preinit_dcmds prototype to correct file.
  brcmfmac: Remove unused state AP creating.
  brcmfmac: Properly set carrier state of netdev.

 drivers/net/wireless/brcm80211/Kconfig             |  1 +
 drivers/net/wireless/brcm80211/brcmfmac/bus.h      | 21 ++++++
 drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | 86 ++++++++++++++++++++--
 drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h |  3 +-
 drivers/net/wireless/brcm80211/brcmfmac/common.h   |  3 +
 drivers/net/wireless/brcm80211/brcmfmac/core.c     | 65 ++++++++--------
 drivers/net/wireless/brcm80211/brcmfmac/core.h     | 11 +--
 drivers/net/wireless/brcm80211/brcmfmac/debug.c    | 42 ++++++++++-
 drivers/net/wireless/brcm80211/brcmfmac/debug.h    |  8 +-
 drivers/net/wireless/brcm80211/brcmfmac/firmware.c |  2 +-
 drivers/net/wireless/brcm80211/brcmfmac/fweh.c     |  3 +-
 drivers/net/wireless/brcm80211/brcmfmac/fwil.h     |  1 +
 .../net/wireless/brcm80211/brcmfmac/fwil_types.h   | 13 ++++
 drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c   |  3 -
 drivers/net/wireless/brcm80211/brcmfmac/p2p.c      | 71 +++---------------
 drivers/net/wireless/brcm80211/brcmfmac/pcie.c     | 65 ++++++++++++++++
 drivers/net/wireless/brcm80211/brcmfmac/sdio.c     | 49 +++++++++++-
 drivers/net/wireless/brcm80211/brcmfmac/usb.c      | 29 +++++++-
 18 files changed, 355 insertions(+), 121 deletions(-)

-- 
1.9.1


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
  2015-10-08 18:33 [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump Arend van Spriel
@ 2015-10-08 18:33 ` Arend van Spriel
  2015-10-08 18:59   ` kbuild test robot
  2015-10-21  7:57   ` [01/11] " Kalle Valo
  2015-10-08 18:33 ` [PATCH 02/11] brcmfmac: Fix race condition between USB probe/load and disconnect Arend van Spriel
                   ` (9 subsequent siblings)
  10 siblings, 2 replies; 19+ messages in thread
From: Arend van Spriel @ 2015-10-08 18:33 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Arend van Spriel

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 <meuleman@broadcom.com>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 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 <linux/debugfs.h>
 #include <linux/netdevice.h>
 #include <linux/module.h>
+#include <linux/devcoredump.h>
 
 #include <brcmu_wifi.h>
 #include <brcmu_utils.h>
 #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,
+					   const struct brcmf_event_msg *evtmsg,
+					   void *data)
+{
+	brcmf_dbg(TRACE, "enter: idx=%d\n", ifp->bssidx);
+
+	return brcmf_debug_create_memdump(ifp->drvr->bus_if, data,
+					  evtmsg->datalen);
+}
+
 void brcmf_debugfs_init(void)
 {
 	root_folder = debugfs_create_dir(KBUILD_MODNAME, NULL);
@@ -41,7 +71,7 @@ void brcmf_debugfs_exit(void)
 	root_folder = NULL;
 }
 
-int brcmf_debugfs_attach(struct brcmf_pub *drvr)
+int brcmf_debug_attach(struct brcmf_pub *drvr)
 {
 	struct device *dev = drvr->bus_if->dev;
 
@@ -49,12 +79,18 @@ int brcmf_debugfs_attach(struct brcmf_pub *drvr)
 		return -ENODEV;
 
 	drvr->dbgfs_dir = debugfs_create_dir(dev_name(dev), root_folder);
+	if (IS_ERR(drvr->dbgfs_dir))
+		return PTR_ERR(drvr->dbgfs_dir);
 
-	return PTR_ERR_OR_ZERO(drvr->dbgfs_dir);
+
+	return brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
+				   brcmf_debug_psm_watchdog_notify);
 }
 
-void brcmf_debugfs_detach(struct brcmf_pub *drvr)
+void brcmf_debug_detach(struct brcmf_pub *drvr)
 {
+	brcmf_fweh_unregister(drvr, BRCMF_E_PSM_WATCHDOG);
+
 	if (!IS_ERR_OR_NULL(drvr->dbgfs_dir))
 		debugfs_remove_recursive(drvr->dbgfs_dir);
 }
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/debug.h b/drivers/net/wireless/brcm80211/brcmfmac/debug.h
index 48648ca..d0d9676 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/debug.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/debug.h
@@ -109,8 +109,8 @@ struct brcmf_pub;
 #ifdef DEBUG
 void brcmf_debugfs_init(void);
 void brcmf_debugfs_exit(void);
-int brcmf_debugfs_attach(struct brcmf_pub *drvr);
-void brcmf_debugfs_detach(struct brcmf_pub *drvr);
+int brcmf_debug_attach(struct brcmf_pub *drvr);
+void brcmf_debug_detach(struct brcmf_pub *drvr);
 struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr);
 int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn,
 			    int (*read_fn)(struct seq_file *seq, void *data));
@@ -121,11 +121,11 @@ static inline void brcmf_debugfs_init(void)
 static inline void brcmf_debugfs_exit(void)
 {
 }
-static inline int brcmf_debugfs_attach(struct brcmf_pub *drvr)
+static inline int brcmf_debug_attach(struct brcmf_pub *drvr)
 {
 	return 0;
 }
-static inline void brcmf_debugfs_detach(struct brcmf_pub *drvr)
+static inline void brcmf_debug_detach(struct brcmf_pub *drvr)
 {
 }
 static inline
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
index 30baf35..36b386a 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
@@ -448,6 +448,47 @@ brcmf_pcie_copy_mem_todev(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
 }
 
 
+static void
+brcmf_pcie_copy_dev_tomem(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
+			  void *dstaddr, u32 len)
+{
+	void __iomem *address = devinfo->tcm + mem_offset;
+	__le32 *dst32;
+	__le16 *dst16;
+	u8 *dst8;
+
+	if (((ulong)address & 4) || ((ulong)dstaddr & 4) || (len & 4)) {
+		if (((ulong)address & 2) || ((ulong)dstaddr & 2) || (len & 2)) {
+			dst8 = (u8 *)dstaddr;
+			while (len) {
+				*dst8 = ioread8(address);
+				address++;
+				dst8++;
+				len--;
+			}
+		} else {
+			len = len / 2;
+			dst16 = (__le16 *)dstaddr;
+			while (len) {
+				*dst16 = cpu_to_le16(ioread16(address));
+				address += 2;
+				dst16++;
+				len--;
+			}
+		}
+	} else {
+		len = len / 4;
+		dst32 = (__le32 *)dstaddr;
+		while (len) {
+			*dst32 = cpu_to_le32(ioread32(address));
+			address += 4;
+			dst32++;
+			len--;
+		}
+	}
+}
+
+
 #define WRITECC32(devinfo, reg, value) brcmf_pcie_write_reg32(devinfo, \
 		CHIPCREGOFFS(reg), value)
 
@@ -1352,12 +1393,36 @@ static void brcmf_pcie_wowl_config(struct device *dev, bool enabled)
 }
 
 
+static size_t brcmf_pcie_get_ramsize(struct device *dev)
+{
+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+	struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
+	struct brcmf_pciedev_info *devinfo = buspub->devinfo;
+
+	return devinfo->ci->ramsize - devinfo->ci->srsize;
+}
+
+
+static int brcmf_pcie_get_memdump(struct device *dev, void *data, size_t len)
+{
+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+	struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
+	struct brcmf_pciedev_info *devinfo = buspub->devinfo;
+
+	brcmf_dbg(PCIE, "dump at 0x%08X: len=%zu\n", devinfo->ci->rambase, len);
+	brcmf_pcie_copy_dev_tomem(devinfo, devinfo->ci->rambase, data, len);
+	return 0;
+}
+
+
 static struct brcmf_bus_ops brcmf_pcie_bus_ops = {
 	.txdata = brcmf_pcie_tx,
 	.stop = brcmf_pcie_down,
 	.txctl = brcmf_pcie_tx_ctlpkt,
 	.rxctl = brcmf_pcie_rx_ctlpkt,
 	.wowl_config = brcmf_pcie_wowl_config,
+	.get_ramsize = brcmf_pcie_get_ramsize,
+	.get_memdump = brcmf_pcie_get_memdump,
 };
 
 
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
index 7f574f2..7e74ac3 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
@@ -3539,6 +3539,51 @@ done:
 	return err;
 }
 
+static size_t brcmf_sdio_bus_get_ramsize(struct device *dev)
+{
+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
+	struct brcmf_sdio *bus = sdiodev->bus;
+
+	return bus->ci->ramsize - bus->ci->srsize;
+}
+
+static int brcmf_sdio_bus_get_memdump(struct device *dev, void *data,
+				      size_t mem_size)
+{
+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
+	struct brcmf_sdio *bus = sdiodev->bus;
+	int err;
+	int address;
+	int offset;
+	int len;
+
+	brcmf_dbg(INFO, "dump at 0x%08x: size=%zu\n", bus->ci->rambase,
+		  mem_size);
+
+	address = bus->ci->rambase;
+	offset = err = 0;
+	sdio_claim_host(sdiodev->func[1]);
+	while (offset < mem_size) {
+		len = ((offset + MEMBLOCK) < mem_size) ? MEMBLOCK :
+		      mem_size - offset;
+		err = brcmf_sdiod_ramrw(sdiodev, false, address, data, len);
+		if (err) {
+			brcmf_err("error %d on reading %d membytes at 0x%08x\n",
+				  err, len, address);
+			goto done;
+		}
+		data += len;
+		offset += len;
+		address += len;
+	}
+
+done:
+	sdio_release_host(sdiodev->func[1]);
+	return err;
+}
+
 void brcmf_sdio_trigger_dpc(struct brcmf_sdio *bus)
 {
 	if (!bus->dpc_triggered) {
@@ -3987,7 +4032,9 @@ static struct brcmf_bus_ops brcmf_sdio_bus_ops = {
 	.txctl = brcmf_sdio_bus_txctl,
 	.rxctl = brcmf_sdio_bus_rxctl,
 	.gettxq = brcmf_sdio_bus_gettxq,
-	.wowl_config = brcmf_sdio_wowl_config
+	.wowl_config = brcmf_sdio_wowl_config,
+	.get_ramsize = brcmf_sdio_bus_get_ramsize,
+	.get_memdump = brcmf_sdio_bus_get_memdump,
 };
 
 static void brcmf_sdio_firmware_callback(struct device *dev,
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 02/11] brcmfmac: Fix race condition between USB probe/load and disconnect.
  2015-10-08 18:33 [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump Arend van Spriel
  2015-10-08 18:33 ` [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem Arend van Spriel
@ 2015-10-08 18:33 ` Arend van Spriel
  2015-10-08 18:33 ` [PATCH 03/11] brcmfmac: rename firmware_path to alternative_fw_path Arend van Spriel
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Arend van Spriel @ 2015-10-08 18:33 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Hante Meuleman, Arend van Spriel

From: Hante Meuleman <meuleman@broadcom.com>

When a USB device gets disconnected due to for example removal
then it is possible that it is still in the loading phase due to
the asynchronous load routines. These routines can then possible
access memory which has been freed. Fix this by mutex locking the
device init phase.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/usb.c | 29 ++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
index daba86d..689e64d 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
@@ -144,6 +144,7 @@ struct brcmf_usbdev_info {
 
 	struct usb_device *usbdev;
 	struct device *dev;
+	struct mutex dev_init_lock;
 
 	int ctl_in_pipe, ctl_out_pipe;
 	struct urb *ctl_urb; /* URB for control endpoint */
@@ -1204,6 +1205,8 @@ static void brcmf_usb_probe_phase2(struct device *dev,
 	int ret;
 
 	brcmf_dbg(USB, "Start fw downloading\n");
+
+	devinfo = bus->bus_priv.usb->devinfo;
 	ret = check_file(fw->data);
 	if (ret < 0) {
 		brcmf_err("invalid firmware\n");
@@ -1211,7 +1214,6 @@ static void brcmf_usb_probe_phase2(struct device *dev,
 		goto error;
 	}
 
-	devinfo = bus->bus_priv.usb->devinfo;
 	devinfo->image = fw->data;
 	devinfo->image_len = fw->size;
 
@@ -1224,9 +1226,11 @@ static void brcmf_usb_probe_phase2(struct device *dev,
 	if (ret)
 		goto error;
 
+	mutex_unlock(&devinfo->dev_init_lock);
 	return;
 error:
 	brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), ret);
+	mutex_unlock(&devinfo->dev_init_lock);
 	device_release_driver(dev);
 }
 
@@ -1264,6 +1268,7 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
 		if (ret)
 			goto fail;
 		/* we are done */
+		mutex_unlock(&devinfo->dev_init_lock);
 		return 0;
 	}
 	bus->chip = bus_pub->devid;
@@ -1317,6 +1322,12 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 
 	devinfo->usbdev = usb;
 	devinfo->dev = &usb->dev;
+	/* Take an init lock, to protect for disconnect while still loading.
+	 * Necessary because of the asynchronous firmware load construction
+	 */
+	mutex_init(&devinfo->dev_init_lock);
+	mutex_lock(&devinfo->dev_init_lock);
+
 	usb_set_intfdata(intf, devinfo);
 
 	/* Check that the device supports only one configuration */
@@ -1391,6 +1402,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 	return 0;
 
 fail:
+	mutex_unlock(&devinfo->dev_init_lock);
 	kfree(devinfo);
 	usb_set_intfdata(intf, NULL);
 	return ret;
@@ -1403,8 +1415,19 @@ brcmf_usb_disconnect(struct usb_interface *intf)
 
 	brcmf_dbg(USB, "Enter\n");
 	devinfo = (struct brcmf_usbdev_info *)usb_get_intfdata(intf);
-	brcmf_usb_disconnect_cb(devinfo);
-	kfree(devinfo);
+
+	if (devinfo) {
+		mutex_lock(&devinfo->dev_init_lock);
+		/* Make sure that devinfo still exists. Firmware probe routines
+		 * may have released the device and cleared the intfdata.
+		 */
+		if (!usb_get_intfdata(intf))
+			goto done;
+
+		brcmf_usb_disconnect_cb(devinfo);
+		kfree(devinfo);
+	}
+done:
 	brcmf_dbg(USB, "Exit\n");
 }
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 03/11] brcmfmac: rename firmware_path to alternative_fw_path
  2015-10-08 18:33 [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump Arend van Spriel
  2015-10-08 18:33 ` [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem Arend van Spriel
  2015-10-08 18:33 ` [PATCH 02/11] brcmfmac: Fix race condition between USB probe/load and disconnect Arend van Spriel
@ 2015-10-08 18:33 ` Arend van Spriel
  2015-10-08 18:33 ` [PATCH 04/11] brcmfmac: remove conversational comment Arend van Spriel
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Arend van Spriel @ 2015-10-08 18:33 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Franky Lin, Arend van Spriel

From: Franky Lin <frankyl@broadcom.com>

In brcmfmac the module parameter "firmware_path" is used as an
alternative relative path under the search path used by firmware_class
or ueventhelper. Rename the parameter to alternative_fw_path to avoid
confusion.

Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/firmware.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
index 971920f..4248f3c 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
@@ -29,7 +29,7 @@
 #define BRCMF_FW_NVRAM_PCIEDEV_LEN		10	/* pcie/1/4/ + \0 */
 
 char brcmf_firmware_path[BRCMF_FW_PATH_LEN];
-module_param_string(firmware_path, brcmf_firmware_path,
+module_param_string(alternative_fw_path, brcmf_firmware_path,
 		    BRCMF_FW_PATH_LEN, 0440);
 
 enum nvram_parser_state {
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 04/11] brcmfmac: remove conversational comment
  2015-10-08 18:33 [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump Arend van Spriel
                   ` (2 preceding siblings ...)
  2015-10-08 18:33 ` [PATCH 03/11] brcmfmac: rename firmware_path to alternative_fw_path Arend van Spriel
@ 2015-10-08 18:33 ` Arend van Spriel
  2015-10-08 18:33 ` [PATCH 05/11] brcmfmac: Rework p2p attach, use single method for p2p dev creation Arend van Spriel
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Arend van Spriel @ 2015-10-08 18:33 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Arend van Spriel

Removing a comment that was only useful during the review of
the change that introduced it and which should never have been
submitted.

Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
index 7eff9de..44e618f 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
@@ -873,9 +873,6 @@ brcmf_msgbuf_process_txstatus(struct brcmf_msgbuf *msgbuf, void *buf)
 	commonring = msgbuf->flowrings[flowid];
 	atomic_dec(&commonring->outstanding_tx);
 
-	/* Hante: i believe this was a bug as tx_status->msg.ifidx was used
-	 * in brcmf_txfinalize as index in drvr->iflist. Can you confirm/deny?
-	 */
 	brcmf_txfinalize(brcmf_get_ifp(msgbuf->drvr, tx_status->msg.ifidx),
 			 skb, true);
 }
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 05/11] brcmfmac: Rework p2p attach, use single method for p2p dev creation.
  2015-10-08 18:33 [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump Arend van Spriel
                   ` (3 preceding siblings ...)
  2015-10-08 18:33 ` [PATCH 04/11] brcmfmac: remove conversational comment Arend van Spriel
@ 2015-10-08 18:33 ` Arend van Spriel
  2015-10-08 18:33 ` [PATCH 06/11] brcmfmac: Fix station info rate information Arend van Spriel
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Arend van Spriel @ 2015-10-08 18:33 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Hante Meuleman, Arend van Spriel

From: Hante Meuleman <meuleman@broadcom.com>

When module param p2pon is used a p2p device is created at init.
This patch reworks how this is done by using the same method as
for a dynamically (by user space) created p2p device.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | 18 ++++++
 drivers/net/wireless/brcm80211/brcmfmac/core.c     | 33 ++++------
 drivers/net/wireless/brcm80211/brcmfmac/fweh.c     |  3 +-
 drivers/net/wireless/brcm80211/brcmfmac/p2p.c      | 71 +++-------------------
 4 files changed, 40 insertions(+), 85 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
index 891f4ed..2ee57c0 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
@@ -6238,6 +6238,17 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
 		else
 			*cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
 	}
+	/* p2p might require that "if-events" get processed by fweh. So
+	 * activate the already registered event handlers now and activate
+	 * the rest when initialization has completed. drvr->config needs to
+	 * be assigned before activating events.
+	 */
+	drvr->config = cfg;
+	err = brcmf_fweh_activate_events(ifp);
+	if (err) {
+		brcmf_err("FWEH activation failed (%d)\n", err);
+		goto wiphy_unreg_out;
+	}
 
 	err = brcmf_p2p_attach(cfg, p2pdev_forced);
 	if (err) {
@@ -6260,6 +6271,13 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
 				    brcmf_notify_tdls_peer_event);
 	}
 
+	/* (re-) activate FWEH event handling */
+	err = brcmf_fweh_activate_events(ifp);
+	if (err) {
+		brcmf_err("FWEH activation failed (%d)\n", err);
+		goto wiphy_unreg_out;
+	}
+
 	return cfg;
 
 wiphy_unreg_out:
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/core.c b/drivers/net/wireless/brcm80211/brcmfmac/core.c
index a1d39b196..d3212bf 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
@@ -828,8 +828,8 @@ struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bssidx, s32 ifidx,
 	} else {
 		brcmf_dbg(INFO, "allocate netdev interface\n");
 		/* Allocate netdev, including space for private structure */
-		ndev = alloc_netdev(sizeof(*ifp), name, NET_NAME_UNKNOWN,
-				    ether_setup);
+		ndev = alloc_netdev(sizeof(*ifp), is_p2pdev ? "p2p%d" : name,
+				    NET_NAME_UNKNOWN, ether_setup);
 		if (!ndev)
 			return ERR_PTR(-ENOMEM);
 
@@ -1021,12 +1021,7 @@ int brcmf_bus_start(struct device *dev)
 	if (IS_ERR(ifp))
 		return PTR_ERR(ifp);
 
-	if (brcmf_p2p_enable)
-		p2p_ifp = brcmf_add_if(drvr, 1, 0, false, "p2p%d", NULL);
-	else
-		p2p_ifp = NULL;
-	if (IS_ERR(p2p_ifp))
-		p2p_ifp = NULL;
+	p2p_ifp = NULL;
 
 	/* signal bus ready */
 	brcmf_bus_change_state(bus_if, BRCMF_BUS_UP);
@@ -1060,11 +1055,13 @@ int brcmf_bus_start(struct device *dev)
 		goto fail;
 	}
 
-	ret = brcmf_fweh_activate_events(ifp);
-	if (ret < 0)
-		goto fail;
-
 	ret = brcmf_net_attach(ifp, false);
+
+	if ((!ret) && (brcmf_p2p_enable)) {
+		p2p_ifp = drvr->iflist[1];
+		if (p2p_ifp)
+			ret = brcmf_net_p2p_attach(p2p_ifp);
+	}
 fail:
 	if (ret < 0) {
 		brcmf_err("failed: %d\n", ret);
@@ -1076,20 +1073,12 @@ fail:
 			brcmf_fws_del_interface(ifp);
 			brcmf_fws_deinit(drvr);
 		}
-		if (drvr->iflist[0]) {
+		if (ifp)
 			brcmf_net_detach(ifp->ndev);
-			drvr->iflist[0] = NULL;
-		}
-		if (p2p_ifp) {
+		if (p2p_ifp)
 			brcmf_net_detach(p2p_ifp->ndev);
-			drvr->iflist[1] = NULL;
-		}
 		return ret;
 	}
-	if ((brcmf_p2p_enable) && (p2p_ifp))
-		if (brcmf_net_p2p_attach(p2p_ifp) < 0)
-			brcmf_p2p_enable = 0;
-
 	return 0;
 }
 
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
index 383d6fa..3878b6f 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
@@ -213,7 +213,8 @@ static void brcmf_fweh_handle_if_event(struct brcmf_pub *drvr,
 				   is_p2pdev, emsg->ifname, emsg->addr);
 		if (IS_ERR(ifp))
 			return;
-		brcmf_fws_add_interface(ifp);
+		if (!is_p2pdev)
+			brcmf_fws_add_interface(ifp);
 		if (!drvr->fweh.evt_handler[BRCMF_E_IF])
 			if (brcmf_net_attach(ifp, false) < 0)
 				return;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
index 37a8c352..d224b3d 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
@@ -2353,83 +2353,30 @@ void brcmf_p2p_stop_device(struct wiphy *wiphy, struct wireless_dev *wdev)
  * brcmf_p2p_attach() - attach for P2P.
  *
  * @cfg: driver private data for cfg80211 interface.
+ * @p2pdev_forced: create p2p device interface at attach.
  */
 s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg, bool p2pdev_forced)
 {
-	struct brcmf_if *pri_ifp;
-	struct brcmf_if *p2p_ifp;
-	struct brcmf_cfg80211_vif *p2p_vif;
 	struct brcmf_p2p_info *p2p;
-	struct brcmf_pub *drvr;
-	s32 bssidx;
+	struct brcmf_if *pri_ifp;
 	s32 err = 0;
+	void *err_ptr;
 
 	p2p = &cfg->p2p;
 	p2p->cfg = cfg;
 
-	drvr = cfg->pub;
-
-	pri_ifp = brcmf_get_ifp(drvr, 0);
+	pri_ifp = brcmf_get_ifp(cfg->pub, 0);
 	p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = pri_ifp->vif;
 
 	if (p2pdev_forced) {
-		p2p_ifp = drvr->iflist[1];
+		err_ptr = brcmf_p2p_create_p2pdev(p2p, NULL, NULL);
+		if (IS_ERR(err_ptr)) {
+			brcmf_err("P2P device creation failed.\n");
+			err = PTR_ERR(err_ptr);
+		}
 	} else {
-		p2p_ifp = NULL;
 		p2p->p2pdev_dynamically = true;
 	}
-	if (p2p_ifp) {
-		p2p_vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_P2P_DEVICE,
-					  false);
-		if (IS_ERR(p2p_vif)) {
-			brcmf_err("could not create discovery vif\n");
-			err = -ENOMEM;
-			goto exit;
-		}
-
-		p2p_vif->ifp = p2p_ifp;
-		p2p_ifp->vif = p2p_vif;
-		p2p_vif->wdev.netdev = p2p_ifp->ndev;
-		p2p_ifp->ndev->ieee80211_ptr = &p2p_vif->wdev;
-		SET_NETDEV_DEV(p2p_ifp->ndev, wiphy_dev(cfg->wiphy));
-
-		p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = p2p_vif;
-
-		brcmf_p2p_generate_bss_mac(p2p, NULL);
-		memcpy(p2p_ifp->mac_addr, p2p->dev_addr, ETH_ALEN);
-		brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr);
-
-		brcmf_fweh_p2pdev_setup(pri_ifp, true);
-
-		/* Initialize P2P Discovery in the firmware */
-		err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);
-		if (err < 0) {
-			brcmf_err("set p2p_disc error\n");
-			brcmf_free_vif(p2p_vif);
-			goto exit;
-		}
-		/* obtain bsscfg index for P2P discovery */
-		err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx);
-		if (err < 0) {
-			brcmf_err("retrieving discover bsscfg index failed\n");
-			brcmf_free_vif(p2p_vif);
-			goto exit;
-		}
-		/* Verify that firmware uses same bssidx as driver !! */
-		if (p2p_ifp->bssidx != bssidx) {
-			brcmf_err("Incorrect bssidx=%d, compared to p2p_ifp->bssidx=%d\n",
-				  bssidx, p2p_ifp->bssidx);
-			brcmf_free_vif(p2p_vif);
-			goto exit;
-		}
-
-		init_completion(&p2p->send_af_done);
-		INIT_WORK(&p2p->afx_hdl.afx_work, brcmf_p2p_afx_handler);
-		init_completion(&p2p->afx_hdl.act_frm_scan);
-		init_completion(&p2p->wait_next_af);
-exit:
-		brcmf_fweh_p2pdev_setup(pri_ifp, false);
-	}
 	return err;
 }
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 06/11] brcmfmac: Fix station info rate information.
  2015-10-08 18:33 [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump Arend van Spriel
                   ` (4 preceding siblings ...)
  2015-10-08 18:33 ` [PATCH 05/11] brcmfmac: Rework p2p attach, use single method for p2p dev creation Arend van Spriel
@ 2015-10-08 18:33 ` Arend van Spriel
  2015-10-08 18:33 ` [PATCH 07/11] brcmfmac: Add RSSI information to get_station Arend van Spriel
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Arend van Spriel @ 2015-10-08 18:33 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Hante Meuleman, Arend van Spriel

From: Hante Meuleman <meuleman@broadcom.com>

Txrate and rxrate in get_station got assigned first with value
in kbps and then divided by 100 to get it in 100kbps unit. The
problem with that is that type of rate is u16 which resulted
in incorrect values for high data rate values.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
index 2ee57c0..73eddad 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
@@ -2478,13 +2478,13 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
 		sinfo->rx_packets += le32_to_cpu(sta_info_le.rx_mcast_pkts);
 		if (sinfo->tx_packets) {
 			sinfo->filled |= BIT(NL80211_STA_INFO_TX_BITRATE);
-			sinfo->txrate.legacy = le32_to_cpu(sta_info_le.tx_rate);
-			sinfo->txrate.legacy /= 100;
+			sinfo->txrate.legacy =
+				le32_to_cpu(sta_info_le.tx_rate) / 100;
 		}
 		if (sinfo->rx_packets) {
 			sinfo->filled |= BIT(NL80211_STA_INFO_RX_BITRATE);
-			sinfo->rxrate.legacy = le32_to_cpu(sta_info_le.rx_rate);
-			sinfo->rxrate.legacy /= 100;
+			sinfo->rxrate.legacy =
+				le32_to_cpu(sta_info_le.rx_rate) / 100;
 		}
 		if (le16_to_cpu(sta_info_le.ver) >= 4) {
 			sinfo->filled |= BIT(NL80211_STA_INFO_TX_BYTES);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 07/11] brcmfmac: Add RSSI information to get_station.
  2015-10-08 18:33 [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump Arend van Spriel
                   ` (5 preceding siblings ...)
  2015-10-08 18:33 ` [PATCH 06/11] brcmfmac: Fix station info rate information Arend van Spriel
@ 2015-10-08 18:33 ` Arend van Spriel
  2015-10-08 18:33 ` [PATCH 08/11] brcmfmac: Add dump_station support to cfg80221 ops Arend van Spriel
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Arend van Spriel @ 2015-10-08 18:33 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Hante Meuleman, Arend van Spriel

From: Hante Meuleman <meuleman@broadcom.com>

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | 23 ++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
index 73eddad..ca9d239 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
@@ -2432,6 +2432,9 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
 	struct brcmf_sta_info_le sta_info_le;
 	u32 sta_flags;
 	u32 is_tdls_peer;
+	s32 total_rssi;
+	s32 count_rssi;
+	u32 i;
 
 	brcmf_dbg(TRACE, "Enter, MAC %pM\n", mac);
 	if (!check_vif_up(ifp->vif))
@@ -2492,6 +2495,26 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
 			sinfo->filled |= BIT(NL80211_STA_INFO_RX_BYTES);
 			sinfo->rx_bytes = le64_to_cpu(sta_info_le.rx_tot_bytes);
 		}
+		total_rssi = 0;
+		count_rssi = 0;
+		for (i = 0; i < BRCMF_ANT_MAX; i++) {
+			if (sta_info_le.rssi[i]) {
+				sinfo->chain_signal_avg[count_rssi] =
+					sta_info_le.rssi[i];
+				sinfo->chain_signal[count_rssi] =
+					sta_info_le.rssi[i];
+				total_rssi += sta_info_le.rssi[i];
+				count_rssi++;
+			}
+		}
+		if (count_rssi) {
+			sinfo->filled |= BIT(NL80211_STA_INFO_CHAIN_SIGNAL);
+			sinfo->chains = count_rssi;
+
+			sinfo->filled |= BIT(NL80211_STA_INFO_SIGNAL);
+			total_rssi /= count_rssi;
+			sinfo->signal = total_rssi;
+		}
 	}
 done:
 	brcmf_dbg(TRACE, "Exit\n");
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 08/11] brcmfmac: Add dump_station support to cfg80221 ops.
  2015-10-08 18:33 [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump Arend van Spriel
                   ` (6 preceding siblings ...)
  2015-10-08 18:33 ` [PATCH 07/11] brcmfmac: Add RSSI information to get_station Arend van Spriel
@ 2015-10-08 18:33 ` Arend van Spriel
  2015-10-08 18:33 ` [PATCH 09/11] brcmfmac: Move brcmf_c_preinit_dcmds prototype to correct file Arend van Spriel
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 19+ messages in thread
From: Arend van Spriel @ 2015-10-08 18:33 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Hante Meuleman, Arend van Spriel

From: Hante Meuleman <meuleman@broadcom.com>

With this feature it becomes possible to request a station
assoc list.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | 30 ++++++++++++++++++++++
 drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h |  1 +
 drivers/net/wireless/brcm80211/brcmfmac/fwil.h     |  1 +
 .../net/wireless/brcm80211/brcmfmac/fwil_types.h   | 13 ++++++++++
 4 files changed, 45 insertions(+)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
index ca9d239..1829337 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
@@ -2521,6 +2521,35 @@ done:
 	return err;
 }
 
+static int
+brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
+			    int idx, u8 *mac, struct station_info *sinfo)
+{
+	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
+	struct brcmf_if *ifp = netdev_priv(ndev);
+	s32 err;
+
+	brcmf_dbg(TRACE, "Enter, idx %d\n", idx);
+
+	if (idx == 0) {
+		cfg->assoclist.count = cpu_to_le32(BRCMF_MAX_ASSOCLIST);
+		err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_ASSOCLIST,
+					     &cfg->assoclist,
+					     sizeof(cfg->assoclist));
+		if (err) {
+			brcmf_err("BRCMF_C_GET_ASSOCLIST unsupported, err=%d\n",
+				  err);
+			cfg->assoclist.count = 0;
+			return -EOPNOTSUPP;
+		}
+	}
+	if (idx < le32_to_cpu(cfg->assoclist.count)) {
+		memcpy(mac, cfg->assoclist.mac[idx], ETH_ALEN);
+		return brcmf_cfg80211_get_station(wiphy, ndev, mac, sinfo);
+	}
+	return -ENOENT;
+}
+
 static s32
 brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev,
 			   bool enabled, s32 timeout)
@@ -4620,6 +4649,7 @@ static struct cfg80211_ops wl_cfg80211_ops = {
 	.join_ibss = brcmf_cfg80211_join_ibss,
 	.leave_ibss = brcmf_cfg80211_leave_ibss,
 	.get_station = brcmf_cfg80211_get_station,
+	.dump_station = brcmf_cfg80211_dump_station,
 	.set_tx_power = brcmf_cfg80211_set_tx_power,
 	.get_tx_power = brcmf_cfg80211_get_tx_power,
 	.add_key = brcmf_cfg80211_add_key,
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
index 3f5e550..4d95c6e 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
@@ -407,6 +407,7 @@ struct brcmf_cfg80211_info {
 	struct brcmu_d11inf d11inf;
 	bool wowl_enabled;
 	u32 pre_wowl_pmmode;
+	struct brcmf_assoclist_le assoclist;
 };
 
 /**
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwil.h b/drivers/net/wireless/brcm80211/brcmfmac/fwil.h
index 5434dcf..b20fc0f 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fwil.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil.h
@@ -72,6 +72,7 @@
 #define BRCMF_C_GET_BSS_INFO			136
 #define BRCMF_C_GET_BANDLIST			140
 #define BRCMF_C_SET_SCB_TIMEOUT			158
+#define BRCMF_C_GET_ASSOCLIST			159
 #define BRCMF_C_GET_PHYLIST			180
 #define BRCMF_C_SET_SCAN_CHANNEL_TIME		185
 #define BRCMF_C_SET_SCAN_UNASSOC_TIME		187
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
index 297911f..daa427b 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
@@ -119,6 +119,8 @@
 #define BRCMF_COUNTRY_BUF_SZ		4
 #define BRCMF_ANT_MAX			4
 
+#define BRCMF_MAX_ASSOCLIST		128
+
 /* join preference types for join_pref iovar */
 enum brcmf_join_pref_types {
 	BRCMF_JOIN_PREF_RSSI = 1,
@@ -621,4 +623,15 @@ struct brcmf_rev_info_le {
 	__le32 nvramrev;
 };
 
+/**
+ * struct brcmf_assoclist_le - request assoc list.
+ *
+ * @count: indicates number of stations.
+ * @mac: MAC addresses of stations.
+ */
+struct brcmf_assoclist_le {
+	__le32 count;
+	u8 mac[BRCMF_MAX_ASSOCLIST][ETH_ALEN];
+};
+
 #endif /* FWIL_TYPES_H_ */
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 09/11] brcmfmac: Move brcmf_c_preinit_dcmds prototype to correct file.
  2015-10-08 18:33 [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump Arend van Spriel
                   ` (7 preceding siblings ...)
  2015-10-08 18:33 ` [PATCH 08/11] brcmfmac: Add dump_station support to cfg80221 ops Arend van Spriel
@ 2015-10-08 18:33 ` Arend van Spriel
  2015-10-08 18:33 ` [PATCH 10/11] brcmfmac: Remove unused state AP creating Arend van Spriel
  2015-10-08 18:33 ` [PATCH 11/11] brcmfmac: Properly set carrier state of netdev Arend van Spriel
  10 siblings, 0 replies; 19+ messages in thread
From: Arend van Spriel @ 2015-10-08 18:33 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Hante Meuleman, Arend van Spriel

From: Hante Meuleman <meuleman@broadcom.com>

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/common.h | 3 +++
 drivers/net/wireless/brcm80211/brcmfmac/core.c   | 1 +
 drivers/net/wireless/brcm80211/brcmfmac/core.h   | 3 ---
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/common.h b/drivers/net/wireless/brcm80211/brcmfmac/common.h
index 0d39d80..21c7488 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/common.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/common.h
@@ -17,4 +17,7 @@
 
 extern const u8 ALLFFMAC[ETH_ALEN];
 
+/* Sets dongle media info (drv_version, mac address). */
+int brcmf_c_preinit_dcmds(struct brcmf_if *ifp);
+
 #endif /* BRCMFMAC_COMMON_H */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/core.c b/drivers/net/wireless/brcm80211/brcmfmac/core.c
index d3212bf..6e39121 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
@@ -33,6 +33,7 @@
 #include "feature.h"
 #include "proto.h"
 #include "pcie.h"
+#include "common.h"
 
 MODULE_AUTHOR("Broadcom Corporation");
 MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver.");
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/core.h b/drivers/net/wireless/brcm80211/brcmfmac/core.h
index d81ff95..f10fc37 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
@@ -214,7 +214,4 @@ void brcmf_txflowblock_if(struct brcmf_if *ifp,
 void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
 void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
 
-/* Sets dongle media info (drv_version, mac address). */
-int brcmf_c_preinit_dcmds(struct brcmf_if *ifp);
-
 #endif /* BRCMFMAC_CORE_H */
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 10/11] brcmfmac: Remove unused state AP creating.
  2015-10-08 18:33 [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump Arend van Spriel
                   ` (8 preceding siblings ...)
  2015-10-08 18:33 ` [PATCH 09/11] brcmfmac: Move brcmf_c_preinit_dcmds prototype to correct file Arend van Spriel
@ 2015-10-08 18:33 ` Arend van Spriel
  2015-10-08 18:33 ` [PATCH 11/11] brcmfmac: Properly set carrier state of netdev Arend van Spriel
  10 siblings, 0 replies; 19+ messages in thread
From: Arend van Spriel @ 2015-10-08 18:33 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Hante Meuleman, Arend van Spriel

From: Hante Meuleman <meuleman@broadcom.com>

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | 3 ---
 drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h | 2 --
 2 files changed, 5 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
index 1829337..ddb4e74 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
@@ -840,7 +840,6 @@ brcmf_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev,
 			err = brcmf_p2p_ifchange(cfg, BRCMF_FIL_P2P_IF_GO);
 		}
 		if (!err) {
-			set_bit(BRCMF_VIF_STATUS_AP_CREATING, &vif->sme_state);
 			brcmf_dbg(INFO, "IF Type = AP\n");
 		}
 	} else {
@@ -4251,7 +4250,6 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
 
 		brcmf_dbg(TRACE, "GO mode configuration complete\n");
 	}
-	clear_bit(BRCMF_VIF_STATUS_AP_CREATING, &ifp->vif->sme_state);
 	set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
 
 exit:
@@ -4316,7 +4314,6 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
 	}
 	brcmf_set_mpc(ifp, 1);
 	brcmf_configure_arp_offload(ifp, true);
-	set_bit(BRCMF_VIF_STATUS_AP_CREATING, &ifp->vif->sme_state);
 	clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
 
 	return err;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
index 4d95c6e..6a878c8 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.h
@@ -143,7 +143,6 @@ struct brcmf_cfg80211_profile {
  * @BRCMF_VIF_STATUS_CONNECTING: connect/join in progress.
  * @BRCMF_VIF_STATUS_CONNECTED: connected/joined succesfully.
  * @BRCMF_VIF_STATUS_DISCONNECTING: disconnect/disable in progress.
- * @BRCMF_VIF_STATUS_AP_CREATING: interface configured for AP operation.
  * @BRCMF_VIF_STATUS_AP_CREATED: AP operation started.
  */
 enum brcmf_vif_status {
@@ -151,7 +150,6 @@ enum brcmf_vif_status {
 	BRCMF_VIF_STATUS_CONNECTING,
 	BRCMF_VIF_STATUS_CONNECTED,
 	BRCMF_VIF_STATUS_DISCONNECTING,
-	BRCMF_VIF_STATUS_AP_CREATING,
 	BRCMF_VIF_STATUS_AP_CREATED
 };
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 11/11] brcmfmac: Properly set carrier state of netdev.
  2015-10-08 18:33 [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump Arend van Spriel
                   ` (9 preceding siblings ...)
  2015-10-08 18:33 ` [PATCH 10/11] brcmfmac: Remove unused state AP creating Arend van Spriel
@ 2015-10-08 18:33 ` Arend van Spriel
  10 siblings, 0 replies; 19+ messages in thread
From: Arend van Spriel @ 2015-10-08 18:33 UTC (permalink / raw)
  To: Kalle Valo; +Cc: linux-wireless, Hante Meuleman, Arend van Spriel

From: Hante Meuleman <meuleman@broadcom.com>

Use the netif_carrier api to correctly set carrier state on the
different modes.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c |  4 ++++
 drivers/net/wireless/brcm80211/brcmfmac/core.c     | 25 ++++++++++++++++++----
 drivers/net/wireless/brcm80211/brcmfmac/core.h     |  8 +++++--
 3 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
index ddb4e74..deb5f78 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
@@ -4251,6 +4251,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
 		brcmf_dbg(TRACE, "GO mode configuration complete\n");
 	}
 	set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
+	brcmf_net_setcarrier(ifp, true);
 
 exit:
 	if ((err) && (!mbss)) {
@@ -4315,6 +4316,7 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
 	brcmf_set_mpc(ifp, 1);
 	brcmf_configure_arp_offload(ifp, true);
 	clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
+	brcmf_net_setcarrier(ifp, false);
 
 	return err;
 }
@@ -5024,6 +5026,7 @@ brcmf_notify_connect_status(struct brcmf_if *ifp,
 				&ifp->vif->sme_state);
 		} else
 			brcmf_bss_connect_done(cfg, ndev, e, true);
+		brcmf_net_setcarrier(ifp, true);
 	} else if (brcmf_is_linkdown(e)) {
 		brcmf_dbg(CONN, "Linkdown\n");
 		if (!brcmf_is_ibssmode(ifp->vif)) {
@@ -5033,6 +5036,7 @@ brcmf_notify_connect_status(struct brcmf_if *ifp,
 		brcmf_init_prof(ndev_to_prof(ndev));
 		if (ndev != cfg_to_ndev(cfg))
 			complete(&cfg->vif_disabled);
+		brcmf_net_setcarrier(ifp, false);
 	} else if (brcmf_is_nonetwork(cfg, e)) {
 		if (brcmf_is_ibssmode(ifp->vif))
 			clear_bit(BRCMF_VIF_STATUS_CONNECTING,
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/core.c b/drivers/net/wireless/brcm80211/brcmfmac/core.c
index 6e39121..b5ab98e 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
@@ -635,8 +635,7 @@ static int brcmf_netdev_stop(struct net_device *ndev)
 
 	brcmf_cfg80211_down(ndev);
 
-	/* Set state and stop OS transmissions */
-	netif_stop_queue(ndev);
+	brcmf_net_setcarrier(ifp, false);
 
 	return 0;
 }
@@ -670,8 +669,8 @@ static int brcmf_netdev_open(struct net_device *ndev)
 		return -EIO;
 	}
 
-	/* Allow transmit calls */
-	netif_start_queue(ndev);
+	/* Clear, carrier, set when connected or AP mode. */
+	netif_carrier_off(ndev);
 	return 0;
 }
 
@@ -736,6 +735,24 @@ static void brcmf_net_detach(struct net_device *ndev)
 		brcmf_cfg80211_free_netdev(ndev);
 }
 
+void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on)
+{
+	struct net_device *ndev;
+
+	brcmf_dbg(TRACE, "Enter, idx=%d carrier=%d\n", ifp->bssidx, on);
+
+	ndev = ifp->ndev;
+	brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_DISCONNECTED, !on);
+	if (on) {
+		if (!netif_carrier_ok(ndev))
+			netif_carrier_on(ndev);
+
+	} else {
+		if (netif_carrier_ok(ndev))
+			netif_carrier_off(ndev);
+	}
+}
+
 static int brcmf_net_p2p_open(struct net_device *ndev)
 {
 	brcmf_dbg(TRACE, "Enter\n");
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/core.h b/drivers/net/wireless/brcm80211/brcmfmac/core.h
index f10fc37..2f9101b 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
@@ -154,10 +154,13 @@ struct brcmf_fws_mac_descriptor;
  *	netif stopped due to firmware signalling flow control.
  * @BRCMF_NETIF_STOP_REASON_FLOW:
  *	netif stopped due to flowring full.
+ * @BRCMF_NETIF_STOP_REASON_DISCONNECTED:
+ *	netif stopped due to not being connected (STA mode).
  */
 enum brcmf_netif_stop_reason {
-	BRCMF_NETIF_STOP_REASON_FWS_FC = 1,
-	BRCMF_NETIF_STOP_REASON_FLOW = 2
+	BRCMF_NETIF_STOP_REASON_FWS_FC = BIT(0),
+	BRCMF_NETIF_STOP_REASON_FLOW = BIT(1),
+	BRCMF_NETIF_STOP_REASON_DISCONNECTED = BIT(2)
 };
 
 /**
@@ -213,5 +216,6 @@ void brcmf_txflowblock_if(struct brcmf_if *ifp,
 			  enum brcmf_netif_stop_reason reason, bool state);
 void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success);
 void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
+void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on);
 
 #endif /* BRCMFMAC_CORE_H */
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
  2015-10-08 18:33 ` [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem Arend van Spriel
@ 2015-10-08 18:59   ` kbuild test robot
  2015-10-12  8:59     ` Kalle Valo
  2015-10-21  7:57   ` [01/11] " Kalle Valo
  1 sibling, 1 reply; 19+ messages in thread
From: kbuild test robot @ 2015-10-08 18:59 UTC (permalink / raw)
  To: Arend van Spriel; +Cc: kbuild-all, Kalle Valo, linux-wireless, Arend van Spriel

[-- Attachment #1: Type: text/plain, Size: 6047 bytes --]

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_folder = debugfs_create_dir(KBUILD_MODNAME, NULL);
    61		if (IS_ERR(root_folder))
    62			root_folder = NULL;
    63	}
    64	
  > 65	void brcmf_debugfs_exit(void)
    66	{
    67		if (!root_folder)
    68			return;
    69	
    70		debugfs_remove_recursive(root_folder);
    71		root_folder = NULL;
    72	}
    73	
  > 74	int brcmf_debug_attach(struct brcmf_pub *drvr)
    75	{
    76		struct device *dev = drvr->bus_if->dev;
    77	
    78		if (!root_folder)
    79			return -ENODEV;
    80	
    81		drvr->dbgfs_dir = debugfs_create_dir(dev_name(dev), root_folder);
  > 82		if (IS_ERR(drvr->dbgfs_dir))
    83			return PTR_ERR(drvr->dbgfs_dir);
    84	
    85	
    86		return brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
    87					   brcmf_debug_psm_watchdog_notify);
    88	}
    89	
  > 90	void brcmf_debug_detach(struct brcmf_pub *drvr)
    91	{
    92		brcmf_fweh_unregister(drvr, BRCMF_E_PSM_WATCHDOG);
    93	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 25092 bytes --]

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
  2015-10-08 18:59   ` kbuild test robot
@ 2015-10-12  8:59     ` Kalle Valo
  2015-10-12 20:05       ` Arend van Spriel
  0 siblings, 1 reply; 19+ messages in thread
From: Kalle Valo @ 2015-10-12  8:59 UTC (permalink / raw)
  To: Arend van Spriel; +Cc: kbuild test robot, kbuild-all, linux-wireless

kbuild test robot <lkp@intel.com> 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

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
  2015-10-12  8:59     ` Kalle Valo
@ 2015-10-12 20:05       ` Arend van Spriel
  2015-10-14 11:01         ` Kalle Valo
  0 siblings, 1 reply; 19+ messages in thread
From: Arend van Spriel @ 2015-10-12 20:05 UTC (permalink / raw)
  To: Kalle Valo; +Cc: kbuild test robot, kbuild-all, linux-wireless

On 10/12/2015 10:59 AM, Kalle Valo wrote:
> kbuild test robot <lkp@intel.com> 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


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
  2015-10-12 20:05       ` Arend van Spriel
@ 2015-10-14 11:01         ` Kalle Valo
  2015-10-14 13:36           ` Arend van Spriel
  0 siblings, 1 reply; 19+ messages in thread
From: Kalle Valo @ 2015-10-14 11:01 UTC (permalink / raw)
  To: Arend van Spriel; +Cc: kbuild test robot, kbuild-all, linux-wireless

Arend van Spriel <arend@broadcom.com> writes:

> On 10/12/2015 10:59 AM, Kalle Valo wrote:
>> kbuild test robot <lkp@intel.com> 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

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
  2015-10-14 11:01         ` Kalle Valo
@ 2015-10-14 13:36           ` Arend van Spriel
  2015-10-15 10:06             ` Kalle Valo
  0 siblings, 1 reply; 19+ messages in thread
From: Arend van Spriel @ 2015-10-14 13:36 UTC (permalink / raw)
  To: Kalle Valo; +Cc: kbuild test robot, kbuild-all, linux-wireless

On 10/14/2015 01:01 PM, Kalle Valo wrote:
> Arend van Spriel <arend@broadcom.com> writes:
>
>> On 10/12/2015 10:59 AM, Kalle Valo wrote:
>>> kbuild test robot <lkp@intel.com> 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

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem
  2015-10-14 13:36           ` Arend van Spriel
@ 2015-10-15 10:06             ` Kalle Valo
  0 siblings, 0 replies; 19+ messages in thread
From: Kalle Valo @ 2015-10-15 10:06 UTC (permalink / raw)
  To: Arend van Spriel; +Cc: kbuild test robot, kbuild-all, linux-wireless

Arend van Spriel <arend@broadcom.com> writes:

> On 10/14/2015 01:01 PM, Kalle Valo wrote:
>> Arend van Spriel <arend@broadcom.com> 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

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [01/11] brcmfmac: expose device memory to devcoredump subsystem
  2015-10-08 18:33 ` [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem Arend van Spriel
  2015-10-08 18:59   ` kbuild test robot
@ 2015-10-21  7:57   ` Kalle Valo
  1 sibling, 0 replies; 19+ messages in thread
From: Kalle Valo @ 2015-10-21  7:57 UTC (permalink / raw)
  To: Arend van Spriel; +Cc: linux-wireless, Arend van Spriel


> 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 <meuleman@broadcom.com>
> Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
> Signed-off-by: Arend van Spriel <arend@broadcom.com>

Thanks, 11 patches applied to wireless-drivers-next.git:

ff4445a8502c brcmfmac: expose device memory to devcoredump subsystem
185f0eb0b5fa brcmfmac: Fix race condition between USB probe/load and disconnect.
4a3462843f9f brcmfmac: rename firmware_path to alternative_fw_path
43569bfaf6ed brcmfmac: remove conversational comment
2b76acdbc043 brcmfmac: Rework p2p attach, use single method for p2p dev creation.
124d517211e4 brcmfmac: Fix station info rate information.
cae355dc90db brcmfmac: Add RSSI information to get_station.
bf2a7e0499b9 brcmfmac: Add dump_station support to cfg80221 ops.
c443e169577c brcmfmac: Move brcmf_c_preinit_dcmds prototype to correct file.
54b499d9ad10 brcmfmac: Remove unused state AP creating.
92121e69de8a brcmfmac: Properly set carrier state of netdev.

Kalle Valo

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2015-10-21  7:57 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-08 18:33 [PATCH 00/11] brcmfmac: cfg80211 callbacks and coredump Arend van Spriel
2015-10-08 18:33 ` [PATCH 01/11] brcmfmac: expose device memory to devcoredump subsystem Arend van Spriel
2015-10-08 18:59   ` kbuild test robot
2015-10-12  8:59     ` Kalle Valo
2015-10-12 20:05       ` Arend van Spriel
2015-10-14 11:01         ` Kalle Valo
2015-10-14 13:36           ` Arend van Spriel
2015-10-15 10:06             ` Kalle Valo
2015-10-21  7:57   ` [01/11] " Kalle Valo
2015-10-08 18:33 ` [PATCH 02/11] brcmfmac: Fix race condition between USB probe/load and disconnect Arend van Spriel
2015-10-08 18:33 ` [PATCH 03/11] brcmfmac: rename firmware_path to alternative_fw_path Arend van Spriel
2015-10-08 18:33 ` [PATCH 04/11] brcmfmac: remove conversational comment Arend van Spriel
2015-10-08 18:33 ` [PATCH 05/11] brcmfmac: Rework p2p attach, use single method for p2p dev creation Arend van Spriel
2015-10-08 18:33 ` [PATCH 06/11] brcmfmac: Fix station info rate information Arend van Spriel
2015-10-08 18:33 ` [PATCH 07/11] brcmfmac: Add RSSI information to get_station Arend van Spriel
2015-10-08 18:33 ` [PATCH 08/11] brcmfmac: Add dump_station support to cfg80221 ops Arend van Spriel
2015-10-08 18:33 ` [PATCH 09/11] brcmfmac: Move brcmf_c_preinit_dcmds prototype to correct file Arend van Spriel
2015-10-08 18:33 ` [PATCH 10/11] brcmfmac: Remove unused state AP creating Arend van Spriel
2015-10-08 18:33 ` [PATCH 11/11] brcmfmac: Properly set carrier state of netdev Arend van Spriel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.