2017-02-27 12:44:04

by Rafał Miłecki

[permalink] [raw]
Subject: [PATCH 4.12] brcmfmac: move brcmf_txcomplete function to fwsignal.c

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

This function is called by USB and SDIO only, both using BCDC & FW
Signalling. Move it out of core.c to make this file more generic and
allow making fwsignal optional in the future.

Signed-off-by: Rafał Miłecki <[email protected]>
---
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 3 ---
.../net/wireless/broadcom/brcm80211/brcmfmac/core.c | 18 ------------------
.../wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 18 ++++++++++++++++++
.../wireless/broadcom/brcm80211/brcmfmac/fwsignal.h | 5 +++++
.../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 +-
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 2 +-
6 files changed, 25 insertions(+), 23 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
index 76693df34742..059e40fdc3d5 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -232,9 +232,6 @@ 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);
-
/* Configure the "global" bus state used by upper layers */
void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state);

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
index 59831dc446d6..47cfb82dbfeb 100644
--- 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 *ifp, struct sk_buff *txp, bool success)
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)
{
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
index 5f1a5929cb30..07f0b3cfd59c 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
@@ -2445,6 +2445,24 @@ bool brcmf_fws_fc_active(struct brcmf_fws_info *fws)
return fws->fcmode != BRCMF_FWS_FCMODE_NONE;
}

+void brcmf_fws_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);
+ }
+}
+
void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb)
{
u32 hslot;
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
index bb4591c4a14a..d534164785de 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
@@ -32,6 +32,11 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb);
void brcmf_fws_reset_interface(struct brcmf_if *ifp);
void brcmf_fws_add_interface(struct brcmf_if *ifp);
void brcmf_fws_del_interface(struct brcmf_if *ifp);
+
+/* Notify the bus has transferred the tx packet to firmware */
+void brcmf_fws_txcomplete(struct device *dev, struct sk_buff *txp,
+ bool success);
+
void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb);
void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked);
void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 10522edc9750..1d7ca341fb9f 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -2266,7 +2266,7 @@ static int brcmf_sdio_txpkt(struct brcmf_sdio *bus, struct sk_buff_head *pktq,
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_fws_txcomplete(bus->sdiodev->dev, pkt_next, ret == 0);
}
return ret;
}
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
index c527aa8a5f8f..29f83a575e4d 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
@@ -484,7 +484,7 @@ static void brcmf_usb_tx_complete(struct urb *urb)
req->skb);
brcmf_usb_del_fromq(devinfo, req);

- brcmf_txcomplete(devinfo->dev, req->skb, urb->status == 0);
+ brcmf_fws_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);
--
2.11.0


2017-02-27 18:08:31

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 4.12] brcmfmac: move brcmf_txcomplete function to fwsignal.c

Hi Rafał,

[auto build test ERROR on wireless-drivers-next/master]
[also build test ERROR on next-20170227]
[cannot apply to v4.10]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/Rafa-Mi-ecki/brcmfmac-move-brcmf_txcomplete-function-to-fwsignal-c/20170228-004934
base: https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git master
config: i386-allmodconfig (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
# save the attached .config to linux build tree
make ARCH=i386

All errors (new ones prefixed by >>):

drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c: In function 'brcmf_sdio_txpkt':
>> drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c:2268:3: error: implicit declaration of function 'brcmf_fws_txcomplete' [-Werror=implicit-function-declaration]
brcmf_fws_txcomplete(bus->sdiodev->dev, pkt_next, ret == 0);
^~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
--
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c: In function 'brcmf_usb_tx_complete':
>> drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c:485:2: error: implicit declaration of function 'brcmf_fws_txcomplete' [-Werror=implicit-function-declaration]
brcmf_fws_txcomplete(devinfo->dev, req->skb, urb->status == 0);
^~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors

vim +/brcmf_fws_txcomplete +2268 drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c

2262 done:
2263 brcmf_sdio_txpkt_postp(bus, pktq);
2264 if (ret == 0)
2265 bus->tx_seq = (bus->tx_seq + pktq->qlen) % SDPCM_SEQ_WRAP;
2266 skb_queue_walk_safe(pktq, pkt_next, tmp) {
2267 __skb_unlink(pkt_next, pktq);
> 2268 brcmf_fws_txcomplete(bus->sdiodev->dev, pkt_next, ret == 0);
2269 }
2270 return ret;
2271 }

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


Attachments:
(No filename) (2.04 kB)
.config.gz (56.60 kB)
Download all attachments

2017-03-03 18:52:10

by Franky Lin

