net/i40e/base: enable cloud filter mode for switch config
[dpdk.git] / drivers / net / i40e / i40e_ethdev.c
index 0ada437..3e79fc9 100644 (file)
@@ -44,6 +44,7 @@
 #define ETH_I40E_FLOATING_VEB_LIST_ARG "floating_veb_list"
 #define ETH_I40E_SUPPORT_MULTI_DRIVER  "support-multi-driver"
 #define ETH_I40E_QUEUE_NUM_PER_VF_ARG  "queue-num-per-vf"
+#define ETH_I40E_USE_LATEST_VEC        "use-latest-supported-vec"
 
 #define I40E_CLEAR_PXE_WAIT_MS     200
 
@@ -409,6 +410,7 @@ static const char *const valid_keys[] = {
        ETH_I40E_FLOATING_VEB_LIST_ARG,
        ETH_I40E_SUPPORT_MULTI_DRIVER,
        ETH_I40E_QUEUE_NUM_PER_VF_ARG,
+       ETH_I40E_USE_LATEST_VEC,
        NULL};
 
 static const struct rte_pci_id pci_id_i40e_map[] = {
@@ -1202,6 +1204,64 @@ i40e_aq_debug_write_global_register(struct i40e_hw *hw,
        return i40e_aq_debug_write_register(hw, reg_addr, reg_val, cmd_details);
 }
 
+static int
+i40e_parse_latest_vec_handler(__rte_unused const char *key,
+                               const char *value,
+                               void *opaque)
+{
+       struct i40e_adapter *ad;
+       int use_latest_vec;
+
+       ad = (struct i40e_adapter *)opaque;
+
+       use_latest_vec = atoi(value);
+
+       if (use_latest_vec != 0 && use_latest_vec != 1)
+               PMD_DRV_LOG(WARNING, "Value should be 0 or 1, set it as 1!");
+
+       ad->use_latest_vec = (uint8_t)use_latest_vec;
+
+       return 0;
+}
+
+static int
+i40e_use_latest_vec(struct rte_eth_dev *dev)
+{
+       struct i40e_adapter *ad =
+               I40E_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+       struct rte_kvargs *kvlist;
+       int kvargs_count;
+
+       ad->use_latest_vec = false;
+
+       if (!dev->device->devargs)
+               return 0;
+
+       kvlist = rte_kvargs_parse(dev->device->devargs->args, valid_keys);
+       if (!kvlist)
+               return -EINVAL;
+
+       kvargs_count = rte_kvargs_count(kvlist, ETH_I40E_USE_LATEST_VEC);
+       if (!kvargs_count) {
+               rte_kvargs_free(kvlist);
+               return 0;
+       }
+
+       if (kvargs_count > 1)
+               PMD_DRV_LOG(WARNING, "More than one argument \"%s\" and only "
+                           "the first invalid or last valid one is used !",
+                           ETH_I40E_USE_LATEST_VEC);
+
+       if (rte_kvargs_process(kvlist, ETH_I40E_USE_LATEST_VEC,
+                               i40e_parse_latest_vec_handler, ad) < 0) {
+               rte_kvargs_free(kvlist);
+               return -EINVAL;
+       }
+
+       rte_kvargs_free(kvlist);
+       return 0;
+}
+
 #define I40E_ALARM_INTERVAL 50000 /* us */
 
 static int
@@ -1266,13 +1326,12 @@ eth_i40e_dev_init(struct rte_eth_dev *dev, void *init_params __rte_unused)
 
        /* Check if need to support multi-driver */
        i40e_support_multi_driver(dev);
+       /* Check if users want the latest supported vec path */
+       i40e_use_latest_vec(dev);
 
        /* Make sure all is clean before doing PF reset */
        i40e_clear_hw(hw);
 
-       /* Initialize the hardware */
-       i40e_hw_init(dev);
-
        /* Reset here to make sure all is clean for each PF */
        ret = i40e_pf_reset(hw);
        if (ret) {
@@ -1287,6 +1346,23 @@ eth_i40e_dev_init(struct rte_eth_dev *dev, void *init_params __rte_unused)
                return ret;
        }
 
+       /* Initialize the parameters for adminq */
+       i40e_init_adminq_parameter(hw);
+       ret = i40e_init_adminq(hw);
+       if (ret != I40E_SUCCESS) {
+               PMD_INIT_LOG(ERR, "Failed to init adminq: %d", ret);
+               return -EIO;
+       }
+       PMD_INIT_LOG(INFO, "FW %d.%d API %d.%d NVM %02d.%02d.%02d eetrack %04x",
+                    hw->aq.fw_maj_ver, hw->aq.fw_min_ver,
+                    hw->aq.api_maj_ver, hw->aq.api_min_ver,
+                    ((hw->nvm.version >> 12) & 0xf),
+                    ((hw->nvm.version >> 4) & 0xff),
+                    (hw->nvm.version & 0xf), hw->nvm.eetrack);
+
+       /* Initialize the hardware */
+       i40e_hw_init(dev);
+
        i40e_config_automask(pf);
 
        i40e_set_default_pctype_table(dev);
@@ -1302,20 +1378,6 @@ eth_i40e_dev_init(struct rte_eth_dev *dev, void *init_params __rte_unused)
        /* Initialize the input set for filters (hash and fd) to default value */
        i40e_filter_input_set_init(pf);
 
-       /* Initialize the parameters for adminq */
-       i40e_init_adminq_parameter(hw);
-       ret = i40e_init_adminq(hw);
-       if (ret != I40E_SUCCESS) {
-               PMD_INIT_LOG(ERR, "Failed to init adminq: %d", ret);
-               return -EIO;
-       }
-       PMD_INIT_LOG(INFO, "FW %d.%d API %d.%d NVM %02d.%02d.%02d eetrack %04x",
-                    hw->aq.fw_maj_ver, hw->aq.fw_min_ver,
-                    hw->aq.api_maj_ver, hw->aq.api_min_ver,
-                    ((hw->nvm.version >> 12) & 0xf),
-                    ((hw->nvm.version >> 4) & 0xff),
-                    (hw->nvm.version & 0xf), hw->nvm.eetrack);
-
        /* initialise the L3_MAP register */
        if (!pf->support_multi_driver) {
                ret = i40e_aq_debug_write_global_register(hw,
@@ -3377,8 +3439,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
                DEV_RX_OFFLOAD_UDP_CKSUM |
                DEV_RX_OFFLOAD_TCP_CKSUM |
                DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
-               DEV_RX_OFFLOAD_CRC_STRIP |
                DEV_RX_OFFLOAD_KEEP_CRC |
+               DEV_RX_OFFLOAD_SCATTER |
                DEV_RX_OFFLOAD_VLAN_EXTEND |
                DEV_RX_OFFLOAD_VLAN_FILTER |
                DEV_RX_OFFLOAD_JUMBO_FRAME;
@@ -3591,7 +3653,7 @@ i40e_vlan_tpid_set(struct rte_eth_dev *dev,
                        if (vlan_type == ETH_VLAN_TYPE_OUTER)
                                hw->second_tag = rte_cpu_to_le_16(tpid);
                }
-               ret = i40e_aq_set_switch_config(hw, 0, 0, NULL);
+               ret = i40e_aq_set_switch_config(hw, 0, 0, 0, NULL);
                if (ret != I40E_SUCCESS) {
                        PMD_DRV_LOG(ERR,
                                    "Set switch config failed aq_err: %d",
@@ -6580,10 +6642,8 @@ i40e_dev_alarm_handler(void *param)
        icr0 = I40E_READ_REG(hw, I40E_PFINT_ICR0);
 
        /* No interrupt event indicated */
-       if (!(icr0 & I40E_PFINT_ICR0_INTEVENT_MASK)) {
-               PMD_DRV_LOG(INFO, "No interrupt event");
+       if (!(icr0 & I40E_PFINT_ICR0_INTEVENT_MASK))
                goto done;
-       }
        if (icr0 & I40E_PFINT_ICR0_ECC_ERR_MASK)
                PMD_DRV_LOG(ERR, "ICR0: unrecoverable ECC error");
        if (icr0 & I40E_PFINT_ICR0_MAL_DETECT_MASK)
@@ -12600,4 +12660,5 @@ RTE_PMD_REGISTER_PARAM_STRING(net_i40e,
                              ETH_I40E_FLOATING_VEB_ARG "=1"
                              ETH_I40E_FLOATING_VEB_LIST_ARG "=<string>"
                              ETH_I40E_QUEUE_NUM_PER_VF_ARG "=1|2|4|8|16"
-                             ETH_I40E_SUPPORT_MULTI_DRIVER "=1");
+                             ETH_I40E_SUPPORT_MULTI_DRIVER "=1"
+                             ETH_I40E_USE_LATEST_VEC "=0|1");