/****************************************************************************
 *    ixj.c
 *
 * Device Driver for Quicknet Technologies, Inc.'s Telephony cards
 * including the Internet PhoneJACK, Internet PhoneJACK Lite,
 * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and
 * SmartCABLE
 *
 *    (c) Copyright 1999-2001  Quicknet Technologies, Inc.
 *
 *    This program is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU General Public License
 *    as published by the Free Software Foundation; either version
 *    2 of the License, or (at your option) any later version.
 *
 * Author:          Ed Okerson, <eokerson@quicknet.net>
 *
 * Contributors:    Greg Herlein, <gherlein@quicknet.net>
 *                  David W. Erhart, <derhart@quicknet.net>
 *                  John Sellers, <jsellers@quicknet.net>
 *                  Mike Preston, <mpreston@quicknet.net>
 *    
 * Fixes:           David Huggins-Daines, <dhd@cepstral.com>
 *                  Fabio Ferrari, <fabio.ferrari@digitro.com.br>
 *                  Artis Kugevics, <artis@mt.lv>
 *                  Daniele Bellucci, <bellucda@tiscali.it>
 *
 * More information about the hardware related to this driver can be found  
 * at our website:    http://www.quicknet.net
 *
 * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
 * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *    
 * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
 * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 *
 ***************************************************************************/

/*
 * $Log: ixj.c,v $
 *
 * Revision 4.8  2003/07/09 19:39:00  Daniele Bellucci
 * Audit some copy_*_user and minor cleanup.
 *
 * Revision 4.7  2001/08/13 06:19:33  craigs
 * Added additional changes from Alan Cox and John Anderson for
 * 2.2 to 2.4 cleanup and bounds checking
 *
 * Revision 4.6  2001/08/13 01:05:05  craigs
 * Really fixed PHONE_QUERY_CODEC problem this time
 *
 * Revision 4.5  2001/08/13 00:11:03  craigs
 * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
 *
 * Revision 4.4  2001/08/07 07:58:12  craigs
 * Changed back to three digit version numbers
 * Added tagbuild target to allow automatic and easy tagging of versions
 *
 * Revision 4.3  2001/08/07 07:24:47  craigs
 * Added ixj-ver.h to allow easy configuration management of driver
 * Added display of version number in /prox/ixj
 *
 * Revision 4.2  2001/08/06 07:07:19  craigs
 * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
 * behaviour of returning int rather than short *
 *
 * Revision 4.1  2001/08/05 00:17:37  craigs
 * More changes for correct PCMCIA installation
 * Start of changes for backward Linux compatibility
 *
 * Revision 4.0  2001/08/04 12:33:12  craigs
 * New version using GNU autoconf
 *
 * Revision 3.105  2001/07/20 23:14:32  eokerson
 * More work on CallerID generation when using ring cadences.
 *
 * Revision 3.104  2001/07/06 01:33:55  eokerson
 * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
 *
 * Revision 3.103  2001/07/05 19:20:16  eokerson
 * Updated HOWTO
 * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
 *
 * Revision 3.102  2001/07/03 23:51:21  eokerson
 * Un-mute mic on Internet LineJACK when in speakerphone mode.
 *
 * Revision 3.101  2001/07/02 19:26:56  eokerson
 * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
 *
 * Revision 3.100  2001/07/02 19:18:27  eokerson
 * Changed driver to make dynamic allocation possible.  We now pass IXJ * between functions instead of array indexes.
 * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
 * Fixed speaker mode on Internet LineJACK.
 *
 * Revision 3.99  2001/05/09 14:11:16  eokerson
 * Fixed kmalloc error in ixj_build_filter_cadence.  Thanks David Chan <cat@waulogy.stanford.edu>.
 *
 * Revision 3.98  2001/05/08 19:55:33  eokerson
 * Fixed POTS hookstate detection while it is connected to PSTN port.
 *
 * Revision 3.97  2001/05/08 00:01:04  eokerson
 * Fixed kernel oops when sending caller ID data.
 *
 * Revision 3.96  2001/05/04 23:09:30  eokerson
 * Now uses one kernel timer for each card, instead of one for the entire driver.
 *
 * Revision 3.95  2001/04/25 22:06:47  eokerson
 * Fixed squawking at beginning of some G.723.1 calls.
 *
 * Revision 3.94  2001/04/03 23:42:00  eokerson
 * Added linear volume ioctls
 * Added raw filter load ioctl
 *
 * Revision 3.93  2001/02/27 01:00:06  eokerson
 * Fixed blocking in CallerID.
 * Reduced size of ixj structure for smaller driver footprint.
 *
 * Revision 3.92  2001/02/20 22:02:59  eokerson
 * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
 * Improved PSTN ring detection.
 * Fixed wink generation on POTS ports.
 *
 * Revision 3.91  2001/02/13 00:55:44  eokerson
 * Turn AEC back on after changing frame sizes.
 *
 * Revision 3.90  2001/02/12 16:42:00  eokerson
 * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
 *
 * Revision 3.89  2001/02/12 15:41:16  eokerson
 * Fix from Artis Kugevics - Tone gains were not being set correctly.
 *
 * Revision 3.88  2001/02/05 23:25:42  eokerson
 * Fixed lockup bugs with deregister.
 *
 * Revision 3.87  2001/01/29 21:00:39  eokerson
 * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
 * Updated copyright date.
 *
 * Revision 3.86  2001/01/23 23:53:46  eokerson
 * Fixes to G.729 compatibility.
 *
 * Revision 3.85  2001/01/23 21:30:36  eokerson
 * Added verbage about cards supported.
 * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
 *
 * Revision 3.84  2001/01/22 23:32:10  eokerson
 * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
 *
 * Revision 3.83  2001/01/19 14:51:41  eokerson
 * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
 *
 * Revision 3.82  2001/01/19 00:34:49  eokerson
 * Added verbosity to write overlap errors.
 *
 * Revision 3.81  2001/01/18 23:56:54  eokerson
 * Fixed PSTN line test functions.
 *
 * Revision 3.80  2001/01/18 22:29:27  eokerson
 * Updated AEC/AGC values for different cards.
 *
 * Revision 3.79  2001/01/17 02:58:54  eokerson
 * Fixed AEC reset after Caller ID.
 * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
 *
 * Revision 3.78  2001/01/16 19:43:09  eokerson
 * Added support for Linux 2.4.x kernels.
 *
 * Revision 3.77  2001/01/09 04:00:52  eokerson
 * Linetest will now test the line, even if it has previously succeded.
 *
 * Revision 3.76  2001/01/08 19:27:00  eokerson
 * Fixed problem with standard cable on Internet PhoneCARD.
 *
 * Revision 3.75  2000/12/22 16:52:14  eokerson
 * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
 *
 * Revision 3.74  2000/12/08 22:41:50  eokerson
 * Added capability for G729B.
 *
 * Revision 3.73  2000/12/07 23:35:16  eokerson
 * Added capability to have different ring pattern before CallerID data.
 * Added hookstate checks in CallerID routines to stop FSK.
 *
 * Revision 3.72  2000/12/06 19:31:31  eokerson
 * Modified signal behavior to only send one signal per event.
 *
 * Revision 3.71  2000/12/06 03:23:08  eokerson
 * Fixed CallerID on Call Waiting.
 *
 * Revision 3.70  2000/12/04 21:29:37  eokerson
 * Added checking to Smart Cable gain functions.
 *
 * Revision 3.69  2000/12/04 21:05:20  eokerson
 * Changed ixjdebug levels.
 * Added ioctls to change gains in Internet Phone CARD Smart Cable.
 *
 * Revision 3.68  2000/12/04 00:17:21  craigs
 * Changed mixer voice gain to +6dB rather than 0dB
 *
 * Revision 3.67  2000/11/30 21:25:51  eokerson
 * Fixed write signal errors.
 *
 * Revision 3.66  2000/11/29 22:42:44  eokerson
 * Fixed PSTN ring detect problems.
 *
 * Revision 3.65  2000/11/29 07:31:55  craigs
 * Added new 425Hz filter co-efficients
 * Added card-specific DTMF prescaler initialisation
 *
 * Revision 3.64  2000/11/28 14:03:32  craigs
 * Changed certain mixer initialisations to be 0dB rather than 12dB
 * Added additional information to /proc/ixj
 *
 * Revision 3.63  2000/11/28 11:38:41  craigs
 * Added display of AEC modes in AUTO and AGC mode
 *
 * Revision 3.62  2000/11/28 04:05:44  eokerson
 * Improved PSTN ring detection routine.
 *
 * Revision 3.61  2000/11/27 21:53:12  eokerson
 * Fixed flash detection.
 *
 * Revision 3.60  2000/11/27 15:57:29  eokerson
 * More work on G.729 load routines.
 *
 * Revision 3.59  2000/11/25 21:55:12  eokerson
 * Fixed errors in G.729 load routine.
 *
 * Revision 3.58  2000/11/25 04:08:29  eokerson
 * Added board locks around G.729 and TS85 load routines.
 *
 * Revision 3.57  2000/11/24 05:35:17  craigs
 * Added ability to retrieve mixer values on LineJACK
 * Added complete initialisation of all mixer values at startup
 * Fixed spelling mistake
 *
 * Revision 3.56  2000/11/23 02:52:11  robertj
 * Added cvs change log keyword.
 * Fixed bug in capabilities list when using G.729 module.
 *
 */

#include "ixj-ver.h"

#define PERFMON_STATS
#define IXJDEBUG 0
#define MAXRINGS 5

#include <linux/module.h>

#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel.h>	/* printk() */
#include <linux/fs.h>		/* everything... */
#include <linux/errno.h>	/* error codes */
#include <linux/slab.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/proc_fs.h>
#include <linux/poll.h>
#include <linux/timer.h>
#include <linux/delay.h>
#include <linux/pci.h>

#include <asm/io.h>
#include <asm/uaccess.h>

#include <linux/isapnp.h>

#include "ixj.h"

#define TYPE(inode) (iminor(inode) >> 4)
#define NUM(inode) (iminor(inode) & 0xf)

static int ixjdebug;
static int hertz = HZ;
static int samplerate = 100;

module_param(ixjdebug, int, 0);

/************************************************************************
*
* ixjdebug meanings are now bit mapped instead of level based
* Values can be or'ed together to turn on multiple messages
*
* bit  0 (0x0001) = any failure
* bit  1 (0x0002) = general messages
* bit  2 (0x0004) = POTS ringing related
* bit  3 (0x0008) = PSTN events
* bit  4 (0x0010) = PSTN Cadence state details
* bit  5 (0x0020) = Tone detection triggers
* bit  6 (0x0040) = Tone detection cadence details
* bit  7 (0x0080) = ioctl tracking
* bit  8 (0x0100) = signal tracking
* bit  9 (0x0200) = CallerID generation details
*
************************************************************************/

#ifdef IXJ_DYN_ALLOC

static IXJ *ixj[IXJMAX];
#define	get_ixj(b)	ixj[(b)]

/*
 *	Allocate a free IXJ device
 */
 
static IXJ *ixj_alloc()
{
	for(cnt=0; cnt<IXJMAX; cnt++)
	{
		if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
		{
			j = kmalloc(sizeof(IXJ), GFP_KERNEL);
			if (j == NULL)
				return NULL;
			ixj[cnt] = j;
			return j;
		}
	}
	return NULL;
}

static void ixj_fsk_free(IXJ *j)
{
	if(j->fskdata != NULL) {
		kfree(j->fskdata);
		j->fskdata = NULL;
	}
}

static void ixj_fsk_alloc(IXJ *j)
{
	if(!j->fskdata) {
		j->fskdata = kmalloc(8000, GFP_KERNEL);
		if (!j->fskdata) {
			if(ixjdebug & 0x0200) {
				printk("IXJ phone%d - allocate failed\n", j->board);
			}
			return;
		} else {
			j->fsksize = 8000;
			if(ixjdebug & 0x0200) {
				printk("IXJ phone%d - allocate succeded\n", j->board);
			}
		}
	}
}

#else

static IXJ ixj[IXJMAX];
#define	get_ixj(b)	(&ixj[(b)])

/*
 *	Allocate a free IXJ device
 */
 
static IXJ *ixj_alloc(void)
{
	int cnt;
	for(cnt=0; cnt<IXJMAX; cnt++) {
		if(!ixj[cnt].DSPbase)
			return &ixj[cnt];
	}
	return NULL;
}

static inline void ixj_fsk_free(IXJ *j) {;}

static inline void ixj_fsk_alloc(IXJ *j)
{
	j->fsksize = 8000;
}

#endif

#ifdef PERFMON_STATS
#define ixj_perfmon(x)	((x)++)
#else
#define ixj_perfmon(x)	do { } while(0)
#endif

static int ixj_convert_loaded;

static int ixj_WriteDSPCommand(unsigned short, IXJ *j);

/************************************************************************
*
* These are function definitions to allow external modules to register
* enhanced functionality call backs.
*
************************************************************************/

static int Stub(IXJ * J, unsigned long arg)
{
	return 0;
}

static IXJ_REGFUNC ixj_PreRead = &Stub;
static IXJ_REGFUNC ixj_PostRead = &Stub;
static IXJ_REGFUNC ixj_PreWrite = &Stub;
static IXJ_REGFUNC ixj_PostWrite = &Stub;

static void ixj_read_frame(IXJ *j);
static void ixj_write_frame(IXJ *j);
static void ixj_init_timer(IXJ *j);
static void ixj_add_timer(IXJ *	j);
static void ixj_timeout(unsigned long ptr);
static int read_filters(IXJ *j);
static int LineMonitor(IXJ *j);
static int ixj_fasync(int fd, struct file *, int mode);
static int ixj_set_port(IXJ *j, int arg);
static int ixj_set_pots(IXJ *j, int arg);
static int ixj_hookstate(IXJ *j);
static int ixj_record_start(IXJ *j);
static void ixj_record_stop(IXJ *j);
static void set_rec_volume(IXJ *j, int volume);
static int get_rec_volume(IXJ *j);
static int set_rec_codec(IXJ *j, int rate);
static void ixj_vad(IXJ *j, int arg);
static int ixj_play_start(IXJ *j);
static void ixj_play_stop(IXJ *j);
static int ixj_set_tone_on(unsigned short arg, IXJ *j);
static int ixj_set_tone_off(unsigned short, IXJ *j);
static int ixj_play_tone(IXJ *j, char tone);
static void ixj_aec_start(IXJ *j, int level);
static int idle(IXJ *j);
static void ixj_ring_on(IXJ *j);
static void ixj_ring_off(IXJ *j);
static void aec_stop(IXJ *j);
static void ixj_ringback(IXJ *j);
static void ixj_busytone(IXJ *j);
static void ixj_dialtone(IXJ *j);
static void ixj_cpt_stop(IXJ *j);
static char daa_int_read(IXJ *j);
static char daa_CR_read(IXJ *j, int cr);
static int daa_set_mode(IXJ *j, int mode);
static int ixj_linetest(IXJ *j);
static int ixj_daa_write(IXJ *j);
static int ixj_daa_cid_read(IXJ *j);
static void DAA_Coeff_US(IXJ *j);
static void DAA_Coeff_UK(IXJ *j);
static void DAA_Coeff_France(IXJ *j);
static void DAA_Coeff_Germany(IXJ *j);
static void DAA_Coeff_Australia(IXJ *j);
static void DAA_Coeff_Japan(IXJ *j);
static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp);
static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp);
/* Serial Control Interface funtions */
static int SCI_Control(IXJ *j, int control);
static int SCI_Prepare(IXJ *j);
static int SCI_WaitHighSCI(IXJ *j);
static int SCI_WaitLowSCI(IXJ *j);
static DWORD PCIEE_GetSerialNumber(WORD wAddress);
static int ixj_PCcontrol_wait(IXJ *j);
static void ixj_pre_cid(IXJ *j);
static void ixj_write_cid(IXJ *j);
static void ixj_write_cid_bit(IXJ *j, int bit);
static int set_base_frame(IXJ *j, int size);
static int set_play_codec(IXJ *j, int rate);
static void set_rec_depth(IXJ *j, int depth);
static int ixj_mixer(long val, IXJ *j);

/************************************************************************
CT8020/CT8021 Host Programmers Model
Host address	Function					Access
DSPbase +
0-1		Aux Software Status Register (reserved)		Read Only
2-3		Software Status Register			Read Only
4-5		Aux Software Control Register (reserved)	Read Write
6-7		Software Control Register			Read Write
8-9		Hardware Status Register			Read Only
A-B		Hardware Control Register			Read Write
C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
E-F Host Recieve (Read) Data Buffer Access Port (buffer input)	Read Only
************************************************************************/

static inline void ixj_read_HSR(IXJ *j)
{
	j->hsr.bytes.low = inb_p(j->DSPbase + 8);
	j->hsr.bytes.high = inb_p(j->DSPbase + 9);
}

static inline int IsControlReady(IXJ *j)
{
	ixj_read_HSR(j);
	return j->hsr.bits.controlrdy ? 1 : 0;
}

static inline int IsPCControlReady(IXJ *j)
{
	j->pccr1.byte = inb_p(j->XILINXbase + 3);
	return j->pccr1.bits.crr ? 1 : 0;
}

static inline int IsStatusReady(IXJ *j)
{
	ixj_read_HSR(j);
	return j->hsr.bits.statusrdy ? 1 : 0;
}

static inline int IsRxReady(IXJ *j)
{
	ixj_read_HSR(j);
	ixj_perfmon(j->rxreadycheck);
	return j->hsr.bits.rxrdy ? 1 : 0;
}

static inline int IsTxReady(IXJ *j)
{
	ixj_read_HSR(j);
	ixj_perfmon(j->txreadycheck);
	return j->hsr.bits.txrdy ? 1 : 0;
}

static inline void set_play_volume(IXJ *j, int volume)
{
	if (ixjdebug & 0x0002)
		printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
	ixj_WriteDSPCommand(0xCF02, j);
	ixj_WriteDSPCommand(volume, j);
}

static int set_play_volume_linear(IXJ *j, int volume)
{
	int newvolume, dspplaymax;

	if (ixjdebug & 0x0002)
		printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
	if(volume > 100 || volume < 0) {
		return -1;
	}

	/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
	switch (j->cardtype) {
	case QTI_PHONEJACK:
		dspplaymax = 0x380;
		break;
	case QTI_LINEJACK:
		if(j->port == PORT_PSTN) {
			dspplaymax = 0x48;
		} else {
			dspplaymax = 0x100;
		}
		break;
	case QTI_PHONEJACK_LITE:
		dspplaymax = 0x380;
		break;
	case QTI_PHONEJACK_PCI:
		dspplaymax = 0x6C;
		break;
	case QTI_PHONECARD:
		dspplaymax = 0x50;
		break;
	default:
		return -1;
	}
	newvolume = (dspplaymax * volume) / 100;
	set_play_volume(j, newvolume);
	return 0;
}

static inline void set_play_depth(IXJ *j, int depth)
{
	if (depth > 60)
		depth = 60;
	if (depth < 0)
		depth = 0;
	ixj_WriteDSPCommand(0x5280 + depth, j);
}

static inline int get_play_volume(IXJ *j)
{
	ixj_WriteDSPCommand(0xCF00, j);
	return j->ssr.high << 8 | j->ssr.low;
}

static int get_play_volume_linear(IXJ *j)
{
	int volume, newvolume, dspplaymax;

	/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
	switch (j->cardtype) {
	case QTI_PHONEJACK:
		dspplaymax = 0x380;
		break;
	case QTI_LINEJACK:
		if(j->port == PORT_PSTN) {
			dspplaymax = 0x48;
		} else {
			dspplaymax = 0x100;
		}
		break;
	case QTI_PHONEJACK_LITE:
		dspplaymax = 0x380;
		break;
	case QTI_PHONEJACK_PCI:
		dspplaymax = 0x6C;
		break;
	case QTI_PHONECARD:
		dspplaymax = 100;
		break;
	default:
		return -1;
	}
	volume = get_play_volume(j);
	newvolume = (volume * 100) / dspplaymax;
	if(newvolume > 100)
		newvolume = 100;
	return newvolume;
}

static inline BYTE SLIC_GetState(IXJ *j)
{
	if (j->cardtype == QTI_PHONECARD) {
		j->pccr1.byte = 0;
		j->psccr.bits.dev = 3;
		j->psccr.bits.rw = 1;
		outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
		ixj_PCcontrol_wait(j);
		j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
		ixj_PCcontrol_wait(j);
		if (j->pslic.bits.powerdown)
			return PLD_SLIC_STATE_OC;
		else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
			return PLD_SLIC_STATE_ACTIVE;
		else
			return PLD_SLIC_STATE_RINGING;
	} else {
		j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
	}
	return j->pld_slicr.bits.state;
}

static BOOL SLIC_SetState(BYTE byState, IXJ *j)
{
	BOOL fRetVal = FALSE;

	if (j->cardtype == QTI_PHONECARD) {
		if (j->flags.pcmciasct) {
			switch (byState) {
			case PLD_SLIC_STATE_TIPOPEN:
			case PLD_SLIC_STATE_OC:
				j->pslic.bits.powerdown = 1;
				j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
				fRetVal = TRUE;
				break;
			case PLD_SLIC_STATE_RINGING:
				if (j->readers || j->writers) {
					j->pslic.bits.powerdown = 0;
					j->pslic.bits.ring0 = 1;
					j->pslic.bits.ring1 = 0;
					fRetVal = TRUE;
				}
				break;
			case PLD_SLIC_STATE_OHT:	/* On-hook transmit */

			case PLD_SLIC_STATE_STANDBY:
			case PLD_SLIC_STATE_ACTIVE:
				if (j->readers || j->writers) {
					j->pslic.bits.powerdown = 0;
				} else {
					j->pslic.bits.powerdown = 1;
				}
				j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
				fRetVal = TRUE;
				break;
			case PLD_SLIC_STATE_APR:	/* Active polarity reversal */

			case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */

			default:
				fRetVal = FALSE;
				break;
			}
			j->psccr.bits.dev = 3;
			j->psccr.bits.rw = 0;
			outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
			ixj_PCcontrol_wait(j);
		}
	} else {
		/* Set the C1, C2, C3 & B2EN signals. */
		switch (byState) {
		case PLD_SLIC_STATE_OC:
			j->pld_slicw.bits.c1 = 0;
			j->pld_slicw.bits.c2 = 0;
			j->pld_slicw.bits.c3 = 0;
			j->pld_slicw.bits.b2en = 0;
			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
			fRetVal = TRUE;
			break;
		case PLD_SLIC_STATE_RINGING:
			j->pld_slicw.bits.c1 = 1;
			j->pld_slicw.bits.c2 = 0;
			j->pld_slicw.bits.c3 = 0;
			j->pld_slicw.bits.b2en = 1;
			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
			fRetVal = TRUE;
			break;
		case PLD_SLIC_STATE_ACTIVE:
			j->pld_slicw.bits.c1 = 0;
			j->pld_slicw.bits.c2 = 1;
			j->pld_slicw.bits.c3 = 0;
			j->pld_slicw.bits.b2en = 0;
			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
			fRetVal = TRUE;
			break;
		case PLD_SLIC_STATE_OHT:	/* On-hook transmit */

			j->pld_slicw.bits.c1 = 1;
			j->pld_slicw.bits.c2 = 1;
			j->pld_slicw.bits.c3 = 0;
			j->pld_slicw.bits.b2en = 0;
			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
			fRetVal = TRUE;
			break;
		case PLD_SLIC_STATE_TIPOPEN:
			j->pld_slicw.bits.c1 = 0;
			j->pld_slicw.bits.c2 = 0;
			j->pld_slicw.bits.c3 = 1;
			j->pld_slicw.bits.b2en = 0;
			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
			fRetVal = TRUE;
			break;
		case PLD_SLIC_STATE_STANDBY:
			j->pld_slicw.bits.c1 = 1;
			j->pld_slicw.bits.c2 = 0;
			j->pld_slicw.bits.c3 = 1;
			j->pld_slicw.bits.b2en = 1;
			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
			fRetVal = TRUE;
			break;
		case PLD_SLIC_STATE_APR:	/* Active polarity reversal */

			j->pld_slicw.bits.c1 = 0;
			j->pld_slicw.bits.c2 = 1;
			j->pld_slicw.bits.c3 = 1;
			j->pld_slicw.bits.b2en = 0;
			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
			fRetVal = TRUE;
			break;
		case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */

			j->pld_slicw.bits.c1 = 1;
			j->pld_slicw.bits.c2 = 1;
			j->pld_slicw.bits.c3 = 1;
			j->pld_slicw.bits.b2en = 0;
			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
			fRetVal = TRUE;
			break;
		default:
			fRetVal = FALSE;
			break;
		}
	}

	return fRetVal;
}

static int ixj_wink(IXJ *j)
{
	BYTE slicnow;

	slicnow = SLIC_GetState(j);

	j->pots_winkstart = jiffies;
	SLIC_SetState(PLD_SLIC_STATE_OC, j);

	while (time_before(jiffies, j->pots_winkstart + j->winktime)) {
		set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout(1);
	}

	SLIC_SetState(slicnow, j);
	return 0;
}

static void ixj_init_timer(IXJ *j)
{
	init_timer(&j->timer);
	j->timer.function = ixj_timeout;
	j->timer.data = (unsigned long)j;
}

static void ixj_add_timer(IXJ *j)
{
	j->timer.expires = jiffies + (hertz / samplerate);
	add_timer(&j->timer);
}

static void ixj_tone_timeout(IXJ *j)
{
	IXJ_TONE ti;

	j->tone_state++;
	if (j->tone_state == 3) {
		j->tone_state = 0;
		if (j->cadence_t) {
			j->tone_cadence_state++;
			if (j->tone_cadence_state >= j->cadence_t->elements_used) {
				switch (j->cadence_t->termination) {
				case PLAY_ONCE:
					ixj_cpt_stop(j);
					break;
				case REPEAT_LAST_ELEMENT:
					j->tone_cadence_state--;
					ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
					break;
				case REPEAT_ALL:
					j->tone_cadence_state = 0;
					if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
						ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
						ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
						ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
						ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
						ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
						ixj_init_tone(j, &ti);
					}
					ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
					ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
					ixj_play_tone(j, j->cadence_t->ce[0].index);
					break;
				}
			} else {
				if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
					ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
					ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
					ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
					ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
					ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
					ixj_init_tone(j, &ti);
				}
				ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
				ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
				ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
			}
		}
	}
}

static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
{
	if(j->ixj_signals[event]) {
		if(ixjdebug & 0x0100)
			printk("Sending signal for event %d\n", event);
			/* Send apps notice of change */
		/* see config.h for macro definition */
		kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
	}
}

static void ixj_pstn_state(IXJ *j)
{
	int var;
	union XOPXR0 XR0, daaint;

	var = 10;

	XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
	daaint.reg = 0;
	XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;

	j->pld_scrr.byte = inb_p(j->XILINXbase);
	if (j->pld_scrr.bits.daaflag) {
		daa_int_read(j);
		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
			if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
				daaint.bitreg.RING = 1;
				if(ixjdebug & 0x0008) {
					printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
				}
			} else {
				daa_set_mode(j, SOP_PU_RESET);
			}
		}
		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
			daaint.bitreg.Caller_ID = 1;
			j->pstn_cid_intr = 1;
			j->pstn_cid_received = jiffies;
			if(ixjdebug & 0x0008) {
				printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
			}
		}
		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
			daaint.bitreg.Cadence = 1;
			if(ixjdebug & 0x0008) {
				printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
			}
		}
		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
			daaint.bitreg.VDD_OK = 1;
			daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
		}
	}
	daa_CR_read(j, 1);
	if(j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR != XR0.bitreg.RMR && time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
		daaint.bitreg.RMR = 1;
		daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
		if(ixjdebug & 0x0008) {
                        printk(KERN_INFO "IXJ DAA RMR /dev/phone%d was %s for %ld\n", j->board, XR0.bitreg.RMR?"on":"off", jiffies - j->pstn_last_rmr);
		}
		j->pstn_prev_rmr = j->pstn_last_rmr;
		j->pstn_last_rmr = jiffies;
	}
	switch(j->daa_mode) {
		case SOP_PU_SLEEP:
			if (daaint.bitreg.RING) {
				if (!j->flags.pstn_ringing) {
					if (j->daa_mode != SOP_PU_RINGING) {
						j->pstn_ring_int = jiffies;
						daa_set_mode(j, SOP_PU_RINGING);
					}
				}
			}
			break;
		case SOP_PU_RINGING:
			if (daaint.bitreg.RMR) {
				if (ixjdebug & 0x0008) {
					printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
				}
				if (daaint.bitreg.SI_1) {                /* Rising edge of RMR */
					j->flags.pstn_rmr = 1;
					j->pstn_ring_start = jiffies;
					j->pstn_ring_stop = 0;
					j->ex.bits.pstn_ring = 0;
					if (j->cadence_f[4].state == 0) {
						j->cadence_f[4].state = 1;
						j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
						j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
						j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
					} else if (j->cadence_f[4].state == 2) {
						if((time_after(jiffies, j->cadence_f[4].off1min) &&
						    time_before(jiffies, j->cadence_f[4].off1max))) {
							if (j->cadence_f[4].on2) {
								j->cadence_f[4].state = 3;
								j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
								j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
								j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
							} else {
								j->cadence_f[4].state = 7;
							}
						} else {
							if (ixjdebug & 0x0008) {
								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
										j->cadence_f[4].off1);
							}
							j->cadence_f[4].state = 0;
						}
					} else if (j->cadence_f[4].state == 4) {
						if((time_after(jiffies, j->cadence_f[4].off2min) &&
						    time_before(jiffies, j->cadence_f[4].off2max))) {
							if (j->cadence_f[4].on3) {
								j->cadence_f[4].state = 5;
								j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
								j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
								j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
							} else {
								j->cadence_f[4].state = 7;
							}
						} else {
							if (ixjdebug & 0x0008) {
								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
										j->cadence_f[4].off2);
							}
							j->cadence_f[4].state = 0;
						}
					} else if (j->cadence_f[4].state == 6) {
						if((time_after(jiffies, j->cadence_f[4].off3min) &&
						    time_before(jiffies, j->cadence_f[4].off3max))) {
							j->cadence_f[4].state = 7;
						} else {
							if (ixjdebug & 0x0008) {
								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
										j->cadence_f[4].off3);
							}
							j->cadence_f[4].state = 0;
						}
					} else {
						j->cadence_f[4].state = 0;
					}
				} else {                                /* Falling edge of RMR */
					j->pstn_ring_start = 0;
					j->pstn_ring_stop = jiffies;
					if (j->cadence_f[4].state == 1) {
						if(!j->cadence_f[4].on1) {
							j->cadence_f[4].state = 7;
						} else if((time_after(jiffies, j->cadence_f[4].on1min) &&
					          time_before(jiffies, j->cadence_f[4].on1max))) {
							if (j->cadence_f[4].off1) {
								j->cadence_f[4].state = 2;
								j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
								j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
								j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
							} else {
								j->cadence_f[4].state = 7;
							}
						} else {
							if (ixjdebug & 0x0008) {
								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
										j->cadence_f[4].on1);
							}
							j->cadence_f[4].state = 0;
						}
					} else if (j->cadence_f[4].state == 3) {
						if((time_after(jiffies, j->cadence_f[4].on2min) &&
						    time_before(jiffies, j->cadence_f[4].on2max))) {
							if (j->cadence_f[4].off2) {
								j->cadence_f[4].state = 4;
								j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
								j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
								j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
							} else {
								j->cadence_f[4].state = 7;
							}
						} else {
							if (ixjdebug & 0x0008) {
								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
										j->cadence_f[4].on2);
							}
							j->cadence_f[4].state = 0;
						}
					} else if (j->cadence_f[4].state == 5) {
						if((time_after(jiffies, j->cadence_f[4].on3min) &&
						    time_before(jiffies, j->cadence_f[4].on3max))) {
							if (j->cadence_f[4].off3) {
								j->cadence_f[4].state = 6;
								j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
								j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
								j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
							} else {
								j->cadence_f[4].state = 7;
							}
						} else {
							j->cadence_f[4].state = 0;
						}
					} else {
						if (ixjdebug & 0x0008) {
							printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
									j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
									j->cadence_f[4].on3);
						}
						j->cadence_f[4].state = 0;
					}
				}
				if (ixjdebug & 0x0010) {
					printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
				}
				if (ixjdebug & 0x0010) {
					switch(j->cadence_f[4].state) {
						case 1:
							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
						j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
							break;
						case 2:
							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
						j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
							break;
						case 3:
							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
						j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
							break;
						case 4:
							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
						j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
							break;
						case 5:
							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
						j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
							break;
						case 6:	
							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
						j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
							break;
					}
				}
			}
			if (j->cadence_f[4].state == 7) {
				j->cadence_f[4].state = 0;
				j->pstn_ring_stop = jiffies;
				j->ex.bits.pstn_ring = 1;
				ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
				if(ixjdebug & 0x0008) {
					printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
				}
			}
			if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
			   (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
				if(ixjdebug & 0x0008) {
					printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
					printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
					printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
				}
				j->pstn_ring_stop = j->pstn_ring_int = 0;
				daa_set_mode(j, SOP_PU_SLEEP);
			} 
			outb_p(j->pld_scrw.byte, j->XILINXbase);
			if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
				ixj_daa_cid_read(j);
				j->ex.bits.caller_id = 1;
				ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
				j->pstn_cid_intr = 0;
			}
			if (daaint.bitreg.Cadence) {
				if(ixjdebug & 0x0008) {
					printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
				}
				daa_set_mode(j, SOP_PU_SLEEP);
				j->ex.bits.pstn_ring = 0;
			}
			break;
		case SOP_PU_CONVERSATION:
			if (daaint.bitreg.VDD_OK) {
				if(!daaint.bitreg.SI_0) {
					if (!j->pstn_winkstart) {
						if(ixjdebug & 0x0008) {
							printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
						}
						j->pstn_winkstart = jiffies;
					} 
				} else {
					if (j->pstn_winkstart) {
						if(ixjdebug & 0x0008) {
							printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
						}
						j->pstn_winkstart = 0;
					}
				}
			}
			if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
				if(ixjdebug & 0x0008) {
					printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
				}
				daa_set_mode(j, SOP_PU_SLEEP);
				j->pstn_winkstart = 0;
				j->ex.bits.pstn_wink = 1;
				ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
			}
			break;
	}
}

