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#include <sys/dlpi.h> /* HCKSUM_INET_FULL_V4 */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/pattr.h> /* HCK_FULLCKSUM */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/ib/mgt/sm_attr.h> /* SM_INIT_TYPE_REPLY_... */
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 void eib_ibt_reset_partitions(eib_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_ibt_wakeup_sqd_waiters(eib_t *, ibt_channel_hdl_t);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_ibt_chan_pkey(eib_t *, eib_chan_t *, ib_pkey_t, boolean_t,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan boolean_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic boolean_t eib_ibt_has_chan_pkey_changed(eib_t *, eib_chan_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic boolean_t eib_ibt_has_any_pkey_changed(eib_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_ibt_fill_avect(eib_t *, eib_avect_t *, ib_lid_t);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_ibt_record_srate(eib_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Definitions private to this file
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * SM's init type reply flags
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_PORT_ATTR_LOADED(itr) \
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (((itr) & SM_INIT_TYPE_REPLY_NO_LOAD_REPLY) == 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_PORT_ATTR_NOT_PRESERVED(itr) \
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (((itr) & SM_INIT_TYPE_PRESERVE_CONTENT_REPLY) == 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_PORT_PRES_NOT_PRESERVED(itr) \
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (((itr) & SM_INIT_TYPE_PRESERVE_PRESENCE_REPLY) == 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * eib_ibt_hca_init() initialization progress flags
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_HCAINIT_HCA_OPENED 0x01
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_HCAINIT_ATTRS_ALLOCD 0x02
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_HCAINIT_HCA_PORTS_QUERIED 0x04
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_HCAINIT_PD_ALLOCD 0x08
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_HCAINIT_CAPAB_RECORDED 0x10
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_hca_init(eib_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_hca_portinfo_t *pi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t num_pi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t sz_pi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t progress = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_hca_hdl)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Open the HCA
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_open_hca(ss->ei_ibt_hdl, ss->ei_props->ep_hca_guid,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &ss->ei_hca_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_open_hca(hca_guid=0x%llx) "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "failed, ret=%d", ss->ei_props->ep_hca_guid, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto ibt_hca_init_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan progress |= EIB_HCAINIT_HCA_OPENED;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Query and store HCA attributes
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_hca_attrs = kmem_zalloc(sizeof (ibt_hca_attr_t), KM_SLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan progress |= EIB_HCAINIT_ATTRS_ALLOCD;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_query_hca(ss->ei_hca_hdl, ss->ei_hca_attrs);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_query_hca(hca_hdl=0x%llx, "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "hca_guid=0x%llx) failed, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_hca_hdl, ss->ei_props->ep_hca_guid, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto ibt_hca_init_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * At this point, we don't even care about the linkstate, we only want
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * to record our invariant base port guid and mtu
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_query_hca_ports(ss->ei_hca_hdl, ss->ei_props->ep_port_num,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &pi, &num_pi, &sz_pi);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_query_hca_ports(hca_hdl=0x%llx, "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "port=0x%x) failed, ret=%d", ss->ei_hca_hdl,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_port_num, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto ibt_hca_init_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (num_pi != 1) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_query_hca_ports(hca_hdl=0x%llx, "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "port=0x%x) returned num_pi=%d", ss->ei_hca_hdl,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_port_num, num_pi);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_free_portinfo(pi, sz_pi);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto ibt_hca_init_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_sgid = pi->p_sgid_tbl[0];
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_mtu = (128 << pi->p_mtu);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_free_portinfo(pi, sz_pi);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan progress |= EIB_HCAINIT_HCA_PORTS_QUERIED;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Allocate a protection domain for all our transactions
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_alloc_pd(ss->ei_hca_hdl, IBT_PD_NO_FLAGS, &ss->ei_pd_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_alloc_pd(hca_hdl=0x%llx, "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "hca_guid=0x%llx) failed, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_hca_hdl, ss->ei_props->ep_hca_guid, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto ibt_hca_init_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan progress |= EIB_HCAINIT_PD_ALLOCD;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Finally, record the capabilities
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_caps = kmem_zalloc(sizeof (eib_caps_t), KM_SLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_ibt_record_capab(ss, ss->ei_hca_attrs, ss->ei_caps);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_ibt_record_srate(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan progress |= EIB_HCAINIT_CAPAB_RECORDED;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanibt_hca_init_fail:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_ibt_hca_init(ss, progress);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_link_mod(eib_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_node_state_t *ns = ss->ei_node_state;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_hca_portinfo_t *pi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint8_t vn0_mac[ETHERADDRL];
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan boolean_t all_zombies = B_FALSE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan boolean_t all_need_rejoin = B_FALSE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t num_pi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t sz_pi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint8_t itr;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ns->ns_link_state == LINK_STATE_UNKNOWN)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * See if we can get the port attributes or we're as good as down.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_query_hca_ports(ss->ei_hca_hdl, ss->ei_props->ep_port_num,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &pi, &num_pi, &sz_pi);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret != IBT_SUCCESS) || (pi->p_linkstate != IBT_PORT_ACTIVE)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_free_portinfo(pi, sz_pi);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_link_down(ss, B_FALSE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If the SM re-initialized the port attributes, but did not preserve
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * the old attributes, we need to check more.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan itr = pi->p_init_type_reply;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (EIB_PORT_ATTR_LOADED(itr) && EIB_PORT_ATTR_NOT_PRESERVED(itr)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * We're just coming back up; if we see that our base lid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * or sgid table has changed, we'll update these and try to
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * restart all active vnics. If any of the vnic pkeys have
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * changed, we'll reset the affected channels to the new pkey.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (bcmp(pi->p_sgid_tbl, &ss->ei_props->ep_sgid,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan sizeof (ib_gid_t)) != 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_ibt_link_mod: port sgid table changed "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "(old %llx.%llx != new %llx.%llx), "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "all vnics are zombies now.",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_sgid.gid_prefix,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_sgid.gid_guid,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan pi->p_sgid_tbl[0].gid_prefix,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan pi->p_sgid_tbl[0].gid_guid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_sgid = pi->p_sgid_tbl[0];
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan all_zombies = B_TRUE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if (ss->ei_props->ep_blid != pi->p_base_lid) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_ibt_link_mod: port base lid changed "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "(old 0x%x != new 0x%x), "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "all vnics are zombies now.",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_blid, pi->p_base_lid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_blid = pi->p_base_lid;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan all_zombies = B_TRUE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if (eib_ibt_has_any_pkey_changed(ss)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_ibt_link_mod: pkey has changed for vnic(s), "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "resetting all partitions");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_ibt_reset_partitions(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (pi) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_free_portinfo(pi, sz_pi);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If the SM hasn't preserved our presence in MCGs, we need to
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * rejoin all of them.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (EIB_PORT_PRES_NOT_PRESERVED(itr)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance, "eib_ibt_link_mod: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "hca_guid=0x%llx, port=0x%x presence not preserved in SM, "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "rejoining all mcgs", ss->ei_props->ep_hca_guid,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_port_num);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan all_need_rejoin = B_TRUE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Before we do the actual work of restarting/rejoining, we need to
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * see if the GW is reachable at this point of time. If not, we
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * still continue to keep our link "down." Whenever the GW becomes
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * reachable again, we'll restart/rejoin all the vnics that we've
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * just marked.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (all_zombies) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_zombie_vnics = ss->ei_active_vnics;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (all_need_rejoin) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_rejoin_vnics = ss->ei_active_vnics;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_gw_unreachable) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance, "eib_ibt_link_mod: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "gateway (gw_port=0x%x) unreachable for "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "hca_guid=0x%llx, port=0x%x, link state down",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_gw_props->pp_gw_portid, ss->ei_props->ep_hca_guid,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_port_num);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_link_down(ss, B_FALSE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Try to awaken the dead if possible
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan bcopy(eib_zero_mac, vn0_mac, ETHERADDRL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (all_zombies) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance, "eib_ibt_link_mod: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "hca_guid=0x%llx, hca_port=0x%x, gw_port=0x%x, "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "attempting to resurrect zombies",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_hca_guid, ss->ei_props->ep_port_num,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_gw_props->pp_gw_portid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_vnic_resurrect_zombies(ss, vn0_mac);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Re-join the mcgs if we need to
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (all_need_rejoin) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance, "eib_ibt_link_mod: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "hca_guid=0x%llx, hca_port=0x%x, gw_port=0x%x, "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "attempting to rejoin mcgs",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_hca_guid, ss->ei_props->ep_port_num,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_gw_props->pp_gw_portid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_vnic_rejoin_mcgs(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If we've restarted the zombies because the gateway went down and
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * came back, it is possible our unicast mac address changed from
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * what it was earlier. If so, we need to update our unicast address
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * with the mac layer before marking the link up.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (bcmp(vn0_mac, eib_zero_mac, ETHERADDRL) != 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_unicst_update(ss->ei_mac_hdl, vn0_mac);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Notify the link state up if required
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_link_up(ss, B_FALSE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_modify_chan_pkey(eib_t *ss, eib_chan_t *chan, ib_pkey_t pkey)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Make sure the channel pkey and index are set to what we need
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (eib_ibt_chan_pkey(ss, chan, pkey, B_TRUE, NULL));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_avect_t *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_hold_avect(eib_t *ss, ib_lid_t dlid, uint8_t sl)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t ndx = dlid % EIB_AV_NBUCKETS; /* simple hashing */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_avect_t *av;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_avect_t *prev;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->ei_av_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * See if we have the address vector
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan prev = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (av = ss->ei_av[ndx]; av; av = av->av_next) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan prev = av;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((av->av_vect).av_dlid == dlid)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If we don't have it, create a new one and chain it to
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * the same bucket
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (av == NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan av = kmem_zalloc(sizeof (eib_avect_t), KM_NOSLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (av == NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->ei_av_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance, "eib_ibt_hold_avect: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "no memory, could not allocate address vector");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = EIB_E_FAILURE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (!eib_wa_no_av_discover)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = eib_ibt_fill_avect(ss, av, dlid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != EIB_E_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (av->av_vect).av_srate = IBT_SRATE_10;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (av->av_vect).av_srvl = sl;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (av->av_vect).av_port_num = ss->ei_props->ep_port_num;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (av->av_vect).av_send_grh = B_FALSE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (av->av_vect).av_dlid = dlid;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (av->av_vect).av_src_path = 0; /* we use base lid */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (prev)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan prev->av_next = av;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan else
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_av[ndx] = av;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Increment the address vector reference count before returning
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (av->av_ref)++;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->ei_av_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (av);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_fill_avect(eib_t *ss, eib_avect_t *av, ib_lid_t dlid)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_node_info_t ni;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_path_attr_t attr;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_path_info_t path;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ib_gid_t dgid;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = ibt_lid_to_node_info(dlid, &ni)) != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance, "eib_ibt_fill_avect: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_lid_to_node_info(dlid=0x%x) failed, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan dlid, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan dgid.gid_prefix = ss->ei_gw_props->pp_gw_sn_prefix;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan dgid.gid_guid = ni.n_port_guid;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Get the reversible path information for this destination
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan bzero(&attr, sizeof (ibt_path_info_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan attr.pa_sgid = ss->ei_props->ep_sgid;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan attr.pa_dgids = &dgid;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan attr.pa_num_dgids = 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan bzero(&path, sizeof (ibt_path_info_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_get_paths(ss->ei_ibt_hdl, IBT_PATH_NO_FLAGS,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &attr, 1, &path, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret != IBT_SUCCESS) || (path.pi_hca_guid == 0)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance, "eib_ibt_fill_avect: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_get_paths(dgid=%llx.%llx) failed, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan dgid.gid_prefix, dgid.gid_guid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Fill in the address vector
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan bcopy(&path.pi_prim_cep_path.cep_adds_vect, &av->av_vect,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan sizeof (ibt_adds_vect_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_release_avect(eib_t *ss, eib_avect_t *av)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->ei_av_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ASSERT(av->av_ref > 0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (av->av_ref)--;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->ei_av_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_free_avects(eib_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_avect_t *av;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_avect_t *av_next;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ndx;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->ei_av_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (ndx = 0; ndx < EIB_AV_NBUCKETS; ndx++) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (av = ss->ei_av[ndx]; av; av = av_next) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan av_next = av->av_next;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ASSERT(av->av_ref == 0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(av, sizeof (eib_avect_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_av[ndx] = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->ei_av_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_async_handler(void *clnt_private, ibt_hca_hdl_t hca_hdl,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_async_code_t code, ibt_async_event_t *event)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = (eib_t *)clnt_private;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_event_t *evi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t ev_code;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ev_code = EIB_EV_NONE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan switch (code) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_EVENT_SQD:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_ibt_async_handler: got IBT_EVENT_SQD");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_ibt_wakeup_sqd_waiters(ss, event->ev_chan_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_EVENT_PORT_UP:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (event->ev_port == ss->ei_props->ep_port_num) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_ibt_async_handler: got IBT_EVENT_PORT_UP");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ev_code = EIB_EV_PORT_UP;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_ERROR_PORT_DOWN:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (event->ev_port == ss->ei_props->ep_port_num) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_ibt_async_handler: got IBT_ERROR_PORT_DOWN");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ev_code = EIB_EV_PORT_DOWN;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_CLNT_REREG_EVENT:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (event->ev_port == ss->ei_props->ep_port_num) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_ibt_async_handler: got IBT_CLNT_REREG_EVENT");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ev_code = EIB_EV_CLNT_REREG;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_PORT_CHANGE_EVENT:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((event->ev_port == ss->ei_props->ep_port_num) &&
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (event->ev_port_flags & IBT_PORT_CHANGE_PKEY)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_ibt_async_handler: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "got IBT_PORT_CHANGE_EVENT(PKEY_CHANGE)");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ev_code = EIB_EV_PKEY_CHANGE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if ((event->ev_port == ss->ei_props->ep_port_num) &&
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (event->ev_port_flags & IBT_PORT_CHANGE_SGID)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_ibt_async_handler: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "got IBT_PORT_CHANGE_EVENT(SGID_CHANGE)");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ev_code = EIB_EV_SGID_CHANGE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_HCA_ATTACH_EVENT:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * For HCA attach, after a new HCA is plugged in and
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * configured using cfgadm, an explicit plumb will need
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * to be run, so we don't need to do anything here.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance, "eib_ibt_async_handler: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "got IBT_HCA_ATTACH_EVENT");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_HCA_DETACH_EVENT:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Before an HCA unplug, cfgadm is expected to trigger
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * any rcm scripts to unplumb the EoIB instances on the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * card. If so, we should not be holding any hca resource,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * since we don't do ibt_open_hca() until plumb time. However,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * if an earlier unplumb hadn't cleaned up the hca resources
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * properly because the network layer hadn't returned the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * buffers at that time, we could be holding hca resources.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * We'll try to release them here, and protect the code from
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * racing with some other plumb/unplumb operation.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance, "eib_ibt_async_handler: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "got IBT_HCA_DETACH_EVENT");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_set_nic_state(ss, EIB_NIC_STOPPING);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_rsrc_setup_bufs(ss, B_FALSE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_tx || ss->ei_rx || ss->ei_lso) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_events_handler: nw layer still holding "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "hca resources, could not detach HCA");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if (ss->ei_hca_hdl) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_ibt_hca_init(ss, ~0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_clr_nic_state(ss, EIB_NIC_STOPPING);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ev_code != EIB_EV_NONE) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan evi = kmem_zalloc(sizeof (eib_event_t), KM_NOSLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (evi == NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_ibt_async_handler: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "no memory, could not handle event 0x%lx", ev_code);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan evi->ev_code = ev_code;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan evi->ev_arg = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_svc_enqueue_event(ss, evi);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_record_capab(eib_t *ss, ibt_hca_attr_t *hca_attrs, eib_caps_t *caps)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t max_swqe = EIB_DATA_MAX_SWQE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t max_rwqe = EIB_DATA_MAX_RWQE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Checksum
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_cksum_flags = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((!eib_wa_no_cksum_offload) &&
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (hca_attrs->hca_flags & IBT_HCA_CKSUM_FULL)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_cksum_flags =
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan HCK_FULLCKSUM | HCKSUM_INET_FULL_V4;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /* HCKSUM_INET_FULL_V4 | HCKSUM_IPHDRCKSUM; */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Reserved L-Key
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (hca_attrs->hca_flags2 & IBT_HCA2_RES_LKEY) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_resv_lkey_capab = 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_resv_lkey = hca_attrs->hca_reserved_lkey;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * LSO
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_lso_maxlen = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (!eib_wa_no_lso) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (hca_attrs->hca_max_lso_size > EIB_LSO_MAXLEN) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_lso_maxlen = EIB_LSO_MAXLEN;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_lso_maxlen = hca_attrs->hca_max_lso_size;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * SGL
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Translating virtual address regions into physical regions
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * for using the Reserved LKey feature results in a wr sgl that
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * is a little longer. Since failing ibt_map_mem_iov() is costly,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * we'll record a high-water mark (65%) when we should stop
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * trying to use Reserved LKey
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (hca_attrs->hca_flags & IBT_HCA_WQE_SIZE_INFO) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_max_sgl = hca_attrs->hca_ud_send_sgl_sz;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_max_sgl = hca_attrs->hca_max_sgl;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (caps->cp_max_sgl > EIB_MAX_SGL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_max_sgl = EIB_MAX_SGL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_hiwm_sgl = (caps->cp_max_sgl * 65) / 100;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * SWQE/RWQE: meet max chan size and max cq size limits (leave room
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * to avoid cq overflow event)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (max_swqe > hca_attrs->hca_max_chan_sz)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan max_swqe = hca_attrs->hca_max_chan_sz;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (max_swqe > (hca_attrs->hca_max_cq_sz - 1))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan max_swqe = hca_attrs->hca_max_cq_sz - 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_max_swqe = max_swqe;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (max_rwqe > hca_attrs->hca_max_chan_sz)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan max_rwqe = hca_attrs->hca_max_chan_sz;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (max_rwqe > (hca_attrs->hca_max_cq_sz - 1))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan max_rwqe = hca_attrs->hca_max_cq_sz - 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_max_rwqe = max_rwqe;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_rb_ibt_hca_init(eib_t *ss, uint_t progress)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (progress & EIB_HCAINIT_CAPAB_RECORDED) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_caps) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(ss->ei_caps, sizeof (eib_caps_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_caps = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (progress & EIB_HCAINIT_PD_ALLOCD) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_pd_hdl) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_free_pd(ss->ei_hca_hdl, ss->ei_pd_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_rb_ibt_hca_init: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_free_pd(hca_hdl=0x%lx, pd_hdl=0x%lx) "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "failed, ret=%d", ss->ei_hca_hdl,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_pd_hdl, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_pd_hdl = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (progress & EIB_HCAINIT_HCA_PORTS_QUERIED) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_mtu = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan bzero(&ss->ei_props->ep_sgid, sizeof (ib_gid_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (progress & EIB_HCAINIT_ATTRS_ALLOCD) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(ss->ei_hca_attrs, sizeof (ibt_hca_attr_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_hca_attrs = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (progress & EIB_HCAINIT_HCA_OPENED) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_close_hca(ss->ei_hca_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_close_hca(hca_hdl=0x%lx) failed, "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ret=%d", ss->ei_hca_hdl, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_hca_hdl = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_reset_partitions(eib_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_vnic_t *vnic;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_chan_t *chan = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint64_t av;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int inst = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * We already have the vhub pkey recorded in our eib_chan_t.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * We only need to make sure our pkey index still matches it.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If not, modify the channel appropriately and update our
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * records.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((chan = ss->ei_admin_chan) != NULL)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) eib_ibt_modify_chan_pkey(ss, chan, chan->ch_pkey);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan av = ss->ei_active_vnics;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while ((inst = EIB_FIND_LSB_SET(av)) != -1) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((vnic = ss->ei_vnic[inst]) != NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((chan = vnic->vn_ctl_chan) != NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) eib_ibt_modify_chan_pkey(ss, chan,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_pkey);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((chan = vnic->vn_data_chan) != NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) eib_ibt_modify_chan_pkey(ss, chan,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_pkey);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan av &= (~((uint64_t)1 << inst));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_wakeup_sqd_waiters(eib_t *ss, ibt_channel_hdl_t ev_chan_hdl)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_vnic_t *vnic;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_chan_t *chan = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint64_t av;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int inst = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * See if this channel has been waiting for its queue to drain.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Note that since this is especially likely to be called during
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * logging in to the gateway, we also need to check the vnic
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * currently being created.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((vnic = ss->ei_vnic_pending) != NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan = vnic->vn_ctl_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((chan) && (chan->ch_chan == ev_chan_hdl))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto wakeup_sqd_waiters;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan = vnic->vn_data_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((chan) && (chan->ch_chan == ev_chan_hdl))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto wakeup_sqd_waiters;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan av = ss->ei_active_vnics;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while ((inst = EIB_FIND_LSB_SET(av)) != -1) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((vnic = ss->ei_vnic[inst]) != NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan = vnic->vn_ctl_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (chan->ch_chan == ev_chan_hdl)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan = vnic->vn_data_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (chan->ch_chan == ev_chan_hdl)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan av &= (~((uint64_t)1 << inst));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanwakeup_sqd_waiters:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (chan) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&chan->ch_cep_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_cep_state = IBT_STATE_SQD;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_broadcast(&chan->ch_cep_cv);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&chan->ch_cep_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_chan_pkey(eib_t *ss, eib_chan_t *chan, ib_pkey_t new_pkey,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan boolean_t set, boolean_t *pkey_changed)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_qp_info_t qp_attr;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint16_t new_pkey_ix;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_pkey2index(ss->ei_hca_hdl, ss->ei_props->ep_port_num,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan new_pkey, &new_pkey_ix);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance, "eib_ibt_chan_pkey: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_pkey2index(hca_hdl=0x%llx, port_num=0x%x, "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "pkey=0x%x) failed, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_hca_hdl, ss->ei_props->ep_port_num, new_pkey, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If the pkey and the pkey index we have already matches the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * new one, nothing to do.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&chan->ch_pkey_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((chan->ch_pkey == new_pkey) && (chan->ch_pkey_ix == new_pkey_ix)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (pkey_changed) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *pkey_changed = B_FALSE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&chan->ch_pkey_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (pkey_changed) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *pkey_changed = B_TRUE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&chan->ch_pkey_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Otherwise, if we're asked only to test if the pkey index
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * supplied matches the one recorded in the channel, return
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * success, but don't set the pkey.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (!set) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Otherwise, we need to change channel pkey. Pause the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * channel sendq first.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_pause_sendq(chan->ch_chan, IBT_CEP_SET_SQD_EVENT);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance, "eib_ibt_chan_pkey: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_pause_sendq(chan_hdl=0x%llx) failed, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_chan, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Wait for the channel to enter the IBT_STATE_SQD state
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&chan->ch_cep_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while (chan->ch_cep_state != IBT_STATE_SQD)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_wait(&chan->ch_cep_cv, &chan->ch_cep_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&chan->ch_cep_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Modify the qp with the supplied pkey index and unpause the channel
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If either of these operations fail, we'll leave the channel in
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * the paused state and fail.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan bzero(&qp_attr, sizeof (ibt_qp_info_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan qp_attr.qp_trans = IBT_UD_SRV;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan qp_attr.qp_current_state = IBT_STATE_SQD;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan qp_attr.qp_state = IBT_STATE_SQD;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan qp_attr.qp_transport.ud.ud_pkey_ix = new_pkey_ix;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Modify the qp to set the new pkey index, then unpause the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * channel and put it in RTS state and update the new values
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * in our records
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&chan->ch_pkey_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_modify_qp(chan->ch_chan,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan IBT_CEP_SET_STATE | IBT_CEP_SET_PKEY_IX, &qp_attr, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&chan->ch_pkey_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance, "eib_ibt_chan_pkey: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_modify_qp(chan_hdl=0x%llx, IBT_CEP_SET_PKEY_IX) "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "failed for new_pkey_ix=0x%x, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_chan, new_pkey_ix, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = ibt_unpause_sendq(chan->ch_chan)) != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&chan->ch_pkey_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance, "eib_ibt_chan_pkey: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_unpause_sendq(chan_hdl=0x%llx) failed, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_chan, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_pkey = new_pkey;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan->ch_pkey_ix = new_pkey_ix;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&chan->ch_pkey_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic boolean_t
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_has_chan_pkey_changed(eib_t *ss, eib_chan_t *chan)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan boolean_t changed;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Don't modify the pkey, just ask if the pkey index for the channel's
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * pkey has changed for any reason. If we fail, assume that the pkey
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * has changed.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = eib_ibt_chan_pkey(ss, chan, chan->ch_pkey, B_FALSE, &changed);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != EIB_E_SUCCESS)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan changed = B_TRUE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (changed);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic boolean_t
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_has_any_pkey_changed(eib_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_vnic_t *vnic;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_chan_t *chan = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint64_t av;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int inst = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Return true if the pkey index of any our pkeys (of the channels
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * of all active vnics) has changed.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan = ss->ei_admin_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((chan) && (eib_ibt_has_chan_pkey_changed(ss, chan)))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (B_TRUE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan av = ss->ei_active_vnics;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while ((inst = EIB_FIND_LSB_SET(av)) != -1) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((vnic = ss->ei_vnic[inst]) != NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan = vnic->vn_ctl_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((chan) && (eib_ibt_has_chan_pkey_changed(ss, chan)))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (B_TRUE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan chan = vnic->vn_data_chan;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((chan) && (eib_ibt_has_chan_pkey_changed(ss, chan)))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (B_TRUE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan av &= (~((uint64_t)1 << inst));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (B_FALSE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * This routine is currently used simply to derive and record the port
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * speed from the loopback path information (for debug purposes). For
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * EoIB, currently the srate used in address vectors to IB neighbors
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * and the gateway is fixed at IBT_SRATE_10. Eventually though, this
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * information (and sl) has to come from the gateway for all destinations
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * in the vhub table.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_ibt_record_srate(eib_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ib_gid_t sgid = ss->ei_props->ep_sgid;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_srate_t srate = IBT_SRATE_10;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_path_info_t path;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_path_attr_t path_attr;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint8_t num_paths;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan bzero(&path_attr, sizeof (path_attr));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan path_attr.pa_dgids = &sgid;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan path_attr.pa_num_dgids = 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan path_attr.pa_sgid = sgid;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_get_paths(ss->ei_ibt_hdl, IBT_PATH_NO_FLAGS,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &path_attr, 1, &path, &num_paths);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret == IBT_SUCCESS && num_paths >= 1) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan switch (srate = path.pi_prim_cep_path.cep_adds_vect.av_srate) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_SRATE_2:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_SRATE_10:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_SRATE_30:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_SRATE_5:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_SRATE_20:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_SRATE_40:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_SRATE_60:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_SRATE_80:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case IBT_SRATE_120:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan default:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan srate = IBT_SRATE_10;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_props->ep_srate = srate;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_DEBUG(ss->ei_instance, "eib_ibt_record_srate: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "srate = %d", srate);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}