[source] mac80211: brcmfmac: backport patches pushed on 2017-03-20

LEDE Commits lede-commits at lists.infradead.org
Tue Mar 21 02:49:38 PDT 2017


rmilecki pushed a commit to source.git, branch master:
https://git.lede-project.org/13006712eab665d606d217fccbb8f609287e2c8b

commit 13006712eab665d606d217fccbb8f609287e2c8b
Author: Rafał Miłecki <rafal at milecki.pl>
AuthorDate: Tue Mar 21 10:45:30 2017 +0100

    mac80211: brcmfmac: backport patches pushed on 2017-03-20
    
    Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
---
 ...e-net_device_stats-from-struct-net_device.patch | 112 +++++++++++++++++
 ...ays-print-error-when-PSM-s-watchdog-fire.patch} |   9 +-
 ...-not-print-the-firmware-version-as-an-err.patch |  56 +++++++++
 ...mac-Do-not-complain-about-country-code-00.patch |  28 +++++
 ...ndle-status-BRCMF_E_STATUS_ABORT-in-cfg80.patch |  35 ++++++
 ...fmac-move-brcmf_txflowblock-to-bcdc-layer.patch | 137 +++++++++++++++++++++
 ...mfmac-move-brcmf_txcomplete-to-bcdc-layer.patch | 122 ++++++++++++++++++
 ...ap-brcmf_fws_add_interface-into-bcdc-laye.patch |  95 ++++++++++++++
 ...ap-brcmf_fws_del_interface-into-bcdc-laye.patch |  83 +++++++++++++
 ...ap-brcmf_fws_reset_interface-into-bcdc-la.patch |  82 ++++++++++++
 ...mfmac-register-wiphy-s-during-module_init.patch |   2 +-
 11 files changed, 756 insertions(+), 5 deletions(-)

