app/eventdev: add ethernet device setup helpers
[dpdk.git] / drivers / net / mlx5 / mlx5_ethdev.c
index d2f9876..6f78adc 100644 (file)
@@ -551,7 +551,25 @@ dev_configure(struct rte_eth_dev *dev)
        unsigned int reta_idx_n;
        const uint8_t use_app_rss_key =
                !!dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key;
-
+       uint64_t supp_tx_offloads = mlx5_priv_get_tx_port_offloads(priv);
+       uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads;
+       uint64_t supp_rx_offloads =
+               (mlx5_priv_get_rx_port_offloads(priv) |
+                mlx5_priv_get_rx_queue_offloads(priv));
+       uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;
+
+       if ((tx_offloads & supp_tx_offloads) != tx_offloads) {
+               ERROR("Some Tx offloads are not supported "
+                     "requested 0x%" PRIx64 " supported 0x%" PRIx64,
+                     tx_offloads, supp_tx_offloads);
+               return ENOTSUP;
+       }
+       if ((rx_offloads & supp_rx_offloads) != rx_offloads) {
+               ERROR("Some Rx offloads are not supported "
+                     "requested 0x%" PRIx64 " supported 0x%" PRIx64,
+                     rx_offloads, supp_rx_offloads);
+               return ENOTSUP;
+       }
        if (use_app_rss_key &&
            (dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key_len !=
             rss_hash_default_key_len)) {
@@ -663,28 +681,11 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
        info->max_rx_queues = max;
        info->max_tx_queues = max;
        info->max_mac_addrs = RTE_DIM(priv->mac);
-       info->rx_offload_capa =
-               (config->hw_csum ?
-                (DEV_RX_OFFLOAD_IPV4_CKSUM |
-                 DEV_RX_OFFLOAD_UDP_CKSUM |
-                 DEV_RX_OFFLOAD_TCP_CKSUM) :
-                0) |
-               (priv->config.hw_vlan_strip ? DEV_RX_OFFLOAD_VLAN_STRIP : 0) |
-               DEV_RX_OFFLOAD_TIMESTAMP;
-
-       if (!config->mps)
-               info->tx_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT;
-       if (config->hw_csum)
-               info->tx_offload_capa |=
-                       (DEV_TX_OFFLOAD_IPV4_CKSUM |
-                        DEV_TX_OFFLOAD_UDP_CKSUM |
-                        DEV_TX_OFFLOAD_TCP_CKSUM);
-       if (config->tso)
-               info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO;
-       if (config->tunnel_en)
-               info->tx_offload_capa |= (DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM |
-                                         DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
-                                         DEV_TX_OFFLOAD_GRE_TNL_TSO);
+       info->rx_queue_offload_capa =
+               mlx5_priv_get_rx_queue_offloads(priv);
+       info->rx_offload_capa = (mlx5_priv_get_rx_port_offloads(priv) |
+                                info->rx_queue_offload_capa);
+       info->tx_offload_capa = mlx5_priv_get_tx_port_offloads(priv);
        if (priv_get_ifname(priv, &ifname) == 0)
                info->if_index = if_nametoindex(ifname);
        info->reta_size = priv->reta_idx_n ?
@@ -1186,14 +1187,17 @@ mlx5_dev_link_status_handler(void *arg)
        struct priv *priv = dev->data->dev_private;
        int ret;
 
-       priv_lock(priv);
-       assert(priv->pending_alarm == 1);
+       while (!priv_trylock(priv)) {
+               /* Alarm is being canceled. */
+               if (priv->pending_alarm == 0)
+                       return;
+               rte_pause();
+       }
        priv->pending_alarm = 0;
        ret = priv_link_status_update(priv);
        priv_unlock(priv);
        if (!ret)
-               _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL,
-                                             NULL);
+               _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);
 }
 
 /**
@@ -1215,11 +1219,9 @@ mlx5_dev_interrupt_handler(void *cb_arg)
        events = priv_dev_status_handler(priv);
        priv_unlock(priv);
        if (events & (1 << RTE_ETH_EVENT_INTR_LSC))
-               _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL,
-                                             NULL);
+               _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);
        if (events & (1 << RTE_ETH_EVENT_INTR_RMV))
-               _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RMV, NULL,
-                                             NULL);
+               _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RMV, NULL);
 }
 
 /**
@@ -1257,9 +1259,10 @@ priv_dev_interrupt_handler_uninstall(struct priv *priv, struct rte_eth_dev *dev)
        if (priv->primary_socket)
                rte_intr_callback_unregister(&priv->intr_handle_socket,
                                             mlx5_dev_handler_socket, dev);
-       if (priv->pending_alarm)
+       if (priv->pending_alarm) {
+               priv->pending_alarm = 0;
                rte_eal_alarm_cancel(mlx5_dev_link_status_handler, dev);
-       priv->pending_alarm = 0;
+       }
        priv->intr_handle.fd = 0;
        priv->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN;
        priv->intr_handle_socket.fd = 0;
@@ -1392,16 +1395,23 @@ mlx5_set_link_up(struct rte_eth_dev *dev)
  *   Pointer to selected Tx burst function.
  */
 eth_tx_burst_t
-priv_select_tx_function(struct priv *priv, __rte_unused struct rte_eth_dev *dev)
+priv_select_tx_function(struct priv *priv, struct rte_eth_dev *dev)
 {
        eth_tx_burst_t tx_pkt_burst = mlx5_tx_burst;
        struct mlx5_dev_config *config = &priv->config;
+       uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads;
+       int tso = !!(tx_offloads & (DEV_TX_OFFLOAD_TCP_TSO |
+                                   DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
+                                   DEV_TX_OFFLOAD_GRE_TNL_TSO));
+       int vlan_insert = !!(tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT);
 
        assert(priv != NULL);
        /* Select appropriate TX function. */
+       if (vlan_insert || tso)
+               return tx_pkt_burst;
        if (config->mps == MLX5_MPW_ENHANCED) {
-               if (priv_check_vec_tx_support(priv) > 0) {
-                       if (priv_check_raw_vec_tx_support(priv) > 0)
+               if (priv_check_vec_tx_support(priv, dev) > 0) {
+                       if (priv_check_raw_vec_tx_support(priv, dev) > 0)
                                tx_pkt_burst = mlx5_tx_burst_raw_vec;
                        else
                                tx_pkt_burst = mlx5_tx_burst_vec;