bfi_enet.h 20 KB

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