xref: /onnv-gate/usr/src/uts/common/inet/dlpistub/dlpistub.c (revision 8485:633e5b5eb268)
1*8485SPeter.Memishian@Sun.COM /*
2*8485SPeter.Memishian@Sun.COM  * CDDL HEADER START
3*8485SPeter.Memishian@Sun.COM  *
4*8485SPeter.Memishian@Sun.COM  * The contents of this file are subject to the terms of the
5*8485SPeter.Memishian@Sun.COM  * Common Development and Distribution License (the "License").
6*8485SPeter.Memishian@Sun.COM  * You may not use this file except in compliance with the License.
7*8485SPeter.Memishian@Sun.COM  *
8*8485SPeter.Memishian@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*8485SPeter.Memishian@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*8485SPeter.Memishian@Sun.COM  * See the License for the specific language governing permissions
11*8485SPeter.Memishian@Sun.COM  * and limitations under the License.
12*8485SPeter.Memishian@Sun.COM  *
13*8485SPeter.Memishian@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*8485SPeter.Memishian@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*8485SPeter.Memishian@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*8485SPeter.Memishian@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*8485SPeter.Memishian@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*8485SPeter.Memishian@Sun.COM  *
19*8485SPeter.Memishian@Sun.COM  * CDDL HEADER END
20*8485SPeter.Memishian@Sun.COM  */
21*8485SPeter.Memishian@Sun.COM /*
22*8485SPeter.Memishian@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23*8485SPeter.Memishian@Sun.COM  * Use is subject to license terms.
24*8485SPeter.Memishian@Sun.COM  */
25*8485SPeter.Memishian@Sun.COM 
26*8485SPeter.Memishian@Sun.COM /*
27*8485SPeter.Memishian@Sun.COM  * DLPI stub driver; currently supports VNI and IPMP stub devices.
28*8485SPeter.Memishian@Sun.COM  */
29*8485SPeter.Memishian@Sun.COM 
30*8485SPeter.Memishian@Sun.COM #include <sys/conf.h>
31*8485SPeter.Memishian@Sun.COM #include <sys/ddi.h>
32*8485SPeter.Memishian@Sun.COM #include <sys/sunddi.h>
33*8485SPeter.Memishian@Sun.COM #include <sys/dlpi.h>
34*8485SPeter.Memishian@Sun.COM #include <sys/stat.h>
35*8485SPeter.Memishian@Sun.COM #include <sys/strsun.h>
36*8485SPeter.Memishian@Sun.COM #include <sys/stropts.h>
37*8485SPeter.Memishian@Sun.COM #include <sys/types.h>
38*8485SPeter.Memishian@Sun.COM #include <sys/id_space.h>
39*8485SPeter.Memishian@Sun.COM #include <sys/sysmacros.h>
40*8485SPeter.Memishian@Sun.COM #include <sys/kmem.h>
41*8485SPeter.Memishian@Sun.COM #include <sys/modctl.h>
42*8485SPeter.Memishian@Sun.COM #include <sys/mkdev.h>
43*8485SPeter.Memishian@Sun.COM #include <sys/sdt.h>
44*8485SPeter.Memishian@Sun.COM 
45*8485SPeter.Memishian@Sun.COM #include "dlpistub_impl.h"
46*8485SPeter.Memishian@Sun.COM 
47*8485SPeter.Memishian@Sun.COM static id_space_t *ds_minors;
48*8485SPeter.Memishian@Sun.COM static dev_info_t *ds_dip;
49*8485SPeter.Memishian@Sun.COM 
50*8485SPeter.Memishian@Sun.COM /*
51*8485SPeter.Memishian@Sun.COM  * DL_INFO_ACK template.
52*8485SPeter.Memishian@Sun.COM  */
53*8485SPeter.Memishian@Sun.COM static dl_info_ack_t ds_infoack = {
54*8485SPeter.Memishian@Sun.COM 	DL_INFO_ACK,	/* dl_primitive */
55*8485SPeter.Memishian@Sun.COM 	0,		/* dl_max_sdu */
56*8485SPeter.Memishian@Sun.COM 	0,		/* dl_min_sdu */
57*8485SPeter.Memishian@Sun.COM 	0,		/* dl_addr_length */
58*8485SPeter.Memishian@Sun.COM 	0,		/* dl_mac_type */
59*8485SPeter.Memishian@Sun.COM 	0,		/* dl_reserved */
60*8485SPeter.Memishian@Sun.COM 	0,		/* dl_current_state */
61*8485SPeter.Memishian@Sun.COM 	0,		/* dl_sap_length */
62*8485SPeter.Memishian@Sun.COM 	DL_CLDLS,	/* dl_service_mode */
63*8485SPeter.Memishian@Sun.COM 	0,		/* dl_qos_length */
64*8485SPeter.Memishian@Sun.COM 	0,		/* dl_qos_offset */
65*8485SPeter.Memishian@Sun.COM 	0,		/* dl_qos_range_length */
66*8485SPeter.Memishian@Sun.COM 	0,		/* dl_qos_range_offset */
67*8485SPeter.Memishian@Sun.COM 	DL_STYLE2,	/* dl_provider_style */
68*8485SPeter.Memishian@Sun.COM 	0,		/* dl_addr_offset */
69*8485SPeter.Memishian@Sun.COM 	DL_VERSION_2,	/* dl_version */
70*8485SPeter.Memishian@Sun.COM 	0,		/* dl_brdcst_addr_length */
71*8485SPeter.Memishian@Sun.COM 	0,		/* dl_brdcst_addr_offset */
72*8485SPeter.Memishian@Sun.COM 	0		/* dl_growth */
73*8485SPeter.Memishian@Sun.COM };
74*8485SPeter.Memishian@Sun.COM 
75*8485SPeter.Memishian@Sun.COM static int
ds_attach(dev_info_t * dip,ddi_attach_cmd_t cmd)76*8485SPeter.Memishian@Sun.COM ds_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
77*8485SPeter.Memishian@Sun.COM {
78*8485SPeter.Memishian@Sun.COM 	if (cmd != DDI_ATTACH)
79*8485SPeter.Memishian@Sun.COM 		return (DDI_FAILURE);
80*8485SPeter.Memishian@Sun.COM 
81*8485SPeter.Memishian@Sun.COM 	if (ddi_create_minor_node(dip, "vni", S_IFCHR, DS_MINOR_VNI,
82*8485SPeter.Memishian@Sun.COM 	    DDI_PSEUDO, 0) == DDI_FAILURE ||
83*8485SPeter.Memishian@Sun.COM 	    ddi_create_minor_node(dip, "ipmpstub", S_IFCHR, DS_MINOR_IPMP,
84*8485SPeter.Memishian@Sun.COM 	    DDI_PSEUDO, 0) == DDI_FAILURE) {
85*8485SPeter.Memishian@Sun.COM 		ddi_remove_minor_node(dip, NULL);
86*8485SPeter.Memishian@Sun.COM 		cmn_err(CE_NOTE, "ds_attach: cannot create minor nodes");
87*8485SPeter.Memishian@Sun.COM 		return (DDI_FAILURE);
88*8485SPeter.Memishian@Sun.COM 	}
89*8485SPeter.Memishian@Sun.COM 
90*8485SPeter.Memishian@Sun.COM 	ds_dip = dip;
91*8485SPeter.Memishian@Sun.COM 	ds_minors = id_space_create("ds_minors", DS_MINOR_START, MAXMIN32);
92*8485SPeter.Memishian@Sun.COM 	return (DDI_SUCCESS);
93*8485SPeter.Memishian@Sun.COM }
94*8485SPeter.Memishian@Sun.COM 
95*8485SPeter.Memishian@Sun.COM static int
ds_detach(dev_info_t * dip,ddi_detach_cmd_t cmd)96*8485SPeter.Memishian@Sun.COM ds_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
97*8485SPeter.Memishian@Sun.COM {
98*8485SPeter.Memishian@Sun.COM 	if (cmd != DDI_DETACH)
99*8485SPeter.Memishian@Sun.COM 		return (DDI_FAILURE);
100*8485SPeter.Memishian@Sun.COM 
101*8485SPeter.Memishian@Sun.COM 	id_space_destroy(ds_minors);
102*8485SPeter.Memishian@Sun.COM 	ds_minors = NULL;
103*8485SPeter.Memishian@Sun.COM 	ASSERT(dip == ds_dip);
104*8485SPeter.Memishian@Sun.COM 	ddi_remove_minor_node(dip, NULL);
105*8485SPeter.Memishian@Sun.COM 	ds_dip = NULL;
106*8485SPeter.Memishian@Sun.COM 	return (DDI_SUCCESS);
107*8485SPeter.Memishian@Sun.COM }
108*8485SPeter.Memishian@Sun.COM 
109*8485SPeter.Memishian@Sun.COM /* ARGSUSED */
110*8485SPeter.Memishian@Sun.COM static int
ds_devinfo(dev_info_t * dip,ddi_info_cmd_t infocmd,void * arg,void ** result)111*8485SPeter.Memishian@Sun.COM ds_devinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
112*8485SPeter.Memishian@Sun.COM {
113*8485SPeter.Memishian@Sun.COM 	int error = DDI_FAILURE;
114*8485SPeter.Memishian@Sun.COM 
115*8485SPeter.Memishian@Sun.COM 	switch (infocmd) {
116*8485SPeter.Memishian@Sun.COM 	case DDI_INFO_DEVT2INSTANCE:
117*8485SPeter.Memishian@Sun.COM 		*result = (void *)0;
118*8485SPeter.Memishian@Sun.COM 		error = DDI_SUCCESS;
119*8485SPeter.Memishian@Sun.COM 		break;
120*8485SPeter.Memishian@Sun.COM 	case DDI_INFO_DEVT2DEVINFO:
121*8485SPeter.Memishian@Sun.COM 		if (ds_dip != NULL) {
122*8485SPeter.Memishian@Sun.COM 			*result = ds_dip;
123*8485SPeter.Memishian@Sun.COM 			error = DDI_SUCCESS;
124*8485SPeter.Memishian@Sun.COM 		}
125*8485SPeter.Memishian@Sun.COM 		break;
126*8485SPeter.Memishian@Sun.COM 	}
127*8485SPeter.Memishian@Sun.COM 	return (error);
128*8485SPeter.Memishian@Sun.COM }
129*8485SPeter.Memishian@Sun.COM 
130*8485SPeter.Memishian@Sun.COM /* ARGSUSED */
131*8485SPeter.Memishian@Sun.COM static int
ds_open(queue_t * q,dev_t * devp,int flag,int sflag,cred_t * credp)132*8485SPeter.Memishian@Sun.COM ds_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
133*8485SPeter.Memishian@Sun.COM {
134*8485SPeter.Memishian@Sun.COM 	int type;
135*8485SPeter.Memishian@Sun.COM 	dlpistub_t *dsp;
136*8485SPeter.Memishian@Sun.COM 
137*8485SPeter.Memishian@Sun.COM 	if (sflag == CLONEOPEN || sflag == MODOPEN)
138*8485SPeter.Memishian@Sun.COM 		return (EINVAL);
139*8485SPeter.Memishian@Sun.COM 
140*8485SPeter.Memishian@Sun.COM 	if (q->q_ptr != NULL)
141*8485SPeter.Memishian@Sun.COM 		return (0);
142*8485SPeter.Memishian@Sun.COM 
143*8485SPeter.Memishian@Sun.COM 	switch (getminor(*devp)) {
144*8485SPeter.Memishian@Sun.COM 	case DS_MINOR_VNI:
145*8485SPeter.Memishian@Sun.COM 		type = SUNW_DL_VNI;
146*8485SPeter.Memishian@Sun.COM 		break;
147*8485SPeter.Memishian@Sun.COM 	case DS_MINOR_IPMP:
148*8485SPeter.Memishian@Sun.COM 		type = SUNW_DL_IPMP;
149*8485SPeter.Memishian@Sun.COM 		break;
150*8485SPeter.Memishian@Sun.COM 	default:
151*8485SPeter.Memishian@Sun.COM 		return (ENXIO);
152*8485SPeter.Memishian@Sun.COM 	}
153*8485SPeter.Memishian@Sun.COM 
154*8485SPeter.Memishian@Sun.COM 	dsp = kmem_zalloc(sizeof (dlpistub_t), KM_SLEEP);
155*8485SPeter.Memishian@Sun.COM 	dsp->ds_type = type;
156*8485SPeter.Memishian@Sun.COM 	dsp->ds_minor = (minor_t)id_alloc(ds_minors);
157*8485SPeter.Memishian@Sun.COM 	dsp->ds_state = DL_UNATTACHED;
158*8485SPeter.Memishian@Sun.COM 	*devp = makedevice(getmajor(*devp), dsp->ds_minor);
159*8485SPeter.Memishian@Sun.COM 	q->q_ptr = WR(q)->q_ptr = dsp;
160*8485SPeter.Memishian@Sun.COM 	qprocson(q);
161*8485SPeter.Memishian@Sun.COM 
162*8485SPeter.Memishian@Sun.COM 	return (0);
163*8485SPeter.Memishian@Sun.COM }
164*8485SPeter.Memishian@Sun.COM 
165*8485SPeter.Memishian@Sun.COM /* ARGSUSED */
166*8485SPeter.Memishian@Sun.COM static int
ds_close(queue_t * q,int flag,cred_t * credp)167*8485SPeter.Memishian@Sun.COM ds_close(queue_t *q, int flag, cred_t *credp)
168*8485SPeter.Memishian@Sun.COM {
169*8485SPeter.Memishian@Sun.COM 	dlpistub_t	*dsp = q->q_ptr;
170*8485SPeter.Memishian@Sun.COM 
171*8485SPeter.Memishian@Sun.COM 	qprocsoff(q);
172*8485SPeter.Memishian@Sun.COM 	q->q_ptr = WR(q)->q_ptr = NULL;
173*8485SPeter.Memishian@Sun.COM 
174*8485SPeter.Memishian@Sun.COM 	id_free(ds_minors, dsp->ds_minor);
175*8485SPeter.Memishian@Sun.COM 	kmem_free(dsp, sizeof (dlpistub_t));
176*8485SPeter.Memishian@Sun.COM 
177*8485SPeter.Memishian@Sun.COM 	return (0);
178*8485SPeter.Memishian@Sun.COM }
179*8485SPeter.Memishian@Sun.COM 
180*8485SPeter.Memishian@Sun.COM static int
ds_badprim(queue_t * q,mblk_t * mp,t_scalar_t prim)181*8485SPeter.Memishian@Sun.COM ds_badprim(queue_t *q, mblk_t *mp, t_scalar_t prim)
182*8485SPeter.Memishian@Sun.COM {
183*8485SPeter.Memishian@Sun.COM 	dlerrorack(q, mp, prim, DL_BADPRIM, 0);
184*8485SPeter.Memishian@Sun.COM 	return (0);
185*8485SPeter.Memishian@Sun.COM }
186*8485SPeter.Memishian@Sun.COM 
187*8485SPeter.Memishian@Sun.COM static int
ds_outstate(queue_t * q,mblk_t * mp,t_scalar_t prim)188*8485SPeter.Memishian@Sun.COM ds_outstate(queue_t *q, mblk_t *mp, t_scalar_t prim)
189*8485SPeter.Memishian@Sun.COM {
190*8485SPeter.Memishian@Sun.COM 	dlerrorack(q, mp, prim, DL_OUTSTATE, 0);
191*8485SPeter.Memishian@Sun.COM 	return (0);
192*8485SPeter.Memishian@Sun.COM }
193*8485SPeter.Memishian@Sun.COM 
194*8485SPeter.Memishian@Sun.COM static int
ds_wput(queue_t * q,mblk_t * mp)195*8485SPeter.Memishian@Sun.COM ds_wput(queue_t *q, mblk_t *mp)
196*8485SPeter.Memishian@Sun.COM {
197*8485SPeter.Memishian@Sun.COM 	union DL_primitives	*dlp;
198*8485SPeter.Memishian@Sun.COM 	dl_info_ack_t		*dlip;
199*8485SPeter.Memishian@Sun.COM 	dlpistub_t		*dsp = q->q_ptr;
200*8485SPeter.Memishian@Sun.COM 	t_scalar_t		prim;
201*8485SPeter.Memishian@Sun.COM 
202*8485SPeter.Memishian@Sun.COM 	switch (DB_TYPE(mp)) {
203*8485SPeter.Memishian@Sun.COM 	case M_PROTO:
204*8485SPeter.Memishian@Sun.COM 	case M_PCPROTO:
205*8485SPeter.Memishian@Sun.COM 		if (MBLKL(mp) < sizeof (t_scalar_t)) {
206*8485SPeter.Memishian@Sun.COM 			dlerrorack(q, mp, DL_PRIM_INVAL, DL_UNSUPPORTED, 0);
207*8485SPeter.Memishian@Sun.COM 			return (0);
208*8485SPeter.Memishian@Sun.COM 		}
209*8485SPeter.Memishian@Sun.COM 
210*8485SPeter.Memishian@Sun.COM 		dlp = (void *)mp->b_rptr;
211*8485SPeter.Memishian@Sun.COM 		prim = dlp->dl_primitive;
212*8485SPeter.Memishian@Sun.COM 		switch (prim) {
213*8485SPeter.Memishian@Sun.COM 		case DL_ATTACH_REQ:
214*8485SPeter.Memishian@Sun.COM 			if (MBLKL(mp) < DL_ATTACH_REQ_SIZE)
215*8485SPeter.Memishian@Sun.COM 				return (ds_badprim(q, mp, prim));
216*8485SPeter.Memishian@Sun.COM 
217*8485SPeter.Memishian@Sun.COM 			if (dsp->ds_state != DL_UNATTACHED)
218*8485SPeter.Memishian@Sun.COM 				return (ds_outstate(q, mp, prim));
219*8485SPeter.Memishian@Sun.COM 
220*8485SPeter.Memishian@Sun.COM 			dsp->ds_state = DL_UNBOUND;
221*8485SPeter.Memishian@Sun.COM 			dlokack(q, mp, DL_ATTACH_REQ);
222*8485SPeter.Memishian@Sun.COM 			break;
223*8485SPeter.Memishian@Sun.COM 
224*8485SPeter.Memishian@Sun.COM 		case DL_BIND_REQ:
225*8485SPeter.Memishian@Sun.COM 			if (MBLKL(mp) < DL_BIND_REQ_SIZE)
226*8485SPeter.Memishian@Sun.COM 				return (ds_badprim(q, mp, prim));
227*8485SPeter.Memishian@Sun.COM 
228*8485SPeter.Memishian@Sun.COM 			if (dsp->ds_state != DL_UNBOUND)
229*8485SPeter.Memishian@Sun.COM 				return (ds_outstate(q, mp, prim));
230*8485SPeter.Memishian@Sun.COM 
231*8485SPeter.Memishian@Sun.COM 			dsp->ds_state = DL_IDLE;
232*8485SPeter.Memishian@Sun.COM 			dlbindack(q, mp, dlp->bind_req.dl_sap, NULL, 0, 0, 0);
233*8485SPeter.Memishian@Sun.COM 			break;
234*8485SPeter.Memishian@Sun.COM 
235*8485SPeter.Memishian@Sun.COM 		case DL_INFO_REQ:
236*8485SPeter.Memishian@Sun.COM 			if (MBLKL(mp) < DL_INFO_REQ_SIZE)
237*8485SPeter.Memishian@Sun.COM 				return (ds_badprim(q, mp, prim));
238*8485SPeter.Memishian@Sun.COM 
239*8485SPeter.Memishian@Sun.COM 			mp = mexchange(q, mp, sizeof (dl_info_ack_t),
240*8485SPeter.Memishian@Sun.COM 			    M_PCPROTO, DL_INFO_ACK);
241*8485SPeter.Memishian@Sun.COM 			if (mp != NULL) {
242*8485SPeter.Memishian@Sun.COM 				dlip = (void *)mp->b_rptr;
243*8485SPeter.Memishian@Sun.COM 				*dlip = ds_infoack;
244*8485SPeter.Memishian@Sun.COM 				dlip->dl_mac_type = dsp->ds_type;
245*8485SPeter.Memishian@Sun.COM 				dlip->dl_current_state = dsp->ds_state;
246*8485SPeter.Memishian@Sun.COM 				qreply(q, mp);
247*8485SPeter.Memishian@Sun.COM 			}
248*8485SPeter.Memishian@Sun.COM 			break;
249*8485SPeter.Memishian@Sun.COM 
250*8485SPeter.Memishian@Sun.COM 		case DL_PHYS_ADDR_REQ:
251*8485SPeter.Memishian@Sun.COM 			if (MBLKL(mp) < DL_PHYS_ADDR_REQ_SIZE)
252*8485SPeter.Memishian@Sun.COM 				return (ds_badprim(q, mp, prim));
253*8485SPeter.Memishian@Sun.COM 
254*8485SPeter.Memishian@Sun.COM 			dlphysaddrack(q, mp, NULL, 0);
255*8485SPeter.Memishian@Sun.COM 			break;
256*8485SPeter.Memishian@Sun.COM 
257*8485SPeter.Memishian@Sun.COM 		case DL_UNBIND_REQ:
258*8485SPeter.Memishian@Sun.COM 			if (MBLKL(mp) < DL_UNBIND_REQ_SIZE)
259*8485SPeter.Memishian@Sun.COM 				return (ds_badprim(q, mp, prim));
260*8485SPeter.Memishian@Sun.COM 
261*8485SPeter.Memishian@Sun.COM 			if (dsp->ds_state != DL_IDLE)
262*8485SPeter.Memishian@Sun.COM 				return (ds_outstate(q, mp, prim));
263*8485SPeter.Memishian@Sun.COM 
264*8485SPeter.Memishian@Sun.COM 			dsp->ds_state = DL_UNBOUND;
265*8485SPeter.Memishian@Sun.COM 			dlokack(q, mp, DL_UNBIND_REQ);
266*8485SPeter.Memishian@Sun.COM 			break;
267*8485SPeter.Memishian@Sun.COM 
268*8485SPeter.Memishian@Sun.COM 		case DL_DETACH_REQ:
269*8485SPeter.Memishian@Sun.COM 			if (MBLKL(mp) < DL_DETACH_REQ_SIZE)
270*8485SPeter.Memishian@Sun.COM 				return (ds_badprim(q, mp, prim));
271*8485SPeter.Memishian@Sun.COM 
272*8485SPeter.Memishian@Sun.COM 			if (dsp->ds_state != DL_UNBOUND)
273*8485SPeter.Memishian@Sun.COM 				return (ds_outstate(q, mp, prim));
274*8485SPeter.Memishian@Sun.COM 
275*8485SPeter.Memishian@Sun.COM 			dsp->ds_state = DL_UNATTACHED;
276*8485SPeter.Memishian@Sun.COM 			dlokack(q, mp, DL_DETACH_REQ);
277*8485SPeter.Memishian@Sun.COM 			break;
278*8485SPeter.Memishian@Sun.COM 
279*8485SPeter.Memishian@Sun.COM 		case DL_UNITDATA_REQ:
280*8485SPeter.Memishian@Sun.COM 			DTRACE_PROBE2(dlpistub__data, dlpistub_t *, dsp,
281*8485SPeter.Memishian@Sun.COM 			    mblk_t *, mp);
282*8485SPeter.Memishian@Sun.COM 			freemsg(mp);
283*8485SPeter.Memishian@Sun.COM 			break;
284*8485SPeter.Memishian@Sun.COM 
285*8485SPeter.Memishian@Sun.COM 		default:
286*8485SPeter.Memishian@Sun.COM 			dlerrorack(q, mp, prim, DL_UNSUPPORTED, 0);
287*8485SPeter.Memishian@Sun.COM 		}
288*8485SPeter.Memishian@Sun.COM 		break;
289*8485SPeter.Memishian@Sun.COM 
290*8485SPeter.Memishian@Sun.COM 	case M_IOCTL:
291*8485SPeter.Memishian@Sun.COM 		miocnak(q, mp, 0, EINVAL);
292*8485SPeter.Memishian@Sun.COM 		break;
293*8485SPeter.Memishian@Sun.COM 
294*8485SPeter.Memishian@Sun.COM 	case M_FLUSH:
295*8485SPeter.Memishian@Sun.COM 		*mp->b_rptr &= ~FLUSHW;
296*8485SPeter.Memishian@Sun.COM 		if (*mp->b_rptr & FLUSHR)
297*8485SPeter.Memishian@Sun.COM 			qreply(q, mp);
298*8485SPeter.Memishian@Sun.COM 		else
299*8485SPeter.Memishian@Sun.COM 			freemsg(mp);
300*8485SPeter.Memishian@Sun.COM 		break;
301*8485SPeter.Memishian@Sun.COM 	default:
302*8485SPeter.Memishian@Sun.COM 		freemsg(mp);
303*8485SPeter.Memishian@Sun.COM 		break;
304*8485SPeter.Memishian@Sun.COM 	}
305*8485SPeter.Memishian@Sun.COM 
306*8485SPeter.Memishian@Sun.COM 	return (0);
307*8485SPeter.Memishian@Sun.COM }
308*8485SPeter.Memishian@Sun.COM 
309*8485SPeter.Memishian@Sun.COM static struct module_info ds_minfo = {
310*8485SPeter.Memishian@Sun.COM 	DS_IDNUM,	/* mi_idnum */
311*8485SPeter.Memishian@Sun.COM 	"dlpistub",	/* mi_idname */
312*8485SPeter.Memishian@Sun.COM 	0,		/* mi_minpsz */
313*8485SPeter.Memishian@Sun.COM 	INFPSZ,		/* mi_maxpsz */
314*8485SPeter.Memishian@Sun.COM 	0,		/* mi_hiwat */
315*8485SPeter.Memishian@Sun.COM 	0,		/* mi_lowat */
316*8485SPeter.Memishian@Sun.COM };
317*8485SPeter.Memishian@Sun.COM 
318*8485SPeter.Memishian@Sun.COM static struct qinit ds_rinit = {
319*8485SPeter.Memishian@Sun.COM 	NULL,		/* qi_putp */
320*8485SPeter.Memishian@Sun.COM 	NULL,		/* qi_srvp */
321*8485SPeter.Memishian@Sun.COM 	ds_open,	/* qi_qopen */
322*8485SPeter.Memishian@Sun.COM 	ds_close,	/* qi_qclose */
323*8485SPeter.Memishian@Sun.COM 	NULL,		/* qi_qadmin */
324*8485SPeter.Memishian@Sun.COM 	&ds_minfo,	/* qi_minfo */
325*8485SPeter.Memishian@Sun.COM };
326*8485SPeter.Memishian@Sun.COM 
327*8485SPeter.Memishian@Sun.COM static struct qinit ds_winit = {
328*8485SPeter.Memishian@Sun.COM 	ds_wput,	/* qi_putp */
329*8485SPeter.Memishian@Sun.COM 	NULL,		/* qi_srvp */
330*8485SPeter.Memishian@Sun.COM 	NULL,		/* qi_qopen */
331*8485SPeter.Memishian@Sun.COM 	NULL,		/* qi_qclose */
332*8485SPeter.Memishian@Sun.COM 	NULL,		/* qi_qadmin */
333*8485SPeter.Memishian@Sun.COM 	&ds_minfo,	/* qi_minfo */
334*8485SPeter.Memishian@Sun.COM };
335*8485SPeter.Memishian@Sun.COM 
336*8485SPeter.Memishian@Sun.COM static struct streamtab ds_info = {
337*8485SPeter.Memishian@Sun.COM 	&ds_rinit,	/* st_rdinit */
338*8485SPeter.Memishian@Sun.COM 	&ds_winit	/* st_wrinit */
339*8485SPeter.Memishian@Sun.COM };
340*8485SPeter.Memishian@Sun.COM 
341*8485SPeter.Memishian@Sun.COM DDI_DEFINE_STREAM_OPS(ds_ops, nulldev, nulldev, ds_attach, ds_detach,
342*8485SPeter.Memishian@Sun.COM     nodev, ds_devinfo, D_MP|D_MTPERMOD, &ds_info, ddi_quiesce_not_supported);
343*8485SPeter.Memishian@Sun.COM 
344*8485SPeter.Memishian@Sun.COM static struct modldrv modldrv = {
345*8485SPeter.Memishian@Sun.COM 	&mod_driverops,
346*8485SPeter.Memishian@Sun.COM 	"DLPI stub driver",
347*8485SPeter.Memishian@Sun.COM 	&ds_ops,
348*8485SPeter.Memishian@Sun.COM };
349*8485SPeter.Memishian@Sun.COM 
350*8485SPeter.Memishian@Sun.COM static struct modlinkage modlinkage = {
351*8485SPeter.Memishian@Sun.COM 	MODREV_1, &modldrv, NULL
352*8485SPeter.Memishian@Sun.COM };
353*8485SPeter.Memishian@Sun.COM 
354*8485SPeter.Memishian@Sun.COM int
_init(void)355*8485SPeter.Memishian@Sun.COM _init(void)
356*8485SPeter.Memishian@Sun.COM {
357*8485SPeter.Memishian@Sun.COM 	return (mod_install(&modlinkage));
358*8485SPeter.Memishian@Sun.COM }
359*8485SPeter.Memishian@Sun.COM 
360*8485SPeter.Memishian@Sun.COM int
_fini(void)361*8485SPeter.Memishian@Sun.COM _fini(void)
362*8485SPeter.Memishian@Sun.COM {
363*8485SPeter.Memishian@Sun.COM 	return (mod_remove(&modlinkage));
364*8485SPeter.Memishian@Sun.COM }
365*8485SPeter.Memishian@Sun.COM 
366*8485SPeter.Memishian@Sun.COM int
_info(struct modinfo * modinfop)367*8485SPeter.Memishian@Sun.COM _info(struct modinfo *modinfop)
368*8485SPeter.Memishian@Sun.COM {
369*8485SPeter.Memishian@Sun.COM 	return (mod_info(&modlinkage, modinfop));
370*8485SPeter.Memishian@Sun.COM }
371