linux/drivers/telephony/ixj.c
<<
>>
Prefs
   1/****************************************************************************
   2 *    ixj.c
   3 *
   4 * Device Driver for Quicknet Technologies, Inc.'s Telephony cards
   5 * including the Internet PhoneJACK, Internet PhoneJACK Lite,
   6 * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and
   7 * SmartCABLE
   8 *
   9 *    (c) Copyright 1999-2001  Quicknet Technologies, Inc.
  10 *
  11 *    This program is free software; you can redistribute it and/or
  12 *    modify it under the terms of the GNU General Public License
  13 *    as published by the Free Software Foundation; either version
  14 *    2 of the License, or (at your option) any later version.
  15 *
  16 * Author:          Ed Okerson, <eokerson@quicknet.net>
  17 *
  18 * Contributors:    Greg Herlein, <gherlein@quicknet.net>
  19 *                  David W. Erhart, <derhart@quicknet.net>
  20 *                  John Sellers, <jsellers@quicknet.net>
  21 *                  Mike Preston, <mpreston@quicknet.net>
  22 *    
  23 * Fixes:           David Huggins-Daines, <dhd@cepstral.com>
  24 *                  Fabio Ferrari, <fabio.ferrari@digitro.com.br>
  25 *                  Artis Kugevics, <artis@mt.lv>
  26 *                  Daniele Bellucci, <bellucda@tiscali.it>
  27 *
  28 * More information about the hardware related to this driver can be found  
  29 * at our website:    http://www.quicknet.net
  30 *
  31 * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
  32 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  33 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
  34 * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  35 *    
  36 * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  37 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  38 * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  39 * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
  40 * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  41 *
  42 ***************************************************************************/
  43
  44/*
  45 * Revision 4.8  2003/07/09 19:39:00  Daniele Bellucci
  46 * Audit some copy_*_user and minor cleanup.
  47 *
  48 * Revision 4.7  2001/08/13 06:19:33  craigs
  49 * Added additional changes from Alan Cox and John Anderson for
  50 * 2.2 to 2.4 cleanup and bounds checking
  51 *
  52 * Revision 4.6  2001/08/13 01:05:05  craigs
  53 * Really fixed PHONE_QUERY_CODEC problem this time
  54 *
  55 * Revision 4.5  2001/08/13 00:11:03  craigs
  56 * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
  57 *
  58 * Revision 4.4  2001/08/07 07:58:12  craigs
  59 * Changed back to three digit version numbers
  60 * Added tagbuild target to allow automatic and easy tagging of versions
  61 *
  62 * Revision 4.3  2001/08/07 07:24:47  craigs
  63 * Added ixj-ver.h to allow easy configuration management of driver
  64 * Added display of version number in /prox/ixj
  65 *
  66 * Revision 4.2  2001/08/06 07:07:19  craigs
  67 * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
  68 * behaviour of returning int rather than short *
  69 *
  70 * Revision 4.1  2001/08/05 00:17:37  craigs
  71 * More changes for correct PCMCIA installation
  72 * Start of changes for backward Linux compatibility
  73 *
  74 * Revision 4.0  2001/08/04 12:33:12  craigs
  75 * New version using GNU autoconf
  76 *
  77 * Revision 3.105  2001/07/20 23:14:32  eokerson
  78 * More work on CallerID generation when using ring cadences.
  79 *
  80 * Revision 3.104  2001/07/06 01:33:55  eokerson
  81 * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
  82 *
  83 * Revision 3.103  2001/07/05 19:20:16  eokerson
  84 * Updated HOWTO
  85 * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
  86 *
  87 * Revision 3.102  2001/07/03 23:51:21  eokerson
  88 * Un-mute mic on Internet LineJACK when in speakerphone mode.
  89 *
  90 * Revision 3.101  2001/07/02 19:26:56  eokerson
  91 * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
  92 *
  93 * Revision 3.100  2001/07/02 19:18:27  eokerson
  94 * Changed driver to make dynamic allocation possible.  We now pass IXJ * between functions instead of array indexes.
  95 * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
  96 * Fixed speaker mode on Internet LineJACK.
  97 *
  98 * Revision 3.99  2001/05/09 14:11:16  eokerson
  99 * Fixed kmalloc error in ixj_build_filter_cadence.  Thanks David Chan <cat@waulogy.stanford.edu>.
 100 *
 101 * Revision 3.98  2001/05/08 19:55:33  eokerson
 102 * Fixed POTS hookstate detection while it is connected to PSTN port.
 103 *
 104 * Revision 3.97  2001/05/08 00:01:04  eokerson
 105 * Fixed kernel oops when sending caller ID data.
 106 *
 107 * Revision 3.96  2001/05/04 23:09:30  eokerson
 108 * Now uses one kernel timer for each card, instead of one for the entire driver.
 109 *
 110 * Revision 3.95  2001/04/25 22:06:47  eokerson
 111 * Fixed squawking at beginning of some G.723.1 calls.
 112 *
 113 * Revision 3.94  2001/04/03 23:42:00  eokerson
 114 * Added linear volume ioctls
 115 * Added raw filter load ioctl
 116 *
 117 * Revision 3.93  2001/02/27 01:00:06  eokerson
 118 * Fixed blocking in CallerID.
 119 * Reduced size of ixj structure for smaller driver footprint.
 120 *
 121 * Revision 3.92  2001/02/20 22:02:59  eokerson
 122 * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
 123 * Improved PSTN ring detection.
 124 * Fixed wink generation on POTS ports.
 125 *
 126 * Revision 3.91  2001/02/13 00:55:44  eokerson
 127 * Turn AEC back on after changing frame sizes.
 128 *
 129 * Revision 3.90  2001/02/12 16:42:00  eokerson
 130 * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
 131 *
 132 * Revision 3.89  2001/02/12 15:41:16  eokerson
 133 * Fix from Artis Kugevics - Tone gains were not being set correctly.
 134 *
 135 * Revision 3.88  2001/02/05 23:25:42  eokerson
 136 * Fixed lockup bugs with deregister.
 137 *
 138 * Revision 3.87  2001/01/29 21:00:39  eokerson
 139 * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
 140 * Updated copyright date.
 141 *
 142 * Revision 3.86  2001/01/23 23:53:46  eokerson
 143 * Fixes to G.729 compatibility.
 144 *
 145 * Revision 3.85  2001/01/23 21:30:36  eokerson
 146 * Added verbage about cards supported.
 147 * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
 148 *
 149 * Revision 3.84  2001/01/22 23:32:10  eokerson
 150 * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
 151 *
 152 * Revision 3.83  2001/01/19 14:51:41  eokerson
 153 * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
 154 *
 155 * Revision 3.82  2001/01/19 00:34:49  eokerson
 156 * Added verbosity to write overlap errors.
 157 *
 158 * Revision 3.81  2001/01/18 23:56:54  eokerson
 159 * Fixed PSTN line test functions.
 160 *
 161 * Revision 3.80  2001/01/18 22:29:27  eokerson
 162 * Updated AEC/AGC values for different cards.
 163 *
 164 * Revision 3.79  2001/01/17 02:58:54  eokerson
 165 * Fixed AEC reset after Caller ID.
 166 * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
 167 *
 168 * Revision 3.78  2001/01/16 19:43:09  eokerson
 169 * Added support for Linux 2.4.x kernels.
 170 *
 171 * Revision 3.77  2001/01/09 04:00:52  eokerson
 172 * Linetest will now test the line, even if it has previously succeeded.
 173 *
 174 * Revision 3.76  2001/01/08 19:27:00  eokerson
 175 * Fixed problem with standard cable on Internet PhoneCARD.
 176 *
 177 * Revision 3.75  2000/12/22 16:52:14  eokerson
 178 * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
 179 *
 180 * Revision 3.74  2000/12/08 22:41:50  eokerson
 181 * Added capability for G729B.
 182 *
 183 * Revision 3.73  2000/12/07 23:35:16  eokerson
 184 * Added capability to have different ring pattern before CallerID data.
 185 * Added hookstate checks in CallerID routines to stop FSK.
 186 *
 187 * Revision 3.72  2000/12/06 19:31:31  eokerson
 188 * Modified signal behavior to only send one signal per event.
 189 *
 190 * Revision 3.71  2000/12/06 03:23:08  eokerson
 191 * Fixed CallerID on Call Waiting.
 192 *
 193 * Revision 3.70  2000/12/04 21:29:37  eokerson
 194 * Added checking to Smart Cable gain functions.
 195 *
 196 * Revision 3.69  2000/12/04 21:05:20  eokerson
 197 * Changed ixjdebug levels.
 198 * Added ioctls to change gains in Internet Phone CARD Smart Cable.
 199 *
 200 * Revision 3.68  2000/12/04 00:17:21  craigs
 201 * Changed mixer voice gain to +6dB rather than 0dB
 202 *
 203 * Revision 3.67  2000/11/30 21:25:51  eokerson
 204 * Fixed write signal errors.
 205 *
 206 * Revision 3.66  2000/11/29 22:42:44  eokerson
 207 * Fixed PSTN ring detect problems.
 208 *
 209 * Revision 3.65  2000/11/29 07:31:55  craigs
 210 * Added new 425Hz filter co-efficients
 211 * Added card-specific DTMF prescaler initialisation
 212 *
 213 * Revision 3.64  2000/11/28 14:03:32  craigs
 214 * Changed certain mixer initialisations to be 0dB rather than 12dB
 215 * Added additional information to /proc/ixj
 216 *
 217 * Revision 3.63  2000/11/28 11:38:41  craigs
 218 * Added display of AEC modes in AUTO and AGC mode
 219 *
 220 * Revision 3.62  2000/11/28 04:05:44  eokerson
 221 * Improved PSTN ring detection routine.
 222 *
 223 * Revision 3.61  2000/11/27 21:53:12  eokerson
 224 * Fixed flash detection.
 225 *
 226 * Revision 3.60  2000/11/27 15:57:29  eokerson
 227 * More work on G.729 load routines.
 228 *
 229 * Revision 3.59  2000/11/25 21:55:12  eokerson
 230 * Fixed errors in G.729 load routine.
 231 *
 232 * Revision 3.58  2000/11/25 04:08:29  eokerson
 233 * Added board locks around G.729 and TS85 load routines.
 234 *
 235 * Revision 3.57  2000/11/24 05:35:17  craigs
 236 * Added ability to retrieve mixer values on LineJACK
 237 * Added complete initialisation of all mixer values at startup
 238 * Fixed spelling mistake
 239 *
 240 * Revision 3.56  2000/11/23 02:52:11  robertj
 241 * Added cvs change log keyword.
 242 * Fixed bug in capabilities list when using G.729 module.
 243 *
 244 */
 245
 246#include "ixj-ver.h"
 247
 248#define PERFMON_STATS
 249#define IXJDEBUG 0
 250#define MAXRINGS 5
 251
 252#include <linux/module.h>
 253
 254#include <linux/init.h>
 255#include <linux/sched.h>
 256#include <linux/kernel.h>       /* printk() */
 257#include <linux/fs.h>           /* everything... */
 258#include <linux/errno.h>        /* error codes */
 259#include <linux/slab.h>
 260#include <linux/mutex.h>
 261#include <linux/mm.h>
 262#include <linux/ioport.h>
 263#include <linux/interrupt.h>
 264#include <linux/proc_fs.h>
 265#include <linux/poll.h>
 266#include <linux/timer.h>
 267#include <linux/delay.h>
 268#include <linux/pci.h>
 269
 270#include <asm/io.h>
 271#include <asm/uaccess.h>
 272
 273#include <linux/isapnp.h>
 274
 275#include "ixj.h"
 276
 277#define TYPE(inode) (iminor(inode) >> 4)
 278#define NUM(inode) (iminor(inode) & 0xf)
 279
 280static DEFINE_MUTEX(ixj_mutex);
 281static int ixjdebug;
 282static int hertz = HZ;
 283static int samplerate = 100;
 284
 285module_param(ixjdebug, int, 0);
 286
 287static DEFINE_PCI_DEVICE_TABLE(ixj_pci_tbl) = {
 288        { PCI_VENDOR_ID_QUICKNET, PCI_DEVICE_ID_QUICKNET_XJ,
 289          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 290        { }
 291};
 292MODULE_DEVICE_TABLE(pci, ixj_pci_tbl);
 293
 294/************************************************************************
 295*
 296* ixjdebug meanings are now bit mapped instead of level based
 297* Values can be or'ed together to turn on multiple messages
 298*
 299* bit  0 (0x0001) = any failure
 300* bit  1 (0x0002) = general messages
 301* bit  2 (0x0004) = POTS ringing related
 302* bit  3 (0x0008) = PSTN events
 303* bit  4 (0x0010) = PSTN Cadence state details
 304* bit  5 (0x0020) = Tone detection triggers
 305* bit  6 (0x0040) = Tone detection cadence details
 306* bit  7 (0x0080) = ioctl tracking
 307* bit  8 (0x0100) = signal tracking
 308* bit  9 (0x0200) = CallerID generation details
 309*
 310************************************************************************/
 311
 312#ifdef IXJ_DYN_ALLOC
 313
 314static IXJ *ixj[IXJMAX];
 315#define get_ixj(b)      ixj[(b)]
 316
 317/*
 318 *      Allocate a free IXJ device
 319 */
 320 
 321static IXJ *ixj_alloc()
 322{
 323        for(cnt=0; cnt<IXJMAX; cnt++)
 324        {
 325                if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
 326                {
 327                        j = kmalloc(sizeof(IXJ), GFP_KERNEL);
 328                        if (j == NULL)
 329                                return NULL;
 330                        ixj[cnt] = j;
 331                        return j;
 332                }
 333        }
 334        return NULL;
 335}
 336
 337static void ixj_fsk_free(IXJ *j)
 338{
 339        kfree(j->fskdata);
 340        j->fskdata = NULL;
 341}
 342
 343static void ixj_fsk_alloc(IXJ *j)
 344{
 345        if(!j->fskdata) {
 346                j->fskdata = kmalloc(8000, GFP_KERNEL);
 347                if (!j->fskdata) {
 348                        if(ixjdebug & 0x0200) {
 349                                printk("IXJ phone%d - allocate failed\n", j->board);
 350                        }
 351                        return;
 352                } else {
 353                        j->fsksize = 8000;
 354                        if(ixjdebug & 0x0200) {
 355                                printk("IXJ phone%d - allocate succeeded\n", j->board);
 356                        }
 357                }
 358        }
 359}
 360
 361#else
 362
 363static IXJ ixj[IXJMAX];
 364#define get_ixj(b)      (&ixj[(b)])
 365
 366/*
 367 *      Allocate a free IXJ device
 368 */
 369 
 370static IXJ *ixj_alloc(void)
 371{
 372        int cnt;
 373        for(cnt=0; cnt<IXJMAX; cnt++) {
 374                if(!ixj[cnt].DSPbase)
 375                        return &ixj[cnt];
 376        }
 377        return NULL;
 378}
 379
 380static inline void ixj_fsk_free(IXJ *j) {;}
 381
 382static inline void ixj_fsk_alloc(IXJ *j)
 383{
 384        j->fsksize = 8000;
 385}
 386
 387#endif
 388
 389#ifdef PERFMON_STATS
 390#define ixj_perfmon(x)  ((x)++)
 391#else
 392#define ixj_perfmon(x)  do { } while(0)
 393#endif
 394
 395static int ixj_convert_loaded;
 396
 397static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
 398
 399/************************************************************************
 400*
 401* These are function definitions to allow external modules to register
 402* enhanced functionality call backs.
 403*
 404************************************************************************/
 405
 406static int Stub(IXJ * J, unsigned long arg)
 407{
 408        return 0;
 409}
 410
 411static IXJ_REGFUNC ixj_PreRead = &Stub;
 412static IXJ_REGFUNC ixj_PostRead = &Stub;
 413static IXJ_REGFUNC ixj_PreWrite = &Stub;
 414static IXJ_REGFUNC ixj_PostWrite = &Stub;
 415
 416static void ixj_read_frame(IXJ *j);
 417static void ixj_write_frame(IXJ *j);
 418static void ixj_init_timer(IXJ *j);
 419static void ixj_add_timer(IXJ * j);
 420static void ixj_timeout(unsigned long ptr);
 421static int read_filters(IXJ *j);
 422static int LineMonitor(IXJ *j);
 423static int ixj_fasync(int fd, struct file *, int mode);
 424static int ixj_set_port(IXJ *j, int arg);
 425static int ixj_set_pots(IXJ *j, int arg);
 426static int ixj_hookstate(IXJ *j);
 427static int ixj_record_start(IXJ *j);
 428static void ixj_record_stop(IXJ *j);
 429static void set_rec_volume(IXJ *j, int volume);
 430static int get_rec_volume(IXJ *j);
 431static int set_rec_codec(IXJ *j, int rate);
 432static void ixj_vad(IXJ *j, int arg);
 433static int ixj_play_start(IXJ *j);
 434static void ixj_play_stop(IXJ *j);
 435static int ixj_set_tone_on(unsigned short arg, IXJ *j);
 436static int ixj_set_tone_off(unsigned short, IXJ *j);
 437static int ixj_play_tone(IXJ *j, char tone);
 438static void ixj_aec_start(IXJ *j, int level);
 439static int idle(IXJ *j);
 440static void ixj_ring_on(IXJ *j);
 441static void ixj_ring_off(IXJ *j);
 442static void aec_stop(IXJ *j);
 443static void ixj_ringback(IXJ *j);
 444static void ixj_busytone(IXJ *j);
 445static void ixj_dialtone(IXJ *j);
 446static void ixj_cpt_stop(IXJ *j);
 447static char daa_int_read(IXJ *j);
 448static char daa_CR_read(IXJ *j, int cr);
 449static int daa_set_mode(IXJ *j, int mode);
 450static int ixj_linetest(IXJ *j);
 451static int ixj_daa_write(IXJ *j);
 452static int ixj_daa_cid_read(IXJ *j);
 453static void DAA_Coeff_US(IXJ *j);
 454static void DAA_Coeff_UK(IXJ *j);
 455static void DAA_Coeff_France(IXJ *j);
 456static void DAA_Coeff_Germany(IXJ *j);
 457static void DAA_Coeff_Australia(IXJ *j);
 458static void DAA_Coeff_Japan(IXJ *j);
 459static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
 460static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
 461static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
 462static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp);
 463static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp);
 464/* Serial Control Interface funtions */
 465static int SCI_Control(IXJ *j, int control);
 466static int SCI_Prepare(IXJ *j);
 467static int SCI_WaitHighSCI(IXJ *j);
 468static int SCI_WaitLowSCI(IXJ *j);
 469static DWORD PCIEE_GetSerialNumber(WORD wAddress);
 470static int ixj_PCcontrol_wait(IXJ *j);
 471static void ixj_pre_cid(IXJ *j);
 472static void ixj_write_cid(IXJ *j);
 473static void ixj_write_cid_bit(IXJ *j, int bit);
 474static int set_base_frame(IXJ *j, int size);
 475static int set_play_codec(IXJ *j, int rate);
 476static void set_rec_depth(IXJ *j, int depth);
 477static int ixj_mixer(long val, IXJ *j);
 478
 479/************************************************************************
 480CT8020/CT8021 Host Programmers Model
 481Host address    Function                                        Access
 482DSPbase +
 4830-1             Aux Software Status Register (reserved)         Read Only
 4842-3             Software Status Register                        Read Only
 4854-5             Aux Software Control Register (reserved)        Read Write
 4866-7             Software Control Register                       Read Write
 4878-9             Hardware Status Register                        Read Only
 488A-B             Hardware Control Register                       Read Write
 489C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
 490E-F Host Receive (Read) Data Buffer Access Port (buffer input)  Read Only
 491************************************************************************/
 492
 493static inline void ixj_read_HSR(IXJ *j)
 494{
 495        j->hsr.bytes.low = inb_p(j->DSPbase + 8);
 496        j->hsr.bytes.high = inb_p(j->DSPbase + 9);
 497}
 498
 499static inline int IsControlReady(IXJ *j)
 500{
 501        ixj_read_HSR(j);
 502        return j->hsr.bits.controlrdy ? 1 : 0;
 503}
 504
 505static inline int IsPCControlReady(IXJ *j)
 506{
 507        j->pccr1.byte = inb_p(j->XILINXbase + 3);
 508        return j->pccr1.bits.crr ? 1 : 0;
 509}
 510
 511static inline int IsStatusReady(IXJ *j)
 512{
 513        ixj_read_HSR(j);
 514        return j->hsr.bits.statusrdy ? 1 : 0;
 515}
 516
 517static inline int IsRxReady(IXJ *j)
 518{
 519        ixj_read_HSR(j);
 520        ixj_perfmon(j->rxreadycheck);
 521        return j->hsr.bits.rxrdy ? 1 : 0;
 522}
 523
 524static inline int IsTxReady(IXJ *j)
 525{
 526        ixj_read_HSR(j);
 527        ixj_perfmon(j->txreadycheck);
 528        return j->hsr.bits.txrdy ? 1 : 0;
 529}
 530
 531static inline void set_play_volume(IXJ *j, int volume)
 532{
 533        if (ixjdebug & 0x0002)
 534                printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
 535        ixj_WriteDSPCommand(0xCF02, j);
 536        ixj_WriteDSPCommand(volume, j);
 537}
 538
 539static int set_play_volume_linear(IXJ *j, int volume)
 540{
 541        int newvolume, dspplaymax;
 542
 543        if (ixjdebug & 0x0002)
 544                printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
 545        if(volume > 100 || volume < 0) {
 546                return -1;
 547        }
 548
 549        /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
 550        switch (j->cardtype) {
 551        case QTI_PHONEJACK:
 552                dspplaymax = 0x380;
 553                break;
 554        case QTI_LINEJACK:
 555                if(j->port == PORT_PSTN) {
 556                        dspplaymax = 0x48;
 557                } else {
 558                        dspplaymax = 0x100;
 559                }
 560                break;
 561        case QTI_PHONEJACK_LITE:
 562                dspplaymax = 0x380;
 563                break;
 564        case QTI_PHONEJACK_PCI:
 565                dspplaymax = 0x6C;
 566                break;
 567        case QTI_PHONECARD:
 568                dspplaymax = 0x50;
 569                break;
 570        default:
 571                return -1;
 572        }
 573        newvolume = (dspplaymax * volume) / 100;
 574        set_play_volume(j, newvolume);
 575        return 0;
 576}
 577
 578static inline void set_play_depth(IXJ *j, int depth)
 579{
 580        if (depth > 60)
 581                depth = 60;
 582        if (depth < 0)
 583                depth = 0;
 584        ixj_WriteDSPCommand(0x5280 + depth, j);
 585}
 586
 587static inline int get_play_volume(IXJ *j)
 588{
 589        ixj_WriteDSPCommand(0xCF00, j);
 590        return j->ssr.high << 8 | j->ssr.low;
 591}
 592
 593static int get_play_volume_linear(IXJ *j)
 594{
 595        int volume, newvolume, dspplaymax;
 596
 597        /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
 598        switch (j->cardtype) {
 599        case QTI_PHONEJACK:
 600                dspplaymax = 0x380;
 601                break;
 602        case QTI_LINEJACK:
 603                if(j->port == PORT_PSTN) {
 604                        dspplaymax = 0x48;
 605                } else {
 606                        dspplaymax = 0x100;
 607                }
 608                break;
 609        case QTI_PHONEJACK_LITE:
 610                dspplaymax = 0x380;
 611                break;
 612        case QTI_PHONEJACK_PCI:
 613                dspplaymax = 0x6C;
 614                break;
 615        case QTI_PHONECARD:
 616                dspplaymax = 100;
 617                break;
 618        default:
 619                return -1;
 620        }
 621        volume = get_play_volume(j);
 622        newvolume = (volume * 100) / dspplaymax;
 623        if(newvolume > 100)
 624                newvolume = 100;
 625        return newvolume;
 626}
 627
 628static inline BYTE SLIC_GetState(IXJ *j)
 629{
 630        if (j->cardtype == QTI_PHONECARD) {
 631                j->pccr1.byte = 0;
 632                j->psccr.bits.dev = 3;
 633                j->psccr.bits.rw = 1;
 634                outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
 635                ixj_PCcontrol_wait(j);
 636                j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
 637                ixj_PCcontrol_wait(j);
 638                if (j->pslic.bits.powerdown)
 639                        return PLD_SLIC_STATE_OC;
 640                else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
 641                        return PLD_SLIC_STATE_ACTIVE;
 642                else
 643                        return PLD_SLIC_STATE_RINGING;
 644        } else {
 645                j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
 646        }
 647        return j->pld_slicr.bits.state;
 648}
 649
 650static bool SLIC_SetState(BYTE byState, IXJ *j)
 651{
 652        bool fRetVal = false;
 653
 654        if (j->cardtype == QTI_PHONECARD) {
 655                if (j->flags.pcmciasct) {
 656                        switch (byState) {
 657                        case PLD_SLIC_STATE_TIPOPEN:
 658                        case PLD_SLIC_STATE_OC:
 659                                j->pslic.bits.powerdown = 1;
 660                                j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
 661                                fRetVal = true;
 662                                break;
 663                        case PLD_SLIC_STATE_RINGING:
 664                                if (j->readers || j->writers) {
 665                                        j->pslic.bits.powerdown = 0;
 666                                        j->pslic.bits.ring0 = 1;
 667                                        j->pslic.bits.ring1 = 0;
 668                                        fRetVal = true;
 669                                }
 670                                break;
 671                        case PLD_SLIC_STATE_OHT:        /* On-hook transmit */
 672
 673                        case PLD_SLIC_STATE_STANDBY:
 674                        case PLD_SLIC_STATE_ACTIVE:
 675                                if (j->readers || j->writers) {
 676                                        j->pslic.bits.powerdown = 0;
 677                                } else {
 678                                        j->pslic.bits.powerdown = 1;
 679                                }
 680                                j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
 681                                fRetVal = true;
 682                                break;
 683                        case PLD_SLIC_STATE_APR:        /* Active polarity reversal */
 684
 685                        case PLD_SLIC_STATE_OHTPR:      /* OHT polarity reversal */
 686
 687                        default:
 688                                fRetVal = false;
 689                                break;
 690                        }
 691                        j->psccr.bits.dev = 3;
 692                        j->psccr.bits.rw = 0;
 693                        outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
 694                        ixj_PCcontrol_wait(j);
 695                }
 696        } else {
 697                /* Set the C1, C2, C3 & B2EN signals. */
 698                switch (byState) {
 699                case PLD_SLIC_STATE_OC:
 700                        j->pld_slicw.bits.c1 = 0;
 701                        j->pld_slicw.bits.c2 = 0;
 702                        j->pld_slicw.bits.c3 = 0;
 703                        j->pld_slicw.bits.b2en = 0;
 704                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 705                        fRetVal = true;
 706                        break;
 707                case PLD_SLIC_STATE_RINGING:
 708                        j->pld_slicw.bits.c1 = 1;
 709                        j->pld_slicw.bits.c2 = 0;
 710                        j->pld_slicw.bits.c3 = 0;
 711                        j->pld_slicw.bits.b2en = 1;
 712                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 713                        fRetVal = true;
 714                        break;
 715                case PLD_SLIC_STATE_ACTIVE:
 716                        j->pld_slicw.bits.c1 = 0;
 717                        j->pld_slicw.bits.c2 = 1;
 718                        j->pld_slicw.bits.c3 = 0;
 719                        j->pld_slicw.bits.b2en = 0;
 720                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 721                        fRetVal = true;
 722                        break;
 723                case PLD_SLIC_STATE_OHT:        /* On-hook transmit */
 724
 725                        j->pld_slicw.bits.c1 = 1;
 726                        j->pld_slicw.bits.c2 = 1;
 727                        j->pld_slicw.bits.c3 = 0;
 728                        j->pld_slicw.bits.b2en = 0;
 729                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 730                        fRetVal = true;
 731                        break;
 732                case PLD_SLIC_STATE_TIPOPEN:
 733                        j->pld_slicw.bits.c1 = 0;
 734                        j->pld_slicw.bits.c2 = 0;
 735                        j->pld_slicw.bits.c3 = 1;
 736                        j->pld_slicw.bits.b2en = 0;
 737                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 738                        fRetVal = true;
 739                        break;
 740                case PLD_SLIC_STATE_STANDBY:
 741                        j->pld_slicw.bits.c1 = 1;
 742                        j->pld_slicw.bits.c2 = 0;
 743                        j->pld_slicw.bits.c3 = 1;
 744                        j->pld_slicw.bits.b2en = 1;
 745                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 746                        fRetVal = true;
 747                        break;
 748                case PLD_SLIC_STATE_APR:        /* Active polarity reversal */
 749
 750                        j->pld_slicw.bits.c1 = 0;
 751                        j->pld_slicw.bits.c2 = 1;
 752                        j->pld_slicw.bits.c3 = 1;
 753                        j->pld_slicw.bits.b2en = 0;
 754                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 755                        fRetVal = true;
 756                        break;
 757                case PLD_SLIC_STATE_OHTPR:      /* OHT polarity reversal */
 758
 759                        j->pld_slicw.bits.c1 = 1;
 760                        j->pld_slicw.bits.c2 = 1;
 761                        j->pld_slicw.bits.c3 = 1;
 762                        j->pld_slicw.bits.b2en = 0;
 763                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
 764                        fRetVal = true;
 765                        break;
 766                default:
 767                        fRetVal = false;
 768                        break;
 769                }
 770        }
 771
 772        return fRetVal;
 773}
 774
 775static int ixj_wink(IXJ *j)
 776{
 777        BYTE slicnow;
 778
 779        slicnow = SLIC_GetState(j);
 780
 781        j->pots_winkstart = jiffies;
 782        SLIC_SetState(PLD_SLIC_STATE_OC, j);
 783
 784        msleep(jiffies_to_msecs(j->winktime));
 785
 786        SLIC_SetState(slicnow, j);
 787        return 0;
 788}
 789
 790static void ixj_init_timer(IXJ *j)
 791{
 792        init_timer(&j->timer);
 793        j->timer.function = ixj_timeout;
 794        j->timer.data = (unsigned long)j;
 795}
 796
 797static void ixj_add_timer(IXJ *j)
 798{
 799        j->timer.expires = jiffies + (hertz / samplerate);
 800        add_timer(&j->timer);
 801}
 802
 803static void ixj_tone_timeout(IXJ *j)
 804{
 805        IXJ_TONE ti;
 806
 807        j->tone_state++;
 808        if (j->tone_state == 3) {
 809                j->tone_state = 0;
 810                if (j->cadence_t) {
 811                        j->tone_cadence_state++;
 812                        if (j->tone_cadence_state >= j->cadence_t->elements_used) {
 813                                switch (j->cadence_t->termination) {
 814                                case PLAY_ONCE:
 815                                        ixj_cpt_stop(j);
 816                                        break;
 817                                case REPEAT_LAST_ELEMENT:
 818                                        j->tone_cadence_state--;
 819                                        ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
 820                                        break;
 821                                case REPEAT_ALL:
 822                                        j->tone_cadence_state = 0;
 823                                        if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
 824                                                ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
 825                                                ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
 826                                                ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
 827                                                ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
 828                                                ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
 829                                                ixj_init_tone(j, &ti);
 830                                        }
 831                                        ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
 832                                        ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
 833                                        ixj_play_tone(j, j->cadence_t->ce[0].index);
 834                                        break;
 835                                }
 836                        } else {
 837                                if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
 838                                        ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
 839                                        ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
 840                                        ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
 841                                        ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
 842                                        ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
 843                                        ixj_init_tone(j, &ti);
 844                                }
 845                                ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
 846                                ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
 847                                ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
 848                        }
 849                }
 850        }
 851}
 852
 853static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
 854{
 855        if(j->ixj_signals[event]) {
 856                if(ixjdebug & 0x0100)
 857                        printk("Sending signal for event %d\n", event);
 858                        /* Send apps notice of change */
 859                /* see config.h for macro definition */
 860                kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
 861        }
 862}
 863
 864static void ixj_pstn_state(IXJ *j)
 865{
 866        int var;
 867        union XOPXR0 XR0, daaint;
 868
 869        var = 10;
 870
 871        XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
 872        daaint.reg = 0;
 873        XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
 874
 875        j->pld_scrr.byte = inb_p(j->XILINXbase);
 876        if (j->pld_scrr.bits.daaflag) {
 877                daa_int_read(j);
 878                if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
 879                        if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
 880                                daaint.bitreg.RING = 1;
 881                                if(ixjdebug & 0x0008) {
 882                                        printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
 883                                }
 884                        } else {
 885                                daa_set_mode(j, SOP_PU_RESET);
 886                        }
 887                }
 888                if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
 889                        daaint.bitreg.Caller_ID = 1;
 890                        j->pstn_cid_intr = 1;
 891                        j->pstn_cid_received = jiffies;
 892                        if(ixjdebug & 0x0008) {
 893                                printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
 894                        }
 895                }
 896                if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
 897                        daaint.bitreg.Cadence = 1;
 898                        if(ixjdebug & 0x0008) {
 899                                printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
 900                        }
 901                }
 902                if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
 903                        daaint.bitreg.VDD_OK = 1;
 904                        daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
 905                }
 906        }
 907        daa_CR_read(j, 1);
 908        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)) {
 909                daaint.bitreg.RMR = 1;
 910                daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
 911                if(ixjdebug & 0x0008) {
 912                        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);
 913                }
 914                j->pstn_prev_rmr = j->pstn_last_rmr;
 915                j->pstn_last_rmr = jiffies;
 916        }
 917        switch(j->daa_mode) {
 918                case SOP_PU_SLEEP:
 919                        if (daaint.bitreg.RING) {
 920                                if (!j->flags.pstn_ringing) {
 921                                        if (j->daa_mode != SOP_PU_RINGING) {
 922                                                j->pstn_ring_int = jiffies;
 923                                                daa_set_mode(j, SOP_PU_RINGING);
 924                                        }
 925                                }
 926                        }
 927                        break;
 928                case SOP_PU_RINGING:
 929                        if (daaint.bitreg.RMR) {
 930                                if (ixjdebug & 0x0008) {
 931                                        printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
 932                                }
 933                                if (daaint.bitreg.SI_1) {                /* Rising edge of RMR */
 934                                        j->flags.pstn_rmr = 1;
 935                                        j->pstn_ring_start = jiffies;
 936                                        j->pstn_ring_stop = 0;
 937                                        j->ex.bits.pstn_ring = 0;
 938                                        if (j->cadence_f[4].state == 0) {
 939                                                j->cadence_f[4].state = 1;
 940                                                j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
 941                                                j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
 942                                                j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
 943                                        } else if (j->cadence_f[4].state == 2) {
 944                                                if((time_after(jiffies, j->cadence_f[4].off1min) &&
 945                                                    time_before(jiffies, j->cadence_f[4].off1max))) {
 946                                                        if (j->cadence_f[4].on2) {
 947                                                                j->cadence_f[4].state = 3;
 948                                                                j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
 949                                                                j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
 950                                                                j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
 951                                                        } else {
 952                                                                j->cadence_f[4].state = 7;
 953                                                        }
 954                                                } else {
 955                                                        if (ixjdebug & 0x0008) {
 956                                                                printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
 957                                                                                j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
 958                                                                                j->cadence_f[4].off1);
 959                                                        }
 960                                                        j->cadence_f[4].state = 0;
 961                                                }
 962                                        } else if (j->cadence_f[4].state == 4) {
 963                                                if((time_after(jiffies, j->cadence_f[4].off2min) &&
 964                                                    time_before(jiffies, j->cadence_f[4].off2max))) {
 965                                                        if (j->cadence_f[4].on3) {
 966                                                                j->cadence_f[4].state = 5;
 967                                                                j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
 968                                                                j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
 969                                                                j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
 970                                                        } else {
 971                                                                j->cadence_f[4].state = 7;
 972                                                        }
 973                                                } else {
 974                                                        if (ixjdebug & 0x0008) {
 975                                                                printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
 976                                                                                j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
 977                                                                                j->cadence_f[4].off2);
 978                                                        }
 979                                                        j->cadence_f[4].state = 0;
 980                                                }
 981                                        } else if (j->cadence_f[4].state == 6) {
 982                                                if((time_after(jiffies, j->cadence_f[4].off3min) &&
 983                                                    time_before(jiffies, j->cadence_f[4].off3max))) {
 984                                                        j->cadence_f[4].state = 7;
 985                                                } else {
 986                                                        if (ixjdebug & 0x0008) {
 987                                                                printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
 988                                                                                j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
 989                                                                                j->cadence_f[4].off3);
 990                                                        }
 991                                                        j->cadence_f[4].state = 0;
 992                                                }
 993                                        } else {
 994                                                j->cadence_f[4].state = 0;
 995                                        }
 996                                } else {                                /* Falling edge of RMR */
 997                                        j->pstn_ring_start = 0;
 998                                        j->pstn_ring_stop = jiffies;
 999                                        if (j->cadence_f[4].state == 1) {
1000                                                if(!j->cadence_f[4].on1) {
1001                                                        j->cadence_f[4].state = 7;
1002                                                } else if((time_after(jiffies, j->cadence_f[4].on1min) &&
1003                                                  time_before(jiffies, j->cadence_f[4].on1max))) {
1004                                                        if (j->cadence_f[4].off1) {
1005                                                                j->cadence_f[4].state = 2;
1006                                                                j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
1007                                                                j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
1008                                                                j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
1009                                                        } else {
1010                                                                j->cadence_f[4].state = 7;
1011                                                        }
1012                                                } else {
1013                                                        if (ixjdebug & 0x0008) {
1014                                                                printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1015                                                                                j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1016                                                                                j->cadence_f[4].on1);
1017                                                        }
1018                                                        j->cadence_f[4].state = 0;
1019                                                }
1020                                        } else if (j->cadence_f[4].state == 3) {
1021                                                if((time_after(jiffies, j->cadence_f[4].on2min) &&
1022                                                    time_before(jiffies, j->cadence_f[4].on2max))) {
1023                                                        if (j->cadence_f[4].off2) {
1024                                                                j->cadence_f[4].state = 4;
1025                                                                j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
1026                                                                j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
1027                                                                j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
1028                                                        } else {
1029                                                                j->cadence_f[4].state = 7;
1030                                                        }
1031                                                } else {
1032                                                        if (ixjdebug & 0x0008) {
1033                                                                printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1034                                                                                j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1035                                                                                j->cadence_f[4].on2);
1036                                                        }
1037                                                        j->cadence_f[4].state = 0;
1038                                                }
1039                                        } else if (j->cadence_f[4].state == 5) {
1040                                                if((time_after(jiffies, j->cadence_f[4].on3min) &&
1041                                                    time_before(jiffies, j->cadence_f[4].on3max))) {
1042                                                        if (j->cadence_f[4].off3) {
1043                                                                j->cadence_f[4].state = 6;
1044                                                                j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
1045                                                                j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
1046                                                                j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
1047                                                        } else {
1048                                                                j->cadence_f[4].state = 7;
1049                                                        }
1050                                                } else {
1051                                                        j->cadence_f[4].state = 0;
1052                                                }
1053                                        } else {
1054                                                if (ixjdebug & 0x0008) {
1055                                                        printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1056                                                                        j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1057                                                                        j->cadence_f[4].on3);
1058                                                }
1059                                                j->cadence_f[4].state = 0;
1060                                        }
1061                                }
1062                                if (ixjdebug & 0x0010) {
1063                                        printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1064                                }
1065                                if (ixjdebug & 0x0010) {
1066                                        switch(j->cadence_f[4].state) {
1067                                                case 1:
1068                                                        printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1069                                                j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
1070                                                        break;
1071                                                case 2:
1072                                                        printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1073                                                j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
1074                                                        break;
1075                                                case 3:
1076                                                        printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1077                                                j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
1078                                                        break;
1079                                                case 4:
1080                                                        printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1081                                                j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
1082                                                        break;
1083                                                case 5:
1084                                                        printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1085                                                j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
1086                                                        break;
1087                                                case 6: 
1088                                                        printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1089                                                j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
1090                                                        break;
1091                                        }
1092                                }
1093                        }
1094                        if (j->cadence_f[4].state == 7) {
1095                                j->cadence_f[4].state = 0;
1096                                j->pstn_ring_stop = jiffies;
1097                                j->ex.bits.pstn_ring = 1;
1098                                ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
1099                                if(ixjdebug & 0x0008) {
1100                                        printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
1101                                }
1102                        }
1103                        if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
1104                           (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
1105                                if(ixjdebug & 0x0008) {
1106                                        printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
1107                                        printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
1108                                        printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
1109                                }
1110                                j->pstn_ring_stop = j->pstn_ring_int = 0;
1111                                daa_set_mode(j, SOP_PU_SLEEP);
1112                        } 
1113                        outb_p(j->pld_scrw.byte, j->XILINXbase);
1114                        if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
1115                                ixj_daa_cid_read(j);
1116                                j->ex.bits.caller_id = 1;
1117                                ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
1118                                j->pstn_cid_intr = 0;
1119                        }
1120                        if (daaint.bitreg.Cadence) {
1121                                if(ixjdebug & 0x0008) {
1122                                        printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
1123                                }
1124                                daa_set_mode(j, SOP_PU_SLEEP);
1125                                j->ex.bits.pstn_ring = 0;
1126                        }
1127                        break;
1128                case SOP_PU_CONVERSATION:
1129                        if (daaint.bitreg.VDD_OK) {
1130                                if(!daaint.bitreg.SI_0) {
1131                                        if (!j->pstn_winkstart) {
1132                                                if(ixjdebug & 0x0008) {
1133                                                        printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
1134                                                }
1135                                                j->pstn_winkstart = jiffies;
1136                                        } 
1137                                } else {
1138                                        if (j->pstn_winkstart) {
1139                                                if(ixjdebug & 0x0008) {
1140                                                        printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
1141                                                }
1142                                                j->pstn_winkstart = 0;
1143                                        }
1144                                }
1145                        }
1146                        if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
1147                                if(ixjdebug & 0x0008) {
1148                                        printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
1149                                }
1150                                daa_set_mode(j, SOP_PU_SLEEP);
1151                                j->pstn_winkstart = 0;
1152                                j->ex.bits.pstn_wink = 1;
1153                                ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
1154                        }
1155                        break;
1156        }
1157}
1158
1159static void ixj_timeout(unsigned long ptr)
1160{
1161        int board;
1162        unsigned long jifon;
1163        IXJ *j = (IXJ *)ptr;
1164        board = j->board;
1165
1166        if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
1167                ixj_perfmon(j->timerchecks);
1168                j->hookstate = ixj_hookstate(j);
1169                if (j->tone_state) {
1170                        if (!(j->hookstate)) {
1171                                ixj_cpt_stop(j);
1172                                if (j->m_hook) {
1173                                        j->m_hook = 0;
1174                                        j->ex.bits.hookstate = 1;
1175                                        ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1176                                }
1177                                clear_bit(board, &j->busyflags);
1178                                ixj_add_timer(j);
1179                                return;
1180                        }
1181                        if (j->tone_state == 1)
1182                                jifon = ((hertz * j->tone_on_time) * 25 / 100000);
1183                        else
1184                                jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
1185                        if (time_before(jiffies, j->tone_start_jif + jifon)) {
1186                                if (j->tone_state == 1) {
1187                                        ixj_play_tone(j, j->tone_index);
1188                                        if (j->dsp.low == 0x20) {
1189                                                clear_bit(board, &j->busyflags);
1190                                                ixj_add_timer(j);
1191                                                return;
1192                                        }
1193                                } else {
1194                                        ixj_play_tone(j, 0);
1195                                        if (j->dsp.low == 0x20) {
1196                                                clear_bit(board, &j->busyflags);
1197                                                ixj_add_timer(j);
1198                                                return;
1199                                        }
1200                                }
1201                        } else {
1202                                ixj_tone_timeout(j);
1203                                if (j->flags.dialtone) {
1204                                        ixj_dialtone(j);
1205                                }
1206                                if (j->flags.busytone) {
1207                                        ixj_busytone(j);
1208                                        if (j->dsp.low == 0x20) {
1209                                                clear_bit(board, &j->busyflags);
1210                                                ixj_add_timer(j);
1211                                                return;
1212                                        }
1213                                }
1214                                if (j->flags.ringback) {
1215                                        ixj_ringback(j);
1216                                        if (j->dsp.low == 0x20) {
1217                                                clear_bit(board, &j->busyflags);
1218                                                ixj_add_timer(j);
1219                                                return;
1220                                        }
1221                                }
1222                                if (!j->tone_state) {
1223                                        ixj_cpt_stop(j);
1224                                }
1225                        }
1226                }
1227                if (!(j->tone_state && j->dsp.low == 0x20)) {
1228                        if (IsRxReady(j)) {
1229                                ixj_read_frame(j);
1230                        }
1231                        if (IsTxReady(j)) {
1232                                ixj_write_frame(j);
1233                        }
1234                }
1235                if (j->flags.cringing) {
1236                        if (j->hookstate & 1) {
1237                                j->flags.cringing = 0;
1238                                ixj_ring_off(j);
1239                        } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
1240                                switch(j->cadence_f[5].state) {
1241                                        case 0:
1242                                                j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
1243                                                if (time_before(jiffies, j->cadence_f[5].on1dot)) {
1244                                                        if(ixjdebug & 0x0004) {
1245                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1246                                                        }
1247                                                        ixj_ring_on(j);
1248                                                }
1249                                                j->cadence_f[5].state = 1;
1250                                                break;
1251                                        case 1:
1252                                                if (time_after(jiffies, j->cadence_f[5].on1dot)) {
1253                                                        j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
1254                                                        if(ixjdebug & 0x0004) {
1255                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1256                                                        }
1257                                                        ixj_ring_off(j);
1258                                                        j->cadence_f[5].state = 2;
1259                                                }
1260                                                break;
1261                                        case 2:
1262                                                if (time_after(jiffies, j->cadence_f[5].off1dot)) {
1263                                                        if(ixjdebug & 0x0004) {
1264                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1265                                                        }
1266                                                        ixj_ring_on(j);
1267                                                        if (j->cadence_f[5].on2) {
1268                                                                j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
1269                                                                j->cadence_f[5].state = 3;
1270                                                        } else {
1271                                                                j->cadence_f[5].state = 7;
1272                                                        }
1273                                                }
1274                                                break;
1275                                        case 3:
1276                                                if (time_after(jiffies, j->cadence_f[5].on2dot)) {
1277                                                        if(ixjdebug & 0x0004) {
1278                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1279                                                        }
1280                                                        ixj_ring_off(j);
1281                                                        if (j->cadence_f[5].off2) {
1282                                                                j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
1283                                                                j->cadence_f[5].state = 4;
1284                                                        } else {
1285                                                                j->cadence_f[5].state = 7;
1286                                                        }
1287                                                }
1288                                                break;
1289                                        case 4:
1290                                                if (time_after(jiffies, j->cadence_f[5].off2dot)) {
1291                                                        if(ixjdebug & 0x0004) {
1292                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1293                                                        }
1294                                                        ixj_ring_on(j);
1295                                                        if (j->cadence_f[5].on3) {
1296                                                                j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
1297                                                                j->cadence_f[5].state = 5;
1298                                                        } else {
1299                                                                j->cadence_f[5].state = 7;
1300                                                        }
1301                                                }
1302                                                break;
1303                                        case 5:
1304                                                if (time_after(jiffies, j->cadence_f[5].on3dot)) {
1305                                                        if(ixjdebug & 0x0004) {
1306                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1307                                                        }
1308                                                        ixj_ring_off(j);
1309                                                        if (j->cadence_f[5].off3) {
1310                                                                j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
1311                                                                j->cadence_f[5].state = 6;
1312                                                        } else {
1313                                                                j->cadence_f[5].state = 7;
1314                                                        }
1315                                                }
1316                                                break;
1317                                        case 6:
1318                                                if (time_after(jiffies, j->cadence_f[5].off3dot)) {
1319                                                        if(ixjdebug & 0x0004) {
1320                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1321                                                        }
1322                                                        j->cadence_f[5].state = 7;
1323                                                }
1324                                                break;
1325                                        case 7:
1326                                                if(ixjdebug & 0x0004) {
1327                                                        printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1328                                                }
1329                                                j->flags.cidring = 1;
1330                                                j->cadence_f[5].state = 0;
1331                                                break;
1332                                }
1333                                if (j->flags.cidring && !j->flags.cidsent) {
1334                                        j->flags.cidsent = 1;
1335                                        if(j->fskdcnt) {
1336                                                SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1337                                                ixj_pre_cid(j);
1338                                        }
1339                                        j->flags.cidring = 0;
1340                                }
1341                                clear_bit(board, &j->busyflags);
1342                                ixj_add_timer(j);
1343                                return;
1344                        } else {
1345                                if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
1346                                        if (j->flags.cidring && !j->flags.cidsent) {
1347                                                j->flags.cidsent = 1;
1348                                                if(j->fskdcnt) {
1349                                                        SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1350                                                        ixj_pre_cid(j);
1351                                                }
1352                                                j->flags.cidring = 0;
1353                                        }
1354                                        j->ring_cadence_t--;
1355                                        if (j->ring_cadence_t == -1)
1356                                                j->ring_cadence_t = 15;
1357                                        j->ring_cadence_jif = jiffies;
1358
1359                                        if (j->ring_cadence & 1 << j->ring_cadence_t) {
1360                                                if(j->flags.cidsent && j->cadence_f[5].en_filter)
1361                                                        j->flags.firstring = 1;
1362                                                else
1363                                                        ixj_ring_on(j);
1364                                        } else {
1365                                                ixj_ring_off(j);
1366                                                if(!j->flags.cidsent)
1367                                                        j->flags.cidring = 1;
1368                                        }
1369                                }
1370                                clear_bit(board, &j->busyflags);
1371                                ixj_add_timer(j);
1372                                return;
1373                        }
1374                }
1375                if (!j->flags.ringing) {
1376                        if (j->hookstate) { /* & 1) { */
1377                                if (j->dsp.low != 0x20 &&
1378                                    SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
1379                                        SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1380                                }
1381                                LineMonitor(j);
1382                                read_filters(j);
1383                                ixj_WriteDSPCommand(0x511B, j);
1384                                j->proc_load = j->ssr.high << 8 | j->ssr.low;
1385                                if (!j->m_hook && (j->hookstate & 1)) {
1386                                        j->m_hook = j->ex.bits.hookstate = 1;
1387                                        ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1388                                }
1389                        } else {
1390                                if (j->ex.bits.dtmf_ready) {
1391                                        j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
1392                                }
1393                                if (j->m_hook) {
1394                                        j->m_hook = 0;
1395                                        j->ex.bits.hookstate = 1;
1396                                        ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1397                                }
1398                        }
1399                }
1400                if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
1401                        ixj_pstn_state(j);
1402                }
1403                if (j->ex.bytes) {
1404                        wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
1405                }
1406                clear_bit(board, &j->busyflags);
1407        }
1408        ixj_add_timer(j);
1409}
1410
1411static int ixj_status_wait(IXJ *j)
1412{
1413        unsigned long jif;
1414
1415        jif = jiffies + ((60 * hertz) / 100);
1416        while (!IsStatusReady(j)) {
1417                ixj_perfmon(j->statuswait);
1418                if (time_after(jiffies, jif)) {
1419                        ixj_perfmon(j->statuswaitfail);
1420                        return -1;
1421                }
1422        }
1423        return 0;
1424}
1425
1426static int ixj_PCcontrol_wait(IXJ *j)
1427{
1428        unsigned long jif;
1429
1430        jif = jiffies + ((60 * hertz) / 100);
1431        while (!IsPCControlReady(j)) {
1432                ixj_perfmon(j->pcontrolwait);
1433                if (time_after(jiffies, jif)) {
1434                        ixj_perfmon(j->pcontrolwaitfail);
1435                        return -1;
1436                }
1437        }
1438        return 0;
1439}
1440
1441static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
1442{
1443        BYTES bytes;
1444        unsigned long jif;
1445
1446        atomic_inc(&j->DSPWrite);
1447        if(atomic_read(&j->DSPWrite) > 1) {
1448                printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
1449                return -1;
1450        }
1451        bytes.high = (cmd & 0xFF00) >> 8;
1452        bytes.low = cmd & 0x00FF;
1453        jif = jiffies + ((60 * hertz) / 100);
1454        while (!IsControlReady(j)) {
1455                ixj_perfmon(j->iscontrolready);
1456                if (time_after(jiffies, jif)) {
1457                        ixj_perfmon(j->iscontrolreadyfail);
1458                        atomic_dec(&j->DSPWrite);
1459                        if(atomic_read(&j->DSPWrite) > 0) {
1460                                printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
1461                                while(atomic_read(&j->DSPWrite) > 0) {
1462                                        atomic_dec(&j->DSPWrite);
1463                                }
1464                        }
1465                        return -1;
1466                }
1467        }
1468        outb(bytes.low, j->DSPbase + 6);
1469        outb(bytes.high, j->DSPbase + 7);
1470
1471        if (ixj_status_wait(j)) {
1472                j->ssr.low = 0xFF;
1473                j->ssr.high = 0xFF;
1474                atomic_dec(&j->DSPWrite);
1475                if(atomic_read(&j->DSPWrite) > 0) {
1476                        printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
1477                        while(atomic_read(&j->DSPWrite) > 0) {
1478                                atomic_dec(&j->DSPWrite);
1479                        }
1480                }
1481                return -1;
1482        }
1483/* Read Software Status Register */
1484        j->ssr.low = inb_p(j->DSPbase + 2);
1485        j->ssr.high = inb_p(j->DSPbase + 3);
1486        atomic_dec(&j->DSPWrite);
1487        if(atomic_read(&j->DSPWrite) > 0) {
1488                printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
1489                while(atomic_read(&j->DSPWrite) > 0) {
1490                        atomic_dec(&j->DSPWrite);
1491                }
1492        }
1493        return 0;
1494}
1495
1496/***************************************************************************
1497*
1498*  General Purpose IO Register read routine
1499*
1500***************************************************************************/
1501static inline int ixj_gpio_read(IXJ *j)
1502{
1503        if (ixj_WriteDSPCommand(0x5143, j))
1504                return -1;
1505
1506        j->gpio.bytes.low = j->ssr.low;
1507        j->gpio.bytes.high = j->ssr.high;
1508
1509        return 0;
1510}
1511
1512static inline void LED_SetState(int state, IXJ *j)
1513{
1514        if (j->cardtype == QTI_LINEJACK) {
1515                j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
1516                j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
1517                j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
1518                j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
1519
1520                outb(j->pld_scrw.byte, j->XILINXbase);
1521        }
1522}
1523
1524/*********************************************************************
1525*  GPIO Pins are configured as follows on the Quicknet Internet
1526*  PhoneJACK Telephony Cards
1527* 
1528* POTS Select        GPIO_6=0 GPIO_7=0
1529* Mic/Speaker Select GPIO_6=0 GPIO_7=1
1530* Handset Select     GPIO_6=1 GPIO_7=0
1531*
1532* SLIC Active        GPIO_1=0 GPIO_2=1 GPIO_5=0
1533* SLIC Ringing       GPIO_1=1 GPIO_2=1 GPIO_5=0
1534* SLIC Open Circuit  GPIO_1=0 GPIO_2=0 GPIO_5=0
1535*
1536* Hook Switch changes reported on GPIO_3
1537*********************************************************************/
1538static int ixj_set_port(IXJ *j, int arg)
1539{
1540        if (j->cardtype == QTI_PHONEJACK_LITE) {
1541                if (arg != PORT_POTS)
1542                        return 10;
1543                else
1544                        return 0;
1545        }
1546        switch (arg) {
1547        case PORT_POTS:
1548                j->port = PORT_POTS;
1549                switch (j->cardtype) {
1550                case QTI_PHONECARD:
1551                        if (j->flags.pcmciasct == 1)
1552                                SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1553                        else
1554                                return 11;
1555                        break;
1556                case QTI_PHONEJACK_PCI:
1557                        j->pld_slicw.pcib.mic = 0;
1558                        j->pld_slicw.pcib.spk = 0;
1559                        outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1560                        break;
1561                case QTI_LINEJACK:
1562                        ixj_set_pots(j, 0);                     /* Disconnect POTS/PSTN relay */
1563                        if (ixj_WriteDSPCommand(0xC528, j))             /* Write CODEC config to
1564                                                                           Software Control Register */
1565                                return 2;
1566                        j->pld_scrw.bits.daafsyncen = 0;        /* Turn off DAA Frame Sync */
1567
1568                        outb(j->pld_scrw.byte, j->XILINXbase);
1569                        j->pld_clock.byte = 0;
1570                        outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1571                        j->pld_slicw.bits.rly1 = 1;
1572                        j->pld_slicw.bits.spken = 0;
1573                        outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1574                        ixj_mixer(0x1200, j);   /* Turn Off MIC switch on mixer left */
1575                        ixj_mixer(0x1401, j);   /* Turn On Mono1 switch on mixer left */
1576                        ixj_mixer(0x1300, j);       /* Turn Off MIC switch on mixer right */
1577                        ixj_mixer(0x1501, j);       /* Turn On Mono1 switch on mixer right */
1578                        ixj_mixer(0x0E80, j);   /*Mic mute */
1579                        ixj_mixer(0x0F00, j);   /* Set mono out (SLIC) to 0dB */
1580                        ixj_mixer(0x0080, j);   /* Mute Master Left volume */
1581                        ixj_mixer(0x0180, j);   /* Mute Master Right volume */
1582                        SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
1583/*                      SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1584                        break;
1585                case QTI_PHONEJACK:
1586                        j->gpio.bytes.high = 0x0B;
1587                        j->gpio.bits.gpio6 = 0;
1588                        j->gpio.bits.gpio7 = 0;
1589                        ixj_WriteDSPCommand(j->gpio.word, j);
1590                        break;
1591                }
1592                break;
1593        case PORT_PSTN:
1594                if (j->cardtype == QTI_LINEJACK) {
1595                        ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */
1596
1597                        j->pld_slicw.bits.rly3 = 0;
1598                        j->pld_slicw.bits.rly1 = 1;
1599                        j->pld_slicw.bits.spken = 0;
1600                        outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1601                        j->port = PORT_PSTN;
1602                } else {
1603                        return 4;
1604                }
1605                break;
1606        case PORT_SPEAKER:
1607                j->port = PORT_SPEAKER;
1608                switch (j->cardtype) {
1609                case QTI_PHONECARD:
1610                        if (j->flags.pcmciasct) {
1611                                SLIC_SetState(PLD_SLIC_STATE_OC, j);
1612                        }
1613                        break;
1614                case QTI_PHONEJACK_PCI:
1615                        j->pld_slicw.pcib.mic = 1;
1616                        j->pld_slicw.pcib.spk = 1;
1617                        outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1618                        break;
1619                case QTI_LINEJACK:
1620                        ixj_set_pots(j, 0);                     /* Disconnect POTS/PSTN relay */
1621                        if (ixj_WriteDSPCommand(0xC528, j))             /* Write CODEC config to
1622                                                                           Software Control Register */
1623                                return 2;
1624                        j->pld_scrw.bits.daafsyncen = 0;        /* Turn off DAA Frame Sync */
1625
1626                        outb(j->pld_scrw.byte, j->XILINXbase);
1627                        j->pld_clock.byte = 0;
1628                        outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1629                        j->pld_slicw.bits.rly1 = 1;
1630                        j->pld_slicw.bits.spken = 1;
1631                        outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1632                        ixj_mixer(0x1201, j);   /* Turn On MIC switch on mixer left */
1633                        ixj_mixer(0x1400, j);   /* Turn Off Mono1 switch on mixer left */
1634                        ixj_mixer(0x1301, j);       /* Turn On MIC switch on mixer right */
1635                        ixj_mixer(0x1500, j);       /* Turn Off Mono1 switch on mixer right */
1636                        ixj_mixer(0x0E06, j);   /*Mic un-mute 0dB */
1637                        ixj_mixer(0x0F80, j);   /* Mute mono out (SLIC) */
1638                        ixj_mixer(0x0000, j);   /* Set Master Left volume to 0dB */
1639                        ixj_mixer(0x0100, j);   /* Set Master Right volume to 0dB */
1640                        break;
1641                case QTI_PHONEJACK:
1642                        j->gpio.bytes.high = 0x0B;
1643                        j->gpio.bits.gpio6 = 0;
1644                        j->gpio.bits.gpio7 = 1;
1645                        ixj_WriteDSPCommand(j->gpio.word, j);
1646                        break;
1647                }
1648                break;
1649        case PORT_HANDSET:
1650                if (j->cardtype != QTI_PHONEJACK) {
1651                        return 5;
1652                } else {
1653                        j->gpio.bytes.high = 0x0B;
1654                        j->gpio.bits.gpio6 = 1;
1655                        j->gpio.bits.gpio7 = 0;
1656                        ixj_WriteDSPCommand(j->gpio.word, j);
1657                        j->port = PORT_HANDSET;
1658                }
1659                break;
1660        default:
1661                return 6;
1662                break;
1663        }
1664        return 0;
1665}
1666
1667static int ixj_set_pots(IXJ *j, int arg)
1668{
1669        if (j->cardtype == QTI_LINEJACK) {
1670                if (arg) {
1671                        if (j->port == PORT_PSTN) {
1672                                j->pld_slicw.bits.rly1 = 0;
1673                                outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1674                                j->flags.pots_pstn = 1;
1675                                return 1;
1676                        } else {
1677                                j->flags.pots_pstn = 0;
1678                                return 0;
1679                        }
1680                } else {
1681                        j->pld_slicw.bits.rly1 = 1;
1682                        outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1683                        j->flags.pots_pstn = 0;
1684                        return 1;
1685                }
1686        } else {
1687                return 0;
1688        }
1689}
1690
1691static void ixj_ring_on(IXJ *j)
1692{
1693        if (j->dsp.low == 0x20) /* Internet PhoneJACK */
1694         {
1695                if (ixjdebug & 0x0004)
1696                        printk(KERN_INFO "IXJ Ring On /dev/phone%d\n",  j->board);
1697
1698                j->gpio.bytes.high = 0x0B;
1699                j->gpio.bytes.low = 0x00;
1700                j->gpio.bits.gpio1 = 1;
1701                j->gpio.bits.gpio2 = 1;
1702                j->gpio.bits.gpio5 = 0;
1703                ixj_WriteDSPCommand(j->gpio.word, j);   /* send the ring signal */
1704        } else                  /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1705        {
1706                if (ixjdebug & 0x0004)
1707                        printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1708
1709                SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
1710        }
1711}
1712
1713static int ixj_siadc(IXJ *j, int val)
1714{
1715        if(j->cardtype == QTI_PHONECARD){
1716                if(j->flags.pcmciascp){
1717                        if(val == -1)
1718                                return j->siadc.bits.rxg;
1719
1720                        if(val < 0 || val > 0x1F)
1721                                return -1;
1722
1723                        j->siadc.bits.hom = 0;                          /* Handset Out Mute */
1724                        j->siadc.bits.lom = 0;                          /* Line Out Mute */
1725                        j->siadc.bits.rxg = val;                        /*(0xC000 - 0x41C8) / 0x4EF;    RX PGA Gain */
1726                        j->psccr.bits.addr = 6;                         /* R/W Smart Cable Register Address */
1727                        j->psccr.bits.rw = 0;                           /* Read / Write flag */
1728                        j->psccr.bits.dev = 0;
1729                        outb(j->siadc.byte, j->XILINXbase + 0x00);
1730                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1731                        ixj_PCcontrol_wait(j);
1732                        return j->siadc.bits.rxg;
1733                }
1734        }
1735        return -1;
1736}
1737
1738static int ixj_sidac(IXJ *j, int val)
1739{
1740        if(j->cardtype == QTI_PHONECARD){
1741                if(j->flags.pcmciascp){
1742                        if(val == -1)
1743                                return j->sidac.bits.txg;
1744
1745                        if(val < 0 || val > 0x1F)
1746                                return -1;
1747
1748                        j->sidac.bits.srm = 1;                          /* Speaker Right Mute */
1749                        j->sidac.bits.slm = 1;                          /* Speaker Left Mute */
1750                        j->sidac.bits.txg = val;                        /* (0xC000 - 0x45E4) / 0x5D3;    TX PGA Gain */
1751                        j->psccr.bits.addr = 7;                         /* R/W Smart Cable Register Address */
1752                        j->psccr.bits.rw = 0;                           /* Read / Write flag */
1753                        j->psccr.bits.dev = 0;
1754                        outb(j->sidac.byte, j->XILINXbase + 0x00);
1755                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1756                        ixj_PCcontrol_wait(j);
1757                        return j->sidac.bits.txg;
1758                }
1759        }
1760        return -1;
1761}
1762
1763static int ixj_pcmcia_cable_check(IXJ *j)
1764{
1765        j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
1766        if (!j->flags.pcmciastate) {
1767                j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
1768                if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
1769                        j->flags.pcmciastate = 4;
1770                        return 0;
1771                }
1772                if (j->pccr1.bits.ed) {
1773                        j->pccr1.bits.ed = 0;
1774                        j->psccr.bits.dev = 3;
1775                        j->psccr.bits.rw = 1;
1776                        outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
1777                        ixj_PCcontrol_wait(j);
1778                        j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
1779                        j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
1780                        j->psccr.bits.dev = 3;
1781                        j->psccr.bits.rw = 0;
1782                        outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1783                        ixj_PCcontrol_wait(j);
1784                        return j->pslic.bits.led2 ? 1 : 0;
1785                } else if (j->flags.pcmciasct) {
1786                        return j->r_hook;
1787                } else {
1788                        return 1;
1789                }
1790        } else if (j->flags.pcmciastate == 4) {
1791                if (!j->pccr1.bits.drf) {
1792                        j->flags.pcmciastate = 3;
1793                }
1794                return 0;
1795        } else if (j->flags.pcmciastate == 3) {
1796                j->pccr2.bits.pwr = 0;
1797                j->pccr2.bits.rstc = 1;
1798                outb(j->pccr2.byte, j->XILINXbase + 0x02);
1799                j->checkwait = jiffies + (hertz * 2);
1800                j->flags.incheck = 1;
1801                j->flags.pcmciastate = 2;
1802                return 0;
1803        } else if (j->flags.pcmciastate == 2) {
1804                if (j->flags.incheck) {
1805                        if (time_before(jiffies, j->checkwait)) {
1806                                return 0;
1807                        } else {
1808                                j->flags.incheck = 0;
1809                        }
1810                }
1811                j->pccr2.bits.pwr = 0;
1812                j->pccr2.bits.rstc = 0;
1813                outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1814                j->flags.pcmciastate = 1;
1815                return 0;
1816        } else if (j->flags.pcmciastate == 1) {
1817                j->flags.pcmciastate = 0;
1818                if (!j->pccr1.bits.drf) {
1819                        j->psccr.bits.dev = 3;
1820                        j->psccr.bits.rw = 1;
1821                        outb_p(j->psccr.byte, j->XILINXbase + 0x01);
1822                        ixj_PCcontrol_wait(j);
1823                        j->flags.pcmciascp = 1;         /* Set Cable Present Flag */
1824
1825                        j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03;         /* Get Cable Type */
1826
1827                        if (j->flags.pcmciasct == 3) {
1828                                j->flags.pcmciastate = 4;
1829                                return 0;
1830                        } else if (j->flags.pcmciasct == 0) {
1831                                j->pccr2.bits.pwr = 1;
1832                                j->pccr2.bits.rstc = 0;
1833                                outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1834                                j->port = PORT_SPEAKER;
1835                        } else {
1836                                j->port = PORT_POTS;
1837                        }
1838                        j->sic1.bits.cpd = 0;                           /* Chip Power Down */
1839                        j->sic1.bits.mpd = 0;                           /* MIC Bias Power Down */
1840                        j->sic1.bits.hpd = 0;                           /* Handset Bias Power Down */
1841                        j->sic1.bits.lpd = 0;                           /* Line Bias Power Down */
1842                        j->sic1.bits.spd = 1;                           /* Speaker Drive Power Down */
1843                        j->psccr.bits.addr = 1;                         /* R/W Smart Cable Register Address */
1844                        j->psccr.bits.rw = 0;                           /* Read / Write flag */
1845                        j->psccr.bits.dev = 0;
1846                        outb(j->sic1.byte, j->XILINXbase + 0x00);
1847                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1848                        ixj_PCcontrol_wait(j);
1849
1850                        j->sic2.bits.al = 0;                            /* Analog Loopback DAC analog -> ADC analog */
1851                        j->sic2.bits.dl2 = 0;                           /* Digital Loopback DAC -> ADC one bit */
1852                        j->sic2.bits.dl1 = 0;                           /* Digital Loopback ADC -> DAC one bit */
1853                        j->sic2.bits.pll = 0;                           /* 1 = div 10, 0 = div 5 */
1854                        j->sic2.bits.hpd = 0;                           /* HPF disable */
1855                        j->psccr.bits.addr = 2;                         /* R/W Smart Cable Register Address */
1856                        j->psccr.bits.rw = 0;                           /* Read / Write flag */
1857                        j->psccr.bits.dev = 0;
1858                        outb(j->sic2.byte, j->XILINXbase + 0x00);
1859                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1860                        ixj_PCcontrol_wait(j);
1861
1862                        j->psccr.bits.addr = 3;                         /* R/W Smart Cable Register Address */
1863                        j->psccr.bits.rw = 0;                           /* Read / Write flag */
1864                        j->psccr.bits.dev = 0;
1865                        outb(0x00, j->XILINXbase + 0x00);               /* PLL Divide N1 */
1866                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1867                        ixj_PCcontrol_wait(j);
1868
1869                        j->psccr.bits.addr = 4;                         /* R/W Smart Cable Register Address */
1870                        j->psccr.bits.rw = 0;                           /* Read / Write flag */
1871                        j->psccr.bits.dev = 0;
1872                        outb(0x09, j->XILINXbase + 0x00);               /* PLL Multiply M1 */
1873                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1874                        ixj_PCcontrol_wait(j);
1875
1876                        j->sirxg.bits.lig = 1;                          /* Line In Gain */
1877                        j->sirxg.bits.lim = 1;                          /* Line In Mute */
1878                        j->sirxg.bits.mcg = 0;                          /* MIC In Gain was 3 */
1879                        j->sirxg.bits.mcm = 0;                          /* MIC In Mute */
1880                        j->sirxg.bits.him = 0;                          /* Handset In Mute */
1881                        j->sirxg.bits.iir = 1;                          /* IIR */
1882                        j->psccr.bits.addr = 5;                         /* R/W Smart Cable Register Address */
1883                        j->psccr.bits.rw = 0;                           /* Read / Write flag */
1884                        j->psccr.bits.dev = 0;
1885                        outb(j->sirxg.byte, j->XILINXbase + 0x00);
1886                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1887                        ixj_PCcontrol_wait(j);
1888
1889                        ixj_siadc(j, 0x17);
1890                        ixj_sidac(j, 0x1D);
1891
1892                        j->siaatt.bits.sot = 0;
1893                        j->psccr.bits.addr = 9;                         /* R/W Smart Cable Register Address */
1894                        j->psccr.bits.rw = 0;                           /* Read / Write flag */
1895                        j->psccr.bits.dev = 0;
1896                        outb(j->siaatt.byte, j->XILINXbase + 0x00);
1897                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1898                        ixj_PCcontrol_wait(j);
1899
1900                        if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
1901                                j->psccr.byte = j->pslic.byte = 0;
1902                                j->pslic.bits.powerdown = 1;
1903                                j->psccr.bits.dev = 3;
1904                                j->psccr.bits.rw = 0;
1905                                outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1906                                ixj_PCcontrol_wait(j);
1907                        }
1908                }
1909                return 0;
1910        } else {
1911                j->flags.pcmciascp = 0;
1912                return 0;
1913        }
1914        return 0;
1915}
1916
1917static int ixj_hookstate(IXJ *j)
1918{
1919        int fOffHook = 0;
1920
1921        switch (j->cardtype) {
1922        case QTI_PHONEJACK:
1923                ixj_gpio_read(j);
1924                fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
1925                break;
1926        case QTI_LINEJACK:
1927        case QTI_PHONEJACK_LITE:
1928        case QTI_PHONEJACK_PCI:
1929                SLIC_GetState(j);
1930                if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
1931                        fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
1932                        if(fOffHook != j->p_hook) {
1933                                if(!j->checkwait) {
1934                                        j->checkwait = jiffies;
1935                                } 
1936                                if(time_before(jiffies, j->checkwait + 2)) {
1937                                        fOffHook ^= 1;
1938                                } else {
1939                                        j->checkwait = 0;
1940                                }
1941                                j->p_hook = fOffHook;
1942                                printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
1943                        }
1944                } else {
1945                        if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
1946                            j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
1947                                if (j->flags.ringing || j->flags.cringing) {
1948                                        if (!in_interrupt()) {
1949                                                msleep(20);
1950                                        }
1951                                        SLIC_GetState(j);
1952                                        if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
1953                                                ixj_ring_on(j);
1954                                        }
1955                                }
1956                                if (j->cardtype == QTI_PHONEJACK_PCI) {
1957                                        j->pld_scrr.byte = inb_p(j->XILINXbase);
1958                                        fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
1959                                } else
1960                                        fOffHook = j->pld_slicr.bits.det ? 1 : 0;
1961                        }
1962                }
1963                break;
1964        case QTI_PHONECARD:
1965                fOffHook = ixj_pcmcia_cable_check(j);
1966                break;
1967        }
1968        if (j->r_hook != fOffHook) {
1969                j->r_hook = fOffHook;
1970                if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
1971                        j->ex.bits.hookstate = 1;
1972                        ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1973                } else if (!fOffHook) {
1974                        j->flash_end = jiffies + ((60 * hertz) / 100);
1975                }
1976        }
1977        if (fOffHook) {
1978                if(time_before(jiffies, j->flash_end)) {
1979                        j->ex.bits.flash = 1;
1980                        j->flash_end = 0;
1981                        ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
1982                }
1983        } else {
1984                if(time_before(jiffies, j->flash_end)) {
1985                        fOffHook = 1;
1986                }
1987        }
1988
1989        if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
1990                fOffHook |= 2;
1991
1992        if (j->port == PORT_SPEAKER) {
1993                if(j->cardtype == QTI_PHONECARD) {
1994                        if(j->flags.pcmciascp && j->flags.pcmciasct) {
1995                                fOffHook |= 2;
1996                        }
1997                } else {
1998                        fOffHook |= 2;
1999                }
2000        }
2001
2002        if (j->port == PORT_HANDSET)
2003                fOffHook |= 2;
2004
2005        return fOffHook;
2006}
2007
2008static void ixj_ring_off(IXJ *j)
2009{
2010        if (j->dsp.low == 0x20) /* Internet PhoneJACK */
2011         {
2012                if (ixjdebug & 0x0004)
2013                        printk(KERN_INFO "IXJ Ring Off\n");
2014                j->gpio.bytes.high = 0x0B;
2015                j->gpio.bytes.low = 0x00;
2016                j->gpio.bits.gpio1 = 0;
2017                j->gpio.bits.gpio2 = 1;
2018                j->gpio.bits.gpio5 = 0;
2019                ixj_WriteDSPCommand(j->gpio.word, j);
2020        } else                  /* Internet LineJACK */
2021        {
2022                if (ixjdebug & 0x0004)
2023                        printk(KERN_INFO "IXJ Ring Off\n");
2024
2025                if(!j->flags.cidplay)
2026                        SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
2027
2028                SLIC_GetState(j);
2029        }
2030}
2031
2032static void ixj_ring_start(IXJ *j)
2033{
2034        j->flags.cringing = 1;
2035        if (ixjdebug & 0x0004)
2036                printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
2037        if (ixj_hookstate(j) & 1) {
2038                if (j->port == PORT_POTS)
2039                        ixj_ring_off(j);
2040                j->flags.cringing = 0;
2041                if (ixjdebug & 0x0004)
2042                        printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
2043        } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
2044                j->ring_cadence_jif = jiffies;
2045                j->flags.cidsent = j->flags.cidring = 0;
2046                j->cadence_f[5].state = 0;
2047                if(j->cadence_f[5].on1)
2048                        ixj_ring_on(j);
2049        } else {
2050                j->ring_cadence_jif = jiffies;
2051                j->ring_cadence_t = 15;
2052                if (j->ring_cadence & 1 << j->ring_cadence_t) {
2053                        ixj_ring_on(j);
2054                } else {
2055                        ixj_ring_off(j);
2056                }
2057                j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
2058        }
2059}
2060
2061static int ixj_ring(IXJ *j)
2062{
2063        char cntr;
2064        unsigned long jif;
2065
2066        j->flags.ringing = 1;
2067        if (ixj_hookstate(j) & 1) {
2068                ixj_ring_off(j);
2069                j->flags.ringing = 0;
2070                return 1;
2071        }
2072        for (cntr = 0; cntr < j->maxrings; cntr++) {
2073                jif = jiffies + (1 * hertz);
2074                ixj_ring_on(j);
2075                while (time_before(jiffies, jif)) {
2076                        if (ixj_hookstate(j) & 1) {
2077                                ixj_ring_off(j);
2078                                j->flags.ringing = 0;
2079                                return 1;
2080                        }
2081                        schedule_timeout_interruptible(1);
2082                        if (signal_pending(current))
2083                                break;
2084                }
2085                jif = jiffies + (3 * hertz);
2086                ixj_ring_off(j);
2087                while (time_before(jiffies, jif)) {
2088                        if (ixj_hookstate(j) & 1) {
2089                                msleep(10);
2090                                if (ixj_hookstate(j) & 1) {
2091                                        j->flags.ringing = 0;
2092                                        return 1;
2093                                }
2094                        }
2095                        schedule_timeout_interruptible(1);
2096                        if (signal_pending(current))
2097                                break;
2098                }
2099        }
2100        ixj_ring_off(j);
2101        j->flags.ringing = 0;
2102        return 0;
2103}
2104
2105static int ixj_open(struct phone_device *p, struct file *file_p)
2106{
2107        IXJ *j = get_ixj(p->board);
2108        file_p->private_data = j;
2109
2110        if (!j->DSPbase)
2111                return -ENODEV;
2112
2113        if (file_p->f_mode & FMODE_READ) {
2114                if(!j->readers) {
2115                        j->readers++;
2116                } else {
2117                        return -EBUSY;
2118                }
2119        }
2120
2121        if (file_p->f_mode & FMODE_WRITE) {
2122                if(!j->writers) {
2123                        j->writers++;
2124                } else {
2125                        if (file_p->f_mode & FMODE_READ){
2126                                j->readers--;
2127                        }
2128                        return -EBUSY;
2129                }
2130        }
2131
2132        if (j->cardtype == QTI_PHONECARD) {
2133                j->pslic.bits.powerdown = 0;
2134                j->psccr.bits.dev = 3;
2135                j->psccr.bits.rw = 0;
2136                outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2137                ixj_PCcontrol_wait(j);
2138        }
2139
2140        j->flags.cidplay = 0;
2141        j->flags.cidcw_ack = 0;
2142
2143        if (ixjdebug & 0x0002)
2144                printk(KERN_INFO "Opening board %d\n", p->board);
2145
2146        j->framesread = j->frameswritten = 0;
2147        return 0;
2148}
2149
2150static int ixj_release(struct inode *inode, struct file *file_p)
2151{
2152        IXJ_TONE ti;
2153        int cnt;
2154        IXJ *j = file_p->private_data;
2155        int board = j->p.board;
2156
2157        /*
2158         *    Set up locks to ensure that only one process is talking to the DSP at a time.
2159         *    This is necessary to keep the DSP from locking up.
2160         */
2161        while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
2162                schedule_timeout_interruptible(1);
2163        if (ixjdebug & 0x0002)
2164                printk(KERN_INFO "Closing board %d\n", NUM(inode));
2165
2166        if (j->cardtype == QTI_PHONECARD)
2167                ixj_set_port(j, PORT_SPEAKER);
2168        else
2169                ixj_set_port(j, PORT_POTS);
2170
2171        aec_stop(j);
2172        ixj_play_stop(j);
2173        ixj_record_stop(j);
2174        set_play_volume(j, 0x100);
2175        set_rec_volume(j, 0x100);
2176        ixj_ring_off(j);
2177
2178        /* Restore the tone table to default settings. */
2179        ti.tone_index = 10;
2180        ti.gain0 = 1;
2181        ti.freq0 = hz941;
2182        ti.gain1 = 0;
2183        ti.freq1 = hz1209;
2184        ixj_init_tone(j, &ti);
2185        ti.tone_index = 11;
2186        ti.gain0 = 1;
2187        ti.freq0 = hz941;
2188        ti.gain1 = 0;
2189        ti.freq1 = hz1336;
2190        ixj_init_tone(j, &ti);
2191        ti.tone_index = 12;
2192        ti.gain0 = 1;
2193        ti.freq0 = hz941;
2194        ti.gain1 = 0;
2195        ti.freq1 = hz1477;
2196        ixj_init_tone(j, &ti);
2197        ti.tone_index = 13;
2198        ti.gain0 = 1;
2199        ti.freq0 = hz800;
2200        ti.gain1 = 0;
2201        ti.freq1 = 0;
2202        ixj_init_tone(j, &ti);
2203        ti.tone_index = 14;
2204        ti.gain0 = 1;
2205        ti.freq0 = hz1000;
2206        ti.gain1 = 0;
2207        ti.freq1 = 0;
2208        ixj_init_tone(j, &ti);
2209        ti.tone_index = 15;
2210        ti.gain0 = 1;
2211        ti.freq0 = hz1250;
2212        ti.gain1 = 0;
2213        ti.freq1 = 0;
2214        ixj_init_tone(j, &ti);
2215        ti.tone_index = 16;
2216        ti.gain0 = 1;
2217        ti.freq0 = hz950;
2218        ti.gain1 = 0;
2219        ti.freq1 = 0;
2220        ixj_init_tone(j, &ti);
2221        ti.tone_index = 17;
2222        ti.gain0 = 1;
2223        ti.freq0 = hz1100;
2224        ti.gain1 = 0;
2225        ti.freq1 = 0;
2226        ixj_init_tone(j, &ti);
2227        ti.tone_index = 18;
2228        ti.gain0 = 1;
2229        ti.freq0 = hz1400;
2230        ti.gain1 = 0;
2231        ti.freq1 = 0;
2232        ixj_init_tone(j, &ti);
2233        ti.tone_index = 19;
2234        ti.gain0 = 1;
2235        ti.freq0 = hz1500;
2236        ti.gain1 = 0;
2237        ti.freq1 = 0;
2238        ixj_init_tone(j, &ti);
2239        ti.tone_index = 20;
2240        ti.gain0 = 1;
2241        ti.freq0 = hz1600;
2242        ti.gain1 = 0;
2243        ti.freq1 = 0;
2244        ixj_init_tone(j, &ti);
2245        ti.tone_index = 21;
2246        ti.gain0 = 1;
2247        ti.freq0 = hz1800;
2248        ti.gain1 = 0;
2249        ti.freq1 = 0;
2250        ixj_init_tone(j, &ti);
2251        ti.tone_index = 22;
2252        ti.gain0 = 1;
2253        ti.freq0 = hz2100;
2254        ti.gain1 = 0;
2255        ti.freq1 = 0;
2256        ixj_init_tone(j, &ti);
2257        ti.tone_index = 23;
2258        ti.gain0 = 1;
2259        ti.freq0 = hz1300;
2260        ti.gain1 = 0;
2261        ti.freq1 = 0;
2262        ixj_init_tone(j, &ti);
2263        ti.tone_index = 24;
2264        ti.gain0 = 1;
2265        ti.freq0 = hz2450;
2266        ti.gain1 = 0;
2267        ti.freq1 = 0;
2268        ixj_init_tone(j, &ti);
2269        ti.tone_index = 25;
2270        ti.gain0 = 1;
2271        ti.freq0 = hz350;
2272        ti.gain1 = 0;
2273        ti.freq1 = hz440;
2274        ixj_init_tone(j, &ti);
2275        ti.tone_index = 26;
2276        ti.gain0 = 1;
2277        ti.freq0 = hz440;
2278        ti.gain1 = 0;
2279        ti.freq1 = hz480;
2280        ixj_init_tone(j, &ti);
2281        ti.tone_index = 27;
2282        ti.gain0 = 1;
2283        ti.freq0 = hz480;
2284        ti.gain1 = 0;
2285        ti.freq1 = hz620;
2286        ixj_init_tone(j, &ti);
2287
2288        set_rec_depth(j, 2);    /* Set Record Channel Limit to 2 frames */
2289
2290        set_play_depth(j, 2);   /* Set Playback Channel Limit to 2 frames */
2291
2292        j->ex.bits.dtmf_ready = 0;
2293        j->dtmf_state = 0;
2294        j->dtmf_wp = j->dtmf_rp = 0;
2295        j->rec_mode = j->play_mode = -1;
2296        j->flags.ringing = 0;
2297        j->maxrings = MAXRINGS;
2298        j->ring_cadence = USA_RING_CADENCE;
2299        if(j->cadence_f[5].enable) {
2300                j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
2301        }
2302        j->drybuffer = 0;
2303        j->winktime = 320;
2304        j->flags.dtmf_oob = 0;
2305        for (cnt = 0; cnt < 4; cnt++)
2306                j->cadence_f[cnt].enable = 0;
2307
2308        idle(j);
2309
2310        if(j->cardtype == QTI_PHONECARD) {
2311                SLIC_SetState(PLD_SLIC_STATE_OC, j);
2312        }
2313
2314        if (file_p->f_mode & FMODE_READ)
2315                j->readers--;
2316        if (file_p->f_mode & FMODE_WRITE)
2317                j->writers--;
2318
2319        if (j->read_buffer && !j->readers) {
2320                kfree(j->read_buffer);
2321                j->read_buffer = NULL;
2322                j->read_buffer_size = 0;
2323        }
2324        if (j->write_buffer && !j->writers) {
2325                kfree(j->write_buffer);
2326                j->write_buffer = NULL;
2327                j->write_buffer_size = 0;
2328        }
2329        j->rec_codec = j->play_codec = 0;
2330        j->rec_frame_size = j->play_frame_size = 0;
2331        j->flags.cidsent = j->flags.cidring = 0;
2332
2333        if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
2334                ixj_set_port(j, PORT_PSTN);
2335                daa_set_mode(j, SOP_PU_SLEEP);
2336                ixj_set_pots(j, 1);
2337        }
2338        ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
2339
2340        /* Set up the default signals for events */
2341        for (cnt = 0; cnt < 35; cnt++)
2342                j->ixj_signals[cnt] = SIGIO;
2343
2344        /* Set the excetion signal enable flags */
2345        j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring = 
2346        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 = 
2347        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;
2348
2349        file_p->private_data = NULL;
2350        clear_bit(board, &j->busyflags);
2351        return 0;
2352}
2353
2354static int read_filters(IXJ *j)
2355{
2356        unsigned short fc, cnt, trg;
2357        int var;
2358
2359        trg = 0;
2360        if (ixj_WriteDSPCommand(0x5144, j)) {
2361                if(ixjdebug & 0x0001) {
2362                        printk(KERN_INFO "Read Frame Counter failed!\n");
2363                }
2364                return -1;
2365        }
2366        fc = j->ssr.high << 8 | j->ssr.low;
2367        if (fc == j->frame_count)
2368                return 1;
2369
2370        j->frame_count = fc;
2371
2372        if (j->dtmf_proc)
2373                return 1;
2374
2375        var = 10;
2376
2377        for (cnt = 0; cnt < 4; cnt++) {
2378                if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
2379                        if(ixjdebug & 0x0001) {
2380                                printk(KERN_INFO "Select Filter %d failed!\n", cnt);
2381                        }
2382                        return -1;
2383                }
2384                if (ixj_WriteDSPCommand(0x515C, j)) {
2385                        if(ixjdebug & 0x0001) {
2386                                printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
2387                        }
2388                        return -1;
2389                }
2390                j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
2391
2392                if (j->cadence_f[cnt].enable) {
2393                        if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
2394                                if (j->cadence_f[cnt].state == 0) {
2395                                        j->cadence_f[cnt].state = 1;
2396                                        j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
2397                                        j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
2398                                        j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
2399                                } else if (j->cadence_f[cnt].state == 2 &&
2400                                           (time_after(jiffies, j->cadence_f[cnt].off1min) &&
2401                                            time_before(jiffies, j->cadence_f[cnt].off1max))) {
2402                                        if (j->cadence_f[cnt].on2) {
2403                                                j->cadence_f[cnt].state = 3;
2404                                                j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
2405                                                j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
2406                                                j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
2407                                        } else {
2408                                                j->cadence_f[cnt].state = 7;
2409                                        }
2410                                } else if (j->cadence_f[cnt].state == 4 &&
2411                                           (time_after(jiffies, j->cadence_f[cnt].off2min) &&
2412                                            time_before(jiffies, j->cadence_f[cnt].off2max))) {
2413                                        if (j->cadence_f[cnt].on3) {
2414                                                j->cadence_f[cnt].state = 5;
2415                                                j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
2416                                                j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
2417                                                j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
2418                                        } else {
2419                                                j->cadence_f[cnt].state = 7;
2420                                        }
2421                                } else {
2422                                        j->cadence_f[cnt].state = 0;
2423                                }
2424                        } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
2425                                if (j->cadence_f[cnt].state == 1) {
2426                                        if(!j->cadence_f[cnt].on1) {
2427                                                j->cadence_f[cnt].state = 7;
2428                                        } else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
2429                                          time_before(jiffies, j->cadence_f[cnt].on1max))) {
2430                                                if(j->cadence_f[cnt].off1) {
2431                                                        j->cadence_f[cnt].state = 2;
2432                                                        j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
2433                                                        j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
2434                                                        j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
2435                                                } else {
2436                                                        j->cadence_f[cnt].state = 7;
2437                                                }
2438                                        } else {
2439                                                j->cadence_f[cnt].state = 0;
2440                                        }
2441                                } else if (j->cadence_f[cnt].state == 3) {
2442                                        if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
2443                                            time_before(jiffies, j->cadence_f[cnt].on2max))) {
2444                                                if(j->cadence_f[cnt].off2) {
2445                                                        j->cadence_f[cnt].state = 4;
2446                                                        j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
2447                                                        j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
2448                                                        j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
2449                                                } else {
2450                                                        j->cadence_f[cnt].state = 7;
2451                                                }
2452                                        } else {
2453                                                j->cadence_f[cnt].state = 0;
2454                                        }
2455                                } else if (j->cadence_f[cnt].state == 5) {
2456                                        if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
2457                                            time_before(jiffies, j->cadence_f[cnt].on3max))) {
2458                                                if(j->cadence_f[cnt].off3) {
2459                                                        j->cadence_f[cnt].state = 6;
2460                                                        j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
2461                                                        j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
2462                                                        j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
2463                                                } else {
2464                                                        j->cadence_f[cnt].state = 7;
2465                                                }
2466                                        } else {
2467                                                j->cadence_f[cnt].state = 0;
2468                                        }
2469                                } else {
2470                                        j->cadence_f[cnt].state = 0;
2471                                }
2472                        } else {
2473                                switch(j->cadence_f[cnt].state) {
2474                                        case 1:
2475                                                if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
2476                                                   !j->cadence_f[cnt].off1 &&
2477                                                   !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
2478                                                   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2479                                                        j->cadence_f[cnt].state = 7;
2480                                                }
2481                                                break;
2482                                        case 3:
2483                                                if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
2484                                                   !j->cadence_f[cnt].off2 &&
2485                                                   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2486                                                        j->cadence_f[cnt].state = 7;
2487                                                }
2488                                                break;
2489                                        case 5:
2490                                                if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
2491                                                   !j->cadence_f[cnt].off3) {
2492                                                        j->cadence_f[cnt].state = 7;
2493                                                }
2494                                                break;
2495                                }
2496                        }
2497
2498                        if (ixjdebug & 0x0040) {
2499                                printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
2500                                switch(j->cadence_f[cnt].state) {
2501                                        case 0:
2502                                                printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
2503                                                break;
2504                                        case 1:
2505                                                printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
2506                                        j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
2507                                                break;
2508                                        case 2:
2509                                                printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min, 
2510                                                                                                                        j->cadence_f[cnt].off1max);
2511                                                break;
2512                                        case 3:
2513                                                printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
2514                                                                                                                        j->cadence_f[cnt].on2max);
2515                                                break;
2516                                        case 4:
2517                                                printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
2518                                                                                                                        j->cadence_f[cnt].off2max);
2519                                                break;
2520                                        case 5:
2521                                                printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
2522                                                                                                                        j->cadence_f[cnt].on3max);
2523                                                break;
2524                                        case 6: 
2525                                                printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
2526                                                                                                                        j->cadence_f[cnt].off3max);
2527                                                break;
2528                                }
2529                        } 
2530                }
2531                if (j->cadence_f[cnt].state == 7) {
2532                        j->cadence_f[cnt].state = 0;
2533                        if (j->cadence_f[cnt].enable == 1)
2534                                j->cadence_f[cnt].enable = 0;
2535                        switch (cnt) {
2536                        case 0:
2537                                if(ixjdebug & 0x0020) {
2538                                        printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
2539                                }
2540                                j->ex.bits.fc0 = 1;
2541                                ixj_kill_fasync(j, SIG_FC0, POLL_IN);
2542                                break;
2543                        case 1:
2544                                if(ixjdebug & 0x0020) {
2545                                        printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
2546                                }
2547                                j->ex.bits.fc1 = 1;
2548                                ixj_kill_fasync(j, SIG_FC1, POLL_IN);
2549                                break;
2550                        case 2:
2551                                if(ixjdebug & 0x0020) {
2552                                        printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
2553                                }
2554                                j->ex.bits.fc2 = 1;
2555                                ixj_kill_fasync(j, SIG_FC2, POLL_IN);
2556                                break;
2557                        case 3:
2558                                if(ixjdebug & 0x0020) {
2559                                        printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
2560                                }
2561                                j->ex.bits.fc3 = 1;
2562                                ixj_kill_fasync(j, SIG_FC3, POLL_IN);
2563                                break;
2564                        }
2565                }
2566                if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
2567                                          (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
2568                        if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
2569                                trg = 1;
2570                        } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
2571                                trg = 0;
2572                        }
2573                        switch (cnt) {
2574                        case 0:
2575                                if(ixjdebug & 0x0020) {
2576                                        printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
2577                                }
2578                                j->ex.bits.f0 = 1;
2579                                ixj_kill_fasync(j, SIG_F0, POLL_IN);
2580                                break;
2581                        case 1:
2582                                if(ixjdebug & 0x0020) {
2583                                        printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
2584                                }
2585                                j->ex.bits.f1 = 1;
2586                                ixj_kill_fasync(j, SIG_F1, POLL_IN);
2587                                break;
2588                        case 2:
2589                                if(ixjdebug & 0x0020) {
2590                                        printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
2591                                }
2592                                j->ex.bits.f2 = 1;
2593                                ixj_kill_fasync(j, SIG_F2, POLL_IN);
2594                                break;
2595                        case 3:
2596                                if(ixjdebug & 0x0020) {
2597                                        printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
2598                                }
2599                                j->ex.bits.f3 = 1;
2600                                ixj_kill_fasync(j, SIG_F3, POLL_IN);
2601                                break;
2602                        }
2603                }
2604        }
2605        return 0;
2606}
2607
2608static int LineMonitor(IXJ *j)
2609{
2610        if (j->dtmf_proc) {
2611                return -1;
2612        }
2613        j->dtmf_proc = 1;
2614
2615        if (ixj_WriteDSPCommand(0x7000, j))             /* Line Monitor */
2616                return -1;
2617
2618        j->dtmf.bytes.high = j->ssr.high;
2619        j->dtmf.bytes.low = j->ssr.low;
2620        if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
2621                j->dtmf_state = 1;
2622                j->dtmf_current = j->dtmf.bits.digit;
2623        }
2624        if (j->dtmf_state && !j->dtmf.bits.dtmf_valid)  /* && j->dtmf_wp != j->dtmf_rp) */
2625         {
2626                if(!j->cidcw_wait) {
2627                        j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
2628                        j->dtmf_wp++;
2629                        if (j->dtmf_wp == 79)
2630                                j->dtmf_wp = 0;
2631                        j->ex.bits.dtmf_ready = 1;
2632                        if(j->ex_sig.bits.dtmf_ready) {
2633                                ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
2634                        }
2635                }
2636                else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
2637                        if(ixjdebug & 0x0020) {
2638                                printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
2639                        }
2640                        j->flags.cidcw_ack = 1;
2641                }
2642                j->dtmf_state = 0;
2643        }
2644        j->dtmf_proc = 0;
2645
2646        return 0;
2647}
2648
2649/************************************************************************
2650*
2651* Functions to allow alaw <-> ulaw conversions.
2652*
2653************************************************************************/
2654
2655static void ulaw2alaw(unsigned char *buff, unsigned long len)
2656{
2657        static unsigned char table_ulaw2alaw[] =
2658        {
2659                0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D, 
2660                0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25, 
2661                0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D, 
2662                0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35, 
2663                0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02, 
2664                0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A, 
2665                0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12, 
2666                0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B, 
2667                0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63, 
2668                0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79, 
2669                0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71, 
2670                0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D, 
2671                0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45, 
2672                0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D, 
2673                0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51, 
2674                0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5, 
2675                0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD, 
2676                0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5, 
2677                0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD, 
2678                0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5, 
2679                0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82, 
2680                0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A, 
2681                0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92, 
2682                0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB, 
2683                0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3, 
2684                0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9, 
2685                0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1, 
2686                0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD, 
2687                0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5, 
2688                0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD, 
2689                0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1, 
2690                0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2691        };
2692
2693        while (len--)
2694        {
2695                *buff = table_ulaw2alaw[*(unsigned char *)buff];
2696                buff++;
2697        }
2698}
2699
2700static void alaw2ulaw(unsigned char *buff, unsigned long len)
2701{
2702        static unsigned char table_alaw2ulaw[] =
2703        {
2704                0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C, 
2705                0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24, 
2706                0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C, 
2707                0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34, 
2708                0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 
2709                0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 
2710                0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 
2711                0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 
2712                0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 
2713                0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E, 
2714                0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A, 
2715                0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 
2716                0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B, 
2717                0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43, 
2718                0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59, 
2719                0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51, 
2720                0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC, 
2721                0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4, 
2722                0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC, 
2723                0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4, 
2724                0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 
2725                0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 
2726                0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 
2727                0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 
2728                0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 
2729                0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE, 
2730                0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA, 
2731                0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 
2732                0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB, 
2733                0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3, 
2734                0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9, 
2735                0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2736        };
2737
2738        while (len--)
2739        {
2740                *buff = table_alaw2ulaw[*(unsigned char *)buff];
2741                buff++;
2742        }
2743}
2744
2745static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos)
2746{
2747        unsigned long i = *ppos;
2748        IXJ * j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2749
2750        DECLARE_WAITQUEUE(wait, current);
2751
2752        if (j->flags.inread)
2753                return -EALREADY;
2754
2755        j->flags.inread = 1;
2756
2757        add_wait_queue(&j->read_q, &wait);
2758        set_current_state(TASK_INTERRUPTIBLE);
2759        mb();
2760
2761        while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
2762                ++j->read_wait;
2763                if (file_p->f_flags & O_NONBLOCK) {
2764                        set_current_state(TASK_RUNNING);
2765                        remove_wait_queue(&j->read_q, &wait);
2766                        j->flags.inread = 0;
2767                        return -EAGAIN;
2768                }
2769                if (!ixj_hookstate(j)) {
2770                        set_current_state(TASK_RUNNING);
2771                        remove_wait_queue(&j->read_q, &wait);
2772                        j->flags.inread = 0;
2773                        return 0;
2774                }
2775                interruptible_sleep_on(&j->read_q);
2776                if (signal_pending(current)) {
2777                        set_current_state(TASK_RUNNING);
2778                        remove_wait_queue(&j->read_q, &wait);
2779                        j->flags.inread = 0;
2780                        return -EINTR;
2781                }
2782        }
2783
2784        remove_wait_queue(&j->read_q, &wait);
2785        set_current_state(TASK_RUNNING);
2786        /* Don't ever copy more than the user asks */
2787        if(j->rec_codec == ALAW)
2788                ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
2789        i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
2790        j->read_buffer_ready = 0;
2791        if (i) {
2792                j->flags.inread = 0;
2793                return -EFAULT;
2794        } else {
2795                j->flags.inread = 0;
2796                return min(length, j->read_buffer_size);
2797        }
2798}
2799
2800static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length,
2801                          loff_t * ppos)
2802{
2803        int pre_retval;
2804        ssize_t read_retval = 0;
2805        IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2806
2807        pre_retval = ixj_PreRead(j, 0L);
2808        switch (pre_retval) {
2809        case NORMAL:
2810                read_retval = ixj_read(file_p, buf, length, ppos);
2811                ixj_PostRead(j, 0L);
2812                break;
2813        case NOPOST:
2814                read_retval = ixj_read(file_p, buf, length, ppos);
2815                break;
2816        case POSTONLY:
2817                ixj_PostRead(j, 0L);
2818                break;
2819        default:
2820                read_retval = pre_retval;
2821        }
2822        return read_retval;
2823}
2824
2825static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos)
2826{
2827        unsigned long i = *ppos;
2828        IXJ *j = file_p->private_data;
2829
2830        DECLARE_WAITQUEUE(wait, current);
2831
2832        if (j->flags.inwrite)
2833                return -EALREADY;
2834
2835        j->flags.inwrite = 1;
2836
2837        add_wait_queue(&j->write_q, &wait);
2838        set_current_state(TASK_INTERRUPTIBLE);
2839        mb();
2840
2841
2842        while (!j->write_buffers_empty) {
2843                ++j->write_wait;
2844                if (file_p->f_flags & O_NONBLOCK) {
2845                        set_current_state(TASK_RUNNING);
2846                        remove_wait_queue(&j->write_q, &wait);
2847                        j->flags.inwrite = 0;
2848                        return -EAGAIN;
2849                }
2850                if (!ixj_hookstate(j)) {
2851                        set_current_state(TASK_RUNNING);
2852                        remove_wait_queue(&j->write_q, &wait);
2853                        j->flags.inwrite = 0;
2854                        return 0;
2855                }
2856                interruptible_sleep_on(&j->write_q);
2857                if (signal_pending(current)) {
2858                        set_current_state(TASK_RUNNING);
2859                        remove_wait_queue(&j->write_q, &wait);
2860                        j->flags.inwrite = 0;
2861                        return -EINTR;
2862                }
2863        }
2864        set_current_state(TASK_RUNNING);
2865        remove_wait_queue(&j->write_q, &wait);
2866        if (j->write_buffer_wp + count >= j->write_buffer_end)
2867                j->write_buffer_wp = j->write_buffer;
2868        i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
2869        if (i) {
2870                j->flags.inwrite = 0;
2871                return -EFAULT;
2872        }
2873       if(j->play_codec == ALAW)
2874               alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
2875        j->flags.inwrite = 0;
2876        return min(count, j->write_buffer_size);
2877}
2878
2879static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos)
2880{
2881        int pre_retval;
2882        ssize_t write_retval = 0;
2883
2884        IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
2885
2886        pre_retval = ixj_PreWrite(j, 0L);
2887        switch (pre_retval) {
2888        case NORMAL:
2889                write_retval = ixj_write(file_p, buf, count, ppos);
2890                if (write_retval > 0) {
2891                        ixj_PostWrite(j, 0L);
2892                        j->write_buffer_wp += write_retval;
2893                        j->write_buffers_empty--;
2894                }
2895                break;
2896        case NOPOST:
2897                write_retval = ixj_write(file_p, buf, count, ppos);
2898                if (write_retval > 0) {
2899                        j->write_buffer_wp += write_retval;
2900                        j->write_buffers_empty--;
2901                }
2902                break;
2903        case POSTONLY:
2904                ixj_PostWrite(j, 0L);
2905                break;
2906        default:
2907                write_retval = pre_retval;
2908        }
2909        return write_retval;
2910}
2911
2912static void ixj_read_frame(IXJ *j)
2913{
2914        int cnt, dly;
2915
2916        if (j->read_buffer) {
2917                for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2918                        if (!(cnt % 16) && !IsRxReady(j)) {
2919                                dly = 0;
2920                                while (!IsRxReady(j)) {
2921                                        if (dly++ > 5) {
2922                                                dly = 0;
2923                                                break;
2924                                        }
2925                                        udelay(10);
2926                                }
2927                        }
2928                        /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
2929                        if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
2930                                inb_p(j->DSPbase + 0x0E);
2931                                inb_p(j->DSPbase + 0x0F);
2932                        }
2933                        *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
2934                        *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
2935                }
2936                ++j->framesread;
2937                if (j->intercom != -1) {
2938                        if (IsTxReady(get_ixj(j->intercom))) {
2939                                for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2940                                        if (!(cnt % 16) && !IsTxReady(j)) {
2941                                                dly = 0;
2942                                                while (!IsTxReady(j)) {
2943                                                        if (dly++ > 5) {
2944                                                                dly = 0;
2945                                                                break;
2946                                                        }
2947                                                        udelay(10);
2948                                                }
2949                                        }
2950                                        outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
2951                                        outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
2952                                }
2953                                get_ixj(j->intercom)->frameswritten++;
2954                        }
2955                } else {
2956                        j->read_buffer_ready = 1;
2957                        wake_up_interruptible(&j->read_q);      /* Wake any blocked readers */
2958
2959                        wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
2960
2961                        if(j->ixj_signals[SIG_READ_READY])
2962                                ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
2963                }
2964        }
2965}
2966
2967static short fsk[][6][20] =
2968{
2969        {
2970                {
2971                        0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
2972                        -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
2973                },
2974                {
2975                        -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
2976                        -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
2977                },
2978                {
2979                        -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
2980                        -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
2981                },
2982                {
2983                        0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
2984                        16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
2985                },
2986                {
2987                        28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
2988                        32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
2989                },
2990                {
2991                        28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
2992                        16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
2993                }
2994        },
2995        {
2996                {
2997                        0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
2998                        0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
2999                },
3000                {
3001                        -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3002                        28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3003                },
3004                {
3005                        -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3006                        28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3007                },
3008                {
3009                        0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3010                        0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3011                },
3012                {
3013                        28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3014                        -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3015                },
3016                {
3017                        28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3018                        -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3019                }
3020        }
3021};
3022
3023
3024static void ixj_write_cid_bit(IXJ *j, int bit)
3025{
3026        while (j->fskcnt < 20) {
3027                if(j->fskdcnt < (j->fsksize - 1))
3028                        j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
3029
3030                j->fskcnt += 3;
3031        }
3032        j->fskcnt %= 20;
3033
3034        if (!bit)
3035                j->fskz++;
3036        if (j->fskz >= 6)
3037                j->fskz = 0;
3038
3039}
3040
3041static void ixj_write_cid_byte(IXJ *j, char byte)
3042{
3043        IXJ_CBYTE cb;
3044
3045                cb.cbyte = byte;
3046                ixj_write_cid_bit(j, 0);
3047                ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
3048                ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
3049                ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
3050                ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
3051                ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
3052                ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
3053                ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
3054                ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
3055                ixj_write_cid_bit(j, 1);
3056}
3057
3058static void ixj_write_cid_seize(IXJ *j)
3059{
3060        int cnt;
3061
3062        for (cnt = 0; cnt < 150; cnt++) {
3063                ixj_write_cid_bit(j, 0);
3064                ixj_write_cid_bit(j, 1);
3065        }
3066        for (cnt = 0; cnt < 180; cnt++) {
3067                ixj_write_cid_bit(j, 1);
3068        }
3069}
3070
3071static void ixj_write_cidcw_seize(IXJ *j)
3072{
3073        int cnt;
3074
3075        for (cnt = 0; cnt < 80; cnt++) {
3076                ixj_write_cid_bit(j, 1);
3077        }
3078}
3079
3080static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
3081{
3082        int cnt;
3083
3084        for (cnt = 0; cnt < strlen(s); cnt++) {
3085                ixj_write_cid_byte(j, s[cnt]);
3086                checksum = (checksum + s[cnt]);
3087        }
3088        return checksum;
3089}
3090
3091static void ixj_pad_fsk(IXJ *j, int pad)
3092{
3093        int cnt; 
3094
3095        for (cnt = 0; cnt < pad; cnt++) {
3096                if(j->fskdcnt < (j->fsksize - 1))
3097                        j->fskdata[j->fskdcnt++] = 0x0000;
3098        }
3099        for (cnt = 0; cnt < 720; cnt++) {
3100                if(j->fskdcnt < (j->fsksize - 1))
3101                        j->fskdata[j->fskdcnt++] = 0x0000;
3102        }
3103}
3104
3105static void ixj_pre_cid(IXJ *j)
3106{
3107        j->cid_play_codec = j->play_codec;
3108        j->cid_play_frame_size = j->play_frame_size;
3109        j->cid_play_volume = get_play_volume(j);
3110        j->cid_play_flag = j->flags.playing;
3111
3112        j->cid_rec_codec = j->rec_codec;
3113        j->cid_rec_volume = get_rec_volume(j);
3114        j->cid_rec_flag = j->flags.recording;
3115
3116        j->cid_play_aec_level = j->aec_level;
3117
3118        switch(j->baseframe.low) {
3119                case 0xA0:
3120                        j->cid_base_frame_size = 20;
3121                        break;
3122                case 0x50:
3123                        j->cid_base_frame_size = 10;
3124                        break;
3125                case 0xF0:
3126                        j->cid_base_frame_size = 30;
3127                        break;
3128        }
3129
3130        ixj_play_stop(j);
3131        ixj_cpt_stop(j);
3132
3133        j->flags.cidplay = 1;
3134
3135        set_base_frame(j, 30);
3136        set_play_codec(j, LINEAR16);
3137        set_play_volume(j, 0x1B);
3138        ixj_play_start(j);
3139}
3140
3141static void ixj_post_cid(IXJ *j)
3142{
3143        ixj_play_stop(j);
3144
3145        if(j->cidsize > 5000) {
3146                SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
3147        }
3148        j->flags.cidplay = 0;
3149        if(ixjdebug & 0x0200) {
3150                printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
3151        }
3152
3153        ixj_fsk_free(j);
3154
3155        j->fskdcnt = 0;
3156        set_base_frame(j, j->cid_base_frame_size);
3157        set_play_codec(j, j->cid_play_codec);
3158        ixj_aec_start(j, j->cid_play_aec_level);
3159        set_play_volume(j, j->cid_play_volume);
3160
3161        set_rec_codec(j, j->cid_rec_codec);
3162        set_rec_volume(j, j->cid_rec_volume);
3163
3164        if(j->cid_rec_flag)
3165                ixj_record_start(j);
3166
3167        if(j->cid_play_flag)
3168                ixj_play_start(j);
3169
3170        if(j->cid_play_flag) {
3171                wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
3172        }
3173}
3174
3175static void ixj_write_cid(IXJ *j)
3176{
3177        char sdmf1[50];
3178        char sdmf2[50];
3179        char sdmf3[80];
3180        char mdmflen, len1, len2, len3;
3181        int pad;
3182
3183        int checksum = 0;
3184
3185        if (j->dsp.low == 0x20 || j->flags.cidplay)
3186                return;
3187
3188        j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3189        j->cidsize = j->cidcnt = 0;
3190
3191        ixj_fsk_alloc(j);
3192
3193        strcpy(sdmf1, j->cid_send.month);
3194        strcat(sdmf1, j->cid_send.day);
3195        strcat(sdmf1, j->cid_send.hour);
3196        strcat(sdmf1, j->cid_send.min);
3197        strcpy(sdmf2, j->cid_send.number);
3198        strcpy(sdmf3, j->cid_send.name);
3199
3200        len1 = strlen(sdmf1);
3201        len2 = strlen(sdmf2);
3202        len3 = strlen(sdmf3);
3203        mdmflen = len1 + len2 + len3 + 6;
3204
3205        while(1){
3206                ixj_write_cid_seize(j);
3207
3208                ixj_write_cid_byte(j, 0x80);
3209                checksum = 0x80;
3210                ixj_write_cid_byte(j, mdmflen);
3211                checksum = checksum + mdmflen;
3212
3213                ixj_write_cid_byte(j, 0x01);
3214                checksum = checksum + 0x01;
3215                ixj_write_cid_byte(j, len1);
3216                checksum = checksum + len1;
3217                checksum = ixj_write_cid_string(j, sdmf1, checksum);
3218                if(ixj_hookstate(j) & 1)
3219                        break;
3220
3221                ixj_write_cid_byte(j, 0x02);
3222                checksum = checksum + 0x02;
3223                ixj_write_cid_byte(j, len2);
3224                checksum = checksum + len2;
3225                checksum = ixj_write_cid_string(j, sdmf2, checksum);
3226                if(ixj_hookstate(j) & 1)
3227                        break;
3228
3229                ixj_write_cid_byte(j, 0x07);
3230                checksum = checksum + 0x07;
3231                ixj_write_cid_byte(j, len3);
3232                checksum = checksum + len3;
3233                checksum = ixj_write_cid_string(j, sdmf3, checksum);
3234                if(ixj_hookstate(j) & 1)
3235                        break;
3236
3237                checksum %= 256;
3238                checksum ^= 0xFF;
3239                checksum += 1;
3240
3241                ixj_write_cid_byte(j, (char) checksum);
3242
3243                pad = j->fskdcnt % 240;
3244                if (pad) {
3245                        pad = 240 - pad;
3246                }
3247                ixj_pad_fsk(j, pad);
3248                break;
3249        }
3250
3251        ixj_write_frame(j);
3252}
3253
3254static void ixj_write_cidcw(IXJ *j)
3255{
3256        IXJ_TONE ti;
3257
3258        char sdmf1[50];
3259        char sdmf2[50];
3260        char sdmf3[80];
3261        char mdmflen, len1, len2, len3;
3262        int pad;
3263
3264        int checksum = 0;
3265
3266        if (j->dsp.low == 0x20 || j->flags.cidplay)
3267                return;
3268
3269        j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3270        j->cidsize = j->cidcnt = 0;
3271
3272        ixj_fsk_alloc(j);
3273
3274        j->flags.cidcw_ack = 0;
3275
3276        ti.tone_index = 23;
3277        ti.gain0 = 1;
3278        ti.freq0 = hz440;
3279        ti.gain1 = 0;
3280        ti.freq1 = 0;
3281        ixj_init_tone(j, &ti);
3282
3283        ixj_set_tone_on(1500, j);
3284        ixj_set_tone_off(32, j);
3285        if(ixjdebug & 0x0200) {
3286                printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
3287        }
3288        ixj_play_tone(j, 23);
3289
3290        clear_bit(j->board, &j->busyflags);
3291        while(j->tone_state)
3292                schedule_timeout_interruptible(1);
3293        while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3294                schedule_timeout_interruptible(1);
3295        if(ixjdebug & 0x0200) {
3296                printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
3297        }
3298
3299        ti.tone_index = 24;
3300        ti.gain0 = 1;
3301        ti.freq0 = hz2130;
3302        ti.gain1 = 0;
3303        ti.freq1 = hz2750;
3304        ixj_init_tone(j, &ti);
3305
3306        ixj_set_tone_off(10, j);
3307        ixj_set_tone_on(600, j);
3308        if(ixjdebug & 0x0200) {
3309                printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
3310        }
3311        ixj_play_tone(j, 24);
3312
3313        clear_bit(j->board, &j->busyflags);
3314        while(j->tone_state)
3315                schedule_timeout_interruptible(1);
3316        while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3317                schedule_timeout_interruptible(1);
3318        if(ixjdebug & 0x0200) {
3319                printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
3320        }
3321
3322        j->cidcw_wait = jiffies + ((50 * hertz) / 100);
3323
3324        clear_bit(j->board, &j->busyflags);
3325        while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait))
3326                schedule_timeout_interruptible(1);
3327        while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3328                schedule_timeout_interruptible(1);
3329        j->cidcw_wait = 0;
3330        if(!j->flags.cidcw_ack) {
3331                if(ixjdebug & 0x0200) {
3332                        printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
3333                }
3334                ixj_post_cid(j);
3335                if(j->cid_play_flag) {
3336                        wake_up_interruptible(&j->write_q);     /* Wake any blocked readers */
3337                }
3338                return;
3339        } else {
3340                ixj_pre_cid(j);
3341        }
3342        j->flags.cidcw_ack = 0;
3343        strcpy(sdmf1, j->cid_send.month);
3344        strcat(sdmf1, j->cid_send.day);
3345        strcat(sdmf1, j->cid_send.hour);
3346        strcat(sdmf1, j->cid_send.min);
3347        strcpy(sdmf2, j->cid_send.number);
3348        strcpy(sdmf3, j->cid_send.name);
3349
3350        len1 = strlen(sdmf1);
3351        len2 = strlen(sdmf2);
3352        len3 = strlen(sdmf3);
3353        mdmflen = len1 + len2 + len3 + 6;
3354
3355        ixj_write_cidcw_seize(j);
3356
3357        ixj_write_cid_byte(j, 0x80);
3358        checksum = 0x80;
3359        ixj_write_cid_byte(j, mdmflen);
3360        checksum = checksum + mdmflen;
3361
3362        ixj_write_cid_byte(j, 0x01);
3363        checksum = checksum + 0x01;
3364        ixj_write_cid_byte(j, len1);
3365        checksum = checksum + len1;
3366        checksum = ixj_write_cid_string(j, sdmf1, checksum);
3367
3368        ixj_write_cid_byte(j, 0x02);
3369        checksum = checksum + 0x02;
3370        ixj_write_cid_byte(j, len2);
3371        checksum = checksum + len2;
3372        checksum = ixj_write_cid_string(j, sdmf2, checksum);
3373
3374        ixj_write_cid_byte(j, 0x07);
3375        checksum = checksum + 0x07;
3376        ixj_write_cid_byte(j, len3);
3377        checksum = checksum + len3;
3378        checksum = ixj_write_cid_string(j, sdmf3, checksum);
3379
3380        checksum %= 256;
3381        checksum ^= 0xFF;
3382        checksum += 1;
3383
3384        ixj_write_cid_byte(j, (char) checksum);
3385
3386        pad = j->fskdcnt % 240;
3387        if (pad) {
3388                pad = 240 - pad;
3389        }
3390        ixj_pad_fsk(j, pad);
3391        if(ixjdebug & 0x0200) {
3392                printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
3393        }
3394}
3395
3396static void ixj_write_vmwi(IXJ *j, int msg)
3397{
3398        char mdmflen;
3399        int pad;
3400
3401        int checksum = 0;
3402
3403        if (j->dsp.low == 0x20 || j->flags.cidplay)
3404                return;
3405
3406        j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3407        j->cidsize = j->cidcnt = 0;
3408
3409        ixj_fsk_alloc(j);
3410
3411        mdmflen = 3;
3412
3413        if (j->port == PORT_POTS)
3414                SLIC_SetState(PLD_SLIC_STATE_OHT, j);
3415
3416        ixj_write_cid_seize(j);
3417
3418        ixj_write_cid_byte(j, 0x82);
3419        checksum = 0x82;
3420        ixj_write_cid_byte(j, mdmflen);
3421        checksum = checksum + mdmflen;
3422
3423        ixj_write_cid_byte(j, 0x0B);
3424        checksum = checksum + 0x0B;
3425        ixj_write_cid_byte(j, 1);
3426        checksum = checksum + 1;
3427
3428        if(msg) {
3429                ixj_write_cid_byte(j, 0xFF);
3430                checksum = checksum + 0xFF;
3431        }
3432        else {
3433                ixj_write_cid_byte(j, 0x00);
3434                checksum = checksum + 0x00;
3435        }
3436
3437        checksum %= 256;
3438        checksum ^= 0xFF;
3439        checksum += 1;
3440
3441        ixj_write_cid_byte(j, (char) checksum);
3442
3443        pad = j->fskdcnt % 240;
3444        if (pad) {
3445                pad = 240 - pad;
3446        }
3447        ixj_pad_fsk(j, pad);
3448}
3449
3450static void ixj_write_frame(IXJ *j)
3451{
3452        int cnt, frame_count, dly;
3453        IXJ_WORD dat;
3454
3455        frame_count = 0;
3456        if(j->flags.cidplay) {
3457                for(cnt = 0; cnt < 480; cnt++) {
3458                        if (!(cnt % 16) && !IsTxReady(j)) {
3459                                dly = 0;
3460                                while (!IsTxReady(j)) {
3461                                        if (dly++ > 5) {
3462                                                dly = 0;
3463                                                break;
3464                                        }
3465                                        udelay(10);
3466                                }
3467                        }
3468                        dat.word = j->fskdata[j->cidcnt++];
3469                        outb_p(dat.bytes.low, j->DSPbase + 0x0C);
3470                        outb_p(dat.bytes.high, j->DSPbase + 0x0D);
3471                        cnt++;
3472                }
3473                if(j->cidcnt >= j->fskdcnt) {
3474                        ixj_post_cid(j);
3475                }
3476                /* This may seem rude, but if we just played one frame of FSK data for CallerID
3477                   and there is real audio data in the buffer, we need to throw it away because 
3478                   we just used it's time slot */
3479                if (j->write_buffer_rp > j->write_buffer_wp) {
3480                        j->write_buffer_rp += j->cid_play_frame_size * 2;
3481                        if (j->write_buffer_rp >= j->write_buffer_end) {
3482                                j->write_buffer_rp = j->write_buffer;
3483                        }
3484                        j->write_buffers_empty++;
3485                        wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
3486
3487                        wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
3488                }
3489        } else if (j->write_buffer && j->write_buffers_empty < 1) { 
3490                if (j->write_buffer_wp > j->write_buffer_rp) {
3491                        frame_count =
3492                            (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
3493                }
3494                if (j->write_buffer_rp > j->write_buffer_wp) {
3495                        frame_count =
3496                            (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
3497                            (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
3498                }
3499                if (frame_count >= 1) {
3500                        if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
3501                                BYTES blankword;
3502
3503                                switch (j->play_mode) {
3504                                case PLAYBACK_MODE_ULAW:
3505                                case PLAYBACK_MODE_ALAW:
3506                                        blankword.low = blankword.high = 0xFF;
3507                                        break;
3508                                case PLAYBACK_MODE_8LINEAR:
3509                                case PLAYBACK_MODE_16LINEAR:
3510                                default:
3511                                        blankword.low = blankword.high = 0x00;
3512                                        break;
3513                                case PLAYBACK_MODE_8LINEAR_WSS:
3514                                        blankword.low = blankword.high = 0x80;
3515                                        break;
3516                                }
3517                                for (cnt = 0; cnt < 16; cnt++) {
3518                                        if (!(cnt % 16) && !IsTxReady(j)) {
3519                                                dly = 0;
3520                                                while (!IsTxReady(j)) {
3521                                                        if (dly++ > 5) {
3522                                                                dly = 0;
3523                                                                break;
3524                                                        }
3525                                                        udelay(10);
3526                                                }
3527                                        }
3528                                        outb_p((blankword.low), j->DSPbase + 0x0C);
3529                                        outb_p((blankword.high), j->DSPbase + 0x0D);
3530                                }
3531                                j->flags.play_first_frame = 0;
3532                        } else  if (j->play_codec == G723_63 && j->flags.play_first_frame) {
3533                                for (cnt = 0; cnt < 24; cnt++) {
3534                                        BYTES blankword;
3535
3536                                        if(cnt == 12) {
3537                                                blankword.low = 0x02;
3538                                                blankword.high = 0x00;
3539                                        }
3540                                        else {
3541                                                blankword.low = blankword.high = 0x00;
3542                                        }
3543                                        if (!(cnt % 16) && !IsTxReady(j)) {
3544                                                dly = 0;
3545                                                while (!IsTxReady(j)) {
3546                                                        if (dly++ > 5) {
3547                                                                dly = 0;
3548                                                                break;
3549                                                        }
3550                                                        udelay(10);
3551                                                }
3552                                        }
3553                                        outb_p((blankword.low), j->DSPbase + 0x0C);
3554                                        outb_p((blankword.high), j->DSPbase + 0x0D);
3555                                }
3556                                j->flags.play_first_frame = 0;
3557                        }
3558                        for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
3559                                if (!(cnt % 16) && !IsTxReady(j)) {
3560                                        dly = 0;
3561                                        while (!IsTxReady(j)) {
3562                                                if (dly++ > 5) {
3563                                                        dly = 0;
3564                                                        break;
3565                                                }
3566                                                udelay(10);
3567                                        }
3568                                }
3569                        /* Add word 0 to G.729 frames for the 8021.  Right now we don't do VAD/CNG  */
3570                                if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3571                                        if (j->write_buffer_rp[cnt] == 0 &&
3572                                            j->write_buffer_rp[cnt + 1] == 0 &&
3573                                            j->write_buffer_rp[cnt + 2] == 0 &&
3574                                            j->write_buffer_rp[cnt + 3] == 0 &&
3575                                            j->write_buffer_rp[cnt + 4] == 0 &&
3576                                            j->write_buffer_rp[cnt + 5] == 0 &&
3577                                            j->write_buffer_rp[cnt + 6] == 0 &&
3578                                            j->write_buffer_rp[cnt + 7] == 0 &&
3579                                            j->write_buffer_rp[cnt + 8] == 0 &&
3580                                            j->write_buffer_rp[cnt + 9] == 0) {
3581                                        /* someone is trying to write silence lets make this a type 0 frame. */
3582                                                outb_p(0x00, j->DSPbase + 0x0C);
3583                                                outb_p(0x00, j->DSPbase + 0x0D);
3584                                        } else {
3585                                        /* so all other frames are type 1. */
3586                                                outb_p(0x01, j->DSPbase + 0x0C);
3587                                                outb_p(0x00, j->DSPbase + 0x0D);
3588                                        }
3589                                }
3590                                outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
3591                                outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
3592                                *(j->write_buffer_rp + cnt) = 0;
3593                                *(j->write_buffer_rp + cnt + 1) = 0;
3594                        }
3595                        j->write_buffer_rp += j->play_frame_size * 2;
3596                        if (j->write_buffer_rp >= j->write_buffer_end) {
3597                                j->write_buffer_rp = j->write_buffer;
3598                        }
3599                        j->write_buffers_empty++;
3600                        wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
3601
3602                        wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
3603
3604                        ++j->frameswritten;
3605                }
3606        } else {
3607                j->drybuffer++;
3608        }
3609        if(j->ixj_signals[SIG_WRITE_READY]) {
3610                ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
3611        }
3612}
3613
3614static int idle(IXJ *j)
3615{
3616        if (ixj_WriteDSPCommand(0x0000, j))             /* DSP Idle */
3617
3618                return 0;
3619
3620        if (j->ssr.high || j->ssr.low) {
3621                return 0;
3622        } else {
3623                j->play_mode = -1;
3624                j->flags.playing = 0;
3625                j->rec_mode = -1;
3626                j->flags.recording = 0;
3627                return 1;
3628        }
3629}
3630
3631static int set_base_frame(IXJ *j, int size)
3632{
3633        unsigned short cmd;
3634        int cnt;
3635
3636        idle(j);
3637        j->cid_play_aec_level = j->aec_level;
3638        aec_stop(j);
3639        for (cnt = 0; cnt < 10; cnt++) {
3640                if (idle(j))
3641                        break;
3642        }
3643        if (j->ssr.high || j->ssr.low)
3644                return -1;
3645        if (j->dsp.low != 0x20) {
3646                switch (size) {
3647                case 30:
3648                        cmd = 0x07F0;
3649                        /* Set Base Frame Size to 240 pg9-10 8021 */
3650                        break;
3651                case 20:
3652                        cmd = 0x07A0;
3653                        /* Set Base Frame Size to 160 pg9-10 8021 */
3654                        break;
3655                case 10:
3656                        cmd = 0x0750;
3657                        /* Set Base Frame Size to 80 pg9-10 8021 */
3658                        break;
3659                default:
3660                        return -1;
3661                }
3662        } else {
3663                if (size == 30)
3664                        return size;
3665                else
3666                        return -1;
3667        }
3668        if (ixj_WriteDSPCommand(cmd, j)) {
3669                j->baseframe.high = j->baseframe.low = 0xFF;
3670                return -1;
3671        } else {
3672                j->baseframe.high = j->ssr.high;
3673                j->baseframe.low = j->ssr.low;
3674                /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3675                if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
3676                        return -1;
3677                }
3678        }
3679        ixj_aec_start(j, j->cid_play_aec_level);
3680        return size;
3681}
3682
3683static int set_rec_codec(IXJ *j, int rate)
3684{
3685        int retval = 0;
3686
3687        j->rec_codec = rate;
3688
3689        switch (rate) {
3690        case G723_63:
3691                if (j->ver.low != 0x12 || ixj_convert_loaded) {
3692                        j->rec_frame_size = 12;
3693                        j->rec_mode = 0;
3694                } else {
3695                        retval = 1;
3696                }
3697                break;
3698        case G723_53:
3699                if (j->ver.low != 0x12 || ixj_convert_loaded) {
3700                        j->rec_frame_size = 10;
3701                        j->rec_mode = 0;
3702                } else {
3703                        retval = 1;
3704                }
3705                break;
3706        case TS85:
3707                if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
3708                        j->rec_frame_size = 16;
3709                        j->rec_mode = 0;
3710                } else {
3711                        retval = 1;
3712                }
3713                break;
3714        case TS48:
3715                if (j->ver.low != 0x12 || ixj_convert_loaded) {
3716                        j->rec_frame_size = 9;
3717                        j->rec_mode = 0;
3718                } else {
3719                        retval = 1;
3720                }
3721                break;
3722        case TS41:
3723                if (j->ver.low != 0x12 || ixj_convert_loaded) {
3724                        j->rec_frame_size = 8;
3725                        j->rec_mode = 0;
3726                } else {
3727                        retval = 1;
3728                }
3729                break;
3730        case G728:
3731                if (j->dsp.low != 0x20) {
3732                        j->rec_frame_size = 48;
3733                        j->rec_mode = 0;
3734                } else {
3735                        retval = 1;
3736                }
3737                break;
3738        case G729:
3739                if (j->dsp.low != 0x20) {
3740                        if (!j->flags.g729_loaded) {
3741                                retval = 1;
3742                                break;
3743                        }
3744                        switch (j->baseframe.low) {
3745                        case 0xA0:
3746                                j->rec_frame_size = 10;
3747                                break;
3748                        case 0x50:
3749                                j->rec_frame_size = 5;
3750                                break;
3751                        default:
3752                                j->rec_frame_size = 15;
3753                                break;
3754                        }
3755                        j->rec_mode = 0;
3756                } else {
3757                        retval = 1;
3758                }
3759                break;
3760        case G729B:
3761                if (j->dsp.low != 0x20) {
3762                        if (!j->flags.g729_loaded) {
3763                                retval = 1;
3764                                break;
3765                        }
3766                        switch (j->baseframe.low) {
3767                        case 0xA0:
3768                                j->rec_frame_size = 12;
3769                                break;
3770                        case 0x50:
3771                                j->rec_frame_size = 6;
3772                                break;
3773                        default:
3774                                j->rec_frame_size = 18;
3775                                break;
3776                        }
3777                        j->rec_mode = 0;
3778                } else {
3779                        retval = 1;
3780                }
3781                break;
3782        case ULAW:
3783                switch (j->baseframe.low) {
3784                case 0xA0:
3785                        j->rec_frame_size = 80;
3786                        break;
3787                case 0x50:
3788                        j->rec_frame_size = 40;
3789                        break;
3790                default:
3791                        j->rec_frame_size = 120;
3792                        break;
3793                }
3794                j->rec_mode = 4;
3795                break;
3796        case ALAW:
3797                switch (j->baseframe.low) {
3798                case 0xA0:
3799                        j->rec_frame_size = 80;
3800                        break;
3801                case 0x50:
3802                        j->rec_frame_size = 40;
3803                        break;
3804                default:
3805                        j->rec_frame_size = 120;
3806                        break;
3807                }
3808                j->rec_mode = 4;
3809                break;
3810        case LINEAR16:
3811                switch (j->baseframe.low) {
3812                case 0xA0:
3813                        j->rec_frame_size = 160;
3814                        break;
3815                case 0x50:
3816                        j->rec_frame_size = 80;
3817                        break;
3818                default:
3819                        j->rec_frame_size = 240;
3820                        break;
3821                }
3822                j->rec_mode = 5;
3823                break;
3824        case LINEAR8:
3825                switch (j->baseframe.low) {
3826                case 0xA0:
3827                        j->rec_frame_size = 80;
3828                        break;
3829                case 0x50:
3830                        j->rec_frame_size = 40;
3831                        break;
3832                default:
3833                        j->rec_frame_size = 120;
3834                        break;
3835                }
3836                j->rec_mode = 6;
3837                break;
3838        case WSS:
3839                switch (j->baseframe.low) {
3840                case 0xA0:
3841                        j->rec_frame_size = 80;
3842                        break;
3843                case 0x50:
3844                        j->rec_frame_size = 40;
3845                        break;
3846                default:
3847                        j->rec_frame_size = 120;
3848                        break;
3849                }
3850                j->rec_mode = 7;
3851                break;
3852        default:
3853                kfree(j->read_buffer);
3854                j->rec_frame_size = 0;
3855                j->rec_mode = -1;
3856                j->read_buffer = NULL;
3857                j->read_buffer_size = 0;
3858                retval = 1;
3859                break;
3860        }
3861        return retval;
3862}
3863
3864static int ixj_record_start(IXJ *j)
3865{
3866        unsigned short cmd = 0x0000;
3867
3868        if (j->read_buffer) {
3869                ixj_record_stop(j);
3870        }
3871        j->flags.recording = 1;
3872        ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
3873
3874        if(ixjdebug & 0x0002)
3875                printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3876
3877        if (!j->rec_mode) {
3878                switch (j->rec_codec) {
3879                case G723_63:
3880                        cmd = 0x5131;
3881                        break;
3882                case G723_53:
3883                        cmd = 0x5132;
3884                        break;
3885                case TS85:
3886                        cmd = 0x5130;   /* TrueSpeech 8.5 */
3887
3888                        break;
3889                case TS48:
3890                        cmd = 0x5133;   /* TrueSpeech 4.8 */
3891
3892                        break;
3893                case TS41:
3894                        cmd = 0x5134;   /* TrueSpeech 4.1 */
3895
3896                        break;
3897                case G728:
3898                        cmd = 0x5135;
3899                        break;
3900                case G729:
3901                case G729B:
3902                        cmd = 0x5136;
3903                        break;
3904                default:
3905                        return 1;
3906                }
3907                if (ixj_WriteDSPCommand(cmd, j))
3908                        return -1;
3909        }
3910        if (!j->read_buffer) {
3911                if (!j->read_buffer)
3912                        j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
3913                if (!j->read_buffer) {
3914                        printk("Read buffer allocation for ixj board %d failed!\n", j->board);
3915                        return -ENOMEM;
3916                }
3917        }
3918        j->read_buffer_size = j->rec_frame_size * 2;
3919
3920        if (ixj_WriteDSPCommand(0x5102, j))             /* Set Poll sync mode */
3921
3922                return -1;
3923
3924        switch (j->rec_mode) {
3925        case 0:
3926                cmd = 0x1C03;   /* Record C1 */
3927
3928                break;
3929        case 4:
3930                if (j->ver.low == 0x12) {
3931                        cmd = 0x1E03;   /* Record C1 */
3932
3933                } else {
3934                        cmd = 0x1E01;   /* Record C1 */
3935
3936                }
3937                break;
3938        case 5:
3939                if (j->ver.low == 0x12) {
3940                        cmd = 0x1E83;   /* Record C1 */
3941
3942                } else {
3943                        cmd = 0x1E81;   /* Record C1 */
3944
3945                }
3946                break;
3947        case 6:
3948                if (j->ver.low == 0x12) {
3949                        cmd = 0x1F03;   /* Record C1 */
3950
3951                } else {
3952                        cmd = 0x1F01;   /* Record C1 */
3953
3954                }
3955                break;
3956        case 7:
3957                if (j->ver.low == 0x12) {
3958                        cmd = 0x1F83;   /* Record C1 */
3959                } else {
3960                        cmd = 0x1F81;   /* Record C1 */
3961                }
3962                break;
3963        }
3964        if (ixj_WriteDSPCommand(cmd, j))
3965                return -1;
3966
3967        if (j->flags.playing) {
3968                ixj_aec_start(j, j->aec_level);
3969        }
3970        return 0;
3971}
3972
3973static void ixj_record_stop(IXJ *j)
3974{
3975        if (ixjdebug & 0x0002)
3976                printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3977
3978        kfree(j->read_buffer);
3979        j->read_buffer = NULL;
3980        j->read_buffer_size = 0;
3981        if (j->rec_mode > -1) {
3982                ixj_WriteDSPCommand(0x5120, j);
3983                j->rec_mode = -1;
3984        }
3985        j->flags.recording = 0;
3986}
3987static void ixj_vad(IXJ *j, int arg)
3988{
3989        if (arg)
3990                ixj_WriteDSPCommand(0x513F, j);
3991        else
3992                ixj_WriteDSPCommand(0x513E, j);
3993}
3994
3995static void set_rec_depth(IXJ *j, int depth)
3996{
3997        if (depth > 60)
3998                depth = 60;
3999        if (depth < 0)
4000                depth = 0;
4001        ixj_WriteDSPCommand(0x5180 + depth, j);
4002}
4003
4004static void set_dtmf_prescale(IXJ *j, int volume)
4005{
4006        ixj_WriteDSPCommand(0xCF07, j);
4007        ixj_WriteDSPCommand(volume, j);
4008}
4009
4010static int get_dtmf_prescale(IXJ *j)
4011{
4012        ixj_WriteDSPCommand(0xCF05, j);
4013        return j->ssr.high << 8 | j->ssr.low;
4014}
4015
4016static void set_rec_volume(IXJ *j, int volume)
4017{
4018        if(j->aec_level == AEC_AGC) {
4019                if (ixjdebug & 0x0002)
4020                        printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
4021                ixj_WriteDSPCommand(0xCF96, j);
4022                ixj_WriteDSPCommand(volume, j);
4023        } else {
4024                if (ixjdebug & 0x0002)
4025                        printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
4026                ixj_WriteDSPCommand(0xCF03, j);
4027                ixj_WriteDSPCommand(volume, j);
4028        }
4029}
4030
4031static int set_rec_volume_linear(IXJ *j, int volume)
4032{
4033        int newvolume, dsprecmax;
4034
4035        if (ixjdebug & 0x0002)
4036                printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
4037        if(volume > 100 || volume < 0) {
4038          return -1;
4039        }
4040
4041        /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4042        switch (j->cardtype) {
4043        case QTI_PHONEJACK:
4044                dsprecmax = 0x440;
4045                break;
4046        case QTI_LINEJACK:
4047                dsprecmax = 0x180;
4048                ixj_mixer(0x0203, j);   /*Voice Left Volume unmute 6db */
4049                ixj_mixer(0x0303, j);   /*Voice Right Volume unmute 6db */
4050                ixj_mixer(0x0C00, j);   /*Mono1 unmute 12db */
4051                break;
4052        case QTI_PHONEJACK_LITE:
4053                dsprecmax = 0x4C0;
4054                break;
4055        case QTI_PHONEJACK_PCI:
4056                dsprecmax = 0x100;
4057                break;
4058        case QTI_PHONECARD:
4059                dsprecmax = 0x400;
4060                break;
4061        default:
4062                return -1;
4063        }
4064        newvolume = (dsprecmax * volume) / 100;
4065        set_rec_volume(j, newvolume);
4066        return 0;
4067}
4068
4069static int get_rec_volume(IXJ *j)
4070{
4071        if(j->aec_level == AEC_AGC) {
4072                if (ixjdebug & 0x0002)
4073                        printk(KERN_INFO "Getting AGC Threshold\n");
4074                ixj_WriteDSPCommand(0xCF86, j);
4075                if (ixjdebug & 0x0002)
4076                        printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
4077                return j->ssr.high << 8 | j->ssr.low;
4078        } else {
4079                if (ixjdebug & 0x0002)
4080                        printk(KERN_INFO "Getting Record Volume\n");
4081                ixj_WriteDSPCommand(0xCF01, j);
4082                return j->ssr.high << 8 | j->ssr.low;
4083        }
4084}
4085
4086static int get_rec_volume_linear(IXJ *j)
4087{
4088        int volume, newvolume, dsprecmax;
4089
4090        switch (j->cardtype) {
4091        case QTI_PHONEJACK:
4092                dsprecmax = 0x440;
4093                break;
4094        case QTI_LINEJACK:
4095                dsprecmax = 0x180;
4096                break;
4097        case QTI_PHONEJACK_LITE:
4098                dsprecmax = 0x4C0;
4099                break;
4100        case QTI_PHONEJACK_PCI:
4101                dsprecmax = 0x100;
4102                break;
4103        case QTI_PHONECARD:
4104                dsprecmax = 0x400;
4105                break;
4106        default:
4107                return -1;
4108        }
4109        volume = get_rec_volume(j);
4110        newvolume = (volume * 100) / dsprecmax;
4111        if(newvolume > 100)
4112                newvolume = 100;
4113        return newvolume;
4114}
4115
4116static int get_rec_level(IXJ *j)
4117{
4118        int retval;
4119
4120        ixj_WriteDSPCommand(0xCF88, j);
4121
4122        retval = j->ssr.high << 8 | j->ssr.low;
4123        retval = (retval * 256) / 240;
4124        return retval;
4125}
4126
4127static void ixj_aec_start(IXJ *j, int level)
4128{
4129        j->aec_level = level;
4130        if (ixjdebug & 0x0002)
4131                printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
4132        if (!level) {
4133                aec_stop(j);
4134        } else {
4135                if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4136                        ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
4137
4138                        ixj_WriteDSPCommand(0x0300, j);
4139                }
4140                ixj_WriteDSPCommand(0xB001, j); /* AEC On */
4141
4142                ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
4143
4144                switch (level) {
4145                case AEC_LOW:
4146                        ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
4147
4148                        ixj_WriteDSPCommand(0xE011, j);
4149                        ixj_WriteDSPCommand(0xFFFF, j);
4150
4151                        ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4152                        ixj_WriteDSPCommand(0x0000, j); /* to off */
4153                        
4154                        break;
4155
4156                case AEC_MED:
4157                        ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
4158
4159                        ixj_WriteDSPCommand(0xE011, j);
4160                        ixj_WriteDSPCommand(0x0080, j);
4161
4162                        ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4163                        ixj_WriteDSPCommand(0x0000, j); /* to off */
4164                        
4165                        break;
4166
4167                case AEC_HIGH:
4168                        ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
4169
4170                        ixj_WriteDSPCommand(0xE011, j);
4171                        ixj_WriteDSPCommand(0x0080, j);
4172
4173                        ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4174                        ixj_WriteDSPCommand(0x0000, j); /* to off */
4175                        
4176                        break;
4177
4178                case AEC_AGC:
4179                        /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4180                        ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4181
4182                        ixj_WriteDSPCommand(0xE011, j);
4183                        ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4184
4185                        ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4186
4187                        if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4188                                ixj_WriteDSPCommand(0x0224, j);
4189                        else
4190                                ixj_WriteDSPCommand(0x1224, j);
4191
4192                        ixj_WriteDSPCommand(0xE014, j);
4193                        ixj_WriteDSPCommand(0x0003, j); /* Lock threshold at 3dB */
4194
4195                        ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4196
4197                        /* Now we can set the AGC initial parameters and turn it on */
4198                        ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minimum gain */
4199                        ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
4200        
4201                        ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
4202                        ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
4203                        
4204                        ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
4205                        ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
4206                
4207                        ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
4208                        ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
4209                        
4210                        ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
4211                        ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
4212                        
4213                        ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
4214                        ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
4215                        
4216                        ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
4217                        ixj_WriteDSPCommand(0x1200, j); /* to 25% */
4218                        
4219                        ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4220                        ixj_WriteDSPCommand(0x0001, j); /* to on */
4221                        
4222                        break;
4223
4224                case AEC_AUTO:
4225                        ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4226
4227                        ixj_WriteDSPCommand(0xE011, j);
4228                        ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4229
4230                        ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4231
4232                        if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4233                                ixj_WriteDSPCommand(0x0224, j);
4234                        else
4235                                ixj_WriteDSPCommand(0x1224, j);
4236
4237                        ixj_WriteDSPCommand(0xE014, j);
4238                        ixj_WriteDSPCommand(0x0003, j); /* Lock threshold at 3dB */
4239
4240                        ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4241
4242                        break;
4243                }
4244        }
4245}
4246
4247static void aec_stop(IXJ *j)
4248{
4249        j->aec_level = AEC_OFF;
4250        if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4251                ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
4252
4253                ixj_WriteDSPCommand(0x0700, j);
4254        }
4255        if (j->play_mode != -1 && j->rec_mode != -1)
4256        {
4257                ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
4258        }
4259}
4260
4261static int set_play_codec(IXJ *j, int rate)
4262{
4263        int retval = 0;
4264
4265        j->play_codec = rate;
4266
4267        switch (rate) {
4268        case G723_63:
4269                if (j->ver.low != 0x12 || ixj_convert_loaded) {
4270                        j->play_frame_size = 12;
4271                        j->play_mode = 0;
4272                } else {
4273                        retval = 1;
4274                }
4275                break;
4276        case G723_53:
4277                if (j->ver.low != 0x12 || ixj_convert_loaded) {
4278                        j->play_frame_size = 10;
4279                        j->play_mode = 0;
4280                } else {
4281                        retval = 1;
4282                }
4283                break;
4284        case TS85:
4285                if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
4286                        j->play_frame_size = 16;
4287                        j->play_mode = 0;
4288                } else {
4289                        retval = 1;
4290                }
4291                break;
4292        case TS48:
4293                if (j->ver.low != 0x12 || ixj_convert_loaded) {
4294                        j->play_frame_size = 9;
4295                        j->play_mode = 0;
4296                } else {
4297                        retval = 1;
4298                }
4299                break;
4300        case TS41:
4301                if (j->ver.low != 0x12 || ixj_convert_loaded) {
4302                        j->play_frame_size = 8;
4303                        j->play_mode = 0;
4304                } else {
4305                        retval = 1;
4306                }
4307                break;
4308        case G728:
4309                if (j->dsp.low != 0x20) {
4310                        j->play_frame_size = 48;
4311                        j->play_mode = 0;
4312                } else {
4313                        retval = 1;
4314                }
4315                break;
4316        case G729:
4317                if (j->dsp.low != 0x20) {
4318                        if (!j->flags.g729_loaded) {
4319                                retval = 1;
4320                                break;
4321                        }
4322                        switch (j->baseframe.low) {
4323                        case 0xA0:
4324                                j->play_frame_size = 10;
4325                                break;
4326                        case 0x50:
4327                                j->play_frame_size = 5;
4328                                break;
4329                        default:
4330                                j->play_frame_size = 15;
4331                                break;
4332                        }
4333                        j->play_mode = 0;
4334                } else {
4335                        retval = 1;
4336                }
4337                break;
4338        case G729B:
4339                if (j->dsp.low != 0x20) {
4340                        if (!j->flags.g729_loaded) {
4341                                retval = 1;
4342                                break;
4343                        }
4344                        switch (j->baseframe.low) {
4345                        case 0xA0:
4346                                j->play_frame_size = 12;
4347                                break;
4348                        case 0x50:
4349                                j->play_frame_size = 6;
4350                                break;
4351                        default:
4352                                j->play_frame_size = 18;
4353                                break;
4354                        }
4355                        j->play_mode = 0;
4356                } else {
4357                        retval = 1;
4358                }
4359                break;
4360        case ULAW:
4361                switch (j->baseframe.low) {
4362                case 0xA0:
4363                        j->play_frame_size = 80;
4364                        break;
4365                case 0x50:
4366                        j->play_frame_size = 40;
4367                        break;
4368                default:
4369                        j->play_frame_size = 120;
4370                        break;
4371                }
4372                j->play_mode = 2;
4373                break;
4374        case ALAW:
4375                switch (j->baseframe.low) {
4376                case 0xA0:
4377                        j->play_frame_size = 80;
4378                        break;
4379                case 0x50:
4380                        j->play_frame_size = 40;
4381                        break;
4382                default:
4383                        j->play_frame_size = 120;
4384                        break;
4385                }
4386                j->play_mode = 2;
4387                break;
4388        case LINEAR16:
4389                switch (j->baseframe.low) {
4390                case 0xA0:
4391                        j->play_frame_size = 160;
4392                        break;
4393                case 0x50:
4394                        j->play_frame_size = 80;
4395                        break;
4396                default:
4397                        j->play_frame_size = 240;
4398                        break;
4399                }
4400                j->play_mode = 6;
4401                break;
4402        case LINEAR8:
4403                switch (j->baseframe.low) {
4404                case 0xA0:
4405                        j->play_frame_size = 80;
4406                        break;
4407                case 0x50:
4408                        j->play_frame_size = 40;
4409                        break;
4410                default:
4411                        j->play_frame_size = 120;
4412                        break;
4413                }
4414                j->play_mode = 4;
4415                break;
4416        case WSS:
4417                switch (j->baseframe.low) {
4418                case 0xA0:
4419                        j->play_frame_size = 80;
4420                        break;
4421                case 0x50:
4422                        j->play_frame_size = 40;
4423                        break;
4424                default:
4425                        j->play_frame_size = 120;
4426                        break;
4427                }
4428                j->play_mode = 5;
4429                break;
4430        default:
4431                kfree(j->write_buffer);
4432                j->play_frame_size = 0;
4433                j->play_mode = -1;
4434                j->write_buffer = NULL;
4435                j->write_buffer_size = 0;
4436                retval = 1;
4437                break;
4438        }
4439        return retval;
4440}
4441
4442static int ixj_play_start(IXJ *j)
4443{
4444        unsigned short cmd = 0x0000;
4445
4446        if (j->write_buffer) {
4447                ixj_play_stop(j);
4448        }
4449
4450        if(ixjdebug & 0x0002)
4451                printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4452
4453        j->flags.playing = 1;
4454        ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
4455
4456        j->flags.play_first_frame = 1;
4457        j->drybuffer = 0;
4458
4459        if (!j->play_mode) {
4460                switch (j->play_codec) {
4461                case G723_63:
4462                        cmd = 0x5231;
4463                        break;
4464                case G723_53:
4465                        cmd = 0x5232;
4466                        break;
4467                case TS85:
4468                        cmd = 0x5230;   /* TrueSpeech 8.5 */
4469
4470                        break;
4471                case TS48:
4472                        cmd = 0x5233;   /* TrueSpeech 4.8 */
4473
4474                        break;
4475                case TS41:
4476                        cmd = 0x5234;   /* TrueSpeech 4.1 */
4477
4478                        break;
4479                case G728:
4480                        cmd = 0x5235;
4481                        break;
4482                case G729:
4483                case G729B:
4484                        cmd = 0x5236;
4485                        break;
4486                default:
4487                        return 1;
4488                }
4489                if (ixj_WriteDSPCommand(cmd, j))
4490                        return -1;
4491        }
4492        j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
4493        if (!j->write_buffer) {
4494                printk("Write buffer allocation for ixj board %d failed!\n", j->board);
4495                return -ENOMEM;
4496        }
4497/*      j->write_buffers_empty = 2; */
4498        j->write_buffers_empty = 1; 
4499        j->write_buffer_size = j->play_frame_size * 2;
4500        j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
4501        j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
4502
4503        if (ixj_WriteDSPCommand(0x5202, j))             /* Set Poll sync mode */
4504
4505                return -1;
4506
4507        switch (j->play_mode) {
4508        case 0:
4509                cmd = 0x2C03;
4510                break;
4511        case 2:
4512                if (j->ver.low == 0x12) {
4513                        cmd = 0x2C23;
4514                } else {
4515                        cmd = 0x2C21;
4516                }
4517                break;
4518        case 4:
4519                if (j->ver.low == 0x12) {
4520                        cmd = 0x2C43;
4521                } else {
4522                        cmd = 0x2C41;
4523                }
4524                break;
4525        case 5:
4526                if (j->ver.low == 0x12) {
4527                        cmd = 0x2C53;
4528                } else {
4529                        cmd = 0x2C51;
4530                }
4531                break;
4532        case 6:
4533                if (j->ver.low == 0x12) {
4534                        cmd = 0x2C63;
4535                } else {
4536                        cmd = 0x2C61;
4537                }
4538                break;
4539        }
4540        if (ixj_WriteDSPCommand(cmd, j))
4541                return -1;
4542
4543        if (ixj_WriteDSPCommand(0x2000, j))             /* Playback C2 */
4544                return -1;
4545
4546        if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j))        /* Playback C3 */
4547                return -1;
4548
4549        if (j->flags.recording) {
4550                ixj_aec_start(j, j->aec_level);
4551        }
4552
4553        return 0;
4554}
4555
4556static void ixj_play_stop(IXJ *j)
4557{
4558        if (ixjdebug & 0x0002)
4559                printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4560
4561        kfree(j->write_buffer);
4562        j->write_buffer = NULL;
4563        j->write_buffer_size = 0;
4564        if (j->play_mode > -1) {
4565                ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers.  8022 reference page 9-40 */
4566
4567                j->play_mode = -1;
4568        }
4569        j->flags.playing = 0;
4570}
4571
4572static inline int get_play_level(IXJ *j)
4573{
4574        int retval;
4575
4576        ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
4577        return j->ssr.high << 8 | j->ssr.low;
4578        retval = j->ssr.high << 8 | j->ssr.low;
4579        retval = (retval * 256) / 240;
4580        return retval;
4581}
4582
4583static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
4584{
4585        unsigned int mask = 0;
4586
4587        IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
4588
4589        poll_wait(file_p, &(j->poll_q), wait);
4590        if (j->read_buffer_ready > 0)
4591                mask |= POLLIN | POLLRDNORM;    /* readable */
4592        if (j->write_buffers_empty > 0)
4593                mask |= POLLOUT | POLLWRNORM;   /* writable */
4594        if (j->ex.bytes)
4595                mask |= POLLPRI;
4596        return mask;
4597}
4598
4599static int ixj_play_tone(IXJ *j, char tone)
4600{
4601        if (!j->tone_state) {
4602                if(ixjdebug & 0x0002) {
4603                        printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
4604                }
4605                if (j->dsp.low == 0x20) {
4606                        idle(j);
4607                }
4608                j->tone_start_jif = jiffies;
4609
4610                j->tone_state = 1;
4611        }
4612
4613        j->tone_index = tone;
4614        if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
4615                return -1;
4616
4617        return 0;
4618}
4619
4620static int ixj_set_tone_on(unsigned short arg, IXJ *j)
4621{
4622        j->tone_on_time = arg;
4623
4624        if (ixj_WriteDSPCommand(0x6E04, j))             /* Set Tone On Period */
4625
4626                return -1;
4627
4628        if (ixj_WriteDSPCommand(arg, j))
4629                return -1;
4630
4631        return 0;
4632}
4633
4634static int SCI_WaitHighSCI(IXJ *j)
4635{
4636        int cnt;
4637
4638        j->pld_scrr.byte = inb_p(j->XILINXbase);
4639        if (!j->pld_scrr.bits.sci) {
4640                for (cnt = 0; cnt < 10; cnt++) {
4641                        udelay(32);
4642                        j->pld_scrr.byte = inb_p(j->XILINXbase);
4643
4644                        if ((j->pld_scrr.bits.sci))
4645                                return 1;
4646                }
4647                if (ixjdebug & 0x0001)
4648                        printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
4649                return 0;
4650        } else
4651                return 1;
4652}
4653
4654static int SCI_WaitLowSCI(IXJ *j)
4655{
4656        int cnt;
4657
4658        j->pld_scrr.byte = inb_p(j->XILINXbase);
4659        if (j->pld_scrr.bits.sci) {
4660                for (cnt = 0; cnt < 10; cnt++) {
4661                        udelay(32);
4662                        j->pld_scrr.byte = inb_p(j->XILINXbase);
4663
4664                        if (!(j->pld_scrr.bits.sci))
4665                                return 1;
4666                }
4667                if (ixjdebug & 0x0001)
4668                        printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
4669                return 0;
4670        } else
4671                return 1;
4672}
4673
4674static int SCI_Control(IXJ *j, int control)
4675{
4676        switch (control) {
4677        case SCI_End:
4678                j->pld_scrw.bits.c0 = 0;        /* Set PLD Serial control interface */
4679
4680                j->pld_scrw.bits.c1 = 0;        /* to no selection */
4681
4682                break;
4683        case SCI_Enable_DAA:
4684                j->pld_scrw.bits.c0 = 1;        /* Set PLD Serial control interface */
4685
4686                j->pld_scrw.bits.c1 = 0;        /* to write to DAA */
4687
4688                break;
4689        case SCI_Enable_Mixer:
4690                j->pld_scrw.bits.c0 = 0;        /* Set PLD Serial control interface */
4691
4692                j->pld_scrw.bits.c1 = 1;        /* to write to mixer */
4693
4694                break;
4695        case SCI_Enable_EEPROM:
4696                j->pld_scrw.bits.c0 = 1;        /* Set PLD Serial control interface */
4697
4698                j->pld_scrw.bits.c1 = 1;        /* to write to EEPROM */
4699
4700                break;
4701        default:
4702                return 0;
4703                break;
4704        }
4705        outb_p(j->pld_scrw.byte, j->XILINXbase);
4706
4707        switch (control) {
4708        case SCI_End:
4709                return 1;
4710                break;
4711        case SCI_Enable_DAA:
4712        case SCI_Enable_Mixer:
4713        case SCI_Enable_EEPROM:
4714                if (!SCI_WaitHighSCI(j))
4715                        return 0;
4716                break;
4717        default:
4718                return 0;
4719                break;
4720        }
4721        return 1;
4722}
4723
4724static int SCI_Prepare(IXJ *j)
4725{
4726        if (!SCI_Control(j, SCI_End))
4727                return 0;
4728
4729        if (!SCI_WaitLowSCI(j))
4730                return 0;
4731
4732        return 1;
4733}
4734
4735static int ixj_get_mixer(long val, IXJ *j)
4736{
4737        int reg = (val & 0x1F00) >> 8;
4738        return j->mix.vol[reg];
4739}
4740
4741static int ixj_mixer(long val, IXJ *j)
4742{
4743        BYTES bytes;
4744
4745        bytes.high = (val & 0x1F00) >> 8;
4746        bytes.low = val & 0x00FF;
4747
4748        /* save mixer value so we can get back later on */
4749        j->mix.vol[bytes.high] = bytes.low;
4750
4751        outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03);        /* Load Mixer Address */
4752
4753        outb_p(bytes.low, j->XILINXbase + 0x02);        /* Load Mixer Data */
4754
4755        SCI_Control(j, SCI_Enable_Mixer);
4756
4757        SCI_Control(j, SCI_End);
4758
4759        return 0;
4760}
4761
4762static int daa_load(BYTES * p_bytes, IXJ *j)
4763{
4764        outb_p(p_bytes->high, j->XILINXbase + 0x03);
4765        outb_p(p_bytes->low, j->XILINXbase + 0x02);
4766        if (!SCI_Control(j, SCI_Enable_DAA))
4767                return 0;
4768        else
4769                return 1;
4770}
4771
4772static int ixj_daa_cr4(IXJ *j, char reg)
4773{
4774        BYTES bytes;
4775
4776        switch (j->daa_mode) {
4777        case SOP_PU_SLEEP:
4778                bytes.high = 0x14;
4779                break;
4780        case SOP_PU_RINGING:
4781                bytes.high = 0x54;
4782                break;
4783        case SOP_PU_CONVERSATION:
4784                bytes.high = 0x94;
4785                break;
4786        case SOP_PU_PULSEDIALING:
4787                bytes.high = 0xD4;
4788                break;
4789        }
4790
4791        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
4792
4793        switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
4794        case 0:
4795                j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
4796                break;
4797        case 1:
4798                j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
4799                break;
4800        case 2:
4801                j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
4802                break;
4803        case 3:
4804                j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
4805                break;
4806        }
4807
4808        bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
4809
4810        if (!daa_load(&bytes, j))
4811                return 0;
4812
4813        if (!SCI_Prepare(j))
4814                return 0;
4815
4816        return 1;
4817}
4818
4819static char daa_int_read(IXJ *j)
4820{
4821        BYTES bytes;
4822
4823        if (!SCI_Prepare(j))
4824                return 0;
4825
4826        bytes.high = 0x38;
4827        bytes.low = 0x00;
4828        outb_p(bytes.high, j->XILINXbase + 0x03);
4829        outb_p(bytes.low, j->XILINXbase + 0x02);
4830
4831        if (!SCI_Control(j, SCI_Enable_DAA))
4832                return 0;
4833
4834        bytes.high = inb_p(j->XILINXbase + 0x03);
4835        bytes.low = inb_p(j->XILINXbase + 0x02);
4836        if (bytes.low != ALISDAA_ID_BYTE) {
4837                if (ixjdebug & 0x0001)
4838                        printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4839                return 0;
4840        }
4841        if (!SCI_Control(j, SCI_Enable_DAA))
4842                return 0;
4843        if (!SCI_Control(j, SCI_End))
4844                return 0;
4845
4846        bytes.high = inb_p(j->XILINXbase + 0x03);
4847        bytes.low = inb_p(j->XILINXbase + 0x02);
4848
4849        j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
4850
4851        return 1;
4852}
4853
4854static char daa_CR_read(IXJ *j, int cr)
4855{
4856        IXJ_WORD wdata;
4857        BYTES bytes;
4858
4859        if (!SCI_Prepare(j))
4860                return 0;
4861
4862        switch (j->daa_mode) {
4863        case SOP_PU_SLEEP:
4864                bytes.high = 0x30 + cr;
4865                break;
4866        case SOP_PU_RINGING:
4867                bytes.high = 0x70 + cr;
4868                break;
4869        case SOP_PU_CONVERSATION:
4870                bytes.high = 0xB0 + cr;
4871                break;
4872        case SOP_PU_PULSEDIALING:
4873        default:
4874                bytes.high = 0xF0 + cr;
4875                break;
4876        }
4877
4878        bytes.low = 0x00;
4879
4880        outb_p(bytes.high, j->XILINXbase + 0x03);
4881        outb_p(bytes.low, j->XILINXbase + 0x02);
4882
4883        if (!SCI_Control(j, SCI_Enable_DAA))
4884                return 0;
4885
4886        bytes.high = inb_p(j->XILINXbase + 0x03);
4887        bytes.low = inb_p(j->XILINXbase + 0x02);
4888        if (bytes.low != ALISDAA_ID_BYTE) {
4889                if (ixjdebug & 0x0001)
4890                        printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4891                return 0;
4892        }
4893        if (!SCI_Control(j, SCI_Enable_DAA))
4894                return 0;
4895        if (!SCI_Control(j, SCI_End))
4896                return 0;
4897
4898        wdata.word = inw_p(j->XILINXbase + 0x02);
4899
4900        switch(cr){
4901                case 5:
4902                        j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
4903                        break;
4904                case 4:
4905                        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
4906                        break;
4907                case 3:
4908                        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
4909                        break;
4910                case 2:
4911                        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
4912                        break;
4913                case 1:
4914                        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
4915                        break;
4916                case 0:
4917                        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
4918                        break;
4919                default:
4920                        return 0;
4921        }
4922        return 1;
4923}
4924
4925static int ixj_daa_cid_reset(IXJ *j)
4926{
4927        int i;
4928        BYTES bytes;
4929
4930        if (ixjdebug & 0x0002)
4931                printk("DAA Clearing CID ram\n");
4932
4933        if (!SCI_Prepare(j))
4934                return 0;
4935
4936        bytes.high = 0x58;
4937        bytes.low = 0x00;
4938        outb_p(bytes.high, j->XILINXbase + 0x03);
4939        outb_p(bytes.low, j->XILINXbase + 0x02);
4940
4941        if (!SCI_Control(j, SCI_Enable_DAA))
4942                return 0;
4943
4944        if (!SCI_WaitHighSCI(j))
4945                return 0;
4946
4947        for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
4948                bytes.high = bytes.low = 0x00;
4949                outb_p(bytes.high, j->XILINXbase + 0x03);
4950
4951                if (i < ALISDAA_CALLERID_SIZE - 1)
4952                        outb_p(bytes.low, j->XILINXbase + 0x02);
4953
4954                if (!SCI_Control(j, SCI_Enable_DAA))
4955                        return 0;
4956
4957                if (!SCI_WaitHighSCI(j))
4958                        return 0;
4959
4960        }
4961
4962        if (!SCI_Control(j, SCI_End))
4963                return 0;
4964
4965        if (ixjdebug & 0x0002)
4966                printk("DAA CID ram cleared\n");
4967
4968        return 1;
4969}
4970
4971static int ixj_daa_cid_read(IXJ *j)
4972{
4973        int i;
4974        BYTES bytes;
4975        char CID[ALISDAA_CALLERID_SIZE];
4976        bool mContinue;
4977        char *pIn, *pOut;
4978
4979        if (!SCI_Prepare(j))
4980                return 0;
4981
4982        bytes.high = 0x78;
4983        bytes.low = 0x00;
4984        outb_p(bytes.high, j->XILINXbase + 0x03);
4985        outb_p(bytes.low, j->XILINXbase + 0x02);
4986
4987        if (!SCI_Control(j, SCI_Enable_DAA))
4988                return 0;
4989
4990        if (!SCI_WaitHighSCI(j))
4991                return 0;
4992
4993        bytes.high = inb_p(j->XILINXbase + 0x03);
4994        bytes.low = inb_p(j->XILINXbase + 0x02);
4995        if (bytes.low != ALISDAA_ID_BYTE) {
4996                if (ixjdebug & 0x0001)
4997                        printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4998                return 0;
4999        }
5000        for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
5001                bytes.high = bytes.low = 0x00;
5002                outb_p(bytes.high, j->XILINXbase + 0x03);
5003                outb_p(bytes.low, j->XILINXbase + 0x02);
5004
5005                if (!SCI_Control(j, SCI_Enable_DAA))
5006                        return 0;
5007
5008                if (!SCI_WaitHighSCI(j))
5009                        return 0;
5010
5011                CID[i + 0] = inb_p(j->XILINXbase + 0x03);
5012                CID[i + 1] = inb_p(j->XILINXbase + 0x02);
5013        }
5014
5015        if (!SCI_Control(j, SCI_End))
5016                return 0;
5017
5018        pIn = CID;
5019        pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5020        mContinue = true;
5021        while (mContinue) {
5022                if ((pIn[1] & 0x03) == 0x01) {
5023                        pOut[0] = pIn[0];
5024                }
5025                if ((pIn[2] & 0x0c) == 0x04) {
5026                        pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
5027                }
5028                if ((pIn[3] & 0x30) == 0x10) {
5029                        pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
5030                }
5031                if ((pIn[4] & 0xc0) == 0x40) {
5032                        pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
5033                } else {
5034                        mContinue = false;
5035                }
5036                pIn += 5, pOut += 4;
5037        }
5038        memset(&j->cid, 0, sizeof(PHONE_CID));
5039        pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5040        pOut += 4;
5041        strncpy(j->cid.month, pOut, 2);
5042        pOut += 2;
5043        strncpy(j->cid.day, pOut, 2);
5044        pOut += 2;
5045        strncpy(j->cid.hour, pOut, 2);
5046        pOut += 2;
5047        strncpy(j->cid.min, pOut, 2);
5048        pOut += 3;
5049        j->cid.numlen = *pOut;
5050        pOut += 1;
5051        strncpy(j->cid.number, pOut, j->cid.numlen);
5052        pOut += j->cid.numlen + 1;
5053        j->cid.namelen = *pOut;
5054        pOut += 1;
5055        strncpy(j->cid.name, pOut, j->cid.namelen);
5056
5057        ixj_daa_cid_reset(j);
5058        return 1;
5059}
5060
5061static char daa_get_version(IXJ *j)
5062{
5063        BYTES bytes;
5064
5065        if (!SCI_Prepare(j))
5066                return 0;
5067
5068        bytes.high = 0x35;
5069        bytes.low = 0x00;
5070        outb_p(bytes.high, j->XILINXbase + 0x03);
5071        outb_p(bytes.low, j->XILINXbase + 0x02);
5072
5073        if (!SCI_Control(j, SCI_Enable_DAA))
5074                return 0;
5075
5076        bytes.high = inb_p(j->XILINXbase + 0x03);
5077        bytes.low = inb_p(j->XILINXbase + 0x02);
5078        if (bytes.low != ALISDAA_ID_BYTE) {
5079                if (ixjdebug & 0x0001)
5080                        printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5081                return 0;
5082        }
5083        if (!SCI_Control(j, SCI_Enable_DAA))
5084                return 0;
5085
5086        if (!SCI_Control(j, SCI_End))
5087                return 0;
5088
5089        bytes.high = inb_p(j->XILINXbase + 0x03);
5090        bytes.low = inb_p(j->XILINXbase + 0x02);
5091        if (ixjdebug & 0x0002)
5092                printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
5093        j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
5094        return bytes.high;
5095}
5096
5097static int daa_set_mode(IXJ *j, int mode)
5098{
5099        /* NOTE:
5100              The DAA *MUST* be in the conversation mode if the
5101              PSTN line is to be seized (PSTN line off-hook).
5102              Taking the PSTN line off-hook while the DAA is in
5103              a mode other than conversation mode will cause a
5104              hardware failure of the ALIS-A part.
5105
5106           NOTE:
5107              The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5108              if the PSTN line is on-hook.  Failure to have the PSTN line
5109              in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5110              ALIS-A part.
5111        */
5112
5113        BYTES bytes;
5114
5115        j->flags.pstn_rmr = 0;
5116
5117        if (!SCI_Prepare(j))
5118                return 0;
5119
5120        switch (mode) {
5121        case SOP_PU_RESET:
5122                j->pld_scrw.bits.daafsyncen = 0;        /* Turn off DAA Frame Sync */
5123
5124                outb_p(j->pld_scrw.byte, j->XILINXbase);
5125                j->pld_slicw.bits.rly2 = 0;
5126                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5127                bytes.high = 0x10;
5128                bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5129                daa_load(&bytes, j);
5130                if (!SCI_Prepare(j))
5131                        return 0;
5132
5133                j->daa_mode = SOP_PU_SLEEP;
5134                break;
5135        case SOP_PU_SLEEP:
5136                if(j->daa_mode == SOP_PU_SLEEP)
5137                {
5138                        break;
5139                }
5140                if (ixjdebug & 0x0008)
5141                        printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
5142/*              if(j->daa_mode == SOP_PU_CONVERSATION) */
5143                {
5144                        j->pld_scrw.bits.daafsyncen = 0;        /* Turn off DAA Frame Sync */
5145
5146                        outb_p(j->pld_scrw.byte, j->XILINXbase);
5147                        j->pld_slicw.bits.rly2 = 0;
5148                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5149                        bytes.high = 0x10;
5150                        bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5151                        daa_load(&bytes, j);
5152                        if (!SCI_Prepare(j))
5153                                return 0;
5154                }
5155                j->pld_scrw.bits.daafsyncen = 0;        /* Turn off DAA Frame Sync */
5156
5157                outb_p(j->pld_scrw.byte, j->XILINXbase);
5158                j->pld_slicw.bits.rly2 = 0;
5159                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5160                bytes.high = 0x10;
5161                bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5162                daa_load(&bytes, j);
5163                if (!SCI_Prepare(j))
5164                        return 0;
5165
5166                j->daa_mode = SOP_PU_SLEEP;
5167                j->flags.pstn_ringing = 0;
5168                j->ex.bits.pstn_ring = 0;
5169                j->pstn_sleeptil = jiffies + (hertz / 4);
5170                wake_up_interruptible(&j->read_q);      /* Wake any blocked readers */
5171                wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
5172                wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
5173                break;
5174        case SOP_PU_RINGING:
5175                if (ixjdebug & 0x0008)
5176                        printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
5177                j->pld_scrw.bits.daafsyncen = 0;        /* Turn off DAA Frame Sync */
5178
5179                outb_p(j->pld_scrw.byte, j->XILINXbase);
5180                j->pld_slicw.bits.rly2 = 0;
5181                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5182                bytes.high = 0x50;
5183                bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5184                daa_load(&bytes, j);
5185                if (!SCI_Prepare(j))
5186                        return 0;
5187                j->daa_mode = SOP_PU_RINGING;
5188                break;
5189        case SOP_PU_CONVERSATION:
5190                if (ixjdebug & 0x0008)
5191                        printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
5192                bytes.high = 0x90;
5193                bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5194                daa_load(&bytes, j);
5195                if (!SCI_Prepare(j))
5196                        return 0;
5197                j->pld_slicw.bits.rly2 = 1;
5198                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5199                j->pld_scrw.bits.daafsyncen = 1;        /* Turn on DAA Frame Sync */
5200
5201                outb_p(j->pld_scrw.byte, j->XILINXbase);
5202                j->daa_mode = SOP_PU_CONVERSATION;
5203                j->flags.pstn_ringing = 0;
5204                j->ex.bits.pstn_ring = 0;
5205                j->pstn_sleeptil = jiffies;
5206                j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
5207                break;
5208        case SOP_PU_PULSEDIALING:
5209                if (ixjdebug & 0x0008)
5210                        printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
5211                j->pld_scrw.bits.daafsyncen = 0;        /* Turn off DAA Frame Sync */
5212
5213                outb_p(j->pld_scrw.byte, j->XILINXbase);
5214                j->pld_slicw.bits.rly2 = 0;
5215                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5216                bytes.high = 0xD0;
5217                bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5218                daa_load(&bytes, j);
5219                if (!SCI_Prepare(j))
5220                        return 0;
5221                j->daa_mode = SOP_PU_PULSEDIALING;
5222                break;
5223        default:
5224                break;
5225        }
5226        return 1;
5227}
5228
5229static int ixj_daa_write(IXJ *j)
5230{
5231        BYTES bytes;
5232
5233        j->flags.pstncheck = 1;
5234
5235        daa_set_mode(j, SOP_PU_SLEEP);
5236
5237        if (!SCI_Prepare(j))
5238                return 0;
5239
5240        outb_p(j->pld_scrw.byte, j->XILINXbase);
5241
5242        bytes.high = 0x14;
5243        bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
5244        if (!daa_load(&bytes, j))
5245                return 0;
5246
5247        bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
5248        bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
5249        if (!daa_load(&bytes, j))
5250                return 0;
5251
5252        bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
5253        bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5254        if (!daa_load(&bytes, j))
5255                return 0;
5256
5257        if (!SCI_Prepare(j))
5258                return 0;
5259
5260        bytes.high = 0x1F;
5261        bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
5262        if (!daa_load(&bytes, j))
5263                return 0;
5264
5265        bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
5266        bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
5267        if (!daa_load(&bytes, j))
5268                return 0;
5269
5270        bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
5271        bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
5272        if (!daa_load(&bytes, j))
5273                return 0;
5274
5275        bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
5276        bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
5277        if (!daa_load(&bytes, j))
5278                return 0;
5279
5280        bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
5281        bytes.low = 0x00;
5282        if (!daa_load(&bytes, j))
5283                return 0;
5284
5285        if (!SCI_Prepare(j))
5286                return 0;
5287
5288        bytes.high = 0x00;
5289        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
5290        if (!daa_load(&bytes, j))
5291                return 0;
5292
5293        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
5294        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
5295        if (!daa_load(&bytes, j))
5296                return 0;
5297
5298        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
5299        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
5300        if (!daa_load(&bytes, j))
5301                return 0;
5302
5303        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
5304        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
5305        if (!daa_load(&bytes, j))
5306                return 0;
5307
5308        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
5309        bytes.low = 0x00;
5310        if (!daa_load(&bytes, j))
5311                return 0;
5312
5313        if (!SCI_Control(j, SCI_End))
5314                return 0;
5315        if (!SCI_WaitLowSCI(j))
5316                return 0;
5317
5318        bytes.high = 0x01;
5319        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
5320        if (!daa_load(&bytes, j))
5321                return 0;
5322
5323        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
5324        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
5325        if (!daa_load(&bytes, j))
5326                return 0;
5327
5328        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
5329        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
5330        if (!daa_load(&bytes, j))
5331                return 0;
5332
5333        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
5334        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
5335        if (!daa_load(&bytes, j))
5336                return 0;
5337
5338        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
5339        bytes.low = 0x00;
5340        if (!daa_load(&bytes, j))
5341                return 0;
5342
5343        if (!SCI_Control(j, SCI_End))
5344                return 0;
5345        if (!SCI_WaitLowSCI(j))
5346                return 0;
5347
5348        bytes.high = 0x02;
5349        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
5350        if (!daa_load(&bytes, j))
5351                return 0;
5352
5353        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
5354        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
5355        if (!daa_load(&bytes, j))
5356                return 0;
5357
5358        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
5359        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
5360        if (!daa_load(&bytes, j))
5361                return 0;
5362
5363        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
5364        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
5365        if (!daa_load(&bytes, j))
5366                return 0;
5367
5368        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
5369        bytes.low = 0x00;
5370        if (!daa_load(&bytes, j))
5371                return 0;
5372
5373        if (!SCI_Control(j, SCI_End))
5374                return 0;
5375        if (!SCI_WaitLowSCI(j))
5376                return 0;
5377
5378        bytes.high = 0x03;
5379        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
5380        if (!daa_load(&bytes, j))
5381                return 0;
5382
5383        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
5384        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
5385        if (!daa_load(&bytes, j))
5386                return 0;
5387
5388        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
5389        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
5390        if (!daa_load(&bytes, j))
5391                return 0;
5392
5393        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
5394        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
5395        if (!daa_load(&bytes, j))
5396                return 0;
5397
5398        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
5399        bytes.low = 0x00;
5400        if (!daa_load(&bytes, j))
5401                return 0;
5402
5403        if (!SCI_Control(j, SCI_End))
5404                return 0;
5405        if (!SCI_WaitLowSCI(j))
5406                return 0;
5407
5408        bytes.high = 0x04;
5409        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
5410        if (!daa_load(&bytes, j))
5411                return 0;
5412
5413        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
5414        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
5415        if (!daa_load(&bytes, j))
5416                return 0;
5417
5418        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
5419        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
5420        if (!daa_load(&bytes, j))
5421                return 0;
5422
5423        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
5424        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
5425        if (!daa_load(&bytes, j))
5426                return 0;
5427
5428        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
5429        bytes.low = 0x00;
5430        if (!daa_load(&bytes, j))
5431                return 0;
5432
5433        if (!SCI_Control(j, SCI_End))
5434                return 0;
5435        if (!SCI_WaitLowSCI(j))
5436                return 0;
5437
5438        bytes.high = 0x05;
5439        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
5440        if (!daa_load(&bytes, j))
5441                return 0;
5442
5443        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
5444        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
5445        if (!daa_load(&bytes, j))
5446                return 0;
5447
5448        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
5449        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
5450        if (!daa_load(&bytes, j))
5451                return 0;
5452
5453        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
5454        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
5455        if (!daa_load(&bytes, j))
5456                return 0;
5457
5458        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
5459        bytes.low = 0x00;
5460        if (!daa_load(&bytes, j))
5461                return 0;
5462
5463        if (!SCI_Control(j, SCI_End))
5464                return 0;
5465        if (!SCI_WaitLowSCI(j))
5466                return 0;
5467
5468        bytes.high = 0x06;
5469        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
5470        if (!daa_load(&bytes, j))
5471                return 0;
5472
5473        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
5474        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
5475        if (!daa_load(&bytes, j))
5476                return 0;
5477
5478        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
5479        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
5480        if (!daa_load(&bytes, j))
5481                return 0;
5482
5483        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
5484        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
5485        if (!daa_load(&bytes, j))
5486                return 0;
5487
5488        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
5489        bytes.low = 0x00;
5490        if (!daa_load(&bytes, j))
5491                return 0;
5492
5493        if (!SCI_Control(j, SCI_End))
5494                return 0;
5495        if (!SCI_WaitLowSCI(j))
5496                return 0;
5497
5498        bytes.high = 0x07;
5499        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
5500        if (!daa_load(&bytes, j))
5501                return 0;
5502
5503        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
5504        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
5505        if (!daa_load(&bytes, j))
5506                return 0;
5507
5508        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
5509        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
5510        if (!daa_load(&bytes, j))
5511                return 0;
5512
5513        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
5514        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
5515        if (!daa_load(&bytes, j))
5516                return 0;
5517
5518        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
5519        bytes.low = 0x00;
5520        if (!daa_load(&bytes, j))
5521                return 0;
5522
5523        if (!SCI_Control(j, SCI_End))
5524                return 0;
5525        if (!SCI_WaitLowSCI(j))
5526                return 0;
5527
5528        bytes.high = 0x08;
5529        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
5530        if (!daa_load(&bytes, j))
5531                return 0;
5532
5533        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
5534        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
5535        if (!daa_load(&bytes, j))
5536                return 0;
5537
5538        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
5539        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
5540        if (!daa_load(&bytes, j))
5541                return 0;
5542
5543        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
5544        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
5545        if (!daa_load(&bytes, j))
5546                return 0;
5547
5548        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
5549        bytes.low = 0x00;
5550        if (!daa_load(&bytes, j))
5551                return 0;
5552
5553        if (!SCI_Control(j, SCI_End))
5554                return 0;
5555        if (!SCI_WaitLowSCI(j))
5556                return 0;
5557
5558        bytes.high = 0x09;
5559        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
5560        if (!daa_load(&bytes, j))
5561                return 0;
5562
5563        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
5564        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
5565        if (!daa_load(&bytes, j))
5566                return 0;
5567
5568        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
5569        bytes.low = 0x00;
5570        if (!daa_load(&bytes, j))
5571                return 0;
5572
5573        if (!SCI_Control(j, SCI_End))
5574                return 0;
5575        if (!SCI_WaitLowSCI(j))
5576                return 0;
5577
5578        bytes.high = 0x0A;
5579        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
5580        if (!daa_load(&bytes, j))
5581                return 0;
5582
5583        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
5584        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
5585        if (!daa_load(&bytes, j))
5586                return 0;
5587
5588        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
5589        bytes.low = 0x00;
5590        if (!daa_load(&bytes, j))
5591                return 0;
5592
5593        if (!SCI_Control(j, SCI_End))
5594                return 0;
5595        if (!SCI_WaitLowSCI(j))
5596                return 0;
5597
5598        bytes.high = 0x0B;
5599        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
5600        if (!daa_load(&bytes, j))
5601                return 0;
5602
5603        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
5604        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
5605        if (!daa_load(&bytes, j))
5606                return 0;
5607
5608        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
5609        bytes.low = 0x00;
5610        if (!daa_load(&bytes, j))
5611                return 0;
5612
5613        if (!SCI_Control(j, SCI_End))
5614                return 0;
5615        if (!SCI_WaitLowSCI(j))
5616                return 0;
5617
5618        bytes.high = 0x0C;
5619        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
5620        if (!daa_load(&bytes, j))
5621                return 0;
5622
5623        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
5624        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
5625        if (!daa_load(&bytes, j))
5626                return 0;
5627
5628        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
5629        bytes.low = 0x00;
5630        if (!daa_load(&bytes, j))
5631                return 0;
5632
5633        if (!SCI_Control(j, SCI_End))
5634                return 0;
5635        if (!SCI_WaitLowSCI(j))
5636                return 0;
5637
5638        bytes.high = 0x0D;
5639        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
5640        if (!daa_load(&bytes, j))
5641                return 0;
5642
5643        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
5644        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
5645        if (!daa_load(&bytes, j))
5646                return 0;
5647
5648        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
5649        bytes.low = 0x00;
5650        if (!daa_load(&bytes, j))
5651                return 0;
5652
5653        if (!SCI_Control(j, SCI_End))
5654                return 0;
5655        if (!SCI_WaitLowSCI(j))
5656                return 0;
5657
5658        bytes.high = 0x0E;
5659        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
5660        if (!daa_load(&bytes, j))
5661                return 0;
5662
5663        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
5664        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
5665        if (!daa_load(&bytes, j))
5666                return 0;
5667
5668        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
5669        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
5670        if (!daa_load(&bytes, j))
5671                return 0;
5672
5673        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
5674        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
5675        if (!daa_load(&bytes, j))
5676                return 0;
5677
5678        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
5679        bytes.low = 0x00;
5680        if (!daa_load(&bytes, j))
5681                return 0;
5682
5683        if (!SCI_Control(j, SCI_End))
5684                return 0;
5685        if (!SCI_WaitLowSCI(j))
5686                return 0;
5687
5688        bytes.high = 0x0F;
5689        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
5690        if (!daa_load(&bytes, j))
5691                return 0;
5692
5693        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
5694        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
5695        if (!daa_load(&bytes, j))
5696                return 0;
5697
5698        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
5699        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
5700        if (!daa_load(&bytes, j))
5701                return 0;
5702
5703        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
5704        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
5705        if (!daa_load(&bytes, j))
5706                return 0;
5707
5708        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
5709        bytes.low = 0x00;
5710        if (!daa_load(&bytes, j))
5711                return 0;
5712
5713        udelay(32);
5714        j->pld_scrr.byte = inb_p(j->XILINXbase);
5715        if (!SCI_Control(j, SCI_End))
5716                return 0;
5717
5718        outb_p(j->pld_scrw.byte, j->XILINXbase);
5719
5720        if (ixjdebug & 0x0002)
5721                printk("DAA Coefficients Loaded\n");
5722
5723        j->flags.pstncheck = 0;
5724        return 1;
5725}
5726
5727static int ixj_set_tone_off(unsigned short arg, IXJ *j)
5728{
5729        j->tone_off_time = arg;
5730        if (ixj_WriteDSPCommand(0x6E05, j))             /* Set Tone Off Period */
5731
5732                return -1;
5733        if (ixj_WriteDSPCommand(arg, j))
5734                return -1;
5735        return 0;
5736}
5737
5738static int ixj_get_tone_on(IXJ *j)
5739{
5740        if (ixj_WriteDSPCommand(0x6E06, j))             /* Get Tone On Period */
5741
5742                return -1;
5743        return 0;
5744}
5745
5746static int ixj_get_tone_off(IXJ *j)
5747{
5748        if (ixj_WriteDSPCommand(0x6E07, j))             /* Get Tone Off Period */
5749
5750                return -1;
5751        return 0;
5752}
5753
5754static void ixj_busytone(IXJ *j)
5755{
5756        j->flags.ringback = 0;
5757        j->flags.dialtone = 0;
5758        j->flags.busytone = 1;
5759        ixj_set_tone_on(0x07D0, j);
5760        ixj_set_tone_off(0x07D0, j);
5761        ixj_play_tone(j, 27);
5762}
5763
5764static void ixj_dialtone(IXJ *j)
5765{
5766        j->flags.ringback = 0;
5767        j->flags.dialtone = 1;
5768        j->flags.busytone = 0;
5769        if (j->dsp.low == 0x20) {
5770                return;
5771        } else {
5772                ixj_set_tone_on(0xFFFF, j);
5773                ixj_set_tone_off(0x0000, j);
5774                ixj_play_tone(j, 25);
5775        }
5776}
5777
5778static void ixj_cpt_stop(IXJ *j)
5779{
5780        if(j->tone_state || j->tone_cadence_state)
5781        {
5782                j->flags.dialtone = 0;
5783                j->flags.busytone = 0;
5784                j->flags.ringback = 0;
5785                ixj_set_tone_on(0x0001, j);
5786                ixj_set_tone_off(0x0000, j);
5787                ixj_play_tone(j, 0);
5788                j->tone_state = j->tone_cadence_state = 0;
5789                if (j->cadence_t) {
5790                        kfree(j->cadence_t->ce);
5791                        kfree(j->cadence_t);
5792                        j->cadence_t = NULL;
5793                }
5794        }
5795        if (j->play_mode == -1 && j->rec_mode == -1)
5796                idle(j);
5797        if (j->play_mode != -1 && j->dsp.low == 0x20)
5798                ixj_play_start(j);
5799        if (j->rec_mode != -1 && j->dsp.low == 0x20)
5800                ixj_record_start(j);
5801}
5802
5803static void ixj_ringback(IXJ *j)
5804{
5805        j->flags.busytone = 0;
5806        j->flags.dialtone = 0;
5807        j->flags.ringback = 1;
5808        ixj_set_tone_on(0x0FA0, j);
5809        ixj_set_tone_off(0x2EE0, j);
5810        ixj_play_tone(j, 26);
5811}
5812
5813static void ixj_testram(IXJ *j)
5814{
5815        ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
5816}
5817
5818static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
5819{
5820        ixj_cadence *lcp;
5821        IXJ_CADENCE_ELEMENT __user *cep;
5822        IXJ_CADENCE_ELEMENT *lcep;
5823        IXJ_TONE ti;
5824        int err;
5825
5826        lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
5827        if (lcp == NULL)
5828                return -ENOMEM;
5829
5830        err = -EFAULT;
5831        if (copy_from_user(&lcp->elements_used,
5832                           &cp->elements_used, sizeof(int)))
5833                goto out;
5834        if (copy_from_user(&lcp->termination,
5835                           &cp->termination, sizeof(IXJ_CADENCE_TERM)))
5836                goto out;
5837        if (get_user(cep, &cp->ce))
5838                goto out;
5839
5840        err = -EINVAL;
5841        if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
5842                goto out;
5843
5844        err = -ENOMEM;
5845        lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
5846        if (!lcep)
5847                goto out;
5848
5849        err = -EFAULT;
5850        if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
5851                goto out1;
5852
5853        if (j->cadence_t) {
5854                kfree(j->cadence_t->ce);
5855                kfree(j->cadence_t);
5856        }
5857        lcp->ce = (void *) lcep;
5858        j->cadence_t = lcp;
5859        j->tone_cadence_state = 0;
5860        ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
5861        ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
5862        if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
5863                ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
5864                ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
5865                ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
5866                ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
5867                ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
5868                ixj_init_tone(j, &ti);
5869        }
5870        ixj_play_tone(j, lcp->ce[0].index);
5871        return 1;
5872out1:
5873        kfree(lcep);
5874out:
5875        kfree(lcp);
5876        return err;
5877}
5878
5879static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
5880{
5881        IXJ_FILTER_CADENCE *lcp;
5882        lcp = memdup_user(cp, sizeof(IXJ_FILTER_CADENCE));
5883        if (IS_ERR(lcp)) {
5884                if(ixjdebug & 0x0001) {
5885                        printk(KERN_INFO "Could not allocate memory for cadence or could not copy cadence to kernel\n");
5886                }
5887                return PTR_ERR(lcp);
5888        }
5889        if (lcp->filter > 5) {
5890                if(ixjdebug & 0x0001) {
5891                        printk(KERN_INFO "Cadence out of range\n");
5892                }
5893                kfree(lcp);
5894                return -1;
5895        }
5896        j->cadence_f[lcp->filter].state = 0;
5897        j->cadence_f[lcp->filter].enable = lcp->enable;
5898        j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
5899        j->cadence_f[lcp->filter].on1 = lcp->on1;
5900        j->cadence_f[lcp->filter].on1min = 0;
5901        j->cadence_f[lcp->filter].on1max = 0;
5902        j->cadence_f[lcp->filter].off1 = lcp->off1;
5903        j->cadence_f[lcp->filter].off1min = 0;
5904        j->cadence_f[lcp->filter].off1max = 0;
5905        j->cadence_f[lcp->filter].on2 = lcp->on2;
5906        j->cadence_f[lcp->filter].on2min = 0;
5907        j->cadence_f[lcp->filter].on2max = 0;
5908        j->cadence_f[lcp->filter].off2 = lcp->off2;
5909        j->cadence_f[lcp->filter].off2min = 0;
5910        j->cadence_f[lcp->filter].off2max = 0;
5911        j->cadence_f[lcp->filter].on3 = lcp->on3;
5912        j->cadence_f[lcp->filter].on3min = 0;
5913        j->cadence_f[lcp->filter].on3max = 0;
5914        j->cadence_f[lcp->filter].off3 = lcp->off3;
5915        j->cadence_f[lcp->filter].off3min = 0;
5916        j->cadence_f[lcp->filter].off3max = 0;
5917        if(ixjdebug & 0x0002) {
5918                printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
5919        }
5920        kfree(lcp);
5921        return 0;
5922}
5923
5924static void add_caps(IXJ *j)
5925{
5926        j->caps = 0;
5927        j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
5928        strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
5929        j->caplist[j->caps].captype = vendor;
5930        j->caplist[j->caps].handle = j->caps++;
5931        j->caplist[j->caps].captype = device;
5932        switch (j->cardtype) {
5933        case QTI_PHONEJACK:
5934                strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
5935                break;
5936        case QTI_LINEJACK:
5937                strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
5938                break;
5939        case QTI_PHONEJACK_LITE:
5940                strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
5941                break;
5942        case QTI_PHONEJACK_PCI:
5943                strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
5944                break;
5945        case QTI_PHONECARD:
5946                strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
5947                break;
5948        }
5949        j->caplist[j->caps].cap = j->cardtype;
5950        j->caplist[j->caps].handle = j->caps++;
5951        strcpy(j->caplist[j->caps].desc, "POTS");
5952        j->caplist[j->caps].captype = port;
5953        j->caplist[j->caps].cap = pots;
5954        j->caplist[j->caps].handle = j->caps++;
5955
5956        /* add devices that can do speaker/mic */
5957        switch (j->cardtype) {
5958        case QTI_PHONEJACK:
5959        case QTI_LINEJACK:
5960        case QTI_PHONEJACK_PCI:
5961        case QTI_PHONECARD:
5962                strcpy(j->caplist[j->caps].desc, "SPEAKER");
5963                j->caplist[j->caps].captype = port;
5964                j->caplist[j->caps].cap = speaker;
5965                j->caplist[j->caps].handle = j->caps++;
5966        default:
5967                break;
5968        }
5969
5970        /* add devices that can do handset */
5971        switch (j->cardtype) {
5972        case QTI_PHONEJACK:
5973                strcpy(j->caplist[j->caps].desc, "HANDSET");
5974                j->caplist[j->caps].captype = port;
5975                j->caplist[j->caps].cap = handset;
5976                j->caplist[j->caps].handle = j->caps++;
5977                break;
5978        default:
5979                break;
5980        }
5981
5982        /* add devices that can do PSTN */
5983        switch (j->cardtype) {
5984        case QTI_LINEJACK:
5985                strcpy(j->caplist[j->caps].desc, "PSTN");
5986                j->caplist[j->caps].captype = port;
5987                j->caplist[j->caps].cap = pstn;
5988                j->caplist[j->caps].handle = j->caps++;
5989                break;
5990        default:
5991                break;
5992        }
5993
5994        /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
5995        strcpy(j->caplist[j->caps].desc, "ULAW");
5996        j->caplist[j->caps].captype = codec;
5997        j->caplist[j->caps].cap = ULAW;
5998        j->caplist[j->caps].handle = j->caps++;
5999
6000        strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
6001        j->caplist[j->caps].captype = codec;
6002        j->caplist[j->caps].cap = LINEAR16;
6003        j->caplist[j->caps].handle = j->caps++;
6004
6005        strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
6006        j->caplist[j->caps].captype = codec;
6007        j->caplist[j->caps].cap = LINEAR8;
6008        j->caplist[j->caps].handle = j->caps++;
6009
6010        strcpy(j->caplist[j->caps].desc, "Windows Sound System");
6011        j->caplist[j->caps].captype = codec;
6012        j->caplist[j->caps].cap = WSS;
6013        j->caplist[j->caps].handle = j->caps++;
6014
6015        /* software ALAW codec, made from ULAW */
6016        strcpy(j->caplist[j->caps].desc, "ALAW");
6017        j->caplist[j->caps].captype = codec;
6018        j->caplist[j->caps].cap = ALAW;
6019        j->caplist[j->caps].handle = j->caps++;
6020
6021        /* version 12 of the 8020 does the following codecs in a broken way */
6022        if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
6023                strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
6024                j->caplist[j->caps].captype = codec;
6025                j->caplist[j->caps].cap = G723_63;
6026                j->caplist[j->caps].handle = j->caps++;
6027
6028                strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
6029                j->caplist[j->caps].captype = codec;
6030                j->caplist[j->caps].cap = G723_53;
6031                j->caplist[j->caps].handle = j->caps++;
6032
6033                strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
6034                j->caplist[j->caps].captype = codec;
6035                j->caplist[j->caps].cap = TS48;
6036                j->caplist[j->caps].handle = j->caps++;
6037
6038                strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
6039                j->caplist[j->caps].captype = codec;
6040                j->caplist[j->caps].cap = TS41;
6041                j->caplist[j->caps].handle = j->caps++;
6042        }
6043
6044        /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6045        if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
6046                strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
6047                j->caplist[j->caps].captype = codec;
6048                j->caplist[j->caps].cap = TS85;
6049                j->caplist[j->caps].handle = j->caps++;
6050        }
6051
6052        /* 8021 chips can do G728 */
6053        if (j->dsp.low == 0x21) {
6054                strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
6055                j->caplist[j->caps].captype = codec;
6056                j->caplist[j->caps].cap = G728;
6057                j->caplist[j->caps].handle = j->caps++;
6058        }
6059
6060        /* 8021/8022 chips can do G729 if loaded */
6061        if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6062                strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
6063                j->caplist[j->caps].captype = codec;
6064                j->caplist[j->caps].cap = G729;
6065                j->caplist[j->caps].handle = j->caps++;
6066        }
6067        if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6068                strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
6069                j->caplist[j->caps].captype = codec;
6070                j->caplist[j->caps].cap = G729B;
6071                j->caplist[j->caps].handle = j->caps++;
6072        }
6073}
6074
6075static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
6076{
6077        int cnt;
6078        int retval = 0;
6079        for (cnt = 0; cnt < j->caps; cnt++) {
6080                if (pcreq->captype == j->caplist[cnt].captype
6081                    && pcreq->cap == j->caplist[cnt].cap) {
6082                        retval = 1;
6083                        break;
6084                }
6085        }
6086        return retval;
6087}
6088
6089static long do_ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg)
6090{
6091        IXJ_TONE ti;
6092        IXJ_FILTER jf;
6093        IXJ_FILTER_RAW jfr;
6094        void __user *argp = (void __user *)arg;
6095        struct inode *inode = file_p->f_path.dentry->d_inode;
6096        unsigned int minor = iminor(inode);
6097        unsigned int raise, mant;
6098        int board = NUM(inode);
6099
6100        IXJ *j = get_ixj(NUM(inode));
6101
6102        int retval = 0;
6103
6104        /*
6105         *    Set up locks to ensure that only one process is talking to the DSP at a time.
6106         *    This is necessary to keep the DSP from locking up.
6107         */
6108        while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
6109                schedule_timeout_interruptible(1);
6110        if (ixjdebug & 0x0040)
6111                printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6112        if (minor >= IXJMAX) {
6113                clear_bit(board, &j->busyflags);
6114                return -ENODEV;
6115        }
6116        /*
6117         *    Check ioctls only root can use.
6118         */
6119        if (!capable(CAP_SYS_ADMIN)) {
6120                switch (cmd) {
6121                case IXJCTL_TESTRAM:
6122                case IXJCTL_HZ:
6123                        retval = -EPERM;
6124                }
6125        }
6126        switch (cmd) {
6127        case IXJCTL_TESTRAM:
6128                ixj_testram(j);
6129                retval = (j->ssr.high << 8) + j->ssr.low;
6130                break;
6131        case IXJCTL_CARDTYPE:
6132                retval = j->cardtype;
6133                break;
6134        case IXJCTL_SERIAL:
6135                retval = j->serial;
6136                break;
6137        case IXJCTL_VERSION:
6138                {
6139                        char arg_str[100];
6140                        snprintf(arg_str, sizeof(arg_str),
6141                                "\nDriver version %i.%i.%i", IXJ_VER_MAJOR,
6142                                IXJ_VER_MINOR, IXJ_BLD_VER);
6143                        if (copy_to_user(argp, arg_str, strlen(arg_str)))
6144                                retval = -EFAULT;
6145                }
6146                break;
6147        case PHONE_RING_CADENCE:
6148                j->ring_cadence = arg;
6149                break;
6150        case IXJCTL_CIDCW:
6151                if(arg) {
6152                        if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6153                                retval = -EFAULT;
6154                                break;
6155                        }
6156                } else {
6157                        memset(&j->cid_send, 0, sizeof(PHONE_CID));
6158                }
6159                ixj_write_cidcw(j);
6160                break;
6161        /* Binary compatbility */
6162        case OLD_PHONE_RING_START:
6163                arg = 0;
6164                /* Fall through */
6165        case PHONE_RING_START:
6166                if(arg) {
6167                        if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6168                                retval = -EFAULT;
6169                                break;
6170                        }
6171                        ixj_write_cid(j);
6172                } else {
6173                        memset(&j->cid_send, 0, sizeof(PHONE_CID));
6174                }
6175                ixj_ring_start(j);
6176                break;
6177        case PHONE_RING_STOP:
6178                j->flags.cringing = 0;
6179                if(j->cadence_f[5].enable) {
6180                        j->cadence_f[5].state = 0;
6181                }
6182                ixj_ring_off(j);
6183                break;
6184        case PHONE_RING:
6185                retval = ixj_ring(j);
6186                break;
6187        case PHONE_EXCEPTION:
6188                retval = j->ex.bytes;
6189                if(j->ex.bits.flash) {
6190                        j->flash_end = 0;
6191                        j->ex.bits.flash = 0;
6192                }
6193                j->ex.bits.pstn_ring = 0;
6194                j->ex.bits.caller_id = 0;
6195                j->ex.bits.pstn_wink = 0;
6196                j->ex.bits.f0 = 0;
6197                j->ex.bits.f1 = 0;
6198                j->ex.bits.f2 = 0;
6199                j->ex.bits.f3 = 0;
6200                j->ex.bits.fc0 = 0;
6201                j->ex.bits.fc1 = 0;
6202                j->ex.bits.fc2 = 0;
6203                j->ex.bits.fc3 = 0;
6204                j->ex.bits.reserved = 0;
6205                break;
6206        case PHONE_HOOKSTATE:
6207                j->ex.bits.hookstate = 0;
6208                retval = j->hookstate;  //j->r_hook;
6209                break;
6210        case IXJCTL_SET_LED:
6211                LED_SetState(arg, j);
6212                break;
6213        case PHONE_FRAME:
6214                retval = set_base_frame(j, arg);
6215                break;
6216        case PHONE_REC_CODEC:
6217                retval = set_rec_codec(j, arg);
6218                break;
6219        case PHONE_VAD:
6220                ixj_vad(j, arg);
6221                break;
6222        case PHONE_REC_START:
6223                ixj_record_start(j);
6224                break;
6225        case PHONE_REC_STOP:
6226                ixj_record_stop(j);
6227                break;
6228        case PHONE_REC_DEPTH:
6229                set_rec_depth(j, arg);
6230                break;
6231        case PHONE_REC_VOLUME:
6232                if(arg == -1) {
6233                        retval = get_rec_volume(j);
6234                }
6235                else {
6236                        set_rec_volume(j, arg);
6237                        retval = arg;
6238                }
6239                break;
6240        case PHONE_REC_VOLUME_LINEAR:
6241                if(arg == -1) {
6242                        retval = get_rec_volume_linear(j);
6243                }
6244                else {
6245                        set_rec_volume_linear(j, arg);
6246                        retval = arg;
6247                }
6248                break;
6249        case IXJCTL_DTMF_PRESCALE:
6250                if(arg == -1) {
6251                        retval = get_dtmf_prescale(j);
6252                }
6253                else {
6254                        set_dtmf_prescale(j, arg);
6255                        retval = arg;
6256                }
6257                break;
6258        case PHONE_REC_LEVEL:
6259                retval = get_rec_level(j);
6260                break;
6261        case IXJCTL_SC_RXG:
6262                retval = ixj_siadc(j, arg);
6263                break;
6264        case IXJCTL_SC_TXG:
6265                retval = ixj_sidac(j, arg);
6266                break;
6267        case IXJCTL_AEC_START:
6268                ixj_aec_start(j, arg);
6269                break;
6270        case IXJCTL_AEC_STOP:
6271                aec_stop(j);
6272                break;
6273        case IXJCTL_AEC_GET_LEVEL:
6274                retval = j->aec_level;
6275                break;
6276        case PHONE_PLAY_CODEC:
6277                retval = set_play_codec(j, arg);
6278                break;
6279        case PHONE_PLAY_START:
6280                retval = ixj_play_start(j);
6281                break;
6282        case PHONE_PLAY_STOP:
6283                ixj_play_stop(j);
6284                break;
6285        case PHONE_PLAY_DEPTH:
6286                set_play_depth(j, arg);
6287                break;
6288        case PHONE_PLAY_VOLUME:
6289                if(arg == -1) {
6290                        retval = get_play_volume(j);
6291                }
6292                else {
6293                        set_play_volume(j, arg);
6294                        retval = arg;
6295                }
6296                break;
6297        case PHONE_PLAY_VOLUME_LINEAR:
6298                if(arg == -1) {
6299                        retval = get_play_volume_linear(j);
6300                }
6301                else {
6302                        set_play_volume_linear(j, arg);
6303                        retval = arg;
6304                }
6305                break;
6306        case PHONE_PLAY_LEVEL:
6307                retval = get_play_level(j);
6308                break;
6309        case IXJCTL_DSP_TYPE:
6310                retval = (j->dsp.high << 8) + j->dsp.low;
6311                break;
6312        case IXJCTL_DSP_VERSION:
6313                retval = (j->ver.high << 8) + j->ver.low;
6314                break;
6315        case IXJCTL_HZ:
6316                hertz = arg;
6317                break;
6318        case IXJCTL_RATE:
6319                if (arg > hertz)
6320                        retval = -1;
6321                else
6322                        samplerate = arg;
6323                break;
6324        case IXJCTL_DRYBUFFER_READ:
6325                put_user(j->drybuffer, (unsigned long __user *) argp);
6326                break;
6327        case IXJCTL_DRYBUFFER_CLEAR:
6328                j->drybuffer = 0;
6329                break;
6330        case IXJCTL_FRAMES_READ:
6331                put_user(j->framesread, (unsigned long __user *) argp);
6332                break;
6333        case IXJCTL_FRAMES_WRITTEN:
6334                put_user(j->frameswritten, (unsigned long __user *) argp);
6335                break;
6336        case IXJCTL_READ_WAIT:
6337                put_user(j->read_wait, (unsigned long __user *) argp);
6338                break;
6339        case IXJCTL_WRITE_WAIT:
6340                put_user(j->write_wait, (unsigned long __user *) argp);
6341                break;
6342        case PHONE_MAXRINGS:
6343                j->maxrings = arg;
6344                break;
6345        case PHONE_SET_TONE_ON_TIME:
6346                ixj_set_tone_on(arg, j);
6347                break;
6348        case PHONE_SET_TONE_OFF_TIME:
6349                ixj_set_tone_off(arg, j);
6350                break;
6351        case PHONE_GET_TONE_ON_TIME:
6352                if (ixj_get_tone_on(j)) {
6353                        retval = -1;
6354                } else {
6355                        retval = (j->ssr.high << 8) + j->ssr.low;
6356                }
6357                break;
6358        case PHONE_GET_TONE_OFF_TIME:
6359                if (ixj_get_tone_off(j)) {
6360                        retval = -1;
6361                } else {
6362                        retval = (j->ssr.high << 8) + j->ssr.low;
6363                }
6364                break;
6365        case PHONE_PLAY_TONE:
6366                if (!j->tone_state)
6367                        retval = ixj_play_tone(j, arg);
6368                else
6369                        retval = -1;
6370                break;
6371        case PHONE_GET_TONE_STATE:
6372                retval = j->tone_state;
6373                break;
6374        case PHONE_DTMF_READY:
6375                retval = j->ex.bits.dtmf_ready;
6376                break;
6377        case PHONE_GET_DTMF:
6378                if (ixj_hookstate(j)) {
6379                        if (j->dtmf_rp != j->dtmf_wp) {
6380                                retval = j->dtmfbuffer[j->dtmf_rp];
6381                                j->dtmf_rp++;
6382                                if (j->dtmf_rp == 79)
6383                                        j->dtmf_rp = 0;
6384                                if (j->dtmf_rp == j->dtmf_wp) {
6385                                        j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6386                                }
6387                        }
6388                }
6389                break;
6390        case PHONE_GET_DTMF_ASCII:
6391                if (ixj_hookstate(j)) {
6392                        if (j->dtmf_rp != j->dtmf_wp) {
6393                                switch (j->dtmfbuffer[j->dtmf_rp]) {
6394                                case 10:
6395                                        retval = 42;    /* '*'; */
6396
6397                                        break;
6398                                case 11:
6399                                        retval = 48;    /*'0'; */
6400
6401                                        break;
6402                                case 12:
6403                                        retval = 35;    /*'#'; */
6404
6405                                        break;
6406                                case 28:
6407                                        retval = 65;    /*'A'; */
6408
6409                                        break;
6410                                case 29:
6411                                        retval = 66;    /*'B'; */
6412
6413                                        break;
6414                                case 30:
6415                                        retval = 67;    /*'C'; */
6416
6417                                        break;
6418                                case 31:
6419                                        retval = 68;    /*'D'; */
6420
6421                                        break;
6422                                default:
6423                                        retval = 48 + j->dtmfbuffer[j->dtmf_rp];
6424                                        break;
6425                                }
6426                                j->dtmf_rp++;
6427                                if (j->dtmf_rp == 79)
6428                                        j->dtmf_rp = 0;
6429                                if(j->dtmf_rp == j->dtmf_wp)
6430                                {
6431                                        j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6432                                }
6433                        }
6434                }
6435                break;
6436        case PHONE_DTMF_OOB:
6437                j->flags.dtmf_oob = arg;
6438                break;
6439        case PHONE_DIALTONE:
6440                ixj_dialtone(j);
6441                break;
6442        case PHONE_BUSY:
6443                ixj_busytone(j);
6444                break;
6445        case PHONE_RINGBACK:
6446                ixj_ringback(j);
6447                break;
6448        case PHONE_WINK:
6449                if(j->cardtype == QTI_PHONEJACK) 
6450                        retval = -1;
6451                else 
6452                        retval = ixj_wink(j);
6453                break;
6454        case PHONE_CPT_STOP:
6455                ixj_cpt_stop(j);
6456                break;
6457        case PHONE_QUERY_CODEC:
6458        {
6459                struct phone_codec_data pd;
6460                int val;
6461                int proto_size[] = {
6462                        -1,
6463                        12, 10, 16, 9, 8, 48, 5,
6464                        40, 40, 80, 40, 40, 6
6465                };
6466                if(copy_from_user(&pd, argp, sizeof(pd))) {
6467                        retval = -EFAULT;
6468                        break;
6469                }
6470                if(pd.type<1 || pd.type>13) {
6471                        retval = -EPROTONOSUPPORT;
6472                        break;
6473                }
6474                if(pd.type<G729)
6475                        val=proto_size[pd.type];
6476                else switch(j->baseframe.low)
6477                {
6478                        case 0xA0:val=2*proto_size[pd.type];break;
6479                        case 0x50:val=proto_size[pd.type];break;
6480                        default:val=proto_size[pd.type]*3;break;
6481                }
6482                pd.buf_min=pd.buf_max=pd.buf_opt=val;
6483                if(copy_to_user(argp, &pd, sizeof(pd)))
6484                        retval = -EFAULT;
6485                break;
6486        }
6487        case IXJCTL_DSP_IDLE:
6488                idle(j);
6489                break;
6490        case IXJCTL_MIXER:
6491                if ((arg & 0xff) == 0xff)
6492                        retval = ixj_get_mixer(arg, j);
6493                else
6494                        ixj_mixer(arg, j);
6495                break;
6496        case IXJCTL_DAA_COEFF_SET:
6497                switch (arg) {
6498                case DAA_US:
6499                        DAA_Coeff_US(j);
6500                        retval = ixj_daa_write(j);
6501                        break;
6502                case DAA_UK:
6503                        DAA_Coeff_UK(j);
6504                        retval = ixj_daa_write(j);
6505                        break;
6506                case DAA_FRANCE:
6507                        DAA_Coeff_France(j);
6508                        retval = ixj_daa_write(j);
6509                        break;
6510                case DAA_GERMANY:
6511                        DAA_Coeff_Germany(j);
6512                        retval = ixj_daa_write(j);
6513                        break;
6514                case DAA_AUSTRALIA:
6515                        DAA_Coeff_Australia(j);
6516                        retval = ixj_daa_write(j);
6517                        break;
6518                case DAA_JAPAN:
6519                        DAA_Coeff_Japan(j);
6520                        retval = ixj_daa_write(j);
6521                        break;
6522                default:
6523                        retval = 1;
6524                        break;
6525                }
6526                break;
6527        case IXJCTL_DAA_AGAIN:
6528                ixj_daa_cr4(j, arg | 0x02);
6529                break;
6530        case IXJCTL_PSTN_LINETEST:
6531                retval = ixj_linetest(j);
6532                break;
6533        case IXJCTL_VMWI:
6534                ixj_write_vmwi(j, arg);
6535                break;
6536        case IXJCTL_CID:
6537                if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID))) 
6538                        retval = -EFAULT;
6539                j->ex.bits.caller_id = 0;
6540                break;
6541        case IXJCTL_WINK_DURATION:
6542                j->winktime = arg;
6543                break;
6544        case IXJCTL_PORT:
6545                if (arg)
6546                        retval = ixj_set_port(j, arg);
6547                else
6548                        retval = j->port;
6549                break;
6550        case IXJCTL_POTS_PSTN:
6551                retval = ixj_set_pots(j, arg);
6552                break;
6553        case PHONE_CAPABILITIES:
6554                add_caps(j);
6555                retval = j->caps;
6556                break;
6557        case PHONE_CAPABILITIES_LIST:
6558                add_caps(j);
6559                if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps)) 
6560                        retval = -EFAULT;
6561                break;
6562        case PHONE_CAPABILITIES_CHECK:
6563                {
6564                        struct phone_capability cap;
6565                        if (copy_from_user(&cap, argp, sizeof(cap))) 
6566                                retval = -EFAULT;
6567                        else {
6568                                add_caps(j);
6569                                retval = capabilities_check(j, &cap);
6570                        }
6571                }
6572                break;
6573        case PHONE_PSTN_SET_STATE:
6574                daa_set_mode(j, arg);
6575                break;
6576        case PHONE_PSTN_GET_STATE:
6577                retval = j->daa_mode;
6578                j->ex.bits.pstn_ring = 0;
6579                break;
6580        case IXJCTL_SET_FILTER:
6581                if (copy_from_user(&jf, argp, sizeof(jf))) 
6582                        retval = -EFAULT;
6583                else
6584                        retval = ixj_init_filter(j, &jf);
6585                break;
6586        case IXJCTL_SET_FILTER_RAW:
6587                if (copy_from_user(&jfr, argp, sizeof(jfr))) 
6588                        retval = -EFAULT;
6589                else
6590                        retval = ixj_init_filter_raw(j, &jfr);
6591                break;
6592        case IXJCTL_GET_FILTER_HIST:
6593                if(arg<0||arg>3)
6594                        retval = -EINVAL;
6595                else
6596                        retval = j->filter_hist[arg];
6597                break;
6598        case IXJCTL_INIT_TONE:
6599                if (copy_from_user(&ti, argp, sizeof(ti)))
6600                        retval = -EFAULT;
6601                else
6602                        retval = ixj_init_tone(j, &ti);
6603                break;
6604        case IXJCTL_TONE_CADENCE:
6605                retval = ixj_build_cadence(j, argp);
6606                break;
6607        case IXJCTL_FILTER_CADENCE:
6608                retval = ixj_build_filter_cadence(j, argp);
6609                break;
6610        case IXJCTL_SIGCTL:
6611                if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
6612                        retval = -EFAULT;
6613                        break;
6614                }
6615                j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
6616                if(j->sigdef.event < 33) {
6617                        raise = 1;
6618                        for(mant = 0; mant < j->sigdef.event; mant++){
6619                                raise *= 2;
6620                        }
6621                        if(j->sigdef.signal)
6622                                j->ex_sig.bytes |= raise; 
6623                        else
6624                                j->ex_sig.bytes &= (raise^0xffff); 
6625                }
6626                break;
6627        case IXJCTL_INTERCOM_STOP:
6628                if(arg < 0 || arg >= IXJMAX)
6629                        return -EINVAL;
6630                j->intercom = -1;
6631                ixj_record_stop(j);
6632                ixj_play_stop(j);
6633                idle(j);
6634                get_ixj(arg)->intercom = -1;
6635                ixj_record_stop(get_ixj(arg));
6636                ixj_play_stop(get_ixj(arg));
6637                idle(get_ixj(arg));
6638                break;
6639        case IXJCTL_INTERCOM_START:
6640                if(arg < 0 || arg >= IXJMAX)
6641                        return -EINVAL;
6642                j->intercom = arg;
6643                ixj_record_start(j);
6644                ixj_play_start(j);
6645                get_ixj(arg)->intercom = board;
6646                ixj_play_start(get_ixj(arg));
6647                ixj_record_start(get_ixj(arg));
6648                break;
6649        }
6650        if (ixjdebug & 0x0040)
6651                printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6652        clear_bit(board, &j->busyflags);
6653        return retval;
6654}
6655
6656static long ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg)
6657{
6658        long ret;
6659        mutex_lock(&ixj_mutex);
6660        ret = do_ixj_ioctl(file_p, cmd, arg);
6661        mutex_unlock(&ixj_mutex);
6662        return ret;
6663}
6664
6665static int ixj_fasync(int fd, struct file *file_p, int mode)
6666{
6667        IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
6668
6669        return fasync_helper(fd, file_p, mode, &j->async_queue);
6670}
6671
6672static const struct file_operations ixj_fops =
6673{
6674        .owner          = THIS_MODULE,
6675        .read           = ixj_enhanced_read,
6676        .write          = ixj_enhanced_write,
6677        .poll           = ixj_poll,
6678        .unlocked_ioctl = ixj_ioctl,
6679        .release        = ixj_release,
6680        .fasync         = ixj_fasync,
6681        .llseek  = default_llseek,
6682};
6683
6684static int ixj_linetest(IXJ *j)
6685{
6686        j->flags.pstncheck = 1; /* Testing */
6687        j->flags.pstn_present = 0; /* Assume the line is not there */
6688
6689        daa_int_read(j);        /*Clear DAA Interrupt flags */
6690        /* */
6691        /* Hold all relays in the normally de-energized position. */
6692        /* */
6693
6694        j->pld_slicw.bits.rly1 = 0;
6695        j->pld_slicw.bits.rly2 = 0;
6696        j->pld_slicw.bits.rly3 = 0;
6697        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6698        j->pld_scrw.bits.daafsyncen = 0;        /* Turn off DAA Frame Sync */
6699
6700        outb_p(j->pld_scrw.byte, j->XILINXbase);
6701        j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6702        if (j->pld_slicr.bits.potspstn) {
6703                j->flags.pots_pstn = 1;
6704                j->flags.pots_correct = 0;
6705                LED_SetState(0x4, j);
6706        } else {
6707                j->flags.pots_pstn = 0;
6708                j->pld_slicw.bits.rly1 = 0;
6709                j->pld_slicw.bits.rly2 = 0;
6710                j->pld_slicw.bits.rly3 = 1;
6711                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6712                j->pld_scrw.bits.daafsyncen = 0;        /* Turn off DAA Frame Sync */
6713
6714                outb_p(j->pld_scrw.byte, j->XILINXbase);
6715                daa_set_mode(j, SOP_PU_CONVERSATION);
6716                msleep(1000);
6717                daa_int_read(j);
6718                daa_set_mode(j, SOP_PU_RESET);
6719                if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6720                        j->flags.pots_correct = 0;      /* Should not be line voltage on POTS port. */
6721                        LED_SetState(0x4, j);
6722                        j->pld_slicw.bits.rly3 = 0;
6723                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6724                } else {
6725                        j->flags.pots_correct = 1;
6726                        LED_SetState(0x8, j);
6727                        j->pld_slicw.bits.rly1 = 1;
6728                        j->pld_slicw.bits.rly2 = 0;
6729                        j->pld_slicw.bits.rly3 = 0;
6730                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6731                }
6732        }
6733        j->pld_slicw.bits.rly3 = 0;
6734        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6735        daa_set_mode(j, SOP_PU_CONVERSATION);
6736        msleep(1000);
6737        daa_int_read(j);
6738        daa_set_mode(j, SOP_PU_RESET);
6739        if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6740                j->pstn_sleeptil = jiffies + (hertz / 4);
6741                j->flags.pstn_present = 1;
6742        } else {
6743                j->flags.pstn_present = 0;
6744        }
6745        if (j->flags.pstn_present) {
6746                if (j->flags.pots_correct) {
6747                        LED_SetState(0xA, j);
6748                } else {
6749                        LED_SetState(0x6, j);
6750                }
6751        } else {
6752                if (j->flags.pots_correct) {
6753                        LED_SetState(0x9, j);
6754                } else {
6755                        LED_SetState(0x5, j);
6756                }
6757        }
6758        j->flags.pstncheck = 0; /* Testing */
6759        return j->flags.pstn_present;
6760}
6761
6762static int ixj_selfprobe(IXJ *j)
6763{
6764        unsigned short cmd;
6765        int cnt;
6766        BYTES bytes;
6767
6768        init_waitqueue_head(&j->poll_q);
6769        init_waitqueue_head(&j->read_q);
6770        init_waitqueue_head(&j->write_q);
6771
6772        while(atomic_read(&j->DSPWrite) > 0)
6773                atomic_dec(&j->DSPWrite);
6774        if (ixjdebug & 0x0002)
6775                printk(KERN_INFO "Write IDLE to Software Control Register\n");
6776        ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
6777
6778        if (ixj_WriteDSPCommand(0x0000, j))             /* Write IDLE to Software Control Register */
6779                return -1;
6780/* The read values of the SSR should be 0x00 for the IDLE command */
6781        if (j->ssr.low || j->ssr.high)
6782                return -1;
6783        if (ixjdebug & 0x0002)
6784                printk(KERN_INFO "Get Device ID Code\n");
6785        if (ixj_WriteDSPCommand(0x3400, j))             /* Get Device ID Code */
6786                return -1;
6787        j->dsp.low = j->ssr.low;
6788        j->dsp.high = j->ssr.high;
6789        if (ixjdebug & 0x0002)
6790                printk(KERN_INFO "Get Device Version Code\n");
6791        if (ixj_WriteDSPCommand(0x3800, j))             /* Get Device Version Code */
6792                return -1;
6793        j->ver.low = j->ssr.low;
6794        j->ver.high = j->ssr.high;
6795        if (!j->cardtype) {
6796                if (j->dsp.low == 0x21) {
6797                        bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
6798                        outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
6799/* Test for Internet LineJACK or Internet PhoneJACK Lite */
6800                        bytes.low = inb_p(j->XILINXbase + 0x02);
6801                        if (bytes.low == bytes.high)    /*  Register is read only on */
6802                                /*  Internet PhoneJack Lite */
6803                         {
6804                                j->cardtype = QTI_PHONEJACK_LITE;
6805                                if (!request_region(j->XILINXbase, 4, "ixj control")) {
6806                                        printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6807                                        return -1;
6808                                }
6809                                j->pld_slicw.pcib.e1 = 1;
6810                                outb_p(j->pld_slicw.byte, j->XILINXbase);
6811                        } else {
6812                                j->cardtype = QTI_LINEJACK;
6813
6814                                if (!request_region(j->XILINXbase, 8, "ixj control")) {
6815                                        printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6816                                        return -1;
6817                                }
6818                        }
6819                } else if (j->dsp.low == 0x22) {
6820                        j->cardtype = QTI_PHONEJACK_PCI;
6821                        request_region(j->XILINXbase, 4, "ixj control");
6822                        j->pld_slicw.pcib.e1 = 1;
6823                        outb_p(j->pld_slicw.byte, j->XILINXbase);
6824                } else
6825                        j->cardtype = QTI_PHONEJACK;
6826        } else {
6827                switch (j->cardtype) {
6828                case QTI_PHONEJACK:
6829                        if (!j->dsp.low != 0x20) {
6830                                j->dsp.high = 0x80;
6831                                j->dsp.low = 0x20;
6832                                ixj_WriteDSPCommand(0x3800, j);
6833                                j->ver.low = j->ssr.low;
6834                                j->ver.high = j->ssr.high;
6835                        }
6836                        break;
6837                case QTI_LINEJACK:
6838                        if (!request_region(j->XILINXbase, 8, "ixj control")) {
6839                                printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6840                                return -1;
6841                        }
6842                        break;
6843                case QTI_PHONEJACK_LITE:
6844                case QTI_PHONEJACK_PCI:
6845                        if (!request_region(j->XILINXbase, 4, "ixj control")) {
6846                                printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6847                                return -1;
6848                        }
6849                        j->pld_slicw.pcib.e1 = 1;
6850                        outb_p(j->pld_slicw.byte, j->XILINXbase);
6851                        break;
6852                case QTI_PHONECARD:
6853                        break;
6854                }
6855        }
6856        if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
6857                if (ixjdebug & 0x0002)
6858                        printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6859                if (ixj_WriteDSPCommand(0xC462, j))             /* Write CODEC config to Software Control Register */
6860                        return -1;
6861                if (ixjdebug & 0x0002)
6862                        printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
6863                if (j->cardtype == QTI_PHONEJACK) {
6864                        cmd = 0x9FF2;
6865                } else {
6866                        cmd = 0x9FF5;
6867                }
6868                if (ixj_WriteDSPCommand(cmd, j))        /* Write CODEC timing to Software Control Register */
6869                        return -1;
6870        } else {
6871                if (set_base_frame(j, 30) != 30)
6872                        return -1;
6873                if (ixjdebug & 0x0002)
6874                        printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6875                if (j->cardtype == QTI_PHONECARD) {
6876                        if (ixj_WriteDSPCommand(0xC528, j))             /* Write CODEC config to Software Control Register */
6877                                return -1;
6878                }
6879                if (j->cardtype == QTI_LINEJACK) {
6880                        if (ixj_WriteDSPCommand(0xC528, j))             /* Write CODEC config to Software Control Register */
6881                                return -1;
6882                        if (ixjdebug & 0x0002)
6883                                printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
6884                        j->pld_clock.byte = 0;
6885                        outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
6886                }
6887        }
6888
6889        if (j->dsp.low == 0x20) {
6890                if (ixjdebug & 0x0002)
6891                        printk(KERN_INFO "Configure GPIO pins\n");
6892                j->gpio.bytes.high = 0x09;
6893/*  bytes.low = 0xEF;  0xF7 */
6894                j->gpio.bits.gpio1 = 1;
6895                j->gpio.bits.gpio2 = 1;
6896                j->gpio.bits.gpio3 = 0;
6897                j->gpio.bits.gpio4 = 1;
6898                j->gpio.bits.gpio5 = 1;
6899                j->gpio.bits.gpio6 = 1;
6900                j->gpio.bits.gpio7 = 1;
6901                ixj_WriteDSPCommand(j->gpio.word, j);   /* Set GPIO pin directions */
6902                if (ixjdebug & 0x0002)
6903                        printk(KERN_INFO "Enable SLIC\n");
6904                j->gpio.bytes.high = 0x0B;
6905                j->gpio.bytes.low = 0x00;
6906                j->gpio.bits.gpio1 = 0;
6907                j->gpio.bits.gpio2 = 1;
6908                j->gpio.bits.gpio5 = 0;
6909                ixj_WriteDSPCommand(j->gpio.word, j);   /* send the ring stop signal */
6910                j->port = PORT_POTS;
6911        } else {
6912                if (j->cardtype == QTI_LINEJACK) {
6913                        LED_SetState(0x1, j);
6914                        msleep(100);
6915                        LED_SetState(0x2, j);
6916                        msleep(100);
6917                        LED_SetState(0x4, j);
6918                        msleep(100);
6919                        LED_SetState(0x8, j);
6920                        msleep(100);
6921                        LED_SetState(0x0, j);
6922                        daa_get_version(j);
6923                        if (ixjdebug & 0x0002)
6924                                printk("Loading DAA Coefficients\n");
6925                        DAA_Coeff_US(j);
6926                        if (!ixj_daa_write(j)) {
6927                                printk("DAA write failed on board %d\n", j->board);
6928                                return -1;
6929                        }
6930                        if(!ixj_daa_cid_reset(j)) {
6931                                printk("DAA CID reset failed on board %d\n", j->board);
6932                                return -1;
6933                        }
6934                        j->flags.pots_correct = 0;
6935                        j->flags.pstn_present = 0;
6936                        ixj_linetest(j);
6937                        if (j->flags.pots_correct) {
6938                                j->pld_scrw.bits.daafsyncen = 0;        /* Turn off DAA Frame Sync */
6939
6940                                outb_p(j->pld_scrw.byte, j->XILINXbase);
6941                                j->pld_slicw.bits.rly1 = 1;
6942                                j->pld_slicw.bits.spken = 1;
6943                                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6944                                SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
6945/*                              SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
6946                                j->port = PORT_POTS;
6947                        }
6948                        ixj_set_port(j, PORT_PSTN);
6949                        ixj_set_pots(j, 1);
6950                        if (ixjdebug & 0x0002)
6951                                printk(KERN_INFO "Enable Mixer\n");
6952                        ixj_mixer(0x0000, j);   /*Master Volume Left unmute 0db */
6953                        ixj_mixer(0x0100, j);   /*Master Volume Right unmute 0db */
6954
6955                        ixj_mixer(0x0203, j);   /*Voice Left Volume unmute 6db */
6956                        ixj_mixer(0x0303, j);   /*Voice Right Volume unmute 6db */
6957
6958                        ixj_mixer(0x0480, j);   /*FM Left mute */
6959                        ixj_mixer(0x0580, j);   /*FM Right mute */
6960
6961                        ixj_mixer(0x0680, j);   /*CD Left mute */
6962                        ixj_mixer(0x0780, j);   /*CD Right mute */
6963
6964                        ixj_mixer(0x0880, j);   /*Line Left mute */
6965                        ixj_mixer(0x0980, j);   /*Line Right mute */
6966
6967                        ixj_mixer(0x0A80, j);   /*Aux left mute  */
6968                        ixj_mixer(0x0B80, j);   /*Aux right mute */
6969
6970                        ixj_mixer(0x0C00, j);   /*Mono1 unmute 12db */
6971                        ixj_mixer(0x0D80, j);   /*Mono2 mute */
6972
6973                        ixj_mixer(0x0E80, j);   /*Mic mute */
6974
6975                        ixj_mixer(0x0F00, j);   /*Mono Out Volume unmute 0db */
6976
6977                        ixj_mixer(0x1000, j);   /*Voice Left and Right out only */
6978                        ixj_mixer(0x110C, j);
6979
6980
6981                        ixj_mixer(0x1200, j);   /*Mono1 switch on mixer left */
6982                        ixj_mixer(0x1401, j);
6983
6984                        ixj_mixer(0x1300, j);       /*Mono1 switch on mixer right */
6985                        ixj_mixer(0x1501, j);
6986
6987                        ixj_mixer(0x1700, j);   /*Clock select */
6988
6989                        ixj_mixer(0x1800, j);   /*ADC input from mixer */
6990
6991                        ixj_mixer(0x1901, j);   /*Mic gain 30db */
6992
6993                        if (ixjdebug & 0x0002)
6994                                printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
6995                        j->cadence_f[4].state = 0;
6996                        j->cadence_f[4].on1 = 0;        /*Cadence Filter 4 is used for PSTN ring cadence */
6997                        j->cadence_f[4].off1 = 0;
6998                        j->cadence_f[4].on2 = 0;
6999                        j->cadence_f[4].off2 = 0;
7000                        j->cadence_f[4].on3 = 0;
7001                        j->cadence_f[4].off3 = 0;       /* These should represent standard US ring pulse. */
7002                        j->pstn_last_rmr = jiffies;
7003
7004                } else {
7005                        if (j->cardtype == QTI_PHONECARD) {
7006                                ixj_WriteDSPCommand(0xCF07, j);
7007                                ixj_WriteDSPCommand(0x00B0, j);
7008                                ixj_set_port(j, PORT_SPEAKER);
7009                        } else {
7010                                ixj_set_port(j, PORT_POTS);
7011                                SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7012/*                              SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7013                        }
7014                }
7015        }
7016
7017        j->intercom = -1;
7018        j->framesread = j->frameswritten = 0;
7019        j->read_wait = j->write_wait = 0;
7020        j->rxreadycheck = j->txreadycheck = 0;
7021
7022        /* initialise the DTMF prescale to a sensible value */
7023        if (j->cardtype == QTI_LINEJACK) {
7024                set_dtmf_prescale(j, 0x10); 
7025        } else {
7026                set_dtmf_prescale(j, 0x40); 
7027        }
7028        set_play_volume(j, 0x100);
7029        set_rec_volume(j, 0x100);
7030
7031        if (ixj_WriteDSPCommand(0x0000, j))             /* Write IDLE to Software Control Register */
7032                return -1;
7033/* The read values of the SSR should be 0x00 for the IDLE command */
7034        if (j->ssr.low || j->ssr.high)
7035                return -1;
7036
7037        if (ixjdebug & 0x0002)
7038                printk(KERN_INFO "Enable Line Monitor\n");
7039
7040        if (ixjdebug & 0x0002)
7041                printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
7042
7043        if (ixj_WriteDSPCommand(0x7E01, j))             /* Asynchronous Line Monitor */
7044                return -1;
7045
7046        if (ixjdebug & 0x002)
7047                printk(KERN_INFO "Enable DTMF Detectors\n");
7048
7049        if (ixj_WriteDSPCommand(0x5151, j))             /* Enable DTMF detection */
7050                return -1;
7051
7052        if (ixj_WriteDSPCommand(0x6E01, j))             /* Set Asyncronous Tone Generation */
7053                return -1;
7054
7055        set_rec_depth(j, 2);    /* Set Record Channel Limit to 2 frames */
7056
7057        set_play_depth(j, 2);   /* Set Playback Channel Limit to 2 frames */
7058
7059        j->ex.bits.dtmf_ready = 0;
7060        j->dtmf_state = 0;
7061        j->dtmf_wp = j->dtmf_rp = 0;
7062        j->rec_mode = j->play_mode = -1;
7063        j->flags.ringing = 0;
7064        j->maxrings = MAXRINGS;
7065        j->ring_cadence = USA_RING_CADENCE;
7066        j->drybuffer = 0;
7067        j->winktime = 320;
7068        j->flags.dtmf_oob = 0;
7069        for (cnt = 0; cnt < 4; cnt++)
7070                j->cadence_f[cnt].enable = 0;
7071        /* must be a device on the specified address */
7072        ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
7073
7074        /* Set up the default signals for events */
7075        for (cnt = 0; cnt < 35; cnt++)
7076                j->ixj_signals[cnt] = SIGIO;
7077
7078        /* Set the excetion signal enable flags */
7079        j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring = 
7080        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 = 
7081        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;
7082#ifdef IXJ_DYN_ALLOC
7083        j->fskdata = NULL;
7084#endif
7085        j->fskdcnt = 0;
7086        j->cidcw_wait = 0;
7087 
7088        /* Register with the Telephony for Linux subsystem */
7089        j->p.f_op = &ixj_fops;
7090        j->p.open = ixj_open;
7091        j->p.board = j->board;
7092        phone_register_device(&j->p, PHONE_UNIT_ANY);
7093
7094        ixj_init_timer(j);
7095        ixj_add_timer(j);
7096        return 0;
7097}
7098
7099/*
7100 *      Exported service for pcmcia card handling
7101 */
7102 
7103IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
7104{
7105        IXJ *j = ixj_alloc();
7106
7107        j->board = 0;
7108
7109        j->DSPbase = dsp;
7110        j->XILINXbase = xilinx;
7111        j->cardtype = QTI_PHONECARD;
7112        ixj_selfprobe(j);
7113        return j;
7114}
7115
7116EXPORT_SYMBOL(ixj_pcmcia_probe);                /* Fpr PCMCIA */
7117
7118static int ixj_get_status_proc(char *buf)
7119{
7120        int len;
7121        int cnt;
7122        IXJ *j;
7123        len = 0;
7124        len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
7125        len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
7126        len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
7127        len += sprintf(buf + len, "\nUsing old telephony API");
7128        len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
7129
7130        for (cnt = 0; cnt < IXJMAX; cnt++) {
7131                j = get_ixj(cnt);
7132                if(j==NULL)
7133                        continue;
7134                if (j->DSPbase) {
7135                        len += sprintf(buf + len, "\nCard Num %d", cnt);
7136                        len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
7137                        if (j->cardtype != QTI_PHONEJACK)
7138                                len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
7139                        len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
7140                        len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
7141                        len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
7142                        switch (j->cardtype) {
7143                        case (QTI_PHONEJACK):
7144                                len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
7145                                break;
7146                        case (QTI_LINEJACK):
7147                                len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
7148                                if (j->flags.g729_loaded)
7149                                        len += sprintf(buf + len, " w/G.729 A/B");
7150                                len += sprintf(buf + len, " Country = %d", j->daa_country);
7151                                break;
7152                        case (QTI_PHONEJACK_LITE):
7153                                len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
7154                                if (j->flags.g729_loaded)
7155                                        len += sprintf(buf + len, " w/G.729 A/B");
7156                                break;
7157                        case (QTI_PHONEJACK_PCI):
7158                                len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
7159                                if (j->flags.g729_loaded)
7160                                        len += sprintf(buf + len, " w/G.729 A/B");
7161                                break;
7162                        case (QTI_PHONECARD):
7163                                len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
7164                                if (j->flags.g729_loaded)
7165                                        len += sprintf(buf + len, " w/G.729 A/B");
7166                                len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
7167                                if (!j->pccr1.bits.drf)
7168                                        len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
7169                                len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
7170                                break;
7171                        default:
7172                                len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
7173                                break;
7174                        }
7175                        len += sprintf(buf + len, "\nReaders %d", j->readers);
7176                        len += sprintf(buf + len, "\nWriters %d", j->writers);
7177                        add_caps(j);
7178                        len += sprintf(buf + len, "\nCapabilities %d", j->caps);
7179                        if (j->dsp.low != 0x20)
7180                                len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
7181                        if (j->flags.cidsent)
7182                                len += sprintf(buf + len, "\nCaller ID data sent");
7183                        else
7184                                len += sprintf(buf + len, "\nCaller ID data not sent");
7185
7186                        len += sprintf(buf + len, "\nPlay CODEC ");
7187                        switch (j->play_codec) {
7188                        case G723_63:
7189                                len += sprintf(buf + len, "G.723.1 6.3");
7190                                break;
7191                        case G723_53:
7192                                len += sprintf(buf + len, "G.723.1 5.3");
7193                                break;
7194                        case TS85:
7195                                len += sprintf(buf + len, "TrueSpeech 8.5");
7196                                break;
7197                        case TS48:
7198                                len += sprintf(buf + len, "TrueSpeech 4.8");
7199                                break;
7200                        case TS41:
7201                                len += sprintf(buf + len, "TrueSpeech 4.1");
7202                                break;
7203                        case G728:
7204                                len += sprintf(buf + len, "G.728");
7205                                break;
7206                        case G729:
7207                                len += sprintf(buf + len, "G.729");
7208                                break;
7209                        case G729B:
7210                                len += sprintf(buf + len, "G.729B");
7211                                break;
7212                        case ULAW:
7213                                len += sprintf(buf + len, "uLaw");
7214                                break;
7215                        case ALAW:
7216                                len += sprintf(buf + len, "aLaw");
7217                                break;
7218                        case LINEAR16:
7219                                len += sprintf(buf + len, "16 bit Linear");
7220                                break;
7221                        case LINEAR8:
7222                                len += sprintf(buf + len, "8 bit Linear");
7223                                break;
7224                        case WSS:
7225                                len += sprintf(buf + len, "Windows Sound System");
7226                                break;
7227                        default:
7228                                len += sprintf(buf + len, "NO CODEC CHOSEN");
7229                                break;
7230                        }
7231                        len += sprintf(buf + len, "\nRecord CODEC ");
7232                        switch (j->rec_codec) {
7233                        case G723_63:
7234                                len += sprintf(buf + len, "G.723.1 6.3");
7235                                break;
7236                        case G723_53:
7237                                len += sprintf(buf + len, "G.723.1 5.3");
7238                                break;
7239                        case TS85:
7240                                len += sprintf(buf + len, "TrueSpeech 8.5");
7241                                break;
7242                        case TS48:
7243                                len += sprintf(buf + len, "TrueSpeech 4.8");
7244                                break;
7245                        case TS41:
7246                                len += sprintf(buf + len, "TrueSpeech 4.1");
7247                                break;
7248                        case G728:
7249                                len += sprintf(buf + len, "G.728");
7250                                break;
7251                        case G729:
7252                                len += sprintf(buf + len, "G.729");
7253                                break;
7254                        case G729B:
7255                                len += sprintf(buf + len, "G.729B");
7256                                break;
7257                        case ULAW:
7258                                len += sprintf(buf + len, "uLaw");
7259                                break;
7260                        case ALAW:
7261                                len += sprintf(buf + len, "aLaw");
7262                                break;
7263                        case LINEAR16:
7264                                len += sprintf(buf + len, "16 bit Linear");
7265                                break;
7266                        case LINEAR8:
7267                                len += sprintf(buf + len, "8 bit Linear");
7268                                break;
7269                        case WSS:
7270                                len += sprintf(buf + len, "Windows Sound System");
7271                                break;
7272                        default:
7273                                len += sprintf(buf + len, "NO CODEC CHOSEN");
7274                                break;
7275                        }
7276                        len += sprintf(buf + len, "\nAEC ");
7277                        switch (j->aec_level) {
7278                        case AEC_OFF:
7279                                len += sprintf(buf + len, "Off");
7280                                break;
7281                        case AEC_LOW:
7282                                len += sprintf(buf + len, "Low");
7283                                break;
7284                        case AEC_MED:
7285                                len += sprintf(buf + len, "Med");
7286                                break;
7287                        case AEC_HIGH:
7288                                len += sprintf(buf + len, "High");
7289                                break;
7290                        case AEC_AUTO:
7291                                len += sprintf(buf + len, "Auto");
7292                                break;
7293                        case AEC_AGC:
7294                                len += sprintf(buf + len, "AEC/AGC");
7295                                break;
7296                        default:
7297                                len += sprintf(buf + len, "unknown(%i)", j->aec_level);
7298                                break;
7299                        }
7300
7301                        len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
7302                        len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
7303                        len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
7304                        
7305                        len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook);      */
7306
7307                        if (j->cardtype == QTI_LINEJACK) {
7308                                len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
7309                                len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
7310                                len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
7311                                len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
7312                                switch (j->daa_mode) {
7313                                case SOP_PU_SLEEP:
7314                                        len += sprintf(buf + len, "\nDAA PSTN On Hook");
7315                                        break;
7316                                case SOP_PU_RINGING:
7317                                        len += sprintf(buf + len, "\nDAA PSTN Ringing");
7318                                        len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
7319                                        break;
7320                                case SOP_PU_CONVERSATION:
7321                                        len += sprintf(buf + len, "\nDAA PSTN Off Hook");
7322                                        break;
7323                                case SOP_PU_PULSEDIALING:
7324                                        len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
7325                                        break;
7326                                }
7327                                len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
7328                                len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
7329                                len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
7330                                len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
7331                                len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
7332                                len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
7333                                len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
7334                                len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
7335                                len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
7336                                len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
7337                        }
7338                        switch (j->port) {
7339                        case PORT_POTS:
7340                                len += sprintf(buf + len, "\nPort POTS");
7341                                break;
7342                        case PORT_PSTN:
7343                                len += sprintf(buf + len, "\nPort PSTN");
7344                                break;
7345                        case PORT_SPEAKER:
7346                                len += sprintf(buf + len, "\nPort SPEAKER/MIC");
7347                                break;
7348                        case PORT_HANDSET:
7349                                len += sprintf(buf + len, "\nPort HANDSET");
7350                                break;
7351                        }
7352                        if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
7353                                len += sprintf(buf + len, "\nSLIC state ");
7354                                switch (SLIC_GetState(j)) {
7355                                case PLD_SLIC_STATE_OC:
7356                                        len += sprintf(buf + len, "OC");
7357                                        break;
7358                                case PLD_SLIC_STATE_RINGING:
7359                                        len += sprintf(buf + len, "RINGING");
7360                                        break;
7361                                case PLD_SLIC_STATE_ACTIVE:
7362                                        len += sprintf(buf + len, "ACTIVE");
7363                                        break;
7364                                case PLD_SLIC_STATE_OHT:        /* On-hook transmit */
7365                                        len += sprintf(buf + len, "OHT");
7366                                        break;
7367                                case PLD_SLIC_STATE_TIPOPEN:
7368                                        len += sprintf(buf + len, "TIPOPEN");
7369                                        break;
7370                                case PLD_SLIC_STATE_STANDBY:
7371                                        len += sprintf(buf + len, "STANDBY");
7372                                        break;
7373                                case PLD_SLIC_STATE_APR:        /* Active polarity reversal */
7374                                        len += sprintf(buf + len, "APR");
7375                                        break;
7376                                case PLD_SLIC_STATE_OHTPR:      /* OHT polarity reversal */
7377                                        len += sprintf(buf + len, "OHTPR");
7378                                        break;
7379                                default:
7380                                        len += sprintf(buf + len, "%d", SLIC_GetState(j));
7381                                        break;
7382                                }
7383                        }
7384                        len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
7385                        len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
7386#ifdef PERFMON_STATS
7387                        len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
7388                        len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
7389                        len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
7390                        len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
7391                        len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
7392                        len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
7393                        len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
7394                        len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
7395                        len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
7396                        len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
7397                        len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
7398                        len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
7399                        len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
7400                        len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
7401 
7402#endif
7403                        len += sprintf(buf + len, "\n");
7404                }
7405        }
7406        return len;
7407}
7408
7409static int ixj_read_proc(char *page, char **start, off_t off,
7410                              int count, int *eof, void *data)
7411{
7412        int len = ixj_get_status_proc(page);
7413        if (len <= off+count) *eof = 1;
7414        *start = page + off;
7415        len -= off;
7416        if (len>count) len = count;
7417        if (len<0) len = 0;
7418        return len;
7419}
7420
7421
7422static void cleanup(void)
7423{
7424        int cnt;
7425        IXJ *j;
7426
7427        for (cnt = 0; cnt < IXJMAX; cnt++) {
7428                j = get_ixj(cnt);
7429                if(j != NULL && j->DSPbase) {
7430                        if (ixjdebug & 0x0002)
7431                                printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
7432                        del_timer(&j->timer);
7433                        if (j->cardtype == QTI_LINEJACK) {
7434                                j->pld_scrw.bits.daafsyncen = 0;        /* Turn off DAA Frame Sync */
7435
7436                                outb_p(j->pld_scrw.byte, j->XILINXbase);
7437                                j->pld_slicw.bits.rly1 = 0;
7438                                j->pld_slicw.bits.rly2 = 0;
7439                                j->pld_slicw.bits.rly3 = 0;
7440                                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7441                                LED_SetState(0x0, j);
7442                                if (ixjdebug & 0x0002)
7443                                        printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7444                                release_region(j->XILINXbase, 8);
7445                        } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
7446                                if (ixjdebug & 0x0002)
7447                                        printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7448                                release_region(j->XILINXbase, 4);
7449                        }
7450                        kfree(j->read_buffer);
7451                        kfree(j->write_buffer);
7452                        if (j->dev)
7453                                pnp_device_detach(j->dev);
7454                        if (ixjdebug & 0x0002)
7455                                printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
7456                        phone_unregister_device(&j->p);
7457                        if (ixjdebug & 0x0002)
7458                                printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
7459                        release_region(j->DSPbase, 16);
7460#ifdef IXJ_DYN_ALLOC
7461                        if (ixjdebug & 0x0002)
7462                                printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
7463                        kfree(j);
7464                        ixj[cnt] = NULL;
7465#endif
7466                }
7467        }
7468        if (ixjdebug & 0x0002)
7469                printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
7470        remove_proc_entry ("ixj", NULL);
7471}
7472
7473/* Typedefs */
7474typedef struct {
7475        BYTE length;
7476        DWORD bits;
7477} DATABLOCK;
7478
7479static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
7480{
7481        lastLCC = lastLCC & 0xfb;
7482        lastLCC = lastLCC | (byData ? 4 : 0);
7483        outb(lastLCC, wEEPROMAddress);  /*set data out bit as appropriate */
7484
7485        mdelay(1);
7486        lastLCC = lastLCC | 0x01;
7487        outb(lastLCC, wEEPROMAddress);  /*SK rising edge */
7488
7489        byData = byData << 1;
7490        lastLCC = lastLCC & 0xfe;
7491        mdelay(1);
7492        outb(lastLCC, wEEPROMAddress);  /*after delay, SK falling edge */
7493
7494}
7495
7496static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
7497{
7498        mdelay(1);
7499        lastLCC = lastLCC | 0x01;
7500        outb(lastLCC, wEEPROMAddress);  /*SK rising edge */
7501
7502        lastLCC = lastLCC & 0xfe;
7503        mdelay(1);
7504        outb(lastLCC, wEEPROMAddress);  /*after delay, SK falling edge */
7505
7506        return ((inb(wEEPROMAddress) >> 3) & 1);
7507}
7508
7509static bool PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
7510{
7511        BYTE lastLCC;
7512        WORD wEEPROMAddress = wAddress + 3;
7513        DWORD i;
7514        BYTE byResult;
7515        *pwResult = 0;
7516        lastLCC = inb(wEEPROMAddress);
7517        lastLCC = lastLCC | 0x02;
7518        lastLCC = lastLCC & 0xfe;
7519        outb(lastLCC, wEEPROMAddress);  /* CS hi, SK lo */
7520
7521        mdelay(1);              /* delay */
7522
7523        PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7524        PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7525        PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
7526        for (i = 0; i < 8; i++) {
7527                PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
7528                wLoc <<= 1;
7529        }
7530
7531        for (i = 0; i < 16; i++) {
7532                byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
7533                *pwResult = (*pwResult << 1) | byResult;
7534        }
7535
7536        mdelay(1);              /* another delay */
7537
7538        lastLCC = lastLCC & 0xfd;
7539        outb(lastLCC, wEEPROMAddress);  /* negate CS */
7540
7541        return 0;
7542}
7543
7544static DWORD PCIEE_GetSerialNumber(WORD wAddress)
7545{
7546        WORD wLo, wHi;
7547        if (PCIEE_ReadWord(wAddress, 62, &wLo))
7548                return 0;
7549        if (PCIEE_ReadWord(wAddress, 63, &wHi))
7550                return 0;
7551        return (((DWORD) wHi << 16) | wLo);
7552}
7553
7554static int dspio[IXJMAX + 1] =
7555{
7556        0,
7557};
7558static int xio[IXJMAX + 1] =
7559{
7560        0,
7561};
7562
7563module_param_array(dspio, int, NULL, 0);
7564module_param_array(xio, int, NULL, 0);
7565MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7566MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7567MODULE_LICENSE("GPL");
7568
7569static void __exit ixj_exit(void)
7570{
7571        cleanup();
7572}
7573
7574static IXJ *new_ixj(unsigned long port)
7575{
7576        IXJ *res;
7577        if (!request_region(port, 16, "ixj DSP")) {
7578                printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
7579                return NULL;
7580        }
7581        res = ixj_alloc();
7582        if (!res) {
7583                release_region(port, 16);
7584                printk(KERN_INFO "ixj: out of memory\n");
7585                return NULL;
7586        }
7587        res->DSPbase = port;
7588        return res;
7589}
7590
7591static int __init ixj_probe_isapnp(int *cnt)
7592{               
7593        int probe = 0;
7594        int func = 0x110;
7595        struct pnp_dev *dev = NULL, *old_dev = NULL;
7596
7597        while (1) {
7598                do {
7599                        IXJ *j;
7600                        int result;
7601
7602                        old_dev = dev;
7603                        dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
7604                                         ISAPNP_FUNCTION(func), old_dev);
7605                        if (!dev || !dev->card)
7606                                break;
7607                        result = pnp_device_attach(dev);
7608                        if (result < 0) {
7609                                printk("pnp attach failed %d \n", result);
7610                                break;
7611                        }
7612                        if (pnp_activate_dev(dev) < 0) {
7613                                printk("pnp activate failed (out of resources?)\n");
7614                                pnp_device_detach(dev);
7615                                return -ENOMEM;
7616                        }
7617
7618                        if (!pnp_port_valid(dev, 0)) {
7619                                pnp_device_detach(dev);
7620                                return -ENODEV;
7621                        }
7622
7623                        j = new_ixj(pnp_port_start(dev, 0));
7624                        if (!j)
7625                                break;
7626
7627                        if (func != 0x110)
7628                                j->XILINXbase = pnp_port_start(dev, 1); /* get real port */
7629
7630                        switch (func) {
7631                        case (0x110):
7632                                j->cardtype = QTI_PHONEJACK;
7633                                break;
7634                        case (0x310):
7635                                j->cardtype = QTI_LINEJACK;
7636                                break;
7637                        case (0x410):
7638                                j->cardtype = QTI_PHONEJACK_LITE;
7639                                break;
7640                        }
7641                        j->board = *cnt;
7642                        probe = ixj_selfprobe(j);
7643                        if(!probe) {
7644                                j->serial = dev->card->serial;
7645                                j->dev = dev;
7646                                switch (func) {
7647                                case 0x110:
7648                                        printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
7649                                        break;
7650                                case 0x310:
7651                                        printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
7652                                        break;
7653                                case 0x410:
7654                                        printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
7655                                        break;
7656                                }
7657                        }
7658                        ++*cnt;
7659                } while (dev);
7660                if (func == 0x410)
7661                        break;
7662                if (func == 0x310)
7663                        func = 0x410;
7664                if (func == 0x110)
7665                        func = 0x310;
7666                dev = NULL;
7667        }
7668        return probe;
7669}
7670                        
7671static int __init ixj_probe_isa(int *cnt)
7672{
7673        int i, probe;
7674
7675        /* Use passed parameters for older kernels without PnP */
7676        for (i = 0; i < IXJMAX; i++) {
7677                if (dspio[i]) {
7678                        IXJ *j = new_ixj(dspio[i]);
7679
7680                        if (!j)
7681                                break;
7682
7683                        j->XILINXbase = xio[i];
7684                        j->cardtype = 0;
7685
7686                        j->board = *cnt;
7687                        probe = ixj_selfprobe(j);
7688                        j->dev = NULL;
7689                        ++*cnt;
7690                }
7691        }
7692        return 0;
7693}
7694
7695static int __init ixj_probe_pci(int *cnt)
7696{
7697        struct pci_dev *pci = NULL;   
7698        int i, probe = 0;
7699        IXJ *j = NULL;
7700
7701        for (i = 0; i < IXJMAX - *cnt; i++) {
7702                pci = pci_get_device(PCI_VENDOR_ID_QUICKNET,
7703                                      PCI_DEVICE_ID_QUICKNET_XJ, pci);
7704                if (!pci)
7705                        break;
7706
7707                if (pci_enable_device(pci))
7708                        break;
7709                j = new_ixj(pci_resource_start(pci, 0));
7710                if (!j)
7711                        break;
7712
7713                j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
7714                j->XILINXbase = j->DSPbase + 0x10;
7715                j->cardtype = QTI_PHONEJACK_PCI;
7716                j->board = *cnt;
7717                probe = ixj_selfprobe(j);
7718                if (!probe)
7719                        printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
7720                ++*cnt;
7721        }
7722        pci_dev_put(pci);
7723        return probe;
7724}
7725
7726static int __init ixj_init(void)
7727{
7728        int cnt = 0;
7729        int probe = 0;   
7730
7731        cnt = 0;
7732
7733        /* These might be no-ops, see above. */
7734        if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
7735                return probe;
7736        }
7737        if ((probe = ixj_probe_isa(&cnt)) < 0) {
7738                return probe;
7739        }
7740        if ((probe = ixj_probe_pci(&cnt)) < 0) {
7741                return probe;
7742        }
7743        printk(KERN_INFO "ixj driver initialized.\n");
7744        create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
7745        return probe;
7746}
7747
7748module_init(ixj_init);
7749module_exit(ixj_exit);
7750
7751static void DAA_Coeff_US(IXJ *j)
7752{
7753        int i;
7754
7755        j->daa_country = DAA_US;
7756        /*----------------------------------------------- */
7757        /* CAO */
7758        for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7759                j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7760        }
7761
7762/* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7763        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
7764        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
7765        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
7766        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
7767        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
7768        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
7769        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7770        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7771/* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7772        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
7773        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
7774        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7775        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7776        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
7777        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7778        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7779        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7780/* Bytes for FRX-filter       (08): 03,8F,48,F2,8F,48,70,08 */
7781        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
7782        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
7783        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
7784        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
7785        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
7786        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
7787        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
7788        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7789/* Bytes for FRR-filter       (07): 04,8F,38,7F,9B,EA,B0,08 */
7790        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
7791        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
7792        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
7793        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
7794        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
7795        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
7796        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
7797        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7798/* Bytes for AX-filter        (0A): 16,55,DD,CA */
7799        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
7800        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
7801        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
7802        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
7803/* Bytes for AR-filter        (09): 52,D3,11,42 */
7804        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
7805        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
7806        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
7807        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
7808/* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7809        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
7810        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
7811        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
7812        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
7813        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
7814        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
7815        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
7816        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
7817/* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7818        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
7819        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
7820        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
7821        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
7822        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
7823        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
7824        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
7825        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
7826/* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7827        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
7828        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
7829        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
7830        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
7831        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
7832        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
7833        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
7834        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
7835/* ;  (10K, 0.68uF) */
7836        /*  */
7837        /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7838        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
7839        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
7840        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
7841        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
7842        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
7843        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
7844        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
7845        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
7846        /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7847        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
7848        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
7849        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
7850        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
7851        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
7852        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
7853        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
7854        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
7855
7856        /* Levelmetering Ringing        (0D):B2,45,0F,8E       */
7857        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
7858        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
7859        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
7860        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
7861
7862        /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7863/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7864/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7865/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7866/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
7867/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
7868/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
7869/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
7870/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
7871        /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */ 
7872/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
7873/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
7874/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
7875/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
7876/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
7877/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
7878/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
7879/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
7880/* */
7881        /* Levelmetering Ringing        (0D):B2,45,0F,8E       */
7882/*      j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
7883/*      j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
7884/*      j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
7885/*      j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
7886
7887        /* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */
7888        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
7889        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
7890        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
7891        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
7892        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
7893        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
7894        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
7895        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
7896/* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */
7897        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
7898        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
7899        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
7900        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
7901        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
7902        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
7903        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
7904        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
7905/*  */
7906        /* ;CR Registers */
7907        /* Config. Reg. 0 (filters)       (cr0):FE ; CLK gen. by crystal */
7908        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
7909/* Config. Reg. 1 (dialing)       (cr1):05 */
7910        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
7911/* Config. Reg. 2 (caller ID)     (cr2):04 */
7912        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
7913/* Config. Reg. 3 (testloops)     (cr3):03 ; SEL Bit==0, HP-disabled */
7914        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
7915/* Config. Reg. 4 (analog gain)   (cr4):02 */
7916        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
7917        /* Config. Reg. 5 (Version)       (cr5):02 */
7918        /* Config. Reg. 6 (Reserved)      (cr6):00 */
7919        /* Config. Reg. 7 (Reserved)      (cr7):00 */
7920        /*  */
7921        /* ;xr Registers */
7922        /* Ext. Reg. 0 (Interrupt Reg.)   (xr0):02 */
7923
7924        j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;        /* SO_1 set to '1' because it is inverted. */
7925        /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
7926
7927        j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
7928/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
7929        j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
7930/* Ext. Reg. 3 (DC Char)          (xr3):32 ; B-Filter Off == 1 */
7931        j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B;         /*0x32; */
7932        /* Ext. Reg. 4 (Cadence)          (xr4):00 */
7933
7934        j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
7935/* Ext. Reg. 5 (Ring timer)       (xr5):22 */
7936        j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
7937/* Ext. Reg. 6 (Power State)      (xr6):00 */
7938        j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
7939/* Ext. Reg. 7 (Vdd)              (xr7):40 */
7940        j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;         /* 0x40 ??? Should it be 0x00? */
7941        /*  */
7942        /* DTMF Tone 1                     (0B): 11,B3,5A,2C ;   697 Hz   */
7943        /*                                       12,33,5A,C3 ;  770 Hz   */
7944        /*                                       13,3C,5B,32 ;  852 Hz   */
7945        /*                                       1D,1B,5C,CC ;  941 Hz   */
7946
7947        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
7948        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
7949        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
7950        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
7951/* DTMF Tone 2                     (0C): 32,32,52,B3 ;  1209 Hz   */
7952        /*                                       EC,1D,52,22 ;  1336 Hz   */
7953        /*                                       AA,AC,51,D2 ;  1477 Hz   */
7954        /*                                       9B,3B,51,25 ;  1633 Hz   */
7955        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
7956        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
7957        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
7958        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
7959}
7960
7961static void DAA_Coeff_UK(IXJ *j)
7962{
7963        int i;
7964
7965        j->daa_country = DAA_UK;
7966        /*----------------------------------------------- */
7967        /* CAO */
7968        for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7969                j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7970        }
7971
7972/*  Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
7973        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
7974        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
7975        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
7976        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
7977        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
7978        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
7979        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7980        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7981/* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
7982        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
7983        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
7984        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7985        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7986        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
7987        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7988        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7989        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7990/* Bytes for FRX-filter       (08): 07,9B,ED,24,B2,A2,A0,08 */
7991        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
7992        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
7993        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
7994        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
7995        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
7996        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
7997        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
7998        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7999/* Bytes for FRR-filter       (07): 0F,92,F2,B2,87,D2,30,08 */
8000        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8001        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
8002        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
8003        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
8004        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8005        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
8006        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
8007        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8008/* Bytes for AX-filter        (0A): 1B,A5,DD,CA */
8009        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
8010        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
8011        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8012        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8013/* Bytes for AR-filter        (09): E2,27,10,D6 */
8014        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8015        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
8016        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8017        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8018/* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8019        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8020        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
8021        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
8022        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
8023        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
8024        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
8025        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8026        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8027/* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8028        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8029        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
8030        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
8031        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
8032        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
8033        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
8034        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
8035        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
8036/* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8037        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8038        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8039        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
8040        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
8041        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
8042        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
8043        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
8044        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
8045/* ; idle */
8046        /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8047        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8048        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8049        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8050        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8051        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8052        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8053        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8054        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8055/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8056        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8057        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8058        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8059        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8060        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8061        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8062        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8063        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8064/* Levelmetering Ringing           (0D):AA,35,0F,8E     ; 25Hz 30V less possible? */
8065        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8066        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8067        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8068        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8069/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8070        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8071        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8072        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8073        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8074        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8075        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8076        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8077        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8078/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8079        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8080        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8081        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8082        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8083        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8084        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8085        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8086        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8087/* ;CR Registers */
8088        /* Config. Reg. 0 (filters)        (cr0):FF */
8089        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8090/* Config. Reg. 1 (dialing)        (cr1):05 */
8091        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8092/* Config. Reg. 2 (caller ID)      (cr2):04 */
8093        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8094/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8095        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8096/* Config. Reg. 4 (analog gain)    (cr4):02 */
8097        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8098        /* Config. Reg. 5 (Version)        (cr5):02 */
8099        /* Config. Reg. 6 (Reserved)       (cr6):00 */
8100        /* Config. Reg. 7 (Reserved)       (cr7):00 */
8101        /* ;xr Registers */
8102        /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8103
8104        j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;        /* SO_1 set to '1' because it is inverted. */
8105        /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8106
8107        j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;         /* RING, Caller ID, VDD_OK */
8108        /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8109
8110        j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8111/* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
8112        j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8113/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8114        j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8115/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8116        j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8117/* Ext. Reg. 6 (Power State)       (xr6):00 */
8118        j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8119/* Ext. Reg. 7 (Vdd)               (xr7):46 */
8120        j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;         /* 0x46 ??? Should it be 0x00? */
8121        /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8122        /*                                       12,33,5A,C3    ;  770 Hz   */
8123        /*                                       13,3C,5B,32    ;  852 Hz   */
8124        /*                                       1D,1B,5C,CC    ;  941 Hz   */
8125
8126        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8127        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8128        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8129        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8130/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8131        /*                                       EC,1D,52,22    ;  1336 Hz   */
8132        /*                                       AA,AC,51,D2    ;  1477 Hz   */
8133        /*                                       9B,3B,51,25    ;  1633 Hz   */
8134        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8135        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8136        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8137        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8138}
8139
8140
8141static void DAA_Coeff_France(IXJ *j)
8142{
8143        int i;
8144
8145        j->daa_country = DAA_FRANCE;
8146        /*----------------------------------------------- */
8147        /* CAO */
8148        for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8149                j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8150        }
8151
8152/* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8153        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
8154        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
8155        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
8156        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
8157        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
8158        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
8159        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8160        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8161/* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8162        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
8163        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
8164        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8165        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
8166        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
8167        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8168        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8169        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8170/* Bytes for FRX-filter       (08): 07,9A,28,F6,23,4A,B0,08 */
8171        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8172        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
8173        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
8174        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
8175        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
8176        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
8177        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
8178        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8179/* Bytes for FRR-filter       (07): 03,8F,F9,2F,9E,FA,20,08 */
8180        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8181        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8182        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
8183        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8184        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
8185        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
8186        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8187        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8188/* Bytes for AX-filter        (0A): 16,B5,DD,CA */
8189        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
8190        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
8191        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8192        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8193/* Bytes for AR-filter        (09): 52,C7,10,D6 */
8194        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8195        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
8196        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8197        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8198/* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8199        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8200        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8201        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8202        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8203        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
8204        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8205        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8206        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8207/* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8208        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8209        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
8210        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8211        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
8212        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
8213        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
8214        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
8215        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
8216/* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8217        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8218        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8219        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8220        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
8221        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
8222        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
8223        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
8224        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
8225/* ; idle */
8226        /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8227        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8228        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8229        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8230        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8231        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8232        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8233        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8234        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8235/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8236        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8237        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8238        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8239        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8240        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8241        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8242        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8243        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8244/* Levelmetering Ringing           (0D):32,45,B5,84     ; 50Hz 20V */
8245        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8246        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8247        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8248        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8249/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8250        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8251        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8252        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8253        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8254        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8255        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8256        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8257        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8258/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8259        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8260        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8261        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8262        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8263        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8264        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8265        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8266        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8267/* ;CR Registers */
8268        /* Config. Reg. 0 (filters)        (cr0):FF */
8269        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8270/* Config. Reg. 1 (dialing)        (cr1):05 */
8271        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8272/* Config. Reg. 2 (caller ID)      (cr2):04 */
8273        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8274/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8275        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8276/* Config. Reg. 4 (analog gain)    (cr4):02 */
8277        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8278        /* Config. Reg. 5 (Version)        (cr5):02 */
8279        /* Config. Reg. 6 (Reserved)       (cr6):00 */
8280        /* Config. Reg. 7 (Reserved)       (cr7):00 */
8281        /* ;xr Registers */
8282        /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8283
8284        j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;        /* SO_1 set to '1' because it is inverted. */
8285        /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8286
8287        j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;         /* RING, Caller ID, VDD_OK */
8288        /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8289
8290        j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8291/* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
8292        j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8293/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8294        j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8295/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8296        j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8297/* Ext. Reg. 6 (Power State)       (xr6):00 */
8298        j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8299/* Ext. Reg. 7 (Vdd)               (xr7):46 */
8300        j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;         /* 0x46 ??? Should it be 0x00? */
8301        /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8302        /*                                       12,33,5A,C3    ;  770 Hz   */
8303        /*                                       13,3C,5B,32    ;  852 Hz   */
8304        /*                                       1D,1B,5C,CC    ;  941 Hz   */
8305
8306        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8307        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8308        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8309        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8310/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8311        /*                                       EC,1D,52,22    ;  1336 Hz   */
8312        /*                                       AA,AC,51,D2    ;  1477 Hz   */
8313        /*                                       9B,3B,51,25    ;  1633 Hz   */
8314        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8315        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8316        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8317        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8318}
8319
8320
8321static void DAA_Coeff_Germany(IXJ *j)
8322{
8323        int i;
8324
8325        j->daa_country = DAA_GERMANY;
8326        /*----------------------------------------------- */
8327        /* CAO */
8328        for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8329                j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8330        }
8331
8332/* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8333        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8334        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
8335        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8336        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
8337        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
8338        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8339        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
8340        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8341/* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8342        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
8343        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
8344        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8345        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
8346        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
8347        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
8348        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
8349        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8350/* Bytes for FRX-filter       (08): 07,AA,E2,34,24,89,20,08 */
8351        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8352        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
8353        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8354        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8355        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
8356        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
8357        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
8358        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8359/* Bytes for FRR-filter       (07): 02,87,FA,37,9A,CA,B0,08 */
8360        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
8361        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
8362        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
8363        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
8364        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
8365        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
8366        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
8367        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8368/* Bytes for AX-filter        (0A): 72,D5,DD,CA */
8369        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
8370        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
8371        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8372        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8373/* Bytes for AR-filter        (09): 72,42,13,4B */
8374        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
8375        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
8376        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
8377        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
8378/* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8379        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8380        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8381        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8382        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8383        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
8384        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8385        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8386        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8387/* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8388        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8389        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
8390        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
8391        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8392        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
8393        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
8394        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
8395        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
8396/* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8397        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8398        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8399        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
8400        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
8401        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
8402        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
8403        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
8404        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
8405/* ;  (10K, 0.68uF) */
8406        /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8407        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8408        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
8409        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
8410        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
8411        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
8412        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
8413        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
8414        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8415/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8416        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
8417        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
8418        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8419        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8420        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
8421        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
8422        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
8423        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8424/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
8425        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
8426        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8427        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8428        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8429/* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */
8430        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8431        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8432        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8433        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8434        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8435        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8436        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8437        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8438/* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */
8439        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8440        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8441        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8442        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8443        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8444        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8445        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8446        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8447/* ;CR Registers */
8448        /* Config. Reg. 0 (filters)        (cr0):FF ; all Filters enabled, CLK from ext. source */
8449        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8450/* Config. Reg. 1 (dialing)        (cr1):05 ; Manual Ring, Ring metering enabled */
8451        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8452/* Config. Reg. 2 (caller ID)      (cr2):04 ; Analog Gain 0dB, FSC internal */
8453        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8454/* Config. Reg. 3 (testloops)      (cr3):00 ; SEL Bit==0, HP-enabled */
8455        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8456/* Config. Reg. 4 (analog gain)    (cr4):02 */
8457        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8458        /* Config. Reg. 5 (Version)        (cr5):02 */
8459        /* Config. Reg. 6 (Reserved)       (cr6):00 */
8460        /* Config. Reg. 7 (Reserved)       (cr7):00 */
8461        /* ;xr Registers */
8462        /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8463
8464        j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;        /* SO_1 set to '1' because it is inverted. */
8465        /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8466
8467        j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;         /* RING, Caller ID, VDD_OK */
8468        /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8469
8470        j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8471/* Ext. Reg. 3 (DC Char)           (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8472        j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
8473/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8474        j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8475/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8476        j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8477/* Ext. Reg. 6 (Power State)       (xr6):00 */
8478        j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8479/* Ext. Reg. 7 (Vdd)               (xr7):40 ; VDD=4.25 V */
8480        j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;         /* 0x40 ??? Should it be 0x00? */
8481        /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8482        /*                                       12,33,5A,C3    ;  770 Hz   */
8483        /*                                       13,3C,5B,32    ;  852 Hz   */
8484        /*                                       1D,1B,5C,CC    ;  941 Hz   */
8485
8486        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8487        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8488        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8489        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8490/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8491        /*                                       EC,1D,52,22    ;  1336 Hz   */
8492        /*                                       AA,AC,51,D2    ;  1477 Hz   */
8493        /*                                       9B,3B,51,25    ;  1633 Hz   */
8494        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8495        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8496        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8497        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8498}
8499
8500
8501static void DAA_Coeff_Australia(IXJ *j)
8502{
8503        int i;
8504
8505        j->daa_country = DAA_AUSTRALIA;
8506        /*----------------------------------------------- */
8507        /* CAO */
8508        for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8509                j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8510        }
8511
8512/* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8513        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8514        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
8515        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
8516        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
8517        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
8518        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
8519        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
8520        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8521/* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8522        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
8523        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
8524        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8525        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
8526        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
8527        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
8528        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
8529        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8530/* Bytes for FRX-filter       (08): 07,96,E2,34,32,9B,30,08 */
8531        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8532        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
8533        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8534        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8535        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
8536        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
8537        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
8538        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8539/* Bytes for FRR-filter       (07): 0F,9A,E9,2F,22,CC,A0,08 */
8540        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8541        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
8542        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
8543        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8544        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
8545        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
8546        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
8547        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8548/* Bytes for AX-filter        (0A): CB,45,DD,CA */
8549        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
8550        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
8551        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8552        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8553/* Bytes for AR-filter        (09): 1B,67,10,D6 */
8554        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
8555        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
8556        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8557        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8558/* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8559        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8560        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8561        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8562        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8563        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
8564        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8565        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8566        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8567/* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8568        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8569        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
8570        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
8571        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
8572        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
8573        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
8574        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
8575        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
8576/* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8577        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8578        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8579        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
8580        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
8581        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
8582        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
8583        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
8584        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
8585/* ;  idle */
8586        /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8587        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8588        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8589        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8590        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8591        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8592        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8593        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8594        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8595/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8596        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8597        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8598        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8599        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8600        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8601        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8602        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8603        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8604/* Levelmetering Ringing           (0D):32,45,B5,84   ; 50Hz 20V */
8605        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8606        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8607        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8608        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8609/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8610        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8611        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8612        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8613        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8614        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8615        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8616        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8617        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8618/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8619        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8620        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8621        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8622        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8623        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8624        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8625        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8626        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8627/* ;CR Registers */
8628        /* Config. Reg. 0 (filters)        (cr0):FF */
8629        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8630/* Config. Reg. 1 (dialing)        (cr1):05 */
8631        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8632/* Config. Reg. 2 (caller ID)      (cr2):04 */
8633        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8634/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8635        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8636/* Config. Reg. 4 (analog gain)    (cr4):02 */
8637        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8638        /* Config. Reg. 5 (Version)        (cr5):02 */
8639        /* Config. Reg. 6 (Reserved)       (cr6):00 */
8640        /* Config. Reg. 7 (Reserved)       (cr7):00 */
8641        /* ;xr Registers */
8642        /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8643
8644        j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;        /* SO_1 set to '1' because it is inverted. */
8645        /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8646
8647        j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;         /* RING, Caller ID, VDD_OK */
8648        /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8649
8650        j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8651/* Ext. Reg. 3 (DC Char)           (xr3):2B      ;  */
8652        j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
8653/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8654        j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8655/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8656        j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8657/* Ext. Reg. 6 (Power State)       (xr6):00 */
8658        j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8659/* Ext. Reg. 7 (Vdd)               (xr7):40 */
8660        j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;         /* 0x40 ??? Should it be 0x00? */
8661
8662        /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;  697 Hz   */
8663        /*                                       12,33,5A,C3    ;  770 Hz   */
8664        /*                                       13,3C,5B,32    ;  852 Hz   */
8665        /*                                       1D,1B,5C,CC    ;  941 Hz   */
8666        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8667        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8668        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8669        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8670
8671        /* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8672        /*                                       EC,1D,52,22    ;  1336 Hz   */
8673        /*                                       AA,AC,51,D2    ;  1477 Hz   */
8674        /*                                       9B,3B,51,25    ;  1633 Hz   */
8675        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8676        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8677        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8678        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8679}
8680
8681static void DAA_Coeff_Japan(IXJ *j)
8682{
8683        int i;
8684
8685        j->daa_country = DAA_JAPAN;
8686        /*----------------------------------------------- */
8687        /* CAO */
8688        for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8689                j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8690        }
8691
8692/* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8693        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
8694        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
8695        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
8696        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
8697        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
8698        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
8699        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8700        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8701/* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8702        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
8703        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
8704        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8705        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
8706        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
8707        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8708        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8709        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8710/* Bytes for FRX-filter       (08): 02,8F,68,77,9C,58,F0,08 */
8711        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
8712        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
8713        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
8714        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
8715        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
8716        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
8717        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
8718        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8719/* Bytes for FRR-filter       (07): 03,8F,38,73,87,EA,20,08 */
8720        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8721        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8722        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
8723        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
8724        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8725        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
8726        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8727        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8728/* Bytes for AX-filter        (0A): 51,C5,DD,CA */
8729        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
8730        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
8731        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8732        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8733/* Bytes for AR-filter        (09): 25,A7,10,D6 */
8734        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
8735        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
8736        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8737        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8738/* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8739        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8740        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8741        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8742        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8743        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
8744        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8745        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8746        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8747/* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8748        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8749        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
8750        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8751        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8752        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
8753        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
8754        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
8755        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
8756/* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8757        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8758        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8759        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8760        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
8761        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
8762        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
8763        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
8764        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
8765/* ;  idle */
8766        /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8767        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8768        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8769        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8770        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8771        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8772        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8773        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8774        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8775/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8776        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8777        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8778        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8779        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8780        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8781        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8782        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8783        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8784/* Levelmetering Ringing           (0D):AA,35,0F,8E    ; 25Hz 30V ????????? */
8785        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8786        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8787        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8788        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8789/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8790        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8791        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8792        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8793        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8794        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8795        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8796        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8797        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8798/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8799        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8800        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8801        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8802        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8803        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8804        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8805        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8806        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8807/* ;CR Registers */
8808        /* Config. Reg. 0 (filters)        (cr0):FF */
8809        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8810/* Config. Reg. 1 (dialing)        (cr1):05 */
8811        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8812/* Config. Reg. 2 (caller ID)      (cr2):04 */
8813        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8814/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8815        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8816/* Config. Reg. 4 (analog gain)    (cr4):02 */
8817        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8818        /* Config. Reg. 5 (Version)        (cr5):02 */
8819        /* Config. Reg. 6 (Reserved)       (cr6):00 */
8820        /* Config. Reg. 7 (Reserved)       (cr7):00 */
8821        /* ;xr Registers */
8822        /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8823
8824        j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;        /* SO_1 set to '1' because it is inverted. */
8825        /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8826
8827        j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;         /* RING, Caller ID, VDD_OK */
8828        /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8829
8830        j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8831/* Ext. Reg. 3 (DC Char)           (xr3):22        ;  */
8832        j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
8833/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8834        j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8835/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8836        j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8837/* Ext. Reg. 6 (Power State)       (xr6):00 */
8838        j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8839/* Ext. Reg. 7 (Vdd)               (xr7):40 */
8840        j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;         /* 0x40 ??? Should it be 0x00? */
8841        /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8842        /*                                       12,33,5A,C3    ;  770 Hz   */
8843        /*                                       13,3C,5B,32    ;  852 Hz   */
8844        /*                                       1D,1B,5C,CC    ;  941 Hz   */
8845
8846        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8847        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8848        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8849        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8850/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8851        /*                                       EC,1D,52,22    ;  1336 Hz   */
8852        /*                                       AA,AC,51,D2    ;  1477 Hz   */
8853        /*                                       9B,3B,51,25    ;  1633 Hz   */
8854        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8855        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8856        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8857        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8858}
8859
8860static s16 tone_table[][19] =
8861{
8862        {                       /* f20_50[] 11 */
8863                32538,          /* A1 = 1.985962 */
8864                 -32325,        /* A2 = -0.986511 */
8865                 -343,          /* B2 = -0.010493 */
8866                 0,             /* B1 = 0 */
8867                 343,           /* B0 = 0.010493 */
8868                 32619,         /* A1 = 1.990906 */
8869                 -32520,        /* A2 = -0.992462 */
8870                 19179,         /* B2 = 0.585327 */
8871                 -19178,        /* B1 = -1.170593 */
8872                 19179,         /* B0 = 0.585327 */
8873                 32723,         /* A1 = 1.997314 */
8874                 -32686,        /* A2 = -0.997528 */
8875                 9973,          /* B2 = 0.304352 */
8876                 -9955,         /* B1 = -0.607605 */
8877                 9973,          /* B0 = 0.304352 */
8878                 7,             /* Internal filter scaling */
8879                 159,           /* Minimum in-band energy threshold */
8880                 21,            /* 21/32 in-band to broad-band ratio */
8881                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8882        },
8883        {                       /* f133_200[] 12 */
8884                32072,          /* A1 = 1.95752 */
8885                 -31896,        /* A2 = -0.973419 */
8886                 -435,          /* B2 = -0.013294 */
8887                 0,             /* B1 = 0 */
8888                 435,           /* B0 = 0.013294 */
8889                 32188,         /* A1 = 1.9646 */
8890                 -32400,        /* A2 = -0.98877 */
8891                 15139,         /* B2 = 0.462036 */
8892                 -14882,        /* B1 = -0.908356 */
8893                 15139,         /* B0 = 0.462036 */
8894                 32473,         /* A1 = 1.981995 */
8895                 -32524,        /* A2 = -0.992584 */
8896                 23200,         /* B2 = 0.708008 */
8897                 -23113,        /* B1 = -1.410706 */
8898                 23200,         /* B0 = 0.708008 */
8899                 7,             /* Internal filter scaling */
8900                 159,           /* Minimum in-band energy threshold */
8901                 21,            /* 21/32 in-band to broad-band ratio */
8902                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8903        },
8904        {                       /* f300 13 */
8905                31769,          /* A1 = -1.939026 */
8906                 -32584,        /* A2 = 0.994385 */
8907                 -475,          /* B2 = -0.014522 */
8908                 0,             /* B1 = 0.000000 */
8909                 475,           /* B0 = 0.014522 */
8910                 31789,         /* A1 = -1.940247 */
8911                 -32679,        /* A2 = 0.997284 */
8912                 17280,         /* B2 = 0.527344 */
8913                 -16865,        /* B1 = -1.029358 */
8914                 17280,         /* B0 = 0.527344 */
8915                 31841,         /* A1 = -1.943481 */
8916                 -32681,        /* A2 = 0.997345 */
8917                 543,           /* B2 = 0.016579 */
8918                 -525,          /* B1 = -0.032097 */
8919                 543,           /* B0 = 0.016579 */
8920                 5,             /* Internal filter scaling */
8921                 159,           /* Minimum in-band energy threshold */
8922                 21,            /* 21/32 in-band to broad-band ratio */
8923                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8924        },
8925        {                       /* f300_420[] 14 */
8926                30750,          /* A1 = 1.876892 */
8927                 -31212,        /* A2 = -0.952515 */
8928                 -804,          /* B2 = -0.024541 */
8929                 0,             /* B1 = 0 */
8930                 804,           /* B0 = 0.024541 */
8931                 30686,         /* A1 = 1.872925 */
8932                 -32145,        /* A2 = -0.980988 */
8933                 14747,         /* B2 = 0.450043 */
8934                 -13703,        /* B1 = -0.836395 */
8935                 14747,         /* B0 = 0.450043 */
8936                 31651,         /* A1 = 1.931824 */
8937                 -32321,        /* A2 = -0.986389 */
8938                 24425,         /* B2 = 0.745422 */
8939                 -23914,        /* B1 = -1.459595 */
8940                 24427,         /* B0 = 0.745483 */
8941                 7,             /* Internal filter scaling */
8942                 159,           /* Minimum in-band energy threshold */
8943                 21,            /* 21/32 in-band to broad-band ratio */
8944                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8945        },
8946        {                       /* f330 15 */
8947                31613,          /* A1 = -1.929565 */
8948                 -32646,        /* A2 = 0.996277 */
8949                 -185,          /* B2 = -0.005657 */
8950                 0,             /* B1 = 0.000000 */
8951                 185,           /* B0 = 0.005657 */
8952                 31620,         /* A1 = -1.929932 */
8953                 -32713,        /* A2 = 0.998352 */
8954                 19253,         /* B2 = 0.587585 */
8955                 -18566,        /* B1 = -1.133179 */
8956                 19253,         /* B0 = 0.587585 */
8957                 31674,         /* A1 = -1.933228 */
8958                 -32715,        /* A2 = 0.998413 */
8959                 2575,          /* B2 = 0.078590 */
8960                 -2495,         /* B1 = -0.152283 */
8961                 2575,          /* B0 = 0.078590 */
8962                 5,             /* Internal filter scaling */
8963                 159,           /* Minimum in-band energy threshold */
8964                 21,            /* 21/32 in-band to broad-band ratio */
8965                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8966        },
8967        {                       /* f300_425[] 16 */
8968                30741,          /* A1 = 1.876282 */
8969                 -31475,        /* A2 = -0.960541 */
8970                 -703,          /* B2 = -0.021484 */
8971                 0,             /* B1 = 0 */
8972                 703,           /* B0 = 0.021484 */
8973                 30688,         /* A1 = 1.873047 */
8974                 -32248,        /* A2 = -0.984161 */
8975                 14542,         /* B2 = 0.443787 */
8976                 -13523,        /* B1 = -0.825439 */
8977                 14542,         /* B0 = 0.443817 */
8978                 31494,         /* A1 = 1.922302 */
8979                 -32366,        /* A2 = -0.987762 */
8980                 21577,         /* B2 = 0.658508 */
8981                 -21013,        /* B1 = -1.282532 */
8982                 21577,         /* B0 = 0.658508 */
8983                 7,             /* Internal filter scaling */
8984                 159,           /* Minimum in-band energy threshold */
8985                 21,            /* 21/32 in-band to broad-band ratio */
8986                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8987        },
8988        {                       /* f330_440[] 17 */
8989                30627,          /* A1 = 1.869324 */
8990                 -31338,        /* A2 = -0.95636 */
8991                 -843,          /* B2 = -0.025749 */
8992                 0,             /* B1 = 0 */
8993                 843,           /* B0 = 0.025749 */
8994                 30550,         /* A1 = 1.864685 */
8995                 -32221,        /* A2 = -0.983337 */
8996                 13594,         /* B2 = 0.414886 */
8997                 -12589,        /* B1 = -0.768402 */
8998                 13594,         /* B0 = 0.414886 */
8999                 31488,         /* A1 = 1.921936 */
9000                 -32358,        /* A2 = -0.987518 */
9001                 24684,         /* B2 = 0.753296 */
9002                 -24029,        /* B1 = -1.466614 */
9003                 24684,         /* B0 = 0.753296 */
9004                 7,             /* Internal filter scaling */
9005                 159,           /* Minimum in-band energy threshold */
9006                 21,            /* 21/32 in-band to broad-band ratio */
9007                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9008        },
9009        {                       /* f340 18 */
9010                31546,          /* A1 = -1.925476 */
9011                 -32646,        /* A2 = 0.996277 */
9012                 -445,          /* B2 = -0.013588 */
9013                 0,             /* B1 = 0.000000 */
9014                 445,           /* B0 = 0.013588 */
9015                 31551,         /* A1 = -1.925781 */
9016                 -32713,        /* A2 = 0.998352 */
9017                 23884,         /* B2 = 0.728882 */
9018                 -22979,        /* B1 = -1.402527 */
9019                 23884,         /* B0 = 0.728882 */
9020                 31606,         /* A1 = -1.929138 */
9021                 -32715,        /* A2 = 0.998413 */
9022                 863,           /* B2 = 0.026367 */
9023                 -835,          /* B1 = -0.050985 */
9024                 863,           /* B0 = 0.026367 */
9025                 5,             /* Internal filter scaling */
9026                 159,           /* Minimum in-band energy threshold */
9027                 21,            /* 21/32 in-band to broad-band ratio */
9028                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9029        },
9030        {                       /* f350_400[] 19 */
9031                31006,          /* A1 = 1.892517 */
9032                 -32029,        /* A2 = -0.977448 */
9033                 -461,          /* B2 = -0.014096 */
9034                 0,             /* B1 = 0 */
9035                 461,           /* B0 = 0.014096 */
9036                 30999,         /* A1 = 1.892029 */
9037                 -32487,        /* A2 = -0.991455 */
9038                 11325,         /* B2 = 0.345612 */
9039                 -10682,        /* B1 = -0.651978 */
9040                 11325,         /* B0 = 0.345612 */
9041                 31441,         /* A1 = 1.919067 */
9042                 -32526,        /* A2 = -0.992615 */
9043                 24324,         /* B2 = 0.74231 */
9044                 -23535,        /* B1 = -1.436523 */
9045                 24324,         /* B0 = 0.74231 */
9046                 7,             /* Internal filter scaling */
9047                 159,           /* Minimum in-band energy threshold */
9048                 21,            /* 21/32 in-band to broad-band ratio */
9049                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9050        },
9051        {                       /* f350_440[] */
9052                30634,          /* A1 = 1.869751 */
9053                 -31533,        /* A2 = -0.962341 */
9054                 -680,          /* B2 = -0.020782 */
9055                 0,             /* B1 = 0 */
9056                 680,           /* B0 = 0.020782 */
9057                 30571,         /* A1 = 1.865906 */
9058                 -32277,        /* A2 = -0.985016 */
9059                 12894,         /* B2 = 0.393524 */
9060                 -11945,        /* B1 = -0.729065 */
9061                 12894,         /* B0 = 0.393524 */
9062                 31367,         /* A1 = 1.91449 */
9063                 -32379,        /* A2 = -0.988129 */
9064                 23820,         /* B2 = 0.726929 */
9065                 -23104,        /* B1 = -1.410217 */
9066                 23820,         /* B0 = 0.726929 */
9067                 7,             /* Internal filter scaling */
9068                 159,           /* Minimum in-band energy threshold */
9069                 21,            /* 21/32 in-band to broad-band ratio */
9070                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9071        },
9072        {                       /* f350_450[] */
9073                30552,          /* A1 = 1.864807 */
9074                 -31434,        /* A2 = -0.95929 */
9075                 -690,          /* B2 = -0.021066 */
9076                 0,             /* B1 = 0 */
9077                 690,           /* B0 = 0.021066 */
9078                 30472,         /* A1 = 1.859924 */
9079                 -32248,        /* A2 = -0.984161 */
9080                 13385,         /* B2 = 0.408478 */
9081                 -12357,        /* B1 = -0.754242 */
9082                 13385,         /* B0 = 0.408478 */
9083                 31358,         /* A1 = 1.914001 */
9084                 -32366,        /* A2 = -0.987732 */
9085                 26488,         /* B2 = 0.80835 */
9086                 -25692,        /* B1 = -1.568176 */
9087                 26490,         /* B0 = 0.808411 */
9088                 7,             /* Internal filter scaling */
9089                 159,           /* Minimum in-band energy threshold */
9090                 21,            /* 21/32 in-band to broad-band ratio */
9091                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9092        },
9093        {                       /* f360 */
9094                31397,          /* A1 = -1.916321 */
9095                 -32623,        /* A2 = 0.995605 */
9096                 -117,          /* B2 = -0.003598 */
9097                 0,             /* B1 = 0.000000 */
9098                 117,           /* B0 = 0.003598 */
9099                 31403,         /* A1 = -1.916687 */
9100                 -32700,        /* A2 = 0.997925 */
9101                 3388,          /* B2 = 0.103401 */
9102                 -3240,         /* B1 = -0.197784 */
9103                 3388,          /* B0 = 0.103401 */
9104                 31463,         /* A1 = -1.920410 */
9105                 -32702,        /* A2 = 0.997986 */
9106                 13346,         /* B2 = 0.407288 */
9107                 -12863,        /* B1 = -0.785126 */
9108                 13346,         /* B0 = 0.407288 */
9109                 5,             /* Internal filter scaling */
9110                 159,           /* Minimum in-band energy threshold */
9111                 21,            /* 21/32 in-band to broad-band ratio */
9112                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9113        },
9114        {                       /* f380_420[] */
9115                30831,          /* A1 = 1.881775 */
9116                 -32064,        /* A2 = -0.978546 */
9117                 -367,          /* B2 = -0.01122 */
9118                 0,             /* B1 = 0 */
9119                 367,           /* B0 = 0.01122 */
9120                 30813,         /* A1 = 1.880737 */
9121                 -32456,        /* A2 = -0.990509 */
9122                 11068,         /* B2 = 0.337769 */
9123                 -10338,        /* B1 = -0.631042 */
9124                 11068,         /* B0 = 0.337769 */
9125                 31214,         /* A1 = 1.905212 */
9126                 -32491,        /* A2 = -0.991577 */
9127                 16374,         /* B2 = 0.499695 */
9128                 -15781,        /* B1 = -0.963196 */
9129                 16374,         /* B0 = 0.499695 */
9130                 7,             /* Internal filter scaling */
9131                 159,           /* Minimum in-band energy threshold */
9132                 21,            /* 21/32 in-band to broad-band ratio */
9133                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9134        },
9135        {                       /* f392 */
9136                31152,          /* A1 = -1.901428 */
9137                 -32613,        /* A2 = 0.995300 */
9138                 -314,          /* B2 = -0.009605 */
9139                 0,             /* B1 = 0.000000 */
9140                 314,           /* B0 = 0.009605 */
9141                 31156,         /* A1 = -1.901672 */
9142                 -32694,        /* A2 = 0.997742 */
9143                 28847,         /* B2 = 0.880371 */
9144                 -2734,         /* B1 = -0.166901 */
9145                 28847,         /* B0 = 0.880371 */
9146                 31225,         /* A1 = -1.905823 */
9147                 -32696,        /* A2 = 0.997803 */
9148                 462,           /* B2 = 0.014108 */
9149                 -442,          /* B1 = -0.027019 */
9150                 462,           /* B0 = 0.014108 */
9151                 5,             /* Internal filter scaling */
9152                 159,           /* Minimum in-band energy threshold */
9153                 21,            /* 21/32 in-band to broad-band ratio */
9154                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9155        },
9156        {                       /* f400_425[] */
9157                30836,          /* A1 = 1.882141 */
9158                 -32296,        /* A2 = -0.985596 */
9159                 -324,          /* B2 = -0.009903 */
9160                 0,             /* B1 = 0 */
9161                 324,           /* B0 = 0.009903 */
9162                 30825,         /* A1 = 1.881409 */
9163                 -32570,        /* A2 = -0.993958 */
9164                 16847,         /* B2 = 0.51416 */
9165                 -15792,        /* B1 = -0.963898 */
9166                 16847,         /* B0 = 0.51416 */
9167                 31106,         /* A1 = 1.89856 */
9168                 -32584,        /* A2 = -0.994415 */
9169                 9579,          /* B2 = 0.292328 */
9170                 -9164,         /* B1 = -0.559357 */
9171                 9579,          /* B0 = 0.292328 */
9172                 7,             /* Internal filter scaling */
9173                 159,           /* Minimum in-band energy threshold */
9174                 21,            /* 21/32 in-band to broad-band ratio */
9175                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9176        },
9177        {                       /* f400_440[] */
9178                30702,          /* A1 = 1.873962 */
9179                 -32134,        /* A2 = -0.980682 */
9180                 -517,          /* B2 = -0.015793 */
9181                 0,             /* B1 = 0 */
9182                 517,           /* B0 = 0.015793 */
9183                 30676,         /* A1 = 1.872375 */
9184                 -32520,        /* A2 = -0.992462 */
9185                 8144,          /* B2 = 0.24855 */
9186                 -7596,         /* B1 = -0.463684 */
9187                 8144,          /* B0 = 0.24855 */
9188                 31084,         /* A1 = 1.897217 */
9189                 -32547,        /* A2 = -0.993256 */
9190                 22713,         /* B2 = 0.693176 */
9191                 -21734,        /* B1 = -1.326599 */
9192                 22713,         /* B0 = 0.693176 */
9193                 7,             /* Internal filter scaling */
9194                 159,           /* Minimum in-band energy threshold */
9195                 21,            /* 21/32 in-band to broad-band ratio */
9196                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9197        },
9198        {                       /* f400_450[] */
9199                30613,          /* A1 = 1.86853 */
9200                 -32031,        /* A2 = -0.977509 */
9201                 -618,          /* B2 = -0.018866 */
9202                 0,             /* B1 = 0 */
9203                 618,           /* B0 = 0.018866 */
9204                 30577,         /* A1 = 1.866272 */
9205                 -32491,        /* A2 = -0.991577 */
9206                 9612,          /* B2 = 0.293335 */
9207                 -8935,         /* B1 = -0.54541 */
9208                 9612,          /* B0 = 0.293335 */
9209                 31071,         /* A1 = 1.896484 */
9210                 -32524,        /* A2 = -0.992584 */
9211                 21596,         /* B2 = 0.659058 */
9212                 -20667,        /* B1 = -1.261414 */
9213                 21596,         /* B0 = 0.659058 */
9214                 7,             /* Internal filter scaling */
9215                 159,           /* Minimum in-band energy threshold */
9216                 21,            /* 21/32 in-band to broad-band ratio */
9217                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9218        },
9219        {                       /* f420 */
9220                30914,          /* A1 = -1.886841 */
9221                 -32584,        /* A2 = 0.994385 */
9222                 -426,          /* B2 = -0.013020 */
9223                 0,             /* B1 = 0.000000 */
9224                 426,           /* B0 = 0.013020 */
9225                 30914,         /* A1 = -1.886841 */
9226                 -32679,        /* A2 = 0.997314 */
9227                 17520,         /* B2 = 0.534668 */
9228                 -16471,        /* B1 = -1.005310 */
9229                 17520,         /* B0 = 0.534668 */
9230                 31004,         /* A1 = -1.892334 */
9231                 -32683,        /* A2 = 0.997406 */
9232                 819,           /* B2 = 0.025023 */
9233                 -780,          /* B1 = -0.047619 */
9234                 819,           /* B0 = 0.025023 */
9235                 5,             /* Internal filter scaling */
9236                 159,           /* Minimum in-band energy threshold */
9237                 21,            /* 21/32 in-band to broad-band ratio */
9238                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9239        },
9240#if 0
9241        {                       /* f425 */
9242                30881,          /* A1 = -1.884827 */
9243                 -32603,        /* A2 = 0.994965 */
9244                 -496,          /* B2 = -0.015144 */
9245                 0,             /* B1 = 0.000000 */
9246                 496,           /* B0 = 0.015144 */
9247                 30880,         /* A1 = -1.884766 */
9248                 -32692,        /* A2 = 0.997711 */
9249                 24767,         /* B2 = 0.755859 */
9250                 -23290,        /* B1 = -1.421509 */
9251                 24767,         /* B0 = 0.755859 */
9252                 30967,         /* A1 = -1.890076 */
9253                 -32694,        /* A2 = 0.997772 */
9254                 728,           /* B2 = 0.022232 */
9255                 -691,          /* B1 = -0.042194 */
9256                 728,           /* B0 = 0.022232 */
9257                 5,             /* Internal filter scaling */
9258                 159,           /* Minimum in-band energy threshold */
9259                 21,            /* 21/32 in-band to broad-band ratio */
9260                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9261        },
9262#else
9263        {
9264                30850,
9265                -32534,
9266                -504,
9267                0,
9268                504,
9269                30831,
9270                -32669,
9271                24303,
9272                -22080,
9273                24303,
9274                30994,
9275                -32673,
9276                1905,
9277                -1811,
9278                1905,
9279                5,
9280                129,
9281                17,
9282                0xff5
9283        },
9284#endif
9285        {                       /* f425_450[] */
9286                30646,          /* A1 = 1.870544 */
9287                 -32327,        /* A2 = -0.986572 */
9288                 -287,          /* B2 = -0.008769 */
9289                 0,             /* B1 = 0 */
9290                 287,           /* B0 = 0.008769 */
9291                 30627,         /* A1 = 1.869324 */
9292                 -32607,        /* A2 = -0.995087 */
9293                 13269,         /* B2 = 0.404968 */
9294                 -12376,        /* B1 = -0.755432 */
9295                 13269,         /* B0 = 0.404968 */
9296                 30924,         /* A1 = 1.887512 */
9297                 -32619,        /* A2 = -0.995453 */
9298                 19950,         /* B2 = 0.608826 */
9299                 -18940,        /* B1 = -1.156006 */
9300                 19950,         /* B0 = 0.608826 */
9301                 7,             /* Internal filter scaling */
9302                 159,           /* Minimum in-band energy threshold */
9303                 21,            /* 21/32 in-band to broad-band ratio */
9304                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9305        },
9306        {                       /* f425_475[] */
9307                30396,          /* A1 = 1.855225 */
9308                 -32014,        /* A2 = -0.97699 */
9309                 -395,          /* B2 = -0.012055 */
9310                 0,             /* B1 = 0 */
9311                 395,           /* B0 = 0.012055 */
9312                 30343,         /* A1 = 1.85199 */
9313                 -32482,        /* A2 = -0.991302 */
9314                 17823,         /* B2 = 0.543945 */
9315                 -16431,        /* B1 = -1.002869 */
9316                 17823,         /* B0 = 0.543945 */
9317                 30872,         /* A1 = 1.884338 */
9318                 -32516,        /* A2 = -0.99231 */
9319                 18124,         /* B2 = 0.553101 */
9320                 -17246,        /* B1 = -1.052673 */
9321                 18124,         /* B0 = 0.553101 */
9322                 7,             /* Internal filter scaling */
9323                 159,           /* Minimum in-band energy threshold */
9324                 21,            /* 21/32 in-band to broad-band ratio */
9325                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9326        },
9327        {                       /* f435 */
9328                30796,          /* A1 = -1.879639 */
9329                 -32603,        /* A2 = 0.994965 */
9330                 -254,          /* B2 = -0.007762 */
9331                 0,             /* B1 = 0.000000 */
9332                 254,           /* B0 = 0.007762 */
9333                 30793,         /* A1 = -1.879456 */
9334                 -32692,        /* A2 = 0.997711 */
9335                 18934,         /* B2 = 0.577820 */
9336                 -17751,        /* B1 = -1.083496 */
9337                 18934,         /* B0 = 0.577820 */
9338                 30882,         /* A1 = -1.884888 */
9339                 -32694,        /* A2 = 0.997772 */
9340                 1858,          /* B2 = 0.056713 */
9341                 -1758,         /* B1 = -0.107357 */
9342                 1858,          /* B0 = 0.056713 */
9343                 5,             /* Internal filter scaling */
9344                 159,           /* Minimum in-band energy threshold */
9345                 21,            /* 21/32 in-band to broad-band ratio */
9346                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9347        },
9348        {                       /* f440_450[] */
9349                30641,          /* A1 = 1.870239 */
9350                 -32458,        /* A2 = -0.99057 */
9351                 -155,          /* B2 = -0.004735 */
9352                 0,             /* B1 = 0 */
9353                 155,           /* B0 = 0.004735 */
9354                 30631,         /* A1 = 1.869568 */
9355                 -32630,        /* A2 = -0.995789 */
9356                 11453,         /* B2 = 0.349548 */
9357                 -10666,        /* B1 = -0.651001 */
9358                 11453,         /* B0 = 0.349548 */
9359                 30810,         /* A1 = 1.880554 */
9360                 -32634,        /* A2 = -0.995941 */
9361                 12237,         /* B2 = 0.373474 */
9362                 -11588,        /* B1 = -0.707336 */
9363                 12237,         /* B0 = 0.373474 */
9364                 7,             /* Internal filter scaling */
9365                 159,           /* Minimum in-band energy threshold */
9366                 21,            /* 21/32 in-band to broad-band ratio */
9367                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9368        },
9369        {                       /* f440_480[] */
9370                30367,          /* A1 = 1.853455 */
9371                 -32147,        /* A2 = -0.981079 */
9372                 -495,          /* B2 = -0.015113 */
9373                 0,             /* B1 = 0 */
9374                 495,           /* B0 = 0.015113 */
9375                 30322,         /* A1 = 1.850769 */
9376                 -32543,        /* A2 = -0.993134 */
9377                 10031,         /* B2 = 0.306152 */
9378                 -9252,         /* B1 = -0.564728 */
9379                 10031,         /* B0 = 0.306152 */
9380                 30770,         /* A1 = 1.878052 */
9381                 -32563,        /* A2 = -0.993774 */
9382                 22674,         /* B2 = 0.691956 */
9383                 -21465,        /* B1 = -1.31012 */
9384                 22674,         /* B0 = 0.691956 */
9385                 7,             /* Internal filter scaling */
9386                 159,           /* Minimum in-band energy threshold */
9387                 21,            /* 21/32 in-band to broad-band ratio */
9388                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9389        },
9390        {                       /* f445 */
9391                30709,          /* A1 = -1.874329 */
9392                 -32603,        /* A2 = 0.994965 */
9393                 -83,           /* B2 = -0.002545 */
9394                 0,             /* B1 = 0.000000 */
9395                 83,            /* B0 = 0.002545 */
9396                 30704,         /* A1 = -1.874084 */
9397                 -32692,        /* A2 = 0.997711 */
9398                 10641,         /* B2 = 0.324738 */
9399                 -9947,         /* B1 = -0.607147 */
9400                 10641,         /* B0 = 0.324738 */
9401                 30796,         /* A1 = -1.879639 */
9402                 -32694,        /* A2 = 0.997772 */
9403                 10079,         /* B2 = 0.307587 */
9404                 9513,          /* B1 = 0.580688 */
9405                 10079,         /* B0 = 0.307587 */
9406                 5,             /* Internal filter scaling */
9407                 159,           /* Minimum in-band energy threshold */
9408                 21,            /* 21/32 in-band to broad-band ratio */
9409                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9410        },
9411        {                       /* f450 */
9412                30664,          /* A1 = -1.871643 */
9413                 -32603,        /* A2 = 0.994965 */
9414                 -164,          /* B2 = -0.005029 */
9415                 0,             /* B1 = 0.000000 */
9416                 164,           /* B0 = 0.005029 */
9417                 30661,         /* A1 = -1.871399 */
9418                 -32692,        /* A2 = 0.997711 */
9419                 15294,         /* B2 = 0.466736 */
9420                 -14275,        /* B1 = -0.871307 */
9421                 15294,         /* B0 = 0.466736 */
9422                 30751,         /* A1 = -1.876953 */
9423                 -32694,        /* A2 = 0.997772 */
9424                 3548,          /* B2 = 0.108284 */
9425                 -3344,         /* B1 = -0.204155 */
9426                 3548,          /* B0 = 0.108284 */
9427                 5,             /* Internal filter scaling */
9428                 159,           /* Minimum in-band energy threshold */
9429                 21,            /* 21/32 in-band to broad-band ratio */
9430                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9431        },
9432        {                       /* f452 */
9433                30653,          /* A1 = -1.870911 */
9434                 -32615,        /* A2 = 0.995361 */
9435                 -209,          /* B2 = -0.006382 */
9436                 0,             /* B1 = 0.000000 */
9437                 209,           /* B0 = 0.006382 */
9438                 30647,         /* A1 = -1.870605 */
9439                 -32702,        /* A2 = 0.997986 */
9440                 18971,         /* B2 = 0.578979 */
9441                 -17716,        /* B1 = -1.081299 */
9442                 18971,         /* B0 = 0.578979 */
9443                 30738,         /* A1 = -1.876099 */
9444                 -32702,        /* A2 = 0.998016 */
9445                 2967,          /* B2 = 0.090561 */
9446                 -2793,         /* B1 = -0.170502 */
9447                 2967,          /* B0 = 0.090561 */
9448                 5,             /* Internal filter scaling */
9449                 159,           /* Minimum in-band energy threshold */
9450                 21,            /* 21/32 in-band to broad-band ratio */
9451                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9452        },
9453        {                       /* f475 */
9454                30437,          /* A1 = -1.857727 */
9455                 -32603,        /* A2 = 0.994965 */
9456                 -264,          /* B2 = -0.008062 */
9457                 0,             /* B1 = 0.000000 */
9458                 264,           /* B0 = 0.008062 */
9459                 30430,         /* A1 = -1.857300 */
9460                 -32692,        /* A2 = 0.997711 */
9461                 21681,         /* B2 = 0.661682 */
9462                 -20082,        /* B1 = -1.225708 */
9463                 21681,         /* B0 = 0.661682 */
9464                 30526,         /* A1 = -1.863220 */
9465                 -32694,        /* A2 = 0.997742 */
9466                 1559,          /* B2 = 0.047600 */
9467                 -1459,         /* B1 = -0.089096 */
9468                 1559,          /* B0 = 0.047600 */
9469                 5,             /* Internal filter scaling */
9470                 159,           /* Minimum in-band energy threshold */
9471                 21,            /* 21/32 in-band to broad-band ratio */
9472                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9473        },
9474        {                       /* f480_620[] */
9475                28975,          /* A1 = 1.768494 */
9476                 -30955,        /* A2 = -0.944672 */
9477                 -1026,         /* B2 = -0.03133 */
9478                 0,             /* B1 = 0 */
9479                 1026,          /* B0 = 0.03133 */
9480                 28613,         /* A1 = 1.746399 */
9481                 -32089,        /* A2 = -0.979309 */
9482                 14214,         /* B2 = 0.433807 */
9483                 -12202,        /* B1 = -0.744812 */
9484                 14214,         /* B0 = 0.433807 */
9485                 30243,         /* A1 = 1.845947 */
9486                 -32238,        /* A2 = -0.983856 */
9487                 24825,         /* B2 = 0.757629 */
9488                 -23402,        /* B1 = -1.428345 */
9489                 24825,         /* B0 = 0.757629 */
9490                 7,             /* Internal filter scaling */
9491                 159,           /* Minimum in-band energy threshold */
9492                 21,            /* 21/32 in-band to broad-band ratio */
9493                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9494        },
9495        {                       /* f494 */
9496                30257,          /* A1 = -1.846741 */
9497                 -32605,        /* A2 = 0.995056 */
9498                 -249,          /* B2 = -0.007625 */
9499                 0,             /* B1 = 0.000000 */
9500                 249,           /* B0 = 0.007625 */
9501                 30247,         /* A1 = -1.846191 */
9502                 -32694,        /* A2 = 0.997772 */
9503                 18088,         /* B2 = 0.552002 */
9504                 -16652,        /* B1 = -1.016418 */
9505                 18088,         /* B0 = 0.552002 */
9506                 30348,         /* A1 = -1.852295 */
9507                 -32696,        /* A2 = 0.997803 */
9508                 2099,          /* B2 = 0.064064 */
9509                 -1953,         /* B1 = -0.119202 */
9510                 2099,          /* B0 = 0.064064 */
9511                 5,             /* Internal filter scaling */
9512                 159,           /* Minimum in-band energy threshold */
9513                 21,            /* 21/32 in-band to broad-band ratio */
9514                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9515        },
9516        {                       /* f500 */
9517                30202,          /* A1 = -1.843431 */
9518                 -32624,        /* A2 = 0.995622 */
9519                 -413,          /* B2 = -0.012622 */
9520                 0,             /* B1 = 0.000000 */
9521                 413,           /* B0 = 0.012622 */
9522                 30191,         /* A1 = -1.842721 */
9523                 -32714,        /* A2 = 0.998364 */
9524                 25954,         /* B2 = 0.792057 */
9525                 -23890,        /* B1 = -1.458131 */
9526                 25954,         /* B0 = 0.792057 */
9527                 30296,         /* A1 = -1.849172 */
9528                 -32715,        /* A2 = 0.998397 */
9529                 2007,          /* B2 = 0.061264 */
9530                 -1860,         /* B1 = -0.113568 */
9531                 2007,          /* B0 = 0.061264 */
9532                 5,             /* Internal filter scaling */
9533                 159,           /* Minimum in-band energy threshold */
9534                 21,            /* 21/32 in-band to broad-band ratio */
9535                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9536        },
9537        {                       /* f520 */
9538                30001,          /* A1 = -1.831116 */
9539                 -32613,        /* A2 = 0.995270 */
9540                 -155,          /* B2 = -0.004750 */
9541                 0,             /* B1 = 0.000000 */
9542                 155,           /* B0 = 0.004750 */
9543                 29985,         /* A1 = -1.830200 */
9544                 -32710,        /* A2 = 0.998260 */
9545                 6584,          /* B2 = 0.200928 */
9546                 -6018,         /* B1 = -0.367355 */
9547                 6584,          /* B0 = 0.200928 */
9548                 30105,         /* A1 = -1.837524 */
9549                 -32712,        /* A2 = 0.998291 */
9550                 23812,         /* B2 = 0.726685 */
9551                 -21936,        /* B1 = -1.338928 */
9552                 23812,         /* B0 = 0.726685 */
9553                 5,             /* Internal filter scaling */
9554                 159,           /* Minimum in-band energy threshold */
9555                 21,            /* 21/32 in-band to broad-band ratio */
9556                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9557        },
9558        {                       /* f523 */
9559                29964,          /* A1 = -1.828918 */
9560                 -32601,        /* A2 = 0.994904 */
9561                 -101,          /* B2 = -0.003110 */
9562                 0,             /* B1 = 0.000000 */
9563                 101,           /* B0 = 0.003110 */
9564                 29949,         /* A1 = -1.827942 */
9565                 -32700,        /* A2 = 0.997925 */
9566                 11041,         /* B2 = 0.336975 */
9567                 -10075,        /* B1 = -0.614960 */
9568                 11041,         /* B0 = 0.336975 */
9569                 30070,         /* A1 = -1.835388 */
9570                 -32702,        /* A2 = 0.997986 */
9571                 16762,         /* B2 = 0.511536 */
9572                 -15437,        /* B1 = -0.942230 */
9573                 16762,         /* B0 = 0.511536 */
9574                 5,             /* Internal filter scaling */
9575                 159,           /* Minimum in-band energy threshold */
9576                 21,            /* 21/32 in-band to broad-band ratio */
9577                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9578        },
9579        {                       /* f525 */
9580                29936,          /* A1 = -1.827209 */
9581                 -32584,        /* A2 = 0.994415 */
9582                 -91,           /* B2 = -0.002806 */
9583                 0,             /* B1 = 0.000000 */
9584                 91,            /* B0 = 0.002806 */
9585                 29921,         /* A1 = -1.826233 */
9586                 -32688,        /* A2 = 0.997559 */
9587                 11449,         /* B2 = 0.349396 */
9588                 -10426,        /* B1 = -0.636383 */
9589                 11449,         /* B0 = 0.349396 */
9590                 30045,         /* A1 = -1.833862 */
9591                 -32688,        /* A2 = 0.997589 */
9592                 13055,         /* B2 = 0.398407 */
9593                 -12028,        /* B1 = -0.734161 */
9594                 13055,         /* B0 = 0.398407 */
9595                 5,             /* Internal filter scaling */
9596                 159,           /* Minimum in-band energy threshold */
9597                 21,            /* 21/32 in-band to broad-band ratio */
9598                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9599        },
9600        {                       /* f540_660[] */
9601                28499,          /* A1 = 1.739441 */
9602                 -31129,        /* A2 = -0.949982 */
9603                 -849,          /* B2 = -0.025922 */
9604                 0,             /* B1 = 0 */
9605                 849,           /* B0 = 0.025922 */
9606                 28128,         /* A1 = 1.716797 */
9607                 -32130,        /* A2 = -0.98056 */
9608                 14556,         /* B2 = 0.444214 */
9609                 -12251,        /* B1 = -0.747772 */
9610                 14556,         /* B0 = 0.444244 */
9611                 29667,         /* A1 = 1.81073 */
9612                 -32244,        /* A2 = -0.984039 */
9613                 23038,         /* B2 = 0.703064 */
9614                 -21358,        /* B1 = -1.303589 */
9615                 23040,         /* B0 = 0.703125 */
9616                 7,             /* Internal filter scaling */
9617                 159,           /* Minimum in-band energy threshold */
9618                 21,            /* 21/32 in-band to broad-band ratio */
9619                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9620        },
9621        {                       /* f587 */
9622                29271,          /* A1 = -1.786560 */
9623                 -32599,        /* A2 = 0.994873 */
9624                 -490,          /* B2 = -0.014957 */
9625                 0,             /* B1 = 0.000000 */
9626                 490,           /* B0 = 0.014957 */
9627                 29246,         /* A1 = -1.785095 */
9628                 -32700,        /* A2 = 0.997925 */
9629                 28961,         /* B2 = 0.883850 */
9630                 -25796,        /* B1 = -1.574463 */
9631                 28961,         /* B0 = 0.883850 */
9632                 29383,         /* A1 = -1.793396 */
9633                 -32700,        /* A2 = 0.997955 */
9634                 1299,          /* B2 = 0.039650 */
9635                 -1169,         /* B1 = -0.071396 */
9636                 1299,          /* B0 = 0.039650 */
9637                 5,             /* Internal filter scaling */
9638                 159,           /* Minimum in-band energy threshold */
9639                 21,            /* 21/32 in-band to broad-band ratio */
9640                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9641        },
9642        {                       /* f590 */
9643                29230,          /* A1 = -1.784058 */
9644                 -32584,        /* A2 = 0.994415 */
9645                 -418,          /* B2 = -0.012757 */
9646                 0,             /* B1 = 0.000000 */
9647                 418,           /* B0 = 0.012757 */
9648                 29206,         /* A1 = -1.782593 */
9649                 -32688,        /* A2 = 0.997559 */
9650                 36556,         /* B2 = 1.115601 */
9651                 -32478,        /* B1 = -1.982300 */
9652                 36556,         /* B0 = 1.115601 */
9653                 29345,         /* A1 = -1.791077 */
9654                 -32688,        /* A2 = 0.997589 */
9655                 897,           /* B2 = 0.027397 */
9656                 -808,          /* B1 = -0.049334 */
9657                 897,           /* B0 = 0.027397 */
9658                 5,             /* Internal filter scaling */
9659                 159,           /* Minimum in-band energy threshold */
9660                 21,            /* 21/32 in-band to broad-band ratio */
9661                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9662        },
9663        {                       /* f600 */
9664                29116,          /* A1 = -1.777100 */
9665                 -32603,        /* A2 = 0.994965 */
9666                 -165,          /* B2 = -0.005039 */
9667                 0,             /* B1 = 0.000000 */
9668                 165,           /* B0 = 0.005039 */
9669                 29089,         /* A1 = -1.775452 */
9670                 -32708,        /* A2 = 0.998199 */
9671                 6963,          /* B2 = 0.212494 */
9672                 -6172,         /* B1 = -0.376770 */
9673                 6963,          /* B0 = 0.212494 */
9674                 29237,         /* A1 = -1.784485 */
9675                 -32710,        /* A2 = 0.998230 */
9676                 24197,         /* B2 = 0.738464 */
9677                 -21657,        /* B1 = -1.321899 */
9678                 24197,         /* B0 = 0.738464 */
9679                 5,             /* Internal filter scaling */
9680                 159,           /* Minimum in-band energy threshold */
9681                 21,            /* 21/32 in-band to broad-band ratio */
9682                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9683        },
9684        {                       /* f660 */
9685                28376,          /* A1 = -1.731934 */
9686                 -32567,        /* A2 = 0.993896 */
9687                 -363,          /* B2 = -0.011102 */
9688                 0,             /* B1 = 0.000000 */
9689                 363,           /* B0 = 0.011102 */
9690                 28337,         /* A1 = -1.729614 */
9691                 -32683,        /* A2 = 0.997434 */
9692                 21766,         /* B2 = 0.664246 */
9693                 -18761,        /* B1 = -1.145081 */
9694                 21766,         /* B0 = 0.664246 */
9695                 28513,         /* A1 = -1.740356 */
9696                 -32686,        /* A2 = 0.997498 */
9697                 2509,          /* B2 = 0.076584 */
9698                 -2196,         /* B1 = -0.134041 */
9699                 2509,          /* B0 = 0.076584 */
9700                 5,             /* Internal filter scaling */
9701                 159,           /* Minimum in-band energy threshold */
9702                 21,            /* 21/32 in-band to broad-band ratio */
9703                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9704        },
9705        {                       /* f700 */
9706                27844,          /* A1 = -1.699463 */
9707                 -32563,        /* A2 = 0.993744 */
9708                 -366,          /* B2 = -0.011187 */
9709                 0,             /* B1 = 0.000000 */
9710                 366,           /* B0 = 0.011187 */
9711                 27797,         /* A1 = -1.696655 */
9712                 -32686,        /* A2 = 0.997498 */
9713                 22748,         /* B2 = 0.694214 */
9714                 -19235,        /* B1 = -1.174072 */
9715                 22748,         /* B0 = 0.694214 */
9716                 27995,         /* A1 = -1.708740 */
9717                 -32688,        /* A2 = 0.997559 */
9718                 2964,          /* B2 = 0.090477 */
9719                 -2546,         /* B1 = -0.155449 */
9720                 2964,          /* B0 = 0.090477 */
9721                 5,             /* Internal filter scaling */
9722                 159,           /* Minimum in-band energy threshold */
9723                 21,            /* 21/32 in-band to broad-band ratio */
9724                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9725        },
9726        {                       /* f740 */
9727                27297,          /* A1 = -1.666077 */
9728                 -32551,        /* A2 = 0.993408 */
9729                 -345,          /* B2 = -0.010540 */
9730                 0,             /* B1 = 0.000000 */
9731                 345,           /* B0 = 0.010540 */
9732                 27240,         /* A1 = -1.662598 */
9733                 -32683,        /* A2 = 0.997406 */
9734                 22560,         /* B2 = 0.688477 */
9735                 -18688,        /* B1 = -1.140625 */
9736                 22560,         /* B0 = 0.688477 */
9737                 27461,         /* A1 = -1.676147 */
9738                 -32684,        /* A2 = 0.997467 */
9739                 3541,          /* B2 = 0.108086 */
9740                 -2985,         /* B1 = -0.182220 */
9741                 3541,          /* B0 = 0.108086 */
9742                 5,             /* Internal filter scaling */
9743                 159,           /* Minimum in-band energy threshold */
9744                 21,            /* 21/32 in-band to broad-band ratio */
9745                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9746        },
9747        {                       /* f750 */
9748                27155,          /* A1 = -1.657410 */
9749                 -32551,        /* A2 = 0.993408 */
9750                 -462,          /* B2 = -0.014117 */
9751                 0,             /* B1 = 0.000000 */
9752                 462,           /* B0 = 0.014117 */
9753                 27097,         /* A1 = -1.653870 */
9754                 -32683,        /* A2 = 0.997406 */
9755                 32495,         /* B2 = 0.991699 */
9756                 -26776,        /* B1 = -1.634338 */
9757                 32495,         /* B0 = 0.991699 */
9758                 27321,         /* A1 = -1.667542 */
9759                 -32684,        /* A2 = 0.997467 */
9760                 1835,          /* B2 = 0.056007 */
9761                 -1539,         /* B1 = -0.093948 */
9762                 1835,          /* B0 = 0.056007 */
9763                 5,             /* Internal filter scaling */
9764                 159,           /* Minimum in-band energy threshold */
9765                 21,            /* 21/32 in-band to broad-band ratio */
9766                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9767        },
9768        {                       /* f750_1450[] */
9769                19298,          /* A1 = 1.177917 */
9770                 -24471,        /* A2 = -0.746796 */
9771                 -4152,         /* B2 = -0.126709 */
9772                 0,             /* B1 = 0 */
9773                 4152,          /* B0 = 0.126709 */
9774                 12902,         /* A1 = 0.787476 */
9775                 -29091,        /* A2 = -0.887817 */
9776                 12491,         /* B2 = 0.38121 */
9777                 -1794,         /* B1 = -0.109528 */
9778                 12494,         /* B0 = 0.381317 */
9779                 26291,         /* A1 = 1.604736 */
9780                 -30470,        /* A2 = -0.929901 */
9781                 28859,         /* B2 = 0.880737 */
9782                 -26084,        /* B1 = -1.592102 */
9783                 28861,         /* B0 = 0.880798 */
9784                 7,             /* Internal filter scaling */
9785                 159,           /* Minimum in-band energy threshold */
9786                 21,            /* 21/32 in-band to broad-band ratio */
9787                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9788        },
9789        {                       /* f770 */
9790                26867,          /* A1 = -1.639832 */
9791                 -32551,        /* A2 = 0.993408 */
9792                 -123,          /* B2 = -0.003755 */
9793                 0,             /* B1 = 0.000000 */
9794                 123,           /* B0 = 0.003755 */
9795                 26805,         /* A1 = -1.636108 */
9796                 -32683,        /* A2 = 0.997406 */
9797                 17297,         /* B2 = 0.527863 */
9798                 -14096,        /* B1 = -0.860382 */
9799                 17297,         /* B0 = 0.527863 */
9800                 27034,         /* A1 = -1.650085 */
9801                 -32684,        /* A2 = 0.997467 */
9802                 12958,         /* B2 = 0.395477 */
9803                 -10756,        /* B1 = -0.656525 */
9804                 12958,         /* B0 = 0.395477 */
9805                 5,             /* Internal filter scaling */
9806                 159,           /* Minimum in-band energy threshold */
9807                 21,            /* 21/32 in-band to broad-band ratio */
9808                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9809        },
9810        {                       /* f800 */
9811                26413,          /* A1 = -1.612122 */
9812                 -32547,        /* A2 = 0.993286 */
9813                 -223,          /* B2 = -0.006825 */
9814                 0,             /* B1 = 0.000000 */
9815                 223,           /* B0 = 0.006825 */
9816                 26342,         /* A1 = -1.607849 */
9817                 -32686,        /* A2 = 0.997498 */
9818                 6391,          /* B2 = 0.195053 */
9819                 -5120,         /* B1 = -0.312531 */
9820                 6391,          /* B0 = 0.195053 */
9821                 26593,         /* A1 = -1.623108 */
9822                 -32688,        /* A2 = 0.997559 */
9823                 23681,         /* B2 = 0.722717 */
9824                 -19328,        /* B1 = -1.179688 */
9825                 23681,         /* B0 = 0.722717 */
9826                 5,             /* Internal filter scaling */
9827                 159,           /* Minimum in-band energy threshold */
9828                 21,            /* 21/32 in-band to broad-band ratio */
9829                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9830        },
9831        {                       /* f816 */
9832                26168,          /* A1 = -1.597209 */
9833                 -32528,        /* A2 = 0.992706 */
9834                 -235,          /* B2 = -0.007182 */
9835                 0,             /* B1 = 0.000000 */
9836                 235,           /* B0 = 0.007182 */
9837                 26092,         /* A1 = -1.592590 */
9838                 -32675,        /* A2 = 0.997192 */
9839                 20823,         /* B2 = 0.635498 */
9840                 -16510,        /* B1 = -1.007751 */
9841                 20823,         /* B0 = 0.635498 */
9842                 26363,         /* A1 = -1.609070 */
9843                 -32677,        /* A2 = 0.997253 */
9844                 6739,          /* B2 = 0.205688 */
9845                 -5459,         /* B1 = -0.333206 */
9846                 6739,          /* B0 = 0.205688 */
9847                 5,             /* Internal filter scaling */
9848                 159,           /* Minimum in-band energy threshold */
9849                 21,            /* 21/32 in-band to broad-band ratio */
9850                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9851        },
9852        {                       /* f850 */
9853                25641,          /* A1 = -1.565063 */
9854                 -32536,        /* A2 = 0.992950 */
9855                 -121,          /* B2 = -0.003707 */
9856                 0,             /* B1 = 0.000000 */
9857                 121,           /* B0 = 0.003707 */
9858                 25560,         /* A1 = -1.560059 */
9859                 -32684,        /* A2 = 0.997437 */
9860                 18341,         /* B2 = 0.559753 */
9861                 -14252,        /* B1 = -0.869904 */
9862                 18341,         /* B0 = 0.559753 */
9863                 25837,         /* A1 = -1.577026 */
9864                 -32684,        /* A2 = 0.997467 */
9865                 16679,         /* B2 = 0.509003 */
9866                 -13232,        /* B1 = -0.807648 */
9867                 16679,         /* B0 = 0.509003 */
9868                 5,             /* Internal filter scaling */
9869                 159,           /* Minimum in-band energy threshold */
9870                 21,            /* 21/32 in-band to broad-band ratio */
9871                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9872        },
9873        {                       /* f857_1645[] */
9874                16415,          /* A1 = 1.001953 */
9875                 -23669,        /* A2 = -0.722321 */
9876                 -4549,         /* B2 = -0.138847 */
9877                 0,             /* B1 = 0 */
9878                 4549,          /* B0 = 0.138847 */
9879                 8456,          /* A1 = 0.516174 */
9880                 -28996,        /* A2 = -0.884918 */
9881                 13753,         /* B2 = 0.419724 */
9882                 -12,           /* B1 = -0.000763 */
9883                 13757,         /* B0 = 0.419846 */
9884                 24632,         /* A1 = 1.503418 */
9885                 -30271,        /* A2 = -0.923828 */
9886                 29070,         /* B2 = 0.887146 */
9887                 -25265,        /* B1 = -1.542114 */
9888                 29073,         /* B0 = 0.887268 */
9889                 7,             /* Internal filter scaling */
9890                 159,           /* Minimum in-band energy threshold */
9891                 21,            /* 21/32 in-band to broad-band ratio */
9892                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9893        },
9894        {                       /* f900 */
9895                24806,          /* A1 = -1.514099 */
9896                 -32501,        /* A2 = 0.991852 */
9897                 -326,          /* B2 = -0.009969 */
9898                 0,             /* B1 = 0.000000 */
9899                 326,           /* B0 = 0.009969 */
9900                 24709,         /* A1 = -1.508118 */
9901                 -32659,        /* A2 = 0.996674 */
9902                 20277,         /* B2 = 0.618835 */
9903                 -15182,        /* B1 = -0.926636 */
9904                 20277,         /* B0 = 0.618835 */
9905                 25022,         /* A1 = -1.527222 */
9906                 -32661,        /* A2 = 0.996735 */
9907                 4320,          /* B2 = 0.131836 */
9908                 -3331,         /* B1 = -0.203339 */
9909                 4320,          /* B0 = 0.131836 */
9910                 5,             /* Internal filter scaling */
9911                 159,           /* Minimum in-band energy threshold */
9912                 21,            /* 21/32 in-band to broad-band ratio */
9913                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9914        },
9915        {                       /* f900_1300[] */
9916                19776,          /* A1 = 1.207092 */
9917                 -27437,        /* A2 = -0.837341 */
9918                 -2666,         /* B2 = -0.081371 */
9919                 0,             /* B1 = 0 */
9920                 2666,          /* B0 = 0.081371 */
9921                 16302,         /* A1 = 0.995026 */
9922                 -30354,        /* A2 = -0.926361 */
9923                 10389,         /* B2 = 0.317062 */
9924                 -3327,         /* B1 = -0.203064 */
9925                 10389,         /* B0 = 0.317062 */
9926                 24299,         /* A1 = 1.483154 */
9927                 -30930,        /* A2 = -0.943909 */
9928                 25016,         /* B2 = 0.763428 */
9929                 -21171,        /* B1 = -1.292236 */
9930                 25016,         /* B0 = 0.763428 */
9931                 7,             /* Internal filter scaling */
9932                 159,           /* Minimum in-band energy threshold */
9933                 21,            /* 21/32 in-band to broad-band ratio */
9934                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9935        },
9936        {                       /* f935_1215[] */
9937                20554,          /* A1 = 1.254517 */
9938                 -28764,        /* A2 = -0.877838 */
9939                 -2048,         /* B2 = -0.062515 */
9940                 0,             /* B1 = 0 */
9941                 2048,          /* B0 = 0.062515 */
9942                 18209,         /* A1 = 1.11145 */
9943                 -30951,        /* A2 = -0.94458 */
9944                 9390,          /* B2 = 0.286575 */
9945                 -3955,         /* B1 = -0.241455 */
9946                 9390,          /* B0 = 0.286575 */
9947                 23902,         /* A1 = 1.458923 */
9948                 -31286,        /* A2 = -0.954803 */
9949                 23252,         /* B2 = 0.709595 */
9950                 -19132,        /* B1 = -1.167725 */
9951                 23252,         /* B0 = 0.709595 */
9952                 7,             /* Internal filter scaling */
9953                 159,           /* Minimum in-band energy threshold */
9954                 21,            /* 21/32 in-band to broad-band ratio */
9955                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9956        },
9957        {                       /* f941_1477[] */
9958                17543,          /* A1 = 1.07074 */
9959                 -26220,        /* A2 = -0.800201 */
9960                 -3298,         /* B2 = -0.100647 */
9961                 0,             /* B1 = 0 */
9962                 3298,          /* B0 = 0.100647 */
9963                 12423,         /* A1 = 0.75827 */
9964                 -30036,        /* A2 = -0.916626 */
9965                 12651,         /* B2 = 0.386078 */
9966                 -2444,         /* B1 = -0.14917 */
9967                 12653,         /* B0 = 0.386154 */
9968                 23518,         /* A1 = 1.435425 */
9969                 -30745,        /* A2 = -0.938293 */
9970                 27282,         /* B2 = 0.832581 */
9971                 -22529,        /* B1 = -1.375122 */
9972                 27286,         /* B0 = 0.832703 */
9973                 7,             /* Internal filter scaling */
9974                 159,           /* Minimum in-band energy threshold */
9975                 21,            /* 21/32 in-band to broad-band ratio */
9976                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9977        },
9978        {                       /* f942 */
9979                24104,          /* A1 = -1.471252 */
9980                 -32507,        /* A2 = 0.992065 */
9981                 -351,          /* B2 = -0.010722 */
9982                 0,             /* B1 = 0.000000 */
9983                 351,           /* B0 = 0.010722 */
9984                 23996,         /* A1 = -1.464600 */
9985                 -32671,        /* A2 = 0.997040 */
9986                 22848,         /* B2 = 0.697266 */
9987                 -16639,        /* B1 = -1.015564 */
9988                 22848,         /* B0 = 0.697266 */
9989                 24332,         /* A1 = -1.485168 */
9990                 -32673,        /* A2 = 0.997101 */
9991                 4906,          /* B2 = 0.149727 */
9992                 -3672,         /* B1 = -0.224174 */
9993                 4906,          /* B0 = 0.149727 */
9994                 5,             /* Internal filter scaling */
9995                 159,           /* Minimum in-band energy threshold */
9996                 21,            /* 21/32 in-band to broad-band ratio */
9997                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9998        },
9999        {                       /* f950 */
10000                23967,          /* A1 = -1.462830 */
10001                 -32507,        /* A2 = 0.992065 */
10002                 -518,          /* B2 = -0.015821 */
10003                 0,             /* B1 = 0.000000 */
10004                 518,           /* B0 = 0.015821 */
10005                 23856,         /* A1 = -1.456055 */
10006                 -32671,        /* A2 = 0.997040 */
10007                 26287,         /* B2 = 0.802246 */
10008                 -19031,        /* B1 = -1.161560 */
10009                 26287,         /* B0 = 0.802246 */
10010                 24195,         /* A1 = -1.476746 */
10011                 -32673,        /* A2 = 0.997101 */
10012                 2890,          /* B2 = 0.088196 */
10013                 -2151,         /* B1 = -0.131317 */
10014                 2890,          /* B0 = 0.088196 */
10015                 5,             /* Internal filter scaling */
10016                 159,           /* Minimum in-band energy threshold */
10017                 21,            /* 21/32 in-band to broad-band ratio */
10018                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10019        },
10020        {                       /* f950_1400[] */
10021                18294,          /* A1 = 1.116638 */
10022                 -26962,        /* A2 = -0.822845 */
10023                 -2914,         /* B2 = -0.088936 */
10024                 0,             /* B1 = 0 */
10025                 2914,          /* B0 = 0.088936 */
10026                 14119,         /* A1 = 0.861786 */
10027                 -30227,        /* A2 = -0.922455 */
10028                 11466,         /* B2 = 0.349945 */
10029                 -2833,         /* B1 = -0.172943 */
10030                 11466,         /* B0 = 0.349945 */
10031                 23431,         /* A1 = 1.430115 */
10032                 -30828,        /* A2 = -0.940796 */
10033                 25331,         /* B2 = 0.773071 */
10034                 -20911,        /* B1 = -1.276367 */
10035                 25331,         /* B0 = 0.773071 */
10036                 7,             /* Internal filter scaling */
10037                 159,           /* Minimum in-band energy threshold */
10038                 21,            /* 21/32 in-band to broad-band ratio */
10039                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10040        },
10041        {                       /* f975 */
10042                23521,          /* A1 = -1.435608 */
10043                 -32489,        /* A2 = 0.991516 */
10044                 -193,          /* B2 = -0.005915 */
10045                 0,             /* B1 = 0.000000 */
10046                 193,           /* B0 = 0.005915 */
10047                 23404,         /* A1 = -1.428467 */
10048                 -32655,        /* A2 = 0.996582 */
10049                 17740,         /* B2 = 0.541412 */
10050                 -12567,        /* B1 = -0.767029 */
10051                 17740,         /* B0 = 0.541412 */
10052                 23753,         /* A1 = -1.449829 */
10053                 -32657,        /* A2 = 0.996613 */
10054                 9090,          /* B2 = 0.277405 */
10055                 -6662,         /* B1 = -0.406647 */
10056                 9090,          /* B0 = 0.277405 */
10057                 5,             /* Internal filter scaling */
10058                 159,           /* Minimum in-band energy threshold */
10059                 21,            /* 21/32 in-band to broad-band ratio */
10060                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10061        },
10062        {                       /* f1000 */
10063                23071,          /* A1 = -1.408203 */
10064                 -32489,        /* A2 = 0.991516 */
10065                 -293,          /* B2 = -0.008965 */
10066                 0,             /* B1 = 0.000000 */
10067                 293,           /* B0 = 0.008965 */
10068                 22951,         /* A1 = -1.400818 */
10069                 -32655,        /* A2 = 0.996582 */
10070                 5689,          /* B2 = 0.173645 */
10071                 -3951,         /* B1 = -0.241150 */
10072                 5689,          /* B0 = 0.173645 */
10073                 23307,         /* A1 = -1.422607 */
10074                 -32657,        /* A2 = 0.996613 */
10075                 18692,         /* B2 = 0.570435 */
10076                 -13447,        /* B1 = -0.820770 */
10077                 18692,         /* B0 = 0.570435 */
10078                 5,             /* Internal filter scaling */
10079                 159,           /* Minimum in-band energy threshold */
10080                 21,            /* 21/32 in-band to broad-band ratio */
10081                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10082        },
10083        {                       /* f1020 */
10084                22701,          /* A1 = -1.385620 */
10085                 -32474,        /* A2 = 0.991058 */
10086                 -292,          /* B2 = -0.008933 */
10087                 0,             /*163840      , B1 = 10.000000 */
10088                 292,           /* B0 = 0.008933 */
10089                 22564,         /* A1 = -1.377258 */
10090                 -32655,        /* A2 = 0.996552 */
10091                 20756,         /* B2 = 0.633423 */
10092                 -14176,        /* B1 = -0.865295 */
10093                 20756,         /* B0 = 0.633423 */
10094                 22960,         /* A1 = -1.401428 */
10095                 -32657,        /* A2 = 0.996613 */
10096                 6520,          /* B2 = 0.198990 */
10097                 -4619,         /* B1 = -0.281937 */
10098                 6520,          /* B0 = 0.198990 */
10099                 5,             /* Internal filter scaling */
10100                 159,           /* Minimum in-band energy threshold */
10101                 21,            /* 21/32 in-band to broad-band ratio */
10102                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10103        },
10104        {                       /* f1050 */
10105                22142,          /* A1 = -1.351501 */
10106                 -32474,        /* A2 = 0.991058 */
10107                 -147,          /* B2 = -0.004493 */
10108                 0,             /* B1 = 0.000000 */
10109                 147,           /* B0 = 0.004493 */
10110                 22000,         /* A1 = -1.342834 */
10111                 -32655,        /* A2 = 0.996552 */
10112                 15379,         /* B2 = 0.469360 */
10113                 -10237,        /* B1 = -0.624847 */
10114                 15379,         /* B0 = 0.469360 */
10115                 22406,         /* A1 = -1.367554 */
10116                 -32657,        /* A2 = 0.996613 */
10117                 17491,         /* B2 = 0.533783 */
10118                 -12096,        /* B1 = -0.738312 */
10119                 17491,         /* B0 = 0.533783 */
10120                 5,             /* Internal filter scaling */
10121                 159,           /* Minimum in-band energy threshold */
10122                 21,            /* 21/32 in-band to broad-band ratio */
10123                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10124        },
10125        {                       /* f1100_1750[] */
10126                12973,          /* A1 = 0.79184 */
10127                 -24916,        /* A2 = -0.760376 */
10128                 6655,          /* B2 = 0.203102 */
10129                 367,           /* B1 = 0.0224 */
10130                 6657,          /* B0 = 0.203171 */
10131                 5915,          /* A1 = 0.361053 */
10132                 -29560,        /* A2 = -0.90213 */
10133                 -7777,         /* B2 = -0.23735 */
10134                 0,             /* B1 = 0 */
10135                 7777,          /* B0 = 0.23735 */
10136                 20510,         /* A1 = 1.251892 */
10137                 -30260,        /* A2 = -0.923462 */
10138                 26662,         /* B2 = 0.81366 */
10139                 -20573,        /* B1 = -1.255737 */
10140                 26668,         /* B0 = 0.813843 */
10141                 7,             /* Internal filter scaling */
10142                 159,           /* Minimum in-band energy threshold */
10143                 21,            /* 21/32 in-band to broad-band ratio */
10144                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10145        },
10146        {                       /* f1140 */
10147                20392,          /* A1 = -1.244629 */
10148                 -32460,        /* A2 = 0.990601 */
10149                 -270,          /* B2 = -0.008240 */
10150                 0,             /* B1 = 0.000000 */
10151                 270,           /* B0 = 0.008240 */
10152                 20218,         /* A1 = -1.234009 */
10153                 -32655,        /* A2 = 0.996582 */
10154                 21337,         /* B2 = 0.651154 */
10155                 -13044,        /* B1 = -0.796143 */
10156                 21337,         /* B0 = 0.651154 */
10157                 20684,         /* A1 = -1.262512 */
10158                 -32657,        /* A2 = 0.996643 */
10159                 8572,          /* B2 = 0.261612 */
10160                 -5476,         /* B1 = -0.334244 */
10161                 8572,          /* B0 = 0.261612 */
10162                 5,             /* Internal filter scaling */
10163                 159,           /* Minimum in-band energy threshold */
10164                 21,            /* 21/32 in-band to broad-band ratio */
10165                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10166        },
10167        {                       /* f1200 */
10168                19159,          /* A1 = -1.169373 */
10169                 -32456,        /* A2 = 0.990509 */
10170                 -335,          /* B2 = -0.010252 */
10171                 0,             /* B1 = 0.000000 */
10172                 335,           /* B0 = 0.010252 */
10173                 18966,         /* A1 = -1.157593 */
10174                 -32661,        /* A2 = 0.996735 */
10175                 6802,          /* B2 = 0.207588 */
10176                 -3900,         /* B1 = -0.238098 */
10177                 6802,          /* B0 = 0.207588 */
10178                 19467,         /* A1 = -1.188232 */
10179                 -32661,        /* A2 = 0.996765 */
10180                 25035,         /* B2 = 0.764008 */
10181                 -15049,        /* B1 = -0.918579 */
10182                 25035,         /* B0 = 0.764008 */
10183                 5,             /* Internal filter scaling */
10184                 159,           /* Minimum in-band energy threshold */
10185                 21,            /* 21/32 in-band to broad-band ratio */
10186                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10187        },
10188        {                       /* f1209 */
10189                18976,          /* A1 = -1.158264 */
10190                 -32439,        /* A2 = 0.989990 */
10191                 -183,          /* B2 = -0.005588 */
10192                 0,             /* B1 = 0.000000 */
10193                 183,           /* B0 = 0.005588 */
10194                 18774,         /* A1 = -1.145874 */
10195                 -32650,        /* A2 = 0.996429 */
10196                 15468,         /* B2 = 0.472076 */
10197                 -8768,         /* B1 = -0.535217 */
10198                 15468,         /* B0 = 0.472076 */
10199                 19300,         /* A1 = -1.177979 */
10200                 -32652,        /* A2 = 0.996490 */
10201                 19840,         /* B2 = 0.605499 */
10202                 -11842,        /* B1 = -0.722809 */
10203                 19840,         /* B0 = 0.605499 */
10204                 5,             /* Internal filter scaling */
10205                 159,           /* Minimum in-band energy threshold */
10206                 21,            /* 21/32 in-band to broad-band ratio */
10207                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10208        },
10209        {                       /* f1330 */
10210                16357,          /* A1 = -0.998413 */
10211                 -32368,        /* A2 = 0.987793 */
10212                 -217,          /* B2 = -0.006652 */
10213                 0,             /* B1 = 0.000000 */
10214                 217,           /* B0 = 0.006652 */
10215                 16107,         /* A1 = -0.983126 */
10216                 -32601,        /* A2 = 0.994904 */
10217                 11602,         /* B2 = 0.354065 */
10218                 -5555,         /* B1 = -0.339111 */
10219                 11602,         /* B0 = 0.354065 */
10220                 16722,         /* A1 = -1.020630 */
10221                 -32603,        /* A2 = 0.994965 */
10222                 15574,         /* B2 = 0.475311 */
10223                 -8176,         /* B1 = -0.499069 */
10224                 15574,         /* B0 = 0.475311 */
10225                 5,             /* Internal filter scaling */
10226                 159,           /* Minimum in-band energy threshold */
10227                 21,            /* 21/32 in-band to broad-band ratio */
10228                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10229        },
10230        {                       /* f1336 */
10231                16234,          /* A1 = -0.990875 */
10232                 32404,         /* A2 = -0.988922 */
10233                 -193,          /* B2 = -0.005908 */
10234                 0,             /* B1 = 0.000000 */
10235                 193,           /* B0 = 0.005908 */
10236                 15986,         /* A1 = -0.975769 */
10237                 -32632,        /* A2 = 0.995880 */
10238                 18051,         /* B2 = 0.550903 */
10239                 -8658,         /* B1 = -0.528473 */
10240                 18051,         /* B0 = 0.550903 */
10241                 16591,         /* A1 = -1.012695 */
10242                 -32634,        /* A2 = 0.995941 */
10243                 15736,         /* B2 = 0.480240 */
10244                 -8125,         /* B1 = -0.495926 */
10245                 15736,         /* B0 = 0.480240 */
10246                 5,             /* Internal filter scaling */
10247                 159,           /* Minimum in-band energy threshold */
10248                 21,            /* 21/32 in-band to broad-band ratio */
10249                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10250        },
10251        {                       /* f1366 */
10252                15564,          /* A1 = -0.949982 */
10253                 -32404,        /* A2 = 0.988922 */
10254                 -269,          /* B2 = -0.008216 */
10255                 0,             /* B1 = 0.000000 */
10256                 269,           /* B0 = 0.008216 */
10257                 15310,         /* A1 = -0.934479 */
10258                 -32632,        /* A2 = 0.995880 */
10259                 10815,         /* B2 = 0.330063 */
10260                 -4962,         /* B1 = -0.302887 */
10261                 10815,         /* B0 = 0.330063 */
10262                 15924,         /* A1 = -0.971924 */
10263                 -32634,        /* A2 = 0.995941 */
10264                 18880,         /* B2 = 0.576172 */
10265                 -9364,         /* B1 = -0.571594 */
10266                 18880,         /* B0 = 0.576172 */
10267                 5,             /* Internal filter scaling */
10268                 159,           /* Minimum in-band energy threshold */
10269                 21,            /* 21/32 in-band to broad-band ratio */
10270                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10271        },
10272        {                       /* f1380 */
10273                15247,          /* A1 = -0.930603 */
10274                 -32397,        /* A2 = 0.988708 */
10275                 -244,          /* B2 = -0.007451 */
10276                 0,             /* B1 = 0.000000 */
10277                 244,           /* B0 = 0.007451 */
10278                 14989,         /* A1 = -0.914886 */
10279                 -32627,        /* A2 = 0.995697 */
10280                 18961,         /* B2 = 0.578644 */
10281                 -8498,         /* B1 = -0.518707 */
10282                 18961,         /* B0 = 0.578644 */
10283                 15608,         /* A1 = -0.952667 */
10284                 -32628,        /* A2 = 0.995758 */
10285                 11145,         /* B2 = 0.340134 */
10286                 -5430,         /* B1 = -0.331467 */
10287                 11145,         /* B0 = 0.340134 */
10288                 5,             /* Internal filter scaling */
10289                 159,           /* Minimum in-band energy threshold */
10290                 21,            /* 21/32 in-band to broad-band ratio */
10291                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10292        },
10293        {                       /* f1400 */
10294                14780,          /* A1 = -0.902130 */
10295                 -32393,        /* A2 = 0.988586 */
10296                 -396,          /* B2 = -0.012086 */
10297                 0,             /* B1 = 0.000000 */
10298                 396,           /* B0 = 0.012086 */
10299                 14510,         /* A1 = -0.885651 */
10300                 -32630,        /* A2 = 0.995819 */
10301                 6326,          /* B2 = 0.193069 */
10302                 -2747,         /* B1 = -0.167671 */
10303                 6326,          /* B0 = 0.193069 */
10304                 15154,         /* A1 = -0.924957 */
10305                 -32632,        /* A2 = 0.995850 */
10306                 23235,         /* B2 = 0.709076 */
10307                 -10983,        /* B1 = -0.670380 */
10308                 23235,         /* B0 = 0.709076 */
10309                 5,             /* Internal filter scaling */
10310                 159,           /* Minimum in-band energy threshold */
10311                 21,            /* 21/32 in-band to broad-band ratio */
10312                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10313        },
10314        {                       /* f1477 */
10315                13005,          /* A1 = -0.793793 */
10316                 -32368,        /* A2 = 0.987823 */
10317                 -500,          /* B2 = -0.015265 */
10318                 0,             /* B1 = 0.000000 */
10319                 500,           /* B0 = 0.015265 */
10320                 12708,         /* A1 = -0.775665 */
10321                 -32615,        /* A2 = 0.995331 */
10322                 11420,         /* B2 = 0.348526 */
10323                 -4306,         /* B1 = -0.262833 */
10324                 11420,         /* B0 = 0.348526 */
10325                 13397,         /* A1 = -0.817688 */
10326                 -32615,        /* A2 = 0.995361 */
10327                 9454,          /* B2 = 0.288528 */
10328                 -3981,         /* B1 = -0.243027 */
10329                 9454,          /* B0 = 0.288528 */
10330                 5,             /* Internal filter scaling */
10331                 159,           /* Minimum in-band energy threshold */
10332                 21,            /* 21/32 in-band to broad-band ratio */
10333                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10334        },
10335        {                       /* f1600 */
10336                10046,          /* A1 = -0.613190 */
10337                 -32331,        /* A2 = 0.986694 */
10338                 -455,          /* B2 = -0.013915 */
10339                 0,             /* B1 = 0.000000 */
10340                 455,           /* B0 = 0.013915 */
10341                 9694,          /* A1 = -0.591705 */
10342                 -32601,        /* A2 = 0.994934 */
10343                 6023,          /* B2 = 0.183815 */
10344                 -1708,         /* B1 = -0.104279 */
10345                 6023,          /* B0 = 0.183815 */
10346                 10478,         /* A1 = -0.639587 */
10347                 -32603,        /* A2 = 0.994965 */
10348                 22031,         /* B2 = 0.672333 */
10349                 -7342,         /* B1 = -0.448151 */
10350                 22031,         /* B0 = 0.672333 */
10351                 5,             /* Internal filter scaling */
10352                 159,           /* Minimum in-band energy threshold */
10353                 21,            /* 21/32 in-band to broad-band ratio */
10354                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10355        },
10356        {                       /* f1633_1638[] */
10357                9181,           /* A1 = 0.560394 */
10358                 -32256,        /* A2 = -0.984375 */
10359                 -556,          /* B2 = -0.016975 */
10360                 0,             /* B1 = 0 */
10361                 556,           /* B0 = 0.016975 */
10362                 8757,          /* A1 = 0.534515 */
10363                 -32574,        /* A2 = -0.99408 */
10364                 8443,          /* B2 = 0.25769 */
10365                 -2135,         /* B1 = -0.130341 */
10366                 8443,          /* B0 = 0.25769 */
10367                 9691,          /* A1 = 0.591522 */
10368                 -32574,        /* A2 = -0.99411 */
10369                 15446,         /* B2 = 0.471375 */
10370                 -4809,         /* B1 = -0.293579 */
10371                 15446,         /* B0 = 0.471375 */
10372                 7,             /* Internal filter scaling */
10373                 159,           /* Minimum in-band energy threshold */
10374                 21,            /* 21/32 in-band to broad-band ratio */
10375                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10376        },
10377        {                       /* f1800 */
10378                5076,           /* A1 = -0.309875 */
10379                 -32304,        /* A2 = 0.985840 */
10380                 -508,          /* B2 = -0.015503 */
10381                 0,             /* B1 = 0.000000 */
10382                 508,           /* B0 = 0.015503 */
10383                 4646,          /* A1 = -0.283600 */
10384                 -32605,        /* A2 = 0.995026 */
10385                 6742,          /* B2 = 0.205780 */
10386                 -878,          /* B1 = -0.053635 */
10387                 6742,          /* B0 = 0.205780 */
10388                 5552,          /* A1 = -0.338928 */
10389                 -32605,        /* A2 = 0.995056 */
10390                 23667,         /* B2 = 0.722260 */
10391                 -4297,         /* B1 = -0.262329 */
10392                 23667,         /* B0 = 0.722260 */
10393                 5,             /* Internal filter scaling */
10394                 159,           /* Minimum in-band energy threshold */
10395                 21,            /* 21/32 in-band to broad-band ratio */
10396                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10397        },
10398        {                       /* f1860 */
10399                3569,           /* A1 = -0.217865 */
10400                 -32292,        /* A2 = 0.985504 */
10401                 -239,          /* B2 = -0.007322 */
10402                 0,             /* B1 = 0.000000 */
10403                 239,           /* B0 = 0.007322 */
10404                 3117,          /* A1 = -0.190277 */
10405                 -32603,        /* A2 = 0.994965 */
10406                 18658,         /* B2 = 0.569427 */
10407                 -1557,         /* B1 = -0.095032 */
10408                 18658,         /* B0 = 0.569427 */
10409                 4054,          /* A1 = -0.247437 */
10410                 -32603,        /* A2 = 0.994965 */
10411                 18886,         /* B2 = 0.576385 */
10412                 -2566,         /* B1 = -0.156647 */
10413                 18886,         /* B0 = 0.576385 */
10414                 5,             /* Internal filter scaling */
10415                 159,           /* Minimum in-band energy threshold */
10416                 21,            /* 21/32 in-band to broad-band ratio */
10417                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10418        },
10419};
10420static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
10421{
10422        unsigned short cmd;
10423        int cnt, max;
10424
10425        if (jf->filter > 3) {
10426                return -1;
10427        }
10428        if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))        /* Select Filter */
10429
10430                return -1;
10431        if (!jf->enable) {
10432                if (ixj_WriteDSPCommand(0x5152, j))             /* Disable Filter */
10433
10434                        return -1;
10435                else
10436                        return 0;
10437        } else {
10438                if (ixj_WriteDSPCommand(0x5153, j))             /* Enable Filter */
10439
10440                        return -1;
10441                /* Select the filter (f0 - f3) to use. */
10442                if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
10443                        return -1;
10444        }
10445        if (jf->freq < 12 && jf->freq > 3) {
10446                /* Select the frequency for the selected filter. */
10447                if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
10448                        return -1;
10449        } else if (jf->freq > 11) {
10450                /* We need to load a programmable filter set for undefined */
10451                /* frequencies.  So we will point the filter to a programmable set. */
10452                /* Since there are only 4 filters and 4 programmable sets, we will */
10453                /* just point the filter to the same number set and program it for the */
10454                /* frequency we want. */
10455                if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
10456                        return -1;
10457                if (j->ver.low != 0x12) {
10458                        cmd = 0x515B;
10459                        max = 19;
10460                } else {
10461                        cmd = 0x515E;
10462                        max = 15;
10463                }
10464                if (ixj_WriteDSPCommand(cmd, j))
10465                        return -1;
10466                for (cnt = 0; cnt < max; cnt++) {
10467                        if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
10468                                return -1;
10469                }
10470        }
10471        j->filter_en[jf->filter] = jf->enable;
10472        return 0;
10473}
10474
10475static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
10476{
10477        unsigned short cmd;
10478        int cnt, max;
10479        if (jfr->filter > 3) {
10480                return -1;
10481        }
10482        if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))       /* Select Filter */
10483                return -1;
10484
10485        if (!jfr->enable) {
10486                if (ixj_WriteDSPCommand(0x5152, j))             /* Disable Filter */
10487                        return -1;
10488                else
10489                        return 0;
10490        } else {
10491                if (ixj_WriteDSPCommand(0x5153, j))             /* Enable Filter */
10492                        return -1;
10493                /* Select the filter (f0 - f3) to use. */
10494                if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
10495                        return -1;
10496        }
10497        /* We need to load a programmable filter set for undefined */
10498        /* frequencies.  So we will point the filter to a programmable set. */
10499        /* Since there are only 4 filters and 4 programmable sets, we will */
10500        /* just point the filter to the same number set and program it for the */
10501        /* frequency we want. */
10502        if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
10503                return -1;
10504        if (j->ver.low != 0x12) {
10505                cmd = 0x515B;
10506                max = 19;
10507        } else {
10508                cmd = 0x515E;
10509                max = 15;
10510        }
10511        if (ixj_WriteDSPCommand(cmd, j))
10512                return -1;
10513        for (cnt = 0; cnt < max; cnt++) {
10514                if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
10515                        return -1;
10516        }
10517        j->filter_en[jfr->filter] = jfr->enable;
10518        return 0;
10519}
10520
10521static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
10522{
10523        int freq0, freq1;
10524        unsigned short data;
10525        if (ti->freq0) {
10526                freq0 = ti->freq0;
10527        } else {
10528                freq0 = 0x7FFF;
10529        }
10530
10531        if (ti->freq1) {
10532                freq1 = ti->freq1;
10533        } else {
10534                freq1 = 0x7FFF;
10535        }
10536
10537        if(ti->tone_index > 12 && ti->tone_index < 28)
10538        {
10539                if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
10540                        return -1;
10541                if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
10542                        return -1;
10543                data = freq0;
10544                if (ixj_WriteDSPCommand(data, j))
10545                        return -1;
10546                data = freq1;
10547                if (ixj_WriteDSPCommand(data, j))
10548                        return -1;
10549        }
10550        return freq0;
10551}
10552
10553