hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c
....@@ -1135,16 +1135,21 @@
11351135 ICE_FLOW_FLD_OFF_INVAL);
11361136 }
11371137
1138
- /* add filter for outer headers */
11391138 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 */
11401143 ret = ice_fdir_set_hw_fltr_rule(pf, seg, fltr_idx,
11411144 ICE_FD_HW_SEG_NON_TUN);
1142
- if (ret == -EEXIST)
1143
- /* Rule already exists, free memory and continue */
1144
- devm_kfree(dev, seg);
1145
- else if (ret)
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) {
11461150 /* could not write filter, free memory */
11471151 goto err_exit;
1152
+ }
11481153
11491154 /* make tunneled filter HW entries if possible */
11501155 memcpy(&tun_seg[1], seg, sizeof(*seg));
....@@ -1159,18 +1164,13 @@
11591164 devm_kfree(dev, tun_seg);
11601165 }
11611166
1162
- if (perfect_filter)
1163
- set_bit(fltr_idx, hw->fdir_perfect_fltr);
1164
- else
1165
- clear_bit(fltr_idx, hw->fdir_perfect_fltr);
1166
-
11671167 return ret;
11681168
11691169 err_exit:
11701170 devm_kfree(dev, tun_seg);
11711171 devm_kfree(dev, seg);
11721172
1173
- return -EOPNOTSUPP;
1173
+ return ret;
11741174 }
11751175
11761176 /**
....@@ -1680,7 +1680,9 @@
16801680 }
16811681
16821682 /* input struct is added to the HW filter list */
1683
- ice_fdir_update_list_entry(pf, input, fsp->location);
1683
+ ret = ice_fdir_update_list_entry(pf, input, fsp->location);
1684
+ if (ret)
1685
+ goto release_lock;
16841686
16851687 ret = ice_fdir_write_all_fltr(pf, input, true);
16861688 if (ret)