From: Alejandro Lucero Date: Tue, 26 Apr 2016 13:03:01 +0000 (+0100) Subject: nfp: serialize access for hardware reconfiguration X-Git-Tag: spdx-start~6950 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=ceccc5e78b750e5feb5ace315de25474110ebe1d;p=dpdk.git 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 --- 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;