diff --git a/Makefile b/Makefile index e292282..f28fee0 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,7 @@ all: install: all cd $(LINUX) ; make SUBDIRS=$(MISDN_SRC) modules_install cp $(MISDNDIR)/include/linux/*.h $(INSTALL_PREFIX)/usr/include/linux/ + install -m755 misdn-init /etc/init.d/ depmod .PHONY: install all clean diff --git a/README.misdn-init b/README.misdn-init new file mode 100644 index 0000000..a59f8df --- /dev/null +++ b/README.misdn-init @@ -0,0 +1,55 @@ +misdn-init: init-script to auto-configure and load the mISDN kernel drivers +=========================================================================== + +This script makes it easy to configure and activate mISDN compatible +adapter cards. It scans an eyecandy config file named misdn-init.conf +for your card and port settings, then it loads the driver modules properly. +The misdn-init.conf can also be autogenerated by the misdn-init script. + +--------------------------------------------------------------------------- +Usage: /etc/init.d/misdn-init start|stop|restart|config|scan|help + + --start scan /etc/misdn-init.conf and load the mISDN drivers + --stop unload the mISDN drivers + --restart see stop, then start + --config scan your PCI bus for mISDN compatible hardware and generate + a /etc/misdn-init.conf + --scan scan your PCI bus for mISDN compatible hardware and print + the results to the console + --help print the usage info +--------------------------------------------------------------------------- + + +* Here is a quick overview on how to use misdn-init: + +1) Get and install misdn-init: + $ wget http://www.beronet.com/downloads/chan_misdn/stable/chan_misdn.tar.gz + $ tar zxf chan_misdn.tar.gz + $ (as root) cp chan_misdn/misdn-init /etc/init.d/misdn-init + +2) Let misdn-init scan your PCI bus for mISDN compatible hardware and write + the results into /etc/misdn-init.conf: + $ (as root) /etc/init.d/misdn-init config + +3) (optional) Edit /etc/misdn-init.conf and set everything the way you want it. + This file is heavily commented, hence it should be self-explaining. + +4) (optional, but recommended) Add misdn-init to your run level. + This is distribution dependend. Here an example for a debian system: + ATTENTION: If you have services in your runlevels that depend + on mISDN, make sure that misdn-init starts before, and + stops after them (this is done by changing the values + that are set to 60 in this example, more info: read the + manpage for update-rc.d). + $ (as root) update-rc.d misdn-init start 60 2 3 4 5 . stop 60 0 1 6 . + +5) Run the following to start mISDN: + $ (as root) /etc/init.d/misdn-init start + + + +--------------------------------------------------------------------------- +* Report Bugs: +If you experience any bugs or have a feature request, please visit: +www.isdn4linux.de/mantis + diff --git a/drivers/isdn/hardware/mISDN/dsp_cancel.c b/drivers/isdn/hardware/mISDN/dsp_cancel.c index 38f7f19..238976b 100644 --- a/drivers/isdn/hardware/mISDN/dsp_cancel.c +++ b/drivers/isdn/hardware/mISDN/dsp_cancel.c @@ -13,6 +13,7 @@ #include "helper.h" #include "debug.h" #include "dsp.h" +#include /* @@ -36,7 +37,13 @@ dsp_cancel_tx(dsp_t *dsp, u8 *data, int len) memcpy(&dsp->txbuf[dsp->txbuflen],data,len); dsp->txbuflen+=len; } else { - printk("ECHOCAN: TXBUF Overflow len:%d newlen:%d\n",dsp->txbuflen,len); + static int i=0; + if(i==4000) { + printk("ECHOCAN: i:%d TXBUF Overflow txbuflen:%d txcancellen:%d\n", i, dsp->txbuflen,len); + i=0; + } + i+=len; + dsp->txbuflen=0; } @@ -54,8 +61,10 @@ dsp_cancel_rx(dsp_t *dsp, u8 *data, int len) int delta=dsp->txbuflen-len; memcpy(tmp,&dsp->txbuf[len],delta); - + + kernel_fpu_begin(); bchdev_echocancel_chunk(dsp, data, dsp->txbuf, len); + kernel_fpu_end(); memcpy(dsp->txbuf,tmp,delta); dsp->txbuflen=delta; @@ -63,7 +72,12 @@ dsp_cancel_rx(dsp_t *dsp, u8 *data, int len) //bchdev_echocancel_chunk(dsp, dsp->txbuf, data, len); } else { - printk("ECHOCAN: TXBUF Underrun len:%d newlen:%d\n",dsp->txbuflen,len); + static int i=0; + if(i==4000) { + printk("ECHOCAN: i:%d TXBUF Underrun txbuflen:%d rxcancellen:%d\n",i,dsp->txbuflen,len); + i=0; + } + i+=len; } } diff --git a/misdn-init b/misdn-init new file mode 100755 index 0000000..204a7a2 --- /dev/null +++ b/misdn-init @@ -0,0 +1,525 @@ +#!/bin/bash + +################################################################################ +# +# misdn-init init script +# +# Copyright (C) 2005, Nadi Sarrar +# +# Nadi Sarrar +# +# This program is free software, distributed under the terms of +# the GNU General Public License +# + +# +# USAGE: +# +# /etc/init.d/misdn-init start|stop|restart|config|scan|help +# + +# +# CONFIGURATION: +# +# Path to your misdn-init.conf: +# +misdn_init_conf="/etc/misdn-init.conf" +# +################################################################################ + + +MODPROBE=modprobe +RMMOD=rmmod +INSMOD=insmod +LSPCI=lspci +MKNOD=mknod + +# HFC 8/4 (S0) Options +master_clock=16 + +# HFC-E1 Options +optical=16 +los=18 +ais=19 +slip=20 + +# Card Settings +ulaw=8 +dtmf=9 +pcm_slave=11 + +function load_card_modules { + + IFS=$'\n' + + for line in $(sed -n -e '/^[^#]/p' ${misdn_init_conf}); + do + var=`echo "${line}" | sed -e "s/^\(.*\)=.*/\1/"` + val=`echo "${line}" | sed -e "s/^.*=\(.*\)/\1/"` + + case "${var}" in + card) + nr=`echo "${val}" | sed -e "s/^\([0-9]*\),.*/\1/"` + mod=`echo "${val}" | sed -e "s/^[^,]*,\([^,]*\).*/\1/"` + if [ ${#val} -gt $(echo "obase=10;${#nr}+${#mod}+1" | bc) ]; then + opns=`echo "${val}" | sed -e "s/^[^,]*,[^,]*,\(.*\)/\1/"` + else + opns="" + fi + case "${mod}" in + 0x*) + hfcmulti[${nr}]=$(echo ${mod} | sed -e "s/^0x\([0-9]*\)/\1/") + let "hfcports = ${hfcports} + ${hfcmulti[${nr}]}" + IFS=$',' + for li in ${opns}; do + hfcmulti[${nr}]=$(echo "obase=10;2^(${!li}-1)+${hfcmulti[${nr}]}" | bc) + done + IFS=$'\n' + ;; + *) + other_card[${nr}]=${mod} + ;; + esac + ;; + te_ptp) + IFS=$',' + for li in ${val}; do + layermask[${li}]="0xf" + protocol[${li}]=34 # 0x22 == 34 + done + IFS=$'\n' + ;; + te_ptmp) + IFS=$',' + for li in ${val}; do + layermask[${li}]="0xf" + protocol[${li}]=2 # 0x2 == 2 + done + IFS=$'\n' + ;; + nt_*) + IFS=$',' + for li in ${val}; do + layermask[${li}]="0x3" + protocol[${li}]=18 # 0x12 == 18 + done + IFS=$'\n' + ;; + te_capi_ptp) + IFS=$',' + for li in ${val}; do + layermask[${li}]="0x0" + protocol[${li}]=34 # 0x22 == 34 + done + IFS=$'\n' + + addcapi=1 + ;; + te_capi_ptmp) + IFS=$',' + for li in ${val}; do + layermask[${li}]="0x0" + protocol[${li}]=2 # 0x2 == 2 + done + IFS=$'\n' + addcapi=1 + ;; + + option) + port=`echo "${val}" | sed -e "s/^\([0-9]*\),.*/\1/"` + opt=`echo "${val}" | sed -e "s/^[0-9]*,\(.*\)/\1/"` + + if [ -z ${protocol[${port}]} ]; then + protocol[${port}]="0" + fi + + IFS=$',' + for li in ${opt}; do + protocol[${port}]=$(echo "obase=10;2^(${!li}-1)+${protocol[${port}]}" | bc) + done + IFS=$'\n' + ;; + poll) + poll=${val} + ;; + pcm) + pcm=${val} + ;; + debug) + debug=${val} + ;; + *) + echo "unknown variable: ${var}" + ;; + esac + + done + + echo "-----------------------------------------" + echo " Loading module(s) for your misdn-cards:" + echo "-----------------------------------------" + + card_index=1 + port_index=1 + while [ ! -z ${hfcmulti[${card_index}]} ] || [ ! -z ${other_card[${card_index}]} ]; + do + if [ ! -z ${hfcmulti[${card_index}]} ]; then + # MODPROBE COMMAND FOR hfcmulti CARD + hfcmulti_type="type=" + hfcmulti_prot="protocol=" + hfcmulti_layer="layermask=" + while [ ! -z ${hfcmulti[${card_index}]} ]; + do + hfcmulti_type="${hfcmulti_type}$(echo "obase=16;\"0x\";${hfcmulti[${card_index}]}" | bc )," + let "card_index = ${card_index} + 1" + done + while [ ${hfcports} -gt 0 ]; + do + if [ ! -z ${protocol[${port_index}]} ]; then + hfcmulti_prot="${hfcmulti_prot}$(echo "obase=16;\"0x\";${protocol[${port_index}]}" | bc)," + else + hfcmulti_prot="${hfcmulti_prot}0x2," + fi + if [ ! -z ${layermask[${port_index}]} ]; then + hfcmulti_layer="${hfcmulti_layer}${layermask[${port_index}]}," + else + hfcmulti_layer="${hfcmulti_layer}0xf," + fi + let "port_index = ${port_index} + 1" + let "hfcports = ${hfcports} - 1" + done + hfcmulti_type="$(echo ${hfcmulti_type} | sed -e 's/^\(.*\),$/\1/')" + hfcmulti_prot="$(echo ${hfcmulti_prot} | sed -e 's/^\(.*\),$/\1/')" + hfcmulti_layer="$(echo ${hfcmulti_layer} | sed -e 's/^\(.*\),$/\1/')" + hfcmulti_cmd="modprobe hfcmulti ${hfcmulti_type} ${hfcmulti_prot} ${hfcmulti_layer}" + if [ ! -z ${poll} ]; then + hfcmulti_cmd="${hfcmulti_cmd} poll=${poll}" + fi + if [ ! -z ${pcm} ]; then + hfcmulti_cmd="${hfcmulti_cmd} pcm=${pcm}" + fi + if [ ! -z ${debug} ]; then + hfcmulti_cmd="${hfcmulti_cmd} debug=${debug}" + fi + + echo ${hfcmulti_cmd} + eval ${hfcmulti_cmd} + else + # MODPROBE COMMAND FOR _NON_ hfcmulti CARD + other_cmd="modprobe ${other_card[${card_index}]}" + if [ ! -z ${protocol[${port_index}]} ]; then + other_prot="protocol=$(echo "obase=16;\"0x\";${protocol[${port_index}]}" | bc)," + else + other_prot="protocol=0x2," + fi + if [ ! -z ${layermask[${port_index}]} ]; then + other_layer="layermask=${layermask[${port_index}]}," + else + other_layer="layermask=0xf," + fi + + let "prev = ${card_index}" + let "card_index = ${card_index} + 1" + let "port_index = ${port_index} + 1" + while [ "${other_card[${card_index}]}" == "${other_card[${prev}]}" ]; + do + if [ ! -z ${protocol[${port_index}]} ]; then + other_prot="${other_prot}$(echo "obase=16;\"0x\";${protocol[${port_index}]}" | bc)," + else + other_prot="${other_prot}0x2," + fi + if [ ! -z ${layermask[${port_index}]} ]; then + other_layer="${other_layer}${layermask[${port_index}]}," + else + other_layer="${other_layer}0xf," + fi + let "prev = ${card_index}" + let "card_index = ${card_index} + 1" + let "port_index = ${port_index} + 1" + done + + other_prot="$(echo ${other_prot} | sed -e 's/^\(.*\),$/\1/')" + other_layer="$(echo ${other_layer} | sed -e 's/^\(.*\),$/\1/')" + other_cmd="${other_cmd} ${other_prot} ${other_layer}" + echo "${other_cmd}" + eval ${other_cmd} + fi + done +} + +function unload_card_modules { + + IFS=$'\n' + + for line in $(sed -ne '/^[^#]/p' ${misdn_init_conf}); + do + var=`echo "${line}" | sed -e "s/^\(.*\)=.*/\1/"` + val=`echo "${line}" | sed -e "s/^.*=\(.*\)/\1/"` + + case "${var}" in + card) + nr=`echo "${val}" | sed -e "s/^\([0-9]*\),.*/\1/"` + mod=`echo "${val}" | sed -e "s/^[^,]*,\([^,]*\).*/\1/"` + case "${mod}" in + 0x*) + modulelist[${nr}]=hfcmulti + ;; + *) + modulelist[${nr}]=${mod} + ;; + esac + ;; + esac + + done + + echo "-------------------------------------------" + echo " Unloading module(s) for your misdn-cards:" + echo "-------------------------------------------" + + rmmod_cmd="${RMMOD} ${modulelist[1]}" + echo "${rmmod_cmd}" + eval ${rmmod_cmd} + + index=2 + prev=1 + while [ ! -z ${modulelist[${index}]} ]; + do + if [ ${modulelist[${index}]} != ${modulelist[${prev}]} ]; then + rmmod_cmd="${RMMOD} ${modulelist[${index}]}" + echo "${rmmod_cmd}" + eval ${rmmod_cmd} + fi + let "prev = ${index}" + let "index = ${index} + 1" + done +} + +function create_misdn_init_conf { + + cardcount=1 + cardconf="" + IFS=$'\n' + NL=" +" + + function die { + echo "[!!] ${1}" + exit 1 + } + + function addcard { + cardline="${cardline}card=${cardcount},${1}${NL}" + let "cardcount = ${cardcount} + 1" + } + + function addport { + let "portcount = ${portcount} + ${1}" + } + + portcount=0 + + for line in $(${LSPCI} -n -d 1397:30b1); do + addcard "0x1" + addport 1 + done + for line in $(${LSPCI} -n -d 1397:08b4); do + addcard "0x4" + addport 4 + done + for line in $(${LSPCI} -n -d 1397:16b8); do + addcard "0x8" + addport 8 + done + for line in $(${LSPCI} -n | grep "1397:\(2bd\(0\|6\|7\|8\|9\|a\|b\|c\)\|b100\)\|1043:0675\|0871:ffa\(1\|2\)\|1051:0100\|15b0:2bd0\|114f:007\(0\|1\|2\|3\)\|13d1:2bd1\|182d:3069"); do + addcard "hfcpci" + addport 1 + done + for line in $(${LSPCI} -n -d 1244:0xa00); do + addcard "avmfritz" + addport 1 + done + + if [ "${1}" == "scan" ]; then + echo "[OK] found the following devices:" + echo "${cardline}[ii] run \"/etc/init.d/misdn-init config\" to store this information to ${misdn_init_conf}" + else + + index=1 + portline="te_ptmp=" + while [ ${index} -le ${portcount} ]; do + portline="${portline}${index}," + let "index = ${index} + 1" + done + portline="$(echo ${portline} | sed -e 's/^\(.*\),$/\1/')" + + misdn_cfg_pt1="# +# Configuration file for your misdn hardware +# +# Usage: /etc/init.d/misdn-init start|stop|restart|config|scan|help +# + +# +# Card Settings +# +# Syntax: card=,[,