Linux-Wireless Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime
@ 2019-09-03  4:29 Rafał Miłecki
  2019-09-03  4:29 ` [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct Rafał Miłecki
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Rafał Miłecki @ 2019-09-03  4:29 UTC (permalink / raw)
  To: Kalle Valo
  Cc: Arend van Spriel, Franky Lin, Hante Meuleman, Chi-Hsien Lin,
	Wright Feng, Winnie Chang, linux-wireless,
	brcm80211-dev-list.pdl, brcm80211-dev-list,
	Rafał Miłecki

From: Rafał Miłecki <rafal@milecki.pl>

Driver's main init/attach function brcmf_attach() was handling both:
wiphy allocation and driver initialization. It meant getting a new wiphy
on every init (initial, resume, error recovery).

For supplicants/authenticators and Linux users it's move convenient to
have the same wiphy over driver's lifetime. It allows e.g. automatic
recovery after a firmware crash.

This patchset was tested on BCM4366 (PCIe) and BCM43430 (SDIO).

Right now only PCIe makes use of keeping the same wiphy. I got RPi Zero
W so I'm planning to add firmware crash recovery & keep wiphy for SDIO
in the future.

Rafał Miłecki (3):
  brcmfmac: move "cfg80211_ops" pointer to another struct
  brcmfmac: split brcmf_attach() and brcmf_detach() functions
  brcmfmac: don't realloc wiphy during PCIe reset

 .../broadcom/brcm80211/brcmfmac/bus.h         |  4 +-
 .../broadcom/brcm80211/brcmfmac/cfg80211.c    |  1 -
 .../broadcom/brcm80211/brcmfmac/cfg80211.h    |  1 -
 .../broadcom/brcm80211/brcmfmac/core.c        | 42 ++++++++++++++-----
 .../broadcom/brcm80211/brcmfmac/core.h        |  1 +
 .../broadcom/brcm80211/brcmfmac/pcie.c        | 13 +++++-
 .../broadcom/brcm80211/brcmfmac/sdio.c        | 15 +++++--
 .../broadcom/brcm80211/brcmfmac/usb.c         | 34 ++++++++++++---
 8 files changed, 87 insertions(+), 24 deletions(-)

-- 
2.21.0


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

* [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct
  2019-09-03  4:29 [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime Rafał Miłecki
@ 2019-09-03  4:29 ` Rafał Miłecki
  2019-09-03 18:59   ` Arend Van Spriel
  2019-09-13 13:42   ` Kalle Valo
  2019-09-03  4:29 ` [PATCH 2/3] brcmfmac: split brcmf_attach() and brcmf_detach() functions Rafał Miłecki
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 11+ messages in thread
From: Rafał Miłecki @ 2019-09-03  4:29 UTC (permalink / raw)
  To: Kalle Valo
  Cc: Arend van Spriel, Franky Lin, Hante Meuleman, Chi-Hsien Lin,
	Wright Feng, Winnie Chang, linux-wireless,
	brcm80211-dev-list.pdl, brcm80211-dev-list,
	Rafał Miłecki

From: Rafał Miłecki <rafal@milecki.pl>

This moves "ops" pointer from "struct brcmf_cfg80211_info" to the
"struct brcmf_pub". This movement makes it possible to allocate wiphy
without attaching cfg80211 (brcmf_cfg80211_attach()). It's required for
later separation of wiphy allocation and driver initialization.

While at it fix also an unlikely memory leak in the brcmf_attach().

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
 .../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c  | 1 -
 .../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h  | 1 -
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c  | 9 ++++++---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h  | 1 +
 4 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index 581d0013f33e..c476f854f3ae 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -7210,7 +7210,6 @@ void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg)
 	brcmf_pno_detach(cfg);
 	brcmf_btcoex_detach(cfg);
 	wiphy_unregister(cfg->wiphy);
-	kfree(cfg->ops);
 	wl_deinit_priv(cfg);
 	brcmf_free_wiphy(cfg->wiphy);
 	kfree(cfg);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
index b7b50b07f776..14d5bbad1db1 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
@@ -292,7 +292,6 @@ struct brcmf_cfg80211_wowl {
  */
 struct brcmf_cfg80211_info {
 	struct wiphy *wiphy;
-	struct cfg80211_ops *ops;
 	struct brcmf_cfg80211_conf *conf;
 	struct brcmf_p2p_info p2p;
 	struct brcmf_btcoex_info *btcoex;
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
index 21e07d1ceeae..e8c488376ff9 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
@@ -1224,12 +1224,15 @@ int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
 		return -ENOMEM;
 
 	wiphy = wiphy_new(ops, sizeof(*drvr));
-	if (!wiphy)
+	if (!wiphy) {
+		kfree(ops);
 		return -ENOMEM;
+	}
 
 	set_wiphy_dev(wiphy, dev);
 	drvr = wiphy_priv(wiphy);
 	drvr->wiphy = wiphy;
+	drvr->ops = ops;
 
 	for (i = 0; i < ARRAY_SIZE(drvr->if2bss); i++)
 		drvr->if2bss[i] = BRCMF_BSSIDX_INVALID;
@@ -1262,12 +1265,10 @@ int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
 		goto fail;
 	}
 
-	drvr->config->ops = ops;
 	return 0;
 
 fail:
 	brcmf_detach(dev);
-	kfree(ops);
 
 	return ret;
 }
@@ -1353,6 +1354,8 @@ void brcmf_detach(struct device *dev)
 
 	bus_if->drvr = NULL;
 
+	kfree(drvr->ops);
+
 	wiphy_free(drvr->wiphy);
 }
 
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
index 86517a3d74b1..6699637d3bf8 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
@@ -97,6 +97,7 @@ struct brcmf_pub {
 	struct brcmf_bus *bus_if;
 	struct brcmf_proto *proto;
 	struct wiphy *wiphy;
+	struct cfg80211_ops *ops;
 	struct brcmf_cfg80211_info *config;
 
 	/* Internal brcmf items */
-- 
2.21.0


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

* [PATCH 2/3] brcmfmac: split brcmf_attach() and brcmf_detach() functions
  2019-09-03  4:29 [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime Rafał Miłecki
  2019-09-03  4:29 ` [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct Rafał Miłecki
@ 2019-09-03  4:29 ` Rafał Miłecki
  2019-09-03 19:03   ` Arend Van Spriel
  2019-09-03  4:29 ` [PATCH 3/3] brcmfmac: don't realloc wiphy during PCIe reset Rafał Miłecki
  2019-09-03 18:51 ` [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime Arend Van Spriel
  3 siblings, 1 reply; 11+ messages in thread
From: Rafał Miłecki @ 2019-09-03  4:29 UTC (permalink / raw)
  To: Kalle Valo
  Cc: Arend van Spriel, Franky Lin, Hante Meuleman, Chi-Hsien Lin,
	Wright Feng, Winnie Chang, linux-wireless,
	brcm80211-dev-list.pdl, brcm80211-dev-list,
	Rafał Miłecki

From: Rafał Miłecki <rafal@milecki.pl>

Move code allocating/freeing wiphy out of above functions. This will
allow reinitializing the driver (e.g. on some error) without allocating
a new wiphy.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
 .../broadcom/brcm80211/brcmfmac/bus.h         |  4 ++-
 .../broadcom/brcm80211/brcmfmac/core.c        | 33 ++++++++++++++----
 .../broadcom/brcm80211/brcmfmac/pcie.c        | 13 +++++--
 .../broadcom/brcm80211/brcmfmac/sdio.c        | 15 ++++++--
 .../broadcom/brcm80211/brcmfmac/usb.c         | 34 +++++++++++++++----
 5 files changed, 80 insertions(+), 19 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
index 0988a166a785..623c0168da79 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -253,10 +253,12 @@ void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp, bool handle_event);
 /* Receive async event packet from firmware. Callee disposes of rxp. */
 void brcmf_rx_event(struct device *dev, struct sk_buff *rxp);
 
+int brcmf_alloc(struct device *dev, struct brcmf_mp_device *settings);
 /* Indication from bus module regarding presence/insertion of dongle. */
-int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings);
+int brcmf_attach(struct device *dev);
 /* Indication from bus module regarding removal/absence of dongle */
 void brcmf_detach(struct device *dev);
