2 * Copyright (c) 1997, 2001 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 daemon - controller state support routines
28 * ----------------------------------------------
30 * $FreeBSD: src/usr.sbin/i4b/isdnd/controller.c,v 1.6.2.4 2002/04/25 12:30:06 gj Exp $
31 * $DragonFly: src/usr.sbin/i4b/isdnd/controller.c,v 1.2 2003/06/17 04:29:54 dillon Exp $
33 * last edit-date: [Mon Dec 10 11:32:05 2001]
35 *---------------------------------------------------------------------------*/
37 #include <sys/types.h>
43 init_controller_state(int controller
, int ctrl_type
, int card_type
, int tei
, int nbch
);
45 /*---------------------------------------------------------------------------*
46 * get name of a controller
47 *---------------------------------------------------------------------------*/
49 name_of_controller(int ctrl_type
, int card_type
)
51 static char *passive_card
[] = {
55 "AVM A1 or Fritz!Card",
58 "USRobotics Sportster ISDN TA",
59 "Dr. Neuhaus NICCY Go@",
60 "Sedlbauer win speed",
62 "ISDN Master, MasterII or Blaster",
63 "AVM PCMCIA Fritz!Card",
64 "ELSA QuickStep 1000pro/ISA",
65 "ELSA QuickStep 1000pro/PCI",
67 "ELSA MicroLink ISDN/MC",
68 "ELSA MicroLink MCall",
73 "Siemens I-Surf 2.0 PnP",
74 "Asuscom ISDNlink 128K PnP",
75 "ASUSCOM P-IN100-ST-D (Winbond W6692)",
78 "TELEINT ISDN SPEED No. 1",
79 "Cologne Chip HFC-S PCI based",
80 "Traverse Tech NETjet-S / Teles PCI-TJ",
81 "Eicon.Diehl DIVA 2.0 / 2.02 ISA PnP",
82 "Compaq Microcom 610",
83 "AVM Fritz!Card PCI Version 2",
86 static char *daic_card
[] = {
93 static char *capi_card
[] = {
99 if(ctrl_type
== CTRL_PASSIVE
)
101 int index
= card_type
- CARD_TYPEP_8
;
102 if (index
>= 0 && index
< (sizeof passive_card
/ sizeof passive_card
[0]))
103 return passive_card
[index
];
105 else if(ctrl_type
== CTRL_DAIC
)
107 int index
= card_type
- CARD_TYPEA_DAIC_S
;
108 if (index
>= 0 && index
< (sizeof daic_card
/ sizeof daic_card
[0] ))
109 return daic_card
[index
];
111 else if(ctrl_type
== CTRL_TINADD
)
113 return "Stollmann tina-dd";
115 else if(ctrl_type
== CTRL_CAPI
)
117 int index
= card_type
- CARD_TYPEC_AVM_T1_PCI
;
118 if (index
>= 0 && index
< (sizeof capi_card
/ sizeof capi_card
[0] ))
119 return capi_card
[index
];
122 return "unknown card type";
125 /*---------------------------------------------------------------------------*
126 * init controller state array
127 *---------------------------------------------------------------------------*/
129 init_controller(void)
133 msg_ctrl_info_req_t mcir
;
135 for(i
=0; i
< max
; i
++)
139 if((ioctl(isdnfd
, I4B_CTRL_INFO_REQ
, &mcir
)) < 0)
141 log(LL_ERR
, "init_controller: ioctl I4B_CTRL_INFO_REQ failed: %s", strerror(errno
));
145 if((ncontroller
= max
= mcir
.ncontroller
) == 0)
147 log(LL_ERR
, "init_controller: no ISDN controller found!");
151 if(mcir
.ctrl_type
== -1 || mcir
.card_type
== -1)
153 log(LL_ERR
, "init_controller: ctrl/card is invalid!");
157 /* init controller tab */
159 if((init_controller_state(i
, mcir
.ctrl_type
, mcir
.card_type
, mcir
.tei
, mcir
.nbch
)) == ERROR
)
161 log(LL_ERR
, "init_controller: init_controller_state for controller %d failed", i
);
165 DBGL(DL_RCCF
, (log(LL_DBG
, "init_controller: found %d ISDN controller(s)", max
)));
168 /*--------------------------------------------------------------------------*
169 * init controller state table entry
170 *--------------------------------------------------------------------------*/
172 init_controller_state(int controller
, int ctrl_type
, int card_type
, int tei
,
177 if((controller
< 0) || (controller
>= ncontroller
))
179 log(LL_ERR
, "init_controller_state: invalid controller number [%d]!", controller
);
183 /* init controller tab */
187 if((card_type
> CARD_TYPEP_UNK
) &&
188 (card_type
<= CARD_TYPEP_MAX
))
190 isdn_ctrl_tab
[controller
].ctrl_type
= ctrl_type
;
191 isdn_ctrl_tab
[controller
].card_type
= card_type
;
192 isdn_ctrl_tab
[controller
].state
= CTRL_UP
;
196 log(LL_ERR
, "init_controller_state: unknown card type %d", card_type
);
202 isdn_ctrl_tab
[controller
].ctrl_type
= ctrl_type
;
203 isdn_ctrl_tab
[controller
].card_type
= card_type
;
204 isdn_ctrl_tab
[controller
].state
= CTRL_DOWN
;
208 isdn_ctrl_tab
[controller
].ctrl_type
= ctrl_type
;
209 isdn_ctrl_tab
[controller
].card_type
= 0;
210 isdn_ctrl_tab
[controller
].state
= CTRL_DOWN
;
214 isdn_ctrl_tab
[controller
].ctrl_type
= ctrl_type
;
215 isdn_ctrl_tab
[controller
].card_type
= card_type
;
216 isdn_ctrl_tab
[controller
].state
= CTRL_UP
;
220 log(LL_ERR
, "init_controller_state: unknown controller type %d", ctrl_type
);
224 isdn_ctrl_tab
[controller
].nbch
= nbch
;
225 isdn_ctrl_tab
[controller
].freechans
= nbch
;
226 for (i
= 0; i
< nbch
; i
++)
227 isdn_ctrl_tab
[controller
].stateb
[i
] = CHAN_IDLE
;
228 isdn_ctrl_tab
[controller
].tei
= tei
;
229 isdn_ctrl_tab
[controller
].l1stat
= LAYER_IDLE
;
230 isdn_ctrl_tab
[controller
].l2stat
= LAYER_IDLE
;
232 log(LL_DMN
, "init_controller_state: controller %d is %s",
234 name_of_controller(isdn_ctrl_tab
[controller
].ctrl_type
,
235 isdn_ctrl_tab
[controller
].card_type
));
240 /*--------------------------------------------------------------------------*
241 * init active or capi controller
242 *--------------------------------------------------------------------------*/
244 init_active_controller(void)
249 char cmdbuf
[MAXPATHLEN
+128];
251 for(controller
= 0; controller
< ncontroller
; controller
++)
253 if(isdn_ctrl_tab
[controller
].ctrl_type
== CTRL_TINADD
)
255 DBGL(DL_RCCF
, (log(LL_DBG
, "init_active_controller, tina-dd %d: executing [%s %d]", unit
, tinainitprog
, unit
)));
257 snprintf(cmdbuf
, sizeof(cmdbuf
), "%s %d", tinainitprog
, unit
);
259 if((ret
= system(cmdbuf
)) != 0)
261 log(LL_ERR
, "init_active_controller, tina-dd %d: %s returned %d!", unit
, tinainitprog
, ret
);
267 * Generic microcode loading. If a controller has
268 * defined a microcode file, load it using the
269 * I4B_CTRL_DOWNLOAD ioctl.
272 if(isdn_ctrl_tab
[controller
].firmware
!= NULL
)
275 struct isdn_dr_prot idp
;
276 struct isdn_download_request idr
;
278 fd
= open(isdn_ctrl_tab
[controller
].firmware
, O_RDONLY
);
280 log(LL_ERR
, "init_active_controller %d: open %s: %s!",
281 controller
, isdn_ctrl_tab
[controller
].firmware
,
286 idp
.bytecount
= lseek(fd
, 0, SEEK_END
);
287 idp
.microcode
= mmap(0, idp
.bytecount
, PROT_READ
,
289 if (idp
.microcode
== MAP_FAILED
) {
290 log(LL_ERR
, "init_active_controller %d: mmap %s: %s!",
291 controller
, isdn_ctrl_tab
[controller
].firmware
,
296 DBGL(DL_RCCF
, (log(LL_DBG
, "init_active_controller %d: loading firmware from [%s]", controller
, isdn_ctrl_tab
[controller
].firmware
)));
298 idr
.controller
= controller
;
300 idr
.protocols
= &idp
;
302 ret
= ioctl(isdnfd
, I4B_CTRL_DOWNLOAD
, &idr
, sizeof(idr
));
304 log(LL_ERR
, "init_active_controller %d: load %s: %s!",
305 controller
, isdn_ctrl_tab
[controller
].firmware
,
310 munmap(idp
.microcode
, idp
.bytecount
);
316 /*--------------------------------------------------------------------------*
317 * init controller D-channel ISDN protocol
318 *--------------------------------------------------------------------------*/
320 init_controller_protocol(void)
325 for(controller
= 0; controller
< ncontroller
; controller
++)
327 mpi
.controller
= controller
;
328 mpi
.protocol
= isdn_ctrl_tab
[controller
].protocol
;
330 if((ioctl(isdnfd
, I4B_PROT_IND
, &mpi
)) < 0)
332 log(LL_ERR
, "init_controller_protocol: ioctl I4B_PROT_IND failed: %s", strerror(errno
));
338 /*--------------------------------------------------------------------------*
339 * set controller state to UP/DOWN
340 *--------------------------------------------------------------------------*/
342 set_controller_state(int controller
, int state
)
344 if((controller
< 0) || (controller
>= ncontroller
))
346 log(LL_ERR
, "set_controller_state: invalid controller number [%d]!", controller
);
352 isdn_ctrl_tab
[controller
].state
= CTRL_UP
;
353 DBGL(DL_CNST
, (log(LL_DBG
, "set_controller_state: controller [%d] set UP!", controller
)));
355 else if (state
== CTRL_DOWN
)
357 isdn_ctrl_tab
[controller
].state
= CTRL_DOWN
;
358 DBGL(DL_CNST
, (log(LL_DBG
, "set_controller_state: controller [%d] set DOWN!", controller
)));
362 log(LL_ERR
, "set_controller_state: invalid controller state [%d]!", state
);
368 /*--------------------------------------------------------------------------*
369 * get controller state
370 *--------------------------------------------------------------------------*/
372 get_controller_state(int controller
)
374 if((controller
< 0) || (controller
>= ncontroller
))
376 log(LL_ERR
, "set_controller_state: invalid controller number [%d]!", controller
);
379 return(isdn_ctrl_tab
[controller
].state
);
382 /*--------------------------------------------------------------------------*
383 * decrement number of free channels for controller
384 *--------------------------------------------------------------------------*/
386 decr_free_channels(int controller
)
388 if((controller
< 0) || (controller
>= ncontroller
))
390 log(LL_ERR
, "decr_free_channels: invalid controller number [%d]!", controller
);
393 if(isdn_ctrl_tab
[controller
].freechans
> 0)
395 (isdn_ctrl_tab
[controller
].freechans
)--;
396 DBGL(DL_CNST
, (log(LL_DBG
, "decr_free_channels: ctrl %d, now %d chan free", controller
, isdn_ctrl_tab
[controller
].freechans
)));
401 log(LL_ERR
, "decr_free_channels: controller [%d] already 0 free chans!", controller
);
406 /*--------------------------------------------------------------------------*
407 * increment number of free channels for controller
408 *--------------------------------------------------------------------------*/
410 incr_free_channels(int controller
)
412 if((controller
< 0) || (controller
>= ncontroller
))
414 log(LL_ERR
, "incr_free_channels: invalid controller number [%d]!", controller
);
417 if(isdn_ctrl_tab
[controller
].freechans
< isdn_ctrl_tab
[controller
].nbch
)
419 (isdn_ctrl_tab
[controller
].freechans
)++;
420 DBGL(DL_CNST
, (log(LL_DBG
, "incr_free_channels: ctrl %d, now %d chan free", controller
, isdn_ctrl_tab
[controller
].freechans
)));
425 log(LL_ERR
, "incr_free_channels: controller [%d] already %d free chans!", controller
, isdn_ctrl_tab
[controller
].nbch
);
430 /*--------------------------------------------------------------------------*
431 * get number of free channels for controller
432 *--------------------------------------------------------------------------*/
434 get_free_channels(int controller
)
436 if((controller
< 0) || (controller
>= ncontroller
))
438 log(LL_ERR
, "get_free_channels: invalid controller number [%d]!", controller
);
441 DBGL(DL_CNST
, (log(LL_DBG
, "get_free_channels: ctrl %d, %d chan free", controller
, isdn_ctrl_tab
[controller
].freechans
)));
442 return(isdn_ctrl_tab
[controller
].freechans
);
445 /*--------------------------------------------------------------------------*
446 * set channel state to busy
447 *--------------------------------------------------------------------------*/
449 set_channel_busy(int controller
, int channel
)
451 if((controller
< 0) || (controller
>= ncontroller
))
453 log(LL_ERR
, "set_channel_busy: invalid controller number [%d]!", controller
);
457 if ((channel
< 0) || (channel
>= isdn_ctrl_tab
[controller
].nbch
))
459 log(LL_ERR
, "set_channel_busy: controller [%d] invalid channel [%d]!", controller
, channel
);
463 if(isdn_ctrl_tab
[controller
].stateb
[channel
] == CHAN_RUN
)
465 DBGL(DL_CNST
, (log(LL_DBG
, "set_channel_busy: controller [%d] channel B%d already busy!", controller
, channel
+1)));
469 isdn_ctrl_tab
[controller
].stateb
[channel
] = CHAN_RUN
;
470 DBGL(DL_CNST
, (log(LL_DBG
, "set_channel_busy: controller [%d] channel B%d set to BUSY!", controller
, channel
+1)));
475 /*--------------------------------------------------------------------------*
476 * set channel state to idle
477 *--------------------------------------------------------------------------*/
479 set_channel_idle(int controller
, int channel
)
481 if((controller
< 0) || (controller
>= ncontroller
))
483 log(LL_ERR
, "set_channel_idle: invalid controller number [%d]!", controller
);
487 if ((channel
< 0) || (channel
>= isdn_ctrl_tab
[controller
].nbch
))
489 log(LL_ERR
, "set_channel_busy: controller [%d] invalid channel [%d]!", controller
, channel
);
493 if (isdn_ctrl_tab
[controller
].stateb
[channel
] == CHAN_IDLE
)
495 DBGL(DL_CNST
, (log(LL_DBG
, "set_channel_idle: controller [%d] channel B%d already idle!", controller
, channel
+1)));
499 isdn_ctrl_tab
[controller
].stateb
[channel
] = CHAN_IDLE
;
500 DBGL(DL_CNST
, (log(LL_DBG
, "set_channel_idle: controller [%d] channel B%d set to IDLE!", controller
, channel
+1)));
505 /*--------------------------------------------------------------------------*
506 * return channel state
507 *--------------------------------------------------------------------------*/
509 ret_channel_state(int controller
, int channel
)
511 if((controller
< 0) || (controller
>= ncontroller
))
513 log(LL_ERR
, "ret_channel_state: invalid controller number [%d]!", controller
);
517 if ((channel
< 0) || (channel
>= isdn_ctrl_tab
[controller
].nbch
))
519 log(LL_ERR
, "set_channel_busy: controller [%d] invalid channel [%d]!", controller
, channel
);
523 return(isdn_ctrl_tab
[controller
].stateb
[channel
]);