static void ixj_timeout(unsigned long ptr)
{
	int board;
	unsigned long jifon;
	IXJ *j = (IXJ *)ptr;
	board = j->board;

	if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
		ixj_perfmon(j->timerchecks);
		j->hookstate = ixj_hookstate(j);
		if (j->tone_state) {
			if (!(j->hookstate)) {
				ixj_cpt_stop(j);
				if (j->m_hook) {
					j->m_hook = 0;
					j->ex.bits.hookstate = 1;
					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
				}
				clear_bit(board, &j->busyflags);
				ixj_add_timer(j);
				return;
			}
			if (j->tone_state == 1)
				jifon = ((hertz * j->tone_on_time) * 25 / 100000);
			else
				jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
			if (time_before(jiffies, j->tone_start_jif + jifon)) {
				if (j->tone_state == 1) {
					ixj_play_tone(j, j->tone_index);
					if (j->dsp.low == 0x20) {
						clear_bit(board, &j->busyflags);
						ixj_add_timer(j);
						return;
					}
				} else {
					ixj_play_tone(j, 0);
					if (j->dsp.low == 0x20) {
						clear_bit(board, &j->busyflags);
						ixj_add_timer(j);
						return;
					}
				}
			} else {
				ixj_tone_timeout(j);
				if (j->flags.dialtone) {
					ixj_dialtone(j);
				}
				if (j->flags.busytone) {
					ixj_busytone(j);
					if (j->dsp.low == 0x20) {
						clear_bit(board, &j->busyflags);
						ixj_add_timer(j);
						return;
					}
				}
				if (j->flags.ringback) {
					ixj_ringback(j);
					if (j->dsp.low == 0x20) {
						clear_bit(board, &j->busyflags);
						ixj_add_timer(j);
						return;
					}
				}
				if (!j->tone_state) {
					ixj_cpt_stop(j);
				}
			}
		}
		if (!(j->tone_state && j->dsp.low == 0x20)) {
			if (IsRxReady(j)) {
				ixj_read_frame(j);
			}
			if (IsTxReady(j)) {
				ixj_write_frame(j);
			}
		}
		if (j->flags.cringing) {
			if (j->hookstate & 1) {
				j->flags.cringing = 0;
				ixj_ring_off(j);
			} else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
				switch(j->cadence_f[5].state) {
					case 0:
						j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
						if (time_before(jiffies, j->cadence_f[5].on1dot)) {
							if(ixjdebug & 0x0004) {
								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
							}
							ixj_ring_on(j);
						}
						j->cadence_f[5].state = 1;
						break;
					case 1:
						if (time_after(jiffies, j->cadence_f[5].on1dot)) {
							j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
							if(ixjdebug & 0x0004) {
								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
							}
							ixj_ring_off(j);
							j->cadence_f[5].state = 2;
						}
						break;
					case 2:
						if (time_after(jiffies, j->cadence_f[5].off1dot)) {
							if(ixjdebug & 0x0004) {
								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
							}
							ixj_ring_on(j);
							if (j->cadence_f[5].on2) {
								j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
								j->cadence_f[5].state = 3;
							} else {
								j->cadence_f[5].state = 7;
							}
						}
						break;
					case 3:
						if (time_after(jiffies, j->cadence_f[5].on2dot)) {
							if(ixjdebug & 0x0004) {
								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
							}
							ixj_ring_off(j);
							if (j->cadence_f[5].off2) {
								j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
								j->cadence_f[5].state = 4;
							} else {
								j->cadence_f[5].state = 7;
							}
						}
						break;
					case 4:
						if (time_after(jiffies, j->cadence_f[5].off2dot)) {
							if(ixjdebug & 0x0004) {
								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
							}
							ixj_ring_on(j);
							if (j->cadence_f[5].on3) {
								j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
								j->cadence_f[5].state = 5;
							} else {
								j->cadence_f[5].state = 7;
							}
						}
						break;
					case 5:
						if (time_after(jiffies, j->cadence_f[5].on3dot)) {
							if(ixjdebug & 0x0004) {
								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
							}
							ixj_ring_off(j);
							if (j->cadence_f[5].off3) {
								j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
								j->cadence_f[5].state = 6;
							} else {
								j->cadence_f[5].state = 7;
							}
						}
						break;
					case 6:
						if (time_after(jiffies, j->cadence_f[5].off3dot)) {
							if(ixjdebug & 0x0004) {
								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
							}
							j->cadence_f[5].state = 7;
						}
						break;
					case 7:
						if(ixjdebug & 0x0004) {
							printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
						}
						j->flags.cidring = 1;
						j->cadence_f[5].state = 0;
						break;
				}
				if (j->flags.cidring && !j->flags.cidsent) {
					j->flags.cidsent = 1;
					if(j->fskdcnt) {
						SLIC_SetState(PLD_SLIC_STATE_OHT, j);
						ixj_pre_cid(j);
					}
					j->flags.cidring = 0;
				}
				clear_bit(board, &j->busyflags);
				ixj_add_timer(j);
				return;
			} else {
				if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
					if (j->flags.cidring && !j->flags.cidsent) {
						j->flags.cidsent = 1;
						if(j->fskdcnt) {
							SLIC_SetState(PLD_SLIC_STATE_OHT, j);
							ixj_pre_cid(j);
						}
						j->flags.cidring = 0;
					}
					j->ring_cadence_t--;
					if (j->ring_cadence_t == -1)
						j->ring_cadence_t = 15;
					j->ring_cadence_jif = jiffies;

					if (j->ring_cadence & 1 << j->ring_cadence_t) {
						if(j->flags.cidsent && j->cadence_f[5].en_filter)
							j->flags.firstring = 1;
						else
							ixj_ring_on(j);
					} else {
						ixj_ring_off(j);
						if(!j->flags.cidsent)
							j->flags.cidring = 1;
					}
				}
				clear_bit(board, &j->busyflags);
				ixj_add_timer(j);
				return;
			}
		}
		if (!j->flags.ringing) {
			if (j->hookstate) { /* & 1) { */
				if (j->dsp.low != 0x20 &&
				    SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
					SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
				}
				LineMonitor(j);
				read_filters(j);
				ixj_WriteDSPCommand(0x511B, j);
				j->proc_load = j->ssr.high << 8 | j->ssr.low;
				if (!j->m_hook && (j->hookstate & 1)) {
					j->m_hook = j->ex.bits.hookstate = 1;
					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
				}
			} else {
				if (j->ex.bits.dtmf_ready) {
					j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
				}
				if (j->m_hook) {
					j->m_hook = 0;
					j->ex.bits.hookstate = 1;
					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
				}
			}
		}
		if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
			ixj_pstn_state(j);
		}
		if (j->ex.bytes) {
			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
		}
		clear_bit(board, &j->busyflags);
	}
	ixj_add_timer(j);
}

static int ixj_status_wait(IXJ *j)
{
	unsigned long jif;

	jif = jiffies + ((60 * hertz) / 100);
	while (!IsStatusReady(j)) {
		ixj_perfmon(j->statuswait);
		if (time_after(jiffies, jif)) {
			ixj_perfmon(j->statuswaitfail);
			return -1;
		}
	}
	return 0;
}

static int ixj_PCcontrol_wait(IXJ *j)
{
	unsigned long jif;

	jif = jiffies + ((60 * hertz) / 100);
	while (!IsPCControlReady(j)) {
		ixj_perfmon(j->pcontrolwait);
		if (time_after(jiffies, jif)) {
			ixj_perfmon(j->pcontrolwaitfail);
			return -1;
		}
	}
	return 0;
}

static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
{
	BYTES bytes;
	unsigned long jif;

	atomic_inc(&j->DSPWrite);
	if(atomic_read(&j->DSPWrite) > 1) {
		printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
		return -1;
	}
	bytes.high = (cmd & 0xFF00) >> 8;
	bytes.low = cmd & 0x00FF;
	jif = jiffies + ((60 * hertz) / 100);
	while (!IsControlReady(j)) {
		ixj_perfmon(j->iscontrolready);
		if (time_after(jiffies, jif)) {
			ixj_perfmon(j->iscontrolreadyfail);
			atomic_dec(&j->DSPWrite);
			if(atomic_read(&j->DSPWrite) > 0) {
				printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
				while(atomic_read(&j->DSPWrite) > 0) {
					atomic_dec(&j->DSPWrite);
				}
			}
			return -1;
		}
	}
	outb(bytes.low, j->DSPbase + 6);
	outb(bytes.high, j->DSPbase + 7);

	if (ixj_status_wait(j)) {
		j->ssr.low = 0xFF;
		j->ssr.high = 0xFF;
		atomic_dec(&j->DSPWrite);
		if(atomic_read(&j->DSPWrite) > 0) {
			printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
			while(atomic_read(&j->DSPWrite) > 0) {
				atomic_dec(&j->DSPWrite);
			}
		}
		return -1;
	}
/* Read Software Status Register */
	j->ssr.low = inb_p(j->DSPbase + 2);
	j->ssr.high = inb_p(j->DSPbase + 3);
	atomic_dec(&j->DSPWrite);
	if(atomic_read(&j->DSPWrite) > 0) {
		printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
		while(atomic_read(&j->DSPWrite) > 0) {
			atomic_dec(&j->DSPWrite);
		}
	}
	return 0;
}

/***************************************************************************
*
*  General Purpose IO Register read routine
*
***************************************************************************/
static inline int ixj_gpio_read(IXJ *j)
{
	if (ixj_WriteDSPCommand(0x5143, j))
		return -1;

	j->gpio.bytes.low = j->ssr.low;
	j->gpio.bytes.high = j->ssr.high;

	return 0;
}

static inline void LED_SetState(int state, IXJ *j)
{
	if (j->cardtype == QTI_LINEJACK) {
		j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
		j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
		j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
		j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;

		outb(j->pld_scrw.byte, j->XILINXbase);
	}
}

/*********************************************************************
*  GPIO Pins are configured as follows on the Quicknet Internet
*  PhoneJACK Telephony Cards
* 
* POTS Select        GPIO_6=0 GPIO_7=0
* Mic/Speaker Select GPIO_6=0 GPIO_7=1
* Handset Select     GPIO_6=1 GPIO_7=0
*
* SLIC Active        GPIO_1=0 GPIO_2=1 GPIO_5=0
* SLIC Ringing       GPIO_1=1 GPIO_2=1 GPIO_5=0
* SLIC Open Circuit  GPIO_1=0 GPIO_2=0 GPIO_5=0
*
* Hook Switch changes reported on GPIO_3
*********************************************************************/
static int ixj_set_port(IXJ *j, int arg)
{
	if (j->cardtype == QTI_PHONEJACK_LITE) {
		if (arg != PORT_POTS)
			return 10;
		else
			return 0;
	}
	switch (arg) {
	case PORT_POTS:
		j->port = PORT_POTS;
		switch (j->cardtype) {
		case QTI_PHONECARD:
			if (j->flags.pcmciasct == 1)
				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
			else
				return 11;
			break;
		case QTI_PHONEJACK_PCI:
			j->pld_slicw.pcib.mic = 0;
			j->pld_slicw.pcib.spk = 0;
			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
			break;
		case QTI_LINEJACK:
			ixj_set_pots(j, 0);			/* Disconnect POTS/PSTN relay */
			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to
									   Software Control Register */
				return 2;
			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */

			outb(j->pld_scrw.byte, j->XILINXbase);
			j->pld_clock.byte = 0;
			outb(j->pld_clock.byte, j->XILINXbase + 0x04);
			j->pld_slicw.bits.rly1 = 1;
			j->pld_slicw.bits.spken = 0;
			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
			ixj_mixer(0x1200, j);	/* Turn Off MIC switch on mixer left */
			ixj_mixer(0x1401, j);	/* Turn On Mono1 switch on mixer left */
			ixj_mixer(0x1300, j);       /* Turn Off MIC switch on mixer right */
			ixj_mixer(0x1501, j);       /* Turn On Mono1 switch on mixer right */
			ixj_mixer(0x0E80, j);	/*Mic mute */
			ixj_mixer(0x0F00, j);	/* Set mono out (SLIC) to 0dB */
			ixj_mixer(0x0080, j);	/* Mute Master Left volume */
			ixj_mixer(0x0180, j);	/* Mute Master Right volume */
			SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
/*			SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
			break;
		case QTI_PHONEJACK:
			j->gpio.bytes.high = 0x0B;
			j->gpio.bits.gpio6 = 0;
			j->gpio.bits.gpio7 = 0;
			ixj_WriteDSPCommand(j->gpio.word, j);
			break;
		}
		break;
	case PORT_PSTN:
		if (j->cardtype == QTI_LINEJACK) {
			ixj_WriteDSPCommand(0xC534, j);	/* Write CODEC config to Software Control Register */

			j->pld_slicw.bits.rly3 = 0;
			j->pld_slicw.bits.rly1 = 1;
			j->pld_slicw.bits.spken = 0;
			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
			j->port = PORT_PSTN;
		} else {
			return 4;
		}
		break;
	case PORT_SPEAKER:
		j->port = PORT_SPEAKER;
		switch (j->cardtype) {
		case QTI_PHONECARD:
			if (j->flags.pcmciasct) {
				SLIC_SetState(PLD_SLIC_STATE_OC, j);
			}
			break;
		case QTI_PHONEJACK_PCI:
			j->pld_slicw.pcib.mic = 1;
			j->pld_slicw.pcib.spk = 1;
			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
			break;
		case QTI_LINEJACK:
			ixj_set_pots(j, 0);			/* Disconnect POTS/PSTN relay */
			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to
									   Software Control Register */
				return 2;
			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */

			outb(j->pld_scrw.byte, j->XILINXbase);
			j->pld_clock.byte = 0;
			outb(j->pld_clock.byte, j->XILINXbase + 0x04);
			j->pld_slicw.bits.rly1 = 1;
			j->pld_slicw.bits.spken = 1;
			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
			ixj_mixer(0x1201, j);	/* Turn On MIC switch on mixer left */
			ixj_mixer(0x1400, j);	/* Turn Off Mono1 switch on mixer left */
			ixj_mixer(0x1301, j);       /* Turn On MIC switch on mixer right */
			ixj_mixer(0x1500, j);       /* Turn Off Mono1 switch on mixer right */
			ixj_mixer(0x0E06, j);	/*Mic un-mute 0dB */
			ixj_mixer(0x0F80, j);	/* Mute mono out (SLIC) */
			ixj_mixer(0x0000, j);	/* Set Master Left volume to 0dB */
			ixj_mixer(0x0100, j);	/* Set Master Right volume to 0dB */
			break;
		case QTI_PHONEJACK:
			j->gpio.bytes.high = 0x0B;
			j->gpio.bits.gpio6 = 0;
			j->gpio.bits.gpio7 = 1;
			ixj_WriteDSPCommand(j->gpio.word, j);
			break;
		}
		break;
	case PORT_HANDSET:
		if (j->cardtype != QTI_PHONEJACK) {
			return 5;
		} else {
			j->gpio.bytes.high = 0x0B;
			j->gpio.bits.gpio6 = 1;
			j->gpio.bits.gpio7 = 0;
			ixj_WriteDSPCommand(j->gpio.word, j);
			j->port = PORT_HANDSET;
		}
		break;
	default:
		return 6;
		break;
	}
	return 0;
}

static int ixj_set_pots(IXJ *j, int arg)
{
	if (j->cardtype == QTI_LINEJACK) {
		if (arg) {
			if (j->port == PORT_PSTN) {
				j->pld_slicw.bits.rly1 = 0;
				outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
				j->flags.pots_pstn = 1;
				return 1;
			} else {
				j->flags.pots_pstn = 0;
				return 0;
			}
		} else {
			j->pld_slicw.bits.rly1 = 1;
			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
			j->flags.pots_pstn = 0;
			return 1;
		}
	} else {
		return 0;
	}
}

static void ixj_ring_on(IXJ *j)
{
	if (j->dsp.low == 0x20)	/* Internet PhoneJACK */
	 {
		if (ixjdebug & 0x0004)
			printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", 	j->board);

		j->gpio.bytes.high = 0x0B;
		j->gpio.bytes.low = 0x00;
		j->gpio.bits.gpio1 = 1;
		j->gpio.bits.gpio2 = 1;
		j->gpio.bits.gpio5 = 0;
		ixj_WriteDSPCommand(j->gpio.word, j);	/* send the ring signal */
	} else			/* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
	{
		if (ixjdebug & 0x0004)
			printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);

		SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
	}
}

static int ixj_siadc(IXJ *j, int val)
{
	if(j->cardtype == QTI_PHONECARD){
		if(j->flags.pcmciascp){
			if(val == -1)
				return j->siadc.bits.rxg;

			if(val < 0 || val > 0x1F)
				return -1;

			j->siadc.bits.hom = 0;				/* Handset Out Mute */
			j->siadc.bits.lom = 0;				/* Line Out Mute */
			j->siadc.bits.rxg = val;			/*(0xC000 - 0x41C8) / 0x4EF;    RX PGA Gain */
			j->psccr.bits.addr = 6;				/* R/W Smart Cable Register Address */
			j->psccr.bits.rw = 0;				/* Read / Write flag */
			j->psccr.bits.dev = 0;
			outb(j->siadc.byte, j->XILINXbase + 0x00);
			outb(j->psccr.byte, j->XILINXbase + 0x01);
			ixj_PCcontrol_wait(j);
			return j->siadc.bits.rxg;
		}
	}
	return -1;
}

static int ixj_sidac(IXJ *j, int val)
{
	if(j->cardtype == QTI_PHONECARD){
		if(j->flags.pcmciascp){
			if(val == -1)
				return j->sidac.bits.txg;

			if(val < 0 || val > 0x1F)
				return -1;

			j->sidac.bits.srm = 1;				/* Speaker Right Mute */
			j->sidac.bits.slm = 1;				/* Speaker Left Mute */
			j->sidac.bits.txg = val;			/* (0xC000 - 0x45E4) / 0x5D3;	 TX PGA Gain */
			j->psccr.bits.addr = 7;				/* R/W Smart Cable Register Address */
			j->psccr.bits.rw = 0;				/* Read / Write flag */
			j->psccr.bits.dev = 0;
			outb(j->sidac.byte, j->XILINXbase + 0x00);
			outb(j->psccr.byte, j->XILINXbase + 0x01);
			ixj_PCcontrol_wait(j);
			return j->sidac.bits.txg;
		}
	}
	return -1;
}

static int ixj_pcmcia_cable_check(IXJ *j)
{
	j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
	if (!j->flags.pcmciastate) {
		j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
		if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
			j->flags.pcmciastate = 4;
			return 0;
		}
		if (j->pccr1.bits.ed) {
			j->pccr1.bits.ed = 0;
			j->psccr.bits.dev = 3;
			j->psccr.bits.rw = 1;
			outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
			ixj_PCcontrol_wait(j);
			j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
			j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
			j->psccr.bits.dev = 3;
			j->psccr.bits.rw = 0;
			outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
			ixj_PCcontrol_wait(j);
			return j->pslic.bits.led2 ? 1 : 0;
		} else if (j->flags.pcmciasct) {
			return j->r_hook;
		} else {
			return 1;
		}
	} else if (j->flags.pcmciastate == 4) {
		if (!j->pccr1.bits.drf) {
			j->flags.pcmciastate = 3;
		}
		return 0;
	} else if (j->flags.pcmciastate == 3) {
		j->pccr2.bits.pwr = 0;
		j->pccr2.bits.rstc = 1;
		outb(j->pccr2.byte, j->XILINXbase + 0x02);
		j->checkwait = jiffies + (hertz * 2);
		j->flags.incheck = 1;
		j->flags.pcmciastate = 2;
		return 0;
	} else if (j->flags.pcmciastate == 2) {
		if (j->flags.incheck) {
			if (time_before(jiffies, j->checkwait)) {
				return 0;
			} else {
				j->flags.incheck = 0;
			}
		}
		j->pccr2.bits.pwr = 0;
		j->pccr2.bits.rstc = 0;
		outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
		j->flags.pcmciastate = 1;
		return 0;
	} else if (j->flags.pcmciastate == 1) {
		j->flags.pcmciastate = 0;
		if (!j->pccr1.bits.drf) {
			j->psccr.bits.dev = 3;
			j->psccr.bits.rw = 1;
			outb_p(j->psccr.byte, j->XILINXbase + 0x01);
			ixj_PCcontrol_wait(j);
			j->flags.pcmciascp = 1;		/* Set Cable Present Flag */

			j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03;		/* Get Cable Type */

			if (j->flags.pcmciasct == 3) {
				j->flags.pcmciastate = 4;
				return 0;
			} else if (j->flags.pcmciasct == 0) {
				j->pccr2.bits.pwr = 1;
				j->pccr2.bits.rstc = 0;
				outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
				j->port = PORT_SPEAKER;
			} else {
				j->port = PORT_POTS;
			}
			j->sic1.bits.cpd = 0;				/* Chip Power Down */
			j->sic1.bits.mpd = 0;				/* MIC Bias Power Down */
			j->sic1.bits.hpd = 0;				/* Handset Bias Power Down */
			j->sic1.bits.lpd = 0;				/* Line Bias Power Down */
			j->sic1.bits.spd = 1;				/* Speaker Drive Power Down */
			j->psccr.bits.addr = 1;				/* R/W Smart Cable Register Address */
			j->psccr.bits.rw = 0;				/* Read / Write flag */
			j->psccr.bits.dev = 0;
			outb(j->sic1.byte, j->XILINXbase + 0x00);
			outb(j->psccr.byte, j->XILINXbase + 0x01);
			ixj_PCcontrol_wait(j);

			j->sic2.bits.al = 0;				/* Analog Loopback DAC analog -> ADC analog */
			j->sic2.bits.dl2 = 0;				/* Digital Loopback DAC -> ADC one bit */
			j->sic2.bits.dl1 = 0;				/* Digital Loopback ADC -> DAC one bit */
			j->sic2.bits.pll = 0;				/* 1 = div 10, 0 = div 5 */
			j->sic2.bits.hpd = 0;				/* HPF disable */
			j->psccr.bits.addr = 2;				/* R/W Smart Cable Register Address */
			j->psccr.bits.rw = 0;				/* Read / Write flag */
			j->psccr.bits.dev = 0;
			outb(j->sic2.byte, j->XILINXbase + 0x00);
			outb(j->psccr.byte, j->XILINXbase + 0x01);
			ixj_PCcontrol_wait(j);

			j->psccr.bits.addr = 3;				/* R/W Smart Cable Register Address */
			j->psccr.bits.rw = 0;				/* Read / Write flag */
			j->psccr.bits.dev = 0;
			outb(0x00, j->XILINXbase + 0x00);		/* PLL Divide N1 */
			outb(j->psccr.byte, j->XILINXbase + 0x01);
			ixj_PCcontrol_wait(j);

			j->psccr.bits.addr = 4;				/* R/W Smart Cable Register Address */
			j->psccr.bits.rw = 0;				/* Read / Write flag */
			j->psccr.bits.dev = 0;
			outb(0x09, j->XILINXbase + 0x00);		/* PLL Multiply M1 */
			outb(j->psccr.byte, j->XILINXbase + 0x01);
			ixj_PCcontrol_wait(j);

			j->sirxg.bits.lig = 1;				/* Line In Gain */
			j->sirxg.bits.lim = 1;				/* Line In Mute */
			j->sirxg.bits.mcg = 0;				/* MIC In Gain was 3 */
			j->sirxg.bits.mcm = 0;				/* MIC In Mute */
			j->sirxg.bits.him = 0;				/* Handset In Mute */
			j->sirxg.bits.iir = 1;				/* IIR */
			j->psccr.bits.addr = 5;				/* R/W Smart Cable Register Address */
			j->psccr.bits.rw = 0;				/* Read / Write flag */
			j->psccr.bits.dev = 0;
			outb(j->sirxg.byte, j->XILINXbase + 0x00);
			outb(j->psccr.byte, j->XILINXbase + 0x01);
			ixj_PCcontrol_wait(j);

			ixj_siadc(j, 0x17);
			ixj_sidac(j, 0x1D);

			j->siaatt.bits.sot = 0;
			j->psccr.bits.addr = 9;				/* R/W Smart Cable Register Address */
			j->psccr.bits.rw = 0;				/* Read / Write flag */
			j->psccr.bits.dev = 0;
			outb(j->siaatt.byte, j->XILINXbase + 0x00);
			outb(j->psccr.byte, j->XILINXbase + 0x01);
			ixj_PCcontrol_wait(j);

			if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
				j->psccr.byte = j->pslic.byte = 0;
				j->pslic.bits.powerdown = 1;
				j->psccr.bits.dev = 3;
				j->psccr.bits.rw = 0;
				outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
				ixj_PCcontrol_wait(j);
			}
		}
		return 0;
	} else {
		j->flags.pcmciascp = 0;
		return 0;
	}
	return 0;
}

static int ixj_hookstate(IXJ *j)
{
	unsigned long det;
	int fOffHook = 0;

	switch (j->cardtype) {
	case QTI_PHONEJACK:
		ixj_gpio_read(j);
		fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
		break;
	case QTI_LINEJACK:
	case QTI_PHONEJACK_LITE:
	case QTI_PHONEJACK_PCI:
		SLIC_GetState(j);
		if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
			fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
			if(fOffHook != j->p_hook) {
				if(!j->checkwait) {
					j->checkwait = jiffies;
				} 
				if(time_before(jiffies, j->checkwait + 2)) {
					fOffHook ^= 1;
				} else {
					j->checkwait = 0;
				}
				j->p_hook = fOffHook;
	 			printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
			}
		} else {
			if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
			    j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
				if (j->flags.ringing || j->flags.cringing) {
					if (!in_interrupt()) {
						det = jiffies + (hertz / 50);
						while (time_before(jiffies, det)) {
							set_current_state(TASK_INTERRUPTIBLE);
							schedule_timeout(1);
						}
					}
					SLIC_GetState(j);
					if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
						ixj_ring_on(j);
					}
				}
				if (j->cardtype == QTI_PHONEJACK_PCI) {
					j->pld_scrr.byte = inb_p(j->XILINXbase);
					fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
				} else
					fOffHook = j->pld_slicr.bits.det ? 1 : 0;
			}
		}
		break;
	case QTI_PHONECARD:
		fOffHook = ixj_pcmcia_cable_check(j);
		break;
	}
	if (j->r_hook != fOffHook) {
		j->r_hook = fOffHook;
		if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
			j->ex.bits.hookstate = 1;
			ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
		} else if (!fOffHook) {
			j->flash_end = jiffies + ((60 * hertz) / 100);
		}
	}
	if (fOffHook) {
		if(time_before(jiffies, j->flash_end)) {
			j->ex.bits.flash = 1;
			j->flash_end = 0;
			ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
		}
	} else {
		if(time_before(jiffies, j->flash_end)) {
			fOffHook = 1;
		}
	}

	if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
		fOffHook |= 2;

	if (j->port == PORT_SPEAKER) {
		if(j->cardtype == QTI_PHONECARD) {
			if(j->flags.pcmciascp && j->flags.pcmciasct) {
				fOffHook |= 2;
			}
		} else {
			fOffHook |= 2;
		}
	}

	if (j->port == PORT_HANDSET)
		fOffHook |= 2;

	return fOffHook;
}

static void ixj_ring_off(IXJ *j)
{
	if (j->dsp.low == 0x20)	/* Internet PhoneJACK */
	 {
		if (ixjdebug & 0x0004)
			printk(KERN_INFO "IXJ Ring Off\n");
		j->gpio.bytes.high = 0x0B;
		j->gpio.bytes.low = 0x00;
		j->gpio.bits.gpio1 = 0;
		j->gpio.bits.gpio2 = 1;
		j->gpio.bits.gpio5 = 0;
		ixj_WriteDSPCommand(j->gpio.word, j);
	} else			/* Internet LineJACK */
	{
		if (ixjdebug & 0x0004)
			printk(KERN_INFO "IXJ Ring Off\n");

		if(!j->flags.cidplay)
			SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);

		SLIC_GetState(j);
	}
}

static void ixj_ring_start(IXJ *j)
{
	j->flags.cringing = 1;
	if (ixjdebug & 0x0004)
		printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
	if (ixj_hookstate(j) & 1) {
		if (j->port == PORT_POTS)
			ixj_ring_off(j);
		j->flags.cringing = 0;
		if (ixjdebug & 0x0004)
			printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
	} else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
		j->ring_cadence_jif = jiffies;
		j->flags.cidsent = j->flags.cidring = 0;
		j->cadence_f[5].state = 0;
		if(j->cadence_f[5].on1)
			ixj_ring_on(j);
	} else {
		j->ring_cadence_jif = jiffies;
		j->ring_cadence_t = 15;
		if (j->ring_cadence & 1 << j->ring_cadence_t) {
			ixj_ring_on(j);
		} else {
			ixj_ring_off(j);
		}
		j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
	}
}

static int ixj_ring(IXJ *j)
{
	char cntr;
	unsigned long jif, det;

	j->flags.ringing = 1;
	if (ixj_hookstate(j) & 1) {
		ixj_ring_off(j);
		j->flags.ringing = 0;
		return 1;
	}
	det = 0;
	for (cntr = 0; cntr < j->maxrings; cntr++) {
		jif = jiffies + (1 * hertz);
		ixj_ring_on(j);
		while (time_before(jiffies, jif)) {
			if (ixj_hookstate(j) & 1) {
				ixj_ring_off(j);
				j->flags.ringing = 0;
				return 1;
			}
			set_current_state(TASK_INTERRUPTIBLE);
			schedule_timeout(1);
			if (signal_pending(current))
				break;
		}
		jif = jiffies + (3 * hertz);
		ixj_ring_off(j);
		while (time_before(jiffies, jif)) {
			if (ixj_hookstate(j) & 1) {
				det = jiffies + (hertz / 100);
				while (time_before(jiffies, det)) {
					set_current_state(TASK_INTERRUPTIBLE);
					schedule_timeout(1);
					if (signal_pending(current))
						break;
				}
				if (ixj_hookstate(j) & 1) {
					j->flags.ringing = 0;
					return 1;
				}
			}
			set_current_state(TASK_INTERRUPTIBLE);
			schedule_timeout(1);
			if (signal_pending(current))
				break;
		}
	}
	ixj_ring_off(j);
	j->flags.ringing = 0;
	return 0;
}

static int ixj_open(struct phone_device *p, struct file *file_p)
{
	IXJ *j = get_ixj(p->board);
	file_p->private_data = j;

	if (!j->DSPbase)
		return -ENODEV;

        if (file_p->f_mode & FMODE_READ) {
		if(!j->readers) {
	                j->readers++;
        	} else {
                	return -EBUSY;
		}
        }

	if (file_p->f_mode & FMODE_WRITE) {
		if(!j->writers) {
			j->writers++;
		} else {
			if (file_p->f_mode & FMODE_READ){
				j->readers--;
			}
			return -EBUSY;
		}
	}

	if (j->cardtype == QTI_PHONECARD) {
		j->pslic.bits.powerdown = 0;
		j->psccr.bits.dev = 3;
		j->psccr.bits.rw = 0;
		outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
		ixj_PCcontrol_wait(j);
	}

	j->flags.cidplay = 0;
	j->flags.cidcw_ack = 0;

	if (ixjdebug & 0x0002)
		printk(KERN_INFO "Opening board %d\n", p->board);

	j->framesread = j->frameswritten = 0;
	return 0;
}

static int ixj_release(struct inode *inode, struct file *file_p)
{
	IXJ_TONE ti;
	int cnt;
	IXJ *j = file_p->private_data;
	int board = j->p.board;

	/*
	 *    Set up locks to ensure that only one process is talking to the DSP at a time.
	 *    This is necessary to keep the DSP from locking up.
	 */
	while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
		set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout(1);
	}
	if (ixjdebug & 0x0002)
		printk(KERN_INFO "Closing board %d\n", NUM(inode));

	if (j->cardtype == QTI_PHONECARD)
		ixj_set_port(j, PORT_SPEAKER);
	else
		ixj_set_port(j, PORT_POTS);

	aec_stop(j);
	ixj_play_stop(j);
	ixj_record_stop(j);
	set_play_volume(j, 0x100);
	set_rec_volume(j, 0x100);
	ixj_ring_off(j);

	/* Restore the tone table to default settings. */
	ti.tone_index = 10;
	ti.gain0 = 1;
	ti.freq0 = hz941;
	ti.gain1 = 0;
	ti.freq1 = hz1209;
	ixj_init_tone(j, &ti);
	ti.tone_index = 11;
	ti.gain0 = 1;
	ti.freq0 = hz941;
	ti.gain1 = 0;
	ti.freq1 = hz1336;
	ixj_init_tone(j, &ti);
	ti.tone_index = 12;
	ti.gain0 = 1;
	ti.freq0 = hz941;
	ti.gain1 = 0;
	ti.freq1 = hz1477;
	ixj_init_tone(j, &ti);
	ti.tone_index = 13;
	ti.gain0 = 1;
	ti.freq0 = hz800;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);
	ti.tone_index = 14;
	ti.gain0 = 1;
	ti.freq0 = hz1000;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);
	ti.tone_index = 15;
	ti.gain0 = 1;
	ti.freq0 = hz1250;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);
	ti.tone_index = 16;
	ti.gain0 = 1;
	ti.freq0 = hz950;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);
	ti.tone_index = 17;
	ti.gain0 = 1;
	ti.freq0 = hz1100;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);
	ti.tone_index = 18;
	ti.gain0 = 1;
	ti.freq0 = hz1400;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);
	ti.tone_index = 19;
	ti.gain0 = 1;
	ti.freq0 = hz1500;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);
	ti.tone_index = 20;
	ti.gain0 = 1;
	ti.freq0 = hz1600;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);
	ti.tone_index = 21;
	ti.gain0 = 1;
	ti.freq0 = hz1800;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);
	ti.tone_index = 22;
	ti.gain0 = 1;
	ti.freq0 = hz2100;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);
	ti.tone_index = 23;
	ti.gain0 = 1;
	ti.freq0 = hz1300;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);
	ti.tone_index = 24;
	ti.gain0 = 1;
	ti.freq0 = hz2450;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);
	ti.tone_index = 25;
	ti.gain0 = 1;
	ti.freq0 = hz350;
	ti.gain1 = 0;
	ti.freq1 = hz440;
	ixj_init_tone(j, &ti);
	ti.tone_index = 26;
	ti.gain0 = 1;
	ti.freq0 = hz440;
	ti.gain1 = 0;
	ti.freq1 = hz480;
	ixj_init_tone(j, &ti);
	ti.tone_index = 27;
	ti.gain0 = 1;
	ti.freq0 = hz480;
	ti.gain1 = 0;
	ti.freq1 = hz620;
	ixj_init_tone(j, &ti);

	set_rec_depth(j, 2);	/* Set Record Channel Limit to 2 frames */

	set_play_depth(j, 2);	/* Set Playback Channel Limit to 2 frames */

	j->ex.bits.dtmf_ready = 0;
	j->dtmf_state = 0;
	j->dtmf_wp = j->dtmf_rp = 0;
	j->rec_mode = j->play_mode = -1;
	j->flags.ringing = 0;
	j->maxrings = MAXRINGS;
	j->ring_cadence = USA_RING_CADENCE;
	if(j->cadence_f[5].enable) {
		j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
	}
	j->drybuffer = 0;
	j->winktime = 320;
	j->flags.dtmf_oob = 0;
	for (cnt = 0; cnt < 4; cnt++)
		j->cadence_f[cnt].enable = 0;

	idle(j);

	if(j->cardtype == QTI_PHONECARD) {
		SLIC_SetState(PLD_SLIC_STATE_OC, j);
	}

	if (file_p->f_mode & FMODE_READ)
		j->readers--;
	if (file_p->f_mode & FMODE_WRITE)
		j->writers--;

	if (j->read_buffer && !j->readers) {
		kfree(j->read_buffer);
		j->read_buffer = NULL;
		j->read_buffer_size = 0;
	}
	if (j->write_buffer && !j->writers) {
		kfree(j->write_buffer);
		j->write_buffer = NULL;
		j->write_buffer_size = 0;
	}
	j->rec_codec = j->play_codec = 0;
	j->rec_frame_size = j->play_frame_size = 0;
	j->flags.cidsent = j->flags.cidring = 0;
	ixj_fasync(-1, file_p, 0);	/* remove from list of async notification */

	if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
		ixj_set_port(j, PORT_PSTN);
		daa_set_mode(j, SOP_PU_SLEEP);
		ixj_set_pots(j, 1);
	}
	ixj_WriteDSPCommand(0x0FE3, j);	/* Put the DSP in 1/5 power mode. */

	/* Set up the default signals for events */
	for (cnt = 0; cnt < 35; cnt++)
		j->ixj_signals[cnt] = SIGIO;

	/* Set the excetion signal enable flags */
	j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring = 
	j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 = 
	j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1;

	file_p->private_data = NULL;
	clear_bit(board, &j->busyflags);
	return 0;
}

