net/bnxt: fail init when mbuf allocation fails
[dpdk.git] / drivers / net / liquidio / lio_ethdev.c
index b9e5734..90ffe31 100644 (file)
@@ -2,8 +2,9 @@
  * Copyright(c) 2017 Cavium, Inc
  */
 
-#include <rte_ethdev_driver.h>
-#include <rte_ethdev_pci.h>
+#include <rte_string_fns.h>
+#include <ethdev_driver.h>
+#include <ethdev_pci.h>
 #include <rte_cycles.h>
 #include <rte_malloc.h>
 #include <rte_alarm.h>
@@ -14,9 +15,6 @@
 #include "lio_ethdev.h"
 #include "lio_rxtx.h"
 
-int lio_logtype_init;
-int lio_logtype_driver;
-
 /* Default RSS key in use */
 static uint8_t lio_rss_key[40] = {
        0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2,
@@ -242,17 +240,18 @@ lio_dev_xstats_get_names(struct rte_eth_dev *eth_dev,
 }
 
 /* Reset hw stats for the port */
-static void
+static int
 lio_dev_xstats_reset(struct rte_eth_dev *eth_dev)
 {
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
        struct lio_dev_ctrl_cmd ctrl_cmd;
        struct lio_ctrl_pkt ctrl_pkt;
+       int ret;
 
        if (!lio_dev->intf_open) {
                lio_dev_err(lio_dev, "Port %d down\n",
                            lio_dev->port_id);
-               return;
+               return -EINVAL;
        }
 
        /* flush added to prevent cmd failure
@@ -269,19 +268,21 @@ lio_dev_xstats_reset(struct rte_eth_dev *eth_dev)
        ctrl_pkt.ncmd.s.cmd = LIO_CMD_CLEAR_STATS;
        ctrl_pkt.ctrl_cmd = &ctrl_cmd;
 
-       if (lio_send_ctrl_pkt(lio_dev, &ctrl_pkt)) {
+       ret = lio_send_ctrl_pkt(lio_dev, &ctrl_pkt);
+       if (ret != 0) {
                lio_dev_err(lio_dev, "Failed to send clear stats command\n");
-               return;
+               return ret;
        }
 
-       if (lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd)) {
+       ret = lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd);
+       if (ret != 0) {
                lio_dev_err(lio_dev, "Clear stats command timed out\n");
-               return;
+               return ret;
        }
 
        /* clear stored per queue stats */
-       RTE_FUNC_PTR_OR_RET(*eth_dev->dev_ops->stats_reset);
-       (*eth_dev->dev_ops->stats_reset)(eth_dev);
+       RTE_FUNC_PTR_OR_ERR_RET(*eth_dev->dev_ops->stats_reset, 0);
+       return (*eth_dev->dev_ops->stats_reset)(eth_dev);
 }
 
 /* Retrieve the device statistics (# packets in/out, # bytes in/out, etc */
@@ -337,7 +338,7 @@ lio_dev_stats_get(struct rte_eth_dev *eth_dev,
        return 0;
 }
 
-static void
+static int
 lio_dev_stats_reset(struct rte_eth_dev *eth_dev)
 {
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
@@ -364,17 +365,17 @@ lio_dev_stats_reset(struct rte_eth_dev *eth_dev)
                        memset(oq_stats, 0, sizeof(struct lio_droq_stats));
                }
        }
+
+       return 0;
 }
 
-static void
+static int
 lio_dev_info_get(struct rte_eth_dev *eth_dev,
                 struct rte_eth_dev_info *devinfo)
 {
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
        struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);
 
