net/enic: enable flow API for VF representor
[dpdk.git] / drivers / net / hns3 / hns3_ethdev_vf.c
index c93d35e..037a5be 100644 (file)
@@ -745,7 +745,8 @@ hns3vf_init_ring_with_vector(struct hns3_hw *hw)
 static int
 hns3vf_dev_configure(struct rte_eth_dev *dev)
 {
-       struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       struct hns3_adapter *hns = dev->data->dev_private;
+       struct hns3_hw *hw = &hns->hw;
        struct hns3_rss_conf *rss_cfg = &hw->rss_info;
        struct rte_eth_conf *conf = &dev->data->dev_conf;
        enum rte_eth_rx_mq_mode mq_mode = conf->rxmode.mq_mode;
@@ -820,6 +821,13 @@ hns3vf_dev_configure(struct rte_eth_dev *dev)
        if (ret)
                goto cfg_err;
 
+       hns->rx_simple_allowed = true;
+       hns->rx_vec_allowed = true;
+       hns->tx_simple_allowed = true;
+       hns->tx_vec_allowed = true;
+
+       hns3_init_rx_ptype_tble(dev);
+
        hw->adapter_state = HNS3_NIC_CONFIGURED;
        return 0;
 
@@ -863,6 +871,25 @@ hns3vf_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
                return -EIO;
        }
 
+       /*
+        * when Rx of scattered packets is off, we have some possibility of
+        * using vector Rx process function or simple Rx functions in hns3 PMD
+        * driver. If the input MTU is increased and the maximum length of
+        * received packets is greater than the length of a buffer for Rx
+        * packet, the hardware network engine needs to use multiple BDs and
+        * buffers to store these packets. This will cause problems when still
+        * using vector Rx process function or simple Rx function to receiving
+        * packets. So, when Rx of scattered packets is off and device is
+        * started, it is not permitted to increase MTU so that the maximum
+        * length of Rx packets is greater than Rx buffer length.
+        */
+       if (dev->data->dev_started && !dev->data->scattered_rx &&
+           frame_size > hw->rx_buf_len) {
+               hns3_err(hw, "failed to set mtu because current is "
+                       "not scattered rx mode");
+               return -EOPNOTSUPP;
+       }
+
        rte_spinlock_lock(&hw->lock);
        ret = hns3vf_config_mtu(hw, mtu);
        if (ret) {
@@ -952,6 +979,10 @@ hns3vf_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info)
                .rx_drop_en = 1,
                .offloads = 0,
        };
+       info->default_txconf = (struct rte_eth_txconf) {
+               .tx_rs_thresh = HNS3_DEFAULT_TX_RS_THRESH,
+               .offloads = 0,
+       };
 
        info->vmdq_queue_num = 0;
 
@@ -1874,6 +1905,7 @@ hns3vf_dev_stop(struct rte_eth_dev *dev)
                hns3_dev_release_mbufs(hns);
                hw->adapter_state = HNS3_NIC_CONFIGURED;
        }
+       hns3_rx_scattered_reset(dev);
        rte_eal_alarm_cancel(hns3vf_service_handler, dev);
        rte_spinlock_unlock(&hw->lock);
 }
@@ -2110,6 +2142,7 @@ hns3vf_dev_start(struct rte_eth_dev *dev)
        hw->adapter_state = HNS3_NIC_STARTED;
        rte_spinlock_unlock(&hw->lock);
 
+       hns3_rx_scattered_calc(dev);
        hns3_set_rxtx_function(dev);
        hns3_mp_req_start_rxtx(dev);
        rte_eal_alarm_set(HNS3VF_SERVICE_INTERVAL, hns3vf_service_handler, dev);
@@ -2507,6 +2540,7 @@ hns3vf_reinit_dev(struct hns3_adapter *hns)
 }
 
 static const struct eth_dev_ops hns3vf_eth_dev_ops = {
+       .dev_configure      = hns3vf_dev_configure,
        .dev_start          = hns3vf_dev_start,
        .dev_stop           = hns3vf_dev_stop,
        .dev_close          = hns3vf_dev_close,
@@ -2532,7 +2566,8 @@ static const struct eth_dev_ops hns3vf_eth_dev_ops = {
        .rx_queue_intr_disable  = hns3_dev_rx_queue_intr_disable,
        .rxq_info_get       = hns3_rxq_info_get,
        .txq_info_get       = hns3_txq_info_get,
-       .dev_configure      = hns3vf_dev_configure,
+       .rx_burst_mode_get  = hns3_rx_burst_mode_get,
+       .tx_burst_mode_get  = hns3_tx_burst_mode_get,
        .mac_addr_add       = hns3vf_add_mac_addr,
        .mac_addr_remove    = hns3vf_remove_mac_addr,
        .mac_addr_set       = hns3vf_set_default_mac_addr,