X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fhinic%2Fbase%2Fhinic_pmd_mbox.c;h=92a7cc1a1176554e4569c12b21741e85ecff2562;hb=1028e5bc36b4dd4ae51580eb3e45410b6c82e153;hp=bdb94e932bb41ef0b8470fbe04f7e811af99795c;hpb=ce07a121c7975e9a984365dc5f2a3fa2867696cc;p=dpdk.git diff --git a/drivers/net/hinic/base/hinic_pmd_mbox.c b/drivers/net/hinic/base/hinic_pmd_mbox.c index bdb94e932b..92a7cc1a11 100644 --- a/drivers/net/hinic/base/hinic_pmd_mbox.c +++ b/drivers/net/hinic/base/hinic_pmd_mbox.c @@ -131,11 +131,9 @@ enum hinic_mbox_tx_status { #define MBOX_RESPONSE_ERROR 0x1 #define MBOX_MSG_ID_MASK 0xFF #define MBOX_MSG_ID(func_to_func) ((func_to_func)->send_msg_id) -#define MBOX_MSG_ID_INC(func_to_func) (MBOX_MSG_ID(func_to_func) = \ - (MBOX_MSG_ID(func_to_func) + 1) & MBOX_MSG_ID_MASK) enum hinic_hwif_direction_type { - /* driver send msg to up or up send msg to drier*/ + /* driver send msg to up or up send msg to driver*/ HINIC_HWIF_DIRECT_SEND = 0, /* after driver/up send msg to each other, then up/driver ack the msg */ HINIC_HWIF_RESPONSE, @@ -193,8 +191,7 @@ static int recv_vf_mbox_handler(struct hinic_mbox_func_to_func *func_to_func, buf_out, out_size); break; default: - PMD_DRV_LOG(ERR, "No handler, mod = %d", - recv_mbox->mod); + PMD_DRV_LOG(ERR, "No handler, mod: %d", recv_mbox->mod); rc = HINIC_MBOX_VF_CMD_ERROR; break; } @@ -243,20 +240,22 @@ static void recv_func_mbox_handler(struct hinic_mbox_func_to_func *func_to_func, } static bool check_mbox_seq_id_and_seg_len(struct hinic_recv_mbox *recv_mbox, - u8 seq_id, u8 seg_len) + u8 seq_id, u8 seg_len, u8 msg_id) { if (seq_id > HINIC_SEQ_ID_MAX_VAL || seg_len > HINIC_MSG_SEG_LEN) return false; if (seq_id == 0) { - recv_mbox->sed_id = seq_id; + recv_mbox->seq_id = seq_id; + recv_mbox->msg_info.msg_id = msg_id; } else { - if (seq_id != recv_mbox->sed_id + 1) { - recv_mbox->sed_id = 0; + if ((seq_id != recv_mbox->seq_id + 1) || + msg_id != recv_mbox->msg_info.msg_id) { + recv_mbox->seq_id = 0; return false; } - recv_mbox->sed_id = seq_id; + recv_mbox->seq_id = seq_id; } return true; @@ -300,15 +299,52 @@ mbox_copy_send_data(struct hinic_send_mbox *mbox, void *seg, u16 seg_len) mbox->data + MBOX_HEADER_SZ + i * sizeof(u32)); } +static int mbox_msg_ack_aeqn(struct hinic_hwdev *hwdev) +{ + u16 aeq_num = HINIC_HWIF_NUM_AEQS(hwdev->hwif); + int msg_ack_aeqn; + + if (aeq_num >= HINIC_MAX_AEQS - 1) { + msg_ack_aeqn = HINIC_AEQN_2; + } else if (aeq_num == HINIC_MIN_AEQS) { + /* This is used for ovs */ + msg_ack_aeqn = HINIC_AEQN_1; + } else { + PMD_DRV_LOG(ERR, "Warning: Invalid aeq num: %d\n", aeq_num); + msg_ack_aeqn = -1; + } + + return msg_ack_aeqn; +} + +static u16 mbox_msg_dst_aeqn(struct hinic_hwdev *hwdev, + enum hinic_hwif_direction_type seq_dir) +{ + u16 dst_aeqn; + + if (seq_dir == HINIC_HWIF_DIRECT_SEND) + dst_aeqn = HINIC_AEQN_0; + else + dst_aeqn = mbox_msg_ack_aeqn(hwdev); + + return dst_aeqn; +} + +static int mbox_seg_ack_aeqn(struct hinic_hwdev *hwdev) +{ + return mbox_msg_ack_aeqn(hwdev); +} + static void write_mbox_msg_attr(struct hinic_mbox_func_to_func *func_to_func, - u16 dst_func, u16 dst_aeqn, + u16 dst_func, u16 dst_aeqn, u16 seg_ack_aeqn, __rte_unused u16 seg_len, int poll) { u32 mbox_int, mbox_ctrl; mbox_int = HINIC_MBOX_INT_SET(dst_func, DST_FUNC) | HINIC_MBOX_INT_SET(dst_aeqn, DST_AEQN) | - HINIC_MBOX_INT_SET(HINIC_MBOX_RSP_AEQN, SRC_RESP_AEQN) | + /* N/A in polling mode */ + HINIC_MBOX_INT_SET(seg_ack_aeqn, SRC_RESP_AEQN) | HINIC_MBOX_INT_SET(NO_DMA_ATTRIBUTE_VAL, STAT_DMA) | HINIC_MBOX_INT_SET(ALIGN(MBOX_SIZE, MBOX_SEG_LEN_ALIGN) >> 2, TX_SIZE) | @@ -406,10 +442,8 @@ static int alloc_mbox_wb_status(struct hinic_mbox_func_to_func *func_to_func) struct hinic_hwif *hwif = hwdev->hwif; u32 addr_h, addr_l; - send_mbox->wb_vaddr = dma_zalloc_coherent(hwdev, - MBOX_WB_STATUS_LEN, - &send_mbox->wb_paddr, - GFP_KERNEL); + send_mbox->wb_vaddr = dma_zalloc_coherent(hwdev, MBOX_WB_STATUS_LEN, + &send_mbox->wb_paddr, SOCKET_ID_ANY); if (!send_mbox->wb_vaddr) { PMD_DRV_LOG(ERR, "Allocating memory for mailbox wb status failed"); return -ENOMEM; @@ -445,16 +479,24 @@ static int recv_mbox_handler(struct hinic_mbox_func_to_func *func_to_func, u16 src_func_idx; enum hinic_hwif_direction_type direction; u8 seq_id, seg_len; + u8 msg_id; + u8 front_id; seq_id = HINIC_MBOX_HEADER_GET(mbox_header, SEQID); seg_len = HINIC_MBOX_HEADER_GET(mbox_header, SEG_LEN); direction = HINIC_MBOX_HEADER_GET(mbox_header, DIRECTION); src_func_idx = HINIC_MBOX_HEADER_GET(mbox_header, SRC_GLB_FUNC_IDX); + msg_id = HINIC_MBOX_HEADER_GET(mbox_header, MSG_ID); + front_id = recv_mbox->seq_id; - if (!check_mbox_seq_id_and_seg_len(recv_mbox, seq_id, seg_len)) { + if (!check_mbox_seq_id_and_seg_len(recv_mbox, seq_id, seg_len, + msg_id)) { PMD_DRV_LOG(ERR, - "Mailbox sequence and segment check failed, src func id: 0x%x, front id: 0x%x, current id: 0x%x, seg len: 0x%x\n", - src_func_idx, recv_mbox->sed_id, seq_id, seg_len); + "Mailbox sequence and segment check failed, src func id: 0x%x, " + "front id: 0x%x, current id: 0x%x, seg len: 0x%x " + "front msg_id: %d, cur msg_id: %d", + src_func_idx, front_id, seq_id, seg_len, + recv_mbox->msg_info.msg_id, msg_id); return HINIC_ERROR; } @@ -464,7 +506,7 @@ static int recv_mbox_handler(struct hinic_mbox_func_to_func *func_to_func, if (!HINIC_MBOX_HEADER_GET(mbox_header, LAST)) return HINIC_ERROR; - recv_mbox->sed_id = 0; + recv_mbox->seq_id = 0; recv_mbox->cmd = HINIC_MBOX_HEADER_GET(mbox_header, CMD); recv_mbox->mod = HINIC_MBOX_HEADER_GET(mbox_header, MODULE); recv_mbox->mbox_len = HINIC_MBOX_HEADER_GET(mbox_header, MSG_LEN); @@ -556,19 +598,21 @@ static int send_mbox_seg(struct hinic_mbox_func_to_func *func_to_func, struct hinic_send_mbox *send_mbox = &func_to_func->send_mbox; struct hinic_hwdev *hwdev = func_to_func->hwdev; u16 seq_dir = HINIC_MBOX_HEADER_GET(header, DIRECTION); - u16 dst_aeqn = (seq_dir == HINIC_HWIF_DIRECT_SEND) ? - HINIC_MBOX_RECV_AEQN : HINIC_MBOX_RSP_AEQN; + u16 dst_aeqn, seg_ack_aeqn; u16 err_code, wb_status = 0; u32 cnt = 0; + dst_aeqn = mbox_msg_dst_aeqn(hwdev, seq_dir); + seg_ack_aeqn = mbox_seg_ack_aeqn(hwdev); + clear_mbox_status(send_mbox); mbox_copy_header(send_mbox, &header); mbox_copy_send_data(send_mbox, seg, seg_len); - write_mbox_msg_attr(func_to_func, dst_func, dst_aeqn, seg_len, - MBOX_SEND_MSG_POLL); + write_mbox_msg_attr(func_to_func, dst_func, dst_aeqn, seg_ack_aeqn, + seg_len, MBOX_SEND_MSG_POLL); rte_wmb(); @@ -690,7 +734,8 @@ static int hinic_mbox_to_func(struct hinic_mbox_func_to_func *func_to_func, if (err) return err; - msg_info.msg_id = MBOX_MSG_ID_INC(func_to_func); + msg_info.msg_id = (MBOX_MSG_ID(func_to_func) + 1) & MBOX_MSG_ID_MASK; + MBOX_MSG_ID(func_to_func) = msg_info.msg_id; set_mbox_to_func_event(func_to_func, EVENT_START); @@ -701,7 +746,7 @@ static int hinic_mbox_to_func(struct hinic_mbox_func_to_func *func_to_func, goto send_err; time = msecs_to_jiffies(timeout ? timeout : HINIC_MBOX_COMP_TIME_MS); - err = hinic_aeq_poll_msg(func_to_func->rsp_aeq, time, NULL); + err = hinic_aeq_poll_msg(func_to_func->ack_aeq, time, NULL); if (err) { set_mbox_to_func_event(func_to_func, EVENT_TIMEOUT); PMD_DRV_LOG(ERR, "Send mailbox message time out"); @@ -873,7 +918,7 @@ static int hinic_func_to_func_init(struct hinic_hwdev *hwdev) err = alloc_mbox_info(func_to_func->mbox_resp); if (err) { - PMD_DRV_LOG(ERR, "Allocating memory for mailbox responsing failed"); + PMD_DRV_LOG(ERR, "Allocating memory for mailbox responding failed"); goto alloc_mbox_for_resp_err; } @@ -924,13 +969,16 @@ void hinic_comm_func_to_func_free(struct hinic_hwdev *hwdev) int hinic_comm_func_to_func_init(struct hinic_hwdev *hwdev) { int rc; + u16 msg_ack_aeqn; rc = hinic_func_to_func_init(hwdev); if (rc) return rc; - hwdev->func_to_func->rsp_aeq = &hwdev->aeqs->aeq[HINIC_MBOX_RSP_AEQN]; - hwdev->func_to_func->recv_aeq = &hwdev->aeqs->aeq[HINIC_MBOX_RECV_AEQN]; + msg_ack_aeqn = mbox_msg_ack_aeqn(hwdev); + + hwdev->func_to_func->ack_aeq = &hwdev->aeqs->aeq[msg_ack_aeqn]; + hwdev->func_to_func->recv_aeq = &hwdev->aeqs->aeq[HINIC_AEQN_0]; return 0; }