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")
Cc: stable@dpdk.org
Signed-off-by: Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>
cmdq_ctxt, in_size, NULL,
NULL, 0);
if (err) {
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;
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);
err = hinic_reinit_cmdq_ctxts(hwdev);
if (err)
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");
err = hinic_reinit_cmdq_ctxts(hwdev);
if (err)
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");
free_recv_msg(&pf_to_mgmt->recv_msg_from_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
/**
* send_msg_to_mgmt_async - send async message
* @pf_to_mgmt: PF to MGMT channel
u64 header;
u16 cmd_size = mgmt_msg_len(msg_len);
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);
if (direction == HINIC_MSG_RESPONSE)
prepare_header(pf_to_mgmt, &header, msg_len, mod, ack_type,
direction, cmd, resp_msg_id);
recv_msg->msg_len);
*out_size = recv_msg->msg_len;
} else {
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;
}
recv_msg->msg_len);
err = -ERANGE;
}
-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)
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)
if (!hwdev || in_size > HINIC_MSG_TO_MGMT_MAX_LEN)
return -EINVAL;
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);
if (hinic_func_type(hwdev) == TYPE_VF) {
rc = hinic_mbox_to_pf(hwdev, mod, cmd, buf_in, in_size,
buf_out, out_size, timeout);
#define HINIC_MSG_HEADER_P2P_IDX_MASK 0xF
#define HINIC_MSG_HEADER_MSG_ID_MASK 0x3FF
#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)
#define HINIC_MSG_HEADER_GET(val, member) \
(((val) >> HINIC_MSG_HEADER_##member##_SHIFT) & \
HINIC_MSG_HEADER_##member##_MASK)
if (hwdev->cmdqs->status & HINIC_CMDQ_SET_FAIL) {
err = hinic_reinit_cmdq_ctxts(hwdev);
if (err) {
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",
else
fc_conf->mode = RTE_FC_NONE;
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");
-
nic_dev->nic_pause.rx_pause = nic_pause.rx_pause;
nic_dev->nic_pause.tx_pause = nic_pause.tx_pause;
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");
nic_pause.tx_pause ? "on" : "off",
nic_pause.rx_pause ? "on" : "off",
nic_pause.auto_neg ? "on" : "off");