9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Use is subject to license terms.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PURPOSE: Memory management
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Description: Interfaces in this file are completely described in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the DAPL 1.1 API, Chapter 6, section 6
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * $Id: dapl_rmr_bind.c,v 1.14 2003/07/11 18:23:31 jlentini Exp $
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Function Prototypes
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Function Definitions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * if the ep in unconnected return an error. IB requires that the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * QP be connected to change a memory window binding since:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * - memory window bind operations are WQEs placed on a QP's
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * send queue
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * - QP's only process WQEs on the send queue when the QP is in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the RTS state
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_mr_get_address(lmr->param.region_desc, lmr->param.mem_type),
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* If the LMR, RMR, and EP are not in the same PZ, there is an error */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((ep_ptr->param.pz_handle != lmr->param.pz_handle) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep_ptr->param.pz_handle != rmr->param.pz_handle)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr->param.ep_attr.request_completion_flags, completion_flags) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr->param.ep_attr.request_completion_flags, completion_flags) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr->param.ep_attr.request_completion_flags, completion_flags)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_rmr_cookie_alloc(&ep_ptr->req_buffer,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* if the RMR was previously bound */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_atomic_dec(&rmr->lmr->lmr_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != rmr_context) { *rmr_context = rmr->param.rmr_context; }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * if the ep in unconnected return an error. IB requires that the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * QP be connected to change a memory window binding since:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * - memory window bind operations are WQEs placed on a QP's
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * send queue
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * - QP's only process WQEs on the send queue when the QP is in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the RTS state
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* If the RMR and EP are not in the same PZ, there is an error */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_ptr->param.pz_handle != rmr->param.pz_handle) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr->param.ep_attr.request_completion_flags, completion_flags) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr->param.ep_attr.request_completion_flags, completion_flags) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr->param.ep_attr.request_completion_flags, completion_flags)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_rmr_cookie_alloc(&ep_ptr->req_buffer, rmr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_ib_mw_unbind(rmr, lmr_triplet->lmr_context,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* if the RMR was previously bound */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_atomic_dec(&rmr->lmr->lmr_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_rmr_bind
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAPL Requirements Version xxx, 6.6.4.4
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Bind the RMR to the specified memory region within the LMR and
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * provide a new rmr_context value.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* if the rmr should be bound */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else { /* the rmr should be unbound */