LCOV - code coverage report
Current view: top level - base_comm/resources/hccp/rdma_agent/hdc - ra_hdc_rdma.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 48.2 % 1156 557
Test Date: 2026-07-28 12:11:00 Functions: 59.7 % 67 40

            Line data    Source code
       1              : /**
       2              :  * Copyright (c) 2025 Huawei Technologies Co., Ltd.
       3              :  * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
       4              :  * CANN Open Software License Agreement Version 2.0 (the "License").
       5              :  * Please refer to the License for details. You may not use this file except in compliance with the License.
       6              :  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
       7              :  * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
       8              :  * See LICENSE in the root of the software repository for the full text of the License.
       9              :  */
      10              : 
      11              : #include <stdlib.h>
      12              : #include <string.h>
      13              : #include <arpa/inet.h>
      14              : #include <unistd.h>
      15              : #include <errno.h>
      16              : #include "user_log.h"
      17              : #include "ra_hdc.h"
      18              : #include "securec.h"
      19              : #include "ra.h"
      20              : #include "ra_rs_comm.h"
      21              : #include "ra_rs_err.h"
      22              : #include "dl_hal_function.h"
      23              : #include "ra_rdma_lite.h"
      24              : #include "ra_hdc_lite.h"
      25              : #include "ra_hdc_rdma_notify.h"
      26              : #include "ra_hdc_rdma_verbs.h"
      27              : #include "ra_hdc_rdma.h"
      28              : 
      29           16 : STATIC int RaHdcNotifyBaseAddrInit(unsigned int notifyType, unsigned int phyId, unsigned long long **notifyVa)
      30              : {
      31           16 :     unsigned long long moudleId = HCCP;
      32           16 :     unsigned int notifySize = 0;
      33              :     unsigned int logicId;
      34              :     int ret, drvRet;
      35              : 
      36           16 :     CHK_PRT_RETURN(notifyType != NOTIFY, hccp_err("[init][base_addr]notify_type[%u] error", notifyType), -EINVAL);
      37           16 :     ret = DlDrvDeviceGetIndexByPhyId(phyId, &logicId);
      38           16 :     CHK_PRT_RETURN(ret, hccp_err("[init][base_addr]drvDeviceGetIndexByPhyId failed, ret(%d), phyId(%u)",
      39              :         ret, phyId), ret);
      40              : 
      41           15 :     ret = DlHalNotifyGetInfo(logicId, 0, RA_NOTIFY_TYPE_TOTAL_SIZE, &notifySize);
      42           15 :     CHK_PRT_RETURN(ret, hccp_err("[init][base_addr]halNotifyGetInfo failed, ret(%d), logicId(%u)",
      43              :         ret, logicId), ret);
      44              : 
      45           14 :     ret = DlHalMemAlloc((void *)notifyVa, (unsigned long long)notifySize,
      46           14 :         RA_MEM_TYPE_HBM | (moudleId << MEM_MODULE_ID_BIT));
      47           14 :     CHK_PRT_RETURN(ret, hccp_err("[init][base_addr]halMemAlloc failed, ret(%d), phyId(%u)", ret, phyId), ret);
      48              : 
      49           13 :     hccp_info("notify info: size[%u]", notifySize);
      50           13 :     ret = RaHdcNotifyCfgSet(phyId, (uintptr_t)*notifyVa, notifySize);
      51           13 :     if (ret) {
      52            4 :         hccp_err("[init][base_addr]ra_hdc_notify_cfg_set failed, ret(%d), phyId(%u)", ret, phyId);
      53            4 :         goto free_mem;
      54              :     }
      55            9 :     return 0;
      56              : 
      57            4 : free_mem:
      58            4 :     drvRet = DlHalMemFree((void *)*notifyVa);
      59            4 :     if (drvRet) {
      60            1 :         hccp_err("[init][base_addr]halMemFree failed! ret(%d)", drvRet);
      61              :     }
      62            4 :     return ret;
      63              : }
      64              : 
      65           10 : static void RaHdcGetQpHdc(struct RaRdmaHandle *rdmaHandle, int flag, int qpMode, unsigned int qpn,
      66              :     struct RaQpHandle *qpHdc)
      67              : {
      68           10 :     qpHdc->phyId = rdmaHandle->rdevInfo.phyId;
      69           10 :     qpHdc->rdevIndex = rdmaHandle->rdevIndex;
      70           10 :     qpHdc->rdmaHandle = rdmaHandle;
      71           10 :     qpHdc->rdmaOps = rdmaHandle->rdmaOps;
      72           10 :     qpHdc->qpMode = qpMode;
      73           10 :     qpHdc->flag = flag;
      74           10 :     qpHdc->qpn = qpn;
      75           10 : }
      76              : 
      77           12 : STATIC int RaHdcCmdQpDestroy(struct RaQpHandle *qpHdc)
      78              : {
      79              :     int ret;
      80           12 :     union OpQpDestroyData qpDestroyData = {0};
      81              : 
      82           12 :     qpDestroyData.txData.qpn = qpHdc->qpn;
      83           12 :     qpDestroyData.txData.phyId = qpHdc->phyId;
      84           12 :     qpDestroyData.txData.rdevIndex = qpHdc->rdevIndex;
      85           12 :     ret = RaHdcProcessMsg(RA_RS_QP_DESTROY, qpHdc->phyId, (char *)&qpDestroyData,
      86              :         sizeof(union OpQpDestroyData));
      87           12 :     if (ret) {
      88            2 :         hccp_err("[destroy][ra_hdc_qp]hdc_send_recv_pkt failed ret(%d) phyId(%u)", ret, qpHdc->phyId);
      89              :     }
      90              : 
      91           12 :     return ret;
      92              : }
      93              : 
      94            0 : STATIC int RaHdcCmdQpDestroyWithoutCQ(struct RaQpHandle *qpHdc)
      95              : {
      96              :     int ret;
      97            0 :     union OpQpDestroyData qpDestroyData = {0};
      98              : 
      99            0 :     qpDestroyData.txData.qpn = qpHdc->qpn;
     100            0 :     qpDestroyData.txData.phyId = qpHdc->phyId;
     101            0 :     qpDestroyData.txData.rdevIndex = qpHdc->rdevIndex;
     102            0 :     ret = RaHdcProcessMsg(RA_RS_QP_DESTROY_WITHOUT_CQ, qpHdc->phyId, (char *)&qpDestroyData,
     103              :         sizeof(union OpQpDestroyData));
     104            0 :     if (ret) {
     105            0 :         hccp_err("[destroy][ra_hdc_qp]hdc_send_recv_pkt failed ret(%d) phyId(%u)", ret, qpHdc->phyId);
     106              :     }
     107              : 
     108            0 :     return ret;
     109              : }
     110              : 
     111            9 : int RaHdcQpCreate(struct RaRdmaHandle *rdmaHandle, int flag, int qpMode, void **qpHandle)
     112              : {
     113            9 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
     114            9 :     union OpQpCreateData qpCreateData = {0};
     115            9 :     struct RaQpHandle *qpHdc = NULL;
     116              :     struct rdma_lite_qp_cap cap;
     117              :     int ret;
     118              : 
     119            9 :     qpHdc = (struct RaQpHandle *)calloc(1, sizeof(struct RaQpHandle));
     120            9 :     CHK_PRT_RETURN(qpHdc == NULL, hccp_err("[create][ra_hdc_qp]qp_hdc calloc failed phyId(%u)", phyId), -ENOMEM);
     121              : 
     122            8 :     qpCreateData.txData.phyId = phyId;
     123            8 :     qpCreateData.txData.rdevIndex = rdmaHandle->rdevIndex;
     124            8 :     qpCreateData.txData.flag = flag;
     125            8 :     qpCreateData.txData.qpMode = qpMode;
     126            8 :     qpCreateData.txData.memAlign = rdmaHandle->supportLite;
     127              : 
     128            8 :     ret = RaHdcProcessMsg(RA_RS_QP_CREATE, phyId, (char *)&qpCreateData,
     129              :         sizeof(union OpQpCreateData));
     130            8 :     if (ret) {
     131            1 :         hccp_err("[create][ra_hdc_qp]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
     132            1 :         free(qpHdc);
     133            1 :         qpHdc = NULL;
     134            1 :         return ret;
     135              :     }
     136              : 
     137            7 :     RaHdcGetQpHdc(rdmaHandle, flag, qpMode, qpCreateData.rxData.qpn, qpHdc);
     138            7 :     qpHdc->psn = qpCreateData.rxData.psn;
     139            7 :     qpHdc->gidIdx = qpCreateData.rxData.gidIdx;
     140              : 
     141            7 :     cap.max_inline_data = QP_DEFAULT_MAX_CAP_INLINE_DATA;
     142            7 :     cap.max_send_sge = QP_DEFAULT_MIN_CAP_SEND_SGE;
     143            7 :     cap.max_recv_sge = QP_DEFAULT_MIN_CAP_RECV_SGE;
     144            7 :     cap.max_send_wr = RA_QP_32K_DEPTH;
     145            7 :     cap.max_recv_wr = RA_QP_128_DEPTH;
     146            7 :     ret = RaHdcLiteQpCreate(rdmaHandle, qpHdc, &cap);
     147            7 :     if (ret) {
     148            0 :         (void)RaHdcCmdQpDestroy(qpHdc);
     149            0 :         hccp_err("[create][ra_hdc_qp]ra_hdc_lite_qp_create failed ret(%d) phyId(%u)", ret, phyId);
     150            0 :         free(qpHdc);
     151            0 :         qpHdc = NULL;
     152            0 :         return ret;
     153              :     }
     154              : 
     155            7 :     qpHdc->sqDepth = cap.max_send_wr;
     156            7 :     *qpHandle = qpHdc;
     157              : 
     158            7 :     return 0;
     159              : }
     160              : 
     161            1 : int RaHdcQpCreateWithAttrs(struct RaRdmaHandle *rdmaHandle, struct QpExtAttrs *extAttrs, void **qpHandle)
     162              : {
     163            1 :     int flag = (extAttrs->qpAttr.qp_type == IBV_QPT_RC) ? 0 : 1;
     164            1 :     union OpQpCreateWithAttrsData opData = {0};
     165            1 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
     166            1 :     struct RaQpHandle *qpHdc = NULL;
     167              :     struct rdma_lite_qp_cap cap;
     168              :     int ret;
     169              : 
     170            1 :     qpHdc = (struct RaQpHandle *)calloc(1, sizeof(struct RaQpHandle));
     171            1 :     CHK_PRT_RETURN(qpHdc == NULL, hccp_err("[create][ra_hdc_qp_with_attrs]qp_hdc calloc failed phyId(%u)", phyId),
     172              :         -ENOMEM);
     173              : 
     174            1 :     opData.txData.phyId = phyId;
     175            1 :     opData.txData.rdevIndex = rdmaHandle->rdevIndex;
     176            1 :     ret = memcpy_s(&opData.txData.extAttrs, sizeof(struct QpExtAttrs), extAttrs, sizeof(struct QpExtAttrs));
     177            1 :     if (ret) {
     178            0 :         hccp_err("[create][ra_hdc_qp_with_attrs]memcpy_s for ext_attrs failed, ret:%d", ret);
     179            0 :         ret = -ESAFEFUNC;
     180            0 :         goto out;
     181              :     }
     182              : 
     183            1 :     opData.txData.extAttrs.memAlign = rdmaHandle->supportLite;
     184            1 :     ret = RaHdcProcessMsg(RA_RS_QP_CREATE_WITH_ATTRS, phyId, (char *)&opData,
     185              :         sizeof(union OpQpCreateWithAttrsData));
     186            1 :     if (ret) {
     187            0 :         hccp_err("[create][ra_hdc_qp_with_attrs]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
     188            0 :         goto out;
     189              :     }
     190              : 
     191            1 :     RaHdcGetQpHdc(rdmaHandle, flag, extAttrs->qpMode, opData.rxData.qpn, qpHdc);
     192            1 :     qpHdc->psn = opData.rxData.psn;
     193            1 :     qpHdc->gidIdx = opData.rxData.gidIdx;
     194              : 
     195            1 :     cap.max_inline_data = extAttrs->qpAttr.cap.max_inline_data;
     196            1 :     cap.max_send_sge = extAttrs->qpAttr.cap.max_send_sge;
     197            1 :     cap.max_recv_sge = extAttrs->qpAttr.cap.max_recv_sge;
     198            1 :     cap.max_send_wr = extAttrs->qpAttr.cap.max_send_wr;
     199            1 :     cap.max_recv_wr = extAttrs->qpAttr.cap.max_recv_wr;
     200            1 :     ret = RaHdcLiteQpCreate(rdmaHandle, qpHdc, &cap);
     201            1 :     if (ret) {
     202            0 :         (void)RaHdcCmdQpDestroy(qpHdc);
     203            0 :         hccp_err("[create][ra_hdc_qp_with_attrs]ra_hdc_lite_qp_create failed ret(%d) phyId(%u)", ret, phyId);
     204            0 :         goto out;
     205              :     }
     206              : 
     207            1 :     qpHdc->sqSigAll = extAttrs->qpAttr.sq_sig_all;
     208            1 :     qpHdc->typicalQpAttr.udpSport = extAttrs->udpSport;
     209            1 :     qpHdc->sqDepth = cap.max_send_wr;
     210            1 :     *qpHandle = qpHdc;
     211            1 :     return 0;
     212              : 
     213            0 : out:
     214            0 :     free(qpHdc);
     215            0 :     qpHdc = NULL;
     216            0 :     return ret;
     217              : }
     218              : 
     219            0 : int RaHdcQpCreateWithCQWithAttrs(struct RaRdmaHandle *rdmaHandle, struct QpExtAttrs *extAttrs,
     220              :     unsigned int sendCqn, unsigned int recvCqn, void **qpHandle)
     221              : {
     222            0 :     int flag = (extAttrs->qpAttr.qp_type == IBV_QPT_RC) ? 0 : 1;
     223            0 :     union OpQpCreateWithCQWithAttrsData opData = {0};
     224            0 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
     225            0 :     struct RaQpHandle *qpHdc = NULL;
     226              :     struct rdma_lite_qp_cap cap;
     227              :     int ret;
     228              : 
     229            0 :     qpHdc = (struct RaQpHandle *)calloc(1, sizeof(struct RaQpHandle));
     230            0 :     CHK_PRT_RETURN(qpHdc == NULL, hccp_err("[create][ra_hdc_qp_with_cq_attrs]qp_hdc calloc failed phyId(%u)", phyId),
     231              :         -ENOMEM);
     232              : 
     233            0 :     opData.txData.phyId = phyId;
     234            0 :     opData.txData.rdevIndex = rdmaHandle->rdevIndex;
     235            0 :     opData.txData.sendCqn = sendCqn;
     236            0 :     opData.txData.recvCqn = recvCqn;
     237            0 :     ret = memcpy_s(&opData.txData.extAttrs, sizeof(struct QpExtAttrs), extAttrs, sizeof(struct QpExtAttrs));
     238            0 :     if (ret) {
     239            0 :         hccp_err("[create][ra_hdc_qp_with_cq_attrs]memcpy_s for ext_attrs failed, ret:%d", ret);
     240            0 :         ret = -ESAFEFUNC;
     241            0 :         goto out;
     242              :     }
     243              : 
     244            0 :     opData.txData.extAttrs.memAlign = rdmaHandle->supportLite;
     245            0 :     ret = RaHdcProcessMsg(RA_RS_QP_CREATE_WITH_CQ_WITH_ATTRS, phyId, (char *)&opData,
     246              :         sizeof(union OpQpCreateWithCQWithAttrsData));
     247            0 :     if (ret) {
     248            0 :         hccp_err("[create][ra_hdc_qp_with_cq_attrs]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
     249            0 :         goto out;
     250              :     }
     251              : 
     252            0 :     RaHdcGetQpHdc(rdmaHandle, flag, extAttrs->qpMode, opData.rxData.qpn, qpHdc);
     253            0 :     qpHdc->psn = opData.rxData.psn;
     254            0 :     qpHdc->gidIdx = opData.rxData.gidIdx;
     255              : 
     256            0 :     cap.max_inline_data = extAttrs->qpAttr.cap.max_inline_data;
     257            0 :     cap.max_send_wr = extAttrs->qpAttr.cap.max_send_wr;
     258            0 :     cap.max_recv_wr = extAttrs->qpAttr.cap.max_recv_wr;
     259            0 :     cap.max_send_sge = extAttrs->qpAttr.cap.max_send_sge;
     260            0 :     cap.max_recv_sge = extAttrs->qpAttr.cap.max_recv_sge;
     261            0 :     ret = RaHdcLiteQpCreateWithCQ(rdmaHandle, qpHdc, &cap,
     262              :         RaHdcLiteFindTypicalCq(rdmaHandle, sendCqn), RaHdcLiteFindTypicalCq(rdmaHandle, recvCqn),
     263              :         sendCqn, recvCqn);
     264            0 :     if (ret) {
     265            0 :         (void)RaHdcCmdQpDestroyWithoutCQ(qpHdc);
     266            0 :         hccp_err("[create][ra_hdc_qp_with_cq_attrs]ra_hdc_lite_qp_create failed ret(%d) phyId(%u)", ret, phyId);
     267            0 :         goto out;
     268              :     }
     269              : 
     270            0 :     qpHdc->sqDepth = cap.max_send_wr;
     271            0 :     qpHdc->typicalQpAttr.udpSport = extAttrs->udpSport;
     272            0 :     qpHdc->sqSigAll = extAttrs->qpAttr.sq_sig_all;
     273            0 :     *qpHandle = qpHdc;
     274            0 :     return 0;
     275              : 
     276            0 : out:
     277            0 :     free(qpHdc);
     278            0 :     qpHdc = NULL;
     279            0 :     return ret;
     280              : }
     281              : 
     282            0 : int RaHdcAiQpCreate(struct RaRdmaHandle *rdmaHandle, struct QpExtAttrs *extAttrs,
     283              :     struct AiQpInfo *info, void **qpHandle)
     284              : {
     285              : #define AI_QP_DEFAULT_GID_IDX 3U
     286            0 :     int flag = extAttrs->qpAttr.qp_type == IBV_QPT_RC ? 0 : 1;
     287            0 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
     288            0 :     union OpAiQpCreateData qpCreateData = {0};
     289            0 :     struct RaQpHandle *qpHdc = NULL;
     290            0 :     int qpMode = extAttrs->qpMode;
     291              :     int ret;
     292              : 
     293            0 :     qpHdc = (struct RaQpHandle *)calloc(1, sizeof(struct RaQpHandle));
     294            0 :     CHK_PRT_RETURN(qpHdc == NULL, hccp_err("[create][ra_hdc_ai_qp]qp_hdc calloc failed phyId(%u)", phyId),
     295              :         -ENOMEM);
     296              : 
     297            0 :     qpCreateData.txData.phyId = phyId;
     298            0 :     qpCreateData.txData.rdevIndex = rdmaHandle->rdevIndex;
     299            0 :     ret = memcpy_s(&qpCreateData.txData.extAttrs, sizeof(struct QpExtAttrs), extAttrs,
     300              :         sizeof(struct QpExtAttrs));
     301            0 :     if (ret) {
     302            0 :         hccp_err("[create][ra_hdc_ai_qp]memcpy_s for ext_attrs failed, ret:%d", ret);
     303            0 :         free(qpHdc);
     304            0 :         qpHdc = NULL;
     305            0 :         return -ESAFEFUNC;
     306              :     }
     307              : 
     308            0 :     ret = RaHdcProcessMsg(RA_RS_AI_QP_CREATE, phyId, (char *)&qpCreateData,
     309              :         sizeof(union OpAiQpCreateData));
     310            0 :     if (ret) {
     311            0 :         hccp_err("[create][ra_hdc_ai_qp]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
     312            0 :         free(qpHdc);
     313            0 :         qpHdc = NULL;
     314            0 :         return ret;
     315              :     }
     316              : 
     317            0 :     RaHdcGetQpHdc(rdmaHandle, flag, qpMode, qpCreateData.rxData.qpn, qpHdc);
     318            0 :     qpHdc->psn = qpCreateData.rxData.psn;
     319              :     // set a default gid_idx due to compatibility issue, rs will refresh it if it is different
     320            0 :     qpHdc->gidIdx = AI_QP_DEFAULT_GID_IDX;
     321            0 :     info->aiQpAddr = qpCreateData.rxData.aiQpAddr;
     322            0 :     info->sqIndex = qpCreateData.rxData.sqIndex;
     323            0 :     info->dbIndex = qpCreateData.rxData.dbIndex;
     324            0 :     qpHdc->typicalQpAttr.udpSport = extAttrs->udpSport;
     325            0 :     *qpHandle = qpHdc;
     326              : 
     327            0 :     return 0;
     328              : }
     329              : 
     330            1 : int RaHdcAiQpCreateWithAttrs(struct RaRdmaHandle *rdmaHandle, struct QpExtAttrs *extAttrs,
     331              :     struct AiQpInfo *info, void **qpHandle)
     332              : {
     333            1 :     int flag = extAttrs->qpAttr.qp_type == IBV_QPT_RC ? 0 : 1;
     334            1 :     union OpAiQpCreateWithAttrsData qpCreateData = {0};
     335            1 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
     336            1 :     struct RaQpHandle *qpHdc = NULL;
     337            1 :     int qpMode = extAttrs->qpMode;
     338              :     int ret;
     339              : 
     340            1 :     qpHdc = (struct RaQpHandle *)calloc(1, sizeof(struct RaQpHandle));
     341            1 :     CHK_PRT_RETURN(qpHdc == NULL, hccp_err("[create][ra_hdc_ai_qp]qp_hdc calloc failed phyId(%u)", phyId),
     342              :         -ENOMEM);
     343              : 
     344            1 :     qpCreateData.txData.phyId = phyId;
     345            1 :     qpCreateData.txData.rdevIndex = rdmaHandle->rdevIndex;
     346            1 :     ret = memcpy_s(&qpCreateData.txData.extAttrs, sizeof(struct QpExtAttrs), extAttrs,
     347              :         sizeof(struct QpExtAttrs));
     348            1 :     if (ret) {
     349            0 :         hccp_err("[create][ra_hdc_ai_qp]memcpy_s for ext_attrs failed, ret:%d", ret);
     350            0 :         free(qpHdc);
     351            0 :         qpHdc = NULL;
     352            0 :         return -ESAFEFUNC;
     353              :     }
     354              : 
     355            1 :     ret = RaHdcProcessMsg(RA_RS_AI_QP_CREATE_WITH_ATTRS, phyId, (char *)&qpCreateData,
     356              :         sizeof(union OpAiQpCreateWithAttrsData));
     357            1 :     if (ret) {
     358            0 :         hccp_err("[create][ra_hdc_ai_qp]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
     359            0 :         free(qpHdc);
     360            0 :         qpHdc = NULL;
     361            0 :         return ret;
     362              :     }
     363              : 
     364            1 :     qpHdc->typicalQpAttr.udpSport = extAttrs->udpSport;
     365            1 :     RaHdcGetQpHdc(rdmaHandle, flag, qpMode, qpCreateData.rxData.qpn, qpHdc);
     366            1 :     qpHdc->gidIdx = qpCreateData.rxData.gidIdx;
     367            1 :     qpHdc->psn = qpCreateData.rxData.psn;
     368            1 :     info->aiQpAddr = qpCreateData.rxData.aiQpAddr;
     369            1 :     info->sqIndex = qpCreateData.rxData.sqIndex;
     370            1 :     info->dbIndex = qpCreateData.rxData.dbIndex;
     371            1 :     info->aiScqAddr = qpCreateData.rxData.aiScqAddr;
     372            1 :     info->aiRcqAddr = qpCreateData.rxData.aiRcqAddr;
     373            1 :     (void)memcpy_s(&info->dataPlaneInfo, sizeof(struct AiDataPlaneInfo), &qpCreateData.rxData.dataPlaneInfo,
     374              :         sizeof(struct AiDataPlaneInfo));
     375            1 :     *qpHandle = qpHdc;
     376              : 
     377            1 :     return 0;
     378              : }
     379              : 
     380            1 : int RaHdcTypicalQpCreate(struct RaRdmaHandle *rdmaHandle, int flag, int qpMode, struct TypicalQp *qpInfo,
     381              :     void **qpHandle)
     382              : {
     383            1 :     union OpTypicalQpCreateData qpCreateData = {0};
     384            1 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
     385            1 :     struct RaQpHandle *qpHdc = NULL;
     386              :     struct rdma_lite_qp_cap cap;
     387              :     int ret;
     388              : 
     389            1 :     qpHdc = (struct RaQpHandle *)calloc(1, sizeof(struct RaQpHandle));
     390            1 :     CHK_PRT_RETURN(qpHdc == NULL, hccp_err("[create][ra_hdc_typical_qp]qp_hdc calloc failed phyId(%u)", phyId),
     391              :         -ENOMEM);
     392              : 
     393            1 :     qpCreateData.txData.phyId = phyId;
     394            1 :     qpCreateData.txData.rdevIndex = rdmaHandle->rdevIndex;
     395            1 :     qpCreateData.txData.flag = flag;
     396            1 :     qpCreateData.txData.qpMode = qpMode;
     397            1 :     qpCreateData.txData.memAlign = rdmaHandle->supportLite;
     398              : 
     399            1 :     ret = RaHdcProcessMsg(RA_RS_TYPICAL_QP_CREATE, phyId, (char *)&qpCreateData,
     400              :         sizeof(union OpTypicalQpCreateData));
     401            1 :     if (ret) {
     402            0 :         hccp_err("[create][ra_hdc_typical_qp]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
     403            0 :         free(qpHdc);
     404            0 :         qpHdc = NULL;
     405            0 :         return ret;
     406              :     }
     407              : 
     408            1 :     qpInfo->gidIdx = qpCreateData.rxData.gidIdx;
     409            1 :     qpInfo->psn = qpCreateData.rxData.psn;
     410            1 :     qpInfo->qpn = qpCreateData.rxData.qpn;
     411            1 :     (void)memcpy_s(qpInfo->gid, HCCP_GID_RAW_LEN, qpCreateData.rxData.gid.raw, HCCP_GID_RAW_LEN);
     412              : 
     413            1 :     RaHdcGetQpHdc(rdmaHandle, flag, qpMode, qpInfo->qpn, qpHdc);
     414            1 :     qpHdc->psn = qpCreateData.rxData.psn;
     415            1 :     qpHdc->gidIdx = qpCreateData.rxData.gidIdx;
     416              : 
     417            1 :     cap.max_inline_data = QP_DEFAULT_MAX_CAP_INLINE_DATA;
     418            1 :     cap.max_send_sge = QP_DEFAULT_MIN_CAP_SEND_SGE;
     419            1 :     cap.max_recv_sge = QP_DEFAULT_MIN_CAP_RECV_SGE;
     420            1 :     cap.max_send_wr = RA_QP_32K_DEPTH;
     421            1 :     cap.max_recv_wr = RA_QP_128_DEPTH;
     422            1 :     ret = RaHdcLiteQpCreate(rdmaHandle, qpHdc, &cap);
     423            1 :     if (ret) {
     424            0 :         (void)RaHdcCmdQpDestroy(qpHdc);
     425            0 :         hccp_err("[create][ra_hdc_typical_qp]ra_hdc_lite_qp_create failed ret(%d) phyId(%u)", ret, phyId);
     426            0 :         free(qpHdc);
     427            0 :         qpHdc = NULL;
     428            0 :         return ret;
     429              :     }
     430              : 
     431            1 :     qpHdc->sqDepth = cap.max_send_wr;
     432            1 :     *qpHandle = qpHdc;
     433              : 
     434            1 :     return 0;
     435              : }
     436              : 
     437            0 : int RaHdcTypicalCqCreate(struct RaRdmaHandle *rdmaHandle, unsigned int cqDepth, unsigned int *cqn,
     438              :     void **cqHandle)
     439              : {
     440            0 :     union OpTypicalCqCreateData cqCreateData = {0};
     441            0 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
     442            0 :     struct RaTypicalCqHandle *cqHdc = NULL;
     443              :     int ret;
     444              : 
     445            0 :     cqHdc = (struct RaTypicalCqHandle *)calloc(1, sizeof(struct RaTypicalCqHandle));
     446            0 :     CHK_PRT_RETURN(cqHdc == NULL,
     447              :         hccp_err("[create][ra_hdc_typical_cq]cq_hdc calloc failed phyId(%u)", phyId), -ENOMEM);
     448              : 
     449            0 :     cqCreateData.txData.phyId = phyId;
     450            0 :     cqCreateData.txData.rdevIndex = rdmaHandle->rdevIndex;
     451            0 :     cqCreateData.txData.cqDepth = cqDepth;
     452              : 
     453            0 :     ret = RaHdcProcessMsg(RA_RS_TYPICAL_CQ_CREATE, phyId, (char *)&cqCreateData,
     454              :         sizeof(union OpTypicalCqCreateData));
     455            0 :     if (ret) {
     456            0 :         hccp_err("[create][ra_hdc_typical_cq]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
     457            0 :         free(cqHdc);
     458            0 :         cqHdc = NULL;
     459            0 :         return ret;
     460              :     }
     461            0 :     hccp_info("RaHdcProcessMsg RA_RS_TYPICAL_CQ_CREATE Done");
     462              : 
     463            0 :     *cqn = cqCreateData.rxData.cqn;
     464              : 
     465            0 :     cqHdc->cqn = *cqn;
     466            0 :     cqHdc->phyId = phyId;
     467            0 :     cqHdc->rdevIndex = rdmaHandle->rdevIndex;
     468            0 :     cqHdc->rdmaHandle = rdmaHandle;
     469            0 :     cqHdc->rdmaOps = rdmaHandle->rdmaOps;
     470              : 
     471            0 :     if (rdmaHandle->supportLite != 0) {
     472            0 :         struct rdma_lite_cq *liteCq = NULL;
     473            0 :         ret = RaHdcLiteCqCreate(rdmaHandle, cqDepth, &cqCreateData, &liteCq);
     474            0 :         if (ret) {
     475            0 :             union OpTypicalCqDestroyData  destroyData = {0};
     476            0 :             hccp_err("[create][ra_hdc_typical_cq]ra_hdc_lite_cq_create failed ret(%d) phyId(%u)", ret, phyId);
     477            0 :             destroyData.txData.cqn = cqHdc->cqn;
     478            0 :             destroyData.txData.phyId = cqHdc->phyId;
     479            0 :             destroyData.txData.rdevIndex = cqHdc->rdevIndex;
     480            0 :             (void)RaHdcProcessMsg(RA_RS_TYPICAL_CQ_DESTROY, phyId, (char *)&destroyData,
     481              :                 sizeof(union OpTypicalCqDestroyData));
     482            0 :             free(cqHdc);
     483            0 :             cqHdc = NULL;
     484            0 :             return ret;
     485              :         }
     486            0 :         cqHdc->liteCq = liteCq;
     487              :     }
     488              : 
     489            0 :     *cqHandle = cqHdc;
     490              : 
     491            0 :     return 0;
     492              : }
     493              : 
     494            0 : int RaHdcTypicalCqDestroy(struct RaRdmaHandle *rdmaHandle, unsigned int cqn, void *cqHandle)
     495              : {
     496            0 :     struct RaTypicalCqHandle *cqHdc = (struct RaTypicalCqHandle *)cqHandle;
     497            0 :     union OpTypicalCqDestroyData destroyData = {0};
     498            0 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
     499              :     int ret;
     500              : 
     501            0 :     if (cqHdc == NULL) {
     502            0 :         hccp_err("[destroy][ra_hdc_typical_cq]cq handle is NULL phyId(%u)", phyId);
     503            0 :         return -EINVAL;
     504              :     }
     505              : 
     506            0 :     if (cqHdc->liteCq != NULL) {
     507            0 :         RaHdcLiteRemoveTypicalCq(rdmaHandle, cqHdc->cqn);
     508            0 :         (void)RaRdmaLiteDestroyCq(cqHdc->liteCq);
     509            0 :         cqHdc->liteCq = NULL;
     510              :     }
     511              : 
     512            0 :     destroyData.txData.phyId = phyId;
     513            0 :     destroyData.txData.rdevIndex = rdmaHandle->rdevIndex;
     514            0 :     destroyData.txData.cqn = cqn;
     515            0 :     ret = RaHdcProcessMsg(RA_RS_TYPICAL_CQ_DESTROY, phyId, (char *)&destroyData,
     516              :         sizeof(union OpTypicalCqDestroyData));
     517            0 :     if (ret) {
     518            0 :         hccp_err("[destroy][ra_hdc_typical_cq]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
     519              :     }
     520              : 
     521            0 :     free(cqHdc);
     522            0 :     cqHdc = NULL;
     523            0 :     return ret;
     524              : }
     525              : 
     526           12 : int RaHdcQpDestroy(struct RaQpHandle *qpHdc)
     527              : {
     528              :     int ret;
     529              : 
     530           12 :     RaHdcLiteQpDestroy(qpHdc);
     531           12 :     ret = RaHdcCmdQpDestroy(qpHdc);
     532           12 :     if (ret) {
     533            2 :         hccp_err("[destroy][ra_hdc_qp]ra_hdc_cmd_qp_destroy failed ret(%d) phyId(%u)", ret, qpHdc->phyId);
     534              :     }
     535              : 
     536           12 :     free(qpHdc);
     537           12 :     qpHdc = NULL;
     538           12 :     return ret;
     539              : }
     540              : 
     541            0 : int RaHdcQpDestroyWithoutCQ(struct RaQpHandle *qpHdc)
     542              : {
     543              :     int ret;
     544              : 
     545            0 :     RaHdcLiteQpDestroyWithoutCQ(qpHdc);
     546            0 :     ret = RaHdcCmdQpDestroyWithoutCQ(qpHdc);
     547            0 :     if (ret) {
     548            0 :         hccp_err("[destroy][ra_hdc_qp]ra_hdc_cmd_qp_destroy_without_cq failed ret(%d) phyId(%u)",
     549              :             ret, qpHdc->phyId);
     550              :     }
     551              : 
     552            0 :     free(qpHdc);
     553            0 :     qpHdc = NULL;
     554            0 :     return ret;
     555              : }
     556              : 
     557            3 : int RaHdcGetQpStatus(struct RaQpHandle *qpHdc, int *status)
     558              : {
     559            3 :     union OpQpStatusData qpStatusData = {0};
     560            3 :     union OpQpInfoData qpInfoData = {0};
     561            3 :     unsigned int interfaceVersion = 0;
     562              :     int ret;
     563              : 
     564            3 :     ret = RaHdcGetInterfaceVersion(qpHdc->phyId, RA_RS_QP_INFO, &interfaceVersion);
     565            3 :     if (ret != 0) {
     566            0 :         hccp_warn("[get][ra_hdc_qp_status]get interface version not success ret(%d) phyId(%u)", ret, qpHdc->phyId);
     567            0 :         interfaceVersion = 0;
     568              :     }
     569              : 
     570            3 :     if (interfaceVersion >= RA_RS_OPCODE_BASE_VERSION) {
     571            1 :         qpInfoData.txData.qpn = qpHdc->qpn;
     572            1 :         qpInfoData.txData.phyId = qpHdc->phyId;
     573            1 :         qpInfoData.txData.rdevIndex = qpHdc->rdevIndex;
     574            1 :         ret = RaHdcProcessMsg(RA_RS_QP_INFO, qpHdc->phyId, (char *)&qpInfoData,
     575              :             sizeof(union OpQpInfoData));
     576            1 :         CHK_PRT_RETURN(ret, hccp_err("[get][ra_hdc_qp_status]ra hdc message process failed ret(%d) phyId(%u)",
     577              :             ret, qpHdc->phyId), ret);
     578            1 :         *status = qpInfoData.rxData.status;
     579            1 :         qpHdc->typicalQpAttr.udpSport = qpInfoData.rxData.udpSport;
     580              :     } else {
     581            2 :         qpStatusData.txData.qpn = qpHdc->qpn;
     582            2 :         qpStatusData.txData.phyId = qpHdc->phyId;
     583            2 :         qpStatusData.txData.rdevIndex = qpHdc->rdevIndex;
     584            2 :         ret = RaHdcProcessMsg(RA_RS_QP_STATUS, qpHdc->phyId, (char *)&qpStatusData,
     585              :             sizeof(union OpQpStatusData));
     586            2 :         CHK_PRT_RETURN(ret, hccp_err("[get][ra_hdc_qp_status]ra hdc message process failed ret(%d) phyId(%u)",
     587              :             ret, qpHdc->phyId), ret);
     588            1 :         *status = qpStatusData.rxData.status;
     589              :     }
     590              : 
     591            2 :     return RaHdcLiteGetConnectedInfo(qpHdc);
     592              : }
     593              : 
     594            1 : int RaHdcTypicalQpModify(struct RaQpHandle *qpHdc, struct TypicalQp *localQpInfo,
     595              :     struct TypicalQp *remoteQpInfo)
     596              : {
     597            1 :     union OpTypicalQpModifyData qpModifyData = {0};
     598            1 :     unsigned int phyId = qpHdc->phyId;
     599              :     int ret;
     600              : 
     601            1 :     qpModifyData.txData.phyId = phyId;
     602            1 :     qpModifyData.txData.rdevIndex = qpHdc->rdevIndex;
     603            1 :     ret = memcpy_s(&(qpModifyData.txData.localQpInfo), sizeof(struct TypicalQp), localQpInfo,
     604              :         sizeof(struct TypicalQp));
     605            1 :     CHK_PRT_RETURN(ret != 0, hccp_err("[modify]memcpy_s local_qp_info failed, phyId[%u] ret[%d]", phyId, ret),
     606              :         -ESAFEFUNC);
     607            1 :     ret = memcpy_s(&(qpModifyData.txData.remoteQpInfo), sizeof(struct TypicalQp), remoteQpInfo,
     608              :         sizeof(struct TypicalQp));
     609            1 :     CHK_PRT_RETURN(ret != 0, hccp_err("[modify]memcpy_s remote_qp_info failed, phyId[%u] ret[%d]", phyId, ret),
     610              :         -ESAFEFUNC);
     611              : 
     612            1 :     ret = RaHdcProcessMsg(RA_RS_TYPICAL_QP_MODIFY, phyId, (char *)&qpModifyData,
     613              :         sizeof(union OpTypicalQpModifyData));
     614            1 :     CHK_PRT_RETURN(ret != 0, hccp_err("[modify][modify_qp]ra hdc message process failed ret(%d) phyId(%u)",
     615              :         ret, phyId), ret);
     616              : 
     617            1 :     qpHdc->typicalQpAttr.udpSport = qpModifyData.rxData.udpSport;
     618            1 :     qpHdc->typicalQpAttr.pathMtu = qpModifyData.rxData.pathMtu;
     619            1 :     if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
     620            1 :         ret = RaRdmaLiteSetQpSl(qpHdc->liteQp, localQpInfo->sl);
     621            1 :         CHK_PRT_RETURN(ret != 0, hccp_err("[modify][modify_qp]ra_rdma_lite_set_qp_sl sl(%u) failed ret(%d) phyId(%u)",
     622              :             localQpInfo->sl, ret, phyId), ret);
     623              :     }
     624            1 :     return 0;
     625              : }
     626              : 
     627            3 : int RaHdcQpConnectAsync(struct RaQpHandle *qpHdc, const void *sockHandle)
     628              : {
     629            3 :     union OpQpConnectData qpConnectData = {0};
     630              :     int ret;
     631              : 
     632            3 :     qpConnectData.txData.qpn = qpHdc->qpn;
     633            3 :     qpConnectData.txData.fd = (unsigned int)((const struct SocketHdcInfo *)sockHandle)->fd;
     634            3 :     qpConnectData.txData.phyId = qpHdc->phyId;
     635            3 :     qpConnectData.txData.rdevIndex = qpHdc->rdevIndex;
     636            3 :     ret = RaHdcProcessMsg(RA_RS_QP_CONNECT, qpHdc->phyId, (char *)&qpConnectData,
     637              :         sizeof(union OpQpConnectData));
     638            3 :     CHK_PRT_RETURN(ret, hccp_err("[connect_async][ra_hdc_qp]ra hdc message process failed ret(%d) phyId(%u)",
     639              :         ret, qpHdc->phyId), ret);
     640              : 
     641            2 :     return 0;
     642              : }
     643              : 
     644            1 : static void RaHdcSendDataInit(union OpSendWrData *sendWrData, struct RaQpHandle *qpHdc, struct SendWr *wr)
     645              : {
     646            1 :     sendWrData->txData.phyId = qpHdc->phyId;
     647            1 :     sendWrData->txData.rdevIndex = qpHdc->rdevIndex;
     648            1 :     sendWrData->txData.qpn = qpHdc->qpn;
     649            1 :     sendWrData->txData.bufNum = wr->bufNum;
     650            1 :     sendWrData->txData.dstAddr = wr->dstAddr;
     651            1 :     sendWrData->txData.op = wr->op;
     652            1 :     sendWrData->txData.sendFlags = wr->sendFlag;
     653            1 : }
     654              : 
     655            1 : int RaHdcSendWr(struct RaQpHandle *qpHdc, struct SendWr *wr, struct SendWrRsp *opRsp)
     656              : {
     657            1 :     union OpSendWrData sendWrData = {0};
     658            1 :     struct LiteSendWr liteWr = { 0 };
     659              :     int ret;
     660              : 
     661            1 :     if (qpHdc->qpMode == RA_RS_OP_QP_MODE ||
     662            1 :         qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
     663            0 :         if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
     664            0 :             liteWr.wr = *wr;
     665            0 :             return RaHdcLiteSendWr(qpHdc, &liteWr, opRsp, HDC_LITE_DEFAULT_WR_ID);
     666              :         }
     667              :     }
     668              : 
     669            1 :     RaHdcSendDataInit(&sendWrData, qpHdc, wr);
     670              : 
     671            1 :     ret = memcpy_s(sendWrData.txData.memList, (sizeof(struct SgList) * MAX_SGE_NUM), wr->bufList,
     672            1 :         (sizeof(struct SgList) * wr->bufNum));
     673            1 :     CHK_PRT_RETURN(ret, hccp_err("[send][ra_hdc_wr]memcpy_s for mem_list failed, ret(%d), phyId(%u)",
     674              :         ret, qpHdc->phyId), -ESAFEFUNC);
     675              : 
     676            1 :     ret = RaHdcProcessMsg(RA_RS_SEND_WR, qpHdc->phyId,
     677              :         (char *)&sendWrData, sizeof(union OpSendWrData));
     678            1 :     if (ret) {
     679            0 :         if (ret != -ENOENT) {
     680            0 :             hccp_err("[send][ra_hdc_wr]ra hdc message process failed ret(%d), phyId(%u)", ret, qpHdc->phyId);
     681              :         }
     682            0 :         return ret;
     683              :     }
     684              : 
     685            1 :     if (qpHdc->qpMode == RA_RS_GDR_TMPL_QP_MODE) {
     686            0 :         opRsp->wqeTmp = sendWrData.rxData.wrRsp.wqeTmp;
     687            1 :     } else if (qpHdc->qpMode == RA_RS_OP_QP_MODE ||
     688            1 :                qpHdc->qpMode == RA_RS_GDR_ASYN_QP_MODE ||
     689            1 :                qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
     690            0 :         opRsp->db = sendWrData.rxData.wrRsp.db;
     691              :     }
     692              : 
     693            1 :     return ret;
     694              : }
     695              : 
     696            0 : int RaHdcSendWrV2(struct RaQpHandle *qpHdc, struct SendWrV2 *wr, struct SendWrRsp *opRsp)
     697              : {
     698            0 :     struct LiteSendWr liteWr = { 0 };
     699              : 
     700            0 :     if (qpHdc->qpMode == RA_RS_OP_QP_MODE ||
     701            0 :         qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
     702            0 :         if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
     703            0 :             liteWr.wr.bufList = wr->bufList;
     704            0 :             liteWr.wr.bufNum = wr->bufNum;
     705            0 :             liteWr.wr.dstAddr = wr->dstAddr;
     706            0 :             liteWr.wr.op = wr->op;
     707            0 :             liteWr.wr.rkey = wr->rkey;
     708            0 :             liteWr.wr.sendFlag = wr->sendFlag;
     709            0 :             liteWr.aux = wr->aux;
     710            0 :             liteWr.ext = wr->ext;
     711            0 :             return RaHdcLiteTypicalSendWr(qpHdc, &liteWr, opRsp, wr->wrId);
     712              :         }
     713              :     }
     714              : 
     715            0 :     hccp_warn("qpn:%u qp_mode:%d support_lite:%d not support to send_wr",
     716              :         qpHdc->qpn, qpHdc->qpMode, qpHdc->supportLite);
     717              : 
     718            0 :     return -ENOTSUPP;
     719              : }
     720              : 
     721            0 : int RaHdcSendWrVerbs(struct RaQpHandle *qpHdc, struct SendWrVerbs *wr, struct SendWrRsp *opRsp)
     722              : {
     723            0 :     struct LiteSendWr liteWr = { 0 };
     724              : 
     725            0 :     if (qpHdc->qpMode == RA_RS_OP_QP_MODE ||
     726            0 :         qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
     727            0 :         if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
     728            0 :             liteWr.wr.bufList = wr->sgList;
     729            0 :             liteWr.wr.bufNum = wr->numSge;
     730            0 :             liteWr.wr.dstAddr = wr->remoteAddr;
     731            0 :             liteWr.wr.op = wr->opcode;
     732            0 :             liteWr.wr.rkey = wr->rkey;
     733            0 :             liteWr.wr.sendFlag = wr->sendFlags;
     734            0 :             liteWr.ext.immData = wr->immData;
     735            0 :             return RaHdcLiteTypicalSendWr(qpHdc, &liteWr, opRsp, wr->wrId);
     736              :         }
     737              :     }
     738              : 
     739            0 :     hccp_warn("qpn:%u qp_mode:%d support_lite:%d not support to send_wr",
     740              :         qpHdc->qpn, qpHdc->qpMode, qpHdc->supportLite);
     741              : 
     742            0 :     return -ENOTSUPP;
     743              : }
     744              : 
     745            0 : int RaHdcRecvWrVerbs(struct RaQpHandle *qpHdc, struct RecvWrVerbs *wr)
     746              : {
     747              :     struct rdma_lite_sge list[RA_SGLIST_MAX];
     748            0 :     struct rdma_lite_recv_wr liteWr = {
     749              :         .sg_list = list,
     750            0 :         .wr_id   = wr->wrId,
     751              :         .num_sge = 0,
     752              :         .next    = NULL,
     753              :     };
     754            0 :     struct rdma_lite_recv_wr *badWr = NULL;
     755              :     int ret;
     756              : 
     757            0 :     if (qpHdc->qpMode == RA_RS_OP_QP_MODE ||
     758            0 :         qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
     759            0 :         if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
     760            0 :             for (int i = 0; i < wr->numSge && i < RA_SGLIST_MAX; i++) {
     761            0 :                 list[i].addr = (uintptr_t)wr->sgList[i].addr;
     762            0 :                 list[i].length = wr->sgList[i].len;
     763            0 :                 list[i].lkey = wr->sgList[i].lkey;
     764            0 :                 liteWr.num_sge++;
     765              :             }
     766              : 
     767            0 :             ret = RaRdmaLitePostRecv(qpHdc->liteQp, &liteWr, &badWr);
     768            0 :             if (ret) {
     769            0 :                 if (ret == -ENOMEM) {
     770            0 :                     hccp_warn("[recv][ra_hdc_wr]ra hdc post recv unsuccessful, ret(%d) phyId(%u)",
     771              :                         ret, qpHdc->phyId);
     772            0 :                     return 0;
     773              :                 } else {
     774            0 :                     hccp_err("[recv][ra_hdc_wr]ra hdc post recv failed ret(%d) phyId(%u)",
     775              :                         ret, qpHdc->phyId);
     776              :                 }
     777            0 :                 return ret;
     778              :             }
     779              : 
     780            0 :             qpHdc->recvWrNum++;
     781            0 :             return 0;
     782              :         }
     783              :     }
     784              : 
     785            0 :     hccp_warn("qpn:%u qp_mode:%d support_lite:%d not support to recv_wr_verbs",
     786              :         qpHdc->qpn, qpHdc->qpMode, qpHdc->supportLite);
     787              : 
     788            0 :     return -ENOTSUPP;
     789              : }
     790              : 
     791            1 : int RaHdcTypicalSendWr(struct RaQpHandle *qpHdc, struct SendWr *wr, struct SendWrRsp *opRsp)
     792              : {
     793            1 :     struct LiteSendWr liteWr = { 0 };
     794              : 
     795            1 :     if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
     796            1 :         if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
     797            1 :             liteWr.wr = *wr;
     798            1 :             return RaHdcLiteTypicalSendWr(qpHdc, &liteWr, opRsp, HDC_LITE_DEFAULT_WR_ID);
     799              :         }
     800              :     }
     801              : 
     802            0 :     hccp_warn("qpn:%u qp_mode:%d support_lite:%d not support to send_wr",
     803              :         qpHdc->qpn, qpHdc->qpMode, qpHdc->supportLite);
     804              : 
     805            0 :     return -ENOTSUPP;
     806              : }
     807              : 
     808            1 : int RaHdcMrDereg(struct RaQpHandle *qpHdc, struct MrInfoT *info)
     809              : {
     810            1 :     union OpMrDeregData mrDeregData = {0};
     811            1 :     mrDeregData.txData.rdevIndex = qpHdc->rdevIndex;
     812            1 :     mrDeregData.txData.phyId = qpHdc->phyId;
     813            1 :     mrDeregData.txData.qpn = qpHdc->qpn;
     814            1 :     mrDeregData.txData.addr = info->addr;
     815              :     int ret;
     816              : 
     817            1 :     ret = RaHdcProcessMsg(RA_RS_MR_DEREG, qpHdc->phyId, (char *)&mrDeregData,
     818              :         sizeof(union OpMrDeregData));
     819            1 :     CHK_PRT_RETURN(ret, hccp_err("[dereg][ra_hdc_mr]ra hdc message process failed ret(%d) phyId(%u)",
     820              :         ret, qpHdc->phyId), ret);
     821              : 
     822            1 :     return 0;
     823              : }
     824              : 
     825            1 : int RaHdcMrReg(struct RaQpHandle *qpHdc, struct MrInfoT *info)
     826              : {
     827            1 :     union OpMrRegData mrRegData = {0};
     828              :     int ret;
     829              : 
     830            1 :     mrRegData.txData.phyId = qpHdc->phyId;
     831            1 :     mrRegData.txData.rdevIndex = qpHdc->rdevIndex;
     832            1 :     mrRegData.txData.qpn = qpHdc->qpn;
     833            1 :     mrRegData.txData.mrRegAttr.addr = info->addr;
     834            1 :     mrRegData.txData.mrRegAttr.len = info->size;
     835            1 :     mrRegData.txData.mrRegAttr.access = info->access;
     836              : 
     837            1 :     ret = RaHdcProcessMsg(RA_RS_MR_REG, qpHdc->phyId,
     838              :         (char *)&mrRegData, sizeof(union OpMrRegData));
     839            1 :     CHK_PRT_RETURN(ret, hccp_err("[reg][ra_hdc_mr]ra hdc message process failed ret(%d) phyId(%u)",
     840              :         ret, qpHdc->phyId), ret);
     841              : 
     842            1 :     info->lkey = mrRegData.rxData.lkey;
     843            1 :     info->rkey = mrRegData.rxData.rkey;
     844              : 
     845            1 :     return 0;
     846              : }
     847              : 
     848            1 : int RaHdcTypicalMrReg(struct RaRdmaHandle *rdmaHandle, struct MrInfoT *info, void **mrHandle)
     849              : {
     850            1 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
     851            1 :     union OpTypicalMrRegData mrRegData = {0};
     852            1 :     unsigned int opcode = RA_RS_TYPICAL_MR_REG_V1;
     853            1 :     struct RaMrHandle *mrHdc = NULL;
     854            1 :     unsigned int interfaceVersion = 0;
     855              :     int ret;
     856              : 
     857            1 :     mrHdc = (struct RaMrHandle *)calloc(1, sizeof(struct RaMrHandle));
     858            1 :     CHK_PRT_RETURN(mrHdc == NULL, hccp_err("[reg][ra_hdc_typical_mr]mr_hdc calloc failed phyId(%u)",
     859              :         phyId), -ENOMEM);
     860              : 
     861            1 :     mrRegData.txData.phyId = phyId;
     862            1 :     mrRegData.txData.rdevIndex = rdmaHandle->rdevIndex;
     863            1 :     mrRegData.txData.mrRegAttr.addr = info->addr;
     864            1 :     mrRegData.txData.mrRegAttr.len = info->size;
     865            1 :     mrRegData.txData.mrRegAttr.access = info->access;
     866              : 
     867            1 :     ret = RaHdcGetInterfaceVersion(phyId, RA_RS_TYPICAL_MR_REG, &interfaceVersion);
     868            1 :     if (ret == 0 && interfaceVersion >= RA_RS_OPCODE_BASE_VERSION) {
     869            0 :         opcode = RA_RS_TYPICAL_MR_REG;
     870              :     }
     871            1 :     ret = RaHdcProcessMsg(opcode, phyId, (char *)&mrRegData, sizeof(union OpTypicalMrRegData));
     872            1 :     if (ret) {
     873            0 :         hccp_err("[reg][ra_hdc_typical_mr]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
     874            0 :         free(mrHdc);
     875            0 :         return ret;
     876              :     }
     877              : 
     878            1 :     info->lkey = mrRegData.rxData.lkey;
     879            1 :     info->rkey = mrRegData.rxData.rkey;
     880            1 :     if (opcode == RA_RS_TYPICAL_MR_REG_V1) {
     881            1 :         mrHdc->addr = (unsigned long long)(uintptr_t)info->addr;
     882              :     } else {
     883            0 :         mrHdc->addr = mrRegData.rxData.addr;
     884              :     }
     885            1 :     *mrHandle = mrHdc;
     886            1 :     return 0;
     887              : }
     888              : 
     889            1 : int RaHdcRemapMr(struct RaRdmaHandle *rdmaHandle, struct MemRemapInfo info[], unsigned int num)
     890              : {
     891            1 :     union OpRemapMrData opData = {0};
     892              :     int ret;
     893              : 
     894            1 :     ret = memcpy_s(opData.txData.memList, REMAP_MR_MAX_NUM * sizeof(struct MemRemapInfo),
     895              :         info, num * sizeof(struct MemRemapInfo));
     896            1 :     CHK_PRT_RETURN(ret != 0, hccp_err("[remap][ra_hdc_mr]memcpy_s mem_list failed, ret:%d", ret), -ESAFEFUNC);
     897            1 :     opData.txData.memNum = num;
     898            1 :     opData.txData.rdevIndex = rdmaHandle->rdevIndex;
     899            1 :     opData.txData.phyId = rdmaHandle->rdevInfo.phyId;
     900              : 
     901            1 :     ret = RaHdcProcessMsg(RA_RS_REMAP_MR, opData.txData.phyId, (char *)&opData, sizeof(union OpRemapMrData));
     902            1 :     CHK_PRT_RETURN(ret, hccp_err("[remap][ra_hdc_mr]ra hdc message process failed ret(%d) phyId(%u)", ret,
     903              :         rdmaHandle->rdevInfo.phyId), ret);
     904              : 
     905            1 :     return 0;
     906              : }
     907              : 
     908            1 : int RaHdcTypicalMrDereg(struct RaRdmaHandle *rdmaHandle, void *mrHandle)
     909              : {
     910            1 :     union OpTypicalMrDeregData mrDeregData = {0};
     911              :     int ret;
     912              : 
     913            1 :     mrDeregData.txData.phyId = rdmaHandle->rdevInfo.phyId;
     914            1 :     mrDeregData.txData.rdevIndex = rdmaHandle->rdevIndex;
     915            1 :     mrDeregData.txData.addr = ((struct RaMrHandle*)mrHandle)->addr;
     916              : 
     917            1 :     ret = RaHdcProcessMsg(RA_RS_TYPICAL_MR_DEREG, rdmaHandle->rdevInfo.phyId, (char *)&mrDeregData,
     918              :         sizeof(union OpTypicalMrDeregData));
     919            1 :     CHK_PRT_RETURN(ret, hccp_err("[dereg][ra_hdc_typical_mr]ra hdc message process failed ret(%d) phyId(%u)",
     920              :         ret, rdmaHandle->rdevInfo.phyId), ret);
     921              : 
     922            1 :     free(mrHandle);
     923            1 :     mrHandle = NULL;
     924            1 :     return 0;
     925              : }
     926              : 
     927            0 : STATIC void RaHdcSendWrlistInit(union OpSendWrlistData *sendWrlist, struct RaQpHandle *qpHdc,
     928              :     unsigned int completeCnt, struct WrlistSendCompleteNum wrlistNum)
     929              : {
     930            0 :     sendWrlist->txData.phyId = qpHdc->phyId;
     931            0 :     sendWrlist->txData.rdevIndex = qpHdc->rdevIndex;
     932            0 :     sendWrlist->txData.qpn = qpHdc->qpn;
     933            0 :     sendWrlist->txData.sendNum = (wrlistNum.sendNum - completeCnt) >= MAX_WR_NUM ? MAX_WR_NUM :
     934              :         wrlistNum.sendNum - completeCnt;
     935            0 : }
     936              : 
     937            6 : STATIC void RaHdcSendWrlistExtInit(union OpSendWrlistDataExt *sendWrlist, struct RaQpHandle *qpHdc,
     938              :     unsigned int completeCnt, struct WrlistSendCompleteNum wrlistNum)
     939              : {
     940            6 :     sendWrlist->txData.phyId = qpHdc->phyId;
     941            6 :     sendWrlist->txData.rdevIndex = qpHdc->rdevIndex;
     942            6 :     sendWrlist->txData.qpn = qpHdc->qpn;
     943            6 :     sendWrlist->txData.sendNum = (wrlistNum.sendNum - completeCnt) >= MAX_WR_NUM ? MAX_WR_NUM :
     944              :         wrlistNum.sendNum - completeCnt;
     945            6 : }
     946              : 
     947            0 : STATIC int RaHdcSendWrlistV1(struct RaQpHandle *qpHdc, struct SendWrlistData wr[], struct SendWrRsp opRsp[],
     948              :     struct WrlistSendCompleteNum wrlistNum)
     949              : {
     950            0 :     int ret = 0;
     951              :     unsigned int i, j;
     952            0 :     unsigned int completeCnt = 0;
     953            0 :     unsigned int currentSendNum = 0;
     954            0 :     union OpSendWrlistData *sendWrlist = NULL;
     955              : 
     956            0 :     sendWrlist = calloc(1, sizeof(union OpSendWrlistData));
     957            0 :     CHK_PRT_RETURN(sendWrlist == NULL, hccp_err("[send][ra_hdc_wrlist]send_wrlist calloc failed"), -ENOMEM);
     958            0 :     while (completeCnt < wrlistNum.sendNum) {
     959            0 :         RaHdcSendWrlistInit(sendWrlist, qpHdc, completeCnt, wrlistNum);
     960            0 :         ret = memcpy_s(sendWrlist->txData.wrlist, (sizeof(struct SendWrlistData) * MAX_WR_NUM_V1),
     961            0 :             &wr[completeCnt], (sizeof(struct SendWrlistData) * sendWrlist->txData.sendNum));
     962            0 :         if (ret) {
     963            0 :             hccp_err("[send][ra_hdc_wrlist]memcpy_s for wrlist failed, ret(%d).", ret);
     964            0 :             ret = -ESAFEFUNC;
     965            0 :             goto err_send_wrlist;
     966              :         }
     967            0 :         currentSendNum = sendWrlist->txData.sendNum;
     968            0 :         ret = RaHdcProcessMsg(RA_RS_SEND_WRLIST, qpHdc->phyId, (char *)sendWrlist,
     969              :             sizeof(union OpSendWrlistData));
     970              : 
     971            0 :         if (sendWrlist->rxData.completeNum > currentSendNum) {
     972            0 :             hccp_err("[send][ra_hdc_wrlist]complete_num[%u] is larger than send_num[%u], ret(%d).",
     973              :                 sendWrlist->rxData.completeNum, currentSendNum, ret);
     974            0 :             ret = -EINVAL;
     975            0 :             goto err_send_wrlist;
     976              :         }
     977              : 
     978            0 :         for (i = 0; i < sendWrlist->rxData.completeNum; i++) {
     979            0 :             j = i + completeCnt;
     980            0 :             if (qpHdc->qpMode == RA_RS_GDR_TMPL_QP_MODE) {
     981            0 :                 opRsp[j].wqeTmp = sendWrlist->rxData.wrRsp[i].wqeTmp;
     982            0 :             } else if (qpHdc->qpMode == RA_RS_OP_QP_MODE ||
     983            0 :                        qpHdc->qpMode == RA_RS_GDR_ASYN_QP_MODE ||
     984            0 :                        qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
     985            0 :                 opRsp[j].db = sendWrlist->rxData.wrRsp[i].db;
     986              :             }
     987              :         }
     988            0 :         completeCnt = completeCnt + sendWrlist->rxData.completeNum;
     989            0 :         if (ret) {
     990            0 :             if (ret != -ENOENT) {
     991            0 :                 hccp_err("[send][ra_hdc_wrlist]ra hdc message process failed ret(%d), phyId(%u)", ret, qpHdc->phyId);
     992              :             }
     993            0 :             goto err_send_wrlist;
     994              :         }
     995              :     }
     996              : 
     997            0 : err_send_wrlist:
     998            0 :     free(sendWrlist);
     999            0 :     sendWrlist = NULL;
    1000            0 :     *(wrlistNum.completeNum) = completeCnt;
    1001            0 :     return ret;
    1002              : }
    1003              : 
    1004            5 : STATIC int RaHdcSendWrlistExtV1(struct RaQpHandle *qpHdc, struct SendWrlistDataExt wr[],
    1005              :     struct SendWrRsp opRsp[], struct WrlistSendCompleteNum wrlistNum)
    1006              : {
    1007            5 :     int ret = 0;
    1008              :     unsigned int i, j;
    1009            5 :     unsigned int completeCnt = 0;
    1010            5 :     unsigned int currentSendNum = 0;
    1011            5 :     union OpSendWrlistDataExt *sendWrlist = NULL;
    1012              : 
    1013            5 :     sendWrlist = calloc(1, sizeof(union OpSendWrlistDataExt));
    1014            5 :     CHK_PRT_RETURN(sendWrlist == NULL, hccp_err("[send][ra_hdc_wrlist_ext]send_wrlist calloc failed"), -ENOMEM);
    1015            7 :     while (completeCnt < wrlistNum.sendNum) {
    1016            5 :         RaHdcSendWrlistExtInit(sendWrlist, qpHdc, completeCnt, wrlistNum);
    1017            5 :         ret = memcpy_s(sendWrlist->txData.wrlist, (sizeof(struct SendWrlistDataExt) * MAX_WR_NUM_V1),
    1018            5 :             &wr[completeCnt], (sizeof(struct SendWrlistDataExt) * sendWrlist->txData.sendNum));
    1019            5 :         if (ret) {
    1020            1 :             hccp_err("[send][ra_hdc_wrlist_ext]memcpy_s for wrlist failed, ret(%d).", ret);
    1021            1 :             ret = -ESAFEFUNC;
    1022            1 :             goto err_send_wrlist;
    1023              :         }
    1024            4 :         currentSendNum = sendWrlist->txData.sendNum;
    1025            4 :         ret = RaHdcProcessMsg(RA_RS_SEND_WRLIST_EXT, qpHdc->phyId, (char *)sendWrlist,
    1026              :             sizeof(union OpSendWrlistDataExt));
    1027              : 
    1028            4 :         if (sendWrlist->rxData.completeNum > currentSendNum) {
    1029            2 :             hccp_err("[send][ra_hdc_wrlist_ext]complete_num[%u] is larger than send_num[%u], ret(%d).",
    1030              :                 sendWrlist->rxData.completeNum, currentSendNum, ret);
    1031            2 :             ret = -EINVAL;
    1032            2 :             goto err_send_wrlist;
    1033              :         }
    1034              : 
    1035            4 :         for (i = 0; i < sendWrlist->rxData.completeNum; i++) {
    1036            2 :             j = i + completeCnt;
    1037            2 :             if (qpHdc->qpMode == RA_RS_GDR_TMPL_QP_MODE) {
    1038            0 :                 opRsp[j].wqeTmp = sendWrlist->rxData.wrRsp[i].wqeTmp;
    1039            2 :             } else if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_GDR_ASYN_QP_MODE ||
    1040            2 :                        qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
    1041            0 :                 opRsp[j].db = sendWrlist->rxData.wrRsp[i].db;
    1042              :             }
    1043              :         }
    1044            2 :         completeCnt = completeCnt + sendWrlist->rxData.completeNum;
    1045            2 :         if (ret) {
    1046            0 :             if (ret != -ENOENT) {
    1047            0 :                 hccp_err("[send][ra_hdc_wrlist_ext]ra hdc message process failed ret(%d), phyId(%u)",
    1048              :                     ret, qpHdc->phyId);
    1049              :             }
    1050            0 :             goto err_send_wrlist;
    1051              :         }
    1052              :     }
    1053              : 
    1054            2 : err_send_wrlist:
    1055            5 :     free(sendWrlist);
    1056            5 :     sendWrlist = NULL;
    1057            5 :     *(wrlistNum.completeNum) = completeCnt;
    1058            5 :     return ret;
    1059              : }
    1060              : 
    1061            0 : STATIC void RaHdcSendWrlistInitV2(union OpSendWrlistDataV2 *sendWrlist, struct RaQpHandle *qpHdc,
    1062              :     unsigned int completeCnt, struct WrlistSendCompleteNum wrlistNum)
    1063              : {
    1064            0 :     sendWrlist->txData.phyId = qpHdc->phyId;
    1065            0 :     sendWrlist->txData.rdevIndex = qpHdc->rdevIndex;
    1066            0 :     sendWrlist->txData.qpn = qpHdc->qpn;
    1067            0 :     sendWrlist->txData.sendNum = (wrlistNum.sendNum - completeCnt) >= MAX_WR_NUM ? MAX_WR_NUM :
    1068              :         wrlistNum.sendNum - completeCnt;
    1069            0 : }
    1070              : 
    1071            1 : STATIC void RaHdcSendWrlistExtInitV2(union OpSendWrlistDataExtV2 *sendWrlist, struct RaQpHandle *qpHdc,
    1072              :     unsigned int completeCnt, struct WrlistSendCompleteNum wrlistNum)
    1073              : {
    1074            1 :     sendWrlist->txData.phyId = qpHdc->phyId;
    1075            1 :     sendWrlist->txData.rdevIndex = qpHdc->rdevIndex;
    1076            1 :     sendWrlist->txData.qpn = qpHdc->qpn;
    1077            1 :     sendWrlist->txData.sendNum = (wrlistNum.sendNum - completeCnt) >= MAX_WR_NUM ? MAX_WR_NUM :
    1078              :         wrlistNum.sendNum - completeCnt;
    1079            1 : }
    1080              : 
    1081            0 : STATIC int RaHdcSendWrlistV2(struct RaQpHandle *qpHdc, struct SendWrlistData wr[], struct SendWrRsp opRsp[],
    1082              :     struct WrlistSendCompleteNum wrlistNum)
    1083              : {
    1084            0 :     int ret = 0;
    1085              :     unsigned int i, j;
    1086            0 :     unsigned int completeCnt = 0;
    1087            0 :     unsigned int currentSendNum = 0;
    1088            0 :     union OpSendWrlistDataV2 *sendWrlist = NULL;
    1089              : 
    1090            0 :     sendWrlist = calloc(1, sizeof(union OpSendWrlistDataV2));
    1091            0 :     CHK_PRT_RETURN(sendWrlist == NULL, hccp_err("[send][ra_hdc_wrlist_v2]send_wrlist calloc failed"), -ENOMEM);
    1092            0 :     while (completeCnt < wrlistNum.sendNum) {
    1093            0 :         RaHdcSendWrlistInitV2(sendWrlist, qpHdc, completeCnt, wrlistNum);
    1094            0 :         ret = memcpy_s(sendWrlist->txData.wrlist, (sizeof(struct SendWrlistData) * MAX_WR_NUM),
    1095            0 :             &wr[completeCnt], (sizeof(struct SendWrlistData) * sendWrlist->txData.sendNum));
    1096            0 :         if (ret) {
    1097            0 :             hccp_err("[send][ra_hdc_wrlist_v2]memcpy_s for wrlist failed, ret(%d).", ret);
    1098            0 :             ret = -ESAFEFUNC;
    1099            0 :             goto err_send_wrlist;
    1100              :         }
    1101            0 :         currentSendNum = sendWrlist->txData.sendNum;
    1102            0 :         ret = RaHdcProcessMsg(RA_RS_SEND_WRLIST_V2, qpHdc->phyId, (char *)sendWrlist,
    1103              :             sizeof(union OpSendWrlistDataV2));
    1104              : 
    1105            0 :         if (sendWrlist->rxData.completeNum > currentSendNum) {
    1106            0 :             hccp_err("[send][ra_hdc_wrlist_v2]complete_num[%u] is larger than send_num[%u], ret(%d).",
    1107              :                 sendWrlist->rxData.completeNum, currentSendNum, ret);
    1108            0 :             ret = -EINVAL;
    1109            0 :             goto err_send_wrlist;
    1110              :         }
    1111              : 
    1112            0 :         for (i = 0; i < sendWrlist->rxData.completeNum; i++) {
    1113            0 :             j = i + completeCnt;
    1114            0 :             if (qpHdc->qpMode == RA_RS_GDR_TMPL_QP_MODE) {
    1115            0 :                 opRsp[j].wqeTmp = sendWrlist->rxData.wrRsp[i].wqeTmp;
    1116            0 :             } else if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_GDR_ASYN_QP_MODE ||
    1117            0 :                        qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
    1118            0 :                 opRsp[j].db = sendWrlist->rxData.wrRsp[i].db;
    1119              :             }
    1120              :         }
    1121            0 :         completeCnt = completeCnt + sendWrlist->rxData.completeNum;
    1122            0 :         if (ret) {
    1123            0 :             if (ret != -ENOENT) {
    1124            0 :                 hccp_err("[send][ra_hdc_wrlist_v2]ra hdc message process failed ret(%d), phyId(%u)",
    1125              :                     ret, qpHdc->phyId);
    1126              :             }
    1127            0 :             goto err_send_wrlist;
    1128              :         }
    1129              :     }
    1130              : 
    1131            0 : err_send_wrlist:
    1132            0 :     free(sendWrlist);
    1133            0 :     sendWrlist = NULL;
    1134            0 :     *(wrlistNum.completeNum) = completeCnt;
    1135            0 :     return ret;
    1136              : }
    1137              : 
    1138            0 : STATIC int RaHdcSendWrlistExtV2(struct RaQpHandle *qpHdc, struct SendWrlistDataExt wr[],
    1139              :     struct SendWrRsp opRsp[], struct WrlistSendCompleteNum wrlistNum)
    1140              : {
    1141            0 :     int ret = 0;
    1142              :     unsigned int i, j;
    1143            0 :     unsigned int completeCnt = 0;
    1144            0 :     unsigned int currentSendNum = 0;
    1145            0 :     union OpSendWrlistDataExtV2 *sendWrlist = NULL;
    1146              : 
    1147            0 :     sendWrlist = calloc(1, sizeof(union OpSendWrlistDataExtV2));
    1148            0 :     CHK_PRT_RETURN(sendWrlist == NULL, hccp_err("[send][ra_hdc_wrlist_ext_v2]send_wrlist calloc failed"), -ENOMEM);
    1149            0 :     while (completeCnt < wrlistNum.sendNum) {
    1150            0 :         RaHdcSendWrlistExtInitV2(sendWrlist, qpHdc, completeCnt, wrlistNum);
    1151            0 :         ret = memcpy_s(sendWrlist->txData.wrlist, (sizeof(struct SendWrlistDataExt) * MAX_WR_NUM),
    1152            0 :             &wr[completeCnt], (sizeof(struct SendWrlistDataExt) * sendWrlist->txData.sendNum));
    1153            0 :         if (ret) {
    1154            0 :             hccp_err("[send][ra_hdc_wrlist_ext_v2]memcpy_s for wrlist failed, ret(%d).", ret);
    1155            0 :             ret = -ESAFEFUNC;
    1156            0 :             goto err_send_wrlist;
    1157              :         }
    1158            0 :         currentSendNum = sendWrlist->txData.sendNum;
    1159            0 :         ret = RaHdcProcessMsg(RA_RS_SEND_WRLIST_EXT_V2, qpHdc->phyId, (char *)sendWrlist,
    1160              :             sizeof(union OpSendWrlistDataExtV2));
    1161              : 
    1162            0 :         if (sendWrlist->rxData.completeNum > currentSendNum) {
    1163            0 :             hccp_err("[send][ra_hdc_wrlist_ext_v2]complete_num[%u] is larger than send_num[%u], ret(%d).",
    1164              :                 sendWrlist->rxData.completeNum, currentSendNum, ret);
    1165            0 :             ret = -EINVAL;
    1166            0 :             goto err_send_wrlist;
    1167              :         }
    1168              : 
    1169            0 :         for (i = 0; i < sendWrlist->rxData.completeNum; i++) {
    1170            0 :             j = i + completeCnt;
    1171            0 :             if (qpHdc->qpMode == RA_RS_GDR_TMPL_QP_MODE) {
    1172            0 :                 opRsp[j].wqeTmp = sendWrlist->rxData.wrRsp[i].wqeTmp;
    1173            0 :             } else if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_GDR_ASYN_QP_MODE ||
    1174            0 :                        qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
    1175            0 :                 opRsp[j].db = sendWrlist->rxData.wrRsp[i].db;
    1176              :             }
    1177              :         }
    1178            0 :         completeCnt = completeCnt + sendWrlist->rxData.completeNum;
    1179            0 :         if (ret) {
    1180            0 :             if (ret != -ENOENT) {
    1181            0 :                 hccp_err("[send][ra_hdc_wrlist_ext_v2]ra hdc message process failed ret(%d), phyId(%u)",
    1182              :                     ret, qpHdc->phyId);
    1183              :             }
    1184            0 :             goto err_send_wrlist;
    1185              :         }
    1186              :     }
    1187              : 
    1188            0 : err_send_wrlist:
    1189            0 :     free(sendWrlist);
    1190            0 :     sendWrlist = NULL;
    1191            0 :     *(wrlistNum.completeNum) = completeCnt;
    1192            0 :     return ret;
    1193              : }
    1194              : 
    1195            0 : int RaHdcSendWrlist(struct RaQpHandle *qpHdc, struct SendWrlistData wr[], struct SendWrRsp opRsp[],
    1196              :     struct WrlistSendCompleteNum wrlistNum)
    1197              : {
    1198              :     int ret;
    1199            0 :     unsigned int interfaceVersion = 0;
    1200              : 
    1201            0 :     if (qpHdc->qpMode == RA_RS_OP_QP_MODE ||
    1202            0 :         qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
    1203            0 :         if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
    1204            0 :             return RaHdcLiteSendWrlist(qpHdc, wr, opRsp, wrlistNum);
    1205              :         }
    1206              :     }
    1207              : 
    1208            0 :     ret = RaHdcGetInterfaceVersion(qpHdc->phyId, RA_RS_SEND_WRLIST_V2, &interfaceVersion);
    1209            0 :     if (ret != 0 || interfaceVersion != RA_RS_SEND_WRLIST_V2_VERSION) {
    1210            0 :         return RaHdcSendWrlistV1(qpHdc, wr, opRsp, wrlistNum);
    1211              :     }
    1212              : 
    1213            0 :     return RaHdcSendWrlistV2(qpHdc, wr, opRsp, wrlistNum);
    1214              : }
    1215              : 
    1216            5 : int RaHdcSendWrlistExt(struct RaQpHandle *qpHdc, struct SendWrlistDataExt wr[], struct SendWrRsp opRsp[],
    1217              :     struct WrlistSendCompleteNum wrlistNum)
    1218              : {
    1219              :     int ret;
    1220            5 :     unsigned int interfaceVersion = 0;
    1221              : 
    1222            5 :     if (qpHdc->qpMode == RA_RS_OP_QP_MODE ||
    1223            5 :         qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
    1224            0 :         if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
    1225            0 :             return RaHdcLiteSendWrlistExt(qpHdc, wr, opRsp, wrlistNum);
    1226              :         }
    1227              :     }
    1228              : 
    1229            5 :     ret = RaHdcGetInterfaceVersion(qpHdc->phyId, RA_RS_SEND_WRLIST_EXT_V2, &interfaceVersion);
    1230            5 :     if (ret != 0 || interfaceVersion != RA_RS_SEND_WRLIST_EXT_V2_VERSION) {
    1231            5 :         return RaHdcSendWrlistExtV1(qpHdc, wr, opRsp, wrlistNum);
    1232              :     }
    1233              : 
    1234            0 :     return RaHdcSendWrlistExtV2(qpHdc, wr, opRsp, wrlistNum);
    1235              : }
    1236              : 
    1237            1 : STATIC void RaHdcSendWrlistNormalInit(union OpSendNormalWrlistData *sendWrlist, struct RaQpHandle *qpHdc,
    1238              :     unsigned int completeCnt, struct WrlistSendCompleteNum wrlistNum)
    1239              : {
    1240            1 :     (void)memset_s(sendWrlist, sizeof(union OpSendNormalWrlistData), 0, sizeof(union OpSendNormalWrlistData));
    1241            1 :     sendWrlist->txData.phyId = qpHdc->phyId;
    1242            1 :     sendWrlist->txData.rdevIndex = qpHdc->rdevIndex;
    1243            1 :     sendWrlist->txData.qpn = qpHdc->qpn;
    1244            1 :     sendWrlist->txData.sendNum = ((wrlistNum.sendNum - completeCnt) >= MAX_WR_NUM) ? MAX_WR_NUM :
    1245              :         wrlistNum.sendNum - completeCnt;
    1246            1 : }
    1247              : 
    1248            1 : STATIC int RaHdcSendWrlistNormal(struct RaQpHandle *qpHdc, struct WrInfo wr[], struct SendWrRsp opRsp[],
    1249              :     struct WrlistSendCompleteNum wrlistNum)
    1250              : {
    1251            1 :     union OpSendNormalWrlistData *sendWrlist = NULL;
    1252            1 :     unsigned int currentSendNum = 0;
    1253            1 :     unsigned int completeCnt = 0;
    1254              :     unsigned int i;
    1255            1 :     int ret = 0;
    1256              : 
    1257            1 :     sendWrlist = calloc(1, sizeof(union OpSendNormalWrlistData));
    1258            1 :     CHK_PRT_RETURN(sendWrlist == NULL, hccp_err("[send][send_wrlist]send_wrlist calloc failed"), -ENOMEM);
    1259              : 
    1260            2 :     while (completeCnt < wrlistNum.sendNum) {
    1261            1 :         RaHdcSendWrlistNormalInit(sendWrlist, qpHdc, completeCnt, wrlistNum);
    1262            1 :         ret = memcpy_s(sendWrlist->txData.wrlist, (sizeof(struct WrInfo) * MAX_WR_NUM),
    1263            1 :             &wr[completeCnt], (sizeof(struct WrInfo) * sendWrlist->txData.sendNum));
    1264            1 :         if (ret != 0) {
    1265            0 :             hccp_err("[send][send_wrlist]memcpy_s for wrlist failed, ret(%d)", ret);
    1266            0 :             ret = -ESAFEFUNC;
    1267            0 :             goto err_send_wrlist;
    1268              :         }
    1269            1 :         currentSendNum = sendWrlist->txData.sendNum;
    1270            1 :         ret = RaHdcProcessMsg(RA_RS_SEND_NORMAL_WRLIST, qpHdc->phyId, (char *)sendWrlist,
    1271              :             sizeof(union OpSendNormalWrlistData));
    1272              : 
    1273            1 :         if (sendWrlist->rxData.completeNum > currentSendNum) {
    1274            0 :             hccp_err("[send][send_wrlist]complete_num[%u] is larger than send_num[%u], ret(%d)",
    1275              :                 sendWrlist->rxData.completeNum, currentSendNum, ret);
    1276            0 :             ret = -EINVAL;
    1277            0 :             goto err_send_wrlist;
    1278              :         }
    1279              : 
    1280            2 :         for (i = 0; i < sendWrlist->rxData.completeNum; i++) {
    1281            1 :             if (qpHdc->qpMode == RA_RS_GDR_TMPL_QP_MODE) {
    1282            0 :                 opRsp[completeCnt + i].wqeTmp = sendWrlist->rxData.wrRsp[i].wqeTmp;
    1283            1 :             } else if (qpHdc->qpMode == RA_RS_OP_QP_MODE || qpHdc->qpMode == RA_RS_GDR_ASYN_QP_MODE ||
    1284            1 :                 qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
    1285            0 :                 opRsp[completeCnt + i].db = sendWrlist->rxData.wrRsp[i].db;
    1286              :             }
    1287              :         }
    1288            1 :         completeCnt += sendWrlist->rxData.completeNum;
    1289              :         // send wrlist success, continue to send
    1290            1 :         if (ret == 0) {
    1291            1 :             continue;
    1292              :         }
    1293            0 :         if (ret != -ENOENT && ret != -ENOMEM) {
    1294            0 :             hccp_err("[send][send_wrlist]ra hdc message process failed ret(%d), phyId(%u)", ret, qpHdc->phyId);
    1295              :         }
    1296            0 :         goto err_send_wrlist;
    1297              :     }
    1298              : 
    1299            1 : err_send_wrlist:
    1300            1 :     free(sendWrlist);
    1301            1 :     sendWrlist = NULL;
    1302            1 :     *(wrlistNum.completeNum) = completeCnt;
    1303            1 :     return ret;
    1304              : }
    1305              : 
    1306            2 : int RaHdcSendNormalWrlist(struct RaQpHandle *qpHdc, struct WrInfo wr[], struct SendWrRsp opRsp[],
    1307              :     struct WrlistSendCompleteNum wrlistNum)
    1308              : {
    1309            2 :     if (qpHdc->qpMode == RA_RS_OP_QP_MODE ||
    1310            1 :         qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
    1311            1 :         if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
    1312            1 :             return RaHdcLiteSendNormalWrlist(qpHdc, wr, opRsp, wrlistNum);
    1313              :         }
    1314              :     }
    1315              : 
    1316            1 :     return RaHdcSendWrlistNormal(qpHdc, wr, opRsp, wrlistNum);
    1317              : }
    1318              : 
    1319            2 : int RaHdcGetNotifyBaseAddr(struct RaRdmaHandle *rdmaHandle, unsigned long long *va, unsigned long long *size)
    1320              : {
    1321              :     int ret;
    1322            2 :     union OpGetNotifyBaData getNotifyBaData = {0};
    1323            2 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
    1324              : 
    1325            2 :     getNotifyBaData.txData.phyId = phyId;
    1326            2 :     getNotifyBaData.txData.rdevIndex = rdmaHandle->rdevIndex;
    1327              : 
    1328            2 :     ret = RaHdcProcessMsg(RA_RS_GET_NOTIFY_BA, phyId, (char *)&getNotifyBaData,
    1329              :         sizeof(union OpGetNotifyBaData));
    1330            2 :     CHK_PRT_RETURN(ret, hccp_err("[get][ra_hdc_notify_base_addr]ra hdc message process failed ret(%d) phyId(%u)",
    1331              :         ret, phyId), ret);
    1332              : 
    1333            2 :     *va = getNotifyBaData.rxData.va;
    1334            2 :     *size = getNotifyBaData.rxData.size;
    1335            2 :     return 0;
    1336              : }
    1337              : 
    1338            2 : int RaHdcGetNotifyMrInfo(struct RaRdmaHandle *rdmaHandle, struct MrInfoT *info)
    1339              : {
    1340            2 :     union OpGetNotifyBaData getNotifyBaData = {0};
    1341            2 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
    1342            2 :     unsigned int interfaceVersion = 0;
    1343              :     int ret;
    1344              : 
    1345              :     // check opcode version, reuse RA_RS_GET_NOTIFY_BA
    1346            2 :     ret = RaHdcGetInterfaceVersion(phyId, RA_RS_GET_NOTIFY_BA, &interfaceVersion);
    1347            2 :     if (ret != 0 || interfaceVersion == RA_RS_GET_NOTIFY_BA_VERSION) {
    1348            0 :         hccp_err("[get][ra_hdc_notify_mr_info]interface_version(%u) not support, ret(%d)", interfaceVersion, ret);
    1349            0 :         return -ENOTSUPP;
    1350              :     }
    1351              : 
    1352            2 :     getNotifyBaData.txData.phyId = phyId;
    1353            2 :     getNotifyBaData.txData.rdevIndex = rdmaHandle->rdevIndex;
    1354              : 
    1355            2 :     ret = RaHdcProcessMsg(RA_RS_GET_NOTIFY_BA, phyId, (char *)&getNotifyBaData,
    1356              :         sizeof(union OpGetNotifyBaData));
    1357            2 :     CHK_PRT_RETURN(ret, hccp_err("[get][ra_hdc_notify_mr_info]ra hdc message process failed ret(%d) phyId(%u)",
    1358              :         ret, phyId), ret);
    1359              : 
    1360            2 :     info->addr = (void *)(uintptr_t)getNotifyBaData.rxData.va;
    1361            2 :     info->size = getNotifyBaData.rxData.size;
    1362            2 :     info->access = getNotifyBaData.rxData.access;
    1363            2 :     info->lkey = getNotifyBaData.rxData.lkey;
    1364            2 :     return 0;
    1365              : }
    1366              : 
    1367            2 : int RaHdcRecvWrlist(struct RaQpHandle *qpHdc, struct RecvWrlistData *wr, unsigned int recvNum,
    1368              :     unsigned int *completeNum)
    1369              : {
    1370            2 :     if (qpHdc->qpMode == RA_RS_OP_QP_MODE ||
    1371            1 :         qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
    1372            1 :         if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
    1373            1 :             return RaHdcLiteRecvWrlist(qpHdc, wr, recvNum, completeNum);
    1374              :         }
    1375              :     }
    1376              : 
    1377            1 :     hccp_warn("qpn:%u qp_mode:%d support_lite:%d not support to recv_wrlist",
    1378              :         qpHdc->qpn, qpHdc->qpMode, qpHdc->supportLite);
    1379              : 
    1380            1 :     return -ENOTSUPP;
    1381              : }
    1382              : 
    1383            2 : int RaHdcPollCq(struct RaQpHandle *qpHdc, bool isSendCq, unsigned int numEntries, void *wc)
    1384              : {
    1385            2 :     struct rdma_lite_wc_v2 *liteWc = (struct rdma_lite_wc_v2 *)wc;
    1386              : 
    1387            2 :     if (qpHdc->qpMode == RA_RS_OP_QP_MODE ||
    1388            1 :         qpHdc->qpMode == RA_RS_OP_QP_MODE_EXT) {
    1389            1 :         if (qpHdc->supportLite != LITE_NOT_SUPPORT) {
    1390            1 :             return RaHdcLitePollCq(qpHdc, isSendCq, numEntries, liteWc);
    1391              :         }
    1392              :     }
    1393              : 
    1394            1 :     hccp_warn("qpn:%u qp_mode:%d support_lite:%d not support to poll_cq",
    1395              :         qpHdc->qpn, qpHdc->qpMode, qpHdc->supportLite);
    1396              : 
    1397            1 :     return -ENOTSUPP;
    1398              : }
    1399              : 
    1400            0 : int RaHdcPollTypicalCq(struct RaTypicalCqHandle *cqHdc, unsigned int numEntries, void *wc)
    1401              : {
    1402            0 :     struct rdma_lite_wc_v2 *liteWc = (struct rdma_lite_wc_v2 *)wc;
    1403            0 :     struct rdma_lite_cq *liteCq = RaHdcLiteFindTypicalCq(cqHdc->rdmaHandle, cqHdc->cqn);
    1404            0 :     if (liteCq == NULL) {
    1405            0 :         hccp_warn("cqn:%u liteCq not found in table", cqHdc->cqn);
    1406            0 :         return -ENOTSUPP;
    1407              :     }
    1408            0 :     int ret = RaRdmaLitePollCqV2(liteCq, (int)numEntries, liteWc);
    1409            0 :     if (ret < 0) {
    1410            0 :         hccp_err("ra_rdma_lite_poll_cq_v2 failed, ret %d", ret);
    1411            0 :         return ret;
    1412              :     }
    1413            0 :     return ret;
    1414              : }
    1415              : 
    1416           12 : int RaHdcNotifyCfgSet(unsigned int phyId, unsigned long long va, unsigned long long size)
    1417              : {
    1418           12 :     union OpNotifyCfgSetData setNotifyBaData = {0};
    1419              :     int ret;
    1420              : 
    1421           12 :     setNotifyBaData.txData.phyId = phyId;
    1422           12 :     setNotifyBaData.txData.va = va;
    1423           12 :     setNotifyBaData.txData.size = size;
    1424              : 
    1425           12 :     ret = RaHdcProcessMsg(RA_RS_NOTIFY_CFG_SET, phyId, (char *)&setNotifyBaData,
    1426              :         sizeof(union OpNotifyCfgSetData));
    1427           12 :     CHK_PRT_RETURN(ret, hccp_err("[set][ra_hdc_notify_cfg]ra hdc message process failed ret(%d), phyId(%u)",
    1428              :         ret, phyId), ret);
    1429              : 
    1430            9 :     return 0;
    1431              : }
    1432              : 
    1433            6 : int RaHdcNotifyCfgGet(unsigned int phyId, unsigned long long *va,
    1434              :     unsigned long long *size)
    1435              : {
    1436            6 :     union OpNotifyCfgGetData getNotifyBaData = {0};
    1437              :     int ret;
    1438              : 
    1439            6 :     getNotifyBaData.txData.phyId = phyId;
    1440              : 
    1441            6 :     ret = RaHdcProcessMsg(RA_RS_NOTIFY_CFG_GET, phyId, (char *)&getNotifyBaData,
    1442              :         sizeof(union OpNotifyCfgGetData));
    1443            6 :     CHK_PRT_RETURN(ret, hccp_err("[get][ra_hdc_notify_cfg]ra hdc message process failed ret(%d), phyId(%u)",
    1444              :         ret, phyId), ret);
    1445            6 :     *va = getNotifyBaData.rxData.va;
    1446            6 :     *size = getNotifyBaData.rxData.size;
    1447            6 :     return 0;
    1448              : }
    1449              : 
    1450            0 : STATIC int RaHdcRdevInitWithBackup(struct RaRdmaHandle *rdmaHandle, unsigned int *rdevIndex)
    1451              : {
    1452            0 :     union OpRdevInitWithBackupData rdevInitData = { 0 };
    1453            0 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
    1454            0 :     unsigned int interfaceVersion = 0;
    1455              :     int ret;
    1456              : 
    1457            0 :     ret = RaHdcGetInterfaceVersion(phyId, RA_RS_RDEV_INIT_WITH_BACKUP, &interfaceVersion);
    1458              :     // check opcode version, not support to init rdev with backup info
    1459            0 :     if (ret != 0 || interfaceVersion < RA_RS_OPCODE_BASE_VERSION) {
    1460            0 :         hccp_warn("[init][ra_hdc_rdev]get opcode[%d] not support, ret[%d] != 0 or interfaceVersion[%u] is 0",
    1461              :             RA_RS_RDEV_INIT_WITH_BACKUP, ret, interfaceVersion);
    1462            0 :         return -ENOTSUPP;
    1463              :     }
    1464              : 
    1465            0 :     (void)memcpy_s(&(rdevInitData.txData.rdevInfo), sizeof(struct rdev),
    1466            0 :         &rdmaHandle->rdevInfo, sizeof(struct rdev));
    1467            0 :     (void)memcpy_s(&(rdevInitData.txData.backupRdevInfo), sizeof(struct rdev),
    1468            0 :         &rdmaHandle->backupInfo.rdevInfo, sizeof(struct rdev));
    1469            0 :     ret = RaHdcProcessMsg(RA_RS_RDEV_INIT_WITH_BACKUP, phyId, (char *)&rdevInitData,
    1470              :         sizeof(union OpRdevInitWithBackupData));
    1471            0 :     if (ret) {
    1472            0 :         hccp_err("[init][ra_hdc_rdev]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
    1473            0 :         return ret;
    1474              :     }
    1475              : 
    1476            0 :     *rdevIndex = rdevInitData.rxData.rdevIndex;
    1477            0 :     return 0;
    1478              : }
    1479              : 
    1480           17 : int RaHdcRdevInit(struct RaRdmaHandle *rdmaHandle, unsigned int notifyType, struct rdev rdevInfo,
    1481              :     unsigned int *rdevIndex)
    1482              : {
    1483           17 :     union OpRdevInitData rdevInitData = { 0 };
    1484           17 :     unsigned long long *notifyVa = NULL;
    1485              :     int ret, drvRet;
    1486              : 
    1487           17 :     ret = RaHdcNotifyBaseAddrInit(notifyType, rdevInfo.phyId, &notifyVa);
    1488           17 :     CHK_PRT_RETURN(ret, hccp_err("[init][ra_hdc_rdev]ra_hdc_notify_base_addr_init failed, ret(%d), phyId(%u)",
    1489              :         ret, rdevInfo.phyId), ret);
    1490              : 
    1491              :     // need to init backup rdev: reg notify & normal mr, prepare for aicpu unfold
    1492           14 :     if (rdmaHandle->backupInfo.backupFlag) {
    1493            0 :         ret = RaHdcRdevInitWithBackup(rdmaHandle, rdevIndex);
    1494            0 :         if (ret) {
    1495            0 :             goto free_mem;
    1496              :         }
    1497              :     } else {
    1498           14 :         (void)memcpy_s(&(rdevInitData.txData.rdevInfo), sizeof(struct rdev), &rdevInfo, sizeof(struct rdev));
    1499           14 :         ret = RaHdcProcessMsg(RA_RS_RDEV_INIT, rdevInfo.phyId, (char *)&rdevInitData,
    1500              :             sizeof(union OpRdevInitData));
    1501           14 :         if (ret) {
    1502            5 :             hccp_err("[init][ra_hdc_rdev]ra hdc message process failed ret(%d) phyId(%u)", ret, rdevInfo.phyId);
    1503            5 :             goto free_mem;
    1504              :         }
    1505            9 :         *rdevIndex = rdevInitData.rxData.rdevIndex;
    1506              :     }
    1507              : 
    1508            9 :     ret = RaHdcLiteInit(rdmaHandle, rdevInfo.phyId, *rdevIndex);
    1509            9 :     if (ret) {
    1510            4 :         hccp_err("[init][ra_hdc_rdev]ra_hdc_lite_init failed ret(%d) phyId(%u)", ret, rdevInfo.phyId);
    1511            4 :         goto free_mem;
    1512              :     }
    1513              : 
    1514            5 :     return 0;
    1515              : 
    1516            9 : free_mem:
    1517            9 :     drvRet = DlHalMemFree((void *)notifyVa);
    1518            9 :     if (drvRet) {
    1519            1 :         hccp_err("[init][ra_hdc_rdev]halMemFree failed! drv_ret(%d)", drvRet);
    1520              :     }
    1521            9 :     return ret;
    1522              : }
    1523              : 
    1524            2 : int RaHdcRdevGetPortStatus(struct RaRdmaHandle *rdmaHandle, enum PortStatus *status)
    1525              : {
    1526            2 :     union OpRdevGetPortStatusData statusData = {0};
    1527            2 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
    1528              :     int ret;
    1529              : 
    1530            2 :     statusData.txData.rdevIndex = rdmaHandle->rdevIndex;
    1531            2 :     statusData.txData.phyId = phyId;
    1532              : 
    1533            2 :     ret = RaHdcProcessMsg(RA_RS_RDEV_GET_PORT_STATUS, phyId, (char *)&statusData,
    1534              :         sizeof(union OpRdevGetPortStatusData));
    1535            2 :     CHK_PRT_RETURN(ret != 0, hccp_err("[get][ra_hdc_port_status]ra hdc message process failed, ret(%d) phyId(%u)",
    1536              :         ret, phyId), ret);
    1537              : 
    1538            1 :     *status = statusData.rxData.status;
    1539            1 :     return 0;
    1540              : }
    1541              : 
    1542            0 : int RaHdcRdevRestoreDeinit(struct RaRdmaHandle *rdmaHandle, unsigned int notifyType)
    1543              : {
    1544              :     // lite thread is an inner thread, make sure it will exit
    1545            0 :     RaHdcLiteDeinit(rdmaHandle);
    1546              : 
    1547            0 :     CHK_PRT_RETURN(notifyType != NOTIFY, hccp_err("[deinit][ra_hdc_rdev]notify_type[%u] error",
    1548              :         notifyType), -EINVAL);
    1549              : 
    1550            0 :     return 0;
    1551              : }
    1552              : 
    1553           10 : int RaHdcRdevDeinit(struct RaRdmaHandle *rdmaHandle, unsigned int notifyType)
    1554              : {
    1555           10 :     union OpRdevDeinitData rdevDeinitData = {0};
    1556              :     unsigned long long va, size;
    1557              :     int ret;
    1558              : 
    1559              :     // lite thread is an inner thread, make sure it will exit
    1560           10 :     RaHdcLiteDeinit(rdmaHandle);
    1561              : 
    1562           10 :     CHK_PRT_RETURN(notifyType != NOTIFY, hccp_err("[deinit][ra_hdc_rdev]notify_type[%u] error",
    1563              :         notifyType), -EINVAL);
    1564              : 
    1565           10 :     rdevDeinitData.txData.rdevIndex = rdmaHandle->rdevIndex;
    1566           10 :     rdevDeinitData.txData.phyId = rdmaHandle->rdevInfo.phyId;
    1567              : 
    1568           10 :     ret = RaHdcProcessMsg(RA_RS_RDEV_DEINIT, rdmaHandle->rdevInfo.phyId, (char *)&rdevDeinitData,
    1569              :         sizeof(union OpRdevDeinitData));
    1570           10 :     CHK_PRT_RETURN(ret, hccp_err("[deinit][ra_hdc_rdev]ra_hdc_notify_cfg_get failed, ret(%d)", ret), ret);
    1571              : 
    1572            8 :     ret = RaHdcNotifyCfgGet(rdmaHandle->rdevInfo.phyId, &va, &size);
    1573            8 :     CHK_PRT_RETURN(ret, hccp_err("[deinit][ra_hdc_rdev]ra_hdc_notify_cfg_get failed, ret(%d)", ret), ret);
    1574              : 
    1575            7 :     ret = DlHalMemFree((void *)(uintptr_t)va);
    1576            7 :     CHK_PRT_RETURN(ret, hccp_err("[deinit][ra_hdc_rdev]halMemFree failed, ret(%d)", ret), ret);
    1577              : 
    1578            6 :     return 0;
    1579              : }
    1580              : 
    1581            1 : int RaHdcSetTsqpDepth(struct RaRdmaHandle *rdmaHandle, unsigned int tempDepth, unsigned int *qpNum)
    1582              : {
    1583            1 :     union OpSetTsqpDepthData setTsqpDepthData = {0};
    1584            1 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
    1585              :     int ret;
    1586              : 
    1587            1 :     setTsqpDepthData.txData.phyId = rdmaHandle->rdevInfo.phyId;
    1588            1 :     setTsqpDepthData.txData.rdevIndex = rdmaHandle->rdevIndex;
    1589            1 :     setTsqpDepthData.txData.tempDepth = tempDepth;
    1590              : 
    1591            1 :     ret = RaHdcProcessMsg(RA_RS_SET_TSQP_DEPTH, phyId, (char *)&setTsqpDepthData,
    1592              :         sizeof(union OpSetTsqpDepthData));
    1593            1 :     CHK_PRT_RETURN(ret, hccp_err("[set][ra_hdc_tsqp_depth]ra hdc message process failed ret(%d), opcode(%d)"
    1594              :         "phyId(%u)", ret, RA_RS_SET_TSQP_DEPTH, phyId), ret);
    1595              : 
    1596            1 :     *qpNum = setTsqpDepthData.rxData.qpNum;
    1597            1 :     return 0;
    1598              : }
    1599              : 
    1600            1 : int RaHdcGetTsqpDepth(struct RaRdmaHandle *rdmaHandle, unsigned int *tempDepth, unsigned int *qpNum)
    1601              : {
    1602            1 :     union OpGetTsqpDepthData getTsqpDepthData = {0};
    1603            1 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
    1604              :     int ret;
    1605              : 
    1606            1 :     getTsqpDepthData.txData.phyId = rdmaHandle->rdevInfo.phyId;
    1607            1 :     getTsqpDepthData.txData.rdevIndex = rdmaHandle->rdevIndex;
    1608              : 
    1609            1 :     ret = RaHdcProcessMsg(RA_RS_GET_TSQP_DEPTH, phyId, (char *)&getTsqpDepthData,
    1610              :         sizeof(union OpGetTsqpDepthData));
    1611            1 :     CHK_PRT_RETURN(ret, hccp_err("[get][ra_hdc_tsqp_depth]ra hdc message process failed ret(%d), opcode(%d)"
    1612              :         "phyId(%u)", ret, RA_RS_GET_TSQP_DEPTH, phyId), ret);
    1613              : 
    1614            1 :     *tempDepth = getTsqpDepthData.rxData.tempDepth;
    1615            1 :     *qpNum = getTsqpDepthData.rxData.qpNum;
    1616              : 
    1617            1 :     return 0;
    1618              : }
    1619              : 
    1620            0 : int RaHdcSetQpAttrQos(struct RaQpHandle *qpHdc, struct QosAttr *attr)
    1621              : {
    1622            0 :     union OpSetQpAttrQosData qpAttrQosData = {0};
    1623              :     int ret;
    1624              : 
    1625            0 :     qpAttrQosData.txData.phyId = qpHdc->phyId;
    1626            0 :     qpAttrQosData.txData.rdevIndex = qpHdc->rdevIndex;
    1627            0 :     qpAttrQosData.txData.qpn = qpHdc->qpn;
    1628            0 :     qpAttrQosData.txData.qosAttr.tc = attr->tc;
    1629            0 :     qpAttrQosData.txData.qosAttr.sl = attr->sl;
    1630              : 
    1631            0 :     ret = RaHdcProcessMsg(RA_RS_SET_QP_ATTR_QOS, qpHdc->phyId,
    1632              :         (char *)&qpAttrQosData, sizeof(union OpSetQpAttrQosData));
    1633            0 :     CHK_PRT_RETURN(ret, hccp_err("[set][ra_hdc_qp_attr_qos]ra hdc message process failed ret(%d) phyId(%u)",
    1634              :         ret, qpHdc->phyId), ret);
    1635              : 
    1636            0 :     return 0;
    1637              : }
    1638              : 
    1639            0 : int RaHdcSetQpAttrTimeout(struct RaQpHandle *qpHdc, unsigned int *timeout)
    1640              : {
    1641            0 :     union OpSetQpAttrTimeoutData qpAttrTimeoutData = {0};
    1642              :     int ret;
    1643              : 
    1644            0 :     qpAttrTimeoutData.txData.phyId = qpHdc->phyId;
    1645            0 :     qpAttrTimeoutData.txData.rdevIndex = qpHdc->rdevIndex;
    1646            0 :     qpAttrTimeoutData.txData.qpn = qpHdc->qpn;
    1647            0 :     qpAttrTimeoutData.txData.timeout = *timeout;
    1648              : 
    1649            0 :     ret = RaHdcProcessMsg(RA_RS_SET_QP_ATTR_TIMEOUT, qpHdc->phyId,
    1650              :         (char *)&qpAttrTimeoutData, sizeof(union OpSetQpAttrTimeoutData));
    1651            0 :     CHK_PRT_RETURN(ret, hccp_err("[set][ra_hdc_qp_attr_timeout]ra hdc message process failed ret(%d) phyId(%u)",
    1652              :         ret, qpHdc->phyId), ret);
    1653              : 
    1654            0 :     return 0;
    1655              : }
    1656              : 
    1657            0 : int RaHdcSetQpAttrRetryCnt(struct RaQpHandle *qpHdc, unsigned int *retryCnt)
    1658              : {
    1659            0 :     union OpSetQpAttrRetryCntData qpAttrRetryCntData = {0};
    1660              :     int ret;
    1661              : 
    1662            0 :     qpAttrRetryCntData.txData.phyId = qpHdc->phyId;
    1663            0 :     qpAttrRetryCntData.txData.rdevIndex = qpHdc->rdevIndex;
    1664            0 :     qpAttrRetryCntData.txData.qpn = qpHdc->qpn;
    1665            0 :     qpAttrRetryCntData.txData.retryCnt = *retryCnt;
    1666              : 
    1667            0 :     ret = RaHdcProcessMsg(RA_RS_SET_QP_ATTR_RETRY_CNT, qpHdc->phyId,
    1668              :         (char *)&qpAttrRetryCntData, sizeof(union OpSetQpAttrRetryCntData));
    1669            0 :     CHK_PRT_RETURN(ret, hccp_err("[set][ra_hdc_qp_attr_retry_cnt]ra hdc message process failed ret(%d) phyId(%u)",
    1670              :         ret, qpHdc->phyId), ret);
    1671              : 
    1672            0 :     return 0;
    1673              : }
    1674              : 
    1675            0 : STATIC int RaHdcGetCqeErrInfoNum(struct RaRdmaHandle *rdmaHandle, unsigned int *num)
    1676              : {
    1677            0 :     union OpGetCqeErrInfoNumData cqeErrInfoNumData = { 0 };
    1678            0 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
    1679            0 :     unsigned int interfaceVersion = 0;
    1680              :     int ret;
    1681              : 
    1682            0 :     *num = 0;
    1683              :     // check opcode version, not support to get cqe err info
    1684            0 :     ret = RaHdcGetInterfaceVersion(phyId, RA_RS_GET_CQE_ERR_INFO_NUM, &interfaceVersion);
    1685            0 :     if (ret != 0 || interfaceVersion == 0) {
    1686            0 :         hccp_warn("[get][cqe_err_info_list]get opcode[%d] not support, ret[%d] != 0 or interfaceVersion[%u] is 0",
    1687              :             RA_RS_GET_CQE_ERR_INFO_NUM, ret, interfaceVersion);
    1688            0 :         return 0;
    1689              :     }
    1690              : 
    1691            0 :     cqeErrInfoNumData.txData.phyId = phyId;
    1692            0 :     cqeErrInfoNumData.txData.rdevIndex = rdmaHandle->rdevIndex;
    1693            0 :     ret = RaHdcProcessMsg(RA_RS_GET_CQE_ERR_INFO_NUM, phyId,
    1694              :         (char *)&cqeErrInfoNumData, sizeof(union OpGetCqeErrInfoNumData));
    1695            0 :     CHK_PRT_RETURN(ret, hccp_err("ra hdc message process failed ret(%d) phyId(%u)", ret, phyId), ret);
    1696              : 
    1697            0 :     *num = cqeErrInfoNumData.rxData.num;
    1698            0 :     return 0;
    1699              : }
    1700              : 
    1701            0 : int RaHdcGetCqeErrInfoList(struct RaRdmaHandle *rdmaHandle, struct CqeErrInfo *infoList, unsigned int *num)
    1702              : {
    1703            0 :     union OpGetCqeErrInfoListData cqeErrInfoListData = { 0 };
    1704            0 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
    1705            0 :     unsigned int liteCqeErrNum = *num;
    1706            0 :     unsigned int cqeErrInfoNum = 0;
    1707            0 :     unsigned int hdcCqeErrNum = 0;
    1708            0 :     int ret = 0;
    1709              : 
    1710            0 :     ret = RaHdcLiteGetCqeErrInfoList(rdmaHandle, infoList, &liteCqeErrNum);
    1711            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("[get][cqe_err_info_list]get lite err info list failed, ret(%d) phyId(%u)",
    1712              :         ret, phyId), ret);
    1713              : 
    1714            0 :     hdcCqeErrNum = *num - liteCqeErrNum;
    1715            0 :     *num = liteCqeErrNum;
    1716              :     // lite cqe err info full up info_list
    1717            0 :     if (hdcCqeErrNum == 0) {
    1718            0 :         return 0;
    1719              :     }
    1720              : 
    1721              :     // get cqe err info num failed or not support to get cqe err info, skip get cqe err info list
    1722            0 :     ret = RaHdcGetCqeErrInfoNum(rdmaHandle, &cqeErrInfoNum);
    1723            0 :     if (ret != 0 || cqeErrInfoNum == 0) {
    1724            0 :         return ret;
    1725              :     }
    1726              : 
    1727            0 :     cqeErrInfoListData.txData.phyId = phyId;
    1728            0 :     cqeErrInfoListData.txData.rdevIndex = rdmaHandle->rdevIndex;
    1729            0 :     cqeErrInfoListData.txData.num = hdcCqeErrNum;
    1730            0 :     ret = RaHdcProcessMsg(RA_RS_GET_CQE_ERR_INFO_LIST, phyId,
    1731              :         (char *)&cqeErrInfoListData, sizeof(union OpGetCqeErrInfoListData));
    1732            0 :     CHK_PRT_RETURN(ret, hccp_err("ra hdc message process failed ret(%d) phyId(%u)", ret, phyId), ret);
    1733              : 
    1734            0 :     if (cqeErrInfoListData.rxData.num > hdcCqeErrNum) {
    1735            0 :         hccp_err("[get][cqe_err_info_list]rx_data.num(%u) is invalid, num(%u), phyId(%u)",
    1736              :             cqeErrInfoListData.rxData.num, hdcCqeErrNum, phyId);
    1737            0 :         return -EINVAL;
    1738              :     }
    1739            0 :     ret = memcpy_s(&infoList[liteCqeErrNum], sizeof(struct CqeErrInfo) * hdcCqeErrNum,
    1740            0 :         &cqeErrInfoListData.rxData.infoList, sizeof(struct CqeErrInfo) * cqeErrInfoListData.rxData.num);
    1741            0 :     if (ret) {
    1742            0 :         hccp_err("[get][cqe_err_info_list]memcpy_s info_list failed, ret(%d) phyId(%u) num(%u) rxData.num(%u)",
    1743              :             ret, phyId, hdcCqeErrNum, cqeErrInfoListData.rxData.num);
    1744            0 :         return ret;
    1745              :     }
    1746              : 
    1747            0 :     *num = liteCqeErrNum + cqeErrInfoListData.rxData.num;
    1748            0 :     return 0;
    1749              : }
    1750              : 
    1751            0 : STATIC int RaHdcLiteCleanCq(struct RaQpHandle *qpHandle, bool isSendCq, unsigned int numEntries)
    1752              : {
    1753            0 :     void *wc = NULL;
    1754              :     int ret;
    1755              : 
    1756            0 :     if (numEntries == 0) {
    1757            0 :         return 0;
    1758              :     }
    1759              : 
    1760            0 :     wc = calloc(numEntries, sizeof(struct rdma_lite_wc_v2));
    1761            0 :     if (wc == NULL) {
    1762            0 :         hccp_err("calloc failed, phyId:%u, qpn:%u", qpHandle->phyId, qpHandle->qpn);
    1763            0 :         return -ENOMEM;
    1764              :     }
    1765              : 
    1766            0 :     ret = RaHdcLitePollCq(qpHandle, isSendCq, numEntries, wc);
    1767            0 :     free(wc);
    1768            0 :     if (ret < 0) {
    1769            0 :         hccp_err("ra_hdc_lite_poll_cq failed, ret:%d, phyId:%u, qpn:%u", ret, qpHandle->phyId, qpHandle->qpn);
    1770            0 :         return ret;
    1771              :     }
    1772              : 
    1773            0 :     return 0;
    1774              : }
    1775              : 
    1776            0 : STATIC int RaHdcLiteCleanQp(struct RaQpHandle *qpHandle)
    1777              : {
    1778            0 :     unsigned int interfaceVersion = 0;
    1779              :     int ret;
    1780              : 
    1781              :     // check opcode versioin, not support to clean qp
    1782            0 :     ret = RaHdcGetInterfaceVersion(qpHandle->phyId, RA_RS_QP_BATCH_MODIFY, &interfaceVersion);
    1783            0 :     if (ret != 0 || interfaceVersion <= RA_RS_OPCODE_BASE_VERSION) {
    1784            0 :         hccp_warn("RA_RS_QP_BATCH_MODIFY interface_version:%u <= %u, not support to clean qp, phyId:%u, qpn:%u",
    1785              :             interfaceVersion, RA_RS_OPCODE_BASE_VERSION, qpHandle->phyId, qpHandle->qpn);
    1786            0 :         return 0;
    1787              :     }
    1788              : 
    1789              :     // lite qp clean
    1790            0 :     ret = RaRdmaLiteCleanQp(qpHandle->liteQp);
    1791            0 :     if (ret != 0) {
    1792            0 :         hccp_err("ra_rdma_lite_clean_qp failed, ret:%d, phyId:%u, qpn:%u", ret, qpHandle->phyId, qpHandle->qpn);
    1793            0 :         return ret;
    1794              :     }
    1795              : 
    1796            0 :     return 0;
    1797              : }
    1798              : 
    1799            2 : STATIC int RaHdcLiteCleanQueue(struct RaQpHandle *qpHandle, int expectStatus)
    1800              : {
    1801              :     int ret;
    1802              : 
    1803              :     // not pause status, no need to clean
    1804            2 :     if (expectStatus != RA_QP_STATUS_PAUSE) {
    1805            1 :         return 0;
    1806              :     }
    1807              : 
    1808              :     // not lite or not op mode, no need to clean
    1809            1 :     if ((qpHandle->supportLite == 0) ||
    1810            0 :         (qpHandle->qpMode != RA_RS_OP_QP_MODE && qpHandle->qpMode != RA_RS_OP_QP_MODE_EXT)) {
    1811            1 :         return 0;
    1812              :     }
    1813              : 
    1814              :     // poll cq to clean lite send cq
    1815            0 :     if (qpHandle->sendWrNum > qpHandle->pollCqeNum) {
    1816            0 :         ret = RaHdcLiteCleanCq(qpHandle, true, qpHandle->sendWrNum - qpHandle->pollCqeNum);
    1817            0 :         if (ret != 0) {
    1818            0 :             hccp_err("ra_hdc_lite_clean_cq send_cq failed, ret:%d, phyId:%u, qpn:%u",
    1819              :                 ret, qpHandle->phyId, qpHandle->qpn);
    1820            0 :             return ret;
    1821              :         }
    1822              :     }
    1823              : 
    1824              :     // poll cq to clean lite recv cq
    1825            0 :     if (qpHandle->recvWrNum > qpHandle->pollRecvCqeNum) {
    1826            0 :         ret = RaHdcLiteCleanCq(qpHandle, false, qpHandle->recvWrNum - qpHandle->pollRecvCqeNum);
    1827            0 :         if (ret < 0) {
    1828            0 :             hccp_err("ra_hdc_lite_clean_cq recv_cq failed, ret:%d, phyId:%u, qpn:%u",
    1829              :                 ret, qpHandle->phyId, qpHandle->qpn);
    1830            0 :             return ret;
    1831              :         }
    1832              :     }
    1833              : 
    1834              :     // lite qp clean
    1835            0 :     ret = RaHdcLiteCleanQp(qpHandle);
    1836            0 :     if (ret != 0) {
    1837            0 :         hccp_err("ra_hdc_lite_clean_qp failed, ret:%d, phyId:%u, qpn:%u", ret, qpHandle->phyId, qpHandle->qpn);
    1838            0 :         return ret;
    1839              :     }
    1840              : 
    1841            0 :     return 0;
    1842              : }
    1843              : 
    1844            2 : int RaHdcQpBatchModify(struct RaRdmaHandle *rdmaHandle, void *qpHdc[], unsigned int num, int expectStatus)
    1845              : {
    1846            2 :     union OpQpBatchModifyData *qpBatchModifyData = NULL;
    1847            2 :     unsigned int phyId = rdmaHandle->rdevInfo.phyId;
    1848            2 :     struct RaQpHandle *qpHandle = NULL;
    1849            2 :     unsigned int currentSendCnt = 0;
    1850            2 :     unsigned int completeCnt = 0;
    1851            2 :     int opQpnCnt = 0;
    1852              :     unsigned int i;
    1853            2 :     int ret = 0;
    1854              : 
    1855            2 :     qpBatchModifyData = calloc(1, sizeof(union OpQpBatchModifyData));
    1856            2 :     CHK_PRT_RETURN(qpBatchModifyData == NULL,
    1857              :         hccp_err("[send][ra_hdc_qp_batch_modify]qp_batch_modify calloc failed"), -ENOMEM);
    1858            4 :     while (completeCnt < num) {
    1859            2 :         qpBatchModifyData->txData.phyId = phyId;
    1860            2 :         qpBatchModifyData->txData.rdevIndex = rdmaHandle->rdevIndex;
    1861            2 :         qpBatchModifyData->txData.status = expectStatus;
    1862              : 
    1863            2 :         currentSendCnt = (num - completeCnt) < RA_MAX_BATCH_QP_MODIFY_NUM ?
    1864              :             (num - completeCnt) : RA_MAX_BATCH_QP_MODIFY_NUM;
    1865            2 :         opQpnCnt = 0;
    1866            4 :         for (i = completeCnt; i < completeCnt + currentSendCnt; i++) {
    1867            2 :             qpHandle = (struct RaQpHandle *)qpHdc[i];
    1868            2 :             qpBatchModifyData->txData.qpn[opQpnCnt] = (int)qpHandle->qpn;
    1869            2 :             opQpnCnt++;
    1870              : 
    1871              :             // avoid poll invalid cqe after modify to RESET state, make sure lite cq ci & qp pointer are valid
    1872            2 :             ret = RaHdcLiteCleanQueue(qpHandle, expectStatus);
    1873            2 :             if (ret != 0) {
    1874            0 :                 hccp_err("[modify][qp_batch_modify]ra_hdc_lite_clean_queue failed ret(%d) phyId(%u) qpn(%u)",
    1875              :                     ret, phyId, qpHandle->qpn);
    1876            0 :                 goto err_qp_batch_modify;
    1877              :             }
    1878              :         }
    1879            2 :         qpBatchModifyData->txData.qpnNum = opQpnCnt;
    1880              : 
    1881            2 :         ret = RaHdcProcessMsg(RA_RS_QP_BATCH_MODIFY, phyId, (char *)qpBatchModifyData,
    1882              :             sizeof(union OpQpBatchModifyData));
    1883            2 :         if (ret) {
    1884            0 :             hccp_err("[modify][qp_batch_modify]ra hdc message process failed ret(%d) phyId(%u)", ret, phyId);
    1885            0 :             goto err_qp_batch_modify;
    1886              :         }
    1887            2 :         completeCnt += (unsigned int)opQpnCnt;
    1888              :     }
    1889              : 
    1890            2 : err_qp_batch_modify:
    1891            2 :     free(qpBatchModifyData);
    1892            2 :     qpBatchModifyData = NULL;
    1893              : 
    1894            2 :     return ret;
    1895              : }
    1896              : 
    1897            4 : int RaHdcRdmaSetOps(struct RaRdmaHandle *rdmaHandle, struct RaRdmaOps *rdmaOps)
    1898              : {
    1899            4 :     CHK_PRT_RETURN(rdmaHandle == NULL, hccp_err("ra_hdc_rdma_set_ops rdma_handle is NULL"), -EINVAL);
    1900              : 
    1901            4 :     rdmaHandle->rdmaOps = rdmaOps;
    1902            4 :     return 0;
    1903              : }
    1904              : 
    1905            0 : int RaHdcRdmaSaveSnapshot(struct RaRdmaHandle *rdmaHandle, enum SaveSnapshotAction action)
    1906              : {
    1907            0 :     int ret = 0;
    1908              : 
    1909            0 :     if (rdmaHandle == NULL || rdmaHandle->supportLite == LITE_NOT_SUPPORT || rdmaHandle->disabledLiteThread) {
    1910            0 :         return 0;
    1911              :     }
    1912              : 
    1913            0 :     RA_PTHREAD_MUTEX_LOCK(&rdmaHandle->rdevMutex);
    1914            0 :     if (action == SAVE_SNAPSHOT_ACTION_PRE_PROCESSING && rdmaHandle->threadStatus == LITE_THREAD_STATUS_RUNNING) {
    1915            0 :         rdmaHandle->threadStatus = LITE_THREAD_STATUS_SUSPEND;
    1916            0 :     } else if (action == SAVE_SNAPSHOT_ACTION_POST_PROCESSING && rdmaHandle->threadStatus == LITE_THREAD_STATUS_SUSPEND) {
    1917            0 :         rdmaHandle->threadStatus = LITE_THREAD_STATUS_RUNNING;
    1918              :     } else {
    1919            0 :         hccp_err("duplicate or incorrect order calls are not allowed, threadStatus[%d] action[%d]",
    1920              :             rdmaHandle->threadStatus, action);
    1921            0 :         ret = -EPERM;
    1922              :     }
    1923            0 :     RA_PTHREAD_MUTEX_UNLOCK(&rdmaHandle->rdevMutex);
    1924              : 
    1925            0 :     return ret;
    1926              : }
    1927              : 
    1928            0 : int RaHdcRdmaRestoreSnapshot(struct RaRdmaHandle *rdmaHandle, struct RaRdmaOps *rdmaOps)
    1929              : {
    1930            0 :     int ret = 0;
    1931              : 
    1932            0 :     if (rdmaHandle == NULL) {
    1933            0 :         return 0;
    1934              :     }
    1935            0 :     ret = RaHdcRdmaSetOps(rdmaHandle, rdmaOps);
    1936            0 :     CHK_PRT_RETURN(ret != 0, hccp_err("ra_hdc_rdma_set_ops failed, ret[%d]", ret), ret);
    1937              : 
    1938            0 :     if (rdmaHandle->supportLite == LITE_NOT_SUPPORT || rdmaHandle->disabledLiteThread) {
    1939            0 :         return 0;
    1940              :     }
    1941              : 
    1942            0 :     RA_PTHREAD_MUTEX_LOCK(&rdmaHandle->rdevMutex);
    1943            0 :     if (rdmaHandle->threadStatus != LITE_THREAD_STATUS_SUSPEND) {
    1944            0 :         hccp_err("incorrect order calls are not allowed, threadStatus[%d]", rdmaHandle->threadStatus);
    1945            0 :         ret = -EPERM;
    1946            0 :         goto unlock_mutex;
    1947              :     }
    1948            0 :     ret = RaRdmaLiteRestoreSnapshot(rdmaHandle->liteCtx);
    1949            0 :     if (ret != 0) {
    1950            0 :         hccp_err("ra_rdma_lite_restore_snapshot failed, ret[%d]", ret);
    1951              :     }
    1952              : 
    1953            0 : unlock_mutex:
    1954            0 :     RA_PTHREAD_MUTEX_UNLOCK(&rdmaHandle->rdevMutex);
    1955            0 :     return ret;
    1956              : }
        

Generated by: LCOV version 2.0-1