2 * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 *---------------------------------------------------------------------------
27 * i4b_ctl.c - i4b system control port driver
28 * ------------------------------------------
30 * $Id: i4b_ctl.c,v 1.37 2000/05/31 08:04:43 hm Exp $
32 * $FreeBSD: src/sys/i4b/driver/i4b_ctl.c,v 1.10.2.3 2001/08/12 16:22:48 hm Exp $
33 * $DragonFly: src/sys/net/i4b/driver/i4b_ctl.c,v 1.10 2004/07/02 15:43:10 joerg Exp $
35 * last edit-date: [Sat Aug 11 18:06:38 2001]
37 *---------------------------------------------------------------------------*/
39 #include "use_i4bctl.h"
42 #error "only 1 (one) i4bctl device allowed!"
47 #include <sys/param.h>
49 #if defined(__DragonFly__) || (defined(__FreeBSD__) && __FreeBSD__ >= 3)
50 #include <sys/ioccom.h>
52 #include <sys/ioctl.h>
55 #include <sys/kernel.h>
56 #include <sys/systm.h>
58 #include <sys/socket.h>
61 #if defined(__DragonFly__) || defined(__FreeBSD__)
63 #if defined(__FreeBSD__) && __FreeBSD__ == 3
64 #include "opt_devfs.h"
68 #include <sys/devfsext.h>
71 #endif /* __FreeBSD__ */
73 #if defined(__DragonFly__) || defined(__FreeBSD__)
74 #include <net/i4b/include/machine/i4b_debug.h>
75 #include <net/i4b/include/machine/i4b_ioctl.h>
76 #elif defined(__bsdi__)
77 #include <i4b/i4b_debug.h>
78 #include <i4b/i4b_ioctl.h>
80 #include <machine/bus.h>
81 #include <sys/device.h>
82 #include <i4b/i4b_debug.h>
83 #include <i4b/i4b_ioctl.h>
86 #include "../include/i4b_global.h"
87 #include "../include/i4b_l3l4.h"
88 #include "../layer2/i4b_l2.h"
90 static int openflag = 0;
92 #if defined(__DragonFly__) || (BSD > 199306 && defined(__FreeBSD__))
93 static d_open_t i4bctlopen;
94 static d_close_t i4bctlclose;
95 static d_ioctl_t i4bctlioctl;
98 static d_poll_t i4bctlpoll;
99 #define POLLFIELD i4bctlpoll
101 #define POLLFIELD noselect
104 #define CDEV_MAJOR 55
106 #if defined(__DragonFly__) || (defined(__FreeBSD__) && __FreeBSD__ >= 4)
107 static struct cdevsw i4bctl_cdevsw = {
109 /* maj */ CDEV_MAJOR,
114 /* open */ i4bctlopen,
115 /* close */ i4bctlclose,
118 /* ioctl */ i4bctlioctl,
119 /* poll */ POLLFIELD,
121 /* strategy */ nostrategy,
126 static struct cdevsw i4bctl_cdevsw =
127 { i4bctlopen, i4bctlclose, noread, nowrite,
128 i4bctlioctl, nostop, nullreset, nodevtotty,
129 POLLFIELD, nommap, NULL, "i4bctl", NULL, -1 };
132 static void i4bctlattach(void *);
133 PSEUDO_SET(i4bctlattach, i4b_i4bctldrv);
135 #define PDEVSTATIC static
136 #endif /* __FreeBSD__ */
138 #if defined(__FreeBSD__) && __FreeBSD__ == 3
140 static void *devfs_token;
144 #if !defined(__DragonFly__) && !defined(__FreeBSD__)
145 #define PDEVSTATIC /* */
146 void i4bctlattach (void);
147 int i4bctlopen (dev_t dev, int flag, int fmt, struct proc *p);
148 int i4bctlclose (dev_t dev, int flag, int fmt, struct proc *p);
150 int i4bctlioctl (dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p);
152 int i4bctlioctl (dev_t dev, int cmd, caddr_t data, int flag, struct proc *p);
154 #endif /* !FreeBSD */
156 #if defined(__DragonFly__) || (BSD > 199306 && defined(__FreeBSD__))
157 /*---------------------------------------------------------------------------*
158 * initialization at kernel load time
159 *---------------------------------------------------------------------------*/
161 i4bctlinit(void *unused)
163 #if defined(__DragonFly__) || (defined(__FreeBSD__) && __FreeBSD__ >= 4)
164 cdevsw_add(&i4bctl_cdevsw, 0, 0);
166 dev_t dev = make_adhoc_dev(&i4bctl, 0);
167 cdevsw_add(&dev, &i4bctl_cdevsw, NULL);
171 SYSINIT(i4bctldev, SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR, &i4bctlinit, NULL);
173 #endif /* BSD > 199306 && defined(__FreeBSD__) */
176 int i4bctlmatch(struct device *parent, struct cfdata *cf, void *aux);
177 void dummy_i4bctlattach(struct device*, struct device *, void *);
179 #define CDEV_MAJOR 64
181 static struct cfdriver i4bctlcd =
182 { NULL, "i4bctl", i4bctlmatch, dummy_i4bctlattach, DV_DULL,
183 sizeof(struct cfdriver) };
184 struct devsw i4bctlsw =
186 i4bctlopen, i4bctlclose, noread, nowrite,
187 i4bctlioctl, seltrue, nommap, nostrat,
188 nodump, nopsize, 0, nostop
192 i4bctlmatch(struct device *parent, struct cfdata *cf, void *aux)
194 printf("i4bctlmatch: aux=0x%x\n", aux);
198 dummy_i4bctlattach(struct device *parent, struct device *self, void *aux)
200 printf("dummy_i4bctlattach: aux=0x%x\n", aux);
202 #endif /* __bsdi__ */
203 /*---------------------------------------------------------------------------*
204 * interface attach routine
205 *---------------------------------------------------------------------------*/
207 #if defined(__DragonFly__) || defined(__FreeBSD__)
208 i4bctlattach(void *dummy)
213 #ifndef HACK_NO_PSEUDO_ATTACH_MSG
214 printf("i4bctl: ISDN system control port attached\n");
217 #if defined(__FreeBSD__)
221 devfs_token = devfs_add_devswf(&i4bctl_cdevsw, 0, DV_CHR,
222 UID_ROOT, GID_WHEEL, 0600,
227 make_dev(&i4bctl_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "i4bctl");
232 /*---------------------------------------------------------------------------*
233 * i4bctlopen - device driver open routine
234 *---------------------------------------------------------------------------*/
236 i4bctlopen(dev_t dev, int flag, int fmt, struct thread *td)
249 /*---------------------------------------------------------------------------*
250 * i4bctlclose - device driver close routine
251 *---------------------------------------------------------------------------*/
253 i4bctlclose(dev_t dev, int flag, int fmt, struct thread *td)
259 /*---------------------------------------------------------------------------*
260 * i4bctlioctl - device driver ioctl routine
261 *---------------------------------------------------------------------------*/
263 #if defined(__DragonFly__) || (defined (__FreeBSD_version) && __FreeBSD_version >= 300003)
264 i4bctlioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td)
265 #elif defined(__bsdi__)
266 i4bctlioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
268 i4bctlioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
284 case I4B_CTL_GET_DEBUG:
285 cdbg = (ctl_debug_t *)data;
286 cdbg->l1 = i4b_l1_debug;
287 cdbg->l2 = i4b_l2_debug;
288 cdbg->l3 = i4b_l3_debug;
289 cdbg->l4 = i4b_l4_debug;
292 case I4B_CTL_SET_DEBUG:
293 cdbg = (ctl_debug_t *)data;
294 i4b_l1_debug = cdbg->l1;
295 i4b_l2_debug = cdbg->l2;
296 i4b_l3_debug = cdbg->l3;
297 i4b_l4_debug = cdbg->l4;
300 case I4B_CTL_GET_CHIPSTAT:
302 struct chipstat *cst;
303 cst = (struct chipstat *)data;
304 (*ctrl_desc[cst->driver_unit].N_MGMT_COMMAND)(cst->driver_unit, CMR_GCST, cst);
308 case I4B_CTL_CLR_CHIPSTAT:
310 struct chipstat *cst;
311 cst = (struct chipstat *)data;
312 (*ctrl_desc[cst->driver_unit].N_MGMT_COMMAND)(cst->driver_unit, CMR_CCST, cst);
316 case I4B_CTL_GET_LAPDSTAT:
320 l2s = (l2stat_t *)data;
322 if( l2s->unit < 0 || l2s->unit > MAXL1UNITS)
328 sc = &l2_softc[l2s->unit];
330 bcopy(&sc->stat, &l2s->lapdstat, sizeof(lapdstat_t));
334 case I4B_CTL_CLR_LAPDSTAT:
340 if( *up < 0 || *up > MAXL1UNITS)
348 bzero(&sc->stat, sizeof(lapdstat_t));
357 #endif /* DO_I4B_DEBUG */
360 #if (defined(__DragonFly__) || defined(__FreeBSD__)) && defined(OS_USES_POLL)
362 /*---------------------------------------------------------------------------*
363 * i4bctlpoll - device driver poll routine
364 *---------------------------------------------------------------------------*/
366 i4bctlpoll (dev_t dev, int events, struct thread *td)
373 #endif /* NI4BCTL > 0 */