|
@@ -8135,6 +8135,51 @@ u32 i40e_get_global_fd_count(struct i40e_pf *pf)
|
|
|
return fcnt_prog;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * i40e_delete_invalid_filter - Delete an invalid FDIR filter
|
|
|
+ * @pf: board private structure
|
|
|
+ * @filter: FDir filter to remove
|
|
|
+ */
|
|
|
+static void i40e_delete_invalid_filter(struct i40e_pf *pf,
|
|
|
+ struct i40e_fdir_filter *filter)
|
|
|
+{
|
|
|
+ /* Update counters */
|
|
|
+ pf->fdir_pf_active_filters--;
|
|
|
+ pf->fd_inv = 0;
|
|
|
+
|
|
|
+ switch (filter->flow_type) {
|
|
|
+ case TCP_V4_FLOW:
|
|
|
+ pf->fd_tcp4_filter_cnt--;
|
|
|
+ break;
|
|
|
+ case UDP_V4_FLOW:
|
|
|
+ pf->fd_udp4_filter_cnt--;
|
|
|
+ break;
|
|
|
+ case SCTP_V4_FLOW:
|
|
|
+ pf->fd_sctp4_filter_cnt--;
|
|
|
+ break;
|
|
|
+ case IP_USER_FLOW:
|
|
|
+ switch (filter->ip4_proto) {
|
|
|
+ case IPPROTO_TCP:
|
|
|
+ pf->fd_tcp4_filter_cnt--;
|
|
|
+ break;
|
|
|
+ case IPPROTO_UDP:
|
|
|
+ pf->fd_udp4_filter_cnt--;
|
|
|
+ break;
|
|
|
+ case IPPROTO_SCTP:
|
|
|
+ pf->fd_sctp4_filter_cnt--;
|
|
|
+ break;
|
|
|
+ case IPPROTO_IP:
|
|
|
+ pf->fd_ip4_filter_cnt--;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Remove the filter from the list and free memory */
|
|
|
+ hlist_del(&filter->fdir_node);
|
|
|
+ kfree(filter);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* i40e_fdir_check_and_reenable - Function to reenabe FD ATR or SB if disabled
|
|
|
* @pf: board private structure
|
|
@@ -8179,14 +8224,9 @@ void i40e_fdir_check_and_reenable(struct i40e_pf *pf)
|
|
|
/* if hw had a problem adding a filter, delete it */
|
|
|
if (pf->fd_inv > 0) {
|
|
|
hlist_for_each_entry_safe(filter, node,
|
|
|
- &pf->fdir_filter_list, fdir_node) {
|
|
|
- if (filter->fd_id == pf->fd_inv) {
|
|
|
- hlist_del(&filter->fdir_node);
|
|
|
- kfree(filter);
|
|
|
- pf->fdir_pf_active_filters--;
|
|
|
- pf->fd_inv = 0;
|
|
|
- }
|
|
|
- }
|
|
|
+ &pf->fdir_filter_list, fdir_node)
|
|
|
+ if (filter->fd_id == pf->fd_inv)
|
|
|
+ i40e_delete_invalid_filter(pf, filter);
|
|
|
}
|
|
|
}
|
|
|
|