diff --git a/package/kernel/mac80211/patches/323-0001-brcmfmac-Use-net_device_stats-from-struct-net_device.patch b/package/kernel/mac80211/patches/323-0001-brcmfmac-Use-net_device_stats-from-struct-net_device.patch
new file mode 100644
index 0000000..81567d8
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0001-brcmfmac-Use-net_device_stats-from-struct-net_device.patch
@@ -0,0 +1,112 @@
+From 91b632803ee4e47c5a5c4dc3d8bf5abf9c16107a Mon Sep 17 00:00:00 2001
+From: Tobias Klauser <tklauser at distanz.ch>
+Date: Mon, 13 Feb 2017 11:14:09 +0100
+Subject: [PATCH] brcmfmac: Use net_device_stats from struct net_device
+
+Instead of using a private copy of struct net_device_stats in struct
+brcm_if, use stats from struct net_device.  Also remove the now
+unnecessary .ndo_get_stats function.
+
+Signed-off-by: Tobias Klauser <tklauser at distanz.ch>
+Acked-by: Arend van Spriel <arend.vanspriel at broadcom.com>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 26 +++++++---------------
+ .../wireless/broadcom/brcm80211/brcmfmac/core.h    |  2 --
+ 2 files changed, 8 insertions(+), 20 deletions(-)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+@@ -249,10 +249,10 @@ static netdev_tx_t brcmf_netdev_start_xm
+ 
+ done:
+ 	if (ret) {
+-		ifp->stats.tx_dropped++;
++		ndev->stats.tx_dropped++;
+ 	} else {
+-		ifp->stats.tx_packets++;
+-		ifp->stats.tx_bytes += skb->len;
++		ndev->stats.tx_packets++;
++		ndev->stats.tx_bytes += skb->len;
+ 	}
+ 
+ 	/* Return ok: we always eat the packet */
+@@ -296,15 +296,15 @@ void brcmf_txflowblock(struct device *de
+ void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb)
+ {
+ 	if (skb->pkt_type == PACKET_MULTICAST)
+-		ifp->stats.multicast++;
++		ifp->ndev->stats.multicast++;
+ 
+ 	if (!(ifp->ndev->flags & IFF_UP)) {
+ 		brcmu_pkt_buf_free_skb(skb);
+ 		return;
+ 	}
+ 
+-	ifp->stats.rx_bytes += skb->len;
+-	ifp->stats.rx_packets++;
++	ifp->ndev->stats.rx_bytes += skb->len;
++	ifp->ndev->stats.rx_packets++;
+ 
+ 	brcmf_dbg(DATA, "rx proto=0x%X\n", ntohs(skb->protocol));
+ 	if (in_interrupt())
+@@ -327,7 +327,7 @@ static int brcmf_rx_hdrpull(struct brcmf
+ 
+ 	if (ret || !(*ifp) || !(*ifp)->ndev) {
+ 		if (ret != -ENODATA && *ifp)
+-			(*ifp)->stats.rx_errors++;
++			(*ifp)->ndev->stats.rx_errors++;
+ 		brcmu_pkt_buf_free_skb(skb);
+ 		return -ENODATA;
+ 	}
+@@ -388,7 +388,7 @@ void brcmf_txfinalize(struct brcmf_if *i
+ 	}
+ 
+ 	if (!success)
+-		ifp->stats.tx_errors++;
++		ifp->ndev->stats.tx_errors++;
+ 
+ 	brcmu_pkt_buf_free_skb(txp);
+ }
+@@ -411,15 +411,6 @@ void brcmf_txcomplete(struct device *dev
+ 	}
+ }
+ 
+-static struct net_device_stats *brcmf_netdev_get_stats(struct net_device *ndev)
+-{
+-	struct brcmf_if *ifp = netdev_priv(ndev);
+-
+-	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx);
+-
+-	return &ifp->stats;
+-}
+-
+ static void brcmf_ethtool_get_drvinfo(struct net_device *ndev,
+ 				    struct ethtool_drvinfo *info)
+ {
+@@ -492,7 +483,6 @@ static int brcmf_netdev_open(struct net_
+ static const struct net_device_ops brcmf_netdev_ops_pri = {
+ 	.ndo_open = brcmf_netdev_open,
+ 	.ndo_stop = brcmf_netdev_stop,
+-	.ndo_get_stats = brcmf_netdev_get_stats,
+ 	.ndo_start_xmit = brcmf_netdev_start_xmit,
+ 	.ndo_set_mac_address = brcmf_netdev_set_mac_address,
+ 	.ndo_set_rx_mode = brcmf_netdev_set_multicast_list
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
+@@ -171,7 +171,6 @@ enum brcmf_netif_stop_reason {
+  * @drvr: points to device related information.
+  * @vif: points to cfg80211 specific interface information.
+  * @ndev: associated network device.
+- * @stats: interface specific network statistics.
+  * @multicast_work: worker object for multicast provisioning.
+  * @ndoffload_work: worker object for neighbor discovery offload configuration.
+  * @fws_desc: interface specific firmware-signalling descriptor.
+@@ -187,7 +186,6 @@ struct brcmf_if {
+ 	struct brcmf_pub *drvr;
+ 	struct brcmf_cfg80211_vif *vif;
+ 	struct net_device *ndev;
+-	struct net_device_stats stats;
+ 	struct work_struct multicast_work;
+ 	struct work_struct ndoffload_work;
+ 	struct brcmf_fws_mac_descriptor *fws_desc;
diff --git a/package/kernel/mac80211/patches/855-brcmfmac-always-print-error-when-PSM-s-watchdog-fire.patch b/package/kernel/mac80211/patches/323-0002-brcmfmac-always-print-error-when-PSM-s-watchdog-fire.patch
similarity index 94%
rename from package/kernel/mac80211/patches/855-brcmfmac-always-print-error-when-PSM-s-watchdog-fire.patch
rename to package/kernel/mac80211/patches/323-0002-brcmfmac-always-print-error-when-PSM-s-watchdog-fire.patch
index 51448e9..7272b88 100644
--- a/package/kernel/mac80211/patches/855-brcmfmac-always-print-error-when-PSM-s-watchdog-fire.patch
+++ b/package/kernel/mac80211/patches/323-0002-brcmfmac-always-print-error-when-PSM-s-watchdog-fire.patch
@@ -1,6 +1,6 @@
-From e374cb32e98fb49e17594424b0445d8438825413 Mon Sep 17 00:00:00 2001
+From f1ac3aa212af6dd0a36dc07a63f95f91be6f4935 Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal at milecki.pl>
-Date: Fri, 24 Feb 2017 17:18:47 +0100
+Date: Fri, 24 Feb 2017 17:32:46 +0100
 Subject: [PATCH] brcmfmac: always print error when PSM's watchdog fires
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
@@ -20,6 +20,7 @@ In the future we may also try to extend this listener by trying to
 recover from the error or at least signal it to the cfg80211.
 
 Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
 ---
  .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 22 ++++++++++++++++++
  .../wireless/broadcom/brcm80211/brcmfmac/debug.c   | 26 +++-------------------
@@ -28,7 +29,7 @@ Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
 
 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -748,6 +748,24 @@ void brcmf_remove_interface(struct brcmf
+@@ -738,6 +738,24 @@ void brcmf_remove_interface(struct brcmf
  	brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked);
  }
  
@@ -53,7 +54,7 @@ Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
  #ifdef CONFIG_INET
  #define ARPOL_MAX_ENTRIES	8
  static int brcmf_inetaddr_changed(struct notifier_block *nb,
-@@ -927,6 +945,10 @@ int brcmf_attach(struct device *dev, str
+@@ -917,6 +935,10 @@ int brcmf_attach(struct device *dev, str
  		goto fail;
  	}
  
diff --git a/package/kernel/mac80211/patches/323-0003-brcmfmac-Do-not-print-the-firmware-version-as-an-err.patch b/package/kernel/mac80211/patches/323-0003-brcmfmac-Do-not-print-the-firmware-version-as-an-err.patch
new file mode 100644
index 0000000..3ab9b66
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0003-brcmfmac-Do-not-print-the-firmware-version-as-an-err.patch
@@ -0,0 +1,56 @@
+From d79fe4cb70d8deab7b8dc1de547ed4b915574414 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Wed, 8 Mar 2017 14:50:15 +0100
+Subject: [PATCH] brcmfmac: Do not print the firmware version as an error
+
+Using pr_err for things which are not errors is a bad idea. E.g. it
+will cause the plymouth bootsplash screen to drop back to the text
+console so that the user can see the error, which is not what we
+normally want to happen.
+
+Instead add a new brcmf_info macro and use that.
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+Acked-by: Arend van Spriel <arend.vanspriel at broadcom.com>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 2 +-
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h  | 9 +++++++++
+ 2 files changed, 10 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
+@@ -161,7 +161,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
+ 	strsep(&ptr, "\n");
+ 
+ 	/* Print fw version info */
+-	brcmf_err("Firmware version = %s\n", buf);
++	brcmf_info("Firmware version = %s\n", buf);
+ 
+ 	/* locate firmware version number for ethtool */
+ 	ptr = strrchr(buf, ' ') + 1;
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
+@@ -59,6 +59,10 @@ void __brcmf_err(const char *func, const
+ 	} while (0)
+ 
+ #if defined(DEBUG) || defined(CPTCFG_BRCM_TRACING)
++
++/* For debug/tracing purposes treat info messages as errors */
++#define brcmf_info brcmf_err
++
+ __printf(3, 4)
+ void __brcmf_dbg(u32 level, const char *func, const char *fmt, ...);
+ #define brcmf_dbg(level, fmt, ...)				\
+@@ -77,6 +81,11 @@ do {								\
+ 
+ #else /* defined(DEBUG) || defined(CPTCFG_BRCM_TRACING) */
+ 
++#define brcmf_info(fmt, ...)						\
++	do {								\
++		pr_info("%s: " fmt, __func__, ##__VA_ARGS__);		\
++	} while (0)
++
+ #define brcmf_dbg(level, fmt, ...) no_printk(fmt, ##__VA_ARGS__)
+ 
+ #define BRCMF_DATA_ON()		0
diff --git a/package/kernel/mac80211/patches/323-0004-brcmfmac-Do-not-complain-about-country-code-00.patch b/package/kernel/mac80211/patches/323-0004-brcmfmac-Do-not-complain-about-country-code-00.patch
new file mode 100644
index 0000000..f4570e7
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0004-brcmfmac-Do-not-complain-about-country-code-00.patch
@@ -0,0 +1,28 @@
+From 26e537884a8ef451f5c60f6949b1615069931ffa Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Wed, 8 Mar 2017 14:50:16 +0100
+Subject: [PATCH] brcmfmac: Do not complain about country code "00"
+
+The country code gets set to "00" by default at boot, ignore this
+rather then logging an error about it.
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+Acked-by: Arend van Spriel <arend.vanspriel at broadcom.com>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -6736,6 +6736,10 @@ static void brcmf_cfg80211_reg_notifier(
+ 	s32 err;
+ 	int i;
+ 
++	/* The country code gets set to "00" by default at boot, ignore */
++	if (req->alpha2[0] == '0' && req->alpha2[1] == '0')
++		return;
++
+ 	/* ignore non-ISO3166 country codes */
+ 	for (i = 0; i < sizeof(req->alpha2); i++)
+ 		if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') {
diff --git a/package/kernel/mac80211/patches/323-0005-brcmfmac-Handle-status-BRCMF_E_STATUS_ABORT-in-cfg80.patch b/package/kernel/mac80211/patches/323-0005-brcmfmac-Handle-status-BRCMF_E_STATUS_ABORT-in-cfg80.patch
new file mode 100644
index 0000000..0f2d54e
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0005-brcmfmac-Handle-status-BRCMF_E_STATUS_ABORT-in-cfg80.patch
@@ -0,0 +1,35 @@
+From b9472a2e3e452c414634b3ccb1ef6c4098878686 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Wed, 8 Mar 2017 14:50:17 +0100
+Subject: [PATCH] brcmfmac: Handle status == BRCMF_E_STATUS_ABORT in
+ cfg80211_escan_handler
+
+If a scan gets aborted BRCMF_SCAN_STATUS_BUSY gets cleared in
+cfg->scan_status and when we receive an abort event from the firmware
+the BRCMF_SCAN_STATUS_BUSY check in the cfg80211_escan_handler will
+trigger resulting in multiple errors getting logged.
+
+Check for a status of BRCMF_E_STATUS_ABORT and in this case simply
+cleanly exit the cfg80211_escan_handler. This also avoids a
+BRCMF_E_STATUS_ABORT event arriving after a new scan has been started
+causing the new scan to complete prematurely without any data.
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+Acked-by: Arend van Spriel <arend.vanspriel at broadcom.com>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -3097,6 +3097,9 @@ brcmf_cfg80211_escan_handler(struct brcm
+ 
+ 	status = e->status;
+ 
++	if (status == BRCMF_E_STATUS_ABORT)
++		goto exit;
++
+ 	if (!test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
+ 		brcmf_err("scan not ready, bsscfgidx=%d\n", ifp->bsscfgidx);
+ 		return -EPERM;
diff --git a/package/kernel/mac80211/patches/323-0006-brcmfmac-move-brcmf_txflowblock-to-bcdc-layer.patch b/package/kernel/mac80211/patches/323-0006-brcmfmac-move-brcmf_txflowblock-to-bcdc-layer.patch
new file mode 100644
index 0000000..b947cd1
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0006-brcmfmac-move-brcmf_txflowblock-to-bcdc-layer.patch
@@ -0,0 +1,137 @@
+From 20ec4f57498f8770c7a1a3e2a316fa752a424178 Mon Sep 17 00:00:00 2001
+From: Franky Lin <franky.lin at broadcom.com>
+Date: Fri, 10 Mar 2017 21:17:02 +0000
+Subject: [PATCH] brcmfmac: move brcmf_txflowblock to bcdc layer
+
+brcmf_txflowblock is invoked by sdio and usb bus module which are using
+bcdc protocol. This patch makes it a bcdc API instead of a core module
+function.
+
+Reviewed-by: Arend Van Spriel <arend.vanspriel at broadcom.com>
+Signed-off-by: Franky Lin <franky.lin at broadcom.com>
+Signed-off-by: Arend van Spriel <arend.vanspriel at broadcom.com>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c | 10 ++++++++++
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h |  1 +
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h  |  2 --
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 10 ----------
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c |  5 +++--
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c  |  5 +++--
+ 6 files changed, 17 insertions(+), 16 deletions(-)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
+@@ -345,6 +345,16 @@ brcmf_proto_bcdc_txdata(struct brcmf_pub
+ 	return brcmf_bus_txdata(drvr->bus_if, pktbuf);
+ }
+ 
++void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state)
++{
++	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
++	struct brcmf_pub *drvr = bus_if->drvr;
++
++	brcmf_dbg(TRACE, "Enter\n");
++
++	brcmf_fws_bus_blocked(drvr, state);
++}
++
+ static void
+ brcmf_proto_bcdc_configure_addr_mode(struct brcmf_pub *drvr, int ifidx,
+ 				     enum proto_addr_mode addr_mode)
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h
+@@ -19,6 +19,7 @@
+ #ifdef CPTCFG_BRCMFMAC_PROTO_BCDC
+ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr);
+ void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr);
++void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state);
+ #else
+ static inline int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) { return 0; }
+ static inline void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr) {}
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+@@ -229,8 +229,6 @@ int brcmf_attach(struct device *dev, str
+ void brcmf_detach(struct device *dev);
+ /* Indication from bus module that dongle should be reset */
+ void brcmf_dev_reset(struct device *dev);
+-/* Indication from bus module to change flow-control state */
+-void brcmf_txflowblock(struct device *dev, bool state);
+ 
+ /* Notify the bus has transferred the tx packet to firmware */
+ void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success);
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+@@ -283,16 +283,6 @@ void brcmf_txflowblock_if(struct brcmf_i
+ 	spin_unlock_irqrestore(&ifp->netif_stop_lock, flags);
+ }
+ 
+-void brcmf_txflowblock(struct device *dev, bool state)
+-{
+-	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+-	struct brcmf_pub *drvr = bus_if->drvr;
+-
+-	brcmf_dbg(TRACE, "Enter\n");
+-
+-	brcmf_fws_bus_blocked(drvr, state);
+-}
+-
+ void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb)
+ {
+ 	if (skb->pkt_type == PACKET_MULTICAST)
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+@@ -44,6 +44,7 @@
+ #include "firmware.h"
+ #include "core.h"
+ #include "common.h"
++#include "bcdc.h"
+ 
+ #define DCMD_RESP_TIMEOUT	msecs_to_jiffies(2500)
+ #define CTL_DONE_TIMEOUT	msecs_to_jiffies(2500)
+@@ -2328,7 +2329,7 @@ static uint brcmf_sdio_sendfromq(struct
+ 	if ((bus->sdiodev->state == BRCMF_SDIOD_DATA) &&
+ 	    bus->txoff && (pktq_len(&bus->txq) < TXLOW)) {
+ 		bus->txoff = false;
+-		brcmf_txflowblock(bus->sdiodev->dev, false);
++		brcmf_proto_bcdc_txflowblock(bus->sdiodev->dev, false);
+ 	}
+ 
+ 	return cnt;
+@@ -2753,7 +2754,7 @@ static int brcmf_sdio_bus_txdata(struct
+ 
+ 	if (pktq_len(&bus->txq) >= TXHI) {
+ 		bus->txoff = true;
+-		brcmf_txflowblock(dev, true);
++		brcmf_proto_bcdc_txflowblock(dev, true);
+ 	}
+ 	spin_unlock_bh(&bus->txq_lock);
+ 
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
+@@ -29,6 +29,7 @@
+ #include "usb.h"
+ #include "core.h"
+ #include "common.h"
++#include "bcdc.h"
+ 
+ 
+ #define IOCTL_RESP_TIMEOUT		msecs_to_jiffies(2000)
+@@ -488,7 +489,7 @@ static void brcmf_usb_tx_complete(struct
+ 	spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
+ 	if (devinfo->tx_freecount > devinfo->tx_high_watermark &&
+ 		devinfo->tx_flowblock) {
+-		brcmf_txflowblock(devinfo->dev, false);
++		brcmf_proto_bcdc_txflowblock(devinfo->dev, false);
+ 		devinfo->tx_flowblock = false;
+ 	}
+ 	spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
+@@ -635,7 +636,7 @@ static int brcmf_usb_tx(struct device *d
+ 	spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
+ 	if (devinfo->tx_freecount < devinfo->tx_low_watermark &&
+ 	    !devinfo->tx_flowblock) {
+-		brcmf_txflowblock(dev, true);
++		brcmf_proto_bcdc_txflowblock(dev, true);
+ 		devinfo->tx_flowblock = true;
+ 	}
+ 	spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
diff --git a/package/kernel/mac80211/patches/323-0007-brcmfmac-move-brcmf_txcomplete-to-bcdc-layer.patch b/package/kernel/mac80211/patches/323-0007-brcmfmac-move-brcmf_txcomplete-to-bcdc-layer.patch
new file mode 100644
index 0000000..9614e53
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0007-brcmfmac-move-brcmf_txcomplete-to-bcdc-layer.patch
@@ -0,0 +1,122 @@
+From 7b584396b7a760bc77bbde4625f83ef173159d3e Mon Sep 17 00:00:00 2001
+From: Franky Lin <franky.lin at broadcom.com>
+Date: Fri, 10 Mar 2017 21:17:03 +0000
+Subject: [PATCH] brcmfmac: move brcmf_txcomplete to bcdc layer
+
+brcmf_txcomplete is invoked by sdio and usb bus module which are using
+bcdc protocol. So move it from core module into bcdc layer.
+
+Signed-off-by: Franky Lin <franky.lin at broadcom.com>
+Signed-off-by: Arend van Spriel <arend.vanspriel at broadcom.com>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ .../net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c  | 20 ++++++++++++++++++++
+ .../net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h  |  2 ++
+ .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h   |  3 ---
+ .../net/wireless/broadcom/brcm80211/brcmfmac/core.c  | 18 ------------------
+ .../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c  |  3 ++-
+ .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c   |  2 +-
+ 6 files changed, 25 insertions(+), 23 deletions(-)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
+@@ -355,6 +355,26 @@ void brcmf_proto_bcdc_txflowblock(struct
+ 	brcmf_fws_bus_blocked(drvr, state);
+ }
+ 
++void
++brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
++			    bool success)
++{
++	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
++	struct brcmf_pub *drvr = bus_if->drvr;
++	struct brcmf_if *ifp;
++
++	/* await txstatus signal for firmware if active */
++	if (brcmf_fws_fc_active(drvr->fws)) {
++		if (!success)
++			brcmf_fws_bustxfail(drvr->fws, txp);
++	} else {
++		if (brcmf_proto_bcdc_hdrpull(drvr, false, txp, &ifp))
++			brcmu_pkt_buf_free_skb(txp);
++		else
++			brcmf_txfinalize(ifp, txp, success);
++	}
++}
++
+ static void
+ brcmf_proto_bcdc_configure_addr_mode(struct brcmf_pub *drvr, int ifidx,
+ 				     enum proto_addr_mode addr_mode)
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h
+@@ -20,6 +20,8 @@
+ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr);
+ void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr);
+ void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state);
++void brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
++				 bool success);
+ #else
+ static inline int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) { return 0; }
+ static inline void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr) {}
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+@@ -230,9 +230,6 @@ void brcmf_detach(struct device *dev);
+ /* Indication from bus module that dongle should be reset */
+ void brcmf_dev_reset(struct device *dev);
+ 
+-/* Notify the bus has transferred the tx packet to firmware */
+-void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success);
+-
+ /* Configure the "global" bus state used by upper layers */
+ void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state);
+ 
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+@@ -383,24 +383,6 @@ void brcmf_txfinalize(struct brcmf_if *i
+ 	brcmu_pkt_buf_free_skb(txp);
+ }
+ 
+-void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success)
+-{
+-	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+-	struct brcmf_pub *drvr = bus_if->drvr;
+-	struct brcmf_if *ifp;
+-
+-	/* await txstatus signal for firmware if active */
+-	if (brcmf_fws_fc_active(drvr->fws)) {
+-		if (!success)
+-			brcmf_fws_bustxfail(drvr->fws, txp);
+-	} else {
+-		if (brcmf_proto_hdrpull(drvr, false, txp, &ifp))
+-			brcmu_pkt_buf_free_skb(txp);
+-		else
+-			brcmf_txfinalize(ifp, txp, success);
+-	}
+-}
+-
+ static void brcmf_ethtool_get_drvinfo(struct net_device *ndev,
+ 				    struct ethtool_drvinfo *info)
+ {
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+@@ -2266,7 +2266,8 @@ done:
+ 		bus->tx_seq = (bus->tx_seq + pktq->qlen) % SDPCM_SEQ_WRAP;
+ 	skb_queue_walk_safe(pktq, pkt_next, tmp) {
+ 		__skb_unlink(pkt_next, pktq);
+-		brcmf_txcomplete(bus->sdiodev->dev, pkt_next, ret == 0);
++		brcmf_proto_bcdc_txcomplete(bus->sdiodev->dev, pkt_next,
++					    ret == 0);
+ 	}
+ 	return ret;
+ }
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
+@@ -483,7 +483,7 @@ static void brcmf_usb_tx_complete(struct
+ 		  req->skb);
+ 	brcmf_usb_del_fromq(devinfo, req);
+ 
+-	brcmf_txcomplete(devinfo->dev, req->skb, urb->status == 0);
++	brcmf_proto_bcdc_txcomplete(devinfo->dev, req->skb, urb->status == 0);
+ 	req->skb = NULL;
+ 	brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req, &devinfo->tx_freecount);
+ 	spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
diff --git a/package/kernel/mac80211/patches/323-0008-brcmfmac-wrap-brcmf_fws_add_interface-into-bcdc-laye.patch b/package/kernel/mac80211/patches/323-0008-brcmfmac-wrap-brcmf_fws_add_interface-into-bcdc-laye.patch
new file mode 100644
index 0000000..a68c6ab
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0008-brcmfmac-wrap-brcmf_fws_add_interface-into-bcdc-laye.patch
@@ -0,0 +1,95 @@
+From 9fdc64bbdbe7bd546e0fbcedd2f1c03448c6df42 Mon Sep 17 00:00:00 2001
+From: Franky Lin <franky.lin at broadcom.com>
+Date: Fri, 10 Mar 2017 21:17:04 +0000
+Subject: [PATCH] brcmfmac: wrap brcmf_fws_add_interface into bcdc layer
+
+fwsignal is only used by bcdc. Create a new protocol interface function
+brcmf_proto_add_if for core module to notify protocol layer upon a new
+interface is created.
+
+Signed-off-by: Franky Lin <franky.lin at broadcom.com>
+Signed-off-by: Arend van Spriel <arend.vanspriel at broadcom.com>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c  | 7 +++++++
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c  | 2 +-
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c  | 3 ++-
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h | 9 +++++++++
+ 4 files changed, 19 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
+@@ -399,6 +399,12 @@ static void brcmf_proto_bcdc_rxreorder(s
+ 	brcmf_fws_rxreorder(ifp, skb);
+ }
+ 
++static void
++brcmf_proto_bcdc_add_if(struct brcmf_if *ifp)
++{
++	brcmf_fws_add_interface(ifp);
++}
++
+ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
+ {
+ 	struct brcmf_bcdc *bcdc;
+@@ -422,6 +428,7 @@ int brcmf_proto_bcdc_attach(struct brcmf
+ 	drvr->proto->delete_peer = brcmf_proto_bcdc_delete_peer;
+ 	drvr->proto->add_tdls_peer = brcmf_proto_bcdc_add_tdls_peer;
+ 	drvr->proto->rxreorder = brcmf_proto_bcdc_rxreorder;
++	drvr->proto->add_if = brcmf_proto_bcdc_add_if;
+ 	drvr->proto->pd = bcdc;
+ 
+ 	drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+@@ -990,7 +990,7 @@ int brcmf_bus_started(struct device *dev
+ 	if (ret < 0)
+ 		goto fail;
+ 
+-	brcmf_fws_add_interface(ifp);
++	brcmf_proto_add_if(drvr, ifp);
+ 
+ 	drvr->config = brcmf_cfg80211_attach(drvr, bus_if->dev,
+ 					     drvr->settings->p2p_enable);
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
+@@ -25,6 +25,7 @@
+ #include "fwsignal.h"
+ #include "fweh.h"
+ #include "fwil.h"
++#include "proto.h"
+ 
+ /**
+  * struct brcmf_fweh_queue_item - event item on event queue.
+@@ -172,7 +173,7 @@ static void brcmf_fweh_handle_if_event(s
+ 		if (IS_ERR(ifp))
+ 			return;
+ 		if (!is_p2pdev)
+-			brcmf_fws_add_interface(ifp);
++			brcmf_proto_add_if(drvr, ifp);
+ 		if (!drvr->fweh.evt_handler[BRCMF_E_IF])
+ 			if (brcmf_net_attach(ifp, false) < 0)
+ 				return;
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
+@@ -44,6 +44,7 @@ struct brcmf_proto {
+ 	void (*add_tdls_peer)(struct brcmf_pub *drvr, int ifidx,
+ 			      u8 peer[ETH_ALEN]);
+ 	void (*rxreorder)(struct brcmf_if *ifp, struct sk_buff *skb);
++	void (*add_if)(struct brcmf_if *ifp);
+ 	void *pd;
+ };
+ 
+@@ -118,4 +119,12 @@ brcmf_proto_rxreorder(struct brcmf_if *i
+ 	ifp->drvr->proto->rxreorder(ifp, skb);
+ }
+ 
++static inline void
++brcmf_proto_add_if(struct brcmf_pub *drvr, struct brcmf_if *ifp)
++{
++	if (!drvr->proto->add_if)
++		return;
++	drvr->proto->add_if(ifp);
++}
++
+ #endif /* BRCMFMAC_PROTO_H */
diff --git a/package/kernel/mac80211/patches/323-0009-brcmfmac-wrap-brcmf_fws_del_interface-into-bcdc-laye.patch b/package/kernel/mac80211/patches/323-0009-brcmfmac-wrap-brcmf_fws_del_interface-into-bcdc-laye.patch
new file mode 100644
index 0000000..ded8d7b
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0009-brcmfmac-wrap-brcmf_fws_del_interface-into-bcdc-laye.patch
@@ -0,0 +1,83 @@
+From c02a5eb82056f75615cb48aa540bfd245f489b99 Mon Sep 17 00:00:00 2001
+From: Franky Lin <franky.lin at broadcom.com>
+Date: Fri, 10 Mar 2017 21:17:05 +0000
+Subject: [PATCH] brcmfmac: wrap brcmf_fws_del_interface into bcdc layer
+
+Create a new protocol interface function brcmf_proto_del_if for core
+module to notify protocol layer upon interface deletion.
+
+Signed-off-by: Franky Lin <franky.lin at broadcom.com>
+Signed-off-by: Arend van Spriel <arend.vanspriel at broadcom.com>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c  | 7 +++++++
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c  | 4 ++--
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h | 9 +++++++++
+ 3 files changed, 18 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
+@@ -405,6 +405,12 @@ brcmf_proto_bcdc_add_if(struct brcmf_if
+ 	brcmf_fws_add_interface(ifp);
+ }
+ 
++static void
++brcmf_proto_bcdc_del_if(struct brcmf_if *ifp)
++{
++	brcmf_fws_del_interface(ifp);
++}
++
+ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
+ {
+ 	struct brcmf_bcdc *bcdc;
+@@ -429,6 +435,7 @@ int brcmf_proto_bcdc_attach(struct brcmf
+ 	drvr->proto->add_tdls_peer = brcmf_proto_bcdc_add_tdls_peer;
+ 	drvr->proto->rxreorder = brcmf_proto_bcdc_rxreorder;
+ 	drvr->proto->add_if = brcmf_proto_bcdc_add_if;
++	drvr->proto->del_if = brcmf_proto_bcdc_del_if;
+ 	drvr->proto->pd = bcdc;
+ 
+ 	drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+@@ -706,7 +706,7 @@ void brcmf_remove_interface(struct brcmf
+ 		return;
+ 	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", ifp->bsscfgidx,
+ 		  ifp->ifidx);
+-	brcmf_fws_del_interface(ifp);
++	brcmf_proto_del_if(ifp->drvr, ifp);
+ 	brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked);
+ }
+ 
+@@ -1035,7 +1035,7 @@ fail:
+ 		drvr->config = NULL;
+ 	}
+ 	if (drvr->fws) {
+-		brcmf_fws_del_interface(ifp);
++		brcmf_proto_del_if(ifp->drvr, ifp);
+ 		brcmf_fws_deinit(drvr);
+ 	}
+ 	brcmf_net_detach(ifp->ndev, false);
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
+@@ -45,6 +45,7 @@ struct brcmf_proto {
+ 			      u8 peer[ETH_ALEN]);
+ 	void (*rxreorder)(struct brcmf_if *ifp, struct sk_buff *skb);
+ 	void (*add_if)(struct brcmf_if *ifp);
++	void (*del_if)(struct brcmf_if *ifp);
+ 	void *pd;
+ };
+ 
+@@ -127,4 +128,12 @@ brcmf_proto_add_if(struct brcmf_pub *drv
+ 	drvr->proto->add_if(ifp);
+ }
+ 
++static inline void
++brcmf_proto_del_if(struct brcmf_pub *drvr, struct brcmf_if *ifp)
++{
++	if (!drvr->proto->del_if)
++		return;
++	drvr->proto->del_if(ifp);
++}
++
+ #endif /* BRCMFMAC_PROTO_H */
diff --git a/package/kernel/mac80211/patches/323-0010-brcmfmac-wrap-brcmf_fws_reset_interface-into-bcdc-la.patch b/package/kernel/mac80211/patches/323-0010-brcmfmac-wrap-brcmf_fws_reset_interface-into-bcdc-la.patch
new file mode 100644
index 0000000..34e71d8
--- /dev/null
+++ b/package/kernel/mac80211/patches/323-0010-brcmfmac-wrap-brcmf_fws_reset_interface-into-bcdc-la.patch
@@ -0,0 +1,82 @@
+From 66ded1f8b33cdd9d6d3e20f5f8dd23615a110e70 Mon Sep 17 00:00:00 2001
+From: Franky Lin <franky.lin at broadcom.com>
+Date: Fri, 10 Mar 2017 21:17:06 +0000
+Subject: [PATCH] brcmfmac: wrap brcmf_fws_reset_interface into bcdc layer
+
+Create a new protocol interface function brcmf_proto_reset_if for core
+module to notify protocol layer when interface role changes.
+
+Signed-off-by: Franky Lin <franky.lin at broadcom.com>
+Signed-off-by: Arend van Spriel <arend.vanspriel at broadcom.com>
+Signed-off-by: Kalle Valo <kvalo at codeaurora.org>
+---
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c  | 7 +++++++
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c  | 3 +--
+ drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h | 9 +++++++++
+ 3 files changed, 17 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
+@@ -411,6 +411,12 @@ brcmf_proto_bcdc_del_if(struct brcmf_if
+ 	brcmf_fws_del_interface(ifp);
+ }
+ 
++static void
++brcmf_proto_bcdc_reset_if(struct brcmf_if *ifp)
++{
++	brcmf_fws_reset_interface(ifp);
++}
++
+ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
+ {
+ 	struct brcmf_bcdc *bcdc;
+@@ -436,6 +442,7 @@ int brcmf_proto_bcdc_attach(struct brcmf
+ 	drvr->proto->rxreorder = brcmf_proto_bcdc_rxreorder;
+ 	drvr->proto->add_if = brcmf_proto_bcdc_add_if;
+ 	drvr->proto->del_if = brcmf_proto_bcdc_del_if;
++	drvr->proto->reset_if = brcmf_proto_bcdc_reset_if;
+ 	drvr->proto->pd = bcdc;
+ 
+ 	drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c
+@@ -22,7 +22,6 @@
+ #include "core.h"
+ #include "debug.h"
+ #include "tracepoint.h"
+-#include "fwsignal.h"
+ #include "fweh.h"
+ #include "fwil.h"
+ #include "proto.h"
+@@ -180,7 +179,7 @@ static void brcmf_fweh_handle_if_event(s
+ 	}
+ 
+ 	if (ifp && ifevent->action == BRCMF_E_IF_CHANGE)
+-		brcmf_fws_reset_interface(ifp);
++		brcmf_proto_reset_if(drvr, ifp);
+ 
+ 	err = brcmf_fweh_call_event_handler(ifp, emsg->event_code, emsg, data);
+ 
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
+@@ -46,6 +46,7 @@ struct brcmf_proto {
+ 	void (*rxreorder)(struct brcmf_if *ifp, struct sk_buff *skb);
+ 	void (*add_if)(struct brcmf_if *ifp);
+ 	void (*del_if)(struct brcmf_if *ifp);
++	void (*reset_if)(struct brcmf_if *ifp);
+ 	void *pd;
+ };
+ 
+@@ -136,4 +137,12 @@ brcmf_proto_del_if(struct brcmf_pub *drv
+ 	drvr->proto->del_if(ifp);
+ }
+ 
++static inline void
++brcmf_proto_reset_if(struct brcmf_pub *drvr, struct brcmf_if *ifp)
++{
++	if (!drvr->proto->reset_if)
++		return;
++	drvr->proto->reset_if(ifp);
++}
++
+ #endif /* BRCMFMAC_PROTO_H */
diff --git a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch
index 51de76e..9183118 100644
--- a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch
+++ b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch
@@ -13,7 +13,7 @@ Signed-off-by: Rafał Miłecki <zajec5 at gmail.com>
 
 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1218,6 +1218,7 @@ int __init brcmf_core_init(void)
+@@ -1180,6 +1180,7 @@ int __init brcmf_core_init(void)
  {
  	if (!schedule_work(&brcmf_driver_work))
  		return -EBUSY;



More information about the lede-commits mailing list