net/enic: enable flow API for VF representor
[dpdk.git] / drivers / net / hns3 / hns3_ethdev_vf.c
index cf098c2..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) {
@@ -915,7 +942,6 @@ hns3vf_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info)
                                 DEV_RX_OFFLOAD_JUMBO_FRAME |
                                 DEV_RX_OFFLOAD_RSS_HASH |
                                 DEV_RX_OFFLOAD_TCP_LRO);
-       info->tx_queue_offload_capa = DEV_TX_OFFLOAD_MBUF_FAST_FREE;
        info->tx_offload_capa = (DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM |
                                 DEV_TX_OFFLOAD_IPV4_CKSUM |
                                 DEV_TX_OFFLOAD_TCP_CKSUM |
@@ -926,7 +952,7 @@ hns3vf_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info)
                                 DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
                                 DEV_TX_OFFLOAD_GRE_TNL_TSO |
                                 DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
-                                info->tx_queue_offload_capa |
+                                DEV_TX_OFFLOAD_MBUF_FAST_FREE |
                                 hns3_txvlan_cap_get(hw));
 
        info->rx_desc_lim = (struct rte_eth_desc_lim) {
@@ -944,12 +970,18 @@ hns3vf_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info)
        };
 
        info->default_rxconf = (struct rte_eth_rxconf) {
+               .rx_free_thresh = HNS3_DEFAULT_RX_FREE_THRESH,
                /*
                 * If there are no available Rx buffer descriptors, incoming
                 * packets are always dropped by hardware based on hns3 network
                 * engine.
                 */
                .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;
@@ -1133,6 +1165,7 @@ hns3vf_get_capability(struct hns3_hw *hw)
                hw->intr.mapping_mode = HNS3_INTR_MAPPING_VEC_RSV_ONE;
                hw->intr.coalesce_mode = HNS3_INTR_COALESCE_NON_QL;
                hw->intr.gl_unit = HNS3_INTR_COALESCE_GL_UINT_2US;
+               hw->min_tx_pkt_len = HNS3_HIP08_MIN_TX_PKT_LEN;
                return 0;
        }
 
@@ -1147,6 +1180,7 @@ hns3vf_get_capability(struct hns3_hw *hw)
        hw->intr.mapping_mode = HNS3_INTR_MAPPING_VEC_ALL;
        hw->intr.coalesce_mode = HNS3_INTR_COALESCE_QL;
        hw->intr.gl_unit = HNS3_INTR_COALESCE_GL_UINT_1US;
+       hw->min_tx_pkt_len = HNS3_HIP09_MIN_TX_PKT_LEN;
 
        return 0;
 }
@@ -1746,21 +1780,6 @@ hns3vf_init_vf(struct rte_eth_dev *eth_dev)
                goto err_get_config;
        }
 
-       /*
-        * The hns3 PF ethdev driver in kernel support setting VF MAC address
-        * on the host by "ip link set ..." command. To avoid some incorrect
-        * scenes, for example, hns3 VF PMD driver fails to receive and send
-        * packets after user configure the MAC address by using the
-        * "ip link set ..." command, hns3 VF PMD driver keep the same MAC
-        * address strategy as the hns3 kernel ethdev driver in the
-        * initialization. If user configure a MAC address by the ip command
-        * for VF device, then hns3 VF PMD driver will start with it, otherwise
-        * start with a random MAC address in the initialization.
-        */
-       ret = rte_is_zero_ether_addr((struct rte_ether_addr *)hw->mac.mac_addr);
-       if (ret)
-               rte_eth_random_addr(hw->mac.mac_addr);
-
        ret = hns3vf_clear_vport_list(hw);
        if (ret) {
                PMD_INIT_LOG(ERR, "Failed to clear tbl list: %d", ret);
@@ -1886,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);
 }
@@ -2122,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);
@@ -2519,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,
@@ -2544,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,
@@ -2642,8 +2665,22 @@ hns3vf_dev_init(struct rte_eth_dev *eth_dev)
                goto err_rte_zmalloc;
        }
 
+       /*
+        * The hns3 PF ethdev driver in kernel support setting VF MAC address
+        * on the host by "ip link set ..." command. To avoid some incorrect
+        * scenes, for example, hns3 VF PMD driver fails to receive and send
+        * packets after user configure the MAC address by using the
+        * "ip link set ..." command, hns3 VF PMD driver keep the same MAC
+        * address strategy as the hns3 kernel ethdev driver in the
+        * initialization. If user configure a MAC address by the ip command
+        * for VF device, then hns3 VF PMD driver will start with it, otherwise
+        * start with a random MAC address in the initialization.
+        */
+       if (rte_is_zero_ether_addr((struct rte_ether_addr *)hw->mac.mac_addr))
+               rte_eth_random_addr(hw->mac.mac_addr);
        rte_ether_addr_copy((struct rte_ether_addr *)hw->mac.mac_addr,
                            &eth_dev->data->mac_addrs[0]);
+
        hw->adapter_state = HNS3_NIC_INITIALIZED;
        /*
         * Pass the information to the rte_eth_dev_close() that it should also