niumx.c revision c165966d2681754edbe7637da5adf3e53b3f7132
4496171313bed39e96f21bc2f9faf2868e267ae3girish * CDDL HEADER START
4496171313bed39e96f21bc2f9faf2868e267ae3girish * The contents of this file are subject to the terms of the
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Common Development and Distribution License (the "License").
4496171313bed39e96f21bc2f9faf2868e267ae3girish * You may not use this file except in compliance with the License.
4496171313bed39e96f21bc2f9faf2868e267ae3girish * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4496171313bed39e96f21bc2f9faf2868e267ae3girish * See the License for the specific language governing permissions
4496171313bed39e96f21bc2f9faf2868e267ae3girish * and limitations under the License.
4496171313bed39e96f21bc2f9faf2868e267ae3girish * When distributing Covered Code, include this CDDL HEADER in each
4496171313bed39e96f21bc2f9faf2868e267ae3girish * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4496171313bed39e96f21bc2f9faf2868e267ae3girish * If applicable, add the following below this CDDL HEADER, with the
4496171313bed39e96f21bc2f9faf2868e267ae3girish * fields enclosed by brackets "[]" replaced with your own identifying
4496171313bed39e96f21bc2f9faf2868e267ae3girish * information: Portions Copyright [yyyy] [name of copyright owner]
4496171313bed39e96f21bc2f9faf2868e267ae3girish * CDDL HEADER END
8fca05700b4a8225bddecd0ca5028f512f483b36jf * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Use is subject to license terms.
4496171313bed39e96f21bc2f9faf2868e267ae3girish#pragma ident "%Z%%M% %I% %E% SMI"
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Niagara2 Network Interface Unit (NIU) Nexus Driver
8fca05700b4a8225bddecd0ca5028f512f483b36jfstatic int niumx_fm_init_child(dev_info_t *, dev_info_t *, int,
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic int niumx_intr_ops(dev_info_t *dip, dev_info_t *rdip,
4496171313bed39e96f21bc2f9faf2868e267ae3girish ddi_intr_op_t intr_op, ddi_intr_handle_impl_t *hdlp, void *result);
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic int niumx_attach(dev_info_t *devi, ddi_attach_cmd_t cmd);
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic int niumx_detach(dev_info_t *devi, ddi_detach_cmd_t cmd);
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic int niumx_set_intr(dev_info_t *dip, dev_info_t *rdip,
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic int niumx_add_intr(dev_info_t *dip, dev_info_t *rdip,
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic int niumx_rem_intr(dev_info_t *dip, dev_info_t *rdip,
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic int niumx_map(dev_info_t *dip, dev_info_t *rdip, ddi_map_req_t *mp,
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic int niumx_dma_allochdl(dev_info_t *dip, dev_info_t *rdip,
4496171313bed39e96f21bc2f9faf2868e267ae3girish int (*waitfp)(caddr_t), caddr_t arg, ddi_dma_handle_t *handlep);
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic int niumx_dma_freehdl(dev_info_t *dip, dev_info_t *rdip,
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic int niumx_dma_bindhdl(dev_info_t *dip, dev_info_t *rdip,
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic int niumx_dma_unbindhdl(dev_info_t *dip, dev_info_t *rdip,
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic int niumx_ctlops(dev_info_t *dip, dev_info_t *rdip,
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* (*bus_get_eventcookie)(); */
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* (*bus_add_eventcall)(); */
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* (*bus_remove_eventcall)(); */
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* (*bus_post_event)(); */
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* (*bus_intr_ctl)(); */
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* (*bus_config)(); */
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* (*bus_unconfig)(); */
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* (*bus_fm_fini)(); */
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* (*bus_enter)() */
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* (*bus_exit)() */
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* (*bus_power)() */
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* refcnt */
4496171313bed39e96f21bc2f9faf2868e267ae3girish 0, /* probe */
4496171313bed39e96f21bc2f9faf2868e267ae3girish/* Module linkage information for the kernel. */
4496171313bed39e96f21bc2f9faf2868e267ae3girish "NIU Nexus Driver %I%",
4496171313bed39e96f21bc2f9faf2868e267ae3girish * forward function declarations:
4496171313bed39e96f21bc2f9faf2868e267ae3girish if ((e = ddi_soft_state_init(&niumx_state, sizeof (niumx_devstate_t),
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (e);
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (e);
c165966d2681754edbe7637da5adf3e53b3f7132jfhrtime_t niumx_intr_timeout = 2ull * NANOSEC; /* 2 seconds in nanoseconds */
c165966d2681754edbe7637da5adf3e53b3f7132jf /* check for pending interrupts, busy wait if so */
c165966d2681754edbe7637da5adf3e53b3f7132jf "pending interrupt (%x,%lx) timedout\n",
3266dff7c77b314b33c74fa8767437ffad5f4a01jf * Hypervisor INTR services information for the NIU nexus driver.
3266dff7c77b314b33c74fa8767437ffad5f4a01jfstatic uint64_t niumx_intr_min_ver; /* Neg. API minor version */
4496171313bed39e96f21bc2f9faf2868e267ae3girish HSVC_REV_1, NULL, HSVC_GROUP_INTR, NIUMX_INTR_MAJOR_VER,
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Allocate and get soft state structure.
4496171313bed39e96f21bc2f9faf2868e267ae3girish niumxds_p = (niumx_devstate_t *)ddi_get_soft_state(niumx_state,
4496171313bed39e96f21bc2f9faf2868e267ae3girish mutex_init(&niumxds_p->niumx_mutex, NULL, MUTEX_DRIVER, NULL);
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_ATTACH, dip, "soft state alloc'd instance = %d, "
3266dff7c77b314b33c74fa8767437ffad5f4a01jf * Negotiate the API version for HV INTR services.
4496171313bed39e96f21bc2f9faf2868e267ae3girish if ((ret = hsvc_register(&niumx_hv_intr, &niumx_intr_min_ver))
4496171313bed39e96f21bc2f9faf2868e267ae3girish cmn_err(CE_WARN, "%s: cannot negotiate hypervisor services "
4496171313bed39e96f21bc2f9faf2868e267ae3girish "group: 0x%lx major: 0x%lx minor: 0x%lx errno: %d\n",
4496171313bed39e96f21bc2f9faf2868e267ae3girish niumx_hv_intr.hsvc_modname, niumx_hv_intr.hsvc_group,
4496171313bed39e96f21bc2f9faf2868e267ae3girish niumx_hv_intr.hsvc_major, niumx_hv_intr.hsvc_minor, ret);
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_ATTACH, dip, "neg. HV API major 0x%lx minor 0x%lx\n",
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* hv devhdl: low 28-bit of 1st "reg" entry's addr.hi */
4496171313bed39e96f21bc2f9faf2868e267ae3girish niumxds_p->niumx_dev_hdl = (devhandle_t)(reg_p->addr_high &
3266dff7c77b314b33c74fa8767437ffad5f4a01jf /* add interrupt redistribution callback */
4496171313bed39e96f21bc2f9faf2868e267ae3girish ddi_soft_state_free(niumx_state, ddi_get_instance(dip));
4496171313bed39e96f21bc2f9faf2868e267ae3girish ddi_get_soft_state(niumx_state, ddi_get_instance(dip));
4496171313bed39e96f21bc2f9faf2868e267ae3girish ddi_soft_state_free(niumx_state, ddi_get_instance(dip));
8fca05700b4a8225bddecd0ca5028f512f483b36jf * Function used to initialize FMA for our children nodes. Called
8fca05700b4a8225bddecd0ca5028f512f483b36jf * through pci busops when child node calls ddi_fm_init.
8fca05700b4a8225bddecd0ca5028f512f483b36jf/*ARGSUSED*/
8fca05700b4a8225bddecd0ca5028f512f483b36jfniumx_fm_init_child(dev_info_t *dip, dev_info_t *cdip, int cap,
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*ARGSUSED*/
4496171313bed39e96f21bc2f9faf2868e267ae3girishniumx_map(dev_info_t *dip, dev_info_t *rdip, ddi_map_req_t *mp,
4496171313bed39e96f21bc2f9faf2868e267ae3girish int i, rn = mp->map_obj.rnumber, reglen, rnglen, rngnum, ret;
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_MAP, dip, "%s%d: mapping %s%d reg %d\n", NAMEINST(dip),
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (ddi_getlongprop(DDI_DEV_T_ANY, rdip, DDI_PROP_DONTPASS,
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (rn < 0 || (rn >= reglen / sizeof (niu_regspec_t))) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* build regspec up for parent */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (ddi_getlongprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "ranges",
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* locate matching ranges record */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (i >= rngnum) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_MAP, dip, "ranges record for reg[%d] not found.\n", rn);
4496171313bed39e96f21bc2f9faf2868e267ae3girish * validate request has matching bus type and within 4G
4496171313bed39e96f21bc2f9faf2868e267ae3girish * limit by comparing addr.hi of "ranges" and child "reg".
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* check to verify reg bounds are within rng bounds */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (reg_begin < rng_begin || (reg_begin + (reg_p->size_low - 1)) >
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_MAP, dip, "size out of range for reg[%d].\n", rn);
4496171313bed39e96f21bc2f9faf2868e267ae3girish p_regspec.regspec_addr = reg_begin - rng_begin + rng_p->parent_lo;
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_MAP, dip, "regspec:bus,addr,size = (%x,%x,%x)\n",
4496171313bed39e96f21bc2f9faf2868e267ae3girish * niumx_ctlops
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_CTLOPS, dip, "niumx_ctlops ctlop=%d.\n", ctlop);
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* fall through */
4496171313bed39e96f21bc2f9faf2868e267ae3girish *(int *)result = 0;
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (ddi_getlongprop(DDI_DEV_T_NONE, rdip, DDI_PROP_DONTPASS |
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_CTLOPS, (dev_info_t *)dip, "niumx_ctlops NREGS=%d.\n",
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_CTLOPS, (dev_info_t *)dip, "rn = %d, REGSIZE=%x.\n",
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, child, DDI_PROP_DONTPASS,
4496171313bed39e96f21bc2f9faf2868e267ae3girish (void) snprintf(name, MAXNAMELEN, "%x", (r[0].addr_high &
4496171313bed39e96f21bc2f9faf2868e267ae3girish * bus dma alloc handle entry point:
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*ARGSUSED*/
4496171313bed39e96f21bc2f9faf2868e267ae3girishniumx_dma_allochdl(dev_info_t *dip, dev_info_t *rdip, ddi_dma_attr_t *attrp,
4496171313bed39e96f21bc2f9faf2868e267ae3girish int (*waitfp)(caddr_t), caddr_t arg, ddi_dma_handle_t *handlep)
4496171313bed39e96f21bc2f9faf2868e267ae3girish int sleep = (waitfp == DDI_DMA_SLEEP) ? KM_SLEEP : KM_NOSLEEP;
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_DMA_ALLOCH, dip, "rdip=%s%d\n", NAMEINST(rdip));
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_DMA_ALLOCH, (dev_info_t *)dip, "DDI_DMA_BADATTR\n");
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Caution: we don't use zalloc to enhance performance! */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if ((mp = kmem_alloc(sizeof (ddi_dma_impl_t), sleep)) == 0) {
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_DMA_ALLOCH, dip, "can't alloc ddi_dma_impl_t\n");
4496171313bed39e96f21bc2f9faf2868e267ae3girish mp->dmai_attr = *attrp; /* set requestors attr info */
4496171313bed39e96f21bc2f9faf2868e267ae3girish * bus dma free handle entry point:
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*ARGSUSED*/
4496171313bed39e96f21bc2f9faf2868e267ae3girishniumx_dma_freehdl(dev_info_t *dip, dev_info_t *rdip, ddi_dma_handle_t handle)
4496171313bed39e96f21bc2f9faf2868e267ae3girish kmem_free(mp->dmai_cookie, sizeof (ddi_dma_cookie_t));
4496171313bed39e96f21bc2f9faf2868e267ae3girish * bus dma bind handle entry point:
4496171313bed39e96f21bc2f9faf2868e267ae3girish * check/enforce DMA type, setup pfn0 and some other key pieces
4496171313bed39e96f21bc2f9faf2868e267ae3girish * of this dma request.
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Note: this only works with DMA_OTYP_VADDR, and makes use of the known
4496171313bed39e96f21bc2f9faf2868e267ae3girish * fact that only contiguous memory blocks will be passed in.
4496171313bed39e96f21bc2f9faf2868e267ae3girish * Therefore only one cookie will ever be returned.
4496171313bed39e96f21bc2f9faf2868e267ae3girish * return values:
4496171313bed39e96f21bc2f9faf2868e267ae3girish * DDI_DMA_NOMAPPING - can't get valid pfn0, or bad dma type
4496171313bed39e96f21bc2f9faf2868e267ae3girish * DDI_DMA_NORESOURCES
4496171313bed39e96f21bc2f9faf2868e267ae3girish * DDI_SUCCESS
4496171313bed39e96f21bc2f9faf2868e267ae3girish * dma handle members affected (set on exit):
4496171313bed39e96f21bc2f9faf2868e267ae3girish * mp->dmai_object - dmareq->dmar_object
4496171313bed39e96f21bc2f9faf2868e267ae3girish * mp->dmai_rflags - dmareq->dmar_flags
4496171313bed39e96f21bc2f9faf2868e267ae3girish * mp->dmai_pfn0 - 1st page pfn (if va/size pair and not shadow)
4496171313bed39e96f21bc2f9faf2868e267ae3girish * mp->dmai_roffset - initialized to starting page offset
4496171313bed39e96f21bc2f9faf2868e267ae3girish * mp->dmai_size - # of total pages of entire object
4496171313bed39e96f21bc2f9faf2868e267ae3girish * mp->dmai_cookie - new cookie alloc'd
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*ARGSUSED*/
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_DMA_BINDH, dip, "rdip=%s%d mp=%p dmareq=%p\n", NAMEINST(rdip),
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* first check dma type */
4496171313bed39e96f21bc2f9faf2868e267ae3girish mp->dmai_rflags = dmareq->dmar_flags & DMP_DDIFLAGS | DMP_NOSYNC;
4496171313bed39e96f21bc2f9faf2868e267ae3girish cmn_err(CE_WARN, "%s%d requested unsupported dma type %x",
4496171313bed39e96f21bc2f9faf2868e267ae3girish cmn_err(CE_WARN, "%s%d: invalid pfn0 for DMA object %p",
4496171313bed39e96f21bc2f9faf2868e267ae3girish mp->dmai_mapping = mp->dmai_roffset | NIUMX_PTOB(pfn0);
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_DMA_BINDH, dip, "check pfn: mp=%p pfn0=%x\n",
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (!(mp->dmai_cookie = kmem_zalloc(sizeof (ddi_dma_cookie_t),
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_DMA_BINDH, dip, "cookie %" PRIx64 "+%x, count=%d\n",
4496171313bed39e96f21bc2f9faf2868e267ae3girish cookiep->dmac_address, cookiep->dmac_size, *ccountp);
4496171313bed39e96f21bc2f9faf2868e267ae3girish * bus dma unbind handle entry point:
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*ARGSUSED*/
4496171313bed39e96f21bc2f9faf2868e267ae3girishniumx_dma_unbindhdl(dev_info_t *dip, dev_info_t *rdip, ddi_dma_handle_t handle)
4496171313bed39e96f21bc2f9faf2868e267ae3girish ddi_driver_name(rdip), ddi_get_instance(rdip), handle);
4496171313bed39e96f21bc2f9faf2868e267ae3girish kmem_free(mp->dmai_cookie, sizeof (ddi_dma_cookie_t));
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*ARGSUSED*/
4496171313bed39e96f21bc2f9faf2868e267ae3girishniumx_intr_ops(dev_info_t *dip, dev_info_t *rdip, ddi_intr_op_t intr_op,
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_INTROPS, dip, "niumx_intr_ops: dip=%p rdip=%p intr_op=%x "
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* scratch1 = count, # of intrs from DDI framework */
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Do we need to do anything here? */
4496171313bed39e96f21bc2f9faf2868e267ae3girish ret = niumx_set_intr(dip, rdip, hdlp, HV_INTR_VALID);
4496171313bed39e96f21bc2f9faf2868e267ae3girish ret = niumx_set_intr(dip, rdip, hdlp, HV_INTR_NOTVALID);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (ddi_getlongprop(DDI_DEV_T_ANY, rdip, DDI_PROP_DONTPASS,
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_INTROPS, dip, "niumx_intr_ops: ret=%d\n", ret);
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* find the appropriate slot from the fixed table */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (ddi_getlongprop(DDI_DEV_T_ANY, rdip, DDI_PROP_DONTPASS,
4496171313bed39e96f21bc2f9faf2868e267ae3girish "interrupts", (caddr_t)&inos_p, &inoslen) != DDI_SUCCESS) {
8fca05700b4a8225bddecd0ca5028f512f483b36jf DBG(DBG_A_INTX, dip, "niumx_set_intr: rdip=%s%d, valid=%d %s (%x,%x)\n",
cb343a2e20368d059fdcf8755367f43e747266f2speer (void) hvio_intr_setstate(ih_p->ih_sysino, HV_INTR_IDLE_STATE);
4496171313bed39e96f21bc2f9faf2868e267ae3girish if ((hvret = hvio_intr_setvalid(ih_p->ih_sysino, valid))
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_A_INTX, dip, "hvio_intr_setvalid failed, ret 0x%x\n",
4496171313bed39e96f21bc2f9faf2868e267ae3girish * niumx_add_intr:
4496171313bed39e96f21bc2f9faf2868e267ae3girish * This is the leaf/nexus/HV mapping, now read from "interrupts":
4496171313bed39e96f21bc2f9faf2868e267ae3girish * we have a range of 64 to work with:
4496171313bed39e96f21bc2f9faf2868e267ae3girish * [0-15] - reserved
4496171313bed39e96f21bc2f9faf2868e267ae3girish * [16] - mac0
4496171313bed39e96f21bc2f9faf2868e267ae3girish * [17] - MIF
4496171313bed39e96f21bc2f9faf2868e267ae3girish * [18] - SYSERR
4496171313bed39e96f21bc2f9faf2868e267ae3girish * [19-26] - func0 Rx (qty. 8)
4496171313bed39e96f21bc2f9faf2868e267ae3girish * [27-34] - func0 Tx (qty. 8)
4496171313bed39e96f21bc2f9faf2868e267ae3girish * [35] - mac1
4496171313bed39e96f21bc2f9faf2868e267ae3girish * [36-43] - func1 Rx (qty. 8)
4496171313bed39e96f21bc2f9faf2868e267ae3girish * [44-51] - func1 Tx (qty. 8)
8fca05700b4a8225bddecd0ca5028f512f483b36jf devino_t *inos_p, ino; /* INO numbers, from "interrupts" prop */
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* get new ino */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (ddi_getlongprop(DDI_DEV_T_ANY, rdip, DDI_PROP_DONTPASS,
4496171313bed39e96f21bc2f9faf2868e267ae3girish "interrupts", (caddr_t)&inos_p, &inoslen) != DDI_SUCCESS) {
8fca05700b4a8225bddecd0ca5028f512f483b36jf if ((hvret = hvio_intr_devino_to_sysino(DIP_TO_HANDLE(dip), ino,
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_INTR, dip, "hvio_intr_devino_to_sysino failed, "
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_A_INTX, dip, "niumx_add_intr: rdip=%s%d inum=0x%x "
4496171313bed39e96f21bc2f9faf2868e267ae3girish "handler=%p arg1=%p arg2=%p, new ih_p = %p\n", NAMEINST(rdip),
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Save sysino value in hdlp */
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* swap in our handler & arg */
4496171313bed39e96f21bc2f9faf2868e267ae3girish DDI_INTR_ASSIGN_HDLR_N_ARGS(hdlp, (ddi_intr_handler_t *)niumx_intr_hdlr,
8fca05700b4a8225bddecd0ca5028f512f483b36jf DBG(DBG_A_INTX, dip, "for ino %x adding (%x,%x)\n", ino, ih_p->ih_inum,
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* Restore orig. interrupt handler & args in handle. */
4496171313bed39e96f21bc2f9faf2868e267ae3girish DDI_INTR_ASSIGN_HDLR_N_ARGS(hdlp, ih_p->ih_hdlr, ih_p->ih_arg1,
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_A_INTX, dip, "i_ddi_add_ivintr error ret=%x\n", ret);
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* select cpu, saving it for removal */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if ((hvret = hvio_intr_settarget(ih_p->ih_sysino, ih_p->ih_cpuid))
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_A_INTX, dip, "hvio_intr_settarget failed, ret 0x%x\n",
4496171313bed39e96f21bc2f9faf2868e267ae3girish DBG(DBG_A_INTX, dip, "done, ret = %d, ih_p 0x%p, hdlp 0x%p\n", ih_p,
4496171313bed39e96f21bc2f9faf2868e267ae3girish * niumx_rem_intr:
4496171313bed39e96f21bc2f9faf2868e267ae3girish * This function is called to unregister interrupts.
4496171313bed39e96f21bc2f9faf2868e267ae3girish /* find the appropriate slot from the fixed table */
4496171313bed39e96f21bc2f9faf2868e267ae3girish if (ddi_getlongprop(DDI_DEV_T_ANY, rdip, DDI_PROP_DONTPASS,
4496171313bed39e96f21bc2f9faf2868e267ae3girish "interrupts", (caddr_t)&inos_p, &inoslen) != DDI_SUCCESS) {
c165966d2681754edbe7637da5adf3e53b3f7132jf DBG(DBG_R_INTX, dip, "removing (%x,%x)\n", ih_p->ih_inum, sysino);
c165966d2681754edbe7637da5adf3e53b3f7132jf /* check for pending interrupts, busy wait if so */
c165966d2681754edbe7637da5adf3e53b3f7132jf "pending interrupt (%x,%lx) timedout\n",
4496171313bed39e96f21bc2f9faf2868e267ae3girish * niumx_intr_hdlr (our interrupt handler)
4496171313bed39e96f21bc2f9faf2868e267ae3girish DTRACE_PROBE4(interrupt__start, dev_info_t, ih_p->ih_dip, void *,
4496171313bed39e96f21bc2f9faf2868e267ae3girish ih_p->ih_hdlr, caddr_t, ih_p->ih_arg1, caddr_t, ih_p->ih_arg2);
4496171313bed39e96f21bc2f9faf2868e267ae3girish DTRACE_PROBE4(interrupt__complete, dev_info_t, ih_p->ih_dip, void *,
cb343a2e20368d059fdcf8755367f43e747266f2speer (void) hvio_intr_setstate(ih_p->ih_sysino, HV_INTR_IDLE_STATE);
4496171313bed39e96f21bc2f9faf2868e267ae3girish return (r);
4496171313bed39e96f21bc2f9faf2868e267ae3girishstatic char *niumx_debug_sym [] = { /* same sequence as niumx_debug_bit */
4496171313bed39e96f21bc2f9faf2868e267ae3girish/*ARGSUSED*/
4496171313bed39e96f21bc2f9faf2868e267ae3girishniumx_dbg(niumx_debug_bit_t bit, dev_info_t *dip, char *fmt, ...)
4496171313bed39e96f21bc2f9faf2868e267ae3girish cmn_err(CE_NOTE, "%s: %s", niumx_debug_sym[bit], msgbuf);
4496171313bed39e96f21bc2f9faf2868e267ae3girish#endif /* DEBUG */