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/ksynch.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/conf.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/ddi.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/sunddi.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/sunndi.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/ib/clients/eoib/enx_impl.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic char *eibnx_make_nodename(eibnx_thr_info_t *, uint16_t);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * This routine is only called when the port-monitor thread is
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * about to die. Between the time the first mcast solicitation
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * was done by the port-monitor thread and the time it is asked
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * to die, a lot of things could've happened and we need to
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * cleanup all of it.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_cleanup_port_nodes(eibnx_thr_info_t *info)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_t *ss = enx_global_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_nodeq_t *node;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_nodeq_t *prev;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_gw_info_t *gwi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_gw_info_t *gw_list;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_gw_info_t *nxt_gwi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_child_t *child;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_child_t *nxt_child;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_child_t *children;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Since we would've already stopped processing completions for
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * this thread's work queue, we don't have to worry about requests
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * coming in for creation of new eoib nodes. However, there may
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * be pending node creation requests for this port (thr_info)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * that we will have to drop.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->nx_nodeq_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan prev = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (node = ss->nx_nodeq; node; node = node->nc_next) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (node->nc_info != info) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan prev = node;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (prev == NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->nx_nodeq = node->nc_next;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan prev->nc_next = node->nc_next;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(node, sizeof (eibnx_nodeq_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->nx_nodeq_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Now go through the list of all children and free up any
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * resource we might've allocated; note that the child dips
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * could've been offlined/removed by now, so we don't do
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * anything with them.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&info->ti_child_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan children = info->ti_child;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan info->ti_child = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&info->ti_child_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (child = children; child; child = nxt_child) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nxt_child = child->ch_next;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (child->ch_node_name) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(child->ch_node_name, MAXNAMELEN);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(child, sizeof (eibnx_child_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Return all the swqes we've acquired for the gateway unicast
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * solicitations, free any address vectors we've allocated and
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * finally free the gw entries from the list.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&info->ti_gw_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gw_list = info->ti_gw;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan info->ti_gw = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&info->ti_gw_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (gwi = gw_list; gwi; gwi = nxt_gwi) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nxt_gwi = gwi->gw_next;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_release_swqe((eibnx_wqe_t *)(gwi->gw_swqe));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((gwi->gw_addr).ga_vect) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free((gwi->gw_addr).ga_vect,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan sizeof (ibt_adds_vect_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (gwi->gw_addr).ga_vect = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_destroy(&gwi->gw_adv_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(gwi, sizeof (eibnx_gw_info_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Communicate all the details we received about the gateway (via the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * advertisement control message) to the eoib instance we're creating.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_create_node_props(dev_info_t *dip, eibnx_thr_info_t *info,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_gw_info_t *gwi)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int64(DDI_DEV_T_NONE, dip, EIB_PROP_HCA_GUID,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan info->ti_hca_guid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int64() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%llx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_HCA_GUID, info->ti_hca_guid, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_HCA_PORTNUM,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan info->ti_pi->p_port_num);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%lx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_HCA_PORTNUM, info->ti_pi->p_port_num, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int64(DDI_DEV_T_NONE, dip, EIB_PROP_GW_SYS_GUID,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_system_guid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int64() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%llx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_SYS_GUID, gwi->gw_system_guid, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int64(DDI_DEV_T_NONE, dip, EIB_PROP_GW_GUID,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_guid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int64() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%llx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_GUID, gwi->gw_guid, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int64(DDI_DEV_T_NONE, dip, EIB_PROP_GW_SN_PREFIX,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (gwi->gw_addr).ga_gid.gid_prefix);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int64() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%llx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_SN_PREFIX, (gwi->gw_addr).ga_gid.gid_prefix,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_ADV_PERIOD,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_adv_period);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%lx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_ADV_PERIOD, gwi->gw_adv_period, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_KA_PERIOD,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_ka_period);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%lx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_KA_PERIOD, gwi->gw_ka_period, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_VNIC_KA_PERIOD,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_vnic_ka_period);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%lx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_VNIC_KA_PERIOD, gwi->gw_vnic_ka_period, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_CTRL_QPN,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_ctrl_qpn);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%lx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_CTRL_QPN, gwi->gw_ctrl_qpn, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_LID,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_lid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%lx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_LID, gwi->gw_lid, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_PORTID,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_portid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%lx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_PORTID, gwi->gw_portid, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_NUM_NET_VNICS, gwi->gw_num_net_vnics);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%lx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_NUM_NET_VNICS, gwi->gw_num_net_vnics, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_AVAILABLE,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_flag_available);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%lx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_AVAILABLE, gwi->gw_flag_available, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_HOST_VNICS,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_is_host_adm_vnics);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%lx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_HOST_VNICS, gwi->gw_is_host_adm_vnics,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_SL,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_sl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%lx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_SL, gwi->gw_sl, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip, EIB_PROP_GW_N_RSS_QPN,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_n_rss_qpn);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_int() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to 0x%lx for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_N_RSS_QPN, gwi->gw_n_rss_qpn, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_string(DDI_DEV_T_NONE, dip, EIB_PROP_GW_SYS_NAME,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (char *)(gwi->gw_system_name));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_string() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to '%s' for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_SYS_NAME, gwi->gw_system_name, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_string(DDI_DEV_T_NONE, dip, EIB_PROP_GW_PORT_NAME,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (char *)(gwi->gw_port_name));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_string() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to '%s' for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_PORT_NAME, gwi->gw_port_name, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_prop_update_string(DDI_DEV_T_NONE, dip, EIB_PROP_GW_VENDOR_ID,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (char *)(gwi->gw_vendor_id));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != DDI_PROP_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ndi_prop_update_string() failed to set "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s property to '%s' for child dip 0x%llx, ret=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_PROP_GW_VENDOR_ID, gwi->gw_vendor_id, dip, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_name_child(dev_info_t *child, char *name, size_t namesz)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan char *node_name;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((node_name = ddi_get_parent_data(child)) == NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_ERR("ddi_get_parent_data(child=0x%llx) "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "returned NULL", child);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_NOT_WELL_FORMED);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Skip the name and "@" part in the eoib node path and copy the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * address part out to the caller.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) strlcpy(name, node_name + strlen(EIB_DRV_NAME) + 1, namesz);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Synchronization functions to mark/clear the in-progress status of
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * bus config/unconfig operations
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_busop_inprog_enter(eibnx_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->nx_busop_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while (ss->nx_busop_flags & NX_FL_BUSOP_INPROG)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_wait(&ss->nx_busop_cv, &ss->nx_busop_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->nx_busop_flags |= NX_FL_BUSOP_INPROG;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->nx_busop_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_busop_inprog_exit(eibnx_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->nx_busop_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->nx_busop_flags &= (~NX_FL_BUSOP_INPROG);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_broadcast(&ss->nx_busop_cv);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->nx_busop_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_thr_info_t *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_start_port_monitor(eibnx_hca_t *hca, eibnx_port_t *port)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_thr_info_t *ti;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kthread_t *kt;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan dev_info_t *hca_dip;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan const char *hca_drv_name;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int hca_drv_inst;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti = kmem_zalloc(sizeof (eibnx_thr_info_t), KM_SLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_init(&ti->ti_mcg_lock, NULL, MUTEX_DRIVER, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_init(&ti->ti_gw_lock, NULL, MUTEX_DRIVER, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_init(&ti->ti_child_lock, NULL, MUTEX_DRIVER, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_init(&ti->ti_event_lock, NULL, MUTEX_DRIVER, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_init(&ti->ti_event_cv, NULL, CV_DEFAULT, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti->ti_next = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti->ti_hca_guid = hca->hc_guid;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti->ti_hca = hca->hc_hdl;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti->ti_pd = hca->hc_pd;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti->ti_pi = port->po_pi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti->ti_ident = kmem_zalloc(MAXNAMELEN, KM_SLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Prepare the "ident" for EoIB nodes from this port monitor. To
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * associate eoib instances with the corresponding HCA nodes easily,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * and to make sure eoib instance numbers do not change when
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * like-for-like HCA replacements are made, tie up the ident to
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * HCA driver name, HCA driver instance and the HCA port number.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * The eoib node address is later composed using this ident and
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * the gateway port ids after discovery.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((hca_dip = ibtl_ibnex_hcaguid2dip(ti->ti_hca_guid)) == NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("ibtl_ibnex_hcaguid2dip(hca_guid=0x%llx) "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "returned NULL", ti->ti_hca_guid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if ((hca_drv_name = ddi_driver_name(hca_dip)) == NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("hca driver name NULL for "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "hca_guid=0x%llx, hca_dip=0x%llx",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti->ti_hca_guid, hca_dip);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if ((hca_drv_inst = ddi_get_instance(hca_dip)) < 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_ERR("hca driver instance (%d) invalid for "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "hca_guid=0x%llx, hca_dip=0x%llx",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti->ti_hca_guid, hca_dip);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) snprintf(ti->ti_ident, MAXNAMELEN, "%s%d,%x",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan hca_drv_name, hca_drv_inst, ti->ti_pi->p_port_num);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kt = thread_create(NULL, 0, eibnx_port_monitor,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti, 0, &p0, TS_RUN, minclsyspri);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti->ti_kt_did = kt->t_did;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ti);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_stop_port_monitor(eibnx_thr_info_t *ti)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Tell the port monitor thread to stop and wait for it to
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * happen. Before marking it for death, make sure there
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * aren't any completions being processed.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ti->ti_event_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while (ti->ti_event & ENX_EVENT_COMPLETION) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_wait(&ti->ti_event_cv, &ti->ti_event_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti->ti_event |= ENX_EVENT_DIE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_broadcast(&ti->ti_event_cv);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ti->ti_event_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan thread_join(ti->ti_kt_did);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Destroy synchronization primitives initialized for this ti
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_destroy(&ti->ti_event_cv);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_destroy(&ti->ti_event_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_destroy(&ti->ti_child_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_destroy(&ti->ti_gw_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_destroy(&ti->ti_mcg_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(ti->ti_ident, MAXNAMELEN);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(ti, sizeof (eibnx_thr_info_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_terminate_monitors(void)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_t *ss = enx_global_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_thr_info_t *ti_list;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_thr_info_t *ti;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_thr_info_t *ti_next;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti_list = ss->nx_thr_info;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->nx_thr_info = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Ask all the port_monitor threads to die. Before marking them
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * for death, make sure there aren't any completions being
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * processed by the thread.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (ti = ti_list; ti; ti = ti_next) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti_next = ti->ti_next;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_stop_port_monitor(ti);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->nx_monitors_up = B_FALSE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_configure_node(eibnx_thr_info_t *ti, eibnx_gw_info_t *gwi,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan dev_info_t **childp)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_t *ss = enx_global_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan dev_info_t *child_dip;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan char *node_name;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int circular;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Prepare the new node's name
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((node_name = eibnx_make_nodename(ti, gwi->gw_portid)) == NULL)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENX_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ndi_devi_enter(ss->nx_dip, &circular);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (child_dip = ndi_devi_findchild(ss->nx_dip, node_name)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = eibnx_update_child(ti, gwi, child_dip);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret == ENX_E_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ndi_devi_exit(ss->nx_dip, circular);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(node_name, MAXNAMELEN);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (childp) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *childp = child_dip;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENX_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If the node does not already exist, we may need to create it
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (child_dip == NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ndi_devi_alloc_sleep(ss->nx_dip, EIB_DRV_NAME,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (pnode_t)DEVI_SID_NODEID, &child_dip);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_set_parent_data(child_dip, node_name);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_create_node_props(child_dip, ti, gwi);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Whether there was no devinfo node at all for the given node name or
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * we had a devinfo node, but it wasn't in our list of eoib children,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * we'll try to online the instance here.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_DEBUG("onlining %s", node_name);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_devi_online(child_dip, 0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != NDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_ERR("ndi_devi_online(node_name=%s) failed "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "with ret=0x%x", node_name, ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_set_parent_data(child_dip, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ndi_devi_free(child_dip);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ndi_devi_exit(ss->nx_dip, circular);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(node_name, MAXNAMELEN);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENX_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_enqueue_child(ti, gwi, node_name, child_dip);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ndi_devi_exit(ss->nx_dip, circular);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (childp) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *childp = child_dip;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENX_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_unconfigure_node(eibnx_thr_info_t *ti, eibnx_gw_info_t *gwi)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * To unconfigure an eoib node, we only need to set the child's
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * dip to NULL. When the node gets configured again, we either
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * find the dip for the pathname and set it in this child, or
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * allocate a new dip and set it in this child.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (eibnx_update_child(ti, gwi, NULL));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_locate_node_name(char *devname, eibnx_thr_info_t **ti_p,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_gw_info_t **gwi_p)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_t *ss = enx_global_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_thr_info_t *ti;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_gw_info_t *gwi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan char name[MAXNAMELEN];
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Locate the port monitor thread info and gateway info
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * that corresponds to the supplied devname.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (ti = ss->nx_thr_info; ti; ti = ti->ti_next) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ti->ti_ident[0] == '\0')
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan continue;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ti->ti_gw_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (gwi = ti->ti_gw; gwi; gwi = gwi->gw_next) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) snprintf(name, MAXNAMELEN,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s@%s,%x", EIB_DRV_NAME, ti->ti_ident,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan gwi->gw_portid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (strcmp(name, devname) == 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ti->ti_gw_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (gwi) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ti == NULL || gwi == NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENX_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *ti_p = ti;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *gwi_p = gwi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENX_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_locate_unconfigured_node(eibnx_thr_info_t **ti_p, eibnx_gw_info_t **gwi_p)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_t *ss = enx_global_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_thr_info_t *ti;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_child_t *ch;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (ti = ss->nx_thr_info; ti; ti = ti->ti_next) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ti->ti_child_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (ch = ti->ti_child; ch; ch = ch->ch_next) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ch->ch_dip == NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *ti_p = ti;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *gwi_p = ch->ch_gwi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ti->ti_child_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENX_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ti->ti_child_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENX_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic char *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_make_nodename(eibnx_thr_info_t *info, uint16_t gw_portid)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan char *name;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (info->ti_ident[0] == NULL)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan name = kmem_zalloc(MAXNAMELEN, KM_SLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) snprintf(name, MAXNAMELEN, "%s@%s,%x", EIB_DRV_NAME,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan info->ti_ident, gw_portid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (name);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}