static int read_filters(IXJ *j)
{
	unsigned short fc, cnt, trg;
	int var;

	trg = 0;
	if (ixj_WriteDSPCommand(0x5144, j)) {
		if(ixjdebug & 0x0001) {
			printk(KERN_INFO "Read Frame Counter failed!\n");
		}
		return -1;
	}
	fc = j->ssr.high << 8 | j->ssr.low;
	if (fc == j->frame_count)
		return 1;

	j->frame_count = fc;

	if (j->dtmf_proc)
		return 1;

	var = 10;

	for (cnt = 0; cnt < 4; cnt++) {
		if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
			if(ixjdebug & 0x0001) {
				printk(KERN_INFO "Select Filter %d failed!\n", cnt);
			}
			return -1;
		}
		if (ixj_WriteDSPCommand(0x515C, j)) {
			if(ixjdebug & 0x0001) {
				printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
			}
			return -1;
		}
		j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;

		if (j->cadence_f[cnt].enable) {
			if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
				if (j->cadence_f[cnt].state == 0) {
					j->cadence_f[cnt].state = 1;
					j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
					j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
					j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
				} else if (j->cadence_f[cnt].state == 2 &&
					   (time_after(jiffies, j->cadence_f[cnt].off1min) &&
					    time_before(jiffies, j->cadence_f[cnt].off1max))) {
					if (j->cadence_f[cnt].on2) {
						j->cadence_f[cnt].state = 3;
						j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
						j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
						j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
					} else {
						j->cadence_f[cnt].state = 7;
					}
				} else if (j->cadence_f[cnt].state == 4 &&
					   (time_after(jiffies, j->cadence_f[cnt].off2min) &&
					    time_before(jiffies, j->cadence_f[cnt].off2max))) {
					if (j->cadence_f[cnt].on3) {
						j->cadence_f[cnt].state = 5;
						j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
						j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
						j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
					} else {
						j->cadence_f[cnt].state = 7;
					}
				} else {
					j->cadence_f[cnt].state = 0;
				}
			} else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
				if (j->cadence_f[cnt].state == 1) {
					if(!j->cadence_f[cnt].on1) {
						j->cadence_f[cnt].state = 7;
					} else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
					  time_before(jiffies, j->cadence_f[cnt].on1max))) {
						if(j->cadence_f[cnt].off1) {
							j->cadence_f[cnt].state = 2;
							j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
							j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
							j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
						} else {
							j->cadence_f[cnt].state = 7;
						}
					} else {
						j->cadence_f[cnt].state = 0;
					}
				} else if (j->cadence_f[cnt].state == 3) {
					if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
					    time_before(jiffies, j->cadence_f[cnt].on2max))) {
						if(j->cadence_f[cnt].off2) {
							j->cadence_f[cnt].state = 4;
							j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
							j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
							j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
						} else {
							j->cadence_f[cnt].state = 7;
						}
					} else {
						j->cadence_f[cnt].state = 0;
					}
				} else if (j->cadence_f[cnt].state == 5) {
					if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
					    time_before(jiffies, j->cadence_f[cnt].on3max))) {
						if(j->cadence_f[cnt].off3) {
							j->cadence_f[cnt].state = 6;
							j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
							j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
							j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
						} else {
							j->cadence_f[cnt].state = 7;
						}
					} else {
						j->cadence_f[cnt].state = 0;
					}
				} else {
					j->cadence_f[cnt].state = 0;
				}
			} else {
				switch(j->cadence_f[cnt].state) {
					case 1:
						if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
						   !j->cadence_f[cnt].off1 &&
						   !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
						   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
							j->cadence_f[cnt].state = 7;
						}
						break;
					case 3:
						if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
						   !j->cadence_f[cnt].off2 &&
						   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
							j->cadence_f[cnt].state = 7;
						}
						break;
					case 5:
						if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
						   !j->cadence_f[cnt].off3) {
							j->cadence_f[cnt].state = 7;
						}
						break;
				}
			}

			if (ixjdebug & 0x0040) {
				printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
				switch(j->cadence_f[cnt].state) {
					case 0:
						printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
						break;
					case 1:
						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
					j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
						break;
					case 2:
						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min, 
															j->cadence_f[cnt].off1max);
						break;
					case 3:
						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
															j->cadence_f[cnt].on2max);
						break;
					case 4:
						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
															j->cadence_f[cnt].off2max);
						break;
					case 5:
						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
															j->cadence_f[cnt].on3max);
						break;
					case 6:	
						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
															j->cadence_f[cnt].off3max);
						break;
				}
			} 
		}
		if (j->cadence_f[cnt].state == 7) {
			j->cadence_f[cnt].state = 0;
			if (j->cadence_f[cnt].enable == 1)
				j->cadence_f[cnt].enable = 0;
			switch (cnt) {
			case 0:
				if(ixjdebug & 0x0020) {
					printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
				}
				j->ex.bits.fc0 = 1;
				ixj_kill_fasync(j, SIG_FC0, POLL_IN);
				break;
			case 1:
				if(ixjdebug & 0x0020) {
					printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
				}
				j->ex.bits.fc1 = 1;
				ixj_kill_fasync(j, SIG_FC1, POLL_IN);
				break;
			case 2:
				if(ixjdebug & 0x0020) {
					printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
				}
				j->ex.bits.fc2 = 1;
				ixj_kill_fasync(j, SIG_FC2, POLL_IN);
				break;
			case 3:
				if(ixjdebug & 0x0020) {
					printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
				}
				j->ex.bits.fc3 = 1;
				ixj_kill_fasync(j, SIG_FC3, POLL_IN);
				break;
			}
		}
		if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
					  (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
			if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
				trg = 1;
			} else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
				trg = 0;
			}
			switch (cnt) {
			case 0:
				if(ixjdebug & 0x0020) {
					printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
				}
				j->ex.bits.f0 = 1;
				ixj_kill_fasync(j, SIG_F0, POLL_IN);
				break;
			case 1:
				if(ixjdebug & 0x0020) {
					printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
				}
				j->ex.bits.f1 = 1;
				ixj_kill_fasync(j, SIG_F1, POLL_IN);
				break;
			case 2:
				if(ixjdebug & 0x0020) {
					printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
				}
				j->ex.bits.f2 = 1;
				ixj_kill_fasync(j, SIG_F2, POLL_IN);
				break;
			case 3:
				if(ixjdebug & 0x0020) {
					printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
				}
				j->ex.bits.f3 = 1;
				ixj_kill_fasync(j, SIG_F3, POLL_IN);
				break;
			}
		}
	}
	return 0;
}

static int LineMonitor(IXJ *j)
{
	if (j->dtmf_proc) {
		return -1;
	}
	j->dtmf_proc = 1;

	if (ixj_WriteDSPCommand(0x7000, j))		/* Line Monitor */
		return -1;

	j->dtmf.bytes.high = j->ssr.high;
	j->dtmf.bytes.low = j->ssr.low;
	if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
		j->dtmf_state = 1;
		j->dtmf_current = j->dtmf.bits.digit;
	}
	if (j->dtmf_state && !j->dtmf.bits.dtmf_valid)	/* && j->dtmf_wp != j->dtmf_rp) */
	 {
		if(!j->cidcw_wait) {
			j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
			j->dtmf_wp++;
			if (j->dtmf_wp == 79)
				j->dtmf_wp = 0;
			j->ex.bits.dtmf_ready = 1;
			if(j->ex_sig.bits.dtmf_ready) {
				ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
			}
		}
		else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
			if(ixjdebug & 0x0020) {
				printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
			}
			j->flags.cidcw_ack = 1;
		}
		j->dtmf_state = 0;
	}
	j->dtmf_proc = 0;

	return 0;
}

/************************************************************************
*
* Functions to allow alaw <-> ulaw conversions.
*
************************************************************************/

static void ulaw2alaw(unsigned char *buff, unsigned long len)
{
	static unsigned char table_ulaw2alaw[] =
	{
		0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D, 
		0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25, 
		0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D, 
		0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35, 
		0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02, 
		0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A, 
		0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12, 
		0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B, 
		0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63, 
		0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79, 
		0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71, 
		0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D, 
		0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45, 
		0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D, 
		0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51, 
		0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5, 
		0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD, 
		0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5, 
		0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD, 
		0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5, 
		0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82, 
		0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A, 
		0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92, 
		0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB, 
		0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3, 
		0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9, 
		0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1, 
		0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD, 
		0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5, 
		0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD, 
		0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1, 
		0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
	};

	while (len--)
	{
		*buff = table_ulaw2alaw[*(unsigned char *)buff];
		buff++;
	}
}

static void alaw2ulaw(unsigned char *buff, unsigned long len)
{
	static unsigned char table_alaw2ulaw[] =
	{
		0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C, 
		0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24, 
		0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C, 
		0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34, 
		0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 
		0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 
		0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 
		0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 
		0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 
		0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E, 
		0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A, 
		0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 
		0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B, 
		0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43, 
		0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59, 
		0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51, 
		0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC, 
		0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4, 
		0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC, 
		0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4, 
		0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 
		0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 
		0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 
		0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 
		0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 
		0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE, 
		0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA, 
		0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 
		0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB, 
		0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3, 
		0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9, 
		0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
	};

        while (len--)
        {
                *buff = table_alaw2ulaw[*(unsigned char *)buff];
                buff++;
	}
}

static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos)
{
	unsigned long i = *ppos;
	IXJ * j = get_ixj(NUM(file_p->f_dentry->d_inode));

	DECLARE_WAITQUEUE(wait, current);

	if (j->flags.inread)
		return -EALREADY;

	j->flags.inread = 1;

	add_wait_queue(&j->read_q, &wait);
	set_current_state(TASK_INTERRUPTIBLE);
	mb();

	while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
		++j->read_wait;
		if (file_p->f_flags & O_NONBLOCK) {
			set_current_state(TASK_RUNNING);
			remove_wait_queue(&j->read_q, &wait);
			j->flags.inread = 0;
			return -EAGAIN;
		}
		if (!ixj_hookstate(j)) {
			set_current_state(TASK_RUNNING);
			remove_wait_queue(&j->read_q, &wait);
			j->flags.inread = 0;
			return 0;
		}
		interruptible_sleep_on(&j->read_q);
		if (signal_pending(current)) {
			set_current_state(TASK_RUNNING);
			remove_wait_queue(&j->read_q, &wait);
			j->flags.inread = 0;
			return -EINTR;
		}
	}

	remove_wait_queue(&j->read_q, &wait);
	set_current_state(TASK_RUNNING);
	/* Don't ever copy more than the user asks */
	if(j->rec_codec == ALAW)
		ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
	i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
	j->read_buffer_ready = 0;
	if (i) {
		j->flags.inread = 0;
		return -EFAULT;
	} else {
		j->flags.inread = 0;
		return min(length, j->read_buffer_size);
	}
}

static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length,
			  loff_t * ppos)
{
	int pre_retval;
	ssize_t read_retval = 0;
	IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));

	pre_retval = ixj_PreRead(j, 0L);
	switch (pre_retval) {
	case NORMAL:
		read_retval = ixj_read(file_p, buf, length, ppos);
		ixj_PostRead(j, 0L);
		break;
	case NOPOST:
		read_retval = ixj_read(file_p, buf, length, ppos);
		break;
	case POSTONLY:
		ixj_PostRead(j, 0L);
		break;
	default:
		read_retval = pre_retval;
	}
	return read_retval;
}

static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos)
{
	unsigned long i = *ppos;
	IXJ *j = file_p->private_data;

	DECLARE_WAITQUEUE(wait, current);

	if (j->flags.inwrite)
		return -EALREADY;

	j->flags.inwrite = 1;

	add_wait_queue(&j->write_q, &wait);
	set_current_state(TASK_INTERRUPTIBLE);
	mb();


	while (!j->write_buffers_empty) {
		++j->write_wait;
		if (file_p->f_flags & O_NONBLOCK) {
			set_current_state(TASK_RUNNING);
			remove_wait_queue(&j->write_q, &wait);
			j->flags.inwrite = 0;
			return -EAGAIN;
		}
		if (!ixj_hookstate(j)) {
			set_current_state(TASK_RUNNING);
			remove_wait_queue(&j->write_q, &wait);
			j->flags.inwrite = 0;
			return 0;
		}
		interruptible_sleep_on(&j->write_q);
		if (signal_pending(current)) {
			set_current_state(TASK_RUNNING);
			remove_wait_queue(&j->write_q, &wait);
			j->flags.inwrite = 0;
			return -EINTR;
		}
	}
	set_current_state(TASK_RUNNING);
	remove_wait_queue(&j->write_q, &wait);
	if (j->write_buffer_wp + count >= j->write_buffer_end)
		j->write_buffer_wp = j->write_buffer;
	i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
	if (i) {
		j->flags.inwrite = 0;
		return -EFAULT;
	}
       if(j->play_codec == ALAW)
               alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
	j->flags.inwrite = 0;
	return min(count, j->write_buffer_size);
}

static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos)
{
	int pre_retval;
	ssize_t write_retval = 0;

	IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));

	pre_retval = ixj_PreWrite(j, 0L);
	switch (pre_retval) {
	case NORMAL:
		write_retval = ixj_write(file_p, buf, count, ppos);
		if (write_retval > 0) {
			ixj_PostWrite(j, 0L);
			j->write_buffer_wp += write_retval;
			j->write_buffers_empty--;
		}
		break;
	case NOPOST:
		write_retval = ixj_write(file_p, buf, count, ppos);
		if (write_retval > 0) {
			j->write_buffer_wp += write_retval;
			j->write_buffers_empty--;
		}
		break;
	case POSTONLY:
		ixj_PostWrite(j, 0L);
		break;
	default:
		write_retval = pre_retval;
	}
	return write_retval;
}

static void ixj_read_frame(IXJ *j)
{
	int cnt, dly;

	if (j->read_buffer) {
		for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
			if (!(cnt % 16) && !IsRxReady(j)) {
				dly = 0;
				while (!IsRxReady(j)) {
					if (dly++ > 5) {
						dly = 0;
						break;
					}
					udelay(10);
				}
			}
			/* Throw away word 0 of the 8021 compressed format to get standard G.729. */
			if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
				inb_p(j->DSPbase + 0x0E);
				inb_p(j->DSPbase + 0x0F);
			}
			*(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
			*(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
		}
		++j->framesread;
		if (j->intercom != -1) {
			if (IsTxReady(get_ixj(j->intercom))) {
				for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
					if (!(cnt % 16) && !IsTxReady(j)) {
						dly = 0;
						while (!IsTxReady(j)) {
							if (dly++ > 5) {
								dly = 0;
								break;
							}
							udelay(10);
						}
					}
					outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
					outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
				}
				get_ixj(j->intercom)->frameswritten++;
			}
		} else {
			j->read_buffer_ready = 1;
			wake_up_interruptible(&j->read_q);	/* Wake any blocked readers */

			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */

			if(j->ixj_signals[SIG_READ_READY])
				ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
		}
	}
}

static short fsk[][6][20] =
{
	{
		{
			0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
			-16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
		},
		{
			-28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
			-32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
		},
		{
			-28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
			-16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
		},
		{
			0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
			16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
		},
		{
			28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
			32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
		},
		{
			28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
			16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
		}
	},
	{
		{
			0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
			0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
		},
		{
			-28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
			28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
		},
		{
			-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
			28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
		},
		{
			0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
			0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
		},
		{
			28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
			-28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
		},
		{
			28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
			-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
		}
	}
};


static void ixj_write_cid_bit(IXJ *j, int bit)
{
	while (j->fskcnt < 20) {
		if(j->fskdcnt < (j->fsksize - 1))
			j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];

		j->fskcnt += 3;
	}
	j->fskcnt %= 20;

	if (!bit)
		j->fskz++;
	if (j->fskz >= 6)
		j->fskz = 0;

}

static void ixj_write_cid_byte(IXJ *j, char byte)
{
	IXJ_CBYTE cb;

		cb.cbyte = byte;
		ixj_write_cid_bit(j, 0);
		ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
		ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
		ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
		ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
		ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
		ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
		ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
		ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
		ixj_write_cid_bit(j, 1);
}

static void ixj_write_cid_seize(IXJ *j)
{
	int cnt;

	for (cnt = 0; cnt < 150; cnt++) {
		ixj_write_cid_bit(j, 0);
		ixj_write_cid_bit(j, 1);
	}
	for (cnt = 0; cnt < 180; cnt++) {
		ixj_write_cid_bit(j, 1);
	}
}

static void ixj_write_cidcw_seize(IXJ *j)
{
	int cnt;

	for (cnt = 0; cnt < 80; cnt++) {
		ixj_write_cid_bit(j, 1);
	}
}

static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
{
	int cnt;

	for (cnt = 0; cnt < strlen(s); cnt++) {
		ixj_write_cid_byte(j, s[cnt]);
		checksum = (checksum + s[cnt]);
	}
	return checksum;
}

static void ixj_pad_fsk(IXJ *j, int pad)
{
	int cnt; 

	for (cnt = 0; cnt < pad; cnt++) {
		if(j->fskdcnt < (j->fsksize - 1))
			j->fskdata[j->fskdcnt++] = 0x0000;
	}
	for (cnt = 0; cnt < 720; cnt++) {
		if(j->fskdcnt < (j->fsksize - 1))
			j->fskdata[j->fskdcnt++] = 0x0000;
	}
}

static void ixj_pre_cid(IXJ *j)
{
	j->cid_play_codec = j->play_codec;
	j->cid_play_frame_size = j->play_frame_size;
	j->cid_play_volume = get_play_volume(j);
	j->cid_play_flag = j->flags.playing;

	j->cid_rec_codec = j->rec_codec;
	j->cid_rec_volume = get_rec_volume(j);
	j->cid_rec_flag = j->flags.recording;

	j->cid_play_aec_level = j->aec_level;

	switch(j->baseframe.low) {
		case 0xA0:
			j->cid_base_frame_size = 20;
			break;
		case 0x50:
			j->cid_base_frame_size = 10;
			break;
		case 0xF0:
			j->cid_base_frame_size = 30;
			break;
	}

	ixj_play_stop(j);
	ixj_cpt_stop(j);

	j->flags.cidplay = 1;

	set_base_frame(j, 30);
	set_play_codec(j, LINEAR16);
	set_play_volume(j, 0x1B);
	ixj_play_start(j);
}

static void ixj_post_cid(IXJ *j)
{
	ixj_play_stop(j);

	if(j->cidsize > 5000) {
		SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
	}
	j->flags.cidplay = 0;
	if(ixjdebug & 0x0200) {
		printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
	}

	ixj_fsk_free(j);

	j->fskdcnt = 0;
	set_base_frame(j, j->cid_base_frame_size);
	set_play_codec(j, j->cid_play_codec);
	ixj_aec_start(j, j->cid_play_aec_level);
	set_play_volume(j, j->cid_play_volume);

	set_rec_codec(j, j->cid_rec_codec);
	set_rec_volume(j, j->cid_rec_volume);

	if(j->cid_rec_flag)
		ixj_record_start(j);

	if(j->cid_play_flag)
		ixj_play_start(j);

	if(j->cid_play_flag) {
		wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */
	}
}

static void ixj_write_cid(IXJ *j)
{
	char sdmf1[50];
	char sdmf2[50];
	char sdmf3[80];
	char mdmflen, len1, len2, len3;
	int pad;

	int checksum = 0;

	if (j->dsp.low == 0x20 || j->flags.cidplay)
		return;

	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
	j->cidsize = j->cidcnt = 0;

	ixj_fsk_alloc(j);

	strcpy(sdmf1, j->cid_send.month);
	strcat(sdmf1, j->cid_send.day);
	strcat(sdmf1, j->cid_send.hour);
	strcat(sdmf1, j->cid_send.min);
	strcpy(sdmf2, j->cid_send.number);
	strcpy(sdmf3, j->cid_send.name);

	len1 = strlen(sdmf1);
	len2 = strlen(sdmf2);
	len3 = strlen(sdmf3);
	mdmflen = len1 + len2 + len3 + 6;

	while(1){
		ixj_write_cid_seize(j);

		ixj_write_cid_byte(j, 0x80);
		checksum = 0x80;
		ixj_write_cid_byte(j, mdmflen);
		checksum = checksum + mdmflen;

		ixj_write_cid_byte(j, 0x01);
		checksum = checksum + 0x01;
		ixj_write_cid_byte(j, len1);
		checksum = checksum + len1;
		checksum = ixj_write_cid_string(j, sdmf1, checksum);
		if(ixj_hookstate(j) & 1)
			break;

		ixj_write_cid_byte(j, 0x02);
		checksum = checksum + 0x02;
		ixj_write_cid_byte(j, len2);
		checksum = checksum + len2;
		checksum = ixj_write_cid_string(j, sdmf2, checksum);
		if(ixj_hookstate(j) & 1)
			break;

		ixj_write_cid_byte(j, 0x07);
		checksum = checksum + 0x07;
		ixj_write_cid_byte(j, len3);
		checksum = checksum + len3;
		checksum = ixj_write_cid_string(j, sdmf3, checksum);
		if(ixj_hookstate(j) & 1)
			break;

		checksum %= 256;
		checksum ^= 0xFF;
		checksum += 1;

		ixj_write_cid_byte(j, (char) checksum);

		pad = j->fskdcnt % 240;
		if (pad) {
			pad = 240 - pad;
		}
		ixj_pad_fsk(j, pad);
		break;
	}

	ixj_write_frame(j);
}

static void ixj_write_cidcw(IXJ *j)
{
	IXJ_TONE ti;

	char sdmf1[50];
	char sdmf2[50];
	char sdmf3[80];
	char mdmflen, len1, len2, len3;
	int pad;

	int checksum = 0;

	if (j->dsp.low == 0x20 || j->flags.cidplay)
		return;

	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
	j->cidsize = j->cidcnt = 0;

	ixj_fsk_alloc(j);

	j->flags.cidcw_ack = 0;

	ti.tone_index = 23;
	ti.gain0 = 1;
	ti.freq0 = hz440;
	ti.gain1 = 0;
	ti.freq1 = 0;
	ixj_init_tone(j, &ti);

	ixj_set_tone_on(1500, j);
	ixj_set_tone_off(32, j);
	if(ixjdebug & 0x0200) {
		printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
	}
	ixj_play_tone(j, 23);

	clear_bit(j->board, &j->busyflags);
	while(j->tone_state) {
		set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout(1);
	}
	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
		set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout(1);
	}
	if(ixjdebug & 0x0200) {
		printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
	}

	ti.tone_index = 24;
	ti.gain0 = 1;
	ti.freq0 = hz2130;
	ti.gain1 = 0;
	ti.freq1 = hz2750;
	ixj_init_tone(j, &ti);

	ixj_set_tone_off(10, j);
	ixj_set_tone_on(600, j);
	if(ixjdebug & 0x0200) {
		printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
	}
	ixj_play_tone(j, 24);

	clear_bit(j->board, &j->busyflags);
	while(j->tone_state) {
		set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout(1);
	}
	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
		set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout(1);
	}
	if(ixjdebug & 0x0200) {
		printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
	}

	j->cidcw_wait = jiffies + ((50 * hertz) / 100);

	clear_bit(j->board, &j->busyflags);
	while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) {
		set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout(1);
	}
	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
		set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout(1);
	}
	j->cidcw_wait = 0;
	if(!j->flags.cidcw_ack) {
		if(ixjdebug & 0x0200) {
			printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
		}
		ixj_post_cid(j);
		if(j->cid_play_flag) {
			wake_up_interruptible(&j->write_q);	/* Wake any blocked readers */
		}
		return;
	} else {
		ixj_pre_cid(j);
	}
	j->flags.cidcw_ack = 0;
	strcpy(sdmf1, j->cid_send.month);
	strcat(sdmf1, j->cid_send.day);
	strcat(sdmf1, j->cid_send.hour);
	strcat(sdmf1, j->cid_send.min);
	strcpy(sdmf2, j->cid_send.number);
	strcpy(sdmf3, j->cid_send.name);

	len1 = strlen(sdmf1);
	len2 = strlen(sdmf2);
	len3 = strlen(sdmf3);
	mdmflen = len1 + len2 + len3 + 6;

	ixj_write_cidcw_seize(j);

	ixj_write_cid_byte(j, 0x80);
	checksum = 0x80;
	ixj_write_cid_byte(j, mdmflen);
	checksum = checksum + mdmflen;

	ixj_write_cid_byte(j, 0x01);
	checksum = checksum + 0x01;
	ixj_write_cid_byte(j, len1);
	checksum = checksum + len1;
	checksum = ixj_write_cid_string(j, sdmf1, checksum);

	ixj_write_cid_byte(j, 0x02);
	checksum = checksum + 0x02;
	ixj_write_cid_byte(j, len2);
	checksum = checksum + len2;
	checksum = ixj_write_cid_string(j, sdmf2, checksum);

	ixj_write_cid_byte(j, 0x07);
	checksum = checksum + 0x07;
	ixj_write_cid_byte(j, len3);
	checksum = checksum + len3;
	checksum = ixj_write_cid_string(j, sdmf3, checksum);

	checksum %= 256;
	checksum ^= 0xFF;
	checksum += 1;

	ixj_write_cid_byte(j, (char) checksum);

	pad = j->fskdcnt % 240;
	if (pad) {
		pad = 240 - pad;
	}
	ixj_pad_fsk(j, pad);
	if(ixjdebug & 0x0200) {
		printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
	}
}

static void ixj_write_vmwi(IXJ *j, int msg)
{
	char mdmflen;
	int pad;

	int checksum = 0;

	if (j->dsp.low == 0x20 || j->flags.cidplay)
		return;

	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
	j->cidsize = j->cidcnt = 0;

	ixj_fsk_alloc(j);

	mdmflen = 3;

	if (j->port == PORT_POTS)
		SLIC_SetState(PLD_SLIC_STATE_OHT, j);

	ixj_write_cid_seize(j);

	ixj_write_cid_byte(j, 0x82);
	checksum = 0x82;
	ixj_write_cid_byte(j, mdmflen);
	checksum = checksum + mdmflen;

	ixj_write_cid_byte(j, 0x0B);
	checksum = checksum + 0x0B;
	ixj_write_cid_byte(j, 1);
	checksum = checksum + 1;

	if(msg) {
		ixj_write_cid_byte(j, 0xFF);
		checksum = checksum + 0xFF;
	}
	else {
		ixj_write_cid_byte(j, 0x00);
		checksum = checksum + 0x00;
	}

	checksum %= 256;
	checksum ^= 0xFF;
	checksum += 1;

	ixj_write_cid_byte(j, (char) checksum);

	pad = j->fskdcnt % 240;
	if (pad) {
		pad = 240 - pad;
	}
	ixj_pad_fsk(j, pad);
}

static void ixj_write_frame(IXJ *j)
{
	int cnt, frame_count, dly;
	IXJ_WORD dat;
	BYTES blankword;

	frame_count = 0;
	if(j->flags.cidplay) {
		for(cnt = 0; cnt < 480; cnt++) {
			if (!(cnt % 16) && !IsTxReady(j)) {
				dly = 0;
				while (!IsTxReady(j)) {
					if (dly++ > 5) {
						dly = 0;
						break;
					}
					udelay(10);
				}
			}
			dat.word = j->fskdata[j->cidcnt++];
			outb_p(dat.bytes.low, j->DSPbase + 0x0C);
			outb_p(dat.bytes.high, j->DSPbase + 0x0D);
			cnt++;
		}
		if(j->cidcnt >= j->fskdcnt) {
			ixj_post_cid(j);
		}
		/* This may seem rude, but if we just played one frame of FSK data for CallerID
		   and there is real audio data in the buffer, we need to throw it away because 
		   we just used it's time slot */
		if (j->write_buffer_rp > j->write_buffer_wp) {
			j->write_buffer_rp += j->cid_play_frame_size * 2;
			if (j->write_buffer_rp >= j->write_buffer_end) {
				j->write_buffer_rp = j->write_buffer;
			}
			j->write_buffers_empty++;
			wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */

			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
		}
	} else if (j->write_buffer && j->write_buffers_empty < 1) { 
		if (j->write_buffer_wp > j->write_buffer_rp) {
			frame_count =
			    (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
		}
		if (j->write_buffer_rp > j->write_buffer_wp) {
			frame_count =
			    (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
			    (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
		}
		if (frame_count >= 1) {
			if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
				switch (j->play_mode) {
				case PLAYBACK_MODE_ULAW:
				case PLAYBACK_MODE_ALAW:
					blankword.low = blankword.high = 0xFF;
					break;
				case PLAYBACK_MODE_8LINEAR:
				case PLAYBACK_MODE_16LINEAR:
					blankword.low = blankword.high = 0x00;
					break;
				case PLAYBACK_MODE_8LINEAR_WSS:
					blankword.low = blankword.high = 0x80;
					break;
				}
				for (cnt = 0; cnt < 16; cnt++) {
					if (!(cnt % 16) && !IsTxReady(j)) {
						dly = 0;
						while (!IsTxReady(j)) {
							if (dly++ > 5) {
								dly = 0;
								break;
							}
							udelay(10);
						}
					}
					outb_p((blankword.low), j->DSPbase + 0x0C);
					outb_p((blankword.high), j->DSPbase + 0x0D);
				}
				j->flags.play_first_frame = 0;
			} else	if (j->play_codec == G723_63 && j->flags.play_first_frame) {
				for (cnt = 0; cnt < 24; cnt++) {
					if(cnt == 12) {
						blankword.low = 0x02;
						blankword.high = 0x00;
					}
					else {
						blankword.low = blankword.high = 0x00;
					}
					if (!(cnt % 16) && !IsTxReady(j)) {
						dly = 0;
						while (!IsTxReady(j)) {
							if (dly++ > 5) {
								dly = 0;
								break;
							}
							udelay(10);
						}
					}
					outb_p((blankword.low), j->DSPbase + 0x0C);
					outb_p((blankword.high), j->DSPbase + 0x0D);
				}
				j->flags.play_first_frame = 0;
			}
			for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
				if (!(cnt % 16) && !IsTxReady(j)) {
					dly = 0;
					while (!IsTxReady(j)) {
						if (dly++ > 5) {
							dly = 0;
							break;
						}
						udelay(10);
					}
				}
			/* Add word 0 to G.729 frames for the 8021.  Right now we don't do VAD/CNG  */
				if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
					if(j->write_buffer_rp + cnt == 0 && j->write_buffer_rp + cnt + 1 == 0 && j->write_buffer_rp + cnt + 2 == 0 &&
					   j->write_buffer_rp + cnt + 3 == 0 && j->write_buffer_rp + cnt + 4 == 0 && j->write_buffer_rp + cnt + 5 == 0 &&
					   j->write_buffer_rp + cnt + 6 == 0 && j->write_buffer_rp + cnt + 7 == 0 && j->write_buffer_rp + cnt + 8 == 0 &&
					   j->write_buffer_rp + cnt + 9 == 0) {
					/* someone is trying to write silence lets make this a type 0 frame. */
						outb_p(0x00, j->DSPbase + 0x0C);
						outb_p(0x00, j->DSPbase + 0x0D);
					} else {
					/* so all other frames are type 1. */
						outb_p(0x01, j->DSPbase + 0x0C);
						outb_p(0x00, j->DSPbase + 0x0D);
					}
				}
				outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
				outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
				*(j->write_buffer_rp + cnt) = 0;
				*(j->write_buffer_rp + cnt + 1) = 0;
			}
			j->write_buffer_rp += j->play_frame_size * 2;
			if (j->write_buffer_rp >= j->write_buffer_end) {
				j->write_buffer_rp = j->write_buffer;
			}
			j->write_buffers_empty++;
			wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */

			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */

			++j->frameswritten;
		}
	} else {
		j->drybuffer++;
	}
	if(j->ixj_signals[SIG_WRITE_READY]) {
		ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
	}
}

