d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * CDDL HEADER START
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * The contents of this file are subject to the terms of the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Common Development and Distribution License (the "License").
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * You may not use this file except in compliance with the License.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * or http://www.opensolaris.org/os/licensing.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * See the License for the specific language governing permissions
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * and limitations under the License.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * When distributing Covered Code, include this CDDL HEADER in each
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * If applicable, add the following below this CDDL HEADER, with the
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * fields enclosed by brackets "[]" replaced with your own identifying
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * information: Portions Copyright [yyyy] [name of copyright owner]
d62bc4badc1c1f1549c961cfb8b420e650e1272byz *
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * CDDL HEADER END
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
e8ed0869d5c65afe0c37c4755bf81f7381d1f43cJohn Beck
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Use is subject to license terms.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * This module provides the dacf functions to be called after a device
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * of "ddi_network" node type has attached and before it detaches.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Specifically, net_postattach() will be called during the post-attach
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * process of each "ddi_network" device, and net_predetach() will be
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * called during the pre-detach process of each device.
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/modctl.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/sunddi.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/ddi.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/dacf.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz#include <sys/softmac.h>
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * DACF entry points
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic int net_postattach(dacf_infohdl_t, dacf_arghdl_t, int);
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic int net_predetach(dacf_infohdl_t, dacf_arghdl_t, int);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic dacf_op_t net_config_op[] = {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { DACF_OPID_POSTATTACH, net_postattach },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { DACF_OPID_PREDETACH, net_predetach },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { DACF_OPID_END, NULL },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz};
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic dacf_opset_t opsets[] = {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { "net_config", net_config_op },
d62bc4badc1c1f1549c961cfb8b420e650e1272byz { NULL, NULL }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz};
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic struct dacfsw dacfsw = {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz DACF_MODREV_1,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz opsets
d62bc4badc1c1f1549c961cfb8b420e650e1272byz};
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic struct modldacf modldacf = {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz &mod_dacfops,
d62bc4badc1c1f1549c961cfb8b420e650e1272byz "net DACF",
d62bc4badc1c1f1549c961cfb8b420e650e1272byz &dacfsw
d62bc4badc1c1f1549c961cfb8b420e650e1272byz};
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
e8ed0869d5c65afe0c37c4755bf81f7381d1f43cJohn Beckstatic struct modlinkage modlinkage = {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz MODREV_1, &modldacf, NULL
d62bc4badc1c1f1549c961cfb8b420e650e1272byz};
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzint
d62bc4badc1c1f1549c961cfb8b420e650e1272byz_init(void)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (mod_install(&modlinkage));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzint
d62bc4badc1c1f1549c961cfb8b420e650e1272byz_fini(void)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (mod_remove(&modlinkage));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byzint
d62bc4badc1c1f1549c961cfb8b420e650e1272byz_info(struct modinfo *modinfop)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (mod_info(&modlinkage, modinfop));
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Post-attach routine invoked for DDI_NT_NET drivers by DACF framework
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/* ARGSUSED */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic int
d62bc4badc1c1f1549c961cfb8b420e650e1272byznet_postattach(dacf_infohdl_t info_hdl, dacf_arghdl_t arg_hdl, int flags)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dev_info_t *dip;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dev_t dev;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz int err;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dip = dacf_devinfo_node(info_hdl);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dev = dacf_get_dev(info_hdl);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if ((err = softmac_create(dip, dev)) != 0) {
d62bc4badc1c1f1549c961cfb8b420e650e1272byz const char *drvname;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz int ppa;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz drvname = ddi_driver_name(dip);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz ppa = i_ddi_devi_get_ppa(dip);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz cmn_err(CE_WARN, "net_postattach: cannot create softmac "
d62bc4badc1c1f1549c961cfb8b420e650e1272byz "for device %s%d (%d)", drvname, ppa, err);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DACF_FAILURE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz }
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DACF_SUCCESS);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/*
d62bc4badc1c1f1549c961cfb8b420e650e1272byz * Pre-detach routine invoked for DDI_NT_NET drivers by DACF framework
d62bc4badc1c1f1549c961cfb8b420e650e1272byz */
d62bc4badc1c1f1549c961cfb8b420e650e1272byz/* ARGSUSED */
d62bc4badc1c1f1549c961cfb8b420e650e1272byzstatic int
d62bc4badc1c1f1549c961cfb8b420e650e1272byznet_predetach(dacf_infohdl_t info_hdl, dacf_arghdl_t arg_hdl, int flags)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz{
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dev_info_t *dip;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dev_t dev;
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dip = dacf_devinfo_node(info_hdl);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz dev = dacf_get_dev(info_hdl);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz if (softmac_destroy(dip, dev) != 0)
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DACF_FAILURE);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz
d62bc4badc1c1f1549c961cfb8b420e650e1272byz return (DACF_SUCCESS);
d62bc4badc1c1f1549c961cfb8b420e650e1272byz}