1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /* Copyright(c) 2013 - 2018 Intel Corporation. */
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #include "iavf_type.h"
5*4882a593Smuzhiyun #include "iavf_adminq.h"
6*4882a593Smuzhiyun #include "iavf_prototype.h"
7*4882a593Smuzhiyun #include <linux/avf/virtchnl.h>
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun /**
10*4882a593Smuzhiyun * iavf_set_mac_type - Sets MAC type
11*4882a593Smuzhiyun * @hw: pointer to the HW structure
12*4882a593Smuzhiyun *
13*4882a593Smuzhiyun * This function sets the mac type of the adapter based on the
14*4882a593Smuzhiyun * vendor ID and device ID stored in the hw structure.
15*4882a593Smuzhiyun **/
iavf_set_mac_type(struct iavf_hw * hw)16*4882a593Smuzhiyun enum iavf_status iavf_set_mac_type(struct iavf_hw *hw)
17*4882a593Smuzhiyun {
18*4882a593Smuzhiyun enum iavf_status status = 0;
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun if (hw->vendor_id == PCI_VENDOR_ID_INTEL) {
21*4882a593Smuzhiyun switch (hw->device_id) {
22*4882a593Smuzhiyun case IAVF_DEV_ID_X722_VF:
23*4882a593Smuzhiyun hw->mac.type = IAVF_MAC_X722_VF;
24*4882a593Smuzhiyun break;
25*4882a593Smuzhiyun case IAVF_DEV_ID_VF:
26*4882a593Smuzhiyun case IAVF_DEV_ID_VF_HV:
27*4882a593Smuzhiyun case IAVF_DEV_ID_ADAPTIVE_VF:
28*4882a593Smuzhiyun hw->mac.type = IAVF_MAC_VF;
29*4882a593Smuzhiyun break;
30*4882a593Smuzhiyun default:
31*4882a593Smuzhiyun hw->mac.type = IAVF_MAC_GENERIC;
32*4882a593Smuzhiyun break;
33*4882a593Smuzhiyun }
34*4882a593Smuzhiyun } else {
35*4882a593Smuzhiyun status = IAVF_ERR_DEVICE_NOT_SUPPORTED;
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun hw_dbg(hw, "found mac: %d, returns: %d\n", hw->mac.type, status);
39*4882a593Smuzhiyun return status;
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun /**
43*4882a593Smuzhiyun * iavf_aq_str - convert AQ err code to a string
44*4882a593Smuzhiyun * @hw: pointer to the HW structure
45*4882a593Smuzhiyun * @aq_err: the AQ error code to convert
46*4882a593Smuzhiyun **/
iavf_aq_str(struct iavf_hw * hw,enum iavf_admin_queue_err aq_err)47*4882a593Smuzhiyun const char *iavf_aq_str(struct iavf_hw *hw, enum iavf_admin_queue_err aq_err)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun switch (aq_err) {
50*4882a593Smuzhiyun case IAVF_AQ_RC_OK:
51*4882a593Smuzhiyun return "OK";
52*4882a593Smuzhiyun case IAVF_AQ_RC_EPERM:
53*4882a593Smuzhiyun return "IAVF_AQ_RC_EPERM";
54*4882a593Smuzhiyun case IAVF_AQ_RC_ENOENT:
55*4882a593Smuzhiyun return "IAVF_AQ_RC_ENOENT";
56*4882a593Smuzhiyun case IAVF_AQ_RC_ESRCH:
57*4882a593Smuzhiyun return "IAVF_AQ_RC_ESRCH";
58*4882a593Smuzhiyun case IAVF_AQ_RC_EINTR:
59*4882a593Smuzhiyun return "IAVF_AQ_RC_EINTR";
60*4882a593Smuzhiyun case IAVF_AQ_RC_EIO:
61*4882a593Smuzhiyun return "IAVF_AQ_RC_EIO";
62*4882a593Smuzhiyun case IAVF_AQ_RC_ENXIO:
63*4882a593Smuzhiyun return "IAVF_AQ_RC_ENXIO";
64*4882a593Smuzhiyun case IAVF_AQ_RC_E2BIG:
65*4882a593Smuzhiyun return "IAVF_AQ_RC_E2BIG";
66*4882a593Smuzhiyun case IAVF_AQ_RC_EAGAIN:
67*4882a593Smuzhiyun return "IAVF_AQ_RC_EAGAIN";
68*4882a593Smuzhiyun case IAVF_AQ_RC_ENOMEM:
69*4882a593Smuzhiyun return "IAVF_AQ_RC_ENOMEM";
70*4882a593Smuzhiyun case IAVF_AQ_RC_EACCES:
71*4882a593Smuzhiyun return "IAVF_AQ_RC_EACCES";
72*4882a593Smuzhiyun case IAVF_AQ_RC_EFAULT:
73*4882a593Smuzhiyun return "IAVF_AQ_RC_EFAULT";
74*4882a593Smuzhiyun case IAVF_AQ_RC_EBUSY:
75*4882a593Smuzhiyun return "IAVF_AQ_RC_EBUSY";
76*4882a593Smuzhiyun case IAVF_AQ_RC_EEXIST:
77*4882a593Smuzhiyun return "IAVF_AQ_RC_EEXIST";
78*4882a593Smuzhiyun case IAVF_AQ_RC_EINVAL:
79*4882a593Smuzhiyun return "IAVF_AQ_RC_EINVAL";
80*4882a593Smuzhiyun case IAVF_AQ_RC_ENOTTY:
81*4882a593Smuzhiyun return "IAVF_AQ_RC_ENOTTY";
82*4882a593Smuzhiyun case IAVF_AQ_RC_ENOSPC:
83*4882a593Smuzhiyun return "IAVF_AQ_RC_ENOSPC";
84*4882a593Smuzhiyun case IAVF_AQ_RC_ENOSYS:
85*4882a593Smuzhiyun return "IAVF_AQ_RC_ENOSYS";
86*4882a593Smuzhiyun case IAVF_AQ_RC_ERANGE:
87*4882a593Smuzhiyun return "IAVF_AQ_RC_ERANGE";
88*4882a593Smuzhiyun case IAVF_AQ_RC_EFLUSHED:
89*4882a593Smuzhiyun return "IAVF_AQ_RC_EFLUSHED";
90*4882a593Smuzhiyun case IAVF_AQ_RC_BAD_ADDR:
91*4882a593Smuzhiyun return "IAVF_AQ_RC_BAD_ADDR";
92*4882a593Smuzhiyun case IAVF_AQ_RC_EMODE:
93*4882a593Smuzhiyun return "IAVF_AQ_RC_EMODE";
94*4882a593Smuzhiyun case IAVF_AQ_RC_EFBIG:
95*4882a593Smuzhiyun return "IAVF_AQ_RC_EFBIG";
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun snprintf(hw->err_str, sizeof(hw->err_str), "%d", aq_err);
99*4882a593Smuzhiyun return hw->err_str;
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun /**
103*4882a593Smuzhiyun * iavf_stat_str - convert status err code to a string
104*4882a593Smuzhiyun * @hw: pointer to the HW structure
105*4882a593Smuzhiyun * @stat_err: the status error code to convert
106*4882a593Smuzhiyun **/
iavf_stat_str(struct iavf_hw * hw,enum iavf_status stat_err)107*4882a593Smuzhiyun const char *iavf_stat_str(struct iavf_hw *hw, enum iavf_status stat_err)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun switch (stat_err) {
110*4882a593Smuzhiyun case 0:
111*4882a593Smuzhiyun return "OK";
112*4882a593Smuzhiyun case IAVF_ERR_NVM:
113*4882a593Smuzhiyun return "IAVF_ERR_NVM";
114*4882a593Smuzhiyun case IAVF_ERR_NVM_CHECKSUM:
115*4882a593Smuzhiyun return "IAVF_ERR_NVM_CHECKSUM";
116*4882a593Smuzhiyun case IAVF_ERR_PHY:
117*4882a593Smuzhiyun return "IAVF_ERR_PHY";
118*4882a593Smuzhiyun case IAVF_ERR_CONFIG:
119*4882a593Smuzhiyun return "IAVF_ERR_CONFIG";
120*4882a593Smuzhiyun case IAVF_ERR_PARAM:
121*4882a593Smuzhiyun return "IAVF_ERR_PARAM";
122*4882a593Smuzhiyun case IAVF_ERR_MAC_TYPE:
123*4882a593Smuzhiyun return "IAVF_ERR_MAC_TYPE";
124*4882a593Smuzhiyun case IAVF_ERR_UNKNOWN_PHY:
125*4882a593Smuzhiyun return "IAVF_ERR_UNKNOWN_PHY";
126*4882a593Smuzhiyun case IAVF_ERR_LINK_SETUP:
127*4882a593Smuzhiyun return "IAVF_ERR_LINK_SETUP";
128*4882a593Smuzhiyun case IAVF_ERR_ADAPTER_STOPPED:
129*4882a593Smuzhiyun return "IAVF_ERR_ADAPTER_STOPPED";
130*4882a593Smuzhiyun case IAVF_ERR_INVALID_MAC_ADDR:
131*4882a593Smuzhiyun return "IAVF_ERR_INVALID_MAC_ADDR";
132*4882a593Smuzhiyun case IAVF_ERR_DEVICE_NOT_SUPPORTED:
133*4882a593Smuzhiyun return "IAVF_ERR_DEVICE_NOT_SUPPORTED";
134*4882a593Smuzhiyun case IAVF_ERR_MASTER_REQUESTS_PENDING:
135*4882a593Smuzhiyun return "IAVF_ERR_MASTER_REQUESTS_PENDING";
136*4882a593Smuzhiyun case IAVF_ERR_INVALID_LINK_SETTINGS:
137*4882a593Smuzhiyun return "IAVF_ERR_INVALID_LINK_SETTINGS";
138*4882a593Smuzhiyun case IAVF_ERR_AUTONEG_NOT_COMPLETE:
139*4882a593Smuzhiyun return "IAVF_ERR_AUTONEG_NOT_COMPLETE";
140*4882a593Smuzhiyun case IAVF_ERR_RESET_FAILED:
141*4882a593Smuzhiyun return "IAVF_ERR_RESET_FAILED";
142*4882a593Smuzhiyun case IAVF_ERR_SWFW_SYNC:
143*4882a593Smuzhiyun return "IAVF_ERR_SWFW_SYNC";
144*4882a593Smuzhiyun case IAVF_ERR_NO_AVAILABLE_VSI:
145*4882a593Smuzhiyun return "IAVF_ERR_NO_AVAILABLE_VSI";
146*4882a593Smuzhiyun case IAVF_ERR_NO_MEMORY:
147*4882a593Smuzhiyun return "IAVF_ERR_NO_MEMORY";
148*4882a593Smuzhiyun case IAVF_ERR_BAD_PTR:
149*4882a593Smuzhiyun return "IAVF_ERR_BAD_PTR";
150*4882a593Smuzhiyun case IAVF_ERR_RING_FULL:
151*4882a593Smuzhiyun return "IAVF_ERR_RING_FULL";
152*4882a593Smuzhiyun case IAVF_ERR_INVALID_PD_ID:
153*4882a593Smuzhiyun return "IAVF_ERR_INVALID_PD_ID";
154*4882a593Smuzhiyun case IAVF_ERR_INVALID_QP_ID:
155*4882a593Smuzhiyun return "IAVF_ERR_INVALID_QP_ID";
156*4882a593Smuzhiyun case IAVF_ERR_INVALID_CQ_ID:
157*4882a593Smuzhiyun return "IAVF_ERR_INVALID_CQ_ID";
158*4882a593Smuzhiyun case IAVF_ERR_INVALID_CEQ_ID:
159*4882a593Smuzhiyun return "IAVF_ERR_INVALID_CEQ_ID";
160*4882a593Smuzhiyun case IAVF_ERR_INVALID_AEQ_ID:
161*4882a593Smuzhiyun return "IAVF_ERR_INVALID_AEQ_ID";
162*4882a593Smuzhiyun case IAVF_ERR_INVALID_SIZE:
163*4882a593Smuzhiyun return "IAVF_ERR_INVALID_SIZE";
164*4882a593Smuzhiyun case IAVF_ERR_INVALID_ARP_INDEX:
165*4882a593Smuzhiyun return "IAVF_ERR_INVALID_ARP_INDEX";
166*4882a593Smuzhiyun case IAVF_ERR_INVALID_FPM_FUNC_ID:
167*4882a593Smuzhiyun return "IAVF_ERR_INVALID_FPM_FUNC_ID";
168*4882a593Smuzhiyun case IAVF_ERR_QP_INVALID_MSG_SIZE:
169*4882a593Smuzhiyun return "IAVF_ERR_QP_INVALID_MSG_SIZE";
170*4882a593Smuzhiyun case IAVF_ERR_QP_TOOMANY_WRS_POSTED:
171*4882a593Smuzhiyun return "IAVF_ERR_QP_TOOMANY_WRS_POSTED";
172*4882a593Smuzhiyun case IAVF_ERR_INVALID_FRAG_COUNT:
173*4882a593Smuzhiyun return "IAVF_ERR_INVALID_FRAG_COUNT";
174*4882a593Smuzhiyun case IAVF_ERR_QUEUE_EMPTY:
175*4882a593Smuzhiyun return "IAVF_ERR_QUEUE_EMPTY";
176*4882a593Smuzhiyun case IAVF_ERR_INVALID_ALIGNMENT:
177*4882a593Smuzhiyun return "IAVF_ERR_INVALID_ALIGNMENT";
178*4882a593Smuzhiyun case IAVF_ERR_FLUSHED_QUEUE:
179*4882a593Smuzhiyun return "IAVF_ERR_FLUSHED_QUEUE";
180*4882a593Smuzhiyun case IAVF_ERR_INVALID_PUSH_PAGE_INDEX:
181*4882a593Smuzhiyun return "IAVF_ERR_INVALID_PUSH_PAGE_INDEX";
182*4882a593Smuzhiyun case IAVF_ERR_INVALID_IMM_DATA_SIZE:
183*4882a593Smuzhiyun return "IAVF_ERR_INVALID_IMM_DATA_SIZE";
184*4882a593Smuzhiyun case IAVF_ERR_TIMEOUT:
185*4882a593Smuzhiyun return "IAVF_ERR_TIMEOUT";
186*4882a593Smuzhiyun case IAVF_ERR_OPCODE_MISMATCH:
187*4882a593Smuzhiyun return "IAVF_ERR_OPCODE_MISMATCH";
188*4882a593Smuzhiyun case IAVF_ERR_CQP_COMPL_ERROR:
189*4882a593Smuzhiyun return "IAVF_ERR_CQP_COMPL_ERROR";
190*4882a593Smuzhiyun case IAVF_ERR_INVALID_VF_ID:
191*4882a593Smuzhiyun return "IAVF_ERR_INVALID_VF_ID";
192*4882a593Smuzhiyun case IAVF_ERR_INVALID_HMCFN_ID:
193*4882a593Smuzhiyun return "IAVF_ERR_INVALID_HMCFN_ID";
194*4882a593Smuzhiyun case IAVF_ERR_BACKING_PAGE_ERROR:
195*4882a593Smuzhiyun return "IAVF_ERR_BACKING_PAGE_ERROR";
196*4882a593Smuzhiyun case IAVF_ERR_NO_PBLCHUNKS_AVAILABLE:
197*4882a593Smuzhiyun return "IAVF_ERR_NO_PBLCHUNKS_AVAILABLE";
198*4882a593Smuzhiyun case IAVF_ERR_INVALID_PBLE_INDEX:
199*4882a593Smuzhiyun return "IAVF_ERR_INVALID_PBLE_INDEX";
200*4882a593Smuzhiyun case IAVF_ERR_INVALID_SD_INDEX:
201*4882a593Smuzhiyun return "IAVF_ERR_INVALID_SD_INDEX";
202*4882a593Smuzhiyun case IAVF_ERR_INVALID_PAGE_DESC_INDEX:
203*4882a593Smuzhiyun return "IAVF_ERR_INVALID_PAGE_DESC_INDEX";
204*4882a593Smuzhiyun case IAVF_ERR_INVALID_SD_TYPE:
205*4882a593Smuzhiyun return "IAVF_ERR_INVALID_SD_TYPE";
206*4882a593Smuzhiyun case IAVF_ERR_MEMCPY_FAILED:
207*4882a593Smuzhiyun return "IAVF_ERR_MEMCPY_FAILED";
208*4882a593Smuzhiyun case IAVF_ERR_INVALID_HMC_OBJ_INDEX:
209*4882a593Smuzhiyun return "IAVF_ERR_INVALID_HMC_OBJ_INDEX";
210*4882a593Smuzhiyun case IAVF_ERR_INVALID_HMC_OBJ_COUNT:
211*4882a593Smuzhiyun return "IAVF_ERR_INVALID_HMC_OBJ_COUNT";
212*4882a593Smuzhiyun case IAVF_ERR_INVALID_SRQ_ARM_LIMIT:
213*4882a593Smuzhiyun return "IAVF_ERR_INVALID_SRQ_ARM_LIMIT";
214*4882a593Smuzhiyun case IAVF_ERR_SRQ_ENABLED:
215*4882a593Smuzhiyun return "IAVF_ERR_SRQ_ENABLED";
216*4882a593Smuzhiyun case IAVF_ERR_ADMIN_QUEUE_ERROR:
217*4882a593Smuzhiyun return "IAVF_ERR_ADMIN_QUEUE_ERROR";
218*4882a593Smuzhiyun case IAVF_ERR_ADMIN_QUEUE_TIMEOUT:
219*4882a593Smuzhiyun return "IAVF_ERR_ADMIN_QUEUE_TIMEOUT";
220*4882a593Smuzhiyun case IAVF_ERR_BUF_TOO_SHORT:
221*4882a593Smuzhiyun return "IAVF_ERR_BUF_TOO_SHORT";
222*4882a593Smuzhiyun case IAVF_ERR_ADMIN_QUEUE_FULL:
223*4882a593Smuzhiyun return "IAVF_ERR_ADMIN_QUEUE_FULL";
224*4882a593Smuzhiyun case IAVF_ERR_ADMIN_QUEUE_NO_WORK:
225*4882a593Smuzhiyun return "IAVF_ERR_ADMIN_QUEUE_NO_WORK";
226*4882a593Smuzhiyun case IAVF_ERR_BAD_IWARP_CQE:
227*4882a593Smuzhiyun return "IAVF_ERR_BAD_IWARP_CQE";
228*4882a593Smuzhiyun case IAVF_ERR_NVM_BLANK_MODE:
229*4882a593Smuzhiyun return "IAVF_ERR_NVM_BLANK_MODE";
230*4882a593Smuzhiyun case IAVF_ERR_NOT_IMPLEMENTED:
231*4882a593Smuzhiyun return "IAVF_ERR_NOT_IMPLEMENTED";
232*4882a593Smuzhiyun case IAVF_ERR_PE_DOORBELL_NOT_ENABLED:
233*4882a593Smuzhiyun return "IAVF_ERR_PE_DOORBELL_NOT_ENABLED";
234*4882a593Smuzhiyun case IAVF_ERR_DIAG_TEST_FAILED:
235*4882a593Smuzhiyun return "IAVF_ERR_DIAG_TEST_FAILED";
236*4882a593Smuzhiyun case IAVF_ERR_NOT_READY:
237*4882a593Smuzhiyun return "IAVF_ERR_NOT_READY";
238*4882a593Smuzhiyun case IAVF_NOT_SUPPORTED:
239*4882a593Smuzhiyun return "IAVF_NOT_SUPPORTED";
240*4882a593Smuzhiyun case IAVF_ERR_FIRMWARE_API_VERSION:
241*4882a593Smuzhiyun return "IAVF_ERR_FIRMWARE_API_VERSION";
242*4882a593Smuzhiyun case IAVF_ERR_ADMIN_QUEUE_CRITICAL_ERROR:
243*4882a593Smuzhiyun return "IAVF_ERR_ADMIN_QUEUE_CRITICAL_ERROR";
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun snprintf(hw->err_str, sizeof(hw->err_str), "%d", stat_err);
247*4882a593Smuzhiyun return hw->err_str;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun /**
251*4882a593Smuzhiyun * iavf_debug_aq
252*4882a593Smuzhiyun * @hw: debug mask related to admin queue
253*4882a593Smuzhiyun * @mask: debug mask
254*4882a593Smuzhiyun * @desc: pointer to admin queue descriptor
255*4882a593Smuzhiyun * @buffer: pointer to command buffer
256*4882a593Smuzhiyun * @buf_len: max length of buffer
257*4882a593Smuzhiyun *
258*4882a593Smuzhiyun * Dumps debug log about adminq command with descriptor contents.
259*4882a593Smuzhiyun **/
iavf_debug_aq(struct iavf_hw * hw,enum iavf_debug_mask mask,void * desc,void * buffer,u16 buf_len)260*4882a593Smuzhiyun void iavf_debug_aq(struct iavf_hw *hw, enum iavf_debug_mask mask, void *desc,
261*4882a593Smuzhiyun void *buffer, u16 buf_len)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun struct iavf_aq_desc *aq_desc = (struct iavf_aq_desc *)desc;
264*4882a593Smuzhiyun u8 *buf = (u8 *)buffer;
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun if ((!(mask & hw->debug_mask)) || !desc)
267*4882a593Smuzhiyun return;
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun iavf_debug(hw, mask,
270*4882a593Smuzhiyun "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
271*4882a593Smuzhiyun le16_to_cpu(aq_desc->opcode),
272*4882a593Smuzhiyun le16_to_cpu(aq_desc->flags),
273*4882a593Smuzhiyun le16_to_cpu(aq_desc->datalen),
274*4882a593Smuzhiyun le16_to_cpu(aq_desc->retval));
275*4882a593Smuzhiyun iavf_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
276*4882a593Smuzhiyun le32_to_cpu(aq_desc->cookie_high),
277*4882a593Smuzhiyun le32_to_cpu(aq_desc->cookie_low));
278*4882a593Smuzhiyun iavf_debug(hw, mask, "\tparam (0,1) 0x%08X 0x%08X\n",
279*4882a593Smuzhiyun le32_to_cpu(aq_desc->params.internal.param0),
280*4882a593Smuzhiyun le32_to_cpu(aq_desc->params.internal.param1));
281*4882a593Smuzhiyun iavf_debug(hw, mask, "\taddr (h,l) 0x%08X 0x%08X\n",
282*4882a593Smuzhiyun le32_to_cpu(aq_desc->params.external.addr_high),
283*4882a593Smuzhiyun le32_to_cpu(aq_desc->params.external.addr_low));
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun if (buffer && aq_desc->datalen) {
286*4882a593Smuzhiyun u16 len = le16_to_cpu(aq_desc->datalen);
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun iavf_debug(hw, mask, "AQ CMD Buffer:\n");
289*4882a593Smuzhiyun if (buf_len < len)
290*4882a593Smuzhiyun len = buf_len;
291*4882a593Smuzhiyun /* write the full 16-byte chunks */
292*4882a593Smuzhiyun if (hw->debug_mask & mask) {
293*4882a593Smuzhiyun char prefix[27];
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun snprintf(prefix, sizeof(prefix),
296*4882a593Smuzhiyun "iavf %02x:%02x.%x: \t0x",
297*4882a593Smuzhiyun hw->bus.bus_id,
298*4882a593Smuzhiyun hw->bus.device,
299*4882a593Smuzhiyun hw->bus.func);
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_OFFSET,
302*4882a593Smuzhiyun 16, 1, buf, len, false);
303*4882a593Smuzhiyun }
304*4882a593Smuzhiyun }
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun /**
308*4882a593Smuzhiyun * iavf_check_asq_alive
309*4882a593Smuzhiyun * @hw: pointer to the hw struct
310*4882a593Smuzhiyun *
311*4882a593Smuzhiyun * Returns true if Queue is enabled else false.
312*4882a593Smuzhiyun **/
iavf_check_asq_alive(struct iavf_hw * hw)313*4882a593Smuzhiyun bool iavf_check_asq_alive(struct iavf_hw *hw)
314*4882a593Smuzhiyun {
315*4882a593Smuzhiyun if (hw->aq.asq.len)
316*4882a593Smuzhiyun return !!(rd32(hw, hw->aq.asq.len) &
317*4882a593Smuzhiyun IAVF_VF_ATQLEN1_ATQENABLE_MASK);
318*4882a593Smuzhiyun else
319*4882a593Smuzhiyun return false;
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun /**
323*4882a593Smuzhiyun * iavf_aq_queue_shutdown
324*4882a593Smuzhiyun * @hw: pointer to the hw struct
325*4882a593Smuzhiyun * @unloading: is the driver unloading itself
326*4882a593Smuzhiyun *
327*4882a593Smuzhiyun * Tell the Firmware that we're shutting down the AdminQ and whether
328*4882a593Smuzhiyun * or not the driver is unloading as well.
329*4882a593Smuzhiyun **/
iavf_aq_queue_shutdown(struct iavf_hw * hw,bool unloading)330*4882a593Smuzhiyun enum iavf_status iavf_aq_queue_shutdown(struct iavf_hw *hw, bool unloading)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun struct iavf_aq_desc desc;
333*4882a593Smuzhiyun struct iavf_aqc_queue_shutdown *cmd =
334*4882a593Smuzhiyun (struct iavf_aqc_queue_shutdown *)&desc.params.raw;
335*4882a593Smuzhiyun enum iavf_status status;
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun iavf_fill_default_direct_cmd_desc(&desc, iavf_aqc_opc_queue_shutdown);
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun if (unloading)
340*4882a593Smuzhiyun cmd->driver_unloading = cpu_to_le32(IAVF_AQ_DRIVER_UNLOADING);
341*4882a593Smuzhiyun status = iavf_asq_send_command(hw, &desc, NULL, 0, NULL);
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun return status;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun /**
347*4882a593Smuzhiyun * iavf_aq_get_set_rss_lut
348*4882a593Smuzhiyun * @hw: pointer to the hardware structure
349*4882a593Smuzhiyun * @vsi_id: vsi fw index
350*4882a593Smuzhiyun * @pf_lut: for PF table set true, for VSI table set false
351*4882a593Smuzhiyun * @lut: pointer to the lut buffer provided by the caller
352*4882a593Smuzhiyun * @lut_size: size of the lut buffer
353*4882a593Smuzhiyun * @set: set true to set the table, false to get the table
354*4882a593Smuzhiyun *
355*4882a593Smuzhiyun * Internal function to get or set RSS look up table
356*4882a593Smuzhiyun **/
iavf_aq_get_set_rss_lut(struct iavf_hw * hw,u16 vsi_id,bool pf_lut,u8 * lut,u16 lut_size,bool set)357*4882a593Smuzhiyun static enum iavf_status iavf_aq_get_set_rss_lut(struct iavf_hw *hw,
358*4882a593Smuzhiyun u16 vsi_id, bool pf_lut,
359*4882a593Smuzhiyun u8 *lut, u16 lut_size,
360*4882a593Smuzhiyun bool set)
361*4882a593Smuzhiyun {
362*4882a593Smuzhiyun enum iavf_status status;
363*4882a593Smuzhiyun struct iavf_aq_desc desc;
364*4882a593Smuzhiyun struct iavf_aqc_get_set_rss_lut *cmd_resp =
365*4882a593Smuzhiyun (struct iavf_aqc_get_set_rss_lut *)&desc.params.raw;
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun if (set)
368*4882a593Smuzhiyun iavf_fill_default_direct_cmd_desc(&desc,
369*4882a593Smuzhiyun iavf_aqc_opc_set_rss_lut);
370*4882a593Smuzhiyun else
371*4882a593Smuzhiyun iavf_fill_default_direct_cmd_desc(&desc,
372*4882a593Smuzhiyun iavf_aqc_opc_get_rss_lut);
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun /* Indirect command */
375*4882a593Smuzhiyun desc.flags |= cpu_to_le16((u16)IAVF_AQ_FLAG_BUF);
376*4882a593Smuzhiyun desc.flags |= cpu_to_le16((u16)IAVF_AQ_FLAG_RD);
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun cmd_resp->vsi_id =
379*4882a593Smuzhiyun cpu_to_le16((u16)((vsi_id <<
380*4882a593Smuzhiyun IAVF_AQC_SET_RSS_LUT_VSI_ID_SHIFT) &
381*4882a593Smuzhiyun IAVF_AQC_SET_RSS_LUT_VSI_ID_MASK));
382*4882a593Smuzhiyun cmd_resp->vsi_id |= cpu_to_le16((u16)IAVF_AQC_SET_RSS_LUT_VSI_VALID);
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun if (pf_lut)
385*4882a593Smuzhiyun cmd_resp->flags |= cpu_to_le16((u16)
386*4882a593Smuzhiyun ((IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_PF <<
387*4882a593Smuzhiyun IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
388*4882a593Smuzhiyun IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
389*4882a593Smuzhiyun else
390*4882a593Smuzhiyun cmd_resp->flags |= cpu_to_le16((u16)
391*4882a593Smuzhiyun ((IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_VSI <<
392*4882a593Smuzhiyun IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
393*4882a593Smuzhiyun IAVF_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun status = iavf_asq_send_command(hw, &desc, lut, lut_size, NULL);
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun return status;
398*4882a593Smuzhiyun }
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun /**
401*4882a593Smuzhiyun * iavf_aq_get_rss_lut
402*4882a593Smuzhiyun * @hw: pointer to the hardware structure
403*4882a593Smuzhiyun * @vsi_id: vsi fw index
404*4882a593Smuzhiyun * @pf_lut: for PF table set true, for VSI table set false
405*4882a593Smuzhiyun * @lut: pointer to the lut buffer provided by the caller
406*4882a593Smuzhiyun * @lut_size: size of the lut buffer
407*4882a593Smuzhiyun *
408*4882a593Smuzhiyun * get the RSS lookup table, PF or VSI type
409*4882a593Smuzhiyun **/
iavf_aq_get_rss_lut(struct iavf_hw * hw,u16 vsi_id,bool pf_lut,u8 * lut,u16 lut_size)410*4882a593Smuzhiyun enum iavf_status iavf_aq_get_rss_lut(struct iavf_hw *hw, u16 vsi_id,
411*4882a593Smuzhiyun bool pf_lut, u8 *lut, u16 lut_size)
412*4882a593Smuzhiyun {
413*4882a593Smuzhiyun return iavf_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size,
414*4882a593Smuzhiyun false);
415*4882a593Smuzhiyun }
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun /**
418*4882a593Smuzhiyun * iavf_aq_set_rss_lut
419*4882a593Smuzhiyun * @hw: pointer to the hardware structure
420*4882a593Smuzhiyun * @vsi_id: vsi fw index
421*4882a593Smuzhiyun * @pf_lut: for PF table set true, for VSI table set false
422*4882a593Smuzhiyun * @lut: pointer to the lut buffer provided by the caller
423*4882a593Smuzhiyun * @lut_size: size of the lut buffer
424*4882a593Smuzhiyun *
425*4882a593Smuzhiyun * set the RSS lookup table, PF or VSI type
426*4882a593Smuzhiyun **/
iavf_aq_set_rss_lut(struct iavf_hw * hw,u16 vsi_id,bool pf_lut,u8 * lut,u16 lut_size)427*4882a593Smuzhiyun enum iavf_status iavf_aq_set_rss_lut(struct iavf_hw *hw, u16 vsi_id,
428*4882a593Smuzhiyun bool pf_lut, u8 *lut, u16 lut_size)
429*4882a593Smuzhiyun {
430*4882a593Smuzhiyun return iavf_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size, true);
431*4882a593Smuzhiyun }
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun /**
434*4882a593Smuzhiyun * iavf_aq_get_set_rss_key
435*4882a593Smuzhiyun * @hw: pointer to the hw struct
436*4882a593Smuzhiyun * @vsi_id: vsi fw index
437*4882a593Smuzhiyun * @key: pointer to key info struct
438*4882a593Smuzhiyun * @set: set true to set the key, false to get the key
439*4882a593Smuzhiyun *
440*4882a593Smuzhiyun * get the RSS key per VSI
441*4882a593Smuzhiyun **/
442*4882a593Smuzhiyun static enum
iavf_aq_get_set_rss_key(struct iavf_hw * hw,u16 vsi_id,struct iavf_aqc_get_set_rss_key_data * key,bool set)443*4882a593Smuzhiyun iavf_status iavf_aq_get_set_rss_key(struct iavf_hw *hw, u16 vsi_id,
444*4882a593Smuzhiyun struct iavf_aqc_get_set_rss_key_data *key,
445*4882a593Smuzhiyun bool set)
446*4882a593Smuzhiyun {
447*4882a593Smuzhiyun enum iavf_status status;
448*4882a593Smuzhiyun struct iavf_aq_desc desc;
449*4882a593Smuzhiyun struct iavf_aqc_get_set_rss_key *cmd_resp =
450*4882a593Smuzhiyun (struct iavf_aqc_get_set_rss_key *)&desc.params.raw;
451*4882a593Smuzhiyun u16 key_size = sizeof(struct iavf_aqc_get_set_rss_key_data);
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun if (set)
454*4882a593Smuzhiyun iavf_fill_default_direct_cmd_desc(&desc,
455*4882a593Smuzhiyun iavf_aqc_opc_set_rss_key);
456*4882a593Smuzhiyun else
457*4882a593Smuzhiyun iavf_fill_default_direct_cmd_desc(&desc,
458*4882a593Smuzhiyun iavf_aqc_opc_get_rss_key);
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun /* Indirect command */
461*4882a593Smuzhiyun desc.flags |= cpu_to_le16((u16)IAVF_AQ_FLAG_BUF);
462*4882a593Smuzhiyun desc.flags |= cpu_to_le16((u16)IAVF_AQ_FLAG_RD);
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun cmd_resp->vsi_id =
465*4882a593Smuzhiyun cpu_to_le16((u16)((vsi_id <<
466*4882a593Smuzhiyun IAVF_AQC_SET_RSS_KEY_VSI_ID_SHIFT) &
467*4882a593Smuzhiyun IAVF_AQC_SET_RSS_KEY_VSI_ID_MASK));
468*4882a593Smuzhiyun cmd_resp->vsi_id |= cpu_to_le16((u16)IAVF_AQC_SET_RSS_KEY_VSI_VALID);
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun status = iavf_asq_send_command(hw, &desc, key, key_size, NULL);
471*4882a593Smuzhiyun
472*4882a593Smuzhiyun return status;
473*4882a593Smuzhiyun }
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun /**
476*4882a593Smuzhiyun * iavf_aq_get_rss_key
477*4882a593Smuzhiyun * @hw: pointer to the hw struct
478*4882a593Smuzhiyun * @vsi_id: vsi fw index
479*4882a593Smuzhiyun * @key: pointer to key info struct
480*4882a593Smuzhiyun *
481*4882a593Smuzhiyun **/
iavf_aq_get_rss_key(struct iavf_hw * hw,u16 vsi_id,struct iavf_aqc_get_set_rss_key_data * key)482*4882a593Smuzhiyun enum iavf_status iavf_aq_get_rss_key(struct iavf_hw *hw, u16 vsi_id,
483*4882a593Smuzhiyun struct iavf_aqc_get_set_rss_key_data *key)
484*4882a593Smuzhiyun {
485*4882a593Smuzhiyun return iavf_aq_get_set_rss_key(hw, vsi_id, key, false);
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun /**
489*4882a593Smuzhiyun * iavf_aq_set_rss_key
490*4882a593Smuzhiyun * @hw: pointer to the hw struct
491*4882a593Smuzhiyun * @vsi_id: vsi fw index
492*4882a593Smuzhiyun * @key: pointer to key info struct
493*4882a593Smuzhiyun *
494*4882a593Smuzhiyun * set the RSS key per VSI
495*4882a593Smuzhiyun **/
iavf_aq_set_rss_key(struct iavf_hw * hw,u16 vsi_id,struct iavf_aqc_get_set_rss_key_data * key)496*4882a593Smuzhiyun enum iavf_status iavf_aq_set_rss_key(struct iavf_hw *hw, u16 vsi_id,
497*4882a593Smuzhiyun struct iavf_aqc_get_set_rss_key_data *key)
498*4882a593Smuzhiyun {
499*4882a593Smuzhiyun return iavf_aq_get_set_rss_key(hw, vsi_id, key, true);
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun /* The iavf_ptype_lookup table is used to convert from the 8-bit ptype in the
503*4882a593Smuzhiyun * hardware to a bit-field that can be used by SW to more easily determine the
504*4882a593Smuzhiyun * packet type.
505*4882a593Smuzhiyun *
506*4882a593Smuzhiyun * Macros are used to shorten the table lines and make this table human
507*4882a593Smuzhiyun * readable.
508*4882a593Smuzhiyun *
509*4882a593Smuzhiyun * We store the PTYPE in the top byte of the bit field - this is just so that
510*4882a593Smuzhiyun * we can check that the table doesn't have a row missing, as the index into
511*4882a593Smuzhiyun * the table should be the PTYPE.
512*4882a593Smuzhiyun *
513*4882a593Smuzhiyun * Typical work flow:
514*4882a593Smuzhiyun *
515*4882a593Smuzhiyun * IF NOT iavf_ptype_lookup[ptype].known
516*4882a593Smuzhiyun * THEN
517*4882a593Smuzhiyun * Packet is unknown
518*4882a593Smuzhiyun * ELSE IF iavf_ptype_lookup[ptype].outer_ip == IAVF_RX_PTYPE_OUTER_IP
519*4882a593Smuzhiyun * Use the rest of the fields to look at the tunnels, inner protocols, etc
520*4882a593Smuzhiyun * ELSE
521*4882a593Smuzhiyun * Use the enum iavf_rx_l2_ptype to decode the packet type
522*4882a593Smuzhiyun * ENDIF
523*4882a593Smuzhiyun */
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun /* macro to make the table lines short */
526*4882a593Smuzhiyun #define IAVF_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
527*4882a593Smuzhiyun { PTYPE, \
528*4882a593Smuzhiyun 1, \
529*4882a593Smuzhiyun IAVF_RX_PTYPE_OUTER_##OUTER_IP, \
530*4882a593Smuzhiyun IAVF_RX_PTYPE_OUTER_##OUTER_IP_VER, \
531*4882a593Smuzhiyun IAVF_RX_PTYPE_##OUTER_FRAG, \
532*4882a593Smuzhiyun IAVF_RX_PTYPE_TUNNEL_##T, \
533*4882a593Smuzhiyun IAVF_RX_PTYPE_TUNNEL_END_##TE, \
534*4882a593Smuzhiyun IAVF_RX_PTYPE_##TEF, \
535*4882a593Smuzhiyun IAVF_RX_PTYPE_INNER_PROT_##I, \
536*4882a593Smuzhiyun IAVF_RX_PTYPE_PAYLOAD_LAYER_##PL }
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun #define IAVF_PTT_UNUSED_ENTRY(PTYPE) \
539*4882a593Smuzhiyun { PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
540*4882a593Smuzhiyun
541*4882a593Smuzhiyun /* shorter macros makes the table fit but are terse */
542*4882a593Smuzhiyun #define IAVF_RX_PTYPE_NOF IAVF_RX_PTYPE_NOT_FRAG
543*4882a593Smuzhiyun #define IAVF_RX_PTYPE_FRG IAVF_RX_PTYPE_FRAG
544*4882a593Smuzhiyun #define IAVF_RX_PTYPE_INNER_PROT_TS IAVF_RX_PTYPE_INNER_PROT_TIMESYNC
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun /* Lookup table mapping the HW PTYPE to the bit field for decoding */
547*4882a593Smuzhiyun struct iavf_rx_ptype_decoded iavf_ptype_lookup[] = {
548*4882a593Smuzhiyun /* L2 Packet types */
549*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(0),
550*4882a593Smuzhiyun IAVF_PTT(1, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
551*4882a593Smuzhiyun IAVF_PTT(2, L2, NONE, NOF, NONE, NONE, NOF, TS, PAY2),
552*4882a593Smuzhiyun IAVF_PTT(3, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
553*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(4),
554*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(5),
555*4882a593Smuzhiyun IAVF_PTT(6, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
556*4882a593Smuzhiyun IAVF_PTT(7, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
557*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(8),
558*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(9),
559*4882a593Smuzhiyun IAVF_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
560*4882a593Smuzhiyun IAVF_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
561*4882a593Smuzhiyun IAVF_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
562*4882a593Smuzhiyun IAVF_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
563*4882a593Smuzhiyun IAVF_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
564*4882a593Smuzhiyun IAVF_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
565*4882a593Smuzhiyun IAVF_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
566*4882a593Smuzhiyun IAVF_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
567*4882a593Smuzhiyun IAVF_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
568*4882a593Smuzhiyun IAVF_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
569*4882a593Smuzhiyun IAVF_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
570*4882a593Smuzhiyun IAVF_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun /* Non Tunneled IPv4 */
573*4882a593Smuzhiyun IAVF_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
574*4882a593Smuzhiyun IAVF_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
575*4882a593Smuzhiyun IAVF_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP, PAY4),
576*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(25),
577*4882a593Smuzhiyun IAVF_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP, PAY4),
578*4882a593Smuzhiyun IAVF_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
579*4882a593Smuzhiyun IAVF_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun /* IPv4 --> IPv4 */
582*4882a593Smuzhiyun IAVF_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
583*4882a593Smuzhiyun IAVF_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
584*4882a593Smuzhiyun IAVF_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
585*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(32),
586*4882a593Smuzhiyun IAVF_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
587*4882a593Smuzhiyun IAVF_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
588*4882a593Smuzhiyun IAVF_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun /* IPv4 --> IPv6 */
591*4882a593Smuzhiyun IAVF_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
592*4882a593Smuzhiyun IAVF_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
593*4882a593Smuzhiyun IAVF_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
594*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(39),
595*4882a593Smuzhiyun IAVF_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
596*4882a593Smuzhiyun IAVF_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
597*4882a593Smuzhiyun IAVF_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun /* IPv4 --> GRE/NAT */
600*4882a593Smuzhiyun IAVF_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
601*4882a593Smuzhiyun
602*4882a593Smuzhiyun /* IPv4 --> GRE/NAT --> IPv4 */
603*4882a593Smuzhiyun IAVF_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
604*4882a593Smuzhiyun IAVF_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
605*4882a593Smuzhiyun IAVF_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
606*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(47),
607*4882a593Smuzhiyun IAVF_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
608*4882a593Smuzhiyun IAVF_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
609*4882a593Smuzhiyun IAVF_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun /* IPv4 --> GRE/NAT --> IPv6 */
612*4882a593Smuzhiyun IAVF_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
613*4882a593Smuzhiyun IAVF_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
614*4882a593Smuzhiyun IAVF_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
615*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(54),
616*4882a593Smuzhiyun IAVF_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
617*4882a593Smuzhiyun IAVF_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
618*4882a593Smuzhiyun IAVF_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
619*4882a593Smuzhiyun
620*4882a593Smuzhiyun /* IPv4 --> GRE/NAT --> MAC */
621*4882a593Smuzhiyun IAVF_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
622*4882a593Smuzhiyun
623*4882a593Smuzhiyun /* IPv4 --> GRE/NAT --> MAC --> IPv4 */
624*4882a593Smuzhiyun IAVF_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
625*4882a593Smuzhiyun IAVF_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
626*4882a593Smuzhiyun IAVF_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
627*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(62),
628*4882a593Smuzhiyun IAVF_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
629*4882a593Smuzhiyun IAVF_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
630*4882a593Smuzhiyun IAVF_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
631*4882a593Smuzhiyun
632*4882a593Smuzhiyun /* IPv4 --> GRE/NAT -> MAC --> IPv6 */
633*4882a593Smuzhiyun IAVF_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
634*4882a593Smuzhiyun IAVF_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
635*4882a593Smuzhiyun IAVF_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
636*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(69),
637*4882a593Smuzhiyun IAVF_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
638*4882a593Smuzhiyun IAVF_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
639*4882a593Smuzhiyun IAVF_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
640*4882a593Smuzhiyun
641*4882a593Smuzhiyun /* IPv4 --> GRE/NAT --> MAC/VLAN */
642*4882a593Smuzhiyun IAVF_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
643*4882a593Smuzhiyun
644*4882a593Smuzhiyun /* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
645*4882a593Smuzhiyun IAVF_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
646*4882a593Smuzhiyun IAVF_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
647*4882a593Smuzhiyun IAVF_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
648*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(77),
649*4882a593Smuzhiyun IAVF_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
650*4882a593Smuzhiyun IAVF_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
651*4882a593Smuzhiyun IAVF_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun /* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
654*4882a593Smuzhiyun IAVF_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
655*4882a593Smuzhiyun IAVF_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
656*4882a593Smuzhiyun IAVF_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
657*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(84),
658*4882a593Smuzhiyun IAVF_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
659*4882a593Smuzhiyun IAVF_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
660*4882a593Smuzhiyun IAVF_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
661*4882a593Smuzhiyun
662*4882a593Smuzhiyun /* Non Tunneled IPv6 */
663*4882a593Smuzhiyun IAVF_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
664*4882a593Smuzhiyun IAVF_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
665*4882a593Smuzhiyun IAVF_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY3),
666*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(91),
667*4882a593Smuzhiyun IAVF_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4),
668*4882a593Smuzhiyun IAVF_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
669*4882a593Smuzhiyun IAVF_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun /* IPv6 --> IPv4 */
672*4882a593Smuzhiyun IAVF_PTT(95, IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
673*4882a593Smuzhiyun IAVF_PTT(96, IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
674*4882a593Smuzhiyun IAVF_PTT(97, IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
675*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(98),
676*4882a593Smuzhiyun IAVF_PTT(99, IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
677*4882a593Smuzhiyun IAVF_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
678*4882a593Smuzhiyun IAVF_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun /* IPv6 --> IPv6 */
681*4882a593Smuzhiyun IAVF_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
682*4882a593Smuzhiyun IAVF_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
683*4882a593Smuzhiyun IAVF_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
684*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(105),
685*4882a593Smuzhiyun IAVF_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
686*4882a593Smuzhiyun IAVF_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
687*4882a593Smuzhiyun IAVF_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
688*4882a593Smuzhiyun
689*4882a593Smuzhiyun /* IPv6 --> GRE/NAT */
690*4882a593Smuzhiyun IAVF_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
691*4882a593Smuzhiyun
692*4882a593Smuzhiyun /* IPv6 --> GRE/NAT -> IPv4 */
693*4882a593Smuzhiyun IAVF_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
694*4882a593Smuzhiyun IAVF_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
695*4882a593Smuzhiyun IAVF_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
696*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(113),
697*4882a593Smuzhiyun IAVF_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
698*4882a593Smuzhiyun IAVF_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
699*4882a593Smuzhiyun IAVF_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun /* IPv6 --> GRE/NAT -> IPv6 */
702*4882a593Smuzhiyun IAVF_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
703*4882a593Smuzhiyun IAVF_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
704*4882a593Smuzhiyun IAVF_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
705*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(120),
706*4882a593Smuzhiyun IAVF_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
707*4882a593Smuzhiyun IAVF_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
708*4882a593Smuzhiyun IAVF_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
709*4882a593Smuzhiyun
710*4882a593Smuzhiyun /* IPv6 --> GRE/NAT -> MAC */
711*4882a593Smuzhiyun IAVF_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun /* IPv6 --> GRE/NAT -> MAC -> IPv4 */
714*4882a593Smuzhiyun IAVF_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
715*4882a593Smuzhiyun IAVF_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
716*4882a593Smuzhiyun IAVF_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
717*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(128),
718*4882a593Smuzhiyun IAVF_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
719*4882a593Smuzhiyun IAVF_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
720*4882a593Smuzhiyun IAVF_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
721*4882a593Smuzhiyun
722*4882a593Smuzhiyun /* IPv6 --> GRE/NAT -> MAC -> IPv6 */
723*4882a593Smuzhiyun IAVF_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
724*4882a593Smuzhiyun IAVF_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
725*4882a593Smuzhiyun IAVF_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
726*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(135),
727*4882a593Smuzhiyun IAVF_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
728*4882a593Smuzhiyun IAVF_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
729*4882a593Smuzhiyun IAVF_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun /* IPv6 --> GRE/NAT -> MAC/VLAN */
732*4882a593Smuzhiyun IAVF_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
733*4882a593Smuzhiyun
734*4882a593Smuzhiyun /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
735*4882a593Smuzhiyun IAVF_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
736*4882a593Smuzhiyun IAVF_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
737*4882a593Smuzhiyun IAVF_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
738*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(143),
739*4882a593Smuzhiyun IAVF_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
740*4882a593Smuzhiyun IAVF_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
741*4882a593Smuzhiyun IAVF_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
742*4882a593Smuzhiyun
743*4882a593Smuzhiyun /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
744*4882a593Smuzhiyun IAVF_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
745*4882a593Smuzhiyun IAVF_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
746*4882a593Smuzhiyun IAVF_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
747*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(150),
748*4882a593Smuzhiyun IAVF_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
749*4882a593Smuzhiyun IAVF_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
750*4882a593Smuzhiyun IAVF_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun /* unused entries */
753*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(154),
754*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(155),
755*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(156),
756*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(157),
757*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(158),
758*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(159),
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(160),
761*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(161),
762*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(162),
763*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(163),
764*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(164),
765*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(165),
766*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(166),
767*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(167),
768*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(168),
769*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(169),
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(170),
772*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(171),
773*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(172),
774*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(173),
775*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(174),
776*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(175),
777*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(176),
778*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(177),
779*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(178),
780*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(179),
781*4882a593Smuzhiyun
782*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(180),
783*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(181),
784*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(182),
785*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(183),
786*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(184),
787*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(185),
788*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(186),
789*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(187),
790*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(188),
791*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(189),
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(190),
794*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(191),
795*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(192),
796*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(193),
797*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(194),
798*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(195),
799*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(196),
800*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(197),
801*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(198),
802*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(199),
803*4882a593Smuzhiyun
804*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(200),
805*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(201),
806*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(202),
807*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(203),
808*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(204),
809*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(205),
810*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(206),
811*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(207),
812*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(208),
813*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(209),
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(210),
816*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(211),
817*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(212),
818*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(213),
819*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(214),
820*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(215),
821*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(216),
822*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(217),
823*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(218),
824*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(219),
825*4882a593Smuzhiyun
826*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(220),
827*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(221),
828*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(222),
829*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(223),
830*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(224),
831*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(225),
832*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(226),
833*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(227),
834*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(228),
835*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(229),
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(230),
838*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(231),
839*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(232),
840*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(233),
841*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(234),
842*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(235),
843*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(236),
844*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(237),
845*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(238),
846*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(239),
847*4882a593Smuzhiyun
848*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(240),
849*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(241),
850*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(242),
851*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(243),
852*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(244),
853*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(245),
854*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(246),
855*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(247),
856*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(248),
857*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(249),
858*4882a593Smuzhiyun
859*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(250),
860*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(251),
861*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(252),
862*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(253),
863*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(254),
864*4882a593Smuzhiyun IAVF_PTT_UNUSED_ENTRY(255)
865*4882a593Smuzhiyun };
866*4882a593Smuzhiyun
867*4882a593Smuzhiyun /**
868*4882a593Smuzhiyun * iavf_aq_send_msg_to_pf
869*4882a593Smuzhiyun * @hw: pointer to the hardware structure
870*4882a593Smuzhiyun * @v_opcode: opcodes for VF-PF communication
871*4882a593Smuzhiyun * @v_retval: return error code
872*4882a593Smuzhiyun * @msg: pointer to the msg buffer
873*4882a593Smuzhiyun * @msglen: msg length
874*4882a593Smuzhiyun * @cmd_details: pointer to command details
875*4882a593Smuzhiyun *
876*4882a593Smuzhiyun * Send message to PF driver using admin queue. By default, this message
877*4882a593Smuzhiyun * is sent asynchronously, i.e. iavf_asq_send_command() does not wait for
878*4882a593Smuzhiyun * completion before returning.
879*4882a593Smuzhiyun **/
iavf_aq_send_msg_to_pf(struct iavf_hw * hw,enum virtchnl_ops v_opcode,enum iavf_status v_retval,u8 * msg,u16 msglen,struct iavf_asq_cmd_details * cmd_details)880*4882a593Smuzhiyun enum iavf_status iavf_aq_send_msg_to_pf(struct iavf_hw *hw,
881*4882a593Smuzhiyun enum virtchnl_ops v_opcode,
882*4882a593Smuzhiyun enum iavf_status v_retval,
883*4882a593Smuzhiyun u8 *msg, u16 msglen,
884*4882a593Smuzhiyun struct iavf_asq_cmd_details *cmd_details)
885*4882a593Smuzhiyun {
886*4882a593Smuzhiyun struct iavf_asq_cmd_details details;
887*4882a593Smuzhiyun struct iavf_aq_desc desc;
888*4882a593Smuzhiyun enum iavf_status status;
889*4882a593Smuzhiyun
890*4882a593Smuzhiyun iavf_fill_default_direct_cmd_desc(&desc, iavf_aqc_opc_send_msg_to_pf);
891*4882a593Smuzhiyun desc.flags |= cpu_to_le16((u16)IAVF_AQ_FLAG_SI);
892*4882a593Smuzhiyun desc.cookie_high = cpu_to_le32(v_opcode);
893*4882a593Smuzhiyun desc.cookie_low = cpu_to_le32(v_retval);
894*4882a593Smuzhiyun if (msglen) {
895*4882a593Smuzhiyun desc.flags |= cpu_to_le16((u16)(IAVF_AQ_FLAG_BUF
896*4882a593Smuzhiyun | IAVF_AQ_FLAG_RD));
897*4882a593Smuzhiyun if (msglen > IAVF_AQ_LARGE_BUF)
898*4882a593Smuzhiyun desc.flags |= cpu_to_le16((u16)IAVF_AQ_FLAG_LB);
899*4882a593Smuzhiyun desc.datalen = cpu_to_le16(msglen);
900*4882a593Smuzhiyun }
901*4882a593Smuzhiyun if (!cmd_details) {
902*4882a593Smuzhiyun memset(&details, 0, sizeof(details));
903*4882a593Smuzhiyun details.async = true;
904*4882a593Smuzhiyun cmd_details = &details;
905*4882a593Smuzhiyun }
906*4882a593Smuzhiyun status = iavf_asq_send_command(hw, &desc, msg, msglen, cmd_details);
907*4882a593Smuzhiyun return status;
908*4882a593Smuzhiyun }
909*4882a593Smuzhiyun
910*4882a593Smuzhiyun /**
911*4882a593Smuzhiyun * iavf_vf_parse_hw_config
912*4882a593Smuzhiyun * @hw: pointer to the hardware structure
913*4882a593Smuzhiyun * @msg: pointer to the virtual channel VF resource structure
914*4882a593Smuzhiyun *
915*4882a593Smuzhiyun * Given a VF resource message from the PF, populate the hw struct
916*4882a593Smuzhiyun * with appropriate information.
917*4882a593Smuzhiyun **/
iavf_vf_parse_hw_config(struct iavf_hw * hw,struct virtchnl_vf_resource * msg)918*4882a593Smuzhiyun void iavf_vf_parse_hw_config(struct iavf_hw *hw,
919*4882a593Smuzhiyun struct virtchnl_vf_resource *msg)
920*4882a593Smuzhiyun {
921*4882a593Smuzhiyun struct virtchnl_vsi_resource *vsi_res;
922*4882a593Smuzhiyun int i;
923*4882a593Smuzhiyun
924*4882a593Smuzhiyun vsi_res = &msg->vsi_res[0];
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun hw->dev_caps.num_vsis = msg->num_vsis;
927*4882a593Smuzhiyun hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
928*4882a593Smuzhiyun hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
929*4882a593Smuzhiyun hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
930*4882a593Smuzhiyun hw->dev_caps.dcb = msg->vf_cap_flags &
931*4882a593Smuzhiyun VIRTCHNL_VF_OFFLOAD_L2;
932*4882a593Smuzhiyun hw->dev_caps.fcoe = 0;
933*4882a593Smuzhiyun for (i = 0; i < msg->num_vsis; i++) {
934*4882a593Smuzhiyun if (vsi_res->vsi_type == VIRTCHNL_VSI_SRIOV) {
935*4882a593Smuzhiyun ether_addr_copy(hw->mac.perm_addr,
936*4882a593Smuzhiyun vsi_res->default_mac_addr);
937*4882a593Smuzhiyun ether_addr_copy(hw->mac.addr,
938*4882a593Smuzhiyun vsi_res->default_mac_addr);
939*4882a593Smuzhiyun }
940*4882a593Smuzhiyun vsi_res++;
941*4882a593Smuzhiyun }
942*4882a593Smuzhiyun }
943*4882a593Smuzhiyun
944*4882a593Smuzhiyun /**
945*4882a593Smuzhiyun * iavf_vf_reset
946*4882a593Smuzhiyun * @hw: pointer to the hardware structure
947*4882a593Smuzhiyun *
948*4882a593Smuzhiyun * Send a VF_RESET message to the PF. Does not wait for response from PF
949*4882a593Smuzhiyun * as none will be forthcoming. Immediately after calling this function,
950*4882a593Smuzhiyun * the admin queue should be shut down and (optionally) reinitialized.
951*4882a593Smuzhiyun **/
iavf_vf_reset(struct iavf_hw * hw)952*4882a593Smuzhiyun enum iavf_status iavf_vf_reset(struct iavf_hw *hw)
953*4882a593Smuzhiyun {
954*4882a593Smuzhiyun return iavf_aq_send_msg_to_pf(hw, VIRTCHNL_OP_RESET_VF,
955*4882a593Smuzhiyun 0, NULL, 0, NULL);
956*4882a593Smuzhiyun }
957