static int idle(IXJ *j)
{
	if (ixj_WriteDSPCommand(0x0000, j))		/* DSP Idle */

		return 0;

	if (j->ssr.high || j->ssr.low) {
		return 0;
	} else {
		j->play_mode = -1;
		j->flags.playing = 0;
		j->rec_mode = -1;
		j->flags.recording = 0;
		return 1;
        }
}

static int set_base_frame(IXJ *j, int size)
{
	unsigned short cmd;
	int cnt;

	idle(j);
	j->cid_play_aec_level = j->aec_level;
	aec_stop(j);
	for (cnt = 0; cnt < 10; cnt++) {
		if (idle(j))
			break;
	}
	if (j->ssr.high || j->ssr.low)
		return -1;
	if (j->dsp.low != 0x20) {
		switch (size) {
		case 30:
			cmd = 0x07F0;
			/* Set Base Frame Size to 240 pg9-10 8021 */
			break;
		case 20:
			cmd = 0x07A0;
			/* Set Base Frame Size to 160 pg9-10 8021 */
			break;
		case 10:
			cmd = 0x0750;
			/* Set Base Frame Size to 80 pg9-10 8021 */
			break;
		default:
			return -1;
		}
	} else {
		if (size == 30)
			return size;
		else
			return -1;
	}
	if (ixj_WriteDSPCommand(cmd, j)) {
		j->baseframe.high = j->baseframe.low = 0xFF;
		return -1;
	} else {
		j->baseframe.high = j->ssr.high;
		j->baseframe.low = j->ssr.low;
		/* If the status returned is 0x0000 (pg9-9 8021) the call failed */
		if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
			return -1;
		}
	}
	ixj_aec_start(j, j->cid_play_aec_level);
	return size;
}

static int set_rec_codec(IXJ *j, int rate)
{
	int retval = 0;

	j->rec_codec = rate;

	switch (rate) {
	case G723_63:
		if (j->ver.low != 0x12 || ixj_convert_loaded) {
			j->rec_frame_size = 12;
			j->rec_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case G723_53:
		if (j->ver.low != 0x12 || ixj_convert_loaded) {
			j->rec_frame_size = 10;
			j->rec_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case TS85:
		if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
			j->rec_frame_size = 16;
			j->rec_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case TS48:
		if (j->ver.low != 0x12 || ixj_convert_loaded) {
			j->rec_frame_size = 9;
			j->rec_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case TS41:
		if (j->ver.low != 0x12 || ixj_convert_loaded) {
			j->rec_frame_size = 8;
			j->rec_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case G728:
		if (j->dsp.low != 0x20) {
			j->rec_frame_size = 48;
			j->rec_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case G729:
		if (j->dsp.low != 0x20) {
			if (!j->flags.g729_loaded) {
				retval = 1;
				break;
			}
			switch (j->baseframe.low) {
			case 0xA0:
				j->rec_frame_size = 10;
				break;
			case 0x50:
				j->rec_frame_size = 5;
				break;
			default:
				j->rec_frame_size = 15;
				break;
			}
			j->rec_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case G729B:
		if (j->dsp.low != 0x20) {
			if (!j->flags.g729_loaded) {
				retval = 1;
				break;
			}
			switch (j->baseframe.low) {
			case 0xA0:
				j->rec_frame_size = 12;
				break;
			case 0x50:
				j->rec_frame_size = 6;
				break;
			default:
				j->rec_frame_size = 18;
				break;
			}
			j->rec_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case ULAW:
		switch (j->baseframe.low) {
		case 0xA0:
			j->rec_frame_size = 80;
			break;
		case 0x50:
			j->rec_frame_size = 40;
			break;
		default:
			j->rec_frame_size = 120;
			break;
		}
		j->rec_mode = 4;
		break;
	case ALAW:
		switch (j->baseframe.low) {
		case 0xA0:
			j->rec_frame_size = 80;
			break;
		case 0x50:
			j->rec_frame_size = 40;
			break;
		default:
			j->rec_frame_size = 120;
			break;
		}
		j->rec_mode = 4;
		break;
	case LINEAR16:
		switch (j->baseframe.low) {
		case 0xA0:
			j->rec_frame_size = 160;
			break;
		case 0x50:
			j->rec_frame_size = 80;
			break;
		default:
			j->rec_frame_size = 240;
			break;
		}
		j->rec_mode = 5;
		break;
	case LINEAR8:
		switch (j->baseframe.low) {
		case 0xA0:
			j->rec_frame_size = 80;
			break;
		case 0x50:
			j->rec_frame_size = 40;
			break;
		default:
			j->rec_frame_size = 120;
			break;
		}
		j->rec_mode = 6;
		break;
	case WSS:
		switch (j->baseframe.low) {
		case 0xA0:
			j->rec_frame_size = 80;
			break;
		case 0x50:
			j->rec_frame_size = 40;
			break;
		default:
			j->rec_frame_size = 120;
			break;
		}
		j->rec_mode = 7;
		break;
	default:
		j->rec_frame_size = 0;
		j->rec_mode = -1;
		if (j->read_buffer) {
			kfree(j->read_buffer);
			j->read_buffer = NULL;
			j->read_buffer_size = 0;
		}
		retval = 1;
		break;
	}
	return retval;
}

static int ixj_record_start(IXJ *j)
{
	unsigned short cmd = 0x0000;

	if (j->read_buffer) {
		ixj_record_stop(j);
	}
	j->flags.recording = 1;
	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */

	if(ixjdebug & 0x0002)
		printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);

	if (!j->rec_mode) {
		switch (j->rec_codec) {
		case G723_63:
			cmd = 0x5131;
			break;
		case G723_53:
			cmd = 0x5132;
			break;
		case TS85:
			cmd = 0x5130;	/* TrueSpeech 8.5 */

			break;
		case TS48:
			cmd = 0x5133;	/* TrueSpeech 4.8 */

			break;
		case TS41:
			cmd = 0x5134;	/* TrueSpeech 4.1 */

			break;
		case G728:
			cmd = 0x5135;
			break;
		case G729:
		case G729B:
			cmd = 0x5136;
			break;
		default:
			return 1;
		}
		if (ixj_WriteDSPCommand(cmd, j))
			return -1;
	}
	if (!j->read_buffer) {
		if (!j->read_buffer)
			j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
		if (!j->read_buffer) {
			printk("Read buffer allocation for ixj board %d failed!\n", j->board);
			return -ENOMEM;
		}
	}
	j->read_buffer_size = j->rec_frame_size * 2;

	if (ixj_WriteDSPCommand(0x5102, j))		/* Set Poll sync mode */

		return -1;

	switch (j->rec_mode) {
	case 0:
		cmd = 0x1C03;	/* Record C1 */

		break;
	case 4:
		if (j->ver.low == 0x12) {
			cmd = 0x1E03;	/* Record C1 */

		} else {
			cmd = 0x1E01;	/* Record C1 */

		}
		break;
	case 5:
		if (j->ver.low == 0x12) {
			cmd = 0x1E83;	/* Record C1 */

		} else {
			cmd = 0x1E81;	/* Record C1 */

		}
		break;
	case 6:
		if (j->ver.low == 0x12) {
			cmd = 0x1F03;	/* Record C1 */

		} else {
			cmd = 0x1F01;	/* Record C1 */

		}
		break;
	case 7:
		if (j->ver.low == 0x12) {
			cmd = 0x1F83;	/* Record C1 */
		} else {
			cmd = 0x1F81;	/* Record C1 */
		}
		break;
	}
	if (ixj_WriteDSPCommand(cmd, j))
		return -1;

	if (j->flags.playing) {
		ixj_aec_start(j, j->aec_level);
	}
	return 0;
}

static void ixj_record_stop(IXJ *j)
{
	if(ixjdebug & 0x0002)
		printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);

	if (j->read_buffer) {
		kfree(j->read_buffer);
		j->read_buffer = NULL;
		j->read_buffer_size = 0;
	}
	if (j->rec_mode > -1) {
		ixj_WriteDSPCommand(0x5120, j);
		j->rec_mode = -1;
	}
	j->flags.recording = 0;
}
static void ixj_vad(IXJ *j, int arg)
{
	if (arg)
		ixj_WriteDSPCommand(0x513F, j);
	else
		ixj_WriteDSPCommand(0x513E, j);
}

static void set_rec_depth(IXJ *j, int depth)
{
	if (depth > 60)
		depth = 60;
	if (depth < 0)
		depth = 0;
	ixj_WriteDSPCommand(0x5180 + depth, j);
}

static void set_dtmf_prescale(IXJ *j, int volume)
{
	ixj_WriteDSPCommand(0xCF07, j);
	ixj_WriteDSPCommand(volume, j);
}

static int get_dtmf_prescale(IXJ *j)
{
	ixj_WriteDSPCommand(0xCF05, j);
	return j->ssr.high << 8 | j->ssr.low;
}

static void set_rec_volume(IXJ *j, int volume)
{
	if(j->aec_level == AEC_AGC) {
		if (ixjdebug & 0x0002)
			printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
		ixj_WriteDSPCommand(0xCF96, j);
		ixj_WriteDSPCommand(volume, j);
	} else {
		if (ixjdebug & 0x0002)
			printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
		ixj_WriteDSPCommand(0xCF03, j);
		ixj_WriteDSPCommand(volume, j);
	}
}

static int set_rec_volume_linear(IXJ *j, int volume)
{
	int newvolume, dsprecmax;

	if (ixjdebug & 0x0002)
		printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
	if(volume > 100 || volume < 0) {
	  return -1;
	}

	/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
	switch (j->cardtype) {
	case QTI_PHONEJACK:
		dsprecmax = 0x440;
		break;
	case QTI_LINEJACK:
		dsprecmax = 0x180;
		ixj_mixer(0x0203, j);	/*Voice Left Volume unmute 6db */
		ixj_mixer(0x0303, j);	/*Voice Right Volume unmute 6db */
		ixj_mixer(0x0C00, j);	/*Mono1 unmute 12db */
		break;
	case QTI_PHONEJACK_LITE:
		dsprecmax = 0x4C0;
		break;
	case QTI_PHONEJACK_PCI:
		dsprecmax = 0x100;
		break;
	case QTI_PHONECARD:
		dsprecmax = 0x400;
		break;
	default:
		return -1;
	}
	newvolume = (dsprecmax * volume) / 100;
	set_rec_volume(j, newvolume);
	return 0;
}

static int get_rec_volume(IXJ *j)
{
	if(j->aec_level == AEC_AGC) {
		if (ixjdebug & 0x0002)
			printk(KERN_INFO "Getting AGC Threshold\n");
		ixj_WriteDSPCommand(0xCF86, j);
		if (ixjdebug & 0x0002)
			printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
		return j->ssr.high << 8 | j->ssr.low;
	} else {
		if (ixjdebug & 0x0002)
			printk(KERN_INFO "Getting Record Volume\n");
		ixj_WriteDSPCommand(0xCF01, j);
		return j->ssr.high << 8 | j->ssr.low;
	}
}

static int get_rec_volume_linear(IXJ *j)
{
	int volume, newvolume, dsprecmax;

	switch (j->cardtype) {
	case QTI_PHONEJACK:
		dsprecmax = 0x440;
		break;
	case QTI_LINEJACK:
		dsprecmax = 0x180;
		break;
	case QTI_PHONEJACK_LITE:
		dsprecmax = 0x4C0;
		break;
	case QTI_PHONEJACK_PCI:
		dsprecmax = 0x100;
		break;
	case QTI_PHONECARD:
		dsprecmax = 0x400;
		break;
	default:
		return -1;
	}
	volume = get_rec_volume(j);
	newvolume = (volume * 100) / dsprecmax;
	if(newvolume > 100)
		newvolume = 100;
	return newvolume;
}

static int get_rec_level(IXJ *j)
{
	int retval;

	ixj_WriteDSPCommand(0xCF88, j);

	retval = j->ssr.high << 8 | j->ssr.low;
	retval = (retval * 256) / 240;
	return retval;
}

static void ixj_aec_start(IXJ *j, int level)
{
	j->aec_level = level;
	if (ixjdebug & 0x0002)
		printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
	if (!level) {
		aec_stop(j);
	} else {
		if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
			ixj_WriteDSPCommand(0xE022, j);	/* Move AEC filter buffer */

			ixj_WriteDSPCommand(0x0300, j);
		}
		ixj_WriteDSPCommand(0xB001, j);	/* AEC On */

		ixj_WriteDSPCommand(0xE013, j);	/* Advanced AEC C1 */

		switch (level) {
		case AEC_LOW:
			ixj_WriteDSPCommand(0x0000, j);	/* Advanced AEC C2 = off */

			ixj_WriteDSPCommand(0xE011, j);
			ixj_WriteDSPCommand(0xFFFF, j);

			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
			ixj_WriteDSPCommand(0x0000, j);	/* to off */
			
			break;

		case AEC_MED:
			ixj_WriteDSPCommand(0x0600, j);	/* Advanced AEC C2 = on medium */

			ixj_WriteDSPCommand(0xE011, j);
			ixj_WriteDSPCommand(0x0080, j);

			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
			ixj_WriteDSPCommand(0x0000, j);	/* to off */
			
			break;

		case AEC_HIGH:
			ixj_WriteDSPCommand(0x0C00, j);	/* Advanced AEC C2 = on high */

			ixj_WriteDSPCommand(0xE011, j);
			ixj_WriteDSPCommand(0x0080, j);

			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
			ixj_WriteDSPCommand(0x0000, j);	/* to off */
			
			break;

		case AEC_AGC:
                        /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
			ixj_WriteDSPCommand(0x0002, j);	/* Attenuation scaling factor of 2 */

			ixj_WriteDSPCommand(0xE011, j);
			ixj_WriteDSPCommand(0x0100, j);	/* Higher Threshold Floor */

			ixj_WriteDSPCommand(0xE012, j);	/* Set Train and Lock */

			if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
				ixj_WriteDSPCommand(0x0224, j);
			else
				ixj_WriteDSPCommand(0x1224, j);

			ixj_WriteDSPCommand(0xE014, j);
			ixj_WriteDSPCommand(0x0003, j);	/* Lock threashold at 3dB */

			ixj_WriteDSPCommand(0xE338, j);	/* Set Echo Suppresser Attenuation to 0dB */

			/* Now we can set the AGC initial parameters and turn it on */
			ixj_WriteDSPCommand(0xCF90, j);	/* Set AGC Minumum gain */
			ixj_WriteDSPCommand(0x0020, j);	/* to 0.125 (-18dB) */
	
			ixj_WriteDSPCommand(0xCF91, j);	/* Set AGC Maximum gain */
			ixj_WriteDSPCommand(0x1000, j);	/* to 16 (24dB) */
			
			ixj_WriteDSPCommand(0xCF92, j);	/* Set AGC start gain */
			ixj_WriteDSPCommand(0x0800, j);	/* to 8 (+18dB) */
		
			ixj_WriteDSPCommand(0xCF93, j);	/* Set AGC hold time */
			ixj_WriteDSPCommand(0x1F40, j);	/* to 2 seconds (units are 250us) */
			
			ixj_WriteDSPCommand(0xCF94, j);	/* Set AGC Attack Time Constant */
			ixj_WriteDSPCommand(0x0005, j);	/* to 8ms */
			
			ixj_WriteDSPCommand(0xCF95, j);	/* Set AGC Decay Time Constant */
			ixj_WriteDSPCommand(0x000D, j);	/* to 4096ms */
			
			ixj_WriteDSPCommand(0xCF96, j);	/* Set AGC Attack Threshold */
			ixj_WriteDSPCommand(0x1200, j);	/* to 25% */
			
			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
			ixj_WriteDSPCommand(0x0001, j);	/* to on */
			
			break;

		case AEC_AUTO:
			ixj_WriteDSPCommand(0x0002, j);	/* Attenuation scaling factor of 2 */

			ixj_WriteDSPCommand(0xE011, j);
			ixj_WriteDSPCommand(0x0100, j);	/* Higher Threshold Floor */

			ixj_WriteDSPCommand(0xE012, j);	/* Set Train and Lock */

			if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
				ixj_WriteDSPCommand(0x0224, j);
			else
				ixj_WriteDSPCommand(0x1224, j);

			ixj_WriteDSPCommand(0xE014, j);
			ixj_WriteDSPCommand(0x0003, j);	/* Lock threashold at 3dB */

			ixj_WriteDSPCommand(0xE338, j);	/* Set Echo Suppresser Attenuation to 0dB */

			break;
		}
	}
}

static void aec_stop(IXJ *j)
{
	j->aec_level = AEC_OFF;
	if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
		ixj_WriteDSPCommand(0xE022, j);	/* Move AEC filter buffer back */

		ixj_WriteDSPCommand(0x0700, j);
	}
	if (j->play_mode != -1 && j->rec_mode != -1)
	{
		ixj_WriteDSPCommand(0xB002, j);	/* AEC Stop */
	}
}

static int set_play_codec(IXJ *j, int rate)
{
	int retval = 0;

	j->play_codec = rate;

	switch (rate) {
	case G723_63:
		if (j->ver.low != 0x12 || ixj_convert_loaded) {
			j->play_frame_size = 12;
			j->play_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case G723_53:
		if (j->ver.low != 0x12 || ixj_convert_loaded) {
			j->play_frame_size = 10;
			j->play_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case TS85:
		if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
			j->play_frame_size = 16;
			j->play_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case TS48:
		if (j->ver.low != 0x12 || ixj_convert_loaded) {
			j->play_frame_size = 9;
			j->play_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case TS41:
		if (j->ver.low != 0x12 || ixj_convert_loaded) {
			j->play_frame_size = 8;
			j->play_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case G728:
		if (j->dsp.low != 0x20) {
			j->play_frame_size = 48;
			j->play_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case G729:
		if (j->dsp.low != 0x20) {
			if (!j->flags.g729_loaded) {
				retval = 1;
				break;
			}
			switch (j->baseframe.low) {
			case 0xA0:
				j->play_frame_size = 10;
				break;
			case 0x50:
				j->play_frame_size = 5;
				break;
			default:
				j->play_frame_size = 15;
				break;
			}
			j->play_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case G729B:
		if (j->dsp.low != 0x20) {
			if (!j->flags.g729_loaded) {
				retval = 1;
				break;
			}
			switch (j->baseframe.low) {
			case 0xA0:
				j->play_frame_size = 12;
				break;
			case 0x50:
				j->play_frame_size = 6;
				break;
			default:
				j->play_frame_size = 18;
				break;
			}
			j->play_mode = 0;
		} else {
			retval = 1;
		}
		break;
	case ULAW:
		switch (j->baseframe.low) {
		case 0xA0:
			j->play_frame_size = 80;
			break;
		case 0x50:
			j->play_frame_size = 40;
			break;
		default:
			j->play_frame_size = 120;
			break;
		}
		j->play_mode = 2;
		break;
	case ALAW:
		switch (j->baseframe.low) {
		case 0xA0:
			j->play_frame_size = 80;
			break;
		case 0x50:
			j->play_frame_size = 40;
			break;
		default:
			j->play_frame_size = 120;
			break;
		}
		j->play_mode = 2;
		break;
	case LINEAR16:
		switch (j->baseframe.low) {
		case 0xA0:
			j->play_frame_size = 160;
			break;
		case 0x50:
			j->play_frame_size = 80;
			break;
		default:
			j->play_frame_size = 240;
			break;
		}
		j->play_mode = 6;
		break;
	case LINEAR8:
		switch (j->baseframe.low) {
		case 0xA0:
			j->play_frame_size = 80;
			break;
		case 0x50:
			j->play_frame_size = 40;
			break;
		default:
			j->play_frame_size = 120;
			break;
		}
		j->play_mode = 4;
		break;
	case WSS:
		switch (j->baseframe.low) {
		case 0xA0:
			j->play_frame_size = 80;
			break;
		case 0x50:
			j->play_frame_size = 40;
			break;
		default:
			j->play_frame_size = 120;
			break;
		}
		j->play_mode = 5;
		break;
	default:
		j->play_frame_size = 0;
		j->play_mode = -1;
		if (j->write_buffer) {
			kfree(j->write_buffer);
			j->write_buffer = NULL;
			j->write_buffer_size = 0;
		}
		retval = 1;
		break;
	}
	return retval;
}

static int ixj_play_start(IXJ *j)
{
	unsigned short cmd = 0x0000;

	if (j->write_buffer) {
		ixj_play_stop(j);
	}

	if(ixjdebug & 0x0002)
		printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);

	j->flags.playing = 1;
	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */

	j->flags.play_first_frame = 1;
	j->drybuffer = 0;

	if (!j->play_mode) {
		switch (j->play_codec) {
		case G723_63:
			cmd = 0x5231;
			break;
		case G723_53:
			cmd = 0x5232;
			break;
		case TS85:
			cmd = 0x5230;	/* TrueSpeech 8.5 */

			break;
		case TS48:
			cmd = 0x5233;	/* TrueSpeech 4.8 */

			break;
		case TS41:
			cmd = 0x5234;	/* TrueSpeech 4.1 */

			break;
		case G728:
			cmd = 0x5235;
			break;
		case G729:
		case G729B:
			cmd = 0x5236;
			break;
		default:
			return 1;
		}
		if (ixj_WriteDSPCommand(cmd, j))
			return -1;
	}
	j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
	if (!j->write_buffer) {
		printk("Write buffer allocation for ixj board %d failed!\n", j->board);
		return -ENOMEM;
	}
/*	j->write_buffers_empty = 2; */
	j->write_buffers_empty = 1; 
	j->write_buffer_size = j->play_frame_size * 2;
	j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
	j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;

	if (ixj_WriteDSPCommand(0x5202, j))		/* Set Poll sync mode */

		return -1;

	switch (j->play_mode) {
	case 0:
		cmd = 0x2C03;
		break;
	case 2:
		if (j->ver.low == 0x12) {
			cmd = 0x2C23;
		} else {
			cmd = 0x2C21;
		}
		break;
	case 4:
		if (j->ver.low == 0x12) {
			cmd = 0x2C43;
		} else {
			cmd = 0x2C41;
		}
		break;
	case 5:
		if (j->ver.low == 0x12) {
			cmd = 0x2C53;
		} else {
			cmd = 0x2C51;
		}
		break;
	case 6:
		if (j->ver.low == 0x12) {
			cmd = 0x2C63;
		} else {
			cmd = 0x2C61;
		}
		break;
	}
	if (ixj_WriteDSPCommand(cmd, j))
		return -1;

	if (ixj_WriteDSPCommand(0x2000, j))		/* Playback C2 */
		return -1;

	if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j))	/* Playback C3 */
		return -1;

	if (j->flags.recording) {
		ixj_aec_start(j, j->aec_level);
	}

	return 0;
}

static void ixj_play_stop(IXJ *j)
{
	if(ixjdebug & 0x0002)
		printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);

	if (j->write_buffer) {
		kfree(j->write_buffer);
		j->write_buffer = NULL;
		j->write_buffer_size = 0;
	}
	if (j->play_mode > -1) {
		ixj_WriteDSPCommand(0x5221, j);	/* Stop playback and flush buffers.  8022 reference page 9-40 */

		j->play_mode = -1;
	}
	j->flags.playing = 0;
}

static inline int get_play_level(IXJ *j)
{
	int retval;

	ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
	return j->ssr.high << 8 | j->ssr.low;
	retval = j->ssr.high << 8 | j->ssr.low;
	retval = (retval * 256) / 240;
	return retval;
}

static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
{
	unsigned int mask = 0;

	IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));

	poll_wait(file_p, &(j->poll_q), wait);
	if (j->read_buffer_ready > 0)
		mask |= POLLIN | POLLRDNORM;	/* readable */
	if (j->write_buffers_empty > 0)
		mask |= POLLOUT | POLLWRNORM;	/* writable */
	if (j->ex.bytes)
		mask |= POLLPRI;
	return mask;
}

static int ixj_play_tone(IXJ *j, char tone)
{
	if (!j->tone_state) {
		if(ixjdebug & 0x0002) {
			printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
		}
		if (j->dsp.low == 0x20) {
			idle(j);
		}
		j->tone_start_jif = jiffies;

		j->tone_state = 1;
	}

	j->tone_index = tone;
	if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
		return -1;

	return 0;
}

static int ixj_set_tone_on(unsigned short arg, IXJ *j)
{
	j->tone_on_time = arg;

	if (ixj_WriteDSPCommand(0x6E04, j))		/* Set Tone On Period */

		return -1;

	if (ixj_WriteDSPCommand(arg, j))
		return -1;

	return 0;
}

static int SCI_WaitHighSCI(IXJ *j)
{
	int cnt;

	j->pld_scrr.byte = inb_p(j->XILINXbase);
	if (!j->pld_scrr.bits.sci) {
		for (cnt = 0; cnt < 10; cnt++) {
			udelay(32);
			j->pld_scrr.byte = inb_p(j->XILINXbase);

			if ((j->pld_scrr.bits.sci))
				return 1;
		}
		if (ixjdebug & 0x0001)
			printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
		return 0;
	} else
		return 1;
}

static int SCI_WaitLowSCI(IXJ *j)
{
	int cnt;

	j->pld_scrr.byte = inb_p(j->XILINXbase);
	if (j->pld_scrr.bits.sci) {
		for (cnt = 0; cnt < 10; cnt++) {
			udelay(32);
			j->pld_scrr.byte = inb_p(j->XILINXbase);

			if (!(j->pld_scrr.bits.sci))
				return 1;
		}
		if (ixjdebug & 0x0001)
			printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
		return 0;
	} else
		return 1;
}

static int SCI_Control(IXJ *j, int control)
{
	switch (control) {
	case SCI_End:
		j->pld_scrw.bits.c0 = 0;	/* Set PLD Serial control interface */

		j->pld_scrw.bits.c1 = 0;	/* to no selection */

		break;
	case SCI_Enable_DAA:
		j->pld_scrw.bits.c0 = 1;	/* Set PLD Serial control interface */

		j->pld_scrw.bits.c1 = 0;	/* to write to DAA */

		break;
	case SCI_Enable_Mixer:
		j->pld_scrw.bits.c0 = 0;	/* Set PLD Serial control interface */

		j->pld_scrw.bits.c1 = 1;	/* to write to mixer */

		break;
	case SCI_Enable_EEPROM:
		j->pld_scrw.bits.c0 = 1;	/* Set PLD Serial control interface */

		j->pld_scrw.bits.c1 = 1;	/* to write to EEPROM */

		break;
	default:
		return 0;
		break;
	}
	outb_p(j->pld_scrw.byte, j->XILINXbase);

	switch (control) {
	case SCI_End:
		return 1;
		break;
	case SCI_Enable_DAA:
	case SCI_Enable_Mixer:
	case SCI_Enable_EEPROM:
		if (!SCI_WaitHighSCI(j))
			return 0;
		break;
	default:
		return 0;
		break;
	}
	return 1;
}

static int SCI_Prepare(IXJ *j)
{
	if (!SCI_Control(j, SCI_End))
		return 0;

	if (!SCI_WaitLowSCI(j))
		return 0;

	return 1;
}

static int ixj_get_mixer(long val, IXJ *j)
{
	int reg = (val & 0x1F00) >> 8;
        return j->mix.vol[reg];
}

static int ixj_mixer(long val, IXJ *j)
{
	BYTES bytes;

	bytes.high = (val & 0x1F00) >> 8;
	bytes.low = val & 0x00FF;

        /* save mixer value so we can get back later on */
        j->mix.vol[bytes.high] = bytes.low;

	outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03);	/* Load Mixer Address */

	outb_p(bytes.low, j->XILINXbase + 0x02);	/* Load Mixer Data */

	SCI_Control(j, SCI_Enable_Mixer);

	SCI_Control(j, SCI_End);

	return 0;
}

static int daa_load(BYTES * p_bytes, IXJ *j)
{
	outb_p(p_bytes->high, j->XILINXbase + 0x03);
	outb_p(p_bytes->low, j->XILINXbase + 0x02);
	if (!SCI_Control(j, SCI_Enable_DAA))
		return 0;
	else
		return 1;
}

static int ixj_daa_cr4(IXJ *j, char reg)
{
	BYTES bytes;

	switch (j->daa_mode) {
	case SOP_PU_SLEEP:
		bytes.high = 0x14;
		break;
	case SOP_PU_RINGING:
		bytes.high = 0x54;
		break;
	case SOP_PU_CONVERSATION:
		bytes.high = 0x94;
		break;
	case SOP_PU_PULSEDIALING:
		bytes.high = 0xD4;
		break;
	}

	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;

	switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
	case 0:
		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
		break;
	case 1:
		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
		break;
	case 2:
		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
		break;
	case 3:
		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
		break;
	}

	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;

	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Prepare(j))
		return 0;

	return 1;
}

static char daa_int_read(IXJ *j)
{
	BYTES bytes;

	if (!SCI_Prepare(j))
		return 0;

	bytes.high = 0x38;
	bytes.low = 0x00;
	outb_p(bytes.high, j->XILINXbase + 0x03);
	outb_p(bytes.low, j->XILINXbase + 0x02);

	if (!SCI_Control(j, SCI_Enable_DAA))
		return 0;

	bytes.high = inb_p(j->XILINXbase + 0x03);
	bytes.low = inb_p(j->XILINXbase + 0x02);
	if (bytes.low != ALISDAA_ID_BYTE) {
		if (ixjdebug & 0x0001)
			printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
		return 0;
	}
	if (!SCI_Control(j, SCI_Enable_DAA))
		return 0;
	if (!SCI_Control(j, SCI_End))
		return 0;

	bytes.high = inb_p(j->XILINXbase + 0x03);
	bytes.low = inb_p(j->XILINXbase + 0x02);

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;

	return 1;
}

static char daa_CR_read(IXJ *j, int cr)
{
	IXJ_WORD wdata;
	BYTES bytes;

	if (!SCI_Prepare(j))
		return 0;

	switch (j->daa_mode) {
	case SOP_PU_SLEEP:
		bytes.high = 0x30 + cr;
		break;
	case SOP_PU_RINGING:
		bytes.high = 0x70 + cr;
		break;
	case SOP_PU_CONVERSATION:
		bytes.high = 0xB0 + cr;
		break;
	case SOP_PU_PULSEDIALING:
		bytes.high = 0xF0 + cr;
		break;
	}

	bytes.low = 0x00;

	outb_p(bytes.high, j->XILINXbase + 0x03);
	outb_p(bytes.low, j->XILINXbase + 0x02);

	if (!SCI_Control(j, SCI_Enable_DAA))
		return 0;

	bytes.high = inb_p(j->XILINXbase + 0x03);
	bytes.low = inb_p(j->XILINXbase + 0x02);
	if (bytes.low != ALISDAA_ID_BYTE) {
		if (ixjdebug & 0x0001)
			printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
		return 0;
	}
	if (!SCI_Control(j, SCI_Enable_DAA))
		return 0;
	if (!SCI_Control(j, SCI_End))
		return 0;

	wdata.word = inw_p(j->XILINXbase + 0x02);

	switch(cr){
		case 5:
			j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
			break;
		case 4:
			j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
			break;
		case 3:
			j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
			break;
		case 2:
			j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
			break;
		case 1:
			j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
			break;
		case 0:
			j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
			break;
		default:
			return 0;
	}
	return 1;
}

static int ixj_daa_cid_reset(IXJ *j)
{
	int i;
	BYTES bytes;

	if (ixjdebug & 0x0002)
		printk("DAA Clearing CID ram\n");

	if (!SCI_Prepare(j))
		return 0;

	bytes.high = 0x58;
	bytes.low = 0x00;
	outb_p(bytes.high, j->XILINXbase + 0x03);
	outb_p(bytes.low, j->XILINXbase + 0x02);

	if (!SCI_Control(j, SCI_Enable_DAA))
		return 0;

	if (!SCI_WaitHighSCI(j))
		return 0;

	for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
		bytes.high = bytes.low = 0x00;
		outb_p(bytes.high, j->XILINXbase + 0x03);

		if (i < ALISDAA_CALLERID_SIZE - 1)
			outb_p(bytes.low, j->XILINXbase + 0x02);

		if (!SCI_Control(j, SCI_Enable_DAA))
			return 0;

		if (!SCI_WaitHighSCI(j))
			return 0;

	}

	if (!SCI_Control(j, SCI_End))
		return 0;

	if (ixjdebug & 0x0002)
		printk("DAA CID ram cleared\n");

	return 1;
}

static int ixj_daa_cid_read(IXJ *j)
{
	int i;
	BYTES bytes;
	char CID[ALISDAA_CALLERID_SIZE], mContinue;
	char *pIn, *pOut;

	if (!SCI_Prepare(j))
		return 0;

	bytes.high = 0x78;
	bytes.low = 0x00;
	outb_p(bytes.high, j->XILINXbase + 0x03);
	outb_p(bytes.low, j->XILINXbase + 0x02);

	if (!SCI_Control(j, SCI_Enable_DAA))
		return 0;

	if (!SCI_WaitHighSCI(j))
		return 0;

	bytes.high = inb_p(j->XILINXbase + 0x03);
	bytes.low = inb_p(j->XILINXbase + 0x02);
	if (bytes.low != ALISDAA_ID_BYTE) {
		if (ixjdebug & 0x0001)
			printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
		return 0;
	}
	for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
		bytes.high = bytes.low = 0x00;
		outb_p(bytes.high, j->XILINXbase + 0x03);
		outb_p(bytes.low, j->XILINXbase + 0x02);

		if (!SCI_Control(j, SCI_Enable_DAA))
			return 0;

		if (!SCI_WaitHighSCI(j))
			return 0;

		CID[i + 0] = inb_p(j->XILINXbase + 0x03);
		CID[i + 1] = inb_p(j->XILINXbase + 0x02);
	}

	if (!SCI_Control(j, SCI_End))
		return 0;

	pIn = CID;
	pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
	mContinue = 1;
	while (mContinue) {
		if ((pIn[1] & 0x03) == 0x01) {
			pOut[0] = pIn[0];
		}
		if ((pIn[2] & 0x0c) == 0x04) {
			pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
		}
		if ((pIn[3] & 0x30) == 0x10) {
			pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
		}
		if ((pIn[4] & 0xc0) == 0x40) {
			pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
		} else {
			mContinue = FALSE;
		}
		pIn += 5, pOut += 4;
	}
	memset(&j->cid, 0, sizeof(PHONE_CID));
	pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
	pOut += 4;
	strncpy(j->cid.month, pOut, 2);
	pOut += 2;
	strncpy(j->cid.day, pOut, 2);
	pOut += 2;
	strncpy(j->cid.hour, pOut, 2);
	pOut += 2;
	strncpy(j->cid.min, pOut, 2);
	pOut += 3;
	j->cid.numlen = *pOut;
	pOut += 1;
	strncpy(j->cid.number, pOut, j->cid.numlen);
	pOut += j->cid.numlen + 1;
	j->cid.namelen = *pOut;
	pOut += 1;
	strncpy(j->cid.name, pOut, j->cid.namelen);

	ixj_daa_cid_reset(j);
	return 1;
}

