net/ice: support RSS hash configuration in DCF mode
[dpdk.git] / drivers / net / ice / ice_generic_flow.c
index c673feb..57eb002 100644 (file)
@@ -65,6 +65,11 @@ enum rte_flow_item_type pattern_empty[] = {
        RTE_FLOW_ITEM_TYPE_END,
 };
 
+enum rte_flow_item_type pattern_any[] = {
+       RTE_FLOW_ITEM_TYPE_ANY,
+       RTE_FLOW_ITEM_TYPE_END,
+};
+
 /* raw */
 enum rte_flow_item_type pattern_raw[] = {
        RTE_FLOW_ITEM_TYPE_RAW,
@@ -1826,6 +1831,9 @@ ice_flow_init(struct ice_adapter *ad)
        TAILQ_INIT(&pf->dist_parser_list);
        rte_spinlock_init(&pf->flow_ops_lock);
 
+       if (ice_parser_create(&ad->hw, &ad->psr) != ICE_SUCCESS)
+               PMD_INIT_LOG(WARNING, "Failed to initialize DDP parser, raw packet filter will not be supported");
+
        RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
                if (engine->init == NULL) {
                        PMD_INIT_LOG(ERR, "Invalid engine type (%d)",
@@ -1880,6 +1888,11 @@ ice_flow_uninit(struct ice_adapter *ad)
                TAILQ_REMOVE(&pf->dist_parser_list, p_parser, node);
                rte_free(p_parser);
        }
+
+       if (ad->psr != NULL) {
+               ice_parser_destroy(ad->psr);
+               ad->psr = NULL;
+       }
 }
 
 static struct ice_parser_list *
@@ -2111,6 +2124,7 @@ struct ice_ptype_match {
 
 static struct ice_ptype_match ice_ptype_map[] = {
        {pattern_raw,                                   ICE_PTYPE_IPV4_PAY},
+       {pattern_any,                                   ICE_PTYPE_IPV4_PAY},
        {pattern_eth_ipv4,                              ICE_PTYPE_IPV4_PAY},
        {pattern_eth_ipv4_udp,                          ICE_PTYPE_IPV4_UDP_PAY},
        {pattern_eth_ipv4_tcp,                          ICE_PTYPE_IPV4_TCP_PAY},
@@ -2515,7 +2529,9 @@ ice_flow_flush(struct rte_eth_dev *dev,
                ret = ice_flow_destroy(dev, p_flow, error);
                if (ret) {
                        PMD_DRV_LOG(ERR, "Failed to flush flows");
-                       return -EINVAL;
+                       if (ret != -EAGAIN)
+                               ret = -EINVAL;
+                       return ret;
                }
        }