From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 03951A0093 for ; Tue, 19 May 2020 15:09:26 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E53BC1D6AF; Tue, 19 May 2020 15:09:25 +0200 (CEST) Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by dpdk.org (Postfix) with ESMTP id 855221D174 for ; Tue, 19 May 2020 15:09:23 +0200 (CEST) Received: by mail-wm1-f68.google.com with SMTP id z4so3001676wmi.2 for ; Tue, 19 May 2020 06:09:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=CLQVRWs/bORn823+5gANOf0CQyYFZwcGjfS+i24DJtY=; b=Dlf9fsmPFs858IiFOmQJYXTk0VMgm4B0dB3mPM/oW4+MQkcl9Tn+gajGsCF9uN9zss G+IVqkQ9ahBas7mPHHCRlraaET9uE1Zfz0eYNTdKhJF19kuapRe40ukfIj+C7/qY4OW6 hT/Ox9ffqxa8xKpbtpYcC2Y4xEaO8j2ALW06X5kVK1NTzuqjH/LfpjS6H/IA5xcismxU nhn8DX/ur2J+8qyeltF6FgXBNpL0juJgs+706zfNeaWhgm1I5Fm2hKSPBE+c13Jh15h1 3Be+nw1yJ574dsge9mWGOJbZMsbBdCIv89vaM3xrQMcvUuCN4pbu62r0tXZSDfAw7C8/ 1gKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CLQVRWs/bORn823+5gANOf0CQyYFZwcGjfS+i24DJtY=; b=KNVoXHdI9p+q7wIz0OF8uMDKi1rpIK2VXqGC+x/IidXxNCz2DSA7aihiBApRT8qWxO R7z+Vyt9cRvWjzbe3tRCOhh0koKSTnTDlqWl5AhfPpmpKJTZbV65mJDT4wDg+NkdQsvh af/j9WFeSESvKqQnMLtsvdCH7u2FR1FanbeYebyFoyOR+D6LkN57tj07DZY40jX7odyq e86cQbvy/Co4ZnRMwSkV2x03W22kYzRF8ip4d1ThzWlpNp1ihhAt1rRr5aK522KzOqZa 1wS0HetZTsE1ofmvUBiK6jNsYH5M7R0uAvhDE2nDJKvWS7Tx/R5IlBL3z2V8xyHXVPgU VHjQ== X-Gm-Message-State: AOAM5300qSAOPgY1sKFJ6hZmfJ6D/z/6ZK/CEDZ/7t7An8ecDrYRpANb zGOsjQDWqiW5P6iJrIKoGVM= X-Google-Smtp-Source: ABdhPJzjF8jYZRuZ/1QHrQltlZ67wEdvVQKpgpFF31Gu9LuRkpS+S8lZO278C7EjZaFNghMV7ZR8UQ== X-Received: by 2002:a7b:cc0e:: with SMTP id f14mr5453630wmh.39.1589893763231; Tue, 19 May 2020 06:09:23 -0700 (PDT) Received: from localhost ([88.98.246.218]) by smtp.gmail.com with ESMTPSA id q5sm22246342wra.36.2020.05.19.06.09.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 May 2020 06:09:22 -0700 (PDT) From: luca.boccassi@gmail.com To: Xiaoyun Wang Cc: dpdk stable Date: Tue, 19 May 2020 14:03:22 +0100 Message-Id: <20200519130549.112823-67-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200519130549.112823-1-luca.boccassi@gmail.com> References: <20200519125804.104349-1-luca.boccassi@gmail.com> <20200519130549.112823-1-luca.boccassi@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] patch 'net/hinic/base: fix PF firmware hot-active problem' has been queued to stable release 19.11.3 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" Hi, FYI, your patch has been queued to stable release 19.11.3 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 05/21/20. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. This will indicate if there was any rebasing needed to apply to the stable branch. If there were code changes for rebasing (ie: not only metadata diffs), please double check that the rebase was correctly done. Thanks. Luca Boccassi --- >From 11d98470395eff60937bbdff411b19f6ac00f76f Mon Sep 17 00:00:00 2001 From: Xiaoyun Wang Date: Fri, 10 Apr 2020 17:21:45 +0800 Subject: [PATCH] net/hinic/base: fix PF firmware hot-active problem [ upstream commit 036b61d85e4d1c45ac497a367c765ad463d2debf ] When FW is hotactive which means updating the FW but not needs to reboot OS, FW returns HINIC_DEV_BUSY_ACTIVE_FW for pf driver because firmware is being reinitialized, at which point the cmdq initialization that relies on the fw channel will fail, so driver should reinit the cmdq when port start. Fixes: 0194313b2df6 ("net/hinic/base: fix port start during FW hot update") Signed-off-by: Xiaoyun Wang --- drivers/net/hinic/base/hinic_pmd_cmdq.c | 7 +++-- drivers/net/hinic/base/hinic_pmd_hwdev.c | 4 +-- drivers/net/hinic/base/hinic_pmd_mgmt.c | 38 +++++++++++++----------- drivers/net/hinic/base/hinic_pmd_mgmt.h | 2 ++ drivers/net/hinic/base/hinic_pmd_nicio.c | 2 +- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/drivers/net/hinic/base/hinic_pmd_cmdq.c b/drivers/net/hinic/base/hinic_pmd_cmdq.c index 685498ec2f..2e98b9c286 100644 --- a/drivers/net/hinic/base/hinic_pmd_cmdq.c +++ b/drivers/net/hinic/base/hinic_pmd_cmdq.c @@ -440,9 +440,12 @@ static int hinic_set_cmdq_ctxts(struct hinic_hwdev *hwdev) cmdq_ctxt, in_size, NULL, NULL, 0); if (err) { - if (err == HINIC_MBOX_PF_BUSY_ACTIVE_FW) + if (err == HINIC_MBOX_PF_BUSY_ACTIVE_FW || + err == HINIC_DEV_BUSY_ACTIVE_FW) { cmdqs->status |= HINIC_CMDQ_SET_FAIL; - PMD_DRV_LOG(ERR, "Set cmdq ctxt failed"); + PMD_DRV_LOG(ERR, "PF or VF fw is hot active"); + } + PMD_DRV_LOG(ERR, "Set cmdq ctxt failed, err: %d", err); return -EFAULT; } } diff --git a/drivers/net/hinic/base/hinic_pmd_hwdev.c b/drivers/net/hinic/base/hinic_pmd_hwdev.c index cf2a9701f2..fc11ecd7a4 100644 --- a/drivers/net/hinic/base/hinic_pmd_hwdev.c +++ b/drivers/net/hinic/base/hinic_pmd_hwdev.c @@ -529,7 +529,7 @@ static int hinic_vf_rx_tx_flush(struct hinic_hwdev *hwdev) err = hinic_reinit_cmdq_ctxts(hwdev); if (err) - PMD_DRV_LOG(WARNING, "Reinit cmdq failed"); + PMD_DRV_LOG(WARNING, "Reinit cmdq failed when vf flush"); return err; } @@ -587,7 +587,7 @@ static int hinic_pf_rx_tx_flush(struct hinic_hwdev *hwdev) err = hinic_reinit_cmdq_ctxts(hwdev); if (err) - PMD_DRV_LOG(WARNING, "Reinit cmdq failed"); + PMD_DRV_LOG(WARNING, "Reinit cmdq failed when pf flush"); return 0; } diff --git a/drivers/net/hinic/base/hinic_pmd_mgmt.c b/drivers/net/hinic/base/hinic_pmd_mgmt.c index eee50a80d1..ea79c300af 100644 --- a/drivers/net/hinic/base/hinic_pmd_mgmt.c +++ b/drivers/net/hinic/base/hinic_pmd_mgmt.c @@ -248,6 +248,19 @@ static void free_msg_buf(struct hinic_msg_pf_to_mgmt *pf_to_mgmt) free_recv_msg(&pf_to_mgmt->recv_msg_from_mgmt); } +static int hinic_get_mgmt_channel_status(void *hwdev) +{ + struct hinic_hwif *hwif = ((struct hinic_hwdev *)hwdev)->hwif; + u32 val; + + if (hinic_func_type((struct hinic_hwdev *)hwdev) == TYPE_VF) + return false; + + val = hinic_hwif_read_reg(hwif, HINIC_ICPL_RESERVD_ADDR); + + return HINIC_GET_MGMT_CHANNEL_STATUS(val, MGMT_CHANNEL_STATUS); +} + /** * send_msg_to_mgmt_async - send async message * @pf_to_mgmt: PF to MGMT channel @@ -309,6 +322,14 @@ static int send_msg_to_mgmt_sync(struct hinic_msg_pf_to_mgmt *pf_to_mgmt, u64 header; u16 cmd_size = mgmt_msg_len(msg_len); + /* If fw is hot active, return failed */ + if (hinic_get_mgmt_channel_status(pf_to_mgmt->hwdev)) { + if (mod == HINIC_MOD_COMM || mod == HINIC_MOD_L2NIC) + return HINIC_DEV_BUSY_ACTIVE_FW; + else + return -EBUSY; + } + if (direction == HINIC_MSG_RESPONSE) prepare_header(pf_to_mgmt, &header, msg_len, mod, ack_type, direction, cmd, resp_msg_id); @@ -462,19 +483,6 @@ unlock_sync_msg: return err; } -static int hinic_get_mgmt_channel_status(void *hwdev) -{ - struct hinic_hwif *hwif = ((struct hinic_hwdev *)hwdev)->hwif; - u32 val; - - if (hinic_func_type((struct hinic_hwdev *)hwdev) == TYPE_VF) - return false; - - val = hinic_hwif_read_reg(hwif, HINIC_ICPL_RESERVD_ADDR); - - return HINIC_GET_MGMT_CHANNEL_STATUS(val, MGMT_CHANNEL_STATUS); -} - int hinic_msg_to_mgmt_sync(void *hwdev, enum hinic_mod_type mod, u8 cmd, void *buf_in, u16 in_size, void *buf_out, u16 *out_size, u32 timeout) @@ -484,10 +492,6 @@ int hinic_msg_to_mgmt_sync(void *hwdev, enum hinic_mod_type mod, u8 cmd, if (!hwdev || in_size > HINIC_MSG_TO_MGMT_MAX_LEN) return -EINVAL; - /* If status is hot upgrading, don't send message to mgmt */ - if (hinic_get_mgmt_channel_status(hwdev)) - return -EPERM; - if (hinic_func_type(hwdev) == TYPE_VF) { rc = hinic_mbox_to_pf(hwdev, mod, cmd, buf_in, in_size, buf_out, out_size, timeout); diff --git a/drivers/net/hinic/base/hinic_pmd_mgmt.h b/drivers/net/hinic/base/hinic_pmd_mgmt.h index cc18843bf8..52b319ead4 100644 --- a/drivers/net/hinic/base/hinic_pmd_mgmt.h +++ b/drivers/net/hinic/base/hinic_pmd_mgmt.h @@ -34,6 +34,8 @@ #define HINIC_MSG_HEADER_P2P_IDX_MASK 0xF #define HINIC_MSG_HEADER_MSG_ID_MASK 0x3FF +#define HINIC_DEV_BUSY_ACTIVE_FW 0xFE + #define HINIC_MSG_HEADER_GET(val, member) \ (((val) >> HINIC_MSG_HEADER_##member##_SHIFT) & \ HINIC_MSG_HEADER_##member##_MASK) diff --git a/drivers/net/hinic/base/hinic_pmd_nicio.c b/drivers/net/hinic/base/hinic_pmd_nicio.c index 31a13fbdcf..d3e8f2e74d 100644 --- a/drivers/net/hinic/base/hinic_pmd_nicio.c +++ b/drivers/net/hinic/base/hinic_pmd_nicio.c @@ -536,7 +536,7 @@ int hinic_init_qp_ctxts(struct hinic_hwdev *hwdev) if (hwdev->cmdqs->status & HINIC_CMDQ_SET_FAIL) { err = hinic_reinit_cmdq_ctxts(hwdev); if (err) { - PMD_DRV_LOG(ERR, "Reinit cmdq context failed, rc: %d\n", + PMD_DRV_LOG(ERR, "Reinit cmdq context failed when dev start, err: %d", err); return err; } -- 2.20.1 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2020-05-19 14:04:47.211390397 +0100 +++ 0067-net-hinic-base-fix-PF-firmware-hot-active-problem.patch 2020-05-19 14:04:44.224648517 +0100 @@ -1,8 +1,10 @@ -From 036b61d85e4d1c45ac497a367c765ad463d2debf Mon Sep 17 00:00:00 2001 +From 11d98470395eff60937bbdff411b19f6ac00f76f Mon Sep 17 00:00:00 2001 From: Xiaoyun Wang Date: Fri, 10 Apr 2020 17:21:45 +0800 Subject: [PATCH] net/hinic/base: fix PF firmware hot-active problem +[ upstream commit 036b61d85e4d1c45ac497a367c765ad463d2debf ] + When FW is hotactive which means updating the FW but not needs to reboot OS, FW returns HINIC_DEV_BUSY_ACTIVE_FW for pf driver because firmware is being reinitialized, at which point the cmdq @@ -10,17 +12,15 @@ should reinit the cmdq when port start. Fixes: 0194313b2df6 ("net/hinic/base: fix port start during FW hot update") -Cc: stable@dpdk.org Signed-off-by: Xiaoyun Wang --- drivers/net/hinic/base/hinic_pmd_cmdq.c | 7 +++-- drivers/net/hinic/base/hinic_pmd_hwdev.c | 4 +-- - drivers/net/hinic/base/hinic_pmd_mgmt.c | 40 +++++++++++++----------- + drivers/net/hinic/base/hinic_pmd_mgmt.c | 38 +++++++++++++----------- drivers/net/hinic/base/hinic_pmd_mgmt.h | 2 ++ drivers/net/hinic/base/hinic_pmd_nicio.c | 2 +- - drivers/net/hinic/hinic_pmd_ethdev.c | 7 +---- - 6 files changed, 33 insertions(+), 29 deletions(-) + 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/drivers/net/hinic/base/hinic_pmd_cmdq.c b/drivers/net/hinic/base/hinic_pmd_cmdq.c index 685498ec2f..2e98b9c286 100644 @@ -64,7 +64,7 @@ return 0; } diff --git a/drivers/net/hinic/base/hinic_pmd_mgmt.c b/drivers/net/hinic/base/hinic_pmd_mgmt.c -index addc9d2db4..06c9b68f16 100644 +index eee50a80d1..ea79c300af 100644 --- a/drivers/net/hinic/base/hinic_pmd_mgmt.c +++ b/drivers/net/hinic/base/hinic_pmd_mgmt.c @@ -248,6 +248,19 @@ static void free_msg_buf(struct hinic_msg_pf_to_mgmt *pf_to_mgmt) @@ -102,15 +102,6 @@ if (direction == HINIC_MSG_RESPONSE) prepare_header(pf_to_mgmt, &header, msg_len, mod, ack_type, direction, cmd, resp_msg_id); -@@ -449,7 +470,7 @@ hinic_pf_to_mgmt_sync(struct hinic_hwdev *hwdev, - recv_msg->msg_len); - *out_size = recv_msg->msg_len; - } else { -- PMD_DRV_LOG(ERR, "Mgmt rsp's msg len: %u overflow.", -+ PMD_DRV_LOG(ERR, "Mgmt rsp's msg len:%u overflow.", - recv_msg->msg_len); - err = -ERANGE; - } @@ -462,19 +483,6 @@ unlock_sync_msg: return err; } @@ -156,43 +147,18 @@ (((val) >> HINIC_MSG_HEADER_##member##_SHIFT) & \ HINIC_MSG_HEADER_##member##_MASK) diff --git a/drivers/net/hinic/base/hinic_pmd_nicio.c b/drivers/net/hinic/base/hinic_pmd_nicio.c -index fd34b03e3b..60c4e14055 100644 +index 31a13fbdcf..d3e8f2e74d 100644 --- a/drivers/net/hinic/base/hinic_pmd_nicio.c +++ b/drivers/net/hinic/base/hinic_pmd_nicio.c -@@ -537,7 +537,7 @@ int hinic_init_qp_ctxts(struct hinic_hwdev *hwdev) +@@ -536,7 +536,7 @@ int hinic_init_qp_ctxts(struct hinic_hwdev *hwdev) if (hwdev->cmdqs->status & HINIC_CMDQ_SET_FAIL) { err = hinic_reinit_cmdq_ctxts(hwdev); if (err) { -- PMD_DRV_LOG(ERR, "Reinit cmdq context failed, rc: %d", +- PMD_DRV_LOG(ERR, "Reinit cmdq context failed, rc: %d\n", + PMD_DRV_LOG(ERR, "Reinit cmdq context failed when dev start, err: %d", err); return err; } -diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c -index 23724a0228..239a78c036 100644 ---- a/drivers/net/hinic/hinic_pmd_ethdev.c -+++ b/drivers/net/hinic/hinic_pmd_ethdev.c -@@ -1862,11 +1862,6 @@ static int hinic_flow_ctrl_get(struct rte_eth_dev *dev, - else - fc_conf->mode = RTE_FC_NONE; - -- PMD_DRV_LOG(INFO, "Get pause options, tx: %s, rx: %s, auto: %s\n", -- nic_pause.tx_pause ? "on" : "off", -- nic_pause.rx_pause ? "on" : "off", -- nic_pause.auto_neg ? "on" : "off"); -- - return 0; - } - -@@ -1900,7 +1895,7 @@ static int hinic_flow_ctrl_set(struct rte_eth_dev *dev, - nic_dev->nic_pause.rx_pause = nic_pause.rx_pause; - nic_dev->nic_pause.tx_pause = nic_pause.tx_pause; - -- PMD_DRV_LOG(INFO, "Get pause options, tx: %s, rx: %s, auto: %s\n", -+ PMD_DRV_LOG(INFO, "Set pause options, tx: %s, rx: %s, auto: %s\n", - nic_pause.tx_pause ? "on" : "off", - nic_pause.rx_pause ? "on" : "off", - nic_pause.auto_neg ? "on" : "off"); -- 2.20.1