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 driver
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
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/mac_provider.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/mac_ether.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#include <sys/ib/clients/eoib/eib_impl.h>
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Driver entry point declarations
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_attach(dev_info_t *, ddi_attach_cmd_t);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_detach(dev_info_t *, ddi_detach_cmd_t);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * MAC callbacks
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_m_stat(void *, uint_t, uint64_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_m_start(void *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_m_stop(void *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_m_promisc(void *, boolean_t);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_m_multicast(void *, boolean_t, const uint8_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_m_unicast(void *, const uint8_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic mblk_t *eib_m_tx(void *, mblk_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic boolean_t eib_m_getcapab(void *, mac_capab_t, void *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_m_setprop(void *, const char *, mac_prop_id_t, uint_t,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan const void *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_m_getprop(void *, const char *, mac_prop_id_t, uint_t, void *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_m_propinfo(void *, const char *, mac_prop_id_t,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_prop_info_handle_t);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Devops definition
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki RajagopalanDDI_DEFINE_STREAM_OPS(eib_ops, nulldev, nulldev, eib_attach, eib_detach,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan nodev, NULL, D_MP, NULL, ddi_quiesce_not_needed);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Module Driver Info
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic struct modldrv eib_modldrv = {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &mod_driverops, /* Driver module */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "EoIB Driver", /* Driver name and version */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &eib_ops, /* Driver ops */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan};
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Module Linkage
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic struct modlinkage eib_modlinkage = {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan MODREV_1, (void *)&eib_modldrv, NULL
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan};
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * GLDv3 entry points
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_M_CALLBACK_FLAGS \
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (MC_GETCAPAB | MC_SETPROP | MC_GETPROP | MC_PROPINFO)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic mac_callbacks_t eib_m_callbacks = {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_M_CALLBACK_FLAGS,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_m_stat,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_m_start,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_m_stop,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_m_promisc,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_m_multicast,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_m_unicast,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_m_tx,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_m_getcapab,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_m_setprop,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_m_getprop,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_m_propinfo
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan};
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Async handler callback for ibt events
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic ibt_clnt_modinfo_t eib_clnt_modinfo = {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan IBTI_V_CURR,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan IBT_NETWORK,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_ibt_async_handler,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan NULL,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DRV_NAME
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan};
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Driver State Pointer
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanvoid *eib_state;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Declarations private to this file
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_state_init(eib_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_add_event_callbacks(eib_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int eib_register_with_mac(eib_t *, dev_info_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_rb_attach(eib_t *, uint_t);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_rb_state_init(eib_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_rb_add_event_callbacks(eib_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void eib_rb_register_with_mac(eib_t *);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Definitions private to this file
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_ATTACH_STATE_ALLOCD 0x01
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_ATTACH_PROPS_PARSED 0x02
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_ATTACH_STATE_INIT_DONE 0x04
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_ATTACH_IBT_ATT_DONE 0x08
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_ATTACH_EV_CBS_ADDED 0x10
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan#define EIB_ATTACH_REGISTER_MAC_DONE 0x20
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan_init()
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ddi_name_to_major(EIB_DRV_NAME) == (major_t)-1)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENODEV);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = ddi_soft_state_init(&eib_state, sizeof (eib_t), 0)) != 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_init_ops(&eib_ops, EIB_DRV_NAME);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = mod_install(&eib_modlinkage)) != 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_fini_ops(&eib_ops);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_soft_state_fini(&eib_state);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_debug_init();
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(&eib_modlinkage, modinfop));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanint
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan_fini()
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = mod_remove(&eib_modlinkage)) != 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_debug_fini();
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_fini_ops(&eib_ops);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_soft_state_fini(&eib_state);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int instance;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t progress = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (cmd != DDI_ATTACH)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Allocate softstate for this instance
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan instance = ddi_get_instance(dip);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ddi_soft_state_zalloc(eib_state, instance) == DDI_FAILURE)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto attach_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan progress |= EIB_ATTACH_STATE_ALLOCD;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss = ddi_get_soft_state(eib_state, instance);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_dip = dip;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_instance = (uint_t)instance;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Parse the node properties and get the gateway parameters
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * for this instance
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (eib_get_props(ss) != EIB_E_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_attach: eib_get_props() failed");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto attach_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan progress |= EIB_ATTACH_PROPS_PARSED;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Do per-state initialization
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (eib_state_init(ss) != EIB_E_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_attach: eib_state_init() failed");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto attach_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan progress |= EIB_ATTACH_STATE_INIT_DONE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Attach to IBTL
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = ibt_attach(&eib_clnt_modinfo, ss->ei_dip, ss,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &ss->ei_ibt_hdl)) != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_attach: ibt_attach() failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto attach_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan progress |= EIB_ATTACH_IBT_ATT_DONE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Register NDI event callbacks with EoIB nexus
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (eib_add_event_callbacks(ss) != EIB_E_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_attach: eib_add_event_callbacks() failed");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto attach_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan progress |= EIB_ATTACH_EV_CBS_ADDED;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Register with mac layer
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (eib_register_with_mac(ss, dip) != EIB_E_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_attach: eib_register_with_mac() failed");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan goto attach_fail;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan progress |= EIB_ATTACH_REGISTER_MAC_DONE;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanattach_fail:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_attach(ss, progress);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int instance;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (cmd != DDI_DETACH)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan instance = ddi_get_instance(dip);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss = ddi_get_soft_state(eib_state, instance);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If we had not cleaned up rx buffers (and hca resources) during
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * unplumb because they were stuck with the nw layer at the time,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * we can try to clean them up now before doing the detach.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_set_nic_state(ss, EIB_NIC_STOPPING);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_rsrc_setup_bufs(ss, B_FALSE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_tx || ss->ei_rx || ss->ei_lso) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_detach: buffers still not returned "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "(tx=0x%llx, rx=0x%llx, lso=0x%llx), could "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "not detach", ss->ei_tx, ss->ei_rx, ss->ei_lso);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_clr_nic_state(ss, EIB_NIC_STOPPING);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_hca_hdl) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_ibt_hca_init(ss, ~0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_clr_nic_state(ss, EIB_NIC_STOPPING);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_attach(ss, ~0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (DDI_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_m_stat(void *arg, uint_t stat, uint64_t *val)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = arg;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_stats_t *stats = ss->ei_stats;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan switch (stat) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_IFSPEED:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = ss->ei_props->ep_ifspeed;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_OBYTES:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = stats->st_obytes;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_OPACKETS:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = stats->st_opkts;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_BRDCSTXMT:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = stats->st_brdcstxmit;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_MULTIXMT:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = stats->st_multixmit;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_OERRORS:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = stats->st_oerrors;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_NOXMTBUF:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = stats->st_noxmitbuf;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_RBYTES:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = stats->st_rbytes;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_IPACKETS:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = stats->st_ipkts;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_BRDCSTRCV:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = stats->st_brdcstrcv;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_MULTIRCV:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = stats->st_multircv;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_IERRORS:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = stats->st_ierrors;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_STAT_NORCVBUF:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = stats->st_norcvbuf;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case ETHER_STAT_LINK_DUPLEX:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *val = LINK_DUPLEX_FULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan default:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENOTSUP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_m_start(void *arg)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = arg;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret = -1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_set_nic_state(ss, EIB_NIC_STARTING);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ss->ei_node_state->ns_nic_state & EIB_NIC_STARTED) == 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = eib_mac_start(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret == 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_upd_nic_state(ss, EIB_NIC_STARTING, EIB_NIC_STARTED);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan else
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_clr_nic_state(ss, EIB_NIC_STARTING);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_m_stop(void *arg)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = arg;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_set_nic_state(ss, EIB_NIC_STOPPING);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ss->ei_node_state->ns_nic_state & EIB_NIC_STARTED) != 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_stop(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_mac_clr_nic_state(ss, EIB_NIC_STARTED|EIB_NIC_STOPPING);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_m_promisc(void *arg, boolean_t flag)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = arg;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ss->ei_node_state->ns_nic_state & EIB_NIC_STARTED) == 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (eib_mac_promisc(ss, flag));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_m_multicast(void *arg, boolean_t add, const uint8_t *mcast_mac)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = arg;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ss->ei_node_state->ns_nic_state & EIB_NIC_STARTED) == 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * We don't have any knowledge which of the vnics built on top of
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * the physlink is this multicast group relevant for. We'll join
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * it for vnic0 for now.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Since the tx routine in EoIB currently piggy backs all multicast
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * traffic over the broadcast channel, and all vnics are joined to
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * the broadcast address when they're created, everyone should receive
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * all multicast traffic anyway.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * On the rx side, we'll check if the incoming multicast address is
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * either on the vnic's list of mcgs joined to (which will only be the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * broadcast address) or on vnic0's list of mcgs. If we find a match,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * we let the packet come through.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * This isn't perfect, but it's the best we can do given that we don't
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * have any vlan information corresponding to this multicast address.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Also, for now we'll use the synchronous multicast joins and
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * leaves instead of the asynchronous mechanism provided by
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * ibt_join_mcg() since that involves additional complexity for failed
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * joins and removals.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (eib_mac_multicast(ss, add, (uint8_t *)mcast_mac));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_m_unicast(void *arg, const uint8_t *macaddr)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = arg;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_vnic_t *vnic;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ss->ei_node_state->ns_nic_state & EIB_NIC_STARTED) == 0)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_enter(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan vnic = ss->ei_vnic[0];
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (bcmp(macaddr, vnic->vn_login_data.ld_assigned_mac,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ETHERADDRL) == 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (0);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_exit(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EINVAL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic mblk_t *
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_m_tx(void *arg, mblk_t *mp)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = arg;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mblk_t *next;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If the nic hasn't been started, drop the message(s)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ss->ei_node_state->ns_nic_state & EIB_NIC_STARTED) == 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan freemsgchain(mp);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan for (; mp != NULL; mp = next) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Detach this message from the message chain
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan next = mp->b_next;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mp->b_next = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Attempt to send the message; if we fail (likely due
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * to lack of resources), reattach this message to the
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * chain and return the unsent chain back. When we're
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * ready to send again, we'll issue a mac_tx_update().
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (eib_mac_tx(ss, mp) != EIB_E_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mp->b_next = next;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (mp);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic boolean_t
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_m_getcapab(void *arg, mac_capab_t cap, void *cap_data)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = arg;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_caps_t *caps = ss->ei_caps;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_caps_t s_caps;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_hca_attr_t hca_attrs;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If we haven't been plumbed yet, try getting the hca attributes
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * and figure out the capabilities now
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (caps == NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ASSERT(ss->ei_props != NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_query_hca_byguid(ss->ei_props->ep_hca_guid,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &hca_attrs);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret == IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_ibt_record_capab(ss, &hca_attrs, &s_caps);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps = &s_caps;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((caps != NULL) && (cap == MAC_CAPAB_HCKSUM)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint32_t *tx_flags = cap_data;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (caps->cp_cksum_flags == 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_m_getcapab: hw cksum disabled, cksum_flags=0");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (B_FALSE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan *tx_flags = caps->cp_cksum_flags;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (B_TRUE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if ((caps != NULL) && (cap == MAC_CAPAB_LSO)) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_capab_lso_t *cap_lso = cap_data;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * If the HCA supports LSO, it will advertise a non-zero
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * "max lso size" parameter. Also, LSO relies on hw
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * checksum being available. Finally, if the HCA
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * doesn't provide the reserved-lkey capability, LSO
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * will adversely affect the performance. So, we'll
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * enable LSO only if we have a non-zero max lso size,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * support checksum offload and provide reserved lkey.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (caps->cp_lso_maxlen == 0 ||
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_cksum_flags == 0 ||
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_resv_lkey_capab == 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_VERBOSE(ss->ei_instance, "eib_m_getcapab: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "LSO disabled, lso_maxlen=0x%lx, "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "cksum_flags=0x%lx, resv_lkey_capab=%d",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_lso_maxlen,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_cksum_flags,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan caps->cp_resv_lkey_capab);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (B_FALSE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cap_lso->lso_flags = LSO_TX_BASIC_TCP_IPV4;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cap_lso->lso_basic_tcp_ipv4.lso_max = caps->cp_lso_maxlen - 1;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (B_TRUE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (B_FALSE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_m_setprop(void *arg, const char *pr_name, mac_prop_id_t pr_num,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t pr_valsize, const void *pr_val)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (ENOTSUP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_m_getprop(void *arg, const char *pr_name, mac_prop_id_t pr_num,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint_t pr_valsize, void *pr_val)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_t *ss = arg;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan link_duplex_t duplex = LINK_DUPLEX_FULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan uint64_t speed = ss->ei_props->ep_ifspeed;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int err = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan switch (pr_num) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_PROP_DUPLEX:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ASSERT(pr_valsize >= sizeof (link_duplex_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan bcopy(&duplex, pr_val, sizeof (link_duplex_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_PROP_SPEED:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ASSERT(pr_valsize >= sizeof (uint64_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan bcopy(&speed, pr_val, sizeof (speed));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_PROP_PRIVATE:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (strcmp(pr_name, EIB_DLPROP_GW_EPORT_STATE) == 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_gw_eport_state == FIP_EPORT_UP) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) snprintf(pr_val, pr_valsize,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s", "up");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) snprintf(pr_val, pr_valsize,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "%s", "down");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if (strcmp(pr_name, EIB_DLPROP_HCA_GUID) == 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) snprintf(pr_val, pr_valsize, "%llX",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (u_longlong_t)ss->ei_props->ep_hca_guid);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if (strcmp(pr_name, EIB_DLPROP_PORT_GUID) == 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) snprintf(pr_val, pr_valsize, "%llX",
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (u_longlong_t)((ss->ei_props->ep_sgid).gid_guid));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan default:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan err = ENOTSUP;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (err);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan/*ARGSUSED*/
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t pr_num,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_prop_info_handle_t prh)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan switch (pr_num) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_PROP_DUPLEX:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_PROP_SPEED:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_PROP_MTU:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_prop_info_set_range_uint32(prh, ETHERMTU, ETHERMTU);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan case MAC_PROP_PRIVATE:
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (strcmp(pr_name, EIB_DLPROP_GW_EPORT_STATE) == 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_prop_info_set_default_str(prh, "up ");
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if (strcmp(pr_name, EIB_DLPROP_HCA_GUID) == 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan } else if (strcmp(pr_name, EIB_DLPROP_PORT_GUID) == 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_prop_info_set_perm(prh, MAC_PROP_PERM_READ);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan break;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_state_init(eib_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kthread_t *kt;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Initialize synchronization primitives
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_init(&ss->ei_vnic_lock, NULL, MUTEX_DRIVER, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_init(&ss->ei_av_lock, NULL, MUTEX_DRIVER, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_init(&ss->ei_ev_lock, NULL, MUTEX_DRIVER, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_init(&ss->ei_rxpost_lock, NULL, MUTEX_DRIVER, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_init(&ss->ei_vnic_req_lock, NULL, MUTEX_DRIVER, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_init(&ss->ei_ka_vnics_lock, NULL, MUTEX_DRIVER, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_init(&ss->ei_vnic_cv, NULL, CV_DEFAULT, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_init(&ss->ei_ev_cv, NULL, CV_DEFAULT, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_init(&ss->ei_rxpost_cv, NULL, CV_DEFAULT, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_init(&ss->ei_vnic_req_cv, NULL, CV_DEFAULT, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_init(&ss->ei_ka_vnics_cv, NULL, CV_DEFAULT, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Create a node state structure and initialize
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_node_state = kmem_zalloc(sizeof (eib_node_state_t), KM_SLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_node_state->ns_link_state = LINK_STATE_UNKNOWN;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_init(&ss->ei_node_state->ns_lock, NULL, MUTEX_DRIVER, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_init(&ss->ei_node_state->ns_cv, NULL, CV_DEFAULT, NULL);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Allocate for gathering statistics
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_stats = kmem_zalloc(sizeof (eib_stats_t), KM_SLEEP);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Start up service threads
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kt = thread_create(NULL, 0, eib_events_handler, ss, 0,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &p0, TS_RUN, minclsyspri);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_events_handler = kt->t_did;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kt = thread_create(NULL, 0, eib_refill_rwqes, ss, 0,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &p0, TS_RUN, minclsyspri);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_rwqes_refiller = kt->t_did;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kt = thread_create(NULL, 0, eib_vnic_creator, ss, 0,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &p0, TS_RUN, minclsyspri);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_vnic_creator = kt->t_did;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kt = thread_create(NULL, 0, eib_manage_keepalives, ss, 0,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &p0, TS_RUN, minclsyspri);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_keepalives_manager = kt->t_did;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Set default state of gw eport
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_gw_eport_state = FIP_EPORT_UP;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Do static initializations of common structures
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_reserved_gid.gid_prefix = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_reserved_gid.gid_guid = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_add_event_callbacks(eib_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_eventcookie_t login_ack_evc;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_eventcookie_t gw_alive_evc;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_eventcookie_t gw_info_evc;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Add callback for receiving vnic login acks from the gateway
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = ddi_get_eventcookie(ss->ei_dip, EIB_NDI_EVENT_LOGIN_ACK,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &login_ack_evc)) != DDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_add_event_callbacks: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ddi_get_eventcookie(LOGIN_ACK) failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = ddi_add_event_handler(ss->ei_dip, login_ack_evc,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_login_ack_cb, ss, &ss->ei_login_ack_cb)) != DDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_add_event_callbacks: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ddi_add_event_handler(LOGIN_ACK) failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Add callback for receiving status on gateway transitioning from
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * not-available to available
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = ddi_get_eventcookie(ss->ei_dip, EIB_NDI_EVENT_GW_AVAILABLE,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &gw_alive_evc)) != DDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_add_event_callbacks: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ddi_get_eventcookie(GW_AVAILABLE) failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_remove_event_handler(ss->ei_login_ack_cb);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = ddi_add_event_handler(ss->ei_dip, gw_alive_evc,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_gw_alive_cb, ss, &ss->ei_gw_alive_cb)) != DDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_add_event_callbacks: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ddi_add_event_handler(GW_AVAILABLE) failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_remove_event_handler(ss->ei_login_ack_cb);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Add callback for receiving gateway info update
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = ddi_get_eventcookie(ss->ei_dip, EIB_NDI_EVENT_GW_INFO_UPDATE,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &gw_info_evc)) != DDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_add_event_callbacks: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ddi_get_eventcookie(GW_INFO_UPDATE) failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_remove_event_handler(ss->ei_gw_alive_cb);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_remove_event_handler(ss->ei_login_ack_cb);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = ddi_add_event_handler(ss->ei_dip, gw_info_evc,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_gw_info_cb, ss, &ss->ei_gw_info_cb)) != DDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_add_event_callbacks: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ddi_add_event_handler(GW_INFO) failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_remove_event_handler(ss->ei_gw_alive_cb);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_remove_event_handler(ss->ei_login_ack_cb);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic int
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_register_with_mac(eib_t *ss, dev_info_t *dip)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_register_t *macp;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((macp = mac_alloc(MAC_VERSION)) == NULL) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_register_with_mac: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "mac_alloc(MAC_VERSION=%d) failed", MAC_VERSION);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Note that when we register with mac during attach, we don't
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * have the mac address yet (we'll get that after we login into
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * the gateway) so we'll simply register a zero macaddr that
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * we'll overwrite later during plumb, in eib_m_start(). Likewise,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * we'll also update the max-sdu with the correct MTU after we
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * figure it out when we login to the gateway during plumb.
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan macp->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan macp->m_driver = ss;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan macp->m_dip = dip;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan macp->m_src_addr = eib_zero_mac;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan macp->m_callbacks = &eib_m_callbacks;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan macp->m_min_sdu = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan macp->m_max_sdu = ETHERMTU;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan macp->m_margin = VLAN_TAGSZ;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan macp->m_priv_props = eib_pvt_props;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = mac_register(macp, &ss->ei_mac_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mac_free(macp);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_ERR(ss->ei_instance, "eib_register_with_mac: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "mac_register() failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_FAILURE);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan return (EIB_E_SUCCESS);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_rb_attach(eib_t *ss, uint_t progress)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ibt_status_t ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int instance;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (progress & EIB_ATTACH_REGISTER_MAC_DONE)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_register_with_mac(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (progress & EIB_ATTACH_EV_CBS_ADDED)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_add_event_callbacks(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (progress & EIB_ATTACH_IBT_ATT_DONE) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ret = ibt_detach(ss->ei_ibt_hdl);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ret != IBT_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance, "eib_rb_attach: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "ibt_detach() failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_ibt_hdl = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (progress & EIB_ATTACH_STATE_INIT_DONE)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_state_init(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (progress & EIB_ATTACH_PROPS_PARSED)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_rb_get_props(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (progress & EIB_ATTACH_STATE_ALLOCD) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan instance = ddi_get_instance(ss->ei_dip);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_soft_state_free(eib_state, instance);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_rb_state_init(eib_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Terminate service threads
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_keepalives_manager) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_stop_manage_keepalives(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_keepalives_manager = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_vnic_creator) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_stop_vnic_creator(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_vnic_creator = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_rwqes_refiller) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_stop_refill_rwqes(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_rwqes_refiller = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_events_handler) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan eib_stop_events_handler(ss);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_events_handler = 0;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Remove space allocated for gathering statistics
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_stats) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(ss->ei_stats, sizeof (eib_stats_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_stats = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Remove space allocated for keeping node state
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ss->ei_node_state) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_destroy(&ss->ei_node_state->ns_cv);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_destroy(&ss->ei_node_state->ns_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan kmem_free(ss->ei_node_state, sizeof (eib_node_state_t));
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_node_state = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan /*
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan * Finally, destroy all synchronization resources
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan */
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_destroy(&ss->ei_ka_vnics_cv);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_destroy(&ss->ei_vnic_req_cv);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_destroy(&ss->ei_rxpost_cv);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_destroy(&ss->ei_ev_cv);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan cv_destroy(&ss->ei_vnic_cv);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_destroy(&ss->ei_ka_vnics_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_destroy(&ss->ei_vnic_req_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_destroy(&ss->ei_rxpost_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_destroy(&ss->ei_ev_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_destroy(&ss->ei_av_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan mutex_destroy(&ss->ei_vnic_lock);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_rb_add_event_callbacks(eib_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ddi_eventcookie_t evc;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ddi_get_eventcookie(ss->ei_dip, EIB_NDI_EVENT_GW_INFO_UPDATE,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &evc) == DDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_remove_event_handler(ss->ei_gw_info_cb);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_gw_info_cb = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ddi_get_eventcookie(ss->ei_dip, EIB_NDI_EVENT_GW_AVAILABLE,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &evc) == DDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_remove_event_handler(ss->ei_gw_alive_cb);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_gw_alive_cb = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if (ddi_get_eventcookie(ss->ei_dip, EIB_NDI_EVENT_LOGIN_ACK,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan &evc) == DDI_SUCCESS) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan (void) ddi_remove_event_handler(ss->ei_login_ack_cb);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_login_ack_cb = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalanstatic void
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalaneib_rb_register_with_mac(eib_t *ss)
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan{
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan int ret;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan if ((ret = mac_unregister(ss->ei_mac_hdl)) != 0) {
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan EIB_DPRINTF_WARN(ss->ei_instance,
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "eib_rb_register_with_mac: "
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan "mac_unregister() failed, ret=%d", ret);
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan }
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan ss->ei_mac_hdl = NULL;
b494511a9cf72b1fc4eb13a0e593f55c624ab829Venki Rajagopalan}