drivers/net: enable hotplug on secondary process
[dpdk.git] / drivers / net / tap / rte_eth_tap.c
index 4493507..84aaf24 100644 (file)
@@ -305,8 +305,7 @@ tap_rx_offload_get_queue_capa(void)
        return DEV_RX_OFFLOAD_SCATTER |
               DEV_RX_OFFLOAD_IPV4_CKSUM |
               DEV_RX_OFFLOAD_UDP_CKSUM |
-              DEV_RX_OFFLOAD_TCP_CKSUM |
-              DEV_RX_OFFLOAD_CRC_STRIP;
+              DEV_RX_OFFLOAD_TCP_CKSUM;
 }
 
 /* Callback to handle the rx burst of packets to the correct interface and
@@ -781,12 +780,22 @@ tap_link_set_up(struct rte_eth_dev *dev)
 static int
 tap_dev_start(struct rte_eth_dev *dev)
 {
-       int err;
+       int err, i;
 
        err = tap_intr_handle_set(dev, 1);
        if (err)
                return err;
-       return tap_link_set_up(dev);
+
+       err = tap_link_set_up(dev);
+       if (err)
+               return err;
+
+       for (i = 0; i < dev->data->nb_tx_queues; i++)
+               dev->data->tx_queue_state[i] = RTE_ETH_QUEUE_STATE_STARTED;
+       for (i = 0; i < dev->data->nb_rx_queues; i++)
+               dev->data->rx_queue_state[i] = RTE_ETH_QUEUE_STATE_STARTED;
+
+       return err;
 }
 
 /* This function gets called when the current port gets stopped.
@@ -794,6 +803,13 @@ tap_dev_start(struct rte_eth_dev *dev)
 static void
 tap_dev_stop(struct rte_eth_dev *dev)
 {
+       int i;
+
+       for (i = 0; i < dev->data->nb_tx_queues; i++)
+               dev->data->tx_queue_state[i] = RTE_ETH_QUEUE_STATE_STOPPED;
+       for (i = 0; i < dev->data->nb_rx_queues; i++)
+               dev->data->rx_queue_state[i] = RTE_ETH_QUEUE_STATE_STOPPED;
+
        tap_intr_handle_set(dev, 0);
        tap_link_set_down(dev);
 }
@@ -1531,6 +1547,37 @@ tap_rss_hash_update(struct rte_eth_dev *dev,
        return 0;
 }
 
+static int
+tap_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
+{
+       dev->data->rx_queue_state[rx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
+
+       return 0;
+}
+
+static int
+tap_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
+{
+       dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
+
+       return 0;
+}
+
+static int
+tap_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
+{
+       dev->data->rx_queue_state[rx_queue_id] = RTE_ETH_QUEUE_STATE_STOPPED;
+
+       return 0;
+}
+
+static int
+tap_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
+{
+       dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STOPPED;
+
+       return 0;
+}
 static const struct eth_dev_ops ops = {
        .dev_start              = tap_dev_start,
        .dev_stop               = tap_dev_stop,
@@ -1539,6 +1586,10 @@ static const struct eth_dev_ops ops = {
        .dev_infos_get          = tap_dev_info,
        .rx_queue_setup         = tap_rx_queue_setup,
        .tx_queue_setup         = tap_tx_queue_setup,
+       .rx_queue_start         = tap_rx_queue_start,
+       .tx_queue_start         = tap_tx_queue_start,
+       .rx_queue_stop          = tap_rx_queue_stop,
+       .tx_queue_stop          = tap_tx_queue_stop,
        .rx_queue_release       = tap_rx_queue_release,
        .tx_queue_release       = tap_tx_queue_release,
        .flow_ctrl_get          = tap_flow_ctrl_get,
@@ -1879,6 +1930,8 @@ rte_pmd_tun_probe(struct rte_vdev_device *dev)
                        return -1;
                }
                eth_dev->dev_ops = &ops;
+               eth_dev->device = &dev->device;
+               rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
 
@@ -1939,8 +1992,7 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev)
        name = rte_vdev_device_name(dev);
        params = rte_vdev_device_args(dev);
 
-       if (rte_eal_process_type() == RTE_PROC_SECONDARY &&
-           strlen(params) == 0) {
+       if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
                eth_dev = rte_eth_dev_attach_secondary(name);
                if (!eth_dev) {
                        TAP_LOG(ERR, "Failed to probe %s", name);
@@ -1948,6 +2000,7 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev)
                }
                /* TODO: request info from primary to set up Rx and Tx */
                eth_dev->dev_ops = &ops;
+               eth_dev->device = &dev->device;
                rte_eth_dev_probing_finish(eth_dev);
                return 0;
        }
@@ -2021,7 +2074,10 @@ rte_pmd_tap_remove(struct rte_vdev_device *dev)
        /* find the ethdev entry */
        eth_dev = rte_eth_dev_allocated(rte_vdev_device_name(dev));
        if (!eth_dev)
-               return 0;
+               return -ENODEV;
+
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return rte_eth_dev_release_port_secondary(eth_dev);
 
        internals = eth_dev->data->dev_private;