/* * Copyright (c) 2001-2005 Mellanox Technologies LTD. All rights reserved. * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ /* * mad.h - * Header file for common special QP resources creation code. * * Creation date: * * Version: osmt_mtl_regular_qp.h,v 1.2 2003/03/20 16:05:10 eitan * * Authors: * Elazar Raab * * Changes: */ #ifndef H_MAD_H #define H_MAD_H #include #include #include #include #if defined(MAD_IN) || defined(MAD_OUT) #error MACROS MAD_IN and MAD_OUT are in use, do not override #endif #define MAD_IN #define MAD_OUT /* HCA Constants */ #define HCA_ID "mt21108_pci0" #define GRH_LEN 40 #define KNOWN_QP1_QKEY 0x80010000 #define MAX_OUTS_SQ 2 /* Max. buffers posted for requests in SQ */ #define MAX_OUTS_RQ 5 /* Max. buffers posted for responses in RQ */ #define MAX_POLL_CNT 300 #define POLL_SLEEP 1 /* for usleep */ #define MAD_SIZE 256 /* MADs are always 256B */ #define MAD_ATTR_OFFSET 16 #define MAD_TID_OFFSET 8 /* Verbs SQP resources handles */ typedef struct { VAPI_hca_id_t hca_id; /*id of HCA */ u_int8_t port_num; /* the port num to use */ VAPI_hca_hndl_t hca_hndl; /*handle of HCA */ VAPI_qp_hndl_t qp_hndl; /*handle of QP I use */ VAPI_mr_hndl_t mr_hndl; /*handle of memory region */ VAPI_cq_hndl_t rq_cq_hndl, sq_cq_hndl; /*handle of send & receive completion Queues */ VAPI_pd_hndl_t pd_hndl; /*handle of Partition Domain */ /* VAPI_ud_av_hndl_t av_hndl; */ IB_lid_t slid; /*LID*/ void *buf_ptr; /*mem buffer for outstanding pkts */ MT_size_t buf_size; /*size of mem buffer for outstanding pkts */ u_int32_t max_outs_sq; /*max # of outstanding pkts in send queue */ u_int32_t max_outs_rq; /*max # of outstanding pkts in receive queue */ IB_rkey_t l_key; /*my l_key for memory regions */ VAPI_qkey_t qkey; /*my qkey */ EVAPI_compl_handler_hndl_t rq_cq_eventh, sq_cq_eventh; /* event handlers for polling */ bool is_sqp; /* relate to union below - my QP */ union { VAPI_special_qp_t sqp_type; VAPI_qp_num_t qp_num; } qp_id; void *wait_q; } osmt_mtl_mad_res_t; /* init an osmt_mtl_mad_res_t with all resources initialized (use functions below) */ VAPI_ret_t osmt_mtl_init(osmt_mtl_mad_res_t * res /*pointer to res (resources) struct */ ); VAPI_ret_t osmt_mtl_init_opened_hca(osmt_mtl_mad_res_t * res /*pointer to res (resources) struct */ ); /* Cleanup all resources of (which are valid) in res */ VAPI_ret_t osmt_mtl_mad_cleanup(osmt_mtl_mad_res_t * res /*pointer to res (resources) struct */ ); /* create CQs and QP as given in res->is_sqp (if TRUE, get special QP) */ VAPI_ret_t osmt_mtl_get_qp_resources(osmt_mtl_mad_res_t * res /*pointer to res (resources) struct */ ); /* move QP to RTS state */ VAPI_ret_t osmt_mtl_mad_qp_init(osmt_mtl_mad_res_t * res /*max number of outstanding packets allowed in send queue */ ); /* create and register res->buf_ptr */ VAPI_ret_t osmt_mtl_mad_create_mr(osmt_mtl_mad_res_t * res /*pointer to res (resources) struct */ ); VAPI_ret_t osmt_mtl_create_av(osmt_mtl_mad_res_t * res, /* pointer to res (resources) struct */ int16_t dlid, /*destination lid */ VAPI_ud_av_hndl_t * avh_p /* address vectr handle to update */ ); /* Send MAD to given dest QP*/ VAPI_ret_t osmt_mtl_mad_send(osmt_mtl_mad_res_t * res, /*pointer to res (resources) struct */ VAPI_wr_id_t id, /*wqe ID */ void *mad, /*mad buffer to send */ VAPI_qp_num_t dest_qp, /*destination QP */ IB_sl_t sl, /*Service Level */ u_int32_t dest_qkey, /*Destination QP KEY */ VAPI_ud_av_hndl_t avh /* address vectr handle to use */ ); /* post buffers to RQ. returns num of buffers actually posted */ int osmt_mtl_mad_post_recv_bufs(osmt_mtl_mad_res_t * res, /*pointer to res (resources) struct */ void *buf_array, /*array of receive buffers */ u_int32_t num_o_bufs, /*number of receive buffers */ u_int32_t size, /* size of expected receive packet - MAD */ VAPI_wr_id_t start_id /* start id for receive buffers */ ); /* Poll given CQ for completion max_poll times (POLL_SLEEP [usec] delays). result in wc_desc_p. */ VAPI_ret_t osmt_mtl_mad_poll4cqe(VAPI_hca_hndl_t hca, /*handle for HCA */ VAPI_cq_hndl_t cq, /*handle for Completion Queue - Rcv/Send */ VAPI_wc_desc_t * wc_desc_p, /*handle of cqe */ u_int32_t max_poll, /*number of polling iterations */ u_int32_t poll_sleep, /*timeout for each polling */ VAPI_ud_av_hndl_t * avh_p /* address vectopr handle to cleanup */ ); #endif