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