aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211
diff options
context:
space:
mode:
authorHante Meuleman <meuleman@broadcom.com>2013-12-12 05:59:03 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-12-18 15:22:55 -0500
commit7b8a466e7cd36fc2acdba5c22a594e75d9b9f61a (patch)
treeba974d354c3c5f141d9cdd80618bb277c3f76550 /drivers/net/wireless/brcm80211
parent943258b6a3b1fe4b54dd579b9e2e5bec1d9af407 (diff)
brcmfmac: Combine protocol push hdr and bus txdata.
For the transmission of data a protocol push hdr is performed followed by a bus txdata call. For the new protocol msgbuf this is not workable. Since they are already "loosely" coupled for bcdc protocol they are combined. This means that txdata will go "through" the protocol layer and a seperate protocol push hdr will not be needed anymore. Reviewed-by: Arend Van Spriel <arend@broadcom.com> Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Hante Meuleman <meuleman@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/bcdc.c11
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c37
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/proto.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/proto.h14
4 files changed, 35 insertions, 29 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c b/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
index ee861427117e..12c27d13df7f 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
@@ -329,6 +329,15 @@ brcmf_proto_bcdc_hdrpull(struct brcmf_pub *drvr, bool do_fws, u8 *ifidx,
329 return 0; 329 return 0;
330} 330}
331 331
332static int
333brcmf_proto_bcdc_txdata(struct brcmf_pub *drvr, int ifidx, u8 offset,
334 struct sk_buff *pktbuf)
335{
336 brcmf_proto_bcdc_hdrpush(drvr, ifidx, offset, pktbuf);
337 return brcmf_bus_txdata(drvr->bus_if, pktbuf);
338}
339
340
332int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) 341int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
333{ 342{
334 struct brcmf_bcdc *bcdc; 343 struct brcmf_bcdc *bcdc;
@@ -343,10 +352,10 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
343 goto fail; 352 goto fail;
344 } 353 }
345 354
346 drvr->proto->hdrpush = brcmf_proto_bcdc_hdrpush;
347 drvr->proto->hdrpull = brcmf_proto_bcdc_hdrpull; 355 drvr->proto->hdrpull = brcmf_proto_bcdc_hdrpull;
348 drvr->proto->query_dcmd = brcmf_proto_bcdc_query_dcmd; 356 drvr->proto->query_dcmd = brcmf_proto_bcdc_query_dcmd;
349 drvr->proto->set_dcmd = brcmf_proto_bcdc_set_dcmd; 357 drvr->proto->set_dcmd = brcmf_proto_bcdc_set_dcmd;
358 drvr->proto->txdata = brcmf_proto_bcdc_txdata;
350 drvr->proto->pd = bcdc; 359 drvr->proto->pd = bcdc;
351 360
352 drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES; 361 drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
index a5937840f0a7..7918c1033662 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
@@ -838,7 +838,7 @@ static void brcmf_fws_cleanup(struct brcmf_fws_info *fws, int ifidx)
838 brcmf_fws_hanger_cleanup(fws, matchfn, ifidx); 838 brcmf_fws_hanger_cleanup(fws, matchfn, ifidx);
839} 839}
840 840
841static int brcmf_fws_hdrpush(struct brcmf_fws_info *fws, struct sk_buff *skb) 841static u8 brcmf_fws_hdrpush(struct brcmf_fws_info *fws, struct sk_buff *skb)
842{ 842{
843 struct brcmf_fws_mac_descriptor *entry = brcmf_skbcb(skb)->mac; 843 struct brcmf_fws_mac_descriptor *entry = brcmf_skbcb(skb)->mac;
844 u8 *wlh; 844 u8 *wlh;
@@ -887,9 +887,7 @@ static int brcmf_fws_hdrpush(struct brcmf_fws_info *fws, struct sk_buff *skb)
887 if (fillers) 887 if (fillers)
888 memset(wlh, BRCMF_FWS_TYPE_FILLER, fillers); 888 memset(wlh, BRCMF_FWS_TYPE_FILLER, fillers);
889 889
890 brcmf_proto_hdrpush(fws->drvr, brcmf_skb_if_flags_get_field(skb, INDEX), 890 return (u8)(data_offset >> 2);
891 data_offset >> 2, skb);
892 return 0;
893} 891}
894 892
895static bool brcmf_fws_tim_update(struct brcmf_fws_info *fws, 893static bool brcmf_fws_tim_update(struct brcmf_fws_info *fws,
@@ -897,10 +895,11 @@ static bool brcmf_fws_tim_update(struct brcmf_fws_info *fws,
897 int fifo, bool send_immediately) 895 int fifo, bool send_immediately)
898{ 896{
899 struct sk_buff *skb; 897 struct sk_buff *skb;
900 struct brcmf_bus *bus;
901 struct brcmf_skbuff_cb *skcb; 898 struct brcmf_skbuff_cb *skcb;
902 s32 err; 899 s32 err;
903 u32 len; 900 u32 len;
901 u8 data_offset;
902 int ifidx;
904 903
905 /* check delayedQ and suppressQ in one call using bitmap */ 904 /* check delayedQ and suppressQ in one call using bitmap */
906 if (brcmu_pktq_mlen(&entry->psq, 3 << (fifo * 2)) == 0) 905 if (brcmu_pktq_mlen(&entry->psq, 3 << (fifo * 2)) == 0)
@@ -928,13 +927,11 @@ static bool brcmf_fws_tim_update(struct brcmf_fws_info *fws,
928 skcb->state = BRCMF_FWS_SKBSTATE_TIM; 927 skcb->state = BRCMF_FWS_SKBSTATE_TIM;
929 skcb->htod = 0; 928 skcb->htod = 0;
930 skcb->htod_seq = 0; 929 skcb->htod_seq = 0;
931 bus = fws->drvr->bus_if; 930 data_offset = brcmf_fws_hdrpush(fws, skb);
932 err = brcmf_fws_hdrpush(fws, skb); 931 ifidx = brcmf_skb_if_flags_get_field(skb, INDEX);
933 if (err == 0) { 932 brcmf_fws_unlock(fws);
934 brcmf_fws_unlock(fws); 933 err = brcmf_proto_txdata(fws->drvr, ifidx, data_offset, skb);
935 err = brcmf_bus_txdata(bus, skb); 934 brcmf_fws_lock(fws);
936 brcmf_fws_lock(fws);
937 }
938 if (err) 935 if (err)
939 brcmu_pkt_buf_free_skb(skb); 936 brcmu_pkt_buf_free_skb(skb);
940 return true; 937 return true;
@@ -1719,7 +1716,7 @@ int brcmf_fws_hdrpull(struct brcmf_pub *drvr, int ifidx, s16 signal_len,
1719 return 0; 1716 return 0;
1720} 1717}
1721 1718
1722static void brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo, 1719static u8 brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo,
1723 struct sk_buff *p) 1720 struct sk_buff *p)
1724{ 1721{
1725 struct brcmf_skbuff_cb *skcb = brcmf_skbcb(p); 1722 struct brcmf_skbuff_cb *skcb = brcmf_skbcb(p);
@@ -1737,7 +1734,7 @@ static void brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo,
1737 flags |= BRCMF_FWS_HTOD_FLAG_PKT_REQUESTED; 1734 flags |= BRCMF_FWS_HTOD_FLAG_PKT_REQUESTED;
1738 } 1735 }
1739 brcmf_skb_htod_tag_set_field(p, FLAGS, flags); 1736 brcmf_skb_htod_tag_set_field(p, FLAGS, flags);
1740 brcmf_fws_hdrpush(fws, p); 1737 return brcmf_fws_hdrpush(fws, p);
1741} 1738}
1742 1739
1743static void brcmf_fws_rollback_toq(struct brcmf_fws_info *fws, 1740static void brcmf_fws_rollback_toq(struct brcmf_fws_info *fws,
@@ -1805,20 +1802,21 @@ static int brcmf_fws_commit_skb(struct brcmf_fws_info *fws, int fifo,
1805{ 1802{
1806 struct brcmf_skbuff_cb *skcb = brcmf_skbcb(skb); 1803 struct brcmf_skbuff_cb *skcb = brcmf_skbcb(skb);
1807 struct brcmf_fws_mac_descriptor *entry; 1804 struct brcmf_fws_mac_descriptor *entry;
1808 struct brcmf_bus *bus = fws->drvr->bus_if;
1809 int rc; 1805 int rc;
1810 u8 ifidx; 1806 u8 ifidx;
1807 u8 data_offset;
1811 1808
1812 entry = skcb->mac; 1809 entry = skcb->mac;
1813 if (IS_ERR(entry)) 1810 if (IS_ERR(entry))
1814 return PTR_ERR(entry); 1811 return PTR_ERR(entry);
1815 1812
1816 brcmf_fws_precommit_skb(fws, fifo, skb); 1813 data_offset = brcmf_fws_precommit_skb(fws, fifo, skb);
1817 entry->transit_count++; 1814 entry->transit_count++;
1818 if (entry->suppressed) 1815 if (entry->suppressed)
1819 entry->suppr_transit_count++; 1816 entry->suppr_transit_count++;
1817 ifidx = brcmf_skb_if_flags_get_field(skb, INDEX);
1820 brcmf_fws_unlock(fws); 1818 brcmf_fws_unlock(fws);
1821 rc = brcmf_bus_txdata(bus, skb); 1819 rc = brcmf_proto_txdata(fws->drvr, ifidx, data_offset, skb);
1822 brcmf_fws_lock(fws); 1820 brcmf_fws_lock(fws);
1823 brcmf_dbg(DATA, "%s flags %X htod %X bus_tx %d\n", entry->name, 1821 brcmf_dbg(DATA, "%s flags %X htod %X bus_tx %d\n", entry->name,
1824 skcb->if_flags, skcb->htod, rc); 1822 skcb->if_flags, skcb->htod, rc);
@@ -1979,10 +1977,9 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker)
1979 &skb, true); 1977 &skb, true);
1980 ifidx = brcmf_skb_if_flags_get_field(skb, 1978 ifidx = brcmf_skb_if_flags_get_field(skb,
1981 INDEX); 1979 INDEX);
1982 brcmf_proto_hdrpush(drvr, ifidx, 0, skb); 1980 /* Use proto layer to send data frame */
1983 /* Use bus module to send data frame */
1984 brcmf_fws_unlock(fws); 1981 brcmf_fws_unlock(fws);
1985 ret = brcmf_bus_txdata(drvr->bus_if, skb); 1982 ret = brcmf_proto_txdata(drvr, ifidx, 0, skb);
1986 brcmf_fws_lock(fws); 1983 brcmf_fws_lock(fws);
1987 if (ret < 0) 1984 if (ret < 0)
1988 brcmf_txfinalize(drvr, skb, false); 1985 brcmf_txfinalize(drvr, skb, false);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/proto.c b/drivers/net/wireless/brcm80211/brcmfmac/proto.c
index 87eb2bd4c072..b6b464184946 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/proto.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/proto.c
@@ -39,7 +39,7 @@ int brcmf_proto_attach(struct brcmf_pub *drvr)
39 if (brcmf_proto_bcdc_attach(drvr)) 39 if (brcmf_proto_bcdc_attach(drvr))
40 goto fail; 40 goto fail;
41 41
42 if ((proto->hdrpush == NULL) || (proto->hdrpull == NULL) || 42 if ((proto->txdata == NULL) || (proto->hdrpull == NULL) ||
43 (proto->query_dcmd == NULL) || (proto->set_dcmd == NULL)) { 43 (proto->query_dcmd == NULL) || (proto->set_dcmd == NULL)) {
44 brcmf_err("Not all proto handlers have been installed\n"); 44 brcmf_err("Not all proto handlers have been installed\n");
45 goto fail; 45 goto fail;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/proto.h b/drivers/net/wireless/brcm80211/brcmfmac/proto.h
index 8de1b3bce228..482fb0ba4a30 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/proto.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/proto.h
@@ -17,14 +17,14 @@
17#define BRCMFMAC_PROTO_H 17#define BRCMFMAC_PROTO_H
18 18
19struct brcmf_proto { 19struct brcmf_proto {
20 void (*hdrpush)(struct brcmf_pub *drvr, int ifidx, u8 offset,
21 struct sk_buff *skb);
22 int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws, u8 *ifidx, 20 int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws, u8 *ifidx,
23 struct sk_buff *skb); 21 struct sk_buff *skb);
24 int (*query_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, 22 int (*query_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd,
25 void *buf, uint len); 23 void *buf, uint len);
26 int (*set_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf, 24 int (*set_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf,
27 uint len); 25 uint len);
26 int (*txdata)(struct brcmf_pub *drvr, int ifidx, u8 offset,
27 struct sk_buff *skb);
28 void *pd; 28 void *pd;
29}; 29};
30 30
@@ -32,11 +32,6 @@ struct brcmf_proto {
32int brcmf_proto_attach(struct brcmf_pub *drvr); 32int brcmf_proto_attach(struct brcmf_pub *drvr);
33void brcmf_proto_detach(struct brcmf_pub *drvr); 33void brcmf_proto_detach(struct brcmf_pub *drvr);
34 34
35static inline void brcmf_proto_hdrpush(struct brcmf_pub *drvr, int ifidx,
36 u8 offset, struct sk_buff *skb)
37{
38 drvr->proto->hdrpush(drvr, ifidx, offset, skb);
39}
40static inline int brcmf_proto_hdrpull(struct brcmf_pub *drvr, bool do_fws, 35static inline int brcmf_proto_hdrpull(struct brcmf_pub *drvr, bool do_fws,
41 u8 *ifidx, struct sk_buff *skb) 36 u8 *ifidx, struct sk_buff *skb)
42{ 37{
@@ -52,6 +47,11 @@ static inline int brcmf_proto_set_dcmd(struct brcmf_pub *drvr, int ifidx,
52{ 47{
53 return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len); 48 return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len);
54} 49}
50static inline int brcmf_proto_txdata(struct brcmf_pub *drvr, int ifidx,
51 u8 offset, struct sk_buff *skb)
52{
53 return drvr->proto->txdata(drvr, ifidx, offset, skb);
54}
55 55
56 56
57#endif /* BRCMFMAC_PROTO_H */ 57#endif /* BRCMFMAC_PROTO_H */