Commit 5491c11c authored by Franky Lin's avatar Franky Lin Committed by John W. Linville

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: default avatarArend Van Spriel <arend@broadcom.com>
Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: default avatarFranky Lin <frankyl@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 74347856
...@@ -1786,10 +1786,15 @@ brcmf_sdbrcm_wait_event_wakeup(struct brcmf_sdio *bus) ...@@ -1786,10 +1786,15 @@ brcmf_sdbrcm_wait_event_wakeup(struct brcmf_sdio *bus)
return; return;
} }
/**
* struct brcmf_skbuff_cb reserves first two bytes in sk_buff::cb for
* bus layer usage.
*/
/* flag marking a dummy skb added for DMA alignment requirement */ /* flag marking a dummy skb added for DMA alignment requirement */
#define DUMMY_SKB_FLAG 0x10000 #define ALIGN_SKB_FLAG 0x8000
/* bit mask of data length chopped from the previous packet */ /* bit mask of data length chopped from the previous packet */
#define DUMMY_SKB_CHOP_LEN_MASK 0xffff #define ALIGN_SKB_CHOP_LEN_MASK 0x7fff
/** /**
* brcmf_sdio_txpkt_prep - packet preparation for transmit * brcmf_sdio_txpkt_prep - packet preparation for transmit
* @bus: brcmf_sdio structure pointer * @bus: brcmf_sdio structure pointer
...@@ -1854,7 +1859,7 @@ brcmf_sdio_txpkt_prep(struct brcmf_sdio *bus, struct sk_buff_head *pktq, ...@@ -1854,7 +1859,7 @@ brcmf_sdio_txpkt_prep(struct brcmf_sdio *bus, struct sk_buff_head *pktq,
memcpy(pkt_new->data, memcpy(pkt_new->data,
pkt_next->data + pkt_next->len - tail_chop, pkt_next->data + pkt_next->len - tail_chop,
tail_chop); tail_chop);
*(u32 *)(pkt_new->cb) = DUMMY_SKB_FLAG + tail_chop; *(u32 *)(pkt_new->cb) = ALIGN_SKB_FLAG + tail_chop;
skb_trim(pkt_next, pkt_next->len - tail_chop); skb_trim(pkt_next, pkt_next->len - tail_chop);
__skb_queue_after(pktq, pkt_next, pkt_new); __skb_queue_after(pktq, pkt_next, pkt_new);
} else { } else {
...@@ -1908,8 +1913,8 @@ brcmf_sdio_txpkt_postp(struct brcmf_sdio *bus, struct sk_buff_head *pktq) ...@@ -1908,8 +1913,8 @@ brcmf_sdio_txpkt_postp(struct brcmf_sdio *bus, struct sk_buff_head *pktq)
skb_queue_walk_safe(pktq, pkt_next, tmp) { skb_queue_walk_safe(pktq, pkt_next, tmp) {
dummy_flags = *(u32 *)(pkt_next->cb); dummy_flags = *(u32 *)(pkt_next->cb);
if (dummy_flags & DUMMY_SKB_FLAG) { if (dummy_flags & ALIGN_SKB_FLAG) {
chop_len = dummy_flags & DUMMY_SKB_CHOP_LEN_MASK; chop_len = dummy_flags & ALIGN_SKB_CHOP_LEN_MASK;
if (chop_len) { if (chop_len) {
pkt_prev = pkt_next->prev; pkt_prev = pkt_next->prev;
memcpy(pkt_prev->data + pkt_prev->len, memcpy(pkt_prev->data + pkt_prev->len,
......
...@@ -168,6 +168,7 @@ enum brcmf_fws_skb_state { ...@@ -168,6 +168,7 @@ enum brcmf_fws_skb_state {
/** /**
* struct brcmf_skbuff_cb - control buffer associated with skbuff. * struct brcmf_skbuff_cb - control buffer associated with skbuff.
* *
* @bus_flags: 2 bytes reserved for bus specific parameters
* @if_flags: holds interface index and packet related flags. * @if_flags: holds interface index and packet related flags.
* @htod: host to device packet identifier (used in PKTTAG tlv). * @htod: host to device packet identifier (used in PKTTAG tlv).
* @state: transmit state of the packet. * @state: transmit state of the packet.
...@@ -177,6 +178,7 @@ enum brcmf_fws_skb_state { ...@@ -177,6 +178,7 @@ enum brcmf_fws_skb_state {
* provides 48 bytes of storage so this structure should not exceed that. * provides 48 bytes of storage so this structure should not exceed that.
*/ */
struct brcmf_skbuff_cb { struct brcmf_skbuff_cb {
u16 bus_flags;
u16 if_flags; u16 if_flags;
u32 htod; u32 htod;
enum brcmf_fws_skb_state state; enum brcmf_fws_skb_state state;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment