diff options
author | Franky Lin <frankyl@broadcom.com> | 2013-09-25 07:05:43 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-10-03 16:24:25 -0400 |
commit | 5491c11c67f2c83c95fa9a26172bc1994580aed7 (patch) | |
tree | e314ad23e961ca7e2e4cb495c161af2ada5b51be | |
parent | 7434785652457482a4b22c280a83776c3873940d (diff) |
brcmfmac: reserve memory for bus layer in sk_buff::cb
Bus layer need to share sk_buff::cb with firmware signal feature. Reserve
necessary memory so they won't overwrite each other.
Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c | 2 |
2 files changed, 12 insertions, 5 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c index 1aa75d5951b8..f9ba4d0970d1 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | |||
@@ -1786,10 +1786,15 @@ brcmf_sdbrcm_wait_event_wakeup(struct brcmf_sdio *bus) | |||
1786 | return; | 1786 | return; |
1787 | } | 1787 | } |
1788 | 1788 | ||
1789 | /** | ||
1790 | * struct brcmf_skbuff_cb reserves first two bytes in sk_buff::cb for | ||
1791 | * bus layer usage. | ||
1792 | */ | ||
1789 | /* flag marking a dummy skb added for DMA alignment requirement */ | 1793 | /* flag marking a dummy skb added for DMA alignment requirement */ |
1790 | #define DUMMY_SKB_FLAG 0x10000 | 1794 | #define ALIGN_SKB_FLAG 0x8000 |
1791 | /* bit mask of data length chopped from the previous packet */ | 1795 | /* bit mask of data length chopped from the previous packet */ |
1792 | #define DUMMY_SKB_CHOP_LEN_MASK 0xffff | 1796 | #define ALIGN_SKB_CHOP_LEN_MASK 0x7fff |
1797 | |||
1793 | /** | 1798 | /** |
1794 | * brcmf_sdio_txpkt_prep - packet preparation for transmit | 1799 | * brcmf_sdio_txpkt_prep - packet preparation for transmit |
1795 | * @bus: brcmf_sdio structure pointer | 1800 | * @bus: brcmf_sdio structure pointer |
@@ -1854,7 +1859,7 @@ brcmf_sdio_txpkt_prep(struct brcmf_sdio *bus, struct sk_buff_head *pktq, | |||
1854 | memcpy(pkt_new->data, | 1859 | memcpy(pkt_new->data, |
1855 | pkt_next->data + pkt_next->len - tail_chop, | 1860 | pkt_next->data + pkt_next->len - tail_chop, |
1856 | tail_chop); | 1861 | tail_chop); |
1857 | *(u32 *)(pkt_new->cb) = DUMMY_SKB_FLAG + tail_chop; | 1862 | *(u32 *)(pkt_new->cb) = ALIGN_SKB_FLAG + tail_chop; |
1858 | skb_trim(pkt_next, pkt_next->len - tail_chop); | 1863 | skb_trim(pkt_next, pkt_next->len - tail_chop); |
1859 | __skb_queue_after(pktq, pkt_next, pkt_new); | 1864 | __skb_queue_after(pktq, pkt_next, pkt_new); |
1860 | } else { | 1865 | } else { |
@@ -1908,8 +1913,8 @@ brcmf_sdio_txpkt_postp(struct brcmf_sdio *bus, struct sk_buff_head *pktq) | |||
1908 | 1913 | ||
1909 | skb_queue_walk_safe(pktq, pkt_next, tmp) { | 1914 | skb_queue_walk_safe(pktq, pkt_next, tmp) { |
1910 | dummy_flags = *(u32 *)(pkt_next->cb); | 1915 | dummy_flags = *(u32 *)(pkt_next->cb); |
1911 | if (dummy_flags & DUMMY_SKB_FLAG) { | 1916 | if (dummy_flags & ALIGN_SKB_FLAG) { |
1912 | chop_len = dummy_flags & DUMMY_SKB_CHOP_LEN_MASK; | 1917 | chop_len = dummy_flags & ALIGN_SKB_CHOP_LEN_MASK; |
1913 | if (chop_len) { | 1918 | if (chop_len) { |
1914 | pkt_prev = pkt_next->prev; | 1919 | pkt_prev = pkt_next->prev; |
1915 | memcpy(pkt_prev->data + pkt_prev->len, | 1920 | memcpy(pkt_prev->data + pkt_prev->len, |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c index 82f9140f3d35..d0cd0bf95c5a 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c | |||
@@ -168,6 +168,7 @@ enum brcmf_fws_skb_state { | |||
168 | /** | 168 | /** |
169 | * struct brcmf_skbuff_cb - control buffer associated with skbuff. | 169 | * struct brcmf_skbuff_cb - control buffer associated with skbuff. |
170 | * | 170 | * |
171 | * @bus_flags: 2 bytes reserved for bus specific parameters | ||
171 | * @if_flags: holds interface index and packet related flags. | 172 | * @if_flags: holds interface index and packet related flags. |
172 | * @htod: host to device packet identifier (used in PKTTAG tlv). | 173 | * @htod: host to device packet identifier (used in PKTTAG tlv). |
173 | * @state: transmit state of the packet. | 174 | * @state: transmit state of the packet. |
@@ -177,6 +178,7 @@ enum brcmf_fws_skb_state { | |||
177 | * provides 48 bytes of storage so this structure should not exceed that. | 178 | * provides 48 bytes of storage so this structure should not exceed that. |
178 | */ | 179 | */ |
179 | struct brcmf_skbuff_cb { | 180 | struct brcmf_skbuff_cb { |
181 | u16 bus_flags; | ||
180 | u16 if_flags; | 182 | u16 if_flags; |
181 | u32 htod; | 183 | u32 htod; |
182 | enum brcmf_fws_skb_state state; | 184 | enum brcmf_fws_skb_state state; |