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>
This commit is contained in:
committed by
John W. Linville
parent
7434785652
commit
5491c11c67
@@ -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,
|
|||||||
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)
|
|||||||
|
|
||||||
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 {
|
|||||||
/**
|
/**
|
||||||
* 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 {
|
|||||||
* 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;
|
||||||
|
Reference in New Issue
Block a user