net/dpaa2: fix getting link status
[dpdk.git] / drivers / net / dpaa2 / dpaa2_ethdev.c
index 7bd3208..a81c734 100644 (file)
@@ -9,7 +9,7 @@
 #include <net/if.h>
 
 #include <rte_mbuf.h>
-#include <rte_ethdev_driver.h>
+#include <ethdev_driver.h>
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
 #include <rte_string_fns.h>
@@ -31,6 +31,8 @@
 
 #define DRIVER_LOOPBACK_MODE "drv_loopback"
 #define DRIVER_NO_PREFETCH_MODE "drv_no_prefetch"
+#define CHECK_INTERVAL         100  /* 100ms */
+#define MAX_REPEAT_TIME        90   /* 9s (90 * 100ms) in total */
 
 /* Supported Rx offloads */
 static uint64_t dev_rx_offloads_sup =
@@ -65,6 +67,8 @@ static uint64_t dev_tx_offloads_nodis =
 
 /* enable timestamp in mbuf */
 bool dpaa2_enable_ts[RTE_MAX_ETHPORTS];
+uint64_t dpaa2_timestamp_rx_dynflag;
+int dpaa2_timestamp_dynfield_offset = -1;
 
 struct rte_dpaa2_xstats_name_off {
        char name[RTE_ETH_XSTATS_NAME_SIZE];
@@ -91,10 +95,6 @@ static const struct rte_dpaa2_xstats_name_off dpaa2_xstats_strings[] = {
 };
 
 static const enum rte_filter_op dpaa2_supported_filter_ops[] = {
-       RTE_ETH_FILTER_ADD,
-       RTE_ETH_FILTER_DELETE,
-       RTE_ETH_FILTER_UPDATE,
-       RTE_ETH_FILTER_FLUSH,
        RTE_ETH_FILTER_GET
 };
 
@@ -587,7 +587,16 @@ dpaa2_eth_dev_configure(struct rte_eth_dev *dev)
 #if !defined(RTE_LIBRTE_IEEE1588)
        if (rx_offloads & DEV_RX_OFFLOAD_TIMESTAMP)
 #endif
+       {
+               ret = rte_mbuf_dyn_rx_timestamp_register(
+                               &dpaa2_timestamp_dynfield_offset,
+                               &dpaa2_timestamp_rx_dynflag);
+               if (ret != 0) {
+                       DPAA2_PMD_ERR("Error to register timestamp field/flag");
+                       return -rte_errno;
+               }
                dpaa2_enable_ts[dev->data->port_id] = true;
+       }
 
        if (tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM)
                tx_l3_csum_offload = true;
@@ -1195,7 +1204,7 @@ dpaa2_dev_start(struct rte_eth_dev *dev)
  *  This routine disables all traffic on the adapter by issuing a
  *  global reset on the MAC.
  */
-static void
+static int
 dpaa2_dev_stop(struct rte_eth_dev *dev)
 {
        struct dpaa2_dev_priv *priv = dev->data->dev_private;
@@ -1227,12 +1236,14 @@ dpaa2_dev_stop(struct rte_eth_dev *dev)
        if (ret) {
                DPAA2_PMD_ERR("Failure (ret %d) in disabling dpni %d dev",
                              ret, priv->hw_id);
-               return;
+               return ret;
        }
 
        /* clear the recorded link status */
        memset(&link, 0, sizeof(link));
        rte_eth_linkstatus_set(dev, &link);
+
+       return 0;
 }
 
 static int
@@ -1284,10 +1295,6 @@ dpaa2_dev_close(struct rte_eth_dev *dev)
        if (priv->extract.qos_extract_param)
                rte_free((void *)(size_t)priv->extract.qos_extract_param);
 
-       dev->dev_ops = NULL;
-       dev->rx_pkt_burst = NULL;
-       dev->tx_pkt_burst = NULL;
-
        DPAA2_PMD_INFO("%s: netdev deleted", dev->data->name);
        return 0;
 }
@@ -1415,7 +1422,7 @@ dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        if (mtu < RTE_ETHER_MIN_MTU || frame_size > DPAA2_MAX_RX_PKT_LEN)
                return -EINVAL;
 
-       if (frame_size > RTE_ETHER_MAX_LEN)
+       if (frame_size > DPAA2_ETH_MAX_LEN)
                dev->data->dev_conf.rxmode.offloads |=
                                                DEV_RX_OFFLOAD_JUMBO_FRAME;
        else
@@ -1800,23 +1807,32 @@ error:
 /* return 0 means link status changed, -1 means not changed */
 static int
 dpaa2_dev_link_update(struct rte_eth_dev *dev,
-                       int wait_to_complete __rte_unused)
+                     int wait_to_complete)
 {
        int ret;
        struct dpaa2_dev_priv *priv = dev->data->dev_private;
        struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
        struct rte_eth_link link;
        struct dpni_link_state state = {0};
+       uint8_t count;
 
        if (dpni == NULL) {
                DPAA2_PMD_ERR("dpni is NULL");
                return 0;
        }
 
-       ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state);
-       if (ret < 0) {
-               DPAA2_PMD_DEBUG("error: dpni_get_link_state %d", ret);
-               return -1;
+       for (count = 0; count <= MAX_REPEAT_TIME; count++) {
+               ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token,
+                                         &state);
+               if (ret < 0) {
+                       DPAA2_PMD_DEBUG("error: dpni_get_link_state %d", ret);
+                       return -1;
+               }
+               if (state.up == ETH_LINK_DOWN &&
+                   wait_to_complete)
+                       rte_delay_ms(CHECK_INTERVAL);
+               else
+                       break;
        }
 
        memset(&link, 0, sizeof(struct rte_eth_link));
@@ -2793,10 +2809,11 @@ rte_dpaa2_probe(struct rte_dpaa2_driver *dpaa2_drv,
        dpaa2_dev->eth_dev = eth_dev;
        eth_dev->data->rx_mbuf_alloc_failed = 0;
 
-       eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
        if (dpaa2_drv->drv_flags & RTE_DPAA2_DRV_INTR_LSC)
                eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
 
+       eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
+
        /* Invoke PMD device initialization function */
        diag = dpaa2_dev_init(eth_dev);
        if (diag == 0) {