net/hns3: support some device operations
authorWei Hu (Xavier) <xavier.huwei@huawei.com>
Thu, 26 Sep 2019 14:01:54 +0000 (22:01 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 7 Oct 2019 13:00:56 +0000 (15:00 +0200)
This patch adds the following operations defined in struct eth_dev_ops:
mtu_set, infos_get and fw_version_get for hns3 PMD driver.

Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
Signed-off-by: Chunsong Feng <fengchunsong@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
Signed-off-by: Hao Chen <chenhao164@huawei.com>
Signed-off-by: Huisong Li <lihuisong@huawei.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
doc/guides/nics/features/hns3.ini
drivers/net/hns3/hns3_ethdev.c

index 43ade8c..2eb78d0 100644 (file)
@@ -4,8 +4,10 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+MTU update           = Y
 Unicast MAC filter   = Y
 Multicast MAC filter = Y
+FW version           = Y
 Linux UIO            = Y
 Linux VFIO           = Y
 ARMv8                = Y
index 25b2720..6164002 100644 (file)
@@ -944,6 +944,111 @@ hns3_config_mtu(struct hns3_hw *hw, uint16_t mps)
        return 0;
 }
 
+static int
+hns3_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
+{
+       struct hns3_adapter *hns = dev->data->dev_private;
+       uint32_t frame_size = mtu + HNS3_ETH_OVERHEAD;
+       struct hns3_hw *hw = &hns->hw;
+       bool is_jumbo_frame;
+       int ret;
+
+       if (dev->data->dev_started) {
+               hns3_err(hw, "Failed to set mtu, port %u must be stopped "
+                        "before configuration", dev->data->port_id);
+               return -EBUSY;
+       }
+
+       rte_spinlock_lock(&hw->lock);
+       is_jumbo_frame = frame_size > RTE_ETHER_MAX_LEN ? true : false;
+       frame_size = RTE_MAX(frame_size, HNS3_DEFAULT_FRAME_LEN);
+
+       /*
+        * Maximum value of frame_size is HNS3_MAX_FRAME_LEN, so it can safely
+        * assign to "uint16_t" type variable.
+        */
+       ret = hns3_config_mtu(hw, (uint16_t)frame_size);
+       if (ret) {
+               rte_spinlock_unlock(&hw->lock);
+               hns3_err(hw, "Failed to set mtu, port %u mtu %u: %d",
+                        dev->data->port_id, mtu, ret);
+               return ret;
+       }
+       hns->pf.mps = (uint16_t)frame_size;
+       if (is_jumbo_frame)
+               dev->data->dev_conf.rxmode.offloads |=
+                                               DEV_RX_OFFLOAD_JUMBO_FRAME;
+       else
+               dev->data->dev_conf.rxmode.offloads &=
+                                               ~DEV_RX_OFFLOAD_JUMBO_FRAME;
+       dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
+       rte_spinlock_unlock(&hw->lock);
+
+       return 0;
+}
+
+static int
+hns3_dev_infos_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *info)
+{
+       struct hns3_adapter *hns = eth_dev->data->dev_private;
+       struct hns3_hw *hw = &hns->hw;
+
+       info->max_rx_queues = hw->tqps_num;
+       info->max_tx_queues = hw->tqps_num;
+       info->max_rx_pktlen = HNS3_MAX_FRAME_LEN; /* CRC included */
+       info->min_rx_bufsize = hw->rx_buf_len;
+       info->max_mac_addrs = HNS3_UC_MACADDR_NUM;
+       info->max_mtu = info->max_rx_pktlen - HNS3_ETH_OVERHEAD;
+       info->rx_offload_capa = (DEV_RX_OFFLOAD_IPV4_CKSUM |
+                                DEV_RX_OFFLOAD_TCP_CKSUM |
+                                DEV_RX_OFFLOAD_UDP_CKSUM |
+                                DEV_RX_OFFLOAD_SCTP_CKSUM |
+                                DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM |
+                                DEV_RX_OFFLOAD_OUTER_UDP_CKSUM |
+                                DEV_RX_OFFLOAD_KEEP_CRC |
+                                DEV_RX_OFFLOAD_SCATTER |
+                                DEV_RX_OFFLOAD_VLAN_STRIP |
+                                DEV_RX_OFFLOAD_QINQ_STRIP |
+                                DEV_RX_OFFLOAD_VLAN_FILTER |
+                                DEV_RX_OFFLOAD_VLAN_EXTEND |
+                                DEV_RX_OFFLOAD_JUMBO_FRAME);
+       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 |
+                                DEV_TX_OFFLOAD_UDP_CKSUM |
+                                DEV_TX_OFFLOAD_SCTP_CKSUM |
+                                DEV_TX_OFFLOAD_VLAN_INSERT |
+                                DEV_TX_OFFLOAD_QINQ_INSERT |
+                                DEV_TX_OFFLOAD_MULTI_SEGS |
+                                info->tx_queue_offload_capa);
+
+       info->vmdq_queue_num = 0;
+
+       info->default_rxportconf.burst_size = HNS3_DEFAULT_PORT_CONF_BURST_SIZE;
+       info->default_txportconf.burst_size = HNS3_DEFAULT_PORT_CONF_BURST_SIZE;
+       info->default_rxportconf.nb_queues = HNS3_DEFAULT_PORT_CONF_QUEUES_NUM;
+       info->default_txportconf.nb_queues = HNS3_DEFAULT_PORT_CONF_QUEUES_NUM;
+
+       return 0;
+}
+
+static int
+hns3_fw_version_get(struct rte_eth_dev *eth_dev, char *fw_version,
+                   size_t fw_size)
+{
+       struct hns3_adapter *hns = eth_dev->data->dev_private;
+       struct hns3_hw *hw = &hns->hw;
+       int ret;
+
+       ret = snprintf(fw_version, fw_size, "0x%08x", hw->fw_version);
+       ret += 1; /* add the size of '\0' */
+       if (fw_size < (uint32_t)ret)
+               return ret;
+       else
+               return 0;
+}
+
 static int
 hns3_parse_func_status(struct hns3_hw *hw, struct hns3_func_status_cmd *status)
 {
@@ -2338,6 +2443,9 @@ hns3_dev_close(struct rte_eth_dev *eth_dev)
 
 static const struct eth_dev_ops hns3_eth_dev_ops = {
        .dev_close          = hns3_dev_close,
+       .mtu_set            = hns3_dev_mtu_set,
+       .dev_infos_get          = hns3_dev_infos_get,
+       .fw_version_get         = hns3_fw_version_get,
        .mac_addr_add           = hns3_add_mac_addr,
        .mac_addr_remove        = hns3_remove_mac_addr,
        .mac_addr_set           = hns3_set_default_mac_addr,