xref: /illumos-gate/usr/src/uts/common/os/ddi_intr_impl.c (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24*7c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
25*7c478bd9Sstevel@tonic-gate  */
26*7c478bd9Sstevel@tonic-gate 
27*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
28*7c478bd9Sstevel@tonic-gate 
29*7c478bd9Sstevel@tonic-gate #include <sys/note.h>
30*7c478bd9Sstevel@tonic-gate #include <sys/sysmacros.h>
31*7c478bd9Sstevel@tonic-gate #include <sys/types.h>
32*7c478bd9Sstevel@tonic-gate #include <sys/param.h>
33*7c478bd9Sstevel@tonic-gate #include <sys/systm.h>
34*7c478bd9Sstevel@tonic-gate #include <sys/kmem.h>
35*7c478bd9Sstevel@tonic-gate #include <sys/cmn_err.h>
36*7c478bd9Sstevel@tonic-gate #include <sys/debug.h>
37*7c478bd9Sstevel@tonic-gate #include <sys/avintr.h>
38*7c478bd9Sstevel@tonic-gate #include <sys/autoconf.h>
39*7c478bd9Sstevel@tonic-gate #include <sys/sunndi.h>
40*7c478bd9Sstevel@tonic-gate #include <sys/ndi_impldefs.h>	/* include prototypes */
41*7c478bd9Sstevel@tonic-gate 
42*7c478bd9Sstevel@tonic-gate /*
43*7c478bd9Sstevel@tonic-gate  * New DDI interrupt framework
44*7c478bd9Sstevel@tonic-gate  */
45*7c478bd9Sstevel@tonic-gate void
46*7c478bd9Sstevel@tonic-gate i_ddi_intr_devi_init(dev_info_t *dip)
47*7c478bd9Sstevel@tonic-gate {
48*7c478bd9Sstevel@tonic-gate 	int	supported_types;
49*7c478bd9Sstevel@tonic-gate 
50*7c478bd9Sstevel@tonic-gate 	DDI_INTR_APIDBG((CE_CONT, "i_ddi_intr_devi_init: dip %p\n",
51*7c478bd9Sstevel@tonic-gate 	    (void *)dip));
52*7c478bd9Sstevel@tonic-gate 
53*7c478bd9Sstevel@tonic-gate 	if (DEVI(dip)->devi_intr_p)
54*7c478bd9Sstevel@tonic-gate 		return;
55*7c478bd9Sstevel@tonic-gate 
56*7c478bd9Sstevel@tonic-gate 	DEVI(dip)->devi_intr_p = kmem_zalloc(sizeof (devinfo_intr_t),
57*7c478bd9Sstevel@tonic-gate 	    KM_SLEEP);
58*7c478bd9Sstevel@tonic-gate 
59*7c478bd9Sstevel@tonic-gate 	supported_types = i_ddi_intr_get_supported_types(dip);
60*7c478bd9Sstevel@tonic-gate 
61*7c478bd9Sstevel@tonic-gate 	/* Save supported interrupt types information */
62*7c478bd9Sstevel@tonic-gate 	i_ddi_intr_set_supported_types(dip, supported_types);
63*7c478bd9Sstevel@tonic-gate }
64*7c478bd9Sstevel@tonic-gate 
65*7c478bd9Sstevel@tonic-gate void
66*7c478bd9Sstevel@tonic-gate i_ddi_intr_devi_fini(dev_info_t *dip)
67*7c478bd9Sstevel@tonic-gate {
68*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t	*intr_p = DEVI(dip)->devi_intr_p;
69*7c478bd9Sstevel@tonic-gate 
70*7c478bd9Sstevel@tonic-gate 	/*
71*7c478bd9Sstevel@tonic-gate 	 * devi_intr_handle_p will only be used for devices
72*7c478bd9Sstevel@tonic-gate 	 * which are using the legacy DDI Interrupt interfaces.
73*7c478bd9Sstevel@tonic-gate 	 */
74*7c478bd9Sstevel@tonic-gate 	if (intr_p->devi_intr_handle_p) {
75*7c478bd9Sstevel@tonic-gate 		/* nintrs could be zero; so check for it first */
76*7c478bd9Sstevel@tonic-gate 		if (intr_p->devi_intr_sup_nintrs) {
77*7c478bd9Sstevel@tonic-gate 			kmem_free(intr_p->devi_intr_handle_p,
78*7c478bd9Sstevel@tonic-gate 			    intr_p->devi_intr_sup_nintrs *
79*7c478bd9Sstevel@tonic-gate 			    sizeof (ddi_intr_handle_t));
80*7c478bd9Sstevel@tonic-gate 		}
81*7c478bd9Sstevel@tonic-gate 	}
82*7c478bd9Sstevel@tonic-gate 	kmem_free(DEVI(dip)->devi_intr_p, sizeof (devinfo_intr_t));
83*7c478bd9Sstevel@tonic-gate 	DEVI(dip)->devi_intr_p = NULL;
84*7c478bd9Sstevel@tonic-gate }
85*7c478bd9Sstevel@tonic-gate 
86*7c478bd9Sstevel@tonic-gate uint_t
87*7c478bd9Sstevel@tonic-gate i_ddi_intr_get_supported_types(dev_info_t *dip)
88*7c478bd9Sstevel@tonic-gate {
89*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t		*intr_p = DEVI(dip)->devi_intr_p;
90*7c478bd9Sstevel@tonic-gate 	ddi_intr_handle_impl_t	hdl;
91*7c478bd9Sstevel@tonic-gate 	int			ret, intr_types;
92*7c478bd9Sstevel@tonic-gate 
93*7c478bd9Sstevel@tonic-gate 	if ((intr_p) && (intr_p->devi_intr_sup_types))
94*7c478bd9Sstevel@tonic-gate 		return (intr_p->devi_intr_sup_types);
95*7c478bd9Sstevel@tonic-gate 
96*7c478bd9Sstevel@tonic-gate 	bzero(&hdl, sizeof (ddi_intr_handle_impl_t));
97*7c478bd9Sstevel@tonic-gate 	hdl.ih_dip = dip;
98*7c478bd9Sstevel@tonic-gate 
99*7c478bd9Sstevel@tonic-gate 	ret = i_ddi_handle_intr_ops(dip, dip, DDI_INTROP_SUPPORTED_TYPES, &hdl,
100*7c478bd9Sstevel@tonic-gate 	    (void *)&intr_types);
101*7c478bd9Sstevel@tonic-gate 
102*7c478bd9Sstevel@tonic-gate 	return ((ret == DDI_SUCCESS) ? intr_types : 0);
103*7c478bd9Sstevel@tonic-gate }
104*7c478bd9Sstevel@tonic-gate 
105*7c478bd9Sstevel@tonic-gate /*
106*7c478bd9Sstevel@tonic-gate  * NOTE: This function is only called by i_ddi_dev_init().
107*7c478bd9Sstevel@tonic-gate  */
108*7c478bd9Sstevel@tonic-gate void
109*7c478bd9Sstevel@tonic-gate i_ddi_intr_set_supported_types(dev_info_t *dip, int intr_types)
110*7c478bd9Sstevel@tonic-gate {
111*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t		*intr_p = DEVI(dip)->devi_intr_p;
112*7c478bd9Sstevel@tonic-gate 
113*7c478bd9Sstevel@tonic-gate 	if (intr_p)
114*7c478bd9Sstevel@tonic-gate 		intr_p->devi_intr_sup_types = intr_types;
115*7c478bd9Sstevel@tonic-gate }
116*7c478bd9Sstevel@tonic-gate 
117*7c478bd9Sstevel@tonic-gate uint_t
118*7c478bd9Sstevel@tonic-gate i_ddi_intr_get_supported_nintrs(dev_info_t *dip, int intr_type)
119*7c478bd9Sstevel@tonic-gate {
120*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t		*intr_p = DEVI(dip)->devi_intr_p;
121*7c478bd9Sstevel@tonic-gate 	ddi_intr_handle_impl_t	hdl;
122*7c478bd9Sstevel@tonic-gate 	int			ret, nintrs;
123*7c478bd9Sstevel@tonic-gate 
124*7c478bd9Sstevel@tonic-gate 	if ((intr_p) && (intr_p->devi_intr_curr_type == intr_type) &&
125*7c478bd9Sstevel@tonic-gate 	    (intr_p->devi_intr_sup_nintrs))
126*7c478bd9Sstevel@tonic-gate 		return (intr_p->devi_intr_sup_nintrs);
127*7c478bd9Sstevel@tonic-gate 
128*7c478bd9Sstevel@tonic-gate 	bzero(&hdl, sizeof (ddi_intr_handle_impl_t));
129*7c478bd9Sstevel@tonic-gate 	hdl.ih_dip = dip;
130*7c478bd9Sstevel@tonic-gate 	hdl.ih_type = intr_type;
131*7c478bd9Sstevel@tonic-gate 
132*7c478bd9Sstevel@tonic-gate 	ret = i_ddi_handle_intr_ops(dip, dip, DDI_INTROP_NINTRS, &hdl,
133*7c478bd9Sstevel@tonic-gate 	    (void *)&nintrs);
134*7c478bd9Sstevel@tonic-gate 
135*7c478bd9Sstevel@tonic-gate 	return ((ret == DDI_SUCCESS) ? nintrs : 0);
136*7c478bd9Sstevel@tonic-gate }
137*7c478bd9Sstevel@tonic-gate 
138*7c478bd9Sstevel@tonic-gate /*
139*7c478bd9Sstevel@tonic-gate  * NOTE: This function is only called by ddi_intr_alloc().
140*7c478bd9Sstevel@tonic-gate  */
141*7c478bd9Sstevel@tonic-gate void
142*7c478bd9Sstevel@tonic-gate i_ddi_intr_set_supported_nintrs(dev_info_t *dip, int nintrs)
143*7c478bd9Sstevel@tonic-gate {
144*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t *intr_p = DEVI(dip)->devi_intr_p;
145*7c478bd9Sstevel@tonic-gate 
146*7c478bd9Sstevel@tonic-gate 	if (intr_p)
147*7c478bd9Sstevel@tonic-gate 		intr_p->devi_intr_sup_nintrs = nintrs;
148*7c478bd9Sstevel@tonic-gate }
149*7c478bd9Sstevel@tonic-gate 
150*7c478bd9Sstevel@tonic-gate uint_t
151*7c478bd9Sstevel@tonic-gate i_ddi_intr_get_current_type(dev_info_t *dip)
152*7c478bd9Sstevel@tonic-gate {
153*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t *intr_p = DEVI(dip)->devi_intr_p;
154*7c478bd9Sstevel@tonic-gate 
155*7c478bd9Sstevel@tonic-gate 	return (intr_p ? intr_p->devi_intr_curr_type : 0);
156*7c478bd9Sstevel@tonic-gate }
157*7c478bd9Sstevel@tonic-gate 
158*7c478bd9Sstevel@tonic-gate /*
159*7c478bd9Sstevel@tonic-gate  * NOTE: This function is only called by
160*7c478bd9Sstevel@tonic-gate  *       ddi_intr_alloc() and ddi_intr_free().
161*7c478bd9Sstevel@tonic-gate  */
162*7c478bd9Sstevel@tonic-gate void
163*7c478bd9Sstevel@tonic-gate i_ddi_intr_set_current_type(dev_info_t *dip, int intr_type)
164*7c478bd9Sstevel@tonic-gate {
165*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t *intr_p = DEVI(dip)->devi_intr_p;
166*7c478bd9Sstevel@tonic-gate 
167*7c478bd9Sstevel@tonic-gate 	if (intr_p)
168*7c478bd9Sstevel@tonic-gate 		intr_p->devi_intr_curr_type = intr_type;
169*7c478bd9Sstevel@tonic-gate }
170*7c478bd9Sstevel@tonic-gate 
171*7c478bd9Sstevel@tonic-gate uint_t
172*7c478bd9Sstevel@tonic-gate i_ddi_intr_get_current_nintrs(dev_info_t *dip)
173*7c478bd9Sstevel@tonic-gate {
174*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t *intr_p = DEVI(dip)->devi_intr_p;
175*7c478bd9Sstevel@tonic-gate 
176*7c478bd9Sstevel@tonic-gate 	return (intr_p ? intr_p->devi_intr_curr_nintrs : 0);
177*7c478bd9Sstevel@tonic-gate }
178*7c478bd9Sstevel@tonic-gate 
179*7c478bd9Sstevel@tonic-gate /*
180*7c478bd9Sstevel@tonic-gate  * NOTE: This function is only called by
181*7c478bd9Sstevel@tonic-gate  *       ddi_intr_alloc() and ddi_intr_free().
182*7c478bd9Sstevel@tonic-gate  */
183*7c478bd9Sstevel@tonic-gate void
184*7c478bd9Sstevel@tonic-gate i_ddi_intr_set_current_nintrs(dev_info_t *dip, int nintrs)
185*7c478bd9Sstevel@tonic-gate {
186*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t *intr_p = DEVI(dip)->devi_intr_p;
187*7c478bd9Sstevel@tonic-gate 
188*7c478bd9Sstevel@tonic-gate 	if (intr_p)
189*7c478bd9Sstevel@tonic-gate 		intr_p->devi_intr_curr_nintrs = nintrs;
190*7c478bd9Sstevel@tonic-gate }
191*7c478bd9Sstevel@tonic-gate 
192*7c478bd9Sstevel@tonic-gate ddi_intr_msix_t *
193*7c478bd9Sstevel@tonic-gate i_ddi_get_msix(dev_info_t *dip)
194*7c478bd9Sstevel@tonic-gate {
195*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t *intr_p = DEVI(dip)->devi_intr_p;
196*7c478bd9Sstevel@tonic-gate 
197*7c478bd9Sstevel@tonic-gate 	return (intr_p ? intr_p->devi_msix_p : NULL);
198*7c478bd9Sstevel@tonic-gate }
199*7c478bd9Sstevel@tonic-gate 
200*7c478bd9Sstevel@tonic-gate void
201*7c478bd9Sstevel@tonic-gate i_ddi_set_msix(dev_info_t *dip, ddi_intr_msix_t *msix_p)
202*7c478bd9Sstevel@tonic-gate {
203*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t *intr_p = DEVI(dip)->devi_intr_p;
204*7c478bd9Sstevel@tonic-gate 
205*7c478bd9Sstevel@tonic-gate 	if (intr_p)
206*7c478bd9Sstevel@tonic-gate 		intr_p->devi_msix_p = msix_p;
207*7c478bd9Sstevel@tonic-gate }
208*7c478bd9Sstevel@tonic-gate 
209*7c478bd9Sstevel@tonic-gate ddi_intr_handle_t *
210*7c478bd9Sstevel@tonic-gate i_ddi_get_intr_handle(dev_info_t *dip, int inum)
211*7c478bd9Sstevel@tonic-gate {
212*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t *intr_p = DEVI(dip)->devi_intr_p;
213*7c478bd9Sstevel@tonic-gate 
214*7c478bd9Sstevel@tonic-gate 	if (intr_p == NULL)
215*7c478bd9Sstevel@tonic-gate 		return (NULL);
216*7c478bd9Sstevel@tonic-gate 
217*7c478bd9Sstevel@tonic-gate 	ASSERT((inum >= 0) && (inum < intr_p->devi_intr_sup_nintrs));
218*7c478bd9Sstevel@tonic-gate 
219*7c478bd9Sstevel@tonic-gate 	return ((intr_p->devi_intr_handle_p) ?
220*7c478bd9Sstevel@tonic-gate 	    intr_p->devi_intr_handle_p[inum] : NULL);
221*7c478bd9Sstevel@tonic-gate }
222*7c478bd9Sstevel@tonic-gate 
223*7c478bd9Sstevel@tonic-gate void
224*7c478bd9Sstevel@tonic-gate i_ddi_set_intr_handle(dev_info_t *dip, int inum,
225*7c478bd9Sstevel@tonic-gate     ddi_intr_handle_t *intr_hdlp)
226*7c478bd9Sstevel@tonic-gate {
227*7c478bd9Sstevel@tonic-gate 	devinfo_intr_t	*intr_p = DEVI(dip)->devi_intr_p;
228*7c478bd9Sstevel@tonic-gate 
229*7c478bd9Sstevel@tonic-gate 	if (intr_p == NULL)
230*7c478bd9Sstevel@tonic-gate 		return;
231*7c478bd9Sstevel@tonic-gate 
232*7c478bd9Sstevel@tonic-gate 	ASSERT((inum >= 0) && (inum < intr_p->devi_intr_sup_nintrs));
233*7c478bd9Sstevel@tonic-gate 
234*7c478bd9Sstevel@tonic-gate 	if (intr_p->devi_intr_handle_p == NULL) {
235*7c478bd9Sstevel@tonic-gate 		/* nintrs could be zero; so check for it first */
236*7c478bd9Sstevel@tonic-gate 		if (intr_p->devi_intr_sup_nintrs)
237*7c478bd9Sstevel@tonic-gate 			intr_p->devi_intr_handle_p = kmem_zalloc(
238*7c478bd9Sstevel@tonic-gate 			    sizeof (ddi_intr_handle_t) *
239*7c478bd9Sstevel@tonic-gate 			    intr_p->devi_intr_sup_nintrs, KM_SLEEP);
240*7c478bd9Sstevel@tonic-gate 	}
241*7c478bd9Sstevel@tonic-gate 
242*7c478bd9Sstevel@tonic-gate 	intr_p->devi_intr_handle_p[inum] = intr_hdlp;
243*7c478bd9Sstevel@tonic-gate }
244*7c478bd9Sstevel@tonic-gate 
245*7c478bd9Sstevel@tonic-gate /*
246*7c478bd9Sstevel@tonic-gate  * The "ddi-intr-weight" property contains the weight of each interrupt
247*7c478bd9Sstevel@tonic-gate  * associated with a dev_info node. For devices with multiple interrupts per
248*7c478bd9Sstevel@tonic-gate  * dev_info node, the total load of the device is "devi_intr_weight * nintr",
249*7c478bd9Sstevel@tonic-gate  * possibly spread out over multiple CPUs.
250*7c478bd9Sstevel@tonic-gate  *
251*7c478bd9Sstevel@tonic-gate  * Maintaining this as a property permits possible tweaking in the product
252*7c478bd9Sstevel@tonic-gate  * in response to customer problems via driver.conf property definitions at
253*7c478bd9Sstevel@tonic-gate  * the driver or the instance level.  This does not mean that "ddi-intr_weight"
254*7c478bd9Sstevel@tonic-gate  * is a formal or committed interface.
255*7c478bd9Sstevel@tonic-gate  */
256*7c478bd9Sstevel@tonic-gate int32_t
257*7c478bd9Sstevel@tonic-gate i_ddi_get_intr_weight(dev_info_t *dip)
258*7c478bd9Sstevel@tonic-gate {
259*7c478bd9Sstevel@tonic-gate 	int32_t	weight;
260*7c478bd9Sstevel@tonic-gate 
261*7c478bd9Sstevel@tonic-gate 	weight = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
262*7c478bd9Sstevel@tonic-gate 	    DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, "ddi-intr-weight", -1);
263*7c478bd9Sstevel@tonic-gate 	if (weight < -1)
264*7c478bd9Sstevel@tonic-gate 		weight = -1;			/* undefined */
265*7c478bd9Sstevel@tonic-gate 	return (weight);
266*7c478bd9Sstevel@tonic-gate }
267*7c478bd9Sstevel@tonic-gate 
268*7c478bd9Sstevel@tonic-gate int32_t
269*7c478bd9Sstevel@tonic-gate i_ddi_set_intr_weight(dev_info_t *dip, int32_t weight)
270*7c478bd9Sstevel@tonic-gate {
271*7c478bd9Sstevel@tonic-gate 	int32_t oweight;
272*7c478bd9Sstevel@tonic-gate 
273*7c478bd9Sstevel@tonic-gate 	oweight = i_ddi_get_intr_weight(dip);
274*7c478bd9Sstevel@tonic-gate 	if ((weight > 0) && (oweight != weight))
275*7c478bd9Sstevel@tonic-gate 		(void) ndi_prop_update_int(DDI_DEV_T_NONE, dip,
276*7c478bd9Sstevel@tonic-gate 		    "ddi-intr-weight", weight);
277*7c478bd9Sstevel@tonic-gate 	return (oweight);
278*7c478bd9Sstevel@tonic-gate }
279*7c478bd9Sstevel@tonic-gate 
280*7c478bd9Sstevel@tonic-gate /*
281*7c478bd9Sstevel@tonic-gate  * Old DDI interrupt framework
282*7c478bd9Sstevel@tonic-gate  *
283*7c478bd9Sstevel@tonic-gate  * NOTE:
284*7c478bd9Sstevel@tonic-gate  *	The following 4 busops entry points are obsoleted with version
285*7c478bd9Sstevel@tonic-gate  *	9 or greater. Use i_ddi_intr_op interface in place of these
286*7c478bd9Sstevel@tonic-gate  *	obsolete interfaces.
287*7c478bd9Sstevel@tonic-gate  *
288*7c478bd9Sstevel@tonic-gate  *	Remove these busops entry points and all related data structures
289*7c478bd9Sstevel@tonic-gate  *	in future major/minor solaris release.
290*7c478bd9Sstevel@tonic-gate  */
291*7c478bd9Sstevel@tonic-gate 
292*7c478bd9Sstevel@tonic-gate /* ARGSUSED */
293*7c478bd9Sstevel@tonic-gate ddi_intrspec_t
294*7c478bd9Sstevel@tonic-gate i_ddi_get_intrspec(dev_info_t *dip, dev_info_t *rdip, uint_t inumber)
295*7c478bd9Sstevel@tonic-gate {
296*7c478bd9Sstevel@tonic-gate 	dev_info_t	*pdip = ddi_get_parent(dip);
297*7c478bd9Sstevel@tonic-gate 
298*7c478bd9Sstevel@tonic-gate 	cmn_err(CE_WARN, "Failed to process interrupt "
299*7c478bd9Sstevel@tonic-gate 	    "for %s%d due to down-rev nexus driver %s%d",
300*7c478bd9Sstevel@tonic-gate 	    ddi_get_name(rdip), ddi_get_instance(rdip),
301*7c478bd9Sstevel@tonic-gate 	    ddi_get_name(pdip), ddi_get_instance(pdip));
302*7c478bd9Sstevel@tonic-gate 
303*7c478bd9Sstevel@tonic-gate 	return (NULL);
304*7c478bd9Sstevel@tonic-gate }
305*7c478bd9Sstevel@tonic-gate 
306*7c478bd9Sstevel@tonic-gate /* ARGSUSED */
307*7c478bd9Sstevel@tonic-gate int
308*7c478bd9Sstevel@tonic-gate i_ddi_add_intrspec(dev_info_t *dip, dev_info_t *rdip, ddi_intrspec_t intrspec,
309*7c478bd9Sstevel@tonic-gate     ddi_iblock_cookie_t *iblock_cookiep,
310*7c478bd9Sstevel@tonic-gate     ddi_idevice_cookie_t *idevice_cookiep,
311*7c478bd9Sstevel@tonic-gate     uint_t (*int_handler)(caddr_t int_handler_arg),
312*7c478bd9Sstevel@tonic-gate     caddr_t int_handler_arg, int kind)
313*7c478bd9Sstevel@tonic-gate {
314*7c478bd9Sstevel@tonic-gate 	dev_info_t	*pdip = ddi_get_parent(dip);
315*7c478bd9Sstevel@tonic-gate 
316*7c478bd9Sstevel@tonic-gate 	cmn_err(CE_WARN, "Failed to process interrupt "
317*7c478bd9Sstevel@tonic-gate 	    "for %s%d due to down-rev nexus driver %s%d",
318*7c478bd9Sstevel@tonic-gate 	    ddi_get_name(rdip), ddi_get_instance(rdip),
319*7c478bd9Sstevel@tonic-gate 	    ddi_get_name(pdip), ddi_get_instance(pdip));
320*7c478bd9Sstevel@tonic-gate 
321*7c478bd9Sstevel@tonic-gate 	return (DDI_ENOTSUP);
322*7c478bd9Sstevel@tonic-gate }
323*7c478bd9Sstevel@tonic-gate 
324*7c478bd9Sstevel@tonic-gate /* ARGSUSED */
325*7c478bd9Sstevel@tonic-gate void
326*7c478bd9Sstevel@tonic-gate i_ddi_remove_intrspec(dev_info_t *dip, dev_info_t *rdip,
327*7c478bd9Sstevel@tonic-gate     ddi_intrspec_t intrspec, ddi_iblock_cookie_t iblock_cookie)
328*7c478bd9Sstevel@tonic-gate {
329*7c478bd9Sstevel@tonic-gate 	dev_info_t	*pdip = ddi_get_parent(dip);
330*7c478bd9Sstevel@tonic-gate 
331*7c478bd9Sstevel@tonic-gate 	cmn_err(CE_WARN, "Failed to process interrupt "
332*7c478bd9Sstevel@tonic-gate 	    "for %s%d due to down-rev nexus driver %s%d",
333*7c478bd9Sstevel@tonic-gate 	    ddi_get_name(rdip), ddi_get_instance(rdip),
334*7c478bd9Sstevel@tonic-gate 	    ddi_get_name(pdip), ddi_get_instance(pdip));
335*7c478bd9Sstevel@tonic-gate }
336*7c478bd9Sstevel@tonic-gate 
337*7c478bd9Sstevel@tonic-gate /* ARGSUSED */
338*7c478bd9Sstevel@tonic-gate int
339*7c478bd9Sstevel@tonic-gate i_ddi_intr_ctlops(dev_info_t *dip, dev_info_t *rdip, ddi_intr_ctlop_t op,
340*7c478bd9Sstevel@tonic-gate     void *arg, void *val)
341*7c478bd9Sstevel@tonic-gate {
342*7c478bd9Sstevel@tonic-gate 	dev_info_t	*pdip = ddi_get_parent(dip);
343*7c478bd9Sstevel@tonic-gate 
344*7c478bd9Sstevel@tonic-gate 	cmn_err(CE_WARN, "Failed to process interrupt "
345*7c478bd9Sstevel@tonic-gate 	    "for %s%d due to down-rev nexus driver %s%d",
346*7c478bd9Sstevel@tonic-gate 	    ddi_get_name(rdip), ddi_get_instance(rdip),
347*7c478bd9Sstevel@tonic-gate 	    ddi_get_name(pdip), ddi_get_instance(pdip));
348*7c478bd9Sstevel@tonic-gate 
349*7c478bd9Sstevel@tonic-gate 	return (DDI_ENOTSUP);
350*7c478bd9Sstevel@tonic-gate }
351