Merge branch develop-3.10-next
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rkwifi / bcmdhd / dhd_wlfc.h
1 /*
2 * $Copyright Open 2009 Broadcom Corporation$
3 * $Id: dhd_wlfc.h 501046 2014-09-06 01:25:16Z $
4 *
5 */
6 #ifndef __wlfc_host_driver_definitions_h__
7 #define __wlfc_host_driver_definitions_h__
8
9 #ifdef QMONITOR
10 #include <dhd_qmon.h>
11 #endif
12
13 /* #define OOO_DEBUG */
14
15 #define WLFC_UNSUPPORTED -9999
16
17 #define WLFC_NO_TRAFFIC -1
18 #define WLFC_MULTI_TRAFFIC 0
19
20 #define BUS_RETRIES 1   /* # of retries before aborting a bus tx operation */
21
22 /* 16 bits will provide an absolute max of 65536 slots */
23 #define WLFC_HANGER_MAXITEMS 3072
24
25 #define WLFC_HANGER_ITEM_STATE_FREE                     1
26 #define WLFC_HANGER_ITEM_STATE_INUSE                    2
27 #define WLFC_HANGER_ITEM_STATE_INUSE_SUPPRESSED         3
28
29 #define WLFC_HANGER_PKT_STATE_TXSTATUS                  1
30 #define WLFC_HANGER_PKT_STATE_TXCOMPLETE                2
31 #define WLFC_HANGER_PKT_STATE_CLEANUP                   4
32
33 typedef enum {
34         Q_TYPE_PSQ,
35         Q_TYPE_AFQ
36 } q_type_t;
37
38 typedef enum ewlfc_packet_state {
39         eWLFC_PKTTYPE_NEW,
40         eWLFC_PKTTYPE_DELAYED,
41         eWLFC_PKTTYPE_SUPPRESSED,
42         eWLFC_PKTTYPE_MAX
43 } ewlfc_packet_state_t;
44
45 typedef enum ewlfc_mac_entry_action {
46         eWLFC_MAC_ENTRY_ACTION_ADD,
47         eWLFC_MAC_ENTRY_ACTION_DEL,
48         eWLFC_MAC_ENTRY_ACTION_UPDATE,
49         eWLFC_MAC_ENTRY_ACTION_MAX
50 } ewlfc_mac_entry_action_t;
51
52 typedef struct wlfc_hanger_item {
53         uint8   state;
54         uint8   gen;
55         uint8   pkt_state;
56         uint8   pkt_txstatus;
57         uint32  identifier;
58         void*   pkt;
59 #ifdef PROP_TXSTATUS_DEBUG
60         uint32  push_time;
61 #endif
62         struct wlfc_hanger_item *next;
63 } wlfc_hanger_item_t;
64
65 typedef struct wlfc_hanger {
66         int max_items;
67         uint32 pushed;
68         uint32 popped;
69         uint32 failed_to_push;
70         uint32 failed_to_pop;
71         uint32 failed_slotfind;
72         uint32 slot_pos;
73         wlfc_hanger_item_t items[1];
74 } wlfc_hanger_t;
75
76 #define WLFC_HANGER_SIZE(n)     ((sizeof(wlfc_hanger_t) - \
77         sizeof(wlfc_hanger_item_t)) + ((n)*sizeof(wlfc_hanger_item_t)))
78
79 #define WLFC_STATE_OPEN         1
80 #define WLFC_STATE_CLOSE        2
81
82 #define WLFC_PSQ_PREC_COUNT             ((AC_COUNT + 1) * 2) /* 2 for each AC traffic and bc/mc */
83 #define WLFC_AFQ_PREC_COUNT             (AC_COUNT + 1)
84
85 #define WLFC_PSQ_LEN                    2048
86
87 #define WLFC_FLOWCONTROL_HIWATER        (2048 - 256)
88 #define WLFC_FLOWCONTROL_LOWATER        256
89
90 #define WLFC_LOG_BUF_SIZE               (1024*1024)
91
92 typedef struct wlfc_mac_descriptor {
93         uint8 occupied;
94         uint8 interface_id;
95         uint8 iftype;
96         uint8 state;
97         uint8 ac_bitmap; /* for APSD */
98         uint8 requested_credit;
99         uint8 requested_packet;
100         uint8 ea[ETHER_ADDR_LEN];
101         /*
102         maintain (MAC,AC) based seq count for
103         packets going to the device. As well as bc/mc.
104         */
105         uint8 seq[AC_COUNT + 1];
106         uint8 generation;
107         struct pktq     psq;
108         /* packets at firmware */
109         struct pktq     afq;
110         /* The AC pending bitmap that was reported to the fw at last change */
111         uint8 traffic_lastreported_bmp;
112         /* The new AC pending bitmap */
113         uint8 traffic_pending_bmp;
114         /* 1= send on next opportunity */
115         uint8 send_tim_signal;
116         uint8 mac_handle;
117         /* Number of packets at dongle for this entry. */
118         int transit_count;
119         /* Numbe of suppression to wait before evict from delayQ */
120         int suppr_transit_count;
121         /* flag. TRUE when in suppress state */
122         uint8 suppressed;
123
124 #ifdef QMONITOR
125         dhd_qmon_t qmon;
126 #endif /* QMONITOR */
127
128 #ifdef PROP_TXSTATUS_DEBUG
129         uint32 dstncredit_sent_packets;
130         uint32 dstncredit_acks;
131         uint32 opened_ct;
132         uint32 closed_ct;
133 #endif
134         struct wlfc_mac_descriptor* prev;
135         struct wlfc_mac_descriptor* next;
136 } wlfc_mac_descriptor_t;
137
138 typedef struct dhd_wlfc_commit_info {
139         uint8                                   needs_hdr;
140         uint8                                   ac_fifo_credit_spent;
141         ewlfc_packet_state_t    pkt_type;
142         wlfc_mac_descriptor_t*  mac_entry;
143         void*                                   p;
144 } dhd_wlfc_commit_info_t;
145
146 #define WLFC_DECR_SEQCOUNT(entry, prec) do { if (entry->seq[(prec)] == 0) {\
147         entry->seq[prec] = 0xff; } else entry->seq[prec]--;} while (0)
148
149 #define WLFC_INCR_SEQCOUNT(entry, prec) entry->seq[(prec)]++
150 #define WLFC_SEQCOUNT(entry, prec) entry->seq[(prec)]
151
152 typedef struct athost_wl_stat_counters {
153         uint32  pktin;
154         uint32  pktout;
155         uint32  pkt2bus;
156         uint32  pktdropped;
157         uint32  tlv_parse_failed;
158         uint32  rollback;
159         uint32  rollback_failed;
160         uint32  delayq_full_error;
161         uint32  credit_request_failed;
162         uint32  packet_request_failed;
163         uint32  mac_update_failed;
164         uint32  psmode_update_failed;
165         uint32  interface_update_failed;
166         uint32  wlfc_header_only_pkt;
167         uint32  txstatus_in;
168         uint32  d11_suppress;
169         uint32  wl_suppress;
170         uint32  bad_suppress;
171         uint32  pkt_freed;
172         uint32  pkt_free_err;
173         uint32  psq_wlsup_retx;
174         uint32  psq_wlsup_enq;
175         uint32  psq_d11sup_retx;
176         uint32  psq_d11sup_enq;
177         uint32  psq_hostq_retx;
178         uint32  psq_hostq_enq;
179         uint32  mac_handle_notfound;
180         uint32  wlc_tossed_pkts;
181         uint32  dhd_hdrpulls;
182         uint32  generic_error;
183         /* an extra one for bc/mc traffic */
184         uint32  send_pkts[AC_COUNT + 1];
185         uint32  drop_pkts[WLFC_PSQ_PREC_COUNT];
186         uint32  ooo_pkts[AC_COUNT + 1];
187 #ifdef PROP_TXSTATUS_DEBUG
188         /* all pkt2bus -> txstatus latency accumulated */
189         uint32  latency_sample_count;
190         uint32  total_status_latency;
191         uint32  latency_most_recent;
192         int     idx_delta;
193         uint32  deltas[10];
194         uint32  fifo_credits_sent[6];
195         uint32  fifo_credits_back[6];
196         uint32  dropped_qfull[6];
197         uint32  signal_only_pkts_sent;
198         uint32  signal_only_pkts_freed;
199 #endif
200         uint32  cleanup_txq_cnt;
201         uint32  cleanup_psq_cnt;
202         uint32  cleanup_fw_cnt;
203 } athost_wl_stat_counters_t;
204
205 #ifdef PROP_TXSTATUS_DEBUG
206 #define WLFC_HOST_FIFO_CREDIT_INC_SENTCTRS(ctx, ac) do { \
207         (ctx)->stats.fifo_credits_sent[(ac)]++;} while (0)
208 #define WLFC_HOST_FIFO_CREDIT_INC_BACKCTRS(ctx, ac) do { \
209         (ctx)->stats.fifo_credits_back[(ac)]++;} while (0)
210 #define WLFC_HOST_FIFO_DROPPEDCTR_INC(ctx, ac) do { \
211         (ctx)->stats.dropped_qfull[(ac)]++;} while (0)
212 #else
213 #define WLFC_HOST_FIFO_CREDIT_INC_SENTCTRS(ctx, ac) do {} while (0)
214 #define WLFC_HOST_FIFO_CREDIT_INC_BACKCTRS(ctx, ac) do {} while (0)
215 #define WLFC_HOST_FIFO_DROPPEDCTR_INC(ctx, ac) do {} while (0)
216 #endif
217
218 #define WLFC_FCMODE_NONE                                0
219 #define WLFC_FCMODE_IMPLIED_CREDIT              1
220 #define WLFC_FCMODE_EXPLICIT_CREDIT             2
221 #define WLFC_ONLY_AMPDU_HOSTREORDER             3
222
223 /* Reserved credits ratio when borrowed by hihger priority */
224 #define WLFC_BORROW_LIMIT_RATIO         4
225
226 /* How long to defer borrowing in milliseconds */
227 #define WLFC_BORROW_DEFER_PERIOD_MS 100
228
229 /* How long to defer flow control in milliseconds */
230 #define WLFC_FC_DEFER_PERIOD_MS 200
231
232 /* How long to detect occurance per AC in miliseconds */
233 #define WLFC_RX_DETECTION_THRESHOLD_MS  100
234
235 /* Mask to represent available ACs (note: BC/MC is ignored */
236 #define WLFC_AC_MASK 0xF
237
238 typedef struct athost_wl_status_info {
239         uint8   last_seqid_to_wlc;
240
241         /* OSL handle */
242         osl_t*  osh;
243         /* dhd pub */
244         void*   dhdp;
245
246         /* stats */
247         athost_wl_stat_counters_t stats;
248
249         int             Init_FIFO_credit[AC_COUNT + 2];
250
251         /* the additional ones are for bc/mc and ATIM FIFO */
252         int             FIFO_credit[AC_COUNT + 2];
253
254         /* Credit borrow counts for each FIFO from each of the other FIFOs */
255         int             credits_borrowed[AC_COUNT + 2][AC_COUNT + 2];
256
257         /* packet hanger and MAC->handle lookup table */
258         void*   hanger;
259         struct {
260                 /* table for individual nodes */
261                 wlfc_mac_descriptor_t   nodes[WLFC_MAC_DESC_TABLE_SIZE];
262                 /* table for interfaces */
263                 wlfc_mac_descriptor_t   interfaces[WLFC_MAX_IFNUM];
264                 /* OS may send packets to unknown (unassociated) destinations */
265                 /* A place holder for bc/mc and packets to unknown destinations */
266                 wlfc_mac_descriptor_t   other;
267         } destination_entries;
268
269         wlfc_mac_descriptor_t *active_entry_head;
270         int active_entry_count;
271
272         wlfc_mac_descriptor_t* requested_entry[WLFC_MAC_DESC_TABLE_SIZE];
273         int requested_entry_count;
274
275         /* pkt counts for each interface and ac */
276         int     pkt_cnt_in_q[WLFC_MAX_IFNUM][AC_COUNT+1];
277         int     pkt_cnt_per_ac[AC_COUNT+1];
278         int     pkt_cnt_in_drv[WLFC_MAX_IFNUM][AC_COUNT+1];
279         uint8   allow_fc;
280         uint32  fc_defer_timestamp;
281         uint32  rx_timestamp[AC_COUNT+1];
282         /* ON/OFF state for flow control to the host network interface */
283         uint8   hostif_flow_state[WLFC_MAX_IFNUM];
284         uint8   host_ifidx;
285         /* to flow control an OS interface */
286         uint8   toggle_host_if;
287
288         /* To borrow credits */
289         uint8   allow_credit_borrow;
290
291         /* ac number for the first single ac traffic */
292         uint8   single_ac;
293
294         /* Timestamp for the first single ac traffic */
295         uint32  single_ac_timestamp;
296
297         bool    bcmc_credit_supported;
298
299 } athost_wl_status_info_t;
300
301 /* Please be mindful that total pkttag space is 32 octets only */
302 typedef struct dhd_pkttag {
303         /*
304         b[15]  - 1 = wlfc packet
305         b[14:13]  - encryption exemption
306         b[12 ] - 1 = event channel
307         b[11 ] - 1 = this packet was sent in response to one time packet request,
308         do not increment credit on status for this one. [WLFC_CTL_TYPE_MAC_REQUEST_PACKET].
309         b[10 ] - 1 = signal-only-packet to firmware [i.e. nothing to piggyback on]
310         b[9  ] - 1 = packet is host->firmware (transmit direction)
311                - 0 = packet received from firmware (firmware->host)
312         b[8  ] - 1 = packet was sent due to credit_request (pspoll),
313                      packet does not count against FIFO credit.
314                - 0 = normal transaction, packet counts against FIFO credit
315         b[7  ] - 1 = AP, 0 = STA
316         b[6:4] - AC FIFO number
317         b[3:0] - interface index
318         */
319         uint16  if_flags;
320         /* destination MAC address for this packet so that not every
321         module needs to open the packet to find this
322         */
323         uint8   dstn_ether[ETHER_ADDR_LEN];
324         /*
325         This 32-bit goes from host to device for every packet.
326         */
327         uint32  htod_tag;
328
329         /*
330         This 16-bit is original seq number for every suppress packet.
331         */
332         uint16  htod_seq;
333
334         /*
335         This address is mac entry for every packet.
336         */
337         void*   entry;
338         /* bus specific stuff */
339         union {
340                 struct {
341                         void* stuff;
342                         uint32 thing1;
343                         uint32 thing2;
344                 } sd;
345                 struct {
346                         void* bus;
347                         void* urb;
348                 } usb;
349         } bus_specific;
350 } dhd_pkttag_t;
351
352 #define DHD_PKTTAG_WLFCPKT_MASK                 0x1
353 #define DHD_PKTTAG_WLFCPKT_SHIFT                15
354 #define DHD_PKTTAG_WLFCPKT_SET(tag, value)      ((dhd_pkttag_t*)(tag))->if_flags = \
355         (((dhd_pkttag_t*)(tag))->if_flags & \
356         ~(DHD_PKTTAG_WLFCPKT_MASK << DHD_PKTTAG_WLFCPKT_SHIFT)) | \
357         (((value) & DHD_PKTTAG_WLFCPKT_MASK) << DHD_PKTTAG_WLFCPKT_SHIFT)
358 #define DHD_PKTTAG_WLFCPKT(tag) ((((dhd_pkttag_t*)(tag))->if_flags >> \
359         DHD_PKTTAG_WLFCPKT_SHIFT) & DHD_PKTTAG_WLFCPKT_MASK)
360
361 #define DHD_PKTTAG_EXEMPT_MASK                  0x3
362 #define DHD_PKTTAG_EXEMPT_SHIFT                 13
363 #define DHD_PKTTAG_EXEMPT_SET(tag, value)       ((dhd_pkttag_t*)(tag))->if_flags = \
364         (((dhd_pkttag_t*)(tag))->if_flags & \
365         ~(DHD_PKTTAG_EXEMPT_MASK << DHD_PKTTAG_EXEMPT_SHIFT)) | \
366         (((value) & DHD_PKTTAG_EXEMPT_MASK) << DHD_PKTTAG_EXEMPT_SHIFT)
367 #define DHD_PKTTAG_EXEMPT(tag)  ((((dhd_pkttag_t*)(tag))->if_flags >> \
368         DHD_PKTTAG_EXEMPT_SHIFT) & DHD_PKTTAG_EXEMPT_MASK)
369
370 #define DHD_PKTTAG_EVENT_MASK                   0x1
371 #define DHD_PKTTAG_EVENT_SHIFT                  12
372 #define DHD_PKTTAG_SETEVENT(tag, event) ((dhd_pkttag_t*)(tag))->if_flags = \
373         (((dhd_pkttag_t*)(tag))->if_flags & \
374         ~(DHD_PKTTAG_EVENT_MASK << DHD_PKTTAG_EVENT_SHIFT)) | \
375         (((event) & DHD_PKTTAG_EVENT_MASK) << DHD_PKTTAG_EVENT_SHIFT)
376 #define DHD_PKTTAG_EVENT(tag)   ((((dhd_pkttag_t*)(tag))->if_flags >> \
377         DHD_PKTTAG_EVENT_SHIFT) & DHD_PKTTAG_EVENT_MASK)
378
379 #define DHD_PKTTAG_ONETIMEPKTRQST_MASK          0x1
380 #define DHD_PKTTAG_ONETIMEPKTRQST_SHIFT         11
381 #define DHD_PKTTAG_SETONETIMEPKTRQST(tag)       ((dhd_pkttag_t*)(tag))->if_flags = \
382         (((dhd_pkttag_t*)(tag))->if_flags & \
383         ~(DHD_PKTTAG_ONETIMEPKTRQST_MASK << DHD_PKTTAG_ONETIMEPKTRQST_SHIFT)) | \
384         (1 << DHD_PKTTAG_ONETIMEPKTRQST_SHIFT)
385 #define DHD_PKTTAG_ONETIMEPKTRQST(tag)  ((((dhd_pkttag_t*)(tag))->if_flags >> \
386         DHD_PKTTAG_ONETIMEPKTRQST_SHIFT) & DHD_PKTTAG_ONETIMEPKTRQST_MASK)
387
388 #define DHD_PKTTAG_SIGNALONLY_MASK              0x1
389 #define DHD_PKTTAG_SIGNALONLY_SHIFT             10
390 #define DHD_PKTTAG_SETSIGNALONLY(tag, signalonly)       ((dhd_pkttag_t*)(tag))->if_flags = \
391         (((dhd_pkttag_t*)(tag))->if_flags & \
392         ~(DHD_PKTTAG_SIGNALONLY_MASK << DHD_PKTTAG_SIGNALONLY_SHIFT)) | \
393         (((signalonly) & DHD_PKTTAG_SIGNALONLY_MASK) << DHD_PKTTAG_SIGNALONLY_SHIFT)
394 #define DHD_PKTTAG_SIGNALONLY(tag)      ((((dhd_pkttag_t*)(tag))->if_flags >> \
395         DHD_PKTTAG_SIGNALONLY_SHIFT) & DHD_PKTTAG_SIGNALONLY_MASK)
396
397 #define DHD_PKTTAG_PKTDIR_MASK                  0x1
398 #define DHD_PKTTAG_PKTDIR_SHIFT                 9
399 #define DHD_PKTTAG_SETPKTDIR(tag, dir)  ((dhd_pkttag_t*)(tag))->if_flags = \
400         (((dhd_pkttag_t*)(tag))->if_flags & \
401         ~(DHD_PKTTAG_PKTDIR_MASK << DHD_PKTTAG_PKTDIR_SHIFT)) | \
402         (((dir) & DHD_PKTTAG_PKTDIR_MASK) << DHD_PKTTAG_PKTDIR_SHIFT)
403 #define DHD_PKTTAG_PKTDIR(tag)  ((((dhd_pkttag_t*)(tag))->if_flags >> \
404         DHD_PKTTAG_PKTDIR_SHIFT) & DHD_PKTTAG_PKTDIR_MASK)
405
406 #define DHD_PKTTAG_CREDITCHECK_MASK             0x1
407 #define DHD_PKTTAG_CREDITCHECK_SHIFT            8
408 #define DHD_PKTTAG_SETCREDITCHECK(tag, check)   ((dhd_pkttag_t*)(tag))->if_flags = \
409         (((dhd_pkttag_t*)(tag))->if_flags & \
410         ~(DHD_PKTTAG_CREDITCHECK_MASK << DHD_PKTTAG_CREDITCHECK_SHIFT)) | \
411         (((check) & DHD_PKTTAG_CREDITCHECK_MASK) << DHD_PKTTAG_CREDITCHECK_SHIFT)
412 #define DHD_PKTTAG_CREDITCHECK(tag)     ((((dhd_pkttag_t*)(tag))->if_flags >> \
413         DHD_PKTTAG_CREDITCHECK_SHIFT) & DHD_PKTTAG_CREDITCHECK_MASK)
414
415 #define DHD_PKTTAG_IFTYPE_MASK                  0x1
416 #define DHD_PKTTAG_IFTYPE_SHIFT                 7
417 #define DHD_PKTTAG_SETIFTYPE(tag, isAP) ((dhd_pkttag_t*)(tag))->if_flags = \
418         (((dhd_pkttag_t*)(tag))->if_flags & \
419         ~(DHD_PKTTAG_IFTYPE_MASK << DHD_PKTTAG_IFTYPE_SHIFT)) | \
420         (((isAP) & DHD_PKTTAG_IFTYPE_MASK) << DHD_PKTTAG_IFTYPE_SHIFT)
421 #define DHD_PKTTAG_IFTYPE(tag)  ((((dhd_pkttag_t*)(tag))->if_flags >> \
422         DHD_PKTTAG_IFTYPE_SHIFT) & DHD_PKTTAG_IFTYPE_MASK)
423
424 #define DHD_PKTTAG_FIFO_MASK                    0x7
425 #define DHD_PKTTAG_FIFO_SHIFT                   4
426 #define DHD_PKTTAG_SETFIFO(tag, fifo)   ((dhd_pkttag_t*)(tag))->if_flags = \
427         (((dhd_pkttag_t*)(tag))->if_flags & ~(DHD_PKTTAG_FIFO_MASK << DHD_PKTTAG_FIFO_SHIFT)) | \
428         (((fifo) & DHD_PKTTAG_FIFO_MASK) << DHD_PKTTAG_FIFO_SHIFT)
429 #define DHD_PKTTAG_FIFO(tag)            ((((dhd_pkttag_t*)(tag))->if_flags >> \
430         DHD_PKTTAG_FIFO_SHIFT) & DHD_PKTTAG_FIFO_MASK)
431
432 #define DHD_PKTTAG_IF_MASK                      0xf
433 #define DHD_PKTTAG_IF_SHIFT                     0
434 #define DHD_PKTTAG_SETIF(tag, if)       ((dhd_pkttag_t*)(tag))->if_flags = \
435         (((dhd_pkttag_t*)(tag))->if_flags & ~(DHD_PKTTAG_IF_MASK << DHD_PKTTAG_IF_SHIFT)) | \
436         (((if) & DHD_PKTTAG_IF_MASK) << DHD_PKTTAG_IF_SHIFT)
437 #define DHD_PKTTAG_IF(tag)              ((((dhd_pkttag_t*)(tag))->if_flags >> \
438         DHD_PKTTAG_IF_SHIFT) & DHD_PKTTAG_IF_MASK)
439
440 #define DHD_PKTTAG_SETDSTN(tag, dstn_MAC_ea)    memcpy(((dhd_pkttag_t*)((tag)))->dstn_ether, \
441         (dstn_MAC_ea), ETHER_ADDR_LEN)
442 #define DHD_PKTTAG_DSTN(tag)    ((dhd_pkttag_t*)(tag))->dstn_ether
443
444 #define DHD_PKTTAG_SET_H2DTAG(tag, h2dvalue)    ((dhd_pkttag_t*)(tag))->htod_tag = (h2dvalue)
445 #define DHD_PKTTAG_H2DTAG(tag)                  (((dhd_pkttag_t*)(tag))->htod_tag)
446
447 #define DHD_PKTTAG_SET_H2DSEQ(tag, seq)         ((dhd_pkttag_t*)(tag))->htod_seq = (seq)
448 #define DHD_PKTTAG_H2DSEQ(tag)                  (((dhd_pkttag_t*)(tag))->htod_seq)
449
450 #define DHD_PKTTAG_SET_ENTRY(tag, entry)        ((dhd_pkttag_t*)(tag))->entry = (entry)
451 #define DHD_PKTTAG_ENTRY(tag)                   (((dhd_pkttag_t*)(tag))->entry)
452
453 #define PSQ_SUP_IDX(x) (x * 2 + 1)
454 #define PSQ_DLY_IDX(x) (x * 2)
455
456 typedef int (*f_commitpkt_t)(void* ctx, void* p);
457 typedef bool (*f_processpkt_t)(void* p, void* arg);
458
459 #ifdef PROP_TXSTATUS_DEBUG
460 #define DHD_WLFC_CTRINC_MAC_CLOSE(entry)        do { (entry)->closed_ct++; } while (0)
461 #define DHD_WLFC_CTRINC_MAC_OPEN(entry)         do { (entry)->opened_ct++; } while (0)
462 #else
463 #define DHD_WLFC_CTRINC_MAC_CLOSE(entry)        do {} while (0)
464 #define DHD_WLFC_CTRINC_MAC_OPEN(entry)         do {} while (0)
465 #endif
466
467 /* public functions */
468 int dhd_wlfc_parse_header_info(dhd_pub_t *dhd, void* pktbuf, int tlv_hdr_len,
469         uchar *reorder_info_buf, uint *reorder_info_len);
470 int dhd_wlfc_commit_packets(dhd_pub_t *dhdp, f_commitpkt_t fcommit,
471         void* commit_ctx, void *pktbuf, bool need_toggle_host_if);
472 int dhd_wlfc_txcomplete(dhd_pub_t *dhd, void *txp, bool success);
473 int dhd_wlfc_init(dhd_pub_t *dhd);
474 #ifdef SUPPORT_P2P_GO_PS
475 int dhd_wlfc_suspend(dhd_pub_t *dhd);
476 int dhd_wlfc_resume(dhd_pub_t *dhd);
477 #endif /* SUPPORT_P2P_GO_PS */
478 int dhd_wlfc_hostreorder_init(dhd_pub_t *dhd);
479 int dhd_wlfc_cleanup_txq(dhd_pub_t *dhd, f_processpkt_t fn, void *arg);
480 int dhd_wlfc_cleanup(dhd_pub_t *dhd, f_processpkt_t fn, void* arg);
481 int dhd_wlfc_deinit(dhd_pub_t *dhd);
482 int dhd_wlfc_interface_event(dhd_pub_t *dhdp, uint8 action, uint8 ifid, uint8 iftype, uint8* ea);
483 int dhd_wlfc_FIFOcreditmap_event(dhd_pub_t *dhdp, uint8* event_data);
484 int dhd_wlfc_BCMCCredit_support_event(dhd_pub_t *dhdp);
485 int dhd_wlfc_enable(dhd_pub_t *dhdp);
486 int dhd_wlfc_dump(dhd_pub_t *dhdp, struct bcmstrbuf *strbuf);
487 int dhd_wlfc_clear_counts(dhd_pub_t *dhd);
488 int dhd_wlfc_get_enable(dhd_pub_t *dhd, bool *val);
489 int dhd_wlfc_get_mode(dhd_pub_t *dhd, int *val);
490 int dhd_wlfc_set_mode(dhd_pub_t *dhd, int val);
491 bool dhd_wlfc_is_supported(dhd_pub_t *dhd);
492 bool dhd_wlfc_is_header_only_pkt(dhd_pub_t * dhd, void *pktbuf);
493 int dhd_wlfc_flowcontrol(dhd_pub_t *dhdp, bool state, bool bAcquireLock);
494 int dhd_wlfc_save_rxpath_ac_time(dhd_pub_t * dhd, uint8 prio);
495
496 int dhd_wlfc_get_module_ignore(dhd_pub_t *dhd, int *val);
497 int dhd_wlfc_set_module_ignore(dhd_pub_t *dhd, int val);
498 int dhd_wlfc_get_credit_ignore(dhd_pub_t *dhd, int *val);
499 int dhd_wlfc_set_credit_ignore(dhd_pub_t *dhd, int val);
500 int dhd_wlfc_get_txstatus_ignore(dhd_pub_t *dhd, int *val);
501 int dhd_wlfc_set_txstatus_ignore(dhd_pub_t *dhd, int val);
502
503 int dhd_wlfc_get_rxpkt_chk(dhd_pub_t *dhd, int *val);
504 int dhd_wlfc_set_rxpkt_chk(dhd_pub_t *dhd, int val);
505 #endif /* __wlfc_host_driver_definitions_h__ */