[permalink] [raw]
Subject: Re: [PATCH 4.12 V2] brcmfmac: move brcmf_txcomplete function to fwsignal.c

Hi Rafal,

On Thu, Mar 2, 2017 at 10:38 PM, Rafa=C5=82 Mi=C5=82ecki <[email protected]>=
wrote:
> From: Rafa=C5=82 Mi=C5=82ecki <[email protected]>
>
> This function is called by USB and SDIO only, both using BCDC & FW
> Signalling. Move it out of core.c to make this file more generic and
> allow making fwsignal optional in the future.

Same with the brcmf_txflowblock patch, it would be better to wrap
fwsignal in bcdc
as a protocol feature. I am preparing a train to do that for these two
functions along
with others. Hopefully we will post them next week after internal review.

Again, sorry for the stall on this.

Thanks,
Franky

> Signed-off-by: Rafa=C5=82 Mi=C5=82ecki <[email protected]>
> ---
> V2: Make code with this patch compile when not based on top of (to be dro=
pped)
> [PATCH 4.12] brcmfmac: get rid of brcmf_txflowblock helper function
> ---
> drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 3 ---
> .../net/wireless/broadcom/brcm80211/brcmfmac/core.c | 18 ------------=
------
> .../wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 18 ++++++++++++=
++++++
> .../wireless/broadcom/brcm80211/brcmfmac/fwsignal.h | 9 +++++++++
> .../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 3 ++-
> drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 3 ++-
> 6 files changed, 31 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/dri=
vers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
> index 76693df34742..059e40fdc3d5 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
> @@ -232,9 +232,6 @@ 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 succ=
ess);
> -
> /* Configure the "global" bus state used by upper layers */
> void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state =
state);
>
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/dr=
ivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
> index 2f2f3a5ad86a..45ed24049b37 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
> @@ -393,24 +393,6 @@ void brcmf_txfinalize(struct brcmf_if *ifp, struct s=
k_buff *txp, bool success)
> brcmu_pkt_buf_free_skb(txp);
> }
>
> -void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool succ=
ess)
> -{
> - struct brcmf_bus *bus_if =3D dev_get_drvdata(dev);
> - struct brcmf_pub *drvr =3D 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)
> {
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c =
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
> index 5f1a5929cb30..07f0b3cfd59c 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
> @@ -2445,6 +2445,24 @@ bool brcmf_fws_fc_active(struct brcmf_fws_info *fw=
s)
> return fws->fcmode !=3D BRCMF_FWS_FCMODE_NONE;
> }
>
> +void brcmf_fws_txcomplete(struct device *dev, struct sk_buff *txp, bool =
success)
> +{
> + struct brcmf_bus *bus_if =3D dev_get_drvdata(dev);
> + struct brcmf_pub *drvr =3D 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);
> + }
> +}
> +
> void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb=
)
> {
> u32 hslot;
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h =
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
> index 96df66073b2a..d534164785de 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
> @@ -18,6 +18,10 @@
> #ifndef FWSIGNAL_H_
> #define FWSIGNAL_H_
>
> +struct brcmf_fws_info;
> +struct brcmf_if;
> +struct brcmf_pub;
> +
> int brcmf_fws_init(struct brcmf_pub *drvr);
> void brcmf_fws_deinit(struct brcmf_pub *drvr);
> bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws);
> @@ -28,6 +32,11 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct=
sk_buff *skb);
> void brcmf_fws_reset_interface(struct brcmf_if *ifp);
> void brcmf_fws_add_interface(struct brcmf_if *ifp);
> void brcmf_fws_del_interface(struct brcmf_if *ifp);
> +
> +/* Notify the bus has transferred the tx packet to firmware */
> +void brcmf_fws_txcomplete(struct device *dev, struct sk_buff *txp,
> + bool success);
> +
> void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb=
);
> void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked);
> void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb);
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/dr=
ivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
> index c5744b45ec8f..22d21643ed8c 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
> @@ -42,6 +42,7 @@
> #include "sdio.h"
> #include "chip.h"
> #include "firmware.h"
> +#include "fwsignal.h"
> #include "core.h"
> #include "common.h"
>
> @@ -2265,7 +2266,7 @@ static int brcmf_sdio_txpkt(struct brcmf_sdio *bus,=
struct sk_buff_head *pktq,
> bus->tx_seq =3D (bus->tx_seq + pktq->qlen) % SDPCM_SEQ_WR=
AP;
> skb_queue_walk_safe(pktq, pkt_next, tmp) {
> __skb_unlink(pkt_next, pktq);
> - brcmf_txcomplete(bus->sdiodev->dev, pkt_next, ret =3D=3D =
0);
> + brcmf_fws_txcomplete(bus->sdiodev->dev, pkt_next, ret =3D=
=3D 0);
> }
> return ret;
> }
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/dri=
vers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
> index d93ebbdc7737..676c28081dc5 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
> @@ -26,6 +26,7 @@
> #include "bus.h"
> #include "debug.h"
> #include "firmware.h"
> +#include "fwsignal.h"
> #include "usb.h"
> #include "core.h"
> #include "common.h"
> @@ -482,7 +483,7 @@ static void brcmf_usb_tx_complete(struct urb *urb)
> req->skb);
> brcmf_usb_del_fromq(devinfo, req);
>
> - brcmf_txcomplete(devinfo->dev, req->skb, urb->status =3D=3D 0);
> + brcmf_fws_txcomplete(devinfo->dev, req->skb, urb->status =3D=3D 0=
);
> req->skb =3D NULL;
> brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req, &devinfo->tx_free=
count);
> spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
> --
> 2.11.0
>

