.. | .. |
---|
1135 | 1135 | ICE_FLOW_FLD_OFF_INVAL); |
---|
1136 | 1136 | } |
---|
1137 | 1137 | |
---|
1138 | | - /* add filter for outer headers */ |
---|
1139 | 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 */ |
---|
1140 | 1143 | ret = ice_fdir_set_hw_fltr_rule(pf, seg, fltr_idx, |
---|
1141 | 1144 | 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) { |
---|
1146 | 1150 | /* could not write filter, free memory */ |
---|
1147 | 1151 | goto err_exit; |
---|
| 1152 | + } |
---|
1148 | 1153 | |
---|
1149 | 1154 | /* make tunneled filter HW entries if possible */ |
---|
1150 | 1155 | memcpy(&tun_seg[1], seg, sizeof(*seg)); |
---|
.. | .. |
---|
1159 | 1164 | devm_kfree(dev, tun_seg); |
---|
1160 | 1165 | } |
---|
1161 | 1166 | |
---|
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 | | - |
---|
1167 | 1167 | return ret; |
---|
1168 | 1168 | |
---|
1169 | 1169 | err_exit: |
---|
1170 | 1170 | devm_kfree(dev, tun_seg); |
---|
1171 | 1171 | devm_kfree(dev, seg); |
---|
1172 | 1172 | |
---|
1173 | | - return -EOPNOTSUPP; |
---|
| 1173 | + return ret; |
---|
1174 | 1174 | } |
---|
1175 | 1175 | |
---|
1176 | 1176 | /** |
---|
.. | .. |
---|
1680 | 1680 | } |
---|
1681 | 1681 | |
---|
1682 | 1682 | /* 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; |
---|
1684 | 1686 | |
---|
1685 | 1687 | ret = ice_fdir_write_all_fltr(pf, input, true); |
---|
1686 | 1688 | if (ret) |
---|