summaryrefslogtreecommitdiffstats
path: root/usr.sbin/i4b/isdnd/controller.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/i4b/isdnd/controller.c')
-rw-r--r--usr.sbin/i4b/isdnd/controller.c539
1 files changed, 0 insertions, 539 deletions
diff --git a/usr.sbin/i4b/isdnd/controller.c b/usr.sbin/i4b/isdnd/controller.c
deleted file mode 100644
index bdaa3c4..0000000
--- a/usr.sbin/i4b/isdnd/controller.c
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
- * Copyright (c) 1997, 2001 Hellmuth Michaelis. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *---------------------------------------------------------------------------
- *
- * i4b daemon - controller state support routines
- * ----------------------------------------------
- *
- * $FreeBSD$
- *
- * last edit-date: [Sat May 13 13:24:05 2006]
- *
- *---------------------------------------------------------------------------*/
-
-#include <sys/types.h>
-#include <sys/mman.h>
-
-#include "isdnd.h"
-
-static int
-init_controller_state(int controller, int ctrl_type, int card_type, int tei, int nbch);
-
-/*---------------------------------------------------------------------------*
- * get name of a controller
- *---------------------------------------------------------------------------*/
-const char *
-name_of_controller(int ctrl_type, int card_type)
-{
- static char *passive_card[] = {
- "Teles S0/8",
- "Teles S0/16",
- "Teles S0/16.3",
- "AVM A1 or Fritz!Card",
- "Teles S0/16.3 PnP",
- "Creatix S0 PnP",
- "USRobotics Sportster ISDN TA",
- "Dr. Neuhaus NICCY Go@",
- "Sedlbauer win speed",
- "Dynalink IS64PH",
- "ISDN Master, MasterII or Blaster",
- "AVM PCMCIA Fritz!Card",
- "ELSA QuickStep 1000pro/ISA",
- "ELSA QuickStep 1000pro/PCI",
- "Siemens I-Talk",
- "ELSA MicroLink ISDN/MC",
- "ELSA MicroLink MCall",
- "ITK ix1 micro",
- "AVM Fritz!Card PCI",
- "ELSA PCC-16",
- "AVM Fritz!Card PnP",
- "Siemens I-Surf 2.0 PnP",
- "Asuscom ISDNlink 128K PnP",
- "ASUSCOM P-IN100-ST-D (Winbond W6692)",
- "Teles S0/16.3c PnP",
- "AcerISDN P10 PnP",
- "TELEINT ISDN SPEED No. 1",
- "Cologne Chip HFC-S PCI based",
- "Traverse Tech NETjet-S / Teles PCI-TJ",
- "Eicon.Diehl DIVA 2.0 / 2.02 ISA PnP",
- "Compaq Microcom 610",
- "AVM Fritz!Card PCI Version 2",
- };
-
- static char *daic_card[] = {
- "EICON.Diehl S",
- "EICON.Diehl SX/SXn",
- "EICON.Diehl SCOM",
- "EICON.Diehl QUADRO",
- };
-
- static char *capi_card[] = {
- "AVM T1 PCI",
- "AVM B1 PCI",
- "AVM B1 ISA",
- };
-
- static char *capimgr_card[] = {
- "CAPI manager driven board"
- };
-
- if(ctrl_type == CTRL_PASSIVE)
- {
- int index = card_type - CARD_TYPEP_8;
- if (index >= 0 && index < (sizeof passive_card / sizeof passive_card[0]))
- return passive_card[index];
- }
- else if(ctrl_type == CTRL_DAIC)
- {
- int index = card_type - CARD_TYPEA_DAIC_S;
- if (index >= 0 && index < (sizeof daic_card / sizeof daic_card[0] ))
- return daic_card[index];
- }
- else if(ctrl_type == CTRL_TINADD)
- {
- return "Stollmann tina-dd";
- }
- else if(ctrl_type == CTRL_CAPI)
- {
- int index = card_type - CARD_TYPEC_AVM_T1_PCI;
- if (index >= 0 && index < (sizeof capi_card / sizeof capi_card[0] ))
- return capi_card[index];
- }
- else if(ctrl_type == CTRL_CAPIMGR)
- {
- return capimgr_card[0];
- }
-
- return "unknown card type";
-}
-
-/*---------------------------------------------------------------------------*
- * init controller state array
- *---------------------------------------------------------------------------*/
-void
-init_controller(void)
-{
- int i;
- int max = 1;
- msg_ctrl_info_req_t mcir;
-
- for(i=0; i < max; i++)
- {
- mcir.controller = i;
-
- if((ioctl(isdnfd, I4B_CTRL_INFO_REQ, &mcir)) < 0)
- {
- llog(LL_ERR, "init_controller: ioctl I4B_CTRL_INFO_REQ failed: %s", strerror(errno));
- do_exit(1);
- }
-
- if((ncontroller = max = mcir.ncontroller) == 0)
- {
- llog(LL_ERR, "init_controller: no ISDN controller found!");
- do_exit(1);
- }
-
- if(mcir.ctrl_type == -1 || mcir.card_type == -1)
- {
- llog(LL_ERR, "init_controller: ctrl/card is invalid!");
- do_exit(1);
- }
-
- /* init controller tab */
-
- if((init_controller_state(i, mcir.ctrl_type, mcir.card_type, mcir.tei, mcir.nbch)) == ERROR)
- {
- llog(LL_ERR, "init_controller: init_controller_state for controller %d failed", i);
- do_exit(1);
- }
- }
- DBGL(DL_RCCF, (llog(LL_DBG, "init_controller: found %d ISDN controller(s)", max)));
-}
-
-/*--------------------------------------------------------------------------*
- * init controller state table entry
- *--------------------------------------------------------------------------*/
-static int
-init_controller_state(int controller, int ctrl_type, int card_type, int tei,
- int nbch)
-{
- int i;
-
- if((controller < 0) || (controller >= ncontroller))
- {
- llog(LL_ERR, "init_controller_state: invalid controller number [%d]!", controller);
- return(ERROR);
- }
-
- /* init controller tab */
-
- switch (ctrl_type) {
- case CTRL_PASSIVE:
- if((card_type > CARD_TYPEP_UNK) &&
- (card_type <= CARD_TYPEP_MAX))
- {
- isdn_ctrl_tab[controller].ctrl_type = ctrl_type;
- isdn_ctrl_tab[controller].card_type = card_type;
- isdn_ctrl_tab[controller].state = CTRL_UP;
- }
- else
- {
- llog(LL_ERR, "init_controller_state: unknown card type %d", card_type);
- return(ERROR);
- }
- break;
-
- case CTRL_DAIC:
- isdn_ctrl_tab[controller].ctrl_type = ctrl_type;
- isdn_ctrl_tab[controller].card_type = card_type;
- isdn_ctrl_tab[controller].state = CTRL_DOWN;
- break;
-
- case CTRL_TINADD:
- isdn_ctrl_tab[controller].ctrl_type = ctrl_type;
- isdn_ctrl_tab[controller].card_type = 0;
- isdn_ctrl_tab[controller].state = CTRL_DOWN;
- break;
-
- case CTRL_CAPI:
- isdn_ctrl_tab[controller].ctrl_type = ctrl_type;
- isdn_ctrl_tab[controller].card_type = card_type;
- isdn_ctrl_tab[controller].state = CTRL_UP;
- break;
-
- case CTRL_CAPIMGR:
- isdn_ctrl_tab[controller].ctrl_type = ctrl_type;
- isdn_ctrl_tab[controller].card_type = card_type;
- isdn_ctrl_tab[controller].state = CTRL_UP;
- break;
-
- default:
- llog(LL_ERR, "init_controller_state: unknown controller type %d", ctrl_type);
- return(ERROR);
- }
-
- isdn_ctrl_tab[controller].nbch = nbch;
- isdn_ctrl_tab[controller].freechans = nbch;
- for (i = 0; i < nbch; i++)
- isdn_ctrl_tab[controller].stateb[i] = CHAN_IDLE;
- isdn_ctrl_tab[controller].tei = tei;
- isdn_ctrl_tab[controller].l1stat = LAYER_IDLE;
- isdn_ctrl_tab[controller].l2stat = LAYER_IDLE;
-
- llog(LL_DMN, "init_controller_state: controller %d is %s",
- controller,
- name_of_controller(isdn_ctrl_tab[controller].ctrl_type,
- isdn_ctrl_tab[controller].card_type));
-
- return(GOOD);
-}
-
-/*--------------------------------------------------------------------------*
- * init active or capi controller
- *--------------------------------------------------------------------------*/
-void
-init_active_controller(void)
-{
- int ret;
- int unit = 0;
- int controller;
- char cmdbuf[MAXPATHLEN+128];
-
- for(controller = 0; controller < ncontroller; controller++)
- {
- if(isdn_ctrl_tab[controller].ctrl_type == CTRL_TINADD)
- {
- DBGL(DL_RCCF, (llog(LL_DBG, "init_active_controller, tina-dd %d: executing [%s %d]", unit, tinainitprog, unit)));
-
- snprintf(cmdbuf, sizeof(cmdbuf), "%s %d", tinainitprog, unit);
-
- if((ret = system(cmdbuf)) != 0)
- {
- llog(LL_ERR, "init_active_controller, tina-dd %d: %s returned %d!", unit, tinainitprog, ret);
- do_exit(1);
- }
- }
-
- /*
- * Generic microcode loading. If a controller has
- * defined a microcode file, load it using the
- * I4B_CTRL_DOWNLOAD ioctl.
- */
-
- if(isdn_ctrl_tab[controller].firmware != NULL)
- {
- int fd, ret;
- struct isdn_dr_prot idp;
- struct isdn_download_request idr;
-
- fd = open(isdn_ctrl_tab[controller].firmware, O_RDONLY);
- if (fd < 0) {
- llog(LL_ERR, "init_active_controller %d: open %s: %s!",
- controller, isdn_ctrl_tab[controller].firmware,
- strerror(errno));
- do_exit(1);
- }
-
- idp.bytecount = lseek(fd, 0, SEEK_END);
- idp.microcode = mmap(0, idp.bytecount, PROT_READ,
- MAP_SHARED, fd, 0);
- if (idp.microcode == MAP_FAILED) {
- llog(LL_ERR, "init_active_controller %d: mmap %s: %s!",
- controller, isdn_ctrl_tab[controller].firmware,
- strerror(errno));
- do_exit(1);
- }
-
- DBGL(DL_RCCF, (llog(LL_DBG, "init_active_controller %d: loading firmware from [%s]", controller, isdn_ctrl_tab[controller].firmware)));
-
- idr.controller = controller;
- idr.numprotos = 1;
- idr.protocols = &idp;
-
- ret = ioctl(isdnfd, I4B_CTRL_DOWNLOAD, &idr, sizeof(idr));
- if (ret) {
- llog(LL_ERR, "init_active_controller %d: load %s: %s!",
- controller, isdn_ctrl_tab[controller].firmware,
- strerror(errno));
- do_exit(1);
- }
-
- munmap(idp.microcode, idp.bytecount);
- close(fd);
- }
- }
-}
-
-/*--------------------------------------------------------------------------*
- * init controller D-channel ISDN protocol
- *--------------------------------------------------------------------------*/
-void
-init_controller_protocol(void)
-{
- int controller;
- msg_prot_ind_t mpi;
-
- for(controller = 0; controller < ncontroller; controller++)
- {
- mpi.controller = controller;
- mpi.protocol = isdn_ctrl_tab[controller].protocol;
-
- if((ioctl(isdnfd, I4B_PROT_IND, &mpi)) < 0)
- {
- llog(LL_ERR, "init_controller_protocol: ioctl I4B_PROT_IND failed: %s", strerror(errno));
- do_exit(1);
- }
- }
-}
-
-/*--------------------------------------------------------------------------*
- * set controller state to UP/DOWN
- *--------------------------------------------------------------------------*/
-int
-set_controller_state(int controller, int state)
-{
- if((controller < 0) || (controller >= ncontroller))
- {
- llog(LL_ERR, "set_controller_state: invalid controller number [%d]!", controller);
- return(ERROR);
- }
-
- if(state == CTRL_UP)
- {
- isdn_ctrl_tab[controller].state = CTRL_UP;
- DBGL(DL_CNST, (llog(LL_DBG, "set_controller_state: controller [%d] set UP!", controller)));
- }
- else if (state == CTRL_DOWN)
- {
- isdn_ctrl_tab[controller].state = CTRL_DOWN;
- DBGL(DL_CNST, (llog(LL_DBG, "set_controller_state: controller [%d] set DOWN!", controller)));
- }
- else
- {
- llog(LL_ERR, "set_controller_state: invalid controller state [%d]!", state);
- return(ERROR);
- }
- return(GOOD);
-}
-
-/*--------------------------------------------------------------------------*
- * get controller state
- *--------------------------------------------------------------------------*/
-int
-get_controller_state(int controller)
-{
- if((controller < 0) || (controller >= ncontroller))
- {
- llog(LL_ERR, "set_controller_state: invalid controller number [%d]!", controller);
- return(ERROR);
- }
- return(isdn_ctrl_tab[controller].state);
-}
-
-/*--------------------------------------------------------------------------*
- * decrement number of free channels for controller
- *--------------------------------------------------------------------------*/
-int
-decr_free_channels(int controller)
-{
- if((controller < 0) || (controller >= ncontroller))
- {
- llog(LL_ERR, "decr_free_channels: invalid controller number [%d]!", controller);
- return(ERROR);
- }
- if(isdn_ctrl_tab[controller].freechans > 0)
- {
- (isdn_ctrl_tab[controller].freechans)--;
- DBGL(DL_CNST, (llog(LL_DBG, "decr_free_channels: ctrl %d, now %d chan free", controller, isdn_ctrl_tab[controller].freechans)));
- return(GOOD);
- }
- else
- {
- llog(LL_ERR, "decr_free_channels: controller [%d] already 0 free chans!", controller);
- return(ERROR);
- }
-}
-
-/*--------------------------------------------------------------------------*
- * increment number of free channels for controller
- *--------------------------------------------------------------------------*/
-int
-incr_free_channels(int controller)
-{
- if((controller < 0) || (controller >= ncontroller))
- {
- llog(LL_ERR, "incr_free_channels: invalid controller number [%d]!", controller);
- return(ERROR);
- }
- if(isdn_ctrl_tab[controller].freechans < isdn_ctrl_tab[controller].nbch)
- {
- (isdn_ctrl_tab[controller].freechans)++;
- DBGL(DL_CNST, (llog(LL_DBG, "incr_free_channels: ctrl %d, now %d chan free", controller, isdn_ctrl_tab[controller].freechans)));
- return(GOOD);
- }
- else
- {
- llog(LL_ERR, "incr_free_channels: controller [%d] already %d free chans!", controller, isdn_ctrl_tab[controller].nbch);
- return(ERROR);
- }
-}
-
-/*--------------------------------------------------------------------------*
- * get number of free channels for controller
- *--------------------------------------------------------------------------*/
-int
-get_free_channels(int controller)
-{
- if((controller < 0) || (controller >= ncontroller))
- {
- llog(LL_ERR, "get_free_channels: invalid controller number [%d]!", controller);
- return(ERROR);
- }
- DBGL(DL_CNST, (llog(LL_DBG, "get_free_channels: ctrl %d, %d chan free", controller, isdn_ctrl_tab[controller].freechans)));
- return(isdn_ctrl_tab[controller].freechans);
-}
-
-/*--------------------------------------------------------------------------*
- * set channel state to busy
- *--------------------------------------------------------------------------*/
-int
-set_channel_busy(int controller, int channel)
-{
- if((controller < 0) || (controller >= ncontroller))
- {
- llog(LL_ERR, "set_channel_busy: invalid controller number [%d]!", controller);
- return(ERROR);
- }
-
- if ((channel < 0) || (channel >= isdn_ctrl_tab[controller].nbch))
- {
- llog(LL_ERR, "set_channel_busy: controller [%d] invalid channel [%d]!", controller, channel);
- return(ERROR);
- }
-
- if(isdn_ctrl_tab[controller].stateb[channel] == CHAN_RUN)
- {
- DBGL(DL_CNST, (llog(LL_DBG, "set_channel_busy: controller [%d] channel B%d already busy!", controller, channel+1)));
- }
- else
- {
- isdn_ctrl_tab[controller].stateb[channel] = CHAN_RUN;
- DBGL(DL_CNST, (llog(LL_DBG, "set_channel_busy: controller [%d] channel B%d set to BUSY!", controller, channel+1)));
- }
- return(GOOD);
-}
-
-/*--------------------------------------------------------------------------*
- * set channel state to idle
- *--------------------------------------------------------------------------*/
-int
-set_channel_idle(int controller, int channel)
-{
- if((controller < 0) || (controller >= ncontroller))
- {
- llog(LL_ERR, "set_channel_idle: invalid controller number [%d]!", controller);
- return(ERROR);
- }
-
- if ((channel < 0) || (channel >= isdn_ctrl_tab[controller].nbch))
- {
- llog(LL_ERR, "set_channel_busy: controller [%d] invalid channel [%d]!", controller, channel);
- return(ERROR);
- }
-
- if (isdn_ctrl_tab[controller].stateb[channel] == CHAN_IDLE)
- {
- DBGL(DL_CNST, (llog(LL_DBG, "set_channel_idle: controller [%d] channel B%d already idle!", controller, channel+1)));
- }
- else
- {
- isdn_ctrl_tab[controller].stateb[channel] = CHAN_IDLE;
- DBGL(DL_CNST, (llog(LL_DBG, "set_channel_idle: controller [%d] channel B%d set to IDLE!", controller, channel+1)));
- }
- return(GOOD);
-}
-
-/*--------------------------------------------------------------------------*
- * return channel state
- *--------------------------------------------------------------------------*/
-int
-ret_channel_state(int controller, int channel)
-{
- if((controller < 0) || (controller >= ncontroller))
- {
- llog(LL_ERR, "ret_channel_state: invalid controller number [%d]!", controller);
- return(ERROR);
- }
-
- if ((channel < 0) || (channel >= isdn_ctrl_tab[controller].nbch))
- {
- llog(LL_ERR, "set_channel_busy: controller [%d] invalid channel [%d]!", controller, channel);
- return(ERROR);
- }
-
- return(isdn_ctrl_tab[controller].stateb[channel]);
-}
-
-/* EOF */
OpenPOWER on IntegriCloud