#!/sbin/runscript # Copyright 1999-2006 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: /var/cvsroot/gentoo-x86/net-dialup/isdn4k-utils/files/hisax.initd,v 1.5 2006/09/10 15:35:40 sbriesen Exp $ depend() { use isapnp pcmcia } # possible firmware locations (list and order taken from 'capiinit') FWDIRS=(/lib/firmware/isdn /lib/firmware /usr/share/isdn /usr/lib/isdn /lib/isdn) # Firmware search findfw() { # local DIR for DIR in ${FWDIRS[*]}; do if [ -f "${DIR}/${1}" ]; then echo "${DIR}/${1}"; return 0 fi done return 1 } check_module() { /bin/grep 2>/dev/null -q "^${1} " /proc/modules } get_first_free_idx() { local -a _idxa local _it _lin _idx=-1 if ! read _it _lin < <(/bin/head 2>/dev/null -n1 /dev/isdninfo); then echo "0"; return fi read -a _idxa < <(echo ${_lin}) while [ ${_idx} -lt 65 ]; do : $((_idx++)) if [ "${_idxa[$_idx]}" = "-" ]; then echo $((_idx / 2)); return fi done } read_config() { HISAX_TYPE="" HISAXFC_TYPE="" HISAX_DEBUG="" HISAX_FIRMWARE="" HISAX_CNT=$(get_first_free_idx) while read H_TYPE H_PROTO H_IO H_IRQ H_MEM H_DEBUG H_ID; do # check and set card id case "${H_TYPE}" in 99) # AVM Fritz PCI/PnP H_ID="##" # fixed later ;; *) # all others [ -z "${H_ID}" -o "${H_ID}" = "-" ] && H_ID="hisax${HISAX_CNT}" H_ID="${H_ID//\%/-}"; H_ID="${H_ID// /_}" ;; esac # convert protocol to number case "${H_PROTO}" in [eE][dD][sS][sS]1) H_PROTO_NR=2 ;; # EDSS1 [eE][uU][rR][oO]) H_PROTO_NR=2 ;; # EDSS1 [dD][sS][sS]1) H_PROTO_NR=2 ;; # EDSS1 1[tT][rR]6) H_PROTO_NR=1 ;; # 1TR6 [nN][iI]1) H_PROTO_NR=4 ;; # NI1 [lL][eE][aA][sS][eE][dD]) H_PROTO_NR=3 ;; # leased *) return 1 ;; # error! esac # split IO option (needed for Teles PnP) if [ "${H_IO/,}" = "${H_IO}" ]; then H_IO0="-" H_IO1="-" else H_IO0="${H_IO%%,*}" H_IO1="${H_IO##*,}" H_IO="-" fi # check debug option and build list [ -z "${H_DEBUG}" -o "${H_DEBUG}" = "-" ] && H_DEBUG=4 [ -z "${HISAX_DEBUG}" ] \ && HISAX_DEBUG="${H_ID}%${H_DEBUG//\%}" \ || HISAX_DEBUG="${HISAX_DEBUG} ${H_ID}%${H_DEBUG//\%}" # build list of cards which needs ISAR.BIN firmware case "${H_TYPE}" in 28|29) [ -z "${HISAX_FIRMWARE}" ] \ && HISAX_FIRMWARE="${H_ID}" \ || HISAX_FIRMWARE="${HISAX_FIRMWARE} ${H_ID}" ;; esac # build options case "${H_TYPE}" in 99) # AVM Fritz PCI/PnP if [ -z "${HISAXFC_TYPE}" ]; then HISAXFC_TYPE="${H_TYPE}" HISAXFC_PROTO="${H_PROTO_NR}" else HISAXFC_TYPE="${HISAXFC_TYPE},${H_TYPE}" HISAXFC_PROTO="${HISAXFC_PROTO},${H_PROTO_NR}" fi ;; *) # all others : $((HISAX_CNT++)) if [ -z "${HISAX_TYPE}" ]; then HISAX_TYPE="${H_TYPE}" HISAX_IRQ="${H_IRQ//-}" HISAX_MEM="${H_MEM//-}" HISAX_IO="${H_IO//-}" HISAX_IO0="${H_IO0//-}" HISAX_IO1="${H_IO1//-}" HISAX_ID="${H_ID}" HISAX_PROTO="${H_PROTO_NR}" HISAX_DUMMY="" else HISAX_TYPE="${HISAX_TYPE},${H_TYPE}" HISAX_IRQ="${HISAX_IRQ},${H_IRQ//-}" HISAX_IO="${HISAX_IO},${H_IO//-}" HISAX_IO0="${HISAX_IO0},${H_IO0//-}" HISAX_IO1="${HISAX_IO1},${H_IO1//-}" HISAX_MEM="${HISAX_MEM},${H_MEM//-}" HISAX_ID="${HISAX_ID}%${H_ID}" HISAX_PROTO="${HISAX_PROTO},${H_PROTO_NR}" HISAX_DUMMY="${HISAX_DUMMY}," fi ;; esac done < <(/bin/sed 2>/dev/null -ne "s:^[[:space:]]*\([1-9][0-9]\?[[:space:]]\+[^#]*\)[#]*.*$:\1:p" "$@") # build final hisax options if [ -n "${HISAX_TYPE}" ]; then HISAX_OPTIONS="type=${HISAX_TYPE}" [ "${HISAX_IRQ}" = "${HISAX_DUMMY}" ] || HISAX_OPTIONS="${HISAX_OPTIONS} irq=${HISAX_IRQ}" [ "${HISAX_IO}" = "${HISAX_DUMMY}" ] || HISAX_OPTIONS="${HISAX_OPTIONS} io=${HISAX_IO}" [ "${HISAX_IO0}" = "${HISAX_DUMMY}" ] || HISAX_OPTIONS="${HISAX_OPTIONS} io0=${HISAX_IO0}" [ "${HISAX_IO1}" = "${HISAX_DUMMY}" ] || HISAX_OPTIONS="${HISAX_OPTIONS} io1=${HISAX_IO1}" [ "${HISAX_MEM}" = "${HISAX_DUMMY}" ] || HISAX_OPTIONS="${HISAX_OPTIONS} mem=${HISAX_MEM}" HISAX_OPTIONS="${HISAX_OPTIONS} protocol=${HISAX_PROTO} id=${HISAX_ID}" fi # build final hisax_fcpcipnp options if [ -n "${HISAXFC_TYPE}" ]; then HISAXFC_OPTIONS="protocol=${HISAXFC_PROTO}" fi return 0 } start() { if [ ! -f /etc/hisax.conf ]; then eerror "You're missing /etc/hisax.conf" return 1 fi if ! read_config /etc/hisax.conf; then eerror "You have an configuration error in /etc/hisax.conf" return 1 fi if [ -z "${HISAX_TYPE}" -a -z "${HISAXFC_TYPE}" ]; then eerror "You have not configured /etc/hisax.conf" return 1 fi ebegin "Loading HiSax driver" if [ -n "${HISAX_TYPE}" ]; then /sbin/modprobe -s hisax ${HISAX_OPTIONS} && check_module hisax if [ $? -ne 0 ]; then /sbin/modprobe -sqr hisax_fcpcipnp /sbin/modprobe -sqr hisax eend 1; return 1 fi fi if [ -n "${HISAXFC_TYPE}" ]; then /sbin/modprobe -s hisax_fcpcipnp ${HISAXFC_OPTIONS} && check_module hisax_fcpcipnp if [ $? -ne 0 ]; then /sbin/modprobe -sqr hisax_fcpcipnp /sbin/modprobe -sqr hisax eend 1; return 1 fi fi eend $? # create ISDN devices if necessary [ -c /dev/isdninfo -a -c /dev/isdnctrl0 ] || /etc/init.d/isdn makedev if [ -n "${HISAX_FIRMWARE}" ]; then for ID in ${HISAX_FIRMWARE}; do FW=$(findfw "ISAR.BIN") if [ -n "${FW}" ]; then ebegin "Loading firmware '${FW##*/}' onto ${ID}" /usr/sbin/hisaxctrl "${ID}" 9 "${FW}" if ! eend $?; then /sbin/modprobe -sqr hisax_fcpcipnp /sbin/modprobe -sqr hisax return 1 fi else eerror "Firmware 'ISAR.BIN' not found in ${FWDIRS[0]}" /sbin/modprobe -sqr hisax_fcpcipnp /sbin/modprobe -sqr hisax return 1 fi done fi local CARDS="" ID VAL if [ -n "${HISAX_DEBUG}" ]; then for DBG in ${HISAX_DEBUG}; do ID="${DBG%%\%*}" VAL="${DBG##*\%}" if [ "${ID}" = "##" ]; then ID="fcpcipnp${HISAX_CNT}" : $((HISAX_CNT++)) fi /usr/sbin/hisaxctrl "${ID}" 1 "${VAL}" [ -z "${CARDS}" ] && CARDS="${ID}" || CARDS="${CARDS} ${ID}" done fi [ -n "${CARDS}" ] && einfo "HiSax cards: ${CARDS}" } stop() { ebegin "Unloading HiSax driver" /sbin/modprobe -sqr hisax_fcpcipnp /sbin/modprobe -sqr hisax eend $? }