843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER START
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The contents of this file are subject to the terms of the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Common Development and Distribution License (the "License").
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You may not use this file except in compliance with the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
843e19887f64dde75055cf8842fc4db2171eff45johnlev * or http://www.opensolaris.org/os/licensing.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * See the License for the specific language governing permissions
843e19887f64dde75055cf8842fc4db2171eff45johnlev * and limitations under the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * When distributing Covered Code, include this CDDL HEADER in each
843e19887f64dde75055cf8842fc4db2171eff45johnlev * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * If applicable, add the following below this CDDL HEADER, with the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * fields enclosed by brackets "[]" replaced with your own identifying
843e19887f64dde75055cf8842fc4db2171eff45johnlev * information: Portions Copyright [yyyy] [name of copyright owner]
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER END
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
193974072f41a843678abf5f61979c748687e66bSherry Moore * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Use is subject to license terms.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Xen network backend - ioemu version.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * HVM guest domains use an emulated network device (typically the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * rtl8139) to access the physical network via IO emulation running in
843e19887f64dde75055cf8842fc4db2171eff45johnlev * a backend domain (generally domain 0).
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The IO emulation code sends and receives packets using DLPI, usually
843e19887f64dde75055cf8842fc4db2171eff45johnlev * through a virtual NIC (vnic).
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The creation of the relevant vnic to correspond to the network interface
843e19887f64dde75055cf8842fc4db2171eff45johnlev * in the guest domain requires the use of 'hotplug' scripts in the backend
843e19887f64dde75055cf8842fc4db2171eff45johnlev * domain. This driver ensures that the hotplug scripts are run when
843e19887f64dde75055cf8842fc4db2171eff45johnlev * such guest domains are created.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * It is used as a result of the 'compatible' property associated with
843e19887f64dde75055cf8842fc4db2171eff45johnlev * IO emulated devices. See /etc/driver_aliases and common/xen/os/xvdi.c.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XNBE_DEBUG 1
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif /* DEBUG */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/types.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/conf.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/sunddi.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/modctl.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <xen/sys/xendev.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef XNBE_DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/cmn_err.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif /* XNBE_DEBUG */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef XNBE_DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlevint xnbe_debug = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif /* XNBE_DEBUG */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevxnbe_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef XNBE_DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (xnbe_debug > 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev cmn_err(CE_NOTE, "xnbe_attach: dip 0x%p, cmd %d",
843e19887f64dde75055cf8842fc4db2171eff45johnlev (void *)dip, cmd);
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif /* XNBE_DEBUG */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case DDI_ATTACH:
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case DDI_RESUME:
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (DDI_SUCCESS);
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (DDI_FAILURE);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev (void) xvdi_post_event(dip, XEN_HP_ADD);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (DDI_SUCCESS);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevxnbe_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef XNBE_DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (xnbe_debug > 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev cmn_err(CE_NOTE, "detach: dip 0x%p, cmd %d",
843e19887f64dde75055cf8842fc4db2171eff45johnlev (void *)dip, cmd);
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif /* XNBE_DEBUG */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case DDI_DETACH:
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (DDI_SUCCESS);
843e19887f64dde75055cf8842fc4db2171eff45johnlev case DDI_SUSPEND:
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (DDI_SUCCESS);
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (DDI_FAILURE);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic struct cb_ops cb_ops = {
843e19887f64dde75055cf8842fc4db2171eff45johnlev nulldev, /* open */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nulldev, /* close */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nodev, /* strategy */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nodev, /* print */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nodev, /* dump */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nodev, /* read */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nodev, /* write */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nodev, /* ioctl */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nodev, /* devmap */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nodev, /* mmap */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nodev, /* segmap */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nochpoll, /* poll */
843e19887f64dde75055cf8842fc4db2171eff45johnlev ddi_prop_op, /* cb_prop_op */
843e19887f64dde75055cf8842fc4db2171eff45johnlev 0, /* streamtab */
843e19887f64dde75055cf8842fc4db2171eff45johnlev D_NEW | D_MP | D_64BIT /* Driver compatibility flag */
843e19887f64dde75055cf8842fc4db2171eff45johnlev};
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic struct dev_ops ops = {
843e19887f64dde75055cf8842fc4db2171eff45johnlev DEVO_REV, /* devo_rev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev 0, /* devo_refcnt */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nulldev, /* devo_getinfo */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nulldev, /* devo_identify */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nulldev, /* devo_probe */
843e19887f64dde75055cf8842fc4db2171eff45johnlev xnbe_attach, /* devo_attach */
843e19887f64dde75055cf8842fc4db2171eff45johnlev xnbe_detach, /* devo_detach */
843e19887f64dde75055cf8842fc4db2171eff45johnlev nodev, /* devo_reset */
843e19887f64dde75055cf8842fc4db2171eff45johnlev &cb_ops, /* devo_cb_ops */
843e19887f64dde75055cf8842fc4db2171eff45johnlev (struct bus_ops *)0, /* devo_bus_ops */
193974072f41a843678abf5f61979c748687e66bSherry Moore NULL, /* devo_power */
193974072f41a843678abf5f61979c748687e66bSherry Moore ddi_quiesce_not_needed, /* devo_quiesce */
843e19887f64dde75055cf8842fc4db2171eff45johnlev};
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic struct modldrv modldrv = {
193974072f41a843678abf5f61979c748687e66bSherry Moore &mod_driverops, "xnbe driver", &ops,
843e19887f64dde75055cf8842fc4db2171eff45johnlev};
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic struct modlinkage modlinkage = {
843e19887f64dde75055cf8842fc4db2171eff45johnlev MODREV_1, &modldrv, NULL
843e19887f64dde75055cf8842fc4db2171eff45johnlev};
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevint
843e19887f64dde75055cf8842fc4db2171eff45johnlev_init(void)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (mod_install(&modlinkage));
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevint
843e19887f64dde75055cf8842fc4db2171eff45johnlev_info(struct modinfo *modinfop)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (mod_info(&modlinkage, modinfop));
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevint
843e19887f64dde75055cf8842fc4db2171eff45johnlev_fini(void)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (mod_remove(&modlinkage));
843e19887f64dde75055cf8842fc4db2171eff45johnlev}