bfi_enet.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856
  1. /*
  2. * Linux network driver for QLogic BR-series Converged Network Adapter.
  3. *
  4. * This program is free software; you can redistribute it and/or modify it
  5. * under the terms of the GNU General Public License (GPL) Version 2 as
  6. * published by the Free Software Foundation
  7. *
  8. * This program is distributed in the hope that it will be useful, but
  9. * WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. * General Public License for more details.
  12. */
  13. /*
  14. * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
  15. * Copyright (c) 2014-2015 QLogic Corporation
  16. * All rights reserved
  17. * www.qlogic.com
  18. */
  19. /* BNA Hardware and Firmware Interface */
  20. /* Skipping statistics collection to avoid clutter.
  21. * Command is no longer needed:
  22. * MTU
  23. * TxQ Stop
  24. * RxQ Stop
  25. * RxF Enable/Disable
  26. *
  27. * HDS-off request is dynamic
  28. * keep structures as multiple of 32-bit fields for alignment.
  29. * All values must be written in big-endian.
  30. */
  31. #ifndef __BFI_ENET_H__
  32. #define __BFI_ENET_H__
  33. #include "bfa_defs.h"
  34. #include "bfi.h"
  35. #define BFI_ENET_CFG_MAX 32 /* Max resources per PF */
  36. #define BFI_ENET_TXQ_PRIO_MAX 8
  37. #define BFI_ENET_RX_QSET_MAX 16
  38. #define BFI_ENET_TXQ_WI_VECT_MAX 4
  39. #define BFI_ENET_VLAN_ID_MAX 4096
  40. #define BFI_ENET_VLAN_BLOCK_SIZE 512 /* in bits */
  41. #define BFI_ENET_VLAN_BLOCKS_MAX \
  42. (BFI_ENET_VLAN_ID_MAX / BFI_ENET_VLAN_BLOCK_SIZE)
  43. #define BFI_ENET_VLAN_WORD_SIZE 32 /* in bits */
  44. #define BFI_ENET_VLAN_WORDS_MAX \
  45. (BFI_ENET_VLAN_BLOCK_SIZE / BFI_ENET_VLAN_WORD_SIZE)
  46. #define BFI_ENET_RSS_RIT_MAX 64 /* entries */
  47. #define BFI_ENET_RSS_KEY_LEN 10 /* 32-bit words */
  48. union bfi_addr_be_u {
  49. struct {
  50. u32 addr_hi; /* Most Significant 32-bits */
  51. u32 addr_lo; /* Least Significant 32-Bits */
  52. } __packed a32;
  53. } __packed;
  54. /* T X Q U E U E D E F I N E S */
  55. /* TxQ Vector (a.k.a. Tx-Buffer Descriptor) */
  56. /* TxQ Entry Opcodes */
  57. #define BFI_ENET_TXQ_WI_SEND (0x402) /* Single Frame Transmission */
  58. #define BFI_ENET_TXQ_WI_SEND_LSO (0x403) /* Multi-Frame Transmission */
  59. #define BFI_ENET_TXQ_WI_EXTENSION (0x104) /* Extension WI */
  60. /* TxQ Entry Control Flags */
  61. #define BFI_ENET_TXQ_WI_CF_FCOE_CRC BIT(8)
  62. #define BFI_ENET_TXQ_WI_CF_IPID_MODE BIT(5)
  63. #define BFI_ENET_TXQ_WI_CF_INS_PRIO BIT(4)
  64. #define BFI_ENET_TXQ_WI_CF_INS_VLAN BIT(3)
  65. #define BFI_ENET_TXQ_WI_CF_UDP_CKSUM BIT(2)
  66. #define BFI_ENET_TXQ_WI_CF_TCP_CKSUM BIT(1)
  67. #define BFI_ENET_TXQ_WI_CF_IP_CKSUM BIT(0)
  68. struct bfi_enet_txq_wi_base {
  69. u8 reserved;
  70. u8 num_vectors; /* number of vectors present */
  71. u16 opcode;
  72. /* BFI_ENET_TXQ_WI_SEND or BFI_ENET_TXQ_WI_SEND_LSO */
  73. u16 flags; /* OR of all the flags */
  74. u16 l4_hdr_size_n_offset;
  75. u16 vlan_tag;
  76. u16 lso_mss; /* Only 14 LSB are valid */
  77. u32 frame_length; /* Only 24 LSB are valid */
  78. } __packed;
  79. struct bfi_enet_txq_wi_ext {
  80. u16 reserved;
  81. u16 opcode; /* BFI_ENET_TXQ_WI_EXTENSION */
  82. u32 reserved2[3];
  83. } __packed;
  84. struct bfi_enet_txq_wi_vector { /* Tx Buffer Descriptor */
  85. u16 reserved;
  86. u16 length; /* Only 14 LSB are valid */
  87. union bfi_addr_be_u addr;
  88. } __packed;
  89. /* TxQ Entry Structure */
  90. struct bfi_enet_txq_entry {
  91. union {
  92. struct bfi_enet_txq_wi_base base;
  93. struct bfi_enet_txq_wi_ext ext;
  94. } __packed wi;
  95. struct bfi_enet_txq_wi_vector vector[BFI_ENET_TXQ_WI_VECT_MAX];
  96. } __packed;
  97. #define wi_hdr wi.base
  98. #define wi_ext_hdr wi.ext
  99. #define BFI_ENET_TXQ_WI_L4_HDR_N_OFFSET(_hdr_size, _offset) \
  100. (((_hdr_size) << 10) | ((_offset) & 0x3FF))
  101. /* R X Q U E U E D E F I N E S */
  102. struct bfi_enet_rxq_entry {
  103. union bfi_addr_be_u rx_buffer;
  104. } __packed;
  105. /* R X C O M P L E T I O N Q U E U E D E F I N E S */
  106. /* CQ Entry Flags */
  107. #define BFI_ENET_CQ_EF_MAC_ERROR BIT(0)
  108. #define BFI_ENET_CQ_EF_FCS_ERROR BIT(1)
  109. #define BFI_ENET_CQ_EF_TOO_LONG BIT(2)
  110. #define BFI_ENET_CQ_EF_FC_CRC_OK BIT(3)
  111. #define BFI_ENET_CQ_EF_RSVD1 BIT(4)
  112. #define BFI_ENET_CQ_EF_L4_CKSUM_OK BIT(5)
  113. #define BFI_ENET_CQ_EF_L3_CKSUM_OK BIT(6)
  114. #define BFI_ENET_CQ_EF_HDS_HEADER BIT(7)
  115. #define BFI_ENET_CQ_EF_UDP BIT(8)
  116. #define BFI_ENET_CQ_EF_TCP BIT(9)
  117. #define BFI_ENET_CQ_EF_IP_OPTIONS BIT(10)
  118. #define BFI_ENET_CQ_EF_IPV6 BIT(11)
  119. #define BFI_ENET_CQ_EF_IPV4 BIT(12)
  120. #define BFI_ENET_CQ_EF_VLAN BIT(13)
  121. #define BFI_ENET_CQ_EF_RSS BIT(14)
  122. #define BFI_ENET_CQ_EF_RSVD2 BIT(15)
  123. #define BFI_ENET_CQ_EF_MCAST_MATCH BIT(16)
  124. #define BFI_ENET_CQ_EF_MCAST BIT(17)
  125. #define BFI_ENET_CQ_EF_BCAST BIT(18)
  126. #define BFI_ENET_CQ_EF_REMOTE BIT(19)
  127. #define BFI_ENET_CQ_EF_LOCAL BIT(20)
  128. /* CQ Entry Structure */
  129. struct bfi_enet_cq_entry {
  130. u32 flags;
  131. u16 vlan_tag;
  132. u16 length;
  133. u32 rss_hash;
  134. u8 valid;
  135. u8 reserved1;
  136. u8 reserved2;
  137. u8 rxq_id;
  138. } __packed;
  139. /* E N E T C O N T R O L P A T H C O M M A N D S */
  140. struct bfi_enet_q {
  141. union bfi_addr_u pg_tbl;
  142. union bfi_addr_u first_entry;
  143. u16 pages; /* # of pages */
  144. u16 page_sz;
  145. } __packed;
  146. struct bfi_enet_txq {
  147. struct bfi_enet_q q;
  148. u8 priority;
  149. u8 rsvd[3];
  150. } __packed;
  151. struct bfi_enet_rxq {
  152. struct bfi_enet_q q;
  153. u16 rx_buffer_size;
  154. u16 rsvd;
  155. } __packed;
  156. struct bfi_enet_cq {
  157. struct bfi_enet_q q;
  158. } __packed;
  159. struct bfi_enet_ib_cfg {
  160. u8 int_pkt_dma;
  161. u8 int_enabled;
  162. u8 int_pkt_enabled;
  163. u8 continuous_coalescing;
  164. u8 msix;
  165. u8 rsvd[3];
  166. u32 coalescing_timeout;
  167. u32 inter_pkt_timeout;
  168. u8 inter_pkt_count;
  169. u8 rsvd1[3];
  170. } __packed;
  171. struct bfi_enet_ib {
  172. union bfi_addr_u index_addr;
  173. union {
  174. u16 msix_index;
  175. u16 intx_bitmask;
  176. } __packed intr;
  177. u16 rsvd;
  178. } __packed;
  179. /* ENET command messages */
  180. enum bfi_enet_h2i_msgs {
  181. /* Rx Commands */
  182. BFI_ENET_H2I_RX_CFG_SET_REQ = 1,
  183. BFI_ENET_H2I_RX_CFG_CLR_REQ = 2,
  184. BFI_ENET_H2I_RIT_CFG_REQ = 3,
  185. BFI_ENET_H2I_RSS_CFG_REQ = 4,
  186. BFI_ENET_H2I_RSS_ENABLE_REQ = 5,
  187. BFI_ENET_H2I_RX_PROMISCUOUS_REQ = 6,
  188. BFI_ENET_H2I_RX_DEFAULT_REQ = 7,
  189. BFI_ENET_H2I_MAC_UCAST_SET_REQ = 8,
  190. BFI_ENET_H2I_MAC_UCAST_CLR_REQ = 9,
  191. BFI_ENET_H2I_MAC_UCAST_ADD_REQ = 10,
  192. BFI_ENET_H2I_MAC_UCAST_DEL_REQ = 11,
  193. BFI_ENET_H2I_MAC_MCAST_ADD_REQ = 12,
  194. BFI_ENET_H2I_MAC_MCAST_DEL_REQ = 13,
  195. BFI_ENET_H2I_MAC_MCAST_FILTER_REQ = 14,
  196. BFI_ENET_H2I_RX_VLAN_SET_REQ = 15,
  197. BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ = 16,
  198. /* Tx Commands */
  199. BFI_ENET_H2I_TX_CFG_SET_REQ = 17,
  200. BFI_ENET_H2I_TX_CFG_CLR_REQ = 18,
  201. /* Port Commands */
  202. BFI_ENET_H2I_PORT_ADMIN_UP_REQ = 19,
  203. BFI_ENET_H2I_SET_PAUSE_REQ = 20,
  204. BFI_ENET_H2I_DIAG_LOOPBACK_REQ = 21,
  205. /* Get Attributes Command */
  206. BFI_ENET_H2I_GET_ATTR_REQ = 22,
  207. /* Statistics Commands */
  208. BFI_ENET_H2I_STATS_GET_REQ = 23,
  209. BFI_ENET_H2I_STATS_CLR_REQ = 24,
  210. BFI_ENET_H2I_WOL_MAGIC_REQ = 25,
  211. BFI_ENET_H2I_WOL_FRAME_REQ = 26,
  212. BFI_ENET_H2I_MAX = 27,
  213. };
  214. enum bfi_enet_i2h_msgs {
  215. /* Rx Responses */
  216. BFI_ENET_I2H_RX_CFG_SET_RSP =
  217. BFA_I2HM(BFI_ENET_H2I_RX_CFG_SET_REQ),
  218. BFI_ENET_I2H_RX_CFG_CLR_RSP =
  219. BFA_I2HM(BFI_ENET_H2I_RX_CFG_CLR_REQ),
  220. BFI_ENET_I2H_RIT_CFG_RSP =
  221. BFA_I2HM(BFI_ENET_H2I_RIT_CFG_REQ),
  222. BFI_ENET_I2H_RSS_CFG_RSP =
  223. BFA_I2HM(BFI_ENET_H2I_RSS_CFG_REQ),
  224. BFI_ENET_I2H_RSS_ENABLE_RSP =
  225. BFA_I2HM(BFI_ENET_H2I_RSS_ENABLE_REQ),
  226. BFI_ENET_I2H_RX_PROMISCUOUS_RSP =
  227. BFA_I2HM(BFI_ENET_H2I_RX_PROMISCUOUS_REQ),
  228. BFI_ENET_I2H_RX_DEFAULT_RSP =
  229. BFA_I2HM(BFI_ENET_H2I_RX_DEFAULT_REQ),
  230. BFI_ENET_I2H_MAC_UCAST_SET_RSP =
  231. BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_SET_REQ),
  232. BFI_ENET_I2H_MAC_UCAST_CLR_RSP =
  233. BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_CLR_REQ),
  234. BFI_ENET_I2H_MAC_UCAST_ADD_RSP =
  235. BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_ADD_REQ),
  236. BFI_ENET_I2H_MAC_UCAST_DEL_RSP =
  237. BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_DEL_REQ),
  238. BFI_ENET_I2H_MAC_MCAST_ADD_RSP =
  239. BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_ADD_REQ),
  240. BFI_ENET_I2H_MAC_MCAST_DEL_RSP =
  241. BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_DEL_REQ),
  242. BFI_ENET_I2H_MAC_MCAST_FILTER_RSP =
  243. BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_FILTER_REQ),
  244. BFI_ENET_I2H_RX_VLAN_SET_RSP =
  245. BFA_I2HM(BFI_ENET_H2I_RX_VLAN_SET_REQ),
  246. BFI_ENET_I2H_RX_VLAN_STRIP_ENABLE_RSP =
  247. BFA_I2HM(BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ),
  248. /* Tx Responses */
  249. BFI_ENET_I2H_TX_CFG_SET_RSP =
  250. BFA_I2HM(BFI_ENET_H2I_TX_CFG_SET_REQ),
  251. BFI_ENET_I2H_TX_CFG_CLR_RSP =
  252. BFA_I2HM(BFI_ENET_H2I_TX_CFG_CLR_REQ),
  253. /* Port Responses */
  254. BFI_ENET_I2H_PORT_ADMIN_RSP =
  255. BFA_I2HM(BFI_ENET_H2I_PORT_ADMIN_UP_REQ),
  256. BFI_ENET_I2H_SET_PAUSE_RSP =
  257. BFA_I2HM(BFI_ENET_H2I_SET_PAUSE_REQ),
  258. BFI_ENET_I2H_DIAG_LOOPBACK_RSP =
  259. BFA_I2HM(BFI_ENET_H2I_DIAG_LOOPBACK_REQ),
  260. /* Attributes Response */
  261. BFI_ENET_I2H_GET_ATTR_RSP =
  262. BFA_I2HM(BFI_ENET_H2I_GET_ATTR_REQ),
  263. /* Statistics Responses */
  264. BFI_ENET_I2H_STATS_GET_RSP =
  265. BFA_I2HM(BFI_ENET_H2I_STATS_GET_REQ),
  266. BFI_ENET_I2H_STATS_CLR_RSP =
  267. BFA_I2HM(BFI_ENET_H2I_STATS_CLR_REQ),
  268. BFI_ENET_I2H_WOL_MAGIC_RSP =
  269. BFA_I2HM(BFI_ENET_H2I_WOL_MAGIC_REQ),
  270. BFI_ENET_I2H_WOL_FRAME_RSP =
  271. BFA_I2HM(BFI_ENET_H2I_WOL_FRAME_REQ),
  272. /* AENs */
  273. BFI_ENET_I2H_LINK_DOWN_AEN = BFA_I2HM(BFI_ENET_H2I_MAX),
  274. BFI_ENET_I2H_LINK_UP_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 1),
  275. BFI_ENET_I2H_PORT_ENABLE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 2),
  276. BFI_ENET_I2H_PORT_DISABLE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 3),
  277. BFI_ENET_I2H_BW_UPDATE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 4),
  278. };
  279. /* The following error codes can be returned by the enet commands */
  280. enum bfi_enet_err {
  281. BFI_ENET_CMD_OK = 0,
  282. BFI_ENET_CMD_FAIL = 1,
  283. BFI_ENET_CMD_DUP_ENTRY = 2, /* !< Duplicate entry in CAM */
  284. BFI_ENET_CMD_CAM_FULL = 3, /* !< CAM is full */
  285. BFI_ENET_CMD_NOT_OWNER = 4, /* !< Not permitted, b'cos not owner */
  286. BFI_ENET_CMD_NOT_EXEC = 5, /* !< Was not sent to f/w at all */
  287. BFI_ENET_CMD_WAITING = 6, /* !< Waiting for completion */
  288. BFI_ENET_CMD_PORT_DISABLED = 7, /* !< port in disabled state */
  289. };
  290. /* Generic Request
  291. *
  292. * bfi_enet_req is used by:
  293. * BFI_ENET_H2I_RX_CFG_CLR_REQ
  294. * BFI_ENET_H2I_TX_CFG_CLR_REQ
  295. */
  296. struct bfi_enet_req {
  297. struct bfi_msgq_mhdr mh;
  298. } __packed;
  299. /* Enable/Disable Request
  300. *
  301. * bfi_enet_enable_req is used by:
  302. * BFI_ENET_H2I_RSS_ENABLE_REQ (enet_id must be zero)
  303. * BFI_ENET_H2I_RX_PROMISCUOUS_REQ (enet_id must be zero)
  304. * BFI_ENET_H2I_RX_DEFAULT_REQ (enet_id must be zero)
  305. * BFI_ENET_H2I_RX_MAC_MCAST_FILTER_REQ
  306. * BFI_ENET_H2I_PORT_ADMIN_UP_REQ (enet_id must be zero)
  307. */
  308. struct bfi_enet_enable_req {
  309. struct bfi_msgq_mhdr mh;
  310. u8 enable; /* 1 = enable; 0 = disable */
  311. u8 rsvd[3];
  312. } __packed;
  313. /* Generic Response */
  314. struct bfi_enet_rsp {
  315. struct bfi_msgq_mhdr mh;
  316. u8 error; /*!< if error see cmd_offset */
  317. u8 rsvd;
  318. u16 cmd_offset; /*!< offset to invalid parameter */
  319. } __packed;
  320. /* GLOBAL CONFIGURATION */
  321. /* bfi_enet_attr_req is used by:
  322. * BFI_ENET_H2I_GET_ATTR_REQ
  323. */
  324. struct bfi_enet_attr_req {
  325. struct bfi_msgq_mhdr mh;
  326. } __packed;
  327. /* bfi_enet_attr_rsp is used by:
  328. * BFI_ENET_I2H_GET_ATTR_RSP
  329. */
  330. struct bfi_enet_attr_rsp {
  331. struct bfi_msgq_mhdr mh;
  332. u8 error; /*!< if error see cmd_offset */
  333. u8 rsvd;
  334. u16 cmd_offset; /*!< offset to invalid parameter */
  335. u32 max_cfg;
  336. u32 max_ucmac;
  337. u32 rit_size;
  338. } __packed;
  339. /* Tx Configuration
  340. *
  341. * bfi_enet_tx_cfg is used by:
  342. * BFI_ENET_H2I_TX_CFG_SET_REQ
  343. */
  344. enum bfi_enet_tx_vlan_mode {
  345. BFI_ENET_TX_VLAN_NOP = 0,
  346. BFI_ENET_TX_VLAN_INS = 1,
  347. BFI_ENET_TX_VLAN_WI = 2,
  348. };
  349. struct bfi_enet_tx_cfg {
  350. u8 vlan_mode; /*!< processing mode */
  351. u8 rsvd;
  352. u16 vlan_id;
  353. u8 admit_tagged_frame;
  354. u8 apply_vlan_filter;
  355. u8 add_to_vswitch;
  356. u8 rsvd1[1];
  357. } __packed;
  358. struct bfi_enet_tx_cfg_req {
  359. struct bfi_msgq_mhdr mh;
  360. u8 num_queues; /* # of Tx Queues */
  361. u8 rsvd[3];
  362. struct {
  363. struct bfi_enet_txq q;
  364. struct bfi_enet_ib ib;
  365. } __packed q_cfg[BFI_ENET_TXQ_PRIO_MAX];
  366. struct bfi_enet_ib_cfg ib_cfg;
  367. struct bfi_enet_tx_cfg tx_cfg;
  368. };
  369. struct bfi_enet_tx_cfg_rsp {
  370. struct bfi_msgq_mhdr mh;
  371. u8 error;
  372. u8 hw_id; /* For debugging */
  373. u8 rsvd[2];
  374. struct {
  375. u32 q_dbell; /* PCI base address offset */
  376. u32 i_dbell; /* PCI base address offset */
  377. u8 hw_qid; /* For debugging */
  378. u8 rsvd[3];
  379. } __packed q_handles[BFI_ENET_TXQ_PRIO_MAX];
  380. };
  381. /* Rx Configuration
  382. *
  383. * bfi_enet_rx_cfg is used by:
  384. * BFI_ENET_H2I_RX_CFG_SET_REQ
  385. */
  386. enum bfi_enet_rxq_type {
  387. BFI_ENET_RXQ_SINGLE = 1,
  388. BFI_ENET_RXQ_LARGE_SMALL = 2,
  389. BFI_ENET_RXQ_HDS = 3,
  390. BFI_ENET_RXQ_HDS_OPT_BASED = 4,
  391. };
  392. enum bfi_enet_hds_type {
  393. BFI_ENET_HDS_FORCED = 0x01,
  394. BFI_ENET_HDS_IPV6_UDP = 0x02,
  395. BFI_ENET_HDS_IPV6_TCP = 0x04,
  396. BFI_ENET_HDS_IPV4_TCP = 0x08,
  397. BFI_ENET_HDS_IPV4_UDP = 0x10,
  398. };
  399. struct bfi_enet_rx_cfg {
  400. u8 rxq_type;
  401. u8 rsvd[1];
  402. u16 frame_size;
  403. struct {
  404. u8 max_header_size;
  405. u8 force_offset;
  406. u8 type;
  407. u8 rsvd1;
  408. } __packed hds;
  409. u8 multi_buffer;
  410. u8 strip_vlan;
  411. u8 drop_untagged;
  412. u8 rsvd2;
  413. } __packed;
  414. /*
  415. * Multicast frames are received on the ql of q-set index zero.
  416. * On the completion queue. RxQ ID = even is for large/data buffer queues
  417. * and RxQ ID = odd is for small/header buffer queues.
  418. */
  419. struct bfi_enet_rx_cfg_req {
  420. struct bfi_msgq_mhdr mh;
  421. u8 num_queue_sets; /* # of Rx Queue Sets */
  422. u8 rsvd[3];
  423. struct {
  424. struct bfi_enet_rxq ql; /* large/data/single buffers */
  425. struct bfi_enet_rxq qs; /* small/header buffers */
  426. struct bfi_enet_cq cq;
  427. struct bfi_enet_ib ib;
  428. } __packed q_cfg[BFI_ENET_RX_QSET_MAX];
  429. struct bfi_enet_ib_cfg ib_cfg;
  430. struct bfi_enet_rx_cfg rx_cfg;
  431. } __packed;
  432. struct bfi_enet_rx_cfg_rsp {
  433. struct bfi_msgq_mhdr mh;
  434. u8 error;
  435. u8 hw_id; /* For debugging */
  436. u8 rsvd[2];
  437. struct {
  438. u32 ql_dbell; /* PCI base address offset */
  439. u32 qs_dbell; /* PCI base address offset */
  440. u32 i_dbell; /* PCI base address offset */
  441. u8 hw_lqid; /* For debugging */
  442. u8 hw_sqid; /* For debugging */
  443. u8 hw_cqid; /* For debugging */
  444. u8 rsvd;
  445. } __packed q_handles[BFI_ENET_RX_QSET_MAX];
  446. } __packed;
  447. /* RIT
  448. *
  449. * bfi_enet_rit_req is used by:
  450. * BFI_ENET_H2I_RIT_CFG_REQ
  451. */
  452. struct bfi_enet_rit_req {
  453. struct bfi_msgq_mhdr mh;
  454. u16 size; /* number of table-entries used */
  455. u8 rsvd[2];
  456. u8 table[BFI_ENET_RSS_RIT_MAX];
  457. } __packed;
  458. /* RSS
  459. *
  460. * bfi_enet_rss_cfg_req is used by:
  461. * BFI_ENET_H2I_RSS_CFG_REQ
  462. */
  463. enum bfi_enet_rss_type {
  464. BFI_ENET_RSS_IPV6 = 0x01,
  465. BFI_ENET_RSS_IPV6_TCP = 0x02,
  466. BFI_ENET_RSS_IPV4 = 0x04,
  467. BFI_ENET_RSS_IPV4_TCP = 0x08
  468. };
  469. struct bfi_enet_rss_cfg {
  470. u8 type;
  471. u8 mask;
  472. u8 rsvd[2];
  473. u32 key[BFI_ENET_RSS_KEY_LEN];
  474. } __packed;
  475. struct bfi_enet_rss_cfg_req {
  476. struct bfi_msgq_mhdr mh;
  477. struct bfi_enet_rss_cfg cfg;
  478. } __packed;
  479. /* MAC Unicast
  480. *
  481. * bfi_enet_rx_vlan_req is used by:
  482. * BFI_ENET_H2I_MAC_UCAST_SET_REQ
  483. * BFI_ENET_H2I_MAC_UCAST_CLR_REQ
  484. * BFI_ENET_H2I_MAC_UCAST_ADD_REQ
  485. * BFI_ENET_H2I_MAC_UCAST_DEL_REQ
  486. */
  487. struct bfi_enet_ucast_req {
  488. struct bfi_msgq_mhdr mh;
  489. u8 mac_addr[ETH_ALEN];
  490. u8 rsvd[2];
  491. } __packed;
  492. /* MAC Unicast + VLAN */
  493. struct bfi_enet_mac_n_vlan_req {
  494. struct bfi_msgq_mhdr mh;
  495. u16 vlan_id;
  496. u8 mac_addr[ETH_ALEN];
  497. } __packed;
  498. /* MAC Multicast
  499. *
  500. * bfi_enet_mac_mfilter_add_req is used by:
  501. * BFI_ENET_H2I_MAC_MCAST_ADD_REQ
  502. */
  503. struct bfi_enet_mcast_add_req {
  504. struct bfi_msgq_mhdr mh;
  505. u8 mac_addr[ETH_ALEN];
  506. u8 rsvd[2];
  507. } __packed;
  508. /* bfi_enet_mac_mfilter_add_rsp is used by:
  509. * BFI_ENET_I2H_MAC_MCAST_ADD_RSP
  510. */
  511. struct bfi_enet_mcast_add_rsp {
  512. struct bfi_msgq_mhdr mh;
  513. u8 error;
  514. u8 rsvd;
  515. u16 cmd_offset;
  516. u16 handle;
  517. u8 rsvd1[2];
  518. } __packed;
  519. /* bfi_enet_mac_mfilter_del_req is used by:
  520. * BFI_ENET_H2I_MAC_MCAST_DEL_REQ
  521. */
  522. struct bfi_enet_mcast_del_req {
  523. struct bfi_msgq_mhdr mh;
  524. u16 handle;
  525. u8 rsvd[2];
  526. } __packed;
  527. /* VLAN
  528. *
  529. * bfi_enet_rx_vlan_req is used by:
  530. * BFI_ENET_H2I_RX_VLAN_SET_REQ
  531. */
  532. struct bfi_enet_rx_vlan_req {
  533. struct bfi_msgq_mhdr mh;
  534. u8 block_idx;
  535. u8 rsvd[3];
  536. u32 bit_mask[BFI_ENET_VLAN_WORDS_MAX];
  537. } __packed;
  538. /* PAUSE
  539. *
  540. * bfi_enet_set_pause_req is used by:
  541. * BFI_ENET_H2I_SET_PAUSE_REQ
  542. */
  543. struct bfi_enet_set_pause_req {
  544. struct bfi_msgq_mhdr mh;
  545. u8 rsvd[2];
  546. u8 tx_pause; /* 1 = enable; 0 = disable */
  547. u8 rx_pause; /* 1 = enable; 0 = disable */
  548. } __packed;
  549. /* DIAGNOSTICS
  550. *
  551. * bfi_enet_diag_lb_req is used by:
  552. * BFI_ENET_H2I_DIAG_LOOPBACK
  553. */
  554. struct bfi_enet_diag_lb_req {
  555. struct bfi_msgq_mhdr mh;
  556. u8 rsvd[2];
  557. u8 mode; /* cable or Serdes */
  558. u8 enable; /* 1 = enable; 0 = disable */
  559. } __packed;
  560. /* enum for Loopback opmodes */
  561. enum {
  562. BFI_ENET_DIAG_LB_OPMODE_EXT = 0,
  563. BFI_ENET_DIAG_LB_OPMODE_CBL = 1,
  564. };
  565. /* STATISTICS
  566. *
  567. * bfi_enet_stats_req is used by:
  568. * BFI_ENET_H2I_STATS_GET_REQ
  569. * BFI_ENET_I2H_STATS_CLR_REQ
  570. */
  571. struct bfi_enet_stats_req {
  572. struct bfi_msgq_mhdr mh;
  573. u16 stats_mask;
  574. u8 rsvd[2];
  575. u32 rx_enet_mask;
  576. u32 tx_enet_mask;
  577. union bfi_addr_u host_buffer;
  578. } __packed;
  579. /* defines for "stats_mask" above. */
  580. #define BFI_ENET_STATS_MAC BIT(0) /* !< MAC Statistics */
  581. #define BFI_ENET_STATS_BPC BIT(1) /* !< Pause Stats from BPC */
  582. #define BFI_ENET_STATS_RAD BIT(2) /* !< Rx Admission Statistics */
  583. #define BFI_ENET_STATS_RX_FC BIT(3) /* !< Rx FC Stats from RxA */
  584. #define BFI_ENET_STATS_TX_FC BIT(4) /* !< Tx FC Stats from TxA */
  585. #define BFI_ENET_STATS_ALL 0x1f
  586. /* TxF Frame Statistics */
  587. struct bfi_enet_stats_txf {
  588. u64 ucast_octets;
  589. u64 ucast;
  590. u64 ucast_vlan;
  591. u64 mcast_octets;
  592. u64 mcast;
  593. u64 mcast_vlan;
  594. u64 bcast_octets;
  595. u64 bcast;
  596. u64 bcast_vlan;
  597. u64 errors;
  598. u64 filter_vlan; /* frames filtered due to VLAN */
  599. u64 filter_mac_sa; /* frames filtered due to SA check */
  600. } __packed;
  601. /* RxF Frame Statistics */
  602. struct bfi_enet_stats_rxf {
  603. u64 ucast_octets;
  604. u64 ucast;
  605. u64 ucast_vlan;
  606. u64 mcast_octets;
  607. u64 mcast;
  608. u64 mcast_vlan;
  609. u64 bcast_octets;
  610. u64 bcast;
  611. u64 bcast_vlan;
  612. u64 frame_drops;
  613. } __packed;
  614. /* FC Tx Frame Statistics */
  615. struct bfi_enet_stats_fc_tx {
  616. u64 txf_ucast_octets;
  617. u64 txf_ucast;
  618. u64 txf_ucast_vlan;
  619. u64 txf_mcast_octets;
  620. u64 txf_mcast;
  621. u64 txf_mcast_vlan;
  622. u64 txf_bcast_octets;
  623. u64 txf_bcast;
  624. u64 txf_bcast_vlan;
  625. u64 txf_parity_errors;
  626. u64 txf_timeout;
  627. u64 txf_fid_parity_errors;
  628. } __packed;
  629. /* FC Rx Frame Statistics */
  630. struct bfi_enet_stats_fc_rx {
  631. u64 rxf_ucast_octets;
  632. u64 rxf_ucast;
  633. u64 rxf_ucast_vlan;
  634. u64 rxf_mcast_octets;
  635. u64 rxf_mcast;
  636. u64 rxf_mcast_vlan;
  637. u64 rxf_bcast_octets;
  638. u64 rxf_bcast;
  639. u64 rxf_bcast_vlan;
  640. } __packed;
  641. /* RAD Frame Statistics */
  642. struct bfi_enet_stats_rad {
  643. u64 rx_frames;
  644. u64 rx_octets;
  645. u64 rx_vlan_frames;
  646. u64 rx_ucast;
  647. u64 rx_ucast_octets;
  648. u64 rx_ucast_vlan;
  649. u64 rx_mcast;
  650. u64 rx_mcast_octets;
  651. u64 rx_mcast_vlan;
  652. u64 rx_bcast;
  653. u64 rx_bcast_octets;
  654. u64 rx_bcast_vlan;
  655. u64 rx_drops;
  656. } __packed;
  657. /* BPC Tx Registers */
  658. struct bfi_enet_stats_bpc {
  659. /* transmit stats */
  660. u64 tx_pause[8];
  661. u64 tx_zero_pause[8]; /*!< Pause cancellation */
  662. /*!<Pause initiation rather than retention */
  663. u64 tx_first_pause[8];
  664. /* receive stats */
  665. u64 rx_pause[8];
  666. u64 rx_zero_pause[8]; /*!< Pause cancellation */
  667. /*!<Pause initiation rather than retention */
  668. u64 rx_first_pause[8];
  669. } __packed;
  670. /* MAC Rx Statistics */
  671. struct bfi_enet_stats_mac {
  672. u64 stats_clr_cnt; /* times this stats cleared */
  673. u64 frame_64; /* both rx and tx counter */
  674. u64 frame_65_127; /* both rx and tx counter */
  675. u64 frame_128_255; /* both rx and tx counter */
  676. u64 frame_256_511; /* both rx and tx counter */
  677. u64 frame_512_1023; /* both rx and tx counter */
  678. u64 frame_1024_1518; /* both rx and tx counter */
  679. u64 frame_1519_1522; /* both rx and tx counter */
  680. /* receive stats */
  681. u64 rx_bytes;
  682. u64 rx_packets;
  683. u64 rx_fcs_error;
  684. u64 rx_multicast;
  685. u64 rx_broadcast;
  686. u64 rx_control_frames;
  687. u64 rx_pause;
  688. u64 rx_unknown_opcode;
  689. u64 rx_alignment_error;
  690. u64 rx_frame_length_error;
  691. u64 rx_code_error;
  692. u64 rx_carrier_sense_error;
  693. u64 rx_undersize;
  694. u64 rx_oversize;
  695. u64 rx_fragments;
  696. u64 rx_jabber;
  697. u64 rx_drop;
  698. /* transmit stats */
  699. u64 tx_bytes;
  700. u64 tx_packets;
  701. u64 tx_multicast;
  702. u64 tx_broadcast;
  703. u64 tx_pause;
  704. u64 tx_deferral;
  705. u64 tx_excessive_deferral;
  706. u64 tx_single_collision;
  707. u64 tx_muliple_collision;
  708. u64 tx_late_collision;
  709. u64 tx_excessive_collision;
  710. u64 tx_total_collision;
  711. u64 tx_pause_honored;
  712. u64 tx_drop;
  713. u64 tx_jabber;
  714. u64 tx_fcs_error;
  715. u64 tx_control_frame;
  716. u64 tx_oversize;
  717. u64 tx_undersize;
  718. u64 tx_fragments;
  719. } __packed;
  720. /* Complete statistics, DMAed from fw to host followed by
  721. * BFI_ENET_I2H_STATS_GET_RSP
  722. */
  723. struct bfi_enet_stats {
  724. struct bfi_enet_stats_mac mac_stats;
  725. struct bfi_enet_stats_bpc bpc_stats;
  726. struct bfi_enet_stats_rad rad_stats;
  727. struct bfi_enet_stats_rad rlb_stats;
  728. struct bfi_enet_stats_fc_rx fc_rx_stats;
  729. struct bfi_enet_stats_fc_tx fc_tx_stats;
  730. struct bfi_enet_stats_rxf rxf_stats[BFI_ENET_CFG_MAX];
  731. struct bfi_enet_stats_txf txf_stats[BFI_ENET_CFG_MAX];
  732. } __packed;
  733. #endif /* __BFI_ENET_H__ */