+void brcmf_free(struct device *dev);
 /* Indication from bus module that dongle should be reset */
 void brcmf_dev_reset(struct device *dev);
 /* Request from bus module to initiate a coredump */
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
index e8c488376ff9..406b367c284c 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
@@ -1209,13 +1209,11 @@ static int brcmf_bus_started(struct brcmf_pub *drvr, struct cfg80211_ops *ops)
 	return ret;
 }
 
-int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
+int brcmf_alloc(struct device *dev, struct brcmf_mp_device *settings)
 {
 	struct wiphy *wiphy;
 	struct cfg80211_ops *ops;
 	struct brcmf_pub *drvr = NULL;
-	int ret = 0;
-	int i;
 
 	brcmf_dbg(TRACE, "Enter\n");
 
@@ -1233,6 +1231,21 @@ int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
 	drvr = wiphy_priv(wiphy);
 	drvr->wiphy = wiphy;
 	drvr->ops = ops;
+	drvr->bus_if = dev_get_drvdata(dev);
+	drvr->bus_if->drvr = drvr;
+	drvr->settings = settings;
+
+	return 0;
+}
+
+int brcmf_attach(struct device *dev)
+{
+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+	struct brcmf_pub *drvr = bus_if->drvr;
+	int ret = 0;
+	int i;
+
+	brcmf_dbg(TRACE, "Enter\n");
 
 	for (i = 0; i < ARRAY_SIZE(drvr->if2bss); i++)
 		drvr->if2bss[i] = BRCMF_BSSIDX_INVALID;
@@ -1241,9 +1254,6 @@ int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
 
 	/* Link to bus module */
 	drvr->hdrlen = 0;
-	drvr->bus_if = dev_get_drvdata(dev);
-	drvr->bus_if->drvr = drvr;
-	drvr->settings = settings;
 
 	/* Attach and link in the protocol */
 	ret = brcmf_proto_attach(drvr);
@@ -1259,7 +1269,7 @@ int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
 	/* attach firmware event handler */
 	brcmf_fweh_attach(drvr);
 
-	ret = brcmf_bus_started(drvr, ops);
+	ret = brcmf_bus_started(drvr, drvr->ops);
 	if (ret != 0) {
 		bphy_err(drvr, "dongle is not responding: err=%d\n", ret);
 		goto fail;
@@ -1351,6 +1361,15 @@ void brcmf_detach(struct device *dev)
 		brcmf_cfg80211_detach(drvr->config);
 		drvr->config = NULL;
 	}
+}
+
+void brcmf_free(struct device *dev)
+{
+	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+	struct brcmf_pub *drvr = bus_if->drvr;
+
+	if (!drvr)
+		return;
 
 	bus_if->drvr = NULL;
 
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
index 7ac945369762..b01b33e99c14 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
@@ -1430,6 +1430,7 @@ static int brcmf_pcie_reset(struct device *dev)
 	brcmf_pcie_bus_console_read(devinfo, true);
 
 	brcmf_detach(dev);
+	brcmf_free(dev);
 
 	brcmf_pcie_release_irq(devinfo);
 	brcmf_pcie_release_scratchbuffers(devinfo);
@@ -1824,11 +1825,18 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
 
 	brcmf_pcie_intr_enable(devinfo);
 	brcmf_pcie_hostready(devinfo);
-	if (brcmf_attach(&devinfo->pdev->dev, devinfo->settings) == 0)
-		return;
+
+	ret = brcmf_alloc(&devinfo->pdev->dev, devinfo->settings);
+	if (ret)
+		goto fail;
+	ret = brcmf_attach(&devinfo->pdev->dev);
+	if (ret)
+		goto fail;
 
 	brcmf_pcie_bus_console_read(devinfo, false);
 
+	return;
+
 fail:
 	device_release_driver(dev);
 }
