net/i40e: cleanup Tx buffers
[dpdk.git] / drivers / net / i40e / i40e_ethdev.c
index 5abf60e..afb6f55 100644 (file)
@@ -443,6 +443,8 @@ static const struct rte_pci_id pci_id_i40e_map[] = {
        { RTE_PCI_DEVICE(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_X710_N3000) },
        { RTE_PCI_DEVICE(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_XXV710_N3000) },
        { RTE_PCI_DEVICE(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_10G_BASE_T_BC) },
+       { RTE_PCI_DEVICE(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_10G_B) },
+       { RTE_PCI_DEVICE(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_10G_SFP) },
        { .vendor_id = 0, /* sentinel */ },
 };
 
@@ -522,6 +524,7 @@ static const struct eth_dev_ops i40e_eth_dev_ops = {
        .mac_addr_set                 = i40e_set_default_mac_addr,
        .mtu_set                      = i40e_dev_mtu_set,
        .tm_ops_get                   = i40e_tm_ops_get,
+       .tx_done_cleanup              = i40e_tx_done_cleanup,
 };
 
 /* store statistics names and its offset in stats structure */
@@ -698,13 +701,14 @@ static int eth_i40e_pci_remove(struct rte_pci_device *pci_dev)
 
        ethdev = rte_eth_dev_allocated(pci_dev->device.name);
        if (!ethdev)
-               return -ENODEV;
-
+               return 0;
 
        if (ethdev->data->dev_flags & RTE_ETH_DEV_REPRESENTOR)
-               return rte_eth_dev_destroy(ethdev, i40e_vf_representor_uninit);
+               return rte_eth_dev_pci_generic_remove(pci_dev,
+                                       i40e_vf_representor_uninit);
        else
