b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * CDDL HEADER START
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * The contents of this file are subject to the terms of the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Common Development and Distribution License (the "License").
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * You may not use this file except in compliance with the License.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * or http://www.opensolaris.org/os/licensing.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * See the License for the specific language governing permissions
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * and limitations under the License.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * When distributing Covered Code, include this CDDL HEADER in each
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If applicable, add the following below this CDDL HEADER, with the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * fields enclosed by brackets "[]" replaced with your own identifying
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * information: Portions Copyright [yyyy] [name of copyright owner]
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * CDDL HEADER END
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/types.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/kmem.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/conf.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/ddi.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/sunddi.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/ksynch.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/ib/clients/eoib/eib_impl.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Declarations private to this file
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_ctl_setup_cq(eib_t *, eib_vnic_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_ctl_setup_ud_channel(eib_t *, eib_vnic_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_ctl_comp_intr(ibt_cq_hdl_t, void *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_ctl_rx_comp(eib_vnic_t *, eib_wqe_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_ctl_tx_comp(eib_vnic_t *, eib_wqe_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_ctl_err_comp(eib_vnic_t *, eib_wqe_t *, ibt_wc_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_rb_ctl_setup_cq(eib_t *, eib_vnic_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_rb_ctl_setup_ud_channel(eib_t *, eib_vnic_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ctl_create_qp(eib_t *ss, eib_vnic_t *vnic, int *err)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_chan_t *chan = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Allocate a eib_chan_t to store stuff about this vnic's ctl qp
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * and initialize it with default admin qp pkey parameters. We'll
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * re-associate this with the pkey we receive from the gw once we
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * receive the login ack.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan vnic->vn_ctl_chan = eib_chan_init();
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan = vnic->vn_ctl_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_pkey = ss->ei_admin_chan->ch_pkey;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_pkey_ix = ss->ei_admin_chan->ch_pkey_ix;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_vnic_inst = vnic->vn_instance;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Setup a combined CQ and completion handler
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (eib_ctl_setup_cq(ss, vnic) != EIB_E_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_ctl_create_qp: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_ctl_setup_cq() failed");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *err = ENOMEM;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto ctl_create_qp_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Setup UD channel
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (eib_ctl_setup_ud_channel(ss, vnic) != EIB_E_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_ctl_create_qp: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_ctl_setup_ud_channel() failed");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *err = ENOMEM;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto ctl_create_qp_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanctl_create_qp_fail:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_ctl_create_qp(ss, vnic);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanuint_t
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ctl_comp_handler(caddr_t arg1, caddr_t arg2)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_vnic_t *vnic = (eib_vnic_t *)(void *)arg1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_chan_t *chan = vnic->vn_ctl_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = vnic->vn_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_wc_t *wc;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_wqe_t *wqe;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t polled;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int i;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Re-arm the notification callback before we start polling
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * the completion queue. There's nothing much we can do if the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * enable_cq_notify fails - we issue a warning and move on.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_enable_cq_notify(chan->ch_cq_hdl, IBT_NEXT_COMPLETION);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance, "eib_ctl_comp_handler: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_enable_cq_notify() failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Handle tx and rx completions
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while ((ret = ibt_poll_cq(chan->ch_cq_hdl, chan->ch_wc, chan->ch_cq_sz,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &polled)) == IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (wc = chan->ch_wc, i = 0; i < polled; i++, wc++) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan wqe = (eib_wqe_t *)(uintptr_t)wc->wc_id;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (wc->wc_status != IBT_WC_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_ctl_err_comp(vnic, wqe, wc);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if (EIB_WQE_TYPE(wqe->qe_info) == EIB_WQE_RX) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_ctl_rx_comp(vnic, wqe);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_ctl_tx_comp(vnic, wqe);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_INTR_CLAIMED);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_rb_ctl_create_qp(eib_t *ss, eib_vnic_t *vnic)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_ctl_setup_ud_channel(ss, vnic);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_ctl_setup_cq(ss, vnic);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_chan_fini(vnic->vn_ctl_chan);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan vnic->vn_ctl_chan = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ctl_setup_cq(eib_t *ss, eib_vnic_t *vnic)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_chan_t *chan = vnic->vn_ctl_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_cq_attr_t cq_attr;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t sz;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int rv;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Allocate a completion queue for sending vhub table request
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * and vhub-update/vnic-alive messages and responses from the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * gateway
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cq_attr.cq_sched = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cq_attr.cq_flags = IBT_CQ_NO_FLAGS;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_hca_attrs->hca_max_cq_sz < EIB_CTL_CQ_SIZE)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cq_attr.cq_size = ss->ei_hca_attrs->hca_max_cq_sz;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan else
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cq_attr.cq_size = EIB_CTL_CQ_SIZE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_alloc_cq(ss->ei_hca_hdl, &cq_attr, &chan->ch_cq_hdl, &sz);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_ctl_setup_cq: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_alloc_cq(cq_sz=0x%lx) failed, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cq_attr.cq_size, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto ctl_setup_cq_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Set up other parameters for collecting completion information
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_cq_sz = sz;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_wc = kmem_zalloc(sizeof (ibt_wc_t) * sz, KM_SLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Allocate soft interrupt for this vnic's control channel cq
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * handler and set up the IBTL cq handler.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((rv = ddi_intr_add_softint(ss->ei_dip, &vnic->vn_ctl_si_hdl,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_SOFTPRI_CTL, eib_ctl_comp_handler, vnic)) != DDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_ctl_setup_cq: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ddi_intr_add_softint() failed for vnic %d ctl qp, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan vnic->vn_instance, rv);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto ctl_setup_cq_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Now, set up this vnic's control channel completion queue handler
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_set_cq_handler(chan->ch_cq_hdl, eib_ctl_comp_intr, vnic);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_enable_cq_notify(chan->ch_cq_hdl, IBT_NEXT_COMPLETION);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_ctl_setup_cq: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_enable_cq_notify() failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto ctl_setup_cq_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanctl_setup_cq_fail:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_ctl_setup_cq(ss, vnic);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ctl_setup_ud_channel(eib_t *ss, eib_vnic_t *vnic)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_chan_t *chan = vnic->vn_ctl_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_ud_chan_alloc_args_t alloc_attr;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_ud_chan_query_attr_t query_attr;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan bzero(&alloc_attr, sizeof (ibt_ud_chan_alloc_args_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan bzero(&query_attr, sizeof (ibt_ud_chan_query_attr_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan alloc_attr.ud_flags = IBT_ALL_SIGNALED;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan alloc_attr.ud_hca_port_num = ss->ei_props->ep_port_num;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan alloc_attr.ud_pkey_ix = chan->ch_pkey_ix;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan alloc_attr.ud_sizes.cs_sq = EIB_CTL_MAX_SWQE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan alloc_attr.ud_sizes.cs_rq = EIB_CTL_MAX_RWQE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan alloc_attr.ud_sizes.cs_sq_sgl = 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan alloc_attr.ud_sizes.cs_rq_sgl = 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan alloc_attr.ud_sizes.cs_inline = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan alloc_attr.ud_qkey = EIB_FIP_QKEY;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan alloc_attr.ud_scq = chan->ch_cq_hdl;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan alloc_attr.ud_rcq = chan->ch_cq_hdl;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan alloc_attr.ud_pd = ss->ei_pd_hdl;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_alloc_ud_channel(ss->ei_hca_hdl, IBT_ACHAN_NO_FLAGS,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &alloc_attr, &chan->ch_chan, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_ctl_setup_ud_channel: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_alloc_ud_channel(port=0x%x, pkey_ix=0x%x) "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "failed, ret=%d", alloc_attr.ud_hca_port_num,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_pkey_ix, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto ctl_setup_ud_channel_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_query_ud_channel(chan->ch_chan, &query_attr);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_ctl_setup_ud_channel: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_query_ud_channel() failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto ctl_setup_ud_channel_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_qpn = query_attr.ud_qpn;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_max_swqes = query_attr.ud_chan_sizes.cs_sq;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_max_rwqes = query_attr.ud_chan_sizes.cs_rq;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_lwm_rwqes = chan->ch_max_rwqes >> 2;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_rwqe_bktsz = chan->ch_max_rwqes;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_ip_hdr_align = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_alloc_mp = B_FALSE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_tear_down = B_FALSE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanctl_setup_ud_channel_fail:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_ctl_setup_ud_channel(ss, vnic);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ctl_comp_intr(ibt_cq_hdl_t cq_hdl, void *arg)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_vnic_t *vnic = arg;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = vnic->vn_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_chan_t *chan = vnic->vn_ctl_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (cq_hdl != chan->ch_cq_hdl) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_DEBUG(ss->ei_instance, "eib_ctl_comp_intr: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "cq_hdl(0x%llx) != chan->ch_cq_hdl(0x%llx), "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ignoring completion", cq_hdl, chan->ch_cq_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ASSERT(vnic->vn_ctl_si_hdl != NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_intr_trigger_softint(vnic->vn_ctl_si_hdl, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ctl_rx_comp(eib_vnic_t *vnic, eib_wqe_t *wqe)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = vnic->vn_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_chan_t *chan = vnic->vn_ctl_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint8_t *pkt = (uint8_t *)(uintptr_t)(wqe->qe_sgl.ds_va);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Skip the GRH and parse the message in the packet
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) eib_fip_parse_ctl_pkt(pkt + EIB_GRH_SZ, vnic);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Try to repost the rwqe. For control channels, we take the shortcut
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * and not go through eib_chan_post_recv(), since we know that the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * qe_info flag, qe_chan and qe_vinst are all already set correctly; we
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * just took this out of the rx queue, so the ch_rx_posted will be ok
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * if we just posted it back. And there are no mblk allocation or
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * buffer alignment restrictions for this channel as well.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (chan->ch_tear_down) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rsrc_return_rwqe(ss, wqe, chan);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_post_recv(chan->ch_chan, &(wqe->qe_wr.recv), 1, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_ctl_rx_comp: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_post_recv() failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rsrc_return_rwqe(ss, wqe, chan);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ctl_tx_comp(eib_vnic_t *vnic, eib_wqe_t *wqe)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rsrc_return_swqe(vnic->vn_ss, wqe, vnic->vn_ctl_chan);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ctl_err_comp(eib_vnic_t *vnic, eib_wqe_t *wqe, ibt_wc_t *wc)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = vnic->vn_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Currently, all we do is report
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan switch (wc->wc_status) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_WC_WR_FLUSHED_ERR:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_WC_LOCAL_CHAN_OP_ERR:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_ctl_err_comp: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "IBT_WC_LOCAL_CHAN_OP_ERR seen, wqe_info=0x%lx ",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan wqe->qe_info);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_WC_LOCAL_PROTECT_ERR:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_ctl_err_comp: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "IBT_WC_LOCAL_PROTECT_ERR seen, wqe_info=0x%lx ",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan wqe->qe_info);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * When a wc indicates error, we do not attempt to repost but
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * simply return it to the wqe pool.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (EIB_WQE_TYPE(wqe->qe_info) == EIB_WQE_RX)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rsrc_return_rwqe(ss, wqe, vnic->vn_ctl_chan);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan else
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rsrc_return_swqe(ss, wqe, vnic->vn_ctl_chan);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_rb_ctl_setup_cq(eib_t *ss, eib_vnic_t *vnic)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_chan_t *chan = vnic->vn_ctl_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (chan == NULL)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Reset any completion handler we may have set up
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (chan->ch_cq_hdl)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_set_cq_handler(chan->ch_cq_hdl, NULL, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Remove any softint we may have allocated for this cq
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (vnic->vn_ctl_si_hdl) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_intr_remove_softint(vnic->vn_ctl_si_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan vnic->vn_ctl_si_hdl = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Release any work completion buffers we may have allocated
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (chan->ch_wc && chan->ch_cq_sz)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(chan->ch_wc, sizeof (ibt_wc_t) * chan->ch_cq_sz);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_cq_sz = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_wc = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Free any completion queue we may have allocated
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (chan->ch_cq_hdl) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_free_cq(chan->ch_cq_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_rb_ctl_setup_cq: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_free_cq() failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_cq_hdl = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_rb_ctl_setup_ud_channel(eib_t *ss, eib_vnic_t *vnic)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_chan_t *chan = vnic->vn_ctl_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (chan == NULL)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (chan->ch_chan) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * We're trying to tear down this UD channel. Make sure that
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * we don't attempt to refill (repost) at any point from now on.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_tear_down = B_TRUE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = ibt_flush_channel(chan->ch_chan)) != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_rb_ctl_setup_ud_channel: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_flush_channel() failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Wait until all posted tx wqes on this channel are back with
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * the wqe pool.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&chan->ch_tx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while (chan->ch_tx_posted > 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_wait(&chan->ch_tx_cv, &chan->ch_tx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&chan->ch_tx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Wait until all posted rx wqes on this channel are back with
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * the wqe pool.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&chan->ch_rx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while (chan->ch_rx_posted > 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_wait(&chan->ch_rx_cv, &chan->ch_rx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&chan->ch_rx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Now we're ready to free this channel
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = ibt_free_channel(chan->ch_chan)) != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_rb_ctl_setup_ud_channel: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_free_channel() failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_alloc_mp = B_FALSE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_ip_hdr_align = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_rwqe_bktsz = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_lwm_rwqes = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_max_rwqes = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_max_swqes = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_qpn = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_chan = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}