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