2017-03-03 07:09:30

by Rafał Miłecki

[permalink] [raw]
Subject: [PATCH 4.12 V2] brcmfmac: move brcmf_txcomplete function to fwsignal.c

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

This function is called by USB and SDIO only, both using BCDC & FW
Signalling. Move it out of core.c to make this file more generic and
allow making fwsignal optional in the future.

Signed-off-by: Rafał Miłecki <[email protected]>
---
V2: Make code with this patch compile when not based on top of (to be dropped)
[PATCH 4.12] brcmfmac: get rid of brcmf_txflowblock helper function
---
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 3 ---
.../net/wireless/broadcom/brcm80211/brcmfmac/core.c | 18 ------------------
.../wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 18 ++++++++++++++++++
.../wireless/broadcom/brcm80211/brcmfmac/fwsignal.h | 9 +++++++++
.../net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 3 ++-
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 3 ++-
6 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
index 76693df34742..059e40fdc3d5 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
@@ -232,9 +232,6 @@ 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);
-
/* Configure the "global" bus state used by upper layers */
void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state);

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
index 2f2f3a5ad86a..45ed24049b37 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
@@ -393,24 +393,6 @@ void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success)
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)
{
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
index 5f1a5929cb30..07f0b3cfd59c 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
@@ -2445,6 +2445,24 @@ bool brcmf_fws_fc_active(struct brcmf_fws_info *fws)
return fws->fcmode != BRCMF_FWS_FCMODE_NONE;
}

+void brcmf_fws_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);
+ }
+}
+
void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb)
{
u32 hslot;
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
index 96df66073b2a..d534164785de 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
@@ -18,6 +18,10 @@
#ifndef FWSIGNAL_H_
#define FWSIGNAL_H_

+struct brcmf_fws_info;
+struct brcmf_if;
+struct brcmf_pub;
+
int brcmf_fws_init(struct brcmf_pub *drvr);
void brcmf_fws_deinit(struct brcmf_pub *drvr);
bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws);
@@ -28,6 +32,11 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb);
void brcmf_fws_reset_interface(struct brcmf_if *ifp);
void brcmf_fws_add_interface(struct brcmf_if *ifp);
void brcmf_fws_del_interface(struct brcmf_if *ifp);
+
+/* Notify the bus has transferred the tx packet to firmware */
+void brcmf_fws_txcomplete(struct device *dev, struct sk_buff *txp,
+ bool success);
+
void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb);
void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked);
void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index c5744b45ec8f..22d21643ed8c 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -42,6 +42,7 @@
#include "sdio.h"
#include "chip.h"
#include "firmware.h"
+#include "fwsignal.h"
#include "core.h"
#include "common.h"

@@ -2265,7 +2266,7 @@ static int brcmf_sdio_txpkt(struct brcmf_sdio *bus, struct sk_buff_head *pktq,
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_fws_txcomplete(bus->sdiodev->dev, pkt_next, ret == 0);
}
return ret;
}
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
index d93ebbdc7737..676c28081dc5 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
@@ -26,6 +26,7 @@
#include "bus.h"
#include "debug.h"
#include "firmware.h"
+#include "fwsignal.h"
#include "usb.h"
#include "core.h"
#include "common.h"
@@ -482,7 +483,7 @@ static void brcmf_usb_tx_complete(struct urb *urb)
req->skb);
brcmf_usb_del_fromq(devinfo, req);

- brcmf_txcomplete(devinfo->dev, req->skb, urb->status == 0);
+ brcmf_fws_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);
--
2.11.0