-               return rte_eth_dev_destroy(ethdev, eth_i40e_dev_uninit);
+               return rte_eth_dev_pci_generic_remove(pci_dev,
+                                               eth_i40e_dev_uninit);
 }
 
 static struct rte_pci_driver rte_i40e_pmd = {
@@ -1392,6 +1396,9 @@ eth_i40e_dev_init(struct rte_eth_dev *dev, void *init_params __rte_unused)
        hw->adapter_stopped = 0;
        hw->adapter_closed = 0;
 
+       /* Init switch device pointer */
+       hw->switch_dev = NULL;
+
        /*
         * Switch Tag value should not be identical to either the First Tag
         * or Second Tag values. So set something other than common Ethertype
@@ -1643,7 +1650,7 @@ eth_i40e_dev_init(struct rte_eth_dev *dev, void *init_params __rte_unused)
        /* Set the max frame size to 0x2600 by default,
         * in case other drivers changed the default value.
         */
-       i40e_aq_set_mac_config(hw, I40E_FRAME_SIZE_MAX, TRUE, 0, NULL);
+       i40e_aq_set_mac_config(hw, I40E_FRAME_SIZE_MAX, TRUE, false, 0, NULL);
 
        /* initialize mirror rule list */
        TAILQ_INIT(&pf->mirror_list);
@@ -1812,6 +1819,9 @@ i40e_dev_configure(struct rte_eth_dev *dev)
        ad->tx_simple_allowed = true;
        ad->tx_vec_allowed = true;
 
+       if (dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG)
+               dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH;
+
        /* Only legacy filter API needs the following fdir config. So when the
         * legacy filter API is deprecated, the following codes should also be
         * removed.
@@ -2234,6 +2244,9 @@ i40e_apply_link_speed(struct rte_eth_dev *dev)
        struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct rte_eth_conf *conf = &dev->data->dev_conf;
 
+       abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK |
+                    I40E_AQ_PHY_LINK_ENABLED;
+
        if (conf->link_speeds == ETH_LINK_SPEED_AUTONEG) {
                conf->link_speeds = ETH_LINK_SPEED_40G |
                                    ETH_LINK_SPEED_25G |
@@ -2241,11 +2254,12 @@ i40e_apply_link_speed(struct rte_eth_dev *dev)
                                    ETH_LINK_SPEED_10G |
                                    ETH_LINK_SPEED_1G |
                                    ETH_LINK_SPEED_100M;
+
+               abilities |= I40E_AQ_PHY_AN_ENABLED;
+       } else {
+               abilities &= ~I40E_AQ_PHY_AN_ENABLED;
        }
        speed = i40e_parse_link_speeds(conf->link_speeds);
-       abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK |
-                    I40E_AQ_PHY_AN_ENABLED |
-                    I40E_AQ_PHY_LINK_ENABLED;
 
        return i40e_phy_conf_link(hw, abilities, speed, true);
 }
@@ -2264,13 +2278,6 @@ i40e_dev_start(struct rte_eth_dev *dev)
 
        hw->adapter_stopped = 0;
 
-       if (dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED) {
-               PMD_INIT_LOG(ERR,
-               "Invalid link_speeds for port %u, autonegotiation disabled",
-                             dev->data->port_id);
-               return -EINVAL;
-       }
-
        rte_intr_disable(intr_handle);
 
        if ((rte_intr_cap_multiple(intr_handle) ||
@@ -2587,7 +2594,7 @@ i40e_dev_close(struct rte_eth_dev *dev)
        do {
                ret = rte_intr_callback_unregister(intr_handle,
                                i40e_dev_interrupt_handler, dev);
-               if (ret >= 0) {
+               if (ret >= 0 || ret == -ENOENT) {
                        break;
                } else if (ret != -EAGAIN) {
                        PMD_INIT_LOG(ERR,
@@ -2903,6 +2910,9 @@ i40e_dev_link_update(struct rte_eth_dev *dev,
        else
                update_link_aq(hw, &link, enable_lse, wait_to_complete);
 
+       if (hw->switch_dev)
+               rte_eth_linkstatus_get(hw->switch_dev, &link);
+
        ret = rte_eth_linkstatus_set(dev, &link);
        i40e_notify_all_vfs_link_status(dev);
 
@@ -3613,7 +3623,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
                DEV_RX_OFFLOAD_SCATTER |
                DEV_RX_OFFLOAD_VLAN_EXTEND |
                DEV_RX_OFFLOAD_VLAN_FILTER |
-               DEV_RX_OFFLOAD_JUMBO_FRAME;
+               DEV_RX_OFFLOAD_JUMBO_FRAME |
+               DEV_RX_OFFLOAD_RSS_HASH;
 
        dev_info->tx_queue_offload_capa = DEV_TX_OFFLOAD_MBUF_FAST_FREE;
        dev_info->tx_offload_capa =
@@ -11566,12 +11577,12 @@ i40e_dcb_init_configure(struct rte_eth_dev *dev, bool sw_dcb)
         */
        if (sw_dcb == TRUE) {
                if (i40e_need_stop_lldp(dev)) {
-                       ret = i40e_aq_stop_lldp(hw, TRUE, NULL);
+                       ret = i40e_aq_stop_lldp(hw, TRUE, TRUE, NULL);
                        if (ret != I40E_SUCCESS)
                                PMD_INIT_LOG(DEBUG, "Failed to stop lldp");
                }
 
-               ret = i40e_init_dcb(hw);
+               ret = i40e_init_dcb(hw, true);
                /* If lldp agent is stopped, the return value from
                 * i40e_init_dcb we expect is failure with I40E_AQ_RC_EPERM
                 * adminq status. Otherwise, it should return success.
@@ -11615,11 +11626,11 @@ i40e_dcb_init_configure(struct rte_eth_dev *dev, bool sw_dcb)
                        return -ENOTSUP;
                }
        } else {
-               ret = i40e_aq_start_lldp(hw, NULL);
+               ret = i40e_aq_start_lldp(hw, true, NULL);
                if (ret != I40E_SUCCESS)
                        PMD_INIT_LOG(DEBUG, "Failed to start lldp");
 
-               ret = i40e_init_dcb(hw);
+               ret = i40e_init_dcb(hw, true);
                if (!ret) {
                        if (hw->dcbx_status == I40E_DCBX_STATUS_DISABLED) {
                                PMD_INIT_LOG(ERR,
@@ -12340,6 +12351,14 @@ i40e_update_customized_pctype(struct rte_eth_dev *dev, uint8_t *pkg,
                        new_pctype =
                                i40e_find_customized_pctype(pf,
                                                      I40E_CUSTOMIZED_GTPU);
+               else if (!strcmp(name, "IPV4_L2TPV3"))
+                       new_pctype =
+                               i40e_find_customized_pctype(pf,
+                                               I40E_CUSTOMIZED_IPV4_L2TPV3);
+               else if (!strcmp(name, "IPV6_L2TPV3"))
+                       new_pctype =
+                               i40e_find_customized_pctype(pf,
+                                               I40E_CUSTOMIZED_IPV6_L2TPV3);
                if (new_pctype) {
                        if (op == RTE_PMD_I40E_PKG_OP_WR_ADD) {
                                new_pctype->pctype = pctype_value;
@@ -12533,7 +12552,8 @@ i40e_update_customized_ptype(struct rte_eth_dev *dev, uint8_t *pkg,
                                                RTE_PTYPE_TUNNEL_GRENAT;
                                        in_tunnel = true;
                                } else if (!strncasecmp(name, "L2TPV2CTL", 9) ||
-                                          !strncasecmp(name, "L2TPV2", 6)) {
+                                          !strncasecmp(name, "L2TPV2", 6) ||
+                                          !strncasecmp(name, "L2TPV3", 6)) {
                                        ptype_mapping[i].sw_ptype |=
                                                RTE_PTYPE_TUNNEL_L2TP;
                                        in_tunnel = true;