X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fi40e%2Fi40e_hash.c;h=1fb8c9abfcc67331df157f62bd89c6024caaf794;hb=a9a238e9f57dd4363535bfb78c0c5c762522014a;hp=e07f806a49908ae042de1a42692e9069fcc269b1;hpb=ef4c16fd9148215897abadf8e8a965488c82ba03;p=dpdk.git diff --git a/drivers/net/i40e/i40e_hash.c b/drivers/net/i40e/i40e_hash.c index e07f806a49..1fb8c9abfc 100644 --- a/drivers/net/i40e/i40e_hash.c +++ b/drivers/net/i40e/i40e_hash.c @@ -201,11 +201,11 @@ struct i40e_hash_match_pattern { #define I40E_HASH_MAP_CUS_PATTERN(pattern, rss_mask, cus_pctype) { \ pattern, rss_mask, true, cus_pctype } -#define I40E_HASH_L2_RSS_MASK (ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY | \ +#define I40E_HASH_L2_RSS_MASK (ETH_RSS_VLAN | ETH_RSS_ETH | \ + ETH_RSS_L2_SRC_ONLY | \ ETH_RSS_L2_DST_ONLY) #define I40E_HASH_L23_RSS_MASK (I40E_HASH_L2_RSS_MASK | \ - ETH_RSS_VLAN | \ ETH_RSS_L3_SRC_ONLY | \ ETH_RSS_L3_DST_ONLY) @@ -354,9 +354,10 @@ i40e_hash_get_pattern_type(const struct rte_flow_item pattern[], } /* Check the previous item allows this sub-item. */ - if (prev_item_type >= RTE_DIM(pattern_next_allow_items) || + if (prev_item_type >= (enum rte_flow_item_type) + RTE_DIM(pattern_next_allow_items) || !(pattern_next_allow_items[prev_item_type] & - BIT_ULL(pattern->type))) + BIT_ULL(pattern->type))) goto not_sup; /* For VLAN item, it does no matter about to pattern type @@ -372,7 +373,8 @@ i40e_hash_get_pattern_type(const struct rte_flow_item pattern[], } prev_item_type = last_item_type; - assert(last_item_type < RTE_DIM(pattern_item_header)); + assert(last_item_type < (enum rte_flow_item_type) + RTE_DIM(pattern_item_header)); item_hdr = pattern_item_header[last_item_type]; assert(item_hdr); @@ -676,10 +678,6 @@ i40e_hash_enable_pctype(struct i40e_hw *hw, { uint32_t reg, reg_val, mask; - /* For X722, get translated pctype in fd pctype register */ - if (hw->mac.type == I40E_MAC_X722) - pctype = i40e_read_rx_ctl(hw, I40E_GLQF_FD_PCTYPES(pctype)); - if (pctype < 32) { mask = BIT(pctype); reg = I40E_PFQF_HENA(0); @@ -734,7 +732,7 @@ i40e_hash_config_region(struct i40e_pf *pf, const struct i40e_rte_flow_rss_conf *rss_conf) { struct i40e_hw *hw = &pf->adapter->hw; - struct rte_eth_dev *dev = pf->adapter->eth_dev; + struct rte_eth_dev *dev = &rte_eth_devices[pf->dev_data->port_id]; struct i40e_queue_region_info *regions = pf->queue_region.region; uint32_t num = pf->queue_region.queue_region_number; uint32_t i, region_id_mask = 0; @@ -901,10 +899,12 @@ i40e_hash_parse_key(const struct rte_flow_action_rss *rss_act, PMD_DRV_LOG(WARNING, "RSS key length invalid, must be %u bytes, now set key to default", (uint32_t)sizeof(rss_conf->key)); - key = (const uint8_t *)rss_key_default; + + memcpy(rss_conf->key, rss_key_default, sizeof(rss_conf->key)); + } else { + memcpy(rss_conf->key, key, sizeof(rss_conf->key)); } - memcpy(rss_conf->key, key, sizeof(rss_conf->key)); rss_conf->conf.key = rss_conf->key; rss_conf->conf.key_len = sizeof(rss_conf->key); } @@ -1105,13 +1105,21 @@ i40e_hash_parse_pattern_act(const struct rte_eth_dev *dev, NULL, "RSS Queues not supported when pattern specified"); - if (rss_act->func == RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) + switch (rss_act->func) { + case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ: rss_conf->symmetric_enable = true; - else if (rss_act->func != RTE_ETH_HASH_FUNCTION_DEFAULT) - return rte_flow_error_set(error, -EINVAL, - RTE_FLOW_ERROR_TYPE_ACTION_CONF, - NULL, - "Only symmetric TOEPLITZ supported when pattern specified"); + break; + case RTE_ETH_HASH_FUNCTION_DEFAULT: + case RTE_ETH_HASH_FUNCTION_TOEPLITZ: + case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR: + break; + default: + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ACTION_CONF, + NULL, + "RSS hash function not supported " + "when pattern specified"); + } if (!i40e_hash_validate_rss_types(rss_act->types)) return rte_flow_error_set(error, EINVAL, @@ -1262,6 +1270,7 @@ i40e_hash_reset_conf(struct i40e_pf *pf, struct i40e_rte_flow_rss_conf *rss_conf) { struct i40e_hw *hw = &pf->adapter->hw; + struct rte_eth_dev *dev; uint64_t inset; uint32_t idx; int ret; @@ -1275,8 +1284,8 @@ i40e_hash_reset_conf(struct i40e_pf *pf, } if (rss_conf->misc_reset_flags & I40E_HASH_FLOW_RESET_FLAG_REGION) { - ret = i40e_flush_queue_region_all_conf(pf->adapter->eth_dev, - hw, pf, 0); + dev = &rte_eth_devices[pf->dev_data->port_id]; + ret = i40e_flush_queue_region_all_conf(dev, hw, pf, 0); if (ret) return ret;