OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [telephony/] [ixj.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/****************************************************************************
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
 *
27
 * More information about the hardware related to this driver can be found
28
 * at our website:    http://www.quicknet.net
29
 *
30
 * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
31
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
32
 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
33
 * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
 *
35
 * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
36
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
37
 * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
38
 * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
39
 * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
40
 *
41
 ***************************************************************************/
42
 
43
static char ixj_c_rcsid[] = "$Id: ixj.c,v 1.1.1.1 2004-04-15 02:29:06 phoenix Exp $";
44
static char ixj_c_revision[] = "$Revision: 1.1.1.1 $";
45
 
46
/*
47
 * $Log: not supported by cvs2svn $
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 succeded.
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/mm.h>
261
#include <linux/ioport.h>
262
#include <linux/interrupt.h>
263
#include <linux/tqueue.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/segment.h>
272
#include <asm/uaccess.h>
273
 
274
#include <linux/isapnp.h>
275
 
276
#include "ixj.h"
277
 
278
#define TYPE(dev) (MINOR(dev) >> 4)
279
#define NUM(dev) (MINOR(dev) & 0xf)
280
 
281
static int ixjdebug;
282
static int hertz = HZ;
283
static int samplerate = 100;
284
 
285
MODULE_PARM(ixjdebug, "i");
286
 
287
/************************************************************************
288
*
289
* ixjdebug meanings are now bit mapped instead of level based
290
* Values can be or'ed together to turn on multiple messages
291
*
292
* bit  0 (0x0001) = any failure
293
* bit  1 (0x0002) = general messages
294
* bit  2 (0x0004) = POTS ringing related
295
* bit  3 (0x0008) = PSTN events
296
* bit  4 (0x0010) = PSTN Cadence state details
297
* bit  5 (0x0020) = Tone detection triggers
298
* bit  6 (0x0040) = Tone detection cadence details
299
* bit  7 (0x0080) = ioctl tracking
300
* bit  8 (0x0100) = signal tracking
301
* bit  9 (0x0200) = CallerID generation details
302
*
303
************************************************************************/
304
 
305
#ifdef IXJ_DYN_ALLOC
306
 
307
static IXJ *ixj[IXJMAX];
308
#define get_ixj(b)      ixj[(b)]
309
 
310
/*
311
 *      Allocate a free IXJ device
312
 */
313
 
314
static IXJ *ixj_alloc()
315
{
316
        for(cnt=0; cnt<IXJMAX; cnt++)
317
        {
318
                if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
319
                {
320
                        j = kmalloc(sizeof(IXJ), GFP_KERNEL);
321
                        if (j == NULL)
322
                                return NULL;
323
                        ixj[cnt] = j;
324
                        return j;
325
                }
326
        }
327
        return NULL;
328
}
329
 
330
static void ixj_fsk_free(IXJ *j)
331
{
332
        if(j->fskdata != NULL) {
333
                kfree(j->fskdata);
334
                j->fskdata = NULL;
335
        }
336
}
337
 
338
static void ixj_fsk_alloc(IXJ *j)
339
{
340
        if(!j->fskdata) {
341
                j->fskdata = kmalloc(8000, GFP_KERNEL);
342
                if (!j->fskdata) {
343
                        if(ixjdebug & 0x0200) {
344
                                printk("IXJ phone%d - allocate failed\n", j->board);
345
                        }
346
                        return;
347
                } else {
348
                        j->fsksize = 8000;
349
                        if(ixjdebug & 0x0200) {
350
                                printk("IXJ phone%d - allocate succeded\n", j->board);
351
                        }
352
                }
353
        }
354
}
355
 
356
#else
357
 
358
static IXJ ixj[IXJMAX];
359
#define get_ixj(b)      (&ixj[(b)])
360
 
361
/*
362
 *      Allocate a free IXJ device
363
 */
364
 
365
static IXJ *ixj_alloc(void)
366
{
367
        int cnt;
368
        for(cnt=0; cnt<IXJMAX; cnt++)
369
        {
370
                if(!ixj[cnt].DSPbase)
371
                {
372
                        return &ixj[cnt];
373
                }
374
        }
375
        return NULL;
376
}
377
 
378
static inline void ixj_fsk_free(IXJ *j) {;}
379
 
380
static inline void ixj_fsk_alloc(IXJ *j)
381
{
382
        j->fsksize = 8000;
383
}
384
 
385
#endif
386
 
387
#ifdef PERFMON_STATS
388
#define ixj_perfmon(x)  ((x)++)
389
#else
390
#define ixj_perfmon(x)  do { } while(0)
391
#endif
392
 
393
static int ixj_convert_loaded;
394
 
395
static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
396
 
397
/************************************************************************
398
*
399
* These are function definitions to allow external modules to register
400
* enhanced functionality call backs.
401
*
402
************************************************************************/
403
 
404
static int Stub(IXJ * J, unsigned long arg)
405
{
406
        return 0;
407
}
408
 
409
static IXJ_REGFUNC ixj_DownloadG729 = &Stub;
410
static IXJ_REGFUNC ixj_DownloadTS85 = &Stub;
411
static IXJ_REGFUNC ixj_PreRead = &Stub;
412
static IXJ_REGFUNC ixj_PostRead = &Stub;
413
static IXJ_REGFUNC ixj_PreWrite = &Stub;
414
static IXJ_REGFUNC ixj_PostWrite = &Stub;
415
static IXJ_REGFUNC ixj_PreIoctl = &Stub;
416
static IXJ_REGFUNC ixj_PostIoctl = &Stub;
417
 
418
static void ixj_read_frame(IXJ *j);
419
static void ixj_write_frame(IXJ *j);
420
static void ixj_init_timer(IXJ *j);
421
static void ixj_add_timer(IXJ * j);
422
static void ixj_timeout(unsigned long ptr);
423
static int read_filters(IXJ *j);
424
static int LineMonitor(IXJ *j);
425
static int ixj_fasync(int fd, struct file *, int mode);
426
static int ixj_set_port(IXJ *j, int arg);
427
static int ixj_set_pots(IXJ *j, int arg);
428
static int ixj_hookstate(IXJ *j);
429
static int ixj_record_start(IXJ *j);
430
static void ixj_record_stop(IXJ *j);
431
static void set_rec_volume(IXJ *j, int volume);
432
static int get_rec_volume(IXJ *j);
433
static int set_rec_codec(IXJ *j, int rate);
434
static void ixj_vad(IXJ *j, int arg);
435
static int ixj_play_start(IXJ *j);
436
static void ixj_play_stop(IXJ *j);
437
static int ixj_set_tone_on(unsigned short arg, IXJ *j);
438
static int ixj_set_tone_off(unsigned short, IXJ *j);
439
static int ixj_play_tone(IXJ *j, char tone);
440
static void ixj_aec_start(IXJ *j, int level);
441
static int idle(IXJ *j);
442
static void ixj_ring_on(IXJ *j);
443
static void ixj_ring_off(IXJ *j);
444
static void aec_stop(IXJ *j);
445
static void ixj_ringback(IXJ *j);
446
static void ixj_busytone(IXJ *j);
447
static void ixj_dialtone(IXJ *j);
448
static void ixj_cpt_stop(IXJ *j);
449
static char daa_int_read(IXJ *j);
450
static char daa_CR_read(IXJ *j, int cr);
451
static int daa_set_mode(IXJ *j, int mode);
452
static int ixj_linetest(IXJ *j);
453
static int ixj_daa_write(IXJ *j);
454
static int ixj_daa_cid_read(IXJ *j);
455
static void DAA_Coeff_US(IXJ *j);
456
static void DAA_Coeff_UK(IXJ *j);
457
static void DAA_Coeff_France(IXJ *j);
458
static void DAA_Coeff_Germany(IXJ *j);
459
static void DAA_Coeff_Australia(IXJ *j);
460
static void DAA_Coeff_Japan(IXJ *j);
461
static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
462
static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
463
static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
464
static int ixj_build_cadence(IXJ *j, IXJ_CADENCE * cp);
465
static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE * cp);
466
/* Serial Control Interface funtions */
467
static int SCI_Control(IXJ *j, int control);
468
static int SCI_Prepare(IXJ *j);
469
static int SCI_WaitHighSCI(IXJ *j);
470
static int SCI_WaitLowSCI(IXJ *j);
471
static DWORD PCIEE_GetSerialNumber(WORD wAddress);
472
static int ixj_PCcontrol_wait(IXJ *j);
473
static void ixj_pre_cid(IXJ *j);
474
static void ixj_write_cid(IXJ *j);
475
static void ixj_write_cid_bit(IXJ *j, int bit);
476
static int set_base_frame(IXJ *j, int size);
477
static int set_play_codec(IXJ *j, int rate);
478
static void set_rec_depth(IXJ *j, int depth);
479
static int ixj_mixer(long val, IXJ *j);
480
 
481
/************************************************************************
482
CT8020/CT8021 Host Programmers Model
483
Host address    Function                                        Access
484
DSPbase +
485
0-1             Aux Software Status Register (reserved)         Read Only
486
2-3             Software Status Register                        Read Only
487
4-5             Aux Software Control Register (reserved)        Read Write
488
6-7             Software Control Register                       Read Write
489
8-9             Hardware Status Register                        Read Only
490
A-B             Hardware Control Register                       Read Write
491
C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
492
E-F Host Recieve (Read) Data Buffer Access Port (buffer input)  Read Only
493
************************************************************************/
494
 
495
static inline void ixj_read_HSR(IXJ *j)
496
{
497
        j->hsr.bytes.low = inb_p(j->DSPbase + 8);
498
        j->hsr.bytes.high = inb_p(j->DSPbase + 9);
499
}
500
 
501
static inline int IsControlReady(IXJ *j)
502
{
503
        ixj_read_HSR(j);
504
        return j->hsr.bits.controlrdy ? 1 : 0;
505
}
506
 
507
static inline int IsPCControlReady(IXJ *j)
508
{
509
        j->pccr1.byte = inb_p(j->XILINXbase + 3);
510
        return j->pccr1.bits.crr ? 1 : 0;
511
}
512
 
513
static inline int IsStatusReady(IXJ *j)
514
{
515
        ixj_read_HSR(j);
516
        return j->hsr.bits.statusrdy ? 1 : 0;
517
}
518
 
519
static inline int IsRxReady(IXJ *j)
520
{
521
        ixj_read_HSR(j);
522
        ixj_perfmon(j->rxreadycheck);
523
        return j->hsr.bits.rxrdy ? 1 : 0;
524
}
525
 
526
static inline int IsTxReady(IXJ *j)
527
{
528
        ixj_read_HSR(j);
529
        ixj_perfmon(j->txreadycheck);
530
        return j->hsr.bits.txrdy ? 1 : 0;
531
}
532
 
533
static inline void set_play_volume(IXJ *j, int volume)
534
{
535
        if (ixjdebug & 0x0002)
536
                printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
537
        ixj_WriteDSPCommand(0xCF02, j);
538
        ixj_WriteDSPCommand(volume, j);
539
}
540
 
541
static int set_play_volume_linear(IXJ *j, int volume)
542
{
543
        int newvolume, dspplaymax;
544
 
545
        if (ixjdebug & 0x0002)
546
                printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
547
        if(volume > 100 || volume < 0) {
548
                return -1;
549
        }
550
 
551
        /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
552
        switch (j->cardtype) {
553
        case QTI_PHONEJACK:
554
                dspplaymax = 0x380;
555
                break;
556
        case QTI_LINEJACK:
557
                if(j->port == PORT_PSTN) {
558
                        dspplaymax = 0x48;
559
                } else {
560
                        dspplaymax = 0x100;
561
                }
562
                break;
563
        case QTI_PHONEJACK_LITE:
564
                dspplaymax = 0x380;
565
                break;
566
        case QTI_PHONEJACK_PCI:
567
                dspplaymax = 0x6C;
568
                break;
569
        case QTI_PHONECARD:
570
                dspplaymax = 0x50;
571
                break;
572
        default:
573
                return -1;
574
        }
575
        newvolume = (dspplaymax * volume) / 100;
576
        set_play_volume(j, newvolume);
577
        return 0;
578
}
579
 
580
static inline void set_play_depth(IXJ *j, int depth)
581
{
582
        if (depth > 60)
583
                depth = 60;
584
        if (depth < 0)
585
                depth = 0;
586
        ixj_WriteDSPCommand(0x5280 + depth, j);
587
}
588
 
589
static inline int get_play_volume(IXJ *j)
590
{
591
        ixj_WriteDSPCommand(0xCF00, j);
592
        return j->ssr.high << 8 | j->ssr.low;
593
}
594
 
595
static int get_play_volume_linear(IXJ *j)
596
{
597
        int volume, newvolume, dspplaymax;
598
 
599
        /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
600
        switch (j->cardtype) {
601
        case QTI_PHONEJACK:
602
                dspplaymax = 0x380;
603
                break;
604
        case QTI_LINEJACK:
605
                if(j->port == PORT_PSTN) {
606
                        dspplaymax = 0x48;
607
                } else {
608
                        dspplaymax = 0x100;
609
                }
610
                break;
611
        case QTI_PHONEJACK_LITE:
612
                dspplaymax = 0x380;
613
                break;
614
        case QTI_PHONEJACK_PCI:
615
                dspplaymax = 0x6C;
616
                break;
617
        case QTI_PHONECARD:
618
                dspplaymax = 100;
619
                break;
620
        default:
621
                return -1;
622
        }
623
        volume = get_play_volume(j);
624
        newvolume = (volume * 100) / dspplaymax;
625
        if(newvolume > 100)
626
                newvolume = 100;
627
        return newvolume;
628
}
629
 
630
static inline BYTE SLIC_GetState(IXJ *j)
631
{
632
        if (j->cardtype == QTI_PHONECARD) {
633
                j->pccr1.byte = 0;
634
                j->psccr.bits.dev = 3;
635
                j->psccr.bits.rw = 1;
636
                outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
637
                ixj_PCcontrol_wait(j);
638
                j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
639
                ixj_PCcontrol_wait(j);
640
                if (j->pslic.bits.powerdown)
641
                        return PLD_SLIC_STATE_OC;
642
                else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
643
                        return PLD_SLIC_STATE_ACTIVE;
644
                else
645
                        return PLD_SLIC_STATE_RINGING;
646
        } else {
647
                j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
648
        }
649
        return j->pld_slicr.bits.state;
650
}
651
 
652
static BOOL SLIC_SetState(BYTE byState, IXJ *j)
653
{
654
        BOOL fRetVal = FALSE;
655
 
656
        if (j->cardtype == QTI_PHONECARD) {
657
                if (j->flags.pcmciasct) {
658
                        switch (byState) {
659
                        case PLD_SLIC_STATE_TIPOPEN:
660
                        case PLD_SLIC_STATE_OC:
661
                                j->pslic.bits.powerdown = 1;
662
                                j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
663
                                fRetVal = TRUE;
664
                                break;
665
                        case PLD_SLIC_STATE_RINGING:
666
                                if (j->readers || j->writers) {
667
                                        j->pslic.bits.powerdown = 0;
668
                                        j->pslic.bits.ring0 = 1;
669
                                        j->pslic.bits.ring1 = 0;
670
                                        fRetVal = TRUE;
671
                                }
672
                                break;
673
                        case PLD_SLIC_STATE_OHT:        /* On-hook transmit */
674
 
675
                        case PLD_SLIC_STATE_STANDBY:
676
                        case PLD_SLIC_STATE_ACTIVE:
677
                                if (j->readers || j->writers) {
678
                                        j->pslic.bits.powerdown = 0;
679
                                } else {
680
                                        j->pslic.bits.powerdown = 1;
681
                                }
682
                                j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
683
                                fRetVal = TRUE;
684
                                break;
685
                        case PLD_SLIC_STATE_APR:        /* Active polarity reversal */
686
 
687
                        case PLD_SLIC_STATE_OHTPR:      /* OHT polarity reversal */
688
 
689
                        default:
690
                                fRetVal = FALSE;
691
                                break;
692
                        }
693
                        j->psccr.bits.dev = 3;
694
                        j->psccr.bits.rw = 0;
695
                        outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
696
                        ixj_PCcontrol_wait(j);
697
                }
698
        } else {
699
                /* Set the C1, C2, C3 & B2EN signals. */
700
                switch (byState) {
701
                case PLD_SLIC_STATE_OC:
702
                        j->pld_slicw.bits.c1 = 0;
703
                        j->pld_slicw.bits.c2 = 0;
704
                        j->pld_slicw.bits.c3 = 0;
705
                        j->pld_slicw.bits.b2en = 0;
706
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
707
                        fRetVal = TRUE;
708
                        break;
709
                case PLD_SLIC_STATE_RINGING:
710
                        j->pld_slicw.bits.c1 = 1;
711
                        j->pld_slicw.bits.c2 = 0;
712
                        j->pld_slicw.bits.c3 = 0;
713
                        j->pld_slicw.bits.b2en = 1;
714
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
715
                        fRetVal = TRUE;
716
                        break;
717
                case PLD_SLIC_STATE_ACTIVE:
718
                        j->pld_slicw.bits.c1 = 0;
719
                        j->pld_slicw.bits.c2 = 1;
720
                        j->pld_slicw.bits.c3 = 0;
721
                        j->pld_slicw.bits.b2en = 0;
722
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
723
                        fRetVal = TRUE;
724
                        break;
725
                case PLD_SLIC_STATE_OHT:        /* On-hook transmit */
726
 
727
                        j->pld_slicw.bits.c1 = 1;
728
                        j->pld_slicw.bits.c2 = 1;
729
                        j->pld_slicw.bits.c3 = 0;
730
                        j->pld_slicw.bits.b2en = 0;
731
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
732
                        fRetVal = TRUE;
733
                        break;
734
                case PLD_SLIC_STATE_TIPOPEN:
735
                        j->pld_slicw.bits.c1 = 0;
736
                        j->pld_slicw.bits.c2 = 0;
737
                        j->pld_slicw.bits.c3 = 1;
738
                        j->pld_slicw.bits.b2en = 0;
739
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
740
                        fRetVal = TRUE;
741
                        break;
742
                case PLD_SLIC_STATE_STANDBY:
743
                        j->pld_slicw.bits.c1 = 1;
744
                        j->pld_slicw.bits.c2 = 0;
745
                        j->pld_slicw.bits.c3 = 1;
746
                        j->pld_slicw.bits.b2en = 1;
747
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
748
                        fRetVal = TRUE;
749
                        break;
750
                case PLD_SLIC_STATE_APR:        /* Active polarity reversal */
751
 
752
                        j->pld_slicw.bits.c1 = 0;
753
                        j->pld_slicw.bits.c2 = 1;
754
                        j->pld_slicw.bits.c3 = 1;
755
                        j->pld_slicw.bits.b2en = 0;
756
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
757
                        fRetVal = TRUE;
758
                        break;
759
                case PLD_SLIC_STATE_OHTPR:      /* OHT polarity reversal */
760
 
761
                        j->pld_slicw.bits.c1 = 1;
762
                        j->pld_slicw.bits.c2 = 1;
763
                        j->pld_slicw.bits.c3 = 1;
764
                        j->pld_slicw.bits.b2en = 0;
765
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
766
                        fRetVal = TRUE;
767
                        break;
768
                default:
769
                        fRetVal = FALSE;
770
                        break;
771
                }
772
        }
773
 
774
        return fRetVal;
775
}
776
 
777
static int ixj_wink(IXJ *j)
778
{
779
        BYTE slicnow;
780
 
781
        slicnow = SLIC_GetState(j);
782
 
783
        j->pots_winkstart = jiffies;
784
        SLIC_SetState(PLD_SLIC_STATE_OC, j);
785
 
786
        while (time_before(jiffies, j->pots_winkstart + j->winktime)) {
787
                set_current_state(TASK_INTERRUPTIBLE);
788
                schedule_timeout(1);
789
        }
790
 
791
        SLIC_SetState(slicnow, j);
792
        return 0;
793
}
794
 
795
static int ixj_register(int index, IXJ_REGFUNC regfunc)
796
{
797
        int cnt;
798
        int retval = 0;
799
        switch (index) {
800
        case G729LOADER:
801
                ixj_DownloadG729 = regfunc;
802
                for (cnt = 0; cnt < IXJMAX; cnt++) {
803
                        IXJ *j = get_ixj(cnt);
804
                        while(test_and_set_bit(cnt, (void *)&j->busyflags) != 0) {
805
                                set_current_state(TASK_INTERRUPTIBLE);
806
                                schedule_timeout(1);
807
                        }
808
                        ixj_DownloadG729(j, 0L);
809
                        clear_bit(cnt, &j->busyflags);
810
                }
811
                break;
812
        case TS85LOADER:
813
                ixj_DownloadTS85 = regfunc;
814
                for (cnt = 0; cnt < IXJMAX; cnt++) {
815
                        IXJ *j = get_ixj(cnt);
816
                        while(test_and_set_bit(cnt, (void *)&j->busyflags) != 0) {
817
                                set_current_state(TASK_INTERRUPTIBLE);
818
                                schedule_timeout(1);
819
                        }
820
                        ixj_DownloadTS85(j, 0L);
821
                        clear_bit(cnt, &j->busyflags);
822
                }
823
                break;
824
        case PRE_READ:
825
                ixj_PreRead = regfunc;
826
                break;
827
        case POST_READ:
828
                ixj_PostRead = regfunc;
829
                break;
830
        case PRE_WRITE:
831
                ixj_PreWrite = regfunc;
832
                break;
833
        case POST_WRITE:
834
                ixj_PostWrite = regfunc;
835
                break;
836
        case PRE_IOCTL:
837
                ixj_PreIoctl = regfunc;
838
                break;
839
        case POST_IOCTL:
840
                ixj_PostIoctl = regfunc;
841
                break;
842
        default:
843
                retval = 1;
844
        }
845
        return retval;
846
}
847
 
848
EXPORT_SYMBOL(ixj_register);
849
 
850
static int ixj_unregister(int index)
851
{
852
        int retval = 0;
853
        switch (index) {
854
        case G729LOADER:
855
                ixj_DownloadG729 = &Stub;
856
                break;
857
        case TS85LOADER:
858
                ixj_DownloadTS85 = &Stub;
859
                break;
860
        case PRE_READ:
861
                ixj_PreRead = &Stub;
862
                break;
863
        case POST_READ:
864
                ixj_PostRead = &Stub;
865
                break;
866
        case PRE_WRITE:
867
                ixj_PreWrite = &Stub;
868
                break;
869
        case POST_WRITE:
870
                ixj_PostWrite = &Stub;
871
                break;
872
        case PRE_IOCTL:
873
                ixj_PreIoctl = &Stub;
874
                break;
875
        case POST_IOCTL:
876
                ixj_PostIoctl = &Stub;
877
                break;
878
        default:
879
                retval = 1;
880
        }
881
        return retval;
882
}
883
 
884
EXPORT_SYMBOL(ixj_unregister);
885
 
886
static void ixj_init_timer(IXJ *j)
887
{
888
        init_timer(&j->timer);
889
        j->timer.function = ixj_timeout;
890
        j->timer.data = (unsigned long)j;
891
}
892
 
893
static void ixj_add_timer(IXJ *j)
894
{
895
        j->timer.expires = jiffies + (hertz / samplerate);
896
        add_timer(&j->timer);
897
}
898
 
899
static void ixj_tone_timeout(IXJ *j)
900
{
901
        IXJ_TONE ti;
902
 
903
        j->tone_state++;
904
        if (j->tone_state == 3) {
905
                j->tone_state = 0;
906
                if (j->cadence_t) {
907
                        j->tone_cadence_state++;
908
                        if (j->tone_cadence_state >= j->cadence_t->elements_used) {
909
                                switch (j->cadence_t->termination) {
910
                                case PLAY_ONCE:
911
                                        ixj_cpt_stop(j);
912
                                        break;
913
                                case REPEAT_LAST_ELEMENT:
914
                                        j->tone_cadence_state--;
915
                                        ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
916
                                        break;
917
                                case REPEAT_ALL:
918
                                        j->tone_cadence_state = 0;
919
                                        if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
920
                                                ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
921
                                                ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
922
                                                ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
923
                                                ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
924
                                                ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
925
                                                ixj_init_tone(j, &ti);
926
                                        }
927
                                        ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
928
                                        ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
929
                                        ixj_play_tone(j, j->cadence_t->ce[0].index);
930
                                        break;
931
                                }
932
                        } else {
933
                                if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
934
                                        ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
935
                                        ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
936
                                        ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
937
                                        ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
938
                                        ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
939
                                        ixj_init_tone(j, &ti);
940
                                }
941
                                ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
942
                                ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
943
                                ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
944
                        }
945
                }
946
        }
947
}
948
 
949
static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
950
{
951
        if(j->ixj_signals[event]) {
952
                if(ixjdebug & 0x0100)
953
                        printk("Sending signal for event %d\n", event);
954
                        /* Send apps notice of change */
955
                /* see config.h for macro definition */
956
                kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
957
        }
958
}
959
 
960
static void ixj_pstn_state(IXJ *j)
961
{
962
        int var;
963
        union XOPXR0 XR0, daaint;
964
 
965
        var = 10;
966
 
967
        XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
968
        daaint.reg = 0;
969
        XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
970
 
971
        j->pld_scrr.byte = inb_p(j->XILINXbase);
972
        if (j->pld_scrr.bits.daaflag) {
973
                daa_int_read(j);
974
                if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
975
                        if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
976
                                daaint.bitreg.RING = 1;
977
                                if(ixjdebug & 0x0008) {
978
                                        printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
979
                                }
980
                        } else {
981
                                daa_set_mode(j, SOP_PU_RESET);
982
                        }
983
                }
984
                if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
985
                        daaint.bitreg.Caller_ID = 1;
986
                        j->pstn_cid_intr = 1;
987
                        j->pstn_cid_received = jiffies;
988
                        if(ixjdebug & 0x0008) {
989
                                printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
990
                        }
991
                }
992
                if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
993
                        daaint.bitreg.Cadence = 1;
994
                        if(ixjdebug & 0x0008) {
995
                                printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
996
                        }
997
                }
998
                if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
999
                        daaint.bitreg.VDD_OK = 1;
1000
                        daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
1001
                }
1002
        }
1003
        daa_CR_read(j, 1);
1004
        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)) {
1005
                daaint.bitreg.RMR = 1;
1006
                daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
1007
                if(ixjdebug & 0x0008) {
1008
                        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);
1009
                }
1010
                j->pstn_prev_rmr = j->pstn_last_rmr;
1011
                j->pstn_last_rmr = jiffies;
1012
        }
1013
        switch(j->daa_mode) {
1014
                case SOP_PU_SLEEP:
1015
                        if (daaint.bitreg.RING) {
1016
                                if (!j->flags.pstn_ringing) {
1017
                                        if (j->daa_mode != SOP_PU_RINGING) {
1018
                                                j->pstn_ring_int = jiffies;
1019
                                                daa_set_mode(j, SOP_PU_RINGING);
1020
                                        }
1021
                                }
1022
                        }
1023
                        break;
1024
                case SOP_PU_RINGING:
1025
                        if (daaint.bitreg.RMR) {
1026
                                if (ixjdebug & 0x0008) {
1027
                                        printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1028
                                }
1029
                                if (daaint.bitreg.SI_1) {                /* Rising edge of RMR */
1030
                                        j->flags.pstn_rmr = 1;
1031
                                        j->pstn_ring_start = jiffies;
1032
                                        j->pstn_ring_stop = 0;
1033
                                        j->ex.bits.pstn_ring = 0;
1034
                                        if (j->cadence_f[4].state == 0) {
1035
                                                j->cadence_f[4].state = 1;
1036
                                                j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
1037
                                                j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
1038
                                                j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
1039
                                        } else if (j->cadence_f[4].state == 2) {
1040
                                                if((time_after(jiffies, j->cadence_f[4].off1min) &&
1041
                                                    time_before(jiffies, j->cadence_f[4].off1max))) {
1042
                                                        if (j->cadence_f[4].on2) {
1043
                                                                j->cadence_f[4].state = 3;
1044
                                                                j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
1045
                                                                j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
1046
                                                                j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
1047
                                                        } else {
1048
                                                                j->cadence_f[4].state = 7;
1049
                                                        }
1050
                                                } else {
1051
                                                        if (ixjdebug & 0x0008) {
1052
                                                                printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1053
                                                                                j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1054
                                                                                j->cadence_f[4].off1);
1055
                                                        }
1056
                                                        j->cadence_f[4].state = 0;
1057
                                                }
1058
                                        } else if (j->cadence_f[4].state == 4) {
1059
                                                if((time_after(jiffies, j->cadence_f[4].off2min) &&
1060
                                                    time_before(jiffies, j->cadence_f[4].off2max))) {
1061
                                                        if (j->cadence_f[4].on3) {
1062
                                                                j->cadence_f[4].state = 5;
1063
                                                                j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
1064
                                                                j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
1065
                                                                j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
1066
                                                        } else {
1067
                                                                j->cadence_f[4].state = 7;
1068
                                                        }
1069
                                                } else {
1070
                                                        if (ixjdebug & 0x0008) {
1071
                                                                printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1072
                                                                                j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1073
                                                                                j->cadence_f[4].off2);
1074
                                                        }
1075
                                                        j->cadence_f[4].state = 0;
1076
                                                }
1077
                                        } else if (j->cadence_f[4].state == 6) {
1078
                                                if((time_after(jiffies, j->cadence_f[4].off3min) &&
1079
                                                    time_before(jiffies, j->cadence_f[4].off3max))) {
1080
                                                        j->cadence_f[4].state = 7;
1081
                                                } else {
1082
                                                        if (ixjdebug & 0x0008) {
1083
                                                                printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1084
                                                                                j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1085
                                                                                j->cadence_f[4].off3);
1086
                                                        }
1087
                                                        j->cadence_f[4].state = 0;
1088
                                                }
1089
                                        } else {
1090
                                                j->cadence_f[4].state = 0;
1091
                                        }
1092
                                } else {                                /* Falling edge of RMR */
1093
                                        j->pstn_ring_start = 0;
1094
                                        j->pstn_ring_stop = jiffies;
1095
                                        if (j->cadence_f[4].state == 1) {
1096
                                                if(!j->cadence_f[4].on1) {
1097
                                                        j->cadence_f[4].state = 7;
1098
                                                } else if((time_after(jiffies, j->cadence_f[4].on1min) &&
1099
                                                  time_before(jiffies, j->cadence_f[4].on1max))) {
1100
                                                        if (j->cadence_f[4].off1) {
1101
                                                                j->cadence_f[4].state = 2;
1102
                                                                j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
1103
                                                                j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
1104
                                                                j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
1105
                                                        } else {
1106
                                                                j->cadence_f[4].state = 7;
1107
                                                        }
1108
                                                } else {
1109
                                                        if (ixjdebug & 0x0008) {
1110
                                                                printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1111
                                                                                j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1112
                                                                                j->cadence_f[4].on1);
1113
                                                        }
1114
                                                        j->cadence_f[4].state = 0;
1115
                                                }
1116
                                        } else if (j->cadence_f[4].state == 3) {
1117
                                                if((time_after(jiffies, j->cadence_f[4].on2min) &&
1118
                                                    time_before(jiffies, j->cadence_f[4].on2max))) {
1119
                                                        if (j->cadence_f[4].off2) {
1120
                                                                j->cadence_f[4].state = 4;
1121
                                                                j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
1122
                                                                j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
1123
                                                                j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
1124
                                                        } else {
1125
                                                                j->cadence_f[4].state = 7;
1126
                                                        }
1127
                                                } else {
1128
                                                        if (ixjdebug & 0x0008) {
1129
                                                                printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1130
                                                                                j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1131
                                                                                j->cadence_f[4].on2);
1132
                                                        }
1133
                                                        j->cadence_f[4].state = 0;
1134
                                                }
1135
                                        } else if (j->cadence_f[4].state == 5) {
1136
                                                if((time_after(jiffies, j->cadence_f[4].on3min) &&
1137
                                                    time_before(jiffies, j->cadence_f[4].on3max))) {
1138
                                                        if (j->cadence_f[4].off3) {
1139
                                                                j->cadence_f[4].state = 6;
1140
                                                                j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
1141
                                                                j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
1142
                                                                j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
1143
                                                        } else {
1144
                                                                j->cadence_f[4].state = 7;
1145
                                                        }
1146
                                                } else {
1147
                                                        j->cadence_f[4].state = 0;
1148
                                                }
1149
                                        } else {
1150
                                                if (ixjdebug & 0x0008) {
1151
                                                        printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1152
                                                                        j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1153
                                                                        j->cadence_f[4].on3);
1154
                                                }
1155
                                                j->cadence_f[4].state = 0;
1156
                                        }
1157
                                }
1158
                                if (ixjdebug & 0x0010) {
1159
                                        printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1160
                                }
1161
                                if (ixjdebug & 0x0010) {
1162
                                        switch(j->cadence_f[4].state) {
1163
                                                case 1:
1164
                                                        printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1165
                                                j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
1166
                                                        break;
1167
                                                case 2:
1168
                                                        printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1169
                                                j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
1170
                                                        break;
1171
                                                case 3:
1172
                                                        printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1173
                                                j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
1174
                                                        break;
1175
                                                case 4:
1176
                                                        printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1177
                                                j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
1178
                                                        break;
1179
                                                case 5:
1180
                                                        printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1181
                                                j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
1182
                                                        break;
1183
                                                case 6:
1184
                                                        printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1185
                                                j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
1186
                                                        break;
1187
                                        }
1188
                                }
1189
                        }
1190
                        if (j->cadence_f[4].state == 7) {
1191
                                j->cadence_f[4].state = 0;
1192
                                j->pstn_ring_stop = jiffies;
1193
                                j->ex.bits.pstn_ring = 1;
1194
                                ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
1195
                                if(ixjdebug & 0x0008) {
1196
                                        printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
1197
                                }
1198
                        }
1199
                        if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
1200
                           (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
1201
                                if(ixjdebug & 0x0008) {
1202
                                        printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
1203
                                        printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
1204
                                        printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
1205
                                }
1206
                                j->pstn_ring_stop = j->pstn_ring_int = 0;
1207
                                daa_set_mode(j, SOP_PU_SLEEP);
1208
                        }
1209
                        outb_p(j->pld_scrw.byte, j->XILINXbase);
1210
                        if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
1211
                                ixj_daa_cid_read(j);
1212
                                j->ex.bits.caller_id = 1;
1213
                                ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
1214
                                j->pstn_cid_intr = 0;
1215
                        }
1216
                        if (daaint.bitreg.Cadence) {
1217
                                if(ixjdebug & 0x0008) {
1218
                                        printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
1219
                                }
1220
                                daa_set_mode(j, SOP_PU_SLEEP);
1221
                                j->ex.bits.pstn_ring = 0;
1222
                        }
1223
                        break;
1224
                case SOP_PU_CONVERSATION:
1225
                        if (daaint.bitreg.VDD_OK) {
1226
                                if(!daaint.bitreg.SI_0) {
1227
                                        if (!j->pstn_winkstart) {
1228
                                                if(ixjdebug & 0x0008) {
1229
                                                        printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
1230
                                                }
1231
                                                j->pstn_winkstart = jiffies;
1232
                                        }
1233
                                } else {
1234
                                        if (j->pstn_winkstart) {
1235
                                                if(ixjdebug & 0x0008) {
1236
                                                        printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
1237
                                                }
1238
                                                j->pstn_winkstart = 0;
1239
                                        }
1240
                                }
1241
                        }
1242
                        if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
1243
                                if(ixjdebug & 0x0008) {
1244
                                        printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
1245
                                }
1246
                                daa_set_mode(j, SOP_PU_SLEEP);
1247
                                j->pstn_winkstart = 0;
1248
                                j->ex.bits.pstn_wink = 1;
1249
                                ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
1250
                        }
1251
                        break;
1252
        }
1253
}
1254
 
1255
static void ixj_timeout(unsigned long ptr)
1256
{
1257
        int board;
1258
        unsigned long jifon;
1259
        IXJ *j = (IXJ *)ptr;
1260
        board = j->board;
1261
 
1262
        if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
1263
                ixj_perfmon(j->timerchecks);
1264
                j->hookstate = ixj_hookstate(j);
1265
                if (j->tone_state) {
1266
                        if (!(j->hookstate)) {
1267
                                ixj_cpt_stop(j);
1268
                                if (j->m_hook) {
1269
                                        j->m_hook = 0;
1270
                                        j->ex.bits.hookstate = 1;
1271
                                        ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1272
                                }
1273
                                clear_bit(board, &j->busyflags);
1274
                                ixj_add_timer(j);
1275
                                return;
1276
                        }
1277
                        if (j->tone_state == 1)
1278
                                jifon = ((hertz * j->tone_on_time) * 25 / 100000);
1279
                        else
1280
                                jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
1281
                        if (time_before(jiffies, j->tone_start_jif + jifon)) {
1282
                                if (j->tone_state == 1) {
1283
                                        ixj_play_tone(j, j->tone_index);
1284
                                        if (j->dsp.low == 0x20) {
1285
                                                clear_bit(board, &j->busyflags);
1286
                                                ixj_add_timer(j);
1287
                                                return;
1288
                                        }
1289
                                } else {
1290
                                        ixj_play_tone(j, 0);
1291
                                        if (j->dsp.low == 0x20) {
1292
                                                clear_bit(board, &j->busyflags);
1293
                                                ixj_add_timer(j);
1294
                                                return;
1295
                                        }
1296
                                }
1297
                        } else {
1298
                                ixj_tone_timeout(j);
1299
                                if (j->flags.dialtone) {
1300
                                        ixj_dialtone(j);
1301
                                }
1302
                                if (j->flags.busytone) {
1303
                                        ixj_busytone(j);
1304
                                        if (j->dsp.low == 0x20) {
1305
                                                clear_bit(board, &j->busyflags);
1306
                                                ixj_add_timer(j);
1307
                                                return;
1308
                                        }
1309
                                }
1310
                                if (j->flags.ringback) {
1311
                                        ixj_ringback(j);
1312
                                        if (j->dsp.low == 0x20) {
1313
                                                clear_bit(board, &j->busyflags);
1314
                                                ixj_add_timer(j);
1315
                                                return;
1316
                                        }
1317
                                }
1318
                                if (!j->tone_state) {
1319
                                        ixj_cpt_stop(j);
1320
                                }
1321
                        }
1322
                }
1323
                if (!(j->tone_state && j->dsp.low == 0x20)) {
1324
                        if (IsRxReady(j)) {
1325
                                ixj_read_frame(j);
1326
                        }
1327
                        if (IsTxReady(j)) {
1328
                                ixj_write_frame(j);
1329
                        }
1330
                }
1331
                if (j->flags.cringing) {
1332
                        if (j->hookstate & 1) {
1333
                                j->flags.cringing = 0;
1334
                                ixj_ring_off(j);
1335
                        } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
1336
                                switch(j->cadence_f[5].state) {
1337
                                        case 0:
1338
                                                j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
1339
                                                if (time_before(jiffies, j->cadence_f[5].on1dot)) {
1340
                                                        if(ixjdebug & 0x0004) {
1341
                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1342
                                                        }
1343
                                                        ixj_ring_on(j);
1344
                                                }
1345
                                                j->cadence_f[5].state = 1;
1346
                                                break;
1347
                                        case 1:
1348
                                                if (time_after(jiffies, j->cadence_f[5].on1dot)) {
1349
                                                        j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
1350
                                                        if(ixjdebug & 0x0004) {
1351
                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1352
                                                        }
1353
                                                        ixj_ring_off(j);
1354
                                                        j->cadence_f[5].state = 2;
1355
                                                }
1356
                                                break;
1357
                                        case 2:
1358
                                                if (time_after(jiffies, j->cadence_f[5].off1dot)) {
1359
                                                        if(ixjdebug & 0x0004) {
1360
                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1361
                                                        }
1362
                                                        ixj_ring_on(j);
1363
                                                        if (j->cadence_f[5].on2) {
1364
                                                                j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
1365
                                                                j->cadence_f[5].state = 3;
1366
                                                        } else {
1367
                                                                j->cadence_f[5].state = 7;
1368
                                                        }
1369
                                                }
1370
                                                break;
1371
                                        case 3:
1372
                                                if (time_after(jiffies, j->cadence_f[5].on2dot)) {
1373
                                                        if(ixjdebug & 0x0004) {
1374
                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1375
                                                        }
1376
                                                        ixj_ring_off(j);
1377
                                                        if (j->cadence_f[5].off2) {
1378
                                                                j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
1379
                                                                j->cadence_f[5].state = 4;
1380
                                                        } else {
1381
                                                                j->cadence_f[5].state = 7;
1382
                                                        }
1383
                                                }
1384
                                                break;
1385
                                        case 4:
1386
                                                if (time_after(jiffies, j->cadence_f[5].off2dot)) {
1387
                                                        if(ixjdebug & 0x0004) {
1388
                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1389
                                                        }
1390
                                                        ixj_ring_on(j);
1391
                                                        if (j->cadence_f[5].on3) {
1392
                                                                j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
1393
                                                                j->cadence_f[5].state = 5;
1394
                                                        } else {
1395
                                                                j->cadence_f[5].state = 7;
1396
                                                        }
1397
                                                }
1398
                                                break;
1399
                                        case 5:
1400
                                                if (time_after(jiffies, j->cadence_f[5].on3dot)) {
1401
                                                        if(ixjdebug & 0x0004) {
1402
                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1403
                                                        }
1404
                                                        ixj_ring_off(j);
1405
                                                        if (j->cadence_f[5].off3) {
1406
                                                                j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
1407
                                                                j->cadence_f[5].state = 6;
1408
                                                        } else {
1409
                                                                j->cadence_f[5].state = 7;
1410
                                                        }
1411
                                                }
1412
                                                break;
1413
                                        case 6:
1414
                                                if (time_after(jiffies, j->cadence_f[5].off3dot)) {
1415
                                                        if(ixjdebug & 0x0004) {
1416
                                                                printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1417
                                                        }
1418
                                                        j->cadence_f[5].state = 7;
1419
                                                }
1420
                                                break;
1421
                                        case 7:
1422
                                                if(ixjdebug & 0x0004) {
1423
                                                        printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1424
                                                }
1425
                                                j->flags.cidring = 1;
1426
                                                j->cadence_f[5].state = 0;
1427
                                                break;
1428
                                }
1429
                                if (j->flags.cidring && !j->flags.cidsent) {
1430
                                        j->flags.cidsent = 1;
1431
                                        if(j->fskdcnt) {
1432
                                                SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1433
                                                ixj_pre_cid(j);
1434
                                        }
1435
                                        j->flags.cidring = 0;
1436
                                }
1437
                                clear_bit(board, &j->busyflags);
1438
                                ixj_add_timer(j);
1439
                                return;
1440
                        } else {
1441
                                if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
1442
                                        if (j->flags.cidring && !j->flags.cidsent) {
1443
                                                j->flags.cidsent = 1;
1444
                                                if(j->fskdcnt) {
1445
                                                        SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1446
                                                        ixj_pre_cid(j);
1447
                                                }
1448
                                                j->flags.cidring = 0;
1449
                                        }
1450
                                        j->ring_cadence_t--;
1451
                                        if (j->ring_cadence_t == -1)
1452
                                                j->ring_cadence_t = 15;
1453
                                        j->ring_cadence_jif = jiffies;
1454
 
1455
                                        if (j->ring_cadence & 1 << j->ring_cadence_t) {
1456
                                                if(j->flags.cidsent && j->cadence_f[5].en_filter)
1457
                                                        j->flags.firstring = 1;
1458
                                                else
1459
                                                        ixj_ring_on(j);
1460
                                        } else {
1461
                                                ixj_ring_off(j);
1462
                                                if(!j->flags.cidsent)
1463
                                                        j->flags.cidring = 1;
1464
                                        }
1465
                                }
1466
                                clear_bit(board, &j->busyflags);
1467
                                ixj_add_timer(j);
1468
                                return;
1469
                        }
1470
                }
1471
                if (!j->flags.ringing) {
1472
                        if (j->hookstate) { /* & 1) { */
1473
                                if (j->dsp.low != 0x20 &&
1474
                                    SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
1475
                                        SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1476
                                }
1477
                                LineMonitor(j);
1478
                                read_filters(j);
1479
                                ixj_WriteDSPCommand(0x511B, j);
1480
                                j->proc_load = j->ssr.high << 8 | j->ssr.low;
1481
                                if (!j->m_hook && (j->hookstate & 1)) {
1482
                                        j->m_hook = j->ex.bits.hookstate = 1;
1483
                                        ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1484
                                }
1485
                        } else {
1486
                                if (j->ex.bits.dtmf_ready) {
1487
                                        j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
1488
                                }
1489
                                if (j->m_hook) {
1490
                                        j->m_hook = 0;
1491
                                        j->ex.bits.hookstate = 1;
1492
                                        ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1493
                                }
1494
                        }
1495
                }
1496
                if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
1497
                        ixj_pstn_state(j);
1498
                }
1499
                if (j->ex.bytes) {
1500
                        wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
1501
                }
1502
                clear_bit(board, &j->busyflags);
1503
        }
1504
        ixj_add_timer(j);
1505
}
1506
 
1507
static int ixj_status_wait(IXJ *j)
1508
{
1509
        unsigned long jif;
1510
 
1511
        jif = jiffies + ((60 * hertz) / 100);
1512
        while (!IsStatusReady(j)) {
1513
                ixj_perfmon(j->statuswait);
1514
                if (time_after(jiffies, jif)) {
1515
                        ixj_perfmon(j->statuswaitfail);
1516
                        return -1;
1517
                }
1518
        }
1519
        return 0;
1520
}
1521
 
1522
static int ixj_PCcontrol_wait(IXJ *j)
1523
{
1524
        unsigned long jif;
1525
 
1526
        jif = jiffies + ((60 * hertz) / 100);
1527
        while (!IsPCControlReady(j)) {
1528
                ixj_perfmon(j->pcontrolwait);
1529
                if (time_after(jiffies, jif)) {
1530
                        ixj_perfmon(j->pcontrolwaitfail);
1531
                        return -1;
1532
                }
1533
        }
1534
        return 0;
1535
}
1536
 
1537
static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
1538
{
1539
        BYTES bytes;
1540
        unsigned long jif;
1541
 
1542
        atomic_inc(&j->DSPWrite);
1543
        if(atomic_read(&j->DSPWrite) > 1) {
1544
                printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
1545
                return -1;
1546
        }
1547
        bytes.high = (cmd & 0xFF00) >> 8;
1548
        bytes.low = cmd & 0x00FF;
1549
        jif = jiffies + ((60 * hertz) / 100);
1550
        while (!IsControlReady(j)) {
1551
                ixj_perfmon(j->iscontrolready);
1552
                if (time_after(jiffies, jif)) {
1553
                        ixj_perfmon(j->iscontrolreadyfail);
1554
                        atomic_dec(&j->DSPWrite);
1555
                        if(atomic_read(&j->DSPWrite) > 0) {
1556
                                printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
1557
                                while(atomic_read(&j->DSPWrite) > 0) {
1558
                                        atomic_dec(&j->DSPWrite);
1559
                                }
1560
                        }
1561
                        return -1;
1562
                }
1563
        }
1564
        outb(bytes.low, j->DSPbase + 6);
1565
        outb(bytes.high, j->DSPbase + 7);
1566
 
1567
        if (ixj_status_wait(j)) {
1568
                j->ssr.low = 0xFF;
1569
                j->ssr.high = 0xFF;
1570
                atomic_dec(&j->DSPWrite);
1571
                if(atomic_read(&j->DSPWrite) > 0) {
1572
                        printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
1573
                        while(atomic_read(&j->DSPWrite) > 0) {
1574
                                atomic_dec(&j->DSPWrite);
1575
                        }
1576
                }
1577
                return -1;
1578
        }
1579
/* Read Software Status Register */
1580
        j->ssr.low = inb_p(j->DSPbase + 2);
1581
        j->ssr.high = inb_p(j->DSPbase + 3);
1582
        atomic_dec(&j->DSPWrite);
1583
        if(atomic_read(&j->DSPWrite) > 0) {
1584
                printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
1585
                while(atomic_read(&j->DSPWrite) > 0) {
1586
                        atomic_dec(&j->DSPWrite);
1587
                }
1588
        }
1589
        return 0;
1590
}
1591
 
1592
/***************************************************************************
1593
*
1594
*  General Purpose IO Register read routine
1595
*
1596
***************************************************************************/
1597
static inline int ixj_gpio_read(IXJ *j)
1598
{
1599
        if (ixj_WriteDSPCommand(0x5143, j))
1600
                return -1;
1601
 
1602
        j->gpio.bytes.low = j->ssr.low;
1603
        j->gpio.bytes.high = j->ssr.high;
1604
 
1605
        return 0;
1606
}
1607
 
1608
static inline void LED_SetState(int state, IXJ *j)
1609
{
1610
        if (j->cardtype == QTI_LINEJACK) {
1611
                j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
1612
                j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
1613
                j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
1614
                j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
1615
 
1616
                outb(j->pld_scrw.byte, j->XILINXbase);
1617
        }
1618
}
1619
 
1620
/*********************************************************************
1621
*  GPIO Pins are configured as follows on the Quicknet Internet
1622
*  PhoneJACK Telephony Cards
1623
*
1624
* POTS Select        GPIO_6=0 GPIO_7=0
1625
* Mic/Speaker Select GPIO_6=0 GPIO_7=1
1626
* Handset Select     GPIO_6=1 GPIO_7=0
1627
*
1628
* SLIC Active        GPIO_1=0 GPIO_2=1 GPIO_5=0
1629
* SLIC Ringing       GPIO_1=1 GPIO_2=1 GPIO_5=0
1630
* SLIC Open Circuit  GPIO_1=0 GPIO_2=0 GPIO_5=0
1631
*
1632
* Hook Switch changes reported on GPIO_3
1633
*********************************************************************/
1634
static int ixj_set_port(IXJ *j, int arg)
1635
{
1636
        if (j->cardtype == QTI_PHONEJACK_LITE) {
1637
                if (arg != PORT_POTS)
1638
                        return 10;
1639
                else
1640
                        return 0;
1641
        }
1642
        switch (arg) {
1643
        case PORT_POTS:
1644
                j->port = PORT_POTS;
1645
                switch (j->cardtype) {
1646
                case QTI_PHONECARD:
1647
                        if (j->flags.pcmciasct == 1)
1648
                                SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1649
                        else
1650
                                return 11;
1651
                        break;
1652
                case QTI_PHONEJACK_PCI:
1653
                        j->pld_slicw.pcib.mic = 0;
1654
                        j->pld_slicw.pcib.spk = 0;
1655
                        outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1656
                        break;
1657
                case QTI_LINEJACK:
1658
                        ixj_set_pots(j, 0);                      /* Disconnect POTS/PSTN relay */
1659
                        if (ixj_WriteDSPCommand(0xC528, j))             /* Write CODEC config to
1660
                                                                           Software Control Register */
1661
                                return 2;
1662
                        j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1663
 
1664
                        outb(j->pld_scrw.byte, j->XILINXbase);
1665
                        j->pld_clock.byte = 0;
1666
                        outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1667
                        j->pld_slicw.bits.rly1 = 1;
1668
                        j->pld_slicw.bits.spken = 0;
1669
                        outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1670
                        ixj_mixer(0x1200, j);   /* Turn Off MIC switch on mixer left */
1671
                        ixj_mixer(0x1401, j);   /* Turn On Mono1 switch on mixer left */
1672
                        ixj_mixer(0x1300, j);       /* Turn Off MIC switch on mixer right */
1673
                        ixj_mixer(0x1501, j);       /* Turn On Mono1 switch on mixer right */
1674
                        ixj_mixer(0x0E80, j);   /*Mic mute */
1675
                        ixj_mixer(0x0F00, j);   /* Set mono out (SLIC) to 0dB */
1676
                        ixj_mixer(0x0080, j);   /* Mute Master Left volume */
1677
                        ixj_mixer(0x0180, j);   /* Mute Master Right volume */
1678
                        SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
1679
/*                      SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1680
                        break;
1681
                case QTI_PHONEJACK:
1682
                        j->gpio.bytes.high = 0x0B;
1683
                        j->gpio.bits.gpio6 = 0;
1684
                        j->gpio.bits.gpio7 = 0;
1685
                        ixj_WriteDSPCommand(j->gpio.word, j);
1686
                        break;
1687
                }
1688
                break;
1689
        case PORT_PSTN:
1690
                if (j->cardtype == QTI_LINEJACK) {
1691
                        ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */
1692
 
1693
                        j->pld_slicw.bits.rly3 = 0;
1694
                        j->pld_slicw.bits.rly1 = 1;
1695
                        j->pld_slicw.bits.spken = 0;
1696
                        outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1697
                        j->port = PORT_PSTN;
1698
                } else {
1699
                        return 4;
1700
                }
1701
                break;
1702
        case PORT_SPEAKER:
1703
                j->port = PORT_SPEAKER;
1704
                switch (j->cardtype) {
1705
                case QTI_PHONECARD:
1706
                        if (j->flags.pcmciasct) {
1707
                                SLIC_SetState(PLD_SLIC_STATE_OC, j);
1708
                        }
1709
                        break;
1710
                case QTI_PHONEJACK_PCI:
1711
                        j->pld_slicw.pcib.mic = 1;
1712
                        j->pld_slicw.pcib.spk = 1;
1713
                        outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1714
                        break;
1715
                case QTI_LINEJACK:
1716
                        ixj_set_pots(j, 0);                      /* Disconnect POTS/PSTN relay */
1717
                        if (ixj_WriteDSPCommand(0xC528, j))             /* Write CODEC config to
1718
                                                                           Software Control Register */
1719
                                return 2;
1720
                        j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1721
 
1722
                        outb(j->pld_scrw.byte, j->XILINXbase);
1723
                        j->pld_clock.byte = 0;
1724
                        outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1725
                        j->pld_slicw.bits.rly1 = 1;
1726
                        j->pld_slicw.bits.spken = 1;
1727
                        outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1728
                        ixj_mixer(0x1201, j);   /* Turn On MIC switch on mixer left */
1729
                        ixj_mixer(0x1400, j);   /* Turn Off Mono1 switch on mixer left */
1730
                        ixj_mixer(0x1301, j);       /* Turn On MIC switch on mixer right */
1731
                        ixj_mixer(0x1500, j);       /* Turn Off Mono1 switch on mixer right */
1732
                        ixj_mixer(0x0E06, j);   /*Mic un-mute 0dB */
1733
                        ixj_mixer(0x0F80, j);   /* Mute mono out (SLIC) */
1734
                        ixj_mixer(0x0000, j);   /* Set Master Left volume to 0dB */
1735
                        ixj_mixer(0x0100, j);   /* Set Master Right volume to 0dB */
1736
                        break;
1737
                case QTI_PHONEJACK:
1738
                        j->gpio.bytes.high = 0x0B;
1739
                        j->gpio.bits.gpio6 = 0;
1740
                        j->gpio.bits.gpio7 = 1;
1741
                        ixj_WriteDSPCommand(j->gpio.word, j);
1742
                        break;
1743
                }
1744
                break;
1745
        case PORT_HANDSET:
1746
                if (j->cardtype != QTI_PHONEJACK) {
1747
                        return 5;
1748
                } else {
1749
                        j->gpio.bytes.high = 0x0B;
1750
                        j->gpio.bits.gpio6 = 1;
1751
                        j->gpio.bits.gpio7 = 0;
1752
                        ixj_WriteDSPCommand(j->gpio.word, j);
1753
                        j->port = PORT_HANDSET;
1754
                }
1755
                break;
1756
        default:
1757
                return 6;
1758
                break;
1759
        }
1760
        return 0;
1761
}
1762
 
1763
static int ixj_set_pots(IXJ *j, int arg)
1764
{
1765
        if (j->cardtype == QTI_LINEJACK) {
1766
                if (arg) {
1767
                        if (j->port == PORT_PSTN) {
1768
                                j->pld_slicw.bits.rly1 = 0;
1769
                                outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1770
                                j->flags.pots_pstn = 1;
1771
                                return 1;
1772
                        } else {
1773
                                j->flags.pots_pstn = 0;
1774
                                return 0;
1775
                        }
1776
                } else {
1777
                        j->pld_slicw.bits.rly1 = 1;
1778
                        outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1779
                        j->flags.pots_pstn = 0;
1780
                        return 1;
1781
                }
1782
        } else {
1783
                return 0;
1784
        }
1785
}
1786
 
1787
static void ixj_ring_on(IXJ *j)
1788
{
1789
        if (j->dsp.low == 0x20) /* Internet PhoneJACK */
1790
         {
1791
                if (ixjdebug & 0x0004)
1792
                        printk(KERN_INFO "IXJ Ring On /dev/phone%d\n",  j->board);
1793
 
1794
                j->gpio.bytes.high = 0x0B;
1795
                j->gpio.bytes.low = 0x00;
1796
                j->gpio.bits.gpio1 = 1;
1797
                j->gpio.bits.gpio2 = 1;
1798
                j->gpio.bits.gpio5 = 0;
1799
                ixj_WriteDSPCommand(j->gpio.word, j);   /* send the ring signal */
1800
        } else                  /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1801
        {
1802
                if (ixjdebug & 0x0004)
1803
                        printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1804
 
1805
                SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
1806
        }
1807
}
1808
 
1809
static int ixj_siadc(IXJ *j, int val)
1810
{
1811
        if(j->cardtype == QTI_PHONECARD){
1812
                if(j->flags.pcmciascp){
1813
                        if(val == -1)
1814
                                return j->siadc.bits.rxg;
1815
 
1816
                        if(val < 0 || val > 0x1F)
1817
                                return -1;
1818
 
1819
                        j->siadc.bits.hom = 0;                           /* Handset Out Mute */
1820
                        j->siadc.bits.lom = 0;                           /* Line Out Mute */
1821
                        j->siadc.bits.rxg = val;                        /*(0xC000 - 0x41C8) / 0x4EF;    RX PGA Gain */
1822
                        j->psccr.bits.addr = 6;                         /* R/W Smart Cable Register Address */
1823
                        j->psccr.bits.rw = 0;                            /* Read / Write flag */
1824
                        j->psccr.bits.dev = 0;
1825
                        outb(j->siadc.byte, j->XILINXbase + 0x00);
1826
                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1827
                        ixj_PCcontrol_wait(j);
1828
                        return j->siadc.bits.rxg;
1829
                }
1830
        }
1831
        return -1;
1832
}
1833
 
1834
static int ixj_sidac(IXJ *j, int val)
1835
{
1836
        if(j->cardtype == QTI_PHONECARD){
1837
                if(j->flags.pcmciascp){
1838
                        if(val == -1)
1839
                                return j->sidac.bits.txg;
1840
 
1841
                        if(val < 0 || val > 0x1F)
1842
                                return -1;
1843
 
1844
                        j->sidac.bits.srm = 1;                          /* Speaker Right Mute */
1845
                        j->sidac.bits.slm = 1;                          /* Speaker Left Mute */
1846
                        j->sidac.bits.txg = val;                        /* (0xC000 - 0x45E4) / 0x5D3;    TX PGA Gain */
1847
                        j->psccr.bits.addr = 7;                         /* R/W Smart Cable Register Address */
1848
                        j->psccr.bits.rw = 0;                            /* Read / Write flag */
1849
                        j->psccr.bits.dev = 0;
1850
                        outb(j->sidac.byte, j->XILINXbase + 0x00);
1851
                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1852
                        ixj_PCcontrol_wait(j);
1853
                        return j->sidac.bits.txg;
1854
                }
1855
        }
1856
        return -1;
1857
}
1858
 
1859
static int ixj_pcmcia_cable_check(IXJ *j)
1860
{
1861
        j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
1862
        if (!j->flags.pcmciastate) {
1863
                j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
1864
                if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
1865
                        j->flags.pcmciastate = 4;
1866
                        return 0;
1867
                }
1868
                if (j->pccr1.bits.ed) {
1869
                        j->pccr1.bits.ed = 0;
1870
                        j->psccr.bits.dev = 3;
1871
                        j->psccr.bits.rw = 1;
1872
                        outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
1873
                        ixj_PCcontrol_wait(j);
1874
                        j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
1875
                        j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
1876
                        j->psccr.bits.dev = 3;
1877
                        j->psccr.bits.rw = 0;
1878
                        outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1879
                        ixj_PCcontrol_wait(j);
1880
                        return j->pslic.bits.led2 ? 1 : 0;
1881
                } else if (j->flags.pcmciasct) {
1882
                        return j->r_hook;
1883
                } else {
1884
                        return 1;
1885
                }
1886
        } else if (j->flags.pcmciastate == 4) {
1887
                if (!j->pccr1.bits.drf) {
1888
                        j->flags.pcmciastate = 3;
1889
                }
1890
                return 0;
1891
        } else if (j->flags.pcmciastate == 3) {
1892
                j->pccr2.bits.pwr = 0;
1893
                j->pccr2.bits.rstc = 1;
1894
                outb(j->pccr2.byte, j->XILINXbase + 0x02);
1895
                j->checkwait = jiffies + (hertz * 2);
1896
                j->flags.incheck = 1;
1897
                j->flags.pcmciastate = 2;
1898
                return 0;
1899
        } else if (j->flags.pcmciastate == 2) {
1900
                if (j->flags.incheck) {
1901
                        if (time_before(jiffies, j->checkwait)) {
1902
                                return 0;
1903
                        } else {
1904
                                j->flags.incheck = 0;
1905
                        }
1906
                }
1907
                j->pccr2.bits.pwr = 0;
1908
                j->pccr2.bits.rstc = 0;
1909
                outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1910
                j->flags.pcmciastate = 1;
1911
                return 0;
1912
        } else if (j->flags.pcmciastate == 1) {
1913
                j->flags.pcmciastate = 0;
1914
                if (!j->pccr1.bits.drf) {
1915
                        j->psccr.bits.dev = 3;
1916
                        j->psccr.bits.rw = 1;
1917
                        outb_p(j->psccr.byte, j->XILINXbase + 0x01);
1918
                        ixj_PCcontrol_wait(j);
1919
                        j->flags.pcmciascp = 1;         /* Set Cable Present Flag */
1920
 
1921
                        j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03;         /* Get Cable Type */
1922
 
1923
                        if (j->flags.pcmciasct == 3) {
1924
                                j->flags.pcmciastate = 4;
1925
                                return 0;
1926
                        } else if (j->flags.pcmciasct == 0) {
1927
                                j->pccr2.bits.pwr = 1;
1928
                                j->pccr2.bits.rstc = 0;
1929
                                outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1930
                                j->port = PORT_SPEAKER;
1931
                        } else {
1932
                                j->port = PORT_POTS;
1933
                        }
1934
                        j->sic1.bits.cpd = 0;                            /* Chip Power Down */
1935
                        j->sic1.bits.mpd = 0;                            /* MIC Bias Power Down */
1936
                        j->sic1.bits.hpd = 0;                            /* Handset Bias Power Down */
1937
                        j->sic1.bits.lpd = 0;                            /* Line Bias Power Down */
1938
                        j->sic1.bits.spd = 1;                           /* Speaker Drive Power Down */
1939
                        j->psccr.bits.addr = 1;                         /* R/W Smart Cable Register Address */
1940
                        j->psccr.bits.rw = 0;                            /* Read / Write flag */
1941
                        j->psccr.bits.dev = 0;
1942
                        outb(j->sic1.byte, j->XILINXbase + 0x00);
1943
                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1944
                        ixj_PCcontrol_wait(j);
1945
 
1946
                        j->sic2.bits.al = 0;                             /* Analog Loopback DAC analog -> ADC analog */
1947
                        j->sic2.bits.dl2 = 0;                            /* Digital Loopback DAC -> ADC one bit */
1948
                        j->sic2.bits.dl1 = 0;                            /* Digital Loopback ADC -> DAC one bit */
1949
                        j->sic2.bits.pll = 0;                            /* 1 = div 10, 0 = div 5 */
1950
                        j->sic2.bits.hpd = 0;                            /* HPF disable */
1951
                        j->psccr.bits.addr = 2;                         /* R/W Smart Cable Register Address */
1952
                        j->psccr.bits.rw = 0;                            /* Read / Write flag */
1953
                        j->psccr.bits.dev = 0;
1954
                        outb(j->sic2.byte, j->XILINXbase + 0x00);
1955
                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1956
                        ixj_PCcontrol_wait(j);
1957
 
1958
                        j->psccr.bits.addr = 3;                         /* R/W Smart Cable Register Address */
1959
                        j->psccr.bits.rw = 0;                            /* Read / Write flag */
1960
                        j->psccr.bits.dev = 0;
1961
                        outb(0x00, j->XILINXbase + 0x00);               /* PLL Divide N1 */
1962
                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1963
                        ixj_PCcontrol_wait(j);
1964
 
1965
                        j->psccr.bits.addr = 4;                         /* R/W Smart Cable Register Address */
1966
                        j->psccr.bits.rw = 0;                            /* Read / Write flag */
1967
                        j->psccr.bits.dev = 0;
1968
                        outb(0x09, j->XILINXbase + 0x00);               /* PLL Multiply M1 */
1969
                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1970
                        ixj_PCcontrol_wait(j);
1971
 
1972
                        j->sirxg.bits.lig = 1;                          /* Line In Gain */
1973
                        j->sirxg.bits.lim = 1;                          /* Line In Mute */
1974
                        j->sirxg.bits.mcg = 0;                           /* MIC In Gain was 3 */
1975
                        j->sirxg.bits.mcm = 0;                           /* MIC In Mute */
1976
                        j->sirxg.bits.him = 0;                           /* Handset In Mute */
1977
                        j->sirxg.bits.iir = 1;                          /* IIR */
1978
                        j->psccr.bits.addr = 5;                         /* R/W Smart Cable Register Address */
1979
                        j->psccr.bits.rw = 0;                            /* Read / Write flag */
1980
                        j->psccr.bits.dev = 0;
1981
                        outb(j->sirxg.byte, j->XILINXbase + 0x00);
1982
                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1983
                        ixj_PCcontrol_wait(j);
1984
 
1985
                        ixj_siadc(j, 0x17);
1986
                        ixj_sidac(j, 0x1D);
1987
 
1988
                        j->siaatt.bits.sot = 0;
1989
                        j->psccr.bits.addr = 9;                         /* R/W Smart Cable Register Address */
1990
                        j->psccr.bits.rw = 0;                            /* Read / Write flag */
1991
                        j->psccr.bits.dev = 0;
1992
                        outb(j->siaatt.byte, j->XILINXbase + 0x00);
1993
                        outb(j->psccr.byte, j->XILINXbase + 0x01);
1994
                        ixj_PCcontrol_wait(j);
1995
 
1996
                        if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
1997
                                j->psccr.byte = j->pslic.byte = 0;
1998
                                j->pslic.bits.powerdown = 1;
1999
                                j->psccr.bits.dev = 3;
2000
                                j->psccr.bits.rw = 0;
2001
                                outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2002
                                ixj_PCcontrol_wait(j);
2003
                        }
2004
                }
2005
                return 0;
2006
        } else {
2007
                j->flags.pcmciascp = 0;
2008
                return 0;
2009
        }
2010
        return 0;
2011
}
2012
 
2013
static int ixj_hookstate(IXJ *j)
2014
{
2015
        unsigned long det;
2016
        int fOffHook = 0;
2017
 
2018
        switch (j->cardtype) {
2019
        case QTI_PHONEJACK:
2020
                ixj_gpio_read(j);
2021
                fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
2022
                break;
2023
        case QTI_LINEJACK:
2024
        case QTI_PHONEJACK_LITE:
2025
        case QTI_PHONEJACK_PCI:
2026
                SLIC_GetState(j);
2027
                if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
2028
                        fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
2029
                        if(fOffHook != j->p_hook) {
2030
                                if(!j->checkwait) {
2031
                                        j->checkwait = jiffies;
2032
                                }
2033
                                if(time_before(jiffies, j->checkwait + 2)) {
2034
                                        fOffHook ^= 1;
2035
                                } else {
2036
                                        j->checkwait = 0;
2037
                                }
2038
                                j->p_hook = fOffHook;
2039
                                printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
2040
                        }
2041
                } else {
2042
                        if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
2043
                            j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
2044
                                if (j->flags.ringing || j->flags.cringing) {
2045
                                        if (!in_interrupt()) {
2046
                                                det = jiffies + (hertz / 50);
2047
                                                while (time_before(jiffies, det)) {
2048
                                                        set_current_state(TASK_INTERRUPTIBLE);
2049
                                                        schedule_timeout(1);
2050
                                                }
2051
                                        }
2052
                                        SLIC_GetState(j);
2053
                                        if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
2054
                                                ixj_ring_on(j);
2055
                                        }
2056
                                }
2057
                                if (j->cardtype == QTI_PHONEJACK_PCI) {
2058
                                        j->pld_scrr.byte = inb_p(j->XILINXbase);
2059
                                        fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
2060
                                } else
2061
                                        fOffHook = j->pld_slicr.bits.det ? 1 : 0;
2062
                        }
2063
                }
2064
                break;
2065
        case QTI_PHONECARD:
2066
                fOffHook = ixj_pcmcia_cable_check(j);
2067
                break;
2068
        }
2069
        if (j->r_hook != fOffHook) {
2070
                j->r_hook = fOffHook;
2071
                if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
2072
                        j->ex.bits.hookstate = 1;
2073
                        ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
2074
                } else if (!fOffHook) {
2075
                        j->flash_end = jiffies + ((60 * hertz) / 100);
2076
                }
2077
        }
2078
        if (fOffHook) {
2079
                if(time_before(jiffies, j->flash_end)) {
2080
                        j->ex.bits.flash = 1;
2081
                        j->flash_end = 0;
2082
                        ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
2083
                }
2084
        } else {
2085
                if(time_before(jiffies, j->flash_end)) {
2086
                        fOffHook = 1;
2087
                }
2088
        }
2089
 
2090
        if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
2091
                fOffHook |= 2;
2092
 
2093
        if (j->port == PORT_SPEAKER) {
2094
                if(j->cardtype == QTI_PHONECARD) {
2095
                        if(j->flags.pcmciascp && j->flags.pcmciasct) {
2096
                                fOffHook |= 2;
2097
                        }
2098
                } else {
2099
                        fOffHook |= 2;
2100
                }
2101
        }
2102
 
2103
        if (j->port == PORT_HANDSET)
2104
                fOffHook |= 2;
2105
 
2106
        return fOffHook;
2107
}
2108
 
2109
static void ixj_ring_off(IXJ *j)
2110
{
2111
        if (j->dsp.low == 0x20) /* Internet PhoneJACK */
2112
         {
2113
                if (ixjdebug & 0x0004)
2114
                        printk(KERN_INFO "IXJ Ring Off\n");
2115
                j->gpio.bytes.high = 0x0B;
2116
                j->gpio.bytes.low = 0x00;
2117
                j->gpio.bits.gpio1 = 0;
2118
                j->gpio.bits.gpio2 = 1;
2119
                j->gpio.bits.gpio5 = 0;
2120
                ixj_WriteDSPCommand(j->gpio.word, j);
2121
        } else                  /* Internet LineJACK */
2122
        {
2123
                if (ixjdebug & 0x0004)
2124
                        printk(KERN_INFO "IXJ Ring Off\n");
2125
 
2126
                if(!j->flags.cidplay)
2127
                        SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
2128
 
2129
                SLIC_GetState(j);
2130
        }
2131
}
2132
 
2133
static void ixj_ring_start(IXJ *j)
2134
{
2135
        j->flags.cringing = 1;
2136
        if (ixjdebug & 0x0004)
2137
                printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
2138
        if (ixj_hookstate(j) & 1) {
2139
                if (j->port == PORT_POTS)
2140
                        ixj_ring_off(j);
2141
                j->flags.cringing = 0;
2142
                if (ixjdebug & 0x0004)
2143
                        printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
2144
        } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
2145
                j->ring_cadence_jif = jiffies;
2146
                j->flags.cidsent = j->flags.cidring = 0;
2147
                j->cadence_f[5].state = 0;
2148
                if(j->cadence_f[5].on1)
2149
                        ixj_ring_on(j);
2150
        } else {
2151
                j->ring_cadence_jif = jiffies;
2152
                j->ring_cadence_t = 15;
2153
                if (j->ring_cadence & 1 << j->ring_cadence_t) {
2154
                        ixj_ring_on(j);
2155
                } else {
2156
                        ixj_ring_off(j);
2157
                }
2158
                j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
2159
        }
2160
}
2161
 
2162
static int ixj_ring(IXJ *j)
2163
{
2164
        char cntr;
2165
        unsigned long jif, det;
2166
 
2167
        j->flags.ringing = 1;
2168
        if (ixj_hookstate(j) & 1) {
2169
                ixj_ring_off(j);
2170
                j->flags.ringing = 0;
2171
                return 1;
2172
        }
2173
        det = 0;
2174
        for (cntr = 0; cntr < j->maxrings; cntr++) {
2175
                jif = jiffies + (1 * hertz);
2176
                ixj_ring_on(j);
2177
                while (time_before(jiffies, jif)) {
2178
                        if (ixj_hookstate(j) & 1) {
2179
                                ixj_ring_off(j);
2180
                                j->flags.ringing = 0;
2181
                                return 1;
2182
                        }
2183
                        set_current_state(TASK_INTERRUPTIBLE);
2184
                        schedule_timeout(1);
2185
                        if (signal_pending(current))
2186
                                break;
2187
                }
2188
                jif = jiffies + (3 * hertz);
2189
                ixj_ring_off(j);
2190
                while (time_before(jiffies, jif)) {
2191
                        if (ixj_hookstate(j) & 1) {
2192
                                det = jiffies + (hertz / 100);
2193
                                while (time_before(jiffies, det)) {
2194
                                        set_current_state(TASK_INTERRUPTIBLE);
2195
                                        schedule_timeout(1);
2196
                                        if (signal_pending(current))
2197
                                                break;
2198
                                }
2199
                                if (ixj_hookstate(j) & 1) {
2200
                                        j->flags.ringing = 0;
2201
                                        return 1;
2202
                                }
2203
                        }
2204
                        set_current_state(TASK_INTERRUPTIBLE);
2205
                        schedule_timeout(1);
2206
                        if (signal_pending(current))
2207
                                break;
2208
                }
2209
        }
2210
        ixj_ring_off(j);
2211
        j->flags.ringing = 0;
2212
        return 0;
2213
}
2214
 
2215
static int ixj_open(struct phone_device *p, struct file *file_p)
2216
{
2217
        IXJ *j = get_ixj(p->board);
2218
        file_p->private_data = j;
2219
 
2220
        if (!j->DSPbase)
2221
                return -ENODEV;
2222
 
2223
        if (file_p->f_mode & FMODE_READ) {
2224
                if(!j->readers) {
2225
                        j->readers++;
2226
                } else {
2227
                        return -EBUSY;
2228
                }
2229
        }
2230
 
2231
        if (file_p->f_mode & FMODE_WRITE) {
2232
                if(!j->writers) {
2233
                        j->writers++;
2234
                } else {
2235
                        if (file_p->f_mode & FMODE_READ){
2236
                                j->readers--;
2237
                        }
2238
                        return -EBUSY;
2239
                }
2240
        }
2241
 
2242
        if (j->cardtype == QTI_PHONECARD) {
2243
                j->pslic.bits.powerdown = 0;
2244
                j->psccr.bits.dev = 3;
2245
                j->psccr.bits.rw = 0;
2246
                outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2247
                ixj_PCcontrol_wait(j);
2248
        }
2249
 
2250
        j->flags.cidplay = 0;
2251
        j->flags.cidcw_ack = 0;
2252
 
2253
        MOD_INC_USE_COUNT;
2254
 
2255
        if (ixjdebug & 0x0002)
2256
                printk(KERN_INFO "Opening board %d\n", p->board);
2257
 
2258
        j->framesread = j->frameswritten = 0;
2259
        return 0;
2260
}
2261
 
2262
int ixj_release(struct inode *inode, struct file *file_p)
2263
{
2264
        IXJ_TONE ti;
2265
        int cnt;
2266
        IXJ *j = file_p->private_data;
2267
        int board = j->p.board;
2268
 
2269
        /*
2270
         *    Set up locks to ensure that only one process is talking to the DSP at a time.
2271
         *    This is necessary to keep the DSP from locking up.
2272
         */
2273
        while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
2274
                set_current_state(TASK_INTERRUPTIBLE);
2275
                schedule_timeout(1);
2276
        }
2277
        if (ixjdebug & 0x0002)
2278
                printk(KERN_INFO "Closing board %d\n", NUM(inode->i_rdev));
2279
 
2280
        if (j->cardtype == QTI_PHONECARD)
2281
                ixj_set_port(j, PORT_SPEAKER);
2282
        else
2283
                ixj_set_port(j, PORT_POTS);
2284
 
2285
        aec_stop(j);
2286
        ixj_play_stop(j);
2287
        ixj_record_stop(j);
2288
        set_play_volume(j, 0x100);
2289
        set_rec_volume(j, 0x100);
2290
        ixj_ring_off(j);
2291
 
2292
        /* Restore the tone table to default settings. */
2293
        ti.tone_index = 10;
2294
        ti.gain0 = 1;
2295
        ti.freq0 = hz941;
2296
        ti.gain1 = 0;
2297
        ti.freq1 = hz1209;
2298
        ixj_init_tone(j, &ti);
2299
        ti.tone_index = 11;
2300
        ti.gain0 = 1;
2301
        ti.freq0 = hz941;
2302
        ti.gain1 = 0;
2303
        ti.freq1 = hz1336;
2304
        ixj_init_tone(j, &ti);
2305
        ti.tone_index = 12;
2306
        ti.gain0 = 1;
2307
        ti.freq0 = hz941;
2308
        ti.gain1 = 0;
2309
        ti.freq1 = hz1477;
2310
        ixj_init_tone(j, &ti);
2311
        ti.tone_index = 13;
2312
        ti.gain0 = 1;
2313
        ti.freq0 = hz800;
2314
        ti.gain1 = 0;
2315
        ti.freq1 = 0;
2316
        ixj_init_tone(j, &ti);
2317
        ti.tone_index = 14;
2318
        ti.gain0 = 1;
2319
        ti.freq0 = hz1000;
2320
        ti.gain1 = 0;
2321
        ti.freq1 = 0;
2322
        ixj_init_tone(j, &ti);
2323
        ti.tone_index = 15;
2324
        ti.gain0 = 1;
2325
        ti.freq0 = hz1250;
2326
        ti.gain1 = 0;
2327
        ti.freq1 = 0;
2328
        ixj_init_tone(j, &ti);
2329
        ti.tone_index = 16;
2330
        ti.gain0 = 1;
2331
        ti.freq0 = hz950;
2332
        ti.gain1 = 0;
2333
        ti.freq1 = 0;
2334
        ixj_init_tone(j, &ti);
2335
        ti.tone_index = 17;
2336
        ti.gain0 = 1;
2337
        ti.freq0 = hz1100;
2338
        ti.gain1 = 0;
2339
        ti.freq1 = 0;
2340
        ixj_init_tone(j, &ti);
2341
        ti.tone_index = 18;
2342
        ti.gain0 = 1;
2343
        ti.freq0 = hz1400;
2344
        ti.gain1 = 0;
2345
        ti.freq1 = 0;
2346
        ixj_init_tone(j, &ti);
2347
        ti.tone_index = 19;
2348
        ti.gain0 = 1;
2349
        ti.freq0 = hz1500;
2350
        ti.gain1 = 0;
2351
        ti.freq1 = 0;
2352
        ixj_init_tone(j, &ti);
2353
        ti.tone_index = 20;
2354
        ti.gain0 = 1;
2355
        ti.freq0 = hz1600;
2356
        ti.gain1 = 0;
2357
        ti.freq1 = 0;
2358
        ixj_init_tone(j, &ti);
2359
        ti.tone_index = 21;
2360
        ti.gain0 = 1;
2361
        ti.freq0 = hz1800;
2362
        ti.gain1 = 0;
2363
        ti.freq1 = 0;
2364
        ixj_init_tone(j, &ti);
2365
        ti.tone_index = 22;
2366
        ti.gain0 = 1;
2367
        ti.freq0 = hz2100;
2368
        ti.gain1 = 0;
2369
        ti.freq1 = 0;
2370
        ixj_init_tone(j, &ti);
2371
        ti.tone_index = 23;
2372
        ti.gain0 = 1;
2373
        ti.freq0 = hz1300;
2374
        ti.gain1 = 0;
2375
        ti.freq1 = 0;
2376
        ixj_init_tone(j, &ti);
2377
        ti.tone_index = 24;
2378
        ti.gain0 = 1;
2379
        ti.freq0 = hz2450;
2380
        ti.gain1 = 0;
2381
        ti.freq1 = 0;
2382
        ixj_init_tone(j, &ti);
2383
        ti.tone_index = 25;
2384
        ti.gain0 = 1;
2385
        ti.freq0 = hz350;
2386
        ti.gain1 = 0;
2387
        ti.freq1 = hz440;
2388
        ixj_init_tone(j, &ti);
2389
        ti.tone_index = 26;
2390
        ti.gain0 = 1;
2391
        ti.freq0 = hz440;
2392
        ti.gain1 = 0;
2393
        ti.freq1 = hz480;
2394
        ixj_init_tone(j, &ti);
2395
        ti.tone_index = 27;
2396
        ti.gain0 = 1;
2397
        ti.freq0 = hz480;
2398
        ti.gain1 = 0;
2399
        ti.freq1 = hz620;
2400
        ixj_init_tone(j, &ti);
2401
 
2402
        set_rec_depth(j, 2);    /* Set Record Channel Limit to 2 frames */
2403
 
2404
        set_play_depth(j, 2);   /* Set Playback Channel Limit to 2 frames */
2405
 
2406
        j->ex.bits.dtmf_ready = 0;
2407
        j->dtmf_state = 0;
2408
        j->dtmf_wp = j->dtmf_rp = 0;
2409
        j->rec_mode = j->play_mode = -1;
2410
        j->flags.ringing = 0;
2411
        j->maxrings = MAXRINGS;
2412
        j->ring_cadence = USA_RING_CADENCE;
2413
        if(j->cadence_f[5].enable) {
2414
                j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
2415
        }
2416
        j->drybuffer = 0;
2417
        j->winktime = 320;
2418
        j->flags.dtmf_oob = 0;
2419
        for (cnt = 0; cnt < 4; cnt++)
2420
                j->cadence_f[cnt].enable = 0;
2421
 
2422
        idle(j);
2423
 
2424
        if(j->cardtype == QTI_PHONECARD) {
2425
                SLIC_SetState(PLD_SLIC_STATE_OC, j);
2426
        }
2427
 
2428
        if (file_p->f_mode & FMODE_READ)
2429
                j->readers--;
2430
        if (file_p->f_mode & FMODE_WRITE)
2431
                j->writers--;
2432
 
2433
        if (j->read_buffer && !j->readers) {
2434
                kfree(j->read_buffer);
2435
                j->read_buffer = NULL;
2436
                j->read_buffer_size = 0;
2437
        }
2438
        if (j->write_buffer && !j->writers) {
2439
                kfree(j->write_buffer);
2440
                j->write_buffer = NULL;
2441
                j->write_buffer_size = 0;
2442
        }
2443
        j->rec_codec = j->play_codec = 0;
2444
        j->rec_frame_size = j->play_frame_size = 0;
2445
        j->flags.cidsent = j->flags.cidring = 0;
2446
        ixj_fasync(-1, file_p, 0);       /* remove from list of async notification */
2447
 
2448
        if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
2449
                ixj_set_port(j, PORT_PSTN);
2450
                daa_set_mode(j, SOP_PU_SLEEP);
2451
                ixj_set_pots(j, 1);
2452
        }
2453
        ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
2454
 
2455
        /* Set up the default signals for events */
2456
        for (cnt = 0; cnt < 35; cnt++)
2457
                j->ixj_signals[cnt] = SIGIO;
2458
 
2459
        /* Set the excetion signal enable flags */
2460
        j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
2461
        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 =
2462
        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;
2463
 
2464
        file_p->private_data = NULL;
2465
        clear_bit(board, &j->busyflags);
2466
        MOD_DEC_USE_COUNT;
2467
        return 0;
2468
}
2469
 
2470
static int read_filters(IXJ *j)
2471
{
2472
        unsigned short fc, cnt, trg;
2473
        int var;
2474
 
2475
        trg = 0;
2476
        if (ixj_WriteDSPCommand(0x5144, j)) {
2477
                if(ixjdebug & 0x0001) {
2478
                        printk(KERN_INFO "Read Frame Counter failed!\n");
2479
                }
2480
                return -1;
2481
        }
2482
        fc = j->ssr.high << 8 | j->ssr.low;
2483
        if (fc == j->frame_count)
2484
                return 1;
2485
 
2486
        j->frame_count = fc;
2487
 
2488
        if (j->dtmf_proc)
2489
                return 1;
2490
 
2491
        var = 10;
2492
 
2493
        for (cnt = 0; cnt < 4; cnt++) {
2494
                if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
2495
                        if(ixjdebug & 0x0001) {
2496
                                printk(KERN_INFO "Select Filter %d failed!\n", cnt);
2497
                        }
2498
                        return -1;
2499
                }
2500
                if (ixj_WriteDSPCommand(0x515C, j)) {
2501
                        if(ixjdebug & 0x0001) {
2502
                                printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
2503
                        }
2504
                        return -1;
2505
                }
2506
                j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
2507
 
2508
                if (j->cadence_f[cnt].enable) {
2509
                        if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
2510
                                if (j->cadence_f[cnt].state == 0) {
2511
                                        j->cadence_f[cnt].state = 1;
2512
                                        j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
2513
                                        j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
2514
                                        j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
2515
                                } else if (j->cadence_f[cnt].state == 2 &&
2516
                                           (time_after(jiffies, j->cadence_f[cnt].off1min) &&
2517
                                            time_before(jiffies, j->cadence_f[cnt].off1max))) {
2518
                                        if (j->cadence_f[cnt].on2) {
2519
                                                j->cadence_f[cnt].state = 3;
2520
                                                j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
2521
                                                j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
2522
                                                j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
2523
                                        } else {
2524
                                                j->cadence_f[cnt].state = 7;
2525
                                        }
2526
                                } else if (j->cadence_f[cnt].state == 4 &&
2527
                                           (time_after(jiffies, j->cadence_f[cnt].off2min) &&
2528
                                            time_before(jiffies, j->cadence_f[cnt].off2max))) {
2529
                                        if (j->cadence_f[cnt].on3) {
2530
                                                j->cadence_f[cnt].state = 5;
2531
                                                j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
2532
                                                j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
2533
                                                j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
2534
                                        } else {
2535
                                                j->cadence_f[cnt].state = 7;
2536
                                        }
2537
                                } else {
2538
                                        j->cadence_f[cnt].state = 0;
2539
                                }
2540
                        } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
2541
                                if (j->cadence_f[cnt].state == 1) {
2542
                                        if(!j->cadence_f[cnt].on1) {
2543
                                                j->cadence_f[cnt].state = 7;
2544
                                        } else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
2545
                                          time_before(jiffies, j->cadence_f[cnt].on1max))) {
2546
                                                if(j->cadence_f[cnt].off1) {
2547
                                                        j->cadence_f[cnt].state = 2;
2548
                                                        j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
2549
                                                        j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
2550
                                                        j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
2551
                                                } else {
2552
                                                        j->cadence_f[cnt].state = 7;
2553
                                                }
2554
                                        } else {
2555
                                                j->cadence_f[cnt].state = 0;
2556
                                        }
2557
                                } else if (j->cadence_f[cnt].state == 3) {
2558
                                        if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
2559
                                            time_before(jiffies, j->cadence_f[cnt].on2max))) {
2560
                                                if(j->cadence_f[cnt].off2) {
2561
                                                        j->cadence_f[cnt].state = 4;
2562
                                                        j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
2563
                                                        j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
2564
                                                        j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
2565
                                                } else {
2566
                                                        j->cadence_f[cnt].state = 7;
2567
                                                }
2568
                                        } else {
2569
                                                j->cadence_f[cnt].state = 0;
2570
                                        }
2571
                                } else if (j->cadence_f[cnt].state == 5) {
2572
                                        if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
2573
                                            time_before(jiffies, j->cadence_f[cnt].on3max))) {
2574
                                                if(j->cadence_f[cnt].off3) {
2575
                                                        j->cadence_f[cnt].state = 6;
2576
                                                        j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
2577
                                                        j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
2578
                                                        j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
2579
                                                } else {
2580
                                                        j->cadence_f[cnt].state = 7;
2581
                                                }
2582
                                        } else {
2583
                                                j->cadence_f[cnt].state = 0;
2584
                                        }
2585
                                } else {
2586
                                        j->cadence_f[cnt].state = 0;
2587
                                }
2588
                        } else {
2589
                                switch(j->cadence_f[cnt].state) {
2590
                                        case 1:
2591
                                                if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
2592
                                                   !j->cadence_f[cnt].off1 &&
2593
                                                   !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
2594
                                                   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2595
                                                        j->cadence_f[cnt].state = 7;
2596
                                                }
2597
                                                break;
2598
                                        case 3:
2599
                                                if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
2600
                                                   !j->cadence_f[cnt].off2 &&
2601
                                                   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2602
                                                        j->cadence_f[cnt].state = 7;
2603
                                                }
2604
                                                break;
2605
                                        case 5:
2606
                                                if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
2607
                                                   !j->cadence_f[cnt].off3) {
2608
                                                        j->cadence_f[cnt].state = 7;
2609
                                                }
2610
                                                break;
2611
                                }
2612
                        }
2613
 
2614
                        if (ixjdebug & 0x0040) {
2615
                                printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
2616
                                switch(j->cadence_f[cnt].state) {
2617
                                        case 0:
2618
                                                printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
2619
                                                break;
2620
                                        case 1:
2621
                                                printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
2622
                                        j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
2623
                                                break;
2624
                                        case 2:
2625
                                                printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
2626
                                                                                                                        j->cadence_f[cnt].off1max);
2627
                                                break;
2628
                                        case 3:
2629
                                                printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
2630
                                                                                                                        j->cadence_f[cnt].on2max);
2631
                                                break;
2632
                                        case 4:
2633
                                                printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
2634
                                                                                                                        j->cadence_f[cnt].off2max);
2635
                                                break;
2636
                                        case 5:
2637
                                                printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
2638
                                                                                                                        j->cadence_f[cnt].on3max);
2639
                                                break;
2640
                                        case 6:
2641
                                                printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
2642
                                                                                                                        j->cadence_f[cnt].off3max);
2643
                                                break;
2644
                                }
2645
                        }
2646
                }
2647
                if (j->cadence_f[cnt].state == 7) {
2648
                        j->cadence_f[cnt].state = 0;
2649
                        if (j->cadence_f[cnt].enable == 1)
2650
                                j->cadence_f[cnt].enable = 0;
2651
                        switch (cnt) {
2652
                        case 0:
2653
                                if(ixjdebug & 0x0020) {
2654
                                        printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
2655
                                }
2656
                                j->ex.bits.fc0 = 1;
2657
                                ixj_kill_fasync(j, SIG_FC0, POLL_IN);
2658
                                break;
2659
                        case 1:
2660
                                if(ixjdebug & 0x0020) {
2661
                                        printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
2662
                                }
2663
                                j->ex.bits.fc1 = 1;
2664
                                ixj_kill_fasync(j, SIG_FC1, POLL_IN);
2665
                                break;
2666
                        case 2:
2667
                                if(ixjdebug & 0x0020) {
2668
                                        printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
2669
                                }
2670
                                j->ex.bits.fc2 = 1;
2671
                                ixj_kill_fasync(j, SIG_FC2, POLL_IN);
2672
                                break;
2673
                        case 3:
2674
                                if(ixjdebug & 0x0020) {
2675
                                        printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
2676
                                }
2677
                                j->ex.bits.fc3 = 1;
2678
                                ixj_kill_fasync(j, SIG_FC3, POLL_IN);
2679
                                break;
2680
                        }
2681
                }
2682
                if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
2683
                                          (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
2684
                        if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
2685
                                trg = 1;
2686
                        } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
2687
                                trg = 0;
2688
                        }
2689
                        switch (cnt) {
2690
                        case 0:
2691
                                if(ixjdebug & 0x0020) {
2692
                                        printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
2693
                                }
2694
                                j->ex.bits.f0 = 1;
2695
                                ixj_kill_fasync(j, SIG_F0, POLL_IN);
2696
                                break;
2697
                        case 1:
2698
                                if(ixjdebug & 0x0020) {
2699
                                        printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
2700
                                }
2701
                                j->ex.bits.f1 = 1;
2702
                                ixj_kill_fasync(j, SIG_F1, POLL_IN);
2703
                                break;
2704
                        case 2:
2705
                                if(ixjdebug & 0x0020) {
2706
                                        printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
2707
                                }
2708
                                j->ex.bits.f2 = 1;
2709
                                ixj_kill_fasync(j, SIG_F2, POLL_IN);
2710
                                break;
2711
                        case 3:
2712
                                if(ixjdebug & 0x0020) {
2713
                                        printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
2714
                                }
2715
                                j->ex.bits.f3 = 1;
2716
                                ixj_kill_fasync(j, SIG_F3, POLL_IN);
2717
                                break;
2718
                        }
2719
                }
2720
        }
2721
        return 0;
2722
}
2723
 
2724
static int LineMonitor(IXJ *j)
2725
{
2726
        if (j->dtmf_proc) {
2727
                return -1;
2728
        }
2729
        j->dtmf_proc = 1;
2730
 
2731
        if (ixj_WriteDSPCommand(0x7000, j))             /* Line Monitor */
2732
                return -1;
2733
 
2734
        j->dtmf.bytes.high = j->ssr.high;
2735
        j->dtmf.bytes.low = j->ssr.low;
2736
        if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
2737
                j->dtmf_state = 1;
2738
                j->dtmf_current = j->dtmf.bits.digit;
2739
        }
2740
        if (j->dtmf_state && !j->dtmf.bits.dtmf_valid)  /* && j->dtmf_wp != j->dtmf_rp) */
2741
         {
2742
                if(!j->cidcw_wait) {
2743
                        j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
2744
                        j->dtmf_wp++;
2745
                        if (j->dtmf_wp == 79)
2746
                                j->dtmf_wp = 0;
2747
                        j->ex.bits.dtmf_ready = 1;
2748
                        if(j->ex_sig.bits.dtmf_ready) {
2749
                                ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
2750
                        }
2751
                }
2752
                else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
2753
                        if(ixjdebug & 0x0020) {
2754
                                printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
2755
                        }
2756
                        j->flags.cidcw_ack = 1;
2757
                }
2758
                j->dtmf_state = 0;
2759
        }
2760
        j->dtmf_proc = 0;
2761
 
2762
        return 0;
2763
}
2764
 
2765
/************************************************************************
2766
*
2767
* Functions to allow alaw <-> ulaw conversions.
2768
*
2769
************************************************************************/
2770
 
2771
static void ulaw2alaw(unsigned char *buff, unsigned long len)
2772
{
2773
        static unsigned char table_ulaw2alaw[] =
2774
        {
2775
                0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
2776
                0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
2777
                0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
2778
                0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
2779
                0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
2780
                0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
2781
                0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
2782
                0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
2783
                0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
2784
                0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
2785
                0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
2786
                0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
2787
                0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
2788
                0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
2789
                0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
2790
                0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
2791
                0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
2792
                0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
2793
                0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
2794
                0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
2795
                0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
2796
                0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
2797
                0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
2798
                0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
2799
                0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
2800
                0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
2801
                0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
2802
                0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
2803
                0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
2804
                0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
2805
                0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
2806
                0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2807
        };
2808
 
2809
        while (len--)
2810
        {
2811
                *buff = table_ulaw2alaw[*(unsigned char *)buff];
2812
                buff++;
2813
        }
2814
}
2815
 
2816
static void alaw2ulaw(unsigned char *buff, unsigned long len)
2817
{
2818
        static unsigned char table_alaw2ulaw[] =
2819
        {
2820
                0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
2821
                0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
2822
                0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
2823
                0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
2824
                0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
2825
                0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
2826
                0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
2827
                0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
2828
                0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
2829
                0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
2830
                0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
2831
                0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
2832
                0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
2833
                0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
2834
                0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
2835
                0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
2836
                0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
2837
                0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
2838
                0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
2839
                0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
2840
                0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
2841
                0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
2842
                0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
2843
                0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
2844
                0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
2845
                0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
2846
                0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
2847
                0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
2848
                0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
2849
                0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
2850
                0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
2851
                0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2852
        };
2853
 
2854
        while (len--)
2855
        {
2856
                *buff = table_alaw2ulaw[*(unsigned char *)buff];
2857
                buff++;
2858
        }
2859
}
2860
 
2861
static ssize_t ixj_read(struct file * file_p, char *buf, size_t length, loff_t * ppos)
2862
{
2863
        unsigned long i = *ppos;
2864
        IXJ * j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
2865
 
2866
        DECLARE_WAITQUEUE(wait, current);
2867
 
2868
        if (j->flags.inread)
2869
                return -EALREADY;
2870
 
2871
        j->flags.inread = 1;
2872
 
2873
        add_wait_queue(&j->read_q, &wait);
2874
        set_current_state(TASK_INTERRUPTIBLE);
2875
        mb();
2876
 
2877
        while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
2878
                ++j->read_wait;
2879
                if (file_p->f_flags & O_NONBLOCK) {
2880
                        set_current_state(TASK_RUNNING);
2881
                        remove_wait_queue(&j->read_q, &wait);
2882
                        j->flags.inread = 0;
2883
                        return -EAGAIN;
2884
                }
2885
                if (!ixj_hookstate(j)) {
2886
                        set_current_state(TASK_RUNNING);
2887
                        remove_wait_queue(&j->read_q, &wait);
2888
                        j->flags.inread = 0;
2889
                        return 0;
2890
                }
2891
                interruptible_sleep_on(&j->read_q);
2892
                if (signal_pending(current)) {
2893
                        set_current_state(TASK_RUNNING);
2894
                        remove_wait_queue(&j->read_q, &wait);
2895
                        j->flags.inread = 0;
2896
                        return -EINTR;
2897
                }
2898
        }
2899
 
2900
        remove_wait_queue(&j->read_q, &wait);
2901
        set_current_state(TASK_RUNNING);
2902
        /* Don't ever copy more than the user asks */
2903
        if(j->rec_codec == ALAW)
2904
                ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
2905
        i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
2906
        j->read_buffer_ready = 0;
2907
        if (i) {
2908
                j->flags.inread = 0;
2909
                return -EFAULT;
2910
        } else {
2911
                j->flags.inread = 0;
2912
                return min(length, j->read_buffer_size);
2913
        }
2914
}
2915
 
2916
static ssize_t ixj_enhanced_read(struct file * file_p, char *buf, size_t length,
2917
                          loff_t * ppos)
2918
{
2919
        int pre_retval;
2920
        ssize_t read_retval = 0;
2921
        IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
2922
 
2923
        pre_retval = ixj_PreRead(j, 0L);
2924
        switch (pre_retval) {
2925
        case NORMAL:
2926
                read_retval = ixj_read(file_p, buf, length, ppos);
2927
                ixj_PostRead(j, 0L);
2928
                break;
2929
        case NOPOST:
2930
                read_retval = ixj_read(file_p, buf, length, ppos);
2931
                break;
2932
        case POSTONLY:
2933
                ixj_PostRead(j, 0L);
2934
                break;
2935
        default:
2936
                read_retval = pre_retval;
2937
        }
2938
        return read_retval;
2939
}
2940
 
2941
static ssize_t ixj_write(struct file *file_p, const char *buf, size_t count, loff_t * ppos)
2942
{
2943
        unsigned long i = *ppos;
2944
        IXJ *j = file_p->private_data;
2945
 
2946
        DECLARE_WAITQUEUE(wait, current);
2947
 
2948
        if (j->flags.inwrite)
2949
                return -EALREADY;
2950
 
2951
        j->flags.inwrite = 1;
2952
 
2953
        add_wait_queue(&j->write_q, &wait);
2954
        set_current_state(TASK_INTERRUPTIBLE);
2955
        mb();
2956
 
2957
 
2958
        while (!j->write_buffers_empty) {
2959
                ++j->write_wait;
2960
                if (file_p->f_flags & O_NONBLOCK) {
2961
                        set_current_state(TASK_RUNNING);
2962
                        remove_wait_queue(&j->write_q, &wait);
2963
                        j->flags.inwrite = 0;
2964
                        return -EAGAIN;
2965
                }
2966
                if (!ixj_hookstate(j)) {
2967
                        set_current_state(TASK_RUNNING);
2968
                        remove_wait_queue(&j->write_q, &wait);
2969
                        j->flags.inwrite = 0;
2970
                        return 0;
2971
                }
2972
                interruptible_sleep_on(&j->write_q);
2973
                if (signal_pending(current)) {
2974
                        set_current_state(TASK_RUNNING);
2975
                        remove_wait_queue(&j->write_q, &wait);
2976
                        j->flags.inwrite = 0;
2977
                        return -EINTR;
2978
                }
2979
        }
2980
        set_current_state(TASK_RUNNING);
2981
        remove_wait_queue(&j->write_q, &wait);
2982
        if (j->write_buffer_wp + count >= j->write_buffer_end)
2983
                j->write_buffer_wp = j->write_buffer;
2984
        i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
2985
        if (i) {
2986
                j->flags.inwrite = 0;
2987
                return -EFAULT;
2988
        }
2989
       if(j->play_codec == ALAW)
2990
               alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
2991
        j->flags.inwrite = 0;
2992
        return min(count, j->write_buffer_size);
2993
}
2994
 
2995
static ssize_t ixj_enhanced_write(struct file * file_p, const char *buf, size_t count, loff_t * ppos)
2996
{
2997
        int pre_retval;
2998
        ssize_t write_retval = 0;
2999
 
3000
        IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
3001
 
3002
        pre_retval = ixj_PreWrite(j, 0L);
3003
        switch (pre_retval) {
3004
        case NORMAL:
3005
                write_retval = ixj_write(file_p, buf, count, ppos);
3006
                if (write_retval > 0) {
3007
                        ixj_PostWrite(j, 0L);
3008
                        j->write_buffer_wp += write_retval;
3009
                        j->write_buffers_empty--;
3010
                }
3011
                break;
3012
        case NOPOST:
3013
                write_retval = ixj_write(file_p, buf, count, ppos);
3014
                if (write_retval > 0) {
3015
                        j->write_buffer_wp += write_retval;
3016
                        j->write_buffers_empty--;
3017
                }
3018
                break;
3019
        case POSTONLY:
3020
                ixj_PostWrite(j, 0L);
3021
                break;
3022
        default:
3023
                write_retval = pre_retval;
3024
        }
3025
        return write_retval;
3026
}
3027
 
3028
static void ixj_read_frame(IXJ *j)
3029
{
3030
        int cnt, dly;
3031
 
3032
        if (j->read_buffer) {
3033
                for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
3034
                        if (!(cnt % 16) && !IsRxReady(j)) {
3035
                                dly = 0;
3036
                                while (!IsRxReady(j)) {
3037
                                        if (dly++ > 5) {
3038
                                                dly = 0;
3039
                                                break;
3040
                                        }
3041
                                        udelay(10);
3042
                                }
3043
                        }
3044
                        /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
3045
                        if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3046
                                inb_p(j->DSPbase + 0x0E);
3047
                                inb_p(j->DSPbase + 0x0F);
3048
                        }
3049
                        *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
3050
                        *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
3051
                }
3052
                ++j->framesread;
3053
                if (j->intercom != -1) {
3054
                        if (IsTxReady(get_ixj(j->intercom))) {
3055
                                for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
3056
                                        if (!(cnt % 16) && !IsTxReady(j)) {
3057
                                                dly = 0;
3058
                                                while (!IsTxReady(j)) {
3059
                                                        if (dly++ > 5) {
3060
                                                                dly = 0;
3061
                                                                break;
3062
                                                        }
3063
                                                        udelay(10);
3064
                                                }
3065
                                        }
3066
                                        outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
3067
                                        outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
3068
                                }
3069
                                get_ixj(j->intercom)->frameswritten++;
3070
                        }
3071
                } else {
3072
                        j->read_buffer_ready = 1;
3073
                        wake_up_interruptible(&j->read_q);      /* Wake any blocked readers */
3074
 
3075
                        wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
3076
 
3077
                        if(j->ixj_signals[SIG_READ_READY])
3078
                                ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
3079
                }
3080
        }
3081
}
3082
 
3083
static short fsk[][6][20] =
3084
{
3085
        {
3086
                {
3087
                        0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
3088
                        -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
3089
                },
3090
                {
3091
                        -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
3092
                        -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
3093
                },
3094
                {
3095
                        -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
3096
                        -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
3097
                },
3098
                {
3099
                        0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
3100
                        16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
3101
                },
3102
                {
3103
                        28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
3104
                        32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
3105
                },
3106
                {
3107
                        28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
3108
                        16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
3109
                }
3110
        },
3111
        {
3112
                {
3113
                        0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
3114
                        0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
3115
                },
3116
                {
3117
                        -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3118
                        28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3119
                },
3120
                {
3121
                        -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3122
                        28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3123
                },
3124
                {
3125
                        0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3126
                        0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3127
                },
3128
                {
3129
                        28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3130
                        -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3131
                },
3132
                {
3133
                        28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3134
                        -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3135
                }
3136
        }
3137
};
3138
 
3139
 
3140
static void ixj_write_cid_bit(IXJ *j, int bit)
3141
{
3142
        while (j->fskcnt < 20) {
3143
                if(j->fskdcnt < (j->fsksize - 1))
3144
                        j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
3145
 
3146
                j->fskcnt += 3;
3147
        }
3148
        j->fskcnt %= 20;
3149
 
3150
        if (!bit)
3151
                j->fskz++;
3152
        if (j->fskz >= 6)
3153
                j->fskz = 0;
3154
 
3155
}
3156
 
3157
static void ixj_write_cid_byte(IXJ *j, char byte)
3158
{
3159
        IXJ_CBYTE cb;
3160
 
3161
                cb.cbyte = byte;
3162
                ixj_write_cid_bit(j, 0);
3163
                ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
3164
                ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
3165
                ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
3166
                ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
3167
                ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
3168
                ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
3169
                ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
3170
                ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
3171
                ixj_write_cid_bit(j, 1);
3172
}
3173
 
3174
static void ixj_write_cid_seize(IXJ *j)
3175
{
3176
        int cnt;
3177
 
3178
        for (cnt = 0; cnt < 150; cnt++) {
3179
                ixj_write_cid_bit(j, 0);
3180
                ixj_write_cid_bit(j, 1);
3181
        }
3182
        for (cnt = 0; cnt < 180; cnt++) {
3183
                ixj_write_cid_bit(j, 1);
3184
        }
3185
}
3186
 
3187
static void ixj_write_cidcw_seize(IXJ *j)
3188
{
3189
        int cnt;
3190
 
3191
        for (cnt = 0; cnt < 80; cnt++) {
3192
                ixj_write_cid_bit(j, 1);
3193
        }
3194
}
3195
 
3196
static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
3197
{
3198
        int cnt;
3199
 
3200
        for (cnt = 0; cnt < strlen(s); cnt++) {
3201
                ixj_write_cid_byte(j, s[cnt]);
3202
                checksum = (checksum + s[cnt]);
3203
        }
3204
        return checksum;
3205
}
3206
 
3207
static void ixj_pad_fsk(IXJ *j, int pad)
3208
{
3209
        int cnt;
3210
 
3211
        for (cnt = 0; cnt < pad; cnt++) {
3212
                if(j->fskdcnt < (j->fsksize - 1))
3213
                        j->fskdata[j->fskdcnt++] = 0x0000;
3214
        }
3215
        for (cnt = 0; cnt < 720; cnt++) {
3216
                if(j->fskdcnt < (j->fsksize - 1))
3217
                        j->fskdata[j->fskdcnt++] = 0x0000;
3218
        }
3219
}
3220
 
3221
static void ixj_pre_cid(IXJ *j)
3222
{
3223
        j->cid_play_codec = j->play_codec;
3224
        j->cid_play_frame_size = j->play_frame_size;
3225
        j->cid_play_volume = get_play_volume(j);
3226
        j->cid_play_flag = j->flags.playing;
3227
 
3228
        j->cid_rec_codec = j->rec_codec;
3229
        j->cid_rec_volume = get_rec_volume(j);
3230
        j->cid_rec_flag = j->flags.recording;
3231
 
3232
        j->cid_play_aec_level = j->aec_level;
3233
 
3234
        switch(j->baseframe.low) {
3235
                case 0xA0:
3236
                        j->cid_base_frame_size = 20;
3237
                        break;
3238
                case 0x50:
3239
                        j->cid_base_frame_size = 10;
3240
                        break;
3241
                case 0xF0:
3242
                        j->cid_base_frame_size = 30;
3243
                        break;
3244
        }
3245
 
3246
        ixj_play_stop(j);
3247
        ixj_cpt_stop(j);
3248
 
3249
        j->flags.cidplay = 1;
3250
 
3251
        set_base_frame(j, 30);
3252
        set_play_codec(j, LINEAR16);
3253
        set_play_volume(j, 0x1B);
3254
        ixj_play_start(j);
3255
}
3256
 
3257
static void ixj_post_cid(IXJ *j)
3258
{
3259
        ixj_play_stop(j);
3260
 
3261
        if(j->cidsize > 5000) {
3262
                SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
3263
        }
3264
        j->flags.cidplay = 0;
3265
        if(ixjdebug & 0x0200) {
3266
                printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
3267
        }
3268
 
3269
        ixj_fsk_free(j);
3270
 
3271
        j->fskdcnt = 0;
3272
        set_base_frame(j, j->cid_base_frame_size);
3273
        set_play_codec(j, j->cid_play_codec);
3274
        ixj_aec_start(j, j->cid_play_aec_level);
3275
        set_play_volume(j, j->cid_play_volume);
3276
 
3277
        set_rec_codec(j, j->cid_rec_codec);
3278
        set_rec_volume(j, j->cid_rec_volume);
3279
 
3280
        if(j->cid_rec_flag)
3281
                ixj_record_start(j);
3282
 
3283
        if(j->cid_play_flag)
3284
                ixj_play_start(j);
3285
 
3286
        if(j->cid_play_flag) {
3287
                wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
3288
        }
3289
}
3290
 
3291
static void ixj_write_cid(IXJ *j)
3292
{
3293
        char sdmf1[50];
3294
        char sdmf2[50];
3295
        char sdmf3[80];
3296
        char mdmflen, len1, len2, len3;
3297
        int pad;
3298
 
3299
        int checksum = 0;
3300
 
3301
        if (j->dsp.low == 0x20 || j->flags.cidplay)
3302
                return;
3303
 
3304
        j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3305
        j->cidsize = j->cidcnt = 0;
3306
 
3307
        ixj_fsk_alloc(j);
3308
 
3309
        strcpy(sdmf1, j->cid_send.month);
3310
        strcat(sdmf1, j->cid_send.day);
3311
        strcat(sdmf1, j->cid_send.hour);
3312
        strcat(sdmf1, j->cid_send.min);
3313
        strcpy(sdmf2, j->cid_send.number);
3314
        strcpy(sdmf3, j->cid_send.name);
3315
 
3316
        len1 = strlen(sdmf1);
3317
        len2 = strlen(sdmf2);
3318
        len3 = strlen(sdmf3);
3319
        mdmflen = len1 + len2 + len3 + 6;
3320
 
3321
        while(1){
3322
                ixj_write_cid_seize(j);
3323
 
3324
                ixj_write_cid_byte(j, 0x80);
3325
                checksum = 0x80;
3326
                ixj_write_cid_byte(j, mdmflen);
3327
                checksum = checksum + mdmflen;
3328
 
3329
                ixj_write_cid_byte(j, 0x01);
3330
                checksum = checksum + 0x01;
3331
                ixj_write_cid_byte(j, len1);
3332
                checksum = checksum + len1;
3333
                checksum = ixj_write_cid_string(j, sdmf1, checksum);
3334
                if(ixj_hookstate(j) & 1)
3335
                        break;
3336
 
3337
                ixj_write_cid_byte(j, 0x02);
3338
                checksum = checksum + 0x02;
3339
                ixj_write_cid_byte(j, len2);
3340
                checksum = checksum + len2;
3341
                checksum = ixj_write_cid_string(j, sdmf2, checksum);
3342
                if(ixj_hookstate(j) & 1)
3343
                        break;
3344
 
3345
                ixj_write_cid_byte(j, 0x07);
3346
                checksum = checksum + 0x07;
3347
                ixj_write_cid_byte(j, len3);
3348
                checksum = checksum + len3;
3349
                checksum = ixj_write_cid_string(j, sdmf3, checksum);
3350
                if(ixj_hookstate(j) & 1)
3351
                        break;
3352
 
3353
                checksum %= 256;
3354
                checksum ^= 0xFF;
3355
                checksum += 1;
3356
 
3357
                ixj_write_cid_byte(j, (char) checksum);
3358
 
3359
                pad = j->fskdcnt % 240;
3360
                if (pad) {
3361
                        pad = 240 - pad;
3362
                }
3363
                ixj_pad_fsk(j, pad);
3364
                break;
3365
        }
3366
 
3367
        ixj_write_frame(j);
3368
}
3369
 
3370
static void ixj_write_cidcw(IXJ *j)
3371
{
3372
        IXJ_TONE ti;
3373
 
3374
        char sdmf1[50];
3375
        char sdmf2[50];
3376
        char sdmf3[80];
3377
        char mdmflen, len1, len2, len3;
3378
        int pad;
3379
 
3380
        int checksum = 0;
3381
 
3382
        if (j->dsp.low == 0x20 || j->flags.cidplay)
3383
                return;
3384
 
3385
        j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3386
        j->cidsize = j->cidcnt = 0;
3387
 
3388
        ixj_fsk_alloc(j);
3389
 
3390
        j->flags.cidcw_ack = 0;
3391
 
3392
        ti.tone_index = 23;
3393
        ti.gain0 = 1;
3394
        ti.freq0 = hz440;
3395
        ti.gain1 = 0;
3396
        ti.freq1 = 0;
3397
        ixj_init_tone(j, &ti);
3398
 
3399
        ixj_set_tone_on(1500, j);
3400
        ixj_set_tone_off(32, j);
3401
        if(ixjdebug & 0x0200) {
3402
                printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
3403
        }
3404
        ixj_play_tone(j, 23);
3405
 
3406
        clear_bit(j->board, &j->busyflags);
3407
        while(j->tone_state) {
3408
                set_current_state(TASK_INTERRUPTIBLE);
3409
                schedule_timeout(1);
3410
        }
3411
        while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3412
                set_current_state(TASK_INTERRUPTIBLE);
3413
                schedule_timeout(1);
3414
        }
3415
        if(ixjdebug & 0x0200) {
3416
                printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
3417
        }
3418
 
3419
        ti.tone_index = 24;
3420
        ti.gain0 = 1;
3421
        ti.freq0 = hz2130;
3422
        ti.gain1 = 0;
3423
        ti.freq1 = hz2750;
3424
        ixj_init_tone(j, &ti);
3425
 
3426
        ixj_set_tone_off(10, j);
3427
        ixj_set_tone_on(600, j);
3428
        if(ixjdebug & 0x0200) {
3429
                printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
3430
        }
3431
        ixj_play_tone(j, 24);
3432
 
3433
        clear_bit(j->board, &j->busyflags);
3434
        while(j->tone_state) {
3435
                set_current_state(TASK_INTERRUPTIBLE);
3436
                schedule_timeout(1);
3437
        }
3438
        while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3439
                set_current_state(TASK_INTERRUPTIBLE);
3440
                schedule_timeout(1);
3441
        }
3442
        if(ixjdebug & 0x0200) {
3443
                printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
3444
        }
3445
 
3446
        j->cidcw_wait = jiffies + ((50 * hertz) / 100);
3447
 
3448
        clear_bit(j->board, &j->busyflags);
3449
        while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) {
3450
                set_current_state(TASK_INTERRUPTIBLE);
3451
                schedule_timeout(1);
3452
        }
3453
        while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3454
                set_current_state(TASK_INTERRUPTIBLE);
3455
                schedule_timeout(1);
3456
        }
3457
        j->cidcw_wait = 0;
3458
        if(!j->flags.cidcw_ack) {
3459
                if(ixjdebug & 0x0200) {
3460
                        printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
3461
                }
3462
                ixj_post_cid(j);
3463
                if(j->cid_play_flag) {
3464
                        wake_up_interruptible(&j->write_q);     /* Wake any blocked readers */
3465
                }
3466
                return;
3467
        } else {
3468
                ixj_pre_cid(j);
3469
        }
3470
        j->flags.cidcw_ack = 0;
3471
        strcpy(sdmf1, j->cid_send.month);
3472
        strcat(sdmf1, j->cid_send.day);
3473
        strcat(sdmf1, j->cid_send.hour);
3474
        strcat(sdmf1, j->cid_send.min);
3475
        strcpy(sdmf2, j->cid_send.number);
3476
        strcpy(sdmf3, j->cid_send.name);
3477
 
3478
        len1 = strlen(sdmf1);
3479
        len2 = strlen(sdmf2);
3480
        len3 = strlen(sdmf3);
3481
        mdmflen = len1 + len2 + len3 + 6;
3482
 
3483
        ixj_write_cidcw_seize(j);
3484
 
3485
        ixj_write_cid_byte(j, 0x80);
3486
        checksum = 0x80;
3487
        ixj_write_cid_byte(j, mdmflen);
3488
        checksum = checksum + mdmflen;
3489
 
3490
        ixj_write_cid_byte(j, 0x01);
3491
        checksum = checksum + 0x01;
3492
        ixj_write_cid_byte(j, len1);
3493
        checksum = checksum + len1;
3494
        checksum = ixj_write_cid_string(j, sdmf1, checksum);
3495
 
3496
        ixj_write_cid_byte(j, 0x02);
3497
        checksum = checksum + 0x02;
3498
        ixj_write_cid_byte(j, len2);
3499
        checksum = checksum + len2;
3500
        checksum = ixj_write_cid_string(j, sdmf2, checksum);
3501
 
3502
        ixj_write_cid_byte(j, 0x07);
3503
        checksum = checksum + 0x07;
3504
        ixj_write_cid_byte(j, len3);
3505
        checksum = checksum + len3;
3506
        checksum = ixj_write_cid_string(j, sdmf3, checksum);
3507
 
3508
        checksum %= 256;
3509
        checksum ^= 0xFF;
3510
        checksum += 1;
3511
 
3512
        ixj_write_cid_byte(j, (char) checksum);
3513
 
3514
        pad = j->fskdcnt % 240;
3515
        if (pad) {
3516
                pad = 240 - pad;
3517
        }
3518
        ixj_pad_fsk(j, pad);
3519
        if(ixjdebug & 0x0200) {
3520
                printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
3521
        }
3522
}
3523
 
3524
static void ixj_write_vmwi(IXJ *j, int msg)
3525
{
3526
        char mdmflen;
3527
        int pad;
3528
 
3529
        int checksum = 0;
3530
 
3531
        if (j->dsp.low == 0x20 || j->flags.cidplay)
3532
                return;
3533
 
3534
        j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3535
        j->cidsize = j->cidcnt = 0;
3536
 
3537
        ixj_fsk_alloc(j);
3538
 
3539
        mdmflen = 3;
3540
 
3541
        if (j->port == PORT_POTS)
3542
                SLIC_SetState(PLD_SLIC_STATE_OHT, j);
3543
 
3544
        ixj_write_cid_seize(j);
3545
 
3546
        ixj_write_cid_byte(j, 0x82);
3547
        checksum = 0x82;
3548
        ixj_write_cid_byte(j, mdmflen);
3549
        checksum = checksum + mdmflen;
3550
 
3551
        ixj_write_cid_byte(j, 0x0B);
3552
        checksum = checksum + 0x0B;
3553
        ixj_write_cid_byte(j, 1);
3554
        checksum = checksum + 1;
3555
 
3556
        if(msg) {
3557
                ixj_write_cid_byte(j, 0xFF);
3558
                checksum = checksum + 0xFF;
3559
        }
3560
        else {
3561
                ixj_write_cid_byte(j, 0x00);
3562
                checksum = checksum + 0x00;
3563
        }
3564
 
3565
        checksum %= 256;
3566
        checksum ^= 0xFF;
3567
        checksum += 1;
3568
 
3569
        ixj_write_cid_byte(j, (char) checksum);
3570
 
3571
        pad = j->fskdcnt % 240;
3572
        if (pad) {
3573
                pad = 240 - pad;
3574
        }
3575
        ixj_pad_fsk(j, pad);
3576
}
3577
 
3578
static void ixj_write_frame(IXJ *j)
3579
{
3580
        int cnt, frame_count, dly;
3581
        IXJ_WORD dat;
3582
        BYTES blankword;
3583
 
3584
        frame_count = 0;
3585
        if(j->flags.cidplay) {
3586
                for(cnt = 0; cnt < 480; cnt++) {
3587
                        if (!(cnt % 16) && !IsTxReady(j)) {
3588
                                dly = 0;
3589
                                while (!IsTxReady(j)) {
3590
                                        if (dly++ > 5) {
3591
                                                dly = 0;
3592
                                                break;
3593
                                        }
3594
                                        udelay(10);
3595
                                }
3596
                        }
3597
                        dat.word = j->fskdata[j->cidcnt++];
3598
                        outb_p(dat.bytes.low, j->DSPbase + 0x0C);
3599
                        outb_p(dat.bytes.high, j->DSPbase + 0x0D);
3600
                        cnt++;
3601
                }
3602
                if(j->cidcnt >= j->fskdcnt) {
3603
                        ixj_post_cid(j);
3604
                }
3605
                /* This may seem rude, but if we just played one frame of FSK data for CallerID
3606
                   and there is real audio data in the buffer, we need to throw it away because
3607
                   we just used it's time slot */
3608
                if (j->write_buffer_rp > j->write_buffer_wp) {
3609
                        j->write_buffer_rp += j->cid_play_frame_size * 2;
3610
                        if (j->write_buffer_rp >= j->write_buffer_end) {
3611
                                j->write_buffer_rp = j->write_buffer;
3612
                        }
3613
                        j->write_buffers_empty++;
3614
                        wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
3615
 
3616
                        wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
3617
                }
3618
        } else if (j->write_buffer && j->write_buffers_empty < 1) {
3619
                if (j->write_buffer_wp > j->write_buffer_rp) {
3620
                        frame_count =
3621
                            (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
3622
                }
3623
                if (j->write_buffer_rp > j->write_buffer_wp) {
3624
                        frame_count =
3625
                            (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
3626
                            (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
3627
                }
3628
                if (frame_count >= 1) {
3629
                        if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
3630
                                switch (j->play_mode) {
3631
                                case PLAYBACK_MODE_ULAW:
3632
                                case PLAYBACK_MODE_ALAW:
3633
                                        blankword.low = blankword.high = 0xFF;
3634
                                        break;
3635
                                case PLAYBACK_MODE_8LINEAR:
3636
                                case PLAYBACK_MODE_16LINEAR:
3637
                                        blankword.low = blankword.high = 0x00;
3638
                                        break;
3639
                                case PLAYBACK_MODE_8LINEAR_WSS:
3640
                                        blankword.low = blankword.high = 0x80;
3641
                                        break;
3642
                                }
3643
                                for (cnt = 0; cnt < 16; cnt++) {
3644
                                        if (!(cnt % 16) && !IsTxReady(j)) {
3645
                                                dly = 0;
3646
                                                while (!IsTxReady(j)) {
3647
                                                        if (dly++ > 5) {
3648
                                                                dly = 0;
3649
                                                                break;
3650
                                                        }
3651
                                                        udelay(10);
3652
                                                }
3653
                                        }
3654
                                        outb_p((blankword.low), j->DSPbase + 0x0C);
3655
                                        outb_p((blankword.high), j->DSPbase + 0x0D);
3656
                                }
3657
                                j->flags.play_first_frame = 0;
3658
                        } else  if (j->play_codec == G723_63 && j->flags.play_first_frame) {
3659
                                for (cnt = 0; cnt < 24; cnt++) {
3660
                                        if(cnt == 12) {
3661
                                                blankword.low = 0x02;
3662
                                                blankword.high = 0x00;
3663
                                        }
3664
                                        else {
3665
                                                blankword.low = blankword.high = 0x00;
3666
                                        }
3667
                                        if (!(cnt % 16) && !IsTxReady(j)) {
3668
                                                dly = 0;
3669
                                                while (!IsTxReady(j)) {
3670
                                                        if (dly++ > 5) {
3671
                                                                dly = 0;
3672
                                                                break;
3673
                                                        }
3674
                                                        udelay(10);
3675
                                                }
3676
                                        }
3677
                                        outb_p((blankword.low), j->DSPbase + 0x0C);
3678
                                        outb_p((blankword.high), j->DSPbase + 0x0D);
3679
                                }
3680
                                j->flags.play_first_frame = 0;
3681
                        }
3682
                        for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
3683
                                if (!(cnt % 16) && !IsTxReady(j)) {
3684
                                        dly = 0;
3685
                                        while (!IsTxReady(j)) {
3686
                                                if (dly++ > 5) {
3687
                                                        dly = 0;
3688
                                                        break;
3689
                                                }
3690
                                                udelay(10);
3691
                                        }
3692
                                }
3693
                        /* Add word 0 to G.729 frames for the 8021.  Right now we don't do VAD/CNG  */
3694
                                if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3695
                                        if(j->write_buffer_rp + cnt == 0 && j->write_buffer_rp + cnt + 1 == 0 && j->write_buffer_rp + cnt + 2 == 0 &&
3696
                                           j->write_buffer_rp + cnt + 3 == 0 && j->write_buffer_rp + cnt + 4 == 0 && j->write_buffer_rp + cnt + 5 == 0 &&
3697
                                           j->write_buffer_rp + cnt + 6 == 0 && j->write_buffer_rp + cnt + 7 == 0 && j->write_buffer_rp + cnt + 8 == 0 &&
3698
                                           j->write_buffer_rp + cnt + 9 == 0) {
3699
                                        /* someone is trying to write silence lets make this a type 0 frame. */
3700
                                                outb_p(0x00, j->DSPbase + 0x0C);
3701
                                                outb_p(0x00, j->DSPbase + 0x0D);
3702
                                        } else {
3703
                                        /* so all other frames are type 1. */
3704
                                                outb_p(0x01, j->DSPbase + 0x0C);
3705
                                                outb_p(0x00, j->DSPbase + 0x0D);
3706
                                        }
3707
                                }
3708
                                outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
3709
                                outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
3710
                                *(j->write_buffer_rp + cnt) = 0;
3711
                                *(j->write_buffer_rp + cnt + 1) = 0;
3712
                        }
3713
                        j->write_buffer_rp += j->play_frame_size * 2;
3714
                        if (j->write_buffer_rp >= j->write_buffer_end) {
3715
                                j->write_buffer_rp = j->write_buffer;
3716
                        }
3717
                        j->write_buffers_empty++;
3718
                        wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
3719
 
3720
                        wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
3721
 
3722
                        ++j->frameswritten;
3723
                }
3724
        } else {
3725
                j->drybuffer++;
3726
        }
3727
        if(j->ixj_signals[SIG_WRITE_READY]) {
3728
                ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
3729
        }
3730
}
3731
 
3732
static int idle(IXJ *j)
3733
{
3734
        if (ixj_WriteDSPCommand(0x0000, j))             /* DSP Idle */
3735
 
3736
                return 0;
3737
 
3738
        if (j->ssr.high || j->ssr.low) {
3739
                return 0;
3740
        } else {
3741
                j->play_mode = -1;
3742
                j->flags.playing = 0;
3743
                j->rec_mode = -1;
3744
                j->flags.recording = 0;
3745
                return 1;
3746
        }
3747
}
3748
 
3749
static int set_base_frame(IXJ *j, int size)
3750
{
3751
        unsigned short cmd;
3752
        int cnt;
3753
 
3754
        idle(j);
3755
        j->cid_play_aec_level = j->aec_level;
3756
        aec_stop(j);
3757
        for (cnt = 0; cnt < 10; cnt++) {
3758
                if (idle(j))
3759
                        break;
3760
        }
3761
        if (j->ssr.high || j->ssr.low)
3762
                return -1;
3763
        if (j->dsp.low != 0x20) {
3764
                switch (size) {
3765
                case 30:
3766
                        cmd = 0x07F0;
3767
                        /* Set Base Frame Size to 240 pg9-10 8021 */
3768
                        break;
3769
                case 20:
3770
                        cmd = 0x07A0;
3771
                        /* Set Base Frame Size to 160 pg9-10 8021 */
3772
                        break;
3773
                case 10:
3774
                        cmd = 0x0750;
3775
                        /* Set Base Frame Size to 80 pg9-10 8021 */
3776
                        break;
3777
                default:
3778
                        return -1;
3779
                }
3780
        } else {
3781
                if (size == 30)
3782
                        return size;
3783
                else
3784
                        return -1;
3785
        }
3786
        if (ixj_WriteDSPCommand(cmd, j)) {
3787
                j->baseframe.high = j->baseframe.low = 0xFF;
3788
                return -1;
3789
        } else {
3790
                j->baseframe.high = j->ssr.high;
3791
                j->baseframe.low = j->ssr.low;
3792
                /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3793
                if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
3794
                        return -1;
3795
                }
3796
        }
3797
        ixj_aec_start(j, j->cid_play_aec_level);
3798
        return size;
3799
}
3800
 
3801
static int set_rec_codec(IXJ *j, int rate)
3802
{
3803
        int retval = 0;
3804
 
3805
        j->rec_codec = rate;
3806
 
3807
        switch (rate) {
3808
        case G723_63:
3809
                if (j->ver.low != 0x12 || ixj_convert_loaded) {
3810
                        j->rec_frame_size = 12;
3811
                        j->rec_mode = 0;
3812
                } else {
3813
                        retval = 1;
3814
                }
3815
                break;
3816
        case G723_53:
3817
                if (j->ver.low != 0x12 || ixj_convert_loaded) {
3818
                        j->rec_frame_size = 10;
3819
                        j->rec_mode = 0;
3820
                } else {
3821
                        retval = 1;
3822
                }
3823
                break;
3824
        case TS85:
3825
                if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
3826
                        j->rec_frame_size = 16;
3827
                        j->rec_mode = 0;
3828
                } else {
3829
                        retval = 1;
3830
                }
3831
                break;
3832
        case TS48:
3833
                if (j->ver.low != 0x12 || ixj_convert_loaded) {
3834
                        j->rec_frame_size = 9;
3835
                        j->rec_mode = 0;
3836
                } else {
3837
                        retval = 1;
3838
                }
3839
                break;
3840
        case TS41:
3841
                if (j->ver.low != 0x12 || ixj_convert_loaded) {
3842
                        j->rec_frame_size = 8;
3843
                        j->rec_mode = 0;
3844
                } else {
3845
                        retval = 1;
3846
                }
3847
                break;
3848
        case G728:
3849
                if (j->dsp.low != 0x20) {
3850
                        j->rec_frame_size = 48;
3851
                        j->rec_mode = 0;
3852
                } else {
3853
                        retval = 1;
3854
                }
3855
                break;
3856
        case G729:
3857
                if (j->dsp.low != 0x20) {
3858
                        if (!j->flags.g729_loaded) {
3859
                                retval = 1;
3860
                                break;
3861
                        }
3862
                        switch (j->baseframe.low) {
3863
                        case 0xA0:
3864
                                j->rec_frame_size = 10;
3865
                                break;
3866
                        case 0x50:
3867
                                j->rec_frame_size = 5;
3868
                                break;
3869
                        default:
3870
                                j->rec_frame_size = 15;
3871
                                break;
3872
                        }
3873
                        j->rec_mode = 0;
3874
                } else {
3875
                        retval = 1;
3876
                }
3877
                break;
3878
        case G729B:
3879
                if (j->dsp.low != 0x20) {
3880
                        if (!j->flags.g729_loaded) {
3881
                                retval = 1;
3882
                                break;
3883
                        }
3884
                        switch (j->baseframe.low) {
3885
                        case 0xA0:
3886
                                j->rec_frame_size = 12;
3887
                                break;
3888
                        case 0x50:
3889
                                j->rec_frame_size = 6;
3890
                                break;
3891
                        default:
3892
                                j->rec_frame_size = 18;
3893
                                break;
3894
                        }
3895
                        j->rec_mode = 0;
3896
                } else {
3897
                        retval = 1;
3898
                }
3899
                break;
3900
        case ULAW:
3901
                switch (j->baseframe.low) {
3902
                case 0xA0:
3903
                        j->rec_frame_size = 80;
3904
                        break;
3905
                case 0x50:
3906
                        j->rec_frame_size = 40;
3907
                        break;
3908
                default:
3909
                        j->rec_frame_size = 120;
3910
                        break;
3911
                }
3912
                j->rec_mode = 4;
3913
                break;
3914
        case ALAW:
3915
                switch (j->baseframe.low) {
3916
                case 0xA0:
3917
                        j->rec_frame_size = 80;
3918
                        break;
3919
                case 0x50:
3920
                        j->rec_frame_size = 40;
3921
                        break;
3922
                default:
3923
                        j->rec_frame_size = 120;
3924
                        break;
3925
                }
3926
                j->rec_mode = 4;
3927
                break;
3928
        case LINEAR16:
3929
                switch (j->baseframe.low) {
3930
                case 0xA0:
3931
                        j->rec_frame_size = 160;
3932
                        break;
3933
                case 0x50:
3934
                        j->rec_frame_size = 80;
3935
                        break;
3936
                default:
3937
                        j->rec_frame_size = 240;
3938
                        break;
3939
                }
3940
                j->rec_mode = 5;
3941
                break;
3942
        case LINEAR8:
3943
                switch (j->baseframe.low) {
3944
                case 0xA0:
3945
                        j->rec_frame_size = 80;
3946
                        break;
3947
                case 0x50:
3948
                        j->rec_frame_size = 40;
3949
                        break;
3950
                default:
3951
                        j->rec_frame_size = 120;
3952
                        break;
3953
                }
3954
                j->rec_mode = 6;
3955
                break;
3956
        case WSS:
3957
                switch (j->baseframe.low) {
3958
                case 0xA0:
3959
                        j->rec_frame_size = 80;
3960
                        break;
3961
                case 0x50:
3962
                        j->rec_frame_size = 40;
3963
                        break;
3964
                default:
3965
                        j->rec_frame_size = 120;
3966
                        break;
3967
                }
3968
                j->rec_mode = 7;
3969
                break;
3970
        default:
3971
                j->rec_frame_size = 0;
3972
                j->rec_mode = -1;
3973
                if (j->read_buffer) {
3974
                        kfree(j->read_buffer);
3975
                        j->read_buffer = NULL;
3976
                        j->read_buffer_size = 0;
3977
                }
3978
                retval = 1;
3979
                break;
3980
        }
3981
        return retval;
3982
}
3983
 
3984
static int ixj_record_start(IXJ *j)
3985
{
3986
        unsigned short cmd = 0x0000;
3987
 
3988
        if (j->read_buffer) {
3989
                ixj_record_stop(j);
3990
        }
3991
        j->flags.recording = 1;
3992
        ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
3993
 
3994
        if(ixjdebug & 0x0002)
3995
                printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3996
 
3997
        if (!j->rec_mode) {
3998
                switch (j->rec_codec) {
3999
                case G723_63:
4000
                        cmd = 0x5131;
4001
                        break;
4002
                case G723_53:
4003
                        cmd = 0x5132;
4004
                        break;
4005
                case TS85:
4006
                        cmd = 0x5130;   /* TrueSpeech 8.5 */
4007
 
4008
                        break;
4009
                case TS48:
4010
                        cmd = 0x5133;   /* TrueSpeech 4.8 */
4011
 
4012
                        break;
4013
                case TS41:
4014
                        cmd = 0x5134;   /* TrueSpeech 4.1 */
4015
 
4016
                        break;
4017
                case G728:
4018
                        cmd = 0x5135;
4019
                        break;
4020
                case G729:
4021
                case G729B:
4022
                        cmd = 0x5136;
4023
                        break;
4024
                default:
4025
                        return 1;
4026
                }
4027
                if (ixj_WriteDSPCommand(cmd, j))
4028
                        return -1;
4029
        }
4030
        if (!j->read_buffer) {
4031
                if (!j->read_buffer)
4032
                        j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
4033
                if (!j->read_buffer) {
4034
                        printk("Read buffer allocation for ixj board %d failed!\n", j->board);
4035
                        return -ENOMEM;
4036
                }
4037
        }
4038
        j->read_buffer_size = j->rec_frame_size * 2;
4039
 
4040
        if (ixj_WriteDSPCommand(0x5102, j))             /* Set Poll sync mode */
4041
 
4042
                return -1;
4043
 
4044
        switch (j->rec_mode) {
4045
        case 0:
4046
                cmd = 0x1C03;   /* Record C1 */
4047
 
4048
                break;
4049
        case 4:
4050
                if (j->ver.low == 0x12) {
4051
                        cmd = 0x1E03;   /* Record C1 */
4052
 
4053
                } else {
4054
                        cmd = 0x1E01;   /* Record C1 */
4055
 
4056
                }
4057
                break;
4058
        case 5:
4059
                if (j->ver.low == 0x12) {
4060
                        cmd = 0x1E83;   /* Record C1 */
4061
 
4062
                } else {
4063
                        cmd = 0x1E81;   /* Record C1 */
4064
 
4065
                }
4066
                break;
4067
        case 6:
4068
                if (j->ver.low == 0x12) {
4069
                        cmd = 0x1F03;   /* Record C1 */
4070
 
4071
                } else {
4072
                        cmd = 0x1F01;   /* Record C1 */
4073
 
4074
                }
4075
                break;
4076
        case 7:
4077
                if (j->ver.low == 0x12) {
4078
                        cmd = 0x1F83;   /* Record C1 */
4079
                } else {
4080
                        cmd = 0x1F81;   /* Record C1 */
4081
                }
4082
                break;
4083
        }
4084
        if (ixj_WriteDSPCommand(cmd, j))
4085
                return -1;
4086
 
4087
        if (j->flags.playing) {
4088
                ixj_aec_start(j, j->aec_level);
4089
        }
4090
        return 0;
4091
}
4092
 
4093
static void ixj_record_stop(IXJ *j)
4094
{
4095
        if(ixjdebug & 0x0002)
4096
                printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
4097
 
4098
        if (j->read_buffer) {
4099
                kfree(j->read_buffer);
4100
                j->read_buffer = NULL;
4101
                j->read_buffer_size = 0;
4102
        }
4103
        if (j->rec_mode > -1) {
4104
                ixj_WriteDSPCommand(0x5120, j);
4105
                j->rec_mode = -1;
4106
        }
4107
        j->flags.recording = 0;
4108
}
4109
static void ixj_vad(IXJ *j, int arg)
4110
{
4111
        if (arg)
4112
                ixj_WriteDSPCommand(0x513F, j);
4113
        else
4114
                ixj_WriteDSPCommand(0x513E, j);
4115
}
4116
 
4117
static void set_rec_depth(IXJ *j, int depth)
4118
{
4119
        if (depth > 60)
4120
                depth = 60;
4121
        if (depth < 0)
4122
                depth = 0;
4123
        ixj_WriteDSPCommand(0x5180 + depth, j);
4124
}
4125
 
4126
static void set_dtmf_prescale(IXJ *j, int volume)
4127
{
4128
        ixj_WriteDSPCommand(0xCF07, j);
4129
        ixj_WriteDSPCommand(volume, j);
4130
}
4131
 
4132
static int get_dtmf_prescale(IXJ *j)
4133
{
4134
        ixj_WriteDSPCommand(0xCF05, j);
4135
        return j->ssr.high << 8 | j->ssr.low;
4136
}
4137
 
4138
static void set_rec_volume(IXJ *j, int volume)
4139
{
4140
        if(j->aec_level == AEC_AGC) {
4141
                if (ixjdebug & 0x0002)
4142
                        printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
4143
                ixj_WriteDSPCommand(0xCF96, j);
4144
                ixj_WriteDSPCommand(volume, j);
4145
        } else {
4146
                if (ixjdebug & 0x0002)
4147
                        printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
4148
                ixj_WriteDSPCommand(0xCF03, j);
4149
                ixj_WriteDSPCommand(volume, j);
4150
        }
4151
}
4152
 
4153
static int set_rec_volume_linear(IXJ *j, int volume)
4154
{
4155
        int newvolume, dsprecmax;
4156
 
4157
        if (ixjdebug & 0x0002)
4158
                printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
4159
        if(volume > 100 || volume < 0) {
4160
          return -1;
4161
        }
4162
 
4163
        /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4164
        switch (j->cardtype) {
4165
        case QTI_PHONEJACK:
4166
                dsprecmax = 0x440;
4167
                break;
4168
        case QTI_LINEJACK:
4169
                dsprecmax = 0x180;
4170
                ixj_mixer(0x0203, j);   /*Voice Left Volume unmute 6db */
4171
                ixj_mixer(0x0303, j);   /*Voice Right Volume unmute 6db */
4172
                ixj_mixer(0x0C00, j);   /*Mono1 unmute 12db */
4173
                break;
4174
        case QTI_PHONEJACK_LITE:
4175
                dsprecmax = 0x4C0;
4176
                break;
4177
        case QTI_PHONEJACK_PCI:
4178
                dsprecmax = 0x100;
4179
                break;
4180
        case QTI_PHONECARD:
4181
                dsprecmax = 0x400;
4182
                break;
4183
        default:
4184
                return -1;
4185
        }
4186
        newvolume = (dsprecmax * volume) / 100;
4187
        set_rec_volume(j, newvolume);
4188
        return 0;
4189
}
4190
 
4191
static int get_rec_volume(IXJ *j)
4192
{
4193
        if(j->aec_level == AEC_AGC) {
4194
                if (ixjdebug & 0x0002)
4195
                        printk(KERN_INFO "Getting AGC Threshold\n");
4196
                ixj_WriteDSPCommand(0xCF86, j);
4197
                if (ixjdebug & 0x0002)
4198
                        printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
4199
                return j->ssr.high << 8 | j->ssr.low;
4200
        } else {
4201
                if (ixjdebug & 0x0002)
4202
                        printk(KERN_INFO "Getting Record Volume\n");
4203
                ixj_WriteDSPCommand(0xCF01, j);
4204
                return j->ssr.high << 8 | j->ssr.low;
4205
        }
4206
}
4207
 
4208
static int get_rec_volume_linear(IXJ *j)
4209
{
4210
        int volume, newvolume, dsprecmax;
4211
 
4212
        switch (j->cardtype) {
4213
        case QTI_PHONEJACK:
4214
                dsprecmax = 0x440;
4215
                break;
4216
        case QTI_LINEJACK:
4217
                dsprecmax = 0x180;
4218
                break;
4219
        case QTI_PHONEJACK_LITE:
4220
                dsprecmax = 0x4C0;
4221
                break;
4222
        case QTI_PHONEJACK_PCI:
4223
                dsprecmax = 0x100;
4224
                break;
4225
        case QTI_PHONECARD:
4226
                dsprecmax = 0x400;
4227
                break;
4228
        default:
4229
                return -1;
4230
        }
4231
        volume = get_rec_volume(j);
4232
        newvolume = (volume * 100) / dsprecmax;
4233
        if(newvolume > 100)
4234
                newvolume = 100;
4235
        return newvolume;
4236
}
4237
 
4238
static int get_rec_level(IXJ *j)
4239
{
4240
        int retval;
4241
 
4242
        ixj_WriteDSPCommand(0xCF88, j);
4243
 
4244
        retval = j->ssr.high << 8 | j->ssr.low;
4245
        retval = (retval * 256) / 240;
4246
        return retval;
4247
}
4248
 
4249
static void ixj_aec_start(IXJ *j, int level)
4250
{
4251
        j->aec_level = level;
4252
        if (ixjdebug & 0x0002)
4253
                printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
4254
        if (!level) {
4255
                aec_stop(j);
4256
        } else {
4257
                if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4258
                        ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
4259
 
4260
                        ixj_WriteDSPCommand(0x0300, j);
4261
                }
4262
                ixj_WriteDSPCommand(0xB001, j); /* AEC On */
4263
 
4264
                ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
4265
 
4266
                switch (level) {
4267
                case AEC_LOW:
4268
                        ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
4269
 
4270
                        ixj_WriteDSPCommand(0xE011, j);
4271
                        ixj_WriteDSPCommand(0xFFFF, j);
4272
 
4273
                        ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4274
                        ixj_WriteDSPCommand(0x0000, j); /* to off */
4275
 
4276
                        break;
4277
 
4278
                case AEC_MED:
4279
                        ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
4280
 
4281
                        ixj_WriteDSPCommand(0xE011, j);
4282
                        ixj_WriteDSPCommand(0x0080, j);
4283
 
4284
                        ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4285
                        ixj_WriteDSPCommand(0x0000, j); /* to off */
4286
 
4287
                        break;
4288
 
4289
                case AEC_HIGH:
4290
                        ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
4291
 
4292
                        ixj_WriteDSPCommand(0xE011, j);
4293
                        ixj_WriteDSPCommand(0x0080, j);
4294
 
4295
                        ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4296
                        ixj_WriteDSPCommand(0x0000, j); /* to off */
4297
 
4298
                        break;
4299
 
4300
                case AEC_AGC:
4301
                        /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4302
                        ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4303
 
4304
                        ixj_WriteDSPCommand(0xE011, j);
4305
                        ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4306
 
4307
                        ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4308
 
4309
                        if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4310
                                ixj_WriteDSPCommand(0x0224, j);
4311
                        else
4312
                                ixj_WriteDSPCommand(0x1224, j);
4313
 
4314
                        ixj_WriteDSPCommand(0xE014, j);
4315
                        ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4316
 
4317
                        ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4318
 
4319
                        /* Now we can set the AGC initial parameters and turn it on */
4320
                        ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */
4321
                        ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
4322
 
4323
                        ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
4324
                        ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
4325
 
4326
                        ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
4327
                        ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
4328
 
4329
                        ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
4330
                        ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
4331
 
4332
                        ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
4333
                        ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
4334
 
4335
                        ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
4336
                        ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
4337
 
4338
                        ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
4339
                        ixj_WriteDSPCommand(0x1200, j); /* to 25% */
4340
 
4341
                        ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4342
                        ixj_WriteDSPCommand(0x0001, j); /* to on */
4343
 
4344
                        break;
4345
 
4346
                case AEC_AUTO:
4347
                        ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4348
 
4349
                        ixj_WriteDSPCommand(0xE011, j);
4350
                        ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4351
 
4352
                        ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4353
 
4354
                        if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4355
                                ixj_WriteDSPCommand(0x0224, j);
4356
                        else
4357
                                ixj_WriteDSPCommand(0x1224, j);
4358
 
4359
                        ixj_WriteDSPCommand(0xE014, j);
4360
                        ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4361
 
4362
                        ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4363
 
4364
                        break;
4365
                }
4366
        }
4367
}
4368
 
4369
static void aec_stop(IXJ *j)
4370
{
4371
        j->aec_level = AEC_OFF;
4372
        if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4373
                ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
4374
 
4375
                ixj_WriteDSPCommand(0x0700, j);
4376
        }
4377
        if (j->play_mode != -1 && j->rec_mode != -1)
4378
        {
4379
                ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
4380
        }
4381
}
4382
 
4383
static int set_play_codec(IXJ *j, int rate)
4384
{
4385
        int retval = 0;
4386
 
4387
        j->play_codec = rate;
4388
 
4389
        switch (rate) {
4390
        case G723_63:
4391
                if (j->ver.low != 0x12 || ixj_convert_loaded) {
4392
                        j->play_frame_size = 12;
4393
                        j->play_mode = 0;
4394
                } else {
4395
                        retval = 1;
4396
                }
4397
                break;
4398
        case G723_53:
4399
                if (j->ver.low != 0x12 || ixj_convert_loaded) {
4400
                        j->play_frame_size = 10;
4401
                        j->play_mode = 0;
4402
                } else {
4403
                        retval = 1;
4404
                }
4405
                break;
4406
        case TS85:
4407
                if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
4408
                        j->play_frame_size = 16;
4409
                        j->play_mode = 0;
4410
                } else {
4411
                        retval = 1;
4412
                }
4413
                break;
4414
        case TS48:
4415
                if (j->ver.low != 0x12 || ixj_convert_loaded) {
4416
                        j->play_frame_size = 9;
4417
                        j->play_mode = 0;
4418
                } else {
4419
                        retval = 1;
4420
                }
4421
                break;
4422
        case TS41:
4423
                if (j->ver.low != 0x12 || ixj_convert_loaded) {
4424
                        j->play_frame_size = 8;
4425
                        j->play_mode = 0;
4426
                } else {
4427
                        retval = 1;
4428
                }
4429
                break;
4430
        case G728:
4431
                if (j->dsp.low != 0x20) {
4432
                        j->play_frame_size = 48;
4433
                        j->play_mode = 0;
4434
                } else {
4435
                        retval = 1;
4436
                }
4437
                break;
4438
        case G729:
4439
                if (j->dsp.low != 0x20) {
4440
                        if (!j->flags.g729_loaded) {
4441
                                retval = 1;
4442
                                break;
4443
                        }
4444
                        switch (j->baseframe.low) {
4445
                        case 0xA0:
4446
                                j->play_frame_size = 10;
4447
                                break;
4448
                        case 0x50:
4449
                                j->play_frame_size = 5;
4450
                                break;
4451
                        default:
4452
                                j->play_frame_size = 15;
4453
                                break;
4454
                        }
4455
                        j->play_mode = 0;
4456
                } else {
4457
                        retval = 1;
4458
                }
4459
                break;
4460
        case G729B:
4461
                if (j->dsp.low != 0x20) {
4462
                        if (!j->flags.g729_loaded) {
4463
                                retval = 1;
4464
                                break;
4465
                        }
4466
                        switch (j->baseframe.low) {
4467
                        case 0xA0:
4468
                                j->play_frame_size = 12;
4469
                                break;
4470
                        case 0x50:
4471
                                j->play_frame_size = 6;
4472
                                break;
4473
                        default:
4474
                                j->play_frame_size = 18;
4475
                                break;
4476
                        }
4477
                        j->play_mode = 0;
4478
                } else {
4479
                        retval = 1;
4480
                }
4481
                break;
4482
        case ULAW:
4483
                switch (j->baseframe.low) {
4484
                case 0xA0:
4485
                        j->play_frame_size = 80;
4486
                        break;
4487
                case 0x50:
4488
                        j->play_frame_size = 40;
4489
                        break;
4490
                default:
4491
                        j->play_frame_size = 120;
4492
                        break;
4493
                }
4494
                j->play_mode = 2;
4495
                break;
4496
        case ALAW:
4497
                switch (j->baseframe.low) {
4498
                case 0xA0:
4499
                        j->play_frame_size = 80;
4500
                        break;
4501
                case 0x50:
4502
                        j->play_frame_size = 40;
4503
                        break;
4504
                default:
4505
                        j->play_frame_size = 120;
4506
                        break;
4507
                }
4508
                j->play_mode = 2;
4509
                break;
4510
        case LINEAR16:
4511
                switch (j->baseframe.low) {
4512
                case 0xA0:
4513
                        j->play_frame_size = 160;
4514
                        break;
4515
                case 0x50:
4516
                        j->play_frame_size = 80;
4517
                        break;
4518
                default:
4519
                        j->play_frame_size = 240;
4520
                        break;
4521
                }
4522
                j->play_mode = 6;
4523
                break;
4524
        case LINEAR8:
4525
                switch (j->baseframe.low) {
4526
                case 0xA0:
4527
                        j->play_frame_size = 80;
4528
                        break;
4529
                case 0x50:
4530
                        j->play_frame_size = 40;
4531
                        break;
4532
                default:
4533
                        j->play_frame_size = 120;
4534
                        break;
4535
                }
4536
                j->play_mode = 4;
4537
                break;
4538
        case WSS:
4539
                switch (j->baseframe.low) {
4540
                case 0xA0:
4541
                        j->play_frame_size = 80;
4542
                        break;
4543
                case 0x50:
4544
                        j->play_frame_size = 40;
4545
                        break;
4546
                default:
4547
                        j->play_frame_size = 120;
4548
                        break;
4549
                }
4550
                j->play_mode = 5;
4551
                break;
4552
        default:
4553
                j->play_frame_size = 0;
4554
                j->play_mode = -1;
4555
                if (j->write_buffer) {
4556
                        kfree(j->write_buffer);
4557
                        j->write_buffer = NULL;
4558
                        j->write_buffer_size = 0;
4559
                }
4560
                retval = 1;
4561
                break;
4562
        }
4563
        return retval;
4564
}
4565
 
4566
static int ixj_play_start(IXJ *j)
4567
{
4568
        unsigned short cmd = 0x0000;
4569
 
4570
        if (j->write_buffer) {
4571
                ixj_play_stop(j);
4572
        }
4573
 
4574
        if(ixjdebug & 0x0002)
4575
                printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4576
 
4577
        j->flags.playing = 1;
4578
        ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
4579
 
4580
        j->flags.play_first_frame = 1;
4581
        j->drybuffer = 0;
4582
 
4583
        if (!j->play_mode) {
4584
                switch (j->play_codec) {
4585
                case G723_63:
4586
                        cmd = 0x5231;
4587
                        break;
4588
                case G723_53:
4589
                        cmd = 0x5232;
4590
                        break;
4591
                case TS85:
4592
                        cmd = 0x5230;   /* TrueSpeech 8.5 */
4593
 
4594
                        break;
4595
                case TS48:
4596
                        cmd = 0x5233;   /* TrueSpeech 4.8 */
4597
 
4598
                        break;
4599
                case TS41:
4600
                        cmd = 0x5234;   /* TrueSpeech 4.1 */
4601
 
4602
                        break;
4603
                case G728:
4604
                        cmd = 0x5235;
4605
                        break;
4606
                case G729:
4607
                case G729B:
4608
                        cmd = 0x5236;
4609
                        break;
4610
                default:
4611
                        return 1;
4612
                }
4613
                if (ixj_WriteDSPCommand(cmd, j))
4614
                        return -1;
4615
        }
4616
        j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
4617
        if (!j->write_buffer) {
4618
                printk("Write buffer allocation for ixj board %d failed!\n", j->board);
4619
                return -ENOMEM;
4620
        }
4621
/*      j->write_buffers_empty = 2; */
4622
        j->write_buffers_empty = 1;
4623
        j->write_buffer_size = j->play_frame_size * 2;
4624
        j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
4625
        j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
4626
 
4627
        if (ixj_WriteDSPCommand(0x5202, j))             /* Set Poll sync mode */
4628
 
4629
                return -1;
4630
 
4631
        switch (j->play_mode) {
4632
        case 0:
4633
                cmd = 0x2C03;
4634
                break;
4635
        case 2:
4636
                if (j->ver.low == 0x12) {
4637
                        cmd = 0x2C23;
4638
                } else {
4639
                        cmd = 0x2C21;
4640
                }
4641
                break;
4642
        case 4:
4643
                if (j->ver.low == 0x12) {
4644
                        cmd = 0x2C43;
4645
                } else {
4646
                        cmd = 0x2C41;
4647
                }
4648
                break;
4649
        case 5:
4650
                if (j->ver.low == 0x12) {
4651
                        cmd = 0x2C53;
4652
                } else {
4653
                        cmd = 0x2C51;
4654
                }
4655
                break;
4656
        case 6:
4657
                if (j->ver.low == 0x12) {
4658
                        cmd = 0x2C63;
4659
                } else {
4660
                        cmd = 0x2C61;
4661
                }
4662
                break;
4663
        }
4664
        if (ixj_WriteDSPCommand(cmd, j))
4665
                return -1;
4666
 
4667
        if (ixj_WriteDSPCommand(0x2000, j))             /* Playback C2 */
4668
                return -1;
4669
 
4670
        if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j))        /* Playback C3 */
4671
                return -1;
4672
 
4673
        if (j->flags.recording) {
4674
                ixj_aec_start(j, j->aec_level);
4675
        }
4676
 
4677
        return 0;
4678
}
4679
 
4680
static void ixj_play_stop(IXJ *j)
4681
{
4682
        if(ixjdebug & 0x0002)
4683
                printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4684
 
4685
        if (j->write_buffer) {
4686
                kfree(j->write_buffer);
4687
                j->write_buffer = NULL;
4688
                j->write_buffer_size = 0;
4689
        }
4690
        if (j->play_mode > -1) {
4691
                ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers.  8022 reference page 9-40 */
4692
 
4693
                j->play_mode = -1;
4694
        }
4695
        j->flags.playing = 0;
4696
}
4697
 
4698
static inline int get_play_level(IXJ *j)
4699
{
4700
        int retval;
4701
 
4702
        ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
4703
        return j->ssr.high << 8 | j->ssr.low;
4704
        retval = j->ssr.high << 8 | j->ssr.low;
4705
        retval = (retval * 256) / 240;
4706
        return retval;
4707
}
4708
 
4709
static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
4710
{
4711
        unsigned int mask = 0;
4712
 
4713
        IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
4714
 
4715
        poll_wait(file_p, &(j->poll_q), wait);
4716
        if (j->read_buffer_ready > 0)
4717
                mask |= POLLIN | POLLRDNORM;    /* readable */
4718
        if (j->write_buffers_empty > 0)
4719
                mask |= POLLOUT | POLLWRNORM;   /* writable */
4720
        if (j->ex.bytes)
4721
                mask |= POLLPRI;
4722
        return mask;
4723
}
4724
 
4725
static int ixj_play_tone(IXJ *j, char tone)
4726
{
4727
        if (!j->tone_state) {
4728
                if(ixjdebug & 0x0002) {
4729
                        printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
4730
                }
4731
                if (j->dsp.low == 0x20) {
4732
                        idle(j);
4733
                }
4734
                j->tone_start_jif = jiffies;
4735
 
4736
                j->tone_state = 1;
4737
        }
4738
 
4739
        j->tone_index = tone;
4740
        if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
4741
                return -1;
4742
 
4743
        return 0;
4744
}
4745
 
4746
static int ixj_set_tone_on(unsigned short arg, IXJ *j)
4747
{
4748
        j->tone_on_time = arg;
4749
 
4750
        if (ixj_WriteDSPCommand(0x6E04, j))             /* Set Tone On Period */
4751
 
4752
                return -1;
4753
 
4754
        if (ixj_WriteDSPCommand(arg, j))
4755
                return -1;
4756
 
4757
        return 0;
4758
}
4759
 
4760
static int SCI_WaitHighSCI(IXJ *j)
4761
{
4762
        int cnt;
4763
 
4764
        j->pld_scrr.byte = inb_p(j->XILINXbase);
4765
        if (!j->pld_scrr.bits.sci) {
4766
                for (cnt = 0; cnt < 10; cnt++) {
4767
                        udelay(32);
4768
                        j->pld_scrr.byte = inb_p(j->XILINXbase);
4769
 
4770
                        if ((j->pld_scrr.bits.sci))
4771
                                return 1;
4772
                }
4773
                if (ixjdebug & 0x0001)
4774
                        printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
4775
                return 0;
4776
        } else
4777
                return 1;
4778
}
4779
 
4780
static int SCI_WaitLowSCI(IXJ *j)
4781
{
4782
        int cnt;
4783
 
4784
        j->pld_scrr.byte = inb_p(j->XILINXbase);
4785
        if (j->pld_scrr.bits.sci) {
4786
                for (cnt = 0; cnt < 10; cnt++) {
4787
                        udelay(32);
4788
                        j->pld_scrr.byte = inb_p(j->XILINXbase);
4789
 
4790
                        if (!(j->pld_scrr.bits.sci))
4791
                                return 1;
4792
                }
4793
                if (ixjdebug & 0x0001)
4794
                        printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
4795
                return 0;
4796
        } else
4797
                return 1;
4798
}
4799
 
4800
static int SCI_Control(IXJ *j, int control)
4801
{
4802
        switch (control) {
4803
        case SCI_End:
4804
                j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4805
 
4806
                j->pld_scrw.bits.c1 = 0; /* to no selection */
4807
 
4808
                break;
4809
        case SCI_Enable_DAA:
4810
                j->pld_scrw.bits.c0 = 1;        /* Set PLD Serial control interface */
4811
 
4812
                j->pld_scrw.bits.c1 = 0; /* to write to DAA */
4813
 
4814
                break;
4815
        case SCI_Enable_Mixer:
4816
                j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4817
 
4818
                j->pld_scrw.bits.c1 = 1;        /* to write to mixer */
4819
 
4820
                break;
4821
        case SCI_Enable_EEPROM:
4822
                j->pld_scrw.bits.c0 = 1;        /* Set PLD Serial control interface */
4823
 
4824
                j->pld_scrw.bits.c1 = 1;        /* to write to EEPROM */
4825
 
4826
                break;
4827
        default:
4828
                return 0;
4829
                break;
4830
        }
4831
        outb_p(j->pld_scrw.byte, j->XILINXbase);
4832
 
4833
        switch (control) {
4834
        case SCI_End:
4835
                return 1;
4836
                break;
4837
        case SCI_Enable_DAA:
4838
        case SCI_Enable_Mixer:
4839
        case SCI_Enable_EEPROM:
4840
                if (!SCI_WaitHighSCI(j))
4841
                        return 0;
4842
                break;
4843
        default:
4844
                return 0;
4845
                break;
4846
        }
4847
        return 1;
4848
}
4849
 
4850
static int SCI_Prepare(IXJ *j)
4851
{
4852
        if (!SCI_Control(j, SCI_End))
4853
                return 0;
4854
 
4855
        if (!SCI_WaitLowSCI(j))
4856
                return 0;
4857
 
4858
        return 1;
4859
}
4860
 
4861
static int ixj_get_mixer(long val, IXJ *j)
4862
{
4863
        int reg = (val & 0x1F00) >> 8;
4864
        return j->mix.vol[reg];
4865
}
4866
 
4867
static int ixj_mixer(long val, IXJ *j)
4868
{
4869
        BYTES bytes;
4870
 
4871
        bytes.high = (val & 0x1F00) >> 8;
4872
        bytes.low = val & 0x00FF;
4873
 
4874
        /* save mixer value so we can get back later on */
4875
        j->mix.vol[bytes.high] = bytes.low;
4876
 
4877
        outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03);        /* Load Mixer Address */
4878
 
4879
        outb_p(bytes.low, j->XILINXbase + 0x02);        /* Load Mixer Data */
4880
 
4881
        SCI_Control(j, SCI_Enable_Mixer);
4882
 
4883
        SCI_Control(j, SCI_End);
4884
 
4885
        return 0;
4886
}
4887
 
4888
static int daa_load(BYTES * p_bytes, IXJ *j)
4889
{
4890
        outb_p(p_bytes->high, j->XILINXbase + 0x03);
4891
        outb_p(p_bytes->low, j->XILINXbase + 0x02);
4892
        if (!SCI_Control(j, SCI_Enable_DAA))
4893
                return 0;
4894
        else
4895
                return 1;
4896
}
4897
 
4898
static int ixj_daa_cr4(IXJ *j, char reg)
4899
{
4900
        BYTES bytes;
4901
 
4902
        switch (j->daa_mode) {
4903
        case SOP_PU_SLEEP:
4904
                bytes.high = 0x14;
4905
                break;
4906
        case SOP_PU_RINGING:
4907
                bytes.high = 0x54;
4908
                break;
4909
        case SOP_PU_CONVERSATION:
4910
                bytes.high = 0x94;
4911
                break;
4912
        case SOP_PU_PULSEDIALING:
4913
                bytes.high = 0xD4;
4914
                break;
4915
        }
4916
 
4917
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
4918
 
4919
        switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
4920
        case 0:
4921
                j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
4922
                break;
4923
        case 1:
4924
                j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
4925
                break;
4926
        case 2:
4927
                j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
4928
                break;
4929
        case 3:
4930
                j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
4931
                break;
4932
        }
4933
 
4934
        bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
4935
 
4936
        if (!daa_load(&bytes, j))
4937
                return 0;
4938
 
4939
        if (!SCI_Prepare(j))
4940
                return 0;
4941
 
4942
        return 1;
4943
}
4944
 
4945
static char daa_int_read(IXJ *j)
4946
{
4947
        BYTES bytes;
4948
 
4949
        if (!SCI_Prepare(j))
4950
                return 0;
4951
 
4952
        bytes.high = 0x38;
4953
        bytes.low = 0x00;
4954
        outb_p(bytes.high, j->XILINXbase + 0x03);
4955
        outb_p(bytes.low, j->XILINXbase + 0x02);
4956
 
4957
        if (!SCI_Control(j, SCI_Enable_DAA))
4958
                return 0;
4959
 
4960
        bytes.high = inb_p(j->XILINXbase + 0x03);
4961
        bytes.low = inb_p(j->XILINXbase + 0x02);
4962
        if (bytes.low != ALISDAA_ID_BYTE) {
4963
                if (ixjdebug & 0x0001)
4964
                        printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4965
                return 0;
4966
        }
4967
        if (!SCI_Control(j, SCI_Enable_DAA))
4968
                return 0;
4969
        if (!SCI_Control(j, SCI_End))
4970
                return 0;
4971
 
4972
        bytes.high = inb_p(j->XILINXbase + 0x03);
4973
        bytes.low = inb_p(j->XILINXbase + 0x02);
4974
 
4975
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
4976
 
4977
        return 1;
4978
}
4979
 
4980
static char daa_CR_read(IXJ *j, int cr)
4981
{
4982
        IXJ_WORD wdata;
4983
        BYTES bytes;
4984
 
4985
        if (!SCI_Prepare(j))
4986
                return 0;
4987
 
4988
        switch (j->daa_mode) {
4989
        case SOP_PU_SLEEP:
4990
                bytes.high = 0x30 + cr;
4991
                break;
4992
        case SOP_PU_RINGING:
4993
                bytes.high = 0x70 + cr;
4994
                break;
4995
        case SOP_PU_CONVERSATION:
4996
                bytes.high = 0xB0 + cr;
4997
                break;
4998
        case SOP_PU_PULSEDIALING:
4999
                bytes.high = 0xF0 + cr;
5000
                break;
5001
        }
5002
 
5003
        bytes.low = 0x00;
5004
 
5005
        outb_p(bytes.high, j->XILINXbase + 0x03);
5006
        outb_p(bytes.low, j->XILINXbase + 0x02);
5007
 
5008
        if (!SCI_Control(j, SCI_Enable_DAA))
5009
                return 0;
5010
 
5011
        bytes.high = inb_p(j->XILINXbase + 0x03);
5012
        bytes.low = inb_p(j->XILINXbase + 0x02);
5013
        if (bytes.low != ALISDAA_ID_BYTE) {
5014
                if (ixjdebug & 0x0001)
5015
                        printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5016
                return 0;
5017
        }
5018
        if (!SCI_Control(j, SCI_Enable_DAA))
5019
                return 0;
5020
        if (!SCI_Control(j, SCI_End))
5021
                return 0;
5022
 
5023
        wdata.word = inw_p(j->XILINXbase + 0x02);
5024
 
5025
        switch(cr){
5026
                case 5:
5027
                        j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
5028
                        break;
5029
                case 4:
5030
                        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
5031
                        break;
5032
                case 3:
5033
                        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
5034
                        break;
5035
                case 2:
5036
                        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
5037
                        break;
5038
                case 1:
5039
                        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
5040
                        break;
5041
                case 0:
5042
                        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
5043
                        break;
5044
                default:
5045
                        return 0;
5046
        }
5047
        return 1;
5048
}
5049
 
5050
static int ixj_daa_cid_reset(IXJ *j)
5051
{
5052
        int i;
5053
        BYTES bytes;
5054
 
5055
        if (ixjdebug & 0x0002)
5056
                printk("DAA Clearing CID ram\n");
5057
 
5058
        if (!SCI_Prepare(j))
5059
                return 0;
5060
 
5061
        bytes.high = 0x58;
5062
        bytes.low = 0x00;
5063
        outb_p(bytes.high, j->XILINXbase + 0x03);
5064
        outb_p(bytes.low, j->XILINXbase + 0x02);
5065
 
5066
        if (!SCI_Control(j, SCI_Enable_DAA))
5067
                return 0;
5068
 
5069
        if (!SCI_WaitHighSCI(j))
5070
                return 0;
5071
 
5072
        for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
5073
                bytes.high = bytes.low = 0x00;
5074
                outb_p(bytes.high, j->XILINXbase + 0x03);
5075
 
5076
                if (i < ALISDAA_CALLERID_SIZE - 1)
5077
                        outb_p(bytes.low, j->XILINXbase + 0x02);
5078
 
5079
                if (!SCI_Control(j, SCI_Enable_DAA))
5080
                        return 0;
5081
 
5082
                if (!SCI_WaitHighSCI(j))
5083
                        return 0;
5084
 
5085
        }
5086
 
5087
        if (!SCI_Control(j, SCI_End))
5088
                return 0;
5089
 
5090
        if (ixjdebug & 0x0002)
5091
                printk("DAA CID ram cleared\n");
5092
 
5093
        return 1;
5094
}
5095
 
5096
static int ixj_daa_cid_read(IXJ *j)
5097
{
5098
        int i;
5099
        BYTES bytes;
5100
        char CID[ALISDAA_CALLERID_SIZE], mContinue;
5101
        char *pIn, *pOut;
5102
 
5103
        if (!SCI_Prepare(j))
5104
                return 0;
5105
 
5106
        bytes.high = 0x78;
5107
        bytes.low = 0x00;
5108
        outb_p(bytes.high, j->XILINXbase + 0x03);
5109
        outb_p(bytes.low, j->XILINXbase + 0x02);
5110
 
5111
        if (!SCI_Control(j, SCI_Enable_DAA))
5112
                return 0;
5113
 
5114
        if (!SCI_WaitHighSCI(j))
5115
                return 0;
5116
 
5117
        bytes.high = inb_p(j->XILINXbase + 0x03);
5118
        bytes.low = inb_p(j->XILINXbase + 0x02);
5119
        if (bytes.low != ALISDAA_ID_BYTE) {
5120
                if (ixjdebug & 0x0001)
5121
                        printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5122
                return 0;
5123
        }
5124
        for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
5125
                bytes.high = bytes.low = 0x00;
5126
                outb_p(bytes.high, j->XILINXbase + 0x03);
5127
                outb_p(bytes.low, j->XILINXbase + 0x02);
5128
 
5129
                if (!SCI_Control(j, SCI_Enable_DAA))
5130
                        return 0;
5131
 
5132
                if (!SCI_WaitHighSCI(j))
5133
                        return 0;
5134
 
5135
                CID[i + 0] = inb_p(j->XILINXbase + 0x03);
5136
                CID[i + 1] = inb_p(j->XILINXbase + 0x02);
5137
        }
5138
 
5139
        if (!SCI_Control(j, SCI_End))
5140
                return 0;
5141
 
5142
        pIn = CID;
5143
        pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5144
        mContinue = 1;
5145
        while (mContinue) {
5146
                if ((pIn[1] & 0x03) == 0x01) {
5147
                        pOut[0] = pIn[0];
5148
                }
5149
                if ((pIn[2] & 0x0c) == 0x04) {
5150
                        pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
5151
                }
5152
                if ((pIn[3] & 0x30) == 0x10) {
5153
                        pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
5154
                }
5155
                if ((pIn[4] & 0xc0) == 0x40) {
5156
                        pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
5157
                } else {
5158
                        mContinue = FALSE;
5159
                }
5160
                pIn += 5, pOut += 4;
5161
        }
5162
        memset(&j->cid, 0, sizeof(PHONE_CID));
5163
        pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5164
        pOut += 4;
5165
        strncpy(j->cid.month, pOut, 2);
5166
        pOut += 2;
5167
        strncpy(j->cid.day, pOut, 2);
5168
        pOut += 2;
5169
        strncpy(j->cid.hour, pOut, 2);
5170
        pOut += 2;
5171
        strncpy(j->cid.min, pOut, 2);
5172
        pOut += 3;
5173
        j->cid.numlen = *pOut;
5174
        pOut += 1;
5175
        strncpy(j->cid.number, pOut, j->cid.numlen);
5176
        pOut += j->cid.numlen + 1;
5177
        j->cid.namelen = *pOut;
5178
        pOut += 1;
5179
        strncpy(j->cid.name, pOut, j->cid.namelen);
5180
 
5181
        ixj_daa_cid_reset(j);
5182
        return 1;
5183
}
5184
 
5185
static char daa_get_version(IXJ *j)
5186
{
5187
        BYTES bytes;
5188
 
5189
        if (!SCI_Prepare(j))
5190
                return 0;
5191
 
5192
        bytes.high = 0x35;
5193
        bytes.low = 0x00;
5194
        outb_p(bytes.high, j->XILINXbase + 0x03);
5195
        outb_p(bytes.low, j->XILINXbase + 0x02);
5196
 
5197
        if (!SCI_Control(j, SCI_Enable_DAA))
5198
                return 0;
5199
 
5200
        bytes.high = inb_p(j->XILINXbase + 0x03);
5201
        bytes.low = inb_p(j->XILINXbase + 0x02);
5202
        if (bytes.low != ALISDAA_ID_BYTE) {
5203
                if (ixjdebug & 0x0001)
5204
                        printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5205
                return 0;
5206
        }
5207
        if (!SCI_Control(j, SCI_Enable_DAA))
5208
                return 0;
5209
 
5210
        if (!SCI_Control(j, SCI_End))
5211
                return 0;
5212
 
5213
        bytes.high = inb_p(j->XILINXbase + 0x03);
5214
        bytes.low = inb_p(j->XILINXbase + 0x02);
5215
        if (ixjdebug & 0x0002)
5216
                printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
5217
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
5218
        return bytes.high;
5219
}
5220
 
5221
static int daa_set_mode(IXJ *j, int mode)
5222
{
5223
        /* NOTE:
5224
              The DAA *MUST* be in the conversation mode if the
5225
              PSTN line is to be seized (PSTN line off-hook).
5226
              Taking the PSTN line off-hook while the DAA is in
5227
              a mode other than conversation mode will cause a
5228
              hardware failure of the ALIS-A part.
5229
 
5230
           NOTE:
5231
              The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5232
              if the PSTN line is on-hook.  Failure to have the PSTN line
5233
              in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5234
              ALIS-A part.
5235
        */
5236
 
5237
        BYTES bytes;
5238
 
5239
        j->flags.pstn_rmr = 0;
5240
 
5241
        if (!SCI_Prepare(j))
5242
                return 0;
5243
 
5244
        switch (mode) {
5245
        case SOP_PU_RESET:
5246
                j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5247
 
5248
                outb_p(j->pld_scrw.byte, j->XILINXbase);
5249
                j->pld_slicw.bits.rly2 = 0;
5250
                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5251
                bytes.high = 0x10;
5252
                bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5253
                daa_load(&bytes, j);
5254
                if (!SCI_Prepare(j))
5255
                        return 0;
5256
 
5257
                j->daa_mode = SOP_PU_SLEEP;
5258
                break;
5259
        case SOP_PU_SLEEP:
5260
                if(j->daa_mode == SOP_PU_SLEEP)
5261
                {
5262
                        break;
5263
                }
5264
                if (ixjdebug & 0x0008)
5265
                        printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
5266
/*              if(j->daa_mode == SOP_PU_CONVERSATION) */
5267
                {
5268
                        j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5269
 
5270
                        outb_p(j->pld_scrw.byte, j->XILINXbase);
5271
                        j->pld_slicw.bits.rly2 = 0;
5272
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5273
                        bytes.high = 0x10;
5274
                        bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5275
                        daa_load(&bytes, j);
5276
                        if (!SCI_Prepare(j))
5277
                                return 0;
5278
                }
5279
                j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5280
 
5281
                outb_p(j->pld_scrw.byte, j->XILINXbase);
5282
                j->pld_slicw.bits.rly2 = 0;
5283
                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5284
                bytes.high = 0x10;
5285
                bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5286
                daa_load(&bytes, j);
5287
                if (!SCI_Prepare(j))
5288
                        return 0;
5289
 
5290
                j->daa_mode = SOP_PU_SLEEP;
5291
                j->flags.pstn_ringing = 0;
5292
                j->ex.bits.pstn_ring = 0;
5293
                j->pstn_sleeptil = jiffies + (hertz / 4);
5294
                wake_up_interruptible(&j->read_q);      /* Wake any blocked readers */
5295
                wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
5296
                wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
5297
                break;
5298
        case SOP_PU_RINGING:
5299
                if (ixjdebug & 0x0008)
5300
                        printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
5301
                j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5302
 
5303
                outb_p(j->pld_scrw.byte, j->XILINXbase);
5304
                j->pld_slicw.bits.rly2 = 0;
5305
                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5306
                bytes.high = 0x50;
5307
                bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5308
                daa_load(&bytes, j);
5309
                if (!SCI_Prepare(j))
5310
                        return 0;
5311
                j->daa_mode = SOP_PU_RINGING;
5312
                break;
5313
        case SOP_PU_CONVERSATION:
5314
                if (ixjdebug & 0x0008)
5315
                        printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
5316
                bytes.high = 0x90;
5317
                bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5318
                daa_load(&bytes, j);
5319
                if (!SCI_Prepare(j))
5320
                        return 0;
5321
                j->pld_slicw.bits.rly2 = 1;
5322
                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5323
                j->pld_scrw.bits.daafsyncen = 1;        /* Turn on DAA Frame Sync */
5324
 
5325
                outb_p(j->pld_scrw.byte, j->XILINXbase);
5326
                j->daa_mode = SOP_PU_CONVERSATION;
5327
                j->flags.pstn_ringing = 0;
5328
                j->ex.bits.pstn_ring = 0;
5329
                j->pstn_sleeptil = jiffies;
5330
                j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
5331
                break;
5332
        case SOP_PU_PULSEDIALING:
5333
                if (ixjdebug & 0x0008)
5334
                        printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
5335
                j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5336
 
5337
                outb_p(j->pld_scrw.byte, j->XILINXbase);
5338
                j->pld_slicw.bits.rly2 = 0;
5339
                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5340
                bytes.high = 0xD0;
5341
                bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5342
                daa_load(&bytes, j);
5343
                if (!SCI_Prepare(j))
5344
                        return 0;
5345
                j->daa_mode = SOP_PU_PULSEDIALING;
5346
                break;
5347
        default:
5348
                break;
5349
        }
5350
        return 1;
5351
}
5352
 
5353
static int ixj_daa_write(IXJ *j)
5354
{
5355
        BYTES bytes;
5356
 
5357
        j->flags.pstncheck = 1;
5358
 
5359
        daa_set_mode(j, SOP_PU_SLEEP);
5360
 
5361
        if (!SCI_Prepare(j))
5362
                return 0;
5363
 
5364
        outb_p(j->pld_scrw.byte, j->XILINXbase);
5365
 
5366
        bytes.high = 0x14;
5367
        bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
5368
        if (!daa_load(&bytes, j))
5369
                return 0;
5370
 
5371
        bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
5372
        bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
5373
        if (!daa_load(&bytes, j))
5374
                return 0;
5375
 
5376
        bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
5377
        bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5378
        if (!daa_load(&bytes, j))
5379
                return 0;
5380
 
5381
        if (!SCI_Prepare(j))
5382
                return 0;
5383
 
5384
        bytes.high = 0x1F;
5385
        bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
5386
        if (!daa_load(&bytes, j))
5387
                return 0;
5388
 
5389
        bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
5390
        bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
5391
        if (!daa_load(&bytes, j))
5392
                return 0;
5393
 
5394
        bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
5395
        bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
5396
        if (!daa_load(&bytes, j))
5397
                return 0;
5398
 
5399
        bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
5400
        bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
5401
        if (!daa_load(&bytes, j))
5402
                return 0;
5403
 
5404
        bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
5405
        bytes.low = 0x00;
5406
        if (!daa_load(&bytes, j))
5407
                return 0;
5408
 
5409
        if (!SCI_Prepare(j))
5410
                return 0;
5411
 
5412
        bytes.high = 0x00;
5413
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
5414
        if (!daa_load(&bytes, j))
5415
                return 0;
5416
 
5417
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
5418
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
5419
        if (!daa_load(&bytes, j))
5420
                return 0;
5421
 
5422
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
5423
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
5424
        if (!daa_load(&bytes, j))
5425
                return 0;
5426
 
5427
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
5428
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
5429
        if (!daa_load(&bytes, j))
5430
                return 0;
5431
 
5432
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
5433
        bytes.low = 0x00;
5434
        if (!daa_load(&bytes, j))
5435
                return 0;
5436
 
5437
        if (!SCI_Control(j, SCI_End))
5438
                return 0;
5439
        if (!SCI_WaitLowSCI(j))
5440
                return 0;
5441
 
5442
        bytes.high = 0x01;
5443
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
5444
        if (!daa_load(&bytes, j))
5445
                return 0;
5446
 
5447
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
5448
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
5449
        if (!daa_load(&bytes, j))
5450
                return 0;
5451
 
5452
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
5453
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
5454
        if (!daa_load(&bytes, j))
5455
                return 0;
5456
 
5457
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
5458
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
5459
        if (!daa_load(&bytes, j))
5460
                return 0;
5461
 
5462
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
5463
        bytes.low = 0x00;
5464
        if (!daa_load(&bytes, j))
5465
                return 0;
5466
 
5467
        if (!SCI_Control(j, SCI_End))
5468
                return 0;
5469
        if (!SCI_WaitLowSCI(j))
5470
                return 0;
5471
 
5472
        bytes.high = 0x02;
5473
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
5474
        if (!daa_load(&bytes, j))
5475
                return 0;
5476
 
5477
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
5478
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
5479
        if (!daa_load(&bytes, j))
5480
                return 0;
5481
 
5482
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
5483
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
5484
        if (!daa_load(&bytes, j))
5485
                return 0;
5486
 
5487
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
5488
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
5489
        if (!daa_load(&bytes, j))
5490
                return 0;
5491
 
5492
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
5493
        bytes.low = 0x00;
5494
        if (!daa_load(&bytes, j))
5495
                return 0;
5496
 
5497
        if (!SCI_Control(j, SCI_End))
5498
                return 0;
5499
        if (!SCI_WaitLowSCI(j))
5500
                return 0;
5501
 
5502
        bytes.high = 0x03;
5503
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
5504
        if (!daa_load(&bytes, j))
5505
                return 0;
5506
 
5507
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
5508
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
5509
        if (!daa_load(&bytes, j))
5510
                return 0;
5511
 
5512
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
5513
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
5514
        if (!daa_load(&bytes, j))
5515
                return 0;
5516
 
5517
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
5518
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
5519
        if (!daa_load(&bytes, j))
5520
                return 0;
5521
 
5522
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
5523
        bytes.low = 0x00;
5524
        if (!daa_load(&bytes, j))
5525
                return 0;
5526
 
5527
        if (!SCI_Control(j, SCI_End))
5528
                return 0;
5529
        if (!SCI_WaitLowSCI(j))
5530
                return 0;
5531
 
5532
        bytes.high = 0x04;
5533
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
5534
        if (!daa_load(&bytes, j))
5535
                return 0;
5536
 
5537
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
5538
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
5539
        if (!daa_load(&bytes, j))
5540
                return 0;
5541
 
5542
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
5543
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
5544
        if (!daa_load(&bytes, j))
5545
                return 0;
5546
 
5547
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
5548
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
5549
        if (!daa_load(&bytes, j))
5550
                return 0;
5551
 
5552
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
5553
        bytes.low = 0x00;
5554
        if (!daa_load(&bytes, j))
5555
                return 0;
5556
 
5557
        if (!SCI_Control(j, SCI_End))
5558
                return 0;
5559
        if (!SCI_WaitLowSCI(j))
5560
                return 0;
5561
 
5562
        bytes.high = 0x05;
5563
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
5564
        if (!daa_load(&bytes, j))
5565
                return 0;
5566
 
5567
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
5568
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
5569
        if (!daa_load(&bytes, j))
5570
                return 0;
5571
 
5572
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
5573
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
5574
        if (!daa_load(&bytes, j))
5575
                return 0;
5576
 
5577
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
5578
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
5579
        if (!daa_load(&bytes, j))
5580
                return 0;
5581
 
5582
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
5583
        bytes.low = 0x00;
5584
        if (!daa_load(&bytes, j))
5585
                return 0;
5586
 
5587
        if (!SCI_Control(j, SCI_End))
5588
                return 0;
5589
        if (!SCI_WaitLowSCI(j))
5590
                return 0;
5591
 
5592
        bytes.high = 0x06;
5593
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
5594
        if (!daa_load(&bytes, j))
5595
                return 0;
5596
 
5597
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
5598
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
5599
        if (!daa_load(&bytes, j))
5600
                return 0;
5601
 
5602
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
5603
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
5604
        if (!daa_load(&bytes, j))
5605
                return 0;
5606
 
5607
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
5608
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
5609
        if (!daa_load(&bytes, j))
5610
                return 0;
5611
 
5612
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
5613
        bytes.low = 0x00;
5614
        if (!daa_load(&bytes, j))
5615
                return 0;
5616
 
5617
        if (!SCI_Control(j, SCI_End))
5618
                return 0;
5619
        if (!SCI_WaitLowSCI(j))
5620
                return 0;
5621
 
5622
        bytes.high = 0x07;
5623
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
5624
        if (!daa_load(&bytes, j))
5625
                return 0;
5626
 
5627
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
5628
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
5629
        if (!daa_load(&bytes, j))
5630
                return 0;
5631
 
5632
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
5633
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
5634
        if (!daa_load(&bytes, j))
5635
                return 0;
5636
 
5637
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
5638
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
5639
        if (!daa_load(&bytes, j))
5640
                return 0;
5641
 
5642
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
5643
        bytes.low = 0x00;
5644
        if (!daa_load(&bytes, j))
5645
                return 0;
5646
 
5647
        if (!SCI_Control(j, SCI_End))
5648
                return 0;
5649
        if (!SCI_WaitLowSCI(j))
5650
                return 0;
5651
 
5652
        bytes.high = 0x08;
5653
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
5654
        if (!daa_load(&bytes, j))
5655
                return 0;
5656
 
5657
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
5658
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
5659
        if (!daa_load(&bytes, j))
5660
                return 0;
5661
 
5662
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
5663
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
5664
        if (!daa_load(&bytes, j))
5665
                return 0;
5666
 
5667
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
5668
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
5669
        if (!daa_load(&bytes, j))
5670
                return 0;
5671
 
5672
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
5673
        bytes.low = 0x00;
5674
        if (!daa_load(&bytes, j))
5675
                return 0;
5676
 
5677
        if (!SCI_Control(j, SCI_End))
5678
                return 0;
5679
        if (!SCI_WaitLowSCI(j))
5680
                return 0;
5681
 
5682
        bytes.high = 0x09;
5683
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
5684
        if (!daa_load(&bytes, j))
5685
                return 0;
5686
 
5687
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
5688
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
5689
        if (!daa_load(&bytes, j))
5690
                return 0;
5691
 
5692
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
5693
        bytes.low = 0x00;
5694
        if (!daa_load(&bytes, j))
5695
                return 0;
5696
 
5697
        if (!SCI_Control(j, SCI_End))
5698
                return 0;
5699
        if (!SCI_WaitLowSCI(j))
5700
                return 0;
5701
 
5702
        bytes.high = 0x0A;
5703
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
5704
        if (!daa_load(&bytes, j))
5705
                return 0;
5706
 
5707
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
5708
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
5709
        if (!daa_load(&bytes, j))
5710
                return 0;
5711
 
5712
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
5713
        bytes.low = 0x00;
5714
        if (!daa_load(&bytes, j))
5715
                return 0;
5716
 
5717
        if (!SCI_Control(j, SCI_End))
5718
                return 0;
5719
        if (!SCI_WaitLowSCI(j))
5720
                return 0;
5721
 
5722
        bytes.high = 0x0B;
5723
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
5724
        if (!daa_load(&bytes, j))
5725
                return 0;
5726
 
5727
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
5728
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
5729
        if (!daa_load(&bytes, j))
5730
                return 0;
5731
 
5732
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
5733
        bytes.low = 0x00;
5734
        if (!daa_load(&bytes, j))
5735
                return 0;
5736
 
5737
        if (!SCI_Control(j, SCI_End))
5738
                return 0;
5739
        if (!SCI_WaitLowSCI(j))
5740
                return 0;
5741
 
5742
        bytes.high = 0x0C;
5743
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
5744
        if (!daa_load(&bytes, j))
5745
                return 0;
5746
 
5747
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
5748
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
5749
        if (!daa_load(&bytes, j))
5750
                return 0;
5751
 
5752
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
5753
        bytes.low = 0x00;
5754
        if (!daa_load(&bytes, j))
5755
                return 0;
5756
 
5757
        if (!SCI_Control(j, SCI_End))
5758
                return 0;
5759
        if (!SCI_WaitLowSCI(j))
5760
                return 0;
5761
 
5762
        bytes.high = 0x0D;
5763
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
5764
        if (!daa_load(&bytes, j))
5765
                return 0;
5766
 
5767
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
5768
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
5769
        if (!daa_load(&bytes, j))
5770
                return 0;
5771
 
5772
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
5773
        bytes.low = 0x00;
5774
        if (!daa_load(&bytes, j))
5775
                return 0;
5776
 
5777
        if (!SCI_Control(j, SCI_End))
5778
                return 0;
5779
        if (!SCI_WaitLowSCI(j))
5780
                return 0;
5781
 
5782
        bytes.high = 0x0E;
5783
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
5784
        if (!daa_load(&bytes, j))
5785
                return 0;
5786
 
5787
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
5788
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
5789
        if (!daa_load(&bytes, j))
5790
                return 0;
5791
 
5792
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
5793
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
5794
        if (!daa_load(&bytes, j))
5795
                return 0;
5796
 
5797
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
5798
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
5799
        if (!daa_load(&bytes, j))
5800
                return 0;
5801
 
5802
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
5803
        bytes.low = 0x00;
5804
        if (!daa_load(&bytes, j))
5805
                return 0;
5806
 
5807
        if (!SCI_Control(j, SCI_End))
5808
                return 0;
5809
        if (!SCI_WaitLowSCI(j))
5810
                return 0;
5811
 
5812
        bytes.high = 0x0F;
5813
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
5814
        if (!daa_load(&bytes, j))
5815
                return 0;
5816
 
5817
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
5818
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
5819
        if (!daa_load(&bytes, j))
5820
                return 0;
5821
 
5822
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
5823
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
5824
        if (!daa_load(&bytes, j))
5825
                return 0;
5826
 
5827
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
5828
        bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
5829
        if (!daa_load(&bytes, j))
5830
                return 0;
5831
 
5832
        bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
5833
        bytes.low = 0x00;
5834
        if (!daa_load(&bytes, j))
5835
                return 0;
5836
 
5837
        udelay(32);
5838
        j->pld_scrr.byte = inb_p(j->XILINXbase);
5839
        if (!SCI_Control(j, SCI_End))
5840
                return 0;
5841
 
5842
        outb_p(j->pld_scrw.byte, j->XILINXbase);
5843
 
5844
        if (ixjdebug & 0x0002)
5845
                printk("DAA Coefficients Loaded\n");
5846
 
5847
        j->flags.pstncheck = 0;
5848
        return 1;
5849
}
5850
 
5851
int ixj_set_tone_off(unsigned short arg, IXJ *j)
5852
{
5853
        j->tone_off_time = arg;
5854
        if (ixj_WriteDSPCommand(0x6E05, j))             /* Set Tone Off Period */
5855
 
5856
                return -1;
5857
        if (ixj_WriteDSPCommand(arg, j))
5858
                return -1;
5859
        return 0;
5860
}
5861
 
5862
static int ixj_get_tone_on(IXJ *j)
5863
{
5864
        if (ixj_WriteDSPCommand(0x6E06, j))             /* Get Tone On Period */
5865
 
5866
                return -1;
5867
        return 0;
5868
}
5869
 
5870
static int ixj_get_tone_off(IXJ *j)
5871
{
5872
        if (ixj_WriteDSPCommand(0x6E07, j))             /* Get Tone Off Period */
5873
 
5874
                return -1;
5875
        return 0;
5876
}
5877
 
5878
static void ixj_busytone(IXJ *j)
5879
{
5880
        j->flags.ringback = 0;
5881
        j->flags.dialtone = 0;
5882
        j->flags.busytone = 1;
5883
        ixj_set_tone_on(0x07D0, j);
5884
        ixj_set_tone_off(0x07D0, j);
5885
        ixj_play_tone(j, 27);
5886
}
5887
 
5888
static void ixj_dialtone(IXJ *j)
5889
{
5890
        j->flags.ringback = 0;
5891
        j->flags.dialtone = 1;
5892
        j->flags.busytone = 0;
5893
        if (j->dsp.low == 0x20) {
5894
                return;
5895
        } else {
5896
                ixj_set_tone_on(0xFFFF, j);
5897
                ixj_set_tone_off(0x0000, j);
5898
                ixj_play_tone(j, 25);
5899
        }
5900
}
5901
 
5902
static void ixj_cpt_stop(IXJ *j)
5903
{
5904
        if(j->tone_state || j->tone_cadence_state)
5905
        {
5906
                j->flags.dialtone = 0;
5907
                j->flags.busytone = 0;
5908
                j->flags.ringback = 0;
5909
                ixj_set_tone_on(0x0001, j);
5910
                ixj_set_tone_off(0x0000, j);
5911
                ixj_play_tone(j, 0);
5912
                j->tone_state = j->tone_cadence_state = 0;
5913
                if (j->cadence_t) {
5914
                        if (j->cadence_t->ce) {
5915
                                kfree(j->cadence_t->ce);
5916
                        }
5917
                        kfree(j->cadence_t);
5918
                        j->cadence_t = NULL;
5919
                }
5920
        }
5921
        if (j->play_mode == -1 && j->rec_mode == -1)
5922
                idle(j);
5923
        if (j->play_mode != -1 && j->dsp.low == 0x20)
5924
                ixj_play_start(j);
5925
        if (j->rec_mode != -1 && j->dsp.low == 0x20)
5926
                ixj_record_start(j);
5927
}
5928
 
5929
static void ixj_ringback(IXJ *j)
5930
{
5931
        j->flags.busytone = 0;
5932
        j->flags.dialtone = 0;
5933
        j->flags.ringback = 1;
5934
        ixj_set_tone_on(0x0FA0, j);
5935
        ixj_set_tone_off(0x2EE0, j);
5936
        ixj_play_tone(j, 26);
5937
}
5938
 
5939
static void ixj_testram(IXJ *j)
5940
{
5941
        ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
5942
}
5943
 
5944
static int ixj_build_cadence(IXJ *j, IXJ_CADENCE * cp)
5945
{
5946
        IXJ_CADENCE *lcp;
5947
        IXJ_CADENCE_ELEMENT *lcep;
5948
        IXJ_TONE ti;
5949
 
5950
        lcp = kmalloc(sizeof(IXJ_CADENCE), GFP_KERNEL);
5951
        if (lcp == NULL)
5952
                return -ENOMEM;
5953
        if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_CADENCE)) || (unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT) )
5954
        {
5955
                kfree(lcp);
5956
                return -EFAULT;
5957
        }
5958
        lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
5959
        if (lcep == NULL) {
5960
                kfree(lcp);
5961
                return -ENOMEM;
5962
        }
5963
        if (copy_from_user(lcep, lcp->ce, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
5964
        {
5965
                kfree(lcep);
5966
                kfree(lcp);
5967
                return -EFAULT;
5968
        }
5969
        if (j->cadence_t) {
5970
                kfree(j->cadence_t->ce);
5971
                kfree(j->cadence_t);
5972
        }
5973
        lcp->ce = (void *) lcep;
5974
        j->cadence_t = lcp;
5975
        j->tone_cadence_state = 0;
5976
        ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
5977
        ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
5978
        if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
5979
                ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
5980
                ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
5981
                ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
5982
                ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
5983
                ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
5984
                ixj_init_tone(j, &ti);
5985
        }
5986
        ixj_play_tone(j, lcp->ce[0].index);
5987
        return 1;
5988
}
5989
 
5990
static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE * cp)
5991
{
5992
        IXJ_FILTER_CADENCE *lcp;
5993
        lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
5994
        if (lcp == NULL) {
5995
                if(ixjdebug & 0x0001) {
5996
                        printk(KERN_INFO "Could not allocate memory for cadence\n");
5997
                }
5998
                return -ENOMEM;
5999
        }
6000
        if (copy_from_user(lcp, (char *) cp, sizeof(IXJ_FILTER_CADENCE))) {
6001
                if(ixjdebug & 0x0001) {
6002
                        printk(KERN_INFO "Could not copy cadence to kernel\n");
6003
                }
6004
                kfree(lcp);
6005
                return -EFAULT;
6006
        }
6007
        if (lcp->filter > 5) {
6008
                if(ixjdebug & 0x0001) {
6009
                        printk(KERN_INFO "Cadence out of range\n");
6010
                }
6011
                kfree(lcp);
6012
                return -1;
6013
        }
6014
        j->cadence_f[lcp->filter].state = 0;
6015
        j->cadence_f[lcp->filter].enable = lcp->enable;
6016
        j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
6017
        j->cadence_f[lcp->filter].on1 = lcp->on1;
6018
        j->cadence_f[lcp->filter].on1min = 0;
6019
        j->cadence_f[lcp->filter].on1max = 0;
6020
        j->cadence_f[lcp->filter].off1 = lcp->off1;
6021
        j->cadence_f[lcp->filter].off1min = 0;
6022
        j->cadence_f[lcp->filter].off1max = 0;
6023
        j->cadence_f[lcp->filter].on2 = lcp->on2;
6024
        j->cadence_f[lcp->filter].on2min = 0;
6025
        j->cadence_f[lcp->filter].on2max = 0;
6026
        j->cadence_f[lcp->filter].off2 = lcp->off2;
6027
        j->cadence_f[lcp->filter].off2min = 0;
6028
        j->cadence_f[lcp->filter].off2max = 0;
6029
        j->cadence_f[lcp->filter].on3 = lcp->on3;
6030
        j->cadence_f[lcp->filter].on3min = 0;
6031
        j->cadence_f[lcp->filter].on3max = 0;
6032
        j->cadence_f[lcp->filter].off3 = lcp->off3;
6033
        j->cadence_f[lcp->filter].off3min = 0;
6034
        j->cadence_f[lcp->filter].off3max = 0;
6035
        kfree(lcp);
6036
        if(ixjdebug & 0x0002) {
6037
                printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
6038
        }
6039
        return 0;
6040
}
6041
 
6042
static void add_caps(IXJ *j)
6043
{
6044
        j->caps = 0;
6045
        j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
6046
        strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
6047
        j->caplist[j->caps].captype = vendor;
6048
        j->caplist[j->caps].handle = j->caps++;
6049
        j->caplist[j->caps].captype = device;
6050
        switch (j->cardtype) {
6051
        case QTI_PHONEJACK:
6052
                strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
6053
                break;
6054
        case QTI_LINEJACK:
6055
                strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
6056
                break;
6057
        case QTI_PHONEJACK_LITE:
6058
                strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
6059
                break;
6060
        case QTI_PHONEJACK_PCI:
6061
                strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
6062
                break;
6063
        case QTI_PHONECARD:
6064
                strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
6065
                break;
6066
        }
6067
        j->caplist[j->caps].cap = j->cardtype;
6068
        j->caplist[j->caps].handle = j->caps++;
6069
        strcpy(j->caplist[j->caps].desc, "POTS");
6070
        j->caplist[j->caps].captype = port;
6071
        j->caplist[j->caps].cap = pots;
6072
        j->caplist[j->caps].handle = j->caps++;
6073
 
6074
        /* add devices that can do speaker/mic */
6075
        switch (j->cardtype) {
6076
        case QTI_PHONEJACK:
6077
        case QTI_LINEJACK:
6078
        case QTI_PHONEJACK_PCI:
6079
        case QTI_PHONECARD:
6080
                strcpy(j->caplist[j->caps].desc, "SPEAKER");
6081
                j->caplist[j->caps].captype = port;
6082
                j->caplist[j->caps].cap = speaker;
6083
                j->caplist[j->caps].handle = j->caps++;
6084
        default:
6085
                break;
6086
        }
6087
 
6088
        /* add devices that can do handset */
6089
        switch (j->cardtype) {
6090
        case QTI_PHONEJACK:
6091
                strcpy(j->caplist[j->caps].desc, "HANDSET");
6092
                j->caplist[j->caps].captype = port;
6093
                j->caplist[j->caps].cap = handset;
6094
                j->caplist[j->caps].handle = j->caps++;
6095
                break;
6096
        default:
6097
                break;
6098
        }
6099
 
6100
        /* add devices that can do PSTN */
6101
        switch (j->cardtype) {
6102
        case QTI_LINEJACK:
6103
                strcpy(j->caplist[j->caps].desc, "PSTN");
6104
                j->caplist[j->caps].captype = port;
6105
                j->caplist[j->caps].cap = pstn;
6106
                j->caplist[j->caps].handle = j->caps++;
6107
                break;
6108
        default:
6109
                break;
6110
        }
6111
 
6112
        /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
6113
        strcpy(j->caplist[j->caps].desc, "ULAW");
6114
        j->caplist[j->caps].captype = codec;
6115
        j->caplist[j->caps].cap = ULAW;
6116
        j->caplist[j->caps].handle = j->caps++;
6117
 
6118
        strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
6119
        j->caplist[j->caps].captype = codec;
6120
        j->caplist[j->caps].cap = LINEAR16;
6121
        j->caplist[j->caps].handle = j->caps++;
6122
 
6123
        strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
6124
        j->caplist[j->caps].captype = codec;
6125
        j->caplist[j->caps].cap = LINEAR8;
6126
        j->caplist[j->caps].handle = j->caps++;
6127
 
6128
        strcpy(j->caplist[j->caps].desc, "Windows Sound System");
6129
        j->caplist[j->caps].captype = codec;
6130
        j->caplist[j->caps].cap = WSS;
6131
        j->caplist[j->caps].handle = j->caps++;
6132
 
6133
        /* software ALAW codec, made from ULAW */
6134
        strcpy(j->caplist[j->caps].desc, "ALAW");
6135
        j->caplist[j->caps].captype = codec;
6136
        j->caplist[j->caps].cap = ALAW;
6137
        j->caplist[j->caps].handle = j->caps++;
6138
 
6139
        /* version 12 of the 8020 does the following codecs in a broken way */
6140
        if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
6141
                strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
6142
                j->caplist[j->caps].captype = codec;
6143
                j->caplist[j->caps].cap = G723_63;
6144
                j->caplist[j->caps].handle = j->caps++;
6145
 
6146
                strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
6147
                j->caplist[j->caps].captype = codec;
6148
                j->caplist[j->caps].cap = G723_53;
6149
                j->caplist[j->caps].handle = j->caps++;
6150
 
6151
                strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
6152
                j->caplist[j->caps].captype = codec;
6153
                j->caplist[j->caps].cap = TS48;
6154
                j->caplist[j->caps].handle = j->caps++;
6155
 
6156
                strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
6157
                j->caplist[j->caps].captype = codec;
6158
                j->caplist[j->caps].cap = TS41;
6159
                j->caplist[j->caps].handle = j->caps++;
6160
        }
6161
 
6162
        /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6163
        if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
6164
                strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
6165
                j->caplist[j->caps].captype = codec;
6166
                j->caplist[j->caps].cap = TS85;
6167
                j->caplist[j->caps].handle = j->caps++;
6168
        }
6169
 
6170
        /* 8021 chips can do G728 */
6171
        if (j->dsp.low == 0x21) {
6172
                strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
6173
                j->caplist[j->caps].captype = codec;
6174
                j->caplist[j->caps].cap = G728;
6175
                j->caplist[j->caps].handle = j->caps++;
6176
        }
6177
 
6178
        /* 8021/8022 chips can do G729 if loaded */
6179
        if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6180
                strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
6181
                j->caplist[j->caps].captype = codec;
6182
                j->caplist[j->caps].cap = G729;
6183
                j->caplist[j->caps].handle = j->caps++;
6184
        }
6185
        if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6186
                strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
6187
                j->caplist[j->caps].captype = codec;
6188
                j->caplist[j->caps].cap = G729B;
6189
                j->caplist[j->caps].handle = j->caps++;
6190
        }
6191
}
6192
 
6193
static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
6194
{
6195
        int cnt;
6196
        int retval = 0;
6197
        for (cnt = 0; cnt < j->caps; cnt++) {
6198
                if (pcreq->captype == j->caplist[cnt].captype
6199
                    && pcreq->cap == j->caplist[cnt].cap) {
6200
                        retval = 1;
6201
                        break;
6202
                }
6203
        }
6204
        return retval;
6205
}
6206
 
6207
static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
6208
{
6209
        IXJ_TONE ti;
6210
        IXJ_FILTER jf;
6211
        IXJ_FILTER_RAW jfr;
6212
 
6213
        unsigned int raise, mant;
6214
        unsigned int minor = MINOR(inode->i_rdev);
6215
        int board = NUM(inode->i_rdev);
6216
 
6217
        IXJ *j = get_ixj(NUM(inode->i_rdev));
6218
 
6219
        int retval = 0;
6220
 
6221
        /*
6222
         *    Set up locks to ensure that only one process is talking to the DSP at a time.
6223
         *    This is necessary to keep the DSP from locking up.
6224
         */
6225
        while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
6226
                set_current_state(TASK_INTERRUPTIBLE);
6227
                schedule_timeout(1);
6228
        }
6229
        if (ixjdebug & 0x0040)
6230
                printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6231
        if (minor >= IXJMAX) {
6232
                clear_bit(board, &j->busyflags);
6233
                return -ENODEV;
6234
        }
6235
        /*
6236
         *    Check ioctls only root can use.
6237
         */
6238
        if (!capable(CAP_SYS_ADMIN)) {
6239
                switch (cmd) {
6240
                case IXJCTL_TESTRAM:
6241
                case IXJCTL_HZ:
6242
                        retval = -EPERM;
6243
                }
6244
        }
6245
        switch (cmd) {
6246
        case IXJCTL_TESTRAM:
6247
                ixj_testram(j);
6248
                retval = (j->ssr.high << 8) + j->ssr.low;
6249
                break;
6250
        case IXJCTL_CARDTYPE:
6251
                retval = j->cardtype;
6252
                break;
6253
        case IXJCTL_SERIAL:
6254
                retval = j->serial;
6255
                break;
6256
        case IXJCTL_VERSION:
6257
                if (copy_to_user((char *) arg, ixj_c_revision, strlen(ixj_c_revision)))
6258
                        retval = -EFAULT;
6259
                break;
6260
        case PHONE_RING_CADENCE:
6261
                j->ring_cadence = arg;
6262
                break;
6263
        case IXJCTL_CIDCW:
6264
                if(arg) {
6265
                        copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID));
6266
                }
6267
                else {
6268
                        memset(&j->cid_send, 0, sizeof(PHONE_CID));
6269
                }
6270
                ixj_write_cidcw(j);
6271
                break;
6272
        /* Binary compatbility */
6273
        case OLD_PHONE_RING_START:
6274
                arg = 0;
6275
                /* Fall through */
6276
        case PHONE_RING_START:
6277
                if(arg) {
6278
                        if(copy_from_user(&j->cid_send, (char *)arg, sizeof(PHONE_CID)))
6279
                        {
6280
                                retval = -EFAULT;
6281
                                break;
6282
                        }
6283
                        ixj_write_cid(j);
6284
                }
6285
                else {
6286
                        memset(&j->cid_send, 0, sizeof(PHONE_CID));
6287
                }
6288
                ixj_ring_start(j);
6289
                break;
6290
        case PHONE_RING_STOP:
6291
                j->flags.cringing = 0;
6292
                if(j->cadence_f[5].enable) {
6293
                        j->cadence_f[5].state = 0;
6294
                }
6295
                ixj_ring_off(j);
6296
                break;
6297
        case PHONE_RING:
6298
                retval = ixj_ring(j);
6299
                break;
6300
        case PHONE_EXCEPTION:
6301
                retval = j->ex.bytes;
6302
                if(j->ex.bits.flash) {
6303
                        j->flash_end = 0;
6304
                        j->ex.bits.flash = 0;
6305
                }
6306
                j->ex.bits.pstn_ring = 0;
6307
                j->ex.bits.caller_id = 0;
6308
                j->ex.bits.pstn_wink = 0;
6309
                j->ex.bits.f0 = 0;
6310
                j->ex.bits.f1 = 0;
6311
                j->ex.bits.f2 = 0;
6312
                j->ex.bits.f3 = 0;
6313
                j->ex.bits.fc0 = 0;
6314
                j->ex.bits.fc1 = 0;
6315
                j->ex.bits.fc2 = 0;
6316
                j->ex.bits.fc3 = 0;
6317
                j->ex.bits.reserved = 0;
6318
                break;
6319
        case PHONE_HOOKSTATE:
6320
                j->ex.bits.hookstate = 0;
6321
                retval = j->hookstate;  //j->r_hook;
6322
                break;
6323
        case IXJCTL_SET_LED:
6324
                LED_SetState(arg, j);
6325
                break;
6326
        case PHONE_FRAME:
6327
                retval = set_base_frame(j, arg);
6328
                break;
6329
        case PHONE_REC_CODEC:
6330
                retval = set_rec_codec(j, arg);
6331
                break;
6332
        case PHONE_VAD:
6333
                ixj_vad(j, arg);
6334
                break;
6335
        case PHONE_REC_START:
6336
                ixj_record_start(j);
6337
                break;
6338
        case PHONE_REC_STOP:
6339
                ixj_record_stop(j);
6340
                break;
6341
        case PHONE_REC_DEPTH:
6342
                set_rec_depth(j, arg);
6343
                break;
6344
        case PHONE_REC_VOLUME:
6345
                if(arg == -1) {
6346
                        retval = get_rec_volume(j);
6347
                }
6348
                else {
6349
                        set_rec_volume(j, arg);
6350
                        retval = arg;
6351
                }
6352
                break;
6353
        case PHONE_REC_VOLUME_LINEAR:
6354
                if(arg == -1) {
6355
                        retval = get_rec_volume_linear(j);
6356
                }
6357
                else {
6358
                        set_rec_volume_linear(j, arg);
6359
                        retval = arg;
6360
                }
6361
                break;
6362
        case IXJCTL_DTMF_PRESCALE:
6363
                if(arg == -1) {
6364
                        retval = get_dtmf_prescale(j);
6365
                }
6366
                else {
6367
                        set_dtmf_prescale(j, arg);
6368
                        retval = arg;
6369
                }
6370
                break;
6371
        case PHONE_REC_LEVEL:
6372
                retval = get_rec_level(j);
6373
                break;
6374
        case IXJCTL_SC_RXG:
6375
                retval = ixj_siadc(j, arg);
6376
                break;
6377
        case IXJCTL_SC_TXG:
6378
                retval = ixj_sidac(j, arg);
6379
                break;
6380
        case IXJCTL_AEC_START:
6381
                ixj_aec_start(j, arg);
6382
                break;
6383
        case IXJCTL_AEC_STOP:
6384
                aec_stop(j);
6385
                break;
6386
        case IXJCTL_AEC_GET_LEVEL:
6387
                retval = j->aec_level;
6388
                break;
6389
        case PHONE_PLAY_CODEC:
6390
                retval = set_play_codec(j, arg);
6391
                break;
6392
        case PHONE_PLAY_START:
6393
                retval = ixj_play_start(j);
6394
                break;
6395
        case PHONE_PLAY_STOP:
6396
                ixj_play_stop(j);
6397
                break;
6398
        case PHONE_PLAY_DEPTH:
6399
                set_play_depth(j, arg);
6400
                break;
6401
        case PHONE_PLAY_VOLUME:
6402
                if(arg == -1) {
6403
                        retval = get_play_volume(j);
6404
                }
6405
                else {
6406
                        set_play_volume(j, arg);
6407
                        retval = arg;
6408
                }
6409
                break;
6410
        case PHONE_PLAY_VOLUME_LINEAR:
6411
                if(arg == -1) {
6412
                        retval = get_play_volume_linear(j);
6413
                }
6414
                else {
6415
                        set_play_volume_linear(j, arg);
6416
                        retval = arg;
6417
                }
6418
                break;
6419
        case PHONE_PLAY_LEVEL:
6420
                retval = get_play_level(j);
6421
                break;
6422
        case IXJCTL_DSP_TYPE:
6423
                retval = (j->dsp.high << 8) + j->dsp.low;
6424
                break;
6425
        case IXJCTL_DSP_VERSION:
6426
                retval = (j->ver.high << 8) + j->ver.low;
6427
                break;
6428
        case IXJCTL_HZ:
6429
                hertz = arg;
6430
                break;
6431
        case IXJCTL_RATE:
6432
                if (arg > hertz)
6433
                        retval = -1;
6434
                else
6435
                        samplerate = arg;
6436
                break;
6437
        case IXJCTL_DRYBUFFER_READ:
6438
                put_user(j->drybuffer, (unsigned long *) arg);
6439
                break;
6440
        case IXJCTL_DRYBUFFER_CLEAR:
6441
                j->drybuffer = 0;
6442
                break;
6443
        case IXJCTL_FRAMES_READ:
6444
                put_user(j->framesread, (unsigned long *) arg);
6445
                break;
6446
        case IXJCTL_FRAMES_WRITTEN:
6447
                put_user(j->frameswritten, (unsigned long *) arg);
6448
                break;
6449
        case IXJCTL_READ_WAIT:
6450
                put_user(j->read_wait, (unsigned long *) arg);
6451
                break;
6452
        case IXJCTL_WRITE_WAIT:
6453
                put_user(j->write_wait, (unsigned long *) arg);
6454
                break;
6455
        case PHONE_MAXRINGS:
6456
                j->maxrings = arg;
6457
                break;
6458
        case PHONE_SET_TONE_ON_TIME:
6459
                ixj_set_tone_on(arg, j);
6460
                break;
6461
        case PHONE_SET_TONE_OFF_TIME:
6462
                ixj_set_tone_off(arg, j);
6463
                break;
6464
        case PHONE_GET_TONE_ON_TIME:
6465
                if (ixj_get_tone_on(j)) {
6466
                        retval = -1;
6467
                } else {
6468
                        retval = (j->ssr.high << 8) + j->ssr.low;
6469
                }
6470
                break;
6471
        case PHONE_GET_TONE_OFF_TIME:
6472
                if (ixj_get_tone_off(j)) {
6473
                        retval = -1;
6474
                } else {
6475
                        retval = (j->ssr.high << 8) + j->ssr.low;
6476
                }
6477
                break;
6478
        case PHONE_PLAY_TONE:
6479
                if (!j->tone_state)
6480
                        retval = ixj_play_tone(j, arg);
6481
                else
6482
                        retval = -1;
6483
                break;
6484
        case PHONE_GET_TONE_STATE:
6485
                retval = j->tone_state;
6486
                break;
6487
        case PHONE_DTMF_READY:
6488
                retval = j->ex.bits.dtmf_ready;
6489
                break;
6490
        case PHONE_GET_DTMF:
6491
                if (ixj_hookstate(j)) {
6492
                        if (j->dtmf_rp != j->dtmf_wp) {
6493
                                retval = j->dtmfbuffer[j->dtmf_rp];
6494
                                j->dtmf_rp++;
6495
                                if (j->dtmf_rp == 79)
6496
                                        j->dtmf_rp = 0;
6497
                                if (j->dtmf_rp == j->dtmf_wp) {
6498
                                        j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6499
                                }
6500
                        }
6501
                }
6502
                break;
6503
        case PHONE_GET_DTMF_ASCII:
6504
                if (ixj_hookstate(j)) {
6505
                        if (j->dtmf_rp != j->dtmf_wp) {
6506
                                switch (j->dtmfbuffer[j->dtmf_rp]) {
6507
                                case 10:
6508
                                        retval = 42;    /* '*'; */
6509
 
6510
                                        break;
6511
                                case 11:
6512
                                        retval = 48;    /*'0'; */
6513
 
6514
                                        break;
6515
                                case 12:
6516
                                        retval = 35;    /*'#'; */
6517
 
6518
                                        break;
6519
                                case 28:
6520
                                        retval = 65;    /*'A'; */
6521
 
6522
                                        break;
6523
                                case 29:
6524
                                        retval = 66;    /*'B'; */
6525
 
6526
                                        break;
6527
                                case 30:
6528
                                        retval = 67;    /*'C'; */
6529
 
6530
                                        break;
6531
                                case 31:
6532
                                        retval = 68;    /*'D'; */
6533
 
6534
                                        break;
6535
                                default:
6536
                                        retval = 48 + j->dtmfbuffer[j->dtmf_rp];
6537
                                        break;
6538
                                }
6539
                                j->dtmf_rp++;
6540
                                if (j->dtmf_rp == 79)
6541
                                        j->dtmf_rp = 0;
6542
                                if(j->dtmf_rp == j->dtmf_wp)
6543
                                {
6544
                                        j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6545
                                }
6546
                        }
6547
                }
6548
                break;
6549
        case PHONE_DTMF_OOB:
6550
                j->flags.dtmf_oob = arg;
6551
                break;
6552
        case PHONE_DIALTONE:
6553
                ixj_dialtone(j);
6554
                break;
6555
        case PHONE_BUSY:
6556
                ixj_busytone(j);
6557
                break;
6558
        case PHONE_RINGBACK:
6559
                ixj_ringback(j);
6560
                break;
6561
        case PHONE_WINK:
6562
                if(j->cardtype == QTI_PHONEJACK)
6563
                        retval = -1;
6564
                else
6565
                        retval = ixj_wink(j);
6566
                break;
6567
        case PHONE_CPT_STOP:
6568
                ixj_cpt_stop(j);
6569
                break;
6570
        case PHONE_QUERY_CODEC:
6571
        {
6572
                struct phone_codec_data pd;
6573
                int val;
6574
                int proto_size[] = {
6575
                        -1,
6576
                        12, 10, 16, 9, 8, 48, 5,
6577
                        40, 40, 80, 40, 40, 6
6578
                };
6579
                if(copy_from_user(&pd, (void *)arg, sizeof(pd))) {
6580
                        retval = -EFAULT;
6581
                        break;
6582
                }
6583
                if(pd.type<1 || pd.type>13) {
6584
                        retval = -EPROTONOSUPPORT;
6585
                        break;
6586
                }
6587
                if(pd.type<G729)
6588
                        val=proto_size[pd.type];
6589
                else switch(j->baseframe.low)
6590
                {
6591
                        case 0xA0:val=2*proto_size[pd.type];break;
6592
                        case 0x50:val=proto_size[pd.type];break;
6593
                        default:val=proto_size[pd.type]*3;break;
6594
                }
6595
                pd.buf_min=pd.buf_max=pd.buf_opt=val;
6596
                if(copy_to_user((void *)arg, &pd, sizeof(pd)))
6597
                        retval = -EFAULT;
6598
                break;
6599
        }
6600
        case IXJCTL_DSP_IDLE:
6601
                idle(j);
6602
                break;
6603
        case IXJCTL_MIXER:
6604
                if ((arg & 0xff) == 0xff)
6605
                        retval = ixj_get_mixer(arg, j);
6606
                else
6607
                        ixj_mixer(arg, j);
6608
                break;
6609
        case IXJCTL_DAA_COEFF_SET:
6610
                switch (arg) {
6611
                case DAA_US:
6612
                        DAA_Coeff_US(j);
6613
                        retval = ixj_daa_write(j);
6614
                        break;
6615
                case DAA_UK:
6616
                        DAA_Coeff_UK(j);
6617
                        retval = ixj_daa_write(j);
6618
                        break;
6619
                case DAA_FRANCE:
6620
                        DAA_Coeff_France(j);
6621
                        retval = ixj_daa_write(j);
6622
                        break;
6623
                case DAA_GERMANY:
6624
                        DAA_Coeff_Germany(j);
6625
                        retval = ixj_daa_write(j);
6626
                        break;
6627
                case DAA_AUSTRALIA:
6628
                        DAA_Coeff_Australia(j);
6629
                        retval = ixj_daa_write(j);
6630
                        break;
6631
                case DAA_JAPAN:
6632
                        DAA_Coeff_Japan(j);
6633
                        retval = ixj_daa_write(j);
6634
                        break;
6635
                default:
6636
                        retval = 1;
6637
                        break;
6638
                }
6639
                break;
6640
        case IXJCTL_DAA_AGAIN:
6641
                ixj_daa_cr4(j, arg | 0x02);
6642
                break;
6643
        case IXJCTL_PSTN_LINETEST:
6644
                retval = ixj_linetest(j);
6645
                break;
6646
        case IXJCTL_VMWI:
6647
                ixj_write_vmwi(j, arg);
6648
                break;
6649
        case IXJCTL_CID:
6650
                if (copy_to_user((char *) arg, &j->cid, sizeof(PHONE_CID)))
6651
                        retval = -EFAULT;
6652
                j->ex.bits.caller_id = 0;
6653
                break;
6654
        case IXJCTL_WINK_DURATION:
6655
                j->winktime = arg;
6656
                break;
6657
        case IXJCTL_PORT:
6658
                if (arg)
6659
                        retval = ixj_set_port(j, arg);
6660
                else
6661
                        retval = j->port;
6662
                break;
6663
        case IXJCTL_POTS_PSTN:
6664
                retval = ixj_set_pots(j, arg);
6665
                break;
6666
        case PHONE_CAPABILITIES:
6667
                add_caps(j);
6668
                retval = j->caps;
6669
                break;
6670
        case PHONE_CAPABILITIES_LIST:
6671
                add_caps(j);
6672
                if (copy_to_user((char *) arg, j->caplist, sizeof(struct phone_capability) * j->caps))
6673
                        retval = -EFAULT;
6674
                break;
6675
        case PHONE_CAPABILITIES_CHECK:
6676
                {
6677
                        struct phone_capability cap;
6678
                        if (copy_from_user(&cap, (char *) arg, sizeof(cap)))
6679
                                retval = -EFAULT;
6680
                        else {
6681
                                add_caps(j);
6682
                                retval = capabilities_check(j, &cap);
6683
                        }
6684
                }
6685
                break;
6686
        case PHONE_PSTN_SET_STATE:
6687
                daa_set_mode(j, arg);
6688
                break;
6689
        case PHONE_PSTN_GET_STATE:
6690
                retval = j->daa_mode;
6691
                j->ex.bits.pstn_ring = 0;
6692
                break;
6693
        case IXJCTL_SET_FILTER:
6694
                if (copy_from_user(&jf, (char *) arg, sizeof(jf)))
6695
                        retval = -EFAULT;
6696
                retval = ixj_init_filter(j, &jf);
6697
                break;
6698
        case IXJCTL_SET_FILTER_RAW:
6699
                if (copy_from_user(&jfr, (char *) arg, sizeof(jfr)))
6700
                        retval = -EFAULT;
6701
                retval = ixj_init_filter_raw(j, &jfr);
6702
                break;
6703
        case IXJCTL_GET_FILTER_HIST:
6704
                if(arg<0||arg>3)
6705
                        retval = -EINVAL;
6706
                else
6707
                        retval = j->filter_hist[arg];
6708
                break;
6709
        case IXJCTL_INIT_TONE:
6710
                copy_from_user(&ti, (char *) arg, sizeof(ti));
6711
                retval = ixj_init_tone(j, &ti);
6712
                break;
6713
        case IXJCTL_TONE_CADENCE:
6714
                retval = ixj_build_cadence(j, (IXJ_CADENCE *) arg);
6715
                break;
6716
        case IXJCTL_FILTER_CADENCE:
6717
                retval = ixj_build_filter_cadence(j, (IXJ_FILTER_CADENCE *) arg);
6718
                break;
6719
        case IXJCTL_SIGCTL:
6720
                if (copy_from_user(&j->sigdef, (char *)arg, sizeof(IXJ_SIGDEF)))
6721
                        retval = -EFAULT;
6722
                j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
6723
                if(j->sigdef.event < 33) {
6724
                        raise = 1;
6725
                        for(mant = 0; mant < j->sigdef.event; mant++){
6726
                                raise *= 2;
6727
                        }
6728
                        if(j->sigdef.signal)
6729
                                j->ex_sig.bytes |= raise;
6730
                        else
6731
                                j->ex_sig.bytes &= (raise^0xffff);
6732
                }
6733
                break;
6734
        case IXJCTL_INTERCOM_STOP:
6735
                if(arg < 0 || arg >= IXJMAX)
6736
                        return -EINVAL;
6737
                j->intercom = -1;
6738
                ixj_record_stop(j);
6739
                ixj_play_stop(j);
6740
                idle(j);
6741
                get_ixj(arg)->intercom = -1;
6742
                ixj_record_stop(get_ixj(arg));
6743
                ixj_play_stop(get_ixj(arg));
6744
                idle(get_ixj(arg));
6745
                break;
6746
        case IXJCTL_INTERCOM_START:
6747
                if(arg < 0 || arg >= IXJMAX)
6748
                        return -EINVAL;
6749
                j->intercom = arg;
6750
                ixj_record_start(j);
6751
                ixj_play_start(j);
6752
                get_ixj(arg)->intercom = board;
6753
                ixj_play_start(get_ixj(arg));
6754
                ixj_record_start(get_ixj(arg));
6755
                break;
6756
        }
6757
        if (ixjdebug & 0x0040)
6758
                printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6759
        clear_bit(board, &j->busyflags);
6760
        return retval;
6761
}
6762
 
6763
static int ixj_fasync(int fd, struct file *file_p, int mode)
6764
{
6765
        IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode->i_rdev));
6766
 
6767
        return fasync_helper(fd, file_p, mode, &j->async_queue);
6768
}
6769
 
6770
struct file_operations ixj_fops =
6771
{
6772
        owner:          THIS_MODULE,
6773
        read:           ixj_enhanced_read,
6774
        write:          ixj_enhanced_write,
6775
        poll:           ixj_poll,
6776
        ioctl:          ixj_ioctl,
6777
        release:        ixj_release,
6778
        fasync:         ixj_fasync
6779
};
6780
 
6781
static int ixj_linetest(IXJ *j)
6782
{
6783
        unsigned long jifwait;
6784
 
6785
        j->flags.pstncheck = 1; /* Testing */
6786
        j->flags.pstn_present = 0; /* Assume the line is not there */
6787
 
6788
        daa_int_read(j);        /*Clear DAA Interrupt flags */
6789
        /* */
6790
        /* Hold all relays in the normally de-energized position. */
6791
        /* */
6792
 
6793
        j->pld_slicw.bits.rly1 = 0;
6794
        j->pld_slicw.bits.rly2 = 0;
6795
        j->pld_slicw.bits.rly3 = 0;
6796
        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6797
        j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6798
 
6799
        outb_p(j->pld_scrw.byte, j->XILINXbase);
6800
        j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6801
        if (j->pld_slicr.bits.potspstn) {
6802
                j->flags.pots_pstn = 1;
6803
                j->flags.pots_correct = 0;
6804
                LED_SetState(0x4, j);
6805
        } else {
6806
                j->flags.pots_pstn = 0;
6807
                j->pld_slicw.bits.rly1 = 0;
6808
                j->pld_slicw.bits.rly2 = 0;
6809
                j->pld_slicw.bits.rly3 = 1;
6810
                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6811
                j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6812
 
6813
                outb_p(j->pld_scrw.byte, j->XILINXbase);
6814
                daa_set_mode(j, SOP_PU_CONVERSATION);
6815
                jifwait = jiffies + hertz;
6816
                while (time_before(jiffies, jifwait)) {
6817
                        set_current_state(TASK_INTERRUPTIBLE);
6818
                        schedule_timeout(1);
6819
                }
6820
                daa_int_read(j);
6821
                daa_set_mode(j, SOP_PU_RESET);
6822
                if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6823
                        j->flags.pots_correct = 0;       /* Should not be line voltage on POTS port. */
6824
                        LED_SetState(0x4, j);
6825
                        j->pld_slicw.bits.rly3 = 0;
6826
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6827
                } else {
6828
                        j->flags.pots_correct = 1;
6829
                        LED_SetState(0x8, j);
6830
                        j->pld_slicw.bits.rly1 = 1;
6831
                        j->pld_slicw.bits.rly2 = 0;
6832
                        j->pld_slicw.bits.rly3 = 0;
6833
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6834
                }
6835
        }
6836
        j->pld_slicw.bits.rly3 = 0;
6837
        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6838
        daa_set_mode(j, SOP_PU_CONVERSATION);
6839
        jifwait = jiffies + hertz;
6840
        while (time_before(jiffies, jifwait)) {
6841
                set_current_state(TASK_INTERRUPTIBLE);
6842
                schedule_timeout(1);
6843
        }
6844
        daa_int_read(j);
6845
        daa_set_mode(j, SOP_PU_RESET);
6846
        if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6847
                j->pstn_sleeptil = jiffies + (hertz / 4);
6848
                j->flags.pstn_present = 1;
6849
        } else {
6850
                j->flags.pstn_present = 0;
6851
        }
6852
        if (j->flags.pstn_present) {
6853
                if (j->flags.pots_correct) {
6854
                        LED_SetState(0xA, j);
6855
                } else {
6856
                        LED_SetState(0x6, j);
6857
                }
6858
        } else {
6859
                if (j->flags.pots_correct) {
6860
                        LED_SetState(0x9, j);
6861
                } else {
6862
                        LED_SetState(0x5, j);
6863
                }
6864
        }
6865
        j->flags.pstncheck = 0;  /* Testing */
6866
        return j->flags.pstn_present;
6867
}
6868
 
6869
static int ixj_selfprobe(IXJ *j)
6870
{
6871
        unsigned short cmd;
6872
        unsigned long jif;
6873
        int cnt;
6874
        BYTES bytes;
6875
 
6876
        init_waitqueue_head(&j->poll_q);
6877
        init_waitqueue_head(&j->read_q);
6878
        init_waitqueue_head(&j->write_q);
6879
 
6880
        while(atomic_read(&j->DSPWrite) > 0)
6881
                atomic_dec(&j->DSPWrite);
6882
        if (ixjdebug & 0x0002)
6883
                printk(KERN_INFO "Write IDLE to Software Control Register\n");
6884
        ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
6885
 
6886
        if (ixj_WriteDSPCommand(0x0000, j))             /* Write IDLE to Software Control Register */
6887
                return -1;
6888
/* The read values of the SSR should be 0x00 for the IDLE command */
6889
        if (j->ssr.low || j->ssr.high)
6890
                return -1;
6891
        if (ixjdebug & 0x0002)
6892
                printk(KERN_INFO "Get Device ID Code\n");
6893
        if (ixj_WriteDSPCommand(0x3400, j))             /* Get Device ID Code */
6894
                return -1;
6895
        j->dsp.low = j->ssr.low;
6896
        j->dsp.high = j->ssr.high;
6897
        if (ixjdebug & 0x0002)
6898
                printk(KERN_INFO "Get Device Version Code\n");
6899
        if (ixj_WriteDSPCommand(0x3800, j))             /* Get Device Version Code */
6900
                return -1;
6901
        j->ver.low = j->ssr.low;
6902
        j->ver.high = j->ssr.high;
6903
        if (!j->cardtype) {
6904
                if (j->dsp.low == 0x21) {
6905
                        bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
6906
                        outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
6907
/* Test for Internet LineJACK or Internet PhoneJACK Lite */
6908
                        bytes.low = inb_p(j->XILINXbase + 0x02);
6909
                        if (bytes.low == bytes.high)    /*  Register is read only on */
6910
                                /*  Internet PhoneJack Lite */
6911
                         {
6912
                                j->cardtype = QTI_PHONEJACK_LITE;
6913
                                if (check_region(j->XILINXbase, 4)) {
6914
                                        printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6915
                                        return -1;
6916
                                }
6917
                                request_region(j->XILINXbase, 4, "ixj control");
6918
                                j->pld_slicw.pcib.e1 = 1;
6919
                                outb_p(j->pld_slicw.byte, j->XILINXbase);
6920
                        } else {
6921
                                j->cardtype = QTI_LINEJACK;
6922
 
6923
                                if (check_region(j->XILINXbase, 8)) {
6924
                                        printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6925
                                        return -1;
6926
                                }
6927
                                request_region(j->XILINXbase, 8, "ixj control");
6928
                        }
6929
                } else if (j->dsp.low == 0x22) {
6930
                        j->cardtype = QTI_PHONEJACK_PCI;
6931
                        request_region(j->XILINXbase, 4, "ixj control");
6932
                        j->pld_slicw.pcib.e1 = 1;
6933
                        outb_p(j->pld_slicw.byte, j->XILINXbase);
6934
                } else
6935
                        j->cardtype = QTI_PHONEJACK;
6936
        } else {
6937
                switch (j->cardtype) {
6938
                case QTI_PHONEJACK:
6939
                        if (!j->dsp.low != 0x20) {
6940
                                j->dsp.high = 0x80;
6941
                                j->dsp.low = 0x20;
6942
                                ixj_WriteDSPCommand(0x3800, j);
6943
                                j->ver.low = j->ssr.low;
6944
                                j->ver.high = j->ssr.high;
6945
                        }
6946
                        break;
6947
                case QTI_LINEJACK:
6948
                        if (check_region(j->XILINXbase, 8)) {
6949
                                printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6950
                                return -1;
6951
                        }
6952
                        request_region(j->XILINXbase, 8, "ixj control");
6953
                        break;
6954
                case QTI_PHONEJACK_LITE:
6955
                case QTI_PHONEJACK_PCI:
6956
                        if (check_region(j->XILINXbase, 4)) {
6957
                                printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6958
                                return -1;
6959
                        }
6960
                        request_region(j->XILINXbase, 4, "ixj control");
6961
                        j->pld_slicw.pcib.e1 = 1;
6962
                        outb_p(j->pld_slicw.byte, j->XILINXbase);
6963
                        break;
6964
                case QTI_PHONECARD:
6965
                        break;
6966
                }
6967
        }
6968
        if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
6969
                if (ixjdebug & 0x0002)
6970
                        printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6971
                if (ixj_WriteDSPCommand(0xC462, j))             /* Write CODEC config to Software Control Register */
6972
                        return -1;
6973
                if (ixjdebug & 0x0002)
6974
                        printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
6975
                if (j->cardtype == QTI_PHONEJACK) {
6976
                        cmd = 0x9FF2;
6977
                } else {
6978
                        cmd = 0x9FF5;
6979
                }
6980
                if (ixj_WriteDSPCommand(cmd, j))        /* Write CODEC timing to Software Control Register */
6981
                        return -1;
6982
        } else {
6983
                if (set_base_frame(j, 30) != 30)
6984
                        return -1;
6985
                if (ixjdebug & 0x0002)
6986
                        printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6987
                if (j->cardtype == QTI_PHONECARD) {
6988
                        if (ixj_WriteDSPCommand(0xC528, j))             /* Write CODEC config to Software Control Register */
6989
                                return -1;
6990
                }
6991
                if (j->cardtype == QTI_LINEJACK) {
6992
                        if (ixj_WriteDSPCommand(0xC528, j))             /* Write CODEC config to Software Control Register */
6993
                                return -1;
6994
                        if (ixjdebug & 0x0002)
6995
                                printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
6996
                        j->pld_clock.byte = 0;
6997
                        outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
6998
                }
6999
        }
7000
 
7001
        if (j->dsp.low == 0x20) {
7002
                if (ixjdebug & 0x0002)
7003
                        printk(KERN_INFO "Configure GPIO pins\n");
7004
                j->gpio.bytes.high = 0x09;
7005
/*  bytes.low = 0xEF;  0xF7 */
7006
                j->gpio.bits.gpio1 = 1;
7007
                j->gpio.bits.gpio2 = 1;
7008
                j->gpio.bits.gpio3 = 0;
7009
                j->gpio.bits.gpio4 = 1;
7010
                j->gpio.bits.gpio5 = 1;
7011
                j->gpio.bits.gpio6 = 1;
7012
                j->gpio.bits.gpio7 = 1;
7013
                ixj_WriteDSPCommand(j->gpio.word, j);   /* Set GPIO pin directions */
7014
                if (ixjdebug & 0x0002)
7015
                        printk(KERN_INFO "Enable SLIC\n");
7016
                j->gpio.bytes.high = 0x0B;
7017
                j->gpio.bytes.low = 0x00;
7018
                j->gpio.bits.gpio1 = 0;
7019
                j->gpio.bits.gpio2 = 1;
7020
                j->gpio.bits.gpio5 = 0;
7021
                ixj_WriteDSPCommand(j->gpio.word, j);   /* send the ring stop signal */
7022
                j->port = PORT_POTS;
7023
        } else {
7024
                if (j->cardtype == QTI_LINEJACK) {
7025
                        LED_SetState(0x1, j);
7026
                        jif = jiffies + (hertz / 10);
7027
                        while (time_before(jiffies, jif)) {
7028
                                set_current_state(TASK_INTERRUPTIBLE);
7029
                                schedule_timeout(1);
7030
                        }
7031
                        LED_SetState(0x2, j);
7032
                        jif = jiffies + (hertz / 10);
7033
                        while (time_before(jiffies, jif)) {
7034
                                set_current_state(TASK_INTERRUPTIBLE);
7035
                                schedule_timeout(1);
7036
                        }
7037
                        LED_SetState(0x4, j);
7038
                        jif = jiffies + (hertz / 10);
7039
                        while (time_before(jiffies, jif)) {
7040
                                set_current_state(TASK_INTERRUPTIBLE);
7041
                                schedule_timeout(1);
7042
                        }
7043
                        LED_SetState(0x8, j);
7044
                        jif = jiffies + (hertz / 10);
7045
                        while (time_before(jiffies, jif)) {
7046
                                set_current_state(TASK_INTERRUPTIBLE);
7047
                                schedule_timeout(1);
7048
                        }
7049
                        LED_SetState(0x0, j);
7050
                        daa_get_version(j);
7051
                        if (ixjdebug & 0x0002)
7052
                                printk("Loading DAA Coefficients\n");
7053
                        DAA_Coeff_US(j);
7054
                        if (!ixj_daa_write(j)) {
7055
                                printk("DAA write failed on board %d\n", j->board);
7056
                                return -1;
7057
                        }
7058
                        if(!ixj_daa_cid_reset(j)) {
7059
                                printk("DAA CID reset failed on board %d\n", j->board);
7060
                                return -1;
7061
                        }
7062
                        j->flags.pots_correct = 0;
7063
                        j->flags.pstn_present = 0;
7064
                        ixj_linetest(j);
7065
                        if (j->flags.pots_correct) {
7066
                                j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
7067
 
7068
                                outb_p(j->pld_scrw.byte, j->XILINXbase);
7069
                                j->pld_slicw.bits.rly1 = 1;
7070
                                j->pld_slicw.bits.spken = 1;
7071
                                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7072
                                SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7073
/*                              SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7074
                                j->port = PORT_POTS;
7075
                        }
7076
                        ixj_set_port(j, PORT_PSTN);
7077
                        ixj_set_pots(j, 1);
7078
                        if (ixjdebug & 0x0002)
7079
                                printk(KERN_INFO "Enable Mixer\n");
7080
                        ixj_mixer(0x0000, j);   /*Master Volume Left unmute 0db */
7081
                        ixj_mixer(0x0100, j);   /*Master Volume Right unmute 0db */
7082
 
7083
                        ixj_mixer(0x0203, j);   /*Voice Left Volume unmute 6db */
7084
                        ixj_mixer(0x0303, j);   /*Voice Right Volume unmute 6db */
7085
 
7086
                        ixj_mixer(0x0480, j);   /*FM Left mute */
7087
                        ixj_mixer(0x0580, j);   /*FM Right mute */
7088
 
7089
                        ixj_mixer(0x0680, j);   /*CD Left mute */
7090
                        ixj_mixer(0x0780, j);   /*CD Right mute */
7091
 
7092
                        ixj_mixer(0x0880, j);   /*Line Left mute */
7093
                        ixj_mixer(0x0980, j);   /*Line Right mute */
7094
 
7095
                        ixj_mixer(0x0A80, j);   /*Aux left mute  */
7096
                        ixj_mixer(0x0B80, j);   /*Aux right mute */
7097
 
7098
                        ixj_mixer(0x0C00, j);   /*Mono1 unmute 12db */
7099
                        ixj_mixer(0x0D80, j);   /*Mono2 mute */
7100
 
7101
                        ixj_mixer(0x0E80, j);   /*Mic mute */
7102
 
7103
                        ixj_mixer(0x0F00, j);   /*Mono Out Volume unmute 0db */
7104
 
7105
                        ixj_mixer(0x1000, j);   /*Voice Left and Right out only */
7106
                        ixj_mixer(0x110C, j);
7107
 
7108
 
7109
                        ixj_mixer(0x1200, j);   /*Mono1 switch on mixer left */
7110
                        ixj_mixer(0x1401, j);
7111
 
7112
                        ixj_mixer(0x1300, j);       /*Mono1 switch on mixer right */
7113
                        ixj_mixer(0x1501, j);
7114
 
7115
                        ixj_mixer(0x1700, j);   /*Clock select */
7116
 
7117
                        ixj_mixer(0x1800, j);   /*ADC input from mixer */
7118
 
7119
                        ixj_mixer(0x1901, j);   /*Mic gain 30db */
7120
 
7121
                        if (ixjdebug & 0x0002)
7122
                                printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
7123
                        j->cadence_f[4].state = 0;
7124
                        j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */
7125
                        j->cadence_f[4].off1 = 0;
7126
                        j->cadence_f[4].on2 = 0;
7127
                        j->cadence_f[4].off2 = 0;
7128
                        j->cadence_f[4].on3 = 0;
7129
                        j->cadence_f[4].off3 = 0;        /* These should represent standard US ring pulse. */
7130
                        j->pstn_last_rmr = jiffies;
7131
 
7132
                } else {
7133
                        if (j->cardtype == QTI_PHONECARD) {
7134
                                ixj_WriteDSPCommand(0xCF07, j);
7135
                                ixj_WriteDSPCommand(0x00B0, j);
7136
                                ixj_set_port(j, PORT_SPEAKER);
7137
                        } else {
7138
                                ixj_set_port(j, PORT_POTS);
7139
                                SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7140
/*                              SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7141
                        }
7142
                }
7143
        }
7144
 
7145
        j->intercom = -1;
7146
        j->framesread = j->frameswritten = 0;
7147
        j->read_wait = j->write_wait = 0;
7148
        j->rxreadycheck = j->txreadycheck = 0;
7149
 
7150
        /* initialise the DTMF prescale to a sensible value */
7151
        if (j->cardtype == QTI_LINEJACK) {
7152
                set_dtmf_prescale(j, 0x10);
7153
        } else {
7154
                set_dtmf_prescale(j, 0x40);
7155
        }
7156
        set_play_volume(j, 0x100);
7157
        set_rec_volume(j, 0x100);
7158
 
7159
        if (ixj_WriteDSPCommand(0x0000, j))             /* Write IDLE to Software Control Register */
7160
                return -1;
7161
/* The read values of the SSR should be 0x00 for the IDLE command */
7162
        if (j->ssr.low || j->ssr.high)
7163
                return -1;
7164
 
7165
        if (ixjdebug & 0x0002)
7166
                printk(KERN_INFO "Enable Line Monitor\n");
7167
 
7168
        if (ixjdebug & 0x0002)
7169
                printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
7170
 
7171
        if (ixj_WriteDSPCommand(0x7E01, j))             /* Asynchronous Line Monitor */
7172
                return -1;
7173
 
7174
        if (ixjdebug & 0x002)
7175
                printk(KERN_INFO "Enable DTMF Detectors\n");
7176
 
7177
        if (ixj_WriteDSPCommand(0x5151, j))             /* Enable DTMF detection */
7178
                return -1;
7179
 
7180
        if (ixj_WriteDSPCommand(0x6E01, j))             /* Set Asyncronous Tone Generation */
7181
                return -1;
7182
 
7183
        set_rec_depth(j, 2);    /* Set Record Channel Limit to 2 frames */
7184
 
7185
        set_play_depth(j, 2);   /* Set Playback Channel Limit to 2 frames */
7186
 
7187
        j->ex.bits.dtmf_ready = 0;
7188
        j->dtmf_state = 0;
7189
        j->dtmf_wp = j->dtmf_rp = 0;
7190
        j->rec_mode = j->play_mode = -1;
7191
        j->flags.ringing = 0;
7192
        j->maxrings = MAXRINGS;
7193
        j->ring_cadence = USA_RING_CADENCE;
7194
        j->drybuffer = 0;
7195
        j->winktime = 320;
7196
        j->flags.dtmf_oob = 0;
7197
        for (cnt = 0; cnt < 4; cnt++)
7198
                j->cadence_f[cnt].enable = 0;
7199
        /* must be a device on the specified address */
7200
        ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
7201
 
7202
        /* Set up the default signals for events */
7203
        for (cnt = 0; cnt < 35; cnt++)
7204
                j->ixj_signals[cnt] = SIGIO;
7205
 
7206
        /* Set the excetion signal enable flags */
7207
        j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
7208
        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 =
7209
        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;
7210
#ifdef IXJ_DYN_ALLOC
7211
        j->fskdata = NULL;
7212
#endif
7213
        j->fskdcnt = 0;
7214
        j->cidcw_wait = 0;
7215
 
7216
        /* Register with the Telephony for Linux subsystem */
7217
        j->p.f_op = &ixj_fops;
7218
        j->p.open = ixj_open;
7219
        j->p.board = j->board;
7220
        phone_register_device(&j->p, PHONE_UNIT_ANY);
7221
 
7222
        ixj_init_timer(j);
7223
        ixj_add_timer(j);
7224
        return 0;
7225
}
7226
 
7227
/*
7228
 *      Exported service for pcmcia card handling
7229
 */
7230
 
7231
IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
7232
{
7233
        IXJ *j = ixj_alloc();
7234
 
7235
        j->board = 0;
7236
 
7237
        j->DSPbase = dsp;
7238
        j->XILINXbase = xilinx;
7239
        j->cardtype = QTI_PHONECARD;
7240
        ixj_selfprobe(j);
7241
        return j;
7242
}
7243
 
7244
EXPORT_SYMBOL(ixj_pcmcia_probe);                /* Fpr PCMCIA */
7245
 
7246
static int ixj_get_status_proc(char *buf)
7247
{
7248
        int len;
7249
        int cnt;
7250
        IXJ *j;
7251
        len = 0;
7252
        len += sprintf(buf + len, "%s", ixj_c_rcsid);
7253
        len += sprintf(buf + len, "\n%s", ixj_h_rcsid);
7254
        len += sprintf(buf + len, "\n%s", ixjuser_h_rcsid);
7255
        len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
7256
        len += sprintf(buf + len, "\nsizeof IXJ struct %d bytes", sizeof(IXJ));
7257
        len += sprintf(buf + len, "\nsizeof DAA struct %d bytes", sizeof(DAA_REGS));
7258
        len += sprintf(buf + len, "\nUsing old telephony API");
7259
        len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
7260
 
7261
        for (cnt = 0; cnt < IXJMAX; cnt++) {
7262
                j = get_ixj(cnt);
7263
                if(j==NULL)
7264
                        continue;
7265
                if (j->DSPbase) {
7266
                        len += sprintf(buf + len, "\nCard Num %d", cnt);
7267
                        len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
7268
                        if (j->cardtype != QTI_PHONEJACK)
7269
                                len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
7270
                        len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
7271
                        len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
7272
                        len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
7273
                        switch (j->cardtype) {
7274
                        case (QTI_PHONEJACK):
7275
                                len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
7276
                                break;
7277
                        case (QTI_LINEJACK):
7278
                                len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
7279
                                if (j->flags.g729_loaded)
7280
                                        len += sprintf(buf + len, " w/G.729 A/B");
7281
                                len += sprintf(buf + len, " Country = %d", j->daa_country);
7282
                                break;
7283
                        case (QTI_PHONEJACK_LITE):
7284
                                len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
7285
                                if (j->flags.g729_loaded)
7286
                                        len += sprintf(buf + len, " w/G.729 A/B");
7287
                                break;
7288
                        case (QTI_PHONEJACK_PCI):
7289
                                len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
7290
                                if (j->flags.g729_loaded)
7291
                                        len += sprintf(buf + len, " w/G.729 A/B");
7292
                                break;
7293
                        case (QTI_PHONECARD):
7294
                                len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
7295
                                if (j->flags.g729_loaded)
7296
                                        len += sprintf(buf + len, " w/G.729 A/B");
7297
                                len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
7298
                                if (!j->pccr1.bits.drf)
7299
                                        len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
7300
                                len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
7301
                                break;
7302
                        default:
7303
                                len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
7304
                                break;
7305
                        }
7306
                        len += sprintf(buf + len, "\nReaders %d", j->readers);
7307
                        len += sprintf(buf + len, "\nWriters %d", j->writers);
7308
                        add_caps(j);
7309
                        len += sprintf(buf + len, "\nCapabilities %d", j->caps);
7310
                        if (j->dsp.low != 0x20)
7311
                                len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
7312
                        if (j->flags.cidsent)
7313
                                len += sprintf(buf + len, "\nCaller ID data sent");
7314
                        else
7315
                                len += sprintf(buf + len, "\nCaller ID data not sent");
7316
 
7317
                        len += sprintf(buf + len, "\nPlay CODEC ");
7318
                        switch (j->play_codec) {
7319
                        case G723_63:
7320
                                len += sprintf(buf + len, "G.723.1 6.3");
7321
                                break;
7322
                        case G723_53:
7323
                                len += sprintf(buf + len, "G.723.1 5.3");
7324
                                break;
7325
                        case TS85:
7326
                                len += sprintf(buf + len, "TrueSpeech 8.5");
7327
                                break;
7328
                        case TS48:
7329
                                len += sprintf(buf + len, "TrueSpeech 4.8");
7330
                                break;
7331
                        case TS41:
7332
                                len += sprintf(buf + len, "TrueSpeech 4.1");
7333
                                break;
7334
                        case G728:
7335
                                len += sprintf(buf + len, "G.728");
7336
                                break;
7337
                        case G729:
7338
                                len += sprintf(buf + len, "G.729");
7339
                                break;
7340
                        case G729B:
7341
                                len += sprintf(buf + len, "G.729B");
7342
                                break;
7343
                        case ULAW:
7344
                                len += sprintf(buf + len, "uLaw");
7345
                                break;
7346
                        case ALAW:
7347
                                len += sprintf(buf + len, "aLaw");
7348
                                break;
7349
                        case LINEAR16:
7350
                                len += sprintf(buf + len, "16 bit Linear");
7351
                                break;
7352
                        case LINEAR8:
7353
                                len += sprintf(buf + len, "8 bit Linear");
7354
                                break;
7355
                        case WSS:
7356
                                len += sprintf(buf + len, "Windows Sound System");
7357
                                break;
7358
                        default:
7359
                                len += sprintf(buf + len, "NO CODEC CHOSEN");
7360
                                break;
7361
                        }
7362
                        len += sprintf(buf + len, "\nRecord CODEC ");
7363
                        switch (j->rec_codec) {
7364
                        case G723_63:
7365
                                len += sprintf(buf + len, "G.723.1 6.3");
7366
                                break;
7367
                        case G723_53:
7368
                                len += sprintf(buf + len, "G.723.1 5.3");
7369
                                break;
7370
                        case TS85:
7371
                                len += sprintf(buf + len, "TrueSpeech 8.5");
7372
                                break;
7373
                        case TS48:
7374
                                len += sprintf(buf + len, "TrueSpeech 4.8");
7375
                                break;
7376
                        case TS41:
7377
                                len += sprintf(buf + len, "TrueSpeech 4.1");
7378
                                break;
7379
                        case G728:
7380
                                len += sprintf(buf + len, "G.728");
7381
                                break;
7382
                        case G729:
7383
                                len += sprintf(buf + len, "G.729");
7384
                                break;
7385
                        case G729B:
7386
                                len += sprintf(buf + len, "G.729B");
7387
                                break;
7388
                        case ULAW:
7389
                                len += sprintf(buf + len, "uLaw");
7390
                                break;
7391
                        case ALAW:
7392
                                len += sprintf(buf + len, "aLaw");
7393
                                break;
7394
                        case LINEAR16:
7395
                                len += sprintf(buf + len, "16 bit Linear");
7396
                                break;
7397
                        case LINEAR8:
7398
                                len += sprintf(buf + len, "8 bit Linear");
7399
                                break;
7400
                        case WSS:
7401
                                len += sprintf(buf + len, "Windows Sound System");
7402
                                break;
7403
                        default:
7404
                                len += sprintf(buf + len, "NO CODEC CHOSEN");
7405
                                break;
7406
                        }
7407
                        len += sprintf(buf + len, "\nAEC ");
7408
                        switch (j->aec_level) {
7409
                        case AEC_OFF:
7410
                                len += sprintf(buf + len, "Off");
7411
                                break;
7412
                        case AEC_LOW:
7413
                                len += sprintf(buf + len, "Low");
7414
                                break;
7415
                        case AEC_MED:
7416
                                len += sprintf(buf + len, "Med");
7417
                                break;
7418
                        case AEC_HIGH:
7419
                                len += sprintf(buf + len, "High");
7420
                                break;
7421
                        case AEC_AUTO:
7422
                                len += sprintf(buf + len, "Auto");
7423
                                break;
7424
                        case AEC_AGC:
7425
                                len += sprintf(buf + len, "AEC/AGC");
7426
                                break;
7427
                        default:
7428
                                len += sprintf(buf + len, "unknown(%i)", j->aec_level);
7429
                                break;
7430
                        }
7431
 
7432
                        len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
7433
                        len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
7434
                        len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
7435
 
7436
                        len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook);      */
7437
 
7438
                        if (j->cardtype == QTI_LINEJACK) {
7439
                                len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
7440
                                len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
7441
                                len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
7442
                                len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
7443
                                switch (j->daa_mode) {
7444
                                case SOP_PU_SLEEP:
7445
                                        len += sprintf(buf + len, "\nDAA PSTN On Hook");
7446
                                        break;
7447
                                case SOP_PU_RINGING:
7448
                                        len += sprintf(buf + len, "\nDAA PSTN Ringing");
7449
                                        len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
7450
                                        break;
7451
                                case SOP_PU_CONVERSATION:
7452
                                        len += sprintf(buf + len, "\nDAA PSTN Off Hook");
7453
                                        break;
7454
                                case SOP_PU_PULSEDIALING:
7455
                                        len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
7456
                                        break;
7457
                                }
7458
                                len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
7459
                                len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
7460
                                len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
7461
                                len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
7462
                                len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
7463
                                len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
7464
                                len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
7465
                                len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
7466
                                len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
7467
                                len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
7468
                        }
7469
                        switch (j->port) {
7470
                        case PORT_POTS:
7471
                                len += sprintf(buf + len, "\nPort POTS");
7472
                                break;
7473
                        case PORT_PSTN:
7474
                                len += sprintf(buf + len, "\nPort PSTN");
7475
                                break;
7476
                        case PORT_SPEAKER:
7477
                                len += sprintf(buf + len, "\nPort SPEAKER/MIC");
7478
                                break;
7479
                        case PORT_HANDSET:
7480
                                len += sprintf(buf + len, "\nPort HANDSET");
7481
                                break;
7482
                        }
7483
                        if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
7484
                                len += sprintf(buf + len, "\nSLIC state ");
7485
                                switch (SLIC_GetState(j)) {
7486
                                case PLD_SLIC_STATE_OC:
7487
                                        len += sprintf(buf + len, "OC");
7488
                                        break;
7489
                                case PLD_SLIC_STATE_RINGING:
7490
                                        len += sprintf(buf + len, "RINGING");
7491
                                        break;
7492
                                case PLD_SLIC_STATE_ACTIVE:
7493
                                        len += sprintf(buf + len, "ACTIVE");
7494
                                        break;
7495
                                case PLD_SLIC_STATE_OHT:        /* On-hook transmit */
7496
                                        len += sprintf(buf + len, "OHT");
7497
                                        break;
7498
                                case PLD_SLIC_STATE_TIPOPEN:
7499
                                        len += sprintf(buf + len, "TIPOPEN");
7500
                                        break;
7501
                                case PLD_SLIC_STATE_STANDBY:
7502
                                        len += sprintf(buf + len, "STANDBY");
7503
                                        break;
7504
                                case PLD_SLIC_STATE_APR:        /* Active polarity reversal */
7505
                                        len += sprintf(buf + len, "APR");
7506
                                        break;
7507
                                case PLD_SLIC_STATE_OHTPR:      /* OHT polarity reversal */
7508
                                        len += sprintf(buf + len, "OHTPR");
7509
                                        break;
7510
                                default:
7511
                                        len += sprintf(buf + len, "%d", SLIC_GetState(j));
7512
                                        break;
7513
                                }
7514
                        }
7515
                        len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
7516
                        len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
7517
#ifdef PERFMON_STATS
7518
                        len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
7519
                        len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
7520
                        len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
7521
                        len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
7522
                        len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
7523
                        len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
7524
                        len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
7525
                        len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
7526
                        len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
7527
                        len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
7528
                        len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
7529
                        len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
7530
                        len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
7531
                        len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
7532
 
7533
#endif
7534
                        len += sprintf(buf + len, "\n");
7535
                }
7536
        }
7537
        return len;
7538
}
7539
 
7540
static int ixj_read_proc(char *page, char **start, off_t off,
7541
                              int count, int *eof, void *data)
7542
{
7543
        int len = ixj_get_status_proc(page);
7544
        if (len <= off+count) *eof = 1;
7545
        *start = page + off;
7546
        len -= off;
7547
        if (len>count) len = count;
7548
        if (len<0) len = 0;
7549
        return len;
7550
}
7551
 
7552
 
7553
static void cleanup(void)
7554
{
7555
        int cnt;
7556
        IXJ *j;
7557
 
7558
        for (cnt = 0; cnt < IXJMAX; cnt++) {
7559
                j = get_ixj(cnt);
7560
                if(j != NULL && j->DSPbase) {
7561
                        if (ixjdebug & 0x0002)
7562
                                printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
7563
                        del_timer(&j->timer);
7564
                        if (j->cardtype == QTI_LINEJACK) {
7565
                                j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
7566
 
7567
                                outb_p(j->pld_scrw.byte, j->XILINXbase);
7568
                                j->pld_slicw.bits.rly1 = 0;
7569
                                j->pld_slicw.bits.rly2 = 0;
7570
                                j->pld_slicw.bits.rly3 = 0;
7571
                                outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7572
                                LED_SetState(0x0, j);
7573
                                if (ixjdebug & 0x0002)
7574
                                        printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7575
                                release_region(j->XILINXbase, 8);
7576
                        } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
7577
                                if (ixjdebug & 0x0002)
7578
                                        printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7579
                                release_region(j->XILINXbase, 4);
7580
                        }
7581
                        if (j->read_buffer)
7582
                                kfree(j->read_buffer);
7583
                        if (j->write_buffer)
7584
                                kfree(j->write_buffer);
7585
                        if (j->dev && j->dev->deactivate)
7586
                                j->dev->deactivate(j->dev);
7587
                        if (ixjdebug & 0x0002)
7588
                                printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
7589
                        phone_unregister_device(&j->p);
7590
                        if (ixjdebug & 0x0002)
7591
                                printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
7592
                        release_region(j->DSPbase, 16);
7593
#ifdef IXJ_DYN_ALLOC
7594
                        if (ixjdebug & 0x0002)
7595
                                printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
7596
                        kfree(j);
7597
                        ixj[cnt] = NULL;
7598
#endif
7599
                }
7600
        }
7601
        if (ixjdebug & 0x0002)
7602
                printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
7603
        remove_proc_entry ("ixj", NULL);
7604
}
7605
 
7606
/* Typedefs */
7607
typedef struct {
7608
        BYTE length;
7609
        DWORD bits;
7610
} DATABLOCK;
7611
 
7612
static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
7613
{
7614
        lastLCC = lastLCC & 0xfb;
7615
        lastLCC = lastLCC | (byData ? 4 : 0);
7616
        outb(lastLCC, wEEPROMAddress);  /*set data out bit as appropriate */
7617
 
7618
        mdelay(1);
7619
        lastLCC = lastLCC | 0x01;
7620
        outb(lastLCC, wEEPROMAddress);  /*SK rising edge */
7621
 
7622
        byData = byData << 1;
7623
        lastLCC = lastLCC & 0xfe;
7624
        mdelay(1);
7625
        outb(lastLCC, wEEPROMAddress);  /*after delay, SK falling edge */
7626
 
7627
}
7628
 
7629
static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
7630
{
7631
        mdelay(1);
7632
        lastLCC = lastLCC | 0x01;
7633
        outb(lastLCC, wEEPROMAddress);  /*SK rising edge */
7634
 
7635
        lastLCC = lastLCC & 0xfe;
7636
        mdelay(1);
7637
        outb(lastLCC, wEEPROMAddress);  /*after delay, SK falling edge */
7638
 
7639
        return ((inb(wEEPROMAddress) >> 3) & 1);
7640
}
7641
 
7642
static BOOL PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
7643
{
7644
        BYTE lastLCC;
7645
        WORD wEEPROMAddress = wAddress + 3;
7646
        DWORD i;
7647
        BYTE byResult;
7648
        *pwResult = 0;
7649
        lastLCC = inb(wEEPROMAddress);
7650
        lastLCC = lastLCC | 0x02;
7651
        lastLCC = lastLCC & 0xfe;
7652
        outb(lastLCC, wEEPROMAddress);  /* CS hi, SK lo */
7653
 
7654
        mdelay(1);              /* delay */
7655
 
7656
        PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7657
        PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7658
        PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
7659
        for (i = 0; i < 8; i++) {
7660
                PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
7661
                wLoc <<= 1;
7662
        }
7663
 
7664
        for (i = 0; i < 16; i++) {
7665
                byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
7666
                *pwResult = (*pwResult << 1) | byResult;
7667
        }
7668
 
7669
        mdelay(1);              /* another delay */
7670
 
7671
        lastLCC = lastLCC & 0xfd;
7672
        outb(lastLCC, wEEPROMAddress);  /* negate CS */
7673
 
7674
        return 0;
7675
}
7676
 
7677
static DWORD PCIEE_GetSerialNumber(WORD wAddress)
7678
{
7679
        WORD wLo, wHi;
7680
        if (PCIEE_ReadWord(wAddress, 62, &wLo))
7681
                return 0;
7682
        if (PCIEE_ReadWord(wAddress, 63, &wHi))
7683
                return 0;
7684
        return (((DWORD) wHi << 16) | wLo);
7685
}
7686
 
7687
static int dspio[IXJMAX + 1] =
7688
{
7689
        0,
7690
};
7691
static int xio[IXJMAX + 1] =
7692
{
7693
        0,
7694
};
7695
 
7696
MODULE_PARM(dspio, "1-" __MODULE_STRING(IXJMAX) "i");
7697
MODULE_PARM(xio, "1-" __MODULE_STRING(IXJMAX) "i");
7698
MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7699
MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7700
MODULE_LICENSE("GPL");
7701
 
7702
void ixj_exit(void)
7703
{
7704
        cleanup();
7705
}
7706
 
7707
int __init ixj_probe_isapnp(int *cnt)
7708
{
7709
        int probe = 0;
7710
        int func = 0x110;
7711
        struct pci_dev *dev = NULL, *old_dev = NULL;
7712
 
7713
        while (1) {
7714
                do {
7715
                        IXJ *j;
7716
                        int result;
7717
 
7718
                        old_dev = dev;
7719
                        dev = isapnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
7720
                                         ISAPNP_FUNCTION(func), old_dev);
7721
                        if (!dev)
7722
                                break;
7723
                        result = dev->prepare(dev);
7724
                        if (result < 0) {
7725
                                printk("preparing failed %d \n", result);
7726
                                break;
7727
                        }
7728
 
7729
                        if (!(dev->resource[0].flags & IORESOURCE_IO))
7730
                                return -ENODEV;
7731
 
7732
                        dev->resource[0].flags |= IORESOURCE_AUTO;
7733
                        if (func != 0x110)
7734
                                dev->resource[1].flags |= IORESOURCE_AUTO;
7735
                        if (dev->activate(dev) < 0) {
7736
                                printk("isapnp configure failed (out of resources?)\n");
7737
                                return -ENOMEM;
7738
                        }
7739
 
7740
                        result = check_region(dev->resource[0].start, 16);
7741
                        if (result) {
7742
                                printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", dev->resource[0].start);
7743
                                break;
7744
                        }
7745
 
7746
                        j = ixj_alloc();
7747
                        request_region(j->DSPbase, 16, "ixj DSP");
7748
 
7749
                        if (func != 0x110)
7750
                                j->XILINXbase = dev->resource[1].start; /* get real port */
7751
 
7752
                        switch (func) {
7753
                        case (0x110):
7754
                                j->cardtype = QTI_PHONEJACK;
7755
                                break;
7756
                        case (0x310):
7757
                                j->cardtype = QTI_LINEJACK;
7758
                                break;
7759
                        case (0x410):
7760
                                j->cardtype = QTI_PHONEJACK_LITE;
7761
                                break;
7762
                        }
7763
                        j->board = *cnt;
7764
                        probe = ixj_selfprobe(j);
7765
                        if(!probe) {
7766
                                j->serial = dev->bus->serial;
7767
                                j->dev = dev;
7768
                                switch (func) {
7769
                                case 0x110:
7770
                                        printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
7771
                                        break;
7772
                                case 0x310:
7773
                                        printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
7774
                                        break;
7775
                                case 0x410:
7776
                                        printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
7777
                                        break;
7778
                                }
7779
                        }
7780
                        ++*cnt;
7781
                } while (dev);
7782
                if (func == 0x410)
7783
                        break;
7784
                if (func == 0x310)
7785
                        func = 0x410;
7786
                if (func == 0x110)
7787
                        func = 0x310;
7788
                dev = NULL;
7789
        }
7790
        return probe;
7791
}
7792
 
7793
int __init ixj_probe_isa(int *cnt)
7794
{
7795
        int i, result, probe;
7796
 
7797
        /* Use passed parameters for older kernels without PnP */
7798
        for (i = 0; i < IXJMAX; i++) {
7799
                if (dspio[i]) {
7800
                        IXJ *j;
7801
 
7802
                        if ((result = check_region(ixj[*cnt].DSPbase, 16)) < 0) {
7803
                                printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", ixj[*cnt].DSPbase);
7804
                                break;
7805
                        }
7806
 
7807
                        j = ixj_alloc();
7808
 
7809
                        j->DSPbase = dspio[i];
7810
                        request_region(j->DSPbase, 16, "ixj DSP");
7811
 
7812
                        j->XILINXbase = xio[i];
7813
                        j->cardtype = 0;
7814
 
7815
                        j->board = *cnt;
7816
                        probe = ixj_selfprobe(j);
7817
                        j->dev = NULL;
7818
                        ++*cnt;
7819
                }
7820
        }
7821
        return 0;
7822
}
7823
 
7824
int __init ixj_probe_pci(int *cnt)
7825
{
7826
        struct pci_dev *pci = NULL;
7827
        int i, probe = 0;
7828
        IXJ *j = NULL;
7829
        int result;
7830
 
7831
        if(!pci_present())
7832
                return 0;
7833
 
7834
        for (i = 0; i < IXJMAX - *cnt; i++) {
7835
                pci = pci_find_device(0x15E2, 0x0500, pci);
7836
                if (!pci)
7837
                        break;
7838
 
7839
                if (pci_enable_device(pci))
7840
                        break;
7841
                if ((result = check_region(pci_resource_start(pci, 0), 16)) < 0) {
7842
                        printk(KERN_INFO "ixj: can't get I/O address\n");
7843
                        break;
7844
                }
7845
 
7846
                /* Grab a device slot */
7847
                j = ixj_alloc();
7848
                if(j == NULL)
7849
                        break;
7850
 
7851
                j->DSPbase = pci_resource_start(pci, 0);
7852
                j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
7853
                j->XILINXbase = j->DSPbase + 0x10;
7854
                request_region(j->DSPbase, 16, "ixj DSP");
7855
                j->cardtype = QTI_PHONEJACK_PCI;
7856
                j->board = *cnt;
7857
                probe = ixj_selfprobe(j);
7858
                if (!probe)
7859
                        printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
7860
                ++*cnt;
7861
        }
7862
        return probe;
7863
}
7864
 
7865
int __init ixj_init(void)
7866
{
7867
        int cnt = 0;
7868
        int probe = 0;
7869
 
7870
        cnt = 0;
7871
 
7872
        /* These might be no-ops, see above. */
7873
        if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
7874
                return probe;
7875
        }
7876
        if ((probe = ixj_probe_isa(&cnt)) < 0) {
7877
                return probe;
7878
        }
7879
        if (pci_present()) {
7880
                if ((probe = ixj_probe_pci(&cnt)) < 0) {
7881
                        return probe;
7882
                }
7883
        }
7884
        printk("%s\n", ixj_c_rcsid);
7885
        create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
7886
        return probe;
7887
}
7888
 
7889
module_init(ixj_init);
7890
module_exit(ixj_exit);
7891
 
7892
static void DAA_Coeff_US(IXJ *j)
7893
{
7894
        int i;
7895
 
7896
        j->daa_country = DAA_US;
7897
        /*----------------------------------------------- */
7898
        /* CAO */
7899
        for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7900
                j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7901
        }
7902
 
7903
/* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7904
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
7905
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
7906
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
7907
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
7908
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
7909
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
7910
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7911
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7912
/* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7913
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
7914
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
7915
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7916
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7917
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
7918
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7919
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7920
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7921
/* Bytes for FRX-filter       (08): 03,8F,48,F2,8F,48,70,08 */
7922
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
7923
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
7924
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
7925
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
7926
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
7927
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
7928
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
7929
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7930
/* Bytes for FRR-filter       (07): 04,8F,38,7F,9B,EA,B0,08 */
7931
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
7932
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
7933
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
7934
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
7935
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
7936
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
7937
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
7938
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7939
/* Bytes for AX-filter        (0A): 16,55,DD,CA */
7940
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
7941
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
7942
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
7943
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
7944
/* Bytes for AR-filter        (09): 52,D3,11,42 */
7945
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
7946
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
7947
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
7948
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
7949
/* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7950
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
7951
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
7952
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
7953
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
7954
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
7955
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
7956
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
7957
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
7958
/* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7959
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
7960
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
7961
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
7962
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
7963
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
7964
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
7965
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
7966
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
7967
/* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7968
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
7969
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
7970
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
7971
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
7972
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
7973
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
7974
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
7975
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
7976
/* ;  (10K, 0.68uF) */
7977
        /*  */
7978
        /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7979
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
7980
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
7981
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
7982
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
7983
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
7984
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
7985
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
7986
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
7987
        /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7988
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
7989
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
7990
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
7991
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
7992
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
7993
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
7994
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
7995
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
7996
 
7997
        /* Levelmetering Ringing        (0D):B2,45,0F,8E       */
7998
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
7999
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8000
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8001
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8002
 
8003
        /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8004
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
8005
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
8006
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
8007
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
8008
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
8009
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
8010
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
8011
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
8012
        /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8013
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
8014
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
8015
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
8016
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
8017
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
8018
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
8019
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
8020
/*      j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
8021
/* */
8022
        /* Levelmetering Ringing        (0D):B2,45,0F,8E       */
8023
/*      j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
8024
/*      j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
8025
/*      j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
8026
/*      j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
8027
 
8028
        /* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */
8029
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8030
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8031
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8032
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8033
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8034
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8035
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8036
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8037
/* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */
8038
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8039
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8040
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8041
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8042
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8043
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8044
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8045
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8046
/*  */
8047
        /* ;CR Registers */
8048
        /* Config. Reg. 0 (filters)       (cr0):FE ; CLK gen. by crystal */
8049
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8050
/* Config. Reg. 1 (dialing)       (cr1):05 */
8051
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8052
/* Config. Reg. 2 (caller ID)     (cr2):04 */
8053
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8054
/* Config. Reg. 3 (testloops)     (cr3):03 ; SEL Bit==0, HP-disabled */
8055
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8056
/* Config. Reg. 4 (analog gain)   (cr4):02 */
8057
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8058
        /* Config. Reg. 5 (Version)       (cr5):02 */
8059
        /* Config. Reg. 6 (Reserved)      (cr6):00 */
8060
        /* Config. Reg. 7 (Reserved)      (cr7):00 */
8061
        /*  */
8062
        /* ;xr Registers */
8063
        /* Ext. Reg. 0 (Interrupt Reg.)   (xr0):02 */
8064
 
8065
        j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;        /* SO_1 set to '1' because it is inverted. */
8066
        /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
8067
 
8068
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
8069
/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8070
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8071
/* Ext. Reg. 3 (DC Char)          (xr3):32 ; B-Filter Off == 1 */
8072
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B;         /*0x32; */
8073
        /* Ext. Reg. 4 (Cadence)          (xr4):00 */
8074
 
8075
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8076
/* Ext. Reg. 5 (Ring timer)       (xr5):22 */
8077
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8078
/* Ext. Reg. 6 (Power State)      (xr6):00 */
8079
        j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8080
/* Ext. Reg. 7 (Vdd)              (xr7):40 */
8081
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;         /* 0x40 ??? Should it be 0x00? */
8082
        /*  */
8083
        /* DTMF Tone 1                     (0B): 11,B3,5A,2C ;   697 Hz   */
8084
        /*                                       12,33,5A,C3 ;  770 Hz   */
8085
        /*                                       13,3C,5B,32 ;  852 Hz   */
8086
        /*                                       1D,1B,5C,CC ;  941 Hz   */
8087
 
8088
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8089
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8090
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8091
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8092
/* DTMF Tone 2                     (0C): 32,32,52,B3 ;  1209 Hz   */
8093
        /*                                       EC,1D,52,22 ;  1336 Hz   */
8094
        /*                                       AA,AC,51,D2 ;  1477 Hz   */
8095
        /*                                       9B,3B,51,25 ;  1633 Hz   */
8096
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8097
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8098
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8099
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8100
}
8101
 
8102
static void DAA_Coeff_UK(IXJ *j)
8103
{
8104
        int i;
8105
 
8106
        j->daa_country = DAA_UK;
8107
        /*----------------------------------------------- */
8108
        /* CAO */
8109
        for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8110
                j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8111
        }
8112
 
8113
/*  Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
8114
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8115
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
8116
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8117
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
8118
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
8119
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8120
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8121
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8122
/* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
8123
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
8124
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
8125
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8126
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
8127
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
8128
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8129
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8130
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8131
/* Bytes for FRX-filter       (08): 07,9B,ED,24,B2,A2,A0,08 */
8132
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8133
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
8134
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
8135
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
8136
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
8137
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
8138
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
8139
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8140
/* Bytes for FRR-filter       (07): 0F,92,F2,B2,87,D2,30,08 */
8141
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8142
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
8143
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
8144
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
8145
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8146
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
8147
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
8148
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8149
/* Bytes for AX-filter        (0A): 1B,A5,DD,CA */
8150
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
8151
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
8152
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8153
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8154
/* Bytes for AR-filter        (09): E2,27,10,D6 */
8155
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8156
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
8157
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8158
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8159
/* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8160
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8161
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
8162
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
8163
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
8164
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
8165
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
8166
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8167
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8168
/* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8169
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8170
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
8171
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
8172
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
8173
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
8174
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
8175
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
8176
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
8177
/* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8178
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8179
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8180
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
8181
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
8182
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
8183
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
8184
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
8185
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
8186
/* ; idle */
8187
        /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8188
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8189
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8190
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8191
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8192
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8193
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8194
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8195
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8196
/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8197
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8198
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8199
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8200
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8201
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8202
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8203
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8204
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8205
/* Levelmetering Ringing           (0D):AA,35,0F,8E     ; 25Hz 30V less possible? */
8206
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8207
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8208
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8209
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8210
/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8211
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8212
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8213
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8214
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8215
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8216
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8217
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8218
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8219
/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8220
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8221
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8222
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8223
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8224
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8225
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8226
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8227
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8228
/* ;CR Registers */
8229
        /* Config. Reg. 0 (filters)        (cr0):FF */
8230
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8231
/* Config. Reg. 1 (dialing)        (cr1):05 */
8232
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8233
/* Config. Reg. 2 (caller ID)      (cr2):04 */
8234
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8235
/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8236
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8237
/* Config. Reg. 4 (analog gain)    (cr4):02 */
8238
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8239
        /* Config. Reg. 5 (Version)        (cr5):02 */
8240
        /* Config. Reg. 6 (Reserved)       (cr6):00 */
8241
        /* Config. Reg. 7 (Reserved)       (cr7):00 */
8242
        /* ;xr Registers */
8243
        /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8244
 
8245
        j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;        /* SO_1 set to '1' because it is inverted. */
8246
        /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8247
 
8248
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;         /* RING, Caller ID, VDD_OK */
8249
        /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8250
 
8251
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8252
/* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
8253
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8254
/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8255
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8256
/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8257
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8258
/* Ext. Reg. 6 (Power State)       (xr6):00 */
8259
        j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8260
/* Ext. Reg. 7 (Vdd)               (xr7):46 */
8261
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;         /* 0x46 ??? Should it be 0x00? */
8262
        /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8263
        /*                                       12,33,5A,C3    ;  770 Hz   */
8264
        /*                                       13,3C,5B,32    ;  852 Hz   */
8265
        /*                                       1D,1B,5C,CC    ;  941 Hz   */
8266
 
8267
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8268
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8269
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8270
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8271
/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8272
        /*                                       EC,1D,52,22    ;  1336 Hz   */
8273
        /*                                       AA,AC,51,D2    ;  1477 Hz   */
8274
        /*                                       9B,3B,51,25    ;  1633 Hz   */
8275
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8276
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8277
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8278
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8279
}
8280
 
8281
 
8282
static void DAA_Coeff_France(IXJ *j)
8283
{
8284
        int i;
8285
 
8286
        j->daa_country = DAA_FRANCE;
8287
        /*----------------------------------------------- */
8288
        /* CAO */
8289
        for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8290
                j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8291
        }
8292
 
8293
/* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8294
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
8295
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
8296
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
8297
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
8298
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
8299
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
8300
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8301
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8302
/* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8303
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
8304
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
8305
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8306
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
8307
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
8308
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8309
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8310
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8311
/* Bytes for FRX-filter       (08): 07,9A,28,F6,23,4A,B0,08 */
8312
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8313
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
8314
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
8315
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
8316
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
8317
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
8318
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
8319
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8320
/* Bytes for FRR-filter       (07): 03,8F,F9,2F,9E,FA,20,08 */
8321
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8322
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8323
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
8324
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8325
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
8326
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
8327
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8328
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8329
/* Bytes for AX-filter        (0A): 16,B5,DD,CA */
8330
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
8331
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
8332
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8333
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8334
/* Bytes for AR-filter        (09): 52,C7,10,D6 */
8335
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8336
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
8337
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8338
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8339
/* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8340
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8341
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8342
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8343
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8344
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
8345
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8346
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8347
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8348
/* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8349
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8350
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
8351
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8352
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
8353
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
8354
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
8355
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
8356
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
8357
/* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8358
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8359
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8360
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8361
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
8362
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
8363
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
8364
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
8365
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
8366
/* ; idle */
8367
        /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8368
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8369
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8370
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8371
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8372
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8373
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8374
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8375
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8376
/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8377
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8378
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8379
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8380
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8381
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8382
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8383
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8384
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8385
/* Levelmetering Ringing           (0D):32,45,B5,84     ; 50Hz 20V */
8386
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8387
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8388
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8389
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8390
/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8391
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8392
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8393
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8394
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8395
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8396
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8397
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8398
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8399
/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8400
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8401
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8402
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8403
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8404
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8405
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8406
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8407
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8408
/* ;CR Registers */
8409
        /* Config. Reg. 0 (filters)        (cr0):FF */
8410
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8411
/* Config. Reg. 1 (dialing)        (cr1):05 */
8412
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8413
/* Config. Reg. 2 (caller ID)      (cr2):04 */
8414
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8415
/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8416
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8417
/* Config. Reg. 4 (analog gain)    (cr4):02 */
8418
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8419
        /* Config. Reg. 5 (Version)        (cr5):02 */
8420
        /* Config. Reg. 6 (Reserved)       (cr6):00 */
8421
        /* Config. Reg. 7 (Reserved)       (cr7):00 */
8422
        /* ;xr Registers */
8423
        /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8424
 
8425
        j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;        /* SO_1 set to '1' because it is inverted. */
8426
        /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8427
 
8428
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;         /* RING, Caller ID, VDD_OK */
8429
        /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8430
 
8431
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8432
/* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
8433
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8434
/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8435
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8436
/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8437
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8438
/* Ext. Reg. 6 (Power State)       (xr6):00 */
8439
        j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8440
/* Ext. Reg. 7 (Vdd)               (xr7):46 */
8441
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;         /* 0x46 ??? Should it be 0x00? */
8442
        /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8443
        /*                                       12,33,5A,C3    ;  770 Hz   */
8444
        /*                                       13,3C,5B,32    ;  852 Hz   */
8445
        /*                                       1D,1B,5C,CC    ;  941 Hz   */
8446
 
8447
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8448
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8449
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8450
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8451
/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8452
        /*                                       EC,1D,52,22    ;  1336 Hz   */
8453
        /*                                       AA,AC,51,D2    ;  1477 Hz   */
8454
        /*                                       9B,3B,51,25    ;  1633 Hz   */
8455
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8456
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8457
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8458
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8459
}
8460
 
8461
 
8462
static void DAA_Coeff_Germany(IXJ *j)
8463
{
8464
        int i;
8465
 
8466
        j->daa_country = DAA_GERMANY;
8467
        /*----------------------------------------------- */
8468
        /* CAO */
8469
        for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8470
                j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8471
        }
8472
 
8473
/* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8474
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8475
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
8476
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8477
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
8478
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
8479
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8480
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
8481
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8482
/* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8483
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
8484
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
8485
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8486
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
8487
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
8488
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
8489
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
8490
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8491
/* Bytes for FRX-filter       (08): 07,AA,E2,34,24,89,20,08 */
8492
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8493
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
8494
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8495
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8496
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
8497
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
8498
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
8499
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8500
/* Bytes for FRR-filter       (07): 02,87,FA,37,9A,CA,B0,08 */
8501
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
8502
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
8503
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
8504
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
8505
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
8506
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
8507
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
8508
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8509
/* Bytes for AX-filter        (0A): 72,D5,DD,CA */
8510
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
8511
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
8512
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8513
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8514
/* Bytes for AR-filter        (09): 72,42,13,4B */
8515
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
8516
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
8517
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
8518
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
8519
/* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8520
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8521
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8522
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8523
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8524
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
8525
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8526
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8527
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8528
/* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8529
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8530
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
8531
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
8532
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8533
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
8534
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
8535
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
8536
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
8537
/* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8538
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8539
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8540
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
8541
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
8542
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
8543
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
8544
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
8545
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
8546
/* ;  (10K, 0.68uF) */
8547
        /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8548
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8549
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
8550
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
8551
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
8552
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
8553
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
8554
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
8555
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8556
/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8557
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
8558
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
8559
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8560
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8561
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
8562
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
8563
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
8564
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8565
/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
8566
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
8567
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8568
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8569
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8570
/* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */
8571
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8572
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8573
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8574
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8575
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8576
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8577
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8578
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8579
/* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */
8580
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8581
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8582
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8583
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8584
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8585
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8586
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8587
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8588
/* ;CR Registers */
8589
        /* Config. Reg. 0 (filters)        (cr0):FF ; all Filters enabled, CLK from ext. source */
8590
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8591
/* Config. Reg. 1 (dialing)        (cr1):05 ; Manual Ring, Ring metering enabled */
8592
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8593
/* Config. Reg. 2 (caller ID)      (cr2):04 ; Analog Gain 0dB, FSC internal */
8594
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8595
/* Config. Reg. 3 (testloops)      (cr3):00 ; SEL Bit==0, HP-enabled */
8596
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8597
/* Config. Reg. 4 (analog gain)    (cr4):02 */
8598
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8599
        /* Config. Reg. 5 (Version)        (cr5):02 */
8600
        /* Config. Reg. 6 (Reserved)       (cr6):00 */
8601
        /* Config. Reg. 7 (Reserved)       (cr7):00 */
8602
        /* ;xr Registers */
8603
        /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8604
 
8605
        j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;        /* SO_1 set to '1' because it is inverted. */
8606
        /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8607
 
8608
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;         /* RING, Caller ID, VDD_OK */
8609
        /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8610
 
8611
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8612
/* Ext. Reg. 3 (DC Char)           (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8613
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
8614
/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8615
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8616
/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8617
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8618
/* Ext. Reg. 6 (Power State)       (xr6):00 */
8619
        j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8620
/* Ext. Reg. 7 (Vdd)               (xr7):40 ; VDD=4.25 V */
8621
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;         /* 0x40 ??? Should it be 0x00? */
8622
        /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8623
        /*                                       12,33,5A,C3    ;  770 Hz   */
8624
        /*                                       13,3C,5B,32    ;  852 Hz   */
8625
        /*                                       1D,1B,5C,CC    ;  941 Hz   */
8626
 
8627
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8628
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8629
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8630
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8631
/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8632
        /*                                       EC,1D,52,22    ;  1336 Hz   */
8633
        /*                                       AA,AC,51,D2    ;  1477 Hz   */
8634
        /*                                       9B,3B,51,25    ;  1633 Hz   */
8635
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8636
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8637
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8638
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8639
}
8640
 
8641
 
8642
static void DAA_Coeff_Australia(IXJ *j)
8643
{
8644
        int i;
8645
 
8646
        j->daa_country = DAA_AUSTRALIA;
8647
        /*----------------------------------------------- */
8648
        /* CAO */
8649
        for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8650
                j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8651
        }
8652
 
8653
/* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8654
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8655
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
8656
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
8657
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
8658
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
8659
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
8660
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
8661
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8662
/* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8663
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
8664
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
8665
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8666
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
8667
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
8668
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
8669
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
8670
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8671
/* Bytes for FRX-filter       (08): 07,96,E2,34,32,9B,30,08 */
8672
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8673
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
8674
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8675
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8676
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
8677
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
8678
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
8679
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8680
/* Bytes for FRR-filter       (07): 0F,9A,E9,2F,22,CC,A0,08 */
8681
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8682
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
8683
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
8684
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8685
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
8686
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
8687
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
8688
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8689
/* Bytes for AX-filter        (0A): CB,45,DD,CA */
8690
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
8691
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
8692
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8693
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8694
/* Bytes for AR-filter        (09): 1B,67,10,D6 */
8695
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
8696
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
8697
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8698
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8699
/* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8700
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8701
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8702
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8703
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8704
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
8705
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8706
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8707
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8708
/* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8709
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8710
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
8711
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
8712
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
8713
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
8714
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
8715
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
8716
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
8717
/* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8718
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8719
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8720
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
8721
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
8722
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
8723
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
8724
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
8725
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
8726
/* ;  idle */
8727
        /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8728
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8729
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8730
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8731
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8732
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8733
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8734
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8735
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8736
/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8737
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8738
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8739
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8740
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8741
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8742
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8743
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8744
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8745
/* Levelmetering Ringing           (0D):32,45,B5,84   ; 50Hz 20V */
8746
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8747
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8748
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8749
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8750
/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8751
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8752
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8753
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8754
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8755
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8756
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8757
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8758
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8759
/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8760
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8761
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8762
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8763
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8764
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8765
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8766
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8767
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8768
/* ;CR Registers */
8769
        /* Config. Reg. 0 (filters)        (cr0):FF */
8770
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8771
/* Config. Reg. 1 (dialing)        (cr1):05 */
8772
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8773
/* Config. Reg. 2 (caller ID)      (cr2):04 */
8774
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8775
/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8776
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8777
/* Config. Reg. 4 (analog gain)    (cr4):02 */
8778
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8779
        /* Config. Reg. 5 (Version)        (cr5):02 */
8780
        /* Config. Reg. 6 (Reserved)       (cr6):00 */
8781
        /* Config. Reg. 7 (Reserved)       (cr7):00 */
8782
        /* ;xr Registers */
8783
        /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8784
 
8785
        j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;        /* SO_1 set to '1' because it is inverted. */
8786
        /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8787
 
8788
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;         /* RING, Caller ID, VDD_OK */
8789
        /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8790
 
8791
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8792
/* Ext. Reg. 3 (DC Char)           (xr3):2B      ;  */
8793
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
8794
/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8795
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8796
/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8797
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8798
/* Ext. Reg. 6 (Power State)       (xr6):00 */
8799
        j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8800
/* Ext. Reg. 7 (Vdd)               (xr7):40 */
8801
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;         /* 0x40 ??? Should it be 0x00? */
8802
 
8803
        /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;  697 Hz   */
8804
        /*                                       12,33,5A,C3    ;  770 Hz   */
8805
        /*                                       13,3C,5B,32    ;  852 Hz   */
8806
        /*                                       1D,1B,5C,CC    ;  941 Hz   */
8807
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8808
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8809
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8810
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8811
 
8812
        /* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8813
        /*                                       EC,1D,52,22    ;  1336 Hz   */
8814
        /*                                       AA,AC,51,D2    ;  1477 Hz   */
8815
        /*                                       9B,3B,51,25    ;  1633 Hz   */
8816
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8817
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8818
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8819
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8820
}
8821
 
8822
static void DAA_Coeff_Japan(IXJ *j)
8823
{
8824
        int i;
8825
 
8826
        j->daa_country = DAA_JAPAN;
8827
        /*----------------------------------------------- */
8828
        /* CAO */
8829
        for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8830
                j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8831
        }
8832
 
8833
/* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8834
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
8835
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
8836
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
8837
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
8838
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
8839
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
8840
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8841
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8842
/* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8843
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
8844
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
8845
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8846
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
8847
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
8848
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8849
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8850
        j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8851
/* Bytes for FRX-filter       (08): 02,8F,68,77,9C,58,F0,08 */
8852
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
8853
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
8854
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
8855
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
8856
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
8857
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
8858
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
8859
        j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8860
/* Bytes for FRR-filter       (07): 03,8F,38,73,87,EA,20,08 */
8861
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8862
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8863
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
8864
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
8865
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8866
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
8867
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8868
        j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8869
/* Bytes for AX-filter        (0A): 51,C5,DD,CA */
8870
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
8871
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
8872
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8873
        j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8874
/* Bytes for AR-filter        (09): 25,A7,10,D6 */
8875
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
8876
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
8877
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8878
        j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8879
/* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8880
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8881
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8882
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8883
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8884
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
8885
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8886
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8887
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8888
/* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8889
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8890
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
8891
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8892
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8893
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
8894
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
8895
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
8896
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
8897
/* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8898
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8899
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8900
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8901
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
8902
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
8903
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
8904
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
8905
        j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
8906
/* ;  idle */
8907
        /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8908
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8909
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8910
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8911
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8912
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8913
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8914
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8915
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8916
/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8917
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8918
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8919
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8920
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8921
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8922
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8923
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8924
        j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8925
/* Levelmetering Ringing           (0D):AA,35,0F,8E    ; 25Hz 30V ????????? */
8926
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8927
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8928
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8929
        j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8930
/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
8931
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8932
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8933
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8934
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8935
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8936
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8937
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8938
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8939
/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
8940
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8941
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8942
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8943
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8944
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8945
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8946
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8947
        j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8948
/* ;CR Registers */
8949
        /* Config. Reg. 0 (filters)        (cr0):FF */
8950
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8951
/* Config. Reg. 1 (dialing)        (cr1):05 */
8952
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8953
/* Config. Reg. 2 (caller ID)      (cr2):04 */
8954
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8955
/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
8956
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8957
/* Config. Reg. 4 (analog gain)    (cr4):02 */
8958
        j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8959
        /* Config. Reg. 5 (Version)        (cr5):02 */
8960
        /* Config. Reg. 6 (Reserved)       (cr6):00 */
8961
        /* Config. Reg. 7 (Reserved)       (cr7):00 */
8962
        /* ;xr Registers */
8963
        /* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
8964
 
8965
        j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;        /* SO_1 set to '1' because it is inverted. */
8966
        /* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
8967
 
8968
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;         /* RING, Caller ID, VDD_OK */
8969
        /* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
8970
 
8971
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8972
/* Ext. Reg. 3 (DC Char)           (xr3):22        ;  */
8973
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
8974
/* Ext. Reg. 4 (Cadence)           (xr4):00 */
8975
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8976
/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
8977
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8978
/* Ext. Reg. 6 (Power State)       (xr6):00 */
8979
        j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8980
/* Ext. Reg. 7 (Vdd)               (xr7):40 */
8981
        j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;         /* 0x40 ??? Should it be 0x00? */
8982
        /* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
8983
        /*                                       12,33,5A,C3    ;  770 Hz   */
8984
        /*                                       13,3C,5B,32    ;  852 Hz   */
8985
        /*                                       1D,1B,5C,CC    ;  941 Hz   */
8986
 
8987
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8988
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8989
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8990
        j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8991
/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
8992
        /*                                       EC,1D,52,22    ;  1336 Hz   */
8993
        /*                                       AA,AC,51,D2    ;  1477 Hz   */
8994
        /*                                       9B,3B,51,25    ;  1633 Hz   */
8995
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8996
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8997
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8998
        j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8999
}
9000
 
9001
static s16 tone_table[][19] =
9002
{
9003
        {                       /* f20_50[] 11 */
9004
                32538,          /* A1 = 1.985962 */
9005
                 -32325,        /* A2 = -0.986511 */
9006
                 -343,          /* B2 = -0.010493 */
9007
                 0,              /* B1 = 0 */
9008
                 343,           /* B0 = 0.010493 */
9009
                 32619,         /* A1 = 1.990906 */
9010
                 -32520,        /* A2 = -0.992462 */
9011
                 19179,         /* B2 = 0.585327 */
9012
                 -19178,        /* B1 = -1.170593 */
9013
                 19179,         /* B0 = 0.585327 */
9014
                 32723,         /* A1 = 1.997314 */
9015
                 -32686,        /* A2 = -0.997528 */
9016
                 9973,          /* B2 = 0.304352 */
9017
                 -9955,         /* B1 = -0.607605 */
9018
                 9973,          /* B0 = 0.304352 */
9019
                 7,             /* Internal filter scaling */
9020
                 159,           /* Minimum in-band energy threshold */
9021
                 21,            /* 21/32 in-band to broad-band ratio */
9022
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9023
        },
9024
        {                       /* f133_200[] 12 */
9025
                32072,          /* A1 = 1.95752 */
9026
                 -31896,        /* A2 = -0.973419 */
9027
                 -435,          /* B2 = -0.013294 */
9028
                 0,              /* B1 = 0 */
9029
                 435,           /* B0 = 0.013294 */
9030
                 32188,         /* A1 = 1.9646 */
9031
                 -32400,        /* A2 = -0.98877 */
9032
                 15139,         /* B2 = 0.462036 */
9033
                 -14882,        /* B1 = -0.908356 */
9034
                 15139,         /* B0 = 0.462036 */
9035
                 32473,         /* A1 = 1.981995 */
9036
                 -32524,        /* A2 = -0.992584 */
9037
                 23200,         /* B2 = 0.708008 */
9038
                 -23113,        /* B1 = -1.410706 */
9039
                 23200,         /* B0 = 0.708008 */
9040
                 7,             /* Internal filter scaling */
9041
                 159,           /* Minimum in-band energy threshold */
9042
                 21,            /* 21/32 in-band to broad-band ratio */
9043
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9044
        },
9045
        {                       /* f300 13 */
9046
                31769,          /* A1 = -1.939026 */
9047
                 -32584,        /* A2 = 0.994385 */
9048
                 -475,          /* B2 = -0.014522 */
9049
                 0,              /* B1 = 0.000000 */
9050
                 475,           /* B0 = 0.014522 */
9051
                 31789,         /* A1 = -1.940247 */
9052
                 -32679,        /* A2 = 0.997284 */
9053
                 17280,         /* B2 = 0.527344 */
9054
                 -16865,        /* B1 = -1.029358 */
9055
                 17280,         /* B0 = 0.527344 */
9056
                 31841,         /* A1 = -1.943481 */
9057
                 -32681,        /* A2 = 0.997345 */
9058
                 543,           /* B2 = 0.016579 */
9059
                 -525,          /* B1 = -0.032097 */
9060
                 543,           /* B0 = 0.016579 */
9061
                 5,             /* Internal filter scaling */
9062
                 159,           /* Minimum in-band energy threshold */
9063
                 21,            /* 21/32 in-band to broad-band ratio */
9064
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9065
        },
9066
        {                       /* f300_420[] 14 */
9067
                30750,          /* A1 = 1.876892 */
9068
                 -31212,        /* A2 = -0.952515 */
9069
                 -804,          /* B2 = -0.024541 */
9070
                 0,              /* B1 = 0 */
9071
                 804,           /* B0 = 0.024541 */
9072
                 30686,         /* A1 = 1.872925 */
9073
                 -32145,        /* A2 = -0.980988 */
9074
                 14747,         /* B2 = 0.450043 */
9075
                 -13703,        /* B1 = -0.836395 */
9076
                 14747,         /* B0 = 0.450043 */
9077
                 31651,         /* A1 = 1.931824 */
9078
                 -32321,        /* A2 = -0.986389 */
9079
                 24425,         /* B2 = 0.745422 */
9080
                 -23914,        /* B1 = -1.459595 */
9081
                 24427,         /* B0 = 0.745483 */
9082
                 7,             /* Internal filter scaling */
9083
                 159,           /* Minimum in-band energy threshold */
9084
                 21,            /* 21/32 in-band to broad-band ratio */
9085
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9086
        },
9087
        {                       /* f330 15 */
9088
                31613,          /* A1 = -1.929565 */
9089
                 -32646,        /* A2 = 0.996277 */
9090
                 -185,          /* B2 = -0.005657 */
9091
                 0,              /* B1 = 0.000000 */
9092
                 185,           /* B0 = 0.005657 */
9093
                 31620,         /* A1 = -1.929932 */
9094
                 -32713,        /* A2 = 0.998352 */
9095
                 19253,         /* B2 = 0.587585 */
9096
                 -18566,        /* B1 = -1.133179 */
9097
                 19253,         /* B0 = 0.587585 */
9098
                 31674,         /* A1 = -1.933228 */
9099
                 -32715,        /* A2 = 0.998413 */
9100
                 2575,          /* B2 = 0.078590 */
9101
                 -2495,         /* B1 = -0.152283 */
9102
                 2575,          /* B0 = 0.078590 */
9103
                 5,             /* Internal filter scaling */
9104
                 159,           /* Minimum in-band energy threshold */
9105
                 21,            /* 21/32 in-band to broad-band ratio */
9106
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9107
        },
9108
        {                       /* f300_425[] 16 */
9109
                30741,          /* A1 = 1.876282 */
9110
                 -31475,        /* A2 = -0.960541 */
9111
                 -703,          /* B2 = -0.021484 */
9112
                 0,              /* B1 = 0 */
9113
                 703,           /* B0 = 0.021484 */
9114
                 30688,         /* A1 = 1.873047 */
9115
                 -32248,        /* A2 = -0.984161 */
9116
                 14542,         /* B2 = 0.443787 */
9117
                 -13523,        /* B1 = -0.825439 */
9118
                 14542,         /* B0 = 0.443817 */
9119
                 31494,         /* A1 = 1.922302 */
9120
                 -32366,        /* A2 = -0.987762 */
9121
                 21577,         /* B2 = 0.658508 */
9122
                 -21013,        /* B1 = -1.282532 */
9123
                 21577,         /* B0 = 0.658508 */
9124
                 7,             /* Internal filter scaling */
9125
                 159,           /* Minimum in-band energy threshold */
9126
                 21,            /* 21/32 in-band to broad-band ratio */
9127
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9128
        },
9129
        {                       /* f330_440[] 17 */
9130
                30627,          /* A1 = 1.869324 */
9131
                 -31338,        /* A2 = -0.95636 */
9132
                 -843,          /* B2 = -0.025749 */
9133
                 0,              /* B1 = 0 */
9134
                 843,           /* B0 = 0.025749 */
9135
                 30550,         /* A1 = 1.864685 */
9136
                 -32221,        /* A2 = -0.983337 */
9137
                 13594,         /* B2 = 0.414886 */
9138
                 -12589,        /* B1 = -0.768402 */
9139
                 13594,         /* B0 = 0.414886 */
9140
                 31488,         /* A1 = 1.921936 */
9141
                 -32358,        /* A2 = -0.987518 */
9142
                 24684,         /* B2 = 0.753296 */
9143
                 -24029,        /* B1 = -1.466614 */
9144
                 24684,         /* B0 = 0.753296 */
9145
                 7,             /* Internal filter scaling */
9146
                 159,           /* Minimum in-band energy threshold */
9147
                 21,            /* 21/32 in-band to broad-band ratio */
9148
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9149
        },
9150
        {                       /* f340 18 */
9151
                31546,          /* A1 = -1.925476 */
9152
                 -32646,        /* A2 = 0.996277 */
9153
                 -445,          /* B2 = -0.013588 */
9154
                 0,              /* B1 = 0.000000 */
9155
                 445,           /* B0 = 0.013588 */
9156
                 31551,         /* A1 = -1.925781 */
9157
                 -32713,        /* A2 = 0.998352 */
9158
                 23884,         /* B2 = 0.728882 */
9159
                 -22979,        /* B1 = -1.402527 */
9160
                 23884,         /* B0 = 0.728882 */
9161
                 31606,         /* A1 = -1.929138 */
9162
                 -32715,        /* A2 = 0.998413 */
9163
                 863,           /* B2 = 0.026367 */
9164
                 -835,          /* B1 = -0.050985 */
9165
                 863,           /* B0 = 0.026367 */
9166
                 5,             /* Internal filter scaling */
9167
                 159,           /* Minimum in-band energy threshold */
9168
                 21,            /* 21/32 in-band to broad-band ratio */
9169
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9170
        },
9171
        {                       /* f350_400[] 19 */
9172
                31006,          /* A1 = 1.892517 */
9173
                 -32029,        /* A2 = -0.977448 */
9174
                 -461,          /* B2 = -0.014096 */
9175
                 0,              /* B1 = 0 */
9176
                 461,           /* B0 = 0.014096 */
9177
                 30999,         /* A1 = 1.892029 */
9178
                 -32487,        /* A2 = -0.991455 */
9179
                 11325,         /* B2 = 0.345612 */
9180
                 -10682,        /* B1 = -0.651978 */
9181
                 11325,         /* B0 = 0.345612 */
9182
                 31441,         /* A1 = 1.919067 */
9183
                 -32526,        /* A2 = -0.992615 */
9184
                 24324,         /* B2 = 0.74231 */
9185
                 -23535,        /* B1 = -1.436523 */
9186
                 24324,         /* B0 = 0.74231 */
9187
                 7,             /* Internal filter scaling */
9188
                 159,           /* Minimum in-band energy threshold */
9189
                 21,            /* 21/32 in-band to broad-band ratio */
9190
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9191
        },
9192
        {                       /* f350_440[] */
9193
                30634,          /* A1 = 1.869751 */
9194
                 -31533,        /* A2 = -0.962341 */
9195
                 -680,          /* B2 = -0.020782 */
9196
                 0,              /* B1 = 0 */
9197
                 680,           /* B0 = 0.020782 */
9198
                 30571,         /* A1 = 1.865906 */
9199
                 -32277,        /* A2 = -0.985016 */
9200
                 12894,         /* B2 = 0.393524 */
9201
                 -11945,        /* B1 = -0.729065 */
9202
                 12894,         /* B0 = 0.393524 */
9203
                 31367,         /* A1 = 1.91449 */
9204
                 -32379,        /* A2 = -0.988129 */
9205
                 23820,         /* B2 = 0.726929 */
9206
                 -23104,        /* B1 = -1.410217 */
9207
                 23820,         /* B0 = 0.726929 */
9208
                 7,             /* Internal filter scaling */
9209
                 159,           /* Minimum in-band energy threshold */
9210
                 21,            /* 21/32 in-band to broad-band ratio */
9211
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9212
        },
9213
        {                       /* f350_450[] */
9214
                30552,          /* A1 = 1.864807 */
9215
                 -31434,        /* A2 = -0.95929 */
9216
                 -690,          /* B2 = -0.021066 */
9217
                 0,              /* B1 = 0 */
9218
                 690,           /* B0 = 0.021066 */
9219
                 30472,         /* A1 = 1.859924 */
9220
                 -32248,        /* A2 = -0.984161 */
9221
                 13385,         /* B2 = 0.408478 */
9222
                 -12357,        /* B1 = -0.754242 */
9223
                 13385,         /* B0 = 0.408478 */
9224
                 31358,         /* A1 = 1.914001 */
9225
                 -32366,        /* A2 = -0.987732 */
9226
                 26488,         /* B2 = 0.80835 */
9227
                 -25692,        /* B1 = -1.568176 */
9228
                 26490,         /* B0 = 0.808411 */
9229
                 7,             /* Internal filter scaling */
9230
                 159,           /* Minimum in-band energy threshold */
9231
                 21,            /* 21/32 in-band to broad-band ratio */
9232
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9233
        },
9234
        {                       /* f360 */
9235
                31397,          /* A1 = -1.916321 */
9236
                 -32623,        /* A2 = 0.995605 */
9237
                 -117,          /* B2 = -0.003598 */
9238
                 0,              /* B1 = 0.000000 */
9239
                 117,           /* B0 = 0.003598 */
9240
                 31403,         /* A1 = -1.916687 */
9241
                 -32700,        /* A2 = 0.997925 */
9242
                 3388,          /* B2 = 0.103401 */
9243
                 -3240,         /* B1 = -0.197784 */
9244
                 3388,          /* B0 = 0.103401 */
9245
                 31463,         /* A1 = -1.920410 */
9246
                 -32702,        /* A2 = 0.997986 */
9247
                 13346,         /* B2 = 0.407288 */
9248
                 -12863,        /* B1 = -0.785126 */
9249
                 13346,         /* B0 = 0.407288 */
9250
                 5,             /* Internal filter scaling */
9251
                 159,           /* Minimum in-band energy threshold */
9252
                 21,            /* 21/32 in-band to broad-band ratio */
9253
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9254
        },
9255
        {                       /* f380_420[] */
9256
                30831,          /* A1 = 1.881775 */
9257
                 -32064,        /* A2 = -0.978546 */
9258
                 -367,          /* B2 = -0.01122 */
9259
                 0,              /* B1 = 0 */
9260
                 367,           /* B0 = 0.01122 */
9261
                 30813,         /* A1 = 1.880737 */
9262
                 -32456,        /* A2 = -0.990509 */
9263
                 11068,         /* B2 = 0.337769 */
9264
                 -10338,        /* B1 = -0.631042 */
9265
                 11068,         /* B0 = 0.337769 */
9266
                 31214,         /* A1 = 1.905212 */
9267
                 -32491,        /* A2 = -0.991577 */
9268
                 16374,         /* B2 = 0.499695 */
9269
                 -15781,        /* B1 = -0.963196 */
9270
                 16374,         /* B0 = 0.499695 */
9271
                 7,             /* Internal filter scaling */
9272
                 159,           /* Minimum in-band energy threshold */
9273
                 21,            /* 21/32 in-band to broad-band ratio */
9274
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9275
        },
9276
        {                       /* f392 */
9277
                31152,          /* A1 = -1.901428 */
9278
                 -32613,        /* A2 = 0.995300 */
9279
                 -314,          /* B2 = -0.009605 */
9280
                 0,              /* B1 = 0.000000 */
9281
                 314,           /* B0 = 0.009605 */
9282
                 31156,         /* A1 = -1.901672 */
9283
                 -32694,        /* A2 = 0.997742 */
9284
                 28847,         /* B2 = 0.880371 */
9285
                 -2734,         /* B1 = -0.166901 */
9286
                 28847,         /* B0 = 0.880371 */
9287
                 31225,         /* A1 = -1.905823 */
9288
                 -32696,        /* A2 = 0.997803 */
9289
                 462,           /* B2 = 0.014108 */
9290
                 -442,          /* B1 = -0.027019 */
9291
                 462,           /* B0 = 0.014108 */
9292
                 5,             /* Internal filter scaling */
9293
                 159,           /* Minimum in-band energy threshold */
9294
                 21,            /* 21/32 in-band to broad-band ratio */
9295
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9296
        },
9297
        {                       /* f400_425[] */
9298
                30836,          /* A1 = 1.882141 */
9299
                 -32296,        /* A2 = -0.985596 */
9300
                 -324,          /* B2 = -0.009903 */
9301
                 0,              /* B1 = 0 */
9302
                 324,           /* B0 = 0.009903 */
9303
                 30825,         /* A1 = 1.881409 */
9304
                 -32570,        /* A2 = -0.993958 */
9305
                 16847,         /* B2 = 0.51416 */
9306
                 -15792,        /* B1 = -0.963898 */
9307
                 16847,         /* B0 = 0.51416 */
9308
                 31106,         /* A1 = 1.89856 */
9309
                 -32584,        /* A2 = -0.994415 */
9310
                 9579,          /* B2 = 0.292328 */
9311
                 -9164,         /* B1 = -0.559357 */
9312
                 9579,          /* B0 = 0.292328 */
9313
                 7,             /* Internal filter scaling */
9314
                 159,           /* Minimum in-band energy threshold */
9315
                 21,            /* 21/32 in-band to broad-band ratio */
9316
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9317
        },
9318
        {                       /* f400_440[] */
9319
                30702,          /* A1 = 1.873962 */
9320
                 -32134,        /* A2 = -0.980682 */
9321
                 -517,          /* B2 = -0.015793 */
9322
                 0,              /* B1 = 0 */
9323
                 517,           /* B0 = 0.015793 */
9324
                 30676,         /* A1 = 1.872375 */
9325
                 -32520,        /* A2 = -0.992462 */
9326
                 8144,          /* B2 = 0.24855 */
9327
                 -7596,         /* B1 = -0.463684 */
9328
                 8144,          /* B0 = 0.24855 */
9329
                 31084,         /* A1 = 1.897217 */
9330
                 -32547,        /* A2 = -0.993256 */
9331
                 22713,         /* B2 = 0.693176 */
9332
                 -21734,        /* B1 = -1.326599 */
9333
                 22713,         /* B0 = 0.693176 */
9334
                 7,             /* Internal filter scaling */
9335
                 159,           /* Minimum in-band energy threshold */
9336
                 21,            /* 21/32 in-band to broad-band ratio */
9337
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9338
        },
9339
        {                       /* f400_450[] */
9340
                30613,          /* A1 = 1.86853 */
9341
                 -32031,        /* A2 = -0.977509 */
9342
                 -618,          /* B2 = -0.018866 */
9343
                 0,              /* B1 = 0 */
9344
                 618,           /* B0 = 0.018866 */
9345
                 30577,         /* A1 = 1.866272 */
9346
                 -32491,        /* A2 = -0.991577 */
9347
                 9612,          /* B2 = 0.293335 */
9348
                 -8935,         /* B1 = -0.54541 */
9349
                 9612,          /* B0 = 0.293335 */
9350
                 31071,         /* A1 = 1.896484 */
9351
                 -32524,        /* A2 = -0.992584 */
9352
                 21596,         /* B2 = 0.659058 */
9353
                 -20667,        /* B1 = -1.261414 */
9354
                 21596,         /* B0 = 0.659058 */
9355
                 7,             /* Internal filter scaling */
9356
                 159,           /* Minimum in-band energy threshold */
9357
                 21,            /* 21/32 in-band to broad-band ratio */
9358
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9359
        },
9360
        {                       /* f420 */
9361
                30914,          /* A1 = -1.886841 */
9362
                 -32584,        /* A2 = 0.994385 */
9363
                 -426,          /* B2 = -0.013020 */
9364
                 0,              /* B1 = 0.000000 */
9365
                 426,           /* B0 = 0.013020 */
9366
                 30914,         /* A1 = -1.886841 */
9367
                 -32679,        /* A2 = 0.997314 */
9368
                 17520,         /* B2 = 0.534668 */
9369
                 -16471,        /* B1 = -1.005310 */
9370
                 17520,         /* B0 = 0.534668 */
9371
                 31004,         /* A1 = -1.892334 */
9372
                 -32683,        /* A2 = 0.997406 */
9373
                 819,           /* B2 = 0.025023 */
9374
                 -780,          /* B1 = -0.047619 */
9375
                 819,           /* B0 = 0.025023 */
9376
                 5,             /* Internal filter scaling */
9377
                 159,           /* Minimum in-band energy threshold */
9378
                 21,            /* 21/32 in-band to broad-band ratio */
9379
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9380
        },
9381
#if 0
9382
        {                       /* f425 */
9383
                30881,          /* A1 = -1.884827 */
9384
                 -32603,        /* A2 = 0.994965 */
9385
                 -496,          /* B2 = -0.015144 */
9386
                 0,              /* B1 = 0.000000 */
9387
                 496,           /* B0 = 0.015144 */
9388
                 30880,         /* A1 = -1.884766 */
9389
                 -32692,        /* A2 = 0.997711 */
9390
                 24767,         /* B2 = 0.755859 */
9391
                 -23290,        /* B1 = -1.421509 */
9392
                 24767,         /* B0 = 0.755859 */
9393
                 30967,         /* A1 = -1.890076 */
9394
                 -32694,        /* A2 = 0.997772 */
9395
                 728,           /* B2 = 0.022232 */
9396
                 -691,          /* B1 = -0.042194 */
9397
                 728,           /* B0 = 0.022232 */
9398
                 5,             /* Internal filter scaling */
9399
                 159,           /* Minimum in-band energy threshold */
9400
                 21,            /* 21/32 in-band to broad-band ratio */
9401
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9402
        },
9403
#else
9404
        {
9405
                30850,
9406
                -32534,
9407
                -504,
9408
                0,
9409
                504,
9410
                30831,
9411
                -32669,
9412
                24303,
9413
                -22080,
9414
                24303,
9415
                30994,
9416
                -32673,
9417
                1905,
9418
                -1811,
9419
                1905,
9420
                5,
9421
                129,
9422
                17,
9423
                0xff5
9424
        },
9425
#endif
9426
        {                       /* f425_450[] */
9427
                30646,          /* A1 = 1.870544 */
9428
                 -32327,        /* A2 = -0.986572 */
9429
                 -287,          /* B2 = -0.008769 */
9430
                 0,              /* B1 = 0 */
9431
                 287,           /* B0 = 0.008769 */
9432
                 30627,         /* A1 = 1.869324 */
9433
                 -32607,        /* A2 = -0.995087 */
9434
                 13269,         /* B2 = 0.404968 */
9435
                 -12376,        /* B1 = -0.755432 */
9436
                 13269,         /* B0 = 0.404968 */
9437
                 30924,         /* A1 = 1.887512 */
9438
                 -32619,        /* A2 = -0.995453 */
9439
                 19950,         /* B2 = 0.608826 */
9440
                 -18940,        /* B1 = -1.156006 */
9441
                 19950,         /* B0 = 0.608826 */
9442
                 7,             /* Internal filter scaling */
9443
                 159,           /* Minimum in-band energy threshold */
9444
                 21,            /* 21/32 in-band to broad-band ratio */
9445
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9446
        },
9447
        {                       /* f425_475[] */
9448
                30396,          /* A1 = 1.855225 */
9449
                 -32014,        /* A2 = -0.97699 */
9450
                 -395,          /* B2 = -0.012055 */
9451
                 0,              /* B1 = 0 */
9452
                 395,           /* B0 = 0.012055 */
9453
                 30343,         /* A1 = 1.85199 */
9454
                 -32482,        /* A2 = -0.991302 */
9455
                 17823,         /* B2 = 0.543945 */
9456
                 -16431,        /* B1 = -1.002869 */
9457
                 17823,         /* B0 = 0.543945 */
9458
                 30872,         /* A1 = 1.884338 */
9459
                 -32516,        /* A2 = -0.99231 */
9460
                 18124,         /* B2 = 0.553101 */
9461
                 -17246,        /* B1 = -1.052673 */
9462
                 18124,         /* B0 = 0.553101 */
9463
                 7,             /* Internal filter scaling */
9464
                 159,           /* Minimum in-band energy threshold */
9465
                 21,            /* 21/32 in-band to broad-band ratio */
9466
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9467
        },
9468
        {                       /* f435 */
9469
                30796,          /* A1 = -1.879639 */
9470
                 -32603,        /* A2 = 0.994965 */
9471
                 -254,          /* B2 = -0.007762 */
9472
                 0,              /* B1 = 0.000000 */
9473
                 254,           /* B0 = 0.007762 */
9474
                 30793,         /* A1 = -1.879456 */
9475
                 -32692,        /* A2 = 0.997711 */
9476
                 18934,         /* B2 = 0.577820 */
9477
                 -17751,        /* B1 = -1.083496 */
9478
                 18934,         /* B0 = 0.577820 */
9479
                 30882,         /* A1 = -1.884888 */
9480
                 -32694,        /* A2 = 0.997772 */
9481
                 1858,          /* B2 = 0.056713 */
9482
                 -1758,         /* B1 = -0.107357 */
9483
                 1858,          /* B0 = 0.056713 */
9484
                 5,             /* Internal filter scaling */
9485
                 159,           /* Minimum in-band energy threshold */
9486
                 21,            /* 21/32 in-band to broad-band ratio */
9487
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9488
        },
9489
        {                       /* f440_450[] */
9490
                30641,          /* A1 = 1.870239 */
9491
                 -32458,        /* A2 = -0.99057 */
9492
                 -155,          /* B2 = -0.004735 */
9493
                 0,              /* B1 = 0 */
9494
                 155,           /* B0 = 0.004735 */
9495
                 30631,         /* A1 = 1.869568 */
9496
                 -32630,        /* A2 = -0.995789 */
9497
                 11453,         /* B2 = 0.349548 */
9498
                 -10666,        /* B1 = -0.651001 */
9499
                 11453,         /* B0 = 0.349548 */
9500
                 30810,         /* A1 = 1.880554 */
9501
                 -32634,        /* A2 = -0.995941 */
9502
                 12237,         /* B2 = 0.373474 */
9503
                 -11588,        /* B1 = -0.707336 */
9504
                 12237,         /* B0 = 0.373474 */
9505
                 7,             /* Internal filter scaling */
9506
                 159,           /* Minimum in-band energy threshold */
9507
                 21,            /* 21/32 in-band to broad-band ratio */
9508
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9509
        },
9510
        {                       /* f440_480[] */
9511
                30367,          /* A1 = 1.853455 */
9512
                 -32147,        /* A2 = -0.981079 */
9513
                 -495,          /* B2 = -0.015113 */
9514
                 0,              /* B1 = 0 */
9515
                 495,           /* B0 = 0.015113 */
9516
                 30322,         /* A1 = 1.850769 */
9517
                 -32543,        /* A2 = -0.993134 */
9518
                 10031,         /* B2 = 0.306152 */
9519
                 -9252,         /* B1 = -0.564728 */
9520
                 10031,         /* B0 = 0.306152 */
9521
                 30770,         /* A1 = 1.878052 */
9522
                 -32563,        /* A2 = -0.993774 */
9523
                 22674,         /* B2 = 0.691956 */
9524
                 -21465,        /* B1 = -1.31012 */
9525
                 22674,         /* B0 = 0.691956 */
9526
                 7,             /* Internal filter scaling */
9527
                 159,           /* Minimum in-band energy threshold */
9528
                 21,            /* 21/32 in-band to broad-band ratio */
9529
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9530
        },
9531
        {                       /* f445 */
9532
                30709,          /* A1 = -1.874329 */
9533
                 -32603,        /* A2 = 0.994965 */
9534
                 -83,           /* B2 = -0.002545 */
9535
                 0,              /* B1 = 0.000000 */
9536
                 83,            /* B0 = 0.002545 */
9537
                 30704,         /* A1 = -1.874084 */
9538
                 -32692,        /* A2 = 0.997711 */
9539
                 10641,         /* B2 = 0.324738 */
9540
                 -9947,         /* B1 = -0.607147 */
9541
                 10641,         /* B0 = 0.324738 */
9542
                 30796,         /* A1 = -1.879639 */
9543
                 -32694,        /* A2 = 0.997772 */
9544
                 10079,         /* B2 = 0.307587 */
9545
                 9513,          /* B1 = 0.580688 */
9546
                 10079,         /* B0 = 0.307587 */
9547
                 5,             /* Internal filter scaling */
9548
                 159,           /* Minimum in-band energy threshold */
9549
                 21,            /* 21/32 in-band to broad-band ratio */
9550
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9551
        },
9552
        {                       /* f450 */
9553
                30664,          /* A1 = -1.871643 */
9554
                 -32603,        /* A2 = 0.994965 */
9555
                 -164,          /* B2 = -0.005029 */
9556
                 0,              /* B1 = 0.000000 */
9557
                 164,           /* B0 = 0.005029 */
9558
                 30661,         /* A1 = -1.871399 */
9559
                 -32692,        /* A2 = 0.997711 */
9560
                 15294,         /* B2 = 0.466736 */
9561
                 -14275,        /* B1 = -0.871307 */
9562
                 15294,         /* B0 = 0.466736 */
9563
                 30751,         /* A1 = -1.876953 */
9564
                 -32694,        /* A2 = 0.997772 */
9565
                 3548,          /* B2 = 0.108284 */
9566
                 -3344,         /* B1 = -0.204155 */
9567
                 3548,          /* B0 = 0.108284 */
9568
                 5,             /* Internal filter scaling */
9569
                 159,           /* Minimum in-band energy threshold */
9570
                 21,            /* 21/32 in-band to broad-band ratio */
9571
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9572
        },
9573
        {                       /* f452 */
9574
                30653,          /* A1 = -1.870911 */
9575
                 -32615,        /* A2 = 0.995361 */
9576
                 -209,          /* B2 = -0.006382 */
9577
                 0,              /* B1 = 0.000000 */
9578
                 209,           /* B0 = 0.006382 */
9579
                 30647,         /* A1 = -1.870605 */
9580
                 -32702,        /* A2 = 0.997986 */
9581
                 18971,         /* B2 = 0.578979 */
9582
                 -17716,        /* B1 = -1.081299 */
9583
                 18971,         /* B0 = 0.578979 */
9584
                 30738,         /* A1 = -1.876099 */
9585
                 -32702,        /* A2 = 0.998016 */
9586
                 2967,          /* B2 = 0.090561 */
9587
                 -2793,         /* B1 = -0.170502 */
9588
                 2967,          /* B0 = 0.090561 */
9589
                 5,             /* Internal filter scaling */
9590
                 159,           /* Minimum in-band energy threshold */
9591
                 21,            /* 21/32 in-band to broad-band ratio */
9592
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9593
        },
9594
        {                       /* f475 */
9595
                30437,          /* A1 = -1.857727 */
9596
                 -32603,        /* A2 = 0.994965 */
9597
                 -264,          /* B2 = -0.008062 */
9598
                 0,              /* B1 = 0.000000 */
9599
                 264,           /* B0 = 0.008062 */
9600
                 30430,         /* A1 = -1.857300 */
9601
                 -32692,        /* A2 = 0.997711 */
9602
                 21681,         /* B2 = 0.661682 */
9603
                 -20082,        /* B1 = -1.225708 */
9604
                 21681,         /* B0 = 0.661682 */
9605
                 30526,         /* A1 = -1.863220 */
9606
                 -32694,        /* A2 = 0.997742 */
9607
                 1559,          /* B2 = 0.047600 */
9608
                 -1459,         /* B1 = -0.089096 */
9609
                 1559,          /* B0 = 0.047600 */
9610
                 5,             /* Internal filter scaling */
9611
                 159,           /* Minimum in-band energy threshold */
9612
                 21,            /* 21/32 in-band to broad-band ratio */
9613
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9614
        },
9615
        {                       /* f480_620[] */
9616
                28975,          /* A1 = 1.768494 */
9617
                 -30955,        /* A2 = -0.944672 */
9618
                 -1026,         /* B2 = -0.03133 */
9619
                 0,              /* B1 = 0 */
9620
                 1026,          /* B0 = 0.03133 */
9621
                 28613,         /* A1 = 1.746399 */
9622
                 -32089,        /* A2 = -0.979309 */
9623
                 14214,         /* B2 = 0.433807 */
9624
                 -12202,        /* B1 = -0.744812 */
9625
                 14214,         /* B0 = 0.433807 */
9626
                 30243,         /* A1 = 1.845947 */
9627
                 -32238,        /* A2 = -0.983856 */
9628
                 24825,         /* B2 = 0.757629 */
9629
                 -23402,        /* B1 = -1.428345 */
9630
                 24825,         /* B0 = 0.757629 */
9631
                 7,             /* Internal filter scaling */
9632
                 159,           /* Minimum in-band energy threshold */
9633
                 21,            /* 21/32 in-band to broad-band ratio */
9634
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9635
        },
9636
        {                       /* f494 */
9637
                30257,          /* A1 = -1.846741 */
9638
                 -32605,        /* A2 = 0.995056 */
9639
                 -249,          /* B2 = -0.007625 */
9640
                 0,              /* B1 = 0.000000 */
9641
                 249,           /* B0 = 0.007625 */
9642
                 30247,         /* A1 = -1.846191 */
9643
                 -32694,        /* A2 = 0.997772 */
9644
                 18088,         /* B2 = 0.552002 */
9645
                 -16652,        /* B1 = -1.016418 */
9646
                 18088,         /* B0 = 0.552002 */
9647
                 30348,         /* A1 = -1.852295 */
9648
                 -32696,        /* A2 = 0.997803 */
9649
                 2099,          /* B2 = 0.064064 */
9650
                 -1953,         /* B1 = -0.119202 */
9651
                 2099,          /* B0 = 0.064064 */
9652
                 5,             /* Internal filter scaling */
9653
                 159,           /* Minimum in-band energy threshold */
9654
                 21,            /* 21/32 in-band to broad-band ratio */
9655
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9656
        },
9657
        {                       /* f500 */
9658
                30202,          /* A1 = -1.843431 */
9659
                 -32624,        /* A2 = 0.995622 */
9660
                 -413,          /* B2 = -0.012622 */
9661
                 0,              /* B1 = 0.000000 */
9662
                 413,           /* B0 = 0.012622 */
9663
                 30191,         /* A1 = -1.842721 */
9664
                 -32714,        /* A2 = 0.998364 */
9665
                 25954,         /* B2 = 0.792057 */
9666
                 -23890,        /* B1 = -1.458131 */
9667
                 25954,         /* B0 = 0.792057 */
9668
                 30296,         /* A1 = -1.849172 */
9669
                 -32715,        /* A2 = 0.998397 */
9670
                 2007,          /* B2 = 0.061264 */
9671
                 -1860,         /* B1 = -0.113568 */
9672
                 2007,          /* B0 = 0.061264 */
9673
                 5,             /* Internal filter scaling */
9674
                 159,           /* Minimum in-band energy threshold */
9675
                 21,            /* 21/32 in-band to broad-band ratio */
9676
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9677
        },
9678
        {                       /* f520 */
9679
                30001,          /* A1 = -1.831116 */
9680
                 -32613,        /* A2 = 0.995270 */
9681
                 -155,          /* B2 = -0.004750 */
9682
                 0,              /* B1 = 0.000000 */
9683
                 155,           /* B0 = 0.004750 */
9684
                 29985,         /* A1 = -1.830200 */
9685
                 -32710,        /* A2 = 0.998260 */
9686
                 6584,          /* B2 = 0.200928 */
9687
                 -6018,         /* B1 = -0.367355 */
9688
                 6584,          /* B0 = 0.200928 */
9689
                 30105,         /* A1 = -1.837524 */
9690
                 -32712,        /* A2 = 0.998291 */
9691
                 23812,         /* B2 = 0.726685 */
9692
                 -21936,        /* B1 = -1.338928 */
9693
                 23812,         /* B0 = 0.726685 */
9694
                 5,             /* Internal filter scaling */
9695
                 159,           /* Minimum in-band energy threshold */
9696
                 21,            /* 21/32 in-band to broad-band ratio */
9697
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9698
        },
9699
        {                       /* f523 */
9700
                29964,          /* A1 = -1.828918 */
9701
                 -32601,        /* A2 = 0.994904 */
9702
                 -101,          /* B2 = -0.003110 */
9703
                 0,              /* B1 = 0.000000 */
9704
                 101,           /* B0 = 0.003110 */
9705
                 29949,         /* A1 = -1.827942 */
9706
                 -32700,        /* A2 = 0.997925 */
9707
                 11041,         /* B2 = 0.336975 */
9708
                 -10075,        /* B1 = -0.614960 */
9709
                 11041,         /* B0 = 0.336975 */
9710
                 30070,         /* A1 = -1.835388 */
9711
                 -32702,        /* A2 = 0.997986 */
9712
                 16762,         /* B2 = 0.511536 */
9713
                 -15437,        /* B1 = -0.942230 */
9714
                 16762,         /* B0 = 0.511536 */
9715
                 5,             /* Internal filter scaling */
9716
                 159,           /* Minimum in-band energy threshold */
9717
                 21,            /* 21/32 in-band to broad-band ratio */
9718
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9719
        },
9720
        {                       /* f525 */
9721
                29936,          /* A1 = -1.827209 */
9722
                 -32584,        /* A2 = 0.994415 */
9723
                 -91,           /* B2 = -0.002806 */
9724
                 0,              /* B1 = 0.000000 */
9725
                 91,            /* B0 = 0.002806 */
9726
                 29921,         /* A1 = -1.826233 */
9727
                 -32688,        /* A2 = 0.997559 */
9728
                 11449,         /* B2 = 0.349396 */
9729
                 -10426,        /* B1 = -0.636383 */
9730
                 11449,         /* B0 = 0.349396 */
9731
                 30045,         /* A1 = -1.833862 */
9732
                 -32688,        /* A2 = 0.997589 */
9733
                 13055,         /* B2 = 0.398407 */
9734
                 -12028,        /* B1 = -0.734161 */
9735
                 13055,         /* B0 = 0.398407 */
9736
                 5,             /* Internal filter scaling */
9737
                 159,           /* Minimum in-band energy threshold */
9738
                 21,            /* 21/32 in-band to broad-band ratio */
9739
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9740
        },
9741
        {                       /* f540_660[] */
9742
                28499,          /* A1 = 1.739441 */
9743
                 -31129,        /* A2 = -0.949982 */
9744
                 -849,          /* B2 = -0.025922 */
9745
                 0,              /* B1 = 0 */
9746
                 849,           /* B0 = 0.025922 */
9747
                 28128,         /* A1 = 1.716797 */
9748
                 -32130,        /* A2 = -0.98056 */
9749
                 14556,         /* B2 = 0.444214 */
9750
                 -12251,        /* B1 = -0.747772 */
9751
                 14556,         /* B0 = 0.444244 */
9752
                 29667,         /* A1 = 1.81073 */
9753
                 -32244,        /* A2 = -0.984039 */
9754
                 23038,         /* B2 = 0.703064 */
9755
                 -21358,        /* B1 = -1.303589 */
9756
                 23040,         /* B0 = 0.703125 */
9757
                 7,             /* Internal filter scaling */
9758
                 159,           /* Minimum in-band energy threshold */
9759
                 21,            /* 21/32 in-band to broad-band ratio */
9760
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9761
        },
9762
        {                       /* f587 */
9763
                29271,          /* A1 = -1.786560 */
9764
                 -32599,        /* A2 = 0.994873 */
9765
                 -490,          /* B2 = -0.014957 */
9766
                 0,              /* B1 = 0.000000 */
9767
                 490,           /* B0 = 0.014957 */
9768
                 29246,         /* A1 = -1.785095 */
9769
                 -32700,        /* A2 = 0.997925 */
9770
                 28961,         /* B2 = 0.883850 */
9771
                 -25796,        /* B1 = -1.574463 */
9772
                 28961,         /* B0 = 0.883850 */
9773
                 29383,         /* A1 = -1.793396 */
9774
                 -32700,        /* A2 = 0.997955 */
9775
                 1299,          /* B2 = 0.039650 */
9776
                 -1169,         /* B1 = -0.071396 */
9777
                 1299,          /* B0 = 0.039650 */
9778
                 5,             /* Internal filter scaling */
9779
                 159,           /* Minimum in-band energy threshold */
9780
                 21,            /* 21/32 in-band to broad-band ratio */
9781
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9782
        },
9783
        {                       /* f590 */
9784
                29230,          /* A1 = -1.784058 */
9785
                 -32584,        /* A2 = 0.994415 */
9786
                 -418,          /* B2 = -0.012757 */
9787
                 0,              /* B1 = 0.000000 */
9788
                 418,           /* B0 = 0.012757 */
9789
                 29206,         /* A1 = -1.782593 */
9790
                 -32688,        /* A2 = 0.997559 */
9791
                 36556,         /* B2 = 1.115601 */
9792
                 -32478,        /* B1 = -1.982300 */
9793
                 36556,         /* B0 = 1.115601 */
9794
                 29345,         /* A1 = -1.791077 */
9795
                 -32688,        /* A2 = 0.997589 */
9796
                 897,           /* B2 = 0.027397 */
9797
                 -808,          /* B1 = -0.049334 */
9798
                 897,           /* B0 = 0.027397 */
9799
                 5,             /* Internal filter scaling */
9800
                 159,           /* Minimum in-band energy threshold */
9801
                 21,            /* 21/32 in-band to broad-band ratio */
9802
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9803
        },
9804
        {                       /* f600 */
9805
                29116,          /* A1 = -1.777100 */
9806
                 -32603,        /* A2 = 0.994965 */
9807
                 -165,          /* B2 = -0.005039 */
9808
                 0,              /* B1 = 0.000000 */
9809
                 165,           /* B0 = 0.005039 */
9810
                 29089,         /* A1 = -1.775452 */
9811
                 -32708,        /* A2 = 0.998199 */
9812
                 6963,          /* B2 = 0.212494 */
9813
                 -6172,         /* B1 = -0.376770 */
9814
                 6963,          /* B0 = 0.212494 */
9815
                 29237,         /* A1 = -1.784485 */
9816
                 -32710,        /* A2 = 0.998230 */
9817
                 24197,         /* B2 = 0.738464 */
9818
                 -21657,        /* B1 = -1.321899 */
9819
                 24197,         /* B0 = 0.738464 */
9820
                 5,             /* Internal filter scaling */
9821
                 159,           /* Minimum in-band energy threshold */
9822
                 21,            /* 21/32 in-band to broad-band ratio */
9823
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9824
        },
9825
        {                       /* f660 */
9826
                28376,          /* A1 = -1.731934 */
9827
                 -32567,        /* A2 = 0.993896 */
9828
                 -363,          /* B2 = -0.011102 */
9829
                 0,              /* B1 = 0.000000 */
9830
                 363,           /* B0 = 0.011102 */
9831
                 28337,         /* A1 = -1.729614 */
9832
                 -32683,        /* A2 = 0.997434 */
9833
                 21766,         /* B2 = 0.664246 */
9834
                 -18761,        /* B1 = -1.145081 */
9835
                 21766,         /* B0 = 0.664246 */
9836
                 28513,         /* A1 = -1.740356 */
9837
                 -32686,        /* A2 = 0.997498 */
9838
                 2509,          /* B2 = 0.076584 */
9839
                 -2196,         /* B1 = -0.134041 */
9840
                 2509,          /* B0 = 0.076584 */
9841
                 5,             /* Internal filter scaling */
9842
                 159,           /* Minimum in-band energy threshold */
9843
                 21,            /* 21/32 in-band to broad-band ratio */
9844
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9845
        },
9846
        {                       /* f700 */
9847
                27844,          /* A1 = -1.699463 */
9848
                 -32563,        /* A2 = 0.993744 */
9849
                 -366,          /* B2 = -0.011187 */
9850
                 0,              /* B1 = 0.000000 */
9851
                 366,           /* B0 = 0.011187 */
9852
                 27797,         /* A1 = -1.696655 */
9853
                 -32686,        /* A2 = 0.997498 */
9854
                 22748,         /* B2 = 0.694214 */
9855
                 -19235,        /* B1 = -1.174072 */
9856
                 22748,         /* B0 = 0.694214 */
9857
                 27995,         /* A1 = -1.708740 */
9858
                 -32688,        /* A2 = 0.997559 */
9859
                 2964,          /* B2 = 0.090477 */
9860
                 -2546,         /* B1 = -0.155449 */
9861
                 2964,          /* B0 = 0.090477 */
9862
                 5,             /* Internal filter scaling */
9863
                 159,           /* Minimum in-band energy threshold */
9864
                 21,            /* 21/32 in-band to broad-band ratio */
9865
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9866
        },
9867
        {                       /* f740 */
9868
                27297,          /* A1 = -1.666077 */
9869
                 -32551,        /* A2 = 0.993408 */
9870
                 -345,          /* B2 = -0.010540 */
9871
                 0,              /* B1 = 0.000000 */
9872
                 345,           /* B0 = 0.010540 */
9873
                 27240,         /* A1 = -1.662598 */
9874
                 -32683,        /* A2 = 0.997406 */
9875
                 22560,         /* B2 = 0.688477 */
9876
                 -18688,        /* B1 = -1.140625 */
9877
                 22560,         /* B0 = 0.688477 */
9878
                 27461,         /* A1 = -1.676147 */
9879
                 -32684,        /* A2 = 0.997467 */
9880
                 3541,          /* B2 = 0.108086 */
9881
                 -2985,         /* B1 = -0.182220 */
9882
                 3541,          /* B0 = 0.108086 */
9883
                 5,             /* Internal filter scaling */
9884
                 159,           /* Minimum in-band energy threshold */
9885
                 21,            /* 21/32 in-band to broad-band ratio */
9886
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9887
        },
9888
        {                       /* f750 */
9889
                27155,          /* A1 = -1.657410 */
9890
                 -32551,        /* A2 = 0.993408 */
9891
                 -462,          /* B2 = -0.014117 */
9892
                 0,              /* B1 = 0.000000 */
9893
                 462,           /* B0 = 0.014117 */
9894
                 27097,         /* A1 = -1.653870 */
9895
                 -32683,        /* A2 = 0.997406 */
9896
                 32495,         /* B2 = 0.991699 */
9897
                 -26776,        /* B1 = -1.634338 */
9898
                 32495,         /* B0 = 0.991699 */
9899
                 27321,         /* A1 = -1.667542 */
9900
                 -32684,        /* A2 = 0.997467 */
9901
                 1835,          /* B2 = 0.056007 */
9902
                 -1539,         /* B1 = -0.093948 */
9903
                 1835,          /* B0 = 0.056007 */
9904
                 5,             /* Internal filter scaling */
9905
                 159,           /* Minimum in-band energy threshold */
9906
                 21,            /* 21/32 in-band to broad-band ratio */
9907
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9908
        },
9909
        {                       /* f750_1450[] */
9910
                19298,          /* A1 = 1.177917 */
9911
                 -24471,        /* A2 = -0.746796 */
9912
                 -4152,         /* B2 = -0.126709 */
9913
                 0,              /* B1 = 0 */
9914
                 4152,          /* B0 = 0.126709 */
9915
                 12902,         /* A1 = 0.787476 */
9916
                 -29091,        /* A2 = -0.887817 */
9917
                 12491,         /* B2 = 0.38121 */
9918
                 -1794,         /* B1 = -0.109528 */
9919
                 12494,         /* B0 = 0.381317 */
9920
                 26291,         /* A1 = 1.604736 */
9921
                 -30470,        /* A2 = -0.929901 */
9922
                 28859,         /* B2 = 0.880737 */
9923
                 -26084,        /* B1 = -1.592102 */
9924
                 28861,         /* B0 = 0.880798 */
9925
                 7,             /* Internal filter scaling */
9926
                 159,           /* Minimum in-band energy threshold */
9927
                 21,            /* 21/32 in-band to broad-band ratio */
9928
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9929
        },
9930
        {                       /* f770 */
9931
                26867,          /* A1 = -1.639832 */
9932
                 -32551,        /* A2 = 0.993408 */
9933
                 -123,          /* B2 = -0.003755 */
9934
                 0,              /* B1 = 0.000000 */
9935
                 123,           /* B0 = 0.003755 */
9936
                 26805,         /* A1 = -1.636108 */
9937
                 -32683,        /* A2 = 0.997406 */
9938
                 17297,         /* B2 = 0.527863 */
9939
                 -14096,        /* B1 = -0.860382 */
9940
                 17297,         /* B0 = 0.527863 */
9941
                 27034,         /* A1 = -1.650085 */
9942
                 -32684,        /* A2 = 0.997467 */
9943
                 12958,         /* B2 = 0.395477 */
9944
                 -10756,        /* B1 = -0.656525 */
9945
                 12958,         /* B0 = 0.395477 */
9946
                 5,             /* Internal filter scaling */
9947
                 159,           /* Minimum in-band energy threshold */
9948
                 21,            /* 21/32 in-band to broad-band ratio */
9949
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9950
        },
9951
        {                       /* f800 */
9952
                26413,          /* A1 = -1.612122 */
9953
                 -32547,        /* A2 = 0.993286 */
9954
                 -223,          /* B2 = -0.006825 */
9955
                 0,              /* B1 = 0.000000 */
9956
                 223,           /* B0 = 0.006825 */
9957
                 26342,         /* A1 = -1.607849 */
9958
                 -32686,        /* A2 = 0.997498 */
9959
                 6391,          /* B2 = 0.195053 */
9960
                 -5120,         /* B1 = -0.312531 */
9961
                 6391,          /* B0 = 0.195053 */
9962
                 26593,         /* A1 = -1.623108 */
9963
                 -32688,        /* A2 = 0.997559 */
9964
                 23681,         /* B2 = 0.722717 */
9965
                 -19328,        /* B1 = -1.179688 */
9966
                 23681,         /* B0 = 0.722717 */
9967
                 5,             /* Internal filter scaling */
9968
                 159,           /* Minimum in-band energy threshold */
9969
                 21,            /* 21/32 in-band to broad-band ratio */
9970
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9971
        },
9972
        {                       /* f816 */
9973
                26168,          /* A1 = -1.597209 */
9974
                 -32528,        /* A2 = 0.992706 */
9975
                 -235,          /* B2 = -0.007182 */
9976
                 0,              /* B1 = 0.000000 */
9977
                 235,           /* B0 = 0.007182 */
9978
                 26092,         /* A1 = -1.592590 */
9979
                 -32675,        /* A2 = 0.997192 */
9980
                 20823,         /* B2 = 0.635498 */
9981
                 -16510,        /* B1 = -1.007751 */
9982
                 20823,         /* B0 = 0.635498 */
9983
                 26363,         /* A1 = -1.609070 */
9984
                 -32677,        /* A2 = 0.997253 */
9985
                 6739,          /* B2 = 0.205688 */
9986
                 -5459,         /* B1 = -0.333206 */
9987
                 6739,          /* B0 = 0.205688 */
9988
                 5,             /* Internal filter scaling */
9989
                 159,           /* Minimum in-band energy threshold */
9990
                 21,            /* 21/32 in-band to broad-band ratio */
9991
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9992
        },
9993
        {                       /* f850 */
9994
                25641,          /* A1 = -1.565063 */
9995
                 -32536,        /* A2 = 0.992950 */
9996
                 -121,          /* B2 = -0.003707 */
9997
                 0,              /* B1 = 0.000000 */
9998
                 121,           /* B0 = 0.003707 */
9999
                 25560,         /* A1 = -1.560059 */
10000
                 -32684,        /* A2 = 0.997437 */
10001
                 18341,         /* B2 = 0.559753 */
10002
                 -14252,        /* B1 = -0.869904 */
10003
                 18341,         /* B0 = 0.559753 */
10004
                 25837,         /* A1 = -1.577026 */
10005
                 -32684,        /* A2 = 0.997467 */
10006
                 16679,         /* B2 = 0.509003 */
10007
                 -13232,        /* B1 = -0.807648 */
10008
                 16679,         /* B0 = 0.509003 */
10009
                 5,             /* Internal filter scaling */
10010
                 159,           /* Minimum in-band energy threshold */
10011
                 21,            /* 21/32 in-band to broad-band ratio */
10012
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10013
        },
10014
        {                       /* f857_1645[] */
10015
                16415,          /* A1 = 1.001953 */
10016
                 -23669,        /* A2 = -0.722321 */
10017
                 -4549,         /* B2 = -0.138847 */
10018
                 0,              /* B1 = 0 */
10019
                 4549,          /* B0 = 0.138847 */
10020
                 8456,          /* A1 = 0.516174 */
10021
                 -28996,        /* A2 = -0.884918 */
10022
                 13753,         /* B2 = 0.419724 */
10023
                 -12,           /* B1 = -0.000763 */
10024
                 13757,         /* B0 = 0.419846 */
10025
                 24632,         /* A1 = 1.503418 */
10026
                 -30271,        /* A2 = -0.923828 */
10027
                 29070,         /* B2 = 0.887146 */
10028
                 -25265,        /* B1 = -1.542114 */
10029
                 29073,         /* B0 = 0.887268 */
10030
                 7,             /* Internal filter scaling */
10031
                 159,           /* Minimum in-band energy threshold */
10032
                 21,            /* 21/32 in-band to broad-band ratio */
10033
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10034
        },
10035
        {                       /* f900 */
10036
                24806,          /* A1 = -1.514099 */
10037
                 -32501,        /* A2 = 0.991852 */
10038
                 -326,          /* B2 = -0.009969 */
10039
                 0,              /* B1 = 0.000000 */
10040
                 326,           /* B0 = 0.009969 */
10041
                 24709,         /* A1 = -1.508118 */
10042
                 -32659,        /* A2 = 0.996674 */
10043
                 20277,         /* B2 = 0.618835 */
10044
                 -15182,        /* B1 = -0.926636 */
10045
                 20277,         /* B0 = 0.618835 */
10046
                 25022,         /* A1 = -1.527222 */
10047
                 -32661,        /* A2 = 0.996735 */
10048
                 4320,          /* B2 = 0.131836 */
10049
                 -3331,         /* B1 = -0.203339 */
10050
                 4320,          /* B0 = 0.131836 */
10051
                 5,             /* Internal filter scaling */
10052
                 159,           /* Minimum in-band energy threshold */
10053
                 21,            /* 21/32 in-band to broad-band ratio */
10054
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10055
        },
10056
        {                       /* f900_1300[] */
10057
                19776,          /* A1 = 1.207092 */
10058
                 -27437,        /* A2 = -0.837341 */
10059
                 -2666,         /* B2 = -0.081371 */
10060
                 0,              /* B1 = 0 */
10061
                 2666,          /* B0 = 0.081371 */
10062
                 16302,         /* A1 = 0.995026 */
10063
                 -30354,        /* A2 = -0.926361 */
10064
                 10389,         /* B2 = 0.317062 */
10065
                 -3327,         /* B1 = -0.203064 */
10066
                 10389,         /* B0 = 0.317062 */
10067
                 24299,         /* A1 = 1.483154 */
10068
                 -30930,        /* A2 = -0.943909 */
10069
                 25016,         /* B2 = 0.763428 */
10070
                 -21171,        /* B1 = -1.292236 */
10071
                 25016,         /* B0 = 0.763428 */
10072
                 7,             /* Internal filter scaling */
10073
                 159,           /* Minimum in-band energy threshold */
10074
                 21,            /* 21/32 in-band to broad-band ratio */
10075
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10076
        },
10077
        {                       /* f935_1215[] */
10078
                20554,          /* A1 = 1.254517 */
10079
                 -28764,        /* A2 = -0.877838 */
10080
                 -2048,         /* B2 = -0.062515 */
10081
                 0,              /* B1 = 0 */
10082
                 2048,          /* B0 = 0.062515 */
10083
                 18209,         /* A1 = 1.11145 */
10084
                 -30951,        /* A2 = -0.94458 */
10085
                 9390,          /* B2 = 0.286575 */
10086
                 -3955,         /* B1 = -0.241455 */
10087
                 9390,          /* B0 = 0.286575 */
10088
                 23902,         /* A1 = 1.458923 */
10089
                 -31286,        /* A2 = -0.954803 */
10090
                 23252,         /* B2 = 0.709595 */
10091
                 -19132,        /* B1 = -1.167725 */
10092
                 23252,         /* B0 = 0.709595 */
10093
                 7,             /* Internal filter scaling */
10094
                 159,           /* Minimum in-band energy threshold */
10095
                 21,            /* 21/32 in-band to broad-band ratio */
10096
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10097
        },
10098
        {                       /* f941_1477[] */
10099
                17543,          /* A1 = 1.07074 */
10100
                 -26220,        /* A2 = -0.800201 */
10101
                 -3298,         /* B2 = -0.100647 */
10102
                 0,              /* B1 = 0 */
10103
                 3298,          /* B0 = 0.100647 */
10104
                 12423,         /* A1 = 0.75827 */
10105
                 -30036,        /* A2 = -0.916626 */
10106
                 12651,         /* B2 = 0.386078 */
10107
                 -2444,         /* B1 = -0.14917 */
10108
                 12653,         /* B0 = 0.386154 */
10109
                 23518,         /* A1 = 1.435425 */
10110
                 -30745,        /* A2 = -0.938293 */
10111
                 27282,         /* B2 = 0.832581 */
10112
                 -22529,        /* B1 = -1.375122 */
10113
                 27286,         /* B0 = 0.832703 */
10114
                 7,             /* Internal filter scaling */
10115
                 159,           /* Minimum in-band energy threshold */
10116
                 21,            /* 21/32 in-band to broad-band ratio */
10117
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10118
        },
10119
        {                       /* f942 */
10120
                24104,          /* A1 = -1.471252 */
10121
                 -32507,        /* A2 = 0.992065 */
10122
                 -351,          /* B2 = -0.010722 */
10123
                 0,              /* B1 = 0.000000 */
10124
                 351,           /* B0 = 0.010722 */
10125
                 23996,         /* A1 = -1.464600 */
10126
                 -32671,        /* A2 = 0.997040 */
10127
                 22848,         /* B2 = 0.697266 */
10128
                 -16639,        /* B1 = -1.015564 */
10129
                 22848,         /* B0 = 0.697266 */
10130
                 24332,         /* A1 = -1.485168 */
10131
                 -32673,        /* A2 = 0.997101 */
10132
                 4906,          /* B2 = 0.149727 */
10133
                 -3672,         /* B1 = -0.224174 */
10134
                 4906,          /* B0 = 0.149727 */
10135
                 5,             /* Internal filter scaling */
10136
                 159,           /* Minimum in-band energy threshold */
10137
                 21,            /* 21/32 in-band to broad-band ratio */
10138
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10139
        },
10140
        {                       /* f950 */
10141
                23967,          /* A1 = -1.462830 */
10142
                 -32507,        /* A2 = 0.992065 */
10143
                 -518,          /* B2 = -0.015821 */
10144
                 0,              /* B1 = 0.000000 */
10145
                 518,           /* B0 = 0.015821 */
10146
                 23856,         /* A1 = -1.456055 */
10147
                 -32671,        /* A2 = 0.997040 */
10148
                 26287,         /* B2 = 0.802246 */
10149
                 -19031,        /* B1 = -1.161560 */
10150
                 26287,         /* B0 = 0.802246 */
10151
                 24195,         /* A1 = -1.476746 */
10152
                 -32673,        /* A2 = 0.997101 */
10153
                 2890,          /* B2 = 0.088196 */
10154
                 -2151,         /* B1 = -0.131317 */
10155
                 2890,          /* B0 = 0.088196 */
10156
                 5,             /* Internal filter scaling */
10157
                 159,           /* Minimum in-band energy threshold */
10158
                 21,            /* 21/32 in-band to broad-band ratio */
10159
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10160
        },
10161
        {                       /* f950_1400[] */
10162
                18294,          /* A1 = 1.116638 */
10163
                 -26962,        /* A2 = -0.822845 */
10164
                 -2914,         /* B2 = -0.088936 */
10165
                 0,              /* B1 = 0 */
10166
                 2914,          /* B0 = 0.088936 */
10167
                 14119,         /* A1 = 0.861786 */
10168
                 -30227,        /* A2 = -0.922455 */
10169
                 11466,         /* B2 = 0.349945 */
10170
                 -2833,         /* B1 = -0.172943 */
10171
                 11466,         /* B0 = 0.349945 */
10172
                 23431,         /* A1 = 1.430115 */
10173
                 -30828,        /* A2 = -0.940796 */
10174
                 25331,         /* B2 = 0.773071 */
10175
                 -20911,        /* B1 = -1.276367 */
10176
                 25331,         /* B0 = 0.773071 */
10177
                 7,             /* Internal filter scaling */
10178
                 159,           /* Minimum in-band energy threshold */
10179
                 21,            /* 21/32 in-band to broad-band ratio */
10180
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10181
        },
10182
        {                       /* f975 */
10183
                23521,          /* A1 = -1.435608 */
10184
                 -32489,        /* A2 = 0.991516 */
10185
                 -193,          /* B2 = -0.005915 */
10186
                 0,              /* B1 = 0.000000 */
10187
                 193,           /* B0 = 0.005915 */
10188
                 23404,         /* A1 = -1.428467 */
10189
                 -32655,        /* A2 = 0.996582 */
10190
                 17740,         /* B2 = 0.541412 */
10191
                 -12567,        /* B1 = -0.767029 */
10192
                 17740,         /* B0 = 0.541412 */
10193
                 23753,         /* A1 = -1.449829 */
10194
                 -32657,        /* A2 = 0.996613 */
10195
                 9090,          /* B2 = 0.277405 */
10196
                 -6662,         /* B1 = -0.406647 */
10197
                 9090,          /* B0 = 0.277405 */
10198
                 5,             /* Internal filter scaling */
10199
                 159,           /* Minimum in-band energy threshold */
10200
                 21,            /* 21/32 in-band to broad-band ratio */
10201
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10202
        },
10203
        {                       /* f1000 */
10204
                23071,          /* A1 = -1.408203 */
10205
                 -32489,        /* A2 = 0.991516 */
10206
                 -293,          /* B2 = -0.008965 */
10207
                 0,              /* B1 = 0.000000 */
10208
                 293,           /* B0 = 0.008965 */
10209
                 22951,         /* A1 = -1.400818 */
10210
                 -32655,        /* A2 = 0.996582 */
10211
                 5689,          /* B2 = 0.173645 */
10212
                 -3951,         /* B1 = -0.241150 */
10213
                 5689,          /* B0 = 0.173645 */
10214
                 23307,         /* A1 = -1.422607 */
10215
                 -32657,        /* A2 = 0.996613 */
10216
                 18692,         /* B2 = 0.570435 */
10217
                 -13447,        /* B1 = -0.820770 */
10218
                 18692,         /* B0 = 0.570435 */
10219
                 5,             /* Internal filter scaling */
10220
                 159,           /* Minimum in-band energy threshold */
10221
                 21,            /* 21/32 in-band to broad-band ratio */
10222
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10223
        },
10224
        {                       /* f1020 */
10225
                22701,          /* A1 = -1.385620 */
10226
                 -32474,        /* A2 = 0.991058 */
10227
                 -292,          /* B2 = -0.008933 */
10228
                 0,              /*163840      , B1 = 10.000000 */
10229
                 292,           /* B0 = 0.008933 */
10230
                 22564,         /* A1 = -1.377258 */
10231
                 -32655,        /* A2 = 0.996552 */
10232
                 20756,         /* B2 = 0.633423 */
10233
                 -14176,        /* B1 = -0.865295 */
10234
                 20756,         /* B0 = 0.633423 */
10235
                 22960,         /* A1 = -1.401428 */
10236
                 -32657,        /* A2 = 0.996613 */
10237
                 6520,          /* B2 = 0.198990 */
10238
                 -4619,         /* B1 = -0.281937 */
10239
                 6520,          /* B0 = 0.198990 */
10240
                 5,             /* Internal filter scaling */
10241
                 159,           /* Minimum in-band energy threshold */
10242
                 21,            /* 21/32 in-band to broad-band ratio */
10243
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10244
        },
10245
        {                       /* f1050 */
10246
                22142,          /* A1 = -1.351501 */
10247
                 -32474,        /* A2 = 0.991058 */
10248
                 -147,          /* B2 = -0.004493 */
10249
                 0,              /* B1 = 0.000000 */
10250
                 147,           /* B0 = 0.004493 */
10251
                 22000,         /* A1 = -1.342834 */
10252
                 -32655,        /* A2 = 0.996552 */
10253
                 15379,         /* B2 = 0.469360 */
10254
                 -10237,        /* B1 = -0.624847 */
10255
                 15379,         /* B0 = 0.469360 */
10256
                 22406,         /* A1 = -1.367554 */
10257
                 -32657,        /* A2 = 0.996613 */
10258
                 17491,         /* B2 = 0.533783 */
10259
                 -12096,        /* B1 = -0.738312 */
10260
                 17491,         /* B0 = 0.533783 */
10261
                 5,             /* Internal filter scaling */
10262
                 159,           /* Minimum in-band energy threshold */
10263
                 21,            /* 21/32 in-band to broad-band ratio */
10264
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10265
        },
10266
        {                       /* f1100_1750[] */
10267
                12973,          /* A1 = 0.79184 */
10268
                 -24916,        /* A2 = -0.760376 */
10269
                 6655,          /* B2 = 0.203102 */
10270
                 367,           /* B1 = 0.0224 */
10271
                 6657,          /* B0 = 0.203171 */
10272
                 5915,          /* A1 = 0.361053 */
10273
                 -29560,        /* A2 = -0.90213 */
10274
                 -7777,         /* B2 = -0.23735 */
10275
                 0,              /* B1 = 0 */
10276
                 7777,          /* B0 = 0.23735 */
10277
                 20510,         /* A1 = 1.251892 */
10278
                 -30260,        /* A2 = -0.923462 */
10279
                 26662,         /* B2 = 0.81366 */
10280
                 -20573,        /* B1 = -1.255737 */
10281
                 26668,         /* B0 = 0.813843 */
10282
                 7,             /* Internal filter scaling */
10283
                 159,           /* Minimum in-band energy threshold */
10284
                 21,            /* 21/32 in-band to broad-band ratio */
10285
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10286
        },
10287
        {                       /* f1140 */
10288
                20392,          /* A1 = -1.244629 */
10289
                 -32460,        /* A2 = 0.990601 */
10290
                 -270,          /* B2 = -0.008240 */
10291
                 0,              /* B1 = 0.000000 */
10292
                 270,           /* B0 = 0.008240 */
10293
                 20218,         /* A1 = -1.234009 */
10294
                 -32655,        /* A2 = 0.996582 */
10295
                 21337,         /* B2 = 0.651154 */
10296
                 -13044,        /* B1 = -0.796143 */
10297
                 21337,         /* B0 = 0.651154 */
10298
                 20684,         /* A1 = -1.262512 */
10299
                 -32657,        /* A2 = 0.996643 */
10300
                 8572,          /* B2 = 0.261612 */
10301
                 -5476,         /* B1 = -0.334244 */
10302
                 8572,          /* B0 = 0.261612 */
10303
                 5,             /* Internal filter scaling */
10304
                 159,           /* Minimum in-band energy threshold */
10305
                 21,            /* 21/32 in-band to broad-band ratio */
10306
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10307
        },
10308
        {                       /* f1200 */
10309
                19159,          /* A1 = -1.169373 */
10310
                 -32456,        /* A2 = 0.990509 */
10311
                 -335,          /* B2 = -0.010252 */
10312
                 0,              /* B1 = 0.000000 */
10313
                 335,           /* B0 = 0.010252 */
10314
                 18966,         /* A1 = -1.157593 */
10315
                 -32661,        /* A2 = 0.996735 */
10316
                 6802,          /* B2 = 0.207588 */
10317
                 -3900,         /* B1 = -0.238098 */
10318
                 6802,          /* B0 = 0.207588 */
10319
                 19467,         /* A1 = -1.188232 */
10320
                 -32661,        /* A2 = 0.996765 */
10321
                 25035,         /* B2 = 0.764008 */
10322
                 -15049,        /* B1 = -0.918579 */
10323
                 25035,         /* B0 = 0.764008 */
10324
                 5,             /* Internal filter scaling */
10325
                 159,           /* Minimum in-band energy threshold */
10326
                 21,            /* 21/32 in-band to broad-band ratio */
10327
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10328
        },
10329
        {                       /* f1209 */
10330
                18976,          /* A1 = -1.158264 */
10331
                 -32439,        /* A2 = 0.989990 */
10332
                 -183,          /* B2 = -0.005588 */
10333
                 0,              /* B1 = 0.000000 */
10334
                 183,           /* B0 = 0.005588 */
10335
                 18774,         /* A1 = -1.145874 */
10336
                 -32650,        /* A2 = 0.996429 */
10337
                 15468,         /* B2 = 0.472076 */
10338
                 -8768,         /* B1 = -0.535217 */
10339
                 15468,         /* B0 = 0.472076 */
10340
                 19300,         /* A1 = -1.177979 */
10341
                 -32652,        /* A2 = 0.996490 */
10342
                 19840,         /* B2 = 0.605499 */
10343
                 -11842,        /* B1 = -0.722809 */
10344
                 19840,         /* B0 = 0.605499 */
10345
                 5,             /* Internal filter scaling */
10346
                 159,           /* Minimum in-band energy threshold */
10347
                 21,            /* 21/32 in-band to broad-band ratio */
10348
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10349
        },
10350
        {                       /* f1330 */
10351
                16357,          /* A1 = -0.998413 */
10352
                 -32368,        /* A2 = 0.987793 */
10353
                 -217,          /* B2 = -0.006652 */
10354
                 0,              /* B1 = 0.000000 */
10355
                 217,           /* B0 = 0.006652 */
10356
                 16107,         /* A1 = -0.983126 */
10357
                 -32601,        /* A2 = 0.994904 */
10358
                 11602,         /* B2 = 0.354065 */
10359
                 -5555,         /* B1 = -0.339111 */
10360
                 11602,         /* B0 = 0.354065 */
10361
                 16722,         /* A1 = -1.020630 */
10362
                 -32603,        /* A2 = 0.994965 */
10363
                 15574,         /* B2 = 0.475311 */
10364
                 -8176,         /* B1 = -0.499069 */
10365
                 15574,         /* B0 = 0.475311 */
10366
                 5,             /* Internal filter scaling */
10367
                 159,           /* Minimum in-band energy threshold */
10368
                 21,            /* 21/32 in-band to broad-band ratio */
10369
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10370
        },
10371
        {                       /* f1336 */
10372
                16234,          /* A1 = -0.990875 */
10373
                 32404,         /* A2 = -0.988922 */
10374
                 -193,          /* B2 = -0.005908 */
10375
                 0,              /* B1 = 0.000000 */
10376
                 193,           /* B0 = 0.005908 */
10377
                 15986,         /* A1 = -0.975769 */
10378
                 -32632,        /* A2 = 0.995880 */
10379
                 18051,         /* B2 = 0.550903 */
10380
                 -8658,         /* B1 = -0.528473 */
10381
                 18051,         /* B0 = 0.550903 */
10382
                 16591,         /* A1 = -1.012695 */
10383
                 -32634,        /* A2 = 0.995941 */
10384
                 15736,         /* B2 = 0.480240 */
10385
                 -8125,         /* B1 = -0.495926 */
10386
                 15736,         /* B0 = 0.480240 */
10387
                 5,             /* Internal filter scaling */
10388
                 159,           /* Minimum in-band energy threshold */
10389
                 21,            /* 21/32 in-band to broad-band ratio */
10390
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10391
        },
10392
        {                       /* f1366 */
10393
                15564,          /* A1 = -0.949982 */
10394
                 -32404,        /* A2 = 0.988922 */
10395
                 -269,          /* B2 = -0.008216 */
10396
                 0,              /* B1 = 0.000000 */
10397
                 269,           /* B0 = 0.008216 */
10398
                 15310,         /* A1 = -0.934479 */
10399
                 -32632,        /* A2 = 0.995880 */
10400
                 10815,         /* B2 = 0.330063 */
10401
                 -4962,         /* B1 = -0.302887 */
10402
                 10815,         /* B0 = 0.330063 */
10403
                 15924,         /* A1 = -0.971924 */
10404
                 -32634,        /* A2 = 0.995941 */
10405
                 18880,         /* B2 = 0.576172 */
10406
                 -9364,         /* B1 = -0.571594 */
10407
                 18880,         /* B0 = 0.576172 */
10408
                 5,             /* Internal filter scaling */
10409
                 159,           /* Minimum in-band energy threshold */
10410
                 21,            /* 21/32 in-band to broad-band ratio */
10411
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10412
        },
10413
        {                       /* f1380 */
10414
                15247,          /* A1 = -0.930603 */
10415
                 -32397,        /* A2 = 0.988708 */
10416
                 -244,          /* B2 = -0.007451 */
10417
                 0,              /* B1 = 0.000000 */
10418
                 244,           /* B0 = 0.007451 */
10419
                 14989,         /* A1 = -0.914886 */
10420
                 -32627,        /* A2 = 0.995697 */
10421
                 18961,         /* B2 = 0.578644 */
10422
                 -8498,         /* B1 = -0.518707 */
10423
                 18961,         /* B0 = 0.578644 */
10424
                 15608,         /* A1 = -0.952667 */
10425
                 -32628,        /* A2 = 0.995758 */
10426
                 11145,         /* B2 = 0.340134 */
10427
                 -5430,         /* B1 = -0.331467 */
10428
                 11145,         /* B0 = 0.340134 */
10429
                 5,             /* Internal filter scaling */
10430
                 159,           /* Minimum in-band energy threshold */
10431
                 21,            /* 21/32 in-band to broad-band ratio */
10432
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10433
        },
10434
        {                       /* f1400 */
10435
                14780,          /* A1 = -0.902130 */
10436
                 -32393,        /* A2 = 0.988586 */
10437
                 -396,          /* B2 = -0.012086 */
10438
                 0,              /* B1 = 0.000000 */
10439
                 396,           /* B0 = 0.012086 */
10440
                 14510,         /* A1 = -0.885651 */
10441
                 -32630,        /* A2 = 0.995819 */
10442
                 6326,          /* B2 = 0.193069 */
10443
                 -2747,         /* B1 = -0.167671 */
10444
                 6326,          /* B0 = 0.193069 */
10445
                 15154,         /* A1 = -0.924957 */
10446
                 -32632,        /* A2 = 0.995850 */
10447
                 23235,         /* B2 = 0.709076 */
10448
                 -10983,        /* B1 = -0.670380 */
10449
                 23235,         /* B0 = 0.709076 */
10450
                 5,             /* Internal filter scaling */
10451
                 159,           /* Minimum in-band energy threshold */
10452
                 21,            /* 21/32 in-band to broad-band ratio */
10453
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10454
        },
10455
        {                       /* f1477 */
10456
                13005,          /* A1 = -0.793793 */
10457
                 -32368,        /* A2 = 0.987823 */
10458
                 -500,          /* B2 = -0.015265 */
10459
                 0,              /* B1 = 0.000000 */
10460
                 500,           /* B0 = 0.015265 */
10461
                 12708,         /* A1 = -0.775665 */
10462
                 -32615,        /* A2 = 0.995331 */
10463
                 11420,         /* B2 = 0.348526 */
10464
                 -4306,         /* B1 = -0.262833 */
10465
                 11420,         /* B0 = 0.348526 */
10466
                 13397,         /* A1 = -0.817688 */
10467
                 -32615,        /* A2 = 0.995361 */
10468
                 9454,          /* B2 = 0.288528 */
10469
                 -3981,         /* B1 = -0.243027 */
10470
                 9454,          /* B0 = 0.288528 */
10471
                 5,             /* Internal filter scaling */
10472
                 159,           /* Minimum in-band energy threshold */
10473
                 21,            /* 21/32 in-band to broad-band ratio */
10474
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10475
        },
10476
        {                       /* f1600 */
10477
                10046,          /* A1 = -0.613190 */
10478
                 -32331,        /* A2 = 0.986694 */
10479
                 -455,          /* B2 = -0.013915 */
10480
                 0,              /* B1 = 0.000000 */
10481
                 455,           /* B0 = 0.013915 */
10482
                 9694,          /* A1 = -0.591705 */
10483
                 -32601,        /* A2 = 0.994934 */
10484
                 6023,          /* B2 = 0.183815 */
10485
                 -1708,         /* B1 = -0.104279 */
10486
                 6023,          /* B0 = 0.183815 */
10487
                 10478,         /* A1 = -0.639587 */
10488
                 -32603,        /* A2 = 0.994965 */
10489
                 22031,         /* B2 = 0.672333 */
10490
                 -7342,         /* B1 = -0.448151 */
10491
                 22031,         /* B0 = 0.672333 */
10492
                 5,             /* Internal filter scaling */
10493
                 159,           /* Minimum in-band energy threshold */
10494
                 21,            /* 21/32 in-band to broad-band ratio */
10495
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10496
        },
10497
        {                       /* f1633_1638[] */
10498
                9181,           /* A1 = 0.560394 */
10499
                 -32256,        /* A2 = -0.984375 */
10500
                 -556,          /* B2 = -0.016975 */
10501
                 0,              /* B1 = 0 */
10502
                 556,           /* B0 = 0.016975 */
10503
                 8757,          /* A1 = 0.534515 */
10504
                 -32574,        /* A2 = -0.99408 */
10505
                 8443,          /* B2 = 0.25769 */
10506
                 -2135,         /* B1 = -0.130341 */
10507
                 8443,          /* B0 = 0.25769 */
10508
                 9691,          /* A1 = 0.591522 */
10509
                 -32574,        /* A2 = -0.99411 */
10510
                 15446,         /* B2 = 0.471375 */
10511
                 -4809,         /* B1 = -0.293579 */
10512
                 15446,         /* B0 = 0.471375 */
10513
                 7,             /* Internal filter scaling */
10514
                 159,           /* Minimum in-band energy threshold */
10515
                 21,            /* 21/32 in-band to broad-band ratio */
10516
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10517
        },
10518
        {                       /* f1800 */
10519
                5076,           /* A1 = -0.309875 */
10520
                 -32304,        /* A2 = 0.985840 */
10521
                 -508,          /* B2 = -0.015503 */
10522
                 0,              /* B1 = 0.000000 */
10523
                 508,           /* B0 = 0.015503 */
10524
                 4646,          /* A1 = -0.283600 */
10525
                 -32605,        /* A2 = 0.995026 */
10526
                 6742,          /* B2 = 0.205780 */
10527
                 -878,          /* B1 = -0.053635 */
10528
                 6742,          /* B0 = 0.205780 */
10529
                 5552,          /* A1 = -0.338928 */
10530
                 -32605,        /* A2 = 0.995056 */
10531
                 23667,         /* B2 = 0.722260 */
10532
                 -4297,         /* B1 = -0.262329 */
10533
                 23667,         /* B0 = 0.722260 */
10534
                 5,             /* Internal filter scaling */
10535
                 159,           /* Minimum in-band energy threshold */
10536
                 21,            /* 21/32 in-band to broad-band ratio */
10537
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10538
        },
10539
        {                       /* f1860 */
10540
                3569,           /* A1 = -0.217865 */
10541
                 -32292,        /* A2 = 0.985504 */
10542
                 -239,          /* B2 = -0.007322 */
10543
                 0,              /* B1 = 0.000000 */
10544
                 239,           /* B0 = 0.007322 */
10545
                 3117,          /* A1 = -0.190277 */
10546
                 -32603,        /* A2 = 0.994965 */
10547
                 18658,         /* B2 = 0.569427 */
10548
                 -1557,         /* B1 = -0.095032 */
10549
                 18658,         /* B0 = 0.569427 */
10550
                 4054,          /* A1 = -0.247437 */
10551
                 -32603,        /* A2 = 0.994965 */
10552
                 18886,         /* B2 = 0.576385 */
10553
                 -2566,         /* B1 = -0.156647 */
10554
                 18886,         /* B0 = 0.576385 */
10555
                 5,             /* Internal filter scaling */
10556
                 159,           /* Minimum in-band energy threshold */
10557
                 21,            /* 21/32 in-band to broad-band ratio */
10558
                 0x0FF5         /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10559
        },
10560
};
10561
static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
10562
{
10563
        unsigned short cmd;
10564
        int cnt, max;
10565
 
10566
        if (jf->filter > 3) {
10567
                return -1;
10568
        }
10569
        if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))        /* Select Filter */
10570
 
10571
                return -1;
10572
        if (!jf->enable) {
10573
                if (ixj_WriteDSPCommand(0x5152, j))             /* Disable Filter */
10574
 
10575
                        return -1;
10576
                else
10577
                        return 0;
10578
        } else {
10579
                if (ixj_WriteDSPCommand(0x5153, j))             /* Enable Filter */
10580
 
10581
                        return -1;
10582
                /* Select the filter (f0 - f3) to use. */
10583
                if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
10584
                        return -1;
10585
        }
10586
        if (jf->freq < 12 && jf->freq > 3) {
10587
                /* Select the frequency for the selected filter. */
10588
                if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
10589
                        return -1;
10590
        } else if (jf->freq > 11) {
10591
                /* We need to load a programmable filter set for undefined */
10592
                /* frequencies.  So we will point the filter to a programmable set. */
10593
                /* Since there are only 4 filters and 4 programmable sets, we will */
10594
                /* just point the filter to the same number set and program it for the */
10595
                /* frequency we want. */
10596
                if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
10597
                        return -1;
10598
                if (j->ver.low != 0x12) {
10599
                        cmd = 0x515B;
10600
                        max = 19;
10601
                } else {
10602
                        cmd = 0x515E;
10603
                        max = 15;
10604
                }
10605
                if (ixj_WriteDSPCommand(cmd, j))
10606
                        return -1;
10607
                for (cnt = 0; cnt < max; cnt++) {
10608
                        if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
10609
                                return -1;
10610
                }
10611
        }
10612
        j->filter_en[jf->filter] = jf->enable;
10613
        return 0;
10614
}
10615
 
10616
static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
10617
{
10618
        unsigned short cmd;
10619
        int cnt, max;
10620
        if (jfr->filter > 3) {
10621
                return -1;
10622
        }
10623
        if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))       /* Select Filter */
10624
                return -1;
10625
 
10626
        if (!jfr->enable) {
10627
                if (ixj_WriteDSPCommand(0x5152, j))             /* Disable Filter */
10628
                        return -1;
10629
                else
10630
                        return 0;
10631
        } else {
10632
                if (ixj_WriteDSPCommand(0x5153, j))             /* Enable Filter */
10633
                        return -1;
10634
                /* Select the filter (f0 - f3) to use. */
10635
                if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
10636
                        return -1;
10637
        }
10638
        /* We need to load a programmable filter set for undefined */
10639
        /* frequencies.  So we will point the filter to a programmable set. */
10640
        /* Since there are only 4 filters and 4 programmable sets, we will */
10641
        /* just point the filter to the same number set and program it for the */
10642
        /* frequency we want. */
10643
        if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
10644
                return -1;
10645
        if (j->ver.low != 0x12) {
10646
                cmd = 0x515B;
10647
                max = 19;
10648
        } else {
10649
                cmd = 0x515E;
10650
                max = 15;
10651
        }
10652
        if (ixj_WriteDSPCommand(cmd, j))
10653
                return -1;
10654
        for (cnt = 0; cnt < max; cnt++) {
10655
                if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
10656
                        return -1;
10657
        }
10658
        j->filter_en[jfr->filter] = jfr->enable;
10659
        return 0;
10660
}
10661
 
10662
static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
10663
{
10664
        int freq0, freq1;
10665
        unsigned short data;
10666
        if (ti->freq0) {
10667
                freq0 = ti->freq0;
10668
        } else {
10669
                freq0 = 0x7FFF;
10670
        }
10671
 
10672
        if (ti->freq1) {
10673
                freq1 = ti->freq1;
10674
        } else {
10675
                freq1 = 0x7FFF;
10676
        }
10677
 
10678
        if(ti->tone_index > 12 && ti->tone_index < 28)
10679
        {
10680
                if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
10681
                        return -1;
10682
                if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
10683
                        return -1;
10684
                data = freq0;
10685
                if (ixj_WriteDSPCommand(data, j))
10686
                        return -1;
10687
                data = freq1;
10688
                if (ixj_WriteDSPCommand(data, j))
10689
                        return -1;
10690
        }
10691
        return freq0;
10692
}
10693
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.