From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7879045BAC; Wed, 23 Oct 2024 08:29:33 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B0EA341133; Wed, 23 Oct 2024 08:29:01 +0200 (CEST) Received: from smtpbguseast3.qq.com (smtpbguseast3.qq.com [54.243.244.52]) by mails.dpdk.org (Postfix) with ESMTP id E800840ED0; Wed, 23 Oct 2024 08:28:38 +0200 (CEST) X-QQ-mid: bizesmtpsz8t1729664915t49j3k4 X-QQ-Originating-IP: BFN8/UDStL4e9wDtRLzOCcyn19oJEpDCrCqV6tVlU7I= Received: from wxdbg.localdomain.com ( [125.122.84.15]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 23 Oct 2024 14:28:34 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 14610095478260556500 From: Jiawen Wu To: dev@dpdk.org Cc: Jiawen Wu , stable@dpdk.org Subject: [PATCH 13/13] net/ngbe: restrict configuration of VLAN strip offload Date: Wed, 23 Oct 2024 14:48:36 +0800 Message-Id: <20241023064836.2017879-14-jiawenwu@trustnetic.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20241023064836.2017879-1-jiawenwu@trustnetic.com> References: <20241023064836.2017879-1-jiawenwu@trustnetic.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtpsz:trustnetic.com:qybglogicsvrgz:qybglogicsvrgz8a-1 X-QQ-XMAILINFO: N3l5ASPewLWqlCkbh3OTYV7i2rqU44sovjS1mXFShElSzpSuc6nwM2Md RG0Hdpk01H7lVukjeNVGKcPwprVYnkX7rgOaWY27H9gMLgex47meoByXN/d9aJ61rGiG2RA nOAN1qiEHeK/j+X4Ai37DFYLtVMXEZcsAxd9OPYuXJAx0rKMTYLI/SiCaGh/Kan6naWlr0q c8BeEmojFCmJeC6lNS93ZNvZH/ki2VN2ofLRQGrhcemp6okVLC5VKfXs6SCENLwxeSuUaUO YfkEoB8AO44oIKbjzXbODw+/+uEOqHtxL1eSjy4foNvIIXJtNDK7QbhYOTaojCOqGgDrkM2 e9PaWs6vpizGCK1ObAzVrQbb/ECyKs0K1juRll32XCobC+My/DIRh1+gb80VheirXRDhPTW EeYLNE4i4zi31yU2C5bbP7QBzLUTTPNEX5GuEsG5m6uD/ayJRm/MzC5Tvajz0odHkEoTQOH SPiNpPoNjPEuHTwGFrey5sfQd0zGg01NQU9J/1KgyzenI9Sm2z/qq9gJKkRTNJ9ggQfUBQ3 6psbfXTz3NOX0nR4ESv5CjKgCWXG8g+5eUodbSn0jLg16eWl+G0R8KnBAACTovTpQ1oqH38 Qz2ET56u6Q/tb8jmGGI6Ax6MhNbJL2lKBFJBqI9NSs7FzmZ3idcz4V402LcwyHpMstzKXBf jXefXYIBRNuC6a4BqriCjQ9rxLH7qaST882EQIaPhJEqvNgp/BagomVun8FlPPMXN1kkheq CCiXk5SQCiZ8HL8WlU/eiAjU0K5kKqV1hXDw60+bbVUMxlwpOpkYN/zlnFhtP1xoUN0NGKJ 8GuKcL5RgQL2wVCHL4qdRtbWmMnOcTBtLwQDwswlHetEwWQm506jgQnqxDzEnkU5CSs0IDW LQR+IjD71PbrQ7DKMuMcckNBOdO5HukLPmGa++UWbfNg0v/NHt7a+U0BVH+yqz2ZW/UYyJL xVXUlVft1LH4I/9buxBGJsNc6ZvdKUtJqxBRxSzGt7Sj7GXp/pSDqusmV X-QQ-XMRINFO: M/715EihBoGSf6IYSX1iLFg= X-QQ-RECHKSPAM: 0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org There is a hardware limitation that Rx ring config register is not writable when Rx ring is enabled, i.e. the NGBE_RXCFG_ENA bit is set. But disabling the ring when there is traffic will cause ring get stuck. So restrict the configuration of VLAN strip offload only if device is started. Fixes: 59b46438fdaa ("net/ngbe: support VLAN offload and VLAN filter") Cc: stable@dpdk.org Signed-off-by: Jiawen Wu --- drivers/net/ngbe/ngbe_ethdev.c | 49 ++++++++++++++-------------------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/drivers/net/ngbe/ngbe_ethdev.c b/drivers/net/ngbe/ngbe_ethdev.c index e7dc1c0f94..eef31af233 100644 --- a/drivers/net/ngbe/ngbe_ethdev.c +++ b/drivers/net/ngbe/ngbe_ethdev.c @@ -586,41 +586,25 @@ ngbe_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) } static void -ngbe_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue, int on) +ngbe_vlan_strip_q_set(struct rte_eth_dev *dev, uint16_t queue, int on) { - struct ngbe_hw *hw = ngbe_dev_hw(dev); - struct ngbe_rx_queue *rxq; - bool restart; - uint32_t rxcfg, rxbal, rxbah; - if (on) ngbe_vlan_hw_strip_enable(dev, queue); else ngbe_vlan_hw_strip_disable(dev, queue); +} - rxq = dev->data->rx_queues[queue]; - rxbal = rd32(hw, NGBE_RXBAL(rxq->reg_idx)); - rxbah = rd32(hw, NGBE_RXBAH(rxq->reg_idx)); - rxcfg = rd32(hw, NGBE_RXCFG(rxq->reg_idx)); - if (rxq->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) { - restart = (rxcfg & NGBE_RXCFG_ENA) && - !(rxcfg & NGBE_RXCFG_VLAN); - rxcfg |= NGBE_RXCFG_VLAN; - } else { - restart = (rxcfg & NGBE_RXCFG_ENA) && - (rxcfg & NGBE_RXCFG_VLAN); - rxcfg &= ~NGBE_RXCFG_VLAN; - } - rxcfg &= ~NGBE_RXCFG_ENA; +static void +ngbe_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue, int on) +{ + struct ngbe_hw *hw = ngbe_dev_hw(dev); - if (restart) { - /* set vlan strip for ring */ - ngbe_dev_rx_queue_stop(dev, queue); - wr32(hw, NGBE_RXBAL(rxq->reg_idx), rxbal); - wr32(hw, NGBE_RXBAH(rxq->reg_idx), rxbah); - wr32(hw, NGBE_RXCFG(rxq->reg_idx), rxcfg); - ngbe_dev_rx_queue_start(dev, queue); + if (!hw->adapter_stopped) { + PMD_DRV_LOG(ERR, "Please stop port first"); + return; } + + ngbe_vlan_strip_q_set(dev, queue, on); } static int @@ -846,9 +830,9 @@ ngbe_vlan_hw_strip_config(struct rte_eth_dev *dev) rxq = dev->data->rx_queues[i]; if (rxq->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) - ngbe_vlan_hw_strip_enable(dev, i); + ngbe_vlan_strip_q_set(dev, i, 1); else - ngbe_vlan_hw_strip_disable(dev, i); + ngbe_vlan_strip_q_set(dev, i, 0); } } @@ -910,6 +894,13 @@ ngbe_vlan_offload_config(struct rte_eth_dev *dev, int mask) static int ngbe_vlan_offload_set(struct rte_eth_dev *dev, int mask) { + struct ngbe_hw *hw = ngbe_dev_hw(dev); + + if (!hw->adapter_stopped && (mask & RTE_ETH_VLAN_STRIP_MASK)) { + PMD_DRV_LOG(ERR, "Please stop port first"); + return -EPERM; + } + ngbe_config_vlan_strip_on_all_queues(dev, mask); ngbe_vlan_offload_config(dev, mask); -- 2.27.0