X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fhinic%2Fhinic_pmd_flow.c;h=d71a42afbdef885803921a8904bc0beed0312fdd;hb=b8f5d2ae75c97698190d46f4810d01f407016aad;hp=70fd4450c2631a02be0f102f8d73a31b634f62c4;hpb=2e8fb3d2442cc0123562d4c43a6e86a1bb3df62f;p=dpdk.git diff --git a/drivers/net/hinic/hinic_pmd_flow.c b/drivers/net/hinic/hinic_pmd_flow.c index 70fd4450c2..d71a42afbd 100644 --- a/drivers/net/hinic/hinic_pmd_flow.c +++ b/drivers/net/hinic/hinic_pmd_flow.c @@ -694,6 +694,7 @@ static int hinic_ntuple_item_check_end(const struct rte_flow_item *item, item, "Not supported by ntuple filter"); return -rte_errno; } + return 0; } @@ -2808,8 +2809,12 @@ static int hinic_add_tcam_filter(struct rte_eth_dev *dev, rc = hinic_set_fdir_tcam_rule_filter(nic_dev->hwdev, true); if (rc && rc != HINIC_MGMT_CMD_UNSUPPORTED) { - (void)hinic_set_fdir_filter(nic_dev->hwdev, 0, 0, 0, - false); + /* + * hinic supports two methods: linear table and tcam + * table, if tcam filter enables failed but linear table + * is ok, which also needs to enable filter, so for this + * scene, driver should not close fdir switch. + */ (void)hinic_del_tcam_rule(nic_dev->hwdev, fdir_tcam_rule->index); return rc; @@ -2981,6 +2986,8 @@ static struct rte_flow *hinic_flow_create(struct rte_eth_dev *dev, sizeof(struct hinic_ntuple_filter_ele), 0); if (ntuple_filter_ptr == NULL) { PMD_DRV_LOG(ERR, "Failed to allocate ntuple_filter_ptr"); + (void)hinic_add_del_ntuple_filter(dev, + &ntuple_filter, FALSE); goto out; } rte_memcpy(&ntuple_filter_ptr->filter_info, @@ -3011,6 +3018,8 @@ static struct rte_flow *hinic_flow_create(struct rte_eth_dev *dev, sizeof(struct hinic_ethertype_filter_ele), 0); if (ethertype_filter_ptr == NULL) { PMD_DRV_LOG(ERR, "Failed to allocate ethertype_filter_ptr"); + (void)hinic_add_del_ethertype_filter(dev, + ðertype_filter, FALSE); goto out; } rte_memcpy(ðertype_filter_ptr->filter_info, @@ -3034,11 +3043,10 @@ static struct rte_flow *hinic_flow_create(struct rte_eth_dev *dev, actions, &fdir_rule, error); if (!ret) { if (fdir_rule.mode == HINIC_FDIR_MODE_NORMAL) { - ret = hinic_add_del_fdir_filter(dev, - &fdir_rule, TRUE); + ret = hinic_add_del_fdir_filter(dev, &fdir_rule, TRUE); } else if (fdir_rule.mode == HINIC_FDIR_MODE_TCAM) { - ret = hinic_add_del_tcam_fdir_filter(dev, - &fdir_rule, TRUE); + ret = hinic_add_del_tcam_fdir_filter(dev, &fdir_rule, + TRUE); } else { PMD_DRV_LOG(INFO, "flow fdir rule create failed, rule mode wrong"); goto out; @@ -3048,6 +3056,13 @@ static struct rte_flow *hinic_flow_create(struct rte_eth_dev *dev, sizeof(struct hinic_fdir_rule_ele), 0); if (fdir_rule_ptr == NULL) { PMD_DRV_LOG(ERR, "Failed to allocate fdir_rule_ptr"); + if (fdir_rule.mode == HINIC_FDIR_MODE_NORMAL) + hinic_add_del_fdir_filter(dev, + &fdir_rule, FALSE); + else if (fdir_rule.mode == HINIC_FDIR_MODE_TCAM) + hinic_add_del_tcam_fdir_filter(dev, + &fdir_rule, FALSE); + goto out; } rte_memcpy(&fdir_rule_ptr->filter_info, &fdir_rule,