xref: /linux/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c (revision 55d0969c451159cff86949b38c39171cab962069)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2018-2023, Intel Corporation. */
3 
4 /* flow director ethtool support for ice */
5 
6 #include "ice.h"
7 #include "ice_lib.h"
8 #include "ice_fdir.h"
9 #include "ice_flow.h"
10 
11 static struct in6_addr full_ipv6_addr_mask = {
12 	.in6_u = {
13 		.u6_addr8 = {
14 			0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
15 			0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
16 		}
17 	}
18 };
19 
20 static struct in6_addr zero_ipv6_addr_mask = {
21 	.in6_u = {
22 		.u6_addr8 = {
23 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
24 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
25 		}
26 	}
27 };
28 
29 /* calls to ice_flow_add_prof require the number of segments in the array
30  * for segs_cnt. In this code that is one more than the index.
31  */
32 #define TNL_SEG_CNT(_TNL_) ((_TNL_) + 1)
33 
34 /**
35  * ice_fltr_to_ethtool_flow - convert filter type values to ethtool
36  * flow type values
37  * @flow: filter type to be converted
38  *
39  * Returns the corresponding ethtool flow type.
40  */
41 static int ice_fltr_to_ethtool_flow(enum ice_fltr_ptype flow)
42 {
43 	switch (flow) {
44 	case ICE_FLTR_PTYPE_NONF_ETH:
45 		return ETHER_FLOW;
46 	case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
47 		return TCP_V4_FLOW;
48 	case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
49 		return UDP_V4_FLOW;
50 	case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
51 		return SCTP_V4_FLOW;
52 	case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
53 		return IPV4_USER_FLOW;
54 	case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
55 		return TCP_V6_FLOW;
56 	case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
57 		return UDP_V6_FLOW;
58 	case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
59 		return SCTP_V6_FLOW;
60 	case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
61 		return IPV6_USER_FLOW;
62 	default:
63 		/* 0 is undefined ethtool flow */
64 		return 0;
65 	}
66 }
67 
68 /**
69  * ice_ethtool_flow_to_fltr - convert ethtool flow type to filter enum
70  * @eth: Ethtool flow type to be converted
71  *
72  * Returns flow enum
73  */
74 static enum ice_fltr_ptype ice_ethtool_flow_to_fltr(int eth)
75 {
76 	switch (eth) {
77 	case ETHER_FLOW:
78 		return ICE_FLTR_PTYPE_NONF_ETH;
79 	case TCP_V4_FLOW:
80 		return ICE_FLTR_PTYPE_NONF_IPV4_TCP;
81 	case UDP_V4_FLOW:
82 		return ICE_FLTR_PTYPE_NONF_IPV4_UDP;
83 	case SCTP_V4_FLOW:
84 		return ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
85 	case IPV4_USER_FLOW:
86 		return ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
87 	case TCP_V6_FLOW:
88 		return ICE_FLTR_PTYPE_NONF_IPV6_TCP;
89 	case UDP_V6_FLOW:
90 		return ICE_FLTR_PTYPE_NONF_IPV6_UDP;
91 	case SCTP_V6_FLOW:
92 		return ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
93 	case IPV6_USER_FLOW:
94 		return ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
95 	default:
96 		return ICE_FLTR_PTYPE_NONF_NONE;
97 	}
98 }
99 
100 /**
101  * ice_is_mask_valid - check mask field set
102  * @mask: full mask to check
103  * @field: field for which mask should be valid
104  *
105  * If the mask is fully set return true. If it is not valid for field return
106  * false.
107  */
108 static bool ice_is_mask_valid(u64 mask, u64 field)
109 {
110 	return (mask & field) == field;
111 }
112 
113 /**
114  * ice_get_ethtool_fdir_entry - fill ethtool structure with fdir filter data
115  * @hw: hardware structure that contains filter list
116  * @cmd: ethtool command data structure to receive the filter data
117  *
118  * Returns 0 on success and -EINVAL on failure
119  */
120 int ice_get_ethtool_fdir_entry(struct ice_hw *hw, struct ethtool_rxnfc *cmd)
121 {
122 	struct ethtool_rx_flow_spec *fsp;
123 	struct ice_fdir_fltr *rule;
124 	int ret = 0;
125 	u16 idx;
126 
127 	fsp = (struct ethtool_rx_flow_spec *)&cmd->fs;
128 
129 	mutex_lock(&hw->fdir_fltr_lock);
130 
131 	rule = ice_fdir_find_fltr_by_idx(hw, fsp->location);
132 
133 	if (!rule || fsp->location != rule->fltr_id) {
134 		ret = -EINVAL;
135 		goto release_lock;
136 	}
137 
138 	fsp->flow_type = ice_fltr_to_ethtool_flow(rule->flow_type);
139 
140 	memset(&fsp->m_u, 0, sizeof(fsp->m_u));
141 	memset(&fsp->m_ext, 0, sizeof(fsp->m_ext));
142 
143 	switch (fsp->flow_type) {
144 	case ETHER_FLOW:
145 		fsp->h_u.ether_spec = rule->eth;
146 		fsp->m_u.ether_spec = rule->eth_mask;
147 		break;
148 	case IPV4_USER_FLOW:
149 		fsp->h_u.usr_ip4_spec.ip_ver = ETH_RX_NFC_IP4;
150 		fsp->h_u.usr_ip4_spec.proto = 0;
151 		fsp->h_u.usr_ip4_spec.l4_4_bytes = rule->ip.v4.l4_header;
152 		fsp->h_u.usr_ip4_spec.tos = rule->ip.v4.tos;
153 		fsp->h_u.usr_ip4_spec.ip4src = rule->ip.v4.src_ip;
154 		fsp->h_u.usr_ip4_spec.ip4dst = rule->ip.v4.dst_ip;
155 		fsp->m_u.usr_ip4_spec.ip4src = rule->mask.v4.src_ip;
156 		fsp->m_u.usr_ip4_spec.ip4dst = rule->mask.v4.dst_ip;
157 		fsp->m_u.usr_ip4_spec.ip_ver = 0xFF;
158 		fsp->m_u.usr_ip4_spec.proto = 0;
159 		fsp->m_u.usr_ip4_spec.l4_4_bytes = rule->mask.v4.l4_header;
160 		fsp->m_u.usr_ip4_spec.tos = rule->mask.v4.tos;
161 		break;
162 	case TCP_V4_FLOW:
163 	case UDP_V4_FLOW:
164 	case SCTP_V4_FLOW:
165 		fsp->h_u.tcp_ip4_spec.psrc = rule->ip.v4.src_port;
166 		fsp->h_u.tcp_ip4_spec.pdst = rule->ip.v4.dst_port;
167 		fsp->h_u.tcp_ip4_spec.ip4src = rule->ip.v4.src_ip;
168 		fsp->h_u.tcp_ip4_spec.ip4dst = rule->ip.v4.dst_ip;
169 		fsp->m_u.tcp_ip4_spec.psrc = rule->mask.v4.src_port;
170 		fsp->m_u.tcp_ip4_spec.pdst = rule->mask.v4.dst_port;
171 		fsp->m_u.tcp_ip4_spec.ip4src = rule->mask.v4.src_ip;
172 		fsp->m_u.tcp_ip4_spec.ip4dst = rule->mask.v4.dst_ip;
173 		break;
174 	case IPV6_USER_FLOW:
175 		fsp->h_u.usr_ip6_spec.l4_4_bytes = rule->ip.v6.l4_header;
176 		fsp->h_u.usr_ip6_spec.tclass = rule->ip.v6.tc;
177 		fsp->h_u.usr_ip6_spec.l4_proto = rule->ip.v6.proto;
178 		memcpy(fsp->h_u.tcp_ip6_spec.ip6src, rule->ip.v6.src_ip,
179 		       sizeof(struct in6_addr));
180 		memcpy(fsp->h_u.tcp_ip6_spec.ip6dst, rule->ip.v6.dst_ip,
181 		       sizeof(struct in6_addr));
182 		memcpy(fsp->m_u.tcp_ip6_spec.ip6src, rule->mask.v6.src_ip,
183 		       sizeof(struct in6_addr));
184 		memcpy(fsp->m_u.tcp_ip6_spec.ip6dst, rule->mask.v6.dst_ip,
185 		       sizeof(struct in6_addr));
186 		fsp->m_u.usr_ip6_spec.l4_4_bytes = rule->mask.v6.l4_header;
187 		fsp->m_u.usr_ip6_spec.tclass = rule->mask.v6.tc;
188 		fsp->m_u.usr_ip6_spec.l4_proto = rule->mask.v6.proto;
189 		break;
190 	case TCP_V6_FLOW:
191 	case UDP_V6_FLOW:
192 	case SCTP_V6_FLOW:
193 		memcpy(fsp->h_u.tcp_ip6_spec.ip6src, rule->ip.v6.src_ip,
194 		       sizeof(struct in6_addr));
195 		memcpy(fsp->h_u.tcp_ip6_spec.ip6dst, rule->ip.v6.dst_ip,
196 		       sizeof(struct in6_addr));
197 		fsp->h_u.tcp_ip6_spec.psrc = rule->ip.v6.src_port;
198 		fsp->h_u.tcp_ip6_spec.pdst = rule->ip.v6.dst_port;
199 		memcpy(fsp->m_u.tcp_ip6_spec.ip6src,
200 		       rule->mask.v6.src_ip,
201 		       sizeof(struct in6_addr));
202 		memcpy(fsp->m_u.tcp_ip6_spec.ip6dst,
203 		       rule->mask.v6.dst_ip,
204 		       sizeof(struct in6_addr));
205 		fsp->m_u.tcp_ip6_spec.psrc = rule->mask.v6.src_port;
206 		fsp->m_u.tcp_ip6_spec.pdst = rule->mask.v6.dst_port;
207 		fsp->h_u.tcp_ip6_spec.tclass = rule->ip.v6.tc;
208 		fsp->m_u.tcp_ip6_spec.tclass = rule->mask.v6.tc;
209 		break;
210 	default:
211 		break;
212 	}
213 
214 	if (rule->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT)
215 		fsp->ring_cookie = RX_CLS_FLOW_DISC;
216 	else
217 		fsp->ring_cookie = rule->orig_q_index;
218 
219 	idx = ice_ethtool_flow_to_fltr(fsp->flow_type);
220 	if (idx == ICE_FLTR_PTYPE_NONF_NONE) {
221 		dev_err(ice_hw_to_dev(hw), "Missing input index for flow_type %d\n",
222 			rule->flow_type);
223 		ret = -EINVAL;
224 	}
225 
226 release_lock:
227 	mutex_unlock(&hw->fdir_fltr_lock);
228 	return ret;
229 }
230 
231 /**
232  * ice_get_fdir_fltr_ids - fill buffer with filter IDs of active filters
233  * @hw: hardware structure containing the filter list
234  * @cmd: ethtool command data structure
235  * @rule_locs: ethtool array passed in from OS to receive filter IDs
236  *
237  * Returns 0 as expected for success by ethtool
238  */
239 int
240 ice_get_fdir_fltr_ids(struct ice_hw *hw, struct ethtool_rxnfc *cmd,
241 		      u32 *rule_locs)
242 {
243 	struct ice_fdir_fltr *f_rule;
244 	unsigned int cnt = 0;
245 	int val = 0;
246 
247 	/* report total rule count */
248 	cmd->data = ice_get_fdir_cnt_all(hw);
249 
250 	mutex_lock(&hw->fdir_fltr_lock);
251 
252 	list_for_each_entry(f_rule, &hw->fdir_list_head, fltr_node) {
253 		if (cnt == cmd->rule_cnt) {
254 			val = -EMSGSIZE;
255 			goto release_lock;
256 		}
257 		rule_locs[cnt] = f_rule->fltr_id;
258 		cnt++;
259 	}
260 
261 release_lock:
262 	mutex_unlock(&hw->fdir_fltr_lock);
263 	if (!val)
264 		cmd->rule_cnt = cnt;
265 	return val;
266 }
267 
268 /**
269  * ice_fdir_remap_entries - update the FDir entries in profile
270  * @prof: FDir structure pointer
271  * @tun: tunneled or non-tunneled packet
272  * @idx: FDir entry index
273  */
274 static void
275 ice_fdir_remap_entries(struct ice_fd_hw_prof *prof, int tun, int idx)
276 {
277 	if (idx != prof->cnt && tun < ICE_FD_HW_SEG_MAX) {
278 		int i;
279 
280 		for (i = idx; i < (prof->cnt - 1); i++) {
281 			u64 old_entry_h;
282 
283 			old_entry_h = prof->entry_h[i + 1][tun];
284 			prof->entry_h[i][tun] = old_entry_h;
285 			prof->vsi_h[i] = prof->vsi_h[i + 1];
286 		}
287 
288 		prof->entry_h[i][tun] = 0;
289 		prof->vsi_h[i] = 0;
290 	}
291 }
292 
293 /**
294  * ice_fdir_rem_adq_chnl - remove an ADQ channel from HW filter rules
295  * @hw: hardware structure containing filter list
296  * @vsi_idx: VSI handle
297  */
298 void ice_fdir_rem_adq_chnl(struct ice_hw *hw, u16 vsi_idx)
299 {
300 	int status, flow;
301 
302 	if (!hw->fdir_prof)
303 		return;
304 
305 	for (flow = 0; flow < ICE_FLTR_PTYPE_MAX; flow++) {
306 		struct ice_fd_hw_prof *prof = hw->fdir_prof[flow];
307 		int tun, i;
308 
309 		if (!prof || !prof->cnt)
310 			continue;
311 
312 		for (tun = 0; tun < ICE_FD_HW_SEG_MAX; tun++) {
313 			u64 prof_id = prof->prof_id[tun];
314 
315 			for (i = 0; i < prof->cnt; i++) {
316 				if (prof->vsi_h[i] != vsi_idx)
317 					continue;
318 
319 				prof->entry_h[i][tun] = 0;
320 				prof->vsi_h[i] = 0;
321 				break;
322 			}
323 
324 			/* after clearing FDir entries update the remaining */
325 			ice_fdir_remap_entries(prof, tun, i);
326 
327 			/* find flow profile corresponding to prof_id and clear
328 			 * vsi_idx from bitmap.
329 			 */
330 			status = ice_flow_rem_vsi_prof(hw, vsi_idx, prof_id);
331 			if (status) {
332 				dev_err(ice_hw_to_dev(hw), "ice_flow_rem_vsi_prof() failed status=%d\n",
333 					status);
334 			}
335 		}
336 		prof->cnt--;
337 	}
338 }
339 
340 /**
341  * ice_fdir_get_hw_prof - return the ice_fd_hw_proc associated with a flow
342  * @hw: hardware structure containing the filter list
343  * @blk: hardware block
344  * @flow: FDir flow type to release
345  */
346 static struct ice_fd_hw_prof *
347 ice_fdir_get_hw_prof(struct ice_hw *hw, enum ice_block blk, int flow)
348 {
349 	if (blk == ICE_BLK_FD && hw->fdir_prof)
350 		return hw->fdir_prof[flow];
351 
352 	return NULL;
353 }
354 
355 /**
356  * ice_fdir_erase_flow_from_hw - remove a flow from the HW profile tables
357  * @hw: hardware structure containing the filter list
358  * @blk: hardware block
359  * @flow: FDir flow type to release
360  */
361 static void
362 ice_fdir_erase_flow_from_hw(struct ice_hw *hw, enum ice_block blk, int flow)
363 {
364 	struct ice_fd_hw_prof *prof = ice_fdir_get_hw_prof(hw, blk, flow);
365 	int tun;
366 
367 	if (!prof)
368 		return;
369 
370 	for (tun = 0; tun < ICE_FD_HW_SEG_MAX; tun++) {
371 		u64 prof_id = prof->prof_id[tun];
372 		int j;
373 
374 		for (j = 0; j < prof->cnt; j++) {
375 			u16 vsi_num;
376 
377 			if (!prof->entry_h[j][tun] || !prof->vsi_h[j])
378 				continue;
379 			vsi_num = ice_get_hw_vsi_num(hw, prof->vsi_h[j]);
380 			ice_rem_prof_id_flow(hw, blk, vsi_num, prof_id);
381 			ice_flow_rem_entry(hw, blk, prof->entry_h[j][tun]);
382 			prof->entry_h[j][tun] = 0;
383 		}
384 		ice_flow_rem_prof(hw, blk, prof_id);
385 	}
386 }
387 
388 /**
389  * ice_fdir_rem_flow - release the ice_flow structures for a filter type
390  * @hw: hardware structure containing the filter list
391  * @blk: hardware block
392  * @flow_type: FDir flow type to release
393  */
394 static void
395 ice_fdir_rem_flow(struct ice_hw *hw, enum ice_block blk,
396 		  enum ice_fltr_ptype flow_type)
397 {
398 	int flow = (int)flow_type & ~FLOW_EXT;
399 	struct ice_fd_hw_prof *prof;
400 	int tun, i;
401 
402 	prof = ice_fdir_get_hw_prof(hw, blk, flow);
403 	if (!prof)
404 		return;
405 
406 	ice_fdir_erase_flow_from_hw(hw, blk, flow);
407 	for (i = 0; i < prof->cnt; i++)
408 		prof->vsi_h[i] = 0;
409 	for (tun = 0; tun < ICE_FD_HW_SEG_MAX; tun++) {
410 		if (!prof->fdir_seg[tun])
411 			continue;
412 		devm_kfree(ice_hw_to_dev(hw), prof->fdir_seg[tun]);
413 		prof->fdir_seg[tun] = NULL;
414 	}
415 	prof->cnt = 0;
416 }
417 
418 /**
419  * ice_fdir_release_flows - release all flows in use for later replay
420  * @hw: pointer to HW instance
421  */
422 void ice_fdir_release_flows(struct ice_hw *hw)
423 {
424 	int flow;
425 
426 	/* release Flow Director HW table entries */
427 	for (flow = 0; flow < ICE_FLTR_PTYPE_MAX; flow++)
428 		ice_fdir_erase_flow_from_hw(hw, ICE_BLK_FD, flow);
429 }
430 
431 /**
432  * ice_fdir_replay_flows - replay HW Flow Director filter info
433  * @hw: pointer to HW instance
434  */
435 void ice_fdir_replay_flows(struct ice_hw *hw)
436 {
437 	int flow;
438 
439 	for (flow = 0; flow < ICE_FLTR_PTYPE_MAX; flow++) {
440 		int tun;
441 
442 		if (!hw->fdir_prof[flow] || !hw->fdir_prof[flow]->cnt)
443 			continue;
444 		for (tun = 0; tun < ICE_FD_HW_SEG_MAX; tun++) {
445 			struct ice_flow_prof *hw_prof;
446 			struct ice_fd_hw_prof *prof;
447 			int j;
448 
449 			prof = hw->fdir_prof[flow];
450 			ice_flow_add_prof(hw, ICE_BLK_FD, ICE_FLOW_RX,
451 					  prof->fdir_seg[tun], TNL_SEG_CNT(tun),
452 					  false, &hw_prof);
453 			for (j = 0; j < prof->cnt; j++) {
454 				enum ice_flow_priority prio;
455 				u64 entry_h = 0;
456 				int err;
457 
458 				prio = ICE_FLOW_PRIO_NORMAL;
459 				err = ice_flow_add_entry(hw, ICE_BLK_FD,
460 							 hw_prof->id,
461 							 prof->vsi_h[0],
462 							 prof->vsi_h[j],
463 							 prio, prof->fdir_seg,
464 							 &entry_h);
465 				if (err) {
466 					dev_err(ice_hw_to_dev(hw), "Could not replay Flow Director, flow type %d\n",
467 						flow);
468 					continue;
469 				}
470 				prof->prof_id[tun] = hw_prof->id;
471 				prof->entry_h[j][tun] = entry_h;
472 			}
473 		}
474 	}
475 }
476 
477 /**
478  * ice_parse_rx_flow_user_data - deconstruct user-defined data
479  * @fsp: pointer to ethtool Rx flow specification
480  * @data: pointer to userdef data structure for storage
481  *
482  * Returns 0 on success, negative error value on failure
483  */
484 static int
485 ice_parse_rx_flow_user_data(struct ethtool_rx_flow_spec *fsp,
486 			    struct ice_rx_flow_userdef *data)
487 {
488 	u64 value, mask;
489 
490 	memset(data, 0, sizeof(*data));
491 	if (!(fsp->flow_type & FLOW_EXT))
492 		return 0;
493 
494 	value = be64_to_cpu(*((__force __be64 *)fsp->h_ext.data));
495 	mask = be64_to_cpu(*((__force __be64 *)fsp->m_ext.data));
496 	if (!mask)
497 		return 0;
498 
499 #define ICE_USERDEF_FLEX_WORD_M	GENMASK_ULL(15, 0)
500 #define ICE_USERDEF_FLEX_OFFS_S	16
501 #define ICE_USERDEF_FLEX_OFFS_M	GENMASK_ULL(31, ICE_USERDEF_FLEX_OFFS_S)
502 #define ICE_USERDEF_FLEX_FLTR_M	GENMASK_ULL(31, 0)
503 
504 	/* 0x1fe is the maximum value for offsets stored in the internal
505 	 * filtering tables.
506 	 */
507 #define ICE_USERDEF_FLEX_MAX_OFFS_VAL 0x1fe
508 
509 	if (!ice_is_mask_valid(mask, ICE_USERDEF_FLEX_FLTR_M) ||
510 	    value > ICE_USERDEF_FLEX_FLTR_M)
511 		return -EINVAL;
512 
513 	data->flex_word = value & ICE_USERDEF_FLEX_WORD_M;
514 	data->flex_offset = FIELD_GET(ICE_USERDEF_FLEX_OFFS_M, value);
515 	if (data->flex_offset > ICE_USERDEF_FLEX_MAX_OFFS_VAL)
516 		return -EINVAL;
517 
518 	data->flex_fltr = true;
519 
520 	return 0;
521 }
522 
523 /**
524  * ice_fdir_num_avail_fltr - return the number of unused flow director filters
525  * @hw: pointer to hardware structure
526  * @vsi: software VSI structure
527  *
528  * There are 2 filter pools: guaranteed and best effort(shared). Each VSI can
529  * use filters from either pool. The guaranteed pool is divided between VSIs.
530  * The best effort filter pool is common to all VSIs and is a device shared
531  * resource pool. The number of filters available to this VSI is the sum of
532  * the VSIs guaranteed filter pool and the global available best effort
533  * filter pool.
534  *
535  * Returns the number of available flow director filters to this VSI
536  */
537 int ice_fdir_num_avail_fltr(struct ice_hw *hw, struct ice_vsi *vsi)
538 {
539 	u16 vsi_num = ice_get_hw_vsi_num(hw, vsi->idx);
540 	u16 num_guar;
541 	u16 num_be;
542 
543 	/* total guaranteed filters assigned to this VSI */
544 	num_guar = vsi->num_gfltr;
545 
546 	/* total global best effort filters */
547 	num_be = hw->func_caps.fd_fltr_best_effort;
548 
549 	/* Subtract the number of programmed filters from the global values */
550 	switch (hw->mac_type) {
551 	case ICE_MAC_E830:
552 		num_guar -= FIELD_GET(E830_VSIQF_FD_CNT_FD_GCNT_M,
553 				      rd32(hw, VSIQF_FD_CNT(vsi_num)));
554 		num_be -= FIELD_GET(E830_GLQF_FD_CNT_FD_BCNT_M,
555 				    rd32(hw, GLQF_FD_CNT));
556 		break;
557 	case ICE_MAC_E810:
558 	default:
559 		num_guar -= FIELD_GET(E800_VSIQF_FD_CNT_FD_GCNT_M,
560 				      rd32(hw, VSIQF_FD_CNT(vsi_num)));
561 		num_be -= FIELD_GET(E800_GLQF_FD_CNT_FD_BCNT_M,
562 				    rd32(hw, GLQF_FD_CNT));
563 	}
564 
565 	return num_guar + num_be;
566 }
567 
568 /**
569  * ice_fdir_alloc_flow_prof - allocate FDir flow profile structure(s)
570  * @hw: HW structure containing the FDir flow profile structure(s)
571  * @flow: flow type to allocate the flow profile for
572  *
573  * Allocate the fdir_prof and fdir_prof[flow] if not already created. Return 0
574  * on success and negative on error.
575  */
576 static int
577 ice_fdir_alloc_flow_prof(struct ice_hw *hw, enum ice_fltr_ptype flow)
578 {
579 	if (!hw)
580 		return -EINVAL;
581 
582 	if (!hw->fdir_prof) {
583 		hw->fdir_prof = devm_kcalloc(ice_hw_to_dev(hw),
584 					     ICE_FLTR_PTYPE_MAX,
585 					     sizeof(*hw->fdir_prof),
586 					     GFP_KERNEL);
587 		if (!hw->fdir_prof)
588 			return -ENOMEM;
589 	}
590 
591 	if (!hw->fdir_prof[flow]) {
592 		hw->fdir_prof[flow] = devm_kzalloc(ice_hw_to_dev(hw),
593 						   sizeof(**hw->fdir_prof),
594 						   GFP_KERNEL);
595 		if (!hw->fdir_prof[flow])
596 			return -ENOMEM;
597 	}
598 
599 	return 0;
600 }
601 
602 /**
603  * ice_fdir_prof_vsi_idx - find or insert a vsi_idx in structure
604  * @prof: pointer to flow director HW profile
605  * @vsi_idx: vsi_idx to locate
606  *
607  * return the index of the vsi_idx. if vsi_idx is not found insert it
608  * into the vsi_h table.
609  */
610 static u16
611 ice_fdir_prof_vsi_idx(struct ice_fd_hw_prof *prof, int vsi_idx)
612 {
613 	u16 idx = 0;
614 
615 	for (idx = 0; idx < prof->cnt; idx++)
616 		if (prof->vsi_h[idx] == vsi_idx)
617 			return idx;
618 
619 	if (idx == prof->cnt)
620 		prof->vsi_h[prof->cnt++] = vsi_idx;
621 	return idx;
622 }
623 
624 /**
625  * ice_fdir_set_hw_fltr_rule - Configure HW tables to generate a FDir rule
626  * @pf: pointer to the PF structure
627  * @seg: protocol header description pointer
628  * @flow: filter enum
629  * @tun: FDir segment to program
630  */
631 static int
632 ice_fdir_set_hw_fltr_rule(struct ice_pf *pf, struct ice_flow_seg_info *seg,
633 			  enum ice_fltr_ptype flow, enum ice_fd_hw_seg tun)
634 {
635 	struct device *dev = ice_pf_to_dev(pf);
636 	struct ice_vsi *main_vsi, *ctrl_vsi;
637 	struct ice_flow_seg_info *old_seg;
638 	struct ice_flow_prof *prof = NULL;
639 	struct ice_fd_hw_prof *hw_prof;
640 	struct ice_hw *hw = &pf->hw;
641 	u64 entry1_h = 0;
642 	u64 entry2_h = 0;
643 	bool del_last;
644 	int err;
645 	int idx;
646 
647 	main_vsi = ice_get_main_vsi(pf);
648 	if (!main_vsi)
649 		return -EINVAL;
650 
651 	ctrl_vsi = ice_get_ctrl_vsi(pf);
652 	if (!ctrl_vsi)
653 		return -EINVAL;
654 
655 	err = ice_fdir_alloc_flow_prof(hw, flow);
656 	if (err)
657 		return err;
658 
659 	hw_prof = hw->fdir_prof[flow];
660 	old_seg = hw_prof->fdir_seg[tun];
661 	if (old_seg) {
662 		/* This flow_type already has a changed input set.
663 		 * If it matches the requested input set then we are
664 		 * done. Or, if it's different then it's an error.
665 		 */
666 		if (!memcmp(old_seg, seg, sizeof(*seg)))
667 			return -EEXIST;
668 
669 		/* if there are FDir filters using this flow,
670 		 * then return error.
671 		 */
672 		if (hw->fdir_fltr_cnt[flow]) {
673 			dev_err(dev, "Failed to add filter. Flow director filters on each port must have the same input set.\n");
674 			return -EINVAL;
675 		}
676 
677 		if (ice_is_arfs_using_perfect_flow(hw, flow)) {
678 			dev_err(dev, "aRFS using perfect flow type %d, cannot change input set\n",
679 				flow);
680 			return -EINVAL;
681 		}
682 
683 		/* remove HW filter definition */
684 		ice_fdir_rem_flow(hw, ICE_BLK_FD, flow);
685 	}
686 
687 	/* Adding a profile, but there is only one header supported.
688 	 * That is the final parameters are 1 header (segment), no
689 	 * actions (NULL) and zero actions 0.
690 	 */
691 	err = ice_flow_add_prof(hw, ICE_BLK_FD, ICE_FLOW_RX, seg,
692 				TNL_SEG_CNT(tun), false, &prof);
693 	if (err)
694 		return err;
695 	err = ice_flow_add_entry(hw, ICE_BLK_FD, prof->id, main_vsi->idx,
696 				 main_vsi->idx, ICE_FLOW_PRIO_NORMAL,
697 				 seg, &entry1_h);
698 	if (err)
699 		goto err_prof;
700 	err = ice_flow_add_entry(hw, ICE_BLK_FD, prof->id, main_vsi->idx,
701 				 ctrl_vsi->idx, ICE_FLOW_PRIO_NORMAL,
702 				 seg, &entry2_h);
703 	if (err)
704 		goto err_entry;
705 
706 	hw_prof->fdir_seg[tun] = seg;
707 	hw_prof->prof_id[tun] = prof->id;
708 	hw_prof->entry_h[0][tun] = entry1_h;
709 	hw_prof->entry_h[1][tun] = entry2_h;
710 	hw_prof->vsi_h[0] = main_vsi->idx;
711 	hw_prof->vsi_h[1] = ctrl_vsi->idx;
712 	if (!hw_prof->cnt)
713 		hw_prof->cnt = 2;
714 
715 	for (idx = 1; idx < ICE_CHNL_MAX_TC; idx++) {
716 		u16 vsi_idx;
717 		u16 vsi_h;
718 
719 		if (!ice_is_adq_active(pf) || !main_vsi->tc_map_vsi[idx])
720 			continue;
721 
722 		entry1_h = 0;
723 		vsi_h = main_vsi->tc_map_vsi[idx]->idx;
724 		err = ice_flow_add_entry(hw, ICE_BLK_FD, prof->id,
725 					 main_vsi->idx, vsi_h,
726 					 ICE_FLOW_PRIO_NORMAL, seg,
727 					 &entry1_h);
728 		if (err) {
729 			dev_err(dev, "Could not add Channel VSI %d to flow group\n",
730 				idx);
731 			goto err_unroll;
732 		}
733 
734 		vsi_idx = ice_fdir_prof_vsi_idx(hw_prof,
735 						main_vsi->tc_map_vsi[idx]->idx);
736 		hw_prof->entry_h[vsi_idx][tun] = entry1_h;
737 	}
738 
739 	return 0;
740 
741 err_unroll:
742 	entry1_h = 0;
743 	hw_prof->fdir_seg[tun] = NULL;
744 
745 	/* The variable del_last will be used to determine when to clean up
746 	 * the VSI group data. The VSI data is not needed if there are no
747 	 * segments.
748 	 */
749 	del_last = true;
750 	for (idx = 0; idx < ICE_FD_HW_SEG_MAX; idx++)
751 		if (hw_prof->fdir_seg[idx]) {
752 			del_last = false;
753 			break;
754 		}
755 
756 	for (idx = 0; idx < hw_prof->cnt; idx++) {
757 		u16 vsi_num = ice_get_hw_vsi_num(hw, hw_prof->vsi_h[idx]);
758 
759 		if (!hw_prof->entry_h[idx][tun])
760 			continue;
761 		ice_rem_prof_id_flow(hw, ICE_BLK_FD, vsi_num, prof->id);
762 		ice_flow_rem_entry(hw, ICE_BLK_FD, hw_prof->entry_h[idx][tun]);
763 		hw_prof->entry_h[idx][tun] = 0;
764 		if (del_last)
765 			hw_prof->vsi_h[idx] = 0;
766 	}
767 	if (del_last)
768 		hw_prof->cnt = 0;
769 err_entry:
770 	ice_rem_prof_id_flow(hw, ICE_BLK_FD,
771 			     ice_get_hw_vsi_num(hw, main_vsi->idx), prof->id);
772 	ice_flow_rem_entry(hw, ICE_BLK_FD, entry1_h);
773 err_prof:
774 	ice_flow_rem_prof(hw, ICE_BLK_FD, prof->id);
775 	dev_err(dev, "Failed to add filter. Flow director filters on each port must have the same input set.\n");
776 
777 	return err;
778 }
779 
780 /**
781  * ice_set_init_fdir_seg
782  * @seg: flow segment for programming
783  * @l3_proto: ICE_FLOW_SEG_HDR_IPV4 or ICE_FLOW_SEG_HDR_IPV6
784  * @l4_proto: ICE_FLOW_SEG_HDR_TCP or ICE_FLOW_SEG_HDR_UDP
785  *
786  * Set the configuration for perfect filters to the provided flow segment for
787  * programming the HW filter. This is to be called only when initializing
788  * filters as this function it assumes no filters exist.
789  */
790 static int
791 ice_set_init_fdir_seg(struct ice_flow_seg_info *seg,
792 		      enum ice_flow_seg_hdr l3_proto,
793 		      enum ice_flow_seg_hdr l4_proto)
794 {
795 	enum ice_flow_field src_addr, dst_addr, src_port, dst_port;
796 
797 	if (!seg)
798 		return -EINVAL;
799 
800 	if (l3_proto == ICE_FLOW_SEG_HDR_IPV4) {
801 		src_addr = ICE_FLOW_FIELD_IDX_IPV4_SA;
802 		dst_addr = ICE_FLOW_FIELD_IDX_IPV4_DA;
803 	} else if (l3_proto == ICE_FLOW_SEG_HDR_IPV6) {
804 		src_addr = ICE_FLOW_FIELD_IDX_IPV6_SA;
805 		dst_addr = ICE_FLOW_FIELD_IDX_IPV6_DA;
806 	} else {
807 		return -EINVAL;
808 	}
809 
810 	if (l4_proto == ICE_FLOW_SEG_HDR_TCP) {
811 		src_port = ICE_FLOW_FIELD_IDX_TCP_SRC_PORT;
812 		dst_port = ICE_FLOW_FIELD_IDX_TCP_DST_PORT;
813 	} else if (l4_proto == ICE_FLOW_SEG_HDR_UDP) {
814 		src_port = ICE_FLOW_FIELD_IDX_UDP_SRC_PORT;
815 		dst_port = ICE_FLOW_FIELD_IDX_UDP_DST_PORT;
816 	} else {
817 		return -EINVAL;
818 	}
819 
820 	ICE_FLOW_SET_HDRS(seg, l3_proto | l4_proto);
821 
822 	/* IP source address */
823 	ice_flow_set_fld(seg, src_addr, ICE_FLOW_FLD_OFF_INVAL,
824 			 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL, false);
825 
826 	/* IP destination address */
827 	ice_flow_set_fld(seg, dst_addr, ICE_FLOW_FLD_OFF_INVAL,
828 			 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL, false);
829 
830 	/* Layer 4 source port */
831 	ice_flow_set_fld(seg, src_port, ICE_FLOW_FLD_OFF_INVAL,
832 			 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL, false);
833 
834 	/* Layer 4 destination port */
835 	ice_flow_set_fld(seg, dst_port, ICE_FLOW_FLD_OFF_INVAL,
836 			 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL, false);
837 
838 	return 0;
839 }
840 
841 /**
842  * ice_create_init_fdir_rule
843  * @pf: PF structure
844  * @flow: filter enum
845  *
846  * Return error value or 0 on success.
847  */
848 static int
849 ice_create_init_fdir_rule(struct ice_pf *pf, enum ice_fltr_ptype flow)
850 {
851 	struct ice_flow_seg_info *seg, *tun_seg;
852 	struct device *dev = ice_pf_to_dev(pf);
853 	struct ice_hw *hw = &pf->hw;
854 	int ret;
855 
856 	/* if there is already a filter rule for kind return -EINVAL */
857 	if (hw->fdir_prof && hw->fdir_prof[flow] &&
858 	    hw->fdir_prof[flow]->fdir_seg[0])
859 		return -EINVAL;
860 
861 	seg = devm_kzalloc(dev, sizeof(*seg), GFP_KERNEL);
862 	if (!seg)
863 		return -ENOMEM;
864 
865 	tun_seg = devm_kcalloc(dev, ICE_FD_HW_SEG_MAX, sizeof(*tun_seg),
866 			       GFP_KERNEL);
867 	if (!tun_seg) {
868 		devm_kfree(dev, seg);
869 		return -ENOMEM;
870 	}
871 
872 	if (flow == ICE_FLTR_PTYPE_NONF_IPV4_TCP)
873 		ret = ice_set_init_fdir_seg(seg, ICE_FLOW_SEG_HDR_IPV4,
874 					    ICE_FLOW_SEG_HDR_TCP);
875 	else if (flow == ICE_FLTR_PTYPE_NONF_IPV4_UDP)
876 		ret = ice_set_init_fdir_seg(seg, ICE_FLOW_SEG_HDR_IPV4,
877 					    ICE_FLOW_SEG_HDR_UDP);
878 	else if (flow == ICE_FLTR_PTYPE_NONF_IPV6_TCP)
879 		ret = ice_set_init_fdir_seg(seg, ICE_FLOW_SEG_HDR_IPV6,
880 					    ICE_FLOW_SEG_HDR_TCP);
881 	else if (flow == ICE_FLTR_PTYPE_NONF_IPV6_UDP)
882 		ret = ice_set_init_fdir_seg(seg, ICE_FLOW_SEG_HDR_IPV6,
883 					    ICE_FLOW_SEG_HDR_UDP);
884 	else
885 		ret = -EINVAL;
886 	if (ret)
887 		goto err_exit;
888 
889 	/* add filter for outer headers */
890 	ret = ice_fdir_set_hw_fltr_rule(pf, seg, flow, ICE_FD_HW_SEG_NON_TUN);
891 	if (ret)
892 		/* could not write filter, free memory */
893 		goto err_exit;
894 
895 	/* make tunneled filter HW entries if possible */
896 	memcpy(&tun_seg[1], seg, sizeof(*seg));
897 	ret = ice_fdir_set_hw_fltr_rule(pf, tun_seg, flow, ICE_FD_HW_SEG_TUN);
898 	if (ret)
899 		/* could not write tunnel filter, but outer header filter
900 		 * exists
901 		 */
902 		devm_kfree(dev, tun_seg);
903 
904 	set_bit(flow, hw->fdir_perfect_fltr);
905 	return ret;
906 err_exit:
907 	devm_kfree(dev, tun_seg);
908 	devm_kfree(dev, seg);
909 
910 	return -EOPNOTSUPP;
911 }
912 
913 /**
914  * ice_set_fdir_ip4_seg
915  * @seg: flow segment for programming
916  * @tcp_ip4_spec: mask data from ethtool
917  * @l4_proto: Layer 4 protocol to program
918  * @perfect_fltr: only valid on success; returns true if perfect filter,
919  *		  false if not
920  *
921  * Set the mask data into the flow segment to be used to program HW
922  * table based on provided L4 protocol for IPv4
923  */
924 static int
925 ice_set_fdir_ip4_seg(struct ice_flow_seg_info *seg,
926 		     struct ethtool_tcpip4_spec *tcp_ip4_spec,
927 		     enum ice_flow_seg_hdr l4_proto, bool *perfect_fltr)
928 {
929 	enum ice_flow_field src_port, dst_port;
930 
931 	/* make sure we don't have any empty rule */
932 	if (!tcp_ip4_spec->psrc && !tcp_ip4_spec->ip4src &&
933 	    !tcp_ip4_spec->pdst && !tcp_ip4_spec->ip4dst)
934 		return -EINVAL;
935 
936 	/* filtering on TOS not supported */
937 	if (tcp_ip4_spec->tos)
938 		return -EOPNOTSUPP;
939 
940 	if (l4_proto == ICE_FLOW_SEG_HDR_TCP) {
941 		src_port = ICE_FLOW_FIELD_IDX_TCP_SRC_PORT;
942 		dst_port = ICE_FLOW_FIELD_IDX_TCP_DST_PORT;
943 	} else if (l4_proto == ICE_FLOW_SEG_HDR_UDP) {
944 		src_port = ICE_FLOW_FIELD_IDX_UDP_SRC_PORT;
945 		dst_port = ICE_FLOW_FIELD_IDX_UDP_DST_PORT;
946 	} else if (l4_proto == ICE_FLOW_SEG_HDR_SCTP) {
947 		src_port = ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT;
948 		dst_port = ICE_FLOW_FIELD_IDX_SCTP_DST_PORT;
949 	} else {
950 		return -EOPNOTSUPP;
951 	}
952 
953 	*perfect_fltr = true;
954 	ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4 | l4_proto);
955 
956 	/* IP source address */
957 	if (tcp_ip4_spec->ip4src == htonl(0xFFFFFFFF))
958 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_IPV4_SA,
959 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
960 				 ICE_FLOW_FLD_OFF_INVAL, false);
961 	else if (!tcp_ip4_spec->ip4src)
962 		*perfect_fltr = false;
963 	else
964 		return -EOPNOTSUPP;
965 
966 	/* IP destination address */
967 	if (tcp_ip4_spec->ip4dst == htonl(0xFFFFFFFF))
968 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_IPV4_DA,
969 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
970 				 ICE_FLOW_FLD_OFF_INVAL, false);
971 	else if (!tcp_ip4_spec->ip4dst)
972 		*perfect_fltr = false;
973 	else
974 		return -EOPNOTSUPP;
975 
976 	/* Layer 4 source port */
977 	if (tcp_ip4_spec->psrc == htons(0xFFFF))
978 		ice_flow_set_fld(seg, src_port, ICE_FLOW_FLD_OFF_INVAL,
979 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
980 				 false);
981 	else if (!tcp_ip4_spec->psrc)
982 		*perfect_fltr = false;
983 	else
984 		return -EOPNOTSUPP;
985 
986 	/* Layer 4 destination port */
987 	if (tcp_ip4_spec->pdst == htons(0xFFFF))
988 		ice_flow_set_fld(seg, dst_port, ICE_FLOW_FLD_OFF_INVAL,
989 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
990 				 false);
991 	else if (!tcp_ip4_spec->pdst)
992 		*perfect_fltr = false;
993 	else
994 		return -EOPNOTSUPP;
995 
996 	return 0;
997 }
998 
999 /**
1000  * ice_set_fdir_ip4_usr_seg
1001  * @seg: flow segment for programming
1002  * @usr_ip4_spec: ethtool userdef packet offset
1003  * @perfect_fltr: only valid on success; returns true if perfect filter,
1004  *		  false if not
1005  *
1006  * Set the offset data into the flow segment to be used to program HW
1007  * table for IPv4
1008  */
1009 static int
1010 ice_set_fdir_ip4_usr_seg(struct ice_flow_seg_info *seg,
1011 			 struct ethtool_usrip4_spec *usr_ip4_spec,
1012 			 bool *perfect_fltr)
1013 {
1014 	/* first 4 bytes of Layer 4 header */
1015 	if (usr_ip4_spec->l4_4_bytes)
1016 		return -EINVAL;
1017 	if (usr_ip4_spec->tos)
1018 		return -EINVAL;
1019 	if (usr_ip4_spec->ip_ver)
1020 		return -EINVAL;
1021 	/* Filtering on Layer 4 protocol not supported */
1022 	if (usr_ip4_spec->proto)
1023 		return -EOPNOTSUPP;
1024 	/* empty rules are not valid */
1025 	if (!usr_ip4_spec->ip4src && !usr_ip4_spec->ip4dst)
1026 		return -EINVAL;
1027 
1028 	*perfect_fltr = true;
1029 	ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4);
1030 
1031 	/* IP source address */
1032 	if (usr_ip4_spec->ip4src == htonl(0xFFFFFFFF))
1033 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_IPV4_SA,
1034 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
1035 				 ICE_FLOW_FLD_OFF_INVAL, false);
1036 	else if (!usr_ip4_spec->ip4src)
1037 		*perfect_fltr = false;
1038 	else
1039 		return -EOPNOTSUPP;
1040 
1041 	/* IP destination address */
1042 	if (usr_ip4_spec->ip4dst == htonl(0xFFFFFFFF))
1043 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_IPV4_DA,
1044 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
1045 				 ICE_FLOW_FLD_OFF_INVAL, false);
1046 	else if (!usr_ip4_spec->ip4dst)
1047 		*perfect_fltr = false;
1048 	else
1049 		return -EOPNOTSUPP;
1050 
1051 	return 0;
1052 }
1053 
1054 /**
1055  * ice_set_fdir_ip6_seg
1056  * @seg: flow segment for programming
1057  * @tcp_ip6_spec: mask data from ethtool
1058  * @l4_proto: Layer 4 protocol to program
1059  * @perfect_fltr: only valid on success; returns true if perfect filter,
1060  *		  false if not
1061  *
1062  * Set the mask data into the flow segment to be used to program HW
1063  * table based on provided L4 protocol for IPv6
1064  */
1065 static int
1066 ice_set_fdir_ip6_seg(struct ice_flow_seg_info *seg,
1067 		     struct ethtool_tcpip6_spec *tcp_ip6_spec,
1068 		     enum ice_flow_seg_hdr l4_proto, bool *perfect_fltr)
1069 {
1070 	enum ice_flow_field src_port, dst_port;
1071 
1072 	/* make sure we don't have any empty rule */
1073 	if (!memcmp(tcp_ip6_spec->ip6src, &zero_ipv6_addr_mask,
1074 		    sizeof(struct in6_addr)) &&
1075 	    !memcmp(tcp_ip6_spec->ip6dst, &zero_ipv6_addr_mask,
1076 		    sizeof(struct in6_addr)) &&
1077 	    !tcp_ip6_spec->psrc && !tcp_ip6_spec->pdst)
1078 		return -EINVAL;
1079 
1080 	/* filtering on TC not supported */
1081 	if (tcp_ip6_spec->tclass)
1082 		return -EOPNOTSUPP;
1083 
1084 	if (l4_proto == ICE_FLOW_SEG_HDR_TCP) {
1085 		src_port = ICE_FLOW_FIELD_IDX_TCP_SRC_PORT;
1086 		dst_port = ICE_FLOW_FIELD_IDX_TCP_DST_PORT;
1087 	} else if (l4_proto == ICE_FLOW_SEG_HDR_UDP) {
1088 		src_port = ICE_FLOW_FIELD_IDX_UDP_SRC_PORT;
1089 		dst_port = ICE_FLOW_FIELD_IDX_UDP_DST_PORT;
1090 	} else if (l4_proto == ICE_FLOW_SEG_HDR_SCTP) {
1091 		src_port = ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT;
1092 		dst_port = ICE_FLOW_FIELD_IDX_SCTP_DST_PORT;
1093 	} else {
1094 		return -EINVAL;
1095 	}
1096 
1097 	*perfect_fltr = true;
1098 	ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 | l4_proto);
1099 
1100 	if (!memcmp(tcp_ip6_spec->ip6src, &full_ipv6_addr_mask,
1101 		    sizeof(struct in6_addr)))
1102 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_IPV6_SA,
1103 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
1104 				 ICE_FLOW_FLD_OFF_INVAL, false);
1105 	else if (!memcmp(tcp_ip6_spec->ip6src, &zero_ipv6_addr_mask,
1106 			 sizeof(struct in6_addr)))
1107 		*perfect_fltr = false;
1108 	else
1109 		return -EOPNOTSUPP;
1110 
1111 	if (!memcmp(tcp_ip6_spec->ip6dst, &full_ipv6_addr_mask,
1112 		    sizeof(struct in6_addr)))
1113 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_IPV6_DA,
1114 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
1115 				 ICE_FLOW_FLD_OFF_INVAL, false);
1116 	else if (!memcmp(tcp_ip6_spec->ip6dst, &zero_ipv6_addr_mask,
1117 			 sizeof(struct in6_addr)))
1118 		*perfect_fltr = false;
1119 	else
1120 		return -EOPNOTSUPP;
1121 
1122 	/* Layer 4 source port */
1123 	if (tcp_ip6_spec->psrc == htons(0xFFFF))
1124 		ice_flow_set_fld(seg, src_port, ICE_FLOW_FLD_OFF_INVAL,
1125 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
1126 				 false);
1127 	else if (!tcp_ip6_spec->psrc)
1128 		*perfect_fltr = false;
1129 	else
1130 		return -EOPNOTSUPP;
1131 
1132 	/* Layer 4 destination port */
1133 	if (tcp_ip6_spec->pdst == htons(0xFFFF))
1134 		ice_flow_set_fld(seg, dst_port, ICE_FLOW_FLD_OFF_INVAL,
1135 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
1136 				 false);
1137 	else if (!tcp_ip6_spec->pdst)
1138 		*perfect_fltr = false;
1139 	else
1140 		return -EOPNOTSUPP;
1141 
1142 	return 0;
1143 }
1144 
1145 /**
1146  * ice_set_fdir_ip6_usr_seg
1147  * @seg: flow segment for programming
1148  * @usr_ip6_spec: ethtool userdef packet offset
1149  * @perfect_fltr: only valid on success; returns true if perfect filter,
1150  *		  false if not
1151  *
1152  * Set the offset data into the flow segment to be used to program HW
1153  * table for IPv6
1154  */
1155 static int
1156 ice_set_fdir_ip6_usr_seg(struct ice_flow_seg_info *seg,
1157 			 struct ethtool_usrip6_spec *usr_ip6_spec,
1158 			 bool *perfect_fltr)
1159 {
1160 	/* filtering on Layer 4 bytes not supported */
1161 	if (usr_ip6_spec->l4_4_bytes)
1162 		return -EOPNOTSUPP;
1163 	/* filtering on TC not supported */
1164 	if (usr_ip6_spec->tclass)
1165 		return -EOPNOTSUPP;
1166 	/* filtering on Layer 4 protocol not supported */
1167 	if (usr_ip6_spec->l4_proto)
1168 		return -EOPNOTSUPP;
1169 	/* empty rules are not valid */
1170 	if (!memcmp(usr_ip6_spec->ip6src, &zero_ipv6_addr_mask,
1171 		    sizeof(struct in6_addr)) &&
1172 	    !memcmp(usr_ip6_spec->ip6dst, &zero_ipv6_addr_mask,
1173 		    sizeof(struct in6_addr)))
1174 		return -EINVAL;
1175 
1176 	*perfect_fltr = true;
1177 	ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6);
1178 
1179 	if (!memcmp(usr_ip6_spec->ip6src, &full_ipv6_addr_mask,
1180 		    sizeof(struct in6_addr)))
1181 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_IPV6_SA,
1182 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
1183 				 ICE_FLOW_FLD_OFF_INVAL, false);
1184 	else if (!memcmp(usr_ip6_spec->ip6src, &zero_ipv6_addr_mask,
1185 			 sizeof(struct in6_addr)))
1186 		*perfect_fltr = false;
1187 	else
1188 		return -EOPNOTSUPP;
1189 
1190 	if (!memcmp(usr_ip6_spec->ip6dst, &full_ipv6_addr_mask,
1191 		    sizeof(struct in6_addr)))
1192 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_IPV6_DA,
1193 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
1194 				 ICE_FLOW_FLD_OFF_INVAL, false);
1195 	else if (!memcmp(usr_ip6_spec->ip6dst, &zero_ipv6_addr_mask,
1196 			 sizeof(struct in6_addr)))
1197 		*perfect_fltr = false;
1198 	else
1199 		return -EOPNOTSUPP;
1200 
1201 	return 0;
1202 }
1203 
1204 /**
1205  * ice_fdir_vlan_valid - validate VLAN data for Flow Director rule
1206  * @dev: network interface device structure
1207  * @fsp: pointer to ethtool Rx flow specification
1208  *
1209  * Return: true if vlan data is valid, false otherwise
1210  */
1211 static bool ice_fdir_vlan_valid(struct device *dev,
1212 				struct ethtool_rx_flow_spec *fsp)
1213 {
1214 	if (fsp->m_ext.vlan_etype && !eth_type_vlan(fsp->h_ext.vlan_etype))
1215 		return false;
1216 
1217 	if (fsp->m_ext.vlan_tci && ntohs(fsp->h_ext.vlan_tci) >= VLAN_N_VID)
1218 		return false;
1219 
1220 	/* proto and vlan must have vlan-etype defined */
1221 	if (fsp->m_u.ether_spec.h_proto && fsp->m_ext.vlan_tci &&
1222 	    !fsp->m_ext.vlan_etype) {
1223 		dev_warn(dev, "Filter with proto and vlan require also vlan-etype");
1224 		return false;
1225 	}
1226 
1227 	return true;
1228 }
1229 
1230 /**
1231  * ice_set_ether_flow_seg - set address and protocol segments for ether flow
1232  * @dev: network interface device structure
1233  * @seg: flow segment for programming
1234  * @eth_spec: mask data from ethtool
1235  *
1236  * Return: 0 on success and errno in case of error.
1237  */
1238 static int ice_set_ether_flow_seg(struct device *dev,
1239 				  struct ice_flow_seg_info *seg,
1240 				  struct ethhdr *eth_spec)
1241 {
1242 	ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_ETH);
1243 
1244 	/* empty rules are not valid */
1245 	if (is_zero_ether_addr(eth_spec->h_source) &&
1246 	    is_zero_ether_addr(eth_spec->h_dest) &&
1247 	    !eth_spec->h_proto)
1248 		return -EINVAL;
1249 
1250 	/* Ethertype */
1251 	if (eth_spec->h_proto == htons(0xFFFF)) {
1252 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_ETH_TYPE,
1253 				 ICE_FLOW_FLD_OFF_INVAL,
1254 				 ICE_FLOW_FLD_OFF_INVAL,
1255 				 ICE_FLOW_FLD_OFF_INVAL, false);
1256 	} else if (eth_spec->h_proto) {
1257 		dev_warn(dev, "Only 0x0000 or 0xffff proto mask is allowed for flow-type ether");
1258 		return -EOPNOTSUPP;
1259 	}
1260 
1261 	/* Source MAC address */
1262 	if (is_broadcast_ether_addr(eth_spec->h_source))
1263 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_ETH_SA,
1264 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
1265 				 ICE_FLOW_FLD_OFF_INVAL, false);
1266 	else if (!is_zero_ether_addr(eth_spec->h_source))
1267 		goto err_mask;
1268 
1269 	/* Destination MAC address */
1270 	if (is_broadcast_ether_addr(eth_spec->h_dest))
1271 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_ETH_DA,
1272 				 ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL,
1273 				 ICE_FLOW_FLD_OFF_INVAL, false);
1274 	else if (!is_zero_ether_addr(eth_spec->h_dest))
1275 		goto err_mask;
1276 
1277 	return 0;
1278 
1279 err_mask:
1280 	dev_warn(dev, "Only 00:00:00:00:00:00 or ff:ff:ff:ff:ff:ff MAC address mask is allowed for flow-type ether");
1281 	return -EOPNOTSUPP;
1282 }
1283 
1284 /**
1285  * ice_set_fdir_vlan_seg - set vlan segments for ether flow
1286  * @seg: flow segment for programming
1287  * @ext_masks: masks for additional RX flow fields
1288  *
1289  * Return: 0 on success and errno in case of error.
1290  */
1291 static int
1292 ice_set_fdir_vlan_seg(struct ice_flow_seg_info *seg,
1293 		      struct ethtool_flow_ext *ext_masks)
1294 {
1295 	ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_VLAN);
1296 
1297 	if (ext_masks->vlan_etype) {
1298 		if (ext_masks->vlan_etype != htons(0xFFFF))
1299 			return -EOPNOTSUPP;
1300 
1301 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_S_VLAN,
1302 				 ICE_FLOW_FLD_OFF_INVAL,
1303 				 ICE_FLOW_FLD_OFF_INVAL,
1304 				 ICE_FLOW_FLD_OFF_INVAL, false);
1305 	}
1306 
1307 	if (ext_masks->vlan_tci) {
1308 		if (ext_masks->vlan_tci != htons(0xFFFF))
1309 			return -EOPNOTSUPP;
1310 
1311 		ice_flow_set_fld(seg, ICE_FLOW_FIELD_IDX_C_VLAN,
1312 				 ICE_FLOW_FLD_OFF_INVAL,
1313 				 ICE_FLOW_FLD_OFF_INVAL,
1314 				 ICE_FLOW_FLD_OFF_INVAL, false);
1315 	}
1316 
1317 	return 0;
1318 }
1319 
1320 /**
1321  * ice_cfg_fdir_xtrct_seq - Configure extraction sequence for the given filter
1322  * @pf: PF structure
1323  * @fsp: pointer to ethtool Rx flow specification
1324  * @user: user defined data from flow specification
1325  *
1326  * Returns 0 on success.
1327  */
1328 static int
1329 ice_cfg_fdir_xtrct_seq(struct ice_pf *pf, struct ethtool_rx_flow_spec *fsp,
1330 		       struct ice_rx_flow_userdef *user)
1331 {
1332 	struct ice_flow_seg_info *seg, *tun_seg;
1333 	struct device *dev = ice_pf_to_dev(pf);
1334 	enum ice_fltr_ptype fltr_idx;
1335 	struct ice_hw *hw = &pf->hw;
1336 	bool perfect_filter = false;
1337 	int ret;
1338 
1339 	seg = devm_kzalloc(dev, sizeof(*seg), GFP_KERNEL);
1340 	if (!seg)
1341 		return -ENOMEM;
1342 
1343 	tun_seg = devm_kcalloc(dev, ICE_FD_HW_SEG_MAX, sizeof(*tun_seg),
1344 			       GFP_KERNEL);
1345 	if (!tun_seg) {
1346 		devm_kfree(dev, seg);
1347 		return -ENOMEM;
1348 	}
1349 
1350 	switch (fsp->flow_type & ~FLOW_EXT) {
1351 	case TCP_V4_FLOW:
1352 		ret = ice_set_fdir_ip4_seg(seg, &fsp->m_u.tcp_ip4_spec,
1353 					   ICE_FLOW_SEG_HDR_TCP,
1354 					   &perfect_filter);
1355 		break;
1356 	case UDP_V4_FLOW:
1357 		ret = ice_set_fdir_ip4_seg(seg, &fsp->m_u.tcp_ip4_spec,
1358 					   ICE_FLOW_SEG_HDR_UDP,
1359 					   &perfect_filter);
1360 		break;
1361 	case SCTP_V4_FLOW:
1362 		ret = ice_set_fdir_ip4_seg(seg, &fsp->m_u.tcp_ip4_spec,
1363 					   ICE_FLOW_SEG_HDR_SCTP,
1364 					   &perfect_filter);
1365 		break;
1366 	case IPV4_USER_FLOW:
1367 		ret = ice_set_fdir_ip4_usr_seg(seg, &fsp->m_u.usr_ip4_spec,
1368 					       &perfect_filter);
1369 		break;
1370 	case TCP_V6_FLOW:
1371 		ret = ice_set_fdir_ip6_seg(seg, &fsp->m_u.tcp_ip6_spec,
1372 					   ICE_FLOW_SEG_HDR_TCP,
1373 					   &perfect_filter);
1374 		break;
1375 	case UDP_V6_FLOW:
1376 		ret = ice_set_fdir_ip6_seg(seg, &fsp->m_u.tcp_ip6_spec,
1377 					   ICE_FLOW_SEG_HDR_UDP,
1378 					   &perfect_filter);
1379 		break;
1380 	case SCTP_V6_FLOW:
1381 		ret = ice_set_fdir_ip6_seg(seg, &fsp->m_u.tcp_ip6_spec,
1382 					   ICE_FLOW_SEG_HDR_SCTP,
1383 					   &perfect_filter);
1384 		break;
1385 	case IPV6_USER_FLOW:
1386 		ret = ice_set_fdir_ip6_usr_seg(seg, &fsp->m_u.usr_ip6_spec,
1387 					       &perfect_filter);
1388 		break;
1389 	case ETHER_FLOW:
1390 		ret = ice_set_ether_flow_seg(dev, seg, &fsp->m_u.ether_spec);
1391 		if (!ret && (fsp->m_ext.vlan_etype || fsp->m_ext.vlan_tci)) {
1392 			if (!ice_fdir_vlan_valid(dev, fsp)) {
1393 				ret = -EINVAL;
1394 				break;
1395 			}
1396 			ret = ice_set_fdir_vlan_seg(seg, &fsp->m_ext);
1397 		}
1398 		break;
1399 	default:
1400 		ret = -EINVAL;
1401 	}
1402 	if (ret)
1403 		goto err_exit;
1404 
1405 	/* tunnel segments are shifted up one. */
1406 	memcpy(&tun_seg[1], seg, sizeof(*seg));
1407 
1408 	if (user && user->flex_fltr) {
1409 		perfect_filter = false;
1410 		ice_flow_add_fld_raw(seg, user->flex_offset,
1411 				     ICE_FLTR_PRGM_FLEX_WORD_SIZE,
1412 				     ICE_FLOW_FLD_OFF_INVAL,
1413 				     ICE_FLOW_FLD_OFF_INVAL);
1414 		ice_flow_add_fld_raw(&tun_seg[1], user->flex_offset,
1415 				     ICE_FLTR_PRGM_FLEX_WORD_SIZE,
1416 				     ICE_FLOW_FLD_OFF_INVAL,
1417 				     ICE_FLOW_FLD_OFF_INVAL);
1418 	}
1419 
1420 	fltr_idx = ice_ethtool_flow_to_fltr(fsp->flow_type & ~FLOW_EXT);
1421 
1422 	assign_bit(fltr_idx, hw->fdir_perfect_fltr, perfect_filter);
1423 
1424 	/* add filter for outer headers */
1425 	ret = ice_fdir_set_hw_fltr_rule(pf, seg, fltr_idx,
1426 					ICE_FD_HW_SEG_NON_TUN);
1427 	if (ret == -EEXIST) {
1428 		/* Rule already exists, free memory and count as success */
1429 		ret = 0;
1430 		goto err_exit;
1431 	} else if (ret) {
1432 		/* could not write filter, free memory */
1433 		goto err_exit;
1434 	}
1435 
1436 	/* make tunneled filter HW entries if possible */
1437 	memcpy(&tun_seg[1], seg, sizeof(*seg));
1438 	ret = ice_fdir_set_hw_fltr_rule(pf, tun_seg, fltr_idx,
1439 					ICE_FD_HW_SEG_TUN);
1440 	if (ret == -EEXIST) {
1441 		/* Rule already exists, free memory and count as success */
1442 		devm_kfree(dev, tun_seg);
1443 		ret = 0;
1444 	} else if (ret) {
1445 		/* could not write tunnel filter, but outer filter exists */
1446 		devm_kfree(dev, tun_seg);
1447 	}
1448 
1449 	return ret;
1450 
1451 err_exit:
1452 	devm_kfree(dev, tun_seg);
1453 	devm_kfree(dev, seg);
1454 
1455 	return ret;
1456 }
1457 
1458 /**
1459  * ice_update_per_q_fltr
1460  * @vsi: ptr to VSI
1461  * @q_index: queue index
1462  * @inc: true to increment or false to decrement per queue filter count
1463  *
1464  * This function is used to keep track of per queue sideband filters
1465  */
1466 static void ice_update_per_q_fltr(struct ice_vsi *vsi, u32 q_index, bool inc)
1467 {
1468 	struct ice_rx_ring *rx_ring;
1469 
1470 	if (!vsi->num_rxq || q_index >= vsi->num_rxq)
1471 		return;
1472 
1473 	rx_ring = vsi->rx_rings[q_index];
1474 	if (!rx_ring || !rx_ring->ch)
1475 		return;
1476 
1477 	if (inc)
1478 		atomic_inc(&rx_ring->ch->num_sb_fltr);
1479 	else
1480 		atomic_dec_if_positive(&rx_ring->ch->num_sb_fltr);
1481 }
1482 
1483 /**
1484  * ice_fdir_write_fltr - send a flow director filter to the hardware
1485  * @pf: PF data structure
1486  * @input: filter structure
1487  * @add: true adds filter and false removed filter
1488  * @is_tun: true adds inner filter on tunnel and false outer headers
1489  *
1490  * returns 0 on success and negative value on error
1491  */
1492 int
1493 ice_fdir_write_fltr(struct ice_pf *pf, struct ice_fdir_fltr *input, bool add,
1494 		    bool is_tun)
1495 {
1496 	struct device *dev = ice_pf_to_dev(pf);
1497 	struct ice_hw *hw = &pf->hw;
1498 	struct ice_fltr_desc desc;
1499 	struct ice_vsi *ctrl_vsi;
1500 	u8 *pkt, *frag_pkt;
1501 	bool has_frag;
1502 	int err;
1503 
1504 	ctrl_vsi = ice_get_ctrl_vsi(pf);
1505 	if (!ctrl_vsi)
1506 		return -EINVAL;
1507 
1508 	pkt = devm_kzalloc(dev, ICE_FDIR_MAX_RAW_PKT_SIZE, GFP_KERNEL);
1509 	if (!pkt)
1510 		return -ENOMEM;
1511 	frag_pkt = devm_kzalloc(dev, ICE_FDIR_MAX_RAW_PKT_SIZE, GFP_KERNEL);
1512 	if (!frag_pkt) {
1513 		err = -ENOMEM;
1514 		goto err_free;
1515 	}
1516 
1517 	ice_fdir_get_prgm_desc(hw, input, &desc, add);
1518 	err = ice_fdir_get_gen_prgm_pkt(hw, input, pkt, false, is_tun);
1519 	if (err)
1520 		goto err_free_all;
1521 	err = ice_prgm_fdir_fltr(ctrl_vsi, &desc, pkt);
1522 	if (err)
1523 		goto err_free_all;
1524 
1525 	/* repeat for fragment packet */
1526 	has_frag = ice_fdir_has_frag(input->flow_type);
1527 	if (has_frag) {
1528 		/* does not return error */
1529 		ice_fdir_get_prgm_desc(hw, input, &desc, add);
1530 		err = ice_fdir_get_gen_prgm_pkt(hw, input, frag_pkt, true,
1531 						is_tun);
1532 		if (err)
1533 			goto err_frag;
1534 		err = ice_prgm_fdir_fltr(ctrl_vsi, &desc, frag_pkt);
1535 		if (err)
1536 			goto err_frag;
1537 	} else {
1538 		devm_kfree(dev, frag_pkt);
1539 	}
1540 
1541 	return 0;
1542 
1543 err_free_all:
1544 	devm_kfree(dev, frag_pkt);
1545 err_free:
1546 	devm_kfree(dev, pkt);
1547 	return err;
1548 
1549 err_frag:
1550 	devm_kfree(dev, frag_pkt);
1551 	return err;
1552 }
1553 
1554 /**
1555  * ice_fdir_write_all_fltr - send a flow director filter to the hardware
1556  * @pf: PF data structure
1557  * @input: filter structure
1558  * @add: true adds filter and false removed filter
1559  *
1560  * returns 0 on success and negative value on error
1561  */
1562 static int
1563 ice_fdir_write_all_fltr(struct ice_pf *pf, struct ice_fdir_fltr *input,
1564 			bool add)
1565 {
1566 	u16 port_num;
1567 	int tun;
1568 
1569 	for (tun = 0; tun < ICE_FD_HW_SEG_MAX; tun++) {
1570 		bool is_tun = tun == ICE_FD_HW_SEG_TUN;
1571 		int err;
1572 
1573 		if (is_tun && !ice_get_open_tunnel_port(&pf->hw, &port_num, TNL_ALL))
1574 			continue;
1575 		err = ice_fdir_write_fltr(pf, input, add, is_tun);
1576 		if (err)
1577 			return err;
1578 	}
1579 	return 0;
1580 }
1581 
1582 /**
1583  * ice_fdir_replay_fltrs - replay filters from the HW filter list
1584  * @pf: board private structure
1585  */
1586 void ice_fdir_replay_fltrs(struct ice_pf *pf)
1587 {
1588 	struct ice_fdir_fltr *f_rule;
1589 	struct ice_hw *hw = &pf->hw;
1590 
1591 	list_for_each_entry(f_rule, &hw->fdir_list_head, fltr_node) {
1592 		int err = ice_fdir_write_all_fltr(pf, f_rule, true);
1593 
1594 		if (err)
1595 			dev_dbg(ice_pf_to_dev(pf), "Flow Director error %d, could not reprogram filter %d\n",
1596 				err, f_rule->fltr_id);
1597 	}
1598 }
1599 
1600 /**
1601  * ice_fdir_create_dflt_rules - create default perfect filters
1602  * @pf: PF data structure
1603  *
1604  * Returns 0 for success or error.
1605  */
1606 int ice_fdir_create_dflt_rules(struct ice_pf *pf)
1607 {
1608 	int err;
1609 
1610 	/* Create perfect TCP and UDP rules in hardware. */
1611 	err = ice_create_init_fdir_rule(pf, ICE_FLTR_PTYPE_NONF_IPV4_TCP);
1612 	if (err)
1613 		return err;
1614 
1615 	err = ice_create_init_fdir_rule(pf, ICE_FLTR_PTYPE_NONF_IPV4_UDP);
1616 	if (err)
1617 		return err;
1618 
1619 	err = ice_create_init_fdir_rule(pf, ICE_FLTR_PTYPE_NONF_IPV6_TCP);
1620 	if (err)
1621 		return err;
1622 
1623 	err = ice_create_init_fdir_rule(pf, ICE_FLTR_PTYPE_NONF_IPV6_UDP);
1624 
1625 	return err;
1626 }
1627 
1628 /**
1629  * ice_fdir_del_all_fltrs - Delete all flow director filters
1630  * @vsi: the VSI being changed
1631  *
1632  * This function needs to be called while holding hw->fdir_fltr_lock
1633  */
1634 void ice_fdir_del_all_fltrs(struct ice_vsi *vsi)
1635 {
1636 	struct ice_fdir_fltr *f_rule, *tmp;
1637 	struct ice_pf *pf = vsi->back;
1638 	struct ice_hw *hw = &pf->hw;
1639 
1640 	list_for_each_entry_safe(f_rule, tmp, &hw->fdir_list_head, fltr_node) {
1641 		ice_fdir_write_all_fltr(pf, f_rule, false);
1642 		ice_fdir_update_cntrs(hw, f_rule->flow_type, false);
1643 		list_del(&f_rule->fltr_node);
1644 		devm_kfree(ice_pf_to_dev(pf), f_rule);
1645 	}
1646 }
1647 
1648 /**
1649  * ice_vsi_manage_fdir - turn on/off flow director
1650  * @vsi: the VSI being changed
1651  * @ena: boolean value indicating if this is an enable or disable request
1652  */
1653 void ice_vsi_manage_fdir(struct ice_vsi *vsi, bool ena)
1654 {
1655 	struct ice_pf *pf = vsi->back;
1656 	struct ice_hw *hw = &pf->hw;
1657 	enum ice_fltr_ptype flow;
1658 
1659 	if (ena) {
1660 		set_bit(ICE_FLAG_FD_ENA, pf->flags);
1661 		ice_fdir_create_dflt_rules(pf);
1662 		return;
1663 	}
1664 
1665 	mutex_lock(&hw->fdir_fltr_lock);
1666 	if (!test_and_clear_bit(ICE_FLAG_FD_ENA, pf->flags))
1667 		goto release_lock;
1668 
1669 	ice_fdir_del_all_fltrs(vsi);
1670 
1671 	if (hw->fdir_prof)
1672 		for (flow = ICE_FLTR_PTYPE_NONF_NONE; flow < ICE_FLTR_PTYPE_MAX;
1673 		     flow++)
1674 			if (hw->fdir_prof[flow])
1675 				ice_fdir_rem_flow(hw, ICE_BLK_FD, flow);
1676 
1677 release_lock:
1678 	mutex_unlock(&hw->fdir_fltr_lock);
1679 }
1680 
1681 /**
1682  * ice_fdir_do_rem_flow - delete flow and possibly add perfect flow
1683  * @pf: PF structure
1684  * @flow_type: FDir flow type to release
1685  */
1686 static void
1687 ice_fdir_do_rem_flow(struct ice_pf *pf, enum ice_fltr_ptype flow_type)
1688 {
1689 	struct ice_hw *hw = &pf->hw;
1690 	bool need_perfect = false;
1691 
1692 	if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1693 	    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1694 	    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
1695 	    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP)
1696 		need_perfect = true;
1697 
1698 	if (need_perfect && test_bit(flow_type, hw->fdir_perfect_fltr))
1699 		return;
1700 
1701 	ice_fdir_rem_flow(hw, ICE_BLK_FD, flow_type);
1702 	if (need_perfect)
1703 		ice_create_init_fdir_rule(pf, flow_type);
1704 }
1705 
1706 /**
1707  * ice_fdir_update_list_entry - add or delete a filter from the filter list
1708  * @pf: PF structure
1709  * @input: filter structure
1710  * @fltr_idx: ethtool index of filter to modify
1711  *
1712  * returns 0 on success and negative on errors
1713  */
1714 static int
1715 ice_fdir_update_list_entry(struct ice_pf *pf, struct ice_fdir_fltr *input,
1716 			   int fltr_idx)
1717 {
1718 	struct ice_fdir_fltr *old_fltr;
1719 	struct ice_hw *hw = &pf->hw;
1720 	struct ice_vsi *vsi;
1721 	int err = -ENOENT;
1722 
1723 	/* Do not update filters during reset */
1724 	if (ice_is_reset_in_progress(pf->state))
1725 		return -EBUSY;
1726 
1727 	vsi = ice_get_main_vsi(pf);
1728 	if (!vsi)
1729 		return -EINVAL;
1730 
1731 	old_fltr = ice_fdir_find_fltr_by_idx(hw, fltr_idx);
1732 	if (old_fltr) {
1733 		err = ice_fdir_write_all_fltr(pf, old_fltr, false);
1734 		if (err)
1735 			return err;
1736 		ice_fdir_update_cntrs(hw, old_fltr->flow_type, false);
1737 		/* update sb-filters count, specific to ring->channel */
1738 		ice_update_per_q_fltr(vsi, old_fltr->orig_q_index, false);
1739 		if (!input && !hw->fdir_fltr_cnt[old_fltr->flow_type])
1740 			/* we just deleted the last filter of flow_type so we
1741 			 * should also delete the HW filter info.
1742 			 */
1743 			ice_fdir_do_rem_flow(pf, old_fltr->flow_type);
1744 		list_del(&old_fltr->fltr_node);
1745 		devm_kfree(ice_hw_to_dev(hw), old_fltr);
1746 	}
1747 	if (!input)
1748 		return err;
1749 	ice_fdir_list_add_fltr(hw, input);
1750 	/* update sb-filters count, specific to ring->channel */
1751 	ice_update_per_q_fltr(vsi, input->orig_q_index, true);
1752 	ice_fdir_update_cntrs(hw, input->flow_type, true);
1753 	return 0;
1754 }
1755 
1756 /**
1757  * ice_del_fdir_ethtool - delete Flow Director filter
1758  * @vsi: pointer to target VSI
1759  * @cmd: command to add or delete Flow Director filter
1760  *
1761  * Returns 0 on success and negative values for failure
1762  */
1763 int ice_del_fdir_ethtool(struct ice_vsi *vsi, struct ethtool_rxnfc *cmd)
1764 {
1765 	struct ethtool_rx_flow_spec *fsp =
1766 		(struct ethtool_rx_flow_spec *)&cmd->fs;
1767 	struct ice_pf *pf = vsi->back;
1768 	struct ice_hw *hw = &pf->hw;
1769 	int val;
1770 
1771 	if (!test_bit(ICE_FLAG_FD_ENA, pf->flags))
1772 		return -EOPNOTSUPP;
1773 
1774 	/* Do not delete filters during reset */
1775 	if (ice_is_reset_in_progress(pf->state)) {
1776 		dev_err(ice_pf_to_dev(pf), "Device is resetting - deleting Flow Director filters not supported during reset\n");
1777 		return -EBUSY;
1778 	}
1779 
1780 	if (test_bit(ICE_FD_FLUSH_REQ, pf->state))
1781 		return -EBUSY;
1782 
1783 	mutex_lock(&hw->fdir_fltr_lock);
1784 	val = ice_fdir_update_list_entry(pf, NULL, fsp->location);
1785 	mutex_unlock(&hw->fdir_fltr_lock);
1786 
1787 	return val;
1788 }
1789 
1790 /**
1791  * ice_update_ring_dest_vsi - update dest ring and dest VSI
1792  * @vsi: pointer to target VSI
1793  * @dest_vsi: ptr to dest VSI index
1794  * @ring: ptr to dest ring
1795  *
1796  * This function updates destination VSI and queue if user specifies
1797  * target queue which falls in channel's (aka ADQ) queue region
1798  */
1799 static void
1800 ice_update_ring_dest_vsi(struct ice_vsi *vsi, u16 *dest_vsi, u32 *ring)
1801 {
1802 	struct ice_channel *ch;
1803 
1804 	list_for_each_entry(ch, &vsi->ch_list, list) {
1805 		if (!ch->ch_vsi)
1806 			continue;
1807 
1808 		/* make sure to locate corresponding channel based on "queue"
1809 		 * specified
1810 		 */
1811 		if ((*ring < ch->base_q) ||
1812 		    (*ring >= (ch->base_q + ch->num_rxq)))
1813 			continue;
1814 
1815 		/* update the dest_vsi based on channel */
1816 		*dest_vsi = ch->ch_vsi->idx;
1817 
1818 		/* update the "ring" to be correct based on channel */
1819 		*ring -= ch->base_q;
1820 	}
1821 }
1822 
1823 /**
1824  * ice_set_fdir_input_set - Set the input set for Flow Director
1825  * @vsi: pointer to target VSI
1826  * @fsp: pointer to ethtool Rx flow specification
1827  * @input: filter structure
1828  */
1829 static int
1830 ice_set_fdir_input_set(struct ice_vsi *vsi, struct ethtool_rx_flow_spec *fsp,
1831 		       struct ice_fdir_fltr *input)
1832 {
1833 	u16 dest_vsi, q_index = 0;
1834 	u16 orig_q_index = 0;
1835 	struct ice_pf *pf;
1836 	struct ice_hw *hw;
1837 	int flow_type;
1838 	u8 dest_ctl;
1839 
1840 	if (!vsi || !fsp || !input)
1841 		return -EINVAL;
1842 
1843 	pf = vsi->back;
1844 	hw = &pf->hw;
1845 
1846 	dest_vsi = vsi->idx;
1847 	if (fsp->ring_cookie == RX_CLS_FLOW_DISC) {
1848 		dest_ctl = ICE_FLTR_PRGM_DESC_DEST_DROP_PKT;
1849 	} else {
1850 		u32 ring = ethtool_get_flow_spec_ring(fsp->ring_cookie);
1851 		u8 vf = ethtool_get_flow_spec_ring_vf(fsp->ring_cookie);
1852 
1853 		if (vf) {
1854 			dev_err(ice_pf_to_dev(pf), "Failed to add filter. Flow director filters are not supported on VF queues.\n");
1855 			return -EINVAL;
1856 		}
1857 
1858 		if (ring >= vsi->num_rxq)
1859 			return -EINVAL;
1860 
1861 		orig_q_index = ring;
1862 		ice_update_ring_dest_vsi(vsi, &dest_vsi, &ring);
1863 		dest_ctl = ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX;
1864 		q_index = ring;
1865 	}
1866 
1867 	input->fltr_id = fsp->location;
1868 	input->q_index = q_index;
1869 	flow_type = fsp->flow_type & ~FLOW_EXT;
1870 
1871 	/* Record the original queue index as specified by user.
1872 	 * with channel configuration 'q_index' becomes relative
1873 	 * to TC (channel).
1874 	 */
1875 	input->orig_q_index = orig_q_index;
1876 	input->dest_vsi = dest_vsi;
1877 	input->dest_ctl = dest_ctl;
1878 	input->fltr_status = ICE_FLTR_PRGM_DESC_FD_STATUS_FD_ID;
1879 	input->cnt_index = ICE_FD_SB_STAT_IDX(hw->fd_ctr_base);
1880 	input->flow_type = ice_ethtool_flow_to_fltr(flow_type);
1881 
1882 	if (fsp->flow_type & FLOW_EXT) {
1883 		memcpy(input->ext_data.usr_def, fsp->h_ext.data,
1884 		       sizeof(input->ext_data.usr_def));
1885 		input->ext_data.vlan_type = fsp->h_ext.vlan_etype;
1886 		input->ext_data.vlan_tag = fsp->h_ext.vlan_tci;
1887 		memcpy(input->ext_mask.usr_def, fsp->m_ext.data,
1888 		       sizeof(input->ext_mask.usr_def));
1889 		input->ext_mask.vlan_type = fsp->m_ext.vlan_etype;
1890 		input->ext_mask.vlan_tag = fsp->m_ext.vlan_tci;
1891 	}
1892 
1893 	switch (flow_type) {
1894 	case TCP_V4_FLOW:
1895 	case UDP_V4_FLOW:
1896 	case SCTP_V4_FLOW:
1897 		input->ip.v4.dst_port = fsp->h_u.tcp_ip4_spec.pdst;
1898 		input->ip.v4.src_port = fsp->h_u.tcp_ip4_spec.psrc;
1899 		input->ip.v4.dst_ip = fsp->h_u.tcp_ip4_spec.ip4dst;
1900 		input->ip.v4.src_ip = fsp->h_u.tcp_ip4_spec.ip4src;
1901 		input->mask.v4.dst_port = fsp->m_u.tcp_ip4_spec.pdst;
1902 		input->mask.v4.src_port = fsp->m_u.tcp_ip4_spec.psrc;
1903 		input->mask.v4.dst_ip = fsp->m_u.tcp_ip4_spec.ip4dst;
1904 		input->mask.v4.src_ip = fsp->m_u.tcp_ip4_spec.ip4src;
1905 		break;
1906 	case IPV4_USER_FLOW:
1907 		input->ip.v4.dst_ip = fsp->h_u.usr_ip4_spec.ip4dst;
1908 		input->ip.v4.src_ip = fsp->h_u.usr_ip4_spec.ip4src;
1909 		input->ip.v4.l4_header = fsp->h_u.usr_ip4_spec.l4_4_bytes;
1910 		input->ip.v4.proto = fsp->h_u.usr_ip4_spec.proto;
1911 		input->ip.v4.ip_ver = fsp->h_u.usr_ip4_spec.ip_ver;
1912 		input->ip.v4.tos = fsp->h_u.usr_ip4_spec.tos;
1913 		input->mask.v4.dst_ip = fsp->m_u.usr_ip4_spec.ip4dst;
1914 		input->mask.v4.src_ip = fsp->m_u.usr_ip4_spec.ip4src;
1915 		input->mask.v4.l4_header = fsp->m_u.usr_ip4_spec.l4_4_bytes;
1916 		input->mask.v4.proto = fsp->m_u.usr_ip4_spec.proto;
1917 		input->mask.v4.ip_ver = fsp->m_u.usr_ip4_spec.ip_ver;
1918 		input->mask.v4.tos = fsp->m_u.usr_ip4_spec.tos;
1919 		break;
1920 	case TCP_V6_FLOW:
1921 	case UDP_V6_FLOW:
1922 	case SCTP_V6_FLOW:
1923 		memcpy(input->ip.v6.dst_ip, fsp->h_u.usr_ip6_spec.ip6dst,
1924 		       sizeof(struct in6_addr));
1925 		memcpy(input->ip.v6.src_ip, fsp->h_u.usr_ip6_spec.ip6src,
1926 		       sizeof(struct in6_addr));
1927 		input->ip.v6.dst_port = fsp->h_u.tcp_ip6_spec.pdst;
1928 		input->ip.v6.src_port = fsp->h_u.tcp_ip6_spec.psrc;
1929 		input->ip.v6.tc = fsp->h_u.tcp_ip6_spec.tclass;
1930 		memcpy(input->mask.v6.dst_ip, fsp->m_u.tcp_ip6_spec.ip6dst,
1931 		       sizeof(struct in6_addr));
1932 		memcpy(input->mask.v6.src_ip, fsp->m_u.tcp_ip6_spec.ip6src,
1933 		       sizeof(struct in6_addr));
1934 		input->mask.v6.dst_port = fsp->m_u.tcp_ip6_spec.pdst;
1935 		input->mask.v6.src_port = fsp->m_u.tcp_ip6_spec.psrc;
1936 		input->mask.v6.tc = fsp->m_u.tcp_ip6_spec.tclass;
1937 		break;
1938 	case IPV6_USER_FLOW:
1939 		memcpy(input->ip.v6.dst_ip, fsp->h_u.usr_ip6_spec.ip6dst,
1940 		       sizeof(struct in6_addr));
1941 		memcpy(input->ip.v6.src_ip, fsp->h_u.usr_ip6_spec.ip6src,
1942 		       sizeof(struct in6_addr));
1943 		input->ip.v6.l4_header = fsp->h_u.usr_ip6_spec.l4_4_bytes;
1944 		input->ip.v6.tc = fsp->h_u.usr_ip6_spec.tclass;
1945 
1946 		/* if no protocol requested, use IPPROTO_NONE */
1947 		if (!fsp->m_u.usr_ip6_spec.l4_proto)
1948 			input->ip.v6.proto = IPPROTO_NONE;
1949 		else
1950 			input->ip.v6.proto = fsp->h_u.usr_ip6_spec.l4_proto;
1951 
1952 		memcpy(input->mask.v6.dst_ip, fsp->m_u.usr_ip6_spec.ip6dst,
1953 		       sizeof(struct in6_addr));
1954 		memcpy(input->mask.v6.src_ip, fsp->m_u.usr_ip6_spec.ip6src,
1955 		       sizeof(struct in6_addr));
1956 		input->mask.v6.l4_header = fsp->m_u.usr_ip6_spec.l4_4_bytes;
1957 		input->mask.v6.tc = fsp->m_u.usr_ip6_spec.tclass;
1958 		input->mask.v6.proto = fsp->m_u.usr_ip6_spec.l4_proto;
1959 		break;
1960 	case ETHER_FLOW:
1961 		input->eth = fsp->h_u.ether_spec;
1962 		input->eth_mask = fsp->m_u.ether_spec;
1963 		break;
1964 	default:
1965 		/* not doing un-parsed flow types */
1966 		return -EINVAL;
1967 	}
1968 
1969 	return 0;
1970 }
1971 
1972 /**
1973  * ice_add_fdir_ethtool - Add/Remove Flow Director filter
1974  * @vsi: pointer to target VSI
1975  * @cmd: command to add or delete Flow Director filter
1976  *
1977  * Returns 0 on success and negative values for failure
1978  */
1979 int ice_add_fdir_ethtool(struct ice_vsi *vsi, struct ethtool_rxnfc *cmd)
1980 {
1981 	struct ice_rx_flow_userdef userdata;
1982 	struct ethtool_rx_flow_spec *fsp;
1983 	struct ice_fdir_fltr *input;
1984 	struct device *dev;
1985 	struct ice_pf *pf;
1986 	struct ice_hw *hw;
1987 	int fltrs_needed;
1988 	u32 max_location;
1989 	u16 tunnel_port;
1990 	int ret;
1991 
1992 	if (!vsi)
1993 		return -EINVAL;
1994 
1995 	pf = vsi->back;
1996 	hw = &pf->hw;
1997 	dev = ice_pf_to_dev(pf);
1998 
1999 	if (!test_bit(ICE_FLAG_FD_ENA, pf->flags))
2000 		return -EOPNOTSUPP;
2001 
2002 	/* Do not program filters during reset */
2003 	if (ice_is_reset_in_progress(pf->state)) {
2004 		dev_err(dev, "Device is resetting - adding Flow Director filters not supported during reset\n");
2005 		return -EBUSY;
2006 	}
2007 
2008 	fsp = (struct ethtool_rx_flow_spec *)&cmd->fs;
2009 
2010 	if (ice_parse_rx_flow_user_data(fsp, &userdata))
2011 		return -EINVAL;
2012 
2013 	if (fsp->flow_type & FLOW_MAC_EXT)
2014 		return -EINVAL;
2015 
2016 	ret = ice_cfg_fdir_xtrct_seq(pf, fsp, &userdata);
2017 	if (ret)
2018 		return ret;
2019 
2020 	max_location = ice_get_fdir_cnt_all(hw);
2021 	if (fsp->location >= max_location) {
2022 		dev_err(dev, "Failed to add filter. The number of ntuple filters or provided location exceed max %d.\n",
2023 			max_location);
2024 		return -ENOSPC;
2025 	}
2026 
2027 	/* return error if not an update and no available filters */
2028 	fltrs_needed = ice_get_open_tunnel_port(hw, &tunnel_port, TNL_ALL) ? 2 : 1;
2029 	if (!ice_fdir_find_fltr_by_idx(hw, fsp->location) &&
2030 	    ice_fdir_num_avail_fltr(hw, pf->vsi[vsi->idx]) < fltrs_needed) {
2031 		dev_err(dev, "Failed to add filter. The maximum number of flow director filters has been reached.\n");
2032 		return -ENOSPC;
2033 	}
2034 
2035 	input = devm_kzalloc(dev, sizeof(*input), GFP_KERNEL);
2036 	if (!input)
2037 		return -ENOMEM;
2038 
2039 	ret = ice_set_fdir_input_set(vsi, fsp, input);
2040 	if (ret)
2041 		goto free_input;
2042 
2043 	mutex_lock(&hw->fdir_fltr_lock);
2044 	if (ice_fdir_is_dup_fltr(hw, input)) {
2045 		ret = -EINVAL;
2046 		goto release_lock;
2047 	}
2048 
2049 	if (userdata.flex_fltr) {
2050 		input->flex_fltr = true;
2051 		input->flex_word = cpu_to_be16(userdata.flex_word);
2052 		input->flex_offset = userdata.flex_offset;
2053 	}
2054 
2055 	input->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
2056 	input->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_THREE;
2057 	input->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
2058 
2059 	/* input struct is added to the HW filter list */
2060 	ret = ice_fdir_update_list_entry(pf, input, fsp->location);
2061 	if (ret)
2062 		goto release_lock;
2063 
2064 	ret = ice_fdir_write_all_fltr(pf, input, true);
2065 	if (ret)
2066 		goto remove_sw_rule;
2067 
2068 	goto release_lock;
2069 
2070 remove_sw_rule:
2071 	ice_fdir_update_cntrs(hw, input->flow_type, false);
2072 	/* update sb-filters count, specific to ring->channel */
2073 	ice_update_per_q_fltr(vsi, input->orig_q_index, false);
2074 	list_del(&input->fltr_node);
2075 release_lock:
2076 	mutex_unlock(&hw->fdir_fltr_lock);
2077 free_input:
2078 	if (ret)
2079 		devm_kfree(dev, input);
2080 
2081 	return ret;
2082 }
2083