Skip to content

Commit

Permalink
net/hinic/base: check output of management sync channel
Browse files Browse the repository at this point in the history
Add output buffer and out size info for some cmds that use management
sync channel, which can improve dfx capability when sent msg failed.

Fixes: 7fcd6b0 ("net/hinic/base: support cmdq mechanism")
Cc: stable@dpdk.org

Signed-off-by: Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>
  • Loading branch information
Xiaoyun Wang authored and Ferruh Yigit committed Jul 7, 2020
1 parent 3b0bc72 commit d807dd7
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 72 deletions.
31 changes: 22 additions & 9 deletions drivers/net/hinic/base/hinic_pmd_cmdq.c
Original file line number Diff line number Diff line change
Expand Up @@ -426,27 +426,31 @@ static int hinic_set_cmdq_ctxts(struct hinic_hwdev *hwdev)
{
struct hinic_cmdqs *cmdqs = hwdev->cmdqs;
struct hinic_cmdq_ctxt *cmdq_ctxt;
struct hinic_cmdq_ctxt cmdq_ctxt_out;
enum hinic_cmdq_type cmdq_type;
u16 out_size = sizeof(cmdq_ctxt_out);
u16 in_size;
int err;

cmdq_type = HINIC_CMDQ_SYNC;
memset(&cmdq_ctxt_out, 0, out_size);
for (; cmdq_type < HINIC_MAX_CMDQ_TYPES; cmdq_type++) {
cmdq_ctxt = &cmdqs->cmdq[cmdq_type].cmdq_ctxt;
cmdq_ctxt->resp_aeq_num = HINIC_AEQ1;
in_size = sizeof(*cmdq_ctxt);
err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
HINIC_MGMT_CMD_CMDQ_CTXT_SET,
cmdq_ctxt, in_size, NULL,
NULL, 0);
if (err) {
cmdq_ctxt, in_size, &cmdq_ctxt_out,
&out_size, 0);
if (err || !out_size || cmdq_ctxt_out.status) {
if (err == HINIC_MBOX_PF_BUSY_ACTIVE_FW ||
err == HINIC_DEV_BUSY_ACTIVE_FW) {
cmdqs->status |= HINIC_CMDQ_SET_FAIL;
PMD_DRV_LOG(ERR, "PF or VF fw is hot active");
}
PMD_DRV_LOG(ERR, "Set cmdq ctxt failed, err: %d", err);
return -EFAULT;
PMD_DRV_LOG(ERR, "Set cmdq ctxt failed, err: %d, status: 0x%x, out_size: 0x%x",
err, cmdq_ctxt_out.status, out_size);
return -EIO;
}
}

Expand Down Expand Up @@ -631,17 +635,26 @@ static void hinic_cmdqs_free(struct hinic_hwdev *hwdev)
static int hinic_set_cmdq_depth(struct hinic_hwdev *hwdev, u16 cmdq_depth)
{
struct hinic_root_ctxt root_ctxt;
u16 out_size = sizeof(root_ctxt);
int err;

memset(&root_ctxt, 0, sizeof(root_ctxt));
root_ctxt.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
root_ctxt.func_idx = hinic_global_func_id(hwdev);
root_ctxt.ppf_idx = hinic_ppf_idx(hwdev);
root_ctxt.set_cmdq_depth = 1;
root_ctxt.cmdq_depth = (u8)ilog2(cmdq_depth);
return hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
HINIC_MGMT_CMD_VAT_SET,
&root_ctxt, sizeof(root_ctxt),
NULL, NULL, 0);
err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
HINIC_MGMT_CMD_VAT_SET,
&root_ctxt, sizeof(root_ctxt),
&root_ctxt, &out_size, 0);
if (err || !out_size || root_ctxt.mgmt_msg_head.status) {
PMD_DRV_LOG(ERR, "Set cmdq depth failed, err: %d, status: 0x%x, out_size: 0x%x",
err, root_ctxt.mgmt_msg_head.status, out_size);
return -EIO;
}

return 0;
}

int hinic_comm_cmdqs_init(struct hinic_hwdev *hwdev)
Expand Down
129 changes: 90 additions & 39 deletions drivers/net/hinic/base/hinic_pmd_hwdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,8 @@ void hinic_osdep_deinit(struct hinic_hwdev *hwdev)
int hinic_set_ci_table(void *hwdev, u16 q_id, struct hinic_sq_attr *attr)
{
struct hinic_cons_idx_attr cons_idx_attr;
u16 out_size = sizeof(cons_idx_attr);
int err;

memset(&cons_idx_attr, 0, sizeof(cons_idx_attr));
cons_idx_attr.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
Expand All @@ -406,10 +408,17 @@ int hinic_set_ci_table(void *hwdev, u16 q_id, struct hinic_sq_attr *attr)
cons_idx_attr.sq_id = q_id;
cons_idx_attr.ci_addr = attr->ci_dma_base;

return hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
HINIC_MGMT_CMD_L2NIC_SQ_CI_ATTR_SET,
&cons_idx_attr, sizeof(cons_idx_attr),
NULL, NULL, 0);
&cons_idx_attr, &out_size, 0);
if (err || !out_size || cons_idx_attr.mgmt_msg_head.status) {
PMD_DRV_LOG(ERR, "Set ci attribute table failed, err: %d, status: 0x%x, out_size: 0x%x",
err, cons_idx_attr.mgmt_msg_head.status, out_size);
return -EIO;
}