-       devinfo->pci_dev = pci_dev;
-
        switch (pci_dev->id.subsystem_device_id) {
        /* CN23xx 10G cards */
        case PCI_SUBSYS_DEV_ID_CN2350_210:
@@ -383,17 +384,18 @@ lio_dev_info_get(struct rte_eth_dev *eth_dev,
        case PCI_SUBSYS_DEV_ID_CN2360_210SVPN3:
        case PCI_SUBSYS_DEV_ID_CN2350_210SVPT:
        case PCI_SUBSYS_DEV_ID_CN2360_210SVPT:
-               devinfo->speed_capa = ETH_LINK_SPEED_10G;
+               devinfo->speed_capa = RTE_ETH_LINK_SPEED_10G;
                break;
        /* CN23xx 25G cards */
        case PCI_SUBSYS_DEV_ID_CN2350_225:
        case PCI_SUBSYS_DEV_ID_CN2360_225:
-               devinfo->speed_capa = ETH_LINK_SPEED_25G;
+               devinfo->speed_capa = RTE_ETH_LINK_SPEED_25G;
                break;
        default:
-               devinfo->speed_capa = ETH_LINK_SPEED_10G;
+               devinfo->speed_capa = RTE_ETH_LINK_SPEED_10G;
                lio_dev_err(lio_dev,
                            "Unknown CN23XX subsystem device id. Setting 10G as default link speed.\n");
+               return -EINVAL;
        }
 
        devinfo->max_rx_queues = lio_dev->max_rx_queues;
@@ -404,34 +406,34 @@ lio_dev_info_get(struct rte_eth_dev *eth_dev,
 
        devinfo->max_mac_addrs = 1;
 
-       devinfo->rx_offload_capa = (DEV_RX_OFFLOAD_IPV4_CKSUM           |
-                                   DEV_RX_OFFLOAD_UDP_CKSUM            |
-                                   DEV_RX_OFFLOAD_TCP_CKSUM            |
-                                   DEV_RX_OFFLOAD_VLAN_STRIP);
-       devinfo->tx_offload_capa = (DEV_TX_OFFLOAD_IPV4_CKSUM           |
-                                   DEV_TX_OFFLOAD_UDP_CKSUM            |
-                                   DEV_TX_OFFLOAD_TCP_CKSUM            |
-                                   DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM);
+       devinfo->rx_offload_capa = (RTE_ETH_RX_OFFLOAD_IPV4_CKSUM               |
+                                   RTE_ETH_RX_OFFLOAD_UDP_CKSUM                |
+                                   RTE_ETH_RX_OFFLOAD_TCP_CKSUM                |
+                                   RTE_ETH_RX_OFFLOAD_VLAN_STRIP               |
+                                   RTE_ETH_RX_OFFLOAD_RSS_HASH);
+       devinfo->tx_offload_capa = (RTE_ETH_TX_OFFLOAD_IPV4_CKSUM               |
+                                   RTE_ETH_TX_OFFLOAD_UDP_CKSUM                |
+                                   RTE_ETH_TX_OFFLOAD_TCP_CKSUM                |
+                                   RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM);
 
        devinfo->rx_desc_lim = lio_rx_desc_lim;
        devinfo->tx_desc_lim = lio_tx_desc_lim;
 
        devinfo->reta_size = LIO_RSS_MAX_TABLE_SZ;
        devinfo->hash_key_size = LIO_RSS_MAX_KEY_SZ;
-       devinfo->flow_type_rss_offloads = (ETH_RSS_IPV4                 |
-                                          ETH_RSS_NONFRAG_IPV4_TCP     |
-                                          ETH_RSS_IPV6                 |
-                                          ETH_RSS_NONFRAG_IPV6_TCP     |
-                                          ETH_RSS_IPV6_EX              |
-                                          ETH_RSS_IPV6_TCP_EX);
+       devinfo->flow_type_rss_offloads = (RTE_ETH_RSS_IPV4                     |
+                                          RTE_ETH_RSS_NONFRAG_IPV4_TCP |
+                                          RTE_ETH_RSS_IPV6                     |
+                                          RTE_ETH_RSS_NONFRAG_IPV6_TCP |
+                                          RTE_ETH_RSS_IPV6_EX          |
+                                          RTE_ETH_RSS_IPV6_TCP_EX);
+       return 0;
 }
 
 static int
 lio_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
 {
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
-       uint16_t pf_mtu = lio_dev->linfo.link.s.mtu;
-       uint32_t frame_len = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
        struct lio_dev_ctrl_cmd ctrl_cmd;
        struct lio_ctrl_pkt ctrl_pkt;
 
@@ -443,15 +445,6 @@ lio_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
                return -EINVAL;
        }
 
-       /* check if VF MTU is within allowed range.
-        * New value should not exceed PF MTU.
-        */
-       if ((mtu < ETHER_MIN_MTU) || (mtu > pf_mtu)) {
-               lio_dev_err(lio_dev, "VF MTU should be >= %d and <= %d\n",
-                           ETHER_MIN_MTU, pf_mtu);
-               return -EINVAL;
-       }
-
        /* flush added to prevent cmd failure
         * incase the queue is full
         */
@@ -477,14 +470,6 @@ lio_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
                return -1;
        }
 
-       if (frame_len > ETHER_MAX_LEN)
-               eth_dev->data->dev_conf.rxmode.jumbo_frame = 1;
-       else
-               eth_dev->data->dev_conf.rxmode.jumbo_frame = 0;
-
-       eth_dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_len;
-       eth_dev->data->mtu = mtu;
-
        return 0;
 }
 