@@ -1971,6 +1979,7 @@ brcmf_pcie_remove(struct pci_dev *pdev)
 		brcmf_pcie_intr_disable(devinfo);
 
 	brcmf_detach(&pdev->dev);
+	brcmf_free(&pdev->dev);
 
 	kfree(bus->bus_priv.pcie);
 	kfree(bus->msgbuf->flowrings);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 629140b6d7e2..264ad63232f8 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -4247,17 +4247,26 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err,
 	sdiod->bus_if->chip = bus->ci->chip;
 	sdiod->bus_if->chiprev = bus->ci->chiprev;
 
+	err = brcmf_alloc(sdiod->dev, sdiod->settings);
+	if (err) {
+		brcmf_err("brcmf_alloc failed\n");
+		goto claim;
+	}
+
 	/* Attach to the common layer, reserve hdr space */
-	err = brcmf_attach(sdiod->dev, sdiod->settings);
+	err = brcmf_attach(sdiod->dev);
 	if (err != 0) {
 		brcmf_err("brcmf_attach failed\n");
-		sdio_claim_host(sdiod->func1);
-		goto checkdied;
+		goto free;
 	}
 
 	/* ready */
 	return;
 
+free:
+	brcmf_free(sdiod->dev);
+claim:
+	sdio_claim_host(sdiod->func1);
 checkdied:
 	brcmf_sdio_checkdied(bus);
 release:
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
index d33628b79a3a..06f3c01f10b3 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
@@ -1178,8 +1178,12 @@ static void brcmf_usb_probe_phase2(struct device *dev, int ret,
 	if (ret)
 		goto error;
 
+	ret = brcmf_alloc(devinfo->dev, devinfo->settings);
+	if (ret)
+		goto error;
+
 	/* Attach to the common driver interface */
-	ret = brcmf_attach(devinfo->dev, devinfo->settings);
+	ret = brcmf_attach(devinfo->dev);
 	if (ret)
 		goto error;
 
@@ -1251,7 +1255,10 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
 	}
 
 	if (!brcmf_usb_dlneeded(devinfo)) {
-		ret = brcmf_attach(devinfo->dev, devinfo->settings);
+		ret = brcmf_alloc(devinfo->dev, devinfo->settings);
+		if (ret)
+			goto fail;
+		ret = brcmf_attach(devinfo->dev);
 		if (ret)
 			goto fail;
 		/* we are done */
@@ -1279,6 +1286,7 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
 
 fail:
 	/* Release resources in reverse order */
+	brcmf_free(devinfo->dev);
 	kfree(bus);
 	brcmf_usb_detach(devinfo);
 	return ret;
@@ -1292,6 +1300,7 @@ brcmf_usb_disconnect_cb(struct brcmf_usbdev_info *devinfo)
 	brcmf_dbg(USB, "Enter, bus_pub %p\n", devinfo);
 
 	brcmf_detach(devinfo->dev);
+	brcmf_free(devinfo->dev);
 	kfree(devinfo->bus_pub.bus);
 	brcmf_usb_detach(devinfo);
 }
