root/usr/src/uts/common/sys/ib/clients/rds/rdsib_ib.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */
/*
 * Copyright (c) 2005 SilverStorm Technologies, Inc. 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.
 *
 */
/*
 * Sun elects to include this software in Sun product
 * under the OpenIB BSD license.
 *
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _RDSIB_IB_H
#define _RDSIB_IB_H

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/types.h>
#include <sys/ib/ibtl/ibti.h>
#include "rdsib_debug.h"
#include "rdsib_protocol.h"

/*
 * Global Configuration Variables
 * As defined in RDS proposal
 */
extern uint_t           MaxNodes;
extern uint_t           UserBufferSize;
extern uint_t           RdsPktSize;
extern uint_t           NDataRX;
extern uint_t           MaxDataSendBuffers;
extern uint_t           MaxDataRecvBuffers;
extern uint_t           MaxCtrlSendBuffers;
extern uint_t           MaxCtrlRecvBuffers;
extern uint_t           DataRecvBufferLWM;
extern uint_t           CtrlRecvBufferLWM;
extern uint_t           PendingRxPktsHWM;
extern uint_t           MinRnrRetry;
extern uint8_t          IBPathRetryCount;
extern uint8_t          IBPktLifeTime;

#ifdef DEBUG
extern uint32_t         rdsdbglvl;
#else
extern uint32_t         rdsdbglvl;
#endif

/* performance tunables */
extern uint_t           rds_no_interrupts;
extern uint_t           rds_poll_percent_full;
extern uint_t           rds_wc_signal;
extern uint_t           rds_waittime_ms;

/* loopback port map */
#define                 RDS_PORT_MAP_SIZE       8192
extern krwlock_t        rds_loopback_portmap_lock;
extern uint8_t          rds_loopback_portmap[RDS_PORT_MAP_SIZE];

extern ddi_taskq_t      *rds_taskq;
extern uint_t           rds_rx_pkts_pending_hwm; /* readonly */

/* Number of WCs to poll in a single call */
#define RDS_NUM_DATA_SEND_WCS   10
#define RDS_RDMAW_WRID  0xdabadaba
#define RDS_NUM_ACKS    4 /* only 1 is used */

typedef enum rds_hca_state_s {
        RDS_HCA_STATE_ADDED             = 0,
        RDS_HCA_STATE_OPEN              = 1,
        RDS_HCA_STATE_MEM_REGISTERED    = 2,
        RDS_HCA_STATE_STOPPING          = 3,
        RDS_HCA_STATE_REMOVED           = 4
} rds_hca_state_t;

/*
 * There is one of this structure for each HCA in the system.
 * This holds all the information about the HCA.
 *
 * hca_nextp - Points to the next hca in the system.
 * hca_state - State of the hca (only modified on HCA attach/detach)
 * hca_guid - HCA Guid
 * hca_nports - Number of ports on the HCA
 * hca_hdl - HCA hdl obtained after opening the HCA
 * hca_pdhdl - PD hdl
 * hca_lkey - LKey for the registered global receive buffer pool memory
 * hca_rkey - Rkey for the registered global receive buffer pool memory
 * hca_attrp - HCA attributes
 * hca_pinfop - ptr to portinfo data, allocated by ibtf
 * hca_pinfo_sz - Sizeof of portinfo data
 */
typedef struct rds_hca_s {
        struct rds_hca_s        *hca_nextp;
        rds_hca_state_t         hca_state;
        ib_guid_t               hca_guid;
        uint_t                  hca_nports;
        ibt_hca_hdl_t           hca_hdl;
        ibt_pd_hdl_t            hca_pdhdl;
        ibt_mr_hdl_t            hca_mrhdl;
        ibt_lkey_t              hca_lkey;
        ibt_rkey_t              hca_rkey;
        ibt_sbind_hdl_t         hca_bindhdl[4];
        ibt_hca_attr_t          hca_attr;
        ibt_hca_portinfo_t      *hca_pinfop;
        uint_t                  hca_pinfo_sz;
} rds_hca_t;

/*
 * RDS Soft State
 * NOTE: Only one soft state per driver and NOT per instance.
 *
 * sessionlock - protects the rds_session_t:session_nextp, this lock has
 *      to be taken for read/write acess of the sessions list.
 * nsessions - Number of sessions in sessionlist
 * sessionlistp - Pointer to the first session.
 * ibhdl - Clnt handle acquired after registering with IBTF
 * nhcas - Number of HCAs initialized. This is also the number of rds_hca_t
 *      structures in the rds_hcalistp.
 * hcalistp - list of rds_hca_t.
 * srvhdl - RDS service handle
 */
typedef struct rds_state_s {
        krwlock_t               rds_sessionlock;
        uint_t                  rds_nsessions;
        struct rds_session_s    *rds_sessionlistp;
        ibt_clnt_hdl_t          rds_ibhdl;
        krwlock_t               rds_hca_lock;
        uint_t                  rds_nhcas;
        rds_hca_t               *rds_hcalistp;
        ibt_srv_hdl_t           rds_srvhdl;
        ib_svc_id_t             rds_service_id;
} rds_state_t;

extern rds_state_t      *rdsib_statep; /* global */

/* defined in rds_cm.c */
ibt_srv_hdl_t rds_register_service(ibt_clnt_hdl_t rds_ibhdl);
int rds_bind_service(struct rds_state_s *statep);

/* defined in rds_ib.c */
void rds_recvcq_handler(ibt_cq_hdl_t cq, void *);
rds_hca_t *rds_gid_to_hcap(rds_state_t *statep, ib_gid_t gid);
rds_hca_t *rds_get_hcap(rds_state_t *statep, ib_guid_t guid);
int rdsib_initialize_ib();
void rdsib_deinitialize_ib();

/* defined in rds_debug.c */
void rds_logging_initialization();
void rds_logging_destroy();

#ifdef __cplusplus
}
#endif

#endif  /* _RDSIB_IB_H */