return 0;
}

/**
Expand All @@ -422,24 +431,33 @@ int hinic_set_ci_table(void *hwdev, u16 q_id, struct hinic_sq_attr *attr)
*/
int hinic_set_pagesize(void *hwdev, u8 page_size)
{
struct hinic_page_size cmd;
struct hinic_page_size page_size_info;
u16 out_size = sizeof(page_size_info);
int err;

if (page_size > HINIC_PAGE_SIZE_MAX) {
PMD_DRV_LOG(ERR, "Invalid page_size %u, bigger than %u",
page_size, HINIC_PAGE_SIZE_MAX);
return -EINVAL;
}

memset(&cmd, 0, sizeof(cmd));
cmd.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
cmd.func_idx = hinic_global_func_id(hwdev);
cmd.ppf_idx = hinic_ppf_idx(hwdev);
cmd.page_size = page_size;
memset(&page_size_info, 0, sizeof(page_size_info));
page_size_info.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
page_size_info.func_idx = hinic_global_func_id(hwdev);
page_size_info.ppf_idx = hinic_ppf_idx(hwdev);
page_size_info.page_size = page_size;

return hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
HINIC_MGMT_CMD_PAGESIZE_SET,
&cmd, sizeof(cmd),
NULL, NULL, 0);
err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
HINIC_MGMT_CMD_PAGESIZE_SET,
&page_size_info, sizeof(page_size_info),
&page_size_info, &out_size, 0);
if (err || !out_size || page_size_info.mgmt_msg_head.status) {
PMD_DRV_LOG(ERR, "Set wq page size failed, err: %d, status: 0x%x, out_size: 0x%0x",
err, page_size_info.mgmt_msg_head.status, out_size);
return -EIO;
}

return 0;
}

static int wait_for_flr_finish(struct hinic_hwif *hwif)
Expand Down Expand Up @@ -546,7 +564,9 @@ static int hinic_pf_rx_tx_flush(struct hinic_hwdev *hwdev)
struct hinic_hwif *hwif = hwdev->hwif;
struct hinic_clear_doorbell clear_db;
struct hinic_clear_resource clr_res;
u16 out_size;
int err;
int ret = 0;

rte_delay_ms(100);

Expand All @@ -557,15 +577,19 @@ static int hinic_pf_rx_tx_flush(struct hinic_hwdev *hwdev)
}

hinic_disable_doorbell(hwif);
out_size = sizeof(clear_db);
memset(&clear_db, 0, sizeof(clear_db));
clear_db.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
clear_db.func_idx = HINIC_HWIF_GLOBAL_IDX(hwif);
clear_db.ppf_idx = HINIC_HWIF_PPF_IDX(hwif);
err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
HINIC_MGMT_CMD_FLUSH_DOORBELL, &clear_db,
sizeof(clear_db), NULL, NULL, 0);
if (err)
PMD_DRV_LOG(WARNING, "Flush doorbell failed");
sizeof(clear_db), &clear_db, &out_size, 0);
if (err || !out_size || clear_db.mgmt_msg_head.status) {
PMD_DRV_LOG(WARNING, "Flush doorbell failed, err: %d, status: 0x%x, out_size: 0x%x",
err, clear_db.mgmt_msg_head.status, out_size);
ret = err ? err : (-EIO);
}

hinic_set_pf_status(hwif, HINIC_PF_STATUS_FLR_START_FLAG);
memset(&clr_res, 0, sizeof(clr_res));
Expand All @@ -576,20 +600,27 @@ static int hinic_pf_rx_tx_flush(struct hinic_hwdev *hwdev)
err = hinic_msg_to_mgmt_no_ack(hwdev, HINIC_MOD_COMM,
HINIC_MGMT_CMD_START_FLR, &clr_res,
sizeof(clr_res), NULL, NULL);
if (err)
PMD_DRV_LOG(WARNING, "Notice flush message failed");
if (err) {
PMD_DRV_LOG(WARNING, "Notice flush msg failed, err: %d", err);
ret = err;
}

err = wait_for_flr_finish(hwif);
if (err)
PMD_DRV_LOG(WARNING, "Wait firmware FLR timeout");
if (err) {
PMD_DRV_LOG(WARNING, "Wait firmware FLR timeout, err: %d", err);
ret = err;
}

hinic_enable_doorbell(hwif);

err = hinic_reinit_cmdq_ctxts(hwdev);
if (err)
PMD_DRV_LOG(WARNING, "Reinit cmdq failed when pf flush");
if (err) {
PMD_DRV_LOG(WARNING,
"Reinit cmdq failed when pf flush, err: %d", err);
ret = err;
}

return 0;
return ret;
}