@@ -1435,10 +1444,12 @@ static int brcmf_usb_suspend(struct usb_interface *intf, pm_message_t state)
 
 	brcmf_dbg(USB, "Enter\n");
 	devinfo->bus_pub.state = BRCMFMAC_USB_STATE_SLEEP;
-	if (devinfo->wowl_enabled)
+	if (devinfo->wowl_enabled) {
 		brcmf_cancel_all_urbs(devinfo);
-	else
+	} else {
 		brcmf_detach(&usb->dev);
+		brcmf_free(&usb->dev);
+	}
 	return 0;
 }
 
@@ -1451,8 +1462,19 @@ static int brcmf_usb_resume(struct usb_interface *intf)
 	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
 
 	brcmf_dbg(USB, "Enter\n");
-	if (!devinfo->wowl_enabled)
-		return brcmf_attach(devinfo->dev, devinfo->settings);
+	if (!devinfo->wowl_enabled) {
+		int err;
+
+		err = brcmf_alloc(&usb->dev, devinfo->settings);
+		if (err)
+			return err;
+
+		err = brcmf_attach(devinfo->dev);
+		if (err) {
+			brcmf_free(devinfo->dev);
+			return err;
+		}
+	}
 
 	devinfo->bus_pub.state = BRCMFMAC_USB_STATE_UP;
 	brcmf_usb_rx_fill_all(devinfo);
-- 
2.21.0


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

