// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB /* Copyright (c) 2015 - 2021 Intel Corporation */ #include "osdep.h" #include "hmc.h" #include "defs.h" #include "type.h" #include "protos.h" #include "puda.h" #include "ws.h" static void irdma_ieq_receive(struct irdma_sc_vsi *vsi, struct irdma_puda_buf *buf); static void irdma_ieq_tx_compl(struct irdma_sc_vsi *vsi, void *sqwrid); static void irdma_ilq_putback_rcvbuf(struct irdma_sc_qp *qp, struct irdma_puda_buf *buf, u32 wqe_idx); /** * irdma_puda_get_listbuf - get buffer from puda list * @list: list to use for buffers (ILQ or IEQ) */ static struct irdma_puda_buf *irdma_puda_get_listbuf(struct list_head *list) { … } /** * irdma_puda_get_bufpool - return buffer from resource * @rsrc: resource to use for buffer */ struct irdma_puda_buf *irdma_puda_get_bufpool(struct irdma_puda_rsrc *rsrc) { … } /** * irdma_puda_ret_bufpool - return buffer to rsrc list * @rsrc: resource to use for buffer * @buf: buffer to return to resource */ void irdma_puda_ret_bufpool(struct irdma_puda_rsrc *rsrc, struct irdma_puda_buf *buf) { … } /** * irdma_puda_post_recvbuf - set wqe for rcv buffer * @rsrc: resource ptr * @wqe_idx: wqe index to use * @buf: puda buffer for rcv q * @initial: flag if during init time */ static void irdma_puda_post_recvbuf(struct irdma_puda_rsrc *rsrc, u32 wqe_idx, struct irdma_puda_buf *buf, bool initial) { … } /** * irdma_puda_replenish_rq - post rcv buffers * @rsrc: resource to use for buffer * @initial: flag if during init time */ static int irdma_puda_replenish_rq(struct irdma_puda_rsrc *rsrc, bool initial) { … } /** * irdma_puda_alloc_buf - allocate mem for buffer * @dev: iwarp device * @len: length of buffer */ static struct irdma_puda_buf *irdma_puda_alloc_buf(struct irdma_sc_dev *dev, u32 len) { … } /** * irdma_puda_dele_buf - delete buffer back to system * @dev: iwarp device * @buf: buffer to free */ static void irdma_puda_dele_buf(struct irdma_sc_dev *dev, struct irdma_puda_buf *buf) { … } /** * irdma_puda_get_next_send_wqe - return next wqe for processing * @qp: puda qp for wqe * @wqe_idx: wqe index for caller */ static __le64 *irdma_puda_get_next_send_wqe(struct irdma_qp_uk *qp, u32 *wqe_idx) { … } /** * irdma_puda_poll_info - poll cq for completion * @cq: cq for poll * @info: info return for successful completion */ static int irdma_puda_poll_info(struct irdma_sc_cq *cq, struct irdma_puda_cmpl_info *info) { … } /** * irdma_puda_poll_cmpl - processes completion for cq * @dev: iwarp device * @cq: cq getting interrupt * @compl_err: return any completion err */ int irdma_puda_poll_cmpl(struct irdma_sc_dev *dev, struct irdma_sc_cq *cq, u32 *compl_err) { … } /** * irdma_puda_send - complete send wqe for transmit * @qp: puda qp for send * @info: buffer information for transmit */ int irdma_puda_send(struct irdma_sc_qp *qp, struct irdma_puda_send_info *info) { … } /** * irdma_puda_send_buf - transmit puda buffer * @rsrc: resource to use for buffer * @buf: puda buffer to transmit */ void irdma_puda_send_buf(struct irdma_puda_rsrc *rsrc, struct irdma_puda_buf *buf) { … } /** * irdma_puda_qp_setctx - during init, set qp's context * @rsrc: qp's resource */ static void irdma_puda_qp_setctx(struct irdma_puda_rsrc *rsrc) { … } /** * irdma_puda_qp_wqe - setup wqe for qp create * @dev: Device * @qp: Resource qp */ static int irdma_puda_qp_wqe(struct irdma_sc_dev *dev, struct irdma_sc_qp *qp) { … } /** * irdma_puda_qp_create - create qp for resource * @rsrc: resource to use for buffer */ static int irdma_puda_qp_create(struct irdma_puda_rsrc *rsrc) { … } /** * irdma_puda_cq_wqe - setup wqe for CQ create * @dev: Device * @cq: resource for cq */ static int irdma_puda_cq_wqe(struct irdma_sc_dev *dev, struct irdma_sc_cq *cq) { … } /** * irdma_puda_cq_create - create cq for resource * @rsrc: resource for which cq to create */ static int irdma_puda_cq_create(struct irdma_puda_rsrc *rsrc) { … } /** * irdma_puda_free_qp - free qp for resource * @rsrc: resource for which qp to free */ static void irdma_puda_free_qp(struct irdma_puda_rsrc *rsrc) { … } /** * irdma_puda_free_cq - free cq for resource * @rsrc: resource for which cq to free */ static void irdma_puda_free_cq(struct irdma_puda_rsrc *rsrc) { … } /** * irdma_puda_dele_rsrc - delete all resources during close * @vsi: VSI structure of device * @type: type of resource to dele * @reset: true if reset chip */ void irdma_puda_dele_rsrc(struct irdma_sc_vsi *vsi, enum puda_rsrc_type type, bool reset) { … } /** * irdma_puda_allocbufs - allocate buffers for resource * @rsrc: resource for buffer allocation * @count: number of buffers to create */ static int irdma_puda_allocbufs(struct irdma_puda_rsrc *rsrc, u32 count) { … } /** * irdma_puda_create_rsrc - create resource (ilq or ieq) * @vsi: sc VSI struct * @info: resource information */ int irdma_puda_create_rsrc(struct irdma_sc_vsi *vsi, struct irdma_puda_rsrc_info *info) { … } /** * irdma_ilq_putback_rcvbuf - ilq buffer to put back on rq * @qp: ilq's qp resource * @buf: puda buffer for rcv q * @wqe_idx: wqe index of completed rcvbuf */ static void irdma_ilq_putback_rcvbuf(struct irdma_sc_qp *qp, struct irdma_puda_buf *buf, u32 wqe_idx) { … } /** * irdma_ieq_get_fpdu_len - get length of fpdu with or without marker * @pfpdu: pointer to fpdu * @datap: pointer to data in the buffer * @rcv_seq: seqnum of the data buffer */ static u16 irdma_ieq_get_fpdu_len(struct irdma_pfpdu *pfpdu, u8 *datap, u32 rcv_seq) { … } /** * irdma_ieq_copy_to_txbuf - copydata from rcv buf to tx buf * @buf: rcv buffer with partial * @txbuf: tx buffer for sending back * @buf_offset: rcv buffer offset to copy from * @txbuf_offset: at offset in tx buf to copy * @len: length of data to copy */ static void irdma_ieq_copy_to_txbuf(struct irdma_puda_buf *buf, struct irdma_puda_buf *txbuf, u16 buf_offset, u32 txbuf_offset, u32 len) { … } /** * irdma_ieq_setup_tx_buf - setup tx buffer for partial handling * @buf: reeive buffer with partial * @txbuf: buffer to prepare */ static void irdma_ieq_setup_tx_buf(struct irdma_puda_buf *buf, struct irdma_puda_buf *txbuf) { … } /** * irdma_ieq_check_first_buf - check if rcv buffer's seq is in range * @buf: receive exception buffer * @fps: first partial sequence number */ static void irdma_ieq_check_first_buf(struct irdma_puda_buf *buf, u32 fps) { … } /** * irdma_ieq_compl_pfpdu - write txbuf with full fpdu * @ieq: ieq resource * @rxlist: ieq's received buffer list * @pbufl: temporary list for buffers for fpddu * @txbuf: tx buffer for fpdu * @fpdu_len: total length of fpdu */ static void irdma_ieq_compl_pfpdu(struct irdma_puda_rsrc *ieq, struct list_head *rxlist, struct list_head *pbufl, struct irdma_puda_buf *txbuf, u16 fpdu_len) { … } /** * irdma_ieq_create_pbufl - create buffer list for single fpdu * @pfpdu: pointer to fpdu * @rxlist: resource list for receive ieq buffes * @pbufl: temp. list for buffers for fpddu * @buf: first receive buffer * @fpdu_len: total length of fpdu */ static int irdma_ieq_create_pbufl(struct irdma_pfpdu *pfpdu, struct list_head *rxlist, struct list_head *pbufl, struct irdma_puda_buf *buf, u16 fpdu_len) { … } /** * irdma_ieq_handle_partial - process partial fpdu buffer * @ieq: ieq resource * @pfpdu: partial management per user qp * @buf: receive buffer * @fpdu_len: fpdu len in the buffer */ static int irdma_ieq_handle_partial(struct irdma_puda_rsrc *ieq, struct irdma_pfpdu *pfpdu, struct irdma_puda_buf *buf, u16 fpdu_len) { … } /** * irdma_ieq_process_buf - process buffer rcvd for ieq * @ieq: ieq resource * @pfpdu: partial management per user qp * @buf: receive buffer */ static int irdma_ieq_process_buf(struct irdma_puda_rsrc *ieq, struct irdma_pfpdu *pfpdu, struct irdma_puda_buf *buf) { … } /** * irdma_ieq_process_fpdus - process fpdu's buffers on its list * @qp: qp for which partial fpdus * @ieq: ieq resource */ void irdma_ieq_process_fpdus(struct irdma_sc_qp *qp, struct irdma_puda_rsrc *ieq) { … } /** * irdma_ieq_create_ah - create an address handle for IEQ * @qp: qp pointer * @buf: buf received on IEQ used to create AH */ static int irdma_ieq_create_ah(struct irdma_sc_qp *qp, struct irdma_puda_buf *buf) { … } /** * irdma_ieq_handle_exception - handle qp's exception * @ieq: ieq resource * @qp: qp receiving excpetion * @buf: receive buffer */ static void irdma_ieq_handle_exception(struct irdma_puda_rsrc *ieq, struct irdma_sc_qp *qp, struct irdma_puda_buf *buf) { … } /** * irdma_ieq_receive - received exception buffer * @vsi: VSI of device * @buf: exception buffer received */ static void irdma_ieq_receive(struct irdma_sc_vsi *vsi, struct irdma_puda_buf *buf) { … } /** * irdma_ieq_tx_compl - put back after sending completed exception buffer * @vsi: sc VSI struct * @sqwrid: pointer to puda buffer */ static void irdma_ieq_tx_compl(struct irdma_sc_vsi *vsi, void *sqwrid) { … } /** * irdma_ieq_cleanup_qp - qp is being destroyed * @ieq: ieq resource * @qp: all pending fpdu buffers */ void irdma_ieq_cleanup_qp(struct irdma_puda_rsrc *ieq, struct irdma_sc_qp *qp) { … }