net/ixgbe: support VF promiscuous by PF driver
[dpdk.git] / drivers / net / ixgbe / ixgbe_ethdev.c
index 7493110..97e1021 100644 (file)
@@ -260,6 +260,8 @@ static int ixgbevf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
 static void ixgbevf_set_ivar_map(struct ixgbe_hw *hw, int8_t direction,
                                 uint8_t queue, uint8_t msix_vector);
 static void ixgbevf_configure_msix(struct rte_eth_dev *dev);
+static void ixgbevf_dev_promiscuous_enable(struct rte_eth_dev *dev);
+static void ixgbevf_dev_promiscuous_disable(struct rte_eth_dev *dev);
 static void ixgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev);
 static void ixgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev);
 
@@ -596,6 +598,8 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = {
        .xstats_get_names     = ixgbevf_dev_xstats_get_names,
        .dev_close            = ixgbevf_dev_close,
        .dev_reset            = ixgbevf_dev_reset,
+       .promiscuous_enable   = ixgbevf_dev_promiscuous_enable,
+       .promiscuous_disable  = ixgbevf_dev_promiscuous_disable,
        .allmulticast_enable  = ixgbevf_dev_allmulticast_enable,
        .allmulticast_disable = ixgbevf_dev_allmulticast_disable,
        .dev_infos_get        = ixgbevf_dev_info_get,
@@ -1336,6 +1340,9 @@ eth_ixgbe_dev_uninit(struct rte_eth_dev *eth_dev)
                rte_delay_ms(100);
        } while (retries++ < (10 + IXGBE_LINK_UP_TIME));
 
+       /* cancel the delay handler before remove dev */
+       rte_eal_alarm_cancel(ixgbe_dev_interrupt_delayed_handler, eth_dev);
+
        /* uninitialize PF if max_vfs not zero */
        ixgbe_pf_host_uninit(eth_dev);
 
@@ -1508,6 +1515,7 @@ ixgbevf_negotiate_api(struct ixgbe_hw *hw)
 
        /* start with highest supported, proceed down */
        static const enum ixgbe_pfvf_api_rev sup_ver[] = {
+               ixgbe_mbox_api_13,
                ixgbe_mbox_api_12,
                ixgbe_mbox_api_11,
                ixgbe_mbox_api_10,
@@ -2652,10 +2660,16 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
                goto error;
        }
 
-       /* Skip link setup if loopback mode is enabled for 82599. */
-       if (hw->mac.type == ixgbe_mac_82599EB &&
-                       dev->data->dev_conf.lpbk_mode == IXGBE_LPBK_82599_TX_RX)
-               goto skip_link_setup;
+       /* Skip link setup if loopback mode is enabled. */
+       if (dev->data->dev_conf.lpbk_mode != 0) {
+               err = ixgbe_check_supported_loopback_mode(dev);
+               if (err < 0) {
+                       PMD_INIT_LOG(ERR, "Unsupported loopback mode");
+                       goto error;
+               } else {
+                       goto skip_link_setup;
+               }
+       }
 
        if (ixgbe_is_sfp(hw) && hw->phy.multispeed_fiber) {
                err = hw->mac.ops.setup_sfp(hw);
@@ -8300,6 +8314,22 @@ ixgbe_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
        return ret;
 }
 
+static void
+ixgbevf_dev_promiscuous_enable(struct rte_eth_dev *dev)
+{
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
+       hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_PROMISC);
+}
+
+static void
+ixgbevf_dev_promiscuous_disable(struct rte_eth_dev *dev)
+{
+       struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+
+       hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_NONE);
+}
+
 static void
 ixgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev)
 {