tphci.c revision 193974072f41a843678abf5f61979c748687e66b
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
99653d4ee642c6528e88224f12409a5f23060994eschrock * CDDL HEADER START
99653d4ee642c6528e88224f12409a5f23060994eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * The contents of this file are subject to the terms of the
99653d4ee642c6528e88224f12409a5f23060994eschrock * Common Development and Distribution License (the "License").
99653d4ee642c6528e88224f12409a5f23060994eschrock * You may not use this file except in compliance with the License.
99653d4ee642c6528e88224f12409a5f23060994eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99653d4ee642c6528e88224f12409a5f23060994eschrock * or http://www.opensolaris.org/os/licensing.
99653d4ee642c6528e88224f12409a5f23060994eschrock * See the License for the specific language governing permissions
99653d4ee642c6528e88224f12409a5f23060994eschrock * and limitations under the License.
99653d4ee642c6528e88224f12409a5f23060994eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * When distributing Covered Code, include this CDDL HEADER in each
99653d4ee642c6528e88224f12409a5f23060994eschrock * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
99653d4ee642c6528e88224f12409a5f23060994eschrock * If applicable, add the following below this CDDL HEADER, with the
99653d4ee642c6528e88224f12409a5f23060994eschrock * fields enclosed by brackets "[]" replaced with your own identifying
99653d4ee642c6528e88224f12409a5f23060994eschrock * information: Portions Copyright [yyyy] [name of copyright owner]
99653d4ee642c6528e88224f12409a5f23060994eschrock *
99653d4ee642c6528e88224f12409a5f23060994eschrock * CDDL HEADER END
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
cbf75e67acb6c32a2f4884f28a839d59f7988d37Stephen Hanson * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
99653d4ee642c6528e88224f12409a5f23060994eschrock * Use is subject to license terms.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * The tphci driver can be used to exercise the mpxio framework together
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * with tvhci/tclient.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/conf.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock#include <sys/file.h>
99653d4ee642c6528e88224f12409a5f23060994eschrock#include <sys/open.h>
99653d4ee642c6528e88224f12409a5f23060994eschrock#include <sys/stat.h>
99653d4ee642c6528e88224f12409a5f23060994eschrock#include <sys/modctl.h>
99653d4ee642c6528e88224f12409a5f23060994eschrock#include <sys/ddi.h>
99653d4ee642c6528e88224f12409a5f23060994eschrock#include <sys/sunddi.h>
99653d4ee642c6528e88224f12409a5f23060994eschrock#include <sys/sunndi.h>
99653d4ee642c6528e88224f12409a5f23060994eschrock#include <sys/sunmdi.h>
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock#include <sys/disp.h>
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock/* cb_ops entry points */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int tphci_open(dev_t *, int, int, cred_t *);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int tphci_close(dev_t, int, int, cred_t *);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int tphci_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int tphci_attach(dev_info_t *, ddi_attach_cmd_t);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int tphci_detach(dev_info_t *, ddi_detach_cmd_t);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int tphci_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock/* bus_ops entry points */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int tphci_ctl(dev_info_t *, dev_info_t *, ddi_ctl_enum_t, void *,
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock void *);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int tphci_initchild(dev_info_t *, dev_info_t *);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int tphci_uninitchild(dev_info_t *, dev_info_t *);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int tphci_bus_config(dev_info_t *, uint_t, ddi_bus_config_op_t, void *,
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock dev_info_t **);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int tphci_bus_unconfig(dev_info_t *, uint_t, ddi_bus_config_op_t,
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock void *);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int tphci_intr_op(dev_info_t *dip, dev_info_t *rdip,
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_intr_op_t op, ddi_intr_handle_impl_t *hdlp, void *result);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic void *tphci_state;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstruct tphci_state {
99653d4ee642c6528e88224f12409a5f23060994eschrock dev_info_t *dip;
99653d4ee642c6528e88224f12409a5f23060994eschrock};
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic struct cb_ops tphci_cb_ops = {
99653d4ee642c6528e88224f12409a5f23060994eschrock tphci_open, /* open */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock tphci_close, /* close */
99653d4ee642c6528e88224f12409a5f23060994eschrock nodev, /* strategy */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock nodev, /* print */
99653d4ee642c6528e88224f12409a5f23060994eschrock nodev, /* dump */
99653d4ee642c6528e88224f12409a5f23060994eschrock nodev, /* read */
99653d4ee642c6528e88224f12409a5f23060994eschrock nodev, /* write */
99653d4ee642c6528e88224f12409a5f23060994eschrock tphci_ioctl, /* ioctl */
99653d4ee642c6528e88224f12409a5f23060994eschrock nodev, /* devmap */
99653d4ee642c6528e88224f12409a5f23060994eschrock nodev, /* mmap */
99653d4ee642c6528e88224f12409a5f23060994eschrock nodev, /* segmap */
990b4856d0eaada6f8140335733a1b1771ed2746lling nochpoll, /* chpoll */
990b4856d0eaada6f8140335733a1b1771ed2746lling ddi_prop_op, /* cb_prop_op */
99653d4ee642c6528e88224f12409a5f23060994eschrock 0, /* streamtab */
99653d4ee642c6528e88224f12409a5f23060994eschrock D_NEW | D_MP, /* cb_flag */
99653d4ee642c6528e88224f12409a5f23060994eschrock CB_REV, /* rev */
99653d4ee642c6528e88224f12409a5f23060994eschrock nodev, /* aread */
99653d4ee642c6528e88224f12409a5f23060994eschrock nodev /* awrite */
99653d4ee642c6528e88224f12409a5f23060994eschrock};
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic struct bus_ops tphci_bus_ops = {
99653d4ee642c6528e88224f12409a5f23060994eschrock BUSO_REV, /* busops_rev */
99653d4ee642c6528e88224f12409a5f23060994eschrock nullbusmap, /* bus_map */
99653d4ee642c6528e88224f12409a5f23060994eschrock NULL, /* bus_get_intrspec */
99653d4ee642c6528e88224f12409a5f23060994eschrock NULL, /* bus_add_interspec */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock NULL, /* bus_remove_interspec */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock i_ddi_map_fault, /* bus_map_fault */
99653d4ee642c6528e88224f12409a5f23060994eschrock ddi_no_dma_map, /* bus_dma_map */
99653d4ee642c6528e88224f12409a5f23060994eschrock ddi_no_dma_allochdl, /* bus_dma_allochdl */
99653d4ee642c6528e88224f12409a5f23060994eschrock NULL, /* bus_dma_freehdl */
99653d4ee642c6528e88224f12409a5f23060994eschrock NULL, /* bus_dma_bindhdl */
99653d4ee642c6528e88224f12409a5f23060994eschrock NULL, /* bus_dma_unbindhdl */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock NULL, /* bus_dma_flush */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock NULL, /* bus_dma_win */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock NULL, /* bus_dma_ctl */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock tphci_ctl, /* bus_ctl */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_bus_prop_op, /* bus_prop_op */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock NULL, /* bus_get_eventcookie */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock NULL, /* bus_add_eventcall */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock NULL, /* bus_remove_event */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock NULL, /* bus_post_event */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock NULL, /* bus_intr_ctl */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock tphci_bus_config, /* bus_config */
99653d4ee642c6528e88224f12409a5f23060994eschrock tphci_bus_unconfig, /* bus_unconfig */
99653d4ee642c6528e88224f12409a5f23060994eschrock NULL, /* bus_fm_init */
99653d4ee642c6528e88224f12409a5f23060994eschrock NULL, /* bus_fm_fini */
99653d4ee642c6528e88224f12409a5f23060994eschrock NULL, /* bus_fm_access_enter */
99653d4ee642c6528e88224f12409a5f23060994eschrock NULL, /* bus_fm_access_exit */
99653d4ee642c6528e88224f12409a5f23060994eschrock NULL, /* bus_power */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock tphci_intr_op /* bus_intr_op */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock};
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrockstatic struct dev_ops tphci_ops = {
99653d4ee642c6528e88224f12409a5f23060994eschrock DEVO_REV,
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock 0,
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock tphci_getinfo,
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock nulldev, /* identify */
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock nulldev, /* probe */
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock tphci_attach, /* attach and detach are mandatory */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock tphci_detach,
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock nodev, /* reset */
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock &tphci_cb_ops, /* cb_ops */
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock &tphci_bus_ops, /* bus_ops */
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock NULL, /* power */
99653d4ee642c6528e88224f12409a5f23060994eschrock ddi_quiesce_not_needed, /* quiesce */
99653d4ee642c6528e88224f12409a5f23060994eschrock};
99653d4ee642c6528e88224f12409a5f23060994eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockextern struct mod_ops mod_driverops;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockstatic struct modldrv modldrv = {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock &mod_driverops,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock "test phci driver",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock &tphci_ops
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock};
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockstatic struct modlinkage modlinkage = {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock MODREV_1,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock &modldrv,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock NULL
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock};
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockint
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock_init(void)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock int rval;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if ((rval = ddi_soft_state_init(&tphci_state,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock sizeof (struct tphci_state), 2)) != 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (rval);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if ((rval = mod_install(&modlinkage)) != 0) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ddi_soft_state_fini(&tphci_state);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (rval);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock}
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockint
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock_fini(void)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock int rval;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /*
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock * don't start cleaning up until we know that the module remove
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock * has worked -- if this works, then we know that each instance
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock * has successfully been detached
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock if ((rval = mod_remove(&modlinkage)) != 0) {
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (rval);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_soft_state_fini(&tphci_state);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (rval);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock}
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockint
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock_info(struct modinfo *modinfop)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock{
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (mod_info(&modlinkage, modinfop));
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock}
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock/* ARGSUSED */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrocktphci_open(dev_t *devp, int flag, int otype, cred_t *credp)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock{
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock struct tphci_state *phci;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock if (otype != OTYP_CHR) {
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (EINVAL);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock phci = ddi_get_soft_state(tphci_state, getminor(*devp));
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock if (phci == NULL) {
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (ENXIO);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (0);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock}
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock/* ARGSUSED */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrocktphci_close(dev_t dev, int flag, int otype, cred_t *credp)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock struct tphci_state *phci;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (otype != OTYP_CHR) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (EINVAL);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock phci = ddi_get_soft_state(tphci_state, getminor(dev));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (phci == NULL) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (ENXIO);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (0);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/* ARGSUSED */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockstatic int
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrocktphci_ioctl(dev_t dev, int cmd, intptr_t data, int mode,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cred_t *credp, int *rval)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (0);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * attach the module
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockstatic int
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrocktphci_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock char *vclass;
88ecc943b4eb72f7c4fbbd8435997b85ef171fc3George Wilson int instance, phci_regis = 0;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock struct tphci_state *phci = NULL;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock instance = ddi_get_instance(dip);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock switch (cmd) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case DDI_ATTACH:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case DDI_RESUME:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case DDI_PM_RESUME:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (0); /* nothing to do */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock default:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (DDI_FAILURE);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock /*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Allocate phci data structure.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (ddi_soft_state_zalloc(tphci_state, instance) != DDI_SUCCESS) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (DDI_FAILURE);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock phci = ddi_get_soft_state(tphci_state, instance);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ASSERT(phci != NULL);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock phci->dip = dip;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock /* bus_addr has the form #,<vhci_class> */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock vclass = strchr(ddi_get_name_addr(dip), ',');
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock if (vclass == NULL || vclass[1] == '\0') {
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock cmn_err(CE_NOTE, "tphci invalid bus_addr %s",
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_get_name_addr(dip));
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock goto attach_fail;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock /*
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock * Attach this instance with the mpxio framework
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock if (mdi_phci_register(vclass + 1, dip, 0) != MDI_SUCCESS) {
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock cmn_err(CE_WARN, "%s mdi_phci_register failed",
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_node_name(dip));
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock goto attach_fail;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock phci_regis++;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock if (ddi_create_minor_node(dip, "devctl", S_IFCHR,
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock instance, DDI_NT_SCSI_NEXUS, 0) != DDI_SUCCESS) {
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock cmn_err(CE_NOTE, "%s ddi_create_minor_node failed",
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_node_name(dip));
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock goto attach_fail;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock (void) ddi_prop_update_int(DDI_DEV_T_NONE, dip, DDI_NO_AUTODETACH, 1);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_report_dev(dip);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (DDI_SUCCESS);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockattach_fail:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock if (phci_regis)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock (void) mdi_phci_unregister(dip, 0);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_soft_state_free(tphci_state, instance);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (DDI_FAILURE);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock}
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock/*ARGSUSED*/
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrocktphci_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock{
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock int instance = ddi_get_instance(dip);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock switch (cmd) {
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock case DDI_DETACH:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock break;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock case DDI_SUSPEND:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock case DDI_PM_SUSPEND:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (0); /* nothing to do */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock default:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (DDI_FAILURE);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock if (mdi_phci_unregister(dip, 0) != MDI_SUCCESS)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (DDI_FAILURE);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_remove_minor_node(dip, NULL);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_soft_state_free(tphci_state, instance);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (DDI_SUCCESS);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock}
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock/*
eb04386ee9658c0271a7af93e0595582e2235689Eric Schrock * tphci_getinfo()
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock * Given the device number, return the devinfo pointer or the
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock * instance number.
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock * Note: always succeed DDI_INFO_DEVT2INSTANCE, even before attach.
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock/*ARGSUSED*/
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrocktphci_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock{
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock struct tphci_state *phci;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock int instance = getminor((dev_t)arg);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (cmd) {
99653d4ee642c6528e88224f12409a5f23060994eschrock case DDI_INFO_DEVT2DEVINFO:
99653d4ee642c6528e88224f12409a5f23060994eschrock phci = ddi_get_soft_state(tphci_state, instance);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (phci != NULL)
99653d4ee642c6528e88224f12409a5f23060994eschrock *result = phci->dip;
99653d4ee642c6528e88224f12409a5f23060994eschrock else {
99653d4ee642c6528e88224f12409a5f23060994eschrock *result = NULL;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (DDI_FAILURE);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock case DDI_INFO_DEVT2INSTANCE:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *result = (void *)(uintptr_t)instance;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock default:
25c6ff4b77fcddf4097ce78a8277275ca603b46cstephh return (DDI_FAILURE);
25c6ff4b77fcddf4097ce78a8277275ca603b46cstephh }
cbf75e67acb6c32a2f4884f28a839d59f7988d37Stephen Hanson
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (DDI_SUCCESS);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock}
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock/*
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * Interrupt stuff. NO OP for pseudo drivers.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock/*ARGSUSED*/
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockstatic int
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrocktphci_intr_op(dev_info_t *dip, dev_info_t *rdip, ddi_intr_op_t op,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ddi_intr_handle_impl_t *hdlp, void *result)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (DDI_FAILURE);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrockstatic int
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrocktphci_ctl(dev_info_t *dip, dev_info_t *rdip,
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ddi_ctl_enum_t ctlop, void *arg, void *result)
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock{
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock switch (ctlop) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case DDI_CTLOPS_REPORTDEV:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (rdip == (dev_info_t *)0)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (DDI_FAILURE);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmn_err(CE_CONT, "?tphci-device: %s%d\n",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ddi_get_name(rdip), ddi_get_instance(rdip));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (DDI_SUCCESS);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
cbf75e67acb6c32a2f4884f28a839d59f7988d37Stephen Hanson case DDI_CTLOPS_INITCHILD:
cbf75e67acb6c32a2f4884f28a839d59f7988d37Stephen Hanson {
cbf75e67acb6c32a2f4884f28a839d59f7988d37Stephen Hanson dev_info_t *child = (dev_info_t *)arg;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (tphci_initchild(dip, child));
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock case DDI_CTLOPS_UNINITCHILD:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock {
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock dev_info_t *child = (dev_info_t *)arg;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (tphci_uninitchild(dip, child));
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
25c6ff4b77fcddf4097ce78a8277275ca603b46cstephh case DDI_CTLOPS_DMAPMAPC:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case DDI_CTLOPS_REPORTINT:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case DDI_CTLOPS_REGSIZE:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case DDI_CTLOPS_NREGS:
99653d4ee642c6528e88224f12409a5f23060994eschrock case DDI_CTLOPS_SIDDEV:
99653d4ee642c6528e88224f12409a5f23060994eschrock case DDI_CTLOPS_SLAVEONLY:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case DDI_CTLOPS_AFFINITY:
99653d4ee642c6528e88224f12409a5f23060994eschrock case DDI_CTLOPS_POKE:
99653d4ee642c6528e88224f12409a5f23060994eschrock case DDI_CTLOPS_PEEK:
99653d4ee642c6528e88224f12409a5f23060994eschrock /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * These ops correspond to functions that "shouldn't" be called
99653d4ee642c6528e88224f12409a5f23060994eschrock * by a pseudo driver. So we whine when we're called.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock cmn_err(CE_CONT, "%s%d: invalid op (%d) from %s%d\n",
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ddi_get_name(dip), ddi_get_instance(dip),
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock ctlop, ddi_get_name(rdip), ddi_get_instance(rdip));
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (DDI_FAILURE);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case DDI_CTLOPS_ATTACH:
cbf75e67acb6c32a2f4884f28a839d59f7988d37Stephen Hanson case DDI_CTLOPS_BTOP:
cbf75e67acb6c32a2f4884f28a839d59f7988d37Stephen Hanson case DDI_CTLOPS_BTOPR:
cbf75e67acb6c32a2f4884f28a839d59f7988d37Stephen Hanson case DDI_CTLOPS_DETACH:
cbf75e67acb6c32a2f4884f28a839d59f7988d37Stephen Hanson case DDI_CTLOPS_DVMAPAGESIZE:
99653d4ee642c6528e88224f12409a5f23060994eschrock case DDI_CTLOPS_IOMIN:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case DDI_CTLOPS_POWER:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case DDI_CTLOPS_PTOB:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock default:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * The ops that we pass up (default). We pass up memory
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock * allocation oriented ops that we receive - these may be
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock * associated with pseudo HBA drivers below us with target
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock * drivers below them that use ddi memory allocation
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock * interfaces like scsi_alloc_consistent_buf.
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (ddi_ctlops(dip, rdip, ctlop, arg, result));
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrocktphci_initchild(dev_info_t *dip, dev_info_t *child)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock{
99653d4ee642c6528e88224f12409a5f23060994eschrock _NOTE(ARGUNUSED(dip))
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_set_name_addr(child, "0");
99653d4ee642c6528e88224f12409a5f23060994eschrock return (DDI_SUCCESS);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock}
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock/*ARGSUSED*/
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrocktphci_uninitchild(dev_info_t *dip, dev_info_t *child)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock{
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_set_name_addr(child, NULL);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (DDI_SUCCESS);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock}
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrocktp_decode_name(char *devnm, char **cname, char **paddr, char **guid)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock{
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock char *tmp;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock i_ddi_parse_name(devnm, cname, paddr, NULL);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock if ((strcmp(*cname, "tclient") != 0) &&
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock (strcmp(*cname, "tphci") != 0) || *paddr == NULL)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (-1);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock tmp = strchr(*paddr, ',');
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock if (tmp == NULL || tmp[1] == '\0')
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (-1);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock *guid = tmp + 1;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (0);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock}
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrocktphci_bus_config(dev_info_t *parent, uint_t flags,
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ddi_bus_config_op_t op, void *arg, dev_info_t **childp)
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock{
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock _NOTE(ARGUNUSED(flags))
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock char *cname, *paddr, *guid, *devnm;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock mdi_pathinfo_t *pip;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock int len, circ, rval;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock switch (op) {
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock case BUS_CONFIG_ONE:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock break;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock case BUS_CONFIG_DRIVER: /* no direct children to configure */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock case BUS_CONFIG_ALL:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (NDI_SUCCESS);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock default:
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (NDI_FAILURE);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock /* only implement BUS_CONFIG_ONE */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock devnm = i_ddi_strdup((char *)arg, KM_SLEEP);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock len = strlen(devnm) + 1;
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock /* caddr is hardcoded in the form *,<guid> */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock if (tp_decode_name(devnm, &cname, &paddr, &guid) != 0) {
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock cmn_err(CE_NOTE, "tphci_bus_config -- invalid device %s",
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock (char *)arg);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock kmem_free(devnm, len);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (NDI_FAILURE);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock mdi_devi_enter(parent, &circ);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock rval = mdi_pi_alloc(parent, cname, guid, paddr, 0, &pip);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock kmem_free(devnm, len);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (rval != MDI_SUCCESS) {
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock cmn_err(CE_NOTE, "tphci_bus_config -- mdi_pi_alloc failed");
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock mdi_devi_exit(parent, circ);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (NDI_FAILURE);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock /*
99653d4ee642c6528e88224f12409a5f23060994eschrock * Hold the path and exit the pHCI while calling mdi_pi_online
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock * to avoid deadlock with power management of pHCI.
99653d4ee642c6528e88224f12409a5f23060994eschrock */
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock mdi_hold_path(pip);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock mdi_devi_exit_phci(parent, circ);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock rval = mdi_pi_online(pip, 0);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock mdi_devi_enter_phci(parent, &circ);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock mdi_rele_path(pip);
25c6ff4b77fcddf4097ce78a8277275ca603b46cstephh
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (rval != MDI_SUCCESS) {
99653d4ee642c6528e88224f12409a5f23060994eschrock cmn_err(CE_NOTE, "tphci_bus_config -- mdi_pi_online failed");
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) mdi_pi_free(pip, 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock mdi_devi_exit(parent, circ);
99653d4ee642c6528e88224f12409a5f23060994eschrock return (NDI_FAILURE);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (childp) {
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock *childp = mdi_pi_get_client(pip);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock ndi_hold_devi(*childp);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock }
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock mdi_devi_exit(parent, circ);
99653d4ee642c6528e88224f12409a5f23060994eschrock
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock return (NDI_SUCCESS);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock}
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrockstatic int
99653d4ee642c6528e88224f12409a5f23060994eschrocktphci_bus_unconfig(dev_info_t *parent, uint_t flags,
99653d4ee642c6528e88224f12409a5f23060994eschrock ddi_bus_config_op_t op, void *arg)
25c6ff4b77fcddf4097ce78a8277275ca603b46cstephh{
25c6ff4b77fcddf4097ce78a8277275ca603b46cstephh int rval = MDI_SUCCESS;
25c6ff4b77fcddf4097ce78a8277275ca603b46cstephh int circ;
25c6ff4b77fcddf4097ce78a8277275ca603b46cstephh mdi_pathinfo_t *pip, *next;
99653d4ee642c6528e88224f12409a5f23060994eschrock char *devnm, *cname, *caddr;
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock switch (op) {
99653d4ee642c6528e88224f12409a5f23060994eschrock case BUS_UNCONFIG_ONE:
99653d4ee642c6528e88224f12409a5f23060994eschrock devnm = (char *)arg;
99653d4ee642c6528e88224f12409a5f23060994eschrock i_ddi_parse_name(devnm, &cname, &caddr, NULL);
99653d4ee642c6528e88224f12409a5f23060994eschrock if (strcmp(cname, "tclient") != 0)
99653d4ee642c6528e88224f12409a5f23060994eschrock return (NDI_SUCCESS); /* no such device */
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock mdi_devi_enter(parent, &circ);
99653d4ee642c6528e88224f12409a5f23060994eschrock pip = mdi_pi_find(parent, NULL, caddr);
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock if (pip) {
99653d4ee642c6528e88224f12409a5f23060994eschrock mdi_hold_path(pip);
99653d4ee642c6528e88224f12409a5f23060994eschrock mdi_devi_exit_phci(parent, circ);
99653d4ee642c6528e88224f12409a5f23060994eschrock rval = mdi_pi_offline(pip, NDI_DEVI_REMOVE);
99653d4ee642c6528e88224f12409a5f23060994eschrock mdi_devi_enter_phci(parent, &circ);
99653d4ee642c6528e88224f12409a5f23060994eschrock mdi_rele_path(pip);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (rval == MDI_SUCCESS)
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) mdi_pi_free(pip, 0);
99653d4ee642c6528e88224f12409a5f23060994eschrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock mdi_devi_exit(parent, circ);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (rval == MDI_SUCCESS ? NDI_SUCCESS : NDI_FAILURE);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock case BUS_UNCONFIG_ALL:
99653d4ee642c6528e88224f12409a5f23060994eschrock if (flags & NDI_AUTODETACH)
99653d4ee642c6528e88224f12409a5f23060994eschrock return (NDI_FAILURE);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock mdi_devi_enter(parent, &circ);
99653d4ee642c6528e88224f12409a5f23060994eschrock next = mdi_get_next_client_path(parent, NULL);
99653d4ee642c6528e88224f12409a5f23060994eschrock while ((pip = next) != NULL) {
99653d4ee642c6528e88224f12409a5f23060994eschrock next = mdi_get_next_client_path(parent, pip);
99653d4ee642c6528e88224f12409a5f23060994eschrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock mdi_hold_path(pip);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock mdi_devi_exit_phci(parent, circ);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock rval = mdi_pi_offline(pip, NDI_DEVI_REMOVE);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock mdi_devi_enter_phci(parent, &circ);
99653d4ee642c6528e88224f12409a5f23060994eschrock mdi_rele_path(pip);
99653d4ee642c6528e88224f12409a5f23060994eschrock
99653d4ee642c6528e88224f12409a5f23060994eschrock if (rval != MDI_SUCCESS)
99653d4ee642c6528e88224f12409a5f23060994eschrock break;
99653d4ee642c6528e88224f12409a5f23060994eschrock (void) mdi_pi_free(pip, 0);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock }
99653d4ee642c6528e88224f12409a5f23060994eschrock mdi_devi_exit(parent, circ);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (rval == MDI_SUCCESS ? NDI_SUCCESS : NDI_FAILURE);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock case BUS_UNCONFIG_DRIVER: /* nothing to do */
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock return (NDI_SUCCESS);
069f55e237020c4a4907b235fc38fafc6442ce94Eric Schrock
99653d4ee642c6528e88224f12409a5f23060994eschrock default:
return (NDI_FAILURE);
}
/*NOTREACHED*/
}