dhd_wlfc.h 17 KB

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