static char daa_get_version(IXJ *j)
{
	BYTES bytes;

	if (!SCI_Prepare(j))
		return 0;

	bytes.high = 0x35;
	bytes.low = 0x00;
	outb_p(bytes.high, j->XILINXbase + 0x03);
	outb_p(bytes.low, j->XILINXbase + 0x02);

	if (!SCI_Control(j, SCI_Enable_DAA))
		return 0;

	bytes.high = inb_p(j->XILINXbase + 0x03);
	bytes.low = inb_p(j->XILINXbase + 0x02);
	if (bytes.low != ALISDAA_ID_BYTE) {
		if (ixjdebug & 0x0001)
			printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
		return 0;
	}
	if (!SCI_Control(j, SCI_Enable_DAA))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;

	bytes.high = inb_p(j->XILINXbase + 0x03);
	bytes.low = inb_p(j->XILINXbase + 0x02);
	if (ixjdebug & 0x0002)
		printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
	return bytes.high;
}

static int daa_set_mode(IXJ *j, int mode)
{
	/* NOTE:
	      The DAA *MUST* be in the conversation mode if the
	      PSTN line is to be seized (PSTN line off-hook).
	      Taking the PSTN line off-hook while the DAA is in
	      a mode other than conversation mode will cause a
	      hardware failure of the ALIS-A part.

	   NOTE:
	      The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
	      if the PSTN line is on-hook.  Failure to have the PSTN line
	      in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
	      ALIS-A part.
	*/

	BYTES bytes;

	j->flags.pstn_rmr = 0;

	if (!SCI_Prepare(j))
		return 0;

	switch (mode) {
	case SOP_PU_RESET:
		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */

		outb_p(j->pld_scrw.byte, j->XILINXbase);
		j->pld_slicw.bits.rly2 = 0;
		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
		bytes.high = 0x10;
		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
		daa_load(&bytes, j);
		if (!SCI_Prepare(j))
			return 0;

		j->daa_mode = SOP_PU_SLEEP;
		break;
	case SOP_PU_SLEEP:
		if(j->daa_mode == SOP_PU_SLEEP)
		{
			break;
		}
		if (ixjdebug & 0x0008)
			printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
/*		if(j->daa_mode == SOP_PU_CONVERSATION) */
		{
			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */

			outb_p(j->pld_scrw.byte, j->XILINXbase);
			j->pld_slicw.bits.rly2 = 0;
			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
			bytes.high = 0x10;
			bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
			daa_load(&bytes, j);
			if (!SCI_Prepare(j))
				return 0;
		}
		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */

		outb_p(j->pld_scrw.byte, j->XILINXbase);
		j->pld_slicw.bits.rly2 = 0;
		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
		bytes.high = 0x10;
		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
		daa_load(&bytes, j);
		if (!SCI_Prepare(j))
			return 0;

		j->daa_mode = SOP_PU_SLEEP;
		j->flags.pstn_ringing = 0;
		j->ex.bits.pstn_ring = 0;
		j->pstn_sleeptil = jiffies + (hertz / 4);
		wake_up_interruptible(&j->read_q);      /* Wake any blocked readers */
		wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
		wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
 		break;
	case SOP_PU_RINGING:
		if (ixjdebug & 0x0008)
			printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */

		outb_p(j->pld_scrw.byte, j->XILINXbase);
		j->pld_slicw.bits.rly2 = 0;
		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
		bytes.high = 0x50;
		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
		daa_load(&bytes, j);
		if (!SCI_Prepare(j))
			return 0;
		j->daa_mode = SOP_PU_RINGING;
		break;
	case SOP_PU_CONVERSATION:
		if (ixjdebug & 0x0008)
			printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
		bytes.high = 0x90;
		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
		daa_load(&bytes, j);
		if (!SCI_Prepare(j))
			return 0;
		j->pld_slicw.bits.rly2 = 1;
		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
		j->pld_scrw.bits.daafsyncen = 1;	/* Turn on DAA Frame Sync */

		outb_p(j->pld_scrw.byte, j->XILINXbase);
		j->daa_mode = SOP_PU_CONVERSATION;
		j->flags.pstn_ringing = 0;
		j->ex.bits.pstn_ring = 0;
		j->pstn_sleeptil = jiffies;
		j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
		break;
	case SOP_PU_PULSEDIALING:
		if (ixjdebug & 0x0008)
			printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */

		outb_p(j->pld_scrw.byte, j->XILINXbase);
		j->pld_slicw.bits.rly2 = 0;
		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
		bytes.high = 0xD0;
		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
		daa_load(&bytes, j);
		if (!SCI_Prepare(j))
			return 0;
		j->daa_mode = SOP_PU_PULSEDIALING;
		break;
	default:
		break;
	}
	return 1;
}

static int ixj_daa_write(IXJ *j)
{
	BYTES bytes;

	j->flags.pstncheck = 1;

	daa_set_mode(j, SOP_PU_SLEEP);

	if (!SCI_Prepare(j))
		return 0;

	outb_p(j->pld_scrw.byte, j->XILINXbase);

	bytes.high = 0x14;
	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Prepare(j))
		return 0;

	bytes.high = 0x1F;
	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Prepare(j))
		return 0;

	bytes.high = 0x00;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x01;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x02;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x03;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x04;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x05;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x06;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x07;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x08;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x09;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x0A;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x0B;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x0C;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x0D;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x0E;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	if (!SCI_Control(j, SCI_End))
		return 0;
	if (!SCI_WaitLowSCI(j))
		return 0;

	bytes.high = 0x0F;
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
	if (!daa_load(&bytes, j))
		return 0;

	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
	bytes.low = 0x00;
	if (!daa_load(&bytes, j))
		return 0;

	udelay(32);
	j->pld_scrr.byte = inb_p(j->XILINXbase);
	if (!SCI_Control(j, SCI_End))
		return 0;

	outb_p(j->pld_scrw.byte, j->XILINXbase);

	if (ixjdebug & 0x0002)
		printk("DAA Coefficients Loaded\n");

	j->flags.pstncheck = 0;
	return 1;
}

int ixj_set_tone_off(unsigned short arg, IXJ *j)
{
	j->tone_off_time = arg;
	if (ixj_WriteDSPCommand(0x6E05, j))		/* Set Tone Off Period */

		return -1;
	if (ixj_WriteDSPCommand(arg, j))
		return -1;
	return 0;
}

static int ixj_get_tone_on(IXJ *j)
{
	if (ixj_WriteDSPCommand(0x6E06, j))		/* Get Tone On Period */

		return -1;
	return 0;
}

static int ixj_get_tone_off(IXJ *j)
{
	if (ixj_WriteDSPCommand(0x6E07, j))		/* Get Tone Off Period */

		return -1;
	return 0;
}

static void ixj_busytone(IXJ *j)
{
	j->flags.ringback = 0;
	j->flags.dialtone = 0;
	j->flags.busytone = 1;
	ixj_set_tone_on(0x07D0, j);
	ixj_set_tone_off(0x07D0, j);
	ixj_play_tone(j, 27);
}

static void ixj_dialtone(IXJ *j)
{
	j->flags.ringback = 0;
	j->flags.dialtone = 1;
	j->flags.busytone = 0;
	if (j->dsp.low == 0x20) {
		return;
	} else {
		ixj_set_tone_on(0xFFFF, j);
		ixj_set_tone_off(0x0000, j);
		ixj_play_tone(j, 25);
	}
}

static void ixj_cpt_stop(IXJ *j)
{
	if(j->tone_state || j->tone_cadence_state)
	{
		j->flags.dialtone = 0;
		j->flags.busytone = 0;
		j->flags.ringback = 0;
		ixj_set_tone_on(0x0001, j);
		ixj_set_tone_off(0x0000, j);
		ixj_play_tone(j, 0);
		j->tone_state = j->tone_cadence_state = 0;
		if (j->cadence_t) {
			if (j->cadence_t->ce) {
				kfree(j->cadence_t->ce);
			}
			kfree(j->cadence_t);
			j->cadence_t = NULL;
		}
	}
	if (j->play_mode == -1 && j->rec_mode == -1)
		idle(j);
	if (j->play_mode != -1 && j->dsp.low == 0x20)
		ixj_play_start(j);
	if (j->rec_mode != -1 && j->dsp.low == 0x20)
		ixj_record_start(j);
}

static void ixj_ringback(IXJ *j)
{
	j->flags.busytone = 0;
	j->flags.dialtone = 0;
	j->flags.ringback = 1;
	ixj_set_tone_on(0x0FA0, j);
	ixj_set_tone_off(0x2EE0, j);
	ixj_play_tone(j, 26);
}

static void ixj_testram(IXJ *j)
{
	ixj_WriteDSPCommand(0x3001, j);	/* Test External SRAM */
}

static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
{
	ixj_cadence *lcp;
	IXJ_CADENCE_ELEMENT __user *cep;
	IXJ_CADENCE_ELEMENT *lcep;
	IXJ_TONE ti;
	int err;

	lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
	if (lcp == NULL)
		return -ENOMEM;

	err = -EFAULT;
	if (copy_from_user(&lcp->elements_used,
			   &cp->elements_used, sizeof(int)))
		goto out;
	if (copy_from_user(&lcp->termination,
			   &cp->termination, sizeof(IXJ_CADENCE_TERM)))
		goto out;
	if (get_user(cep, &cp->ce))
		goto out;

	err = -EINVAL;
	if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
		goto out;

	err = -ENOMEM;
	lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
	if (!lcep)
		goto out;

	err = -EFAULT;
	if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
		goto out1;

	if (j->cadence_t) {
		kfree(j->cadence_t->ce);
		kfree(j->cadence_t);
	}
	lcp->ce = (void *) lcep;
	j->cadence_t = lcp;
	j->tone_cadence_state = 0;
	ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
	ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
	if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
		ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
		ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
		ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
		ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
		ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
		ixj_init_tone(j, &ti);
	}
	ixj_play_tone(j, lcp->ce[0].index);
	return 1;
out1:
	kfree(lcep);
out:
	kfree(lcp);
	return err;
}

static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
{
	IXJ_FILTER_CADENCE *lcp;
	lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
	if (lcp == NULL) {
		if(ixjdebug & 0x0001) {
			printk(KERN_INFO "Could not allocate memory for cadence\n");
		}
		return -ENOMEM;
        }
	if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) {
		if(ixjdebug & 0x0001) {
			printk(KERN_INFO "Could not copy cadence to kernel\n");
		}
		kfree(lcp);
		return -EFAULT;
	}
	if (lcp->filter > 5) {
		if(ixjdebug & 0x0001) {
			printk(KERN_INFO "Cadence out of range\n");
		}
		kfree(lcp);
		return -1;
	}
	j->cadence_f[lcp->filter].state = 0;
	j->cadence_f[lcp->filter].enable = lcp->enable;
	j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
	j->cadence_f[lcp->filter].on1 = lcp->on1;
	j->cadence_f[lcp->filter].on1min = 0;
	j->cadence_f[lcp->filter].on1max = 0;
	j->cadence_f[lcp->filter].off1 = lcp->off1;
	j->cadence_f[lcp->filter].off1min = 0;
	j->cadence_f[lcp->filter].off1max = 0;
	j->cadence_f[lcp->filter].on2 = lcp->on2;
	j->cadence_f[lcp->filter].on2min = 0;
	j->cadence_f[lcp->filter].on2max = 0;
	j->cadence_f[lcp->filter].off2 = lcp->off2;
	j->cadence_f[lcp->filter].off2min = 0;
	j->cadence_f[lcp->filter].off2max = 0;
	j->cadence_f[lcp->filter].on3 = lcp->on3;
	j->cadence_f[lcp->filter].on3min = 0;
	j->cadence_f[lcp->filter].on3max = 0;
	j->cadence_f[lcp->filter].off3 = lcp->off3;
	j->cadence_f[lcp->filter].off3min = 0;
	j->cadence_f[lcp->filter].off3max = 0;
	if(ixjdebug & 0x0002) {
		printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
	}
	kfree(lcp);
	return 0;
}

static void add_caps(IXJ *j)
{
	j->caps = 0;
	j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
	strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
	j->caplist[j->caps].captype = vendor;
	j->caplist[j->caps].handle = j->caps++;
	j->caplist[j->caps].captype = device;
	switch (j->cardtype) {
	case QTI_PHONEJACK:
		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
		break;
	case QTI_LINEJACK:
		strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
		break;
	case QTI_PHONEJACK_LITE:
		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
		break;
	case QTI_PHONEJACK_PCI:
		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
		break;
	case QTI_PHONECARD:
		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
		break;
	}
	j->caplist[j->caps].cap = j->cardtype;
	j->caplist[j->caps].handle = j->caps++;
	strcpy(j->caplist[j->caps].desc, "POTS");
	j->caplist[j->caps].captype = port;
	j->caplist[j->caps].cap = pots;
	j->caplist[j->caps].handle = j->caps++;

 	/* add devices that can do speaker/mic */
	switch (j->cardtype) {
	case QTI_PHONEJACK:
	case QTI_LINEJACK:
	case QTI_PHONEJACK_PCI:
	case QTI_PHONECARD:
		strcpy(j->caplist[j->caps].desc, "SPEAKER");
		j->caplist[j->caps].captype = port;
		j->caplist[j->caps].cap = speaker;
		j->caplist[j->caps].handle = j->caps++;
        default:
     		break;
	}

 	/* add devices that can do handset */
	switch (j->cardtype) {
	case QTI_PHONEJACK:
		strcpy(j->caplist[j->caps].desc, "HANDSET");
		j->caplist[j->caps].captype = port;
		j->caplist[j->caps].cap = handset;
		j->caplist[j->caps].handle = j->caps++;
		break;
        default:
     		break;
	}

 	/* add devices that can do PSTN */
	switch (j->cardtype) {
	case QTI_LINEJACK:
		strcpy(j->caplist[j->caps].desc, "PSTN");
		j->caplist[j->caps].captype = port;
		j->caplist[j->caps].cap = pstn;
		j->caplist[j->caps].handle = j->caps++;
		break;
        default:
     		break;
	}

	/* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
	strcpy(j->caplist[j->caps].desc, "ULAW");
	j->caplist[j->caps].captype = codec;
	j->caplist[j->caps].cap = ULAW;
	j->caplist[j->caps].handle = j->caps++;

	strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
	j->caplist[j->caps].captype = codec;
	j->caplist[j->caps].cap = LINEAR16;
	j->caplist[j->caps].handle = j->caps++;

	strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
	j->caplist[j->caps].captype = codec;
	j->caplist[j->caps].cap = LINEAR8;
	j->caplist[j->caps].handle = j->caps++;

	strcpy(j->caplist[j->caps].desc, "Windows Sound System");
	j->caplist[j->caps].captype = codec;
	j->caplist[j->caps].cap = WSS;
	j->caplist[j->caps].handle = j->caps++;

	/* software ALAW codec, made from ULAW */
	strcpy(j->caplist[j->caps].desc, "ALAW");
	j->caplist[j->caps].captype = codec;
	j->caplist[j->caps].cap = ALAW;
	j->caplist[j->caps].handle = j->caps++;

	/* version 12 of the 8020 does the following codecs in a broken way */
	if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
		strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
		j->caplist[j->caps].captype = codec;
		j->caplist[j->caps].cap = G723_63;
		j->caplist[j->caps].handle = j->caps++;

		strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
		j->caplist[j->caps].captype = codec;
		j->caplist[j->caps].cap = G723_53;
		j->caplist[j->caps].handle = j->caps++;

		strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
		j->caplist[j->caps].captype = codec;
		j->caplist[j->caps].cap = TS48;
		j->caplist[j->caps].handle = j->caps++;

		strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
		j->caplist[j->caps].captype = codec;
		j->caplist[j->caps].cap = TS41;
		j->caplist[j->caps].handle = j->caps++;
	}

	/* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
	if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
		strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
		j->caplist[j->caps].captype = codec;
		j->caplist[j->caps].cap = TS85;
		j->caplist[j->caps].handle = j->caps++;
	}

	/* 8021 chips can do G728 */
	if (j->dsp.low == 0x21) {
		strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
		j->caplist[j->caps].captype = codec;
		j->caplist[j->caps].cap = G728;
		j->caplist[j->caps].handle = j->caps++;
	}

	/* 8021/8022 chips can do G729 if loaded */
	if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
		strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
		j->caplist[j->caps].captype = codec;
		j->caplist[j->caps].cap = G729;
		j->caplist[j->caps].handle = j->caps++;
	}
	if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
		strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
		j->caplist[j->caps].captype = codec;
		j->caplist[j->caps].cap = G729B;
		j->caplist[j->caps].handle = j->caps++;
	}
}

static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
{
	int cnt;
	int retval = 0;
	for (cnt = 0; cnt < j->caps; cnt++) {
		if (pcreq->captype == j->caplist[cnt].captype
		    && pcreq->cap == j->caplist[cnt].cap) {
			retval = 1;
			break;
		}
	}
	return retval;
}

static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
{
	IXJ_TONE ti;
	IXJ_FILTER jf;
	IXJ_FILTER_RAW jfr;
	void __user *argp = (void __user *)arg;

	unsigned int raise, mant;
	unsigned int minor = iminor(inode);
	int board = NUM(inode);

	IXJ *j = get_ixj(NUM(inode));

	int retval = 0;

	/*
	 *    Set up locks to ensure that only one process is talking to the DSP at a time.
	 *    This is necessary to keep the DSP from locking up.
	 */
	while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
		set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout(1);
	}
	if (ixjdebug & 0x0040)
		printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
	if (minor >= IXJMAX) {
		clear_bit(board, &j->busyflags);
		return -ENODEV;
	}
	/*
	 *    Check ioctls only root can use.
	 */
	if (!capable(CAP_SYS_ADMIN)) {
		switch (cmd) {
		case IXJCTL_TESTRAM:
		case IXJCTL_HZ:
			retval = -EPERM;
		}
	}
	switch (cmd) {
	case IXJCTL_TESTRAM:
		ixj_testram(j);
		retval = (j->ssr.high << 8) + j->ssr.low;
		break;
	case IXJCTL_CARDTYPE:
		retval = j->cardtype;
		break;
	case IXJCTL_SERIAL:
		retval = j->serial;
		break;
	case IXJCTL_VERSION:
		{
			char arg_str[100];
			snprintf(arg_str, sizeof(arg_str),
				"\nDriver version %i.%i.%i", IXJ_VER_MAJOR,
				IXJ_VER_MINOR, IXJ_BLD_VER);
			if (copy_to_user(argp, arg_str, strlen(arg_str)))
				retval = -EFAULT;
		}
		break;
	case PHONE_RING_CADENCE:
		j->ring_cadence = arg;
		break;
	case IXJCTL_CIDCW:
		if(arg) {
			if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
				retval = -EFAULT;
				break;
			}
		} else {
			memset(&j->cid_send, 0, sizeof(PHONE_CID));
		}
		ixj_write_cidcw(j);
		break;
        /* Binary compatbility */
        case OLD_PHONE_RING_START:
                arg = 0;
                /* Fall through */
 	case PHONE_RING_START:
		if(arg) {
			if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
				retval = -EFAULT;
				break;
			}
			ixj_write_cid(j);
		} else {
			memset(&j->cid_send, 0, sizeof(PHONE_CID));
		}
		ixj_ring_start(j);
		break;
	case PHONE_RING_STOP:
		j->flags.cringing = 0;
		if(j->cadence_f[5].enable) {
			j->cadence_f[5].state = 0;
		}
		ixj_ring_off(j);
		break;
	case PHONE_RING:
		retval = ixj_ring(j);
		break;
	case PHONE_EXCEPTION:
		retval = j->ex.bytes;
		if(j->ex.bits.flash) {
			j->flash_end = 0;
			j->ex.bits.flash = 0;
		}
		j->ex.bits.pstn_ring = 0;
		j->ex.bits.caller_id = 0;
		j->ex.bits.pstn_wink = 0;
		j->ex.bits.f0 = 0;
		j->ex.bits.f1 = 0;
		j->ex.bits.f2 = 0;
		j->ex.bits.f3 = 0;
		j->ex.bits.fc0 = 0;
		j->ex.bits.fc1 = 0;
		j->ex.bits.fc2 = 0;
		j->ex.bits.fc3 = 0;
		j->ex.bits.reserved = 0;
		break;
	case PHONE_HOOKSTATE:
		j->ex.bits.hookstate = 0;
		retval = j->hookstate;  //j->r_hook;
		break;
	case IXJCTL_SET_LED:
		LED_SetState(arg, j);
		break;
	case PHONE_FRAME:
		retval = set_base_frame(j, arg);
		break;
	case PHONE_REC_CODEC:
		retval = set_rec_codec(j, arg);
		break;
	case PHONE_VAD:
		ixj_vad(j, arg);
		break;
	case PHONE_REC_START:
		ixj_record_start(j);
		break;
	case PHONE_REC_STOP:
		ixj_record_stop(j);
		break;
	case PHONE_REC_DEPTH:
		set_rec_depth(j, arg);
		break;
	case PHONE_REC_VOLUME:
		if(arg == -1) {
			retval = get_rec_volume(j);
		}
		else {
			set_rec_volume(j, arg);
			retval = arg;
		}
		break;
	case PHONE_REC_VOLUME_LINEAR:
		if(arg == -1) {
			retval = get_rec_volume_linear(j);
		}
		else {
			set_rec_volume_linear(j, arg);
			retval = arg;
		}
		break;
	case IXJCTL_DTMF_PRESCALE:
		if(arg == -1) {
			retval = get_dtmf_prescale(j);
		}
		else {
			set_dtmf_prescale(j, arg);
			retval = arg;
		}
		break;
	case PHONE_REC_LEVEL:
		retval = get_rec_level(j);
		break;
	case IXJCTL_SC_RXG:
		retval = ixj_siadc(j, arg);
		break;
	case IXJCTL_SC_TXG:
		retval = ixj_sidac(j, arg);
		break;
	case IXJCTL_AEC_START:
		ixj_aec_start(j, arg);
		break;
	case IXJCTL_AEC_STOP:
		aec_stop(j);
		break;
	case IXJCTL_AEC_GET_LEVEL:
		retval = j->aec_level;
		break;
	case PHONE_PLAY_CODEC:
		retval = set_play_codec(j, arg);
		break;
	case PHONE_PLAY_START:
		retval = ixj_play_start(j);
		break;
	case PHONE_PLAY_STOP:
		ixj_play_stop(j);
		break;
	case PHONE_PLAY_DEPTH:
		set_play_depth(j, arg);
		break;
	case PHONE_PLAY_VOLUME:
		if(arg == -1) {
			retval = get_play_volume(j);
		}
		else {
			set_play_volume(j, arg);
			retval = arg;
		}
		break;
	case PHONE_PLAY_VOLUME_LINEAR:
		if(arg == -1) {
			retval = get_play_volume_linear(j);
		}
		else {
			set_play_volume_linear(j, arg);
			retval = arg;
		}
		break;
	case PHONE_PLAY_LEVEL:
		retval = get_play_level(j);
		break;
	case IXJCTL_DSP_TYPE:
		retval = (j->dsp.high << 8) + j->dsp.low;
		break;
	case IXJCTL_DSP_VERSION:
		retval = (j->ver.high << 8) + j->ver.low;
		break;
	case IXJCTL_HZ:
		hertz = arg;
		break;
	case IXJCTL_RATE:
		if (arg > hertz)
			retval = -1;
		else
			samplerate = arg;
		break;
	case IXJCTL_DRYBUFFER_READ:
		put_user(j->drybuffer, (unsigned long __user *) argp);
		break;
	case IXJCTL_DRYBUFFER_CLEAR:
		j->drybuffer = 0;
		break;
	case IXJCTL_FRAMES_READ:
		put_user(j->framesread, (unsigned long __user *) argp);
		break;
	case IXJCTL_FRAMES_WRITTEN:
		put_user(j->frameswritten, (unsigned long __user *) argp);
		break;
	case IXJCTL_READ_WAIT:
		put_user(j->read_wait, (unsigned long __user *) argp);
		break;
	case IXJCTL_WRITE_WAIT:
		put_user(j->write_wait, (unsigned long __user *) argp);
		break;
	case PHONE_MAXRINGS:
		j->maxrings = arg;
		break;
	case PHONE_SET_TONE_ON_TIME:
		ixj_set_tone_on(arg, j);
		break;
	case PHONE_SET_TONE_OFF_TIME:
		ixj_set_tone_off(arg, j);
		break;
	case PHONE_GET_TONE_ON_TIME:
		if (ixj_get_tone_on(j)) {
			retval = -1;
		} else {
			retval = (j->ssr.high << 8) + j->ssr.low;
		}
		break;
	case PHONE_GET_TONE_OFF_TIME:
		if (ixj_get_tone_off(j)) {
			retval = -1;
		} else {
			retval = (j->ssr.high << 8) + j->ssr.low;
		}
		break;
	case PHONE_PLAY_TONE:
		if (!j->tone_state)
			retval = ixj_play_tone(j, arg);
		else
			retval = -1;
		break;
	case PHONE_GET_TONE_STATE:
		retval = j->tone_state;
		break;
	case PHONE_DTMF_READY:
		retval = j->ex.bits.dtmf_ready;
		break;
	case PHONE_GET_DTMF:
		if (ixj_hookstate(j)) {
			if (j->dtmf_rp != j->dtmf_wp) {
				retval = j->dtmfbuffer[j->dtmf_rp];
				j->dtmf_rp++;
				if (j->dtmf_rp == 79)
					j->dtmf_rp = 0;
				if (j->dtmf_rp == j->dtmf_wp) {
					j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
				}
			}
		}
		break;
	case PHONE_GET_DTMF_ASCII:
		if (ixj_hookstate(j)) {
			if (j->dtmf_rp != j->dtmf_wp) {
				switch (j->dtmfbuffer[j->dtmf_rp]) {
				case 10:
					retval = 42;	/* '*'; */

					break;
				case 11:
					retval = 48;	/*'0'; */

					break;
				case 12:
					retval = 35;	/*'#'; */

					break;
				case 28:
					retval = 65;	/*'A'; */

					break;
				case 29:
					retval = 66;	/*'B'; */

					break;
				case 30:
					retval = 67;	/*'C'; */

					break;
				case 31:
					retval = 68;	/*'D'; */

					break;
				default:
					retval = 48 + j->dtmfbuffer[j->dtmf_rp];
					break;
				}
				j->dtmf_rp++;
				if (j->dtmf_rp == 79)
					j->dtmf_rp = 0;
				if(j->dtmf_rp == j->dtmf_wp)
				{
					j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
				}
			}
		}
		break;
	case PHONE_DTMF_OOB:
		j->flags.dtmf_oob = arg;
		break;
	case PHONE_DIALTONE:
		ixj_dialtone(j);
		break;
	case PHONE_BUSY:
		ixj_busytone(j);
		break;
	case PHONE_RINGBACK:
		ixj_ringback(j);
		break;
	case PHONE_WINK:
		if(j->cardtype == QTI_PHONEJACK) 
			retval = -1;
		else 
			retval = ixj_wink(j);
		break;
	case PHONE_CPT_STOP:
		ixj_cpt_stop(j);
		break;
        case PHONE_QUERY_CODEC:
        {
                struct phone_codec_data pd;
                int val;
                int proto_size[] = {
                        -1,
                        12, 10, 16, 9, 8, 48, 5,
                        40, 40, 80, 40, 40, 6
                };
                if(copy_from_user(&pd, argp, sizeof(pd))) {
                        retval = -EFAULT;
			break;
		}
                if(pd.type<1 || pd.type>13) {
                        retval = -EPROTONOSUPPORT;
			break;
		}
                if(pd.type<G729)
                        val=proto_size[pd.type];
                else switch(j->baseframe.low)
                {
                        case 0xA0:val=2*proto_size[pd.type];break;
                        case 0x50:val=proto_size[pd.type];break;
                        default:val=proto_size[pd.type]*3;break;
                }
                pd.buf_min=pd.buf_max=pd.buf_opt=val;
                if(copy_to_user(argp, &pd, sizeof(pd)))
                        retval = -EFAULT;
        	break;
        }
	case IXJCTL_DSP_IDLE:
		idle(j);
		break;
	case IXJCTL_MIXER:
                if ((arg & 0xff) == 0xff)
			retval = ixj_get_mixer(arg, j);
                else
			ixj_mixer(arg, j);
		break;
	case IXJCTL_DAA_COEFF_SET:
		switch (arg) {
		case DAA_US:
			DAA_Coeff_US(j);
			retval = ixj_daa_write(j);
			break;
		case DAA_UK:
			DAA_Coeff_UK(j);
			retval = ixj_daa_write(j);
			break;
		case DAA_FRANCE:
			DAA_Coeff_France(j);
			retval = ixj_daa_write(j);
			break;
		case DAA_GERMANY:
			DAA_Coeff_Germany(j);
			retval = ixj_daa_write(j);
			break;
		case DAA_AUSTRALIA:
			DAA_Coeff_Australia(j);
			retval = ixj_daa_write(j);
			break;
		case DAA_JAPAN:
			DAA_Coeff_Japan(j);
			retval = ixj_daa_write(j);
			break;
		default:
			retval = 1;
			break;
		}
		break;
	case IXJCTL_DAA_AGAIN:
		ixj_daa_cr4(j, arg | 0x02);
		break;
	case IXJCTL_PSTN_LINETEST:
		retval = ixj_linetest(j);
		break;
	case IXJCTL_VMWI:
		ixj_write_vmwi(j, arg);
		break;
	case IXJCTL_CID:
		if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID))) 
			retval = -EFAULT;
		j->ex.bits.caller_id = 0;
		break;
	case IXJCTL_WINK_DURATION:
		j->winktime = arg;
		break;
	case IXJCTL_PORT:
		if (arg)
			retval = ixj_set_port(j, arg);
		else
			retval = j->port;
		break;
	case IXJCTL_POTS_PSTN:
		retval = ixj_set_pots(j, arg);
		break;
	case PHONE_CAPABILITIES:
		add_caps(j);
		retval = j->caps;
		break;
	case PHONE_CAPABILITIES_LIST:
		add_caps(j);
		if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps)) 
			retval = -EFAULT;
		break;
	case PHONE_CAPABILITIES_CHECK:
		{
			struct phone_capability cap;
			if (copy_from_user(&cap, argp, sizeof(cap))) 
				retval = -EFAULT;
			else {
				add_caps(j);
				retval = capabilities_check(j, &cap);
			}
		}
		break;
	case PHONE_PSTN_SET_STATE:
		daa_set_mode(j, arg);
		break;
	case PHONE_PSTN_GET_STATE:
		retval = j->daa_mode;
		j->ex.bits.pstn_ring = 0;
		break;
	case IXJCTL_SET_FILTER:
		if (copy_from_user(&jf, argp, sizeof(jf))) 
			retval = -EFAULT;
		retval = ixj_init_filter(j, &jf);
		break;
	case IXJCTL_SET_FILTER_RAW:
		if (copy_from_user(&jfr, argp, sizeof(jfr))) 
			retval = -EFAULT;
		else
			retval = ixj_init_filter_raw(j, &jfr);
		break;
	case IXJCTL_GET_FILTER_HIST:
		if(arg<0||arg>3)
			retval = -EINVAL;
		else
			retval = j->filter_hist[arg];
		break;
	case IXJCTL_INIT_TONE:
		if (copy_from_user(&ti, argp, sizeof(ti)))
			retval = -EFAULT;
		else
			retval = ixj_init_tone(j, &ti);
		break;
	case IXJCTL_TONE_CADENCE:
		retval = ixj_build_cadence(j, argp);
		break;
	case IXJCTL_FILTER_CADENCE:
		retval = ixj_build_filter_cadence(j, argp);
		break;
	case IXJCTL_SIGCTL:
		if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
			retval = -EFAULT;
			break;
		}
		j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
		if(j->sigdef.event < 33) {
			raise = 1;
			for(mant = 0; mant < j->sigdef.event; mant++){
				raise *= 2;
			}
			if(j->sigdef.signal)
				j->ex_sig.bytes |= raise; 
			else
				j->ex_sig.bytes &= (raise^0xffff); 
		}
		break;
	case IXJCTL_INTERCOM_STOP:
		if(arg < 0 || arg >= IXJMAX)
			return -EINVAL;
		j->intercom = -1;
		ixj_record_stop(j);
		ixj_play_stop(j);
		idle(j);
		get_ixj(arg)->intercom = -1;
		ixj_record_stop(get_ixj(arg));
		ixj_play_stop(get_ixj(arg));
		idle(get_ixj(arg));
		break;
	case IXJCTL_INTERCOM_START:
		if(arg < 0 || arg >= IXJMAX)
			return -EINVAL;
		j->intercom = arg;
		ixj_record_start(j);
		ixj_play_start(j);
		get_ixj(arg)->intercom = board;
		ixj_play_start(get_ixj(arg));
		ixj_record_start(get_ixj(arg));
		break;
	}
	if (ixjdebug & 0x0040)
		printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
	clear_bit(board, &j->busyflags);
	return retval;
}

static int ixj_fasync(int fd, struct file *file_p, int mode)
{
	IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));

	return fasync_helper(fd, file_p, mode, &j->async_queue);
}

static struct file_operations ixj_fops =
{
        .owner          = THIS_MODULE,
        .read           = ixj_enhanced_read,
        .write          = ixj_enhanced_write,
        .poll           = ixj_poll,
        .ioctl          = ixj_ioctl,
        .release        = ixj_release,
        .fasync         = ixj_fasync
};

