From ceccc5e78b750e5feb5ace315de25474110ebe1d Mon Sep 17 00:00:00 2001 From: Alejandro Lucero Date: Tue, 26 Apr 2016 14:03:01 +0100 Subject: [PATCH] nfp: serialize access for hardware reconfiguration Some apps calling some functions from different threads at the same time could lead to reconfig problems. Reconfig mechanism is based on a hardware queue where incrementing a counter signals the firmware to do the reconfig. If there is a second increment before the first one has been processed the firmware will stop and a device reset is necessary. Signed-off-by: Alejandro Lucero --- drivers/net/nfp/nfp_net.c | 8 ++++++++ drivers/net/nfp/nfp_net_pmd.h | 1 + 2 files changed, 9 insertions(+) diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c index bc0a3d83b9..559ebe6486 100644 --- a/drivers/net/nfp/nfp_net.c +++ b/drivers/net/nfp/nfp_net.c @@ -54,6 +54,7 @@ #include #include #include +#include #include "nfp_net_pmd.h" #include "nfp_net_logs.h" @@ -407,6 +408,8 @@ nfp_net_reconfig(struct nfp_net_hw *hw, uint32_t ctrl, uint32_t update) PMD_DRV_LOG(DEBUG, "nfp_net_reconfig: ctrl=%08x update=%08x\n", ctrl, update); + rte_spinlock_lock(&hw->reconfig_lock); + nn_cfg_writel(hw, NFP_NET_CFG_CTRL, ctrl); nn_cfg_writel(hw, NFP_NET_CFG_UPDATE, update); @@ -414,6 +417,8 @@ nfp_net_reconfig(struct nfp_net_hw *hw, uint32_t ctrl, uint32_t update) err = __nfp_net_reconfig(hw, update); + rte_spinlock_unlock(&hw->reconfig_lock); + if (!err) return 0; @@ -2399,6 +2404,9 @@ nfp_net_init(struct rte_eth_dev *eth_dev) PMD_INIT_LOG(INFO, "max_rx_queues: %u, max_tx_queues: %u\n", hw->max_rx_queues, hw->max_tx_queues); + /* Initializing spinlock for reconfigs */ + rte_spinlock_init(&hw->reconfig_lock); + /* Allocating memory for mac addr */ eth_dev->data->mac_addrs = rte_zmalloc("mac_addr", ETHER_ADDR_LEN, 0); if (eth_dev->data->mac_addrs == NULL) { diff --git a/drivers/net/nfp/nfp_net_pmd.h b/drivers/net/nfp/nfp_net_pmd.h index 232ce5caee..c1809720fb 100644 --- a/drivers/net/nfp/nfp_net_pmd.h +++ b/drivers/net/nfp/nfp_net_pmd.h @@ -406,6 +406,7 @@ struct nfp_net_hw { int stride_tx; uint8_t *qcp_cfg; + rte_spinlock_t reconfig_lock; uint32_t max_tx_queues; uint32_t max_rx_queues; -- 2.20.1