diff options
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/bcdc.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c | 37 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/proto.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/proto.h | 14 |
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 | ||
332 | static int | ||
333 | brcmf_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 | |||
332 | int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) | 341 | int 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 | ||
841 | static int brcmf_fws_hdrpush(struct brcmf_fws_info *fws, struct sk_buff *skb) | 841 | static 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 | ||
895 | static bool brcmf_fws_tim_update(struct brcmf_fws_info *fws, | 893 | static 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 | ||
1722 | static void brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo, | 1719 | static 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 | ||
1743 | static void brcmf_fws_rollback_toq(struct brcmf_fws_info *fws, | 1740 | static 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 | ||
19 | struct brcmf_proto { | 19 | struct 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 { | |||
32 | int brcmf_proto_attach(struct brcmf_pub *drvr); | 32 | int brcmf_proto_attach(struct brcmf_pub *drvr); |
33 | void brcmf_proto_detach(struct brcmf_pub *drvr); | 33 | void brcmf_proto_detach(struct brcmf_pub *drvr); |
34 | 34 | ||
35 | static 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 | } | ||
40 | static inline int brcmf_proto_hdrpull(struct brcmf_pub *drvr, bool do_fws, | 35 | static 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 | } |
50 | static 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 */ |