int hinic_func_rx_tx_flush(struct hinic_hwdev *hwdev)
Expand Down Expand Up @@ -623,9 +654,9 @@ static int hinic_get_interrupt_cfg(struct hinic_hwdev *hwdev,
&msix_cfg, sizeof(msix_cfg),
&msix_cfg, &out_size, 0);
if (err || !out_size || msix_cfg.mgmt_msg_head.status) {
PMD_DRV_LOG(ERR, "Get interrupt config failed, ret: %d",
msix_cfg.mgmt_msg_head.status);
return -EINVAL;
PMD_DRV_LOG(ERR, "Get interrupt config failed, err: %d, status: 0x%x, out size: 0x%x",
err, msix_cfg.mgmt_msg_head.status, out_size);
return -EIO;
}

interrupt_info->lli_credit_limit = msix_cfg.lli_credit_cnt;
Expand Down Expand Up @@ -683,9 +714,9 @@ int hinic_set_interrupt_cfg(struct hinic_hwdev *hwdev,
&msix_cfg, sizeof(msix_cfg),
&msix_cfg, &out_size, 0);
if (err || !out_size || msix_cfg.mgmt_msg_head.status) {
PMD_DRV_LOG(ERR, "Set interrupt config failed, ret: %d",
msix_cfg.mgmt_msg_head.status);
return -EINVAL;
PMD_DRV_LOG(ERR, "Set interrupt config failed, err: %d, status: 0x%x, out size: 0x%x",
err, msix_cfg.mgmt_msg_head.status, out_size);
return -EIO;
}

return 0;
Expand Down Expand Up @@ -770,6 +801,8 @@ static int set_vf_dma_attr_entry(struct hinic_hwdev *hwdev, u8 entry_idx,
enum hinic_pcie_tph tph_en)
{
struct hinic_vf_dma_attr_table attr;
u16 out_size = sizeof(attr);
int err;

memset(&attr, 0, sizeof(attr));
attr.func_idx = hinic_global_func_id(hwdev);
Expand All @@ -782,9 +815,16 @@ static int set_vf_dma_attr_entry(struct hinic_hwdev *hwdev, u8 entry_idx,
attr.no_snooping = no_snooping;
attr.tph_en = tph_en;

return hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
HINIC_MGMT_CMD_DMA_ATTR_SET,
&attr, sizeof(attr), NULL, NULL, 0);
err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
HINIC_MGMT_CMD_DMA_ATTR_SET,
&attr, sizeof(attr), &attr, &out_size, 0);
if (err || !out_size || attr.mgmt_msg_head.status) {
PMD_DRV_LOG(ERR, "Set dma attribute failed, err: %d, status: 0x%x, out_size: 0x%x",
err, attr.mgmt_msg_head.status, out_size);
return -EIO;
}

return 0;
}

/**
Expand Down Expand Up @@ -926,17 +966,26 @@ static void fault_report_show(struct hinic_hwdev *hwdev,
static int resources_state_set(struct hinic_hwdev *hwdev,
enum hinic_res_state state)
{
struct hinic_hwif *hwif = hwdev->hwif;
struct hinic_cmd_set_res_state res_state;
u16 out_size = sizeof(res_state);
int err;

memset(&res_state, 0, sizeof(res_state));
res_state.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
res_state.func_idx = HINIC_HWIF_GLOBAL_IDX(hwif);
res_state.func_idx = HINIC_HWIF_GLOBAL_IDX(hwdev->hwif);
res_state.state = state;

return hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
HINIC_MGMT_CMD_RES_STATE_SET,
&res_state, sizeof(res_state), NULL, NULL, 0);
&res_state, sizeof(res_state),
&res_state, &out_size, 0);
if (err || !out_size || res_state.mgmt_msg_head.status) {
PMD_DRV_LOG(ERR, "Set resources state failed, err: %d, status: 0x%x, out_size: 0x%x",
err, res_state.mgmt_msg_head.status, out_size);
return -EIO;
}

return 0;
}

/**
Expand Down Expand Up @@ -1020,6 +1069,7 @@ int hinic_l2nic_reset(struct hinic_hwdev *hwdev)
{
struct hinic_hwif *hwif = hwdev->hwif;
struct hinic_l2nic_reset l2nic_reset;
u16 out_size = sizeof(l2nic_reset);
int err = 0;

err = hinic_set_vport_enable(hwdev, false);
Expand All @@ -1036,10 +1086,11 @@ int hinic_l2nic_reset(struct hinic_hwdev *hwdev)
err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_COMM,
HINIC_MGMT_CMD_L2NIC_RESET,
&l2nic_reset, sizeof(l2nic_reset),
NULL, NULL, 0);
if (err || l2nic_reset.mgmt_msg_head.status) {
PMD_DRV_LOG(ERR, "Reset L2NIC resources failed");
return -EFAULT;
&l2nic_reset, &out_size, 0);
if (err || !out_size || l2nic_reset.mgmt_msg_head.status) {
PMD_DRV_LOG(ERR, "Reset L2NIC resources failed, err: %d, status: 0x%x, out_size: 0x%x",
err, l2nic_reset.mgmt_msg_head.status, out_size);
return -EIO;
}

return 0;
Expand Down
Loading

0 comments on commit d807dd7

Please sign in to comment.