338 lines
9.4 KiB
C
338 lines
9.4 KiB
C
|
/*
|
||
|
* Copyright (c) 2000 Hans Petter Selasky. 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_ihfc.h - ihfc common header file
|
||
|
* ------------------------------------
|
||
|
*
|
||
|
* last edit-date: [Wed Jul 19 09:40:45 2000]
|
||
|
*
|
||
|
* $Id: i4b_ihfc.h,v 1.9 2000/09/19 13:50:36 hm Exp $
|
||
|
*
|
||
|
* $FreeBSD$
|
||
|
*
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
|
||
|
#ifndef _I4B_IHFC_H_
|
||
|
#define _I4B_IHFC_H_
|
||
|
|
||
|
#include <i4b/include/i4b_l3l4.h>
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* global stuff (HFC-1/S/SP)
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
#define DCH_MAX_LEN 264 /* max length of a D frame */
|
||
|
|
||
|
#define IHFC_ACTIVATION_TIMEOUT 3*hz /* S0-bus must activate before this time */
|
||
|
|
||
|
#define IHFC_IO_BASES 1
|
||
|
|
||
|
#define IHFC_DISBUSYTO 500 /* do at least 500 inb's before giving up */
|
||
|
#define IHFC_NONBUSYTO 8000 /* do at least 8000 inb's before giving up */
|
||
|
|
||
|
#define IHFC_NTMODE 0 /* use TE-mode as default */
|
||
|
#define IHFC_DLP 0 /* use (8/9) priority as default */
|
||
|
|
||
|
#define IHFC_MAXUNIT 4
|
||
|
|
||
|
/* #define IHFC_DEBUG internal debugging enabled *
|
||
|
* #undef IHFC_DEBUG internal debugging disabled */
|
||
|
|
||
|
/* chan: *
|
||
|
* 0 - D1 (tx) *
|
||
|
* 1 - D1 (rx) *
|
||
|
* 2 - B1 (tx) *
|
||
|
* 3 - B1 (rx) *
|
||
|
* 4 - B2 (tx) *
|
||
|
* 5 - B2 (rx) */
|
||
|
|
||
|
#define HFC_1 0x01 /* HFC 2B */
|
||
|
#define HFC_S 0x02 /* HFC - S 2BDS0 */
|
||
|
#define HFC_SP 0x04 /* HFC - SP 2BDS0 */
|
||
|
#define HFC_SPCI 0x08 /* HFC - SPCI 2BDS0 X */
|
||
|
#define HFC_S2M 0x10 /* HFC - S2M 2BDS0 X */
|
||
|
#define HFC_USB 0x20 /* HFC - USB 2BDS0 X */
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* "Help Fix Corruption" macros (HFC-1/S/SP)
|
||
|
*
|
||
|
* NOTE: If the code does not run at splhigh, we will sporadically
|
||
|
* lose bytes. On fast PC's (200 Mhz), this is very little noticable.
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
#define HFC_VAR int _s_ /* declare variable */
|
||
|
#define HFC_BEG _s_ = splhigh() /* save spl */
|
||
|
#define HFC_END splx(_s_) /* restore spl */
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* macros related to i4b linking (HFC-1/S/SP)
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
#define S_BLINK sc->sc_blinktab[(chan > 3) ? 1 : 0]
|
||
|
#define S_BDRVLINK sc->sc_bdrvlinktab[(chan > 3) ? 1 : 0]
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* macros related to ihfc_sc (HFC-1/S/SP)
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
|
||
|
/* statemachine */
|
||
|
|
||
|
#define S_IOM2 (sc->sc_config.i_adf2 & 0x80)
|
||
|
/* 0x80: IOM2 mode selected */
|
||
|
|
||
|
#define S_DLP (sc->sc_config.dlp)
|
||
|
#define S_NTMODE (sc->sc_config.ntmode)
|
||
|
#define S_STDEL (sc->sc_config.stdel)
|
||
|
|
||
|
#define S_PHSTATE sc->sc_statemachine.state
|
||
|
#define S_STM_T3 sc->sc_statemachine.T3
|
||
|
#define S_STM_T3CALLOUT sc->sc_statemachine.T3callout
|
||
|
|
||
|
/* unitnumbers */
|
||
|
|
||
|
#define S_UNIT sc->sc_unit
|
||
|
#define S_FLAG sc->sc_flag
|
||
|
#define S_I4BUNIT sc->sc_i4bunit
|
||
|
#define S_I4BFLAG sc->sc_i4bflag
|
||
|
|
||
|
/* ISA bus setup */
|
||
|
|
||
|
#define S_IOBASE sc->sc_resources.io_base
|
||
|
#define S_IORID sc->sc_resources.io_rid
|
||
|
#define S_IRQ sc->sc_resources.irq
|
||
|
#define S_IRQRID sc->sc_resources.irq_rid
|
||
|
|
||
|
/* hardware setup */
|
||
|
|
||
|
#define S_HFC sc->sc_config.chiptype
|
||
|
#define S_IIO sc->sc_config.iio
|
||
|
#define S_IIRQ sc->sc_config.iirq
|
||
|
|
||
|
/* registers of the HFC-S/SP (write only) */
|
||
|
|
||
|
#define S_HFC_CONFIG sc->sc_config.cirm
|
||
|
|
||
|
#define S_CIRM sc->sc_config.cirm
|
||
|
#define S_CTMT sc->sc_config.ctmt
|
||
|
#define S_TEST sc->sc_config.test
|
||
|
#define S_SCTRL sc->sc_config.sctrl
|
||
|
#define S_CLKDEL sc->sc_config.clkdel
|
||
|
#define S_INT_M1 sc->sc_config.int_m1
|
||
|
#define S_INT_M2 sc->sc_config.int_m2
|
||
|
#define S_CONNECT sc->sc_config.connect
|
||
|
#define S_SCTRL_R sc->sc_config.sctrl_r
|
||
|
#define S_MST_MODE sc->sc_config.mst_mode
|
||
|
|
||
|
/* registers of the HFC-S/SP (read only) */
|
||
|
|
||
|
#define S_INT_S1 sc->sc_config.int_s1
|
||
|
|
||
|
/* registers of the ISAC (write only) */
|
||
|
|
||
|
#define S_ISAC_CONFIG sc->sc_config.i_adf2
|
||
|
|
||
|
#define S_ADF1 sc->sc_config.i_adf1
|
||
|
#define S_ADF2 sc->sc_config.i_adf2
|
||
|
#define S_MASK sc->sc_config.i_mask
|
||
|
#define S_MODE sc->sc_config.i_mode
|
||
|
#define S_SPCR sc->sc_config.i_spcr
|
||
|
#define S_SQXR sc->sc_config.i_sqxr
|
||
|
#define S_STCR sc->sc_config.i_stcr
|
||
|
#define S_STAR2 sc->sc_config.i_star2
|
||
|
|
||
|
/* registers of the ISAC (read only) */
|
||
|
|
||
|
#define S_ISTA sc->sc_config.i_ista
|
||
|
|
||
|
/* state of the softc */
|
||
|
|
||
|
#define S_ENABLED sc->sc_enabled
|
||
|
#define S_INTR_ACTIVE sc->sc_intr_active
|
||
|
|
||
|
/* SOFT-HDLC */
|
||
|
|
||
|
#define S_HDLC_IB sc->sc_fifo.chan[chan].hdlc.ib /* u_short */
|
||
|
#define S_HDLC_CRC sc->sc_fifo.chan[chan].hdlc.crc /* u_short */
|
||
|
#define S_HDLC_TMP sc->sc_fifo.chan[chan].hdlc.tmp /* u_int */
|
||
|
#define S_HDLC_FLAG sc->sc_fifo.chan[chan].hdlc.flag /* u_char */
|
||
|
#define S_HDLC_BLEVEL sc->sc_fifo.chan[chan].hdlc.blevel /* u_short */
|
||
|
|
||
|
/* stats */
|
||
|
|
||
|
#define S_BYTES sc->sc_fifo.chan[chan].bytes
|
||
|
|
||
|
/* "Z"-values */
|
||
|
|
||
|
#define S_HDLC_DZ_TAB sc->sc_fifo.dztable
|
||
|
|
||
|
/* filters */
|
||
|
|
||
|
#define S_PROT sc->sc_fifo.chan[chan].prot
|
||
|
#define S_FILTER sc->sc_fifo.chan[chan].filter
|
||
|
#define S_ACTIVITY sc->sc_fifo.chan[chan].activity
|
||
|
#define S_LAST_CHAN sc->sc_fifo.last_chan
|
||
|
|
||
|
/* soft reset */
|
||
|
|
||
|
#define RESET_SOFT_CHAN(sc, chan) bzero(&sc->sc_fifo.chan[chan], sizeof(sc->sc_fifo.chan[0]))
|
||
|
|
||
|
/* trace */
|
||
|
|
||
|
#define S_TRACE sc->sc_trace
|
||
|
#define S_DTRACECOUNT sc->sc_Dtracecount
|
||
|
#define S_BTRACECOUNT sc->sc_Btracecount
|
||
|
|
||
|
/* mbuf */
|
||
|
|
||
|
#define S_MBUF sc->sc_fifo.chan[chan].buffer.mbuf
|
||
|
#define S_MBUFDUMMY sc->sc_fifo.chan[chan].buffer.mbufdummy
|
||
|
#define S_MBUFLEN sc->sc_fifo.chan[chan].buffer.mbuf->m_len
|
||
|
#define S_MBUFPKTHDR sc->sc_fifo.chan[chan].buffer.mbuf->m_pkthdr
|
||
|
#define S_MBUFDATA sc->sc_fifo.chan[chan].buffer.mbuf->m_data
|
||
|
#define S_MBUFDAT sc->sc_fifo.chan[chan].buffer.mbuf->m_dat
|
||
|
|
||
|
#define S_IFQUEUE sc->sc_fifo.chan[chan].buffer.ifqueue
|
||
|
|
||
|
/* hfc control */
|
||
|
|
||
|
#define HFC_INIT ihfc_init
|
||
|
#define HFC_INTR ((S_HFC & HFC_1) ? ihfc_intr1 : ihfc_intr2)
|
||
|
#define HFC_FSM ihfc_fsm
|
||
|
#define HFC_CONTROL ihfc_control
|
||
|
|
||
|
/* softc parts */
|
||
|
|
||
|
struct ihfc_sc;
|
||
|
|
||
|
struct sc_resources {
|
||
|
struct resource * io_base[IHFC_IO_BASES];
|
||
|
int io_rid [IHFC_IO_BASES];
|
||
|
struct resource * irq;
|
||
|
int irq_rid;
|
||
|
};
|
||
|
|
||
|
struct hdlc {
|
||
|
u_char flag;
|
||
|
u_short blevel;
|
||
|
u_short crc;
|
||
|
u_short ib;
|
||
|
u_int tmp;
|
||
|
};
|
||
|
|
||
|
struct buffer {
|
||
|
struct ifqueue ifqueue; /* data queue */
|
||
|
struct mbuf *mbuf; /* current mbuf */
|
||
|
struct mbuf *mbufdummy; /* temporary */
|
||
|
};
|
||
|
|
||
|
struct chan {
|
||
|
struct hdlc hdlc;
|
||
|
u_int bytes;
|
||
|
u_int prot;
|
||
|
struct buffer buffer;
|
||
|
void (*filter)(struct ihfc_sc *sc, u_char chan);
|
||
|
};
|
||
|
|
||
|
struct sc_fifo {
|
||
|
struct chan chan[6];
|
||
|
u_short dztable[16];
|
||
|
u_char last_chan;
|
||
|
};
|
||
|
|
||
|
struct sc_config {
|
||
|
/* software only: */
|
||
|
|
||
|
u_short chiptype; /* chiptype (eg. HFC_1) */
|
||
|
u_char dlp; /* D-priority */
|
||
|
u_short iio; /* internal IO */
|
||
|
u_char iirq; /* internal IRQ */
|
||
|
u_char ntmode; /* mode */
|
||
|
u_char stdel; /* S/T delay */
|
||
|
|
||
|
/* write only: */
|
||
|
u_char cirm;
|
||
|
u_char ctmt;
|
||
|
u_char int_m1;
|
||
|
u_char int_m2;
|
||
|
u_char mst_mode;
|
||
|
u_char clkdel;
|
||
|
u_char sctrl;
|
||
|
u_char connect;
|
||
|
u_char test;
|
||
|
u_char sctrl_r;
|
||
|
|
||
|
/* isac write only - hfc-1: */
|
||
|
u_char i_adf2;
|
||
|
u_char i_spcr;
|
||
|
u_char i_sqxr;
|
||
|
u_char i_adf1;
|
||
|
u_char i_stcr;
|
||
|
u_char i_mode;
|
||
|
u_char i_mask;
|
||
|
u_char i_star2;
|
||
|
|
||
|
/* read only: */
|
||
|
u_char int_s1;
|
||
|
|
||
|
/* isac read only - hfc-1: */
|
||
|
u_char i_ista;
|
||
|
};
|
||
|
|
||
|
struct sc_statemachine {
|
||
|
u_char state; /* see i4b_ihfc_drv.h */
|
||
|
u_char usync;
|
||
|
u_char T3; /* T3 running */
|
||
|
struct callout_handle T3callout;
|
||
|
};
|
||
|
|
||
|
/*---------------------------------------------------------------------------*
|
||
|
* HFC softc
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
typedef struct ihfc_sc
|
||
|
{ int sc_unit;
|
||
|
int sc_flag;
|
||
|
|
||
|
int sc_i4bunit; /* L0IHFCUNIT(sc_unit) */
|
||
|
int sc_i4bflag; /* FLAG_TEL_S0_16_3C .. */
|
||
|
|
||
|
u_char sc_enabled; /* daemon running if set */
|
||
|
u_char sc_intr_active; /* interrupt is active */
|
||
|
|
||
|
int sc_trace;
|
||
|
u_int sc_Btracecount;
|
||
|
u_int sc_Dtracecount;
|
||
|
|
||
|
struct sc_config sc_config;
|
||
|
struct sc_resources sc_resources;
|
||
|
struct sc_statemachine sc_statemachine;
|
||
|
|
||
|
isdn_link_t sc_blinktab[2];
|
||
|
drvr_link_t *sc_bdrvlinktab[2];
|
||
|
|
||
|
struct sc_fifo sc_fifo;
|
||
|
} ihfc_sc_t;
|
||
|
|
||
|
extern ihfc_sc_t ihfc_softc[];
|
||
|
|
||
|
#endif /* _I4B_IHFC_H_ */
|