bcmmsgbuf.h 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397
  1. /*
  2. * MSGBUF network driver ioctl/indication encoding
  3. * Broadcom 802.11abg Networking Device Driver
  4. *
  5. * Definitions subject to change without notice.
  6. *
  7. * Portions of this code are copyright (c) 2020 Cypress Semiconductor Corporation
  8. *
  9. * Copyright (C) 1999-2020, Broadcom Corporation
  10. *
  11. * Unless you and Broadcom execute a separate written software license
  12. * agreement governing use of this software, this software is licensed to you
  13. * under the terms of the GNU General Public License version 2 (the "GPL"),
  14. * available at http://www.broadcom.com/licenses/GPLv2.php, with the
  15. * following added to such license:
  16. *
  17. * As a special exception, the copyright holders of this software give you
  18. * permission to link this software with independent modules, and to copy and
  19. * distribute the resulting executable under terms of your choice, provided that
  20. * you also meet, for each linked independent module, the terms and conditions of
  21. * the license of that module. An independent module is a module which is not
  22. * derived from this software. The special exception does not apply to any
  23. * modifications of the software.
  24. *
  25. * Notwithstanding the above, under no circumstances may you combine this
  26. * software in any way with any other Broadcom software provided under a license
  27. * other than the GPL, without Broadcom's express prior written consent.
  28. *
  29. *
  30. * <<Broadcom-WL-IPTag/Open:>>
  31. *
  32. * $Id: bcmmsgbuf.h 726460 2020-07-01 07:16:29Z $
  33. */
  34. #ifndef _bcmmsgbuf_h_
  35. #define _bcmmsgbuf_h_
  36. #include <ethernet.h>
  37. #include <wlioctl.h>
  38. #include <bcmpcie.h>
  39. #define MSGBUF_MAX_MSG_SIZE ETHER_MAX_LEN
  40. #define D2H_EPOCH_MODULO 253 /* sequence number wrap */
  41. #define D2H_EPOCH_INIT_VAL (D2H_EPOCH_MODULO + 1)
  42. #define H2D_EPOCH_MODULO 253 /* sequence number wrap */
  43. #define H2D_EPOCH_INIT_VAL (H2D_EPOCH_MODULO + 1)
  44. #define H2DRING_TXPOST_ITEMSIZE 48
  45. #define H2DRING_RXPOST_ITEMSIZE 32
  46. #define H2DRING_CTRL_SUB_ITEMSIZE 40
  47. #define D2HRING_TXCMPLT_ITEMSIZE 24
  48. #define D2HRING_RXCMPLT_ITEMSIZE 40
  49. #define D2HRING_TXCMPLT_ITEMSIZE_PREREV7 16
  50. #define D2HRING_RXCMPLT_ITEMSIZE_PREREV7 32
  51. #define D2HRING_CTRL_CMPLT_ITEMSIZE 24
  52. #define H2DRING_INFO_BUFPOST_ITEMSIZE H2DRING_CTRL_SUB_ITEMSIZE
  53. #define D2HRING_INFO_BUFCMPLT_ITEMSIZE D2HRING_CTRL_CMPLT_ITEMSIZE
  54. #define D2HRING_SNAPSHOT_CMPLT_ITEMSIZE 20
  55. #define H2DRING_TXPOST_MAX_ITEM 512
  56. #define H2DRING_RXPOST_MAX_ITEM 512
  57. #define H2DRING_CTRL_SUB_MAX_ITEM 64
  58. #define D2HRING_TXCMPLT_MAX_ITEM 1024
  59. #define D2HRING_RXCMPLT_MAX_ITEM 512
  60. #define H2DRING_DYNAMIC_INFO_MAX_ITEM 32
  61. #define D2HRING_DYNAMIC_INFO_MAX_ITEM 32
  62. #define D2HRING_EDL_HDR_SIZE 48u
  63. #define D2HRING_EDL_ITEMSIZE 2048u
  64. #define D2HRING_EDL_MAX_ITEM 256u
  65. #define D2HRING_EDL_WATERMARK (D2HRING_EDL_MAX_ITEM >> 5u)
  66. #define D2HRING_CTRL_CMPLT_MAX_ITEM 64
  67. enum {
  68. DNGL_TO_HOST_MSGBUF,
  69. HOST_TO_DNGL_MSGBUF
  70. };
  71. enum {
  72. HOST_TO_DNGL_TXP_DATA,
  73. HOST_TO_DNGL_RXP_DATA,
  74. HOST_TO_DNGL_CTRL,
  75. DNGL_TO_HOST_DATA,
  76. DNGL_TO_HOST_CTRL
  77. };
  78. #define MESSAGE_PAYLOAD(a) (a & MSG_TYPE_INTERNAL_USE_START) ? TRUE : FALSE
  79. #define PCIEDEV_FIRMWARE_TSINFO 0x1
  80. #define PCIEDEV_FIRMWARE_TSINFO_FIRST 0x1
  81. #define PCIEDEV_FIRMWARE_TSINFO_MIDDLE 0x2
  82. #define PCIEDEV_BTLOG_POST 0x3
  83. #define PCIEDEV_BT_SNAPSHOT_POST 0x4
  84. #ifdef PCIE_API_REV1
  85. #define BCMMSGBUF_DUMMY_REF(a, b) do {BCM_REFERENCE((a));BCM_REFERENCE((b));} while (0)
  86. #define BCMMSGBUF_API_IFIDX(a) 0
  87. #define BCMMSGBUF_API_SEQNUM(a) 0
  88. #define BCMMSGBUF_IOCTL_XTID(a) 0
  89. #define BCMMSGBUF_IOCTL_PKTID(a) ((a)->cmd_id)
  90. #define BCMMSGBUF_SET_API_IFIDX(a, b) BCMMSGBUF_DUMMY_REF(a, b)
  91. #define BCMMSGBUF_SET_API_SEQNUM(a, b) BCMMSGBUF_DUMMY_REF(a, b)
  92. #define BCMMSGBUF_IOCTL_SET_PKTID(a, b) (BCMMSGBUF_IOCTL_PKTID(a) = (b))
  93. #define BCMMSGBUF_IOCTL_SET_XTID(a, b) BCMMSGBUF_DUMMY_REF(a, b)
  94. #else /* PCIE_API_REV1 */
  95. #define BCMMSGBUF_API_IFIDX(a) ((a)->if_id)
  96. #define BCMMSGBUF_IOCTL_PKTID(a) ((a)->pkt_id)
  97. #define BCMMSGBUF_API_SEQNUM(a) ((a)->u.seq.seq_no)
  98. #define BCMMSGBUF_IOCTL_XTID(a) ((a)->xt_id)
  99. #define BCMMSGBUF_SET_API_IFIDX(a, b) (BCMMSGBUF_API_IFIDX((a)) = (b))
  100. #define BCMMSGBUF_SET_API_SEQNUM(a, b) (BCMMSGBUF_API_SEQNUM((a)) = (b))
  101. #define BCMMSGBUF_IOCTL_SET_PKTID(a, b) (BCMMSGBUF_IOCTL_PKTID((a)) = (b))
  102. #define BCMMSGBUF_IOCTL_SET_XTID(a, b) (BCMMSGBUF_IOCTL_XTID((a)) = (b))
  103. #endif /* PCIE_API_REV1 */
  104. /* utility data structures */
  105. union addr64 {
  106. struct {
  107. uint32 low;
  108. uint32 high;
  109. };
  110. struct {
  111. uint32 low_addr;
  112. uint32 high_addr;
  113. };
  114. uint64 u64;
  115. } DECLSPEC_ALIGN(8);
  116. typedef union addr64 bcm_addr64_t;
  117. /* IOCTL req Hdr */
  118. /* cmn Msg Hdr */
  119. typedef struct cmn_msg_hdr {
  120. /** message type */
  121. uint8 msg_type;
  122. /** interface index this is valid for */
  123. uint8 if_id;
  124. /* flags */
  125. uint8 flags;
  126. /** sequence number */
  127. uint8 epoch;
  128. /** packet Identifier for the associated host buffer */
  129. uint32 request_id;
  130. } cmn_msg_hdr_t;
  131. /** message type */
  132. typedef enum bcmpcie_msgtype {
  133. MSG_TYPE_GEN_STATUS = 0x1,
  134. MSG_TYPE_RING_STATUS = 0x2,
  135. MSG_TYPE_FLOW_RING_CREATE = 0x3,
  136. MSG_TYPE_FLOW_RING_CREATE_CMPLT = 0x4,
  137. /* Enum value as copied from BISON 7.15: new generic message */
  138. MSG_TYPE_RING_CREATE_CMPLT = 0x4,
  139. MSG_TYPE_FLOW_RING_DELETE = 0x5,
  140. MSG_TYPE_FLOW_RING_DELETE_CMPLT = 0x6,
  141. /* Enum value as copied from BISON 7.15: new generic message */
  142. MSG_TYPE_RING_DELETE_CMPLT = 0x6,
  143. MSG_TYPE_FLOW_RING_FLUSH = 0x7,
  144. MSG_TYPE_FLOW_RING_FLUSH_CMPLT = 0x8,
  145. MSG_TYPE_IOCTLPTR_REQ = 0x9,
  146. MSG_TYPE_IOCTLPTR_REQ_ACK = 0xA,
  147. MSG_TYPE_IOCTLRESP_BUF_POST = 0xB,
  148. MSG_TYPE_IOCTL_CMPLT = 0xC,
  149. MSG_TYPE_EVENT_BUF_POST = 0xD,
  150. MSG_TYPE_WL_EVENT = 0xE,
  151. MSG_TYPE_TX_POST = 0xF,
  152. MSG_TYPE_TX_STATUS = 0x10,
  153. MSG_TYPE_RXBUF_POST = 0x11,
  154. MSG_TYPE_RX_CMPLT = 0x12,
  155. MSG_TYPE_LPBK_DMAXFER = 0x13,
  156. MSG_TYPE_LPBK_DMAXFER_CMPLT = 0x14,
  157. MSG_TYPE_FLOW_RING_RESUME = 0x15,
  158. MSG_TYPE_FLOW_RING_RESUME_CMPLT = 0x16,
  159. MSG_TYPE_FLOW_RING_SUSPEND = 0x17,
  160. MSG_TYPE_FLOW_RING_SUSPEND_CMPLT = 0x18,
  161. MSG_TYPE_INFO_BUF_POST = 0x19,
  162. MSG_TYPE_INFO_BUF_CMPLT = 0x1A,
  163. MSG_TYPE_H2D_RING_CREATE = 0x1B,
  164. MSG_TYPE_D2H_RING_CREATE = 0x1C,
  165. MSG_TYPE_H2D_RING_CREATE_CMPLT = 0x1D,
  166. MSG_TYPE_D2H_RING_CREATE_CMPLT = 0x1E,
  167. MSG_TYPE_H2D_RING_CONFIG = 0x1F,
  168. MSG_TYPE_D2H_RING_CONFIG = 0x20,
  169. MSG_TYPE_H2D_RING_CONFIG_CMPLT = 0x21,
  170. MSG_TYPE_D2H_RING_CONFIG_CMPLT = 0x22,
  171. MSG_TYPE_H2D_MAILBOX_DATA = 0x23,
  172. MSG_TYPE_D2H_MAILBOX_DATA = 0x24,
  173. MSG_TYPE_TIMSTAMP_BUFPOST = 0x25,
  174. MSG_TYPE_HOSTTIMSTAMP = 0x26,
  175. MSG_TYPE_HOSTTIMSTAMP_CMPLT = 0x27,
  176. MSG_TYPE_FIRMWARE_TIMESTAMP = 0x28,
  177. MSG_TYPE_SNAPSHOT_UPLOAD = 0x29,
  178. MSG_TYPE_SNAPSHOT_CMPLT = 0x2A,
  179. MSG_TYPE_H2D_RING_DELETE = 0x2B,
  180. MSG_TYPE_D2H_RING_DELETE = 0x2C,
  181. MSG_TYPE_H2D_RING_DELETE_CMPLT = 0x2D,
  182. MSG_TYPE_D2H_RING_DELETE_CMPLT = 0x2E,
  183. MSG_TYPE_API_MAX_RSVD = 0x3F
  184. } bcmpcie_msg_type_t;
  185. typedef enum bcmpcie_msgtype_int {
  186. MSG_TYPE_INTERNAL_USE_START = 0x40,
  187. MSG_TYPE_EVENT_PYLD = 0x41,
  188. MSG_TYPE_IOCT_PYLD = 0x42,
  189. MSG_TYPE_RX_PYLD = 0x43,
  190. MSG_TYPE_HOST_FETCH = 0x44,
  191. MSG_TYPE_LPBK_DMAXFER_PYLD = 0x45,
  192. MSG_TYPE_TXMETADATA_PYLD = 0x46,
  193. MSG_TYPE_INDX_UPDATE = 0x47,
  194. MSG_TYPE_INFO_PYLD = 0x48,
  195. MSG_TYPE_TS_EVENT_PYLD = 0x49,
  196. MSG_TYPE_PVT_BTLOG_CMPLT = 0x4A,
  197. MSG_TYPE_BTLOG_PYLD = 0x4B,
  198. MSG_TYPE_HMAPTEST_PYLD = 0x4C,
  199. MSG_TYPE_PVT_BT_SNAPSHOT_CMPLT = 0x4D,
  200. MSG_TYPE_BT_SNAPSHOT_PYLD = 0x4E
  201. } bcmpcie_msgtype_int_t;
  202. typedef enum bcmpcie_msgtype_u {
  203. MSG_TYPE_TX_BATCH_POST = 0x80,
  204. MSG_TYPE_IOCTL_REQ = 0x81,
  205. MSG_TYPE_HOST_EVNT = 0x82, /* console related */
  206. MSG_TYPE_LOOPBACK = 0x83
  207. } bcmpcie_msgtype_u_t;
  208. /**
  209. * D2H ring host wakeup soft doorbell, override the PCIE doorbell.
  210. * Host configures an <32bit address,value> tuple, and dongle uses SBTOPCIE
  211. * Transl0 to write specified value to host address.
  212. *
  213. * Use case: 32bit Address mapped to HW Accelerator Core/Thread Wakeup Register
  214. * and value is Core/Thread context. Host will ensure routing the 32bit address
  215. * offerred to PCIE to the mapped register.
  216. *
  217. * D2H_RING_CONFIG_SUBTYPE_SOFT_DOORBELL
  218. */
  219. typedef struct bcmpcie_soft_doorbell {
  220. uint32 value; /* host defined value to be written, eg HW threadid */
  221. bcm_addr64_t haddr; /* host address, eg thread wakeup register address */
  222. uint16 items; /* interrupt coalescing: item count before wakeup */
  223. uint16 msecs; /* interrupt coalescing: timeout in millisecs */
  224. } bcmpcie_soft_doorbell_t;
  225. /**
  226. * D2H interrupt using MSI instead of INTX
  227. * Host configures MSI vector offset for each D2H interrupt
  228. *
  229. * D2H_RING_CONFIG_SUBTYPE_MSI_DOORBELL
  230. */
  231. typedef enum bcmpcie_msi_intr_idx {
  232. MSI_INTR_IDX_CTRL_CMPL_RING = 0,
  233. MSI_INTR_IDX_TXP_CMPL_RING = 1,
  234. MSI_INTR_IDX_RXP_CMPL_RING = 2,
  235. MSI_INTR_IDX_INFO_CMPL_RING = 3,
  236. MSI_INTR_IDX_MAILBOX = 4,
  237. MSI_INTR_IDX_MAX = 5
  238. } bcmpcie_msi_intr_idx_t;
  239. #define BCMPCIE_D2H_MSI_OFFSET_SINGLE 0
  240. typedef enum bcmpcie_msi_offset_type {
  241. BCMPCIE_D2H_MSI_OFFSET_MB0 = 2,
  242. BCMPCIE_D2H_MSI_OFFSET_MB1 = 3,
  243. BCMPCIE_D2H_MSI_OFFSET_DB0 = 4,
  244. BCMPCIE_D2H_MSI_OFFSET_DB1 = 5,
  245. BCMPCIE_D2H_MSI_OFFSET_H1_DB0 = 6,
  246. BCMPCIE_D2H_MSI_OFFSET_MAX = 7
  247. } bcmpcie_msi_offset_type_t;
  248. typedef struct bcmpcie_msi_offset {
  249. uint16 intr_idx; /* interrupt index */
  250. uint16 msi_offset; /* msi vector offset */
  251. } bcmpcie_msi_offset_t;
  252. typedef struct bcmpcie_msi_offset_config {
  253. uint32 len;
  254. bcmpcie_msi_offset_t bcmpcie_msi_offset[MSI_INTR_IDX_MAX];
  255. } bcmpcie_msi_offset_config_t;
  256. #define BCMPCIE_D2H_MSI_OFFSET_DEFAULT BCMPCIE_D2H_MSI_OFFSET_DB1
  257. #define BCMPCIE_D2H_MSI_SINGLE 0xFFFE
  258. /* if_id */
  259. #define BCMPCIE_CMNHDR_IFIDX_PHYINTF_SHFT 5
  260. #define BCMPCIE_CMNHDR_IFIDX_PHYINTF_MAX 0x7
  261. #define BCMPCIE_CMNHDR_IFIDX_PHYINTF_MASK \
  262. (BCMPCIE_CMNHDR_IFIDX_PHYINTF_MAX << BCMPCIE_CMNHDR_IFIDX_PHYINTF_SHFT)
  263. #define BCMPCIE_CMNHDR_IFIDX_VIRTINTF_SHFT 0
  264. #define BCMPCIE_CMNHDR_IFIDX_VIRTINTF_MAX 0x1F
  265. #define BCMPCIE_CMNHDR_IFIDX_VIRTINTF_MASK \
  266. (BCMPCIE_CMNHDR_IFIDX_PHYINTF_MAX << BCMPCIE_CMNHDR_IFIDX_PHYINTF_SHFT)
  267. /* flags */
  268. #define BCMPCIE_CMNHDR_FLAGS_DMA_R_IDX 0x1
  269. #define BCMPCIE_CMNHDR_FLAGS_DMA_R_IDX_INTR 0x2
  270. #define BCMPCIE_CMNHDR_FLAGS_TS_SEQNUM_INIT 0x4
  271. #define BCMPCIE_CMNHDR_FLAGS_PHASE_BIT 0x80
  272. #define BCMPCIE_CMNHDR_PHASE_BIT_INIT 0x80
  273. /* IOCTL request message */
  274. typedef struct ioctl_req_msg {
  275. /** common message header */
  276. cmn_msg_hdr_t cmn_hdr;
  277. /** ioctl command type */
  278. uint32 cmd;
  279. /** ioctl transaction ID, to pair with a ioctl response */
  280. uint16 trans_id;
  281. /** input arguments buffer len */
  282. uint16 input_buf_len;
  283. /** expected output len */
  284. uint16 output_buf_len;
  285. /** to align the host address on 8 byte boundary */
  286. uint16 rsvd[3];
  287. /** always align on 8 byte boundary */
  288. bcm_addr64_t host_input_buf_addr;
  289. /* rsvd */
  290. uint32 rsvd1[2];
  291. } ioctl_req_msg_t;
  292. /** buffer post messages for device to use to return IOCTL responses, Events */
  293. typedef struct ioctl_resp_evt_buf_post_msg {
  294. /** common message header */
  295. cmn_msg_hdr_t cmn_hdr;
  296. /** length of the host buffer supplied */
  297. uint16 host_buf_len;
  298. /** to align the host address on 8 byte boundary */
  299. uint16 reserved[3];
  300. /** always align on 8 byte boundary */
  301. bcm_addr64_t host_buf_addr;
  302. uint32 rsvd[4];
  303. } ioctl_resp_evt_buf_post_msg_t;
  304. /* buffer post messages for device to use to return dbg buffers */
  305. typedef ioctl_resp_evt_buf_post_msg_t info_buf_post_msg_t;
  306. #define DHD_INFOBUF_RX_BUFPOST_PKTSZ (2 * 1024)
  307. #define DHD_BTLOG_RX_BUFPOST_PKTSZ (2 * 1024)
  308. /* An infobuf host buffer starts with a 32 bit (LE) version. */
  309. #define PCIE_INFOBUF_V1 1
  310. /* Infobuf v1 type MSGTRACE's data is exactly the same as the MSGTRACE data that
  311. * is wrapped previously/also in a WLC_E_TRACE event. See structure
  312. * msgrace_hdr_t in msgtrace.h.
  313. */
  314. #define PCIE_INFOBUF_V1_TYPE_MSGTRACE 1
  315. /* Infobuf v1 type LOGTRACE data is exactly the same as the LOGTRACE data that
  316. * is wrapped previously/also in a WLC_E_TRACE event. See structure
  317. * msgrace_hdr_t in msgtrace.h. (The only difference between a MSGTRACE
  318. * and a LOGTRACE is the "trace type" field.)
  319. */
  320. #define PCIE_INFOBUF_V1_TYPE_LOGTRACE 2
  321. /* An infobuf version 1 host buffer has a single TLV. The information on the
  322. * version 1 types follow this structure definition. (int's LE)
  323. */
  324. typedef struct info_buf_payload_hdr_s {
  325. uint16 type;
  326. uint16 length;
  327. } info_buf_payload_hdr_t;
  328. /* BT logs/memory to DMA directly from BT memory to host */
  329. typedef struct info_buf_btlog_s {
  330. void (*status_cb)(void *ctx, void *p, int error); /* obsolete - to be removed */
  331. void *ctx;
  332. dma64addr_t src_addr;
  333. uint32 length;
  334. bool (*pcie_status_cb)(osl_t *osh, void *p, int error);
  335. uint32 bt_intstatus;
  336. int error;
  337. } info_buf_btlog_t;
  338. /** snapshot upload request message */
  339. typedef struct snapshot_upload_request_msg {
  340. /** common message header */
  341. cmn_msg_hdr_t cmn_hdr;
  342. /** length of the snaphost buffer supplied */
  343. uint32 snapshot_buf_len;
  344. /** type of snapshot */
  345. uint8 snapshot_type;
  346. /** snapshot param */
  347. uint8 snapshot_param;
  348. /** to align the host address on 8 byte boundary */
  349. uint8 reserved[2];
  350. /** always align on 8 byte boundary */
  351. bcm_addr64_t host_buf_addr;
  352. uint32 rsvd[4];
  353. } snapshot_upload_request_msg_t;
  354. /** snapshot types */
  355. typedef enum bcmpcie_snapshot_type {
  356. SNAPSHOT_TYPE_BT = 0, /* Bluetooth SRAM and patch RAM */
  357. SNAPSHOT_TYPE_WLAN_SOCRAM = 1, /* WLAN SOCRAM */
  358. SNAPSHOT_TYPE_WLAN_HEAP = 2, /* WLAN HEAP */
  359. SNAPSHOT_TYPE_WLAN_REGISTER = 3 /* WLAN registers */
  360. } bcmpcie_snapshot_type_t;
  361. #define PCIE_DMA_XFER_FLG_D11_LPBK_MASK 0xF
  362. #define PCIE_DMA_XFER_FLG_D11_LPBK_SHIFT 2
  363. #define PCIE_DMA_XFER_FLG_CORE_NUMBER_MASK 3
  364. #define PCIE_DMA_XFER_FLG_CORE_NUMBER_SHIFT 0
  365. typedef struct pcie_dma_xfer_params {
  366. /** common message header */
  367. cmn_msg_hdr_t cmn_hdr;
  368. /** always align on 8 byte boundary */
  369. bcm_addr64_t host_input_buf_addr;
  370. /** always align on 8 byte boundary */
  371. bcm_addr64_t host_ouput_buf_addr;
  372. /** length of transfer */
  373. uint32 xfer_len;
  374. /** delay before doing the src txfer */
  375. uint32 srcdelay;
  376. /** delay before doing the dest txfer */
  377. uint32 destdelay;
  378. uint8 rsvd[3];
  379. /* bit0: D11 DMA loopback flag */
  380. uint8 flags;
  381. } pcie_dma_xfer_params_t;
  382. #define BCMPCIE_FLOW_RING_INTF_HP2P 0x1
  383. /** Complete msgbuf hdr for flow ring update from host to dongle */
  384. typedef struct tx_flowring_create_request {
  385. cmn_msg_hdr_t msg;
  386. uint8 da[ETHER_ADDR_LEN];
  387. uint8 sa[ETHER_ADDR_LEN];
  388. uint8 tid;
  389. uint8 if_flags;
  390. uint16 flow_ring_id;
  391. uint8 tc;
  392. /* priority_ifrmmask is to define core mask in ifrm mode.
  393. * currently it is not used for priority. so uses solely for ifrm mask
  394. */
  395. uint8 priority_ifrmmask;
  396. uint16 int_vector;
  397. uint16 max_items;
  398. uint16 len_item;
  399. bcm_addr64_t flow_ring_ptr;
  400. } tx_flowring_create_request_t;
  401. typedef struct tx_flowring_delete_request {
  402. cmn_msg_hdr_t msg;
  403. uint16 flow_ring_id;
  404. uint16 reason;
  405. uint32 rsvd[7];
  406. } tx_flowring_delete_request_t;
  407. typedef tx_flowring_delete_request_t d2h_ring_delete_req_t;
  408. typedef tx_flowring_delete_request_t h2d_ring_delete_req_t;
  409. typedef struct tx_flowring_flush_request {
  410. cmn_msg_hdr_t msg;
  411. uint16 flow_ring_id;
  412. uint16 reason;
  413. uint32 rsvd[7];
  414. } tx_flowring_flush_request_t;
  415. /** Subtypes for ring_config_req control message */
  416. typedef enum ring_config_subtype {
  417. /** Default D2H PCIE doorbell override using ring_config_req msg */
  418. D2H_RING_CONFIG_SUBTYPE_SOFT_DOORBELL = 1, /* Software doorbell */
  419. D2H_RING_CONFIG_SUBTYPE_MSI_DOORBELL = 2 /* MSI configuration */
  420. } ring_config_subtype_t;
  421. typedef struct ring_config_req {
  422. cmn_msg_hdr_t msg;
  423. uint16 subtype;
  424. uint16 ring_id;
  425. uint32 rsvd;
  426. union {
  427. uint32 data[6];
  428. /** D2H_RING_CONFIG_SUBTYPE_SOFT_DOORBELL */
  429. bcmpcie_soft_doorbell_t soft_doorbell;
  430. /** D2H_RING_CONFIG_SUBTYPE_MSI_DOORBELL */
  431. bcmpcie_msi_offset_config_t msi_offset;
  432. };
  433. } ring_config_req_t;
  434. /* data structure to use to create on the fly d2h rings */
  435. typedef struct d2h_ring_create_req {
  436. cmn_msg_hdr_t msg;
  437. uint16 ring_id;
  438. uint16 ring_type;
  439. uint32 flags;
  440. bcm_addr64_t ring_ptr;
  441. uint16 max_items;
  442. uint16 len_item;
  443. uint32 rsvd[3];
  444. } d2h_ring_create_req_t;
  445. /* data structure to use to create on the fly h2d rings */
  446. #define MAX_COMPLETION_RING_IDS_ASSOCIATED 4
  447. typedef struct h2d_ring_create_req {
  448. cmn_msg_hdr_t msg;
  449. uint16 ring_id;
  450. uint8 ring_type;
  451. uint8 n_completion_ids;
  452. uint32 flags;
  453. bcm_addr64_t ring_ptr;
  454. uint16 max_items;
  455. uint16 len_item;
  456. uint16 completion_ring_ids[MAX_COMPLETION_RING_IDS_ASSOCIATED];
  457. uint32 rsvd;
  458. } h2d_ring_create_req_t;
  459. typedef struct d2h_ring_config_req {
  460. cmn_msg_hdr_t msg;
  461. uint16 d2h_ring_config_subtype;
  462. uint16 d2h_ring_id;
  463. uint32 d2h_ring_config_data[4];
  464. uint32 rsvd[3];
  465. } d2h_ring_config_req_t;
  466. typedef struct h2d_ring_config_req {
  467. cmn_msg_hdr_t msg;
  468. uint16 h2d_ring_config_subtype;
  469. uint16 h2d_ring_id;
  470. uint32 h2d_ring_config_data;
  471. uint32 rsvd[6];
  472. } h2d_ring_config_req_t;
  473. typedef struct h2d_mailbox_data {
  474. cmn_msg_hdr_t msg;
  475. uint32 mail_box_data;
  476. uint32 rsvd[7];
  477. } h2d_mailbox_data_t;
  478. typedef struct host_timestamp_msg {
  479. cmn_msg_hdr_t msg;
  480. uint16 xt_id; /* transaction ID */
  481. uint16 input_data_len; /* data len at the host_buf_addr, data in TLVs */
  482. uint16 seqnum; /* number of times host captured the timestamp */
  483. uint16 rsvd;
  484. /* always align on 8 byte boundary */
  485. bcm_addr64_t host_buf_addr;
  486. /* rsvd */
  487. uint32 rsvd1[4];
  488. } host_timestamp_msg_t;
  489. /* buffer post message for timestamp events MSG_TYPE_TIMSTAMP_BUFPOST */
  490. typedef ioctl_resp_evt_buf_post_msg_t ts_buf_post_msg_t;
  491. typedef union ctrl_submit_item {
  492. ioctl_req_msg_t ioctl_req;
  493. ioctl_resp_evt_buf_post_msg_t resp_buf_post;
  494. pcie_dma_xfer_params_t dma_xfer;
  495. tx_flowring_create_request_t flow_create;
  496. tx_flowring_delete_request_t flow_delete;
  497. tx_flowring_flush_request_t flow_flush;
  498. ring_config_req_t ring_config_req;
  499. d2h_ring_create_req_t d2h_create;
  500. h2d_ring_create_req_t h2d_create;
  501. d2h_ring_config_req_t d2h_config;
  502. h2d_ring_config_req_t h2d_config;
  503. h2d_mailbox_data_t h2d_mailbox_data;
  504. host_timestamp_msg_t host_ts;
  505. ts_buf_post_msg_t ts_buf_post;
  506. d2h_ring_delete_req_t d2h_delete;
  507. h2d_ring_delete_req_t h2d_delete;
  508. unsigned char check[H2DRING_CTRL_SUB_ITEMSIZE];
  509. } ctrl_submit_item_t;
  510. typedef struct info_ring_submit_item {
  511. info_buf_post_msg_t info_buf_post;
  512. unsigned char check[H2DRING_INFO_BUFPOST_ITEMSIZE];
  513. } info_sumbit_item_t;
  514. /** Control Completion messages (20 bytes) */
  515. typedef struct compl_msg_hdr {
  516. union {
  517. /** status for the completion */
  518. int16 status;
  519. /* mutually exclusive with pkt fate debug feature */
  520. struct pktts_compl_hdr {
  521. uint16 d_t4; /* Delta TimeStamp 3: T4-tref */
  522. } tx_pktts;
  523. };
  524. /** submisison flow ring id which generated this status */
  525. union {
  526. uint16 ring_id;
  527. uint16 flow_ring_id;
  528. };
  529. } compl_msg_hdr_t;
  530. /** XOR checksum or a magic number to audit DMA done */
  531. typedef uint32 dma_done_t;
  532. #define MAX_CLKSRC_ID 0xF
  533. #define TX_PKT_RETRY_CNT_0_MASK 0x000000FF
  534. #define TX_PKT_RETRY_CNT_0_SHIFT 0
  535. #define TX_PKT_RETRY_CNT_1_MASK 0x0000FF00
  536. #define TX_PKT_RETRY_CNT_1_SHIFT 8
  537. #define TX_PKT_RETRY_CNT_2_MASK 0x00FF0000
  538. #define TX_PKT_RETRY_CNT_2_SHIFT 16
  539. #define TX_PKT_BAND_INFO 0x0F000000
  540. #define TX_PKT_BAND_INFO_SHIFT 24
  541. #define TX_PKT_VALID_INFO 0xF0000000
  542. #define TX_PKT_VALID_INFO_SHIFT 28
  543. typedef struct ts_timestamp_srcid {
  544. union {
  545. uint32 ts_low; /* time stamp low 32 bits */
  546. uint32 rate_spec; /* use ratespec */
  547. };
  548. union {
  549. uint32 ts_high; /* time stamp high 28 bits */
  550. union {
  551. uint32 ts_high_ext :28; /* time stamp high 28 bits */
  552. uint32 clk_id_ext :3; /* clock ID source */
  553. uint32 phase :1; /* Phase bit */
  554. dma_done_t marker_ext;
  555. };
  556. uint32 tx_pkt_band_retry_info;
  557. };
  558. } ts_timestamp_srcid_t;
  559. typedef ts_timestamp_srcid_t ipc_timestamp_t;
  560. typedef struct ts_timestamp {
  561. uint32 low;
  562. uint32 high;
  563. } ts_timestamp_t;
  564. typedef ts_timestamp_t tick_count_64_t;
  565. typedef ts_timestamp_t ts_timestamp_ns_64_t;
  566. typedef ts_timestamp_t ts_correction_m_t;
  567. typedef ts_timestamp_t ts_correction_b_t;
  568. typedef struct _pktts {
  569. uint32 tref; /* Ref Clk in uSec (currently, tsf) */
  570. uint16 d_t2; /* Delta TimeStamp 1: T2-tref */
  571. uint16 d_t3; /* Delta TimeStamp 2: T3-tref */
  572. } pktts_t;
  573. /* completion header status codes */
  574. #define BCMPCIE_SUCCESS 0
  575. #define BCMPCIE_NOTFOUND 1
  576. #define BCMPCIE_NOMEM 2
  577. #define BCMPCIE_BADOPTION 3
  578. #define BCMPCIE_RING_IN_USE 4
  579. #define BCMPCIE_RING_ID_INVALID 5
  580. #define BCMPCIE_PKT_FLUSH 6
  581. #define BCMPCIE_NO_EVENT_BUF 7
  582. #define BCMPCIE_NO_RX_BUF 8
  583. #define BCMPCIE_NO_IOCTLRESP_BUF 9
  584. #define BCMPCIE_MAX_IOCTLRESP_BUF 10
  585. #define BCMPCIE_MAX_EVENT_BUF 11
  586. #define BCMPCIE_BAD_PHASE 12
  587. #define BCMPCIE_INVALID_CPL_RINGID 13
  588. #define BCMPCIE_RING_TYPE_INVALID 14
  589. #define BCMPCIE_NO_TS_EVENT_BUF 15
  590. #define BCMPCIE_MAX_TS_EVENT_BUF 16
  591. #define BCMPCIE_PCIE_NO_BTLOG_BUF 17
  592. #define BCMPCIE_BT_DMA_ERR 18
  593. #define BCMPCIE_BT_DMA_DESCR_FETCH_ERR 19
  594. #define BCMPCIE_SNAPSHOT_ERR 20
  595. #define BCMPCIE_NOT_READY 21
  596. #define BCMPCIE_INVALID_DATA 22
  597. #define BCMPCIE_NO_RESPONSE 23
  598. #define BCMPCIE_NO_CLOCK 24
  599. /** IOCTL completion response */
  600. typedef struct ioctl_compl_resp_msg {
  601. /** common message header */
  602. cmn_msg_hdr_t cmn_hdr;
  603. /** completion message header */
  604. compl_msg_hdr_t compl_hdr;
  605. /** response buffer len where a host buffer is involved */
  606. uint16 resp_len;
  607. /** transaction id to pair with a request */
  608. uint16 trans_id;
  609. /** cmd id */
  610. uint32 cmd;
  611. /** XOR checksum or a magic number to audit DMA done */
  612. dma_done_t marker;
  613. } ioctl_comp_resp_msg_t;
  614. /** IOCTL request acknowledgement */
  615. typedef struct ioctl_req_ack_msg {
  616. /** common message header */
  617. cmn_msg_hdr_t cmn_hdr;
  618. /** completion message header */
  619. compl_msg_hdr_t compl_hdr;
  620. /** cmd id */
  621. uint32 cmd;
  622. uint32 rsvd;
  623. /** XOR checksum or a magic number to audit DMA done */
  624. dma_done_t marker;
  625. } ioctl_req_ack_msg_t;
  626. /** WL event message: send from device to host */
  627. typedef struct wlevent_req_msg {
  628. /** common message header */
  629. cmn_msg_hdr_t cmn_hdr;
  630. /** completion message header */
  631. compl_msg_hdr_t compl_hdr;
  632. /** event data len valid with the event buffer */
  633. uint16 event_data_len;
  634. /** sequence number */
  635. uint16 seqnum;
  636. /** rsvd */
  637. uint32 rsvd;
  638. /** XOR checksum or a magic number to audit DMA done */
  639. dma_done_t marker;
  640. } wlevent_req_msg_t;
  641. /** dma xfer complete message */
  642. typedef struct pcie_dmaxfer_cmplt {
  643. /** common message header */
  644. cmn_msg_hdr_t cmn_hdr;
  645. /** completion message header */
  646. compl_msg_hdr_t compl_hdr;
  647. uint32 rsvd[2];
  648. /** XOR checksum or a magic number to audit DMA done */
  649. dma_done_t marker;
  650. } pcie_dmaxfer_cmplt_t;
  651. /** general status message */
  652. typedef struct pcie_gen_status {
  653. /** common message header */
  654. cmn_msg_hdr_t cmn_hdr;
  655. /** completion message header */
  656. compl_msg_hdr_t compl_hdr;
  657. uint32 rsvd[2];
  658. /** XOR checksum or a magic number to audit DMA done */
  659. dma_done_t marker;
  660. } pcie_gen_status_t;
  661. /** ring status message */
  662. typedef struct pcie_ring_status {
  663. /** common message header */
  664. cmn_msg_hdr_t cmn_hdr;
  665. /** completion message header */
  666. compl_msg_hdr_t compl_hdr;
  667. /** message which firmware couldn't decode */
  668. uint16 write_idx;
  669. uint16 rsvd[3];
  670. /** XOR checksum or a magic number to audit DMA done */
  671. dma_done_t marker;
  672. } pcie_ring_status_t;
  673. typedef struct ring_create_response {
  674. cmn_msg_hdr_t cmn_hdr;
  675. compl_msg_hdr_t cmplt;
  676. uint32 rsvd[2];
  677. /** XOR checksum or a magic number to audit DMA done */
  678. dma_done_t marker;
  679. } ring_create_response_t;
  680. typedef ring_create_response_t tx_flowring_create_response_t;
  681. typedef ring_create_response_t h2d_ring_create_response_t;
  682. typedef ring_create_response_t d2h_ring_create_response_t;
  683. typedef struct tx_flowring_delete_response {
  684. cmn_msg_hdr_t msg;
  685. compl_msg_hdr_t cmplt;
  686. uint16 read_idx;
  687. uint16 rsvd[3];
  688. /** XOR checksum or a magic number to audit DMA done */
  689. dma_done_t marker;
  690. } tx_flowring_delete_response_t;
  691. typedef tx_flowring_delete_response_t h2d_ring_delete_response_t;
  692. typedef tx_flowring_delete_response_t d2h_ring_delete_response_t;
  693. typedef struct tx_flowring_flush_response {
  694. cmn_msg_hdr_t msg;
  695. compl_msg_hdr_t cmplt;
  696. uint32 rsvd[2];
  697. /** XOR checksum or a magic number to audit DMA done */
  698. dma_done_t marker;
  699. } tx_flowring_flush_response_t;
  700. /** Common layout of all d2h control messages */
  701. typedef struct ctrl_compl_msg {
  702. /** common message header */
  703. cmn_msg_hdr_t cmn_hdr;
  704. /** completion message header */
  705. compl_msg_hdr_t compl_hdr;
  706. uint32 rsvd[2];
  707. /** XOR checksum or a magic number to audit DMA done */
  708. dma_done_t marker;
  709. } ctrl_compl_msg_t;
  710. typedef struct ring_config_resp {
  711. /** common message header */
  712. cmn_msg_hdr_t cmn_hdr;
  713. /** completion message header */
  714. compl_msg_hdr_t compl_hdr;
  715. uint16 subtype;
  716. uint16 rsvd[3];
  717. /** XOR checksum or a magic number to audit DMA done */
  718. dma_done_t marker;
  719. } ring_config_resp_t;
  720. typedef struct d2h_mailbox_data {
  721. cmn_msg_hdr_t msg;
  722. compl_msg_hdr_t cmplt;
  723. uint32 d2h_mailbox_data;
  724. uint32 rsvd[1];
  725. /* XOR checksum or a magic number to audit DMA done */
  726. dma_done_t marker;
  727. } d2h_mailbox_data_t;
  728. /* dbg buf completion msg: send from device to host */
  729. typedef struct info_buf_resp {
  730. /* common message header */
  731. cmn_msg_hdr_t cmn_hdr;
  732. /* completion message header */
  733. compl_msg_hdr_t compl_hdr;
  734. /* event data len valid with the event buffer */
  735. uint16 info_data_len;
  736. /* sequence number */
  737. uint16 seqnum;
  738. /* destination */
  739. uint8 dest;
  740. /* rsvd */
  741. uint8 rsvd[3];
  742. /* XOR checksum or a magic number to audit DMA done */
  743. dma_done_t marker;
  744. } info_buf_resp_t;
  745. /* snapshot completion msg: send from device to host */
  746. typedef struct snapshot_resp {
  747. /* common message header */
  748. cmn_msg_hdr_t cmn_hdr;
  749. /* completion message header */
  750. compl_msg_hdr_t compl_hdr;
  751. /* snapshot length uploaded */
  752. uint32 resp_len;
  753. /* snapshot type */
  754. uint8 type;
  755. /* rsvd */
  756. uint8 rsvd[3];
  757. /* XOR checksum or a magic number to audit DMA done */
  758. dma_done_t marker;
  759. } snapshot_resp_t;
  760. typedef struct info_ring_cpl_item {
  761. info_buf_resp_t info_buf_post;
  762. unsigned char check[D2HRING_INFO_BUFCMPLT_ITEMSIZE];
  763. } info_cpl_item_t;
  764. typedef struct host_timestamp_msg_cpl {
  765. cmn_msg_hdr_t msg;
  766. compl_msg_hdr_t cmplt;
  767. uint16 xt_id; /* transaction ID */
  768. uint16 rsvd;
  769. uint32 rsvd1;
  770. /* XOR checksum or a magic number to audit DMA done */
  771. dma_done_t marker;
  772. } host_timestamp_msg_cpl_t;
  773. typedef struct fw_timestamp_event_msg {
  774. cmn_msg_hdr_t msg;
  775. compl_msg_hdr_t cmplt;
  776. /* fw captures time stamp info and passed that to host in TLVs */
  777. uint16 buf_len; /* length of the time stamp data copied in host buf */
  778. uint16 seqnum; /* number of times fw captured time stamp */
  779. uint32 rsvd;
  780. /* XOR checksum or a magic number to audit DMA done */
  781. dma_done_t marker;
  782. } fw_timestamp_event_msg_t;
  783. typedef union ctrl_completion_item {
  784. ioctl_comp_resp_msg_t ioctl_resp;
  785. wlevent_req_msg_t event;
  786. ioctl_req_ack_msg_t ioct_ack;
  787. pcie_dmaxfer_cmplt_t pcie_xfer_cmplt;
  788. pcie_gen_status_t pcie_gen_status;
  789. pcie_ring_status_t pcie_ring_status;
  790. tx_flowring_create_response_t txfl_create_resp;
  791. tx_flowring_delete_response_t txfl_delete_resp;
  792. tx_flowring_flush_response_t txfl_flush_resp;
  793. ctrl_compl_msg_t ctrl_compl;
  794. ring_config_resp_t ring_config_resp;
  795. d2h_mailbox_data_t d2h_mailbox_data;
  796. info_buf_resp_t dbg_resp;
  797. h2d_ring_create_response_t h2d_ring_create_resp;
  798. d2h_ring_create_response_t d2h_ring_create_resp;
  799. host_timestamp_msg_cpl_t host_ts_cpl;
  800. fw_timestamp_event_msg_t fw_ts_event;
  801. h2d_ring_delete_response_t h2d_ring_delete_resp;
  802. d2h_ring_delete_response_t d2h_ring_delete_resp;
  803. unsigned char ctrl_response[D2HRING_CTRL_CMPLT_ITEMSIZE];
  804. } ctrl_completion_item_t;
  805. /** H2D Rxpost ring work items */
  806. typedef struct host_rxbuf_post {
  807. /** common message header */
  808. cmn_msg_hdr_t cmn_hdr;
  809. /** provided meta data buffer len */
  810. uint16 metadata_buf_len;
  811. /** provided data buffer len to receive data */
  812. uint16 data_buf_len;
  813. /** alignment to make the host buffers start on 8 byte boundary */
  814. uint32 rsvd;
  815. /** provided meta data buffer */
  816. bcm_addr64_t metadata_buf_addr;
  817. /** provided data buffer to receive data */
  818. bcm_addr64_t data_buf_addr;
  819. } host_rxbuf_post_t;
  820. typedef union rxbuf_submit_item {
  821. host_rxbuf_post_t rxpost;
  822. unsigned char check[H2DRING_RXPOST_ITEMSIZE];
  823. } rxbuf_submit_item_t;
  824. /* D2H Rxcompletion ring work items for IPC rev7 */
  825. typedef struct host_rxbuf_cmpl {
  826. /** common message header */
  827. cmn_msg_hdr_t cmn_hdr;
  828. /** completion message header */
  829. compl_msg_hdr_t compl_hdr;
  830. /** filled up meta data len */
  831. uint16 metadata_len;
  832. /** filled up buffer len to receive data */
  833. uint16 data_len;
  834. /** offset in the host rx buffer where the data starts */
  835. uint16 data_offset;
  836. /** offset in the host rx buffer where the data starts */
  837. uint16 flags;
  838. /** rx status */
  839. uint32 rx_status_0;
  840. uint32 rx_status_1;
  841. union { /* size per IPC = (3 x uint32) bytes */
  842. struct {
  843. /* used by Monitor mode */
  844. uint32 marker;
  845. /* timestamp */
  846. ipc_timestamp_t ts;
  847. };
  848. /* LatTS_With_XORCSUM */
  849. struct {
  850. /* latency timestamp */
  851. pktts_t rx_pktts;
  852. /* XOR checksum or a magic number to audit DMA done */
  853. dma_done_t marker_ext;
  854. };
  855. };
  856. } host_rxbuf_cmpl_t;
  857. typedef union rxbuf_complete_item {
  858. host_rxbuf_cmpl_t rxcmpl;
  859. unsigned char check[D2HRING_RXCMPLT_ITEMSIZE];
  860. } rxbuf_complete_item_t;
  861. typedef struct host_txbuf_post {
  862. /** common message header */
  863. cmn_msg_hdr_t cmn_hdr;
  864. /** eth header */
  865. uint8 txhdr[ETHER_HDR_LEN];
  866. /** flags */
  867. uint8 flags;
  868. /** number of segments */
  869. uint8 seg_cnt;
  870. /** provided meta data buffer for txstatus */
  871. bcm_addr64_t metadata_buf_addr;
  872. /** provided data buffer to receive data */
  873. bcm_addr64_t data_buf_addr;
  874. /** provided meta data buffer len */
  875. uint16 metadata_buf_len;
  876. /** provided data buffer len to receive data */
  877. uint16 data_len;
  878. union {
  879. struct {
  880. /** extended transmit flags */
  881. uint8 ext_flags;
  882. uint8 scale_factor;
  883. /** user defined rate */
  884. uint8 rate;
  885. uint8 exp_time;
  886. };
  887. /** XOR checksum or a magic number to audit DMA done */
  888. dma_done_t marker;
  889. };
  890. } host_txbuf_post_t;
  891. #define BCMPCIE_PKT_FLAGS_FRAME_802_3 0x01
  892. #define BCMPCIE_PKT_FLAGS_FRAME_802_11 0x02
  893. #define BCMPCIE_PKT_FLAGS_FRAME_NORETRY 0x01 /* Disable retry on this frame */
  894. #define BCMPCIE_PKT_FLAGS_FRAME_NOAGGR 0x02 /* Disable aggregation for this frame */
  895. #define BCMPCIE_PKT_FLAGS_FRAME_UDR 0x04 /* User defined rate for this frame */
  896. #define BCMPCIE_PKT_FLAGS_FRAME_ATTR_MASK 0x07 /* Attribute mask */
  897. #define BCMPCIE_PKT_FLAGS_FRAME_EXEMPT_MASK 0x03 /* Exempt uses 2 bits */
  898. #define BCMPCIE_PKT_FLAGS_FRAME_EXEMPT_SHIFT 0x02 /* needs to be shifted past other bits */
  899. #define BCMPCIE_PKT_FLAGS_EPOCH_SHIFT 3u
  900. #define BCMPCIE_PKT_FLAGS_EPOCH_MASK (1u << BCMPCIE_PKT_FLAGS_EPOCH_SHIFT)
  901. #define BCMPCIE_PKT_FLAGS_PRIO_SHIFT 5
  902. #define BCMPCIE_PKT_FLAGS_PRIO_MASK (7 << BCMPCIE_PKT_FLAGS_PRIO_SHIFT)
  903. #define BCMPCIE_PKT_FLAGS_MONITOR_NO_AMSDU 0x00
  904. #define BCMPCIE_PKT_FLAGS_MONITOR_FIRST_PKT 0x01
  905. #define BCMPCIE_PKT_FLAGS_MONITOR_INTER_PKT 0x02
  906. #define BCMPCIE_PKT_FLAGS_MONITOR_LAST_PKT 0x03
  907. #define BCMPCIE_PKT_FLAGS_NO_FORWARD 0x04
  908. #define BCMPCIE_PKT_FLAGS_MONITOR_SHIFT 8
  909. #define BCMPCIE_PKT_FLAGS_MONITOR_MASK (3 << BCMPCIE_PKT_FLAGS_MONITOR_SHIFT)
  910. /* These are added to fix up compile issues */
  911. #define BCMPCIE_TXPOST_FLAGS_FRAME_802_3 BCMPCIE_PKT_FLAGS_FRAME_802_3
  912. #define BCMPCIE_TXPOST_FLAGS_FRAME_802_11 BCMPCIE_PKT_FLAGS_FRAME_802_11
  913. #define BCMPCIE_TXPOST_FLAGS_PRIO_SHIFT BCMPCIE_PKT_FLAGS_PRIO_SHIFT
  914. #define BCMPCIE_TXPOST_FLAGS_PRIO_MASK BCMPCIE_PKT_FLAGS_PRIO_MASK
  915. /* H2D Txpost ring work items */
  916. typedef union txbuf_submit_item {
  917. host_txbuf_post_t txpost;
  918. unsigned char check[H2DRING_TXPOST_ITEMSIZE];
  919. } txbuf_submit_item_t;
  920. /* D2H Txcompletion ring work items - extended for IOC rev7 */
  921. typedef struct host_txbuf_cmpl {
  922. /** common message header */
  923. cmn_msg_hdr_t cmn_hdr;
  924. /** completion message header */
  925. compl_msg_hdr_t compl_hdr;
  926. union { /* size per IPC = (3 x uint32) bytes */
  927. /* Usage 1: TxS_With_TimeSync */
  928. struct {
  929. struct {
  930. union {
  931. /** provided meta data len */
  932. uint16 metadata_len;
  933. /** provided extended TX status */
  934. uint16 tx_status_ext;
  935. }; /*Ext_TxStatus */
  936. /** WLAN side txstatus */
  937. uint16 tx_status;
  938. }; /* TxS */
  939. /* timestamp */
  940. ipc_timestamp_t ts;
  941. }; /* TxS_with_TS */
  942. /* Usage 2: LatTS_With_XORCSUM */
  943. struct {
  944. /* latency timestamp */
  945. pktts_t tx_pktts;
  946. /* XOR checksum or a magic number to audit DMA done */
  947. dma_done_t marker_ext;
  948. };
  949. };
  950. } host_txbuf_cmpl_t;
  951. typedef union txbuf_complete_item {
  952. host_txbuf_cmpl_t txcmpl;
  953. unsigned char check[D2HRING_TXCMPLT_ITEMSIZE];
  954. } txbuf_complete_item_t;
  955. #define PCIE_METADATA_VER 1u
  956. /* version and length are not part of this structure.
  957. * dhd queries version and length through bus iovar "bus:metadata_info".
  958. */
  959. struct metadata_txcmpl_v1 {
  960. uint32 tref; /* TSF or Ref Clock in uSecs */
  961. uint16 d_t2; /* T2-fwt1 delta */
  962. uint16 d_t3; /* T3-fwt1 delta */
  963. uint16 d_t4; /* T4-fwt1 delta */
  964. uint16 rsvd; /* reserved */
  965. };
  966. typedef struct metadata_txcmpl_v1 metadata_txcmpl_t;
  967. #define BCMPCIE_D2H_METADATA_HDRLEN 4
  968. #define BCMPCIE_D2H_METADATA_MINLEN (BCMPCIE_D2H_METADATA_HDRLEN + 4)
  969. /** ret buf struct */
  970. typedef struct ret_buf_ptr {
  971. uint32 low_addr;
  972. uint32 high_addr;
  973. } ret_buf_t;
  974. #ifdef PCIE_API_REV1
  975. /* ioctl specific hdr */
  976. typedef struct ioctl_hdr {
  977. uint16 cmd;
  978. uint16 retbuf_len;
  979. uint32 cmd_id;
  980. } ioctl_hdr_t;
  981. typedef struct ioctlptr_hdr {
  982. uint16 cmd;
  983. uint16 retbuf_len;
  984. uint16 buflen;
  985. uint16 rsvd;
  986. uint32 cmd_id;
  987. } ioctlptr_hdr_t;
  988. #else /* PCIE_API_REV1 */
  989. typedef struct ioctl_req_hdr {
  990. uint32 pkt_id; /**< Packet ID */
  991. uint32 cmd; /**< IOCTL ID */
  992. uint16 retbuf_len;
  993. uint16 buflen;
  994. uint16 xt_id; /**< transaction ID */
  995. uint16 rsvd[1];
  996. } ioctl_req_hdr_t;
  997. #endif /* PCIE_API_REV1 */
  998. /** Complete msgbuf hdr for ioctl from host to dongle */
  999. typedef struct ioct_reqst_hdr {
  1000. cmn_msg_hdr_t msg;
  1001. #ifdef PCIE_API_REV1
  1002. ioctl_hdr_t ioct_hdr;
  1003. #else
  1004. ioctl_req_hdr_t ioct_hdr;
  1005. #endif // endif
  1006. ret_buf_t ret_buf;
  1007. } ioct_reqst_hdr_t;
  1008. typedef struct ioctptr_reqst_hdr {
  1009. cmn_msg_hdr_t msg;
  1010. #ifdef PCIE_API_REV1
  1011. ioctlptr_hdr_t ioct_hdr;
  1012. #else
  1013. ioctl_req_hdr_t ioct_hdr;
  1014. #endif // endif
  1015. ret_buf_t ret_buf;
  1016. ret_buf_t ioct_buf;
  1017. } ioctptr_reqst_hdr_t;
  1018. /** ioctl response header */
  1019. typedef struct ioct_resp_hdr {
  1020. cmn_msg_hdr_t msg;
  1021. #ifdef PCIE_API_REV1
  1022. uint32 cmd_id;
  1023. #else
  1024. uint32 pkt_id;
  1025. #endif // endif
  1026. uint32 status;
  1027. uint32 ret_len;
  1028. uint32 inline_data;
  1029. #ifdef PCIE_API_REV1
  1030. #else
  1031. uint16 xt_id; /**< transaction ID */
  1032. uint16 rsvd[1];
  1033. #endif // endif
  1034. } ioct_resp_hdr_t;
  1035. /* ioct resp header used in dongle */
  1036. /* ret buf hdr will be stripped off inside dongle itself */
  1037. typedef struct msgbuf_ioctl_resp {
  1038. ioct_resp_hdr_t ioct_hdr;
  1039. ret_buf_t ret_buf; /**< ret buf pointers */
  1040. } msgbuf_ioct_resp_t;
  1041. /** WL event hdr info */
  1042. typedef struct wl_event_hdr {
  1043. cmn_msg_hdr_t msg;
  1044. uint16 event;
  1045. uint8 flags;
  1046. uint8 rsvd;
  1047. uint16 retbuf_len;
  1048. uint16 rsvd1;
  1049. uint32 rxbufid;
  1050. } wl_event_hdr_t;
  1051. #define TXDESCR_FLOWID_PCIELPBK_1 0xFF
  1052. #define TXDESCR_FLOWID_PCIELPBK_2 0xFE
  1053. typedef struct txbatch_lenptr_tup {
  1054. uint32 pktid;
  1055. uint16 pktlen;
  1056. uint16 rsvd;
  1057. ret_buf_t ret_buf; /**< ret buf pointers */
  1058. } txbatch_lenptr_tup_t;
  1059. typedef struct txbatch_cmn_msghdr {
  1060. cmn_msg_hdr_t msg;
  1061. uint8 priority;
  1062. uint8 hdrlen;
  1063. uint8 pktcnt;
  1064. uint8 flowid;
  1065. uint8 txhdr[ETHER_HDR_LEN];
  1066. uint16 rsvd;
  1067. } txbatch_cmn_msghdr_t;
  1068. typedef struct txbatch_msghdr {
  1069. txbatch_cmn_msghdr_t txcmn;
  1070. txbatch_lenptr_tup_t tx_tup[0]; /**< Based on packet count */
  1071. } txbatch_msghdr_t;
  1072. /* TX desc posting header */
  1073. typedef struct tx_lenptr_tup {
  1074. uint16 pktlen;
  1075. uint16 rsvd;
  1076. ret_buf_t ret_buf; /**< ret buf pointers */
  1077. } tx_lenptr_tup_t;
  1078. typedef struct txdescr_cmn_msghdr {
  1079. cmn_msg_hdr_t msg;
  1080. uint8 priority;
  1081. uint8 hdrlen;
  1082. uint8 descrcnt;
  1083. uint8 flowid;
  1084. uint32 pktid;
  1085. } txdescr_cmn_msghdr_t;
  1086. typedef struct txdescr_msghdr {
  1087. txdescr_cmn_msghdr_t txcmn;
  1088. uint8 txhdr[ETHER_HDR_LEN];
  1089. uint16 rsvd;
  1090. tx_lenptr_tup_t tx_tup[0]; /**< Based on descriptor count */
  1091. } txdescr_msghdr_t;
  1092. /** Tx status header info */
  1093. typedef struct txstatus_hdr {
  1094. cmn_msg_hdr_t msg;
  1095. uint32 pktid;
  1096. } txstatus_hdr_t;
  1097. /** RX bufid-len-ptr tuple */
  1098. typedef struct rx_lenptr_tup {
  1099. uint32 rxbufid;
  1100. uint16 len;
  1101. uint16 rsvd2;
  1102. ret_buf_t ret_buf; /**< ret buf pointers */
  1103. } rx_lenptr_tup_t;
  1104. /** Rx descr Post hdr info */
  1105. typedef struct rxdesc_msghdr {
  1106. cmn_msg_hdr_t msg;
  1107. uint16 rsvd0;
  1108. uint8 rsvd1;
  1109. uint8 descnt;
  1110. rx_lenptr_tup_t rx_tup[0];
  1111. } rxdesc_msghdr_t;
  1112. /** RX complete tuples */
  1113. typedef struct rxcmplt_tup {
  1114. uint16 retbuf_len;
  1115. uint16 data_offset;
  1116. uint32 rxstatus0;
  1117. uint32 rxstatus1;
  1118. uint32 rxbufid;
  1119. } rxcmplt_tup_t;
  1120. /** RX complete messge hdr */
  1121. typedef struct rxcmplt_hdr {
  1122. cmn_msg_hdr_t msg;
  1123. uint16 rsvd0;
  1124. uint16 rxcmpltcnt;
  1125. rxcmplt_tup_t rx_tup[0];
  1126. } rxcmplt_hdr_t;
  1127. typedef struct hostevent_hdr {
  1128. cmn_msg_hdr_t msg;
  1129. uint32 evnt_pyld;
  1130. } hostevent_hdr_t;
  1131. typedef struct dma_xfer_params {
  1132. uint32 src_physaddr_hi;
  1133. uint32 src_physaddr_lo;
  1134. uint32 dest_physaddr_hi;
  1135. uint32 dest_physaddr_lo;
  1136. uint32 len;
  1137. uint32 srcdelay;
  1138. uint32 destdelay;
  1139. } dma_xfer_params_t;
  1140. enum {
  1141. HOST_EVENT_CONS_CMD = 1
  1142. };
  1143. /* defines for flags */
  1144. #define MSGBUF_IOC_ACTION_MASK 0x1
  1145. #define MAX_SUSPEND_REQ 15
  1146. typedef struct tx_idle_flowring_suspend_request {
  1147. cmn_msg_hdr_t msg;
  1148. uint16 ring_id[MAX_SUSPEND_REQ]; /* ring Id's */
  1149. uint16 num; /* number of flowid's to suspend */
  1150. } tx_idle_flowring_suspend_request_t;
  1151. typedef struct tx_idle_flowring_suspend_response {
  1152. cmn_msg_hdr_t msg;
  1153. compl_msg_hdr_t cmplt;
  1154. uint32 rsvd[2];
  1155. dma_done_t marker;
  1156. } tx_idle_flowring_suspend_response_t;
  1157. typedef struct tx_idle_flowring_resume_request {
  1158. cmn_msg_hdr_t msg;
  1159. uint16 flow_ring_id;
  1160. uint16 reason;
  1161. uint32 rsvd[7];
  1162. } tx_idle_flowring_resume_request_t;
  1163. typedef struct tx_idle_flowring_resume_response {
  1164. cmn_msg_hdr_t msg;
  1165. compl_msg_hdr_t cmplt;
  1166. uint32 rsvd[2];
  1167. dma_done_t marker;
  1168. } tx_idle_flowring_resume_response_t;
  1169. /* timesync related additions */
  1170. typedef struct _bcm_xtlv {
  1171. uint16 id; /* TLV idenitifier */
  1172. uint16 len; /* TLV length in bytes */
  1173. } _bcm_xtlv_t;
  1174. #define BCMMSGBUF_FW_CLOCK_INFO_TAG 0
  1175. #define BCMMSGBUF_HOST_CLOCK_INFO_TAG 1
  1176. #define BCMMSGBUF_HOST_CLOCK_SELECT_TAG 2
  1177. #define BCMMSGBUF_D2H_CLOCK_CORRECTION_TAG 3
  1178. #define BCMMSGBUF_HOST_TIMESTAMPING_CONFIG_TAG 4
  1179. #define BCMMSGBUF_MAX_TSYNC_TAG 5
  1180. /* Flags in fw clock info TLV */
  1181. #define CAP_DEVICE_TS (1 << 0)
  1182. #define CAP_CORRECTED_TS (1 << 1)
  1183. #define TS_CLK_ACTIVE (1 << 2)
  1184. typedef struct ts_fw_clock_info {
  1185. _bcm_xtlv_t xtlv; /* BCMMSGBUF_FW_CLOCK_INFO_TAG */
  1186. ts_timestamp_srcid_t ts; /* tick count */
  1187. uchar clk_src[4]; /* clock source acronym ILP/AVB/TSF */
  1188. uint32 nominal_clock_freq;
  1189. uint32 reset_cnt;
  1190. uint8 flags;
  1191. uint8 rsvd[3];
  1192. } ts_fw_clock_info_t;
  1193. typedef struct ts_host_clock_info {
  1194. _bcm_xtlv_t xtlv; /* BCMMSGBUF_HOST_CLOCK_INFO_TAG */
  1195. tick_count_64_t ticks; /* 64 bit host tick counter */
  1196. ts_timestamp_ns_64_t ns; /* 64 bit host time in nano seconds */
  1197. } ts_host_clock_info_t;
  1198. typedef struct ts_host_clock_sel {
  1199. _bcm_xtlv_t xtlv; /* BCMMSGBUF_HOST_CLOCK_SELECT_TAG */
  1200. uint32 seqnum; /* number of times GPIO time sync toggled */
  1201. uint8 min_clk_idx; /* clock idenitifer configured for packet tiem stamping */
  1202. uint8 max_clk_idx; /* clock idenitifer configured for packet tiem stamping */
  1203. uint16 rsvd[1];
  1204. } ts_host_clock_sel_t;
  1205. typedef struct ts_d2h_clock_correction {
  1206. _bcm_xtlv_t xtlv; /* BCMMSGBUF_HOST_CLOCK_INFO_TAG */
  1207. uint8 clk_id; /* clock source in the device */
  1208. uint8 rsvd[3];
  1209. ts_correction_m_t m; /* y = 'm' x + b */
  1210. ts_correction_b_t b; /* y = 'm' x + 'c' */
  1211. } ts_d2h_clock_correction_t;
  1212. typedef struct ts_host_timestamping_config {
  1213. _bcm_xtlv_t xtlv; /* BCMMSGBUF_HOST_TIMESTAMPING_CONFIG_TAG */
  1214. /* time period to capture the device time stamp and toggle WLAN_TIME_SYNC_GPIO */
  1215. uint16 period_ms;
  1216. uint8 flags;
  1217. uint8 post_delay;
  1218. uint32 reset_cnt;
  1219. } ts_host_timestamping_config_t;
  1220. /* Flags in host timestamping config TLV */
  1221. #define FLAG_HOST_RESET (1 << 0)
  1222. #define IS_HOST_RESET(x) ((x) & FLAG_HOST_RESET)
  1223. #define CLEAR_HOST_RESET(x) ((x) & ~FLAG_HOST_RESET)
  1224. #define FLAG_CONFIG_NODROP (1 << 1)
  1225. #define IS_CONFIG_NODROP(x) ((x) & FLAG_CONFIG_NODROP)
  1226. #define CLEAR_CONFIG_NODROP(x) ((x) & ~FLAG_CONFIG_NODROP)
  1227. #endif /* _bcmmsgbuf_h_ */