aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2013-04-03 06:40:35 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-04-03 15:07:05 -0400
commitebb93883cf4c4ea0b44abab254ad35fd6236177b (patch)
treeff5dccc2124629385405d2066de529124a8d2df5 /drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
parent29e04ae31ddb08794afbbef3cb72249d3804f47e (diff)
brcmfmac: add definitions for handling sk_buff control buffer data
The sk_buff structure contains a control buffer that can be used by different layers in the networking stack for holding packet associated information. In brcmfmac it is used to hold firmware signalling related information. Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Reviewed-by: Hante Meuleman <meuleman@broadcom.com> Reviewed-by: Piotr Haber <phaber@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c140
1 files changed, 107 insertions, 33 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
index 69f460b1a4e0..eba510694cb6 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
@@ -138,6 +138,113 @@ static const char *brcmf_fws_get_tlv_name(enum brcmf_fws_tlv_type id)
138#define BRCMF_FWS_PSQ_LEN 256 138#define BRCMF_FWS_PSQ_LEN 256
139 139
140/** 140/**
141 * enum brcmf_fws_skb_state - indicates processing state of skb.
142 */
143enum brcmf_fws_skb_state {
144 WLFC_PKTTYPE_NEW,
145 WLFC_PKTTYPE_DELAYED,
146 WLFC_PKTTYPE_SUPPRESSED,
147 WLFC_PKTTYPE_MAX
148};
149
150/**
151 * struct brcmf_skbuff_cb - control buffer associated with skbuff.
152 *
153 * @if_flags: holds interface index and packet related flags.
154 * @da: destination MAC address extracted from skbuff once.
155 * @htod: host to device packet identifier (used in PKTTAG tlv).
156 * @needs_hdr: the packet does not yet have a BDC header.
157 * @state: transmit state of the packet.
158 * @mac: descriptor related to destination for this packet.
159 *
160 * This information is stored in control buffer struct sk_buff::cb, which
161 * provides 48 bytes of storage so this structure should not exceed that.
162 */
163struct brcmf_skbuff_cb {
164 u16 if_flags;
165 u8 da[ETH_ALEN];
166 u32 htod;
167 u8 needs_hdr;
168 enum brcmf_fws_skb_state state;
169 struct brcmf_fws_mac_descriptor *mac;
170};
171
172/**
173 * macro casting skbuff control buffer to struct brcmf_skbuff_cb.
174 */
175#define brcmf_skbcb(skb) ((struct brcmf_skbuff_cb *)((skb)->cb))
176
177/**
178 * sk_buff control if flags
179 *
180 * b[11] - packet sent upon firmware request.
181 * b[10] - packet only contains signalling data.
182 * b[9] - packet is a tx packet.
183 * b[8] - packet uses FIFO credit (non-pspoll).
184 * b[7] - interface in AP mode.
185 * b[6:4] - AC FIFO number.
186 * b[3:0] - interface index.
187 */
188#define BRCMF_SKB_IF_FLAGS_REQUESTED_MASK 0x0800
189#define BRCMF_SKB_IF_FLAGS_REQUESTED_SHIFT 11
190#define BRCMF_SKB_IF_FLAGS_SIGNAL_ONLY_MASK 0x0400
191#define BRCMF_SKB_IF_FLAGS_SIGNAL_ONLY_SHIFT 10
192#define BRCMF_SKB_IF_FLAGS_TRANSMIT_MASK 0x0200
193#define BRCMF_SKB_IF_FLAGS_TRANSMIT_SHIFT 9
194#define BRCMF_SKB_IF_FLAGS_CREDITCHECK_MASK 0x0100
195#define BRCMF_SKB_IF_FLAGS_CREDITCHECK_SHIFT 8
196#define BRCMF_SKB_IF_FLAGS_IF_AP_MASK 0x0080
197#define BRCMF_SKB_IF_FLAGS_IF_AP_SHIFT 7
198#define BRCMF_SKB_IF_FLAGS_FIFO_MASK 0x0070
199#define BRCMF_SKB_IF_FLAGS_FIFO_SHIFT 4
200#define BRCMF_SKB_IF_FLAGS_INDEX_MASK 0x000f
201#define BRCMF_SKB_IF_FLAGS_INDEX_SHIFT 0
202
203#define brcmf_skb_if_flags_set_field(skb, field, value) \
204 brcmu_maskset16(&(brcmf_skbcb(skb)->if_flags), \
205 BRCMF_SKB_IF_FLAGS_ ## field ## _MASK, \
206 BRCMF_SKB_IF_FLAGS_ ## field ## _SHIFT, (value))
207#define brcmf_skb_if_flags_get_field(skb, field) \
208 brcmu_maskget16(brcmf_skbcb(skb)->if_flags, \
209 BRCMF_SKB_IF_FLAGS_ ## field ## _MASK, \
210 BRCMF_SKB_IF_FLAGS_ ## field ## _SHIFT)
211
212/**
213 * sk_buff control packet identifier
214 *
215 * 32-bit packet identifier used in PKTTAG tlv from host to dongle.
216 *
217 * - Generated at the host (e.g. dhd)
218 * - Seen as a generic sequence number by firmware except for the flags field.
219 *
220 * Generation : b[31] => generation number for this packet [host->fw]
221 * OR, current generation number [fw->host]
222 * Flags : b[30:27] => command, status flags
223 * FIFO-AC : b[26:24] => AC-FIFO id
224 * h-slot : b[23:8] => hanger-slot
225 * freerun : b[7:0] => A free running counter
226 */
227#define BRCMF_SKB_HTOD_TAG_GENERATION_MASK 0x80000000
228#define BRCMF_SKB_HTOD_TAG_GENERATION_SHIFT 31
229#define BRCMF_SKB_HTOD_TAG_FLAGS_MASK 0x78000000
230#define BRCMF_SKB_HTOD_TAG_FLAGS_SHIFT 27
231#define BRCMF_SKB_HTOD_TAG_FIFO_MASK 0x07000000
232#define BRCMF_SKB_HTOD_TAG_FIFO_SHIFT 24
233#define BRCMF_SKB_HTOD_TAG_HSLOT_MASK 0x00ffff00
234#define BRCMF_SKB_HTOD_TAG_HSLOT_SHIFT 8
235#define BRCMF_SKB_HTOD_TAG_FREERUN_MASK 0x000000ff
236#define BRCMF_SKB_HTOD_TAG_FREERUN_SHIFT 0
237
238#define brcmf_skb_htod_tag_set_field(skb, field, value) \
239 brcmu_maskset32(&(brcmf_skbcb(skb)->htod_tag), \
240 BRCMF_SKB_HTOD_TAG_ ## field ## _MASK, \
241 BRCMF_SKB_HTOD_TAG_ ## field ## _SHIFT, (value))
242#define brcmf_skb_htod_tag_get_field(skb, field) \
243 brcmu_maskget32(brcmf_skbcb(skb)->htod_tag, \
244 BRCMF_SKB_HTOD_TAG_ ## field ## _MASK, \
245 BRCMF_SKB_HTOD_TAG_ ## field ## _SHIFT)
246
247/**
141 * struct brcmf_fws_mac_descriptor - firmware signalling data per node/interface 248 * struct brcmf_fws_mac_descriptor - firmware signalling data per node/interface
142 * 249 *
143 * @occupied: slot is in use. 250 * @occupied: slot is in use.
@@ -160,39 +267,6 @@ struct brcmf_fws_mac_descriptor {
160 struct pktq psq; 267 struct pktq psq;
161}; 268};
162 269
163/**
164 * FWFC packet identifier
165 *
166 * 32-bit packet identifier used in PKTTAG tlv from host to dongle.
167 *
168 * - Generated at the host (e.g. dhd)
169 * - Seen as a generic sequence number by wlc except the flags field
170 *
171 * Generation : b[31] => generation number for this packet [host->fw]
172 * OR, current generation number [fw->host]
173 * Flags : b[30:27] => command, status flags
174 * FIFO-AC : b[26:24] => AC-FIFO id
175 * h-slot : b[23:8] => hanger-slot
176 * freerun : b[7:0] => A free running counter
177 */
178#define BRCMF_FWS_PKTTAG_GENERATION_MASK 0x80000000
179#define BRCMF_FWS_PKTTAG_GENERATION_SHIFT 31
180#define BRCMF_FWS_PKTTAG_FLAGS_MASK 0x78000000
181#define BRCMF_FWS_PKTTAG_FLAGS_SHIFT 27
182#define BRCMF_FWS_PKTTAG_FIFO_MASK 0x07000000
183#define BRCMF_FWS_PKTTAG_FIFO_SHIFT 24
184#define BRCMF_FWS_PKTTAG_HSLOT_MASK 0x00ffff00
185#define BRCMF_FWS_PKTTAG_HSLOT_SHIFT 8
186#define BRCMF_FWS_PKTTAG_FREERUN_MASK 0x000000ff
187#define BRCMF_FWS_PKTTAG_FREERUN_SHIFT 0
188
189#define brcmf_fws_pkttag_set_field(var, field, value) \
190 brcmu_maskset32((var), BRCMF_FWS_PKTTAG_ ## field ## _MASK, \
191 BRCMF_FWS_PKTTAG_ ## field ## _SHIFT, (value))
192#define brcmf_fws_pkttag_get_field(var, field) \
193 brcmu_maskget32((var), BRCMF_FWS_PKTTAG_ ## field ## _MASK, \
194 BRCMF_FWS_PKTTAG_ ## field ## _SHIFT)
195
196struct brcmf_fws_info { 270struct brcmf_fws_info {
197 struct brcmf_pub *drvr; 271 struct brcmf_pub *drvr;
198 struct brcmf_fws_stats stats; 272 struct brcmf_fws_stats stats;