* [PATCH 3/3] brcmfmac: don't realloc wiphy during PCIe reset
  2019-09-03  4:29 [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime Rafał Miłecki
  2019-09-03  4:29 ` [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct Rafał Miłecki
  2019-09-03  4:29 ` [PATCH 2/3] brcmfmac: split brcmf_attach() and brcmf_detach() functions Rafał Miłecki
@ 2019-09-03  4:29 ` Rafał Miłecki
  2019-09-03 19:04   ` Arend Van Spriel
  2019-09-03 18:51 ` [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime Arend Van Spriel
  3 siblings, 1 reply; 11+ messages in thread
From: Rafał Miłecki @ 2019-09-03  4:29 UTC (permalink / raw)
  To: Kalle Valo
  Cc: Arend van Spriel, Franky Lin, Hante Meuleman, Chi-Hsien Lin,
	Wright Feng, Winnie Chang, linux-wireless,
	brcm80211-dev-list.pdl, brcm80211-dev-list,
	Rafał Miłecki

From: Rafał Miłecki <rafal@milecki.pl>

Providing a new wiphy on every PCIe reset was confusing and was causing
configuration problems for some users (supplicant and authenticators).
Sticking to the existing wiphy should make error recovery much simpler
and more reliable.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
index b01b33e99c14..6c463475e90b 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
@@ -1430,7 +1430,6 @@ static int brcmf_pcie_reset(struct device *dev)
 	brcmf_pcie_bus_console_read(devinfo, true);
 
 	brcmf_detach(dev);
-	brcmf_free(dev);
 
 	brcmf_pcie_release_irq(devinfo);
 	brcmf_pcie_release_scratchbuffers(devinfo);
@@ -1826,9 +1825,6 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
 	brcmf_pcie_intr_enable(devinfo);
 	brcmf_pcie_hostready(devinfo);
 
-	ret = brcmf_alloc(&devinfo->pdev->dev, devinfo->settings);
-	if (ret)
-		goto fail;
 	ret = brcmf_attach(&devinfo->pdev->dev);
 	if (ret)
 		goto fail;
@@ -1931,6 +1927,10 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 	bus->wowl_supported = pci_pme_capable(pdev, PCI_D3hot);
 	dev_set_drvdata(&pdev->dev, bus);
 
+	ret = brcmf_alloc(&devinfo->pdev->dev, devinfo->settings);
+	if (ret)
+		goto fail_bus;
+
 	fwreq = brcmf_pcie_prepare_fw_request(devinfo);
 	if (!fwreq) {
 		ret = -ENOMEM;
-- 
2.21.0


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

* Re: [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime
  2019-09-03  4:29 [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime Rafał Miłecki
                   ` (2 preceding siblings ...)
  2019-09-03  4:29 ` [PATCH 3/3] brcmfmac: don't realloc wiphy during PCIe reset Rafał Miłecki
@ 2019-09-03 18:51 ` Arend Van Spriel
  2019-09-09 13:06   ` Rafał Miłecki
  3 siblings, 1 reply; 11+ messages in thread
From: Arend Van Spriel @ 2019-09-03 18:51 UTC (permalink / raw)
  To: Rafał Miłecki, Kalle Valo
  Cc: Franky Lin, Hante Meuleman, Chi-Hsien Lin, Wright Feng,
	Winnie Chang, linux-wireless, brcm80211-dev-list.pdl,
	brcm80211-dev-list, Rafał Miłecki



On 9/3/2019 6:29 AM, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal@milecki.pl>
> 
> Driver's main init/attach function brcmf_attach() was handling both:
> wiphy allocation and driver initialization. It meant getting a new wiphy
> on every init (initial, resume, error recovery).
> 
> For supplicants/authenticators and Linux users it's move convenient to
> have the same wiphy over driver's lifetime. It allows e.g. automatic
> recovery after a firmware crash.

Typo: 'move' should be 'more'.

Regards,
Arend

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

* Re: [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct
  2019-09-03  4:29 ` [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct Rafał Miłecki
@ 2019-09-03 18:59   ` Arend Van Spriel
  2019-09-09 13:15     ` Rafał Miłecki
  2019-09-13 13:42   ` Kalle Valo
  1 sibling, 1 reply; 11+ messages in thread
From: Arend Van Spriel @ 2019-09-03 18:59 UTC (permalink / raw)
  To: Rafał Miłecki, Kalle Valo
  Cc: Franky Lin, Hante Meuleman, Chi-Hsien Lin, Wright Feng,
	Winnie Chang, linux-wireless, brcm80211-dev-list.pdl,
	brcm80211-dev-list, Rafał Miłecki

On 9/3/2019 6:29 AM, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal@milecki.pl>
> 
> This moves "ops" pointer from "struct brcmf_cfg80211_info" to the
> "struct brcmf_pub". This movement makes it possible to allocate wiphy
> without attaching cfg80211 (brcmf_cfg80211_attach()). It's required for
> later separation of wiphy allocation and driver initialization.
> 
> While at it fix also an unlikely memory leak in the brcmf_attach().

Always good ;-)

I recall there is some fiddling with the callback ops in cfg80211.c. Is 
that broken by this reorg. Need to look into that.

Regards,
Arend

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

* Re: [PATCH 2/3] brcmfmac: split brcmf_attach() and brcmf_detach() functions
  2019-09-03  4:29 ` [PATCH 2/3] brcmfmac: split brcmf_attach() and brcmf_detach() functions Rafał Miłecki
@ 2019-09-03 19:03   ` Arend Van Spriel
  0 siblings, 0 replies; 11+ messages in thread
From: Arend Van Spriel @ 2019-09-03 19:03 UTC (permalink / raw)
  To: Rafał Miłecki, Kalle Valo
  Cc: Franky Lin, Hante Meuleman, Chi-Hsien Lin, Wright Feng,
	Winnie Chang, linux-wireless, brcm80211-dev-list.pdl,
	brcm80211-dev-list, Rafał Miłecki



On 9/3/2019 6:29 AM, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal@milecki.pl>
> 
> Move code allocating/freeing wiphy out of above functions. This will
> allow reinitializing the driver (e.g. on some error) without allocating
> a new wiphy.

Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
> Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
> ---
>   .../broadcom/brcm80211/brcmfmac/bus.h         |  4 ++-
>   .../broadcom/brcm80211/brcmfmac/core.c        | 33 ++++++++++++++----
>   .../broadcom/brcm80211/brcmfmac/pcie.c        | 13 +++++--
>   .../broadcom/brcm80211/brcmfmac/sdio.c        | 15 ++++++--
>   .../broadcom/brcm80211/brcmfmac/usb.c         | 34 +++++++++++++++----
>   5 files changed, 80 insertions(+), 19 deletions(-)

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

* Re: [PATCH 3/3] brcmfmac: don't realloc wiphy during PCIe reset
  2019-09-03  4:29 ` [PATCH 3/3] brcmfmac: don't realloc wiphy during PCIe reset Rafał Miłecki
@ 2019-09-03 19:04   ` Arend Van Spriel
  0 siblings, 0 replies; 11+ messages in thread
From: Arend Van Spriel @ 2019-09-03 19:04 UTC (permalink / raw)
  To: Rafał Miłecki, Kalle Valo
  Cc: Franky Lin, Hante Meuleman, Chi-Hsien Lin, Wright Feng,
	Winnie Chang, linux-wireless, brcm80211-dev-list.pdl,
	brcm80211-dev-list, Rafał Miłecki



On 9/3/2019 6:29 AM, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal@milecki.pl>
> 
> Providing a new wiphy on every PCIe reset was confusing and was causing
> configuration problems for some users (supplicant and authenticators).
> Sticking to the existing wiphy should make error recovery much simpler
> and more reliable.

Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
> Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
> ---
>   drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 8 ++++----
>   1 file changed, 4 insertions(+), 4 deletions(-)

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

* Re: [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime
  2019-09-03 18:51 ` [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime Arend Van Spriel
@ 2019-09-09 13:06   ` Rafał Miłecki
  0 siblings, 0 replies; 11+ messages in thread
From: Rafał Miłecki @ 2019-09-09 13:06 UTC (permalink / raw)
  To: Arend Van Spriel
  Cc: Kalle Valo, Franky Lin, Hante Meuleman, Chi-Hsien Lin,
	Wright Feng, Winnie Chang, linux-wireless,
	open list:BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER,
	open list:BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER,
	brcm80211-dev-list, Rafał Miłecki

On Tue, 3 Sep 2019 at 20:51, Arend Van Spriel
<arend.vanspriel@broadcom.com> wrote:
> On 9/3/2019 6:29 AM, Rafał Miłecki wrote:
> > From: Rafał Miłecki <rafal@milecki.pl>
> >
> > Driver's main init/attach function brcmf_attach() was handling both:
> > wiphy allocation and driver initialization. It meant getting a new wiphy
> > on every init (initial, resume, error recovery).
> >
> > For supplicants/authenticators and Linux users it's move convenient to
> > have the same wiphy over driver's lifetime. It allows e.g. automatic
> > recovery after a firmware crash.
>
> Typo: 'move' should be 'more'.

Well, it's just a cover letter (0/3), that message won't go anywhere
to the git repository.

-- 
Rafał

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

* Re: [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct
  2019-09-03 18:59   ` Arend Van Spriel
@ 2019-09-09 13:15     ` Rafał Miłecki
  0 siblings, 0 replies; 11+ messages in thread
From: Rafał Miłecki @ 2019-09-09 13:15 UTC (permalink / raw)
  To: Arend Van Spriel
  Cc: Kalle Valo, Franky Lin, Hante Meuleman, Chi-Hsien Lin,
	Wright Feng, Winnie Chang, linux-wireless,
	open list:BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER,
	open list:BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER,
	brcm80211-dev-list, Rafał Miłecki

On Tue, 3 Sep 2019 at 20:59, Arend Van Spriel
<arend.vanspriel@broadcom.com> wrote:
> On 9/3/2019 6:29 AM, Rafał Miłecki wrote:
> > From: Rafał Miłecki <rafal@milecki.pl>
> >
> > This moves "ops" pointer from "struct brcmf_cfg80211_info" to the
> > "struct brcmf_pub". This movement makes it possible to allocate wiphy
> > without attaching cfg80211 (brcmf_cfg80211_attach()). It's required for
> > later separation of wiphy allocation and driver initialization.
> >
> > While at it fix also an unlikely memory leak in the brcmf_attach().
>
> Always good ;-)
>
> I recall there is some fiddling with the callback ops in cfg80211.c. Is
> that broken by this reorg. Need to look into that.

I don't see how this patch could break that. It still calls
brcmf_cfg80211_get_ops() and passes settings as an argument.

--
Rafał

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

* Re: [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct
  2019-09-03  4:29 ` [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct Rafał Miłecki
  2019-09-03 18:59   ` Arend Van Spriel
@ 2019-09-13 13:42   ` Kalle Valo
  1 sibling, 0 replies; 11+ messages in thread
From: Kalle Valo @ 2019-09-13 13:42 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: Arend van Spriel, Franky Lin, Hante Meuleman, Chi-Hsien Lin,
	Wright Feng, Winnie Chang, linux-wireless,
	brcm80211-dev-list.pdl, brcm80211-dev-list,
	Rafał Miłecki

Rafał Miłecki wrote:

> From: Rafał Miłecki <rafal@milecki.pl>
> 
> This moves "ops" pointer from "struct brcmf_cfg80211_info" to the
> "struct brcmf_pub". This movement makes it possible to allocate wiphy
> without attaching cfg80211 (brcmf_cfg80211_attach()). It's required for
> later separation of wiphy allocation and driver initialization.
> 
> While at it fix also an unlikely memory leak in the brcmf_attach().
> 
> Signed-off-by: Rafał Miłecki <rafal@milecki.pl>

3 patches applied to wireless-drivers-next.git, thanks.

ba76ff25ee64 brcmfmac: move "cfg80211_ops" pointer to another struct
450914c39f88 brcmfmac: split brcmf_attach() and brcmf_detach() functions
a1f5aac1765a brcmfmac: don't realloc wiphy during PCIe reset

-- 
https://patchwork.kernel.org/patch/11127163/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches


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

end of thread, back to index

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-03  4:29 [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime Rafał Miłecki
2019-09-03  4:29 ` [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct Rafał Miłecki
2019-09-03 18:59   ` Arend Van Spriel
2019-09-09 13:15     ` Rafał Miłecki
2019-09-13 13:42   ` Kalle Valo
2019-09-03  4:29 ` [PATCH 2/3] brcmfmac: split brcmf_attach() and brcmf_detach() functions Rafał Miłecki
2019-09-03 19:03   ` Arend Van Spriel
2019-09-03  4:29 ` [PATCH 3/3] brcmfmac: don't realloc wiphy during PCIe reset Rafał Miłecki
2019-09-03 19:04   ` Arend Van Spriel
2019-09-03 18:51 ` [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime Arend Van Spriel
2019-09-09 13:06   ` Rafał Miłecki

Linux-Wireless Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-wireless/0 linux-wireless/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-wireless linux-wireless/ https://lore.kernel.org/linux-wireless \
		linux-wireless@vger.kernel.org linux-wireless@archiver.kernel.org
	public-inbox-index linux-wireless


Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-wireless


AGPL code for this site: git clone https://public-inbox.org/ public-inbox