2019-09-03 04:30:27

by Rafał Miłecki

[permalink] [raw]
Subject: [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime

From: Rafał Miłecki <[email protected]>

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


2019-09-03 04:30:27

by Rafał Miłecki

[permalink] [raw]
Subject: [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct

From: Rafał Miłecki <[email protected]>

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 <[email protected]>
---
.../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

2019-09-03 04:32:44

by Rafał Miłecki

[permalink] [raw]
Subject: [PATCH 3/3] brcmfmac: don't realloc wiphy during PCIe reset

From: Rafał Miłecki <[email protected]>

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 <[email protected]>
---
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

2019-09-03 04:32:44

by Rafał Miłecki

[permalink] [raw]
Subject: [PATCH 2/3] brcmfmac: split brcmf_attach() and brcmf_detach() functions

From: Rafał Miłecki <[email protected]>

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 <[email protected]>
---
.../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

2019-09-03 18:52:10

by Arend Van Spriel

[permalink] [raw]
Subject: Re: [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime



On 9/3/2019 6:29 AM, Rafał Miłecki wrote:
> From: Rafał Miłecki <[email protected]>
>
> 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

2019-09-03 19:00:54

by Arend Van Spriel

[permalink] [raw]
Subject: Re: [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct

On 9/3/2019 6:29 AM, Rafał Miłecki wrote:
> From: Rafał Miłecki <[email protected]>
>
> 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

2019-09-03 19:05:20

by Arend Van Spriel

[permalink] [raw]
Subject: Re: [PATCH 2/3] brcmfmac: split brcmf_attach() and brcmf_detach() functions



On 9/3/2019 6:29 AM, Rafał Miłecki wrote:
> From: Rafał Miłecki <[email protected]>
>
> 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 <[email protected]>
> Signed-off-by: Rafał Miłecki <[email protected]>
> ---
> .../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(-)

2019-09-03 19:07:26

by Arend Van Spriel

[permalink] [raw]
Subject: Re: [PATCH 3/3] brcmfmac: don't realloc wiphy during PCIe reset



On 9/3/2019 6:29 AM, Rafał Miłecki wrote:
> From: Rafał Miłecki <[email protected]>
>
> 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 <[email protected]>
> Signed-off-by: Rafał Miłecki <[email protected]>
> ---
> drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)

2019-09-10 07:33:54

by Rafał Miłecki

[permalink] [raw]
Subject: Re: [PATCH 0/3] brcmfmac: keep wiphy during PCIe driver lifetime

On Tue, 3 Sep 2019 at 20:51, Arend Van Spriel
<[email protected]> wrote:
> On 9/3/2019 6:29 AM, Rafał Miłecki wrote:
> > From: Rafał Miłecki <[email protected]>
> >
> > 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ł

2019-09-10 07:46:40

by Rafał Miłecki

[permalink] [raw]
Subject: Re: [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct

On Tue, 3 Sep 2019 at 20:59, Arend Van Spriel
<[email protected]> wrote:
> On 9/3/2019 6:29 AM, Rafał Miłecki wrote:
> > From: Rafał Miłecki <[email protected]>
> >
> > 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ł

2019-09-13 13:44:55

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH 1/3] brcmfmac: move "cfg80211_ops" pointer to another struct

Rafał Miłecki wrote:

> From: Rafał Miłecki <[email protected]>
>
> 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 <[email protected]>

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