static int ixj_linetest(IXJ *j)
{
	unsigned long jifwait;

	j->flags.pstncheck = 1;	/* Testing */
	j->flags.pstn_present = 0; /* Assume the line is not there */

	daa_int_read(j);	/*Clear DAA Interrupt flags */
	/* */
	/* Hold all relays in the normally de-energized position. */
	/* */

	j->pld_slicw.bits.rly1 = 0;
	j->pld_slicw.bits.rly2 = 0;
	j->pld_slicw.bits.rly3 = 0;
	outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
	j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */

	outb_p(j->pld_scrw.byte, j->XILINXbase);
	j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
	if (j->pld_slicr.bits.potspstn) {
		j->flags.pots_pstn = 1;
		j->flags.pots_correct = 0;
		LED_SetState(0x4, j);
	} else {
		j->flags.pots_pstn = 0;
		j->pld_slicw.bits.rly1 = 0;
		j->pld_slicw.bits.rly2 = 0;
		j->pld_slicw.bits.rly3 = 1;
		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */

		outb_p(j->pld_scrw.byte, j->XILINXbase);
		daa_set_mode(j, SOP_PU_CONVERSATION);
		jifwait = jiffies + hertz;
		while (time_before(jiffies, jifwait)) {
			set_current_state(TASK_INTERRUPTIBLE);
			schedule_timeout(1);
		}
		daa_int_read(j);
		daa_set_mode(j, SOP_PU_RESET);
		if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
			j->flags.pots_correct = 0;	/* Should not be line voltage on POTS port. */
			LED_SetState(0x4, j);
			j->pld_slicw.bits.rly3 = 0;
			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
		} else {
			j->flags.pots_correct = 1;
			LED_SetState(0x8, j);
			j->pld_slicw.bits.rly1 = 1;
			j->pld_slicw.bits.rly2 = 0;
			j->pld_slicw.bits.rly3 = 0;
			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
		}
	}
	j->pld_slicw.bits.rly3 = 0;
	outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
	daa_set_mode(j, SOP_PU_CONVERSATION);
	jifwait = jiffies + hertz;
	while (time_before(jiffies, jifwait)) {
		set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout(1);
	}
	daa_int_read(j);
	daa_set_mode(j, SOP_PU_RESET);
	if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
		j->pstn_sleeptil = jiffies + (hertz / 4);
		j->flags.pstn_present = 1;
	} else {
		j->flags.pstn_present = 0;
	}
	if (j->flags.pstn_present) {
		if (j->flags.pots_correct) {
			LED_SetState(0xA, j);
		} else {
			LED_SetState(0x6, j);
		}
	} else {
		if (j->flags.pots_correct) {
			LED_SetState(0x9, j);
		} else {
			LED_SetState(0x5, j);
		}
	}
	j->flags.pstncheck = 0;	/* Testing */
	return j->flags.pstn_present;
}

static int ixj_selfprobe(IXJ *j)
{
	unsigned short cmd;
	unsigned long jif;
	int cnt;
	BYTES bytes;

        init_waitqueue_head(&j->poll_q);
        init_waitqueue_head(&j->read_q);
        init_waitqueue_head(&j->write_q);

	while(atomic_read(&j->DSPWrite) > 0)
		atomic_dec(&j->DSPWrite);
	if (ixjdebug & 0x0002)
		printk(KERN_INFO "Write IDLE to Software Control Register\n");
	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */

	if (ixj_WriteDSPCommand(0x0000, j))		/* Write IDLE to Software Control Register */
		return -1;
/* The read values of the SSR should be 0x00 for the IDLE command */
	if (j->ssr.low || j->ssr.high)
		return -1;
	if (ixjdebug & 0x0002)
		printk(KERN_INFO "Get Device ID Code\n");
	if (ixj_WriteDSPCommand(0x3400, j))		/* Get Device ID Code */
		return -1;
	j->dsp.low = j->ssr.low;
	j->dsp.high = j->ssr.high;
	if (ixjdebug & 0x0002)
		printk(KERN_INFO "Get Device Version Code\n");
	if (ixj_WriteDSPCommand(0x3800, j))		/* Get Device Version Code */
		return -1;
	j->ver.low = j->ssr.low;
	j->ver.high = j->ssr.high;
	if (!j->cardtype) {
		if (j->dsp.low == 0x21) {
			bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
			outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
/* Test for Internet LineJACK or Internet PhoneJACK Lite */
			bytes.low = inb_p(j->XILINXbase + 0x02);
			if (bytes.low == bytes.high)	/*  Register is read only on */
				/*  Internet PhoneJack Lite */
			 {
				j->cardtype = QTI_PHONEJACK_LITE;
				if (!request_region(j->XILINXbase, 4, "ixj control")) {
					printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
					return -1;
				}
				j->pld_slicw.pcib.e1 = 1;
				outb_p(j->pld_slicw.byte, j->XILINXbase);
			} else {
				j->cardtype = QTI_LINEJACK;

				if (!request_region(j->XILINXbase, 8, "ixj control")) {
					printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
					return -1;
				}
			}
		} else if (j->dsp.low == 0x22) {
			j->cardtype = QTI_PHONEJACK_PCI;
			request_region(j->XILINXbase, 4, "ixj control");
			j->pld_slicw.pcib.e1 = 1;
			outb_p(j->pld_slicw.byte, j->XILINXbase);
		} else
			j->cardtype = QTI_PHONEJACK;
	} else {
		switch (j->cardtype) {
		case QTI_PHONEJACK:
			if (!j->dsp.low != 0x20) {
				j->dsp.high = 0x80;
				j->dsp.low = 0x20;
				ixj_WriteDSPCommand(0x3800, j);
				j->ver.low = j->ssr.low;
				j->ver.high = j->ssr.high;
			}
			break;
		case QTI_LINEJACK:
			if (!request_region(j->XILINXbase, 8, "ixj control")) {
				printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
				return -1;
			}
			break;
		case QTI_PHONEJACK_LITE:
		case QTI_PHONEJACK_PCI:
			if (!request_region(j->XILINXbase, 4, "ixj control")) {
				printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
				return -1;
			}
			j->pld_slicw.pcib.e1 = 1;
			outb_p(j->pld_slicw.byte, j->XILINXbase);
			break;
		case QTI_PHONECARD:
			break;
		}
	}
	if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
		if (ixjdebug & 0x0002)
			printk(KERN_INFO "Write CODEC config to Software Control Register\n");
		if (ixj_WriteDSPCommand(0xC462, j))		/* Write CODEC config to Software Control Register */
			return -1;
		if (ixjdebug & 0x0002)
			printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
		if (j->cardtype == QTI_PHONEJACK) {
			cmd = 0x9FF2;
		} else {
			cmd = 0x9FF5;
		}
		if (ixj_WriteDSPCommand(cmd, j))	/* Write CODEC timing to Software Control Register */
			return -1;
	} else {
		if (set_base_frame(j, 30) != 30)
			return -1;
		if (ixjdebug & 0x0002)
			printk(KERN_INFO "Write CODEC config to Software Control Register\n");
		if (j->cardtype == QTI_PHONECARD) {
			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to Software Control Register */
				return -1;
		}
		if (j->cardtype == QTI_LINEJACK) {
			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to Software Control Register */
				return -1;
			if (ixjdebug & 0x0002)
				printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
			j->pld_clock.byte = 0;
			outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
		}
	}

	if (j->dsp.low == 0x20) {
		if (ixjdebug & 0x0002)
			printk(KERN_INFO "Configure GPIO pins\n");
		j->gpio.bytes.high = 0x09;
/*  bytes.low = 0xEF;  0xF7 */
		j->gpio.bits.gpio1 = 1;
		j->gpio.bits.gpio2 = 1;
		j->gpio.bits.gpio3 = 0;
		j->gpio.bits.gpio4 = 1;
		j->gpio.bits.gpio5 = 1;
		j->gpio.bits.gpio6 = 1;
		j->gpio.bits.gpio7 = 1;
		ixj_WriteDSPCommand(j->gpio.word, j);	/* Set GPIO pin directions */
		if (ixjdebug & 0x0002)
			printk(KERN_INFO "Enable SLIC\n");
		j->gpio.bytes.high = 0x0B;
		j->gpio.bytes.low = 0x00;
		j->gpio.bits.gpio1 = 0;
		j->gpio.bits.gpio2 = 1;
		j->gpio.bits.gpio5 = 0;
		ixj_WriteDSPCommand(j->gpio.word, j);	/* send the ring stop signal */
		j->port = PORT_POTS;
	} else {
		if (j->cardtype == QTI_LINEJACK) {
			LED_SetState(0x1, j);
			jif = jiffies + (hertz / 10);
			while (time_before(jiffies, jif)) {
				set_current_state(TASK_INTERRUPTIBLE);
				schedule_timeout(1);
			}
			LED_SetState(0x2, j);
			jif = jiffies + (hertz / 10);
			while (time_before(jiffies, jif)) {
				set_current_state(TASK_INTERRUPTIBLE);
				schedule_timeout(1);
			}
			LED_SetState(0x4, j);
			jif = jiffies + (hertz / 10);
			while (time_before(jiffies, jif)) {
				set_current_state(TASK_INTERRUPTIBLE);
				schedule_timeout(1);
			}
			LED_SetState(0x8, j);
			jif = jiffies + (hertz / 10);
			while (time_before(jiffies, jif)) {
				set_current_state(TASK_INTERRUPTIBLE);
				schedule_timeout(1);
			}
			LED_SetState(0x0, j);
			daa_get_version(j);
			if (ixjdebug & 0x0002)
				printk("Loading DAA Coefficients\n");
			DAA_Coeff_US(j);
			if (!ixj_daa_write(j)) {
				printk("DAA write failed on board %d\n", j->board);
				return -1;
			}
			if(!ixj_daa_cid_reset(j)) {
				printk("DAA CID reset failed on board %d\n", j->board);
				return -1;
			}
			j->flags.pots_correct = 0;
			j->flags.pstn_present = 0;
			ixj_linetest(j);
			if (j->flags.pots_correct) {
				j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */

				outb_p(j->pld_scrw.byte, j->XILINXbase);
				j->pld_slicw.bits.rly1 = 1;
				j->pld_slicw.bits.spken = 1;
				outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
				SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
/*				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
				j->port = PORT_POTS;
			}
			ixj_set_port(j, PORT_PSTN);
			ixj_set_pots(j, 1);
			if (ixjdebug & 0x0002)
				printk(KERN_INFO "Enable Mixer\n");
			ixj_mixer(0x0000, j);	/*Master Volume Left unmute 0db */
			ixj_mixer(0x0100, j);	/*Master Volume Right unmute 0db */

			ixj_mixer(0x0203, j);	/*Voice Left Volume unmute 6db */
			ixj_mixer(0x0303, j);	/*Voice Right Volume unmute 6db */

			ixj_mixer(0x0480, j);	/*FM Left mute */
			ixj_mixer(0x0580, j);	/*FM Right mute */

			ixj_mixer(0x0680, j);	/*CD Left mute */
			ixj_mixer(0x0780, j);	/*CD Right mute */

			ixj_mixer(0x0880, j);	/*Line Left mute */
			ixj_mixer(0x0980, j);	/*Line Right mute */

			ixj_mixer(0x0A80, j);	/*Aux left mute  */
			ixj_mixer(0x0B80, j);	/*Aux right mute */

			ixj_mixer(0x0C00, j);	/*Mono1 unmute 12db */
			ixj_mixer(0x0D80, j);	/*Mono2 mute */

			ixj_mixer(0x0E80, j);	/*Mic mute */

			ixj_mixer(0x0F00, j);	/*Mono Out Volume unmute 0db */

			ixj_mixer(0x1000, j);	/*Voice Left and Right out only */
			ixj_mixer(0x110C, j);


			ixj_mixer(0x1200, j);	/*Mono1 switch on mixer left */
			ixj_mixer(0x1401, j);

			ixj_mixer(0x1300, j);       /*Mono1 switch on mixer right */
			ixj_mixer(0x1501, j);

			ixj_mixer(0x1700, j);	/*Clock select */

			ixj_mixer(0x1800, j);	/*ADC input from mixer */

			ixj_mixer(0x1901, j);	/*Mic gain 30db */

			if (ixjdebug & 0x0002)
				printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
			j->cadence_f[4].state = 0;
			j->cadence_f[4].on1 = 0;	/*Cadence Filter 4 is used for PSTN ring cadence */
			j->cadence_f[4].off1 = 0;
			j->cadence_f[4].on2 = 0;
			j->cadence_f[4].off2 = 0;
			j->cadence_f[4].on3 = 0;
			j->cadence_f[4].off3 = 0;	/* These should represent standard US ring pulse. */
			j->pstn_last_rmr = jiffies;

		} else {
			if (j->cardtype == QTI_PHONECARD) {
				ixj_WriteDSPCommand(0xCF07, j);
				ixj_WriteDSPCommand(0x00B0, j);
				ixj_set_port(j, PORT_SPEAKER);
			} else {
				ixj_set_port(j, PORT_POTS);
				SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
/*				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
			}
		}
	}

	j->intercom = -1;
	j->framesread = j->frameswritten = 0;
	j->read_wait = j->write_wait = 0;
	j->rxreadycheck = j->txreadycheck = 0;

	/* initialise the DTMF prescale to a sensible value */
	if (j->cardtype == QTI_LINEJACK) {
		set_dtmf_prescale(j, 0x10); 
	} else {
		set_dtmf_prescale(j, 0x40); 
	}
	set_play_volume(j, 0x100);
	set_rec_volume(j, 0x100);

	if (ixj_WriteDSPCommand(0x0000, j))		/* Write IDLE to Software Control Register */
		return -1;
/* The read values of the SSR should be 0x00 for the IDLE command */
	if (j->ssr.low || j->ssr.high)
		return -1;

	if (ixjdebug & 0x0002)
		printk(KERN_INFO "Enable Line Monitor\n");

	if (ixjdebug & 0x0002)
		printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");

	if (ixj_WriteDSPCommand(0x7E01, j))		/* Asynchronous Line Monitor */
		return -1;

	if (ixjdebug & 0x002)
		printk(KERN_INFO "Enable DTMF Detectors\n");

	if (ixj_WriteDSPCommand(0x5151, j))		/* Enable DTMF detection */
		return -1;

	if (ixj_WriteDSPCommand(0x6E01, j))		/* Set Asyncronous Tone Generation */
		return -1;

	set_rec_depth(j, 2);	/* Set Record Channel Limit to 2 frames */

	set_play_depth(j, 2);	/* Set Playback Channel Limit to 2 frames */

	j->ex.bits.dtmf_ready = 0;
	j->dtmf_state = 0;
	j->dtmf_wp = j->dtmf_rp = 0;
	j->rec_mode = j->play_mode = -1;
	j->flags.ringing = 0;
	j->maxrings = MAXRINGS;
	j->ring_cadence = USA_RING_CADENCE;
	j->drybuffer = 0;
	j->winktime = 320;
	j->flags.dtmf_oob = 0;
	for (cnt = 0; cnt < 4; cnt++)
		j->cadence_f[cnt].enable = 0;
	/* must be a device on the specified address */
	ixj_WriteDSPCommand(0x0FE3, j);	/* Put the DSP in 1/5 power mode. */

	/* Set up the default signals for events */
	for (cnt = 0; cnt < 35; cnt++)
		j->ixj_signals[cnt] = SIGIO;

	/* Set the excetion signal enable flags */
	j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring = 
	j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 = 
	j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1;
#ifdef IXJ_DYN_ALLOC
	j->fskdata = NULL;
#endif
	j->fskdcnt = 0;
	j->cidcw_wait = 0;
 
	/* Register with the Telephony for Linux subsystem */
	j->p.f_op = &ixj_fops;
	j->p.open = ixj_open;
	j->p.board = j->board;
	phone_register_device(&j->p, PHONE_UNIT_ANY);

	ixj_init_timer(j);
	ixj_add_timer(j);
	return 0;
}

/*
 *	Exported service for pcmcia card handling
 */
 
IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
{
	IXJ *j = ixj_alloc();

	j->board = 0;

	j->DSPbase = dsp;
	j->XILINXbase = xilinx;
	j->cardtype = QTI_PHONECARD;
	ixj_selfprobe(j);
	return j;
}

EXPORT_SYMBOL(ixj_pcmcia_probe);		/* Fpr PCMCIA */

static int ixj_get_status_proc(char *buf)
{
	int len;
	int cnt;
	IXJ *j;
	len = 0;
	len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
	len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
	len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
	len += sprintf(buf + len, "\nUsing old telephony API");
	len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);

	for (cnt = 0; cnt < IXJMAX; cnt++) {
		j = get_ixj(cnt);
		if(j==NULL)
			continue;
		if (j->DSPbase) {
			len += sprintf(buf + len, "\nCard Num %d", cnt);
			len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
			if (j->cardtype != QTI_PHONEJACK)
				len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
			len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
			len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
			len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
			switch (j->cardtype) {
			case (QTI_PHONEJACK):
				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
				break;
			case (QTI_LINEJACK):
				len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
				if (j->flags.g729_loaded)
					len += sprintf(buf + len, " w/G.729 A/B");
				len += sprintf(buf + len, " Country = %d", j->daa_country);
				break;
			case (QTI_PHONEJACK_LITE):
				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
				if (j->flags.g729_loaded)
					len += sprintf(buf + len, " w/G.729 A/B");
				break;
			case (QTI_PHONEJACK_PCI):
				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
				if (j->flags.g729_loaded)
					len += sprintf(buf + len, " w/G.729 A/B");
				break;
			case (QTI_PHONECARD):
				len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
				if (j->flags.g729_loaded)
					len += sprintf(buf + len, " w/G.729 A/B");
				len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
				if (!j->pccr1.bits.drf)
					len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
				len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
				break;
			default:
				len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
				break;
			}
			len += sprintf(buf + len, "\nReaders %d", j->readers);
			len += sprintf(buf + len, "\nWriters %d", j->writers);
			add_caps(j);
			len += sprintf(buf + len, "\nCapabilities %d", j->caps);
			if (j->dsp.low != 0x20)
				len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
			if (j->flags.cidsent)
				len += sprintf(buf + len, "\nCaller ID data sent");
			else
				len += sprintf(buf + len, "\nCaller ID data not sent");

			len += sprintf(buf + len, "\nPlay CODEC ");
			switch (j->play_codec) {
			case G723_63:
				len += sprintf(buf + len, "G.723.1 6.3");
				break;
			case G723_53:
				len += sprintf(buf + len, "G.723.1 5.3");
				break;
			case TS85:
				len += sprintf(buf + len, "TrueSpeech 8.5");
				break;
			case TS48:
				len += sprintf(buf + len, "TrueSpeech 4.8");
				break;
			case TS41:
				len += sprintf(buf + len, "TrueSpeech 4.1");
				break;
			case G728:
				len += sprintf(buf + len, "G.728");
				break;
			case G729:
				len += sprintf(buf + len, "G.729");
				break;
			case G729B:
				len += sprintf(buf + len, "G.729B");
				break;
			case ULAW:
				len += sprintf(buf + len, "uLaw");
				break;
			case ALAW:
				len += sprintf(buf + len, "aLaw");
				break;
			case LINEAR16:
				len += sprintf(buf + len, "16 bit Linear");
				break;
			case LINEAR8:
				len += sprintf(buf + len, "8 bit Linear");
				break;
			case WSS:
				len += sprintf(buf + len, "Windows Sound System");
				break;
			default:
				len += sprintf(buf + len, "NO CODEC CHOSEN");
				break;
			}
			len += sprintf(buf + len, "\nRecord CODEC ");
			switch (j->rec_codec) {
			case G723_63:
				len += sprintf(buf + len, "G.723.1 6.3");
				break;
			case G723_53:
				len += sprintf(buf + len, "G.723.1 5.3");
				break;
			case TS85:
				len += sprintf(buf + len, "TrueSpeech 8.5");
				break;
			case TS48:
				len += sprintf(buf + len, "TrueSpeech 4.8");
				break;
			case TS41:
				len += sprintf(buf + len, "TrueSpeech 4.1");
				break;
			case G728:
				len += sprintf(buf + len, "G.728");
				break;
			case G729:
				len += sprintf(buf + len, "G.729");
				break;
			case G729B:
				len += sprintf(buf + len, "G.729B");
				break;
			case ULAW:
				len += sprintf(buf + len, "uLaw");
				break;
			case ALAW:
				len += sprintf(buf + len, "aLaw");
				break;
			case LINEAR16:
				len += sprintf(buf + len, "16 bit Linear");
				break;
			case LINEAR8:
				len += sprintf(buf + len, "8 bit Linear");
				break;
			case WSS:
				len += sprintf(buf + len, "Windows Sound System");
				break;
			default:
				len += sprintf(buf + len, "NO CODEC CHOSEN");
				break;
			}
			len += sprintf(buf + len, "\nAEC ");
			switch (j->aec_level) {
			case AEC_OFF:
				len += sprintf(buf + len, "Off");
				break;
			case AEC_LOW:
				len += sprintf(buf + len, "Low");
				break;
			case AEC_MED:
				len += sprintf(buf + len, "Med");
				break;
			case AEC_HIGH:
				len += sprintf(buf + len, "High");
				break;
			case AEC_AUTO:
				len += sprintf(buf + len, "Auto");
				break;
			case AEC_AGC:
				len += sprintf(buf + len, "AEC/AGC");
				break;
			default:
				len += sprintf(buf + len, "unknown(%i)", j->aec_level);
				break;
			}

			len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
			len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
			len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
			
			len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook);	*/

			if (j->cardtype == QTI_LINEJACK) {
				len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
				len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
				len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
				len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
				switch (j->daa_mode) {
				case SOP_PU_SLEEP:
					len += sprintf(buf + len, "\nDAA PSTN On Hook");
					break;
				case SOP_PU_RINGING:
					len += sprintf(buf + len, "\nDAA PSTN Ringing");
					len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
					break;
				case SOP_PU_CONVERSATION:
					len += sprintf(buf + len, "\nDAA PSTN Off Hook");
					break;
				case SOP_PU_PULSEDIALING:
					len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
					break;
				}
				len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
				len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
				len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
				len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
				len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
				len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
				len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
				len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
				len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
				len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
			}
			switch (j->port) {
			case PORT_POTS:
				len += sprintf(buf + len, "\nPort POTS");
				break;
			case PORT_PSTN:
				len += sprintf(buf + len, "\nPort PSTN");
				break;
			case PORT_SPEAKER:
				len += sprintf(buf + len, "\nPort SPEAKER/MIC");
				break;
			case PORT_HANDSET:
				len += sprintf(buf + len, "\nPort HANDSET");
				break;
			}
			if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
				len += sprintf(buf + len, "\nSLIC state ");
				switch (SLIC_GetState(j)) {
				case PLD_SLIC_STATE_OC:
					len += sprintf(buf + len, "OC");
					break;
				case PLD_SLIC_STATE_RINGING:
					len += sprintf(buf + len, "RINGING");
					break;
				case PLD_SLIC_STATE_ACTIVE:
					len += sprintf(buf + len, "ACTIVE");
					break;
				case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
					len += sprintf(buf + len, "OHT");
					break;
				case PLD_SLIC_STATE_TIPOPEN:
					len += sprintf(buf + len, "TIPOPEN");
					break;
				case PLD_SLIC_STATE_STANDBY:
					len += sprintf(buf + len, "STANDBY");
					break;
				case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
					len += sprintf(buf + len, "APR");
					break;
				case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
					len += sprintf(buf + len, "OHTPR");
					break;
				default:
					len += sprintf(buf + len, "%d", SLIC_GetState(j));
					break;
				}
			}
			len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
			len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
#ifdef PERFMON_STATS
			len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
			len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
			len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
			len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
			len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
			len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
			len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
			len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
                        len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
                        len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
                        len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
                        len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
                        len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
                        len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
 
#endif
			len += sprintf(buf + len, "\n");
		}
	}
	return len;
}

static int ixj_read_proc(char *page, char **start, off_t off,
                              int count, int *eof, void *data)
{
        int len = ixj_get_status_proc(page);
        if (len <= off+count) *eof = 1;
        *start = page + off;
        len -= off;
        if (len>count) len = count;
        if (len<0) len = 0;
        return len;
}


static void cleanup(void)
{
	int cnt;
	IXJ *j;

	for (cnt = 0; cnt < IXJMAX; cnt++) {
		j = get_ixj(cnt);
		if(j != NULL && j->DSPbase) {
			if (ixjdebug & 0x0002)
				printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
			del_timer(&j->timer);
			if (j->cardtype == QTI_LINEJACK) {
				j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */

				outb_p(j->pld_scrw.byte, j->XILINXbase);
				j->pld_slicw.bits.rly1 = 0;
				j->pld_slicw.bits.rly2 = 0;
				j->pld_slicw.bits.rly3 = 0;
				outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
				LED_SetState(0x0, j);
				if (ixjdebug & 0x0002)
					printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
				release_region(j->XILINXbase, 8);
			} else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
				if (ixjdebug & 0x0002)
					printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
				release_region(j->XILINXbase, 4);
			}
			if (j->read_buffer)
				kfree(j->read_buffer);
			if (j->write_buffer)
				kfree(j->write_buffer);
			if (j->dev)
				pnp_device_detach(j->dev);
			if (ixjdebug & 0x0002)
				printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
			phone_unregister_device(&j->p);
			if (ixjdebug & 0x0002)
				printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
			release_region(j->DSPbase, 16);
#ifdef IXJ_DYN_ALLOC
			if (ixjdebug & 0x0002)
				printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
			kfree(j);
			ixj[cnt] = NULL;
#endif
		}
	}
	if (ixjdebug & 0x0002)
		printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
	remove_proc_entry ("ixj", NULL);
}

/* Typedefs */
typedef struct {
	BYTE length;
	DWORD bits;
} DATABLOCK;

static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
{
	lastLCC = lastLCC & 0xfb;
	lastLCC = lastLCC | (byData ? 4 : 0);
	outb(lastLCC, wEEPROMAddress);	/*set data out bit as appropriate */

	mdelay(1);
	lastLCC = lastLCC | 0x01;
	outb(lastLCC, wEEPROMAddress);	/*SK rising edge */

	byData = byData << 1;
	lastLCC = lastLCC & 0xfe;
	mdelay(1);
	outb(lastLCC, wEEPROMAddress);	/*after delay, SK falling edge */

}

static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
{
	mdelay(1);
	lastLCC = lastLCC | 0x01;
	outb(lastLCC, wEEPROMAddress);	/*SK rising edge */

	lastLCC = lastLCC & 0xfe;
	mdelay(1);
	outb(lastLCC, wEEPROMAddress);	/*after delay, SK falling edge */

	return ((inb(wEEPROMAddress) >> 3) & 1);
}

static BOOL PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
{
	BYTE lastLCC;
	WORD wEEPROMAddress = wAddress + 3;
	DWORD i;
	BYTE byResult;
	*pwResult = 0;
	lastLCC = inb(wEEPROMAddress);
	lastLCC = lastLCC | 0x02;
	lastLCC = lastLCC & 0xfe;
	outb(lastLCC, wEEPROMAddress);	/* CS hi, SK lo */

	mdelay(1);		/* delay */

	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
	for (i = 0; i < 8; i++) {
		PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
		wLoc <<= 1;
	}

	for (i = 0; i < 16; i++) {
		byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
		*pwResult = (*pwResult << 1) | byResult;
	}

	mdelay(1);		/* another delay */

	lastLCC = lastLCC & 0xfd;
	outb(lastLCC, wEEPROMAddress);	/* negate CS */

	return 0;
}

static DWORD PCIEE_GetSerialNumber(WORD wAddress)
{
	WORD wLo, wHi;
	if (PCIEE_ReadWord(wAddress, 62, &wLo))
		return 0;
	if (PCIEE_ReadWord(wAddress, 63, &wHi))
		return 0;
	return (((DWORD) wHi << 16) | wLo);
}

static int dspio[IXJMAX + 1] =
{
	0,
};
static int xio[IXJMAX + 1] =
{
	0,
};

module_param_array(dspio, int, NULL, 0);
module_param_array(xio, int, NULL, 0);
MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
MODULE_LICENSE("GPL");

static void __exit ixj_exit(void)
{
        cleanup();
}

static IXJ *new_ixj(unsigned long port)
{
	IXJ *res;
	if (!request_region(port, 16, "ixj DSP")) {
		printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
		return NULL;
	}
	res = ixj_alloc();
	if (!res) {
		release_region(port, 16);
		printk(KERN_INFO "ixj: out of memory\n");
		return NULL;
	}
	res->DSPbase = port;
	return res;
}

static int __init ixj_probe_isapnp(int *cnt)
{               
	int probe = 0;
	int func = 0x110;
        struct pnp_dev *dev = NULL, *old_dev = NULL;

	while (1) {
		do {
			IXJ *j;
			int result;

			old_dev = dev;
			dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
					 ISAPNP_FUNCTION(func), old_dev);
			if (!dev || !dev->card)
				break;
			result = pnp_device_attach(dev);
			if (result < 0) {
				printk("pnp attach failed %d \n", result);
				break;
			}
			if (pnp_activate_dev(dev) < 0) {
				printk("pnp activate failed (out of resources?)\n");
				pnp_device_detach(dev);
				return -ENOMEM;
			}

			if (!pnp_port_valid(dev, 0)) {
				pnp_device_detach(dev);
				return -ENODEV;
			}

			j = new_ixj(pnp_port_start(dev, 0));
			if (!j)
				break;

			if (func != 0x110)
				j->XILINXbase = pnp_port_start(dev, 1);	/* get real port */

			switch (func) {
			case (0x110):
				j->cardtype = QTI_PHONEJACK;
				break;
			case (0x310):
				j->cardtype = QTI_LINEJACK;
				break;
			case (0x410):
				j->cardtype = QTI_PHONEJACK_LITE;
				break;
			}
			j->board = *cnt;
			probe = ixj_selfprobe(j);
			if(!probe) {
				j->serial = dev->card->serial;
				j->dev = dev;
				switch (func) {
				case 0x110:
					printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
					break;
				case 0x310:
					printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
					break;
				case 0x410:
					printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
					break;
				}
			}
			++*cnt;
		} while (dev);
		if (func == 0x410)
			break;
		if (func == 0x310)
			func = 0x410;
		if (func == 0x110)
			func = 0x310;
		dev = NULL;
	}
	return probe;
}
                        
static int __init ixj_probe_isa(int *cnt)
{
	int i, probe;

	/* Use passed parameters for older kernels without PnP */
	for (i = 0; i < IXJMAX; i++) {
		if (dspio[i]) {
			IXJ *j = new_ixj(dspio[i]);

			if (!j)
				break;

			j->XILINXbase = xio[i];
			j->cardtype = 0;

			j->board = *cnt;
			probe = ixj_selfprobe(j);
			j->dev = NULL;
			++*cnt;
		}
	}
	return 0;
}

static int __init ixj_probe_pci(int *cnt)
{
	struct pci_dev *pci = NULL;   
	int i, probe = 0;
	IXJ *j = NULL;

	for (i = 0; i < IXJMAX - *cnt; i++) {
		pci = pci_find_device(0x15E2, 0x0500, pci);
		if (!pci)
			break;

		if (pci_enable_device(pci))
			break;
		j = new_ixj(pci_resource_start(pci, 0));
		if (!j)
			break;

		j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
		j->XILINXbase = j->DSPbase + 0x10;
		j->cardtype = QTI_PHONEJACK_PCI;
		j->board = *cnt;
		probe = ixj_selfprobe(j);
		if (!probe)
			printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
		++*cnt;
	}
	return probe;
}

static int __init ixj_init(void)
{
	int cnt = 0;
	int probe = 0;   

	cnt = 0;

	/* These might be no-ops, see above. */
	if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
		return probe;
	}
	if ((probe = ixj_probe_isa(&cnt)) < 0) {
		return probe;
	}
	if ((probe = ixj_probe_pci(&cnt)) < 0) {
		return probe;
	}
	printk(KERN_INFO "ixj driver initialized.\n");
	create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
	return probe;
}

module_init(ixj_init);
module_exit(ixj_exit);

static void DAA_Coeff_US(IXJ *j)
{
	int i;

	j->daa_country = DAA_US;
	/*----------------------------------------------- */
	/* CAO */
	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
	}

/* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
/* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
/* Bytes for FRX-filter       (08): 03,8F,48,F2,8F,48,70,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
/* Bytes for FRR-filter       (07): 04,8F,38,7F,9B,EA,B0,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
/* Bytes for AX-filter        (0A): 16,55,DD,CA */
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
/* Bytes for AR-filter        (09): 52,D3,11,42 */
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
/* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
/* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
/* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
/* ;  (10K, 0.68uF) */
	/*  */
	/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
	/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;

	/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;

	/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
	/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */ 
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
/* */
	/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
/*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
/*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */

	/* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
/* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
/*  */
	/* ;CR Registers */
	/* Config. Reg. 0 (filters)       (cr0):FE ; CLK gen. by crystal */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
/* Config. Reg. 1 (dialing)       (cr1):05 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
/* Config. Reg. 2 (caller ID)     (cr2):04 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
/* Config. Reg. 3 (testloops)     (cr3):03 ; SEL Bit==0, HP-disabled */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
/* Config. Reg. 4 (analog gain)   (cr4):02 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
	/* Config. Reg. 5 (Version)       (cr5):02 */
	/* Config. Reg. 6 (Reserved)      (cr6):00 */
	/* Config. Reg. 7 (Reserved)      (cr7):00 */
	/*  */
	/* ;xr Registers */
	/* Ext. Reg. 0 (Interrupt Reg.)   (xr0):02 */

	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
	/* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
/* Ext. Reg. 3 (DC Char)          (xr3):32 ; B-Filter Off == 1 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B;		/*0x32; */
	/* Ext. Reg. 4 (Cadence)          (xr4):00 */

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
/* Ext. Reg. 5 (Ring timer)       (xr5):22 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
/* Ext. Reg. 6 (Power State)      (xr6):00 */
	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
/* Ext. Reg. 7 (Vdd)              (xr7):40 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
	/*  */
	/* DTMF Tone 1                     (0B): 11,B3,5A,2C ;   697 Hz   */
	/*                                       12,33,5A,C3 ;  770 Hz   */
	/*                                       13,3C,5B,32 ;  852 Hz   */
	/*                                       1D,1B,5C,CC ;  941 Hz   */

	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
