93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * CDDL HEADER START
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * The contents of this file are subject to the terms of the
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Common Development and Distribution License (the "License").
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * You may not use this file except in compliance with the License.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * or http://www.opensolaris.org/os/licensing.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * See the License for the specific language governing permissions
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * and limitations under the License.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * When distributing Covered Code, include this CDDL HEADER in each
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * If applicable, add the following below this CDDL HEADER, with the
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * fields enclosed by brackets "[]" replaced with your own identifying
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * information: Portions Copyright [yyyy] [name of copyright owner]
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * CDDL HEADER END
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Copyright (c) 1990 Mentat Inc. */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * An implementation of the IPoIB-CM standard based on PSARC 2009/593.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/types.h>
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/conf.h>
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/ddi.h>
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/sunddi.h>
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/modctl.h>
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/stropts.h>
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/stream.h>
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/strsun.h>
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/strsubr.h>
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/dlpi.h>
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/mac_provider.h>
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/pattr.h> /* for HCK_FULLCKSUM */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/atomic.h> /* for atomic_add*() */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/ethernet.h> /* for ETHERTYPE_IP */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <netinet/in.h> /* for netinet/ip.h below */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <netinet/ip.h> /* for struct ip */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <inet/common.h> /* for inet/ip.h below */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <inet/ip.h> /* for ipha_t */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <inet/ip_if.h> /* for ETHERTYPE_IPV6 */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <inet/ip6.h> /* for ip6_t */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <netinet/icmp6.h> /* for icmp6_t */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#include <sys/ib/clients/ibd/ibd.h>
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing Chinaextern ibd_global_state_t ibd_gstate;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing Chinaextern int ibd_rc_conn_timeout;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinauint_t ibd_rc_tx_softintr = 1;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * If the number of WRs in receive queue of each RC connection less than
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * IBD_RC_RX_WR_THRESHOLD, we will post more receive WRs into it.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#define IBD_RC_RX_WR_THRESHOLD 0x20
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * If the number of free SWQEs (or large Tx buf) is larger than or equal to
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * IBD_RC_TX_FREE_THRESH, we will call mac_tx_update to notify GLD to continue
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * transmitting packets.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#define IBD_RC_TX_FREE_THRESH 8
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#define IBD_RC_QPN_TO_SID(qpn) \
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ((uint64_t)(IBD_RC_SERVICE_ID | ((qpn) & 0xffffff)))
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* For interop with legacy OFED */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#define IBD_RC_QPN_TO_SID_OFED_INTEROP(qpn) \
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ((uint64_t)(IBD_RC_SERVICE_ID_OFED_INTEROP | ((qpn) & 0xffffff)))
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Internet Header + 64 bits of Data Datagram. Refer to RFC 792 */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#define IBD_RC_IP_ICMP_RETURN_DATA_BYTES 64
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Functions for Reliable Connected Mode */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Connection Setup/Close Functions */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic ibt_cm_status_t ibd_rc_dispatch_pass_mad(void *,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_event_t *, ibt_cm_return_args_t *, void *, ibt_priv_data_len_t);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic ibt_cm_status_t ibd_rc_dispatch_actv_mad(void *,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_event_t *, ibt_cm_return_args_t *, void *, ibt_priv_data_len_t);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing Chinastatic void ibd_rc_act_close(ibd_rc_chan_t *, boolean_t);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic inline void ibd_rc_add_to_chan_list(ibd_rc_chan_list_t *,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic inline ibd_rc_chan_t *ibd_rc_rm_header_chan_list(
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_list_t *);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing Chinastatic inline ibd_rc_chan_t *ibd_rc_rm_from_chan_list(ibd_rc_chan_list_t *,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* CQ handlers */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void ibd_rc_rcq_handler(ibt_cq_hdl_t, void *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void ibd_rc_scq_handler(ibt_cq_hdl_t, void *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void ibd_rc_poll_rcq(ibd_rc_chan_t *, ibt_cq_hdl_t);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Receive Functions */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic int ibd_rc_post_srq(ibd_state_t *, ibd_rwqe_t *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void ibd_rc_srq_freemsg_cb(char *);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing Chinastatic void ibd_rc_srq_free_rwqe(ibd_state_t *, ibd_rwqe_t *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic int ibd_rc_post_rwqe(ibd_rc_chan_t *, ibd_rwqe_t *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void ibd_rc_freemsg_cb(char *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void ibd_rc_process_rx(ibd_rc_chan_t *, ibd_rwqe_t *, ibt_wc_t *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void ibd_rc_free_rwqe(ibd_rc_chan_t *, ibd_rwqe_t *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void ibd_rc_fini_rxlist(ibd_rc_chan_t *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Send Functions */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void ibd_rc_release_swqe(ibd_rc_chan_t *, ibd_swqe_t *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic int ibd_rc_init_txlist(ibd_rc_chan_t *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void ibd_rc_fini_txlist(ibd_rc_chan_t *);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic uint_t ibd_rc_tx_recycle(caddr_t);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_async_rc_close_act_chan(ibd_state_t *state, ibd_req_t *req)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *rc_chan = req->rq_ptr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_ace_t *ace;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China while (rc_chan != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace = rc_chan->ace;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Close old RC channel */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_rc_act_close(rc_chan, B_TRUE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_ac_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_ref != 0);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China atomic_dec_32(&ace->ac_ref);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_chan = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if ((ace->ac_ref == 0) || (ace->ac_ref == CYCLEVAL)) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBD_ACACHE_INSERT_FREE(state, ace);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_ref = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_ref |= CYCLEVAL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_delay_ace_recycle++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_ac_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_chan = ibd_rc_rm_header_chan_list(
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China &state->rc_obs_act_chan_list);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_async_rc_recycle_ace(ibd_state_t *state, ibd_req_t *req)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_ace_t *ace = req->rq_ptr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *rc_chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_chan = ace->ac_chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(rc_chan != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Close old RC channel */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_rc_act_close(rc_chan, B_TRUE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_ac_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_ref != 0);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China atomic_dec_32(&ace->ac_ref);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_chan = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if ((ace->ac_ref == 0) || (ace->ac_ref == CYCLEVAL)) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBD_ACACHE_INSERT_FREE(state, ace);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_ref = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_ref |= CYCLEVAL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_delay_ace_recycle++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_ac_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_ace_recycle_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_ace_recycle = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_ace_recycle_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Simple ICMP IP Header Template */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic const ipha_t icmp_ipha = {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IP_SIMPLE_HDR_VERSION, 0, 0, 0, 0, 0, IPPROTO_ICMP
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China};
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Packet is too big. Send ICMP packet to GLD to request a smaller MTU */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_async_rc_process_too_big(ibd_state_t *state, ibd_req_t *req)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mblk_t *mp = req->rq_ptr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_ace_t *ace = req->rq_ptr2;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint16_t mtu = state->id_mtu - IPOIB_HDRSIZE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t len_needed;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China size_t msg_len;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mblk_t *pmtu_mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ushort_t sap;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ib_header_info_t *ibha; /* ib header for pmtu_pkt */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * ipha: IP header for pmtu_pkt
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * old_ipha: IP header for old packet
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ipha_t *ipha, *old_ipha;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China icmph_t *icmph;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China sap = ntohs(((ipoib_hdr_t *)mp->b_rptr)->ipoib_type);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (!pullupmsg(mp, -1)) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_async_rc_process_too_big: pullupmsg fail");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China goto too_big_fail;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* move to IP header. */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mp->b_rptr += IPOIB_HDRSIZE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China old_ipha = (ipha_t *)mp->b_rptr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China len_needed = IPH_HDR_LENGTH(old_ipha);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (old_ipha->ipha_protocol == IPPROTO_ENCAP) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China len_needed += IPH_HDR_LENGTH(((uchar_t *)old_ipha +
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China len_needed));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else if (old_ipha->ipha_protocol == IPPROTO_IPV6) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ip6_t *ip6h = (ip6_t *)((uchar_t *)old_ipha
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China + len_needed);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China len_needed += ip_hdr_length_v6(mp, ip6h);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China len_needed += IBD_RC_IP_ICMP_RETURN_DATA_BYTES;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China msg_len = msgdsize(mp);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (msg_len > len_needed) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) adjmsg(mp, len_needed - msg_len);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China msg_len = len_needed;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if ((pmtu_mp = allocb(sizeof (ib_header_info_t) + sizeof (ipha_t)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China + sizeof (icmph_t), BPRI_MED)) == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_async_rc_process_too_big: allocb fail");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China goto too_big_fail;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China pmtu_mp->b_cont = mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China pmtu_mp->b_wptr = pmtu_mp->b_rptr + sizeof (ib_header_info_t)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China + sizeof (ipha_t) + sizeof (icmph_t);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibha = (ib_header_info_t *)pmtu_mp->b_rptr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Fill IB header */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China bcopy(&state->id_macaddr, &ibha->ib_dst, IPOIB_ADDRL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * If the GRH is not valid, indicate to GLDv3 by setting
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * the VerTcFlow field to 0.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibha->ib_grh.ipoib_vertcflow = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibha->ipib_rhdr.ipoib_type = htons(sap);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibha->ipib_rhdr.ipoib_mbz = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Fill IP header */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ipha = (ipha_t *)&ibha[1];
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *ipha = icmp_ipha;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ipha->ipha_src = old_ipha->ipha_dst;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ipha->ipha_dst = old_ipha->ipha_src;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ipha->ipha_ttl = old_ipha->ipha_ttl;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China msg_len += sizeof (icmp_ipha) + sizeof (icmph_t);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (msg_len > IP_MAXPACKET) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(state, "ibd_rc_process_too_big_pkt: msg_len(%d) "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "> IP_MAXPACKET", (uint32_t)msg_len);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) adjmsg(mp, IP_MAXPACKET - msg_len);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China msg_len = IP_MAXPACKET;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ipha->ipha_length = htons((uint16_t)msg_len);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ipha->ipha_hdr_checksum = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ipha->ipha_hdr_checksum = (uint16_t)ip_csum_hdr(ipha);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Fill ICMP body */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China icmph = (icmph_t *)&ipha[1];
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China bzero(icmph, sizeof (icmph_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China icmph->icmph_type = ICMP_DEST_UNREACHABLE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China icmph->icmph_code = ICMP_FRAGMENTATION_NEEDED;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China icmph->icmph_du_mtu = htons(mtu);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China icmph->icmph_checksum = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China icmph->icmph_checksum = IP_CSUM(pmtu_mp,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (int32_t)sizeof (ib_header_info_t) + (int32_t)sizeof (ipha_t), 0);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) hcksum_assoc(pmtu_mp, NULL, NULL, 0, 0, 0, 0,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China HCK_FULLCKSUM | HCK_FULLCKSUM_OK, 0);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_async_rc_process_too_big: sap=0x%x, ip_src=0x%x, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ip_dst=0x%x, ttl=%d, len_needed=%d, msg_len=%d",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China sap, ipha->ipha_src, ipha->ipha_dst, ipha->ipha_ttl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China len_needed, (uint32_t)msg_len);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mac_rx(state->id_mh, state->id_rh, pmtu_mp);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&ace->tx_too_big_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->tx_too_big_ongoing = B_FALSE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&ace->tx_too_big_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinatoo_big_fail:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Drop packet */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China freemsg(mp);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&ace->tx_too_big_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->tx_too_big_ongoing = B_FALSE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&ace->tx_too_big_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China/*
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * Check all active/passive channels. If any ative/passive
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * channel has not been used for a long time, close it.
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing Chinavoid
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing Chinaibd_rc_conn_timeout_call(void *carg)
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China{
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_state_t *state = carg;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_ace_t *ace, *pre_ace;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *chan, *pre_chan, *next_chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_req_t *req;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China /* Check all active channels. If chan->is_used == B_FALSE, close it */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_ac_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ace = list_head(&state->id_ah_active);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China while ((pre_ace = ace) != NULL) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ace = list_next(&state->id_ah_active, ace);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (pre_ace->ac_chan != NULL) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan = pre_ace->ac_chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ASSERT(state->id_enable_rc == B_TRUE);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (chan->chan_state == IBD_RC_STATE_ACT_ESTAB) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (chan->is_used == B_FALSE) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->rc_timeout_act++;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China INC_REF(pre_ace, 1);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China IBD_ACACHE_PULLOUT_ACTIVE(state,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China pre_ace);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->chan_state =
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China IBD_RC_STATE_ACT_CLOSING;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_rc_signal_act_close(state, pre_ace);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China } else {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->is_used = B_FALSE;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_ac_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China /* Check all passive channels. If chan->is_used == B_FALSE, close it */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_pass_chan_list.chan_list_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China next_chan = state->rc_pass_chan_list.chan_list;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China pre_chan = NULL;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China while ((chan = next_chan) != NULL) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China next_chan = chan->next;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (chan->is_used == B_FALSE) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China req = kmem_cache_alloc(state->id_req_kmc, KM_NOSLEEP);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (req != NULL) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China /* remove it */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->rc_timeout_pas++;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China req->rq_ptr = chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_queue_work_slot(state, req,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China IBD_ASYNC_RC_CLOSE_PAS_CHAN);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China } else {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_print_warn(state, "ibd_rc_conn_timeout: "
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "alloc ibd_req_t fail");
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (pre_chan == NULL) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->rc_pass_chan_list.chan_list =
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China } else {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China pre_chan->next = chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China pre_chan = chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China } else {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (pre_chan == NULL) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->rc_pass_chan_list.chan_list = chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China } else {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China pre_chan->next = chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China pre_chan = chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->is_used = B_FALSE;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (pre_chan != NULL) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China pre_chan->next = NULL;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China } else {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->rc_pass_chan_list.chan_list = NULL;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_pass_chan_list.chan_list_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_timeout_lock);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (state->rc_timeout_start == B_TRUE) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->rc_timeout = timeout(ibd_rc_conn_timeout_call, state,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China SEC_TO_TICK(ibd_rc_conn_timeout));
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_timeout_lock);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China}
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#ifdef DEBUG
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * ibd_rc_update_stats - update driver private kstat counters
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * This routine will dump the internal statistics counters for ibd's
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Reliable Connected Mode. The current stats dump values will
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * be sent to the kernel status area.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic int
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_update_stats(kstat_t *ksp, int rw)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_stat_t *ibd_rc_ksp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (rw == KSTAT_WRITE)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (EACCES);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state = (ibd_state_t *)ksp->ks_private;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(state != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp = (ibd_rc_stat_t *)ksp->ks_data;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_rcv_trans_byte.value.ul = state->rc_rcv_trans_byte;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_rcv_trans_pkt.value.ul = state->rc_rcv_trans_pkt;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_rcv_copy_byte.value.ul = state->rc_rcv_copy_byte;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_rcv_copy_pkt.value.ul = state->rc_rcv_copy_pkt;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_rcv_alloc_fail.value.ul = state->rc_rcv_alloc_fail;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_rcq_err.value.ul = state->rc_rcq_err;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_rwqe_short.value.ul = state->rc_rwqe_short;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_xmt_bytes.value.ul = state->rc_xmt_bytes;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_xmt_small_pkt.value.ul = state->rc_xmt_small_pkt;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_xmt_fragmented_pkt.value.ul =
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_xmt_fragmented_pkt;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_xmt_map_fail_pkt.value.ul = state->rc_xmt_map_fail_pkt;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_xmt_map_succ_pkt.value.ul = state->rc_xmt_map_succ_pkt;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_ace_not_found.value.ul = state->rc_ace_not_found;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_scq_no_swqe.value.ul = state->rc_scq_no_swqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_scq_no_largebuf.value.ul = state->rc_scq_no_largebuf;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_swqe_short.value.ul = state->rc_swqe_short;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_swqe_mac_update.value.ul = state->rc_swqe_mac_update;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_xmt_buf_short.value.ul = state->rc_xmt_buf_short;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_xmt_buf_mac_update.value.ul =
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_xmt_buf_mac_update;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_conn_succ.value.ul = state->rc_conn_succ;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_conn_fail.value.ul = state->rc_conn_fail;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_null_conn.value.ul = state->rc_null_conn;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_no_estab_conn.value.ul = state->rc_no_estab_conn;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_act_close.value.ul = state->rc_act_close;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_pas_close.value.ul = state->rc_pas_close;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_delay_ace_recycle.value.ul = state->rc_delay_ace_recycle;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_act_close_simultaneous.value.ul =
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_act_close_simultaneous;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_reset_cnt.value.ul = state->rc_reset_cnt;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_timeout_act.value.ul = state->rc_timeout_act;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_rc_ksp->rc_timeout_pas.value.ul = state->rc_timeout_pas;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (0);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * ibd_rc_init_stats - initialize kstat data structures
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * This routine will create and initialize the driver private
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * statistics counters.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaint
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_init_stats(ibd_state_t *state)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_t *ksp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_stat_t *ibd_rc_ksp;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China char stat_name[KSTAT_STRLEN];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int inst;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Create and init kstat
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala inst = ddi_get_instance(state->id_dip);
fcfc878b917d4c5ca9d1d067c725cc529a551ac3Pavan Chandrashekar (void) snprintf(stat_name, KSTAT_STRLEN, "statistics%d_%x_%u", inst,
fcfc878b917d4c5ca9d1d067c725cc529a551ac3Pavan Chandrashekar state->id_pkey, state->id_plinkid);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ksp = kstat_create("ibd", 0, stat_name, "net", KSTAT_TYPE_NAMED,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China sizeof (ibd_rc_stat_t) / sizeof (kstat_named_t), 0);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ksp == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(state, "ibd_rc_init_stats: Could not create "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "kernel statistics");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_ksp = ksp; /* Fill in the ksp of ibd over RC mode */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_ksp = (ibd_rc_stat_t *)ksp->ks_data;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Initialize all the statistics
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_rcv_trans_byte, "RC: Rx Bytes, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "transfer mode", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_rcv_trans_pkt, "RC: Rx Pkts, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "transfer mode", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_rcv_copy_byte, "RC: Rx Bytes, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "copy mode", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_rcv_copy_pkt, "RC: Rx Pkts, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "copy mode", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_rcv_alloc_fail, "RC: Rx alloc fail",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_rcq_err, "RC: fail in Recv CQ handler",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_rwqe_short, "RC: Short rwqe",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_xmt_bytes, "RC: Sent Bytes",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_xmt_small_pkt,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "RC: Tx pkt small size", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_xmt_fragmented_pkt,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "RC: Tx pkt fragmentary", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_xmt_map_fail_pkt,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "RC: Tx pkt fail ibt_map_mem_iov()", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_xmt_map_succ_pkt,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "RC: Tx pkt succ ibt_map_mem_iov()", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_ace_not_found, "RC: ace not found",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_scq_no_swqe, "RC: No swqe after "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "recycle", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_scq_no_largebuf, "RC: No large tx buf "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "after recycle", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_swqe_short, "RC: No swqe in ibd_send",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_swqe_mac_update, "RC: mac_tx_update "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "#, swqe available", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_xmt_buf_short, "RC: No buf in "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ibd_send", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_xmt_buf_mac_update, "RC: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "mac_tx_update #, buf available", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_conn_succ, "RC: succ connected",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_conn_fail, "RC: fail connect",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_null_conn, "RC: null conn for unicast "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "pkt", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_no_estab_conn, "RC: not in act estab "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "state", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_act_close, "RC: call ibd_rc_act_close",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_pas_close, "RC: call ibd_rc_pas_close",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_delay_ace_recycle, "RC: delay ace "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "recycle", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_act_close_simultaneous, "RC: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "simultaneous ibd_rc_act_close", KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_reset_cnt, "RC: Reset RC channel",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_act_close, "RC: timeout act side",
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China kstat_named_init(&ibd_rc_ksp->rc_pas_close, "RC: timeout pas side",
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China KSTAT_DATA_ULONG);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Function to provide kernel stat update on demand
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ksp->ks_update = ibd_rc_update_stats;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Pointer into provider's raw statistics
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ksp->ks_private = (void *)state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Add kstat to systems kstat chain
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kstat_install(ksp);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#endif
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic ibt_status_t
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_alloc_chan(ibd_rc_chan_t **ret_chan, ibd_state_t *state,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China boolean_t is_tx_chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status_t result;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_rc_chan_alloc_args_t alloc_args;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_chan_alloc_flags_t alloc_flags;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_chan_sizes_t sizes;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cq_attr_t cq_atts;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int rv;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan = kmem_zalloc(sizeof (ibd_rc_chan_t), KM_SLEEP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->state = state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_init(&chan->rx_wqe_list.dl_mutex, NULL, MUTEX_DRIVER, NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_init(&chan->rx_free_list.dl_mutex, NULL, MUTEX_DRIVER, NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_init(&chan->tx_wqe_list.dl_mutex, NULL, MUTEX_DRIVER, NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_init(&chan->tx_rel_list.dl_mutex, NULL, MUTEX_DRIVER, NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_init(&chan->tx_post_lock, NULL, MUTEX_DRIVER, NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_init(&chan->tx_poll_lock, NULL, MUTEX_DRIVER, NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Allocate IB structures for a new RC channel. */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (is_tx_chan) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala chan->scq_size = state->id_rc_num_swqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rcq_size = IBD_RC_MIN_CQ_SIZE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->scq_size = IBD_RC_MIN_CQ_SIZE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala chan->rcq_size = state->id_rc_num_rwqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China cq_atts.cq_size = chan->scq_size;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China cq_atts.cq_sched = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China cq_atts.cq_flags = IBT_CQ_NO_FLAGS;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China result = ibt_alloc_cq(state->id_hca_hdl, &cq_atts, &chan->scq_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China &chan->scq_size);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (result != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_alloc_chan: error <%d>"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "create scq completion queue (size <%d>)",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China result, chan->scq_size);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China goto alloc_scq_err;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } /* if failure to alloc cq */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibt_modify_cq(chan->scq_hdl, state->id_rc_tx_comp_count,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala state->id_rc_tx_comp_usec, 0) != IBT_SUCCESS) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_alloc_chan: Send CQ "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "interrupt moderation failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_set_cq_private(chan->scq_hdl, (void *) (uintptr_t)chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_set_cq_handler(chan->scq_hdl, ibd_rc_scq_handler,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void *) (uintptr_t)chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China cq_atts.cq_size = chan->rcq_size;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China cq_atts.cq_sched = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China cq_atts.cq_flags = IBT_CQ_NO_FLAGS;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China result = ibt_alloc_cq(state->id_hca_hdl, &cq_atts, &chan->rcq_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China &chan->rcq_size);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (result != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(state, "ibd_rc_alloc_chan: error <%d> creating "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "rx completion queue (size <%d>)", result, chan->rcq_size);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China goto alloc_rcq_err;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } /* if failure to alloc cq */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (ibt_modify_cq(chan->rcq_hdl, state->id_rc_rx_comp_count,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala state->id_rc_rx_comp_usec, 0) != IBT_SUCCESS) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_alloc_chan: Receive CQ "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "interrupt moderation failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_set_cq_private(chan->rcq_hdl, (void *) (uintptr_t)chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_set_cq_handler(chan->rcq_hdl, ibd_rc_rcq_handler,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void *)(uintptr_t)chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (is_tx_chan) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->is_tx_chan = B_TRUE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_init_txlist(chan) != DDI_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(state, "ibd_rc_alloc_chan: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ibd_rc_init_txlist failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China goto init_txlist_err;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_tx_softintr == 1) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if ((rv = ddi_add_softintr(state->id_dip,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DDI_SOFTINT_LOW, &chan->scq_softintr, NULL, NULL,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_tx_recycle, (caddr_t)chan)) !=
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DDI_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(10, "ibd_rc_alloc_chan: failed in "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ddi_add_softintr(scq_softintr), ret=%d",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rv);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China goto alloc_softintr_err;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->is_tx_chan = B_FALSE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * enable completions
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China result = ibt_enable_cq_notify(chan->scq_hdl, IBT_NEXT_COMPLETION);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (result != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(state, "ibd_rc_alloc_chan: ibt_enable_cq_notify"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "(scq) failed: status %d\n", result);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China goto alloc_scq_enable_err;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* We will enable chan->rcq_hdl later. */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* alloc a RC channel */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China bzero(&alloc_args, sizeof (ibt_rc_chan_alloc_args_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China bzero(&sizes, sizeof (ibt_chan_sizes_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_flags = IBT_WR_SIGNALED;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_control = IBT_CEP_NO_FLAGS;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_scq = chan->scq_hdl;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_rcq = chan->rcq_hdl;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_pd = state->id_pd_hdl;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_hca_port_num = state->id_port;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_clone_chan = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* scatter/gather */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_sizes.cs_sq_sgl = state->rc_tx_max_sqseg;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * For the number of SGL elements in receive side, I think it
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * should be 1. Because ibd driver allocates a whole block memory
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * for each ibt_post_recv().
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_sizes.cs_rq_sgl = 1;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* The send queue size and the receive queue size */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_sizes.cs_sq = chan->scq_size;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_sizes.cs_rq = chan->rcq_size;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->id_hca_res_lkey_capab) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_flags = IBT_FAST_REG_RES_LKEY;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_alloc_chan: not support reserved lkey");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_enable_srq) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_flags = IBT_ACHAN_USES_SRQ;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_args.rc_srq = state->rc_srq_hdl;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_flags = IBT_ACHAN_NO_FLAGS;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China result = ibt_alloc_rc_channel(state->id_hca_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China alloc_flags, &alloc_args, &chan->chan_hdl, &sizes);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (result != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(state, "ibd_rc_alloc_chan: ibd_rc_open_channel"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China " fail:<%d>", result);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China goto alloc_scq_enable_err;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (is_tx_chan)
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China atomic_inc_32(&state->rc_num_tx_chan);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China else
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China atomic_inc_32(&state->rc_num_rx_chan);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China /* For the connection reaper routine ibd_rc_conn_timeout_call() */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->is_used = B_TRUE;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *ret_chan = chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaalloc_scq_enable_err:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (is_tx_chan) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_tx_softintr == 1) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ddi_remove_softintr(chan->scq_softintr);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaalloc_softintr_err:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (is_tx_chan) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_fini_txlist(chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinainit_txlist_err:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) ibt_free_cq(chan->rcq_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaalloc_rcq_err:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) ibt_free_cq(chan->scq_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaalloc_scq_err:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_destroy(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_destroy(&chan->tx_post_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_destroy(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_destroy(&chan->tx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_destroy(&chan->rx_free_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_destroy(&chan->rx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(chan, sizeof (ibd_rc_chan_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (result);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_free_chan(ibd_rc_chan_t *chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status_t ret;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* DPRINT(30, "ibd_rc_free_chan: chan=%p", chan); */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->chan_hdl != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret = ibt_free_channel(chan->chan_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ret != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ib_rc_free_chan: ibt_free_channel failed, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "chan=%p, returned: %d", chan, ret);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->chan_hdl = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->rcq_hdl != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret = ibt_free_cq(chan->rcq_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ret != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ib_rc_free_chan: ibt_free_cq(rcq) failed, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "chan=%p, returned: %d", chan, ret);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rcq_hdl = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->scq_hdl != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret = ibt_free_cq(chan->scq_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ret != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ib_rc_free_chan: ibt_free_cq(scq) failed, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "chan=%p, returned: %d", chan, ret);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->scq_hdl = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Free buffers */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->is_tx_chan) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_fini_txlist(chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_tx_softintr == 1) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ddi_remove_softintr(chan->scq_softintr);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China atomic_dec_32(&chan->state->rc_num_tx_chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (!chan->state->rc_enable_srq) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_fini_rxlist(chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China atomic_dec_32(&chan->state->rc_num_rx_chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_destroy(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_destroy(&chan->tx_post_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_destroy(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_destroy(&chan->tx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_destroy(&chan->rx_free_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_destroy(&chan->rx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * If it is a passive channel, must make sure it has been removed
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * from chan->state->rc_pass_chan_list
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(chan, sizeof (ibd_rc_chan_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Add a RC channel */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic inline void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_add_to_chan_list(ibd_rc_chan_list_t *list, ibd_rc_chan_t *chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&list->chan_list_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (list->chan_list == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China list->chan_list = chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->next = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->next = list->chan_list;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China list->chan_list = chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&list->chan_list_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing Chinastatic boolean_t
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing Chinaibd_rc_re_add_to_pas_chan_list(ibd_rc_chan_t *chan)
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China{
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_state_t *state = chan->state;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_pass_chan_list.chan_list_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if ((state->id_mac_state & IBD_DRV_STARTED) == 0) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_pass_chan_list.chan_list_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China return (B_FALSE);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China } else {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (state->rc_pass_chan_list.chan_list == NULL) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->rc_pass_chan_list.chan_list = chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->next = NULL;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China } else {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->next = state->rc_pass_chan_list.chan_list;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->rc_pass_chan_list.chan_list = chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_pass_chan_list.chan_list_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China return (B_TRUE);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China}
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Remove a RC channel */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing Chinastatic inline ibd_rc_chan_t *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_rm_from_chan_list(ibd_rc_chan_list_t *list, ibd_rc_chan_t *chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *pre_chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&list->chan_list_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (list->chan_list == chan) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_rm_from_chan_list(first): found chan(%p)"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China " in chan_list", chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China list->chan_list = chan->next;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China pre_chan = list->chan_list;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China while (pre_chan != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (pre_chan->next == chan) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_rm_from_chan_list"
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "(middle): found chan(%p)", chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China pre_chan->next = chan->next;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China pre_chan = pre_chan->next;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (pre_chan == NULL)
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&list->chan_list_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China return (chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic inline ibd_rc_chan_t *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_rm_header_chan_list(ibd_rc_chan_list_t *list)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *rc_chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&list->chan_list_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_chan = list->chan_list;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (rc_chan != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China list->chan_list = rc_chan->next;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&list->chan_list_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (rc_chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic int
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_alloc_srq_copybufs(ibd_state_t *state)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_mr_attr_t mem_attr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t rc_rx_bufs_sz;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Allocate one big chunk for all regular rx copy bufs
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_rx_bufs_sz = (state->rc_mtu + IPOIB_GRH_SIZE) * state->rc_srq_size;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_rx_bufs = kmem_zalloc(rc_rx_bufs_sz, KM_SLEEP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_rwqes = kmem_zalloc(state->rc_srq_size *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China sizeof (ibd_rwqe_t), KM_SLEEP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Do one memory registration on the entire rxbuf area
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_vaddr = (uint64_t)(uintptr_t)state->rc_srq_rx_bufs;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_len = rc_rx_bufs_sz;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_as = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_flags = IBT_MR_SLEEP | IBT_MR_ENABLE_LOCAL_WRITE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_register_mr(state->id_hca_hdl, state->id_pd_hdl, &mem_attr,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China &state->rc_srq_rx_mr_hdl, &state->rc_srq_rx_mr_desc)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_alloc_srq_copybufs: ibt_register_mr() "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(state->rc_srq_rwqes,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_size * sizeof (ibd_rwqe_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(state->rc_srq_rx_bufs, rc_rx_bufs_sz);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_rx_bufs = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_rwqes = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_free_srq_copybufs(ibd_state_t *state)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t rc_rx_buf_sz;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Don't change the value of state->rc_mtu at the period from call
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * ibd_rc_alloc_srq_copybufs() to call ibd_rc_free_srq_copybufs().
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_rx_buf_sz = state->rc_mtu + IPOIB_GRH_SIZE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Unregister rxbuf mr
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_deregister_mr(state->id_hca_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_rx_mr_hdl) != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_free_srq_copybufs: ibt_deregister_mr()"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China " failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_rx_mr_hdl = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Free rxbuf memory
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(state->rc_srq_rwqes,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_size * sizeof (ibd_rwqe_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(state->rc_srq_rx_bufs, state->rc_srq_size * rc_rx_buf_sz);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_rwqes = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_rx_bufs = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Allocate and post a certain number of SRQ receive buffers and WRs.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaint
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_init_srq_list(ibd_state_t *state)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rwqe_t *rwqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_lkey_t lkey;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int i;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t len;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint8_t *bufaddr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_srq_sizes_t srq_sizes;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_srq_sizes_t srq_real_sizes;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status_t ret;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China srq_sizes.srq_sgl_sz = 1;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala srq_sizes.srq_wr_sz = state->id_rc_num_srq;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret = ibt_alloc_srq(state->id_hca_hdl, IBT_SRQ_NO_FLAGS,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->id_pd_hdl, &srq_sizes, &state->rc_srq_hdl, &srq_real_sizes);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ret != IBT_SUCCESS) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China /*
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * The following code is for CR 6932460 (can't configure ibd
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * interface on 32 bits x86 systems). 32 bits x86 system has
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * less memory resource than 64 bits x86 system. If current
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * resource request can't be satisfied, we request less
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * resource here.
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China len = state->id_rc_num_srq;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China while ((ret == IBT_HCA_WR_EXCEEDED) &&
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China (len >= 2 * IBD_RC_MIN_CQ_SIZE)) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China len = len/2;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China srq_sizes.srq_sgl_sz = 1;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China srq_sizes.srq_wr_sz = len;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ret = ibt_alloc_srq(state->id_hca_hdl,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China IBT_SRQ_NO_FLAGS, state->id_pd_hdl, &srq_sizes,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China &state->rc_srq_hdl, &srq_real_sizes);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (ret != IBT_SUCCESS) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China DPRINT(10, "ibd_rc_init_srq_list: ibt_alloc_srq failed."
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "req_sgl_sz=%d, req_wr_sz=0x%x, final_req_wr_sz="
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "0x%x, ret=%d", srq_sizes.srq_sgl_sz,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China srq_sizes.srq_wr_sz, len, ret);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->id_rc_num_srq = len;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->id_rc_num_rwqe = state->id_rc_num_srq + 1;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_size = srq_real_sizes.srq_wr_sz;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_alloc_srq_copybufs(state) != DDI_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret = ibt_free_srq(state->rc_srq_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ret != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(state, "ibd_rc_init_srq_list: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ibt_free_srq fail, ret=%d", ret);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Allocate and setup the rwqe list
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China lkey = state->rc_srq_rx_mr_desc.md_lkey;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe = state->rc_srq_rwqes;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China bufaddr = state->rc_srq_rx_bufs;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China len = state->rc_mtu + IPOIB_GRH_SIZE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_rwqe_list.dl_cnt = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_rwqe_list.dl_bufs_outstanding = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China for (i = 0; i < state->rc_srq_size; i++, rwqe++, bufaddr += len) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_state = state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_freeing_wqe = B_FALSE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_freemsg_cb.free_func = ibd_rc_srq_freemsg_cb;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_freemsg_cb.free_arg = (char *)rwqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_copybuf.ic_bufaddr = bufaddr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if ((rwqe->rwqe_im_mblk = desballoc(bufaddr, len, 0,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China &rwqe->w_freemsg_cb)) == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_init_srq_list : desballoc() failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_copybuf.ic_bufaddr = NULL;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China if (atomic_dec_32_nv(&state->id_running) != 0) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China cmn_err(CE_WARN, "ibd_rc_init_srq_list: "
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China "id_running was not 1\n");
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_fini_srq_list(state);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China atomic_inc_32(&state->id_running);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_copybuf.ic_sgl.ds_key = lkey;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Leave IPOIB_GRH_SIZE space */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_copybuf.ic_sgl.ds_va =
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (ib_vaddr_t)(uintptr_t)(bufaddr + IPOIB_GRH_SIZE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_copybuf.ic_sgl.ds_len = state->rc_mtu;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_rwr.wr_id = (ibt_wrid_t)(uintptr_t)rwqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_rwr.wr_nds = 1;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_rwr.wr_sgl = &rwqe->rwqe_copybuf.ic_sgl;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) ibd_rc_post_srq(state, rwqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_srq_free_list.dl_mutex);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China state->rc_srq_free_list.dl_head = NULL;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China state->rc_srq_free_list.dl_cnt = 0;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_srq_free_list.dl_mutex);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Free the statically allocated Rx buffer list for SRQ.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_fini_srq_list(ibd_state_t *state)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rwqe_t *rwqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int i;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status_t ret;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ASSERT(state->id_running == 0);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret = ibt_free_srq(state->rc_srq_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ret != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(state, "ibd_rc_fini_srq_list: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ibt_free_srq fail, ret=%d", ret);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_srq_rwqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe = state->rc_srq_rwqes;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China for (i = 0; i < state->rc_srq_size; i++, rwqe++) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (rwqe->rwqe_im_mblk != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_freeing_wqe = B_TRUE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China freemsg(rwqe->rwqe_im_mblk);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_srq_rwqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_free_srq_copybufs(state);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China/* Repost the elements in state->ib_rc_free_list */
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing Chinaint
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing Chinaibd_rc_repost_srq_free_list(ibd_state_t *state)
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China{
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibd_rwqe_t *rwqe;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibd_wqe_t *list;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China uint_t len;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_srq_free_list.dl_mutex);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China if (state->rc_srq_free_list.dl_head != NULL) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China /* repost them */
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China len = state->rc_mtu + IPOIB_GRH_SIZE;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China list = state->rc_srq_free_list.dl_head;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China state->rc_srq_free_list.dl_head = NULL;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China state->rc_srq_free_list.dl_cnt = 0;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_srq_free_list.dl_mutex);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China while (list != NULL) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China rwqe = WQE_TO_RWQE(list);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China if ((rwqe->rwqe_im_mblk == NULL) &&
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ((rwqe->rwqe_im_mblk = desballoc(
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China rwqe->rwqe_copybuf.ic_bufaddr, len, 0,
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China &rwqe->w_freemsg_cb)) == NULL)) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_repost_srq_free_list: "
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China "failed in desballoc()");
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China do {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibd_rc_srq_free_rwqe(state, rwqe);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China list = list->w_next;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China rwqe = WQE_TO_RWQE(list);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China } while (list != NULL);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China }
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China if (ibd_rc_post_srq(state, rwqe) == DDI_FAILURE) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibd_rc_srq_free_rwqe(state, rwqe);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China }
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China list = list->w_next;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China }
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China }
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_srq_free_list.dl_mutex);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China}
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Free an allocated recv wqe.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_srq_free_rwqe(ibd_state_t *state, ibd_rwqe_t *rwqe)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * desballoc() failed (no memory) or the posting of rwqe failed.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * This rwqe is placed on a free list so that it
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * can be reinstated in future.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * NOTE: no code currently exists to reinstate
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * these "lost" rwqes.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_srq_free_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_free_list.dl_cnt++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_next = state->rc_srq_free_list.dl_head;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_srq_free_list.dl_head = RWQE_TO_WQE(rwqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_srq_free_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_srq_freemsg_cb(char *arg)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rwqe_t *rwqe = (ibd_rwqe_t *)arg;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state = rwqe->w_state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(state->rc_enable_srq);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China * If the driver is stopped, just free the rwqe.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China if (atomic_add_32_nv(&state->id_running, 0) == 0) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China if (!rwqe->w_freeing_wqe) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China atomic_dec_32(
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China &state->rc_srq_rwqe_list.dl_bufs_outstanding);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China DPRINT(6, "ibd_rc_srq_freemsg_cb: wqe being freed");
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China rwqe->rwqe_im_mblk = NULL;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibd_rc_srq_free_rwqe(state, rwqe);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China atomic_dec_32(&state->rc_srq_rwqe_list.dl_bufs_outstanding);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(state->rc_srq_rwqe_list.dl_cnt < state->rc_srq_size);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ASSERT(!rwqe->w_freeing_wqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Upper layer has released held mblk, so we have
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * no more use for keeping the old pointer in
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * our rwqe.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_im_mblk = desballoc(rwqe->rwqe_copybuf.ic_bufaddr,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_mtu + IPOIB_GRH_SIZE, 0, &rwqe->w_freemsg_cb);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (rwqe->rwqe_im_mblk == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_srq_freemsg_cb: desballoc failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_srq_free_rwqe(state, rwqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_post_srq(state, rwqe) == DDI_FAILURE) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibd_print_warn(state, "ibd_rc_srq_freemsg_cb: ibd_rc_post_srq"
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China " failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_srq_free_rwqe(state, rwqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Post a rwqe to the hardware and add it to the Rx list.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic int
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_post_srq(ibd_state_t *state, ibd_rwqe_t *rwqe)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Here we should add dl_cnt before post recv, because
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * we would have to make sure dl_cnt is updated before
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * the corresponding ibd_rc_process_rx() is called.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(state->rc_srq_rwqe_list.dl_cnt < state->rc_srq_size);
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_32(&state->rc_srq_rwqe_list.dl_cnt);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_post_srq(state->rc_srq_hdl, &rwqe->w_rwr, 1, NULL) !=
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China atomic_dec_32(&state->rc_srq_rwqe_list.dl_cnt);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_post_srq : ibt_post_srq() failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Post a rwqe to the hardware and add it to the Rx list.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic int
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_post_rwqe(ibd_rc_chan_t *chan, ibd_rwqe_t *rwqe)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Here we should add dl_cnt before post recv, because we would
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * have to make sure dl_cnt has already updated before
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * corresponding ibd_rc_process_rx() is called.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_32(&chan->rx_wqe_list.dl_cnt);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_post_recv(chan->chan_hdl, &rwqe->w_rwr, 1, NULL) !=
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China atomic_dec_32(&chan->rx_wqe_list.dl_cnt);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_post_rwqe : failed in ibt_post_recv()");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic int
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_alloc_rx_copybufs(ibd_rc_chan_t *chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state = chan->state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_mr_attr_t mem_attr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t rc_rx_bufs_sz;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Allocate one big chunk for all regular rx copy bufs
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_rx_bufs_sz = (state->rc_mtu + IPOIB_GRH_SIZE) * chan->rcq_size;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_bufs = kmem_zalloc(rc_rx_bufs_sz, KM_SLEEP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_rwqes = kmem_zalloc(chan->rcq_size *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China sizeof (ibd_rwqe_t), KM_SLEEP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Do one memory registration on the entire rxbuf area
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_vaddr = (uint64_t)(uintptr_t)chan->rx_bufs;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_len = rc_rx_bufs_sz;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_as = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_flags = IBT_MR_SLEEP | IBT_MR_ENABLE_LOCAL_WRITE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_register_mr(state->id_hca_hdl, state->id_pd_hdl, &mem_attr,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China &chan->rx_mr_hdl, &chan->rx_mr_desc) != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_alloc_srq_copybufs: ibt_register_mr failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(chan->rx_rwqes, chan->rcq_size * sizeof (ibd_rwqe_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(chan->rx_bufs, rc_rx_bufs_sz);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_bufs = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_rwqes = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_free_rx_copybufs(ibd_rc_chan_t *chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state = chan->state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t rc_rx_buf_sz;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(!state->rc_enable_srq);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(chan->rx_rwqes != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(chan->rx_bufs != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Don't change the value of state->rc_mtu at the period from call
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * ibd_rc_alloc_rx_copybufs() to call ibd_rc_free_rx_copybufs().
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_rx_buf_sz = state->rc_mtu + IPOIB_GRH_SIZE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Unregister rxbuf mr
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_deregister_mr(state->id_hca_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_mr_hdl) != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_free_rx_copybufs: ibt_deregister_mr failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_mr_hdl = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Free rxbuf memory
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(chan->rx_rwqes, chan->rcq_size * sizeof (ibd_rwqe_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_rwqes = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(chan->rx_bufs, chan->rcq_size * rc_rx_buf_sz);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_bufs = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Post a certain number of receive buffers and WRs on a RC channel.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic int
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_init_rxlist(ibd_rc_chan_t *chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state = chan->state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rwqe_t *rwqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_lkey_t lkey;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int i;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t len;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint8_t *bufaddr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(!state->rc_enable_srq);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_alloc_rx_copybufs(chan) != DDI_SUCCESS)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Allocate and setup the rwqe list
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China lkey = chan->rx_mr_desc.md_lkey;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe = chan->rx_rwqes;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China bufaddr = chan->rx_bufs;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China len = state->rc_mtu + IPOIB_GRH_SIZE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China for (i = 0; i < chan->rcq_size; i++, rwqe++, bufaddr += len) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_state = state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_chan = chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_freeing_wqe = B_FALSE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_freemsg_cb.free_func = ibd_rc_freemsg_cb;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_freemsg_cb.free_arg = (char *)rwqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_copybuf.ic_bufaddr = bufaddr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if ((rwqe->rwqe_im_mblk = desballoc(bufaddr, len, 0,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China &rwqe->w_freemsg_cb)) == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_init_srq_list: desballoc() failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_copybuf.ic_bufaddr = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_fini_rxlist(chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_copybuf.ic_sgl.ds_key = lkey;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_copybuf.ic_sgl.ds_va =
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (ib_vaddr_t)(uintptr_t)(bufaddr + IPOIB_GRH_SIZE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_copybuf.ic_sgl.ds_len = state->rc_mtu;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_rwr.wr_id = (ibt_wrid_t)(uintptr_t)rwqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_rwr.wr_nds = 1;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_rwr.wr_sgl = &rwqe->rwqe_copybuf.ic_sgl;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) ibd_rc_post_rwqe(chan, rwqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Free the statically allocated Rx buffer list for SRQ.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_fini_rxlist(ibd_rc_chan_t *chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rwqe_t *rwqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int i;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->rx_bufs == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_fini_rxlist: empty chan->rx_bufs, quit");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* bufs_outstanding must be 0 */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT((chan->rx_wqe_list.dl_head == NULL) ||
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (chan->rx_wqe_list.dl_bufs_outstanding == 0));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->rx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe = chan->rx_rwqes;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China for (i = 0; i < chan->rcq_size; i++, rwqe++) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (rwqe->rwqe_im_mblk != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->w_freeing_wqe = B_TRUE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China freemsg(rwqe->rwqe_im_mblk);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->rx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_free_rx_copybufs(chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Free an allocated recv wqe.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_free_rwqe(ibd_rc_chan_t *chan, ibd_rwqe_t *rwqe)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * desballoc() failed (no memory) or the posting of rwqe failed.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * This rwqe is placed on a free list so that it
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * can be reinstated in future.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * NOTE: no code currently exists to reinstate
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * these "lost" rwqes.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->rx_free_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_free_list.dl_cnt++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_next = chan->rx_free_list.dl_head;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_free_list.dl_head = RWQE_TO_WQE(rwqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->rx_free_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Processing to be done after receipt of a packet; hand off to GLD
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * in the format expected by GLD.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_process_rx(ibd_rc_chan_t *chan, ibd_rwqe_t *rwqe, ibt_wc_t *wc)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state = chan->state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ib_header_info_t *phdr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ipoib_hdr_t *ipibp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mblk_t *mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mblk_t *mpc;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int rxcnt;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ip6_t *ip6h;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int len;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Track number handed to upper layer, and number still
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * available to receive packets.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_enable_srq) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rxcnt = atomic_dec_32_nv(&state->rc_srq_rwqe_list.dl_cnt);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rxcnt = atomic_dec_32_nv(&chan->rx_wqe_list.dl_cnt);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * It can not be a IBA multicast packet.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(!wc->wc_flags & IBT_WC_GRH_PRESENT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China /* For the connection reaper routine ibd_rc_conn_timeout_call() */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->is_used = B_TRUE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#ifdef DEBUG
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (rxcnt < state->id_rc_rx_rwqe_thresh) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_rwqe_short++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China#endif
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Possibly replenish the Rx pool if needed.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((rxcnt >= state->id_rc_rx_rwqe_thresh) &&
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (wc->wc_bytes_xfer > state->id_rc_rx_copy_thresh)) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China atomic_add_64(&state->rc_rcv_trans_byte, wc->wc_bytes_xfer);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China atomic_inc_64(&state->rc_rcv_trans_pkt);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Record how many rwqe has been occupied by upper
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * network layer
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_enable_srq) {
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_32(
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek &state->rc_srq_rwqe_list.dl_bufs_outstanding);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_32(&chan->rx_wqe_list.dl_bufs_outstanding);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mp = rwqe->rwqe_im_mblk;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China atomic_add_64(&state->rc_rcv_copy_byte, wc->wc_bytes_xfer);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China atomic_inc_64(&state->rc_rcv_copy_pkt);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if ((mp = allocb(wc->wc_bytes_xfer + IPOIB_GRH_SIZE,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China BPRI_HI)) == NULL) { /* no memory */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_process_rx: allocb() failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_rcv_alloc_fail++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_enable_srq) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_post_srq(state, rwqe) ==
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DDI_FAILURE) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_srq_free_rwqe(state, rwqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_post_rwqe(chan, rwqe) ==
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DDI_FAILURE) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_free_rwqe(chan, rwqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China bcopy(rwqe->rwqe_im_mblk->b_rptr + IPOIB_GRH_SIZE,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mp->b_wptr + IPOIB_GRH_SIZE, wc->wc_bytes_xfer);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_enable_srq) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_post_srq(state, rwqe) == DDI_FAILURE) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_srq_free_rwqe(state, rwqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_post_rwqe(chan, rwqe) == DDI_FAILURE) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_free_rwqe(chan, rwqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ipibp = (ipoib_hdr_t *)((uchar_t *)mp->b_rptr + IPOIB_GRH_SIZE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ntohs(ipibp->ipoib_type) == ETHERTYPE_IPV6) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ip6h = (ip6_t *)((uchar_t *)ipibp + sizeof (ipoib_hdr_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China len = ntohs(ip6h->ip6_plen);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ip6h->ip6_nxt == IPPROTO_ICMPV6) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* LINTED: E_CONSTANT_CONDITION */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBD_PAD_NSNA(ip6h, len, IBD_RECV);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China phdr = (ib_header_info_t *)mp->b_rptr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China phdr->ib_grh.ipoib_vertcflow = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ovbcopy(&state->id_macaddr, &phdr->ib_dst,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China sizeof (ipoib_mac_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mp->b_wptr = mp->b_rptr + wc->wc_bytes_xfer+ IPOIB_GRH_SIZE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Can RC mode in IB guarantee its checksum correctness?
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * (void) hcksum_assoc(mp, NULL, NULL, 0, 0, 0, 0,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * HCK_FULLCKSUM | HCK_FULLCKSUM_OK, 0);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Make sure this is NULL or we're in trouble.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (mp->b_next != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(state,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ibd_rc_process_rx: got duplicate mp from rcq?");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mp->b_next = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Add this mp to the list of processed mp's to send to
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * the nw layer
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_enable_srq) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_rx_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_rx_mp) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(state->rc_rx_mp_tail != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_rx_mp_tail->b_next = mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(state->rc_rx_mp_tail == NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_rx_mp = mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_rx_mp_tail = mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_rx_mp_len++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_rx_mp_len >= IBD_MAX_RX_MP_LEN) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mpc = state->rc_rx_mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_rx_mp = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_rx_mp_tail = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_rx_mp_len = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_rx_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mac_rx(state->id_mh, NULL, mpc);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_rx_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->rx_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->rx_mp) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(chan->rx_mp_tail != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_mp_tail->b_next = mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(chan->rx_mp_tail == NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_mp = mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_mp_tail = mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_mp_len++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->rx_mp_len >= IBD_MAX_RX_MP_LEN) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mpc = chan->rx_mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_mp = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_mp_tail = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_mp_len = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->rx_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mac_rx(state->id_mh, NULL, mpc);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->rx_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Callback code invoked from STREAMs when the recv data buffer is free
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * for recycling.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_freemsg_cb(char *arg)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rwqe_t *rwqe = (ibd_rwqe_t *)arg;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *chan = rwqe->w_chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state = rwqe->w_state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * If the wqe is being destructed, do not attempt recycling.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (rwqe->w_freeing_wqe == B_TRUE) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(!state->rc_enable_srq);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(chan->rx_wqe_list.dl_cnt < chan->rcq_size);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rwqe->rwqe_im_mblk = desballoc(rwqe->rwqe_copybuf.ic_bufaddr,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_mtu + IPOIB_GRH_SIZE, 0, &rwqe->w_freemsg_cb);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (rwqe->rwqe_im_mblk == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_freemsg_cb: desballoc() failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_free_rwqe(chan, rwqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Post back to h/w. We could actually have more than
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * id_num_rwqe WQEs on the list if there were multiple
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * ibd_freemsg_cb() calls outstanding (since the lock is
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * not held the entire time). This will start getting
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * corrected over subsequent ibd_freemsg_cb() calls.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_post_rwqe(chan, rwqe) == DDI_FAILURE) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_free_rwqe(chan, rwqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_dec_32(&chan->rx_wqe_list.dl_bufs_outstanding);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Common code for interrupt handling as well as for polling
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * for all completed wqe's while detaching.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_poll_rcq(ibd_rc_chan_t *chan, ibt_cq_hdl_t cq_hdl)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_wqe_t *wqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_wc_t *wc, *wcs;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t numwcs, real_numwcs;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int i;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China wcs = chan->rx_wc;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China numwcs = IBD_RC_MAX_CQ_WC;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China while (ibt_poll_cq(cq_hdl, wcs, numwcs, &real_numwcs) == IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China for (i = 0, wc = wcs; i < real_numwcs; i++, wc++) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China wqe = (ibd_wqe_t *)(uintptr_t)wc->wc_id;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (wc->wc_status != IBT_WC_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->state->rc_rcq_err++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Channel being torn down.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_poll_rcq: wc_status(%d) != "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "SUCC, chan=%p", wc->wc_status, chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (wc->wc_status == IBT_WC_WR_FLUSHED_ERR) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Do not invoke Rx handler because
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * it might add buffers to the Rx pool
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * when we are trying to deinitialize.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China continue;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_process_rx(chan, WQE_TO_RWQE(wqe), wc);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Receive CQ handler */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* ARGSUSED */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_rcq_handler(ibt_cq_hdl_t cq_hdl, void *arg)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *chan = (ibd_rc_chan_t *)arg;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state = chan->state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China atomic_inc_32(&chan->rcq_invoking);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(chan->chan_state == IBD_RC_STATE_PAS_ESTAB);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Poll for completed entries; the CQ will not interrupt any
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * more for incoming (or transmitted) packets.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_poll_rcq(chan, chan->rcq_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Now enable CQ notifications; all packets that arrive now
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * (or complete transmission) will cause new interrupts.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_enable_cq_notify(chan->rcq_hdl, IBT_NEXT_COMPLETION) !=
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * We do not expect a failure here.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_rcq_handler: ibt_enable_cq_notify() failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Repoll to catch all packets that might have arrived after
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * we finished the first poll loop and before interrupts got
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * armed.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_poll_rcq(chan, chan->rcq_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_enable_srq) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_rx_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_rx_mp != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mblk_t *mpc;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mpc = state->rc_rx_mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_rx_mp = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_rx_mp_tail = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_rx_mp_len = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_rx_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mac_rx(state->id_mh, NULL, mpc);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_rx_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->rx_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->rx_mp != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mblk_t *mpc;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mpc = chan->rx_mp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_mp = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_mp_tail = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->rx_mp_len = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->rx_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mac_rx(state->id_mh, NULL, mpc);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->rx_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China atomic_dec_32(&chan->rcq_invoking);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Allocate the statically allocated Tx buffer list.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaint
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_init_tx_largebuf_list(ibd_state_t *state)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_tx_largebuf_t *lbufp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_tx_largebuf_t *tail;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint8_t *memp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_mr_attr_t mem_attr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint32_t num_swqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China size_t mem_size;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int i;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala num_swqe = state->id_rc_num_swqe - 1;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Allocate one big chunk for all Tx large copy bufs
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Don't transfer IPOIB_GRH_SIZE bytes (40 bytes) */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_size = num_swqe * state->rc_mtu;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_tx_mr_bufs = kmem_zalloc(mem_size, KM_SLEEP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_len = mem_size;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_vaddr = (uint64_t)(uintptr_t)state->rc_tx_mr_bufs;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_as = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_flags = IBT_MR_SLEEP;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_register_mr(state->id_hca_hdl, state->id_pd_hdl, &mem_attr,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China &state->rc_tx_mr_hdl, &state->rc_tx_mr_desc) != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_init_tx_largebuf_list: ibt_register_mr "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(state->rc_tx_mr_bufs, mem_size);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_tx_mr_bufs = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_tx_largebuf_desc_base = kmem_zalloc(num_swqe *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China sizeof (ibd_rc_tx_largebuf_t), KM_SLEEP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Set up the buf chain
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China memp = state->rc_tx_mr_bufs;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_tx_large_bufs_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China lbufp = state->rc_tx_largebuf_desc_base;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China for (i = 0; i < num_swqe; i++) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China lbufp->lb_buf = memp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China lbufp->lb_next = lbufp + 1;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China tail = lbufp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China memp += state->rc_mtu;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China lbufp++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China tail->lb_next = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Set up the buffer information in ibd state
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_tx_largebuf_free_head = state->rc_tx_largebuf_desc_base;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_tx_largebuf_nfree = num_swqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_tx_large_bufs_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_fini_tx_largebuf_list(ibd_state_t *state)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint32_t num_swqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala num_swqe = state->id_rc_num_swqe - 1;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_deregister_mr(state->id_hca_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_tx_mr_hdl) != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_fini_tx_largebuf_list: ibt_deregister_mr() "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_tx_mr_hdl = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(state->rc_tx_mr_bufs, num_swqe * state->rc_mtu);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_tx_mr_bufs = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(state->rc_tx_largebuf_desc_base,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China num_swqe * sizeof (ibd_rc_tx_largebuf_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_tx_largebuf_desc_base = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic int
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_alloc_tx_copybufs(ibd_rc_chan_t *chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_mr_attr_t mem_attr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state = chan->state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(state != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Allocate one big chunk for all regular tx copy bufs
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala mem_attr.mr_len = chan->scq_size * state->id_rc_tx_copy_thresh;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_mr_bufs = kmem_zalloc(mem_attr.mr_len, KM_SLEEP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Do one memory registration on the entire txbuf area
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_vaddr = (uint64_t)(uintptr_t)chan->tx_mr_bufs;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_as = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mem_attr.mr_flags = IBT_MR_SLEEP;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_register_mr(state->id_hca_hdl, state->id_pd_hdl, &mem_attr,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China &chan->tx_mr_hdl, &chan->tx_mr_desc) != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_alloc_tx_copybufs: ibt_register_mr failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(mem_attr.mr_len ==
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala chan->scq_size * state->id_rc_tx_copy_thresh);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(chan->tx_mr_bufs, mem_attr.mr_len);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_mr_bufs = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Allocate the statically allocated Tx buffer list.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic int
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_init_txlist(ibd_rc_chan_t *chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_swqe_t *swqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int i;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_lkey_t lkey;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibd_state_t *state = chan->state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_alloc_tx_copybufs(chan) != DDI_SUCCESS)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Allocate and setup the swqe list
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China lkey = chan->tx_mr_desc.md_lkey;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_wqes = kmem_zalloc(chan->scq_size *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China sizeof (ibd_swqe_t), KM_SLEEP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe = chan->tx_wqes;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China for (i = 0; i < chan->scq_size; i++, swqe++) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->swqe_next = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->swqe_im_mblk = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->swqe_copybuf.ic_sgl.ds_key = lkey;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->swqe_copybuf.ic_sgl.ds_len = 0; /* set in send */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->w_swr.wr_id = (ibt_wrid_t)(uintptr_t)swqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->w_swr.wr_flags = IBT_WR_SEND_SIGNAL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->swqe_copybuf.ic_sgl.ds_va = (ib_vaddr_t)(uintptr_t)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (chan->tx_mr_bufs + i * state->id_rc_tx_copy_thresh);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->w_swr.wr_trans = IBT_RC_SRV;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Add to list */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_wqe_list.dl_cnt++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->swqe_next = chan->tx_wqe_list.dl_head;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_wqe_list.dl_head = SWQE_TO_WQE(swqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Free the statically allocated Tx buffer list.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_fini_txlist(ibd_rc_chan_t *chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala ibd_state_t *state = chan->state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->tx_mr_hdl != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_deregister_mr(chan->state->id_hca_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_mr_hdl) != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_fini_txlist: ibt_deregister_mr "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_mr_hdl = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->tx_mr_bufs != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(chan->tx_mr_bufs, chan->scq_size *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala state->id_rc_tx_copy_thresh);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_mr_bufs = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->tx_wqes != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(chan->tx_wqes, chan->scq_size *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China sizeof (ibd_swqe_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_wqes = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Acquire send wqe from free list.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Returns error number and send wqe pointer.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_swqe_t *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_acquire_swqes(ibd_rc_chan_t *chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_swqe_t *wqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->tx_rel_list.dl_head != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* transfer id_tx_rel_list to id_tx_list */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_wqe_list.dl_head =
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_rel_list.dl_head;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_wqe_list.dl_cnt =
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_rel_list.dl_cnt;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_wqe_list.dl_pending_sends = B_FALSE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* clear id_tx_rel_list */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_rel_list.dl_head = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_rel_list.dl_cnt = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China wqe = WQE_TO_SWQE(chan->tx_wqe_list.dl_head);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_wqe_list.dl_cnt -= 1;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_wqe_list.dl_head = wqe->swqe_next;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else { /* no free swqe */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_wqe_list.dl_pending_sends = B_TRUE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China wqe = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (wqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Release send wqe back into free list.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_release_swqe(ibd_rc_chan_t *chan, ibd_swqe_t *swqe)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Add back on Tx list for reuse.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->swqe_next = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_rel_list.dl_pending_sends = B_FALSE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->swqe_next = chan->tx_rel_list.dl_head;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_rel_list.dl_head = SWQE_TO_WQE(swqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_rel_list.dl_cnt++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_post_send(ibd_rc_chan_t *chan, ibd_swqe_t *node)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t i;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t num_posted;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t n_wrs;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status_t ibt_status;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_send_wr_t wrs[IBD_MAX_TX_POST_MULTIPLE];
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_swqe_t *tx_head, *elem;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_swqe_t *nodes[IBD_MAX_TX_POST_MULTIPLE];
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* post the one request, then check for more */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status = ibt_post_send(chan->chan_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China &node->w_swr, 1, NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_status != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(chan->state, "ibd_post_send: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "posting one wr failed: ret=%d", ibt_status);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_tx_cleanup(node);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China tx_head = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China for (;;) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (tx_head == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_post_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China tx_head = chan->tx_head;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (tx_head == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_busy = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_post_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_head = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_post_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Collect pending requests, IBD_MAX_TX_POST_MULTIPLE wrs
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * at a time if possible, and keep posting them.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China for (n_wrs = 0, elem = tx_head;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (elem) && (n_wrs < IBD_MAX_TX_POST_MULTIPLE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China elem = WQE_TO_SWQE(elem->swqe_next), n_wrs++) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China nodes[n_wrs] = elem;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China wrs[n_wrs] = elem->w_swr;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China tx_head = elem;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(n_wrs != 0);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * If posting fails for some reason, we'll never receive
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * completion intimation, so we'll need to cleanup. But
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * we need to make sure we don't clean up nodes whose
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * wrs have been successfully posted. We assume that the
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * hca driver returns on the first failure to post and
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * therefore the first 'num_posted' entries don't need
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * cleanup here.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China num_posted = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status = ibt_post_send(chan->chan_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China wrs, n_wrs, &num_posted);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_status != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(chan->state, "ibd_post_send: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "posting multiple wrs failed: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "requested=%d, done=%d, ret=%d",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China n_wrs, num_posted, ibt_status);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China for (i = num_posted; i < n_wrs; i++)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_tx_cleanup(nodes[i]);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Common code that deals with clean ups after a successful or
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * erroneous transmission attempt.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_tx_cleanup(ibd_swqe_t *swqe)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_ace_t *ace = swqe->w_ahandle;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_chan != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state = ace->ac_chan->state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * If this was a dynamic registration in ibd_send(),
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * deregister now.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (swqe->swqe_im_mblk != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(swqe->w_buftype == IBD_WQE_MAPPED);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (swqe->w_buftype == IBD_WQE_MAPPED) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_unmap_mem(state, swqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China freemsg(swqe->swqe_im_mblk);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->swqe_im_mblk = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(swqe->w_buftype != IBD_WQE_MAPPED);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (swqe->w_buftype == IBD_WQE_RC_COPYBUF) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_tx_largebuf_t *lbufp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China lbufp = swqe->w_rc_tx_largebuf;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(lbufp != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_tx_large_bufs_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China lbufp->lb_next = state->rc_tx_largebuf_free_head;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_tx_largebuf_free_head = lbufp;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_tx_largebuf_nfree ++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_tx_large_bufs_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China swqe->w_rc_tx_largebuf = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Release the send wqe for reuse.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_release_swqe(ace->ac_chan, swqe);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Drop the reference count on the AH; it can be reused
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * now for a different destination if there are no more
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * posted sends that will use it. This can be eliminated
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * if we can always associate each Tx buffer with an AH.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * The ace can be null if we are cleaning up from the
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * ibd_send() error path.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_dec_ref_ace(state, ace);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_drain_scq(ibd_rc_chan_t *chan, ibt_cq_hdl_t cq_hdl)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state = chan->state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_wqe_t *wqe;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_wc_t *wc, *wcs;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_ace_t *ace;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t numwcs, real_numwcs;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int i;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China boolean_t encount_error;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China wcs = chan->tx_wc;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China numwcs = IBD_RC_MAX_CQ_WC;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China encount_error = B_FALSE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China while (ibt_poll_cq(cq_hdl, wcs, numwcs, &real_numwcs) == IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China for (i = 0, wc = wcs; i < real_numwcs; i++, wc++) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China wqe = (ibd_wqe_t *)(uintptr_t)wc->wc_id;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (wc->wc_status != IBT_WC_SUCCESS) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (encount_error == B_FALSE) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China /*
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * This RC channle is in error status,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * remove it.
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China encount_error = B_TRUE;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_ac_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if ((chan->chan_state ==
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China IBD_RC_STATE_ACT_ESTAB) &&
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China (chan->state->id_link_state ==
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China LINK_STATE_UP) &&
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ((ace = ibd_acache_find(state,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China &chan->ace->ac_mac, B_FALSE, 0))
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China != NULL) && (ace == chan->ace)) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_mce == NULL);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China INC_REF(ace, 1);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China IBD_ACACHE_PULLOUT_ACTIVE(
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state, ace);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->chan_state =
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China IBD_RC_STATE_ACT_CLOSING;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_ac_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->rc_reset_cnt++;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_drain_scq: "
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "wc_status(%d) != SUCC, "
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "chan=%p, ace=%p, "
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "link_state=%d"
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "reset RC channel",
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China wc->wc_status, chan,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->ace, chan->state->
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China id_link_state);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_rc_signal_act_close(
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state, ace);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China } else {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_ac_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China rc_act_close_simultaneous++;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_drain_scq: "
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "wc_status(%d) != SUCC, "
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "chan=%p, chan_state=%d,"
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "ace=%p, link_state=%d."
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "other thread is closing "
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "it", wc->wc_status, chan,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->chan_state, chan->ace,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->state->id_link_state);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_tx_cleanup(WQE_TO_SWQE(wqe));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_sched_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->id_sched_needed == 0) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_sched_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else if (state->id_sched_needed & IBD_RSRC_RC_SWQE) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if ((chan->tx_rel_list.dl_cnt +
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_wqe_list.dl_cnt) > IBD_RC_TX_FREE_THRESH) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->id_sched_needed &= ~IBD_RSRC_RC_SWQE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_sched_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_swqe_mac_update++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mac_tx_update(state->id_mh);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_scq_no_swqe++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_sched_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else if (state->id_sched_needed & IBD_RSRC_RC_TX_LARGEBUF) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_tx_large_bufs_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_tx_largebuf_nfree >
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBD_RC_TX_FREE_THRESH) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(state->rc_tx_largebuf_free_head != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->id_sched_needed &=
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ~IBD_RSRC_RC_TX_LARGEBUF;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_tx_large_bufs_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_sched_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_xmt_buf_mac_update++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mac_tx_update(state->id_mh);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_scq_no_largebuf++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_tx_large_bufs_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_sched_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else if (state->id_sched_needed & IBD_RSRC_SWQE) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_tx_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if ((state->id_tx_list.dl_cnt +
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->id_tx_rel_list.dl_cnt)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China > IBD_FREE_SWQES_THRESH) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->id_sched_needed &= ~IBD_RSRC_SWQE;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->id_sched_cnt++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_tx_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_sched_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mac_tx_update(state->id_mh);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_tx_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_sched_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_sched_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Send CQ handler, call ibd_rx_tx_cleanup to recycle Tx buffers */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* ARGSUSED */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_scq_handler(ibt_cq_hdl_t cq_hdl, void *arg)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *chan = (ibd_rc_chan_t *)arg;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_tx_softintr == 1) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->tx_poll_busy & IBD_CQ_POLLING) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_poll_busy |= IBD_REDO_CQ_POLLING;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ddi_trigger_softintr(chan->scq_softintr);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) ibd_rc_tx_recycle(arg);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic uint_t
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_tx_recycle(caddr_t arg)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *chan = (ibd_rc_chan_t *)arg;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state = chan->state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int flag, redo_flag;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int redo = 1;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China flag = IBD_CQ_POLLING;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China redo_flag = IBD_REDO_CQ_POLLING;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->tx_poll_busy & flag) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(state, "ibd_rc_tx_recycle: multiple polling "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "threads");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_poll_busy |= redo_flag;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_INTR_CLAIMED);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_poll_busy |= flag;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Poll for completed entries; the CQ will not interrupt any
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * more for completed packets.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_drain_scq(chan, chan->scq_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Now enable CQ notifications; all completions originating now
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * will cause new interrupts.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China do {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_enable_cq_notify(chan->scq_hdl, IBT_NEXT_COMPLETION) !=
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * We do not expect a failure here.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_scq_handler: ibt_enable_cq_notify()"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China " failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_drain_scq(chan, chan->scq_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->tx_poll_busy & redo_flag)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_poll_busy &= ~redo_flag;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_poll_busy &= ~flag;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China redo = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } while (redo);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_INTR_CLAIMED);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing Chinastatic ibt_status_t
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing Chinaibd_register_service(ibt_srv_desc_t *srv, ib_svc_id_t sid,
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China int num_sids, ibt_srv_hdl_t *srv_hdl, ib_svc_id_t *ret_sid)
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China{
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibd_service_t *p;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibt_status_t status;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China mutex_enter(&ibd_gstate.ig_mutex);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China for (p = ibd_gstate.ig_service_list; p != NULL; p = p->is_link) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China if (p->is_sid == sid) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China p->is_ref_cnt++;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China *srv_hdl = p->is_srv_hdl;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China *ret_sid = sid;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China mutex_exit(&ibd_gstate.ig_mutex);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China return (IBT_SUCCESS);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China }
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China }
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China status = ibt_register_service(ibd_gstate.ig_ibt_hdl, srv, sid,
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China num_sids, srv_hdl, ret_sid);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China if (status == IBT_SUCCESS) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China p = kmem_alloc(sizeof (*p), KM_SLEEP);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China p->is_srv_hdl = *srv_hdl;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China p->is_sid = sid;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China p->is_ref_cnt = 1;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China p->is_link = ibd_gstate.ig_service_list;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibd_gstate.ig_service_list = p;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China }
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China mutex_exit(&ibd_gstate.ig_mutex);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China return (status);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China}
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing Chinastatic ibt_status_t
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing Chinaibd_deregister_service(ibt_srv_hdl_t srv_hdl)
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China{
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibd_service_t *p, **pp;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibt_status_t status;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China mutex_enter(&ibd_gstate.ig_mutex);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China for (pp = &ibd_gstate.ig_service_list; *pp != NULL;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China pp = &((*pp)->is_link)) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China p = *pp;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China if (p->is_srv_hdl == srv_hdl) { /* Found it */
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China if (--p->is_ref_cnt == 0) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China status = ibt_deregister_service(
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibd_gstate.ig_ibt_hdl, srv_hdl);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China *pp = p->is_link; /* link prev to next */
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China kmem_free(p, sizeof (*p));
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China } else {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China status = IBT_SUCCESS;
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China }
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China mutex_exit(&ibd_gstate.ig_mutex);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China return (status);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China }
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China }
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China /* Should not ever get here */
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China mutex_exit(&ibd_gstate.ig_mutex);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China return (IBT_FAILURE);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China}
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* Listen with corresponding service ID */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibt_status_t
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_listen(ibd_state_t *state)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_srv_desc_t srvdesc;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ib_svc_id_t ret_sid;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status_t status;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ib_gid_t gid;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_listen_hdl != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_listen: rc_listen_hdl should be NULL");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China bzero(&srvdesc, sizeof (ibt_srv_desc_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China srvdesc.sd_handler = ibd_rc_dispatch_pass_mad;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China srvdesc.sd_flags = IBT_SRV_NO_FLAGS;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Register the service with service id
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Incoming connection requests should arrive on this service id.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China status = ibd_register_service(&srvdesc,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBD_RC_QPN_TO_SID(state->id_qpnum),
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China 1, &state->rc_listen_hdl, &ret_sid);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (status != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_listen: Service Registration Failed, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ret=%d", status);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (status);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China gid = state->id_sgid;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* pass state as cm_private */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China status = ibt_bind_service(state->rc_listen_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China gid, NULL, state, &state->rc_listen_bind);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (status != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_listen:"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China " fail to bind port: <%d>", status);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China (void) ibd_deregister_service(state->rc_listen_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (status);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Legacy OFED had used a wrong service ID (one additional zero digit)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * for many years. To interop with legacy OFED, we support this wrong
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * service ID here.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(state->rc_listen_hdl_OFED_interop == NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China bzero(&srvdesc, sizeof (ibt_srv_desc_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China srvdesc.sd_handler = ibd_rc_dispatch_pass_mad;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China srvdesc.sd_flags = IBT_SRV_NO_FLAGS;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Register the service with service id
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Incoming connection requests should arrive on this service id.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China status = ibd_register_service(&srvdesc,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBD_RC_QPN_TO_SID_OFED_INTEROP(state->id_qpnum),
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China 1, &state->rc_listen_hdl_OFED_interop, &ret_sid);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (status != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ibd_rc_listen: Service Registration for Legacy OFED "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "Failed %d", status);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) ibt_unbind_service(state->rc_listen_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_listen_bind);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China (void) ibd_deregister_service(state->rc_listen_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (status);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China gid = state->id_sgid;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* pass state as cm_private */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China status = ibt_bind_service(state->rc_listen_hdl_OFED_interop,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China gid, NULL, state, &state->rc_listen_bind_OFED_interop);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (status != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_listen: fail to bind port: <%d> for "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "Legacy OFED listener", status);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China (void) ibd_deregister_service(
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_listen_hdl_OFED_interop);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) ibt_unbind_service(state->rc_listen_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_listen_bind);
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China (void) ibd_deregister_service(state->rc_listen_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (status);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_stop_listen(ibd_state_t *state)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China int ret;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Disable incoming connection requests */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_listen_hdl != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret = ibt_unbind_all_services(state->rc_listen_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ret != 0) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_stop_listen:"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ibt_unbind_all_services() failed, ret=%d", ret);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ret = ibd_deregister_service(state->rc_listen_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ret != 0) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_stop_listen:"
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China "ibd_deregister_service() failed, ret=%d", ret);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_listen_hdl = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Disable incoming connection requests */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_listen_hdl_OFED_interop != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret = ibt_unbind_all_services(
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_listen_hdl_OFED_interop);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ret != 0) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_stop_listen:"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ibt_unbind_all_services() failed: %d", ret);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ret = ibd_deregister_service(state->rc_listen_hdl_OFED_interop);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ret != 0) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_stop_listen:"
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China "ibd_deregister_service() failed: %d", ret);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_listen_hdl_OFED_interop = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_close_all_chan(ibd_state_t *state)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *rc_chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_ace_t *ace, *pre_ace;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t attempts;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Disable all Rx routines */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_pass_chan_list.chan_list_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_chan = state->rc_pass_chan_list.chan_list;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China while (rc_chan != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_set_cq_handler(rc_chan->rcq_hdl, 0, 0);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_chan = rc_chan->next;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_pass_chan_list.chan_list_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_enable_srq) {
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China attempts = 10;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China while (state->rc_srq_rwqe_list.dl_bufs_outstanding > 0) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_close_all_chan: outstanding > 0");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China delay(drv_usectohz(100000));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (--attempts == 0) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * There are pending bufs with the network
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * layer and we have no choice but to wait
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * for them to be done with. Reap all the
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Tx/Rx completions that were posted since
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * we turned off the notification and
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * return failure.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
a567cb7199dcb7e0c1d645cd14307998ef4632a3ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Close all passive RC channels */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_chan = ibd_rc_rm_header_chan_list(&state->rc_pass_chan_list);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China while (rc_chan != NULL) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China (void) ibd_rc_pas_close(rc_chan, B_TRUE, B_FALSE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_chan = ibd_rc_rm_header_chan_list(&state->rc_pass_chan_list);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Close all active RC channels */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_ac_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->id_ac_hot_ace = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace = list_head(&state->id_ah_active);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China while ((pre_ace = ace) != NULL) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ace = list_next(&state->id_ah_active, ace);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (pre_ace->ac_chan != NULL) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China INC_REF(pre_ace, 1);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China IBD_ACACHE_PULLOUT_ACTIVE(state, pre_ace);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China pre_ace->ac_chan->chan_state = IBD_RC_STATE_ACT_CLOSING;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_add_to_chan_list(&state->rc_obs_act_chan_list,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China pre_ace->ac_chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_ac_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_chan = ibd_rc_rm_header_chan_list(&state->rc_obs_act_chan_list);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China while (rc_chan != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace = rc_chan->ace;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_rc_act_close(rc_chan, B_TRUE);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (ace != NULL) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_ac_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_ref != 0);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China atomic_dec_32(&ace->ac_ref);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_chan = NULL;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if ((ace->ac_ref == 0) || (ace->ac_ref == CYCLEVAL)) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China IBD_ACACHE_INSERT_FREE(state, ace);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ace->ac_ref = 0;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China } else {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ace->ac_ref |= CYCLEVAL;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->rc_delay_ace_recycle++;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_ac_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_chan = ibd_rc_rm_header_chan_list(
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China &state->rc_obs_act_chan_list);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China attempts = 400;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China while (((state->rc_num_tx_chan != 0) ||
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China (state->rc_num_rx_chan != 0)) && (attempts > 0)) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China /* Other thread is closing CM channel, wait it */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China delay(drv_usectohz(100000));
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China attempts--;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_try_connect(ibd_state_t *state, ibd_ace_t *ace, ibt_path_info_t *path)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status_t status;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if ((state->id_mac_state & IBD_DRV_STARTED) == 0)
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China return;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China status = ibd_rc_connect(state, ace, path,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBD_RC_SERVICE_ID_OFED_INTEROP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (status != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* wait peer side remove stale channel */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China delay(drv_usectohz(10000));
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if ((state->id_mac_state & IBD_DRV_STARTED) == 0)
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China status = ibd_rc_connect(state, ace, path,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBD_RC_SERVICE_ID_OFED_INTEROP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (status != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* wait peer side remove stale channel */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China delay(drv_usectohz(10000));
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if ((state->id_mac_state & IBD_DRV_STARTED) == 0)
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) ibd_rc_connect(state, ace, path,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBD_RC_SERVICE_ID);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Allocates channel and sets the ace->ac_chan to it.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Opens the channel.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibt_status_t
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_connect(ibd_state_t *state, ibd_ace_t *ace, ibt_path_info_t *path,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint64_t ietf_cm_service_id)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status_t status = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_rc_returns_t open_returns;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_chan_open_args_t open_args;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_msg_hello_t hello_req_msg;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_msg_hello_t *hello_ack_msg;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *chan;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibt_ud_dest_query_attr_t dest_attrs;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_mce == NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_chan == NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if ((status = ibd_rc_alloc_chan(&chan, state, B_TRUE)) != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(10, "ibd_rc_connect: ibd_rc_alloc_chan() failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (status);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_chan = chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->state = state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->ace = ace;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_set_chan_private(chan->chan_hdl, (void *)(uintptr_t)ace);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China hello_ack_msg = kmem_zalloc(sizeof (ibd_rc_msg_hello_t), KM_SLEEP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * open the channels
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China bzero(&open_args, sizeof (ibt_chan_open_args_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China bzero(&open_returns, sizeof (ibt_rc_returns_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China open_args.oc_cm_handler = ibd_rc_dispatch_actv_mad;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China open_args.oc_cm_clnt_private = (void *)(uintptr_t)ace;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * update path record with the SID
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if ((status = ibt_query_ud_dest(ace->ac_dest, &dest_attrs))
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China != IBT_SUCCESS) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_connect: ibt_query_ud_dest() failed, "
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "ret=%d", status);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China return (status);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China path->pi_sid =
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ietf_cm_service_id | ((dest_attrs.ud_dst_qpn) & 0xffffff);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* pre-allocate memory for hello ack message */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China open_returns.rc_priv_data_len = sizeof (ibd_rc_msg_hello_t);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China open_returns.rc_priv_data = hello_ack_msg;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China open_args.oc_path = path;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China open_args.oc_path_rnr_retry_cnt = 1;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China open_args.oc_path_retry_cnt = 1;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* We don't do RDMA */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China open_args.oc_rdma_ra_out = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China open_args.oc_rdma_ra_in = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China hello_req_msg.reserved_qpn = htonl(state->id_qpnum);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China hello_req_msg.rx_mtu = htonl(state->rc_mtu);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China open_args.oc_priv_data_len = sizeof (ibd_rc_msg_hello_t);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China open_args.oc_priv_data = (void *)(&hello_req_msg);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(open_args.oc_priv_data_len <= IBT_REQ_PRIV_DATA_SZ);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(open_returns.rc_priv_data_len <= IBT_REP_PRIV_DATA_SZ);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(open_args.oc_cm_handler != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China status = ibt_open_rc_channel(chan->chan_hdl, IBT_OCHAN_NO_FLAGS,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBT_BLOCKING, &open_args, &open_returns);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (status == IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Success! */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(2, "ibd_rc_connect: call ibt_open_rc_channel succ!");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_conn_succ++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(hello_ack_msg, sizeof (ibd_rc_msg_hello_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* failure */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) ibt_flush_channel(chan->chan_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_free_chan(chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_chan = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* check open_returns report error and exit */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_connect: call ibt_open_rc_chan fail."
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ret status = %d, reason=%d, ace=%p, mtu=0x%x, qpn=0x%x,"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China " peer qpn=0x%x", status, (int)open_returns.rc_status, ace,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China hello_req_msg.rx_mtu, hello_req_msg.reserved_qpn,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China dest_attrs.ud_dst_qpn);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China kmem_free(hello_ack_msg, sizeof (ibd_rc_msg_hello_t));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (status);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_signal_act_close(ibd_state_t *state, ibd_ace_t *ace)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_req_t *req;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China req = kmem_cache_alloc(state->id_req_kmc, KM_NOSLEEP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (req == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_print_warn(state, "ibd_rc_signal_act_close: alloc "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ibd_req_t fail");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_obs_act_chan_list.chan_list_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_chan->next = state->rc_obs_act_chan_list.chan_list;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_obs_act_chan_list.chan_list = ace->ac_chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_obs_act_chan_list.chan_list_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China req->rq_ptr = ace->ac_chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_queue_work_slot(state, req, IBD_ASYNC_RC_CLOSE_ACT_CHAN);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinavoid
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_signal_ace_recycle(ibd_state_t *state, ibd_ace_t *ace)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_req_t *req;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->rc_ace_recycle_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (state->rc_ace_recycle != NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_ace_recycle_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China req = kmem_cache_alloc(state->id_req_kmc, KM_NOSLEEP);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (req == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_ace_recycle_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_ace_recycle = ace;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->rc_ace_recycle_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_mce == NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China INC_REF(ace, 1);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBD_ACACHE_PULLOUT_ACTIVE(state, ace);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China req->rq_ptr = ace;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_queue_work_slot(state, req, IBD_ASYNC_RC_RECYCLE_ACE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China/*
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * Close an active channel
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China *
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * is_close_rc_chan: if B_TRUE, we will call ibt_close_rc_channel()
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic void
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing Chinaibd_rc_act_close(ibd_rc_chan_t *chan, boolean_t is_close_rc_chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_state_t *state;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_ace_t *ace;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t times;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status_t ret;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(chan != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->state->rc_act_close++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China switch (chan->chan_state) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBD_RC_STATE_ACT_CLOSING: /* stale, close it */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBD_RC_STATE_ACT_ESTAB:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_act_close-1: close and free chan, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "act_state=%d, chan=%p", chan->chan_state, chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->chan_state = IBD_RC_STATE_ACT_CLOSED;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_set_cq_handler(chan->rcq_hdl, 0, 0);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China /*
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * Wait send queue empty. Its old value is 50 (5 seconds). But
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * in my experiment, 5 seconds is not enough time to let IBTL
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * return all buffers and ace->ac_ref. I tried 25 seconds, it
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * works well. As another evidence, I saw IBTL takes about 17
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * seconds every time it cleans a stale RC channel.
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China times = 250;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ace = chan->ace;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ASSERT(ace != NULL);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state = chan->state;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ASSERT(state != NULL);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_ac_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China while (((chan->tx_wqe_list.dl_cnt + chan->tx_rel_list.dl_cnt)
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China != chan->scq_size) || ((ace->ac_ref != 1) &&
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China (ace->ac_ref != (CYCLEVAL+1)))) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_wqe_list.dl_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_ac_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China times--;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (times == 0) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China state->rc_act_close_not_clean++;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_act_close: dl_cnt(tx_wqe_"
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "list=%d, tx_rel_list=%d) != chan->"
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "scq_size=%d, OR ac_ref(=%d) not clean",
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->tx_wqe_list.dl_cnt,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->tx_rel_list.dl_cnt,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->scq_size, ace->ac_ref);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China break;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan->tx_poll_busy & IBD_CQ_POLLING) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_act_close: multiple "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "polling threads");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_poll_busy = IBD_CQ_POLLING;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_drain_scq(chan, chan->scq_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->tx_poll_busy = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_poll_lock);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China delay(drv_usectohz(100000));
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_ac_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_wqe_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&chan->tx_rel_list.dl_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (times != 0) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_rel_list.dl_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_exit(&chan->tx_wqe_list.dl_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_ac_mutex);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_set_cq_handler(chan->scq_hdl, 0, 0);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (is_close_rc_chan) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ret = ibt_close_rc_channel(chan->chan_hdl,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China IBT_BLOCKING|IBT_NOCALLBACKS, NULL, 0, NULL, NULL,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China 0);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (ret != IBT_SUCCESS) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_act_close: ibt_close_rc_"
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "channel fail, chan=%p, ret=%d",
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan, ret);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China } else {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_act_close: ibt_close_rc_"
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "channel succ, chan=%p", chan);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_free_chan(chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBD_RC_STATE_ACT_REP_RECV:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->chan_state = IBD_RC_STATE_ACT_CLOSED;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) ibt_flush_channel(chan->chan_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_free_chan(chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBD_RC_STATE_ACT_ERROR:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_act_close: IBD_RC_STATE_ERROR branch");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China default:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_act_close: default branch, act_state=%d, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "chan=%p", chan->chan_state, chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China/*
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * Close a passive channel
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China *
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * is_close_rc_chan: if B_TRUE, we will call ibt_close_rc_channel()
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China *
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * is_timeout_close: if B_TRUE, this function is called by the connection
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * reaper (refer to function ibd_rc_conn_timeout_call). When the connection
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * reaper calls ibd_rc_pas_close(), and if it finds that dl_bufs_outstanding
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * or chan->rcq_invoking is non-zero, then it can simply put that channel back
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * on the passive channels list and move on, since it might be an indication
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * that the channel became active again by the time we started it's cleanup.
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * It is costlier to do the cleanup and then reinitiate the channel
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * establishment and hence it will help to be conservative when we do the
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China * cleanup.
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing Chinaint
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing Chinaibd_rc_pas_close(ibd_rc_chan_t *chan, boolean_t is_close_rc_chan,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China boolean_t is_timeout_close)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China uint_t times;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status_t ret;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(chan != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->state->rc_pas_close++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China switch (chan->chan_state) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBD_RC_STATE_PAS_ESTAB:
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (is_timeout_close) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if ((chan->rcq_invoking != 0) ||
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ((!chan->state->rc_enable_srq) &&
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China (chan->rx_wqe_list.dl_bufs_outstanding > 0))) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (ibd_rc_re_add_to_pas_chan_list(chan)) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * First, stop receive interrupts; this stops the
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * connection from handing up buffers to higher layers.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Wait for receive buffers to be returned; give up
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * after 5 seconds.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_set_cq_handler(chan->rcq_hdl, 0, 0);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China /* Wait 0.01 second to let ibt_set_cq_handler() take effect */
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China delay(drv_usectohz(10000));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (!chan->state->rc_enable_srq) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China times = 50;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China while (chan->rx_wqe_list.dl_bufs_outstanding > 0) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China delay(drv_usectohz(100000));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (--times == 0) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_pas_close : "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "reclaiming failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_poll_rcq(chan, chan->rcq_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_set_cq_handler(chan->rcq_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_rcq_handler,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void *)(uintptr_t)chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_FAILURE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China times = 50;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China while (chan->rcq_invoking != 0) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China delay(drv_usectohz(100000));
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (--times == 0) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_pas_close : "
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "rcq handler is being invoked");
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan->state->rc_pas_close_rcq_invoking++;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China break;
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_set_cq_handler(chan->scq_hdl, 0, 0);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->chan_state = IBD_RC_STATE_PAS_CLOSED;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_pas_close-1: close and free chan, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "chan_state=%d, chan=%p", chan->chan_state, chan);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (is_close_rc_chan) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ret = ibt_close_rc_channel(chan->chan_hdl,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China IBT_BLOCKING|IBT_NOCALLBACKS, NULL, 0, NULL, NULL,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China 0);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (ret != IBT_SUCCESS) {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_pas_close: ibt_close_rc_"
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "channel() fail, chan=%p, ret=%d", chan,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ret);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China } else {
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_pas_close: ibt_close_rc_"
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China "channel() succ, chan=%p", chan);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_free_chan(chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBD_RC_STATE_PAS_REQ_RECV:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->chan_state = IBD_RC_STATE_PAS_CLOSED;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (void) ibt_flush_channel(chan->chan_hdl);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_free_chan(chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China default:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_pas_close: default, chan_state=%d, chan=%p",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->chan_state, chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (DDI_SUCCESS);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Passive Side:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Handle an incoming CM REQ from active side.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * If success, this function allocates an ibd_rc_chan_t, then
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * assigns it to "*ret_conn".
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic ibt_cm_status_t
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_handle_req(void *arg, ibd_rc_chan_t **ret_conn,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_event_t *ibt_cm_event, ibt_cm_return_args_t *ret_args,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China void *ret_priv_data)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_msg_hello_t *hello_msg;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state = (ibd_state_t *)arg;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_alloc_chan(&chan, state, B_FALSE) != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_handle_req: ibd_rc_alloc_chan() failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_REJECT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_add_to_chan_list(&state->rc_pass_chan_list, chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_set_chan_private(chan->chan_hdl, (void *)(uintptr_t)chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (!state->rc_enable_srq) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibd_rc_init_rxlist(chan) != DDI_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_free_chan(chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_handle_req: ibd_rc_init_rxlist() "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "failed");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_REJECT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret_args->cm_ret.rep.cm_channel = chan->chan_hdl;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* We don't do RDMA */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret_args->cm_ret.rep.cm_rdma_ra_out = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret_args->cm_ret.rep.cm_rdma_ra_in = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret_args->cm_ret.rep.cm_rnr_retry_cnt = 7;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret_args->cm_ret_len = sizeof (ibd_rc_msg_hello_t);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China hello_msg = (ibd_rc_msg_hello_t *)ibt_cm_event->cm_priv_data;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_handle_req(): peer qpn=0x%x, peer mtu=0x%x",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ntohl(hello_msg->reserved_qpn), ntohl(hello_msg->rx_mtu));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China hello_msg = (ibd_rc_msg_hello_t *)ret_priv_data;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China hello_msg->reserved_qpn = htonl(state->id_qpnum);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China hello_msg->rx_mtu = htonl(state->rc_mtu);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->chan_state = IBD_RC_STATE_PAS_REQ_RECV; /* ready to receive */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China *ret_conn = chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_ACCEPT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * ibd_rc_handle_act_estab -- handler for connection established completion
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * for active side.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic ibt_cm_status_t
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_handle_act_estab(ibd_ace_t *ace)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status_t result;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China switch (ace->ac_chan->chan_state) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBD_RC_STATE_ACT_REP_RECV:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_chan->chan_state = IBD_RC_STATE_ACT_ESTAB;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China result = ibt_enable_cq_notify(ace->ac_chan->rcq_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBT_NEXT_COMPLETION);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (result != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_handle_act_estab: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ibt_enable_cq_notify(rcq) "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "failed: status %d", result);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_REJECT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China default:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_handle_act_estab: default "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "branch, act_state=%d", ace->ac_chan->chan_state);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_REJECT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_ACCEPT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * ibd_rc_handle_pas_estab -- handler for connection established completion
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * for passive side.
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic ibt_cm_status_t
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_handle_pas_estab(ibd_rc_chan_t *chan)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_status_t result;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China switch (chan->chan_state) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBD_RC_STATE_PAS_REQ_RECV:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan->chan_state = IBD_RC_STATE_PAS_ESTAB;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China result = ibt_enable_cq_notify(chan->rcq_hdl,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBT_NEXT_COMPLETION);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (result != IBT_SUCCESS) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_handle_pas_estab: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ibt_enable_cq_notify(rcq) "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "failed: status %d", result);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_REJECT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China default:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_handle_pas_estab: default "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "branch, chan_state=%d", chan->chan_state);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_REJECT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_ACCEPT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* ARGSUSED */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic ibt_cm_status_t
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_dispatch_actv_mad(void *arg, ibt_cm_event_t *ibt_cm_event,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_return_args_t *ret_args, void *ret_priv_data,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_priv_data_len_t ret_len_max)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_status_t result = IBT_CM_ACCEPT;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_ace_t *ace = (ibd_ace_t *)(uintptr_t)arg;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *rc_chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_state_t *state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_msg_hello_t *hello_ack;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China switch (ibt_cm_event->cm_type) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_REP_RCV:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_chan != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_chan->chan_state == IBD_RC_STATE_INIT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China hello_ack = (ibd_rc_msg_hello_t *)ibt_cm_event->cm_priv_data;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_handle_rep: hello_ack->mtu=0x%x, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "hello_ack->qpn=0x%x", ntohl(hello_ack->rx_mtu),
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ntohl(hello_ack->reserved_qpn));
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_chan->chan_state = IBD_RC_STATE_ACT_REP_RECV;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_CONN_EST:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_chan != NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_dispatch_actv_mad: IBT_CM_EVENT_CONN_EST, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ace=%p, act_state=%d, chan=%p",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace, ace->ac_chan->chan_state, ace->ac_chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China result = ibd_rc_handle_act_estab(ace);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_CONN_CLOSED:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_chan = ace->ac_chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (rc_chan == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_dispatch_actv_mad: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "rc_chan==NULL, IBT_CM_EVENT_CONN_CLOSED");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_ACCEPT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state = rc_chan->state;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_ac_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if ((rc_chan->chan_state == IBD_RC_STATE_ACT_ESTAB) &&
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ((ace = ibd_acache_find(state, &ace->ac_mac, B_FALSE, 0))
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China != NULL) && (ace == rc_chan->ace)) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China rc_chan->chan_state = IBD_RC_STATE_ACT_CLOSING;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_mce == NULL);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China INC_REF(ace, 1);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBD_ACACHE_PULLOUT_ACTIVE(state, ace);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_ac_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_dispatch_actv_mad: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "IBT_CM_EVENT_CONN_CLOSED, ace=%p, chan=%p, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "reason=%d", ace, rc_chan,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_event->cm_event.closed);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_ac_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_act_close_simultaneous++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_dispatch_actv_mad: other thread "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "is closing it, IBT_CM_EVENT_CONN_CLOSED, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "chan_state=%d", rc_chan->chan_state);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_ACCEPT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China ibd_rc_act_close(rc_chan, B_FALSE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_enter(&state->id_ac_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_chan = NULL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ASSERT(ace->ac_ref != 0);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China atomic_dec_32(&ace->ac_ref);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if ((ace->ac_ref == 0) || (ace->ac_ref == CYCLEVAL)) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China IBD_ACACHE_INSERT_FREE(state, ace);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_ref = 0;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China } else {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace->ac_ref |= CYCLEVAL;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China state->rc_delay_ace_recycle++;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China mutex_exit(&state->id_ac_mutex);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_FAILURE:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_dispatch_actv_mad: IBT_CM_EVENT_FAILURE,"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ace=%p, chan=%p, code: %d, msg: %d, reason=%d",
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ace, ace->ac_chan,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_event->cm_event.failed.cf_code,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_event->cm_event.failed.cf_msg,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_event->cm_event.failed.cf_reason);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /*
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * Don't need free resource here. The resource is freed
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China * at function ibd_rc_connect()
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_MRA_RCV:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_dispatch_actv_mad: IBT_CM_EVENT_MRA_RCV");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_LAP_RCV:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_dispatch_actv_mad: LAP message received");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_APR_RCV:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_dispatch_actv_mad: APR message received");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China default:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_dispatch_actv_mad: default branch, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ibt_cm_event->cm_type=%d", ibt_cm_event->cm_type);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (result);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China/* ARGSUSED */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinastatic ibt_cm_status_t
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing Chinaibd_rc_dispatch_pass_mad(void *arg, ibt_cm_event_t *ibt_cm_event,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_return_args_t *ret_args, void *ret_priv_data,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_priv_data_len_t ret_len_max)
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China{
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_status_t result = IBT_CM_ACCEPT;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibd_rc_chan_t *chan;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_cm_event->cm_type == IBT_CM_EVENT_REQ_RCV) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_dispatch_pass_mad: IBT_CM_EVENT_REQ_RCV,"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "req_pkey=%x", ibt_cm_event->cm_event.req.req_pkey);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China /* Receive an incoming CM REQ from active side */
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China result = ibd_rc_handle_req(arg, &chan, ibt_cm_event, ret_args,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ret_priv_data);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (result);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (ibt_cm_event->cm_channel == 0) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_dispatch_pass_mad: "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "ERROR ibt_cm_event->cm_channel == 0");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_REJECT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China chan =
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China (ibd_rc_chan_t *)ibt_get_chan_private(ibt_cm_event->cm_channel);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China if (chan == NULL) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_dispatch_pass_mad: conn == 0");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_REJECT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China switch (ibt_cm_event->cm_type) {
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_CONN_EST:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_dispatch_pass_mad: IBT_CM_EVENT_CONN_EST, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "chan=%p", chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China result = ibd_rc_handle_pas_estab(chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_CONN_CLOSED:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_dispatch_pass_mad: IBT_CM_EVENT_CONN_CLOSED,"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China " chan=%p, reason=%d", chan, ibt_cm_event->cm_event.closed);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan = ibd_rc_rm_from_chan_list(&chan->state->rc_pass_chan_list,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (chan != NULL)
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China (void) ibd_rc_pas_close(chan, B_FALSE, B_FALSE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_FAILURE:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(30, "ibd_rc_dispatch_pass_mad: IBT_CM_EVENT_FAILURE,"
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China " chan=%p, code: %d, msg: %d, reason=%d", chan,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_event->cm_event.failed.cf_code,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_event->cm_event.failed.cf_msg,
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China ibt_cm_event->cm_event.failed.cf_reason);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan = ibd_rc_rm_from_chan_list(&chan->state->rc_pass_chan_list,
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China chan);
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China if (chan != NULL)
03514dd70879e522caeae9bc4b36d18c43e15a43ke ge - Sun Microsystems - Beijing China (void) ibd_rc_pas_close(chan, B_FALSE, B_FALSE);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (IBT_CM_ACCEPT);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_MRA_RCV:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_dispatch_pass_mad: IBT_CM_EVENT_MRA_RCV");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_LAP_RCV:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_dispatch_pass_mad: LAP message received");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China case IBT_CM_EVENT_APR_RCV:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_dispatch_pass_mad: APR message received");
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China default:
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China DPRINT(40, "ibd_rc_dispatch_pass_mad: default, type=%d, "
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China "chan=%p", ibt_cm_event->cm_type, chan);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China break;
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China }
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China return (result);
93c426a1dbbb1987537f122c9e8342b2d9347210ke ge - Sun Microsystems - Beijing China}