On 01/04/2020 10:30, Xiaoyun wang wrote:
> When PF detects FW is hotactive, up returns HINIC_DEV_BUSY_ACTIVE_FW for
> pf driver, when cmdq reinit at txrx flush, cmdq will fail, driver should
> reinit the cmdq when port start.
> 
> Fixes: d9ce1917941c ("net/hinic/base: add hardware operation")

Hi. Please add tag below if you are requesting this for backport.
(http://doc.dpdk.org/guides/contributing/patches.html#patch-for-stable-releases)

Cc: sta...@dpdk.org

> Signed-off-by: Xiaoyun wang <cloud.wangxiao...@huawei.com>
> ---
>  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.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(-)
> 
> diff --git a/drivers/net/hinic/base/hinic_pmd_cmdq.c 
> b/drivers/net/hinic/base/hinic_pmd_cmdq.c
> index 685498e..2e98b9c 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 cf2a970..fc11ecd 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 addc9d2..06c9b68 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);
> @@ -449,7 +470,7 @@ static void hinic_pf_to_mgmt_free(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 @@ static void hinic_pf_to_mgmt_free(struct hinic_hwdev 
> *hwdev)
>       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 cc18843..52b319e 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 fd34b03..60c4e14 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)
>       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 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 23724a0..239a78c 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");
> 

Reply via email to