diff options
author | Arend van Spriel <arend@broadcom.com> | 2013-04-03 06:40:35 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-04-03 15:07:05 -0400 |
commit | ebb93883cf4c4ea0b44abab254ad35fd6236177b (patch) | |
tree | ff5dccc2124629385405d2066de529124a8d2df5 /drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c | |
parent | 29e04ae31ddb08794afbbef3cb72249d3804f47e (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.c | 140 |
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 | */ | ||
143 | enum 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 | */ | ||
163 | struct 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 | |||
196 | struct brcmf_fws_info { | 270 | struct 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; |