ethdev: add device flag to bypass auto-filled queue xstats
[dpdk.git] / drivers / net / i40e / i40e_ethdev_vf.c
index ac6c25b..53154c3 100644 (file)
@@ -74,7 +74,7 @@ enum i40evf_aq_result {
 
 static int i40evf_dev_configure(struct rte_eth_dev *dev);
 static int i40evf_dev_start(struct rte_eth_dev *dev);
-static void i40evf_dev_stop(struct rte_eth_dev *dev);
+static int i40evf_dev_stop(struct rte_eth_dev *dev);
 static int i40evf_dev_info_get(struct rte_eth_dev *dev,
                               struct rte_eth_dev_info *dev_info);
 static int i40evf_dev_link_update(struct rte_eth_dev *dev,
@@ -90,7 +90,7 @@ static int i40evf_dev_xstats_reset(struct rte_eth_dev *dev);
 static int i40evf_vlan_filter_set(struct rte_eth_dev *dev,
                                  uint16_t vlan_id, int on);
 static int i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
-static void i40evf_dev_close(struct rte_eth_dev *dev);
+static int i40evf_dev_close(struct rte_eth_dev *dev);
 static int i40evf_dev_reset(struct rte_eth_dev *dev);
 static int i40evf_check_vf_reset_done(struct rte_eth_dev *dev);
 static int i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev);
@@ -199,12 +199,8 @@ static const struct eth_dev_ops i40evf_eth_dev_ops = {
        .rx_queue_release     = i40e_dev_rx_queue_release,
        .rx_queue_intr_enable = i40evf_dev_rx_queue_intr_enable,
        .rx_queue_intr_disable = i40evf_dev_rx_queue_intr_disable,
-       .rx_descriptor_done   = i40e_dev_rx_descriptor_done,
-       .rx_descriptor_status = i40e_dev_rx_descriptor_status,
-       .tx_descriptor_status = i40e_dev_tx_descriptor_status,
        .tx_queue_setup       = i40e_dev_tx_queue_setup,
        .tx_queue_release     = i40e_dev_tx_queue_release,
-       .rx_queue_count       = i40e_dev_rx_queue_count,
        .rxq_info_get         = i40e_rxq_info_get,
        .txq_info_get         = i40e_txq_info_get,
        .mac_addr_add         = i40evf_add_mac_addr,
@@ -469,7 +465,8 @@ i40evf_get_vf_resource(struct rte_eth_dev *dev)
                       VIRTCHNL_VF_OFFLOAD_RSS_AQ |
                       VIRTCHNL_VF_OFFLOAD_RSS_REG |
                       VIRTCHNL_VF_OFFLOAD_VLAN |
-                      VIRTCHNL_VF_OFFLOAD_RX_POLLING;
+                      VIRTCHNL_VF_OFFLOAD_RX_POLLING |
+                      VIRTCHNL_VF_CAP_ADV_LINK_SPEED;
                args.in_args = (uint8_t *)∩︀
                args.in_args_size = sizeof(caps);
        } else {
@@ -1381,15 +1378,54 @@ i40evf_handle_pf_event(struct rte_eth_dev *dev, uint8_t *msg,
        switch (pf_msg->event) {
        case VIRTCHNL_EVENT_RESET_IMPENDING:
                PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_RESET_IMPENDING event");
-               _rte_eth_dev_callback_process(dev,
+               rte_eth_dev_callback_process(dev,
                                RTE_ETH_EVENT_INTR_RESET, NULL);
                break;
        case VIRTCHNL_EVENT_LINK_CHANGE:
                PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_LINK_CHANGE event");
-               vf->link_up = pf_msg->event_data.link_event.link_status;
-               vf->link_speed = pf_msg->event_data.link_event.link_speed;
+
+               if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_CAP_ADV_LINK_SPEED) {
+                       vf->link_up =
+                               pf_msg->event_data.link_event_adv.link_status;
+
+                       switch (pf_msg->event_data.link_event_adv.link_speed) {
+                       case ETH_SPEED_NUM_100M:
+                               vf->link_speed = VIRTCHNL_LINK_SPEED_100MB;
+                               break;
+                       case ETH_SPEED_NUM_1G:
+                               vf->link_speed = VIRTCHNL_LINK_SPEED_1GB;
+                               break;
+                       case ETH_SPEED_NUM_2_5G:
+                               vf->link_speed = VIRTCHNL_LINK_SPEED_2_5GB;
+                               break;
+                       case ETH_SPEED_NUM_5G:
+                               vf->link_speed = VIRTCHNL_LINK_SPEED_5GB;
+                               break;
+                       case ETH_SPEED_NUM_10G:
+                               vf->link_speed = VIRTCHNL_LINK_SPEED_10GB;
+                               break;
+                       case ETH_SPEED_NUM_20G:
+                               vf->link_speed = VIRTCHNL_LINK_SPEED_20GB;
+                               break;
+                       case ETH_SPEED_NUM_25G:
+                               vf->link_speed = VIRTCHNL_LINK_SPEED_25GB;
+                               break;
+                       case ETH_SPEED_NUM_40G:
+                               vf->link_speed = VIRTCHNL_LINK_SPEED_40GB;
+                               break;
+                       default:
+                               vf->link_speed = VIRTCHNL_LINK_SPEED_UNKNOWN;
+                               break;
+                       }
+               } else {
+                       vf->link_up =
+                               pf_msg->event_data.link_event.link_status;
+                       vf->link_speed =
+                               pf_msg->event_data.link_event.link_speed;
+               }
+
                i40evf_dev_link_update(dev, 0);
-               _rte_eth_dev_callback_process(dev,
+               rte_eth_dev_callback_process(dev,
                                RTE_ETH_EVENT_INTR_LSC, NULL);
                break;
        case VIRTCHNL_EVENT_PF_DRIVER_CLOSE:
@@ -1521,6 +1557,10 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
 
        /* assign ops func pointer */
        eth_dev->dev_ops = &i40evf_eth_dev_ops;
+       eth_dev->rx_queue_count       = i40e_dev_rx_queue_count;
+       eth_dev->rx_descriptor_done   = i40e_dev_rx_descriptor_done;
+       eth_dev->rx_descriptor_status = i40e_dev_rx_descriptor_status;
+       eth_dev->tx_descriptor_status = i40e_dev_tx_descriptor_status;
        eth_dev->rx_pkt_burst = &i40e_recv_pkts;
        eth_dev->tx_pkt_burst = &i40e_xmit_pkts;
 
@@ -1535,6 +1575,7 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
        }
        i40e_set_default_ptype_table(eth_dev);
        rte_eth_copy_pci_info(eth_dev, pci_dev);
+       eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
 
        hw->vendor_id = pci_dev->id.vendor_id;
        hw->device_id = pci_dev->id.device_id;
@@ -1546,11 +1587,6 @@ i40evf_dev_init(struct rte_eth_dev *eth_dev)
        hw->adapter_stopped = 1;
        hw->adapter_closed = 0;
 
-       /* Pass the information to the rte_eth_dev_close() that it should also
-        * release the private port resources.
-        */
-       eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
-
        if(i40evf_init_vf(eth_dev) != 0) {
                PMD_INIT_LOG(ERR, "Init vf failed");
                return -1;
@@ -2141,7 +2177,7 @@ err_queue:
        return -1;
 }
 
-static void
+static int
 i40evf_dev_stop(struct rte_eth_dev *dev)
 {
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
@@ -2155,7 +2191,7 @@ i40evf_dev_stop(struct rte_eth_dev *dev)
                rte_intr_disable(intr_handle);
 
        if (hw->adapter_stopped == 1)
-               return;
+               return 0;
        i40evf_stop_queues(dev);
        i40evf_disable_queues_intr(dev);
        i40e_dev_clear_queues(dev);
@@ -2172,7 +2208,9 @@ i40evf_dev_stop(struct rte_eth_dev *dev)
        i40evf_add_del_mc_addr_list(dev, vf->mc_addrs, vf->mc_addrs_num,
                                FALSE);
        hw->adapter_stopped = 1;
+       dev->data->dev_started = 0;
 
+       return 0;
 }
 
 static int
@@ -2361,13 +2399,18 @@ i40evf_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
        return ret;
 }
 
-static void
+static int
 i40evf_dev_close(struct rte_eth_dev *dev)
 {
        struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
+       int ret;
+
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return 0;
+
+       ret = i40evf_dev_stop(dev);
 
-       i40evf_dev_stop(dev);
        i40e_dev_free_queues(dev);
        /*
         * disable promiscuous mode before reset vf
@@ -2383,16 +2426,13 @@ i40evf_dev_close(struct rte_eth_dev *dev)
        i40e_shutdown_adminq(hw);
        i40evf_disable_irq0(hw);
 
-       dev->dev_ops = NULL;
-       dev->rx_pkt_burst = NULL;
-       dev->tx_pkt_burst = NULL;
-
        rte_free(vf->vf_res);
        vf->vf_res = NULL;
        rte_free(vf->aq_resp);
        vf->aq_resp = NULL;
 
        hw->adapter_closed = 1;
+       return ret;
 }
 
 /*