X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fmlx4%2Fmlx4_intr.c;h=19af9359c9344dfb1939f430636621880ad60db0;hb=54b20f94cd847c713c2c9bca281295f5d1d0663f;hp=2141992eacf6899b74438cc3b23931614c6b804c;hpb=82092c8734faff892cf3b0898dd1c2315d2e1398;p=dpdk.git diff --git a/drivers/net/mlx4/mlx4_intr.c b/drivers/net/mlx4/mlx4_intr.c index 2141992eac..19af9359c9 100644 --- a/drivers/net/mlx4/mlx4_intr.c +++ b/drivers/net/mlx4/mlx4_intr.c @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * Copyright 2017 6WIND S.A. - * Copyright 2017 Mellanox + * Copyright 2017 Mellanox Technologies, Ltd */ /** @@ -8,7 +8,6 @@ * Interrupts handling for mlx4 driver. */ -#include #include #include #include @@ -33,7 +32,7 @@ #include "mlx4_rxtx.h" #include "mlx4_utils.h" -static int mlx4_link_status_check(struct priv *priv); +static int mlx4_link_status_check(struct mlx4_priv *priv); /** * Clean up Rx interrupts handler. @@ -42,7 +41,7 @@ static int mlx4_link_status_check(struct priv *priv); * Pointer to private structure. */ static void -mlx4_rx_intr_vec_disable(struct priv *priv) +mlx4_rx_intr_vec_disable(struct mlx4_priv *priv) { struct rte_intr_handle *intr_handle = &priv->intr_handle; @@ -62,10 +61,10 @@ mlx4_rx_intr_vec_disable(struct priv *priv) * 0 on success, negative errno value otherwise and rte_errno is set. */ static int -mlx4_rx_intr_vec_enable(struct priv *priv) +mlx4_rx_intr_vec_enable(struct mlx4_priv *priv) { unsigned int i; - unsigned int rxqs_n = priv->dev->data->nb_rx_queues; + unsigned int rxqs_n = ETH_DEV(priv)->data->nb_rx_queues; unsigned int n = RTE_MIN(rxqs_n, (uint32_t)RTE_MAX_RXTX_INTR_VEC_ID); unsigned int count = 0; struct rte_intr_handle *intr_handle = &priv->intr_handle; @@ -79,7 +78,7 @@ mlx4_rx_intr_vec_enable(struct priv *priv) return -rte_errno; } for (i = 0; i != n; ++i) { - struct rxq *rxq = priv->dev->data->rx_queues[i]; + struct rxq *rxq = ETH_DEV(priv)->data->rx_queues[i]; /* Skip queues that cannot request interrupts. */ if (!rxq || !rxq->channel) { @@ -117,15 +116,15 @@ mlx4_rx_intr_vec_enable(struct priv *priv) * Pointer to private structure. */ static void -mlx4_link_status_alarm(struct priv *priv) +mlx4_link_status_alarm(struct mlx4_priv *priv) { const struct rte_intr_conf *const intr_conf = - &priv->dev->data->dev_conf.intr_conf; + Ð_DEV(priv)->data->dev_conf.intr_conf; - assert(priv->intr_alarm == 1); + MLX4_ASSERT(priv->intr_alarm == 1); priv->intr_alarm = 0; if (intr_conf->lsc && !mlx4_link_status_check(priv)) - _rte_eth_dev_callback_process(priv->dev, + _rte_eth_dev_callback_process(ETH_DEV(priv), RTE_ETH_EVENT_INTR_LSC, NULL); } @@ -143,10 +142,10 @@ mlx4_link_status_alarm(struct priv *priv) * otherwise and rte_errno is set. */ static int -mlx4_link_status_check(struct priv *priv) +mlx4_link_status_check(struct mlx4_priv *priv) { - struct rte_eth_link *link = &priv->dev->data->dev_link; - int ret = mlx4_link_update(priv->dev, 0); + struct rte_eth_link *link = Ð_DEV(priv)->data->dev_link; + int ret = mlx4_link_update(ETH_DEV(priv), 0); if (ret) return ret; @@ -175,7 +174,7 @@ mlx4_link_status_check(struct priv *priv) * Pointer to private structure. */ static void -mlx4_interrupt_handler(struct priv *priv) +mlx4_interrupt_handler(struct mlx4_priv *priv) { enum { LSC, RMV, }; static const enum rte_eth_event_type type[] = { @@ -185,7 +184,7 @@ mlx4_interrupt_handler(struct priv *priv) uint32_t caught[RTE_DIM(type)] = { 0 }; struct ibv_async_event event; const struct rte_intr_conf *const intr_conf = - &priv->dev->data->dev_conf.intr_conf; + Ð_DEV(priv)->data->dev_conf.intr_conf; unsigned int i; /* Read all message and acknowledge them. */ @@ -208,7 +207,7 @@ mlx4_interrupt_handler(struct priv *priv) } for (i = 0; i != RTE_DIM(caught); ++i) if (caught[i]) - _rte_eth_dev_callback_process(priv->dev, type[i], + _rte_eth_dev_callback_process(ETH_DEV(priv), type[i], NULL); } @@ -251,7 +250,7 @@ mlx4_arm_cq(struct rxq *rxq, int solicited) * 0 on success, negative errno value otherwise and rte_errno is set. */ int -mlx4_intr_uninstall(struct priv *priv) +mlx4_intr_uninstall(struct mlx4_priv *priv) { int err = rte_errno; /* Make sure rte_errno remains unchanged. */ @@ -279,10 +278,10 @@ mlx4_intr_uninstall(struct priv *priv) * 0 on success, negative errno value otherwise and rte_errno is set. */ int -mlx4_intr_install(struct priv *priv) +mlx4_intr_install(struct mlx4_priv *priv) { const struct rte_intr_conf *const intr_conf = - &priv->dev->data->dev_conf.intr_conf; + Ð_DEV(priv)->data->dev_conf.intr_conf; int rc; mlx4_intr_uninstall(priv); @@ -327,13 +326,20 @@ mlx4_rx_intr_disable(struct rte_eth_dev *dev, uint16_t idx) } else { ret = mlx4_glue->get_cq_event(rxq->cq->channel, &ev_cq, &ev_ctx); - if (ret || ev_cq != rxq->cq) + /** For non-zero ret save the errno (may be EAGAIN + * which means the get_cq_event function was called before + * receiving one). + */ + if (ret) + ret = errno; + else if (ev_cq != rxq->cq) ret = EINVAL; } if (ret) { rte_errno = ret; - WARN("unable to disable interrupt on rx queue %d", - idx); + if (ret != EAGAIN) + WARN("unable to disable interrupt on rx queue %d", + idx); } else { rxq->mcq.arm_sn++; mlx4_glue->ack_cq_events(rxq->cq, 1); @@ -378,10 +384,10 @@ mlx4_rx_intr_enable(struct rte_eth_dev *dev, uint16_t idx) * 0 on success, negative errno value otherwise and rte_errno is set. */ int -mlx4_rxq_intr_enable(struct priv *priv) +mlx4_rxq_intr_enable(struct mlx4_priv *priv) { const struct rte_intr_conf *const intr_conf = - &priv->dev->data->dev_conf.intr_conf; + Ð_DEV(priv)->data->dev_conf.intr_conf; if (intr_conf->rxq && mlx4_rx_intr_vec_enable(priv) < 0) goto error; @@ -397,7 +403,7 @@ error: * Pointer to private structure. */ void -mlx4_rxq_intr_disable(struct priv *priv) +mlx4_rxq_intr_disable(struct mlx4_priv *priv) { int err = rte_errno; /* Make sure rte_errno remains unchanged. */