/* DTMF Tone 2                     (0C): 32,32,52,B3 ;  1209 Hz   */
	/*                                       EC,1D,52,22 ;  1336 Hz   */
	/*                                       AA,AC,51,D2 ;  1477 Hz   */
	/*                                       9B,3B,51,25 ;  1633 Hz   */
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
}

static void DAA_Coeff_UK(IXJ *j)
{
	int i;

	j->daa_country = DAA_UK;
	/*----------------------------------------------- */
	/* CAO */
	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
	}

/*  Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
/* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
/* Bytes for FRX-filter       (08): 07,9B,ED,24,B2,A2,A0,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
/* Bytes for FRR-filter       (07): 0F,92,F2,B2,87,D2,30,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
/* Bytes for AX-filter        (0A): 1B,A5,DD,CA */
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
/* Bytes for AR-filter        (09): E2,27,10,D6 */
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
/* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
/* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
/* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
/* ; idle */
	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
/* Levelmetering Ringing           (0D):AA,35,0F,8E     ; 25Hz 30V less possible? */
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
/* ;CR Registers */
	/* Config. Reg. 0 (filters)        (cr0):FF */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
/* Config. Reg. 1 (dialing)        (cr1):05 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
/* Config. Reg. 2 (caller ID)      (cr2):04 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
/* Config. Reg. 4 (analog gain)    (cr4):02 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
	/* Config. Reg. 5 (Version)        (cr5):02 */
	/* Config. Reg. 6 (Reserved)       (cr6):00 */
	/* Config. Reg. 7 (Reserved)       (cr7):00 */
	/* ;xr Registers */
	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */

	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
/* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
/* Ext. Reg. 4 (Cadence)           (xr4):00 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
/* Ext. Reg. 6 (Power State)       (xr6):00 */
	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
/* Ext. Reg. 7 (Vdd)               (xr7):46 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;		/* 0x46 ??? Should it be 0x00? */
	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
	/*                                       12,33,5A,C3    ;  770 Hz   */
	/*                                       13,3C,5B,32    ;  852 Hz   */
	/*                                       1D,1B,5C,CC    ;  941 Hz   */

	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
	/*                                       EC,1D,52,22    ;  1336 Hz   */
	/*                                       AA,AC,51,D2    ;  1477 Hz   */
	/*                                       9B,3B,51,25    ;  1633 Hz   */
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
}


static void DAA_Coeff_France(IXJ *j)
{
	int i;

	j->daa_country = DAA_FRANCE;
	/*----------------------------------------------- */
	/* CAO */
	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
	}

/* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
/* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
/* Bytes for FRX-filter       (08): 07,9A,28,F6,23,4A,B0,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
/* Bytes for FRR-filter       (07): 03,8F,F9,2F,9E,FA,20,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
/* Bytes for AX-filter        (0A): 16,B5,DD,CA */
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
/* Bytes for AR-filter        (09): 52,C7,10,D6 */
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
/* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
/* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
/* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
/* ; idle */
	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
/* Levelmetering Ringing           (0D):32,45,B5,84     ; 50Hz 20V */
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
/* ;CR Registers */
	/* Config. Reg. 0 (filters)        (cr0):FF */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
/* Config. Reg. 1 (dialing)        (cr1):05 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
/* Config. Reg. 2 (caller ID)      (cr2):04 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
/* Config. Reg. 4 (analog gain)    (cr4):02 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
	/* Config. Reg. 5 (Version)        (cr5):02 */
	/* Config. Reg. 6 (Reserved)       (cr6):00 */
	/* Config. Reg. 7 (Reserved)       (cr7):00 */
	/* ;xr Registers */
	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */

	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
/* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
/* Ext. Reg. 4 (Cadence)           (xr4):00 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
/* Ext. Reg. 6 (Power State)       (xr6):00 */
	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
/* Ext. Reg. 7 (Vdd)               (xr7):46 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;		/* 0x46 ??? Should it be 0x00? */
	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
	/*                                       12,33,5A,C3    ;  770 Hz   */
	/*                                       13,3C,5B,32    ;  852 Hz   */
	/*                                       1D,1B,5C,CC    ;  941 Hz   */

	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
	/*                                       EC,1D,52,22    ;  1336 Hz   */
	/*                                       AA,AC,51,D2    ;  1477 Hz   */
	/*                                       9B,3B,51,25    ;  1633 Hz   */
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
}


static void DAA_Coeff_Germany(IXJ *j)
{
	int i;

	j->daa_country = DAA_GERMANY;
	/*----------------------------------------------- */
	/* CAO */
	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
	}

/* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
/* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
/* Bytes for FRX-filter       (08): 07,AA,E2,34,24,89,20,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
/* Bytes for FRR-filter       (07): 02,87,FA,37,9A,CA,B0,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
/* Bytes for AX-filter        (0A): 72,D5,DD,CA */
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
/* Bytes for AR-filter        (09): 72,42,13,4B */
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
/* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
/* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
/* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
/* ;  (10K, 0.68uF) */
	/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
/* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
/* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
/* ;CR Registers */
	/* Config. Reg. 0 (filters)        (cr0):FF ; all Filters enabled, CLK from ext. source */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
/* Config. Reg. 1 (dialing)        (cr1):05 ; Manual Ring, Ring metering enabled */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
/* Config. Reg. 2 (caller ID)      (cr2):04 ; Analog Gain 0dB, FSC internal */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
/* Config. Reg. 3 (testloops)      (cr3):00 ; SEL Bit==0, HP-enabled */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
/* Config. Reg. 4 (analog gain)    (cr4):02 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
	/* Config. Reg. 5 (Version)        (cr5):02 */
	/* Config. Reg. 6 (Reserved)       (cr6):00 */
	/* Config. Reg. 7 (Reserved)       (cr7):00 */
	/* ;xr Registers */
	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */

	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
/* Ext. Reg. 3 (DC Char)           (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
/* Ext. Reg. 4 (Cadence)           (xr4):00 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
/* Ext. Reg. 6 (Power State)       (xr6):00 */
	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
/* Ext. Reg. 7 (Vdd)               (xr7):40 ; VDD=4.25 V */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
	/*                                       12,33,5A,C3    ;  770 Hz   */
	/*                                       13,3C,5B,32    ;  852 Hz   */
	/*                                       1D,1B,5C,CC    ;  941 Hz   */

	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
	/*                                       EC,1D,52,22    ;  1336 Hz   */
	/*                                       AA,AC,51,D2    ;  1477 Hz   */
	/*                                       9B,3B,51,25    ;  1633 Hz   */
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
}


static void DAA_Coeff_Australia(IXJ *j)
{
	int i;

	j->daa_country = DAA_AUSTRALIA;
	/*----------------------------------------------- */
	/* CAO */
	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
	}

/* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
/* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
/* Bytes for FRX-filter       (08): 07,96,E2,34,32,9B,30,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
/* Bytes for FRR-filter       (07): 0F,9A,E9,2F,22,CC,A0,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
/* Bytes for AX-filter        (0A): CB,45,DD,CA */
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
/* Bytes for AR-filter        (09): 1B,67,10,D6 */
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
/* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
/* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
/* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
/* ;  idle */
	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
/* Levelmetering Ringing           (0D):32,45,B5,84   ; 50Hz 20V */
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
/* ;CR Registers */
	/* Config. Reg. 0 (filters)        (cr0):FF */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
/* Config. Reg. 1 (dialing)        (cr1):05 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
/* Config. Reg. 2 (caller ID)      (cr2):04 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
/* Config. Reg. 4 (analog gain)    (cr4):02 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
	/* Config. Reg. 5 (Version)        (cr5):02 */
	/* Config. Reg. 6 (Reserved)       (cr6):00 */
	/* Config. Reg. 7 (Reserved)       (cr7):00 */
	/* ;xr Registers */
	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */

	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
/* Ext. Reg. 3 (DC Char)           (xr3):2B      ;  */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
/* Ext. Reg. 4 (Cadence)           (xr4):00 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
/* Ext. Reg. 6 (Power State)       (xr6):00 */
	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
/* Ext. Reg. 7 (Vdd)               (xr7):40 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */

	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;  697 Hz   */
	/*                                       12,33,5A,C3    ;  770 Hz   */
	/*                                       13,3C,5B,32    ;  852 Hz   */
	/*                                       1D,1B,5C,CC    ;  941 Hz   */
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;

	/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
	/*                                       EC,1D,52,22    ;  1336 Hz   */
	/*                                       AA,AC,51,D2    ;  1477 Hz   */
	/*                                       9B,3B,51,25    ;  1633 Hz   */
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
}

static void DAA_Coeff_Japan(IXJ *j)
{
	int i;

	j->daa_country = DAA_JAPAN;
	/*----------------------------------------------- */
	/* CAO */
	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
	}

/* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
/* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
/* Bytes for FRX-filter       (08): 02,8F,68,77,9C,58,F0,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
/* Bytes for FRR-filter       (07): 03,8F,38,73,87,EA,20,08 */
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
/* Bytes for AX-filter        (0A): 51,C5,DD,CA */
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
/* Bytes for AR-filter        (09): 25,A7,10,D6 */
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
/* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
/* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
/* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
/* ;  idle */
	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
/* Levelmetering Ringing           (0D):AA,35,0F,8E    ; 25Hz 30V ????????? */
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
/* ;CR Registers */
	/* Config. Reg. 0 (filters)        (cr0):FF */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
/* Config. Reg. 1 (dialing)        (cr1):05 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
/* Config. Reg. 2 (caller ID)      (cr2):04 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
/* Config. Reg. 4 (analog gain)    (cr4):02 */
	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
	/* Config. Reg. 5 (Version)        (cr5):02 */
	/* Config. Reg. 6 (Reserved)       (cr6):00 */
	/* Config. Reg. 7 (Reserved)       (cr7):00 */
	/* ;xr Registers */
	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */

	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */

	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
/* Ext. Reg. 3 (DC Char)           (xr3):22        ;  */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
/* Ext. Reg. 4 (Cadence)           (xr4):00 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
/* Ext. Reg. 6 (Power State)       (xr6):00 */
	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
/* Ext. Reg. 7 (Vdd)               (xr7):40 */
	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
	/*                                       12,33,5A,C3    ;  770 Hz   */
	/*                                       13,3C,5B,32    ;  852 Hz   */
	/*                                       1D,1B,5C,CC    ;  941 Hz   */

	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
	/*                                       EC,1D,52,22    ;  1336 Hz   */
	/*                                       AA,AC,51,D2    ;  1477 Hz   */
	/*                                       9B,3B,51,25    ;  1633 Hz   */
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
}