@@ -534,10 +519,10 @@ lio_dev_rss_reta_update(struct rte_eth_dev *eth_dev,
        rss_param->param.flags &= ~LIO_RSS_PARAM_ITABLE_UNCHANGED;
        rss_param->param.itablesize = LIO_RSS_MAX_TABLE_SZ;
 
-       for (i = 0; i < (reta_size / RTE_RETA_GROUP_SIZE); i++) {
-               for (j = 0; j < RTE_RETA_GROUP_SIZE; j++) {
+       for (i = 0; i < (reta_size / RTE_ETH_RETA_GROUP_SIZE); i++) {
+               for (j = 0; j < RTE_ETH_RETA_GROUP_SIZE; j++) {
                        if ((reta_conf[i].mask) & ((uint64_t)1 << j)) {
-                               index = (i * RTE_RETA_GROUP_SIZE) + j;
+                               index = (i * RTE_ETH_RETA_GROUP_SIZE) + j;
                                rss_state->itable[index] = reta_conf[i].reta[j];
                        }
                }
@@ -577,12 +562,12 @@ lio_dev_rss_reta_query(struct rte_eth_dev *eth_dev,
                return -EINVAL;
        }
 
-       num = reta_size / RTE_RETA_GROUP_SIZE;
+       num = reta_size / RTE_ETH_RETA_GROUP_SIZE;
 
        for (i = 0; i < num; i++) {
                memcpy(reta_conf->reta,
-                      &rss_state->itable[i * RTE_RETA_GROUP_SIZE],
-                      RTE_RETA_GROUP_SIZE);
+                      &rss_state->itable[i * RTE_ETH_RETA_GROUP_SIZE],
+                      RTE_ETH_RETA_GROUP_SIZE);
                reta_conf++;
        }
 
@@ -610,17 +595,17 @@ lio_dev_rss_hash_conf_get(struct rte_eth_dev *eth_dev,
                memcpy(hash_key, rss_state->hash_key, rss_state->hash_key_size);
 
        if (rss_state->ip)
-               rss_hf |= ETH_RSS_IPV4;
+               rss_hf |= RTE_ETH_RSS_IPV4;
        if (rss_state->tcp_hash)
-               rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP;
+               rss_hf |= RTE_ETH_RSS_NONFRAG_IPV4_TCP;
        if (rss_state->ipv6)
-               rss_hf |= ETH_RSS_IPV6;
+               rss_hf |= RTE_ETH_RSS_IPV6;
        if (rss_state->ipv6_tcp_hash)
-               rss_hf |= ETH_RSS_NONFRAG_IPV6_TCP;
+               rss_hf |= RTE_ETH_RSS_NONFRAG_IPV6_TCP;
        if (rss_state->ipv6_ex)
-               rss_hf |= ETH_RSS_IPV6_EX;
+               rss_hf |= RTE_ETH_RSS_IPV6_EX;
        if (rss_state->ipv6_tcp_ex_hash)
-               rss_hf |= ETH_RSS_IPV6_TCP_EX;
+               rss_hf |= RTE_ETH_RSS_IPV6_TCP_EX;
 
        rss_conf->rss_hf = rss_hf;
 
@@ -688,42 +673,42 @@ lio_dev_rss_hash_update(struct rte_eth_dev *eth_dev,
                if (rss_state->hash_disable)
                        return -EINVAL;
 
-               if (rss_conf->rss_hf & ETH_RSS_IPV4) {
+               if (rss_conf->rss_hf & RTE_ETH_RSS_IPV4) {
                        hashinfo |= LIO_RSS_HASH_IPV4;
                        rss_state->ip = 1;
                } else {
                        rss_state->ip = 0;
                }
 
-               if (rss_conf->rss_hf & ETH_RSS_NONFRAG_IPV4_TCP) {
+               if (rss_conf->rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_TCP) {
                        hashinfo |= LIO_RSS_HASH_TCP_IPV4;
                        rss_state->tcp_hash = 1;
                } else {
                        rss_state->tcp_hash = 0;
                }
 
-               if (rss_conf->rss_hf & ETH_RSS_IPV6) {
+               if (rss_conf->rss_hf & RTE_ETH_RSS_IPV6) {
                        hashinfo |= LIO_RSS_HASH_IPV6;
                        rss_state->ipv6 = 1;
                } else {
                        rss_state->ipv6 = 0;
                }
 
-               if (rss_conf->rss_hf & ETH_RSS_NONFRAG_IPV6_TCP) {
+               if (rss_conf->rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_TCP) {
                        hashinfo |= LIO_RSS_HASH_TCP_IPV6;
                        rss_state->ipv6_tcp_hash = 1;
                } else {
                        rss_state->ipv6_tcp_hash = 0;
                }
 
-               if (rss_conf->rss_hf & ETH_RSS_IPV6_EX) {
+               if (rss_conf->rss_hf & RTE_ETH_RSS_IPV6_EX) {
                        hashinfo |= LIO_RSS_HASH_IPV6_EX;
                        rss_state->ipv6_ex = 1;
                } else {
                        rss_state->ipv6_ex = 0;
                }
 
-               if (rss_conf->rss_hf & ETH_RSS_IPV6_TCP_EX) {
+               if (rss_conf->rss_hf & RTE_ETH_RSS_IPV6_TCP_EX) {
                        hashinfo |= LIO_RSS_HASH_TCP_IPV6_EX;
                        rss_state->ipv6_tcp_ex_hash = 1;
                } else {
@@ -772,7 +757,7 @@ lio_dev_udp_tunnel_add(struct rte_eth_dev *eth_dev,
        if (udp_tnl == NULL)
                return -EINVAL;
 
-       if (udp_tnl->prot_type != RTE_TUNNEL_TYPE_VXLAN) {
+       if (udp_tnl->prot_type != RTE_ETH_TUNNEL_TYPE_VXLAN) {
                lio_dev_err(lio_dev, "Unsupported tunnel type\n");
                return -1;
        }
@@ -829,7 +814,7 @@ lio_dev_udp_tunnel_del(struct rte_eth_dev *eth_dev,
        if (udp_tnl == NULL)
                return -EINVAL;
 
-       if (udp_tnl->prot_type != RTE_TUNNEL_TYPE_VXLAN) {
+       if (udp_tnl->prot_type != RTE_ETH_TUNNEL_TYPE_VXLAN) {
                lio_dev_err(lio_dev, "Unsupported tunnel type\n");
                return -1;
        }
@@ -927,10 +912,10 @@ lio_dev_link_update(struct rte_eth_dev *eth_dev,
 
        /* Initialize */
        memset(&link, 0, sizeof(link));
-       link.link_status = ETH_LINK_DOWN;
-       link.link_speed = ETH_SPEED_NUM_NONE;
-       link.link_duplex = ETH_LINK_HALF_DUPLEX;
-       link.link_autoneg = ETH_LINK_AUTONEG;
+       link.link_status = RTE_ETH_LINK_DOWN;
+       link.link_speed = RTE_ETH_SPEED_NUM_NONE;
+       link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
+       link.link_autoneg = RTE_ETH_LINK_AUTONEG;
 
        /* Return what we found */
        if (lio_dev->linfo.link.s.link_up == 0) {
@@ -938,18 +923,18 @@ lio_dev_link_update(struct rte_eth_dev *eth_dev,
                return rte_eth_linkstatus_set(eth_dev, &link);
        }
 
-       link.link_status = ETH_LINK_UP; /* Interface is up */
-       link.link_duplex = ETH_LINK_FULL_DUPLEX;
+       link.link_status = RTE_ETH_LINK_UP; /* Interface is up */
+       link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
        switch (lio_dev->linfo.link.s.speed) {
        case LIO_LINK_SPEED_10000:
-               link.link_speed = ETH_SPEED_NUM_10G;
+               link.link_speed = RTE_ETH_SPEED_NUM_10G;
                break;
        case LIO_LINK_SPEED_25000:
-               link.link_speed = ETH_SPEED_NUM_25G;
+               link.link_speed = RTE_ETH_SPEED_NUM_25G;
                break;
        default:
-               link.link_speed = ETH_SPEED_NUM_NONE;
-               link.link_duplex = ETH_LINK_HALF_DUPLEX;
+               link.link_speed = RTE_ETH_SPEED_NUM_NONE;
+               link.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
        }
 
        return rte_eth_linkstatus_set(eth_dev, &link);
@@ -958,8 +943,12 @@ lio_dev_link_update(struct rte_eth_dev *eth_dev,
 /**
  * \brief Net device enable, disable allmulticast
  * @param eth_dev Pointer to the structure rte_eth_dev
+ *
+ * @return
+ *  On success return 0
+ *  On failure return negative errno
  */
-static void
+static int
 lio_change_dev_flag(struct rte_eth_dev *eth_dev)
 {
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
@@ -984,14 +973,18 @@ lio_change_dev_flag(struct rte_eth_dev *eth_dev)
 
        if (lio_send_ctrl_pkt(lio_dev, &ctrl_pkt)) {
                lio_dev_err(lio_dev, "Failed to send change flag message\n");
-               return;
+               return -EAGAIN;
        }
 
-       if (lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd))
+       if (lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd)) {
                lio_dev_err(lio_dev, "Change dev flag command timed out\n");
+               return -ETIMEDOUT;
+       }
+
+       return 0;
 }
 
-static void
+static int
 lio_dev_promiscuous_enable(struct rte_eth_dev *eth_dev)
 {
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
@@ -999,20 +992,20 @@ lio_dev_promiscuous_enable(struct rte_eth_dev *eth_dev)
        if (strcmp(lio_dev->firmware_version, LIO_VF_TRUST_MIN_VERSION) < 0) {
                lio_dev_err(lio_dev, "Require firmware version >= %s\n",
                            LIO_VF_TRUST_MIN_VERSION);
-               return;
+               return -EAGAIN;
        }
 
        if (!lio_dev->intf_open) {
                lio_dev_err(lio_dev, "Port %d down, can't enable promiscuous\n",
                            lio_dev->port_id);
-               return;
+               return -EAGAIN;
        }
 
        lio_dev->ifflags |= LIO_IFFLAG_PROMISC;
-       lio_change_dev_flag(eth_dev);
+       return lio_change_dev_flag(eth_dev);
 }
 
-static void
+static int
 lio_dev_promiscuous_disable(struct rte_eth_dev *eth_dev)
 {
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
@@ -1020,20 +1013,20 @@ lio_dev_promiscuous_disable(struct rte_eth_dev *eth_dev)
        if (strcmp(lio_dev->firmware_version, LIO_VF_TRUST_MIN_VERSION) < 0) {
                lio_dev_err(lio_dev, "Require firmware version >= %s\n",
                            LIO_VF_TRUST_MIN_VERSION);
-               return;
+               return -EAGAIN;
        }
 
        if (!lio_dev->intf_open) {
                lio_dev_err(lio_dev, "Port %d down, can't disable promiscuous\n",
                            lio_dev->port_id);
-               return;
+               return -EAGAIN;
        }
 
        lio_dev->ifflags &= ~LIO_IFFLAG_PROMISC;
-       lio_change_dev_flag(eth_dev);
+       return lio_change_dev_flag(eth_dev);
 }
 
-static void
+static int
 lio_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
 {
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
@@ -1041,14 +1034,14 @@ lio_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
        if (!lio_dev->intf_open) {
                lio_dev_err(lio_dev, "Port %d down, can't enable multicast\n",
                            lio_dev->port_id);
-               return;
+               return -EAGAIN;
        }
 
        lio_dev->ifflags |= LIO_IFFLAG_ALLMULTI;
-       lio_change_dev_flag(eth_dev);
+       return lio_change_dev_flag(eth_dev);
 }
 
-static void
+static int
 lio_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
 {
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
@@ -1056,11 +1049,11 @@ lio_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
        if (!lio_dev->intf_open) {
                lio_dev_err(lio_dev, "Port %d down, can't disable multicast\n",
                            lio_dev->port_id);
-               return;
+               return -EAGAIN;
        }
 
        lio_dev->ifflags &= ~LIO_IFFLAG_ALLMULTI;
-       lio_change_dev_flag(eth_dev);
+       return lio_change_dev_flag(eth_dev);
 }
 
 static void
@@ -1093,8 +1086,8 @@ lio_dev_rss_configure(struct rte_eth_dev *eth_dev)
 
                q_idx = (uint8_t)((eth_dev->data->nb_rx_queues > 1) ?
                                  i % eth_dev->data->nb_rx_queues : 0);
-               conf_idx = i / RTE_RETA_GROUP_SIZE;
-               reta_idx = i % RTE_RETA_GROUP_SIZE;
+               conf_idx = i / RTE_ETH_RETA_GROUP_SIZE;
+               reta_idx = i % RTE_ETH_RETA_GROUP_SIZE;
                reta_conf[conf_idx].reta[reta_idx] = q_idx;
                reta_conf[conf_idx].mask |= ((uint64_t)1 << reta_idx);
        }
@@ -1110,10 +1103,10 @@ lio_dev_mq_rx_configure(struct rte_eth_dev *eth_dev)
        struct rte_eth_rss_conf rss_conf;
 
        switch (eth_dev->data->dev_conf.rxmode.mq_mode) {
-       case ETH_MQ_RX_RSS:
+       case RTE_ETH_MQ_RX_RSS:
                lio_dev_rss_configure(eth_dev);
                break;
-       case ETH_MQ_RX_NONE:
+       case RTE_ETH_MQ_RX_NONE:
        /* if mq_mode is none, disable rss mode. */
        default:
                memset(&rss_conf, 0, sizeof(rss_conf));
@@ -1168,7 +1161,7 @@ lio_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no,
 
        /* Free previous allocation if any */
        if (eth_dev->data->rx_queues[q_no] != NULL) {
-               lio_dev_rx_queue_release(eth_dev->data->rx_queues[q_no]);
+               lio_dev_rx_queue_release(eth_dev, q_no);
                eth_dev->data->rx_queues[q_no] = NULL;
        }
 
@@ -1190,16 +1183,18 @@ lio_dev_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no,
  * Release the receive queue/ringbuffer. Called by
  * the upper layers.
  *
- * @param rxq
- *    Opaque pointer to the receive queue to release
+ * @param eth_dev
+ *    Pointer to Ethernet device structure.
+ * @param q_no
+ *    Receive queue index.
  *
  * @return
  *    - nothing
  */
 void
-lio_dev_rx_queue_release(void *rxq)
+lio_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t q_no)
 {
-       struct lio_droq *droq = rxq;
+       struct lio_droq *droq = dev->data->rx_queues[q_no];
        int oq_no;
 
        if (droq) {
@@ -1248,7 +1243,7 @@ lio_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no,
 
        /* Free previous allocation if any */
        if (eth_dev->data->tx_queues[q_no] != NULL) {
-               lio_dev_tx_queue_release(eth_dev->data->tx_queues[q_no]);
+               lio_dev_tx_queue_release(eth_dev, q_no);
                eth_dev->data->tx_queues[q_no] = NULL;
        }
 
@@ -1278,16 +1273,18 @@ lio_dev_tx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t q_no,
  * Release the transmit queue/ringbuffer. Called by
  * the upper layers.
  *
- * @param txq
- *    Opaque pointer to the transmit queue to release
+ * @param eth_dev
+ *    Pointer to Ethernet device structure.
+ * @param q_no
+ *   Transmit queue index.
  *
  * @return
  *    - nothing
  */
 void
-lio_dev_tx_queue_release(void *txq)
+lio_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t q_no)
 {
-       struct lio_instr_queue *tq = txq;
+       struct lio_instr_queue *tq = dev->data->tx_queues[q_no];
        uint32_t fw_mapped_iq_no;
 
 
@@ -1384,8 +1381,6 @@ lio_sync_link_state_check(void *eth_dev)
 static int
 lio_dev_start(struct rte_eth_dev *eth_dev)
 {
-       uint16_t mtu;
-       uint32_t frame_len = eth_dev->data->dev_conf.rxmode.max_rx_pkt_len;
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
        uint16_t timeout = LIO_MAX_CMD_TIMEOUT;
        int ret = 0;
@@ -1405,6 +1400,11 @@ lio_dev_start(struct rte_eth_dev *eth_dev)
        /* Configure RSS if device configured with multiple RX queues. */
        lio_dev_mq_rx_configure(eth_dev);
 
+       /* Before update the link info,
+        * must set linfo.link.link_status64 to 0.
+        */
+       lio_dev->linfo.link.link_status64 = 0;
+
        /* start polling for lsc */
        ret = rte_eal_alarm_set(LIO_LSC_TIMEOUT,
                                lio_sync_link_state_check,
@@ -1423,15 +1423,9 @@ lio_dev_start(struct rte_eth_dev *eth_dev)
                goto dev_mtu_set_error;
        }
 
-       mtu = (uint16_t)(frame_len - ETHER_HDR_LEN - ETHER_CRC_LEN);
-       if (mtu < ETHER_MIN_MTU)
-               mtu = ETHER_MIN_MTU;
-
-       if (eth_dev->data->mtu != mtu) {
-               ret = lio_dev_mtu_set(eth_dev, mtu);
-               if (ret)
-                       goto dev_mtu_set_error;
-       }
+       ret = lio_dev_mtu_set(eth_dev, eth_dev->data->mtu);
+       if (ret != 0)
+               goto dev_mtu_set_error;
 
        return 0;
 
@@ -1446,12 +1440,13 @@ dev_lsc_handle_error:
 }
 
 /* Stop device and disable input/output functions */
-static void
+static int
 lio_dev_stop(struct rte_eth_dev *eth_dev)
 {
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
 
        lio_dev_info(lio_dev, "Stopping port %d\n", eth_dev->data->port_id);
+       eth_dev->data->dev_started = 0;
        lio_dev->intf_open = 0;
        rte_mb();
 
@@ -1464,6 +1459,8 @@ lio_dev_stop(struct rte_eth_dev *eth_dev)
 
        /* Clear recorded link status */
        lio_dev->linfo.link.link_status64 = 0;
+
+       return 0;
 }
 
 static int
@@ -1487,7 +1484,7 @@ lio_dev_set_link_up(struct rte_eth_dev *eth_dev)
        }
 
        lio_dev->linfo.link.s.link_up = 1;
-       eth_dev->data->dev_link.link_status = ETH_LINK_UP;
+       eth_dev->data->dev_link.link_status = RTE_ETH_LINK_UP;
 
        return 0;
 }
@@ -1508,11 +1505,11 @@ lio_dev_set_link_down(struct rte_eth_dev *eth_dev)
        }
 
        lio_dev->linfo.link.s.link_up = 0;
-       eth_dev->data->dev_link.link_status = ETH_LINK_DOWN;
+       eth_dev->data->dev_link.link_status = RTE_ETH_LINK_DOWN;
 
        if (lio_send_rx_ctrl_cmd(eth_dev, 0)) {
                lio_dev->linfo.link.s.link_up = 1;
-               eth_dev->data->dev_link.link_status = ETH_LINK_UP;
+               eth_dev->data->dev_link.link_status = RTE_ETH_LINK_UP;
                lio_dev_err(lio_dev, "Unable to set Link Down\n");
                return -1;
        }
@@ -1531,20 +1528,24 @@ lio_dev_set_link_down(struct rte_eth_dev *eth_dev)
  * @return
  *    - nothing
  */
-static void
+static int
 lio_dev_close(struct rte_eth_dev *eth_dev)
 {
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
+       int ret = 0;
+
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return 0;
 
        lio_dev_info(lio_dev, "closing port %d\n", eth_dev->data->port_id);
 
        if (lio_dev->intf_open)
-               lio_dev_stop(eth_dev);
+               ret = lio_dev_stop(eth_dev);
 
        /* Reset ioq regs */
        lio_dev->fn_list.setup_device_regs(lio_dev);
 
-       if (lio_dev->pci_dev->kdrv == RTE_KDRV_IGB_UIO) {
+       if (lio_dev->pci_dev->kdrv == RTE_PCI_KDRV_IGB_UIO) {
                cn23xx_vf_ask_pf_to_do_flr(lio_dev);
                rte_delay_ms(LIO_PCI_FLR_WAIT);
        }
@@ -1562,6 +1563,8 @@ lio_dev_close(struct rte_eth_dev *eth_dev)
 
         /* Delete all queues */
        lio_dev_clear_queues(eth_dev);
+
+       return ret;
 }
 
 /**
@@ -1679,6 +1682,7 @@ static int
 lio_reconf_queues(struct rte_eth_dev *eth_dev, int num_txq, int num_rxq)
 {
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
+       int ret;
 
        if (lio_dev->nb_rx_queues != num_rxq ||
            lio_dev->nb_tx_queues != num_txq) {
@@ -1688,8 +1692,11 @@ lio_reconf_queues(struct rte_eth_dev *eth_dev, int num_txq, int num_rxq)
                lio_dev->nb_tx_queues = num_txq;
        }
 
-       if (lio_dev->intf_open)
-               lio_dev_stop(eth_dev);
+       if (lio_dev->intf_open) {
+               ret = lio_dev_stop(eth_dev);
+               if (ret != 0)
+                       return ret;
+       }
 
        /* Reset ioq registers */
        if (lio_dev->fn_list.setup_device_regs(lio_dev)) {
@@ -1706,7 +1713,7 @@ lio_dev_configure(struct rte_eth_dev *eth_dev)
        struct lio_device *lio_dev = LIO_DEV(eth_dev);
        uint16_t timeout = LIO_MAX_CMD_TIMEOUT;
        int retval, num_iqueues, num_oqueues;
-       uint8_t mac[ETHER_ADDR_LEN], i;
+       uint8_t mac[RTE_ETHER_ADDR_LEN], i;
        struct lio_if_cfg_resp *resp;
        struct lio_soft_command *sc;
        union lio_if_cfg if_cfg;
@@ -1714,6 +1721,10 @@ lio_dev_configure(struct rte_eth_dev *eth_dev)
 
        PMD_INIT_FUNC_TRACE();
 
+       if (eth_dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG)
+               eth_dev->data->dev_conf.rxmode.offloads |=
+                       RTE_ETH_RX_OFFLOAD_RSS_HASH;
+
        /* Inform firmware about change in number of queues to use.
         * Disable IO queues and reset registers for re-configuration.
         */
@@ -1776,8 +1787,8 @@ lio_dev_configure(struct rte_eth_dev *eth_dev)
                goto nic_config_fail;
        }
 
-       snprintf(lio_dev->firmware_version, LIO_FW_VERSION_LENGTH, "%s",
-                resp->cfg_info.lio_firmware_version);
+       strlcpy(lio_dev->firmware_version,
+               resp->cfg_info.lio_firmware_version, LIO_FW_VERSION_LENGTH);
 
        lio_swap_8B_data((uint64_t *)(&resp->cfg_info),
                         sizeof(struct octeon_if_cfg_info) >> 3);
@@ -1824,12 +1835,13 @@ lio_dev_configure(struct rte_eth_dev *eth_dev)
 
        /* 64-bit swap required on LE machines */
        lio_swap_8B_data(&lio_dev->linfo.hw_addr, 1);
-       for (i = 0; i < ETHER_ADDR_LEN; i++)
+       for (i = 0; i < RTE_ETHER_ADDR_LEN; i++)
                mac[i] = *((uint8_t *)(((uint8_t *)&lio_dev->linfo.hw_addr) +
                                       2 + i));
 
        /* Copy the permanent MAC address */
-       ether_addr_copy((struct ether_addr *)mac, &eth_dev->data->mac_addrs[0]);
+       rte_ether_addr_copy((struct rte_ether_addr *)mac,
+                       &eth_dev->data->mac_addrs[0]);
 
        /* enable firmware checksum support for tunnel packets */
        lio_enable_hw_tunnel_rx_checksum(eth_dev);
@@ -1988,7 +2000,7 @@ lio_first_time_init(struct lio_device *lio_dev,
                goto error;
 
        /* Request and wait for device reset. */
-       if (pdev->kdrv == RTE_KDRV_IGB_UIO) {
+       if (pdev->kdrv == RTE_PCI_KDRV_IGB_UIO) {
                cn23xx_vf_ask_pf_to_do_flr(lio_dev);
                /* FLR wait time doubled as a precaution. */
                rte_delay_ms(LIO_PCI_FLR_WAIT * 2);
@@ -2033,18 +2045,11 @@ lio_eth_dev_uninit(struct rte_eth_dev *eth_dev)
        PMD_INIT_FUNC_TRACE();
 
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
-               return -EPERM;
+               return 0;
 
        /* lio_free_sc_buffer_pool */
        lio_free_sc_buffer_pool(lio_dev);
 
-       rte_free(eth_dev->data->mac_addrs);
-       eth_dev->data->mac_addrs = NULL;
-
-       eth_dev->dev_ops = NULL;
-       eth_dev->rx_pkt_burst = NULL;
-       eth_dev->tx_pkt_burst = NULL;
-
        return 0;
 }
 
@@ -2086,7 +2091,7 @@ lio_eth_dev_init(struct rte_eth_dev *eth_dev)
        }
 
        eth_dev->dev_ops = &liovf_eth_dev_ops;
-       eth_dev->data->mac_addrs = rte_zmalloc("lio", ETHER_ADDR_LEN, 0);
+       eth_dev->data->mac_addrs = rte_zmalloc("lio", RTE_ETHER_ADDR_LEN, 0);
        if (eth_dev->data->mac_addrs == NULL) {
                lio_dev_err(lio_dev,
                            "MAC addresses memory allocation failed\n");
@@ -2110,19 +2115,8 @@ static int
 lio_eth_dev_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
                      struct rte_pci_device *pci_dev)
 {
-       struct rte_eth_dev *eth_dev;
-       int ret;
-
-       eth_dev = rte_eth_dev_pci_allocate(pci_dev,
-                                          sizeof(struct lio_device));
-       if (eth_dev == NULL)
-               return -ENOMEM;
-
-       ret = lio_eth_dev_init(eth_dev);
-       if (ret)
-               rte_eth_dev_pci_release(eth_dev);
-
-       return ret;
+       return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct lio_device),
+                       lio_eth_dev_init);
 }
 
 static int
@@ -2148,15 +2142,5 @@ static struct rte_pci_driver rte_liovf_pmd = {
 RTE_PMD_REGISTER_PCI(net_liovf, rte_liovf_pmd);
 RTE_PMD_REGISTER_PCI_TABLE(net_liovf, pci_id_liovf_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_liovf, "* igb_uio | vfio-pci");
-
-RTE_INIT(lio_init_log);
-static void
-lio_init_log(void)
-{
-       lio_logtype_init = rte_log_register("pmd.net.liquidio.init");
-       if (lio_logtype_init >= 0)
-               rte_log_set_level(lio_logtype_init, RTE_LOG_NOTICE);
-       lio_logtype_driver = rte_log_register("pmd.net.liquidio.driver");
-       if (lio_logtype_driver >= 0)
-               rte_log_set_level(lio_logtype_driver, RTE_LOG_NOTICE);
-}
+RTE_LOG_REGISTER_SUFFIX(lio_logtype_init, init, NOTICE);
+RTE_LOG_REGISTER_SUFFIX(lio_logtype_driver, driver, NOTICE);