i40e_common.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright(c) 2013 - 2018 Intel Corporation. */
  3. #include "i40e_type.h"
  4. #include "i40e_adminq.h"
  5. #include "i40e_prototype.h"
  6. #include <linux/avf/virtchnl.h>
  7. /**
  8. * iavf_set_mac_type - Sets MAC type
  9. * @hw: pointer to the HW structure
  10. *
  11. * This function sets the mac type of the adapter based on the
  12. * vendor ID and device ID stored in the hw structure.
  13. **/
  14. iavf_status iavf_set_mac_type(struct iavf_hw *hw)
  15. {
  16. iavf_status status = 0;
  17. if (hw->vendor_id == PCI_VENDOR_ID_INTEL) {
  18. switch (hw->device_id) {
  19. case IAVF_DEV_ID_X722_VF:
  20. hw->mac.type = IAVF_MAC_X722_VF;
  21. break;
  22. case IAVF_DEV_ID_VF:
  23. case IAVF_DEV_ID_VF_HV:
  24. case IAVF_DEV_ID_ADAPTIVE_VF:
  25. hw->mac.type = IAVF_MAC_VF;
  26. break;
  27. default:
  28. hw->mac.type = IAVF_MAC_GENERIC;
  29. break;
  30. }
  31. } else {
  32. status = I40E_ERR_DEVICE_NOT_SUPPORTED;
  33. }
  34. hw_dbg(hw, "found mac: %d, returns: %d\n", hw->mac.type, status);
  35. return status;
  36. }
  37. /**
  38. * iavf_aq_str - convert AQ err code to a string
  39. * @hw: pointer to the HW structure
  40. * @aq_err: the AQ error code to convert
  41. **/
  42. const char *iavf_aq_str(struct iavf_hw *hw, enum i40e_admin_queue_err aq_err)
  43. {
  44. switch (aq_err) {
  45. case I40E_AQ_RC_OK:
  46. return "OK";
  47. case I40E_AQ_RC_EPERM:
  48. return "I40E_AQ_RC_EPERM";
  49. case I40E_AQ_RC_ENOENT:
  50. return "I40E_AQ_RC_ENOENT";
  51. case I40E_AQ_RC_ESRCH:
  52. return "I40E_AQ_RC_ESRCH";
  53. case I40E_AQ_RC_EINTR:
  54. return "I40E_AQ_RC_EINTR";
  55. case I40E_AQ_RC_EIO:
  56. return "I40E_AQ_RC_EIO";
  57. case I40E_AQ_RC_ENXIO:
  58. return "I40E_AQ_RC_ENXIO";
  59. case I40E_AQ_RC_E2BIG:
  60. return "I40E_AQ_RC_E2BIG";
  61. case I40E_AQ_RC_EAGAIN:
  62. return "I40E_AQ_RC_EAGAIN";
  63. case I40E_AQ_RC_ENOMEM:
  64. return "I40E_AQ_RC_ENOMEM";
  65. case I40E_AQ_RC_EACCES:
  66. return "I40E_AQ_RC_EACCES";
  67. case I40E_AQ_RC_EFAULT:
  68. return "I40E_AQ_RC_EFAULT";
  69. case I40E_AQ_RC_EBUSY:
  70. return "I40E_AQ_RC_EBUSY";
  71. case I40E_AQ_RC_EEXIST:
  72. return "I40E_AQ_RC_EEXIST";
  73. case I40E_AQ_RC_EINVAL:
  74. return "I40E_AQ_RC_EINVAL";
  75. case I40E_AQ_RC_ENOTTY:
  76. return "I40E_AQ_RC_ENOTTY";
  77. case I40E_AQ_RC_ENOSPC:
  78. return "I40E_AQ_RC_ENOSPC";
  79. case I40E_AQ_RC_ENOSYS:
  80. return "I40E_AQ_RC_ENOSYS";
  81. case I40E_AQ_RC_ERANGE:
  82. return "I40E_AQ_RC_ERANGE";
  83. case I40E_AQ_RC_EFLUSHED:
  84. return "I40E_AQ_RC_EFLUSHED";
  85. case I40E_AQ_RC_BAD_ADDR:
  86. return "I40E_AQ_RC_BAD_ADDR";
  87. case I40E_AQ_RC_EMODE:
  88. return "I40E_AQ_RC_EMODE";
  89. case I40E_AQ_RC_EFBIG:
  90. return "I40E_AQ_RC_EFBIG";
  91. }
  92. snprintf(hw->err_str, sizeof(hw->err_str), "%d", aq_err);
  93. return hw->err_str;
  94. }
  95. /**
  96. * iavf_stat_str - convert status err code to a string
  97. * @hw: pointer to the HW structure
  98. * @stat_err: the status error code to convert
  99. **/
  100. const char *iavf_stat_str(struct iavf_hw *hw, iavf_status stat_err)
  101. {
  102. switch (stat_err) {
  103. case 0:
  104. return "OK";
  105. case I40E_ERR_NVM:
  106. return "I40E_ERR_NVM";
  107. case I40E_ERR_NVM_CHECKSUM:
  108. return "I40E_ERR_NVM_CHECKSUM";
  109. case I40E_ERR_PHY:
  110. return "I40E_ERR_PHY";
  111. case I40E_ERR_CONFIG:
  112. return "I40E_ERR_CONFIG";
  113. case I40E_ERR_PARAM:
  114. return "I40E_ERR_PARAM";
  115. case I40E_ERR_MAC_TYPE:
  116. return "I40E_ERR_MAC_TYPE";
  117. case I40E_ERR_UNKNOWN_PHY:
  118. return "I40E_ERR_UNKNOWN_PHY";
  119. case I40E_ERR_LINK_SETUP:
  120. return "I40E_ERR_LINK_SETUP";
  121. case I40E_ERR_ADAPTER_STOPPED:
  122. return "I40E_ERR_ADAPTER_STOPPED";
  123. case I40E_ERR_INVALID_MAC_ADDR:
  124. return "I40E_ERR_INVALID_MAC_ADDR";
  125. case I40E_ERR_DEVICE_NOT_SUPPORTED:
  126. return "I40E_ERR_DEVICE_NOT_SUPPORTED";
  127. case I40E_ERR_MASTER_REQUESTS_PENDING:
  128. return "I40E_ERR_MASTER_REQUESTS_PENDING";
  129. case I40E_ERR_INVALID_LINK_SETTINGS:
  130. return "I40E_ERR_INVALID_LINK_SETTINGS";
  131. case I40E_ERR_AUTONEG_NOT_COMPLETE:
  132. return "I40E_ERR_AUTONEG_NOT_COMPLETE";
  133. case I40E_ERR_RESET_FAILED:
  134. return "I40E_ERR_RESET_FAILED";
  135. case I40E_ERR_SWFW_SYNC:
  136. return "I40E_ERR_SWFW_SYNC";
  137. case I40E_ERR_NO_AVAILABLE_VSI:
  138. return "I40E_ERR_NO_AVAILABLE_VSI";
  139. case I40E_ERR_NO_MEMORY:
  140. return "I40E_ERR_NO_MEMORY";
  141. case I40E_ERR_BAD_PTR:
  142. return "I40E_ERR_BAD_PTR";
  143. case I40E_ERR_RING_FULL:
  144. return "I40E_ERR_RING_FULL";
  145. case I40E_ERR_INVALID_PD_ID:
  146. return "I40E_ERR_INVALID_PD_ID";
  147. case I40E_ERR_INVALID_QP_ID:
  148. return "I40E_ERR_INVALID_QP_ID";
  149. case I40E_ERR_INVALID_CQ_ID:
  150. return "I40E_ERR_INVALID_CQ_ID";
  151. case I40E_ERR_INVALID_CEQ_ID:
  152. return "I40E_ERR_INVALID_CEQ_ID";
  153. case I40E_ERR_INVALID_AEQ_ID:
  154. return "I40E_ERR_INVALID_AEQ_ID";
  155. case I40E_ERR_INVALID_SIZE:
  156. return "I40E_ERR_INVALID_SIZE";
  157. case I40E_ERR_INVALID_ARP_INDEX:
  158. return "I40E_ERR_INVALID_ARP_INDEX";
  159. case I40E_ERR_INVALID_FPM_FUNC_ID:
  160. return "I40E_ERR_INVALID_FPM_FUNC_ID";
  161. case I40E_ERR_QP_INVALID_MSG_SIZE:
  162. return "I40E_ERR_QP_INVALID_MSG_SIZE";
  163. case I40E_ERR_QP_TOOMANY_WRS_POSTED:
  164. return "I40E_ERR_QP_TOOMANY_WRS_POSTED";
  165. case I40E_ERR_INVALID_FRAG_COUNT:
  166. return "I40E_ERR_INVALID_FRAG_COUNT";
  167. case I40E_ERR_QUEUE_EMPTY:
  168. return "I40E_ERR_QUEUE_EMPTY";
  169. case I40E_ERR_INVALID_ALIGNMENT:
  170. return "I40E_ERR_INVALID_ALIGNMENT";
  171. case I40E_ERR_FLUSHED_QUEUE:
  172. return "I40E_ERR_FLUSHED_QUEUE";
  173. case I40E_ERR_INVALID_PUSH_PAGE_INDEX:
  174. return "I40E_ERR_INVALID_PUSH_PAGE_INDEX";
  175. case I40E_ERR_INVALID_IMM_DATA_SIZE:
  176. return "I40E_ERR_INVALID_IMM_DATA_SIZE";
  177. case I40E_ERR_TIMEOUT:
  178. return "I40E_ERR_TIMEOUT";
  179. case I40E_ERR_OPCODE_MISMATCH:
  180. return "I40E_ERR_OPCODE_MISMATCH";
  181. case I40E_ERR_CQP_COMPL_ERROR:
  182. return "I40E_ERR_CQP_COMPL_ERROR";
  183. case I40E_ERR_INVALID_VF_ID:
  184. return "I40E_ERR_INVALID_VF_ID";
  185. case I40E_ERR_INVALID_HMCFN_ID:
  186. return "I40E_ERR_INVALID_HMCFN_ID";
  187. case I40E_ERR_BACKING_PAGE_ERROR:
  188. return "I40E_ERR_BACKING_PAGE_ERROR";
  189. case I40E_ERR_NO_PBLCHUNKS_AVAILABLE:
  190. return "I40E_ERR_NO_PBLCHUNKS_AVAILABLE";
  191. case I40E_ERR_INVALID_PBLE_INDEX:
  192. return "I40E_ERR_INVALID_PBLE_INDEX";
  193. case I40E_ERR_INVALID_SD_INDEX:
  194. return "I40E_ERR_INVALID_SD_INDEX";
  195. case I40E_ERR_INVALID_PAGE_DESC_INDEX:
  196. return "I40E_ERR_INVALID_PAGE_DESC_INDEX";
  197. case I40E_ERR_INVALID_SD_TYPE:
  198. return "I40E_ERR_INVALID_SD_TYPE";
  199. case I40E_ERR_MEMCPY_FAILED:
  200. return "I40E_ERR_MEMCPY_FAILED";
  201. case I40E_ERR_INVALID_HMC_OBJ_INDEX:
  202. return "I40E_ERR_INVALID_HMC_OBJ_INDEX";
  203. case I40E_ERR_INVALID_HMC_OBJ_COUNT:
  204. return "I40E_ERR_INVALID_HMC_OBJ_COUNT";
  205. case I40E_ERR_INVALID_SRQ_ARM_LIMIT:
  206. return "I40E_ERR_INVALID_SRQ_ARM_LIMIT";
  207. case I40E_ERR_SRQ_ENABLED:
  208. return "I40E_ERR_SRQ_ENABLED";
  209. case I40E_ERR_ADMIN_QUEUE_ERROR:
  210. return "I40E_ERR_ADMIN_QUEUE_ERROR";
  211. case I40E_ERR_ADMIN_QUEUE_TIMEOUT:
  212. return "I40E_ERR_ADMIN_QUEUE_TIMEOUT";
  213. case I40E_ERR_BUF_TOO_SHORT:
  214. return "I40E_ERR_BUF_TOO_SHORT";
  215. case I40E_ERR_ADMIN_QUEUE_FULL:
  216. return "I40E_ERR_ADMIN_QUEUE_FULL";
  217. case I40E_ERR_ADMIN_QUEUE_NO_WORK:
  218. return "I40E_ERR_ADMIN_QUEUE_NO_WORK";
  219. case I40E_ERR_BAD_IWARP_CQE:
  220. return "I40E_ERR_BAD_IWARP_CQE";
  221. case I40E_ERR_NVM_BLANK_MODE:
  222. return "I40E_ERR_NVM_BLANK_MODE";
  223. case I40E_ERR_NOT_IMPLEMENTED:
  224. return "I40E_ERR_NOT_IMPLEMENTED";
  225. case I40E_ERR_PE_DOORBELL_NOT_ENABLED:
  226. return "I40E_ERR_PE_DOORBELL_NOT_ENABLED";
  227. case I40E_ERR_DIAG_TEST_FAILED:
  228. return "I40E_ERR_DIAG_TEST_FAILED";
  229. case I40E_ERR_NOT_READY:
  230. return "I40E_ERR_NOT_READY";
  231. case I40E_NOT_SUPPORTED:
  232. return "I40E_NOT_SUPPORTED";
  233. case I40E_ERR_FIRMWARE_API_VERSION:
  234. return "I40E_ERR_FIRMWARE_API_VERSION";
  235. case I40E_ERR_ADMIN_QUEUE_CRITICAL_ERROR:
  236. return "I40E_ERR_ADMIN_QUEUE_CRITICAL_ERROR";
  237. }
  238. snprintf(hw->err_str, sizeof(hw->err_str), "%d", stat_err);
  239. return hw->err_str;
  240. }
  241. /**
  242. * iavf_debug_aq
  243. * @hw: debug mask related to admin queue
  244. * @mask: debug mask
  245. * @desc: pointer to admin queue descriptor
  246. * @buffer: pointer to command buffer
  247. * @buf_len: max length of buffer
  248. *
  249. * Dumps debug log about adminq command with descriptor contents.
  250. **/
  251. void iavf_debug_aq(struct iavf_hw *hw, enum iavf_debug_mask mask, void *desc,
  252. void *buffer, u16 buf_len)
  253. {
  254. struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
  255. u8 *buf = (u8 *)buffer;
  256. if ((!(mask & hw->debug_mask)) || !desc)
  257. return;
  258. iavf_debug(hw, mask,
  259. "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
  260. le16_to_cpu(aq_desc->opcode),
  261. le16_to_cpu(aq_desc->flags),
  262. le16_to_cpu(aq_desc->datalen),
  263. le16_to_cpu(aq_desc->retval));
  264. iavf_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
  265. le32_to_cpu(aq_desc->cookie_high),
  266. le32_to_cpu(aq_desc->cookie_low));
  267. iavf_debug(hw, mask, "\tparam (0,1) 0x%08X 0x%08X\n",
  268. le32_to_cpu(aq_desc->params.internal.param0),
  269. le32_to_cpu(aq_desc->params.internal.param1));
  270. iavf_debug(hw, mask, "\taddr (h,l) 0x%08X 0x%08X\n",
  271. le32_to_cpu(aq_desc->params.external.addr_high),
  272. le32_to_cpu(aq_desc->params.external.addr_low));
  273. if (buffer && aq_desc->datalen) {
  274. u16 len = le16_to_cpu(aq_desc->datalen);
  275. iavf_debug(hw, mask, "AQ CMD Buffer:\n");
  276. if (buf_len < len)
  277. len = buf_len;
  278. /* write the full 16-byte chunks */
  279. if (hw->debug_mask & mask) {
  280. char prefix[27];
  281. snprintf(prefix, sizeof(prefix),
  282. "iavf %02x:%02x.%x: \t0x",
  283. hw->bus.bus_id,
  284. hw->bus.device,
  285. hw->bus.func);
  286. print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_OFFSET,
  287. 16, 1, buf, len, false);
  288. }
  289. }
  290. }
  291. /**
  292. * iavf_check_asq_alive
  293. * @hw: pointer to the hw struct
  294. *
  295. * Returns true if Queue is enabled else false.
  296. **/
  297. bool iavf_check_asq_alive(struct iavf_hw *hw)
  298. {
  299. if (hw->aq.asq.len)
  300. return !!(rd32(hw, hw->aq.asq.len) &
  301. IAVF_VF_ATQLEN1_ATQENABLE_MASK);
  302. else
  303. return false;
  304. }
  305. /**
  306. * iavf_aq_queue_shutdown
  307. * @hw: pointer to the hw struct
  308. * @unloading: is the driver unloading itself
  309. *
  310. * Tell the Firmware that we're shutting down the AdminQ and whether
  311. * or not the driver is unloading as well.
  312. **/
  313. iavf_status iavf_aq_queue_shutdown(struct iavf_hw *hw, bool unloading)
  314. {
  315. struct i40e_aq_desc desc;
  316. struct i40e_aqc_queue_shutdown *cmd =
  317. (struct i40e_aqc_queue_shutdown *)&desc.params.raw;
  318. iavf_status status;
  319. iavf_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_queue_shutdown);
  320. if (unloading)
  321. cmd->driver_unloading = cpu_to_le32(I40E_AQ_DRIVER_UNLOADING);
  322. status = iavf_asq_send_command(hw, &desc, NULL, 0, NULL);
  323. return status;
  324. }
  325. /**
  326. * iavf_aq_get_set_rss_lut
  327. * @hw: pointer to the hardware structure
  328. * @vsi_id: vsi fw index
  329. * @pf_lut: for PF table set true, for VSI table set false
  330. * @lut: pointer to the lut buffer provided by the caller
  331. * @lut_size: size of the lut buffer
  332. * @set: set true to set the table, false to get the table
  333. *
  334. * Internal function to get or set RSS look up table
  335. **/
  336. static iavf_status iavf_aq_get_set_rss_lut(struct iavf_hw *hw,
  337. u16 vsi_id, bool pf_lut,
  338. u8 *lut, u16 lut_size,
  339. bool set)
  340. {
  341. iavf_status status;
  342. struct i40e_aq_desc desc;
  343. struct i40e_aqc_get_set_rss_lut *cmd_resp =
  344. (struct i40e_aqc_get_set_rss_lut *)&desc.params.raw;
  345. if (set)
  346. iavf_fill_default_direct_cmd_desc(&desc,
  347. i40e_aqc_opc_set_rss_lut);
  348. else
  349. iavf_fill_default_direct_cmd_desc(&desc,
  350. i40e_aqc_opc_get_rss_lut);
  351. /* Indirect command */
  352. desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF);
  353. desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_RD);
  354. cmd_resp->vsi_id =
  355. cpu_to_le16((u16)((vsi_id <<
  356. I40E_AQC_SET_RSS_LUT_VSI_ID_SHIFT) &
  357. I40E_AQC_SET_RSS_LUT_VSI_ID_MASK));
  358. cmd_resp->vsi_id |= cpu_to_le16((u16)I40E_AQC_SET_RSS_LUT_VSI_VALID);
  359. if (pf_lut)
  360. cmd_resp->flags |= cpu_to_le16((u16)
  361. ((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_PF <<
  362. I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
  363. I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
  364. else
  365. cmd_resp->flags |= cpu_to_le16((u16)
  366. ((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_VSI <<
  367. I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
  368. I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
  369. status = iavf_asq_send_command(hw, &desc, lut, lut_size, NULL);
  370. return status;
  371. }
  372. /**
  373. * iavf_aq_get_rss_lut
  374. * @hw: pointer to the hardware structure
  375. * @vsi_id: vsi fw index
  376. * @pf_lut: for PF table set true, for VSI table set false
  377. * @lut: pointer to the lut buffer provided by the caller
  378. * @lut_size: size of the lut buffer
  379. *
  380. * get the RSS lookup table, PF or VSI type
  381. **/
  382. iavf_status iavf_aq_get_rss_lut(struct iavf_hw *hw, u16 vsi_id,
  383. bool pf_lut, u8 *lut, u16 lut_size)
  384. {
  385. return iavf_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size,
  386. false);
  387. }
  388. /**
  389. * iavf_aq_set_rss_lut
  390. * @hw: pointer to the hardware structure
  391. * @vsi_id: vsi fw index
  392. * @pf_lut: for PF table set true, for VSI table set false
  393. * @lut: pointer to the lut buffer provided by the caller
  394. * @lut_size: size of the lut buffer
  395. *
  396. * set the RSS lookup table, PF or VSI type
  397. **/
  398. iavf_status iavf_aq_set_rss_lut(struct iavf_hw *hw, u16 vsi_id,
  399. bool pf_lut, u8 *lut, u16 lut_size)
  400. {
  401. return iavf_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size, true);
  402. }
  403. /**
  404. * iavf_aq_get_set_rss_key
  405. * @hw: pointer to the hw struct
  406. * @vsi_id: vsi fw index
  407. * @key: pointer to key info struct
  408. * @set: set true to set the key, false to get the key
  409. *
  410. * get the RSS key per VSI
  411. **/
  412. static
  413. iavf_status iavf_aq_get_set_rss_key(struct iavf_hw *hw, u16 vsi_id,
  414. struct i40e_aqc_get_set_rss_key_data *key,
  415. bool set)
  416. {
  417. iavf_status status;
  418. struct i40e_aq_desc desc;
  419. struct i40e_aqc_get_set_rss_key *cmd_resp =
  420. (struct i40e_aqc_get_set_rss_key *)&desc.params.raw;
  421. u16 key_size = sizeof(struct i40e_aqc_get_set_rss_key_data);
  422. if (set)
  423. iavf_fill_default_direct_cmd_desc(&desc,
  424. i40e_aqc_opc_set_rss_key);
  425. else
  426. iavf_fill_default_direct_cmd_desc(&desc,
  427. i40e_aqc_opc_get_rss_key);
  428. /* Indirect command */
  429. desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF);
  430. desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_RD);
  431. cmd_resp->vsi_id =
  432. cpu_to_le16((u16)((vsi_id <<
  433. I40E_AQC_SET_RSS_KEY_VSI_ID_SHIFT) &
  434. I40E_AQC_SET_RSS_KEY_VSI_ID_MASK));
  435. cmd_resp->vsi_id |= cpu_to_le16((u16)I40E_AQC_SET_RSS_KEY_VSI_VALID);
  436. status = iavf_asq_send_command(hw, &desc, key, key_size, NULL);
  437. return status;
  438. }
  439. /**
  440. * iavf_aq_get_rss_key
  441. * @hw: pointer to the hw struct
  442. * @vsi_id: vsi fw index
  443. * @key: pointer to key info struct
  444. *
  445. **/
  446. iavf_status iavf_aq_get_rss_key(struct iavf_hw *hw, u16 vsi_id,
  447. struct i40e_aqc_get_set_rss_key_data *key)
  448. {
  449. return iavf_aq_get_set_rss_key(hw, vsi_id, key, false);
  450. }
  451. /**
  452. * iavf_aq_set_rss_key
  453. * @hw: pointer to the hw struct
  454. * @vsi_id: vsi fw index
  455. * @key: pointer to key info struct
  456. *
  457. * set the RSS key per VSI
  458. **/
  459. iavf_status iavf_aq_set_rss_key(struct iavf_hw *hw, u16 vsi_id,
  460. struct i40e_aqc_get_set_rss_key_data *key)
  461. {
  462. return iavf_aq_get_set_rss_key(hw, vsi_id, key, true);
  463. }
  464. /* The iavf_ptype_lookup table is used to convert from the 8-bit ptype in the
  465. * hardware to a bit-field that can be used by SW to more easily determine the
  466. * packet type.
  467. *
  468. * Macros are used to shorten the table lines and make this table human
  469. * readable.
  470. *
  471. * We store the PTYPE in the top byte of the bit field - this is just so that
  472. * we can check that the table doesn't have a row missing, as the index into
  473. * the table should be the PTYPE.
  474. *
  475. * Typical work flow:
  476. *
  477. * IF NOT iavf_ptype_lookup[ptype].known
  478. * THEN
  479. * Packet is unknown
  480. * ELSE IF iavf_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP
  481. * Use the rest of the fields to look at the tunnels, inner protocols, etc
  482. * ELSE
  483. * Use the enum iavf_rx_l2_ptype to decode the packet type
  484. * ENDIF
  485. */
  486. /* macro to make the table lines short */
  487. #define IAVF_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
  488. { PTYPE, \
  489. 1, \
  490. IAVF_RX_PTYPE_OUTER_##OUTER_IP, \
  491. IAVF_RX_PTYPE_OUTER_##OUTER_IP_VER, \
  492. IAVF_RX_PTYPE_##OUTER_FRAG, \
  493. IAVF_RX_PTYPE_TUNNEL_##T, \
  494. IAVF_RX_PTYPE_TUNNEL_END_##TE, \
  495. IAVF_RX_PTYPE_##TEF, \
  496. IAVF_RX_PTYPE_INNER_PROT_##I, \
  497. IAVF_RX_PTYPE_PAYLOAD_LAYER_##PL }
  498. #define IAVF_PTT_UNUSED_ENTRY(PTYPE) \
  499. { PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
  500. /* shorter macros makes the table fit but are terse */
  501. #define IAVF_RX_PTYPE_NOF IAVF_RX_PTYPE_NOT_FRAG
  502. #define IAVF_RX_PTYPE_FRG IAVF_RX_PTYPE_FRAG
  503. #define IAVF_RX_PTYPE_INNER_PROT_TS IAVF_RX_PTYPE_INNER_PROT_TIMESYNC
  504. /* Lookup table mapping the HW PTYPE to the bit field for decoding */
  505. struct iavf_rx_ptype_decoded iavf_ptype_lookup[] = {
  506. /* L2 Packet types */
  507. IAVF_PTT_UNUSED_ENTRY(0),
  508. IAVF_PTT(1, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
  509. IAVF_PTT(2, L2, NONE, NOF, NONE, NONE, NOF, TS, PAY2),
  510. IAVF_PTT(3, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
  511. IAVF_PTT_UNUSED_ENTRY(4),
  512. IAVF_PTT_UNUSED_ENTRY(5),
  513. IAVF_PTT(6, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
  514. IAVF_PTT(7, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
  515. IAVF_PTT_UNUSED_ENTRY(8),
  516. IAVF_PTT_UNUSED_ENTRY(9),
  517. IAVF_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
  518. IAVF_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
  519. IAVF_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
  520. IAVF_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
  521. IAVF_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
  522. IAVF_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
  523. IAVF_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
  524. IAVF_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
  525. IAVF_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
  526. IAVF_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
  527. IAVF_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
  528. IAVF_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
  529. /* Non Tunneled IPv4 */
  530. IAVF_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
  531. IAVF_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
  532. IAVF_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP, PAY4),
  533. IAVF_PTT_UNUSED_ENTRY(25),
  534. IAVF_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP, PAY4),
  535. IAVF_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
  536. IAVF_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
  537. /* IPv4 --> IPv4 */
  538. IAVF_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
  539. IAVF_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
  540. IAVF_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
  541. IAVF_PTT_UNUSED_ENTRY(32),
  542. IAVF_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
  543. IAVF_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
  544. IAVF_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
  545. /* IPv4 --> IPv6 */
  546. IAVF_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
  547. IAVF_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
  548. IAVF_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
  549. IAVF_PTT_UNUSED_ENTRY(39),
  550. IAVF_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
  551. IAVF_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
  552. IAVF_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
  553. /* IPv4 --> GRE/NAT */
  554. IAVF_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
  555. /* IPv4 --> GRE/NAT --> IPv4 */
  556. IAVF_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
  557. IAVF_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
  558. IAVF_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
  559. IAVF_PTT_UNUSED_ENTRY(47),
  560. IAVF_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
  561. IAVF_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
  562. IAVF_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
  563. /* IPv4 --> GRE/NAT --> IPv6 */
  564. IAVF_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
  565. IAVF_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
  566. IAVF_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
  567. IAVF_PTT_UNUSED_ENTRY(54),
  568. IAVF_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
  569. IAVF_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
  570. IAVF_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
  571. /* IPv4 --> GRE/NAT --> MAC */
  572. IAVF_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
  573. /* IPv4 --> GRE/NAT --> MAC --> IPv4 */
  574. IAVF_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
  575. IAVF_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
  576. IAVF_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
  577. IAVF_PTT_UNUSED_ENTRY(62),
  578. IAVF_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
  579. IAVF_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
  580. IAVF_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
  581. /* IPv4 --> GRE/NAT -> MAC --> IPv6 */
  582. IAVF_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
  583. IAVF_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
  584. IAVF_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
  585. IAVF_PTT_UNUSED_ENTRY(69),
  586. IAVF_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
  587. IAVF_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
  588. IAVF_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
  589. /* IPv4 --> GRE/NAT --> MAC/VLAN */
  590. IAVF_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
  591. /* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
  592. IAVF_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
  593. IAVF_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
  594. IAVF_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
  595. IAVF_PTT_UNUSED_ENTRY(77),
  596. IAVF_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
  597. IAVF_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
  598. IAVF_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
  599. /* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
  600. IAVF_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
  601. IAVF_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
  602. IAVF_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
  603. IAVF_PTT_UNUSED_ENTRY(84),
  604. IAVF_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
  605. IAVF_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
  606. IAVF_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
  607. /* Non Tunneled IPv6 */
  608. IAVF_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
  609. IAVF_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
  610. IAVF_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY3),
  611. IAVF_PTT_UNUSED_ENTRY(91),
  612. IAVF_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4),
  613. IAVF_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
  614. IAVF_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
  615. /* IPv6 --> IPv4 */
  616. IAVF_PTT(95, IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
  617. IAVF_PTT(96, IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
  618. IAVF_PTT(97, IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
  619. IAVF_PTT_UNUSED_ENTRY(98),
  620. IAVF_PTT(99, IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
  621. IAVF_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
  622. IAVF_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
  623. /* IPv6 --> IPv6 */
  624. IAVF_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
  625. IAVF_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
  626. IAVF_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
  627. IAVF_PTT_UNUSED_ENTRY(105),
  628. IAVF_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
  629. IAVF_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
  630. IAVF_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
  631. /* IPv6 --> GRE/NAT */
  632. IAVF_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
  633. /* IPv6 --> GRE/NAT -> IPv4 */
  634. IAVF_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
  635. IAVF_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
  636. IAVF_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
  637. IAVF_PTT_UNUSED_ENTRY(113),
  638. IAVF_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
  639. IAVF_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
  640. IAVF_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
  641. /* IPv6 --> GRE/NAT -> IPv6 */
  642. IAVF_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
  643. IAVF_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
  644. IAVF_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
  645. IAVF_PTT_UNUSED_ENTRY(120),
  646. IAVF_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
  647. IAVF_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
  648. IAVF_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
  649. /* IPv6 --> GRE/NAT -> MAC */
  650. IAVF_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
  651. /* IPv6 --> GRE/NAT -> MAC -> IPv4 */
  652. IAVF_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
  653. IAVF_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
  654. IAVF_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
  655. IAVF_PTT_UNUSED_ENTRY(128),
  656. IAVF_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
  657. IAVF_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
  658. IAVF_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
  659. /* IPv6 --> GRE/NAT -> MAC -> IPv6 */
  660. IAVF_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
  661. IAVF_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
  662. IAVF_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
  663. IAVF_PTT_UNUSED_ENTRY(135),
  664. IAVF_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
  665. IAVF_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
  666. IAVF_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
  667. /* IPv6 --> GRE/NAT -> MAC/VLAN */
  668. IAVF_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
  669. /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
  670. IAVF_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
  671. IAVF_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
  672. IAVF_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
  673. IAVF_PTT_UNUSED_ENTRY(143),
  674. IAVF_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
  675. IAVF_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
  676. IAVF_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
  677. /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
  678. IAVF_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
  679. IAVF_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
  680. IAVF_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
  681. IAVF_PTT_UNUSED_ENTRY(150),
  682. IAVF_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
  683. IAVF_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
  684. IAVF_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
  685. /* unused entries */
  686. IAVF_PTT_UNUSED_ENTRY(154),
  687. IAVF_PTT_UNUSED_ENTRY(155),
  688. IAVF_PTT_UNUSED_ENTRY(156),
  689. IAVF_PTT_UNUSED_ENTRY(157),
  690. IAVF_PTT_UNUSED_ENTRY(158),
  691. IAVF_PTT_UNUSED_ENTRY(159),
  692. IAVF_PTT_UNUSED_ENTRY(160),
  693. IAVF_PTT_UNUSED_ENTRY(161),
  694. IAVF_PTT_UNUSED_ENTRY(162),
  695. IAVF_PTT_UNUSED_ENTRY(163),
  696. IAVF_PTT_UNUSED_ENTRY(164),
  697. IAVF_PTT_UNUSED_ENTRY(165),
  698. IAVF_PTT_UNUSED_ENTRY(166),
  699. IAVF_PTT_UNUSED_ENTRY(167),
  700. IAVF_PTT_UNUSED_ENTRY(168),
  701. IAVF_PTT_UNUSED_ENTRY(169),
  702. IAVF_PTT_UNUSED_ENTRY(170),
  703. IAVF_PTT_UNUSED_ENTRY(171),
  704. IAVF_PTT_UNUSED_ENTRY(172),
  705. IAVF_PTT_UNUSED_ENTRY(173),
  706. IAVF_PTT_UNUSED_ENTRY(174),
  707. IAVF_PTT_UNUSED_ENTRY(175),
  708. IAVF_PTT_UNUSED_ENTRY(176),
  709. IAVF_PTT_UNUSED_ENTRY(177),
  710. IAVF_PTT_UNUSED_ENTRY(178),
  711. IAVF_PTT_UNUSED_ENTRY(179),
  712. IAVF_PTT_UNUSED_ENTRY(180),
  713. IAVF_PTT_UNUSED_ENTRY(181),
  714. IAVF_PTT_UNUSED_ENTRY(182),
  715. IAVF_PTT_UNUSED_ENTRY(183),
  716. IAVF_PTT_UNUSED_ENTRY(184),
  717. IAVF_PTT_UNUSED_ENTRY(185),
  718. IAVF_PTT_UNUSED_ENTRY(186),
  719. IAVF_PTT_UNUSED_ENTRY(187),
  720. IAVF_PTT_UNUSED_ENTRY(188),
  721. IAVF_PTT_UNUSED_ENTRY(189),
  722. IAVF_PTT_UNUSED_ENTRY(190),
  723. IAVF_PTT_UNUSED_ENTRY(191),
  724. IAVF_PTT_UNUSED_ENTRY(192),
  725. IAVF_PTT_UNUSED_ENTRY(193),
  726. IAVF_PTT_UNUSED_ENTRY(194),
  727. IAVF_PTT_UNUSED_ENTRY(195),
  728. IAVF_PTT_UNUSED_ENTRY(196),
  729. IAVF_PTT_UNUSED_ENTRY(197),
  730. IAVF_PTT_UNUSED_ENTRY(198),
  731. IAVF_PTT_UNUSED_ENTRY(199),
  732. IAVF_PTT_UNUSED_ENTRY(200),
  733. IAVF_PTT_UNUSED_ENTRY(201),
  734. IAVF_PTT_UNUSED_ENTRY(202),
  735. IAVF_PTT_UNUSED_ENTRY(203),
  736. IAVF_PTT_UNUSED_ENTRY(204),
  737. IAVF_PTT_UNUSED_ENTRY(205),
  738. IAVF_PTT_UNUSED_ENTRY(206),
  739. IAVF_PTT_UNUSED_ENTRY(207),
  740. IAVF_PTT_UNUSED_ENTRY(208),
  741. IAVF_PTT_UNUSED_ENTRY(209),
  742. IAVF_PTT_UNUSED_ENTRY(210),
  743. IAVF_PTT_UNUSED_ENTRY(211),
  744. IAVF_PTT_UNUSED_ENTRY(212),
  745. IAVF_PTT_UNUSED_ENTRY(213),
  746. IAVF_PTT_UNUSED_ENTRY(214),
  747. IAVF_PTT_UNUSED_ENTRY(215),
  748. IAVF_PTT_UNUSED_ENTRY(216),
  749. IAVF_PTT_UNUSED_ENTRY(217),
  750. IAVF_PTT_UNUSED_ENTRY(218),
  751. IAVF_PTT_UNUSED_ENTRY(219),
  752. IAVF_PTT_UNUSED_ENTRY(220),
  753. IAVF_PTT_UNUSED_ENTRY(221),
  754. IAVF_PTT_UNUSED_ENTRY(222),
  755. IAVF_PTT_UNUSED_ENTRY(223),
  756. IAVF_PTT_UNUSED_ENTRY(224),
  757. IAVF_PTT_UNUSED_ENTRY(225),
  758. IAVF_PTT_UNUSED_ENTRY(226),
  759. IAVF_PTT_UNUSED_ENTRY(227),
  760. IAVF_PTT_UNUSED_ENTRY(228),
  761. IAVF_PTT_UNUSED_ENTRY(229),
  762. IAVF_PTT_UNUSED_ENTRY(230),
  763. IAVF_PTT_UNUSED_ENTRY(231),
  764. IAVF_PTT_UNUSED_ENTRY(232),
  765. IAVF_PTT_UNUSED_ENTRY(233),
  766. IAVF_PTT_UNUSED_ENTRY(234),
  767. IAVF_PTT_UNUSED_ENTRY(235),
  768. IAVF_PTT_UNUSED_ENTRY(236),
  769. IAVF_PTT_UNUSED_ENTRY(237),
  770. IAVF_PTT_UNUSED_ENTRY(238),
  771. IAVF_PTT_UNUSED_ENTRY(239),
  772. IAVF_PTT_UNUSED_ENTRY(240),
  773. IAVF_PTT_UNUSED_ENTRY(241),
  774. IAVF_PTT_UNUSED_ENTRY(242),
  775. IAVF_PTT_UNUSED_ENTRY(243),
  776. IAVF_PTT_UNUSED_ENTRY(244),
  777. IAVF_PTT_UNUSED_ENTRY(245),
  778. IAVF_PTT_UNUSED_ENTRY(246),
  779. IAVF_PTT_UNUSED_ENTRY(247),
  780. IAVF_PTT_UNUSED_ENTRY(248),
  781. IAVF_PTT_UNUSED_ENTRY(249),
  782. IAVF_PTT_UNUSED_ENTRY(250),
  783. IAVF_PTT_UNUSED_ENTRY(251),
  784. IAVF_PTT_UNUSED_ENTRY(252),
  785. IAVF_PTT_UNUSED_ENTRY(253),
  786. IAVF_PTT_UNUSED_ENTRY(254),
  787. IAVF_PTT_UNUSED_ENTRY(255)
  788. };
  789. /**
  790. * iavf_aq_send_msg_to_pf
  791. * @hw: pointer to the hardware structure
  792. * @v_opcode: opcodes for VF-PF communication
  793. * @v_retval: return error code
  794. * @msg: pointer to the msg buffer
  795. * @msglen: msg length
  796. * @cmd_details: pointer to command details
  797. *
  798. * Send message to PF driver using admin queue. By default, this message
  799. * is sent asynchronously, i.e. iavf_asq_send_command() does not wait for
  800. * completion before returning.
  801. **/
  802. iavf_status iavf_aq_send_msg_to_pf(struct iavf_hw *hw,
  803. enum virtchnl_ops v_opcode,
  804. iavf_status v_retval, u8 *msg, u16 msglen,
  805. struct i40e_asq_cmd_details *cmd_details)
  806. {
  807. struct i40e_asq_cmd_details details;
  808. struct i40e_aq_desc desc;
  809. iavf_status status;
  810. iavf_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf);
  811. desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_SI);
  812. desc.cookie_high = cpu_to_le32(v_opcode);
  813. desc.cookie_low = cpu_to_le32(v_retval);
  814. if (msglen) {
  815. desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF
  816. | I40E_AQ_FLAG_RD));
  817. if (msglen > I40E_AQ_LARGE_BUF)
  818. desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
  819. desc.datalen = cpu_to_le16(msglen);
  820. }
  821. if (!cmd_details) {
  822. memset(&details, 0, sizeof(details));
  823. details.async = true;
  824. cmd_details = &details;
  825. }
  826. status = iavf_asq_send_command(hw, &desc, msg, msglen, cmd_details);
  827. return status;
  828. }
  829. /**
  830. * iavf_vf_parse_hw_config
  831. * @hw: pointer to the hardware structure
  832. * @msg: pointer to the virtual channel VF resource structure
  833. *
  834. * Given a VF resource message from the PF, populate the hw struct
  835. * with appropriate information.
  836. **/
  837. void iavf_vf_parse_hw_config(struct iavf_hw *hw,
  838. struct virtchnl_vf_resource *msg)
  839. {
  840. struct virtchnl_vsi_resource *vsi_res;
  841. int i;
  842. vsi_res = &msg->vsi_res[0];
  843. hw->dev_caps.num_vsis = msg->num_vsis;
  844. hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
  845. hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
  846. hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
  847. hw->dev_caps.dcb = msg->vf_cap_flags &
  848. VIRTCHNL_VF_OFFLOAD_L2;
  849. hw->dev_caps.fcoe = 0;
  850. for (i = 0; i < msg->num_vsis; i++) {
  851. if (vsi_res->vsi_type == VIRTCHNL_VSI_SRIOV) {
  852. ether_addr_copy(hw->mac.perm_addr,
  853. vsi_res->default_mac_addr);
  854. ether_addr_copy(hw->mac.addr,
  855. vsi_res->default_mac_addr);
  856. }
  857. vsi_res++;
  858. }
  859. }
  860. /**
  861. * iavf_vf_reset
  862. * @hw: pointer to the hardware structure
  863. *
  864. * Send a VF_RESET message to the PF. Does not wait for response from PF
  865. * as none will be forthcoming. Immediately after calling this function,
  866. * the admin queue should be shut down and (optionally) reinitialized.
  867. **/
  868. iavf_status iavf_vf_reset(struct iavf_hw *hw)
  869. {
  870. return iavf_aq_send_msg_to_pf(hw, VIRTCHNL_OP_RESET_VF,
  871. 0, NULL, 0, NULL);
  872. }