static s16 tone_table[][19] =
{
	{			/* f20_50[] 11 */
		32538,		/* A1 = 1.985962 */
		 -32325,	/* A2 = -0.986511 */
		 -343,		/* B2 = -0.010493 */
		 0,		/* B1 = 0 */
		 343,		/* B0 = 0.010493 */
		 32619,		/* A1 = 1.990906 */
		 -32520,	/* A2 = -0.992462 */
		 19179,		/* B2 = 0.585327 */
		 -19178,	/* B1 = -1.170593 */
		 19179,		/* B0 = 0.585327 */
		 32723,		/* A1 = 1.997314 */
		 -32686,	/* A2 = -0.997528 */
		 9973,		/* B2 = 0.304352 */
		 -9955,		/* B1 = -0.607605 */
		 9973,		/* B0 = 0.304352 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f133_200[] 12 */
		32072,		/* A1 = 1.95752 */
		 -31896,	/* A2 = -0.973419 */
		 -435,		/* B2 = -0.013294 */
		 0,		/* B1 = 0 */
		 435,		/* B0 = 0.013294 */
		 32188,		/* A1 = 1.9646 */
		 -32400,	/* A2 = -0.98877 */
		 15139,		/* B2 = 0.462036 */
		 -14882,	/* B1 = -0.908356 */
		 15139,		/* B0 = 0.462036 */
		 32473,		/* A1 = 1.981995 */
		 -32524,	/* A2 = -0.992584 */
		 23200,		/* B2 = 0.708008 */
		 -23113,	/* B1 = -1.410706 */
		 23200,		/* B0 = 0.708008 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f300 13 */
		31769,		/* A1 = -1.939026 */
		 -32584,	/* A2 = 0.994385 */
		 -475,		/* B2 = -0.014522 */
		 0,		/* B1 = 0.000000 */
		 475,		/* B0 = 0.014522 */
		 31789,		/* A1 = -1.940247 */
		 -32679,	/* A2 = 0.997284 */
		 17280,		/* B2 = 0.527344 */
		 -16865,	/* B1 = -1.029358 */
		 17280,		/* B0 = 0.527344 */
		 31841,		/* A1 = -1.943481 */
		 -32681,	/* A2 = 0.997345 */
		 543,		/* B2 = 0.016579 */
		 -525,		/* B1 = -0.032097 */
		 543,		/* B0 = 0.016579 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f300_420[] 14 */
		30750,		/* A1 = 1.876892 */
		 -31212,	/* A2 = -0.952515 */
		 -804,		/* B2 = -0.024541 */
		 0,		/* B1 = 0 */
		 804,		/* B0 = 0.024541 */
		 30686,		/* A1 = 1.872925 */
		 -32145,	/* A2 = -0.980988 */
		 14747,		/* B2 = 0.450043 */
		 -13703,	/* B1 = -0.836395 */
		 14747,		/* B0 = 0.450043 */
		 31651,		/* A1 = 1.931824 */
		 -32321,	/* A2 = -0.986389 */
		 24425,		/* B2 = 0.745422 */
		 -23914,	/* B1 = -1.459595 */
		 24427,		/* B0 = 0.745483 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f330 15 */
		31613,		/* A1 = -1.929565 */
		 -32646,	/* A2 = 0.996277 */
		 -185,		/* B2 = -0.005657 */
		 0,		/* B1 = 0.000000 */
		 185,		/* B0 = 0.005657 */
		 31620,		/* A1 = -1.929932 */
		 -32713,	/* A2 = 0.998352 */
		 19253,		/* B2 = 0.587585 */
		 -18566,	/* B1 = -1.133179 */
		 19253,		/* B0 = 0.587585 */
		 31674,		/* A1 = -1.933228 */
		 -32715,	/* A2 = 0.998413 */
		 2575,		/* B2 = 0.078590 */
		 -2495,		/* B1 = -0.152283 */
		 2575,		/* B0 = 0.078590 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f300_425[] 16 */
		30741,		/* A1 = 1.876282 */
		 -31475,	/* A2 = -0.960541 */
		 -703,		/* B2 = -0.021484 */
		 0,		/* B1 = 0 */
		 703,		/* B0 = 0.021484 */
		 30688,		/* A1 = 1.873047 */
		 -32248,	/* A2 = -0.984161 */
		 14542,		/* B2 = 0.443787 */
		 -13523,	/* B1 = -0.825439 */
		 14542,		/* B0 = 0.443817 */
		 31494,		/* A1 = 1.922302 */
		 -32366,	/* A2 = -0.987762 */
		 21577,		/* B2 = 0.658508 */
		 -21013,	/* B1 = -1.282532 */
		 21577,		/* B0 = 0.658508 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f330_440[] 17 */
		30627,		/* A1 = 1.869324 */
		 -31338,	/* A2 = -0.95636 */
		 -843,		/* B2 = -0.025749 */
		 0,		/* B1 = 0 */
		 843,		/* B0 = 0.025749 */
		 30550,		/* A1 = 1.864685 */
		 -32221,	/* A2 = -0.983337 */
		 13594,		/* B2 = 0.414886 */
		 -12589,	/* B1 = -0.768402 */
		 13594,		/* B0 = 0.414886 */
		 31488,		/* A1 = 1.921936 */
		 -32358,	/* A2 = -0.987518 */
		 24684,		/* B2 = 0.753296 */
		 -24029,	/* B1 = -1.466614 */
		 24684,		/* B0 = 0.753296 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f340 18 */
		31546,		/* A1 = -1.925476 */
		 -32646,	/* A2 = 0.996277 */
		 -445,		/* B2 = -0.013588 */
		 0,		/* B1 = 0.000000 */
		 445,		/* B0 = 0.013588 */
		 31551,		/* A1 = -1.925781 */
		 -32713,	/* A2 = 0.998352 */
		 23884,		/* B2 = 0.728882 */
		 -22979,	/* B1 = -1.402527 */
		 23884,		/* B0 = 0.728882 */
		 31606,		/* A1 = -1.929138 */
		 -32715,	/* A2 = 0.998413 */
		 863,		/* B2 = 0.026367 */
		 -835,		/* B1 = -0.050985 */
		 863,		/* B0 = 0.026367 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f350_400[] 19 */
		31006,		/* A1 = 1.892517 */
		 -32029,	/* A2 = -0.977448 */
		 -461,		/* B2 = -0.014096 */
		 0,		/* B1 = 0 */
		 461,		/* B0 = 0.014096 */
		 30999,		/* A1 = 1.892029 */
		 -32487,	/* A2 = -0.991455 */
		 11325,		/* B2 = 0.345612 */
		 -10682,	/* B1 = -0.651978 */
		 11325,		/* B0 = 0.345612 */
		 31441,		/* A1 = 1.919067 */
		 -32526,	/* A2 = -0.992615 */
		 24324,		/* B2 = 0.74231 */
		 -23535,	/* B1 = -1.436523 */
		 24324,		/* B0 = 0.74231 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f350_440[] */
		30634,		/* A1 = 1.869751 */
		 -31533,	/* A2 = -0.962341 */
		 -680,		/* B2 = -0.020782 */
		 0,		/* B1 = 0 */
		 680,		/* B0 = 0.020782 */
		 30571,		/* A1 = 1.865906 */
		 -32277,	/* A2 = -0.985016 */
		 12894,		/* B2 = 0.393524 */
		 -11945,	/* B1 = -0.729065 */
		 12894,		/* B0 = 0.393524 */
		 31367,		/* A1 = 1.91449 */
		 -32379,	/* A2 = -0.988129 */
		 23820,		/* B2 = 0.726929 */
		 -23104,	/* B1 = -1.410217 */
		 23820,		/* B0 = 0.726929 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f350_450[] */
		30552,		/* A1 = 1.864807 */
		 -31434,	/* A2 = -0.95929 */
		 -690,		/* B2 = -0.021066 */
		 0,		/* B1 = 0 */
		 690,		/* B0 = 0.021066 */
		 30472,		/* A1 = 1.859924 */
		 -32248,	/* A2 = -0.984161 */
		 13385,		/* B2 = 0.408478 */
		 -12357,	/* B1 = -0.754242 */
		 13385,		/* B0 = 0.408478 */
		 31358,		/* A1 = 1.914001 */
		 -32366,	/* A2 = -0.987732 */
		 26488,		/* B2 = 0.80835 */
		 -25692,	/* B1 = -1.568176 */
		 26490,		/* B0 = 0.808411 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f360 */
		31397,		/* A1 = -1.916321 */
		 -32623,	/* A2 = 0.995605 */
		 -117,		/* B2 = -0.003598 */
		 0,		/* B1 = 0.000000 */
		 117,		/* B0 = 0.003598 */
		 31403,		/* A1 = -1.916687 */
		 -32700,	/* A2 = 0.997925 */
		 3388,		/* B2 = 0.103401 */
		 -3240,		/* B1 = -0.197784 */
		 3388,		/* B0 = 0.103401 */
		 31463,		/* A1 = -1.920410 */
		 -32702,	/* A2 = 0.997986 */
		 13346,		/* B2 = 0.407288 */
		 -12863,	/* B1 = -0.785126 */
		 13346,		/* B0 = 0.407288 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f380_420[] */
		30831,		/* A1 = 1.881775 */
		 -32064,	/* A2 = -0.978546 */
		 -367,		/* B2 = -0.01122 */
		 0,		/* B1 = 0 */
		 367,		/* B0 = 0.01122 */
		 30813,		/* A1 = 1.880737 */
		 -32456,	/* A2 = -0.990509 */
		 11068,		/* B2 = 0.337769 */
		 -10338,	/* B1 = -0.631042 */
		 11068,		/* B0 = 0.337769 */
		 31214,		/* A1 = 1.905212 */
		 -32491,	/* A2 = -0.991577 */
		 16374,		/* B2 = 0.499695 */
		 -15781,	/* B1 = -0.963196 */
		 16374,		/* B0 = 0.499695 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f392 */
		31152,		/* A1 = -1.901428 */
		 -32613,	/* A2 = 0.995300 */
		 -314,		/* B2 = -0.009605 */
		 0,		/* B1 = 0.000000 */
		 314,		/* B0 = 0.009605 */
		 31156,		/* A1 = -1.901672 */
		 -32694,	/* A2 = 0.997742 */
		 28847,		/* B2 = 0.880371 */
		 -2734,		/* B1 = -0.166901 */
		 28847,		/* B0 = 0.880371 */
		 31225,		/* A1 = -1.905823 */
		 -32696,	/* A2 = 0.997803 */
		 462,		/* B2 = 0.014108 */
		 -442,		/* B1 = -0.027019 */
		 462,		/* B0 = 0.014108 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f400_425[] */
		30836,		/* A1 = 1.882141 */
		 -32296,	/* A2 = -0.985596 */
		 -324,		/* B2 = -0.009903 */
		 0,		/* B1 = 0 */
		 324,		/* B0 = 0.009903 */
		 30825,		/* A1 = 1.881409 */
		 -32570,	/* A2 = -0.993958 */
		 16847,		/* B2 = 0.51416 */
		 -15792,	/* B1 = -0.963898 */
		 16847,		/* B0 = 0.51416 */
		 31106,		/* A1 = 1.89856 */
		 -32584,	/* A2 = -0.994415 */
		 9579,		/* B2 = 0.292328 */
		 -9164,		/* B1 = -0.559357 */
		 9579,		/* B0 = 0.292328 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f400_440[] */
		30702,		/* A1 = 1.873962 */
		 -32134,	/* A2 = -0.980682 */
		 -517,		/* B2 = -0.015793 */
		 0,		/* B1 = 0 */
		 517,		/* B0 = 0.015793 */
		 30676,		/* A1 = 1.872375 */
		 -32520,	/* A2 = -0.992462 */
		 8144,		/* B2 = 0.24855 */
		 -7596,		/* B1 = -0.463684 */
		 8144,		/* B0 = 0.24855 */
		 31084,		/* A1 = 1.897217 */
		 -32547,	/* A2 = -0.993256 */
		 22713,		/* B2 = 0.693176 */
		 -21734,	/* B1 = -1.326599 */
		 22713,		/* B0 = 0.693176 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f400_450[] */
		30613,		/* A1 = 1.86853 */
		 -32031,	/* A2 = -0.977509 */
		 -618,		/* B2 = -0.018866 */
		 0,		/* B1 = 0 */
		 618,		/* B0 = 0.018866 */
		 30577,		/* A1 = 1.866272 */
		 -32491,	/* A2 = -0.991577 */
		 9612,		/* B2 = 0.293335 */
		 -8935,		/* B1 = -0.54541 */
		 9612,		/* B0 = 0.293335 */
		 31071,		/* A1 = 1.896484 */
		 -32524,	/* A2 = -0.992584 */
		 21596,		/* B2 = 0.659058 */
		 -20667,	/* B1 = -1.261414 */
		 21596,		/* B0 = 0.659058 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f420 */
		30914,		/* A1 = -1.886841 */
		 -32584,	/* A2 = 0.994385 */
		 -426,		/* B2 = -0.013020 */
		 0,		/* B1 = 0.000000 */
		 426,		/* B0 = 0.013020 */
		 30914,		/* A1 = -1.886841 */
		 -32679,	/* A2 = 0.997314 */
		 17520,		/* B2 = 0.534668 */
		 -16471,	/* B1 = -1.005310 */
		 17520,		/* B0 = 0.534668 */
		 31004,		/* A1 = -1.892334 */
		 -32683,	/* A2 = 0.997406 */
		 819,		/* B2 = 0.025023 */
		 -780,		/* B1 = -0.047619 */
		 819,		/* B0 = 0.025023 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
#if 0
	{			/* f425 */
		30881,		/* A1 = -1.884827 */
		 -32603,	/* A2 = 0.994965 */
		 -496,		/* B2 = -0.015144 */
		 0,		/* B1 = 0.000000 */
		 496,		/* B0 = 0.015144 */
		 30880,		/* A1 = -1.884766 */
		 -32692,	/* A2 = 0.997711 */
		 24767,		/* B2 = 0.755859 */
		 -23290,	/* B1 = -1.421509 */
		 24767,		/* B0 = 0.755859 */
		 30967,		/* A1 = -1.890076 */
		 -32694,	/* A2 = 0.997772 */
		 728,		/* B2 = 0.022232 */
		 -691,		/* B1 = -0.042194 */
		 728,		/* B0 = 0.022232 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
#else
	{
		30850,
		-32534,
		-504,
		0,
		504,
		30831,
		-32669,
		24303,
		-22080,
		24303,
		30994,
		-32673,
		1905,
		-1811,
		1905,
		5,
		129,
		17,
		0xff5
	},
#endif
	{			/* f425_450[] */
		30646,		/* A1 = 1.870544 */
		 -32327,	/* A2 = -0.986572 */
		 -287,		/* B2 = -0.008769 */
		 0,		/* B1 = 0 */
		 287,		/* B0 = 0.008769 */
		 30627,		/* A1 = 1.869324 */
		 -32607,	/* A2 = -0.995087 */
		 13269,		/* B2 = 0.404968 */
		 -12376,	/* B1 = -0.755432 */
		 13269,		/* B0 = 0.404968 */
		 30924,		/* A1 = 1.887512 */
		 -32619,	/* A2 = -0.995453 */
		 19950,		/* B2 = 0.608826 */
		 -18940,	/* B1 = -1.156006 */
		 19950,		/* B0 = 0.608826 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f425_475[] */
		30396,		/* A1 = 1.855225 */
		 -32014,	/* A2 = -0.97699 */
		 -395,		/* B2 = -0.012055 */
		 0,		/* B1 = 0 */
		 395,		/* B0 = 0.012055 */
		 30343,		/* A1 = 1.85199 */
		 -32482,	/* A2 = -0.991302 */
		 17823,		/* B2 = 0.543945 */
		 -16431,	/* B1 = -1.002869 */
		 17823,		/* B0 = 0.543945 */
		 30872,		/* A1 = 1.884338 */
		 -32516,	/* A2 = -0.99231 */
		 18124,		/* B2 = 0.553101 */
		 -17246,	/* B1 = -1.052673 */
		 18124,		/* B0 = 0.553101 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f435 */
		30796,		/* A1 = -1.879639 */
		 -32603,	/* A2 = 0.994965 */
		 -254,		/* B2 = -0.007762 */
		 0,		/* B1 = 0.000000 */
		 254,		/* B0 = 0.007762 */
		 30793,		/* A1 = -1.879456 */
		 -32692,	/* A2 = 0.997711 */
		 18934,		/* B2 = 0.577820 */
		 -17751,	/* B1 = -1.083496 */
		 18934,		/* B0 = 0.577820 */
		 30882,		/* A1 = -1.884888 */
		 -32694,	/* A2 = 0.997772 */
		 1858,		/* B2 = 0.056713 */
		 -1758,		/* B1 = -0.107357 */
		 1858,		/* B0 = 0.056713 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f440_450[] */
		30641,		/* A1 = 1.870239 */
		 -32458,	/* A2 = -0.99057 */
		 -155,		/* B2 = -0.004735 */
		 0,		/* B1 = 0 */
		 155,		/* B0 = 0.004735 */
		 30631,		/* A1 = 1.869568 */
		 -32630,	/* A2 = -0.995789 */
		 11453,		/* B2 = 0.349548 */
		 -10666,	/* B1 = -0.651001 */
		 11453,		/* B0 = 0.349548 */
		 30810,		/* A1 = 1.880554 */
		 -32634,	/* A2 = -0.995941 */
		 12237,		/* B2 = 0.373474 */
		 -11588,	/* B1 = -0.707336 */
		 12237,		/* B0 = 0.373474 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f440_480[] */
		30367,		/* A1 = 1.853455 */
		 -32147,	/* A2 = -0.981079 */
		 -495,		/* B2 = -0.015113 */
		 0,		/* B1 = 0 */
		 495,		/* B0 = 0.015113 */
		 30322,		/* A1 = 1.850769 */
		 -32543,	/* A2 = -0.993134 */
		 10031,		/* B2 = 0.306152 */
		 -9252,		/* B1 = -0.564728 */
		 10031,		/* B0 = 0.306152 */
		 30770,		/* A1 = 1.878052 */
		 -32563,	/* A2 = -0.993774 */
		 22674,		/* B2 = 0.691956 */
		 -21465,	/* B1 = -1.31012 */
		 22674,		/* B0 = 0.691956 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f445 */
		30709,		/* A1 = -1.874329 */
		 -32603,	/* A2 = 0.994965 */
		 -83,		/* B2 = -0.002545 */
		 0,		/* B1 = 0.000000 */
		 83,		/* B0 = 0.002545 */
		 30704,		/* A1 = -1.874084 */
		 -32692,	/* A2 = 0.997711 */
		 10641,		/* B2 = 0.324738 */
		 -9947,		/* B1 = -0.607147 */
		 10641,		/* B0 = 0.324738 */
		 30796,		/* A1 = -1.879639 */
		 -32694,	/* A2 = 0.997772 */
		 10079,		/* B2 = 0.307587 */
		 9513,		/* B1 = 0.580688 */
		 10079,		/* B0 = 0.307587 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f450 */
		30664,		/* A1 = -1.871643 */
		 -32603,	/* A2 = 0.994965 */
		 -164,		/* B2 = -0.005029 */
		 0,		/* B1 = 0.000000 */
		 164,		/* B0 = 0.005029 */
		 30661,		/* A1 = -1.871399 */
		 -32692,	/* A2 = 0.997711 */
		 15294,		/* B2 = 0.466736 */
		 -14275,	/* B1 = -0.871307 */
		 15294,		/* B0 = 0.466736 */
		 30751,		/* A1 = -1.876953 */
		 -32694,	/* A2 = 0.997772 */
		 3548,		/* B2 = 0.108284 */
		 -3344,		/* B1 = -0.204155 */
		 3548,		/* B0 = 0.108284 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f452 */
		30653,		/* A1 = -1.870911 */
		 -32615,	/* A2 = 0.995361 */
		 -209,		/* B2 = -0.006382 */
		 0,		/* B1 = 0.000000 */
		 209,		/* B0 = 0.006382 */
		 30647,		/* A1 = -1.870605 */
		 -32702,	/* A2 = 0.997986 */
		 18971,		/* B2 = 0.578979 */
		 -17716,	/* B1 = -1.081299 */
		 18971,		/* B0 = 0.578979 */
		 30738,		/* A1 = -1.876099 */
		 -32702,	/* A2 = 0.998016 */
		 2967,		/* B2 = 0.090561 */
		 -2793,		/* B1 = -0.170502 */
		 2967,		/* B0 = 0.090561 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f475 */
		30437,		/* A1 = -1.857727 */
		 -32603,	/* A2 = 0.994965 */
		 -264,		/* B2 = -0.008062 */
		 0,		/* B1 = 0.000000 */
		 264,		/* B0 = 0.008062 */
		 30430,		/* A1 = -1.857300 */
		 -32692,	/* A2 = 0.997711 */
		 21681,		/* B2 = 0.661682 */
		 -20082,	/* B1 = -1.225708 */
		 21681,		/* B0 = 0.661682 */
		 30526,		/* A1 = -1.863220 */
		 -32694,	/* A2 = 0.997742 */
		 1559,		/* B2 = 0.047600 */
		 -1459,		/* B1 = -0.089096 */
		 1559,		/* B0 = 0.047600 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f480_620[] */
		28975,		/* A1 = 1.768494 */
		 -30955,	/* A2 = -0.944672 */
		 -1026,		/* B2 = -0.03133 */
		 0,		/* B1 = 0 */
		 1026,		/* B0 = 0.03133 */
		 28613,		/* A1 = 1.746399 */
		 -32089,	/* A2 = -0.979309 */
		 14214,		/* B2 = 0.433807 */
		 -12202,	/* B1 = -0.744812 */
		 14214,		/* B0 = 0.433807 */
		 30243,		/* A1 = 1.845947 */
		 -32238,	/* A2 = -0.983856 */
		 24825,		/* B2 = 0.757629 */
		 -23402,	/* B1 = -1.428345 */
		 24825,		/* B0 = 0.757629 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f494 */
		30257,		/* A1 = -1.846741 */
		 -32605,	/* A2 = 0.995056 */
		 -249,		/* B2 = -0.007625 */
		 0,		/* B1 = 0.000000 */
		 249,		/* B0 = 0.007625 */
		 30247,		/* A1 = -1.846191 */
		 -32694,	/* A2 = 0.997772 */
		 18088,		/* B2 = 0.552002 */
		 -16652,	/* B1 = -1.016418 */
		 18088,		/* B0 = 0.552002 */
		 30348,		/* A1 = -1.852295 */
		 -32696,	/* A2 = 0.997803 */
		 2099,		/* B2 = 0.064064 */
		 -1953,		/* B1 = -0.119202 */
		 2099,		/* B0 = 0.064064 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f500 */
		30202,		/* A1 = -1.843431 */
		 -32624,	/* A2 = 0.995622 */
		 -413,		/* B2 = -0.012622 */
		 0,		/* B1 = 0.000000 */
		 413,		/* B0 = 0.012622 */
		 30191,		/* A1 = -1.842721 */
		 -32714,	/* A2 = 0.998364 */
		 25954,		/* B2 = 0.792057 */
		 -23890,	/* B1 = -1.458131 */
		 25954,		/* B0 = 0.792057 */
		 30296,		/* A1 = -1.849172 */
		 -32715,	/* A2 = 0.998397 */
		 2007,		/* B2 = 0.061264 */
		 -1860,		/* B1 = -0.113568 */
		 2007,		/* B0 = 0.061264 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f520 */
		30001,		/* A1 = -1.831116 */
		 -32613,	/* A2 = 0.995270 */
		 -155,		/* B2 = -0.004750 */
		 0,		/* B1 = 0.000000 */
		 155,		/* B0 = 0.004750 */
		 29985,		/* A1 = -1.830200 */
		 -32710,	/* A2 = 0.998260 */
		 6584,		/* B2 = 0.200928 */
		 -6018,		/* B1 = -0.367355 */
		 6584,		/* B0 = 0.200928 */
		 30105,		/* A1 = -1.837524 */
		 -32712,	/* A2 = 0.998291 */
		 23812,		/* B2 = 0.726685 */
		 -21936,	/* B1 = -1.338928 */
		 23812,		/* B0 = 0.726685 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f523 */
		29964,		/* A1 = -1.828918 */
		 -32601,	/* A2 = 0.994904 */
		 -101,		/* B2 = -0.003110 */
		 0,		/* B1 = 0.000000 */
		 101,		/* B0 = 0.003110 */
		 29949,		/* A1 = -1.827942 */
		 -32700,	/* A2 = 0.997925 */
		 11041,		/* B2 = 0.336975 */
		 -10075,	/* B1 = -0.614960 */
		 11041,		/* B0 = 0.336975 */
		 30070,		/* A1 = -1.835388 */
		 -32702,	/* A2 = 0.997986 */
		 16762,		/* B2 = 0.511536 */
		 -15437,	/* B1 = -0.942230 */
		 16762,		/* B0 = 0.511536 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f525 */
		29936,		/* A1 = -1.827209 */
		 -32584,	/* A2 = 0.994415 */
		 -91,		/* B2 = -0.002806 */
		 0,		/* B1 = 0.000000 */
		 91,		/* B0 = 0.002806 */
		 29921,		/* A1 = -1.826233 */
		 -32688,	/* A2 = 0.997559 */
		 11449,		/* B2 = 0.349396 */
		 -10426,	/* B1 = -0.636383 */
		 11449,		/* B0 = 0.349396 */
		 30045,		/* A1 = -1.833862 */
		 -32688,	/* A2 = 0.997589 */
		 13055,		/* B2 = 0.398407 */
		 -12028,	/* B1 = -0.734161 */
		 13055,		/* B0 = 0.398407 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f540_660[] */
		28499,		/* A1 = 1.739441 */
		 -31129,	/* A2 = -0.949982 */
		 -849,		/* B2 = -0.025922 */
		 0,		/* B1 = 0 */
		 849,		/* B0 = 0.025922 */
		 28128,		/* A1 = 1.716797 */
		 -32130,	/* A2 = -0.98056 */
		 14556,		/* B2 = 0.444214 */
		 -12251,	/* B1 = -0.747772 */
		 14556,		/* B0 = 0.444244 */
		 29667,		/* A1 = 1.81073 */
		 -32244,	/* A2 = -0.984039 */
		 23038,		/* B2 = 0.703064 */
		 -21358,	/* B1 = -1.303589 */
		 23040,		/* B0 = 0.703125 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f587 */
		29271,		/* A1 = -1.786560 */
		 -32599,	/* A2 = 0.994873 */
		 -490,		/* B2 = -0.014957 */
		 0,		/* B1 = 0.000000 */
		 490,		/* B0 = 0.014957 */
		 29246,		/* A1 = -1.785095 */
		 -32700,	/* A2 = 0.997925 */
		 28961,		/* B2 = 0.883850 */
		 -25796,	/* B1 = -1.574463 */
		 28961,		/* B0 = 0.883850 */
		 29383,		/* A1 = -1.793396 */
		 -32700,	/* A2 = 0.997955 */
		 1299,		/* B2 = 0.039650 */
		 -1169,		/* B1 = -0.071396 */
		 1299,		/* B0 = 0.039650 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f590 */
		29230,		/* A1 = -1.784058 */
		 -32584,	/* A2 = 0.994415 */
		 -418,		/* B2 = -0.012757 */
		 0,		/* B1 = 0.000000 */
		 418,		/* B0 = 0.012757 */
		 29206,		/* A1 = -1.782593 */
		 -32688,	/* A2 = 0.997559 */
		 36556,		/* B2 = 1.115601 */
		 -32478,	/* B1 = -1.982300 */
		 36556,		/* B0 = 1.115601 */
		 29345,		/* A1 = -1.791077 */
		 -32688,	/* A2 = 0.997589 */
		 897,		/* B2 = 0.027397 */
		 -808,		/* B1 = -0.049334 */
		 897,		/* B0 = 0.027397 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f600 */
		29116,		/* A1 = -1.777100 */
		 -32603,	/* A2 = 0.994965 */
		 -165,		/* B2 = -0.005039 */
		 0,		/* B1 = 0.000000 */
		 165,		/* B0 = 0.005039 */
		 29089,		/* A1 = -1.775452 */
		 -32708,	/* A2 = 0.998199 */
		 6963,		/* B2 = 0.212494 */
		 -6172,		/* B1 = -0.376770 */
		 6963,		/* B0 = 0.212494 */
		 29237,		/* A1 = -1.784485 */
		 -32710,	/* A2 = 0.998230 */
		 24197,		/* B2 = 0.738464 */
		 -21657,	/* B1 = -1.321899 */
		 24197,		/* B0 = 0.738464 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f660 */
		28376,		/* A1 = -1.731934 */
		 -32567,	/* A2 = 0.993896 */
		 -363,		/* B2 = -0.011102 */
		 0,		/* B1 = 0.000000 */
		 363,		/* B0 = 0.011102 */
		 28337,		/* A1 = -1.729614 */
		 -32683,	/* A2 = 0.997434 */
		 21766,		/* B2 = 0.664246 */
		 -18761,	/* B1 = -1.145081 */
		 21766,		/* B0 = 0.664246 */
		 28513,		/* A1 = -1.740356 */
		 -32686,	/* A2 = 0.997498 */
		 2509,		/* B2 = 0.076584 */
		 -2196,		/* B1 = -0.134041 */
		 2509,		/* B0 = 0.076584 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f700 */
		27844,		/* A1 = -1.699463 */
		 -32563,	/* A2 = 0.993744 */
		 -366,		/* B2 = -0.011187 */
		 0,		/* B1 = 0.000000 */
		 366,		/* B0 = 0.011187 */
		 27797,		/* A1 = -1.696655 */
		 -32686,	/* A2 = 0.997498 */
		 22748,		/* B2 = 0.694214 */
		 -19235,	/* B1 = -1.174072 */
		 22748,		/* B0 = 0.694214 */
		 27995,		/* A1 = -1.708740 */
		 -32688,	/* A2 = 0.997559 */
		 2964,		/* B2 = 0.090477 */
		 -2546,		/* B1 = -0.155449 */
		 2964,		/* B0 = 0.090477 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f740 */
		27297,		/* A1 = -1.666077 */
		 -32551,	/* A2 = 0.993408 */
		 -345,		/* B2 = -0.010540 */
		 0,		/* B1 = 0.000000 */
		 345,		/* B0 = 0.010540 */
		 27240,		/* A1 = -1.662598 */
		 -32683,	/* A2 = 0.997406 */
		 22560,		/* B2 = 0.688477 */
		 -18688,	/* B1 = -1.140625 */
		 22560,		/* B0 = 0.688477 */
		 27461,		/* A1 = -1.676147 */
		 -32684,	/* A2 = 0.997467 */
		 3541,		/* B2 = 0.108086 */
		 -2985,		/* B1 = -0.182220 */
		 3541,		/* B0 = 0.108086 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f750 */
		27155,		/* A1 = -1.657410 */
		 -32551,	/* A2 = 0.993408 */
		 -462,		/* B2 = -0.014117 */
		 0,		/* B1 = 0.000000 */
		 462,		/* B0 = 0.014117 */
		 27097,		/* A1 = -1.653870 */
		 -32683,	/* A2 = 0.997406 */
		 32495,		/* B2 = 0.991699 */
		 -26776,	/* B1 = -1.634338 */
		 32495,		/* B0 = 0.991699 */
		 27321,		/* A1 = -1.667542 */
		 -32684,	/* A2 = 0.997467 */
		 1835,		/* B2 = 0.056007 */
		 -1539,		/* B1 = -0.093948 */
		 1835,		/* B0 = 0.056007 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f750_1450[] */
		19298,		/* A1 = 1.177917 */
		 -24471,	/* A2 = -0.746796 */
		 -4152,		/* B2 = -0.126709 */
		 0,		/* B1 = 0 */
		 4152,		/* B0 = 0.126709 */
		 12902,		/* A1 = 0.787476 */
		 -29091,	/* A2 = -0.887817 */
		 12491,		/* B2 = 0.38121 */
		 -1794,		/* B1 = -0.109528 */
		 12494,		/* B0 = 0.381317 */
		 26291,		/* A1 = 1.604736 */
		 -30470,	/* A2 = -0.929901 */
		 28859,		/* B2 = 0.880737 */
		 -26084,	/* B1 = -1.592102 */
		 28861,		/* B0 = 0.880798 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f770 */
		26867,		/* A1 = -1.639832 */
		 -32551,	/* A2 = 0.993408 */
		 -123,		/* B2 = -0.003755 */
		 0,		/* B1 = 0.000000 */
		 123,		/* B0 = 0.003755 */
		 26805,		/* A1 = -1.636108 */
		 -32683,	/* A2 = 0.997406 */
		 17297,		/* B2 = 0.527863 */
		 -14096,	/* B1 = -0.860382 */
		 17297,		/* B0 = 0.527863 */
		 27034,		/* A1 = -1.650085 */
		 -32684,	/* A2 = 0.997467 */
		 12958,		/* B2 = 0.395477 */
		 -10756,	/* B1 = -0.656525 */
		 12958,		/* B0 = 0.395477 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f800 */
		26413,		/* A1 = -1.612122 */
		 -32547,	/* A2 = 0.993286 */
		 -223,		/* B2 = -0.006825 */
		 0,		/* B1 = 0.000000 */
		 223,		/* B0 = 0.006825 */
		 26342,		/* A1 = -1.607849 */
		 -32686,	/* A2 = 0.997498 */
		 6391,		/* B2 = 0.195053 */
		 -5120,		/* B1 = -0.312531 */
		 6391,		/* B0 = 0.195053 */
		 26593,		/* A1 = -1.623108 */
		 -32688,	/* A2 = 0.997559 */
		 23681,		/* B2 = 0.722717 */
		 -19328,	/* B1 = -1.179688 */
		 23681,		/* B0 = 0.722717 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f816 */
		26168,		/* A1 = -1.597209 */
		 -32528,	/* A2 = 0.992706 */
		 -235,		/* B2 = -0.007182 */
		 0,		/* B1 = 0.000000 */
		 235,		/* B0 = 0.007182 */
		 26092,		/* A1 = -1.592590 */
		 -32675,	/* A2 = 0.997192 */
		 20823,		/* B2 = 0.635498 */
		 -16510,	/* B1 = -1.007751 */
		 20823,		/* B0 = 0.635498 */
		 26363,		/* A1 = -1.609070 */
		 -32677,	/* A2 = 0.997253 */
		 6739,		/* B2 = 0.205688 */
		 -5459,		/* B1 = -0.333206 */
		 6739,		/* B0 = 0.205688 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f850 */
		25641,		/* A1 = -1.565063 */
		 -32536,	/* A2 = 0.992950 */
		 -121,		/* B2 = -0.003707 */
		 0,		/* B1 = 0.000000 */
		 121,		/* B0 = 0.003707 */
		 25560,		/* A1 = -1.560059 */
		 -32684,	/* A2 = 0.997437 */
		 18341,		/* B2 = 0.559753 */
		 -14252,	/* B1 = -0.869904 */
		 18341,		/* B0 = 0.559753 */
		 25837,		/* A1 = -1.577026 */
		 -32684,	/* A2 = 0.997467 */
		 16679,		/* B2 = 0.509003 */
		 -13232,	/* B1 = -0.807648 */
		 16679,		/* B0 = 0.509003 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f857_1645[] */
		16415,		/* A1 = 1.001953 */
		 -23669,	/* A2 = -0.722321 */
		 -4549,		/* B2 = -0.138847 */
		 0,		/* B1 = 0 */
		 4549,		/* B0 = 0.138847 */
		 8456,		/* A1 = 0.516174 */
		 -28996,	/* A2 = -0.884918 */
		 13753,		/* B2 = 0.419724 */
		 -12,		/* B1 = -0.000763 */
		 13757,		/* B0 = 0.419846 */
		 24632,		/* A1 = 1.503418 */
		 -30271,	/* A2 = -0.923828 */
		 29070,		/* B2 = 0.887146 */
		 -25265,	/* B1 = -1.542114 */
		 29073,		/* B0 = 0.887268 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f900 */
		24806,		/* A1 = -1.514099 */
		 -32501,	/* A2 = 0.991852 */
		 -326,		/* B2 = -0.009969 */
		 0,		/* B1 = 0.000000 */
		 326,		/* B0 = 0.009969 */
		 24709,		/* A1 = -1.508118 */
		 -32659,	/* A2 = 0.996674 */
		 20277,		/* B2 = 0.618835 */
		 -15182,	/* B1 = -0.926636 */
		 20277,		/* B0 = 0.618835 */
		 25022,		/* A1 = -1.527222 */
		 -32661,	/* A2 = 0.996735 */
		 4320,		/* B2 = 0.131836 */
		 -3331,		/* B1 = -0.203339 */
		 4320,		/* B0 = 0.131836 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f900_1300[] */
		19776,		/* A1 = 1.207092 */
		 -27437,	/* A2 = -0.837341 */
		 -2666,		/* B2 = -0.081371 */
		 0,		/* B1 = 0 */
		 2666,		/* B0 = 0.081371 */
		 16302,		/* A1 = 0.995026 */
		 -30354,	/* A2 = -0.926361 */
		 10389,		/* B2 = 0.317062 */
		 -3327,		/* B1 = -0.203064 */
		 10389,		/* B0 = 0.317062 */
		 24299,		/* A1 = 1.483154 */
		 -30930,	/* A2 = -0.943909 */
		 25016,		/* B2 = 0.763428 */
		 -21171,	/* B1 = -1.292236 */
		 25016,		/* B0 = 0.763428 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f935_1215[] */
		20554,		/* A1 = 1.254517 */
		 -28764,	/* A2 = -0.877838 */
		 -2048,		/* B2 = -0.062515 */
		 0,		/* B1 = 0 */
		 2048,		/* B0 = 0.062515 */
		 18209,		/* A1 = 1.11145 */
		 -30951,	/* A2 = -0.94458 */
		 9390,		/* B2 = 0.286575 */
		 -3955,		/* B1 = -0.241455 */
		 9390,		/* B0 = 0.286575 */
		 23902,		/* A1 = 1.458923 */
		 -31286,	/* A2 = -0.954803 */
		 23252,		/* B2 = 0.709595 */
		 -19132,	/* B1 = -1.167725 */
		 23252,		/* B0 = 0.709595 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f941_1477[] */
		17543,		/* A1 = 1.07074 */
		 -26220,	/* A2 = -0.800201 */
		 -3298,		/* B2 = -0.100647 */
		 0,		/* B1 = 0 */
		 3298,		/* B0 = 0.100647 */
		 12423,		/* A1 = 0.75827 */
		 -30036,	/* A2 = -0.916626 */
		 12651,		/* B2 = 0.386078 */
		 -2444,		/* B1 = -0.14917 */
		 12653,		/* B0 = 0.386154 */
		 23518,		/* A1 = 1.435425 */
		 -30745,	/* A2 = -0.938293 */
		 27282,		/* B2 = 0.832581 */
		 -22529,	/* B1 = -1.375122 */
		 27286,		/* B0 = 0.832703 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f942 */
		24104,		/* A1 = -1.471252 */
		 -32507,	/* A2 = 0.992065 */
		 -351,		/* B2 = -0.010722 */
		 0,		/* B1 = 0.000000 */
		 351,		/* B0 = 0.010722 */
		 23996,		/* A1 = -1.464600 */
		 -32671,	/* A2 = 0.997040 */
		 22848,		/* B2 = 0.697266 */
		 -16639,	/* B1 = -1.015564 */
		 22848,		/* B0 = 0.697266 */
		 24332,		/* A1 = -1.485168 */
		 -32673,	/* A2 = 0.997101 */
		 4906,		/* B2 = 0.149727 */
		 -3672,		/* B1 = -0.224174 */
		 4906,		/* B0 = 0.149727 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f950 */
		23967,		/* A1 = -1.462830 */
		 -32507,	/* A2 = 0.992065 */
		 -518,		/* B2 = -0.015821 */
		 0,		/* B1 = 0.000000 */
		 518,		/* B0 = 0.015821 */
		 23856,		/* A1 = -1.456055 */
		 -32671,	/* A2 = 0.997040 */
		 26287,		/* B2 = 0.802246 */
		 -19031,	/* B1 = -1.161560 */
		 26287,		/* B0 = 0.802246 */
		 24195,		/* A1 = -1.476746 */
		 -32673,	/* A2 = 0.997101 */
		 2890,		/* B2 = 0.088196 */
		 -2151,		/* B1 = -0.131317 */
		 2890,		/* B0 = 0.088196 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f950_1400[] */
		18294,		/* A1 = 1.116638 */
		 -26962,	/* A2 = -0.822845 */
		 -2914,		/* B2 = -0.088936 */
		 0,		/* B1 = 0 */
		 2914,		/* B0 = 0.088936 */
		 14119,		/* A1 = 0.861786 */
		 -30227,	/* A2 = -0.922455 */
		 11466,		/* B2 = 0.349945 */
		 -2833,		/* B1 = -0.172943 */
		 11466,		/* B0 = 0.349945 */
		 23431,		/* A1 = 1.430115 */
		 -30828,	/* A2 = -0.940796 */
		 25331,		/* B2 = 0.773071 */
		 -20911,	/* B1 = -1.276367 */
		 25331,		/* B0 = 0.773071 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f975 */
		23521,		/* A1 = -1.435608 */
		 -32489,	/* A2 = 0.991516 */
		 -193,		/* B2 = -0.005915 */
		 0,		/* B1 = 0.000000 */
		 193,		/* B0 = 0.005915 */
		 23404,		/* A1 = -1.428467 */
		 -32655,	/* A2 = 0.996582 */
		 17740,		/* B2 = 0.541412 */
		 -12567,	/* B1 = -0.767029 */
		 17740,		/* B0 = 0.541412 */
		 23753,		/* A1 = -1.449829 */
		 -32657,	/* A2 = 0.996613 */
		 9090,		/* B2 = 0.277405 */
		 -6662,		/* B1 = -0.406647 */
		 9090,		/* B0 = 0.277405 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1000 */
		23071,		/* A1 = -1.408203 */
		 -32489,	/* A2 = 0.991516 */
		 -293,		/* B2 = -0.008965 */
		 0,		/* B1 = 0.000000 */
		 293,		/* B0 = 0.008965 */
		 22951,		/* A1 = -1.400818 */
		 -32655,	/* A2 = 0.996582 */
		 5689,		/* B2 = 0.173645 */
		 -3951,		/* B1 = -0.241150 */
		 5689,		/* B0 = 0.173645 */
		 23307,		/* A1 = -1.422607 */
		 -32657,	/* A2 = 0.996613 */
		 18692,		/* B2 = 0.570435 */
		 -13447,	/* B1 = -0.820770 */
		 18692,		/* B0 = 0.570435 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1020 */
		22701,		/* A1 = -1.385620 */
		 -32474,	/* A2 = 0.991058 */
		 -292,		/* B2 = -0.008933 */
		 0,		/*163840      , B1 = 10.000000 */
		 292,		/* B0 = 0.008933 */
		 22564,		/* A1 = -1.377258 */
		 -32655,	/* A2 = 0.996552 */
		 20756,		/* B2 = 0.633423 */
		 -14176,	/* B1 = -0.865295 */
		 20756,		/* B0 = 0.633423 */
		 22960,		/* A1 = -1.401428 */
		 -32657,	/* A2 = 0.996613 */
		 6520,		/* B2 = 0.198990 */
		 -4619,		/* B1 = -0.281937 */
		 6520,		/* B0 = 0.198990 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1050 */
		22142,		/* A1 = -1.351501 */
		 -32474,	/* A2 = 0.991058 */
		 -147,		/* B2 = -0.004493 */
		 0,		/* B1 = 0.000000 */
		 147,		/* B0 = 0.004493 */
		 22000,		/* A1 = -1.342834 */
		 -32655,	/* A2 = 0.996552 */
		 15379,		/* B2 = 0.469360 */
		 -10237,	/* B1 = -0.624847 */
		 15379,		/* B0 = 0.469360 */
		 22406,		/* A1 = -1.367554 */
		 -32657,	/* A2 = 0.996613 */
		 17491,		/* B2 = 0.533783 */
		 -12096,	/* B1 = -0.738312 */
		 17491,		/* B0 = 0.533783 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1100_1750[] */
		12973,		/* A1 = 0.79184 */
		 -24916,	/* A2 = -0.760376 */
		 6655,		/* B2 = 0.203102 */
		 367,		/* B1 = 0.0224 */
		 6657,		/* B0 = 0.203171 */
		 5915,		/* A1 = 0.361053 */
		 -29560,	/* A2 = -0.90213 */
		 -7777,		/* B2 = -0.23735 */
		 0,		/* B1 = 0 */
		 7777,		/* B0 = 0.23735 */
		 20510,		/* A1 = 1.251892 */
		 -30260,	/* A2 = -0.923462 */
		 26662,		/* B2 = 0.81366 */
		 -20573,	/* B1 = -1.255737 */
		 26668,		/* B0 = 0.813843 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1140 */
		20392,		/* A1 = -1.244629 */
		 -32460,	/* A2 = 0.990601 */
		 -270,		/* B2 = -0.008240 */
		 0,		/* B1 = 0.000000 */
		 270,		/* B0 = 0.008240 */
		 20218,		/* A1 = -1.234009 */
		 -32655,	/* A2 = 0.996582 */
		 21337,		/* B2 = 0.651154 */
		 -13044,	/* B1 = -0.796143 */
		 21337,		/* B0 = 0.651154 */
		 20684,		/* A1 = -1.262512 */
		 -32657,	/* A2 = 0.996643 */
		 8572,		/* B2 = 0.261612 */
		 -5476,		/* B1 = -0.334244 */
		 8572,		/* B0 = 0.261612 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1200 */
		19159,		/* A1 = -1.169373 */
		 -32456,	/* A2 = 0.990509 */
		 -335,		/* B2 = -0.010252 */
		 0,		/* B1 = 0.000000 */
		 335,		/* B0 = 0.010252 */
		 18966,		/* A1 = -1.157593 */
		 -32661,	/* A2 = 0.996735 */
		 6802,		/* B2 = 0.207588 */
		 -3900,		/* B1 = -0.238098 */
		 6802,		/* B0 = 0.207588 */
		 19467,		/* A1 = -1.188232 */
		 -32661,	/* A2 = 0.996765 */
		 25035,		/* B2 = 0.764008 */
		 -15049,	/* B1 = -0.918579 */
		 25035,		/* B0 = 0.764008 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1209 */
		18976,		/* A1 = -1.158264 */
		 -32439,	/* A2 = 0.989990 */
		 -183,		/* B2 = -0.005588 */
		 0,		/* B1 = 0.000000 */
		 183,		/* B0 = 0.005588 */
		 18774,		/* A1 = -1.145874 */
		 -32650,	/* A2 = 0.996429 */
		 15468,		/* B2 = 0.472076 */
		 -8768,		/* B1 = -0.535217 */
		 15468,		/* B0 = 0.472076 */
		 19300,		/* A1 = -1.177979 */
		 -32652,	/* A2 = 0.996490 */
		 19840,		/* B2 = 0.605499 */
		 -11842,	/* B1 = -0.722809 */
		 19840,		/* B0 = 0.605499 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1330 */
		16357,		/* A1 = -0.998413 */
		 -32368,	/* A2 = 0.987793 */
		 -217,		/* B2 = -0.006652 */
		 0,		/* B1 = 0.000000 */
		 217,		/* B0 = 0.006652 */
		 16107,		/* A1 = -0.983126 */
		 -32601,	/* A2 = 0.994904 */
		 11602,		/* B2 = 0.354065 */
		 -5555,		/* B1 = -0.339111 */
		 11602,		/* B0 = 0.354065 */
		 16722,		/* A1 = -1.020630 */
		 -32603,	/* A2 = 0.994965 */
		 15574,		/* B2 = 0.475311 */
		 -8176,		/* B1 = -0.499069 */
		 15574,		/* B0 = 0.475311 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1336 */
		16234,		/* A1 = -0.990875 */
		 32404,		/* A2 = -0.988922 */
		 -193,		/* B2 = -0.005908 */
		 0,		/* B1 = 0.000000 */
		 193,		/* B0 = 0.005908 */
		 15986,		/* A1 = -0.975769 */
		 -32632,	/* A2 = 0.995880 */
		 18051,		/* B2 = 0.550903 */
		 -8658,		/* B1 = -0.528473 */
		 18051,		/* B0 = 0.550903 */
		 16591,		/* A1 = -1.012695 */
		 -32634,	/* A2 = 0.995941 */
		 15736,		/* B2 = 0.480240 */
		 -8125,		/* B1 = -0.495926 */
		 15736,		/* B0 = 0.480240 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1366 */
		15564,		/* A1 = -0.949982 */
		 -32404,	/* A2 = 0.988922 */
		 -269,		/* B2 = -0.008216 */
		 0,		/* B1 = 0.000000 */
		 269,		/* B0 = 0.008216 */
		 15310,		/* A1 = -0.934479 */
		 -32632,	/* A2 = 0.995880 */
		 10815,		/* B2 = 0.330063 */
		 -4962,		/* B1 = -0.302887 */
		 10815,		/* B0 = 0.330063 */
		 15924,		/* A1 = -0.971924 */
		 -32634,	/* A2 = 0.995941 */
		 18880,		/* B2 = 0.576172 */
		 -9364,		/* B1 = -0.571594 */
		 18880,		/* B0 = 0.576172 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1380 */
		15247,		/* A1 = -0.930603 */
		 -32397,	/* A2 = 0.988708 */
		 -244,		/* B2 = -0.007451 */
		 0,		/* B1 = 0.000000 */
		 244,		/* B0 = 0.007451 */
		 14989,		/* A1 = -0.914886 */
		 -32627,	/* A2 = 0.995697 */
		 18961,		/* B2 = 0.578644 */
		 -8498,		/* B1 = -0.518707 */
		 18961,		/* B0 = 0.578644 */
		 15608,		/* A1 = -0.952667 */
		 -32628,	/* A2 = 0.995758 */
		 11145,		/* B2 = 0.340134 */
		 -5430,		/* B1 = -0.331467 */
		 11145,		/* B0 = 0.340134 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1400 */
		14780,		/* A1 = -0.902130 */
		 -32393,	/* A2 = 0.988586 */
		 -396,		/* B2 = -0.012086 */
		 0,		/* B1 = 0.000000 */
		 396,		/* B0 = 0.012086 */
		 14510,		/* A1 = -0.885651 */
		 -32630,	/* A2 = 0.995819 */
		 6326,		/* B2 = 0.193069 */
		 -2747,		/* B1 = -0.167671 */
		 6326,		/* B0 = 0.193069 */
		 15154,		/* A1 = -0.924957 */
		 -32632,	/* A2 = 0.995850 */
		 23235,		/* B2 = 0.709076 */
		 -10983,	/* B1 = -0.670380 */
		 23235,		/* B0 = 0.709076 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1477 */
		13005,		/* A1 = -0.793793 */
		 -32368,	/* A2 = 0.987823 */
		 -500,		/* B2 = -0.015265 */
		 0,		/* B1 = 0.000000 */
		 500,		/* B0 = 0.015265 */
		 12708,		/* A1 = -0.775665 */
		 -32615,	/* A2 = 0.995331 */
		 11420,		/* B2 = 0.348526 */
		 -4306,		/* B1 = -0.262833 */
		 11420,		/* B0 = 0.348526 */
		 13397,		/* A1 = -0.817688 */
		 -32615,	/* A2 = 0.995361 */
		 9454,		/* B2 = 0.288528 */
		 -3981,		/* B1 = -0.243027 */
		 9454,		/* B0 = 0.288528 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1600 */
		10046,		/* A1 = -0.613190 */
		 -32331,	/* A2 = 0.986694 */
		 -455,		/* B2 = -0.013915 */
		 0,		/* B1 = 0.000000 */
		 455,		/* B0 = 0.013915 */
		 9694,		/* A1 = -0.591705 */
		 -32601,	/* A2 = 0.994934 */
		 6023,		/* B2 = 0.183815 */
		 -1708,		/* B1 = -0.104279 */
		 6023,		/* B0 = 0.183815 */
		 10478,		/* A1 = -0.639587 */
		 -32603,	/* A2 = 0.994965 */
		 22031,		/* B2 = 0.672333 */
		 -7342,		/* B1 = -0.448151 */
		 22031,		/* B0 = 0.672333 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1633_1638[] */
		9181,		/* A1 = 0.560394 */
		 -32256,	/* A2 = -0.984375 */
		 -556,		/* B2 = -0.016975 */
		 0,		/* B1 = 0 */
		 556,		/* B0 = 0.016975 */
		 8757,		/* A1 = 0.534515 */
		 -32574,	/* A2 = -0.99408 */
		 8443,		/* B2 = 0.25769 */
		 -2135,		/* B1 = -0.130341 */
		 8443,		/* B0 = 0.25769 */
		 9691,		/* A1 = 0.591522 */
		 -32574,	/* A2 = -0.99411 */
		 15446,		/* B2 = 0.471375 */
		 -4809,		/* B1 = -0.293579 */
		 15446,		/* B0 = 0.471375 */
		 7,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1800 */
		5076,		/* A1 = -0.309875 */
		 -32304,	/* A2 = 0.985840 */
		 -508,		/* B2 = -0.015503 */
		 0,		/* B1 = 0.000000 */
		 508,		/* B0 = 0.015503 */
		 4646,		/* A1 = -0.283600 */
		 -32605,	/* A2 = 0.995026 */
		 6742,		/* B2 = 0.205780 */
		 -878,		/* B1 = -0.053635 */
		 6742,		/* B0 = 0.205780 */
		 5552,		/* A1 = -0.338928 */
		 -32605,	/* A2 = 0.995056 */
		 23667,		/* B2 = 0.722260 */
		 -4297,		/* B1 = -0.262329 */
		 23667,		/* B0 = 0.722260 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
	{			/* f1860 */
		3569,		/* A1 = -0.217865 */
		 -32292,	/* A2 = 0.985504 */
		 -239,		/* B2 = -0.007322 */
		 0,		/* B1 = 0.000000 */
		 239,		/* B0 = 0.007322 */
		 3117,		/* A1 = -0.190277 */
		 -32603,	/* A2 = 0.994965 */
		 18658,		/* B2 = 0.569427 */
		 -1557,		/* B1 = -0.095032 */
		 18658,		/* B0 = 0.569427 */
		 4054,		/* A1 = -0.247437 */
		 -32603,	/* A2 = 0.994965 */
		 18886,		/* B2 = 0.576385 */
		 -2566,		/* B1 = -0.156647 */
		 18886,		/* B0 = 0.576385 */
		 5,		/* Internal filter scaling */
		 159,		/* Minimum in-band energy threshold */
		 21,		/* 21/32 in-band to broad-band ratio */
		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
	},
};
static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
{
	unsigned short cmd;
	int cnt, max;

	if (jf->filter > 3) {
		return -1;
	}
	if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))	/* Select Filter */

		return -1;
	if (!jf->enable) {
		if (ixj_WriteDSPCommand(0x5152, j))		/* Disable Filter */

			return -1;
		else
			return 0;
	} else {
		if (ixj_WriteDSPCommand(0x5153, j))		/* Enable Filter */

			return -1;
		/* Select the filter (f0 - f3) to use. */
		if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
			return -1;
	}
	if (jf->freq < 12 && jf->freq > 3) {
		/* Select the frequency for the selected filter. */
		if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
			return -1;
	} else if (jf->freq > 11) {
		/* We need to load a programmable filter set for undefined */
		/* frequencies.  So we will point the filter to a programmable set. */
		/* Since there are only 4 filters and 4 programmable sets, we will */
		/* just point the filter to the same number set and program it for the */
		/* frequency we want. */
		if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
			return -1;
		if (j->ver.low != 0x12) {
			cmd = 0x515B;
			max = 19;
		} else {
			cmd = 0x515E;
			max = 15;
		}
		if (ixj_WriteDSPCommand(cmd, j))
			return -1;
		for (cnt = 0; cnt < max; cnt++) {
			if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
				return -1;
		}
	}
	j->filter_en[jf->filter] = jf->enable;
	return 0;
}

static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
{
	unsigned short cmd;
	int cnt, max;
	if (jfr->filter > 3) {
		return -1;
	}
	if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))	/* Select Filter */
		return -1;

	if (!jfr->enable) {
		if (ixj_WriteDSPCommand(0x5152, j))		/* Disable Filter */
			return -1;
		else
			return 0;
	} else {
		if (ixj_WriteDSPCommand(0x5153, j))		/* Enable Filter */
			return -1;
		/* Select the filter (f0 - f3) to use. */
		if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
			return -1;
	}
	/* We need to load a programmable filter set for undefined */
	/* frequencies.  So we will point the filter to a programmable set. */
	/* Since there are only 4 filters and 4 programmable sets, we will */
	/* just point the filter to the same number set and program it for the */
	/* frequency we want. */
	if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
		return -1;
	if (j->ver.low != 0x12) {
		cmd = 0x515B;
		max = 19;
	} else {
		cmd = 0x515E;
		max = 15;
	}
	if (ixj_WriteDSPCommand(cmd, j))
		return -1;
	for (cnt = 0; cnt < max; cnt++) {
		if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
			return -1;
	}
	j->filter_en[jfr->filter] = jfr->enable;
	return 0;
}

static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
{
	int freq0, freq1;
	unsigned short data;
	if (ti->freq0) {
		freq0 = ti->freq0;
	} else {
		freq0 = 0x7FFF;
	}

	if (ti->freq1) {
		freq1 = ti->freq1;
	} else {
		freq1 = 0x7FFF;
	}

	if(ti->tone_index > 12 && ti->tone_index < 28)
	{
		if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
			return -1;
		if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
			return -1;
		data = freq0;
		if (ixj_WriteDSPCommand(data, j))
			return -1;
		data = freq1;
		if (ixj_WriteDSPCommand(data, j))
			return -1;
	}
	return freq0;
}

