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/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * The Ethernet Over Infiniband Nexus driver is a bus nexus driver
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * that enumerates all the EoIB nodes.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/types.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/conf.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/devops.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/kmem.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/ksynch.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/modctl.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/stat.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 Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Global per-instance EoIB Nexus data. Only one instance
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * of EoIB Nexus is supported
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_t *enx_global_ss = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Static function declarations
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_attach(dev_info_t *, ddi_attach_cmd_t);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_detach(dev_info_t *, ddi_detach_cmd_t);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_bus_ctl(dev_info_t *, dev_info_t *, ddi_ctl_enum_t,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan void *, void *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_get_eventcookie(dev_info_t *, dev_info_t *, char *,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_eventcookie_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_add_eventcall(dev_info_t *, dev_info_t *, ddi_eventcookie_t,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan void (*)(dev_info_t *, ddi_eventcookie_t, void *, void *),
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan void *, ddi_callback_id_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_remove_eventcall(dev_info_t *, ddi_callback_id_t);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_post_event(dev_info_t *, dev_info_t *,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_eventcookie_t, void *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_bus_config(dev_info_t *, uint_t, ddi_bus_config_op_t,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan void *, dev_info_t **);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_bus_unconfig(dev_info_t *, uint_t, ddi_bus_config_op_t,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan void *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_config_all_children(dev_info_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eibnx_unconfig_all_children(dev_info_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_config_child(char *, dev_info_t **);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eibnx_unconfig_child(char *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Cbops
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic struct cb_ops enx_cb_ops = {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_devctl_open, /* cb_open */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_devctl_close, /* cb_close */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nodev, /* cb_strategy */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nodev, /* cb_print */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nodev, /* cb_dump */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nodev, /* cb_read */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nodev, /* cb_write */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_devctl_ioctl, /* cb_ioctl */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nodev, /* cb_devmap */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nodev, /* cb_mmap */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nodev, /* cb_segmap */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nochpoll, /* cb_chpoll */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_prop_op, /* cb_prop_op */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL, /* cb_str */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan D_MP, /* cb_flag */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan CB_REV, /* cb_rev */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nodev, /* cb_aread */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nodev /* cb_awrite */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan};
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Busops
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic struct bus_ops enx_bus_ops = {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan BUSO_REV,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nullbusmap, /* bus_map */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL, /* bus_get_intrspec */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL, /* bus_add_intrspec */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL, /* bus_remove_intrspec */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan i_ddi_map_fault, /* bus_map_fault */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_no_dma_map, /* bus_dma_map */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL, /* bus_dma_allochdl */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL, /* bus_dma_freehdl */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL, /* bus_dma_bindhdl */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL, /* bus_dma_unbindhdl */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL, /* bus_dma_flush */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL, /* bus_dma_win */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL, /* bus_dma_ctl */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_bus_ctl, /* bus_ctl */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_bus_prop_op, /* bus_prop_op */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_get_eventcookie, /* bus_get_eventcookie */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_add_eventcall, /* bus_add_eventcall */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_remove_eventcall, /* bus_remove_eventcall */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_post_event, /* bus_post_event */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL, /* bus_intr_ctl */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_bus_config, /* bus_config */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_bus_unconfig, /* bus_unconfig */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan};
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Nexus ops
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic struct dev_ops enx_ops = {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan DEVO_REV, /* devo_rev, */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan 0, /* devo_refcnt */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_getinfo, /* devo_info */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nulldev, /* devo_identify */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nulldev, /* devo_probe */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_attach, /* devo_attach */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_detach, /* devo_detach */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nodev, /* devo_reset */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &enx_cb_ops, /* devo_cb_ops */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &enx_bus_ops, /* devo_bus_ops */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nulldev, /* devo_power */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_quiesce_not_needed /* devo_quiesce */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan};
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Module linkage information for the kernel
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic struct modldrv enx_modldrv = {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &mod_driverops, /* Driver module */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "EoIB Nexus", /* Driver name and version */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &enx_ops, /* Driver ops */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan};
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic struct modlinkage enx_modlinkage = {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan MODREV_1, (void *)&enx_modldrv, NULL
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan};
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * EoIB NDI events
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic ndi_event_definition_t enx_ndi_event_defs[] = {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan { ENX_EVENT_TAG_GW_INFO_UPDATE, EIB_NDI_EVENT_GW_INFO_UPDATE,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EPL_KERNEL, NDI_EVENT_POST_TO_TGT },
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan { ENX_EVENT_TAG_GW_AVAILABLE, EIB_NDI_EVENT_GW_AVAILABLE,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EPL_KERNEL, NDI_EVENT_POST_TO_TGT },
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan { ENX_EVENT_TAG_LOGIN_ACK, EIB_NDI_EVENT_LOGIN_ACK,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EPL_KERNEL, NDI_EVENT_POST_TO_TGT }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan};
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define ENX_NUM_NDI_EVENTS \
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (sizeof (enx_ndi_event_defs) / sizeof (enx_ndi_event_defs[0]))
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic ndi_event_set_t enx_ndi_events = {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NDI_EVENTS_REV1,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_NUM_NDI_EVENTS,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan enx_ndi_event_defs
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan};
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanndi_event_hdl_t enx_ndi_event_hdl;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Common loadable module entry points _init, _fini, _info
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan_init(void)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = mod_install(&enx_modlinkage)) == 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_debug_init();
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan_fini(void)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = mod_remove(&enx_modlinkage)) == 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_debug_fini();
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan_info(struct modinfo *modinfop)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (mod_info(&enx_modlinkage, modinfop));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Autoconfiguration entry points: attach, detach, getinfo
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_t *ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int instance;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (cmd == DDI_RESUME)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan else if (cmd != DDI_ATTACH)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Don't allow more than one instance to attach
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (enx_global_ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Alloc this instance's softstate
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss = kmem_zalloc(sizeof (eibnx_t), KM_SLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->nx_dip = dip;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan enx_global_ss = ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Allocate our NDI event handle and bind our event set
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ndi_event_alloc_hdl(dip, 0, &enx_ndi_event_hdl,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NDI_SLEEP) != NDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_ERR("ndi_event_alloc_hdl(dip=0x%llx) "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "failed", dip);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(enx_global_ss, sizeof (eibnx_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan enx_global_ss = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ndi_event_bind_set(enx_ndi_event_hdl, &enx_ndi_events,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NDI_SLEEP) != NDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_ERR("ndi_event_bind_set(ndi_event_hdl=0x%llx) "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "failed", enx_ndi_event_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ndi_event_free_hdl(enx_ndi_event_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan enx_ndi_event_hdl = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(enx_global_ss, sizeof (eibnx_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan enx_global_ss = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Create "devctl" minor node for general ioctl interface to the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * eoib nexus. If we cannot, it isn't fatal - we'll operate without
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * the support for devctl (but issue a warning).
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan instance = ddi_get_instance(dip);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ddi_create_minor_node(dip, "devctl", S_IFCHR, instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan DDI_NT_NEXUS, 0) != DDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_WARN("could not create devctl minor node "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "for instance %d", instance);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Do IBTF related initializations. If we fail, we cannot operate,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * so fail the attach.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (eibnx_ibt_init(ss) != ENX_E_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_remove_minor_node(dip, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ndi_event_unbind_set(enx_ndi_event_hdl,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &enx_ndi_events, NDI_SLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ndi_event_free_hdl(enx_ndi_event_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan enx_ndi_event_hdl = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(enx_global_ss, sizeof (eibnx_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan enx_global_ss = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_t *ss = enx_global_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (cmd == DDI_SUSPEND)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan else if (cmd != DDI_DETACH)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If there's no instance of eibnx attached, fail
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss == NULL)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Before we do anything, we need to stop the port monitors
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * we may have started earlier.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_terminate_monitors();
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If eibnx_ibt_fini() fails, it could be because one of the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * HCA's pd could not be freed, the hca could not be closed
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * or the IBTF detach wasn't successful. If this is the case,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * we have to return failure, but cannot do much about the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * port monitors we've already terminated.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (eibnx_ibt_fini(ss) == ENX_E_FAILURE)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Cleanup any devctl minor node we may have created, unbind and
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * free ndi event handle and free the instance softstate.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_remove_minor_node(dip, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ndi_event_unbind_set(enx_ndi_event_hdl,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &enx_ndi_events, NDI_SLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ndi_event_free_hdl(enx_ndi_event_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan enx_ndi_event_hdl = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(enx_global_ss, sizeof (eibnx_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan enx_global_ss = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **resultp)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_t *ss = enx_global_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (cmd == DDI_INFO_DEVT2DEVINFO) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *resultp = (ss) ? ss->nx_dip : NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = (ss) ? DDI_SUCCESS : DDI_FAILURE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if (cmd == DDI_INFO_DEVT2INSTANCE) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *resultp = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = DDI_SUCCESS;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = DDI_FAILURE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Busops: bus_ctl, bus_config, bus_unconfig
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_bus_ctl(dev_info_t *dip, dev_info_t *rdip, ddi_ctl_enum_t ctlop,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan void *arg, void *result)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan dev_info_t *child = arg;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan char name[MAXNAMELEN];
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan switch (ctlop) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case DDI_CTLOPS_REPORTDEV:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_DEBUG("EoIB device: %s@%s, %s%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_node_name(rdip), ddi_get_name_addr(rdip),
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_driver_name(rdip), ddi_get_instance(rdip));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*FALLTHROUGH*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case DDI_CTLOPS_ATTACH:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case DDI_CTLOPS_DETACH:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case DDI_CTLOPS_POWER:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case DDI_CTLOPS_SIDDEV:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case DDI_CTLOPS_IOMIN:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = DDI_SUCCESS;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case DDI_CTLOPS_INITCHILD:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = eibnx_name_child(child, name,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan sizeof (name))) == DDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_set_name_addr(child, name);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case DDI_CTLOPS_UNINITCHILD:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_set_name_addr(child, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = DDI_SUCCESS;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan default:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ddi_ctlops(dip, rdip, ctlop, arg, result);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_bus_config(dev_info_t *parent, uint_t flags,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_bus_config_op_t op, void *arg, dev_info_t **childp)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_t *ss = enx_global_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret = NDI_SUCCESS;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan switch (op) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case BUS_CONFIG_ONE:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_busop_inprog_enter(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = eibnx_config_child(arg, childp);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_busop_inprog_exit(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case BUS_CONFIG_ALL:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case BUS_CONFIG_DRIVER:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_busop_inprog_enter(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ss->nx_busop_flags & NX_FL_BUSCFG_COMPLETE) == 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = eibnx_config_all_children(parent);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret == NDI_SUCCESS)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->nx_busop_flags |= NX_FL_BUSCFG_COMPLETE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_busop_inprog_exit(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan default:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = NDI_FAILURE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret == NDI_SUCCESS)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_busop_bus_config(parent, flags, op, arg, childp, 0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_bus_unconfig(dev_info_t *parent, uint_t flags,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_bus_config_op_t op, void *arg)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_t *ss = enx_global_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ndi_busop_bus_unconfig(parent, flags, op, arg);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != NDI_SUCCESS)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan switch (op) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case BUS_UNCONFIG_ONE:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (flags & (NDI_UNCONFIG | NDI_DEVI_REMOVE)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_busop_inprog_enter(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = eibnx_unconfig_child(arg)) == ENX_E_SUCCESS)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->nx_busop_flags &= (~NX_FL_BUSCFG_COMPLETE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan else {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_DEBUG("eibnx_bus_config: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "unconfig child %s failed", (char *)arg);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_busop_inprog_exit(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case BUS_UNCONFIG_ALL:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case BUS_UNCONFIG_DRIVER:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (flags & (NDI_UNCONFIG | NDI_DEVI_REMOVE)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_busop_inprog_enter(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_unconfig_all_children(parent);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->nx_busop_flags &= (~NX_FL_BUSCFG_COMPLETE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_busop_inprog_exit(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan default:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Event Handling: bus_get_eventcookie, bus_add_eventcall, bus_remove_eventcall
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * and bus_post_event
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_get_eventcookie(dev_info_t *dip, dev_info_t *rdip,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan char *name, ddi_eventcookie_t *cookiep)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ndi_event_retrieve_cookie(enx_ndi_event_hdl, rdip, name,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cookiep, NDI_EVENT_NOPASS));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_add_eventcall(dev_info_t *dip, dev_info_t *rdip, ddi_eventcookie_t cookie,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan void (*callback)(dev_info_t *cb_dip, ddi_eventcookie_t cb_cookie,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan void *cb_arg, void *cb_impl_data),
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan void *arg, ddi_callback_id_t *cb_id)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ndi_event_add_callback(enx_ndi_event_hdl, rdip, cookie,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan callback, arg, NDI_SLEEP, cb_id));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_remove_eventcall(dev_info_t *dip, ddi_callback_id_t cb_id)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ndi_event_remove_callback(enx_ndi_event_hdl, cb_id));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_post_event(dev_info_t *dip, dev_info_t *rdip,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_eventcookie_t cookie, void *impl_data)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ndi_event_run_callbacks(enx_ndi_event_hdl, rdip, cookie,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan impl_data));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Routines to configure/unconfigure EoIB node(s) on a system.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_config_all_children(dev_info_t *parent)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_t *ss = enx_global_ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_hca_t *hca;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_port_t *port;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_thr_info_t *ti;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_thr_info_t *ti_tail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_gw_info_t *gwi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Go through each port of each hca and create a thread to solicit,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * monitor, receive advertisements, create eoib nodes and attach eoib
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * driver instances.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (!ss->nx_monitors_up) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->nx_thr_info = ti_tail = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (hca = ss->nx_hca; hca; hca = hca->hc_next) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (port = hca->hc_port; port; port = port->po_next) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti = eibnx_start_port_monitor(hca, port);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ti_tail) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti_tail->ti_next = ti;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->nx_thr_info = ti;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ti_tail = ti;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->nx_monitors_up = B_TRUE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (NDI_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan while (eibnx_locate_unconfigured_node(&ti, &gwi) == ENX_E_SUCCESS)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) eibnx_configure_node(ti, gwi, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (NDI_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Routine to unconfigure all the EoIB nodes on a system. This terminates
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * all the per-port monitor threads and releases any resources allocated.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_unconfig_all_children(dev_info_t *parent)
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 ch->ch_dip = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ti->ti_child_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->nx_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_config_child(char *devname, dev_info_t **childp)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_thr_info_t *ti;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_gw_info_t *gwi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (eibnx_locate_node_name(devname, &ti, &gwi) == ENX_E_FAILURE) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_DEBUG("eibnx_config_child: invalid eoib "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "nodename %s, no such address", devname);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENX_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (eibnx_configure_node(ti, gwi, childp));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneibnx_unconfig_child(char *devname)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_thr_info_t *ti;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eibnx_gw_info_t *gwi;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (eibnx_locate_node_name(devname, &ti, &gwi) == ENX_E_FAILURE) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ENX_DPRINTF_DEBUG("eibnx_unconfig_child: invalid eoib "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "nodename %s, no such address", devname);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENX_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (eibnx_unconfigure_node(ti, gwi));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}