aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 */