blob: d5863b8b56eeaf00745a03f3d3a76c11c12a512f [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/****************************************************************************
2 * ixj.c
3 *
4 * Device Driver for Quicknet Technologies, Inc.'s Telephony cards
5 * including the Internet PhoneJACK, Internet PhoneJACK Lite,
6 * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and
7 * SmartCABLE
8 *
9 * (c) Copyright 1999-2001 Quicknet Technologies, Inc.
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version
14 * 2 of the License, or (at your option) any later version.
15 *
16 * Author: Ed Okerson, <eokerson@quicknet.net>
17 *
18 * Contributors: Greg Herlein, <gherlein@quicknet.net>
19 * David W. Erhart, <derhart@quicknet.net>
20 * John Sellers, <jsellers@quicknet.net>
21 * Mike Preston, <mpreston@quicknet.net>
22 *
23 * Fixes: David Huggins-Daines, <dhd@cepstral.com>
24 * Fabio Ferrari, <fabio.ferrari@digitro.com.br>
25 * Artis Kugevics, <artis@mt.lv>
26 * Daniele Bellucci, <bellucda@tiscali.it>
27 *
28 * More information about the hardware related to this driver can be found
29 * at our website: http://www.quicknet.net
30 *
31 * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
32 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
33 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
34 * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 *
36 * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
37 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
38 * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
39 * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
40 * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
41 *
42 ***************************************************************************/
43
Linus Torvalds1da177e2005-04-16 15:20:36 -070044/*
45 * $Log: ixj.c,v $
46 *
47 * Revision 4.8 2003/07/09 19:39:00 Daniele Bellucci
48 * Audit some copy_*_user and minor cleanup.
49 *
50 * Revision 4.7 2001/08/13 06:19:33 craigs
51 * Added additional changes from Alan Cox and John Anderson for
52 * 2.2 to 2.4 cleanup and bounds checking
53 *
54 * Revision 4.6 2001/08/13 01:05:05 craigs
55 * Really fixed PHONE_QUERY_CODEC problem this time
56 *
57 * Revision 4.5 2001/08/13 00:11:03 craigs
58 * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
59 *
60 * Revision 4.4 2001/08/07 07:58:12 craigs
61 * Changed back to three digit version numbers
62 * Added tagbuild target to allow automatic and easy tagging of versions
63 *
64 * Revision 4.3 2001/08/07 07:24:47 craigs
65 * Added ixj-ver.h to allow easy configuration management of driver
66 * Added display of version number in /prox/ixj
67 *
68 * Revision 4.2 2001/08/06 07:07:19 craigs
69 * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
70 * behaviour of returning int rather than short *
71 *
72 * Revision 4.1 2001/08/05 00:17:37 craigs
73 * More changes for correct PCMCIA installation
74 * Start of changes for backward Linux compatibility
75 *
76 * Revision 4.0 2001/08/04 12:33:12 craigs
77 * New version using GNU autoconf
78 *
79 * Revision 3.105 2001/07/20 23:14:32 eokerson
80 * More work on CallerID generation when using ring cadences.
81 *
82 * Revision 3.104 2001/07/06 01:33:55 eokerson
83 * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
84 *
85 * Revision 3.103 2001/07/05 19:20:16 eokerson
86 * Updated HOWTO
87 * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
88 *
89 * Revision 3.102 2001/07/03 23:51:21 eokerson
90 * Un-mute mic on Internet LineJACK when in speakerphone mode.
91 *
92 * Revision 3.101 2001/07/02 19:26:56 eokerson
93 * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
94 *
95 * Revision 3.100 2001/07/02 19:18:27 eokerson
96 * Changed driver to make dynamic allocation possible. We now pass IXJ * between functions instead of array indexes.
97 * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
98 * Fixed speaker mode on Internet LineJACK.
99 *
100 * Revision 3.99 2001/05/09 14:11:16 eokerson
101 * Fixed kmalloc error in ixj_build_filter_cadence. Thanks David Chan <cat@waulogy.stanford.edu>.
102 *
103 * Revision 3.98 2001/05/08 19:55:33 eokerson
104 * Fixed POTS hookstate detection while it is connected to PSTN port.
105 *
106 * Revision 3.97 2001/05/08 00:01:04 eokerson
107 * Fixed kernel oops when sending caller ID data.
108 *
109 * Revision 3.96 2001/05/04 23:09:30 eokerson
110 * Now uses one kernel timer for each card, instead of one for the entire driver.
111 *
112 * Revision 3.95 2001/04/25 22:06:47 eokerson
113 * Fixed squawking at beginning of some G.723.1 calls.
114 *
115 * Revision 3.94 2001/04/03 23:42:00 eokerson
116 * Added linear volume ioctls
117 * Added raw filter load ioctl
118 *
119 * Revision 3.93 2001/02/27 01:00:06 eokerson
120 * Fixed blocking in CallerID.
121 * Reduced size of ixj structure for smaller driver footprint.
122 *
123 * Revision 3.92 2001/02/20 22:02:59 eokerson
124 * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
125 * Improved PSTN ring detection.
126 * Fixed wink generation on POTS ports.
127 *
128 * Revision 3.91 2001/02/13 00:55:44 eokerson
129 * Turn AEC back on after changing frame sizes.
130 *
131 * Revision 3.90 2001/02/12 16:42:00 eokerson
132 * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
133 *
134 * Revision 3.89 2001/02/12 15:41:16 eokerson
135 * Fix from Artis Kugevics - Tone gains were not being set correctly.
136 *
137 * Revision 3.88 2001/02/05 23:25:42 eokerson
138 * Fixed lockup bugs with deregister.
139 *
140 * Revision 3.87 2001/01/29 21:00:39 eokerson
141 * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
142 * Updated copyright date.
143 *
144 * Revision 3.86 2001/01/23 23:53:46 eokerson
145 * Fixes to G.729 compatibility.
146 *
147 * Revision 3.85 2001/01/23 21:30:36 eokerson
148 * Added verbage about cards supported.
149 * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
150 *
151 * Revision 3.84 2001/01/22 23:32:10 eokerson
152 * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
153 *
154 * Revision 3.83 2001/01/19 14:51:41 eokerson
155 * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
156 *
157 * Revision 3.82 2001/01/19 00:34:49 eokerson
158 * Added verbosity to write overlap errors.
159 *
160 * Revision 3.81 2001/01/18 23:56:54 eokerson
161 * Fixed PSTN line test functions.
162 *
163 * Revision 3.80 2001/01/18 22:29:27 eokerson
164 * Updated AEC/AGC values for different cards.
165 *
166 * Revision 3.79 2001/01/17 02:58:54 eokerson
167 * Fixed AEC reset after Caller ID.
168 * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
169 *
170 * Revision 3.78 2001/01/16 19:43:09 eokerson
171 * Added support for Linux 2.4.x kernels.
172 *
173 * Revision 3.77 2001/01/09 04:00:52 eokerson
174 * Linetest will now test the line, even if it has previously succeded.
175 *
176 * Revision 3.76 2001/01/08 19:27:00 eokerson
177 * Fixed problem with standard cable on Internet PhoneCARD.
178 *
179 * Revision 3.75 2000/12/22 16:52:14 eokerson
180 * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
181 *
182 * Revision 3.74 2000/12/08 22:41:50 eokerson
183 * Added capability for G729B.
184 *
185 * Revision 3.73 2000/12/07 23:35:16 eokerson
186 * Added capability to have different ring pattern before CallerID data.
187 * Added hookstate checks in CallerID routines to stop FSK.
188 *
189 * Revision 3.72 2000/12/06 19:31:31 eokerson
190 * Modified signal behavior to only send one signal per event.
191 *
192 * Revision 3.71 2000/12/06 03:23:08 eokerson
193 * Fixed CallerID on Call Waiting.
194 *
195 * Revision 3.70 2000/12/04 21:29:37 eokerson
196 * Added checking to Smart Cable gain functions.
197 *
198 * Revision 3.69 2000/12/04 21:05:20 eokerson
199 * Changed ixjdebug levels.
200 * Added ioctls to change gains in Internet Phone CARD Smart Cable.
201 *
202 * Revision 3.68 2000/12/04 00:17:21 craigs
203 * Changed mixer voice gain to +6dB rather than 0dB
204 *
205 * Revision 3.67 2000/11/30 21:25:51 eokerson
206 * Fixed write signal errors.
207 *
208 * Revision 3.66 2000/11/29 22:42:44 eokerson
209 * Fixed PSTN ring detect problems.
210 *
211 * Revision 3.65 2000/11/29 07:31:55 craigs
212 * Added new 425Hz filter co-efficients
213 * Added card-specific DTMF prescaler initialisation
214 *
215 * Revision 3.64 2000/11/28 14:03:32 craigs
216 * Changed certain mixer initialisations to be 0dB rather than 12dB
217 * Added additional information to /proc/ixj
218 *
219 * Revision 3.63 2000/11/28 11:38:41 craigs
220 * Added display of AEC modes in AUTO and AGC mode
221 *
222 * Revision 3.62 2000/11/28 04:05:44 eokerson
223 * Improved PSTN ring detection routine.
224 *
225 * Revision 3.61 2000/11/27 21:53:12 eokerson
226 * Fixed flash detection.
227 *
228 * Revision 3.60 2000/11/27 15:57:29 eokerson
229 * More work on G.729 load routines.
230 *
231 * Revision 3.59 2000/11/25 21:55:12 eokerson
232 * Fixed errors in G.729 load routine.
233 *
234 * Revision 3.58 2000/11/25 04:08:29 eokerson
235 * Added board locks around G.729 and TS85 load routines.
236 *
237 * Revision 3.57 2000/11/24 05:35:17 craigs
238 * Added ability to retrieve mixer values on LineJACK
239 * Added complete initialisation of all mixer values at startup
240 * Fixed spelling mistake
241 *
242 * Revision 3.56 2000/11/23 02:52:11 robertj
243 * Added cvs change log keyword.
244 * Fixed bug in capabilities list when using G.729 module.
245 *
246 */
247
248#include "ixj-ver.h"
249
250#define PERFMON_STATS
251#define IXJDEBUG 0
252#define MAXRINGS 5
253
254#include <linux/module.h>
255
256#include <linux/init.h>
257#include <linux/sched.h>
258#include <linux/kernel.h> /* printk() */
259#include <linux/fs.h> /* everything... */
260#include <linux/errno.h> /* error codes */
261#include <linux/slab.h>
262#include <linux/mm.h>
263#include <linux/ioport.h>
264#include <linux/interrupt.h>
265#include <linux/proc_fs.h>
266#include <linux/poll.h>
267#include <linux/timer.h>
268#include <linux/delay.h>
269#include <linux/pci.h>
270
271#include <asm/io.h>
272#include <asm/uaccess.h>
273
274#include <linux/isapnp.h>
275
276#include "ixj.h"
277
278#define TYPE(inode) (iminor(inode) >> 4)
279#define NUM(inode) (iminor(inode) & 0xf)
280
281static int ixjdebug;
282static int hertz = HZ;
283static int samplerate = 100;
284
285module_param(ixjdebug, int, 0);
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
307static IXJ *ixj[IXJMAX];
308#define get_ixj(b) ixj[(b)]
309
310/*
311 * Allocate a free IXJ device
312 */
313
314static 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
330static void ixj_fsk_free(IXJ *j)
331{
332 if(j->fskdata != NULL) {
333 kfree(j->fskdata);
334 j->fskdata = NULL;
335 }
336}
337
338static 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
358static IXJ ixj[IXJMAX];
359#define get_ixj(b) (&ixj[(b)])
360
361/*
362 * Allocate a free IXJ device
363 */
364
365static IXJ *ixj_alloc(void)
366{
367 int cnt;
368 for(cnt=0; cnt<IXJMAX; cnt++) {
369 if(!ixj[cnt].DSPbase)
370 return &ixj[cnt];
371 }
372 return NULL;
373}
374
375static inline void ixj_fsk_free(IXJ *j) {;}
376
377static inline void ixj_fsk_alloc(IXJ *j)
378{
379 j->fsksize = 8000;
380}
381
382#endif
383
384#ifdef PERFMON_STATS
385#define ixj_perfmon(x) ((x)++)
386#else
387#define ixj_perfmon(x) do { } while(0)
388#endif
389
390static int ixj_convert_loaded;
391
392static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
393
394/************************************************************************
395*
396* These are function definitions to allow external modules to register
397* enhanced functionality call backs.
398*
399************************************************************************/
400
401static int Stub(IXJ * J, unsigned long arg)
402{
403 return 0;
404}
405
406static IXJ_REGFUNC ixj_PreRead = &Stub;
407static IXJ_REGFUNC ixj_PostRead = &Stub;
408static IXJ_REGFUNC ixj_PreWrite = &Stub;
409static IXJ_REGFUNC ixj_PostWrite = &Stub;
410
411static void ixj_read_frame(IXJ *j);
412static void ixj_write_frame(IXJ *j);
413static void ixj_init_timer(IXJ *j);
414static void ixj_add_timer(IXJ * j);
415static void ixj_timeout(unsigned long ptr);
416static int read_filters(IXJ *j);
417static int LineMonitor(IXJ *j);
418static int ixj_fasync(int fd, struct file *, int mode);
419static int ixj_set_port(IXJ *j, int arg);
420static int ixj_set_pots(IXJ *j, int arg);
421static int ixj_hookstate(IXJ *j);
422static int ixj_record_start(IXJ *j);
423static void ixj_record_stop(IXJ *j);
424static void set_rec_volume(IXJ *j, int volume);
425static int get_rec_volume(IXJ *j);
426static int set_rec_codec(IXJ *j, int rate);
427static void ixj_vad(IXJ *j, int arg);
428static int ixj_play_start(IXJ *j);
429static void ixj_play_stop(IXJ *j);
430static int ixj_set_tone_on(unsigned short arg, IXJ *j);
431static int ixj_set_tone_off(unsigned short, IXJ *j);
432static int ixj_play_tone(IXJ *j, char tone);
433static void ixj_aec_start(IXJ *j, int level);
434static int idle(IXJ *j);
435static void ixj_ring_on(IXJ *j);
436static void ixj_ring_off(IXJ *j);
437static void aec_stop(IXJ *j);
438static void ixj_ringback(IXJ *j);
439static void ixj_busytone(IXJ *j);
440static void ixj_dialtone(IXJ *j);
441static void ixj_cpt_stop(IXJ *j);
442static char daa_int_read(IXJ *j);
443static char daa_CR_read(IXJ *j, int cr);
444static int daa_set_mode(IXJ *j, int mode);
445static int ixj_linetest(IXJ *j);
446static int ixj_daa_write(IXJ *j);
447static int ixj_daa_cid_read(IXJ *j);
448static void DAA_Coeff_US(IXJ *j);
449static void DAA_Coeff_UK(IXJ *j);
450static void DAA_Coeff_France(IXJ *j);
451static void DAA_Coeff_Germany(IXJ *j);
452static void DAA_Coeff_Australia(IXJ *j);
453static void DAA_Coeff_Japan(IXJ *j);
454static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
455static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
456static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
457static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp);
458static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp);
459/* Serial Control Interface funtions */
460static int SCI_Control(IXJ *j, int control);
461static int SCI_Prepare(IXJ *j);
462static int SCI_WaitHighSCI(IXJ *j);
463static int SCI_WaitLowSCI(IXJ *j);
464static DWORD PCIEE_GetSerialNumber(WORD wAddress);
465static int ixj_PCcontrol_wait(IXJ *j);
466static void ixj_pre_cid(IXJ *j);
467static void ixj_write_cid(IXJ *j);
468static void ixj_write_cid_bit(IXJ *j, int bit);
469static int set_base_frame(IXJ *j, int size);
470static int set_play_codec(IXJ *j, int rate);
471static void set_rec_depth(IXJ *j, int depth);
472static int ixj_mixer(long val, IXJ *j);
473
474/************************************************************************
475CT8020/CT8021 Host Programmers Model
476Host address Function Access
477DSPbase +
4780-1 Aux Software Status Register (reserved) Read Only
4792-3 Software Status Register Read Only
4804-5 Aux Software Control Register (reserved) Read Write
4816-7 Software Control Register Read Write
4828-9 Hardware Status Register Read Only
483A-B Hardware Control Register Read Write
484C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
485E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
486************************************************************************/
487
488static inline void ixj_read_HSR(IXJ *j)
489{
490 j->hsr.bytes.low = inb_p(j->DSPbase + 8);
491 j->hsr.bytes.high = inb_p(j->DSPbase + 9);
492}
493
494static inline int IsControlReady(IXJ *j)
495{
496 ixj_read_HSR(j);
497 return j->hsr.bits.controlrdy ? 1 : 0;
498}
499
500static inline int IsPCControlReady(IXJ *j)
501{
502 j->pccr1.byte = inb_p(j->XILINXbase + 3);
503 return j->pccr1.bits.crr ? 1 : 0;
504}
505
506static inline int IsStatusReady(IXJ *j)
507{
508 ixj_read_HSR(j);
509 return j->hsr.bits.statusrdy ? 1 : 0;
510}
511
512static inline int IsRxReady(IXJ *j)
513{
514 ixj_read_HSR(j);
515 ixj_perfmon(j->rxreadycheck);
516 return j->hsr.bits.rxrdy ? 1 : 0;
517}
518
519static inline int IsTxReady(IXJ *j)
520{
521 ixj_read_HSR(j);
522 ixj_perfmon(j->txreadycheck);
523 return j->hsr.bits.txrdy ? 1 : 0;
524}
525
526static inline void set_play_volume(IXJ *j, int volume)
527{
528 if (ixjdebug & 0x0002)
529 printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
530 ixj_WriteDSPCommand(0xCF02, j);
531 ixj_WriteDSPCommand(volume, j);
532}
533
534static int set_play_volume_linear(IXJ *j, int volume)
535{
536 int newvolume, dspplaymax;
537
538 if (ixjdebug & 0x0002)
539 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
540 if(volume > 100 || volume < 0) {
541 return -1;
542 }
543
544 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
545 switch (j->cardtype) {
546 case QTI_PHONEJACK:
547 dspplaymax = 0x380;
548 break;
549 case QTI_LINEJACK:
550 if(j->port == PORT_PSTN) {
551 dspplaymax = 0x48;
552 } else {
553 dspplaymax = 0x100;
554 }
555 break;
556 case QTI_PHONEJACK_LITE:
557 dspplaymax = 0x380;
558 break;
559 case QTI_PHONEJACK_PCI:
560 dspplaymax = 0x6C;
561 break;
562 case QTI_PHONECARD:
563 dspplaymax = 0x50;
564 break;
565 default:
566 return -1;
567 }
568 newvolume = (dspplaymax * volume) / 100;
569 set_play_volume(j, newvolume);
570 return 0;
571}
572
573static inline void set_play_depth(IXJ *j, int depth)
574{
575 if (depth > 60)
576 depth = 60;
577 if (depth < 0)
578 depth = 0;
579 ixj_WriteDSPCommand(0x5280 + depth, j);
580}
581
582static inline int get_play_volume(IXJ *j)
583{
584 ixj_WriteDSPCommand(0xCF00, j);
585 return j->ssr.high << 8 | j->ssr.low;
586}
587
588static int get_play_volume_linear(IXJ *j)
589{
590 int volume, newvolume, dspplaymax;
591
592 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
593 switch (j->cardtype) {
594 case QTI_PHONEJACK:
595 dspplaymax = 0x380;
596 break;
597 case QTI_LINEJACK:
598 if(j->port == PORT_PSTN) {
599 dspplaymax = 0x48;
600 } else {
601 dspplaymax = 0x100;
602 }
603 break;
604 case QTI_PHONEJACK_LITE:
605 dspplaymax = 0x380;
606 break;
607 case QTI_PHONEJACK_PCI:
608 dspplaymax = 0x6C;
609 break;
610 case QTI_PHONECARD:
611 dspplaymax = 100;
612 break;
613 default:
614 return -1;
615 }
616 volume = get_play_volume(j);
617 newvolume = (volume * 100) / dspplaymax;
618 if(newvolume > 100)
619 newvolume = 100;
620 return newvolume;
621}
622
623static inline BYTE SLIC_GetState(IXJ *j)
624{
625 if (j->cardtype == QTI_PHONECARD) {
626 j->pccr1.byte = 0;
627 j->psccr.bits.dev = 3;
628 j->psccr.bits.rw = 1;
629 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
630 ixj_PCcontrol_wait(j);
631 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
632 ixj_PCcontrol_wait(j);
633 if (j->pslic.bits.powerdown)
634 return PLD_SLIC_STATE_OC;
635 else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
636 return PLD_SLIC_STATE_ACTIVE;
637 else
638 return PLD_SLIC_STATE_RINGING;
639 } else {
640 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
641 }
642 return j->pld_slicr.bits.state;
643}
644
645static BOOL SLIC_SetState(BYTE byState, IXJ *j)
646{
647 BOOL fRetVal = FALSE;
648
649 if (j->cardtype == QTI_PHONECARD) {
650 if (j->flags.pcmciasct) {
651 switch (byState) {
652 case PLD_SLIC_STATE_TIPOPEN:
653 case PLD_SLIC_STATE_OC:
654 j->pslic.bits.powerdown = 1;
655 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
656 fRetVal = TRUE;
657 break;
658 case PLD_SLIC_STATE_RINGING:
659 if (j->readers || j->writers) {
660 j->pslic.bits.powerdown = 0;
661 j->pslic.bits.ring0 = 1;
662 j->pslic.bits.ring1 = 0;
663 fRetVal = TRUE;
664 }
665 break;
666 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
667
668 case PLD_SLIC_STATE_STANDBY:
669 case PLD_SLIC_STATE_ACTIVE:
670 if (j->readers || j->writers) {
671 j->pslic.bits.powerdown = 0;
672 } else {
673 j->pslic.bits.powerdown = 1;
674 }
675 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
676 fRetVal = TRUE;
677 break;
678 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
679
680 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
681
682 default:
683 fRetVal = FALSE;
684 break;
685 }
686 j->psccr.bits.dev = 3;
687 j->psccr.bits.rw = 0;
688 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
689 ixj_PCcontrol_wait(j);
690 }
691 } else {
692 /* Set the C1, C2, C3 & B2EN signals. */
693 switch (byState) {
694 case PLD_SLIC_STATE_OC:
695 j->pld_slicw.bits.c1 = 0;
696 j->pld_slicw.bits.c2 = 0;
697 j->pld_slicw.bits.c3 = 0;
698 j->pld_slicw.bits.b2en = 0;
699 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
700 fRetVal = TRUE;
701 break;
702 case PLD_SLIC_STATE_RINGING:
703 j->pld_slicw.bits.c1 = 1;
704 j->pld_slicw.bits.c2 = 0;
705 j->pld_slicw.bits.c3 = 0;
706 j->pld_slicw.bits.b2en = 1;
707 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
708 fRetVal = TRUE;
709 break;
710 case PLD_SLIC_STATE_ACTIVE:
711 j->pld_slicw.bits.c1 = 0;
712 j->pld_slicw.bits.c2 = 1;
713 j->pld_slicw.bits.c3 = 0;
714 j->pld_slicw.bits.b2en = 0;
715 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
716 fRetVal = TRUE;
717 break;
718 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
719
720 j->pld_slicw.bits.c1 = 1;
721 j->pld_slicw.bits.c2 = 1;
722 j->pld_slicw.bits.c3 = 0;
723 j->pld_slicw.bits.b2en = 0;
724 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
725 fRetVal = TRUE;
726 break;
727 case PLD_SLIC_STATE_TIPOPEN:
728 j->pld_slicw.bits.c1 = 0;
729 j->pld_slicw.bits.c2 = 0;
730 j->pld_slicw.bits.c3 = 1;
731 j->pld_slicw.bits.b2en = 0;
732 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
733 fRetVal = TRUE;
734 break;
735 case PLD_SLIC_STATE_STANDBY:
736 j->pld_slicw.bits.c1 = 1;
737 j->pld_slicw.bits.c2 = 0;
738 j->pld_slicw.bits.c3 = 1;
739 j->pld_slicw.bits.b2en = 1;
740 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
741 fRetVal = TRUE;
742 break;
743 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
744
745 j->pld_slicw.bits.c1 = 0;
746 j->pld_slicw.bits.c2 = 1;
747 j->pld_slicw.bits.c3 = 1;
748 j->pld_slicw.bits.b2en = 0;
749 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
750 fRetVal = TRUE;
751 break;
752 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
753
754 j->pld_slicw.bits.c1 = 1;
755 j->pld_slicw.bits.c2 = 1;
756 j->pld_slicw.bits.c3 = 1;
757 j->pld_slicw.bits.b2en = 0;
758 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
759 fRetVal = TRUE;
760 break;
761 default:
762 fRetVal = FALSE;
763 break;
764 }
765 }
766
767 return fRetVal;
768}
769
770static int ixj_wink(IXJ *j)
771{
772 BYTE slicnow;
773
774 slicnow = SLIC_GetState(j);
775
776 j->pots_winkstart = jiffies;
777 SLIC_SetState(PLD_SLIC_STATE_OC, j);
778
779 while (time_before(jiffies, j->pots_winkstart + j->winktime)) {
780 set_current_state(TASK_INTERRUPTIBLE);
781 schedule_timeout(1);
782 }
783
784 SLIC_SetState(slicnow, j);
785 return 0;
786}
787
788static void ixj_init_timer(IXJ *j)
789{
790 init_timer(&j->timer);
791 j->timer.function = ixj_timeout;
792 j->timer.data = (unsigned long)j;
793}
794
795static void ixj_add_timer(IXJ *j)
796{
797 j->timer.expires = jiffies + (hertz / samplerate);
798 add_timer(&j->timer);
799}
800
801static void ixj_tone_timeout(IXJ *j)
802{
803 IXJ_TONE ti;
804
805 j->tone_state++;
806 if (j->tone_state == 3) {
807 j->tone_state = 0;
808 if (j->cadence_t) {
809 j->tone_cadence_state++;
810 if (j->tone_cadence_state >= j->cadence_t->elements_used) {
811 switch (j->cadence_t->termination) {
812 case PLAY_ONCE:
813 ixj_cpt_stop(j);
814 break;
815 case REPEAT_LAST_ELEMENT:
816 j->tone_cadence_state--;
817 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
818 break;
819 case REPEAT_ALL:
820 j->tone_cadence_state = 0;
821 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
822 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
823 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
824 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
825 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
826 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
827 ixj_init_tone(j, &ti);
828 }
829 ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
830 ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
831 ixj_play_tone(j, j->cadence_t->ce[0].index);
832 break;
833 }
834 } else {
835 if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
836 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
837 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
838 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
839 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
840 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
841 ixj_init_tone(j, &ti);
842 }
843 ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
844 ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
845 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
846 }
847 }
848 }
849}
850
851static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
852{
853 if(j->ixj_signals[event]) {
854 if(ixjdebug & 0x0100)
855 printk("Sending signal for event %d\n", event);
856 /* Send apps notice of change */
857 /* see config.h for macro definition */
858 kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
859 }
860}
861
862static void ixj_pstn_state(IXJ *j)
863{
864 int var;
865 union XOPXR0 XR0, daaint;
866
867 var = 10;
868
869 XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
870 daaint.reg = 0;
871 XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
872
873 j->pld_scrr.byte = inb_p(j->XILINXbase);
874 if (j->pld_scrr.bits.daaflag) {
875 daa_int_read(j);
876 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
877 if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
878 daaint.bitreg.RING = 1;
879 if(ixjdebug & 0x0008) {
880 printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
881 }
882 } else {
883 daa_set_mode(j, SOP_PU_RESET);
884 }
885 }
886 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
887 daaint.bitreg.Caller_ID = 1;
888 j->pstn_cid_intr = 1;
889 j->pstn_cid_received = jiffies;
890 if(ixjdebug & 0x0008) {
891 printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
892 }
893 }
894 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
895 daaint.bitreg.Cadence = 1;
896 if(ixjdebug & 0x0008) {
897 printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
898 }
899 }
900 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
901 daaint.bitreg.VDD_OK = 1;
902 daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
903 }
904 }
905 daa_CR_read(j, 1);
906 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)) {
907 daaint.bitreg.RMR = 1;
908 daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
909 if(ixjdebug & 0x0008) {
910 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);
911 }
912 j->pstn_prev_rmr = j->pstn_last_rmr;
913 j->pstn_last_rmr = jiffies;
914 }
915 switch(j->daa_mode) {
916 case SOP_PU_SLEEP:
917 if (daaint.bitreg.RING) {
918 if (!j->flags.pstn_ringing) {
919 if (j->daa_mode != SOP_PU_RINGING) {
920 j->pstn_ring_int = jiffies;
921 daa_set_mode(j, SOP_PU_RINGING);
922 }
923 }
924 }
925 break;
926 case SOP_PU_RINGING:
927 if (daaint.bitreg.RMR) {
928 if (ixjdebug & 0x0008) {
929 printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
930 }
931 if (daaint.bitreg.SI_1) { /* Rising edge of RMR */
932 j->flags.pstn_rmr = 1;
933 j->pstn_ring_start = jiffies;
934 j->pstn_ring_stop = 0;
935 j->ex.bits.pstn_ring = 0;
936 if (j->cadence_f[4].state == 0) {
937 j->cadence_f[4].state = 1;
938 j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
939 j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
940 j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
941 } else if (j->cadence_f[4].state == 2) {
942 if((time_after(jiffies, j->cadence_f[4].off1min) &&
943 time_before(jiffies, j->cadence_f[4].off1max))) {
944 if (j->cadence_f[4].on2) {
945 j->cadence_f[4].state = 3;
946 j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
947 j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
948 j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
949 } else {
950 j->cadence_f[4].state = 7;
951 }
952 } else {
953 if (ixjdebug & 0x0008) {
954 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
955 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
956 j->cadence_f[4].off1);
957 }
958 j->cadence_f[4].state = 0;
959 }
960 } else if (j->cadence_f[4].state == 4) {
961 if((time_after(jiffies, j->cadence_f[4].off2min) &&
962 time_before(jiffies, j->cadence_f[4].off2max))) {
963 if (j->cadence_f[4].on3) {
964 j->cadence_f[4].state = 5;
965 j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
966 j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
967 j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
968 } else {
969 j->cadence_f[4].state = 7;
970 }
971 } else {
972 if (ixjdebug & 0x0008) {
973 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
974 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
975 j->cadence_f[4].off2);
976 }
977 j->cadence_f[4].state = 0;
978 }
979 } else if (j->cadence_f[4].state == 6) {
980 if((time_after(jiffies, j->cadence_f[4].off3min) &&
981 time_before(jiffies, j->cadence_f[4].off3max))) {
982 j->cadence_f[4].state = 7;
983 } else {
984 if (ixjdebug & 0x0008) {
985 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
986 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
987 j->cadence_f[4].off3);
988 }
989 j->cadence_f[4].state = 0;
990 }
991 } else {
992 j->cadence_f[4].state = 0;
993 }
994 } else { /* Falling edge of RMR */
995 j->pstn_ring_start = 0;
996 j->pstn_ring_stop = jiffies;
997 if (j->cadence_f[4].state == 1) {
998 if(!j->cadence_f[4].on1) {
999 j->cadence_f[4].state = 7;
1000 } else if((time_after(jiffies, j->cadence_f[4].on1min) &&
1001 time_before(jiffies, j->cadence_f[4].on1max))) {
1002 if (j->cadence_f[4].off1) {
1003 j->cadence_f[4].state = 2;
1004 j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
1005 j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
1006 j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
1007 } else {
1008 j->cadence_f[4].state = 7;
1009 }
1010 } else {
1011 if (ixjdebug & 0x0008) {
1012 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1013 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1014 j->cadence_f[4].on1);
1015 }
1016 j->cadence_f[4].state = 0;
1017 }
1018 } else if (j->cadence_f[4].state == 3) {
1019 if((time_after(jiffies, j->cadence_f[4].on2min) &&
1020 time_before(jiffies, j->cadence_f[4].on2max))) {
1021 if (j->cadence_f[4].off2) {
1022 j->cadence_f[4].state = 4;
1023 j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
1024 j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
1025 j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
1026 } else {
1027 j->cadence_f[4].state = 7;
1028 }
1029 } else {
1030 if (ixjdebug & 0x0008) {
1031 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1032 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1033 j->cadence_f[4].on2);
1034 }
1035 j->cadence_f[4].state = 0;
1036 }
1037 } else if (j->cadence_f[4].state == 5) {
1038 if((time_after(jiffies, j->cadence_f[4].on3min) &&
1039 time_before(jiffies, j->cadence_f[4].on3max))) {
1040 if (j->cadence_f[4].off3) {
1041 j->cadence_f[4].state = 6;
1042 j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
1043 j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
1044 j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
1045 } else {
1046 j->cadence_f[4].state = 7;
1047 }
1048 } else {
1049 j->cadence_f[4].state = 0;
1050 }
1051 } else {
1052 if (ixjdebug & 0x0008) {
1053 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1054 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1055 j->cadence_f[4].on3);
1056 }
1057 j->cadence_f[4].state = 0;
1058 }
1059 }
1060 if (ixjdebug & 0x0010) {
1061 printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1062 }
1063 if (ixjdebug & 0x0010) {
1064 switch(j->cadence_f[4].state) {
1065 case 1:
1066 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1067 j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
1068 break;
1069 case 2:
1070 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1071 j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
1072 break;
1073 case 3:
1074 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1075 j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
1076 break;
1077 case 4:
1078 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1079 j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
1080 break;
1081 case 5:
1082 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1083 j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
1084 break;
1085 case 6:
1086 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1087 j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
1088 break;
1089 }
1090 }
1091 }
1092 if (j->cadence_f[4].state == 7) {
1093 j->cadence_f[4].state = 0;
1094 j->pstn_ring_stop = jiffies;
1095 j->ex.bits.pstn_ring = 1;
1096 ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
1097 if(ixjdebug & 0x0008) {
1098 printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
1099 }
1100 }
1101 if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
1102 (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
1103 if(ixjdebug & 0x0008) {
1104 printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
1105 printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
1106 printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
1107 }
1108 j->pstn_ring_stop = j->pstn_ring_int = 0;
1109 daa_set_mode(j, SOP_PU_SLEEP);
1110 }
1111 outb_p(j->pld_scrw.byte, j->XILINXbase);
1112 if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
1113 ixj_daa_cid_read(j);
1114 j->ex.bits.caller_id = 1;
1115 ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
1116 j->pstn_cid_intr = 0;
1117 }
1118 if (daaint.bitreg.Cadence) {
1119 if(ixjdebug & 0x0008) {
1120 printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
1121 }
1122 daa_set_mode(j, SOP_PU_SLEEP);
1123 j->ex.bits.pstn_ring = 0;
1124 }
1125 break;
1126 case SOP_PU_CONVERSATION:
1127 if (daaint.bitreg.VDD_OK) {
1128 if(!daaint.bitreg.SI_0) {
1129 if (!j->pstn_winkstart) {
1130 if(ixjdebug & 0x0008) {
1131 printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
1132 }
1133 j->pstn_winkstart = jiffies;
1134 }
1135 } else {
1136 if (j->pstn_winkstart) {
1137 if(ixjdebug & 0x0008) {
1138 printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
1139 }
1140 j->pstn_winkstart = 0;
1141 }
1142 }
1143 }
1144 if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
1145 if(ixjdebug & 0x0008) {
1146 printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
1147 }
1148 daa_set_mode(j, SOP_PU_SLEEP);
1149 j->pstn_winkstart = 0;
1150 j->ex.bits.pstn_wink = 1;
1151 ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
1152 }
1153 break;
1154 }
1155}
1156
1157static void ixj_timeout(unsigned long ptr)
1158{
1159 int board;
1160 unsigned long jifon;
1161 IXJ *j = (IXJ *)ptr;
1162 board = j->board;
1163
1164 if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
1165 ixj_perfmon(j->timerchecks);
1166 j->hookstate = ixj_hookstate(j);
1167 if (j->tone_state) {
1168 if (!(j->hookstate)) {
1169 ixj_cpt_stop(j);
1170 if (j->m_hook) {
1171 j->m_hook = 0;
1172 j->ex.bits.hookstate = 1;
1173 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1174 }
1175 clear_bit(board, &j->busyflags);
1176 ixj_add_timer(j);
1177 return;
1178 }
1179 if (j->tone_state == 1)
1180 jifon = ((hertz * j->tone_on_time) * 25 / 100000);
1181 else
1182 jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
1183 if (time_before(jiffies, j->tone_start_jif + jifon)) {
1184 if (j->tone_state == 1) {
1185 ixj_play_tone(j, j->tone_index);
1186 if (j->dsp.low == 0x20) {
1187 clear_bit(board, &j->busyflags);
1188 ixj_add_timer(j);
1189 return;
1190 }
1191 } else {
1192 ixj_play_tone(j, 0);
1193 if (j->dsp.low == 0x20) {
1194 clear_bit(board, &j->busyflags);
1195 ixj_add_timer(j);
1196 return;
1197 }
1198 }
1199 } else {
1200 ixj_tone_timeout(j);
1201 if (j->flags.dialtone) {
1202 ixj_dialtone(j);
1203 }
1204 if (j->flags.busytone) {
1205 ixj_busytone(j);
1206 if (j->dsp.low == 0x20) {
1207 clear_bit(board, &j->busyflags);
1208 ixj_add_timer(j);
1209 return;
1210 }
1211 }
1212 if (j->flags.ringback) {
1213 ixj_ringback(j);
1214 if (j->dsp.low == 0x20) {
1215 clear_bit(board, &j->busyflags);
1216 ixj_add_timer(j);
1217 return;
1218 }
1219 }
1220 if (!j->tone_state) {
1221 ixj_cpt_stop(j);
1222 }
1223 }
1224 }
1225 if (!(j->tone_state && j->dsp.low == 0x20)) {
1226 if (IsRxReady(j)) {
1227 ixj_read_frame(j);
1228 }
1229 if (IsTxReady(j)) {
1230 ixj_write_frame(j);
1231 }
1232 }
1233 if (j->flags.cringing) {
1234 if (j->hookstate & 1) {
1235 j->flags.cringing = 0;
1236 ixj_ring_off(j);
1237 } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
1238 switch(j->cadence_f[5].state) {
1239 case 0:
1240 j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
1241 if (time_before(jiffies, j->cadence_f[5].on1dot)) {
1242 if(ixjdebug & 0x0004) {
1243 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1244 }
1245 ixj_ring_on(j);
1246 }
1247 j->cadence_f[5].state = 1;
1248 break;
1249 case 1:
1250 if (time_after(jiffies, j->cadence_f[5].on1dot)) {
1251 j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
1252 if(ixjdebug & 0x0004) {
1253 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1254 }
1255 ixj_ring_off(j);
1256 j->cadence_f[5].state = 2;
1257 }
1258 break;
1259 case 2:
1260 if (time_after(jiffies, j->cadence_f[5].off1dot)) {
1261 if(ixjdebug & 0x0004) {
1262 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1263 }
1264 ixj_ring_on(j);
1265 if (j->cadence_f[5].on2) {
1266 j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
1267 j->cadence_f[5].state = 3;
1268 } else {
1269 j->cadence_f[5].state = 7;
1270 }
1271 }
1272 break;
1273 case 3:
1274 if (time_after(jiffies, j->cadence_f[5].on2dot)) {
1275 if(ixjdebug & 0x0004) {
1276 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1277 }
1278 ixj_ring_off(j);
1279 if (j->cadence_f[5].off2) {
1280 j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
1281 j->cadence_f[5].state = 4;
1282 } else {
1283 j->cadence_f[5].state = 7;
1284 }
1285 }
1286 break;
1287 case 4:
1288 if (time_after(jiffies, j->cadence_f[5].off2dot)) {
1289 if(ixjdebug & 0x0004) {
1290 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1291 }
1292 ixj_ring_on(j);
1293 if (j->cadence_f[5].on3) {
1294 j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
1295 j->cadence_f[5].state = 5;
1296 } else {
1297 j->cadence_f[5].state = 7;
1298 }
1299 }
1300 break;
1301 case 5:
1302 if (time_after(jiffies, j->cadence_f[5].on3dot)) {
1303 if(ixjdebug & 0x0004) {
1304 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1305 }
1306 ixj_ring_off(j);
1307 if (j->cadence_f[5].off3) {
1308 j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
1309 j->cadence_f[5].state = 6;
1310 } else {
1311 j->cadence_f[5].state = 7;
1312 }
1313 }
1314 break;
1315 case 6:
1316 if (time_after(jiffies, j->cadence_f[5].off3dot)) {
1317 if(ixjdebug & 0x0004) {
1318 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1319 }
1320 j->cadence_f[5].state = 7;
1321 }
1322 break;
1323 case 7:
1324 if(ixjdebug & 0x0004) {
1325 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1326 }
1327 j->flags.cidring = 1;
1328 j->cadence_f[5].state = 0;
1329 break;
1330 }
1331 if (j->flags.cidring && !j->flags.cidsent) {
1332 j->flags.cidsent = 1;
1333 if(j->fskdcnt) {
1334 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1335 ixj_pre_cid(j);
1336 }
1337 j->flags.cidring = 0;
1338 }
1339 clear_bit(board, &j->busyflags);
1340 ixj_add_timer(j);
1341 return;
1342 } else {
1343 if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
1344 if (j->flags.cidring && !j->flags.cidsent) {
1345 j->flags.cidsent = 1;
1346 if(j->fskdcnt) {
1347 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1348 ixj_pre_cid(j);
1349 }
1350 j->flags.cidring = 0;
1351 }
1352 j->ring_cadence_t--;
1353 if (j->ring_cadence_t == -1)
1354 j->ring_cadence_t = 15;
1355 j->ring_cadence_jif = jiffies;
1356
1357 if (j->ring_cadence & 1 << j->ring_cadence_t) {
1358 if(j->flags.cidsent && j->cadence_f[5].en_filter)
1359 j->flags.firstring = 1;
1360 else
1361 ixj_ring_on(j);
1362 } else {
1363 ixj_ring_off(j);
1364 if(!j->flags.cidsent)
1365 j->flags.cidring = 1;
1366 }
1367 }
1368 clear_bit(board, &j->busyflags);
1369 ixj_add_timer(j);
1370 return;
1371 }
1372 }
1373 if (!j->flags.ringing) {
1374 if (j->hookstate) { /* & 1) { */
1375 if (j->dsp.low != 0x20 &&
1376 SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
1377 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1378 }
1379 LineMonitor(j);
1380 read_filters(j);
1381 ixj_WriteDSPCommand(0x511B, j);
1382 j->proc_load = j->ssr.high << 8 | j->ssr.low;
1383 if (!j->m_hook && (j->hookstate & 1)) {
1384 j->m_hook = j->ex.bits.hookstate = 1;
1385 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1386 }
1387 } else {
1388 if (j->ex.bits.dtmf_ready) {
1389 j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
1390 }
1391 if (j->m_hook) {
1392 j->m_hook = 0;
1393 j->ex.bits.hookstate = 1;
1394 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1395 }
1396 }
1397 }
1398 if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
1399 ixj_pstn_state(j);
1400 }
1401 if (j->ex.bytes) {
1402 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
1403 }
1404 clear_bit(board, &j->busyflags);
1405 }
1406 ixj_add_timer(j);
1407}
1408
1409static int ixj_status_wait(IXJ *j)
1410{
1411 unsigned long jif;
1412
1413 jif = jiffies + ((60 * hertz) / 100);
1414 while (!IsStatusReady(j)) {
1415 ixj_perfmon(j->statuswait);
1416 if (time_after(jiffies, jif)) {
1417 ixj_perfmon(j->statuswaitfail);
1418 return -1;
1419 }
1420 }
1421 return 0;
1422}
1423
1424static int ixj_PCcontrol_wait(IXJ *j)
1425{
1426 unsigned long jif;
1427
1428 jif = jiffies + ((60 * hertz) / 100);
1429 while (!IsPCControlReady(j)) {
1430 ixj_perfmon(j->pcontrolwait);
1431 if (time_after(jiffies, jif)) {
1432 ixj_perfmon(j->pcontrolwaitfail);
1433 return -1;
1434 }
1435 }
1436 return 0;
1437}
1438
1439static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
1440{
1441 BYTES bytes;
1442 unsigned long jif;
1443
1444 atomic_inc(&j->DSPWrite);
1445 if(atomic_read(&j->DSPWrite) > 1) {
1446 printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
1447 return -1;
1448 }
1449 bytes.high = (cmd & 0xFF00) >> 8;
1450 bytes.low = cmd & 0x00FF;
1451 jif = jiffies + ((60 * hertz) / 100);
1452 while (!IsControlReady(j)) {
1453 ixj_perfmon(j->iscontrolready);
1454 if (time_after(jiffies, jif)) {
1455 ixj_perfmon(j->iscontrolreadyfail);
1456 atomic_dec(&j->DSPWrite);
1457 if(atomic_read(&j->DSPWrite) > 0) {
1458 printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
1459 while(atomic_read(&j->DSPWrite) > 0) {
1460 atomic_dec(&j->DSPWrite);
1461 }
1462 }
1463 return -1;
1464 }
1465 }
1466 outb(bytes.low, j->DSPbase + 6);
1467 outb(bytes.high, j->DSPbase + 7);
1468
1469 if (ixj_status_wait(j)) {
1470 j->ssr.low = 0xFF;
1471 j->ssr.high = 0xFF;
1472 atomic_dec(&j->DSPWrite);
1473 if(atomic_read(&j->DSPWrite) > 0) {
1474 printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
1475 while(atomic_read(&j->DSPWrite) > 0) {
1476 atomic_dec(&j->DSPWrite);
1477 }
1478 }
1479 return -1;
1480 }
1481/* Read Software Status Register */
1482 j->ssr.low = inb_p(j->DSPbase + 2);
1483 j->ssr.high = inb_p(j->DSPbase + 3);
1484 atomic_dec(&j->DSPWrite);
1485 if(atomic_read(&j->DSPWrite) > 0) {
1486 printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
1487 while(atomic_read(&j->DSPWrite) > 0) {
1488 atomic_dec(&j->DSPWrite);
1489 }
1490 }
1491 return 0;
1492}
1493
1494/***************************************************************************
1495*
1496* General Purpose IO Register read routine
1497*
1498***************************************************************************/
1499static inline int ixj_gpio_read(IXJ *j)
1500{
1501 if (ixj_WriteDSPCommand(0x5143, j))
1502 return -1;
1503
1504 j->gpio.bytes.low = j->ssr.low;
1505 j->gpio.bytes.high = j->ssr.high;
1506
1507 return 0;
1508}
1509
1510static inline void LED_SetState(int state, IXJ *j)
1511{
1512 if (j->cardtype == QTI_LINEJACK) {
1513 j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
1514 j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
1515 j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
1516 j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
1517
1518 outb(j->pld_scrw.byte, j->XILINXbase);
1519 }
1520}
1521
1522/*********************************************************************
1523* GPIO Pins are configured as follows on the Quicknet Internet
1524* PhoneJACK Telephony Cards
1525*
1526* POTS Select GPIO_6=0 GPIO_7=0
1527* Mic/Speaker Select GPIO_6=0 GPIO_7=1
1528* Handset Select GPIO_6=1 GPIO_7=0
1529*
1530* SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0
1531* SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0
1532* SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0
1533*
1534* Hook Switch changes reported on GPIO_3
1535*********************************************************************/
1536static int ixj_set_port(IXJ *j, int arg)
1537{
1538 if (j->cardtype == QTI_PHONEJACK_LITE) {
1539 if (arg != PORT_POTS)
1540 return 10;
1541 else
1542 return 0;
1543 }
1544 switch (arg) {
1545 case PORT_POTS:
1546 j->port = PORT_POTS;
1547 switch (j->cardtype) {
1548 case QTI_PHONECARD:
1549 if (j->flags.pcmciasct == 1)
1550 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1551 else
1552 return 11;
1553 break;
1554 case QTI_PHONEJACK_PCI:
1555 j->pld_slicw.pcib.mic = 0;
1556 j->pld_slicw.pcib.spk = 0;
1557 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1558 break;
1559 case QTI_LINEJACK:
1560 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1561 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1562 Software Control Register */
1563 return 2;
1564 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1565
1566 outb(j->pld_scrw.byte, j->XILINXbase);
1567 j->pld_clock.byte = 0;
1568 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1569 j->pld_slicw.bits.rly1 = 1;
1570 j->pld_slicw.bits.spken = 0;
1571 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1572 ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */
1573 ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */
1574 ixj_mixer(0x1300, j); /* Turn Off MIC switch on mixer right */
1575 ixj_mixer(0x1501, j); /* Turn On Mono1 switch on mixer right */
1576 ixj_mixer(0x0E80, j); /*Mic mute */
1577 ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */
1578 ixj_mixer(0x0080, j); /* Mute Master Left volume */
1579 ixj_mixer(0x0180, j); /* Mute Master Right volume */
1580 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
1581/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1582 break;
1583 case QTI_PHONEJACK:
1584 j->gpio.bytes.high = 0x0B;
1585 j->gpio.bits.gpio6 = 0;
1586 j->gpio.bits.gpio7 = 0;
1587 ixj_WriteDSPCommand(j->gpio.word, j);
1588 break;
1589 }
1590 break;
1591 case PORT_PSTN:
1592 if (j->cardtype == QTI_LINEJACK) {
1593 ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */
1594
1595 j->pld_slicw.bits.rly3 = 0;
1596 j->pld_slicw.bits.rly1 = 1;
1597 j->pld_slicw.bits.spken = 0;
1598 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1599 j->port = PORT_PSTN;
1600 } else {
1601 return 4;
1602 }
1603 break;
1604 case PORT_SPEAKER:
1605 j->port = PORT_SPEAKER;
1606 switch (j->cardtype) {
1607 case QTI_PHONECARD:
1608 if (j->flags.pcmciasct) {
1609 SLIC_SetState(PLD_SLIC_STATE_OC, j);
1610 }
1611 break;
1612 case QTI_PHONEJACK_PCI:
1613 j->pld_slicw.pcib.mic = 1;
1614 j->pld_slicw.pcib.spk = 1;
1615 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1616 break;
1617 case QTI_LINEJACK:
1618 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1619 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1620 Software Control Register */
1621 return 2;
1622 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1623
1624 outb(j->pld_scrw.byte, j->XILINXbase);
1625 j->pld_clock.byte = 0;
1626 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1627 j->pld_slicw.bits.rly1 = 1;
1628 j->pld_slicw.bits.spken = 1;
1629 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1630 ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */
1631 ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */
1632 ixj_mixer(0x1301, j); /* Turn On MIC switch on mixer right */
1633 ixj_mixer(0x1500, j); /* Turn Off Mono1 switch on mixer right */
1634 ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */
1635 ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */
1636 ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */
1637 ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */
1638 break;
1639 case QTI_PHONEJACK:
1640 j->gpio.bytes.high = 0x0B;
1641 j->gpio.bits.gpio6 = 0;
1642 j->gpio.bits.gpio7 = 1;
1643 ixj_WriteDSPCommand(j->gpio.word, j);
1644 break;
1645 }
1646 break;
1647 case PORT_HANDSET:
1648 if (j->cardtype != QTI_PHONEJACK) {
1649 return 5;
1650 } else {
1651 j->gpio.bytes.high = 0x0B;
1652 j->gpio.bits.gpio6 = 1;
1653 j->gpio.bits.gpio7 = 0;
1654 ixj_WriteDSPCommand(j->gpio.word, j);
1655 j->port = PORT_HANDSET;
1656 }
1657 break;
1658 default:
1659 return 6;
1660 break;
1661 }
1662 return 0;
1663}
1664
1665static int ixj_set_pots(IXJ *j, int arg)
1666{
1667 if (j->cardtype == QTI_LINEJACK) {
1668 if (arg) {
1669 if (j->port == PORT_PSTN) {
1670 j->pld_slicw.bits.rly1 = 0;
1671 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1672 j->flags.pots_pstn = 1;
1673 return 1;
1674 } else {
1675 j->flags.pots_pstn = 0;
1676 return 0;
1677 }
1678 } else {
1679 j->pld_slicw.bits.rly1 = 1;
1680 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1681 j->flags.pots_pstn = 0;
1682 return 1;
1683 }
1684 } else {
1685 return 0;
1686 }
1687}
1688
1689static void ixj_ring_on(IXJ *j)
1690{
1691 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
1692 {
1693 if (ixjdebug & 0x0004)
1694 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1695
1696 j->gpio.bytes.high = 0x0B;
1697 j->gpio.bytes.low = 0x00;
1698 j->gpio.bits.gpio1 = 1;
1699 j->gpio.bits.gpio2 = 1;
1700 j->gpio.bits.gpio5 = 0;
1701 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring signal */
1702 } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1703 {
1704 if (ixjdebug & 0x0004)
1705 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1706
1707 SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
1708 }
1709}
1710
1711static int ixj_siadc(IXJ *j, int val)
1712{
1713 if(j->cardtype == QTI_PHONECARD){
1714 if(j->flags.pcmciascp){
1715 if(val == -1)
1716 return j->siadc.bits.rxg;
1717
1718 if(val < 0 || val > 0x1F)
1719 return -1;
1720
1721 j->siadc.bits.hom = 0; /* Handset Out Mute */
1722 j->siadc.bits.lom = 0; /* Line Out Mute */
1723 j->siadc.bits.rxg = val; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */
1724 j->psccr.bits.addr = 6; /* R/W Smart Cable Register Address */
1725 j->psccr.bits.rw = 0; /* Read / Write flag */
1726 j->psccr.bits.dev = 0;
1727 outb(j->siadc.byte, j->XILINXbase + 0x00);
1728 outb(j->psccr.byte, j->XILINXbase + 0x01);
1729 ixj_PCcontrol_wait(j);
1730 return j->siadc.bits.rxg;
1731 }
1732 }
1733 return -1;
1734}
1735
1736static int ixj_sidac(IXJ *j, int val)
1737{
1738 if(j->cardtype == QTI_PHONECARD){
1739 if(j->flags.pcmciascp){
1740 if(val == -1)
1741 return j->sidac.bits.txg;
1742
1743 if(val < 0 || val > 0x1F)
1744 return -1;
1745
1746 j->sidac.bits.srm = 1; /* Speaker Right Mute */
1747 j->sidac.bits.slm = 1; /* Speaker Left Mute */
1748 j->sidac.bits.txg = val; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */
1749 j->psccr.bits.addr = 7; /* R/W Smart Cable Register Address */
1750 j->psccr.bits.rw = 0; /* Read / Write flag */
1751 j->psccr.bits.dev = 0;
1752 outb(j->sidac.byte, j->XILINXbase + 0x00);
1753 outb(j->psccr.byte, j->XILINXbase + 0x01);
1754 ixj_PCcontrol_wait(j);
1755 return j->sidac.bits.txg;
1756 }
1757 }
1758 return -1;
1759}
1760
1761static int ixj_pcmcia_cable_check(IXJ *j)
1762{
1763 j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
1764 if (!j->flags.pcmciastate) {
1765 j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
1766 if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
1767 j->flags.pcmciastate = 4;
1768 return 0;
1769 }
1770 if (j->pccr1.bits.ed) {
1771 j->pccr1.bits.ed = 0;
1772 j->psccr.bits.dev = 3;
1773 j->psccr.bits.rw = 1;
1774 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
1775 ixj_PCcontrol_wait(j);
1776 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
1777 j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
1778 j->psccr.bits.dev = 3;
1779 j->psccr.bits.rw = 0;
1780 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1781 ixj_PCcontrol_wait(j);
1782 return j->pslic.bits.led2 ? 1 : 0;
1783 } else if (j->flags.pcmciasct) {
1784 return j->r_hook;
1785 } else {
1786 return 1;
1787 }
1788 } else if (j->flags.pcmciastate == 4) {
1789 if (!j->pccr1.bits.drf) {
1790 j->flags.pcmciastate = 3;
1791 }
1792 return 0;
1793 } else if (j->flags.pcmciastate == 3) {
1794 j->pccr2.bits.pwr = 0;
1795 j->pccr2.bits.rstc = 1;
1796 outb(j->pccr2.byte, j->XILINXbase + 0x02);
1797 j->checkwait = jiffies + (hertz * 2);
1798 j->flags.incheck = 1;
1799 j->flags.pcmciastate = 2;
1800 return 0;
1801 } else if (j->flags.pcmciastate == 2) {
1802 if (j->flags.incheck) {
1803 if (time_before(jiffies, j->checkwait)) {
1804 return 0;
1805 } else {
1806 j->flags.incheck = 0;
1807 }
1808 }
1809 j->pccr2.bits.pwr = 0;
1810 j->pccr2.bits.rstc = 0;
1811 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1812 j->flags.pcmciastate = 1;
1813 return 0;
1814 } else if (j->flags.pcmciastate == 1) {
1815 j->flags.pcmciastate = 0;
1816 if (!j->pccr1.bits.drf) {
1817 j->psccr.bits.dev = 3;
1818 j->psccr.bits.rw = 1;
1819 outb_p(j->psccr.byte, j->XILINXbase + 0x01);
1820 ixj_PCcontrol_wait(j);
1821 j->flags.pcmciascp = 1; /* Set Cable Present Flag */
1822
1823 j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03; /* Get Cable Type */
1824
1825 if (j->flags.pcmciasct == 3) {
1826 j->flags.pcmciastate = 4;
1827 return 0;
1828 } else if (j->flags.pcmciasct == 0) {
1829 j->pccr2.bits.pwr = 1;
1830 j->pccr2.bits.rstc = 0;
1831 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1832 j->port = PORT_SPEAKER;
1833 } else {
1834 j->port = PORT_POTS;
1835 }
1836 j->sic1.bits.cpd = 0; /* Chip Power Down */
1837 j->sic1.bits.mpd = 0; /* MIC Bias Power Down */
1838 j->sic1.bits.hpd = 0; /* Handset Bias Power Down */
1839 j->sic1.bits.lpd = 0; /* Line Bias Power Down */
1840 j->sic1.bits.spd = 1; /* Speaker Drive Power Down */
1841 j->psccr.bits.addr = 1; /* R/W Smart Cable Register Address */
1842 j->psccr.bits.rw = 0; /* Read / Write flag */
1843 j->psccr.bits.dev = 0;
1844 outb(j->sic1.byte, j->XILINXbase + 0x00);
1845 outb(j->psccr.byte, j->XILINXbase + 0x01);
1846 ixj_PCcontrol_wait(j);
1847
1848 j->sic2.bits.al = 0; /* Analog Loopback DAC analog -> ADC analog */
1849 j->sic2.bits.dl2 = 0; /* Digital Loopback DAC -> ADC one bit */
1850 j->sic2.bits.dl1 = 0; /* Digital Loopback ADC -> DAC one bit */
1851 j->sic2.bits.pll = 0; /* 1 = div 10, 0 = div 5 */
1852 j->sic2.bits.hpd = 0; /* HPF disable */
1853 j->psccr.bits.addr = 2; /* R/W Smart Cable Register Address */
1854 j->psccr.bits.rw = 0; /* Read / Write flag */
1855 j->psccr.bits.dev = 0;
1856 outb(j->sic2.byte, j->XILINXbase + 0x00);
1857 outb(j->psccr.byte, j->XILINXbase + 0x01);
1858 ixj_PCcontrol_wait(j);
1859
1860 j->psccr.bits.addr = 3; /* R/W Smart Cable Register Address */
1861 j->psccr.bits.rw = 0; /* Read / Write flag */
1862 j->psccr.bits.dev = 0;
1863 outb(0x00, j->XILINXbase + 0x00); /* PLL Divide N1 */
1864 outb(j->psccr.byte, j->XILINXbase + 0x01);
1865 ixj_PCcontrol_wait(j);
1866
1867 j->psccr.bits.addr = 4; /* R/W Smart Cable Register Address */
1868 j->psccr.bits.rw = 0; /* Read / Write flag */
1869 j->psccr.bits.dev = 0;
1870 outb(0x09, j->XILINXbase + 0x00); /* PLL Multiply M1 */
1871 outb(j->psccr.byte, j->XILINXbase + 0x01);
1872 ixj_PCcontrol_wait(j);
1873
1874 j->sirxg.bits.lig = 1; /* Line In Gain */
1875 j->sirxg.bits.lim = 1; /* Line In Mute */
1876 j->sirxg.bits.mcg = 0; /* MIC In Gain was 3 */
1877 j->sirxg.bits.mcm = 0; /* MIC In Mute */
1878 j->sirxg.bits.him = 0; /* Handset In Mute */
1879 j->sirxg.bits.iir = 1; /* IIR */
1880 j->psccr.bits.addr = 5; /* R/W Smart Cable Register Address */
1881 j->psccr.bits.rw = 0; /* Read / Write flag */
1882 j->psccr.bits.dev = 0;
1883 outb(j->sirxg.byte, j->XILINXbase + 0x00);
1884 outb(j->psccr.byte, j->XILINXbase + 0x01);
1885 ixj_PCcontrol_wait(j);
1886
1887 ixj_siadc(j, 0x17);
1888 ixj_sidac(j, 0x1D);
1889
1890 j->siaatt.bits.sot = 0;
1891 j->psccr.bits.addr = 9; /* R/W Smart Cable Register Address */
1892 j->psccr.bits.rw = 0; /* Read / Write flag */
1893 j->psccr.bits.dev = 0;
1894 outb(j->siaatt.byte, j->XILINXbase + 0x00);
1895 outb(j->psccr.byte, j->XILINXbase + 0x01);
1896 ixj_PCcontrol_wait(j);
1897
1898 if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
1899 j->psccr.byte = j->pslic.byte = 0;
1900 j->pslic.bits.powerdown = 1;
1901 j->psccr.bits.dev = 3;
1902 j->psccr.bits.rw = 0;
1903 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1904 ixj_PCcontrol_wait(j);
1905 }
1906 }
1907 return 0;
1908 } else {
1909 j->flags.pcmciascp = 0;
1910 return 0;
1911 }
1912 return 0;
1913}
1914
1915static int ixj_hookstate(IXJ *j)
1916{
1917 unsigned long det;
1918 int fOffHook = 0;
1919
1920 switch (j->cardtype) {
1921 case QTI_PHONEJACK:
1922 ixj_gpio_read(j);
1923 fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
1924 break;
1925 case QTI_LINEJACK:
1926 case QTI_PHONEJACK_LITE:
1927 case QTI_PHONEJACK_PCI:
1928 SLIC_GetState(j);
1929 if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
1930 fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
1931 if(fOffHook != j->p_hook) {
1932 if(!j->checkwait) {
1933 j->checkwait = jiffies;
1934 }
1935 if(time_before(jiffies, j->checkwait + 2)) {
1936 fOffHook ^= 1;
1937 } else {
1938 j->checkwait = 0;
1939 }
1940 j->p_hook = fOffHook;
1941 printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
1942 }
1943 } else {
1944 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
1945 j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
1946 if (j->flags.ringing || j->flags.cringing) {
1947 if (!in_interrupt()) {
1948 det = jiffies + (hertz / 50);
1949 while (time_before(jiffies, det)) {
1950 set_current_state(TASK_INTERRUPTIBLE);
1951 schedule_timeout(1);
1952 }
1953 }
1954 SLIC_GetState(j);
1955 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
1956 ixj_ring_on(j);
1957 }
1958 }
1959 if (j->cardtype == QTI_PHONEJACK_PCI) {
1960 j->pld_scrr.byte = inb_p(j->XILINXbase);
1961 fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
1962 } else
1963 fOffHook = j->pld_slicr.bits.det ? 1 : 0;
1964 }
1965 }
1966 break;
1967 case QTI_PHONECARD:
1968 fOffHook = ixj_pcmcia_cable_check(j);
1969 break;
1970 }
1971 if (j->r_hook != fOffHook) {
1972 j->r_hook = fOffHook;
1973 if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
1974 j->ex.bits.hookstate = 1;
1975 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1976 } else if (!fOffHook) {
1977 j->flash_end = jiffies + ((60 * hertz) / 100);
1978 }
1979 }
1980 if (fOffHook) {
1981 if(time_before(jiffies, j->flash_end)) {
1982 j->ex.bits.flash = 1;
1983 j->flash_end = 0;
1984 ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
1985 }
1986 } else {
1987 if(time_before(jiffies, j->flash_end)) {
1988 fOffHook = 1;
1989 }
1990 }
1991
1992 if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
1993 fOffHook |= 2;
1994
1995 if (j->port == PORT_SPEAKER) {
1996 if(j->cardtype == QTI_PHONECARD) {
1997 if(j->flags.pcmciascp && j->flags.pcmciasct) {
1998 fOffHook |= 2;
1999 }
2000 } else {
2001 fOffHook |= 2;
2002 }
2003 }
2004
2005 if (j->port == PORT_HANDSET)
2006 fOffHook |= 2;
2007
2008 return fOffHook;
2009}
2010
2011static void ixj_ring_off(IXJ *j)
2012{
2013 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
2014 {
2015 if (ixjdebug & 0x0004)
2016 printk(KERN_INFO "IXJ Ring Off\n");
2017 j->gpio.bytes.high = 0x0B;
2018 j->gpio.bytes.low = 0x00;
2019 j->gpio.bits.gpio1 = 0;
2020 j->gpio.bits.gpio2 = 1;
2021 j->gpio.bits.gpio5 = 0;
2022 ixj_WriteDSPCommand(j->gpio.word, j);
2023 } else /* Internet LineJACK */
2024 {
2025 if (ixjdebug & 0x0004)
2026 printk(KERN_INFO "IXJ Ring Off\n");
2027
2028 if(!j->flags.cidplay)
2029 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
2030
2031 SLIC_GetState(j);
2032 }
2033}
2034
2035static void ixj_ring_start(IXJ *j)
2036{
2037 j->flags.cringing = 1;
2038 if (ixjdebug & 0x0004)
2039 printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
2040 if (ixj_hookstate(j) & 1) {
2041 if (j->port == PORT_POTS)
2042 ixj_ring_off(j);
2043 j->flags.cringing = 0;
2044 if (ixjdebug & 0x0004)
2045 printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
2046 } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
2047 j->ring_cadence_jif = jiffies;
2048 j->flags.cidsent = j->flags.cidring = 0;
2049 j->cadence_f[5].state = 0;
2050 if(j->cadence_f[5].on1)
2051 ixj_ring_on(j);
2052 } else {
2053 j->ring_cadence_jif = jiffies;
2054 j->ring_cadence_t = 15;
2055 if (j->ring_cadence & 1 << j->ring_cadence_t) {
2056 ixj_ring_on(j);
2057 } else {
2058 ixj_ring_off(j);
2059 }
2060 j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
2061 }
2062}
2063
2064static int ixj_ring(IXJ *j)
2065{
2066 char cntr;
2067 unsigned long jif, det;
2068
2069 j->flags.ringing = 1;
2070 if (ixj_hookstate(j) & 1) {
2071 ixj_ring_off(j);
2072 j->flags.ringing = 0;
2073 return 1;
2074 }
2075 det = 0;
2076 for (cntr = 0; cntr < j->maxrings; cntr++) {
2077 jif = jiffies + (1 * hertz);
2078 ixj_ring_on(j);
2079 while (time_before(jiffies, jif)) {
2080 if (ixj_hookstate(j) & 1) {
2081 ixj_ring_off(j);
2082 j->flags.ringing = 0;
2083 return 1;
2084 }
2085 set_current_state(TASK_INTERRUPTIBLE);
2086 schedule_timeout(1);
2087 if (signal_pending(current))
2088 break;
2089 }
2090 jif = jiffies + (3 * hertz);
2091 ixj_ring_off(j);
2092 while (time_before(jiffies, jif)) {
2093 if (ixj_hookstate(j) & 1) {
2094 det = jiffies + (hertz / 100);
2095 while (time_before(jiffies, det)) {
2096 set_current_state(TASK_INTERRUPTIBLE);
2097 schedule_timeout(1);
2098 if (signal_pending(current))
2099 break;
2100 }
2101 if (ixj_hookstate(j) & 1) {
2102 j->flags.ringing = 0;
2103 return 1;
2104 }
2105 }
2106 set_current_state(TASK_INTERRUPTIBLE);
2107 schedule_timeout(1);
2108 if (signal_pending(current))
2109 break;
2110 }
2111 }
2112 ixj_ring_off(j);
2113 j->flags.ringing = 0;
2114 return 0;
2115}
2116
2117static int ixj_open(struct phone_device *p, struct file *file_p)
2118{
2119 IXJ *j = get_ixj(p->board);
2120 file_p->private_data = j;
2121
2122 if (!j->DSPbase)
2123 return -ENODEV;
2124
2125 if (file_p->f_mode & FMODE_READ) {
2126 if(!j->readers) {
2127 j->readers++;
2128 } else {
2129 return -EBUSY;
2130 }
2131 }
2132
2133 if (file_p->f_mode & FMODE_WRITE) {
2134 if(!j->writers) {
2135 j->writers++;
2136 } else {
2137 if (file_p->f_mode & FMODE_READ){
2138 j->readers--;
2139 }
2140 return -EBUSY;
2141 }
2142 }
2143
2144 if (j->cardtype == QTI_PHONECARD) {
2145 j->pslic.bits.powerdown = 0;
2146 j->psccr.bits.dev = 3;
2147 j->psccr.bits.rw = 0;
2148 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2149 ixj_PCcontrol_wait(j);
2150 }
2151
2152 j->flags.cidplay = 0;
2153 j->flags.cidcw_ack = 0;
2154
2155 if (ixjdebug & 0x0002)
2156 printk(KERN_INFO "Opening board %d\n", p->board);
2157
2158 j->framesread = j->frameswritten = 0;
2159 return 0;
2160}
2161
2162static int ixj_release(struct inode *inode, struct file *file_p)
2163{
2164 IXJ_TONE ti;
2165 int cnt;
2166 IXJ *j = file_p->private_data;
2167 int board = j->p.board;
2168
2169 /*
2170 * Set up locks to ensure that only one process is talking to the DSP at a time.
2171 * This is necessary to keep the DSP from locking up.
2172 */
2173 while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
2174 set_current_state(TASK_INTERRUPTIBLE);
2175 schedule_timeout(1);
2176 }
2177 if (ixjdebug & 0x0002)
2178 printk(KERN_INFO "Closing board %d\n", NUM(inode));
2179
2180 if (j->cardtype == QTI_PHONECARD)
2181 ixj_set_port(j, PORT_SPEAKER);
2182 else
2183 ixj_set_port(j, PORT_POTS);
2184
2185 aec_stop(j);
2186 ixj_play_stop(j);
2187 ixj_record_stop(j);
2188 set_play_volume(j, 0x100);
2189 set_rec_volume(j, 0x100);
2190 ixj_ring_off(j);
2191
2192 /* Restore the tone table to default settings. */
2193 ti.tone_index = 10;
2194 ti.gain0 = 1;
2195 ti.freq0 = hz941;
2196 ti.gain1 = 0;
2197 ti.freq1 = hz1209;
2198 ixj_init_tone(j, &ti);
2199 ti.tone_index = 11;
2200 ti.gain0 = 1;
2201 ti.freq0 = hz941;
2202 ti.gain1 = 0;
2203 ti.freq1 = hz1336;
2204 ixj_init_tone(j, &ti);
2205 ti.tone_index = 12;
2206 ti.gain0 = 1;
2207 ti.freq0 = hz941;
2208 ti.gain1 = 0;
2209 ti.freq1 = hz1477;
2210 ixj_init_tone(j, &ti);
2211 ti.tone_index = 13;
2212 ti.gain0 = 1;
2213 ti.freq0 = hz800;
2214 ti.gain1 = 0;
2215 ti.freq1 = 0;
2216 ixj_init_tone(j, &ti);
2217 ti.tone_index = 14;
2218 ti.gain0 = 1;
2219 ti.freq0 = hz1000;
2220 ti.gain1 = 0;
2221 ti.freq1 = 0;
2222 ixj_init_tone(j, &ti);
2223 ti.tone_index = 15;
2224 ti.gain0 = 1;
2225 ti.freq0 = hz1250;
2226 ti.gain1 = 0;
2227 ti.freq1 = 0;
2228 ixj_init_tone(j, &ti);
2229 ti.tone_index = 16;
2230 ti.gain0 = 1;
2231 ti.freq0 = hz950;
2232 ti.gain1 = 0;
2233 ti.freq1 = 0;
2234 ixj_init_tone(j, &ti);
2235 ti.tone_index = 17;
2236 ti.gain0 = 1;
2237 ti.freq0 = hz1100;
2238 ti.gain1 = 0;
2239 ti.freq1 = 0;
2240 ixj_init_tone(j, &ti);
2241 ti.tone_index = 18;
2242 ti.gain0 = 1;
2243 ti.freq0 = hz1400;
2244 ti.gain1 = 0;
2245 ti.freq1 = 0;
2246 ixj_init_tone(j, &ti);
2247 ti.tone_index = 19;
2248 ti.gain0 = 1;
2249 ti.freq0 = hz1500;
2250 ti.gain1 = 0;
2251 ti.freq1 = 0;
2252 ixj_init_tone(j, &ti);
2253 ti.tone_index = 20;
2254 ti.gain0 = 1;
2255 ti.freq0 = hz1600;
2256 ti.gain1 = 0;
2257 ti.freq1 = 0;
2258 ixj_init_tone(j, &ti);
2259 ti.tone_index = 21;
2260 ti.gain0 = 1;
2261 ti.freq0 = hz1800;
2262 ti.gain1 = 0;
2263 ti.freq1 = 0;
2264 ixj_init_tone(j, &ti);
2265 ti.tone_index = 22;
2266 ti.gain0 = 1;
2267 ti.freq0 = hz2100;
2268 ti.gain1 = 0;
2269 ti.freq1 = 0;
2270 ixj_init_tone(j, &ti);
2271 ti.tone_index = 23;
2272 ti.gain0 = 1;
2273 ti.freq0 = hz1300;
2274 ti.gain1 = 0;
2275 ti.freq1 = 0;
2276 ixj_init_tone(j, &ti);
2277 ti.tone_index = 24;
2278 ti.gain0 = 1;
2279 ti.freq0 = hz2450;
2280 ti.gain1 = 0;
2281 ti.freq1 = 0;
2282 ixj_init_tone(j, &ti);
2283 ti.tone_index = 25;
2284 ti.gain0 = 1;
2285 ti.freq0 = hz350;
2286 ti.gain1 = 0;
2287 ti.freq1 = hz440;
2288 ixj_init_tone(j, &ti);
2289 ti.tone_index = 26;
2290 ti.gain0 = 1;
2291 ti.freq0 = hz440;
2292 ti.gain1 = 0;
2293 ti.freq1 = hz480;
2294 ixj_init_tone(j, &ti);
2295 ti.tone_index = 27;
2296 ti.gain0 = 1;
2297 ti.freq0 = hz480;
2298 ti.gain1 = 0;
2299 ti.freq1 = hz620;
2300 ixj_init_tone(j, &ti);
2301
2302 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
2303
2304 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
2305
2306 j->ex.bits.dtmf_ready = 0;
2307 j->dtmf_state = 0;
2308 j->dtmf_wp = j->dtmf_rp = 0;
2309 j->rec_mode = j->play_mode = -1;
2310 j->flags.ringing = 0;
2311 j->maxrings = MAXRINGS;
2312 j->ring_cadence = USA_RING_CADENCE;
2313 if(j->cadence_f[5].enable) {
2314 j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
2315 }
2316 j->drybuffer = 0;
2317 j->winktime = 320;
2318 j->flags.dtmf_oob = 0;
2319 for (cnt = 0; cnt < 4; cnt++)
2320 j->cadence_f[cnt].enable = 0;
2321
2322 idle(j);
2323
2324 if(j->cardtype == QTI_PHONECARD) {
2325 SLIC_SetState(PLD_SLIC_STATE_OC, j);
2326 }
2327
2328 if (file_p->f_mode & FMODE_READ)
2329 j->readers--;
2330 if (file_p->f_mode & FMODE_WRITE)
2331 j->writers--;
2332
2333 if (j->read_buffer && !j->readers) {
2334 kfree(j->read_buffer);
2335 j->read_buffer = NULL;
2336 j->read_buffer_size = 0;
2337 }
2338 if (j->write_buffer && !j->writers) {
2339 kfree(j->write_buffer);
2340 j->write_buffer = NULL;
2341 j->write_buffer_size = 0;
2342 }
2343 j->rec_codec = j->play_codec = 0;
2344 j->rec_frame_size = j->play_frame_size = 0;
2345 j->flags.cidsent = j->flags.cidring = 0;
2346 ixj_fasync(-1, file_p, 0); /* remove from list of async notification */
2347
2348 if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
2349 ixj_set_port(j, PORT_PSTN);
2350 daa_set_mode(j, SOP_PU_SLEEP);
2351 ixj_set_pots(j, 1);
2352 }
2353 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
2354
2355 /* Set up the default signals for events */
2356 for (cnt = 0; cnt < 35; cnt++)
2357 j->ixj_signals[cnt] = SIGIO;
2358
2359 /* Set the excetion signal enable flags */
2360 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
2361 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 =
2362 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;
2363
2364 file_p->private_data = NULL;
2365 clear_bit(board, &j->busyflags);
2366 return 0;
2367}
2368
2369static int read_filters(IXJ *j)
2370{
2371 unsigned short fc, cnt, trg;
2372 int var;
2373
2374 trg = 0;
2375 if (ixj_WriteDSPCommand(0x5144, j)) {
2376 if(ixjdebug & 0x0001) {
2377 printk(KERN_INFO "Read Frame Counter failed!\n");
2378 }
2379 return -1;
2380 }
2381 fc = j->ssr.high << 8 | j->ssr.low;
2382 if (fc == j->frame_count)
2383 return 1;
2384
2385 j->frame_count = fc;
2386
2387 if (j->dtmf_proc)
2388 return 1;
2389
2390 var = 10;
2391
2392 for (cnt = 0; cnt < 4; cnt++) {
2393 if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
2394 if(ixjdebug & 0x0001) {
2395 printk(KERN_INFO "Select Filter %d failed!\n", cnt);
2396 }
2397 return -1;
2398 }
2399 if (ixj_WriteDSPCommand(0x515C, j)) {
2400 if(ixjdebug & 0x0001) {
2401 printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
2402 }
2403 return -1;
2404 }
2405 j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
2406
2407 if (j->cadence_f[cnt].enable) {
2408 if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
2409 if (j->cadence_f[cnt].state == 0) {
2410 j->cadence_f[cnt].state = 1;
2411 j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
2412 j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
2413 j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
2414 } else if (j->cadence_f[cnt].state == 2 &&
2415 (time_after(jiffies, j->cadence_f[cnt].off1min) &&
2416 time_before(jiffies, j->cadence_f[cnt].off1max))) {
2417 if (j->cadence_f[cnt].on2) {
2418 j->cadence_f[cnt].state = 3;
2419 j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
2420 j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
2421 j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
2422 } else {
2423 j->cadence_f[cnt].state = 7;
2424 }
2425 } else if (j->cadence_f[cnt].state == 4 &&
2426 (time_after(jiffies, j->cadence_f[cnt].off2min) &&
2427 time_before(jiffies, j->cadence_f[cnt].off2max))) {
2428 if (j->cadence_f[cnt].on3) {
2429 j->cadence_f[cnt].state = 5;
2430 j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
2431 j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
2432 j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
2433 } else {
2434 j->cadence_f[cnt].state = 7;
2435 }
2436 } else {
2437 j->cadence_f[cnt].state = 0;
2438 }
2439 } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
2440 if (j->cadence_f[cnt].state == 1) {
2441 if(!j->cadence_f[cnt].on1) {
2442 j->cadence_f[cnt].state = 7;
2443 } else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
2444 time_before(jiffies, j->cadence_f[cnt].on1max))) {
2445 if(j->cadence_f[cnt].off1) {
2446 j->cadence_f[cnt].state = 2;
2447 j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
2448 j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
2449 j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
2450 } else {
2451 j->cadence_f[cnt].state = 7;
2452 }
2453 } else {
2454 j->cadence_f[cnt].state = 0;
2455 }
2456 } else if (j->cadence_f[cnt].state == 3) {
2457 if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
2458 time_before(jiffies, j->cadence_f[cnt].on2max))) {
2459 if(j->cadence_f[cnt].off2) {
2460 j->cadence_f[cnt].state = 4;
2461 j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
2462 j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
2463 j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
2464 } else {
2465 j->cadence_f[cnt].state = 7;
2466 }
2467 } else {
2468 j->cadence_f[cnt].state = 0;
2469 }
2470 } else if (j->cadence_f[cnt].state == 5) {
2471 if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
2472 time_before(jiffies, j->cadence_f[cnt].on3max))) {
2473 if(j->cadence_f[cnt].off3) {
2474 j->cadence_f[cnt].state = 6;
2475 j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
2476 j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
2477 j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
2478 } else {
2479 j->cadence_f[cnt].state = 7;
2480 }
2481 } else {
2482 j->cadence_f[cnt].state = 0;
2483 }
2484 } else {
2485 j->cadence_f[cnt].state = 0;
2486 }
2487 } else {
2488 switch(j->cadence_f[cnt].state) {
2489 case 1:
2490 if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
2491 !j->cadence_f[cnt].off1 &&
2492 !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
2493 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2494 j->cadence_f[cnt].state = 7;
2495 }
2496 break;
2497 case 3:
2498 if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
2499 !j->cadence_f[cnt].off2 &&
2500 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2501 j->cadence_f[cnt].state = 7;
2502 }
2503 break;
2504 case 5:
2505 if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
2506 !j->cadence_f[cnt].off3) {
2507 j->cadence_f[cnt].state = 7;
2508 }
2509 break;
2510 }
2511 }
2512
2513 if (ixjdebug & 0x0040) {
2514 printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
2515 switch(j->cadence_f[cnt].state) {
2516 case 0:
2517 printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
2518 break;
2519 case 1:
2520 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
2521 j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
2522 break;
2523 case 2:
2524 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
2525 j->cadence_f[cnt].off1max);
2526 break;
2527 case 3:
2528 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
2529 j->cadence_f[cnt].on2max);
2530 break;
2531 case 4:
2532 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
2533 j->cadence_f[cnt].off2max);
2534 break;
2535 case 5:
2536 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
2537 j->cadence_f[cnt].on3max);
2538 break;
2539 case 6:
2540 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
2541 j->cadence_f[cnt].off3max);
2542 break;
2543 }
2544 }
2545 }
2546 if (j->cadence_f[cnt].state == 7) {
2547 j->cadence_f[cnt].state = 0;
2548 if (j->cadence_f[cnt].enable == 1)
2549 j->cadence_f[cnt].enable = 0;
2550 switch (cnt) {
2551 case 0:
2552 if(ixjdebug & 0x0020) {
2553 printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
2554 }
2555 j->ex.bits.fc0 = 1;
2556 ixj_kill_fasync(j, SIG_FC0, POLL_IN);
2557 break;
2558 case 1:
2559 if(ixjdebug & 0x0020) {
2560 printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
2561 }
2562 j->ex.bits.fc1 = 1;
2563 ixj_kill_fasync(j, SIG_FC1, POLL_IN);
2564 break;
2565 case 2:
2566 if(ixjdebug & 0x0020) {
2567 printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
2568 }
2569 j->ex.bits.fc2 = 1;
2570 ixj_kill_fasync(j, SIG_FC2, POLL_IN);
2571 break;
2572 case 3:
2573 if(ixjdebug & 0x0020) {
2574 printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
2575 }
2576 j->ex.bits.fc3 = 1;
2577 ixj_kill_fasync(j, SIG_FC3, POLL_IN);
2578 break;
2579 }
2580 }
2581 if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
2582 (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
2583 if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
2584 trg = 1;
2585 } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
2586 trg = 0;
2587 }
2588 switch (cnt) {
2589 case 0:
2590 if(ixjdebug & 0x0020) {
2591 printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
2592 }
2593 j->ex.bits.f0 = 1;
2594 ixj_kill_fasync(j, SIG_F0, POLL_IN);
2595 break;
2596 case 1:
2597 if(ixjdebug & 0x0020) {
2598 printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
2599 }
2600 j->ex.bits.f1 = 1;
2601 ixj_kill_fasync(j, SIG_F1, POLL_IN);
2602 break;
2603 case 2:
2604 if(ixjdebug & 0x0020) {
2605 printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
2606 }
2607 j->ex.bits.f2 = 1;
2608 ixj_kill_fasync(j, SIG_F2, POLL_IN);
2609 break;
2610 case 3:
2611 if(ixjdebug & 0x0020) {
2612 printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
2613 }
2614 j->ex.bits.f3 = 1;
2615 ixj_kill_fasync(j, SIG_F3, POLL_IN);
2616 break;
2617 }
2618 }
2619 }
2620 return 0;
2621}
2622
2623static int LineMonitor(IXJ *j)
2624{
2625 if (j->dtmf_proc) {
2626 return -1;
2627 }
2628 j->dtmf_proc = 1;
2629
2630 if (ixj_WriteDSPCommand(0x7000, j)) /* Line Monitor */
2631 return -1;
2632
2633 j->dtmf.bytes.high = j->ssr.high;
2634 j->dtmf.bytes.low = j->ssr.low;
2635 if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
2636 j->dtmf_state = 1;
2637 j->dtmf_current = j->dtmf.bits.digit;
2638 }
2639 if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) /* && j->dtmf_wp != j->dtmf_rp) */
2640 {
2641 if(!j->cidcw_wait) {
2642 j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
2643 j->dtmf_wp++;
2644 if (j->dtmf_wp == 79)
2645 j->dtmf_wp = 0;
2646 j->ex.bits.dtmf_ready = 1;
2647 if(j->ex_sig.bits.dtmf_ready) {
2648 ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
2649 }
2650 }
2651 else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
2652 if(ixjdebug & 0x0020) {
2653 printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
2654 }
2655 j->flags.cidcw_ack = 1;
2656 }
2657 j->dtmf_state = 0;
2658 }
2659 j->dtmf_proc = 0;
2660
2661 return 0;
2662}
2663
2664/************************************************************************
2665*
2666* Functions to allow alaw <-> ulaw conversions.
2667*
2668************************************************************************/
2669
2670static void ulaw2alaw(unsigned char *buff, unsigned long len)
2671{
2672 static unsigned char table_ulaw2alaw[] =
2673 {
2674 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
2675 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
2676 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
2677 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
2678 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
2679 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
2680 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
2681 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
2682 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
2683 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
2684 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
2685 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
2686 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
2687 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
2688 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
2689 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
2690 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
2691 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
2692 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
2693 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
2694 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
2695 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
2696 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
2697 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
2698 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
2699 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
2700 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
2701 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
2702 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
2703 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
2704 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
2705 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2706 };
2707
2708 while (len--)
2709 {
2710 *buff = table_ulaw2alaw[*(unsigned char *)buff];
2711 buff++;
2712 }
2713}
2714
2715static void alaw2ulaw(unsigned char *buff, unsigned long len)
2716{
2717 static unsigned char table_alaw2ulaw[] =
2718 {
2719 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
2720 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
2721 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
2722 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
2723 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
2724 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
2725 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
2726 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
2727 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
2728 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
2729 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
2730 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
2731 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
2732 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
2733 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
2734 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
2735 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
2736 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
2737 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
2738 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
2739 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
2740 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
2741 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
2742 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
2743 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
2744 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
2745 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
2746 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
2747 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
2748 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
2749 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
2750 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2751 };
2752
2753 while (len--)
2754 {
2755 *buff = table_alaw2ulaw[*(unsigned char *)buff];
2756 buff++;
2757 }
2758}
2759
2760static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos)
2761{
2762 unsigned long i = *ppos;
2763 IXJ * j = get_ixj(NUM(file_p->f_dentry->d_inode));
2764
2765 DECLARE_WAITQUEUE(wait, current);
2766
2767 if (j->flags.inread)
2768 return -EALREADY;
2769
2770 j->flags.inread = 1;
2771
2772 add_wait_queue(&j->read_q, &wait);
2773 set_current_state(TASK_INTERRUPTIBLE);
2774 mb();
2775
2776 while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
2777 ++j->read_wait;
2778 if (file_p->f_flags & O_NONBLOCK) {
2779 set_current_state(TASK_RUNNING);
2780 remove_wait_queue(&j->read_q, &wait);
2781 j->flags.inread = 0;
2782 return -EAGAIN;
2783 }
2784 if (!ixj_hookstate(j)) {
2785 set_current_state(TASK_RUNNING);
2786 remove_wait_queue(&j->read_q, &wait);
2787 j->flags.inread = 0;
2788 return 0;
2789 }
2790 interruptible_sleep_on(&j->read_q);
2791 if (signal_pending(current)) {
2792 set_current_state(TASK_RUNNING);
2793 remove_wait_queue(&j->read_q, &wait);
2794 j->flags.inread = 0;
2795 return -EINTR;
2796 }
2797 }
2798
2799 remove_wait_queue(&j->read_q, &wait);
2800 set_current_state(TASK_RUNNING);
2801 /* Don't ever copy more than the user asks */
2802 if(j->rec_codec == ALAW)
2803 ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
2804 i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
2805 j->read_buffer_ready = 0;
2806 if (i) {
2807 j->flags.inread = 0;
2808 return -EFAULT;
2809 } else {
2810 j->flags.inread = 0;
2811 return min(length, j->read_buffer_size);
2812 }
2813}
2814
2815static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length,
2816 loff_t * ppos)
2817{
2818 int pre_retval;
2819 ssize_t read_retval = 0;
2820 IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
2821
2822 pre_retval = ixj_PreRead(j, 0L);
2823 switch (pre_retval) {
2824 case NORMAL:
2825 read_retval = ixj_read(file_p, buf, length, ppos);
2826 ixj_PostRead(j, 0L);
2827 break;
2828 case NOPOST:
2829 read_retval = ixj_read(file_p, buf, length, ppos);
2830 break;
2831 case POSTONLY:
2832 ixj_PostRead(j, 0L);
2833 break;
2834 default:
2835 read_retval = pre_retval;
2836 }
2837 return read_retval;
2838}
2839
2840static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos)
2841{
2842 unsigned long i = *ppos;
2843 IXJ *j = file_p->private_data;
2844
2845 DECLARE_WAITQUEUE(wait, current);
2846
2847 if (j->flags.inwrite)
2848 return -EALREADY;
2849
2850 j->flags.inwrite = 1;
2851
2852 add_wait_queue(&j->write_q, &wait);
2853 set_current_state(TASK_INTERRUPTIBLE);
2854 mb();
2855
2856
2857 while (!j->write_buffers_empty) {
2858 ++j->write_wait;
2859 if (file_p->f_flags & O_NONBLOCK) {
2860 set_current_state(TASK_RUNNING);
2861 remove_wait_queue(&j->write_q, &wait);
2862 j->flags.inwrite = 0;
2863 return -EAGAIN;
2864 }
2865 if (!ixj_hookstate(j)) {
2866 set_current_state(TASK_RUNNING);
2867 remove_wait_queue(&j->write_q, &wait);
2868 j->flags.inwrite = 0;
2869 return 0;
2870 }
2871 interruptible_sleep_on(&j->write_q);
2872 if (signal_pending(current)) {
2873 set_current_state(TASK_RUNNING);
2874 remove_wait_queue(&j->write_q, &wait);
2875 j->flags.inwrite = 0;
2876 return -EINTR;
2877 }
2878 }
2879 set_current_state(TASK_RUNNING);
2880 remove_wait_queue(&j->write_q, &wait);
2881 if (j->write_buffer_wp + count >= j->write_buffer_end)
2882 j->write_buffer_wp = j->write_buffer;
2883 i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
2884 if (i) {
2885 j->flags.inwrite = 0;
2886 return -EFAULT;
2887 }
2888 if(j->play_codec == ALAW)
2889 alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
2890 j->flags.inwrite = 0;
2891 return min(count, j->write_buffer_size);
2892}
2893
2894static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos)
2895{
2896 int pre_retval;
2897 ssize_t write_retval = 0;
2898
2899 IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
2900
2901 pre_retval = ixj_PreWrite(j, 0L);
2902 switch (pre_retval) {
2903 case NORMAL:
2904 write_retval = ixj_write(file_p, buf, count, ppos);
2905 if (write_retval > 0) {
2906 ixj_PostWrite(j, 0L);
2907 j->write_buffer_wp += write_retval;
2908 j->write_buffers_empty--;
2909 }
2910 break;
2911 case NOPOST:
2912 write_retval = ixj_write(file_p, buf, count, ppos);
2913 if (write_retval > 0) {
2914 j->write_buffer_wp += write_retval;
2915 j->write_buffers_empty--;
2916 }
2917 break;
2918 case POSTONLY:
2919 ixj_PostWrite(j, 0L);
2920 break;
2921 default:
2922 write_retval = pre_retval;
2923 }
2924 return write_retval;
2925}
2926
2927static void ixj_read_frame(IXJ *j)
2928{
2929 int cnt, dly;
2930
2931 if (j->read_buffer) {
2932 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2933 if (!(cnt % 16) && !IsRxReady(j)) {
2934 dly = 0;
2935 while (!IsRxReady(j)) {
2936 if (dly++ > 5) {
2937 dly = 0;
2938 break;
2939 }
2940 udelay(10);
2941 }
2942 }
2943 /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
2944 if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
2945 inb_p(j->DSPbase + 0x0E);
2946 inb_p(j->DSPbase + 0x0F);
2947 }
2948 *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
2949 *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
2950 }
2951 ++j->framesread;
2952 if (j->intercom != -1) {
2953 if (IsTxReady(get_ixj(j->intercom))) {
2954 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2955 if (!(cnt % 16) && !IsTxReady(j)) {
2956 dly = 0;
2957 while (!IsTxReady(j)) {
2958 if (dly++ > 5) {
2959 dly = 0;
2960 break;
2961 }
2962 udelay(10);
2963 }
2964 }
2965 outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
2966 outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
2967 }
2968 get_ixj(j->intercom)->frameswritten++;
2969 }
2970 } else {
2971 j->read_buffer_ready = 1;
2972 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
2973
2974 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
2975
2976 if(j->ixj_signals[SIG_READ_READY])
2977 ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
2978 }
2979 }
2980}
2981
2982static short fsk[][6][20] =
2983{
2984 {
2985 {
2986 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
2987 -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
2988 },
2989 {
2990 -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
2991 -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
2992 },
2993 {
2994 -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
2995 -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
2996 },
2997 {
2998 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
2999 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
3000 },
3001 {
3002 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
3003 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
3004 },
3005 {
3006 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
3007 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
3008 }
3009 },
3010 {
3011 {
3012 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
3013 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
3014 },
3015 {
3016 -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3017 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3018 },
3019 {
3020 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3021 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3022 },
3023 {
3024 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3025 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3026 },
3027 {
3028 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3029 -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3030 },
3031 {
3032 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3033 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3034 }
3035 }
3036};
3037
3038
3039static void ixj_write_cid_bit(IXJ *j, int bit)
3040{
3041 while (j->fskcnt < 20) {
3042 if(j->fskdcnt < (j->fsksize - 1))
3043 j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
3044
3045 j->fskcnt += 3;
3046 }
3047 j->fskcnt %= 20;
3048
3049 if (!bit)
3050 j->fskz++;
3051 if (j->fskz >= 6)
3052 j->fskz = 0;
3053
3054}
3055
3056static void ixj_write_cid_byte(IXJ *j, char byte)
3057{
3058 IXJ_CBYTE cb;
3059
3060 cb.cbyte = byte;
3061 ixj_write_cid_bit(j, 0);
3062 ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
3063 ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
3064 ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
3065 ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
3066 ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
3067 ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
3068 ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
3069 ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
3070 ixj_write_cid_bit(j, 1);
3071}
3072
3073static void ixj_write_cid_seize(IXJ *j)
3074{
3075 int cnt;
3076
3077 for (cnt = 0; cnt < 150; cnt++) {
3078 ixj_write_cid_bit(j, 0);
3079 ixj_write_cid_bit(j, 1);
3080 }
3081 for (cnt = 0; cnt < 180; cnt++) {
3082 ixj_write_cid_bit(j, 1);
3083 }
3084}
3085
3086static void ixj_write_cidcw_seize(IXJ *j)
3087{
3088 int cnt;
3089
3090 for (cnt = 0; cnt < 80; cnt++) {
3091 ixj_write_cid_bit(j, 1);
3092 }
3093}
3094
3095static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
3096{
3097 int cnt;
3098
3099 for (cnt = 0; cnt < strlen(s); cnt++) {
3100 ixj_write_cid_byte(j, s[cnt]);
3101 checksum = (checksum + s[cnt]);
3102 }
3103 return checksum;
3104}
3105
3106static void ixj_pad_fsk(IXJ *j, int pad)
3107{
3108 int cnt;
3109
3110 for (cnt = 0; cnt < pad; cnt++) {
3111 if(j->fskdcnt < (j->fsksize - 1))
3112 j->fskdata[j->fskdcnt++] = 0x0000;
3113 }
3114 for (cnt = 0; cnt < 720; cnt++) {
3115 if(j->fskdcnt < (j->fsksize - 1))
3116 j->fskdata[j->fskdcnt++] = 0x0000;
3117 }
3118}
3119
3120static void ixj_pre_cid(IXJ *j)
3121{
3122 j->cid_play_codec = j->play_codec;
3123 j->cid_play_frame_size = j->play_frame_size;
3124 j->cid_play_volume = get_play_volume(j);
3125 j->cid_play_flag = j->flags.playing;
3126
3127 j->cid_rec_codec = j->rec_codec;
3128 j->cid_rec_volume = get_rec_volume(j);
3129 j->cid_rec_flag = j->flags.recording;
3130
3131 j->cid_play_aec_level = j->aec_level;
3132
3133 switch(j->baseframe.low) {
3134 case 0xA0:
3135 j->cid_base_frame_size = 20;
3136 break;
3137 case 0x50:
3138 j->cid_base_frame_size = 10;
3139 break;
3140 case 0xF0:
3141 j->cid_base_frame_size = 30;
3142 break;
3143 }
3144
3145 ixj_play_stop(j);
3146 ixj_cpt_stop(j);
3147
3148 j->flags.cidplay = 1;
3149
3150 set_base_frame(j, 30);
3151 set_play_codec(j, LINEAR16);
3152 set_play_volume(j, 0x1B);
3153 ixj_play_start(j);
3154}
3155
3156static void ixj_post_cid(IXJ *j)
3157{
3158 ixj_play_stop(j);
3159
3160 if(j->cidsize > 5000) {
3161 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
3162 }
3163 j->flags.cidplay = 0;
3164 if(ixjdebug & 0x0200) {
3165 printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
3166 }
3167
3168 ixj_fsk_free(j);
3169
3170 j->fskdcnt = 0;
3171 set_base_frame(j, j->cid_base_frame_size);
3172 set_play_codec(j, j->cid_play_codec);
3173 ixj_aec_start(j, j->cid_play_aec_level);
3174 set_play_volume(j, j->cid_play_volume);
3175
3176 set_rec_codec(j, j->cid_rec_codec);
3177 set_rec_volume(j, j->cid_rec_volume);
3178
3179 if(j->cid_rec_flag)
3180 ixj_record_start(j);
3181
3182 if(j->cid_play_flag)
3183 ixj_play_start(j);
3184
3185 if(j->cid_play_flag) {
3186 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3187 }
3188}
3189
3190static void ixj_write_cid(IXJ *j)
3191{
3192 char sdmf1[50];
3193 char sdmf2[50];
3194 char sdmf3[80];
3195 char mdmflen, len1, len2, len3;
3196 int pad;
3197
3198 int checksum = 0;
3199
3200 if (j->dsp.low == 0x20 || j->flags.cidplay)
3201 return;
3202
3203 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3204 j->cidsize = j->cidcnt = 0;
3205
3206 ixj_fsk_alloc(j);
3207
3208 strcpy(sdmf1, j->cid_send.month);
3209 strcat(sdmf1, j->cid_send.day);
3210 strcat(sdmf1, j->cid_send.hour);
3211 strcat(sdmf1, j->cid_send.min);
3212 strcpy(sdmf2, j->cid_send.number);
3213 strcpy(sdmf3, j->cid_send.name);
3214
3215 len1 = strlen(sdmf1);
3216 len2 = strlen(sdmf2);
3217 len3 = strlen(sdmf3);
3218 mdmflen = len1 + len2 + len3 + 6;
3219
3220 while(1){
3221 ixj_write_cid_seize(j);
3222
3223 ixj_write_cid_byte(j, 0x80);
3224 checksum = 0x80;
3225 ixj_write_cid_byte(j, mdmflen);
3226 checksum = checksum + mdmflen;
3227
3228 ixj_write_cid_byte(j, 0x01);
3229 checksum = checksum + 0x01;
3230 ixj_write_cid_byte(j, len1);
3231 checksum = checksum + len1;
3232 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3233 if(ixj_hookstate(j) & 1)
3234 break;
3235
3236 ixj_write_cid_byte(j, 0x02);
3237 checksum = checksum + 0x02;
3238 ixj_write_cid_byte(j, len2);
3239 checksum = checksum + len2;
3240 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3241 if(ixj_hookstate(j) & 1)
3242 break;
3243
3244 ixj_write_cid_byte(j, 0x07);
3245 checksum = checksum + 0x07;
3246 ixj_write_cid_byte(j, len3);
3247 checksum = checksum + len3;
3248 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3249 if(ixj_hookstate(j) & 1)
3250 break;
3251
3252 checksum %= 256;
3253 checksum ^= 0xFF;
3254 checksum += 1;
3255
3256 ixj_write_cid_byte(j, (char) checksum);
3257
3258 pad = j->fskdcnt % 240;
3259 if (pad) {
3260 pad = 240 - pad;
3261 }
3262 ixj_pad_fsk(j, pad);
3263 break;
3264 }
3265
3266 ixj_write_frame(j);
3267}
3268
3269static void ixj_write_cidcw(IXJ *j)
3270{
3271 IXJ_TONE ti;
3272
3273 char sdmf1[50];
3274 char sdmf2[50];
3275 char sdmf3[80];
3276 char mdmflen, len1, len2, len3;
3277 int pad;
3278
3279 int checksum = 0;
3280
3281 if (j->dsp.low == 0x20 || j->flags.cidplay)
3282 return;
3283
3284 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3285 j->cidsize = j->cidcnt = 0;
3286
3287 ixj_fsk_alloc(j);
3288
3289 j->flags.cidcw_ack = 0;
3290
3291 ti.tone_index = 23;
3292 ti.gain0 = 1;
3293 ti.freq0 = hz440;
3294 ti.gain1 = 0;
3295 ti.freq1 = 0;
3296 ixj_init_tone(j, &ti);
3297
3298 ixj_set_tone_on(1500, j);
3299 ixj_set_tone_off(32, j);
3300 if(ixjdebug & 0x0200) {
3301 printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
3302 }
3303 ixj_play_tone(j, 23);
3304
3305 clear_bit(j->board, &j->busyflags);
3306 while(j->tone_state) {
3307 set_current_state(TASK_INTERRUPTIBLE);
3308 schedule_timeout(1);
3309 }
3310 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3311 set_current_state(TASK_INTERRUPTIBLE);
3312 schedule_timeout(1);
3313 }
3314 if(ixjdebug & 0x0200) {
3315 printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
3316 }
3317
3318 ti.tone_index = 24;
3319 ti.gain0 = 1;
3320 ti.freq0 = hz2130;
3321 ti.gain1 = 0;
3322 ti.freq1 = hz2750;
3323 ixj_init_tone(j, &ti);
3324
3325 ixj_set_tone_off(10, j);
3326 ixj_set_tone_on(600, j);
3327 if(ixjdebug & 0x0200) {
3328 printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
3329 }
3330 ixj_play_tone(j, 24);
3331
3332 clear_bit(j->board, &j->busyflags);
3333 while(j->tone_state) {
3334 set_current_state(TASK_INTERRUPTIBLE);
3335 schedule_timeout(1);
3336 }
3337 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3338 set_current_state(TASK_INTERRUPTIBLE);
3339 schedule_timeout(1);
3340 }
3341 if(ixjdebug & 0x0200) {
3342 printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
3343 }
3344
3345 j->cidcw_wait = jiffies + ((50 * hertz) / 100);
3346
3347 clear_bit(j->board, &j->busyflags);
3348 while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) {
3349 set_current_state(TASK_INTERRUPTIBLE);
3350 schedule_timeout(1);
3351 }
3352 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3353 set_current_state(TASK_INTERRUPTIBLE);
3354 schedule_timeout(1);
3355 }
3356 j->cidcw_wait = 0;
3357 if(!j->flags.cidcw_ack) {
3358 if(ixjdebug & 0x0200) {
3359 printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
3360 }
3361 ixj_post_cid(j);
3362 if(j->cid_play_flag) {
3363 wake_up_interruptible(&j->write_q); /* Wake any blocked readers */
3364 }
3365 return;
3366 } else {
3367 ixj_pre_cid(j);
3368 }
3369 j->flags.cidcw_ack = 0;
3370 strcpy(sdmf1, j->cid_send.month);
3371 strcat(sdmf1, j->cid_send.day);
3372 strcat(sdmf1, j->cid_send.hour);
3373 strcat(sdmf1, j->cid_send.min);
3374 strcpy(sdmf2, j->cid_send.number);
3375 strcpy(sdmf3, j->cid_send.name);
3376
3377 len1 = strlen(sdmf1);
3378 len2 = strlen(sdmf2);
3379 len3 = strlen(sdmf3);
3380 mdmflen = len1 + len2 + len3 + 6;
3381
3382 ixj_write_cidcw_seize(j);
3383
3384 ixj_write_cid_byte(j, 0x80);
3385 checksum = 0x80;
3386 ixj_write_cid_byte(j, mdmflen);
3387 checksum = checksum + mdmflen;
3388
3389 ixj_write_cid_byte(j, 0x01);
3390 checksum = checksum + 0x01;
3391 ixj_write_cid_byte(j, len1);
3392 checksum = checksum + len1;
3393 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3394
3395 ixj_write_cid_byte(j, 0x02);
3396 checksum = checksum + 0x02;
3397 ixj_write_cid_byte(j, len2);
3398 checksum = checksum + len2;
3399 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3400
3401 ixj_write_cid_byte(j, 0x07);
3402 checksum = checksum + 0x07;
3403 ixj_write_cid_byte(j, len3);
3404 checksum = checksum + len3;
3405 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3406
3407 checksum %= 256;
3408 checksum ^= 0xFF;
3409 checksum += 1;
3410
3411 ixj_write_cid_byte(j, (char) checksum);
3412
3413 pad = j->fskdcnt % 240;
3414 if (pad) {
3415 pad = 240 - pad;
3416 }
3417 ixj_pad_fsk(j, pad);
3418 if(ixjdebug & 0x0200) {
3419 printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
3420 }
3421}
3422
3423static void ixj_write_vmwi(IXJ *j, int msg)
3424{
3425 char mdmflen;
3426 int pad;
3427
3428 int checksum = 0;
3429
3430 if (j->dsp.low == 0x20 || j->flags.cidplay)
3431 return;
3432
3433 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3434 j->cidsize = j->cidcnt = 0;
3435
3436 ixj_fsk_alloc(j);
3437
3438 mdmflen = 3;
3439
3440 if (j->port == PORT_POTS)
3441 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
3442
3443 ixj_write_cid_seize(j);
3444
3445 ixj_write_cid_byte(j, 0x82);
3446 checksum = 0x82;
3447 ixj_write_cid_byte(j, mdmflen);
3448 checksum = checksum + mdmflen;
3449
3450 ixj_write_cid_byte(j, 0x0B);
3451 checksum = checksum + 0x0B;
3452 ixj_write_cid_byte(j, 1);
3453 checksum = checksum + 1;
3454
3455 if(msg) {
3456 ixj_write_cid_byte(j, 0xFF);
3457 checksum = checksum + 0xFF;
3458 }
3459 else {
3460 ixj_write_cid_byte(j, 0x00);
3461 checksum = checksum + 0x00;
3462 }
3463
3464 checksum %= 256;
3465 checksum ^= 0xFF;
3466 checksum += 1;
3467
3468 ixj_write_cid_byte(j, (char) checksum);
3469
3470 pad = j->fskdcnt % 240;
3471 if (pad) {
3472 pad = 240 - pad;
3473 }
3474 ixj_pad_fsk(j, pad);
3475}
3476
3477static void ixj_write_frame(IXJ *j)
3478{
3479 int cnt, frame_count, dly;
3480 IXJ_WORD dat;
3481 BYTES blankword;
3482
3483 frame_count = 0;
3484 if(j->flags.cidplay) {
3485 for(cnt = 0; cnt < 480; cnt++) {
3486 if (!(cnt % 16) && !IsTxReady(j)) {
3487 dly = 0;
3488 while (!IsTxReady(j)) {
3489 if (dly++ > 5) {
3490 dly = 0;
3491 break;
3492 }
3493 udelay(10);
3494 }
3495 }
3496 dat.word = j->fskdata[j->cidcnt++];
3497 outb_p(dat.bytes.low, j->DSPbase + 0x0C);
3498 outb_p(dat.bytes.high, j->DSPbase + 0x0D);
3499 cnt++;
3500 }
3501 if(j->cidcnt >= j->fskdcnt) {
3502 ixj_post_cid(j);
3503 }
3504 /* This may seem rude, but if we just played one frame of FSK data for CallerID
3505 and there is real audio data in the buffer, we need to throw it away because
3506 we just used it's time slot */
3507 if (j->write_buffer_rp > j->write_buffer_wp) {
3508 j->write_buffer_rp += j->cid_play_frame_size * 2;
3509 if (j->write_buffer_rp >= j->write_buffer_end) {
3510 j->write_buffer_rp = j->write_buffer;
3511 }
3512 j->write_buffers_empty++;
3513 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3514
3515 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3516 }
3517 } else if (j->write_buffer && j->write_buffers_empty < 1) {
3518 if (j->write_buffer_wp > j->write_buffer_rp) {
3519 frame_count =
3520 (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
3521 }
3522 if (j->write_buffer_rp > j->write_buffer_wp) {
3523 frame_count =
3524 (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
3525 (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
3526 }
3527 if (frame_count >= 1) {
3528 if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
3529 switch (j->play_mode) {
3530 case PLAYBACK_MODE_ULAW:
3531 case PLAYBACK_MODE_ALAW:
3532 blankword.low = blankword.high = 0xFF;
3533 break;
3534 case PLAYBACK_MODE_8LINEAR:
3535 case PLAYBACK_MODE_16LINEAR:
3536 blankword.low = blankword.high = 0x00;
3537 break;
3538 case PLAYBACK_MODE_8LINEAR_WSS:
3539 blankword.low = blankword.high = 0x80;
3540 break;
3541 }
3542 for (cnt = 0; cnt < 16; cnt++) {
3543 if (!(cnt % 16) && !IsTxReady(j)) {
3544 dly = 0;
3545 while (!IsTxReady(j)) {
3546 if (dly++ > 5) {
3547 dly = 0;
3548 break;
3549 }
3550 udelay(10);
3551 }
3552 }
3553 outb_p((blankword.low), j->DSPbase + 0x0C);
3554 outb_p((blankword.high), j->DSPbase + 0x0D);
3555 }
3556 j->flags.play_first_frame = 0;
3557 } else if (j->play_codec == G723_63 && j->flags.play_first_frame) {
3558 for (cnt = 0; cnt < 24; cnt++) {
3559 if(cnt == 12) {
3560 blankword.low = 0x02;
3561 blankword.high = 0x00;
3562 }
3563 else {
3564 blankword.low = blankword.high = 0x00;
3565 }
3566 if (!(cnt % 16) && !IsTxReady(j)) {
3567 dly = 0;
3568 while (!IsTxReady(j)) {
3569 if (dly++ > 5) {
3570 dly = 0;
3571 break;
3572 }
3573 udelay(10);
3574 }
3575 }
3576 outb_p((blankword.low), j->DSPbase + 0x0C);
3577 outb_p((blankword.high), j->DSPbase + 0x0D);
3578 }
3579 j->flags.play_first_frame = 0;
3580 }
3581 for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
3582 if (!(cnt % 16) && !IsTxReady(j)) {
3583 dly = 0;
3584 while (!IsTxReady(j)) {
3585 if (dly++ > 5) {
3586 dly = 0;
3587 break;
3588 }
3589 udelay(10);
3590 }
3591 }
3592 /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */
3593 if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
3594 if(j->write_buffer_rp + cnt == 0 && j->write_buffer_rp + cnt + 1 == 0 && j->write_buffer_rp + cnt + 2 == 0 &&
3595 j->write_buffer_rp + cnt + 3 == 0 && j->write_buffer_rp + cnt + 4 == 0 && j->write_buffer_rp + cnt + 5 == 0 &&
3596 j->write_buffer_rp + cnt + 6 == 0 && j->write_buffer_rp + cnt + 7 == 0 && j->write_buffer_rp + cnt + 8 == 0 &&
3597 j->write_buffer_rp + cnt + 9 == 0) {
3598 /* someone is trying to write silence lets make this a type 0 frame. */
3599 outb_p(0x00, j->DSPbase + 0x0C);
3600 outb_p(0x00, j->DSPbase + 0x0D);
3601 } else {
3602 /* so all other frames are type 1. */
3603 outb_p(0x01, j->DSPbase + 0x0C);
3604 outb_p(0x00, j->DSPbase + 0x0D);
3605 }
3606 }
3607 outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
3608 outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
3609 *(j->write_buffer_rp + cnt) = 0;
3610 *(j->write_buffer_rp + cnt + 1) = 0;
3611 }
3612 j->write_buffer_rp += j->play_frame_size * 2;
3613 if (j->write_buffer_rp >= j->write_buffer_end) {
3614 j->write_buffer_rp = j->write_buffer;
3615 }
3616 j->write_buffers_empty++;
3617 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3618
3619 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3620
3621 ++j->frameswritten;
3622 }
3623 } else {
3624 j->drybuffer++;
3625 }
3626 if(j->ixj_signals[SIG_WRITE_READY]) {
3627 ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
3628 }
3629}
3630
3631static int idle(IXJ *j)
3632{
3633 if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */
3634
3635 return 0;
3636
3637 if (j->ssr.high || j->ssr.low) {
3638 return 0;
3639 } else {
3640 j->play_mode = -1;
3641 j->flags.playing = 0;
3642 j->rec_mode = -1;
3643 j->flags.recording = 0;
3644 return 1;
3645 }
3646}
3647
3648static int set_base_frame(IXJ *j, int size)
3649{
3650 unsigned short cmd;
3651 int cnt;
3652
3653 idle(j);
3654 j->cid_play_aec_level = j->aec_level;
3655 aec_stop(j);
3656 for (cnt = 0; cnt < 10; cnt++) {
3657 if (idle(j))
3658 break;
3659 }
3660 if (j->ssr.high || j->ssr.low)
3661 return -1;
3662 if (j->dsp.low != 0x20) {
3663 switch (size) {
3664 case 30:
3665 cmd = 0x07F0;
3666 /* Set Base Frame Size to 240 pg9-10 8021 */
3667 break;
3668 case 20:
3669 cmd = 0x07A0;
3670 /* Set Base Frame Size to 160 pg9-10 8021 */
3671 break;
3672 case 10:
3673 cmd = 0x0750;
3674 /* Set Base Frame Size to 80 pg9-10 8021 */
3675 break;
3676 default:
3677 return -1;
3678 }
3679 } else {
3680 if (size == 30)
3681 return size;
3682 else
3683 return -1;
3684 }
3685 if (ixj_WriteDSPCommand(cmd, j)) {
3686 j->baseframe.high = j->baseframe.low = 0xFF;
3687 return -1;
3688 } else {
3689 j->baseframe.high = j->ssr.high;
3690 j->baseframe.low = j->ssr.low;
3691 /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3692 if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
3693 return -1;
3694 }
3695 }
3696 ixj_aec_start(j, j->cid_play_aec_level);
3697 return size;
3698}
3699
3700static int set_rec_codec(IXJ *j, int rate)
3701{
3702 int retval = 0;
3703
3704 j->rec_codec = rate;
3705
3706 switch (rate) {
3707 case G723_63:
3708 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3709 j->rec_frame_size = 12;
3710 j->rec_mode = 0;
3711 } else {
3712 retval = 1;
3713 }
3714 break;
3715 case G723_53:
3716 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3717 j->rec_frame_size = 10;
3718 j->rec_mode = 0;
3719 } else {
3720 retval = 1;
3721 }
3722 break;
3723 case TS85:
3724 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
3725 j->rec_frame_size = 16;
3726 j->rec_mode = 0;
3727 } else {
3728 retval = 1;
3729 }
3730 break;
3731 case TS48:
3732 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3733 j->rec_frame_size = 9;
3734 j->rec_mode = 0;
3735 } else {
3736 retval = 1;
3737 }
3738 break;
3739 case TS41:
3740 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3741 j->rec_frame_size = 8;
3742 j->rec_mode = 0;
3743 } else {
3744 retval = 1;
3745 }
3746 break;
3747 case G728:
3748 if (j->dsp.low != 0x20) {
3749 j->rec_frame_size = 48;
3750 j->rec_mode = 0;
3751 } else {
3752 retval = 1;
3753 }
3754 break;
3755 case G729:
3756 if (j->dsp.low != 0x20) {
3757 if (!j->flags.g729_loaded) {
3758 retval = 1;
3759 break;
3760 }
3761 switch (j->baseframe.low) {
3762 case 0xA0:
3763 j->rec_frame_size = 10;
3764 break;
3765 case 0x50:
3766 j->rec_frame_size = 5;
3767 break;
3768 default:
3769 j->rec_frame_size = 15;
3770 break;
3771 }
3772 j->rec_mode = 0;
3773 } else {
3774 retval = 1;
3775 }
3776 break;
3777 case G729B:
3778 if (j->dsp.low != 0x20) {
3779 if (!j->flags.g729_loaded) {
3780 retval = 1;
3781 break;
3782 }
3783 switch (j->baseframe.low) {
3784 case 0xA0:
3785 j->rec_frame_size = 12;
3786 break;
3787 case 0x50:
3788 j->rec_frame_size = 6;
3789 break;
3790 default:
3791 j->rec_frame_size = 18;
3792 break;
3793 }
3794 j->rec_mode = 0;
3795 } else {
3796 retval = 1;
3797 }
3798 break;
3799 case ULAW:
3800 switch (j->baseframe.low) {
3801 case 0xA0:
3802 j->rec_frame_size = 80;
3803 break;
3804 case 0x50:
3805 j->rec_frame_size = 40;
3806 break;
3807 default:
3808 j->rec_frame_size = 120;
3809 break;
3810 }
3811 j->rec_mode = 4;
3812 break;
3813 case ALAW:
3814 switch (j->baseframe.low) {
3815 case 0xA0:
3816 j->rec_frame_size = 80;
3817 break;
3818 case 0x50:
3819 j->rec_frame_size = 40;
3820 break;
3821 default:
3822 j->rec_frame_size = 120;
3823 break;
3824 }
3825 j->rec_mode = 4;
3826 break;
3827 case LINEAR16:
3828 switch (j->baseframe.low) {
3829 case 0xA0:
3830 j->rec_frame_size = 160;
3831 break;
3832 case 0x50:
3833 j->rec_frame_size = 80;
3834 break;
3835 default:
3836 j->rec_frame_size = 240;
3837 break;
3838 }
3839 j->rec_mode = 5;
3840 break;
3841 case LINEAR8:
3842 switch (j->baseframe.low) {
3843 case 0xA0:
3844 j->rec_frame_size = 80;
3845 break;
3846 case 0x50:
3847 j->rec_frame_size = 40;
3848 break;
3849 default:
3850 j->rec_frame_size = 120;
3851 break;
3852 }
3853 j->rec_mode = 6;
3854 break;
3855 case WSS:
3856 switch (j->baseframe.low) {
3857 case 0xA0:
3858 j->rec_frame_size = 80;
3859 break;
3860 case 0x50:
3861 j->rec_frame_size = 40;
3862 break;
3863 default:
3864 j->rec_frame_size = 120;
3865 break;
3866 }
3867 j->rec_mode = 7;
3868 break;
3869 default:
3870 j->rec_frame_size = 0;
3871 j->rec_mode = -1;
3872 if (j->read_buffer) {
3873 kfree(j->read_buffer);
3874 j->read_buffer = NULL;
3875 j->read_buffer_size = 0;
3876 }
3877 retval = 1;
3878 break;
3879 }
3880 return retval;
3881}
3882
3883static int ixj_record_start(IXJ *j)
3884{
3885 unsigned short cmd = 0x0000;
3886
3887 if (j->read_buffer) {
3888 ixj_record_stop(j);
3889 }
3890 j->flags.recording = 1;
3891 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
3892
3893 if(ixjdebug & 0x0002)
3894 printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3895
3896 if (!j->rec_mode) {
3897 switch (j->rec_codec) {
3898 case G723_63:
3899 cmd = 0x5131;
3900 break;
3901 case G723_53:
3902 cmd = 0x5132;
3903 break;
3904 case TS85:
3905 cmd = 0x5130; /* TrueSpeech 8.5 */
3906
3907 break;
3908 case TS48:
3909 cmd = 0x5133; /* TrueSpeech 4.8 */
3910
3911 break;
3912 case TS41:
3913 cmd = 0x5134; /* TrueSpeech 4.1 */
3914
3915 break;
3916 case G728:
3917 cmd = 0x5135;
3918 break;
3919 case G729:
3920 case G729B:
3921 cmd = 0x5136;
3922 break;
3923 default:
3924 return 1;
3925 }
3926 if (ixj_WriteDSPCommand(cmd, j))
3927 return -1;
3928 }
3929 if (!j->read_buffer) {
3930 if (!j->read_buffer)
3931 j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
3932 if (!j->read_buffer) {
3933 printk("Read buffer allocation for ixj board %d failed!\n", j->board);
3934 return -ENOMEM;
3935 }
3936 }
3937 j->read_buffer_size = j->rec_frame_size * 2;
3938
3939 if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */
3940
3941 return -1;
3942
3943 switch (j->rec_mode) {
3944 case 0:
3945 cmd = 0x1C03; /* Record C1 */
3946
3947 break;
3948 case 4:
3949 if (j->ver.low == 0x12) {
3950 cmd = 0x1E03; /* Record C1 */
3951
3952 } else {
3953 cmd = 0x1E01; /* Record C1 */
3954
3955 }
3956 break;
3957 case 5:
3958 if (j->ver.low == 0x12) {
3959 cmd = 0x1E83; /* Record C1 */
3960
3961 } else {
3962 cmd = 0x1E81; /* Record C1 */
3963
3964 }
3965 break;
3966 case 6:
3967 if (j->ver.low == 0x12) {
3968 cmd = 0x1F03; /* Record C1 */
3969
3970 } else {
3971 cmd = 0x1F01; /* Record C1 */
3972
3973 }
3974 break;
3975 case 7:
3976 if (j->ver.low == 0x12) {
3977 cmd = 0x1F83; /* Record C1 */
3978 } else {
3979 cmd = 0x1F81; /* Record C1 */
3980 }
3981 break;
3982 }
3983 if (ixj_WriteDSPCommand(cmd, j))
3984 return -1;
3985
3986 if (j->flags.playing) {
3987 ixj_aec_start(j, j->aec_level);
3988 }
3989 return 0;
3990}
3991
3992static void ixj_record_stop(IXJ *j)
3993{
3994 if(ixjdebug & 0x0002)
3995 printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3996
3997 if (j->read_buffer) {
3998 kfree(j->read_buffer);
3999 j->read_buffer = NULL;
4000 j->read_buffer_size = 0;
4001 }
4002 if (j->rec_mode > -1) {
4003 ixj_WriteDSPCommand(0x5120, j);
4004 j->rec_mode = -1;
4005 }
4006 j->flags.recording = 0;
4007}
4008static void ixj_vad(IXJ *j, int arg)
4009{
4010 if (arg)
4011 ixj_WriteDSPCommand(0x513F, j);
4012 else
4013 ixj_WriteDSPCommand(0x513E, j);
4014}
4015
4016static void set_rec_depth(IXJ *j, int depth)
4017{
4018 if (depth > 60)
4019 depth = 60;
4020 if (depth < 0)
4021 depth = 0;
4022 ixj_WriteDSPCommand(0x5180 + depth, j);
4023}
4024
4025static void set_dtmf_prescale(IXJ *j, int volume)
4026{
4027 ixj_WriteDSPCommand(0xCF07, j);
4028 ixj_WriteDSPCommand(volume, j);
4029}
4030
4031static int get_dtmf_prescale(IXJ *j)
4032{
4033 ixj_WriteDSPCommand(0xCF05, j);
4034 return j->ssr.high << 8 | j->ssr.low;
4035}
4036
4037static void set_rec_volume(IXJ *j, int volume)
4038{
4039 if(j->aec_level == AEC_AGC) {
4040 if (ixjdebug & 0x0002)
4041 printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
4042 ixj_WriteDSPCommand(0xCF96, j);
4043 ixj_WriteDSPCommand(volume, j);
4044 } else {
4045 if (ixjdebug & 0x0002)
4046 printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
4047 ixj_WriteDSPCommand(0xCF03, j);
4048 ixj_WriteDSPCommand(volume, j);
4049 }
4050}
4051
4052static int set_rec_volume_linear(IXJ *j, int volume)
4053{
4054 int newvolume, dsprecmax;
4055
4056 if (ixjdebug & 0x0002)
4057 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
4058 if(volume > 100 || volume < 0) {
4059 return -1;
4060 }
4061
4062 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4063 switch (j->cardtype) {
4064 case QTI_PHONEJACK:
4065 dsprecmax = 0x440;
4066 break;
4067 case QTI_LINEJACK:
4068 dsprecmax = 0x180;
4069 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
4070 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
4071 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
4072 break;
4073 case QTI_PHONEJACK_LITE:
4074 dsprecmax = 0x4C0;
4075 break;
4076 case QTI_PHONEJACK_PCI:
4077 dsprecmax = 0x100;
4078 break;
4079 case QTI_PHONECARD:
4080 dsprecmax = 0x400;
4081 break;
4082 default:
4083 return -1;
4084 }
4085 newvolume = (dsprecmax * volume) / 100;
4086 set_rec_volume(j, newvolume);
4087 return 0;
4088}
4089
4090static int get_rec_volume(IXJ *j)
4091{
4092 if(j->aec_level == AEC_AGC) {
4093 if (ixjdebug & 0x0002)
4094 printk(KERN_INFO "Getting AGC Threshold\n");
4095 ixj_WriteDSPCommand(0xCF86, j);
4096 if (ixjdebug & 0x0002)
4097 printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
4098 return j->ssr.high << 8 | j->ssr.low;
4099 } else {
4100 if (ixjdebug & 0x0002)
4101 printk(KERN_INFO "Getting Record Volume\n");
4102 ixj_WriteDSPCommand(0xCF01, j);
4103 return j->ssr.high << 8 | j->ssr.low;
4104 }
4105}
4106
4107static int get_rec_volume_linear(IXJ *j)
4108{
4109 int volume, newvolume, dsprecmax;
4110
4111 switch (j->cardtype) {
4112 case QTI_PHONEJACK:
4113 dsprecmax = 0x440;
4114 break;
4115 case QTI_LINEJACK:
4116 dsprecmax = 0x180;
4117 break;
4118 case QTI_PHONEJACK_LITE:
4119 dsprecmax = 0x4C0;
4120 break;
4121 case QTI_PHONEJACK_PCI:
4122 dsprecmax = 0x100;
4123 break;
4124 case QTI_PHONECARD:
4125 dsprecmax = 0x400;
4126 break;
4127 default:
4128 return -1;
4129 }
4130 volume = get_rec_volume(j);
4131 newvolume = (volume * 100) / dsprecmax;
4132 if(newvolume > 100)
4133 newvolume = 100;
4134 return newvolume;
4135}
4136
4137static int get_rec_level(IXJ *j)
4138{
4139 int retval;
4140
4141 ixj_WriteDSPCommand(0xCF88, j);
4142
4143 retval = j->ssr.high << 8 | j->ssr.low;
4144 retval = (retval * 256) / 240;
4145 return retval;
4146}
4147
4148static void ixj_aec_start(IXJ *j, int level)
4149{
4150 j->aec_level = level;
4151 if (ixjdebug & 0x0002)
4152 printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
4153 if (!level) {
4154 aec_stop(j);
4155 } else {
4156 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4157 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
4158
4159 ixj_WriteDSPCommand(0x0300, j);
4160 }
4161 ixj_WriteDSPCommand(0xB001, j); /* AEC On */
4162
4163 ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
4164
4165 switch (level) {
4166 case AEC_LOW:
4167 ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
4168
4169 ixj_WriteDSPCommand(0xE011, j);
4170 ixj_WriteDSPCommand(0xFFFF, j);
4171
4172 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4173 ixj_WriteDSPCommand(0x0000, j); /* to off */
4174
4175 break;
4176
4177 case AEC_MED:
4178 ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
4179
4180 ixj_WriteDSPCommand(0xE011, j);
4181 ixj_WriteDSPCommand(0x0080, j);
4182
4183 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4184 ixj_WriteDSPCommand(0x0000, j); /* to off */
4185
4186 break;
4187
4188 case AEC_HIGH:
4189 ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
4190
4191 ixj_WriteDSPCommand(0xE011, j);
4192 ixj_WriteDSPCommand(0x0080, j);
4193
4194 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4195 ixj_WriteDSPCommand(0x0000, j); /* to off */
4196
4197 break;
4198
4199 case AEC_AGC:
4200 /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4201 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4202
4203 ixj_WriteDSPCommand(0xE011, j);
4204 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4205
4206 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4207
4208 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4209 ixj_WriteDSPCommand(0x0224, j);
4210 else
4211 ixj_WriteDSPCommand(0x1224, j);
4212
4213 ixj_WriteDSPCommand(0xE014, j);
4214 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4215
4216 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4217
4218 /* Now we can set the AGC initial parameters and turn it on */
4219 ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */
4220 ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
4221
4222 ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
4223 ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
4224
4225 ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
4226 ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
4227
4228 ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
4229 ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
4230
4231 ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
4232 ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
4233
4234 ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
4235 ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
4236
4237 ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
4238 ixj_WriteDSPCommand(0x1200, j); /* to 25% */
4239
4240 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4241 ixj_WriteDSPCommand(0x0001, j); /* to on */
4242
4243 break;
4244
4245 case AEC_AUTO:
4246 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4247
4248 ixj_WriteDSPCommand(0xE011, j);
4249 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4250
4251 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4252
4253 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4254 ixj_WriteDSPCommand(0x0224, j);
4255 else
4256 ixj_WriteDSPCommand(0x1224, j);
4257
4258 ixj_WriteDSPCommand(0xE014, j);
4259 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4260
4261 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4262
4263 break;
4264 }
4265 }
4266}
4267
4268static void aec_stop(IXJ *j)
4269{
4270 j->aec_level = AEC_OFF;
4271 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4272 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
4273
4274 ixj_WriteDSPCommand(0x0700, j);
4275 }
4276 if (j->play_mode != -1 && j->rec_mode != -1)
4277 {
4278 ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
4279 }
4280}
4281
4282static int set_play_codec(IXJ *j, int rate)
4283{
4284 int retval = 0;
4285
4286 j->play_codec = rate;
4287
4288 switch (rate) {
4289 case G723_63:
4290 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4291 j->play_frame_size = 12;
4292 j->play_mode = 0;
4293 } else {
4294 retval = 1;
4295 }
4296 break;
4297 case G723_53:
4298 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4299 j->play_frame_size = 10;
4300 j->play_mode = 0;
4301 } else {
4302 retval = 1;
4303 }
4304 break;
4305 case TS85:
4306 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
4307 j->play_frame_size = 16;
4308 j->play_mode = 0;
4309 } else {
4310 retval = 1;
4311 }
4312 break;
4313 case TS48:
4314 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4315 j->play_frame_size = 9;
4316 j->play_mode = 0;
4317 } else {
4318 retval = 1;
4319 }
4320 break;
4321 case TS41:
4322 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4323 j->play_frame_size = 8;
4324 j->play_mode = 0;
4325 } else {
4326 retval = 1;
4327 }
4328 break;
4329 case G728:
4330 if (j->dsp.low != 0x20) {
4331 j->play_frame_size = 48;
4332 j->play_mode = 0;
4333 } else {
4334 retval = 1;
4335 }
4336 break;
4337 case G729:
4338 if (j->dsp.low != 0x20) {
4339 if (!j->flags.g729_loaded) {
4340 retval = 1;
4341 break;
4342 }
4343 switch (j->baseframe.low) {
4344 case 0xA0:
4345 j->play_frame_size = 10;
4346 break;
4347 case 0x50:
4348 j->play_frame_size = 5;
4349 break;
4350 default:
4351 j->play_frame_size = 15;
4352 break;
4353 }
4354 j->play_mode = 0;
4355 } else {
4356 retval = 1;
4357 }
4358 break;
4359 case G729B:
4360 if (j->dsp.low != 0x20) {
4361 if (!j->flags.g729_loaded) {
4362 retval = 1;
4363 break;
4364 }
4365 switch (j->baseframe.low) {
4366 case 0xA0:
4367 j->play_frame_size = 12;
4368 break;
4369 case 0x50:
4370 j->play_frame_size = 6;
4371 break;
4372 default:
4373 j->play_frame_size = 18;
4374 break;
4375 }
4376 j->play_mode = 0;
4377 } else {
4378 retval = 1;
4379 }
4380 break;
4381 case ULAW:
4382 switch (j->baseframe.low) {
4383 case 0xA0:
4384 j->play_frame_size = 80;
4385 break;
4386 case 0x50:
4387 j->play_frame_size = 40;
4388 break;
4389 default:
4390 j->play_frame_size = 120;
4391 break;
4392 }
4393 j->play_mode = 2;
4394 break;
4395 case ALAW:
4396 switch (j->baseframe.low) {
4397 case 0xA0:
4398 j->play_frame_size = 80;
4399 break;
4400 case 0x50:
4401 j->play_frame_size = 40;
4402 break;
4403 default:
4404 j->play_frame_size = 120;
4405 break;
4406 }
4407 j->play_mode = 2;
4408 break;
4409 case LINEAR16:
4410 switch (j->baseframe.low) {
4411 case 0xA0:
4412 j->play_frame_size = 160;
4413 break;
4414 case 0x50:
4415 j->play_frame_size = 80;
4416 break;
4417 default:
4418 j->play_frame_size = 240;
4419 break;
4420 }
4421 j->play_mode = 6;
4422 break;
4423 case LINEAR8:
4424 switch (j->baseframe.low) {
4425 case 0xA0:
4426 j->play_frame_size = 80;
4427 break;
4428 case 0x50:
4429 j->play_frame_size = 40;
4430 break;
4431 default:
4432 j->play_frame_size = 120;
4433 break;
4434 }
4435 j->play_mode = 4;
4436 break;
4437 case WSS:
4438 switch (j->baseframe.low) {
4439 case 0xA0:
4440 j->play_frame_size = 80;
4441 break;
4442 case 0x50:
4443 j->play_frame_size = 40;
4444 break;
4445 default:
4446 j->play_frame_size = 120;
4447 break;
4448 }
4449 j->play_mode = 5;
4450 break;
4451 default:
4452 j->play_frame_size = 0;
4453 j->play_mode = -1;
4454 if (j->write_buffer) {
4455 kfree(j->write_buffer);
4456 j->write_buffer = NULL;
4457 j->write_buffer_size = 0;
4458 }
4459 retval = 1;
4460 break;
4461 }
4462 return retval;
4463}
4464
4465static int ixj_play_start(IXJ *j)
4466{
4467 unsigned short cmd = 0x0000;
4468
4469 if (j->write_buffer) {
4470 ixj_play_stop(j);
4471 }
4472
4473 if(ixjdebug & 0x0002)
4474 printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4475
4476 j->flags.playing = 1;
4477 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
4478
4479 j->flags.play_first_frame = 1;
4480 j->drybuffer = 0;
4481
4482 if (!j->play_mode) {
4483 switch (j->play_codec) {
4484 case G723_63:
4485 cmd = 0x5231;
4486 break;
4487 case G723_53:
4488 cmd = 0x5232;
4489 break;
4490 case TS85:
4491 cmd = 0x5230; /* TrueSpeech 8.5 */
4492
4493 break;
4494 case TS48:
4495 cmd = 0x5233; /* TrueSpeech 4.8 */
4496
4497 break;
4498 case TS41:
4499 cmd = 0x5234; /* TrueSpeech 4.1 */
4500
4501 break;
4502 case G728:
4503 cmd = 0x5235;
4504 break;
4505 case G729:
4506 case G729B:
4507 cmd = 0x5236;
4508 break;
4509 default:
4510 return 1;
4511 }
4512 if (ixj_WriteDSPCommand(cmd, j))
4513 return -1;
4514 }
4515 j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
4516 if (!j->write_buffer) {
4517 printk("Write buffer allocation for ixj board %d failed!\n", j->board);
4518 return -ENOMEM;
4519 }
4520/* j->write_buffers_empty = 2; */
4521 j->write_buffers_empty = 1;
4522 j->write_buffer_size = j->play_frame_size * 2;
4523 j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
4524 j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
4525
4526 if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */
4527
4528 return -1;
4529
4530 switch (j->play_mode) {
4531 case 0:
4532 cmd = 0x2C03;
4533 break;
4534 case 2:
4535 if (j->ver.low == 0x12) {
4536 cmd = 0x2C23;
4537 } else {
4538 cmd = 0x2C21;
4539 }
4540 break;
4541 case 4:
4542 if (j->ver.low == 0x12) {
4543 cmd = 0x2C43;
4544 } else {
4545 cmd = 0x2C41;
4546 }
4547 break;
4548 case 5:
4549 if (j->ver.low == 0x12) {
4550 cmd = 0x2C53;
4551 } else {
4552 cmd = 0x2C51;
4553 }
4554 break;
4555 case 6:
4556 if (j->ver.low == 0x12) {
4557 cmd = 0x2C63;
4558 } else {
4559 cmd = 0x2C61;
4560 }
4561 break;
4562 }
4563 if (ixj_WriteDSPCommand(cmd, j))
4564 return -1;
4565
4566 if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */
4567 return -1;
4568
4569 if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */
4570 return -1;
4571
4572 if (j->flags.recording) {
4573 ixj_aec_start(j, j->aec_level);
4574 }
4575
4576 return 0;
4577}
4578
4579static void ixj_play_stop(IXJ *j)
4580{
4581 if(ixjdebug & 0x0002)
4582 printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4583
4584 if (j->write_buffer) {
4585 kfree(j->write_buffer);
4586 j->write_buffer = NULL;
4587 j->write_buffer_size = 0;
4588 }
4589 if (j->play_mode > -1) {
4590 ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers. 8022 reference page 9-40 */
4591
4592 j->play_mode = -1;
4593 }
4594 j->flags.playing = 0;
4595}
4596
4597static inline int get_play_level(IXJ *j)
4598{
4599 int retval;
4600
4601 ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
4602 return j->ssr.high << 8 | j->ssr.low;
4603 retval = j->ssr.high << 8 | j->ssr.low;
4604 retval = (retval * 256) / 240;
4605 return retval;
4606}
4607
4608static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
4609{
4610 unsigned int mask = 0;
4611
4612 IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
4613
4614 poll_wait(file_p, &(j->poll_q), wait);
4615 if (j->read_buffer_ready > 0)
4616 mask |= POLLIN | POLLRDNORM; /* readable */
4617 if (j->write_buffers_empty > 0)
4618 mask |= POLLOUT | POLLWRNORM; /* writable */
4619 if (j->ex.bytes)
4620 mask |= POLLPRI;
4621 return mask;
4622}
4623
4624static int ixj_play_tone(IXJ *j, char tone)
4625{
4626 if (!j->tone_state) {
4627 if(ixjdebug & 0x0002) {
4628 printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
4629 }
4630 if (j->dsp.low == 0x20) {
4631 idle(j);
4632 }
4633 j->tone_start_jif = jiffies;
4634
4635 j->tone_state = 1;
4636 }
4637
4638 j->tone_index = tone;
4639 if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
4640 return -1;
4641
4642 return 0;
4643}
4644
4645static int ixj_set_tone_on(unsigned short arg, IXJ *j)
4646{
4647 j->tone_on_time = arg;
4648
4649 if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */
4650
4651 return -1;
4652
4653 if (ixj_WriteDSPCommand(arg, j))
4654 return -1;
4655
4656 return 0;
4657}
4658
4659static int SCI_WaitHighSCI(IXJ *j)
4660{
4661 int cnt;
4662
4663 j->pld_scrr.byte = inb_p(j->XILINXbase);
4664 if (!j->pld_scrr.bits.sci) {
4665 for (cnt = 0; cnt < 10; cnt++) {
4666 udelay(32);
4667 j->pld_scrr.byte = inb_p(j->XILINXbase);
4668
4669 if ((j->pld_scrr.bits.sci))
4670 return 1;
4671 }
4672 if (ixjdebug & 0x0001)
4673 printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
4674 return 0;
4675 } else
4676 return 1;
4677}
4678
4679static int SCI_WaitLowSCI(IXJ *j)
4680{
4681 int cnt;
4682
4683 j->pld_scrr.byte = inb_p(j->XILINXbase);
4684 if (j->pld_scrr.bits.sci) {
4685 for (cnt = 0; cnt < 10; cnt++) {
4686 udelay(32);
4687 j->pld_scrr.byte = inb_p(j->XILINXbase);
4688
4689 if (!(j->pld_scrr.bits.sci))
4690 return 1;
4691 }
4692 if (ixjdebug & 0x0001)
4693 printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
4694 return 0;
4695 } else
4696 return 1;
4697}
4698
4699static int SCI_Control(IXJ *j, int control)
4700{
4701 switch (control) {
4702 case SCI_End:
4703 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4704
4705 j->pld_scrw.bits.c1 = 0; /* to no selection */
4706
4707 break;
4708 case SCI_Enable_DAA:
4709 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4710
4711 j->pld_scrw.bits.c1 = 0; /* to write to DAA */
4712
4713 break;
4714 case SCI_Enable_Mixer:
4715 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4716
4717 j->pld_scrw.bits.c1 = 1; /* to write to mixer */
4718
4719 break;
4720 case SCI_Enable_EEPROM:
4721 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4722
4723 j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */
4724
4725 break;
4726 default:
4727 return 0;
4728 break;
4729 }
4730 outb_p(j->pld_scrw.byte, j->XILINXbase);
4731
4732 switch (control) {
4733 case SCI_End:
4734 return 1;
4735 break;
4736 case SCI_Enable_DAA:
4737 case SCI_Enable_Mixer:
4738 case SCI_Enable_EEPROM:
4739 if (!SCI_WaitHighSCI(j))
4740 return 0;
4741 break;
4742 default:
4743 return 0;
4744 break;
4745 }
4746 return 1;
4747}
4748
4749static int SCI_Prepare(IXJ *j)
4750{
4751 if (!SCI_Control(j, SCI_End))
4752 return 0;
4753
4754 if (!SCI_WaitLowSCI(j))
4755 return 0;
4756
4757 return 1;
4758}
4759
4760static int ixj_get_mixer(long val, IXJ *j)
4761{
4762 int reg = (val & 0x1F00) >> 8;
4763 return j->mix.vol[reg];
4764}
4765
4766static int ixj_mixer(long val, IXJ *j)
4767{
4768 BYTES bytes;
4769
4770 bytes.high = (val & 0x1F00) >> 8;
4771 bytes.low = val & 0x00FF;
4772
4773 /* save mixer value so we can get back later on */
4774 j->mix.vol[bytes.high] = bytes.low;
4775
4776 outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */
4777
4778 outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */
4779
4780 SCI_Control(j, SCI_Enable_Mixer);
4781
4782 SCI_Control(j, SCI_End);
4783
4784 return 0;
4785}
4786
4787static int daa_load(BYTES * p_bytes, IXJ *j)
4788{
4789 outb_p(p_bytes->high, j->XILINXbase + 0x03);
4790 outb_p(p_bytes->low, j->XILINXbase + 0x02);
4791 if (!SCI_Control(j, SCI_Enable_DAA))
4792 return 0;
4793 else
4794 return 1;
4795}
4796
4797static int ixj_daa_cr4(IXJ *j, char reg)
4798{
4799 BYTES bytes;
4800
4801 switch (j->daa_mode) {
4802 case SOP_PU_SLEEP:
4803 bytes.high = 0x14;
4804 break;
4805 case SOP_PU_RINGING:
4806 bytes.high = 0x54;
4807 break;
4808 case SOP_PU_CONVERSATION:
4809 bytes.high = 0x94;
4810 break;
4811 case SOP_PU_PULSEDIALING:
4812 bytes.high = 0xD4;
4813 break;
4814 }
4815
4816 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
4817
4818 switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
4819 case 0:
4820 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
4821 break;
4822 case 1:
4823 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
4824 break;
4825 case 2:
4826 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
4827 break;
4828 case 3:
4829 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
4830 break;
4831 }
4832
4833 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
4834
4835 if (!daa_load(&bytes, j))
4836 return 0;
4837
4838 if (!SCI_Prepare(j))
4839 return 0;
4840
4841 return 1;
4842}
4843
4844static char daa_int_read(IXJ *j)
4845{
4846 BYTES bytes;
4847
4848 if (!SCI_Prepare(j))
4849 return 0;
4850
4851 bytes.high = 0x38;
4852 bytes.low = 0x00;
4853 outb_p(bytes.high, j->XILINXbase + 0x03);
4854 outb_p(bytes.low, j->XILINXbase + 0x02);
4855
4856 if (!SCI_Control(j, SCI_Enable_DAA))
4857 return 0;
4858
4859 bytes.high = inb_p(j->XILINXbase + 0x03);
4860 bytes.low = inb_p(j->XILINXbase + 0x02);
4861 if (bytes.low != ALISDAA_ID_BYTE) {
4862 if (ixjdebug & 0x0001)
4863 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4864 return 0;
4865 }
4866 if (!SCI_Control(j, SCI_Enable_DAA))
4867 return 0;
4868 if (!SCI_Control(j, SCI_End))
4869 return 0;
4870
4871 bytes.high = inb_p(j->XILINXbase + 0x03);
4872 bytes.low = inb_p(j->XILINXbase + 0x02);
4873
4874 j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
4875
4876 return 1;
4877}
4878
4879static char daa_CR_read(IXJ *j, int cr)
4880{
4881 IXJ_WORD wdata;
4882 BYTES bytes;
4883
4884 if (!SCI_Prepare(j))
4885 return 0;
4886
4887 switch (j->daa_mode) {
4888 case SOP_PU_SLEEP:
4889 bytes.high = 0x30 + cr;
4890 break;
4891 case SOP_PU_RINGING:
4892 bytes.high = 0x70 + cr;
4893 break;
4894 case SOP_PU_CONVERSATION:
4895 bytes.high = 0xB0 + cr;
4896 break;
4897 case SOP_PU_PULSEDIALING:
4898 bytes.high = 0xF0 + cr;
4899 break;
4900 }
4901
4902 bytes.low = 0x00;
4903
4904 outb_p(bytes.high, j->XILINXbase + 0x03);
4905 outb_p(bytes.low, j->XILINXbase + 0x02);
4906
4907 if (!SCI_Control(j, SCI_Enable_DAA))
4908 return 0;
4909
4910 bytes.high = inb_p(j->XILINXbase + 0x03);
4911 bytes.low = inb_p(j->XILINXbase + 0x02);
4912 if (bytes.low != ALISDAA_ID_BYTE) {
4913 if (ixjdebug & 0x0001)
4914 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4915 return 0;
4916 }
4917 if (!SCI_Control(j, SCI_Enable_DAA))
4918 return 0;
4919 if (!SCI_Control(j, SCI_End))
4920 return 0;
4921
4922 wdata.word = inw_p(j->XILINXbase + 0x02);
4923
4924 switch(cr){
4925 case 5:
4926 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
4927 break;
4928 case 4:
4929 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
4930 break;
4931 case 3:
4932 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
4933 break;
4934 case 2:
4935 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
4936 break;
4937 case 1:
4938 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
4939 break;
4940 case 0:
4941 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
4942 break;
4943 default:
4944 return 0;
4945 }
4946 return 1;
4947}
4948
4949static int ixj_daa_cid_reset(IXJ *j)
4950{
4951 int i;
4952 BYTES bytes;
4953
4954 if (ixjdebug & 0x0002)
4955 printk("DAA Clearing CID ram\n");
4956
4957 if (!SCI_Prepare(j))
4958 return 0;
4959
4960 bytes.high = 0x58;
4961 bytes.low = 0x00;
4962 outb_p(bytes.high, j->XILINXbase + 0x03);
4963 outb_p(bytes.low, j->XILINXbase + 0x02);
4964
4965 if (!SCI_Control(j, SCI_Enable_DAA))
4966 return 0;
4967
4968 if (!SCI_WaitHighSCI(j))
4969 return 0;
4970
4971 for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
4972 bytes.high = bytes.low = 0x00;
4973 outb_p(bytes.high, j->XILINXbase + 0x03);
4974
4975 if (i < ALISDAA_CALLERID_SIZE - 1)
4976 outb_p(bytes.low, j->XILINXbase + 0x02);
4977
4978 if (!SCI_Control(j, SCI_Enable_DAA))
4979 return 0;
4980
4981 if (!SCI_WaitHighSCI(j))
4982 return 0;
4983
4984 }
4985
4986 if (!SCI_Control(j, SCI_End))
4987 return 0;
4988
4989 if (ixjdebug & 0x0002)
4990 printk("DAA CID ram cleared\n");
4991
4992 return 1;
4993}
4994
4995static int ixj_daa_cid_read(IXJ *j)
4996{
4997 int i;
4998 BYTES bytes;
4999 char CID[ALISDAA_CALLERID_SIZE], mContinue;
5000 char *pIn, *pOut;
5001
5002 if (!SCI_Prepare(j))
5003 return 0;
5004
5005 bytes.high = 0x78;
5006 bytes.low = 0x00;
5007 outb_p(bytes.high, j->XILINXbase + 0x03);
5008 outb_p(bytes.low, j->XILINXbase + 0x02);
5009
5010 if (!SCI_Control(j, SCI_Enable_DAA))
5011 return 0;
5012
5013 if (!SCI_WaitHighSCI(j))
5014 return 0;
5015
5016 bytes.high = inb_p(j->XILINXbase + 0x03);
5017 bytes.low = inb_p(j->XILINXbase + 0x02);
5018 if (bytes.low != ALISDAA_ID_BYTE) {
5019 if (ixjdebug & 0x0001)
5020 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5021 return 0;
5022 }
5023 for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
5024 bytes.high = bytes.low = 0x00;
5025 outb_p(bytes.high, j->XILINXbase + 0x03);
5026 outb_p(bytes.low, j->XILINXbase + 0x02);
5027
5028 if (!SCI_Control(j, SCI_Enable_DAA))
5029 return 0;
5030
5031 if (!SCI_WaitHighSCI(j))
5032 return 0;
5033
5034 CID[i + 0] = inb_p(j->XILINXbase + 0x03);
5035 CID[i + 1] = inb_p(j->XILINXbase + 0x02);
5036 }
5037
5038 if (!SCI_Control(j, SCI_End))
5039 return 0;
5040
5041 pIn = CID;
5042 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5043 mContinue = 1;
5044 while (mContinue) {
5045 if ((pIn[1] & 0x03) == 0x01) {
5046 pOut[0] = pIn[0];
5047 }
5048 if ((pIn[2] & 0x0c) == 0x04) {
5049 pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
5050 }
5051 if ((pIn[3] & 0x30) == 0x10) {
5052 pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
5053 }
5054 if ((pIn[4] & 0xc0) == 0x40) {
5055 pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
5056 } else {
5057 mContinue = FALSE;
5058 }
5059 pIn += 5, pOut += 4;
5060 }
5061 memset(&j->cid, 0, sizeof(PHONE_CID));
5062 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5063 pOut += 4;
5064 strncpy(j->cid.month, pOut, 2);
5065 pOut += 2;
5066 strncpy(j->cid.day, pOut, 2);
5067 pOut += 2;
5068 strncpy(j->cid.hour, pOut, 2);
5069 pOut += 2;
5070 strncpy(j->cid.min, pOut, 2);
5071 pOut += 3;
5072 j->cid.numlen = *pOut;
5073 pOut += 1;
5074 strncpy(j->cid.number, pOut, j->cid.numlen);
5075 pOut += j->cid.numlen + 1;
5076 j->cid.namelen = *pOut;
5077 pOut += 1;
5078 strncpy(j->cid.name, pOut, j->cid.namelen);
5079
5080 ixj_daa_cid_reset(j);
5081 return 1;
5082}
5083
5084static char daa_get_version(IXJ *j)
5085{
5086 BYTES bytes;
5087
5088 if (!SCI_Prepare(j))
5089 return 0;
5090
5091 bytes.high = 0x35;
5092 bytes.low = 0x00;
5093 outb_p(bytes.high, j->XILINXbase + 0x03);
5094 outb_p(bytes.low, j->XILINXbase + 0x02);
5095
5096 if (!SCI_Control(j, SCI_Enable_DAA))
5097 return 0;
5098
5099 bytes.high = inb_p(j->XILINXbase + 0x03);
5100 bytes.low = inb_p(j->XILINXbase + 0x02);
5101 if (bytes.low != ALISDAA_ID_BYTE) {
5102 if (ixjdebug & 0x0001)
5103 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5104 return 0;
5105 }
5106 if (!SCI_Control(j, SCI_Enable_DAA))
5107 return 0;
5108
5109 if (!SCI_Control(j, SCI_End))
5110 return 0;
5111
5112 bytes.high = inb_p(j->XILINXbase + 0x03);
5113 bytes.low = inb_p(j->XILINXbase + 0x02);
5114 if (ixjdebug & 0x0002)
5115 printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
5116 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
5117 return bytes.high;
5118}
5119
5120static int daa_set_mode(IXJ *j, int mode)
5121{
5122 /* NOTE:
5123 The DAA *MUST* be in the conversation mode if the
5124 PSTN line is to be seized (PSTN line off-hook).
5125 Taking the PSTN line off-hook while the DAA is in
5126 a mode other than conversation mode will cause a
5127 hardware failure of the ALIS-A part.
5128
5129 NOTE:
5130 The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5131 if the PSTN line is on-hook. Failure to have the PSTN line
5132 in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5133 ALIS-A part.
5134 */
5135
5136 BYTES bytes;
5137
5138 j->flags.pstn_rmr = 0;
5139
5140 if (!SCI_Prepare(j))
5141 return 0;
5142
5143 switch (mode) {
5144 case SOP_PU_RESET:
5145 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5146
5147 outb_p(j->pld_scrw.byte, j->XILINXbase);
5148 j->pld_slicw.bits.rly2 = 0;
5149 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5150 bytes.high = 0x10;
5151 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5152 daa_load(&bytes, j);
5153 if (!SCI_Prepare(j))
5154 return 0;
5155
5156 j->daa_mode = SOP_PU_SLEEP;
5157 break;
5158 case SOP_PU_SLEEP:
5159 if(j->daa_mode == SOP_PU_SLEEP)
5160 {
5161 break;
5162 }
5163 if (ixjdebug & 0x0008)
5164 printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
5165/* if(j->daa_mode == SOP_PU_CONVERSATION) */
5166 {
5167 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5168
5169 outb_p(j->pld_scrw.byte, j->XILINXbase);
5170 j->pld_slicw.bits.rly2 = 0;
5171 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5172 bytes.high = 0x10;
5173 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5174 daa_load(&bytes, j);
5175 if (!SCI_Prepare(j))
5176 return 0;
5177 }
5178 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5179
5180 outb_p(j->pld_scrw.byte, j->XILINXbase);
5181 j->pld_slicw.bits.rly2 = 0;
5182 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5183 bytes.high = 0x10;
5184 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5185 daa_load(&bytes, j);
5186 if (!SCI_Prepare(j))
5187 return 0;
5188
5189 j->daa_mode = SOP_PU_SLEEP;
5190 j->flags.pstn_ringing = 0;
5191 j->ex.bits.pstn_ring = 0;
5192 j->pstn_sleeptil = jiffies + (hertz / 4);
5193 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
5194 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
5195 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
5196 break;
5197 case SOP_PU_RINGING:
5198 if (ixjdebug & 0x0008)
5199 printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
5200 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5201
5202 outb_p(j->pld_scrw.byte, j->XILINXbase);
5203 j->pld_slicw.bits.rly2 = 0;
5204 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5205 bytes.high = 0x50;
5206 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5207 daa_load(&bytes, j);
5208 if (!SCI_Prepare(j))
5209 return 0;
5210 j->daa_mode = SOP_PU_RINGING;
5211 break;
5212 case SOP_PU_CONVERSATION:
5213 if (ixjdebug & 0x0008)
5214 printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
5215 bytes.high = 0x90;
5216 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5217 daa_load(&bytes, j);
5218 if (!SCI_Prepare(j))
5219 return 0;
5220 j->pld_slicw.bits.rly2 = 1;
5221 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5222 j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */
5223
5224 outb_p(j->pld_scrw.byte, j->XILINXbase);
5225 j->daa_mode = SOP_PU_CONVERSATION;
5226 j->flags.pstn_ringing = 0;
5227 j->ex.bits.pstn_ring = 0;
5228 j->pstn_sleeptil = jiffies;
5229 j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
5230 break;
5231 case SOP_PU_PULSEDIALING:
5232 if (ixjdebug & 0x0008)
5233 printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
5234 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5235
5236 outb_p(j->pld_scrw.byte, j->XILINXbase);
5237 j->pld_slicw.bits.rly2 = 0;
5238 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5239 bytes.high = 0xD0;
5240 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5241 daa_load(&bytes, j);
5242 if (!SCI_Prepare(j))
5243 return 0;
5244 j->daa_mode = SOP_PU_PULSEDIALING;
5245 break;
5246 default:
5247 break;
5248 }
5249 return 1;
5250}
5251
5252static int ixj_daa_write(IXJ *j)
5253{
5254 BYTES bytes;
5255
5256 j->flags.pstncheck = 1;
5257
5258 daa_set_mode(j, SOP_PU_SLEEP);
5259
5260 if (!SCI_Prepare(j))
5261 return 0;
5262
5263 outb_p(j->pld_scrw.byte, j->XILINXbase);
5264
5265 bytes.high = 0x14;
5266 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
5267 if (!daa_load(&bytes, j))
5268 return 0;
5269
5270 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
5271 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
5272 if (!daa_load(&bytes, j))
5273 return 0;
5274
5275 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
5276 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5277 if (!daa_load(&bytes, j))
5278 return 0;
5279
5280 if (!SCI_Prepare(j))
5281 return 0;
5282
5283 bytes.high = 0x1F;
5284 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
5285 if (!daa_load(&bytes, j))
5286 return 0;
5287
5288 bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
5289 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
5290 if (!daa_load(&bytes, j))
5291 return 0;
5292
5293 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
5294 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
5295 if (!daa_load(&bytes, j))
5296 return 0;
5297
5298 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
5299 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
5300 if (!daa_load(&bytes, j))
5301 return 0;
5302
5303 bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
5304 bytes.low = 0x00;
5305 if (!daa_load(&bytes, j))
5306 return 0;
5307
5308 if (!SCI_Prepare(j))
5309 return 0;
5310
5311 bytes.high = 0x00;
5312 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
5313 if (!daa_load(&bytes, j))
5314 return 0;
5315
5316 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
5317 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
5318 if (!daa_load(&bytes, j))
5319 return 0;
5320
5321 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
5322 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
5323 if (!daa_load(&bytes, j))
5324 return 0;
5325
5326 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
5327 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
5328 if (!daa_load(&bytes, j))
5329 return 0;
5330
5331 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
5332 bytes.low = 0x00;
5333 if (!daa_load(&bytes, j))
5334 return 0;
5335
5336 if (!SCI_Control(j, SCI_End))
5337 return 0;
5338 if (!SCI_WaitLowSCI(j))
5339 return 0;
5340
5341 bytes.high = 0x01;
5342 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
5343 if (!daa_load(&bytes, j))
5344 return 0;
5345
5346 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
5347 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
5348 if (!daa_load(&bytes, j))
5349 return 0;
5350
5351 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
5352 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
5353 if (!daa_load(&bytes, j))
5354 return 0;
5355
5356 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
5357 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
5358 if (!daa_load(&bytes, j))
5359 return 0;
5360
5361 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
5362 bytes.low = 0x00;
5363 if (!daa_load(&bytes, j))
5364 return 0;
5365
5366 if (!SCI_Control(j, SCI_End))
5367 return 0;
5368 if (!SCI_WaitLowSCI(j))
5369 return 0;
5370
5371 bytes.high = 0x02;
5372 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
5373 if (!daa_load(&bytes, j))
5374 return 0;
5375
5376 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
5377 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
5378 if (!daa_load(&bytes, j))
5379 return 0;
5380
5381 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
5382 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
5383 if (!daa_load(&bytes, j))
5384 return 0;
5385
5386 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
5387 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
5388 if (!daa_load(&bytes, j))
5389 return 0;
5390
5391 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
5392 bytes.low = 0x00;
5393 if (!daa_load(&bytes, j))
5394 return 0;
5395
5396 if (!SCI_Control(j, SCI_End))
5397 return 0;
5398 if (!SCI_WaitLowSCI(j))
5399 return 0;
5400
5401 bytes.high = 0x03;
5402 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
5403 if (!daa_load(&bytes, j))
5404 return 0;
5405
5406 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
5407 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
5408 if (!daa_load(&bytes, j))
5409 return 0;
5410
5411 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
5412 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
5413 if (!daa_load(&bytes, j))
5414 return 0;
5415
5416 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
5417 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
5418 if (!daa_load(&bytes, j))
5419 return 0;
5420
5421 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
5422 bytes.low = 0x00;
5423 if (!daa_load(&bytes, j))
5424 return 0;
5425
5426 if (!SCI_Control(j, SCI_End))
5427 return 0;
5428 if (!SCI_WaitLowSCI(j))
5429 return 0;
5430
5431 bytes.high = 0x04;
5432 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
5433 if (!daa_load(&bytes, j))
5434 return 0;
5435
5436 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
5437 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
5438 if (!daa_load(&bytes, j))
5439 return 0;
5440
5441 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
5442 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
5443 if (!daa_load(&bytes, j))
5444 return 0;
5445
5446 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
5447 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
5448 if (!daa_load(&bytes, j))
5449 return 0;
5450
5451 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
5452 bytes.low = 0x00;
5453 if (!daa_load(&bytes, j))
5454 return 0;
5455
5456 if (!SCI_Control(j, SCI_End))
5457 return 0;
5458 if (!SCI_WaitLowSCI(j))
5459 return 0;
5460
5461 bytes.high = 0x05;
5462 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
5463 if (!daa_load(&bytes, j))
5464 return 0;
5465
5466 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
5467 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
5468 if (!daa_load(&bytes, j))
5469 return 0;
5470
5471 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
5472 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
5473 if (!daa_load(&bytes, j))
5474 return 0;
5475
5476 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
5477 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
5478 if (!daa_load(&bytes, j))
5479 return 0;
5480
5481 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
5482 bytes.low = 0x00;
5483 if (!daa_load(&bytes, j))
5484 return 0;
5485
5486 if (!SCI_Control(j, SCI_End))
5487 return 0;
5488 if (!SCI_WaitLowSCI(j))
5489 return 0;
5490
5491 bytes.high = 0x06;
5492 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
5493 if (!daa_load(&bytes, j))
5494 return 0;
5495
5496 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
5497 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
5498 if (!daa_load(&bytes, j))
5499 return 0;
5500
5501 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
5502 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
5503 if (!daa_load(&bytes, j))
5504 return 0;
5505
5506 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
5507 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
5508 if (!daa_load(&bytes, j))
5509 return 0;
5510
5511 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
5512 bytes.low = 0x00;
5513 if (!daa_load(&bytes, j))
5514 return 0;
5515
5516 if (!SCI_Control(j, SCI_End))
5517 return 0;
5518 if (!SCI_WaitLowSCI(j))
5519 return 0;
5520
5521 bytes.high = 0x07;
5522 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
5523 if (!daa_load(&bytes, j))
5524 return 0;
5525
5526 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
5527 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
5528 if (!daa_load(&bytes, j))
5529 return 0;
5530
5531 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
5532 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
5533 if (!daa_load(&bytes, j))
5534 return 0;
5535
5536 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
5537 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
5538 if (!daa_load(&bytes, j))
5539 return 0;
5540
5541 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
5542 bytes.low = 0x00;
5543 if (!daa_load(&bytes, j))
5544 return 0;
5545
5546 if (!SCI_Control(j, SCI_End))
5547 return 0;
5548 if (!SCI_WaitLowSCI(j))
5549 return 0;
5550
5551 bytes.high = 0x08;
5552 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
5553 if (!daa_load(&bytes, j))
5554 return 0;
5555
5556 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
5557 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
5558 if (!daa_load(&bytes, j))
5559 return 0;
5560
5561 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
5562 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
5563 if (!daa_load(&bytes, j))
5564 return 0;
5565
5566 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
5567 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
5568 if (!daa_load(&bytes, j))
5569 return 0;
5570
5571 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
5572 bytes.low = 0x00;
5573 if (!daa_load(&bytes, j))
5574 return 0;
5575
5576 if (!SCI_Control(j, SCI_End))
5577 return 0;
5578 if (!SCI_WaitLowSCI(j))
5579 return 0;
5580
5581 bytes.high = 0x09;
5582 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
5583 if (!daa_load(&bytes, j))
5584 return 0;
5585
5586 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
5587 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
5588 if (!daa_load(&bytes, j))
5589 return 0;
5590
5591 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
5592 bytes.low = 0x00;
5593 if (!daa_load(&bytes, j))
5594 return 0;
5595
5596 if (!SCI_Control(j, SCI_End))
5597 return 0;
5598 if (!SCI_WaitLowSCI(j))
5599 return 0;
5600
5601 bytes.high = 0x0A;
5602 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
5603 if (!daa_load(&bytes, j))
5604 return 0;
5605
5606 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
5607 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
5608 if (!daa_load(&bytes, j))
5609 return 0;
5610
5611 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
5612 bytes.low = 0x00;
5613 if (!daa_load(&bytes, j))
5614 return 0;
5615
5616 if (!SCI_Control(j, SCI_End))
5617 return 0;
5618 if (!SCI_WaitLowSCI(j))
5619 return 0;
5620
5621 bytes.high = 0x0B;
5622 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
5623 if (!daa_load(&bytes, j))
5624 return 0;
5625
5626 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
5627 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
5628 if (!daa_load(&bytes, j))
5629 return 0;
5630
5631 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
5632 bytes.low = 0x00;
5633 if (!daa_load(&bytes, j))
5634 return 0;
5635
5636 if (!SCI_Control(j, SCI_End))
5637 return 0;
5638 if (!SCI_WaitLowSCI(j))
5639 return 0;
5640
5641 bytes.high = 0x0C;
5642 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
5643 if (!daa_load(&bytes, j))
5644 return 0;
5645
5646 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
5647 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
5648 if (!daa_load(&bytes, j))
5649 return 0;
5650
5651 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
5652 bytes.low = 0x00;
5653 if (!daa_load(&bytes, j))
5654 return 0;
5655
5656 if (!SCI_Control(j, SCI_End))
5657 return 0;
5658 if (!SCI_WaitLowSCI(j))
5659 return 0;
5660
5661 bytes.high = 0x0D;
5662 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
5663 if (!daa_load(&bytes, j))
5664 return 0;
5665
5666 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
5667 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
5668 if (!daa_load(&bytes, j))
5669 return 0;
5670
5671 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
5672 bytes.low = 0x00;
5673 if (!daa_load(&bytes, j))
5674 return 0;
5675
5676 if (!SCI_Control(j, SCI_End))
5677 return 0;
5678 if (!SCI_WaitLowSCI(j))
5679 return 0;
5680
5681 bytes.high = 0x0E;
5682 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
5683 if (!daa_load(&bytes, j))
5684 return 0;
5685
5686 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
5687 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
5688 if (!daa_load(&bytes, j))
5689 return 0;
5690
5691 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
5692 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
5693 if (!daa_load(&bytes, j))
5694 return 0;
5695
5696 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
5697 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
5698 if (!daa_load(&bytes, j))
5699 return 0;
5700
5701 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
5702 bytes.low = 0x00;
5703 if (!daa_load(&bytes, j))
5704 return 0;
5705
5706 if (!SCI_Control(j, SCI_End))
5707 return 0;
5708 if (!SCI_WaitLowSCI(j))
5709 return 0;
5710
5711 bytes.high = 0x0F;
5712 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
5713 if (!daa_load(&bytes, j))
5714 return 0;
5715
5716 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
5717 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
5718 if (!daa_load(&bytes, j))
5719 return 0;
5720
5721 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
5722 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
5723 if (!daa_load(&bytes, j))
5724 return 0;
5725
5726 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
5727 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
5728 if (!daa_load(&bytes, j))
5729 return 0;
5730
5731 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
5732 bytes.low = 0x00;
5733 if (!daa_load(&bytes, j))
5734 return 0;
5735
5736 udelay(32);
5737 j->pld_scrr.byte = inb_p(j->XILINXbase);
5738 if (!SCI_Control(j, SCI_End))
5739 return 0;
5740
5741 outb_p(j->pld_scrw.byte, j->XILINXbase);
5742
5743 if (ixjdebug & 0x0002)
5744 printk("DAA Coefficients Loaded\n");
5745
5746 j->flags.pstncheck = 0;
5747 return 1;
5748}
5749
5750int ixj_set_tone_off(unsigned short arg, IXJ *j)
5751{
5752 j->tone_off_time = arg;
5753 if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */
5754
5755 return -1;
5756 if (ixj_WriteDSPCommand(arg, j))
5757 return -1;
5758 return 0;
5759}
5760
5761static int ixj_get_tone_on(IXJ *j)
5762{
5763 if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */
5764
5765 return -1;
5766 return 0;
5767}
5768
5769static int ixj_get_tone_off(IXJ *j)
5770{
5771 if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */
5772
5773 return -1;
5774 return 0;
5775}
5776
5777static void ixj_busytone(IXJ *j)
5778{
5779 j->flags.ringback = 0;
5780 j->flags.dialtone = 0;
5781 j->flags.busytone = 1;
5782 ixj_set_tone_on(0x07D0, j);
5783 ixj_set_tone_off(0x07D0, j);
5784 ixj_play_tone(j, 27);
5785}
5786
5787static void ixj_dialtone(IXJ *j)
5788{
5789 j->flags.ringback = 0;
5790 j->flags.dialtone = 1;
5791 j->flags.busytone = 0;
5792 if (j->dsp.low == 0x20) {
5793 return;
5794 } else {
5795 ixj_set_tone_on(0xFFFF, j);
5796 ixj_set_tone_off(0x0000, j);
5797 ixj_play_tone(j, 25);
5798 }
5799}
5800
5801static void ixj_cpt_stop(IXJ *j)
5802{
5803 if(j->tone_state || j->tone_cadence_state)
5804 {
5805 j->flags.dialtone = 0;
5806 j->flags.busytone = 0;
5807 j->flags.ringback = 0;
5808 ixj_set_tone_on(0x0001, j);
5809 ixj_set_tone_off(0x0000, j);
5810 ixj_play_tone(j, 0);
5811 j->tone_state = j->tone_cadence_state = 0;
5812 if (j->cadence_t) {
5813 if (j->cadence_t->ce) {
5814 kfree(j->cadence_t->ce);
5815 }
5816 kfree(j->cadence_t);
5817 j->cadence_t = NULL;
5818 }
5819 }
5820 if (j->play_mode == -1 && j->rec_mode == -1)
5821 idle(j);
5822 if (j->play_mode != -1 && j->dsp.low == 0x20)
5823 ixj_play_start(j);
5824 if (j->rec_mode != -1 && j->dsp.low == 0x20)
5825 ixj_record_start(j);
5826}
5827
5828static void ixj_ringback(IXJ *j)
5829{
5830 j->flags.busytone = 0;
5831 j->flags.dialtone = 0;
5832 j->flags.ringback = 1;
5833 ixj_set_tone_on(0x0FA0, j);
5834 ixj_set_tone_off(0x2EE0, j);
5835 ixj_play_tone(j, 26);
5836}
5837
5838static void ixj_testram(IXJ *j)
5839{
5840 ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
5841}
5842
5843static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
5844{
5845 ixj_cadence *lcp;
5846 IXJ_CADENCE_ELEMENT __user *cep;
5847 IXJ_CADENCE_ELEMENT *lcep;
5848 IXJ_TONE ti;
5849 int err;
5850
5851 lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
5852 if (lcp == NULL)
5853 return -ENOMEM;
5854
5855 err = -EFAULT;
5856 if (copy_from_user(&lcp->elements_used,
5857 &cp->elements_used, sizeof(int)))
5858 goto out;
5859 if (copy_from_user(&lcp->termination,
5860 &cp->termination, sizeof(IXJ_CADENCE_TERM)))
5861 goto out;
5862 if (get_user(cep, &cp->ce))
5863 goto out;
5864
5865 err = -EINVAL;
5866 if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
5867 goto out;
5868
5869 err = -ENOMEM;
5870 lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
5871 if (!lcep)
5872 goto out;
5873
5874 err = -EFAULT;
5875 if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
5876 goto out1;
5877
5878 if (j->cadence_t) {
5879 kfree(j->cadence_t->ce);
5880 kfree(j->cadence_t);
5881 }
5882 lcp->ce = (void *) lcep;
5883 j->cadence_t = lcp;
5884 j->tone_cadence_state = 0;
5885 ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
5886 ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
5887 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
5888 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
5889 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
5890 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
5891 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
5892 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
5893 ixj_init_tone(j, &ti);
5894 }
5895 ixj_play_tone(j, lcp->ce[0].index);
5896 return 1;
5897out1:
5898 kfree(lcep);
5899out:
5900 kfree(lcp);
5901 return err;
5902}
5903
5904static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
5905{
5906 IXJ_FILTER_CADENCE *lcp;
5907 lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
5908 if (lcp == NULL) {
5909 if(ixjdebug & 0x0001) {
5910 printk(KERN_INFO "Could not allocate memory for cadence\n");
5911 }
5912 return -ENOMEM;
5913 }
5914 if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) {
5915 if(ixjdebug & 0x0001) {
5916 printk(KERN_INFO "Could not copy cadence to kernel\n");
5917 }
5918 kfree(lcp);
5919 return -EFAULT;
5920 }
5921 if (lcp->filter > 5) {
5922 if(ixjdebug & 0x0001) {
5923 printk(KERN_INFO "Cadence out of range\n");
5924 }
5925 kfree(lcp);
5926 return -1;
5927 }
5928 j->cadence_f[lcp->filter].state = 0;
5929 j->cadence_f[lcp->filter].enable = lcp->enable;
5930 j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
5931 j->cadence_f[lcp->filter].on1 = lcp->on1;
5932 j->cadence_f[lcp->filter].on1min = 0;
5933 j->cadence_f[lcp->filter].on1max = 0;
5934 j->cadence_f[lcp->filter].off1 = lcp->off1;
5935 j->cadence_f[lcp->filter].off1min = 0;
5936 j->cadence_f[lcp->filter].off1max = 0;
5937 j->cadence_f[lcp->filter].on2 = lcp->on2;
5938 j->cadence_f[lcp->filter].on2min = 0;
5939 j->cadence_f[lcp->filter].on2max = 0;
5940 j->cadence_f[lcp->filter].off2 = lcp->off2;
5941 j->cadence_f[lcp->filter].off2min = 0;
5942 j->cadence_f[lcp->filter].off2max = 0;
5943 j->cadence_f[lcp->filter].on3 = lcp->on3;
5944 j->cadence_f[lcp->filter].on3min = 0;
5945 j->cadence_f[lcp->filter].on3max = 0;
5946 j->cadence_f[lcp->filter].off3 = lcp->off3;
5947 j->cadence_f[lcp->filter].off3min = 0;
5948 j->cadence_f[lcp->filter].off3max = 0;
5949 if(ixjdebug & 0x0002) {
5950 printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
5951 }
5952 kfree(lcp);
5953 return 0;
5954}
5955
5956static void add_caps(IXJ *j)
5957{
5958 j->caps = 0;
5959 j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
5960 strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
5961 j->caplist[j->caps].captype = vendor;
5962 j->caplist[j->caps].handle = j->caps++;
5963 j->caplist[j->caps].captype = device;
5964 switch (j->cardtype) {
5965 case QTI_PHONEJACK:
5966 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
5967 break;
5968 case QTI_LINEJACK:
5969 strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
5970 break;
5971 case QTI_PHONEJACK_LITE:
5972 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
5973 break;
5974 case QTI_PHONEJACK_PCI:
5975 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
5976 break;
5977 case QTI_PHONECARD:
5978 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
5979 break;
5980 }
5981 j->caplist[j->caps].cap = j->cardtype;
5982 j->caplist[j->caps].handle = j->caps++;
5983 strcpy(j->caplist[j->caps].desc, "POTS");
5984 j->caplist[j->caps].captype = port;
5985 j->caplist[j->caps].cap = pots;
5986 j->caplist[j->caps].handle = j->caps++;
5987
5988 /* add devices that can do speaker/mic */
5989 switch (j->cardtype) {
5990 case QTI_PHONEJACK:
5991 case QTI_LINEJACK:
5992 case QTI_PHONEJACK_PCI:
5993 case QTI_PHONECARD:
5994 strcpy(j->caplist[j->caps].desc, "SPEAKER");
5995 j->caplist[j->caps].captype = port;
5996 j->caplist[j->caps].cap = speaker;
5997 j->caplist[j->caps].handle = j->caps++;
5998 default:
5999 break;
6000 }
6001
6002 /* add devices that can do handset */
6003 switch (j->cardtype) {
6004 case QTI_PHONEJACK:
6005 strcpy(j->caplist[j->caps].desc, "HANDSET");
6006 j->caplist[j->caps].captype = port;
6007 j->caplist[j->caps].cap = handset;
6008 j->caplist[j->caps].handle = j->caps++;
6009 break;
6010 default:
6011 break;
6012 }
6013
6014 /* add devices that can do PSTN */
6015 switch (j->cardtype) {
6016 case QTI_LINEJACK:
6017 strcpy(j->caplist[j->caps].desc, "PSTN");
6018 j->caplist[j->caps].captype = port;
6019 j->caplist[j->caps].cap = pstn;
6020 j->caplist[j->caps].handle = j->caps++;
6021 break;
6022 default:
6023 break;
6024 }
6025
6026 /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
6027 strcpy(j->caplist[j->caps].desc, "ULAW");
6028 j->caplist[j->caps].captype = codec;
6029 j->caplist[j->caps].cap = ULAW;
6030 j->caplist[j->caps].handle = j->caps++;
6031
6032 strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
6033 j->caplist[j->caps].captype = codec;
6034 j->caplist[j->caps].cap = LINEAR16;
6035 j->caplist[j->caps].handle = j->caps++;
6036
6037 strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
6038 j->caplist[j->caps].captype = codec;
6039 j->caplist[j->caps].cap = LINEAR8;
6040 j->caplist[j->caps].handle = j->caps++;
6041
6042 strcpy(j->caplist[j->caps].desc, "Windows Sound System");
6043 j->caplist[j->caps].captype = codec;
6044 j->caplist[j->caps].cap = WSS;
6045 j->caplist[j->caps].handle = j->caps++;
6046
6047 /* software ALAW codec, made from ULAW */
6048 strcpy(j->caplist[j->caps].desc, "ALAW");
6049 j->caplist[j->caps].captype = codec;
6050 j->caplist[j->caps].cap = ALAW;
6051 j->caplist[j->caps].handle = j->caps++;
6052
6053 /* version 12 of the 8020 does the following codecs in a broken way */
6054 if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
6055 strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
6056 j->caplist[j->caps].captype = codec;
6057 j->caplist[j->caps].cap = G723_63;
6058 j->caplist[j->caps].handle = j->caps++;
6059
6060 strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
6061 j->caplist[j->caps].captype = codec;
6062 j->caplist[j->caps].cap = G723_53;
6063 j->caplist[j->caps].handle = j->caps++;
6064
6065 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
6066 j->caplist[j->caps].captype = codec;
6067 j->caplist[j->caps].cap = TS48;
6068 j->caplist[j->caps].handle = j->caps++;
6069
6070 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
6071 j->caplist[j->caps].captype = codec;
6072 j->caplist[j->caps].cap = TS41;
6073 j->caplist[j->caps].handle = j->caps++;
6074 }
6075
6076 /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6077 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
6078 strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
6079 j->caplist[j->caps].captype = codec;
6080 j->caplist[j->caps].cap = TS85;
6081 j->caplist[j->caps].handle = j->caps++;
6082 }
6083
6084 /* 8021 chips can do G728 */
6085 if (j->dsp.low == 0x21) {
6086 strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
6087 j->caplist[j->caps].captype = codec;
6088 j->caplist[j->caps].cap = G728;
6089 j->caplist[j->caps].handle = j->caps++;
6090 }
6091
6092 /* 8021/8022 chips can do G729 if loaded */
6093 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6094 strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
6095 j->caplist[j->caps].captype = codec;
6096 j->caplist[j->caps].cap = G729;
6097 j->caplist[j->caps].handle = j->caps++;
6098 }
6099 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6100 strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
6101 j->caplist[j->caps].captype = codec;
6102 j->caplist[j->caps].cap = G729B;
6103 j->caplist[j->caps].handle = j->caps++;
6104 }
6105}
6106
6107static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
6108{
6109 int cnt;
6110 int retval = 0;
6111 for (cnt = 0; cnt < j->caps; cnt++) {
6112 if (pcreq->captype == j->caplist[cnt].captype
6113 && pcreq->cap == j->caplist[cnt].cap) {
6114 retval = 1;
6115 break;
6116 }
6117 }
6118 return retval;
6119}
6120
6121static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
6122{
6123 IXJ_TONE ti;
6124 IXJ_FILTER jf;
6125 IXJ_FILTER_RAW jfr;
6126 void __user *argp = (void __user *)arg;
6127
6128 unsigned int raise, mant;
6129 unsigned int minor = iminor(inode);
6130 int board = NUM(inode);
6131
6132 IXJ *j = get_ixj(NUM(inode));
6133
6134 int retval = 0;
6135
6136 /*
6137 * Set up locks to ensure that only one process is talking to the DSP at a time.
6138 * This is necessary to keep the DSP from locking up.
6139 */
6140 while(test_and_set_bit(board, (void *)&j->busyflags) != 0) {
6141 set_current_state(TASK_INTERRUPTIBLE);
6142 schedule_timeout(1);
6143 }
6144 if (ixjdebug & 0x0040)
6145 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6146 if (minor >= IXJMAX) {
6147 clear_bit(board, &j->busyflags);
6148 return -ENODEV;
6149 }
6150 /*
6151 * Check ioctls only root can use.
6152 */
6153 if (!capable(CAP_SYS_ADMIN)) {
6154 switch (cmd) {
6155 case IXJCTL_TESTRAM:
6156 case IXJCTL_HZ:
6157 retval = -EPERM;
6158 }
6159 }
6160 switch (cmd) {
6161 case IXJCTL_TESTRAM:
6162 ixj_testram(j);
6163 retval = (j->ssr.high << 8) + j->ssr.low;
6164 break;
6165 case IXJCTL_CARDTYPE:
6166 retval = j->cardtype;
6167 break;
6168 case IXJCTL_SERIAL:
6169 retval = j->serial;
6170 break;
6171 case IXJCTL_VERSION:
Domen Puncerfba478b2005-05-05 16:16:13 -07006172 {
6173 char arg_str[100];
6174 snprintf(arg_str, sizeof(arg_str),
6175 "\nDriver version %i.%i.%i", IXJ_VER_MAJOR,
6176 IXJ_VER_MINOR, IXJ_BLD_VER);
6177 if (copy_to_user(argp, arg_str, strlen(arg_str)))
6178 retval = -EFAULT;
6179 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07006180 break;
6181 case PHONE_RING_CADENCE:
6182 j->ring_cadence = arg;
6183 break;
6184 case IXJCTL_CIDCW:
6185 if(arg) {
6186 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6187 retval = -EFAULT;
6188 break;
6189 }
6190 } else {
6191 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6192 }
6193 ixj_write_cidcw(j);
6194 break;
6195 /* Binary compatbility */
6196 case OLD_PHONE_RING_START:
6197 arg = 0;
6198 /* Fall through */
6199 case PHONE_RING_START:
6200 if(arg) {
6201 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6202 retval = -EFAULT;
6203 break;
6204 }
6205 ixj_write_cid(j);
6206 } else {
6207 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6208 }
6209 ixj_ring_start(j);
6210 break;
6211 case PHONE_RING_STOP:
6212 j->flags.cringing = 0;
6213 if(j->cadence_f[5].enable) {
6214 j->cadence_f[5].state = 0;
6215 }
6216 ixj_ring_off(j);
6217 break;
6218 case PHONE_RING:
6219 retval = ixj_ring(j);
6220 break;
6221 case PHONE_EXCEPTION:
6222 retval = j->ex.bytes;
6223 if(j->ex.bits.flash) {
6224 j->flash_end = 0;
6225 j->ex.bits.flash = 0;
6226 }
6227 j->ex.bits.pstn_ring = 0;
6228 j->ex.bits.caller_id = 0;
6229 j->ex.bits.pstn_wink = 0;
6230 j->ex.bits.f0 = 0;
6231 j->ex.bits.f1 = 0;
6232 j->ex.bits.f2 = 0;
6233 j->ex.bits.f3 = 0;
6234 j->ex.bits.fc0 = 0;
6235 j->ex.bits.fc1 = 0;
6236 j->ex.bits.fc2 = 0;
6237 j->ex.bits.fc3 = 0;
6238 j->ex.bits.reserved = 0;
6239 break;
6240 case PHONE_HOOKSTATE:
6241 j->ex.bits.hookstate = 0;
6242 retval = j->hookstate; //j->r_hook;
6243 break;
6244 case IXJCTL_SET_LED:
6245 LED_SetState(arg, j);
6246 break;
6247 case PHONE_FRAME:
6248 retval = set_base_frame(j, arg);
6249 break;
6250 case PHONE_REC_CODEC:
6251 retval = set_rec_codec(j, arg);
6252 break;
6253 case PHONE_VAD:
6254 ixj_vad(j, arg);
6255 break;
6256 case PHONE_REC_START:
6257 ixj_record_start(j);
6258 break;
6259 case PHONE_REC_STOP:
6260 ixj_record_stop(j);
6261 break;
6262 case PHONE_REC_DEPTH:
6263 set_rec_depth(j, arg);
6264 break;
6265 case PHONE_REC_VOLUME:
6266 if(arg == -1) {
6267 retval = get_rec_volume(j);
6268 }
6269 else {
6270 set_rec_volume(j, arg);
6271 retval = arg;
6272 }
6273 break;
6274 case PHONE_REC_VOLUME_LINEAR:
6275 if(arg == -1) {
6276 retval = get_rec_volume_linear(j);
6277 }
6278 else {
6279 set_rec_volume_linear(j, arg);
6280 retval = arg;
6281 }
6282 break;
6283 case IXJCTL_DTMF_PRESCALE:
6284 if(arg == -1) {
6285 retval = get_dtmf_prescale(j);
6286 }
6287 else {
6288 set_dtmf_prescale(j, arg);
6289 retval = arg;
6290 }
6291 break;
6292 case PHONE_REC_LEVEL:
6293 retval = get_rec_level(j);
6294 break;
6295 case IXJCTL_SC_RXG:
6296 retval = ixj_siadc(j, arg);
6297 break;
6298 case IXJCTL_SC_TXG:
6299 retval = ixj_sidac(j, arg);
6300 break;
6301 case IXJCTL_AEC_START:
6302 ixj_aec_start(j, arg);
6303 break;
6304 case IXJCTL_AEC_STOP:
6305 aec_stop(j);
6306 break;
6307 case IXJCTL_AEC_GET_LEVEL:
6308 retval = j->aec_level;
6309 break;
6310 case PHONE_PLAY_CODEC:
6311 retval = set_play_codec(j, arg);
6312 break;
6313 case PHONE_PLAY_START:
6314 retval = ixj_play_start(j);
6315 break;
6316 case PHONE_PLAY_STOP:
6317 ixj_play_stop(j);
6318 break;
6319 case PHONE_PLAY_DEPTH:
6320 set_play_depth(j, arg);
6321 break;
6322 case PHONE_PLAY_VOLUME:
6323 if(arg == -1) {
6324 retval = get_play_volume(j);
6325 }
6326 else {
6327 set_play_volume(j, arg);
6328 retval = arg;
6329 }
6330 break;
6331 case PHONE_PLAY_VOLUME_LINEAR:
6332 if(arg == -1) {
6333 retval = get_play_volume_linear(j);
6334 }
6335 else {
6336 set_play_volume_linear(j, arg);
6337 retval = arg;
6338 }
6339 break;
6340 case PHONE_PLAY_LEVEL:
6341 retval = get_play_level(j);
6342 break;
6343 case IXJCTL_DSP_TYPE:
6344 retval = (j->dsp.high << 8) + j->dsp.low;
6345 break;
6346 case IXJCTL_DSP_VERSION:
6347 retval = (j->ver.high << 8) + j->ver.low;
6348 break;
6349 case IXJCTL_HZ:
6350 hertz = arg;
6351 break;
6352 case IXJCTL_RATE:
6353 if (arg > hertz)
6354 retval = -1;
6355 else
6356 samplerate = arg;
6357 break;
6358 case IXJCTL_DRYBUFFER_READ:
6359 put_user(j->drybuffer, (unsigned long __user *) argp);
6360 break;
6361 case IXJCTL_DRYBUFFER_CLEAR:
6362 j->drybuffer = 0;
6363 break;
6364 case IXJCTL_FRAMES_READ:
6365 put_user(j->framesread, (unsigned long __user *) argp);
6366 break;
6367 case IXJCTL_FRAMES_WRITTEN:
6368 put_user(j->frameswritten, (unsigned long __user *) argp);
6369 break;
6370 case IXJCTL_READ_WAIT:
6371 put_user(j->read_wait, (unsigned long __user *) argp);
6372 break;
6373 case IXJCTL_WRITE_WAIT:
6374 put_user(j->write_wait, (unsigned long __user *) argp);
6375 break;
6376 case PHONE_MAXRINGS:
6377 j->maxrings = arg;
6378 break;
6379 case PHONE_SET_TONE_ON_TIME:
6380 ixj_set_tone_on(arg, j);
6381 break;
6382 case PHONE_SET_TONE_OFF_TIME:
6383 ixj_set_tone_off(arg, j);
6384 break;
6385 case PHONE_GET_TONE_ON_TIME:
6386 if (ixj_get_tone_on(j)) {
6387 retval = -1;
6388 } else {
6389 retval = (j->ssr.high << 8) + j->ssr.low;
6390 }
6391 break;
6392 case PHONE_GET_TONE_OFF_TIME:
6393 if (ixj_get_tone_off(j)) {
6394 retval = -1;
6395 } else {
6396 retval = (j->ssr.high << 8) + j->ssr.low;
6397 }
6398 break;
6399 case PHONE_PLAY_TONE:
6400 if (!j->tone_state)
6401 retval = ixj_play_tone(j, arg);
6402 else
6403 retval = -1;
6404 break;
6405 case PHONE_GET_TONE_STATE:
6406 retval = j->tone_state;
6407 break;
6408 case PHONE_DTMF_READY:
6409 retval = j->ex.bits.dtmf_ready;
6410 break;
6411 case PHONE_GET_DTMF:
6412 if (ixj_hookstate(j)) {
6413 if (j->dtmf_rp != j->dtmf_wp) {
6414 retval = j->dtmfbuffer[j->dtmf_rp];
6415 j->dtmf_rp++;
6416 if (j->dtmf_rp == 79)
6417 j->dtmf_rp = 0;
6418 if (j->dtmf_rp == j->dtmf_wp) {
6419 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6420 }
6421 }
6422 }
6423 break;
6424 case PHONE_GET_DTMF_ASCII:
6425 if (ixj_hookstate(j)) {
6426 if (j->dtmf_rp != j->dtmf_wp) {
6427 switch (j->dtmfbuffer[j->dtmf_rp]) {
6428 case 10:
6429 retval = 42; /* '*'; */
6430
6431 break;
6432 case 11:
6433 retval = 48; /*'0'; */
6434
6435 break;
6436 case 12:
6437 retval = 35; /*'#'; */
6438
6439 break;
6440 case 28:
6441 retval = 65; /*'A'; */
6442
6443 break;
6444 case 29:
6445 retval = 66; /*'B'; */
6446
6447 break;
6448 case 30:
6449 retval = 67; /*'C'; */
6450
6451 break;
6452 case 31:
6453 retval = 68; /*'D'; */
6454
6455 break;
6456 default:
6457 retval = 48 + j->dtmfbuffer[j->dtmf_rp];
6458 break;
6459 }
6460 j->dtmf_rp++;
6461 if (j->dtmf_rp == 79)
6462 j->dtmf_rp = 0;
6463 if(j->dtmf_rp == j->dtmf_wp)
6464 {
6465 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6466 }
6467 }
6468 }
6469 break;
6470 case PHONE_DTMF_OOB:
6471 j->flags.dtmf_oob = arg;
6472 break;
6473 case PHONE_DIALTONE:
6474 ixj_dialtone(j);
6475 break;
6476 case PHONE_BUSY:
6477 ixj_busytone(j);
6478 break;
6479 case PHONE_RINGBACK:
6480 ixj_ringback(j);
6481 break;
6482 case PHONE_WINK:
6483 if(j->cardtype == QTI_PHONEJACK)
6484 retval = -1;
6485 else
6486 retval = ixj_wink(j);
6487 break;
6488 case PHONE_CPT_STOP:
6489 ixj_cpt_stop(j);
6490 break;
6491 case PHONE_QUERY_CODEC:
6492 {
6493 struct phone_codec_data pd;
6494 int val;
6495 int proto_size[] = {
6496 -1,
6497 12, 10, 16, 9, 8, 48, 5,
6498 40, 40, 80, 40, 40, 6
6499 };
6500 if(copy_from_user(&pd, argp, sizeof(pd))) {
6501 retval = -EFAULT;
6502 break;
6503 }
6504 if(pd.type<1 || pd.type>13) {
6505 retval = -EPROTONOSUPPORT;
6506 break;
6507 }
6508 if(pd.type<G729)
6509 val=proto_size[pd.type];
6510 else switch(j->baseframe.low)
6511 {
6512 case 0xA0:val=2*proto_size[pd.type];break;
6513 case 0x50:val=proto_size[pd.type];break;
6514 default:val=proto_size[pd.type]*3;break;
6515 }
6516 pd.buf_min=pd.buf_max=pd.buf_opt=val;
6517 if(copy_to_user(argp, &pd, sizeof(pd)))
6518 retval = -EFAULT;
6519 break;
6520 }
6521 case IXJCTL_DSP_IDLE:
6522 idle(j);
6523 break;
6524 case IXJCTL_MIXER:
6525 if ((arg & 0xff) == 0xff)
6526 retval = ixj_get_mixer(arg, j);
6527 else
6528 ixj_mixer(arg, j);
6529 break;
6530 case IXJCTL_DAA_COEFF_SET:
6531 switch (arg) {
6532 case DAA_US:
6533 DAA_Coeff_US(j);
6534 retval = ixj_daa_write(j);
6535 break;
6536 case DAA_UK:
6537 DAA_Coeff_UK(j);
6538 retval = ixj_daa_write(j);
6539 break;
6540 case DAA_FRANCE:
6541 DAA_Coeff_France(j);
6542 retval = ixj_daa_write(j);
6543 break;
6544 case DAA_GERMANY:
6545 DAA_Coeff_Germany(j);
6546 retval = ixj_daa_write(j);
6547 break;
6548 case DAA_AUSTRALIA:
6549 DAA_Coeff_Australia(j);
6550 retval = ixj_daa_write(j);
6551 break;
6552 case DAA_JAPAN:
6553 DAA_Coeff_Japan(j);
6554 retval = ixj_daa_write(j);
6555 break;
6556 default:
6557 retval = 1;
6558 break;
6559 }
6560 break;
6561 case IXJCTL_DAA_AGAIN:
6562 ixj_daa_cr4(j, arg | 0x02);
6563 break;
6564 case IXJCTL_PSTN_LINETEST:
6565 retval = ixj_linetest(j);
6566 break;
6567 case IXJCTL_VMWI:
6568 ixj_write_vmwi(j, arg);
6569 break;
6570 case IXJCTL_CID:
6571 if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID)))
6572 retval = -EFAULT;
6573 j->ex.bits.caller_id = 0;
6574 break;
6575 case IXJCTL_WINK_DURATION:
6576 j->winktime = arg;
6577 break;
6578 case IXJCTL_PORT:
6579 if (arg)
6580 retval = ixj_set_port(j, arg);
6581 else
6582 retval = j->port;
6583 break;
6584 case IXJCTL_POTS_PSTN:
6585 retval = ixj_set_pots(j, arg);
6586 break;
6587 case PHONE_CAPABILITIES:
6588 add_caps(j);
6589 retval = j->caps;
6590 break;
6591 case PHONE_CAPABILITIES_LIST:
6592 add_caps(j);
6593 if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps))
6594 retval = -EFAULT;
6595 break;
6596 case PHONE_CAPABILITIES_CHECK:
6597 {
6598 struct phone_capability cap;
6599 if (copy_from_user(&cap, argp, sizeof(cap)))
6600 retval = -EFAULT;
6601 else {
6602 add_caps(j);
6603 retval = capabilities_check(j, &cap);
6604 }
6605 }
6606 break;
6607 case PHONE_PSTN_SET_STATE:
6608 daa_set_mode(j, arg);
6609 break;
6610 case PHONE_PSTN_GET_STATE:
6611 retval = j->daa_mode;
6612 j->ex.bits.pstn_ring = 0;
6613 break;
6614 case IXJCTL_SET_FILTER:
6615 if (copy_from_user(&jf, argp, sizeof(jf)))
6616 retval = -EFAULT;
6617 retval = ixj_init_filter(j, &jf);
6618 break;
6619 case IXJCTL_SET_FILTER_RAW:
6620 if (copy_from_user(&jfr, argp, sizeof(jfr)))
6621 retval = -EFAULT;
6622 else
6623 retval = ixj_init_filter_raw(j, &jfr);
6624 break;
6625 case IXJCTL_GET_FILTER_HIST:
6626 if(arg<0||arg>3)
6627 retval = -EINVAL;
6628 else
6629 retval = j->filter_hist[arg];
6630 break;
6631 case IXJCTL_INIT_TONE:
6632 if (copy_from_user(&ti, argp, sizeof(ti)))
6633 retval = -EFAULT;
6634 else
6635 retval = ixj_init_tone(j, &ti);
6636 break;
6637 case IXJCTL_TONE_CADENCE:
6638 retval = ixj_build_cadence(j, argp);
6639 break;
6640 case IXJCTL_FILTER_CADENCE:
6641 retval = ixj_build_filter_cadence(j, argp);
6642 break;
6643 case IXJCTL_SIGCTL:
6644 if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
6645 retval = -EFAULT;
6646 break;
6647 }
6648 j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
6649 if(j->sigdef.event < 33) {
6650 raise = 1;
6651 for(mant = 0; mant < j->sigdef.event; mant++){
6652 raise *= 2;
6653 }
6654 if(j->sigdef.signal)
6655 j->ex_sig.bytes |= raise;
6656 else
6657 j->ex_sig.bytes &= (raise^0xffff);
6658 }
6659 break;
6660 case IXJCTL_INTERCOM_STOP:
6661 if(arg < 0 || arg >= IXJMAX)
6662 return -EINVAL;
6663 j->intercom = -1;
6664 ixj_record_stop(j);
6665 ixj_play_stop(j);
6666 idle(j);
6667 get_ixj(arg)->intercom = -1;
6668 ixj_record_stop(get_ixj(arg));
6669 ixj_play_stop(get_ixj(arg));
6670 idle(get_ixj(arg));
6671 break;
6672 case IXJCTL_INTERCOM_START:
6673 if(arg < 0 || arg >= IXJMAX)
6674 return -EINVAL;
6675 j->intercom = arg;
6676 ixj_record_start(j);
6677 ixj_play_start(j);
6678 get_ixj(arg)->intercom = board;
6679 ixj_play_start(get_ixj(arg));
6680 ixj_record_start(get_ixj(arg));
6681 break;
6682 }
6683 if (ixjdebug & 0x0040)
6684 printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6685 clear_bit(board, &j->busyflags);
6686 return retval;
6687}
6688
6689static int ixj_fasync(int fd, struct file *file_p, int mode)
6690{
6691 IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
6692
6693 return fasync_helper(fd, file_p, mode, &j->async_queue);
6694}
6695
6696static struct file_operations ixj_fops =
6697{
6698 .owner = THIS_MODULE,
6699 .read = ixj_enhanced_read,
6700 .write = ixj_enhanced_write,
6701 .poll = ixj_poll,
6702 .ioctl = ixj_ioctl,
6703 .release = ixj_release,
6704 .fasync = ixj_fasync
6705};
6706
6707static int ixj_linetest(IXJ *j)
6708{
6709 unsigned long jifwait;
6710
6711 j->flags.pstncheck = 1; /* Testing */
6712 j->flags.pstn_present = 0; /* Assume the line is not there */
6713
6714 daa_int_read(j); /*Clear DAA Interrupt flags */
6715 /* */
6716 /* Hold all relays in the normally de-energized position. */
6717 /* */
6718
6719 j->pld_slicw.bits.rly1 = 0;
6720 j->pld_slicw.bits.rly2 = 0;
6721 j->pld_slicw.bits.rly3 = 0;
6722 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6723 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6724
6725 outb_p(j->pld_scrw.byte, j->XILINXbase);
6726 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6727 if (j->pld_slicr.bits.potspstn) {
6728 j->flags.pots_pstn = 1;
6729 j->flags.pots_correct = 0;
6730 LED_SetState(0x4, j);
6731 } else {
6732 j->flags.pots_pstn = 0;
6733 j->pld_slicw.bits.rly1 = 0;
6734 j->pld_slicw.bits.rly2 = 0;
6735 j->pld_slicw.bits.rly3 = 1;
6736 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6737 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6738
6739 outb_p(j->pld_scrw.byte, j->XILINXbase);
6740 daa_set_mode(j, SOP_PU_CONVERSATION);
6741 jifwait = jiffies + hertz;
6742 while (time_before(jiffies, jifwait)) {
6743 set_current_state(TASK_INTERRUPTIBLE);
6744 schedule_timeout(1);
6745 }
6746 daa_int_read(j);
6747 daa_set_mode(j, SOP_PU_RESET);
6748 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6749 j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */
6750 LED_SetState(0x4, j);
6751 j->pld_slicw.bits.rly3 = 0;
6752 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6753 } else {
6754 j->flags.pots_correct = 1;
6755 LED_SetState(0x8, j);
6756 j->pld_slicw.bits.rly1 = 1;
6757 j->pld_slicw.bits.rly2 = 0;
6758 j->pld_slicw.bits.rly3 = 0;
6759 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6760 }
6761 }
6762 j->pld_slicw.bits.rly3 = 0;
6763 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6764 daa_set_mode(j, SOP_PU_CONVERSATION);
6765 jifwait = jiffies + hertz;
6766 while (time_before(jiffies, jifwait)) {
6767 set_current_state(TASK_INTERRUPTIBLE);
6768 schedule_timeout(1);
6769 }
6770 daa_int_read(j);
6771 daa_set_mode(j, SOP_PU_RESET);
6772 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6773 j->pstn_sleeptil = jiffies + (hertz / 4);
6774 j->flags.pstn_present = 1;
6775 } else {
6776 j->flags.pstn_present = 0;
6777 }
6778 if (j->flags.pstn_present) {
6779 if (j->flags.pots_correct) {
6780 LED_SetState(0xA, j);
6781 } else {
6782 LED_SetState(0x6, j);
6783 }
6784 } else {
6785 if (j->flags.pots_correct) {
6786 LED_SetState(0x9, j);
6787 } else {
6788 LED_SetState(0x5, j);
6789 }
6790 }
6791 j->flags.pstncheck = 0; /* Testing */
6792 return j->flags.pstn_present;
6793}
6794
6795static int ixj_selfprobe(IXJ *j)
6796{
6797 unsigned short cmd;
6798 unsigned long jif;
6799 int cnt;
6800 BYTES bytes;
6801
6802 init_waitqueue_head(&j->poll_q);
6803 init_waitqueue_head(&j->read_q);
6804 init_waitqueue_head(&j->write_q);
6805
6806 while(atomic_read(&j->DSPWrite) > 0)
6807 atomic_dec(&j->DSPWrite);
6808 if (ixjdebug & 0x0002)
6809 printk(KERN_INFO "Write IDLE to Software Control Register\n");
6810 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
6811
6812 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
6813 return -1;
6814/* The read values of the SSR should be 0x00 for the IDLE command */
6815 if (j->ssr.low || j->ssr.high)
6816 return -1;
6817 if (ixjdebug & 0x0002)
6818 printk(KERN_INFO "Get Device ID Code\n");
6819 if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */
6820 return -1;
6821 j->dsp.low = j->ssr.low;
6822 j->dsp.high = j->ssr.high;
6823 if (ixjdebug & 0x0002)
6824 printk(KERN_INFO "Get Device Version Code\n");
6825 if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */
6826 return -1;
6827 j->ver.low = j->ssr.low;
6828 j->ver.high = j->ssr.high;
6829 if (!j->cardtype) {
6830 if (j->dsp.low == 0x21) {
6831 bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
6832 outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
6833/* Test for Internet LineJACK or Internet PhoneJACK Lite */
6834 bytes.low = inb_p(j->XILINXbase + 0x02);
6835 if (bytes.low == bytes.high) /* Register is read only on */
6836 /* Internet PhoneJack Lite */
6837 {
6838 j->cardtype = QTI_PHONEJACK_LITE;
6839 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6840 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6841 return -1;
6842 }
6843 j->pld_slicw.pcib.e1 = 1;
6844 outb_p(j->pld_slicw.byte, j->XILINXbase);
6845 } else {
6846 j->cardtype = QTI_LINEJACK;
6847
6848 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6849 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6850 return -1;
6851 }
6852 }
6853 } else if (j->dsp.low == 0x22) {
6854 j->cardtype = QTI_PHONEJACK_PCI;
6855 request_region(j->XILINXbase, 4, "ixj control");
6856 j->pld_slicw.pcib.e1 = 1;
6857 outb_p(j->pld_slicw.byte, j->XILINXbase);
6858 } else
6859 j->cardtype = QTI_PHONEJACK;
6860 } else {
6861 switch (j->cardtype) {
6862 case QTI_PHONEJACK:
6863 if (!j->dsp.low != 0x20) {
6864 j->dsp.high = 0x80;
6865 j->dsp.low = 0x20;
6866 ixj_WriteDSPCommand(0x3800, j);
6867 j->ver.low = j->ssr.low;
6868 j->ver.high = j->ssr.high;
6869 }
6870 break;
6871 case QTI_LINEJACK:
6872 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6873 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6874 return -1;
6875 }
6876 break;
6877 case QTI_PHONEJACK_LITE:
6878 case QTI_PHONEJACK_PCI:
6879 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6880 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6881 return -1;
6882 }
6883 j->pld_slicw.pcib.e1 = 1;
6884 outb_p(j->pld_slicw.byte, j->XILINXbase);
6885 break;
6886 case QTI_PHONECARD:
6887 break;
6888 }
6889 }
6890 if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
6891 if (ixjdebug & 0x0002)
6892 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6893 if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */
6894 return -1;
6895 if (ixjdebug & 0x0002)
6896 printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
6897 if (j->cardtype == QTI_PHONEJACK) {
6898 cmd = 0x9FF2;
6899 } else {
6900 cmd = 0x9FF5;
6901 }
6902 if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */
6903 return -1;
6904 } else {
6905 if (set_base_frame(j, 30) != 30)
6906 return -1;
6907 if (ixjdebug & 0x0002)
6908 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6909 if (j->cardtype == QTI_PHONECARD) {
6910 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6911 return -1;
6912 }
6913 if (j->cardtype == QTI_LINEJACK) {
6914 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6915 return -1;
6916 if (ixjdebug & 0x0002)
6917 printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
6918 j->pld_clock.byte = 0;
6919 outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
6920 }
6921 }
6922
6923 if (j->dsp.low == 0x20) {
6924 if (ixjdebug & 0x0002)
6925 printk(KERN_INFO "Configure GPIO pins\n");
6926 j->gpio.bytes.high = 0x09;
6927/* bytes.low = 0xEF; 0xF7 */
6928 j->gpio.bits.gpio1 = 1;
6929 j->gpio.bits.gpio2 = 1;
6930 j->gpio.bits.gpio3 = 0;
6931 j->gpio.bits.gpio4 = 1;
6932 j->gpio.bits.gpio5 = 1;
6933 j->gpio.bits.gpio6 = 1;
6934 j->gpio.bits.gpio7 = 1;
6935 ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */
6936 if (ixjdebug & 0x0002)
6937 printk(KERN_INFO "Enable SLIC\n");
6938 j->gpio.bytes.high = 0x0B;
6939 j->gpio.bytes.low = 0x00;
6940 j->gpio.bits.gpio1 = 0;
6941 j->gpio.bits.gpio2 = 1;
6942 j->gpio.bits.gpio5 = 0;
6943 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */
6944 j->port = PORT_POTS;
6945 } else {
6946 if (j->cardtype == QTI_LINEJACK) {
6947 LED_SetState(0x1, j);
6948 jif = jiffies + (hertz / 10);
6949 while (time_before(jiffies, jif)) {
6950 set_current_state(TASK_INTERRUPTIBLE);
6951 schedule_timeout(1);
6952 }
6953 LED_SetState(0x2, j);
6954 jif = jiffies + (hertz / 10);
6955 while (time_before(jiffies, jif)) {
6956 set_current_state(TASK_INTERRUPTIBLE);
6957 schedule_timeout(1);
6958 }
6959 LED_SetState(0x4, j);
6960 jif = jiffies + (hertz / 10);
6961 while (time_before(jiffies, jif)) {
6962 set_current_state(TASK_INTERRUPTIBLE);
6963 schedule_timeout(1);
6964 }
6965 LED_SetState(0x8, j);
6966 jif = jiffies + (hertz / 10);
6967 while (time_before(jiffies, jif)) {
6968 set_current_state(TASK_INTERRUPTIBLE);
6969 schedule_timeout(1);
6970 }
6971 LED_SetState(0x0, j);
6972 daa_get_version(j);
6973 if (ixjdebug & 0x0002)
6974 printk("Loading DAA Coefficients\n");
6975 DAA_Coeff_US(j);
6976 if (!ixj_daa_write(j)) {
6977 printk("DAA write failed on board %d\n", j->board);
6978 return -1;
6979 }
6980 if(!ixj_daa_cid_reset(j)) {
6981 printk("DAA CID reset failed on board %d\n", j->board);
6982 return -1;
6983 }
6984 j->flags.pots_correct = 0;
6985 j->flags.pstn_present = 0;
6986 ixj_linetest(j);
6987 if (j->flags.pots_correct) {
6988 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6989
6990 outb_p(j->pld_scrw.byte, j->XILINXbase);
6991 j->pld_slicw.bits.rly1 = 1;
6992 j->pld_slicw.bits.spken = 1;
6993 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6994 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
6995/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
6996 j->port = PORT_POTS;
6997 }
6998 ixj_set_port(j, PORT_PSTN);
6999 ixj_set_pots(j, 1);
7000 if (ixjdebug & 0x0002)
7001 printk(KERN_INFO "Enable Mixer\n");
7002 ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */
7003 ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */
7004
7005 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
7006 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
7007
7008 ixj_mixer(0x0480, j); /*FM Left mute */
7009 ixj_mixer(0x0580, j); /*FM Right mute */
7010
7011 ixj_mixer(0x0680, j); /*CD Left mute */
7012 ixj_mixer(0x0780, j); /*CD Right mute */
7013
7014 ixj_mixer(0x0880, j); /*Line Left mute */
7015 ixj_mixer(0x0980, j); /*Line Right mute */
7016
7017 ixj_mixer(0x0A80, j); /*Aux left mute */
7018 ixj_mixer(0x0B80, j); /*Aux right mute */
7019
7020 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
7021 ixj_mixer(0x0D80, j); /*Mono2 mute */
7022
7023 ixj_mixer(0x0E80, j); /*Mic mute */
7024
7025 ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */
7026
7027 ixj_mixer(0x1000, j); /*Voice Left and Right out only */
7028 ixj_mixer(0x110C, j);
7029
7030
7031 ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */
7032 ixj_mixer(0x1401, j);
7033
7034 ixj_mixer(0x1300, j); /*Mono1 switch on mixer right */
7035 ixj_mixer(0x1501, j);
7036
7037 ixj_mixer(0x1700, j); /*Clock select */
7038
7039 ixj_mixer(0x1800, j); /*ADC input from mixer */
7040
7041 ixj_mixer(0x1901, j); /*Mic gain 30db */
7042
7043 if (ixjdebug & 0x0002)
7044 printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
7045 j->cadence_f[4].state = 0;
7046 j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */
7047 j->cadence_f[4].off1 = 0;
7048 j->cadence_f[4].on2 = 0;
7049 j->cadence_f[4].off2 = 0;
7050 j->cadence_f[4].on3 = 0;
7051 j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */
7052 j->pstn_last_rmr = jiffies;
7053
7054 } else {
7055 if (j->cardtype == QTI_PHONECARD) {
7056 ixj_WriteDSPCommand(0xCF07, j);
7057 ixj_WriteDSPCommand(0x00B0, j);
7058 ixj_set_port(j, PORT_SPEAKER);
7059 } else {
7060 ixj_set_port(j, PORT_POTS);
7061 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7062/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7063 }
7064 }
7065 }
7066
7067 j->intercom = -1;
7068 j->framesread = j->frameswritten = 0;
7069 j->read_wait = j->write_wait = 0;
7070 j->rxreadycheck = j->txreadycheck = 0;
7071
7072 /* initialise the DTMF prescale to a sensible value */
7073 if (j->cardtype == QTI_LINEJACK) {
7074 set_dtmf_prescale(j, 0x10);
7075 } else {
7076 set_dtmf_prescale(j, 0x40);
7077 }
7078 set_play_volume(j, 0x100);
7079 set_rec_volume(j, 0x100);
7080
7081 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
7082 return -1;
7083/* The read values of the SSR should be 0x00 for the IDLE command */
7084 if (j->ssr.low || j->ssr.high)
7085 return -1;
7086
7087 if (ixjdebug & 0x0002)
7088 printk(KERN_INFO "Enable Line Monitor\n");
7089
7090 if (ixjdebug & 0x0002)
7091 printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
7092
7093 if (ixj_WriteDSPCommand(0x7E01, j)) /* Asynchronous Line Monitor */
7094 return -1;
7095
7096 if (ixjdebug & 0x002)
7097 printk(KERN_INFO "Enable DTMF Detectors\n");
7098
7099 if (ixj_WriteDSPCommand(0x5151, j)) /* Enable DTMF detection */
7100 return -1;
7101
7102 if (ixj_WriteDSPCommand(0x6E01, j)) /* Set Asyncronous Tone Generation */
7103 return -1;
7104
7105 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
7106
7107 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
7108
7109 j->ex.bits.dtmf_ready = 0;
7110 j->dtmf_state = 0;
7111 j->dtmf_wp = j->dtmf_rp = 0;
7112 j->rec_mode = j->play_mode = -1;
7113 j->flags.ringing = 0;
7114 j->maxrings = MAXRINGS;
7115 j->ring_cadence = USA_RING_CADENCE;
7116 j->drybuffer = 0;
7117 j->winktime = 320;
7118 j->flags.dtmf_oob = 0;
7119 for (cnt = 0; cnt < 4; cnt++)
7120 j->cadence_f[cnt].enable = 0;
7121 /* must be a device on the specified address */
7122 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
7123
7124 /* Set up the default signals for events */
7125 for (cnt = 0; cnt < 35; cnt++)
7126 j->ixj_signals[cnt] = SIGIO;
7127
7128 /* Set the excetion signal enable flags */
7129 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
7130 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 =
7131 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;
7132#ifdef IXJ_DYN_ALLOC
7133 j->fskdata = NULL;
7134#endif
7135 j->fskdcnt = 0;
7136 j->cidcw_wait = 0;
7137
7138 /* Register with the Telephony for Linux subsystem */
7139 j->p.f_op = &ixj_fops;
7140 j->p.open = ixj_open;
7141 j->p.board = j->board;
7142 phone_register_device(&j->p, PHONE_UNIT_ANY);
7143
7144 ixj_init_timer(j);
7145 ixj_add_timer(j);
7146 return 0;
7147}
7148
7149/*
7150 * Exported service for pcmcia card handling
7151 */
7152
7153IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
7154{
7155 IXJ *j = ixj_alloc();
7156
7157 j->board = 0;
7158
7159 j->DSPbase = dsp;
7160 j->XILINXbase = xilinx;
7161 j->cardtype = QTI_PHONECARD;
7162 ixj_selfprobe(j);
7163 return j;
7164}
7165
7166EXPORT_SYMBOL(ixj_pcmcia_probe); /* Fpr PCMCIA */
7167
7168static int ixj_get_status_proc(char *buf)
7169{
7170 int len;
7171 int cnt;
7172 IXJ *j;
7173 len = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07007174 len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
7175 len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
7176 len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
7177 len += sprintf(buf + len, "\nUsing old telephony API");
7178 len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
7179
7180 for (cnt = 0; cnt < IXJMAX; cnt++) {
7181 j = get_ixj(cnt);
7182 if(j==NULL)
7183 continue;
7184 if (j->DSPbase) {
7185 len += sprintf(buf + len, "\nCard Num %d", cnt);
7186 len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
7187 if (j->cardtype != QTI_PHONEJACK)
7188 len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
7189 len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
7190 len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
7191 len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
7192 switch (j->cardtype) {
7193 case (QTI_PHONEJACK):
7194 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
7195 break;
7196 case (QTI_LINEJACK):
7197 len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
7198 if (j->flags.g729_loaded)
7199 len += sprintf(buf + len, " w/G.729 A/B");
7200 len += sprintf(buf + len, " Country = %d", j->daa_country);
7201 break;
7202 case (QTI_PHONEJACK_LITE):
7203 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
7204 if (j->flags.g729_loaded)
7205 len += sprintf(buf + len, " w/G.729 A/B");
7206 break;
7207 case (QTI_PHONEJACK_PCI):
7208 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
7209 if (j->flags.g729_loaded)
7210 len += sprintf(buf + len, " w/G.729 A/B");
7211 break;
7212 case (QTI_PHONECARD):
7213 len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
7214 if (j->flags.g729_loaded)
7215 len += sprintf(buf + len, " w/G.729 A/B");
7216 len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
7217 if (!j->pccr1.bits.drf)
7218 len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
7219 len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
7220 break;
7221 default:
7222 len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
7223 break;
7224 }
7225 len += sprintf(buf + len, "\nReaders %d", j->readers);
7226 len += sprintf(buf + len, "\nWriters %d", j->writers);
7227 add_caps(j);
7228 len += sprintf(buf + len, "\nCapabilities %d", j->caps);
7229 if (j->dsp.low != 0x20)
7230 len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
7231 if (j->flags.cidsent)
7232 len += sprintf(buf + len, "\nCaller ID data sent");
7233 else
7234 len += sprintf(buf + len, "\nCaller ID data not sent");
7235
7236 len += sprintf(buf + len, "\nPlay CODEC ");
7237 switch (j->play_codec) {
7238 case G723_63:
7239 len += sprintf(buf + len, "G.723.1 6.3");
7240 break;
7241 case G723_53:
7242 len += sprintf(buf + len, "G.723.1 5.3");
7243 break;
7244 case TS85:
7245 len += sprintf(buf + len, "TrueSpeech 8.5");
7246 break;
7247 case TS48:
7248 len += sprintf(buf + len, "TrueSpeech 4.8");
7249 break;
7250 case TS41:
7251 len += sprintf(buf + len, "TrueSpeech 4.1");
7252 break;
7253 case G728:
7254 len += sprintf(buf + len, "G.728");
7255 break;
7256 case G729:
7257 len += sprintf(buf + len, "G.729");
7258 break;
7259 case G729B:
7260 len += sprintf(buf + len, "G.729B");
7261 break;
7262 case ULAW:
7263 len += sprintf(buf + len, "uLaw");
7264 break;
7265 case ALAW:
7266 len += sprintf(buf + len, "aLaw");
7267 break;
7268 case LINEAR16:
7269 len += sprintf(buf + len, "16 bit Linear");
7270 break;
7271 case LINEAR8:
7272 len += sprintf(buf + len, "8 bit Linear");
7273 break;
7274 case WSS:
7275 len += sprintf(buf + len, "Windows Sound System");
7276 break;
7277 default:
7278 len += sprintf(buf + len, "NO CODEC CHOSEN");
7279 break;
7280 }
7281 len += sprintf(buf + len, "\nRecord CODEC ");
7282 switch (j->rec_codec) {
7283 case G723_63:
7284 len += sprintf(buf + len, "G.723.1 6.3");
7285 break;
7286 case G723_53:
7287 len += sprintf(buf + len, "G.723.1 5.3");
7288 break;
7289 case TS85:
7290 len += sprintf(buf + len, "TrueSpeech 8.5");
7291 break;
7292 case TS48:
7293 len += sprintf(buf + len, "TrueSpeech 4.8");
7294 break;
7295 case TS41:
7296 len += sprintf(buf + len, "TrueSpeech 4.1");
7297 break;
7298 case G728:
7299 len += sprintf(buf + len, "G.728");
7300 break;
7301 case G729:
7302 len += sprintf(buf + len, "G.729");
7303 break;
7304 case G729B:
7305 len += sprintf(buf + len, "G.729B");
7306 break;
7307 case ULAW:
7308 len += sprintf(buf + len, "uLaw");
7309 break;
7310 case ALAW:
7311 len += sprintf(buf + len, "aLaw");
7312 break;
7313 case LINEAR16:
7314 len += sprintf(buf + len, "16 bit Linear");
7315 break;
7316 case LINEAR8:
7317 len += sprintf(buf + len, "8 bit Linear");
7318 break;
7319 case WSS:
7320 len += sprintf(buf + len, "Windows Sound System");
7321 break;
7322 default:
7323 len += sprintf(buf + len, "NO CODEC CHOSEN");
7324 break;
7325 }
7326 len += sprintf(buf + len, "\nAEC ");
7327 switch (j->aec_level) {
7328 case AEC_OFF:
7329 len += sprintf(buf + len, "Off");
7330 break;
7331 case AEC_LOW:
7332 len += sprintf(buf + len, "Low");
7333 break;
7334 case AEC_MED:
7335 len += sprintf(buf + len, "Med");
7336 break;
7337 case AEC_HIGH:
7338 len += sprintf(buf + len, "High");
7339 break;
7340 case AEC_AUTO:
7341 len += sprintf(buf + len, "Auto");
7342 break;
7343 case AEC_AGC:
7344 len += sprintf(buf + len, "AEC/AGC");
7345 break;
7346 default:
7347 len += sprintf(buf + len, "unknown(%i)", j->aec_level);
7348 break;
7349 }
7350
7351 len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
7352 len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
7353 len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
7354
7355 len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook); */
7356
7357 if (j->cardtype == QTI_LINEJACK) {
7358 len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
7359 len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
7360 len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
7361 len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
7362 switch (j->daa_mode) {
7363 case SOP_PU_SLEEP:
7364 len += sprintf(buf + len, "\nDAA PSTN On Hook");
7365 break;
7366 case SOP_PU_RINGING:
7367 len += sprintf(buf + len, "\nDAA PSTN Ringing");
7368 len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
7369 break;
7370 case SOP_PU_CONVERSATION:
7371 len += sprintf(buf + len, "\nDAA PSTN Off Hook");
7372 break;
7373 case SOP_PU_PULSEDIALING:
7374 len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
7375 break;
7376 }
7377 len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
7378 len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
7379 len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
7380 len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
7381 len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
7382 len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
7383 len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
7384 len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
7385 len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
7386 len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
7387 }
7388 switch (j->port) {
7389 case PORT_POTS:
7390 len += sprintf(buf + len, "\nPort POTS");
7391 break;
7392 case PORT_PSTN:
7393 len += sprintf(buf + len, "\nPort PSTN");
7394 break;
7395 case PORT_SPEAKER:
7396 len += sprintf(buf + len, "\nPort SPEAKER/MIC");
7397 break;
7398 case PORT_HANDSET:
7399 len += sprintf(buf + len, "\nPort HANDSET");
7400 break;
7401 }
7402 if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
7403 len += sprintf(buf + len, "\nSLIC state ");
7404 switch (SLIC_GetState(j)) {
7405 case PLD_SLIC_STATE_OC:
7406 len += sprintf(buf + len, "OC");
7407 break;
7408 case PLD_SLIC_STATE_RINGING:
7409 len += sprintf(buf + len, "RINGING");
7410 break;
7411 case PLD_SLIC_STATE_ACTIVE:
7412 len += sprintf(buf + len, "ACTIVE");
7413 break;
7414 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
7415 len += sprintf(buf + len, "OHT");
7416 break;
7417 case PLD_SLIC_STATE_TIPOPEN:
7418 len += sprintf(buf + len, "TIPOPEN");
7419 break;
7420 case PLD_SLIC_STATE_STANDBY:
7421 len += sprintf(buf + len, "STANDBY");
7422 break;
7423 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
7424 len += sprintf(buf + len, "APR");
7425 break;
7426 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
7427 len += sprintf(buf + len, "OHTPR");
7428 break;
7429 default:
7430 len += sprintf(buf + len, "%d", SLIC_GetState(j));
7431 break;
7432 }
7433 }
7434 len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
7435 len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
7436#ifdef PERFMON_STATS
7437 len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
7438 len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
7439 len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
7440 len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
7441 len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
7442 len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
7443 len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
7444 len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
7445 len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
7446 len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
7447 len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
7448 len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
7449 len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
7450 len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
7451
7452#endif
7453 len += sprintf(buf + len, "\n");
7454 }
7455 }
7456 return len;
7457}
7458
7459static int ixj_read_proc(char *page, char **start, off_t off,
7460 int count, int *eof, void *data)
7461{
7462 int len = ixj_get_status_proc(page);
7463 if (len <= off+count) *eof = 1;
7464 *start = page + off;
7465 len -= off;
7466 if (len>count) len = count;
7467 if (len<0) len = 0;
7468 return len;
7469}
7470
7471
7472static void cleanup(void)
7473{
7474 int cnt;
7475 IXJ *j;
7476
7477 for (cnt = 0; cnt < IXJMAX; cnt++) {
7478 j = get_ixj(cnt);
7479 if(j != NULL && j->DSPbase) {
7480 if (ixjdebug & 0x0002)
7481 printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
7482 del_timer(&j->timer);
7483 if (j->cardtype == QTI_LINEJACK) {
7484 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
7485
7486 outb_p(j->pld_scrw.byte, j->XILINXbase);
7487 j->pld_slicw.bits.rly1 = 0;
7488 j->pld_slicw.bits.rly2 = 0;
7489 j->pld_slicw.bits.rly3 = 0;
7490 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7491 LED_SetState(0x0, j);
7492 if (ixjdebug & 0x0002)
7493 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7494 release_region(j->XILINXbase, 8);
7495 } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
7496 if (ixjdebug & 0x0002)
7497 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7498 release_region(j->XILINXbase, 4);
7499 }
7500 if (j->read_buffer)
7501 kfree(j->read_buffer);
7502 if (j->write_buffer)
7503 kfree(j->write_buffer);
7504 if (j->dev)
7505 pnp_device_detach(j->dev);
7506 if (ixjdebug & 0x0002)
7507 printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
7508 phone_unregister_device(&j->p);
7509 if (ixjdebug & 0x0002)
7510 printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
7511 release_region(j->DSPbase, 16);
7512#ifdef IXJ_DYN_ALLOC
7513 if (ixjdebug & 0x0002)
7514 printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
7515 kfree(j);
7516 ixj[cnt] = NULL;
7517#endif
7518 }
7519 }
7520 if (ixjdebug & 0x0002)
7521 printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
7522 remove_proc_entry ("ixj", NULL);
7523}
7524
7525/* Typedefs */
7526typedef struct {
7527 BYTE length;
7528 DWORD bits;
7529} DATABLOCK;
7530
7531static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
7532{
7533 lastLCC = lastLCC & 0xfb;
7534 lastLCC = lastLCC | (byData ? 4 : 0);
7535 outb(lastLCC, wEEPROMAddress); /*set data out bit as appropriate */
7536
7537 mdelay(1);
7538 lastLCC = lastLCC | 0x01;
7539 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7540
7541 byData = byData << 1;
7542 lastLCC = lastLCC & 0xfe;
7543 mdelay(1);
7544 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7545
7546}
7547
7548static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
7549{
7550 mdelay(1);
7551 lastLCC = lastLCC | 0x01;
7552 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7553
7554 lastLCC = lastLCC & 0xfe;
7555 mdelay(1);
7556 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7557
7558 return ((inb(wEEPROMAddress) >> 3) & 1);
7559}
7560
7561static BOOL PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
7562{
7563 BYTE lastLCC;
7564 WORD wEEPROMAddress = wAddress + 3;
7565 DWORD i;
7566 BYTE byResult;
7567 *pwResult = 0;
7568 lastLCC = inb(wEEPROMAddress);
7569 lastLCC = lastLCC | 0x02;
7570 lastLCC = lastLCC & 0xfe;
7571 outb(lastLCC, wEEPROMAddress); /* CS hi, SK lo */
7572
7573 mdelay(1); /* delay */
7574
7575 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7576 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7577 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
7578 for (i = 0; i < 8; i++) {
7579 PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
7580 wLoc <<= 1;
7581 }
7582
7583 for (i = 0; i < 16; i++) {
7584 byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
7585 *pwResult = (*pwResult << 1) | byResult;
7586 }
7587
7588 mdelay(1); /* another delay */
7589
7590 lastLCC = lastLCC & 0xfd;
7591 outb(lastLCC, wEEPROMAddress); /* negate CS */
7592
7593 return 0;
7594}
7595
7596static DWORD PCIEE_GetSerialNumber(WORD wAddress)
7597{
7598 WORD wLo, wHi;
7599 if (PCIEE_ReadWord(wAddress, 62, &wLo))
7600 return 0;
7601 if (PCIEE_ReadWord(wAddress, 63, &wHi))
7602 return 0;
7603 return (((DWORD) wHi << 16) | wLo);
7604}
7605
7606static int dspio[IXJMAX + 1] =
7607{
7608 0,
7609};
7610static int xio[IXJMAX + 1] =
7611{
7612 0,
7613};
7614
7615module_param_array(dspio, int, NULL, 0);
7616module_param_array(xio, int, NULL, 0);
7617MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7618MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7619MODULE_LICENSE("GPL");
7620
7621static void __exit ixj_exit(void)
7622{
7623 cleanup();
7624}
7625
7626static IXJ *new_ixj(unsigned long port)
7627{
7628 IXJ *res;
7629 if (!request_region(port, 16, "ixj DSP")) {
7630 printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
7631 return NULL;
7632 }
7633 res = ixj_alloc();
7634 if (!res) {
7635 release_region(port, 16);
7636 printk(KERN_INFO "ixj: out of memory\n");
7637 return NULL;
7638 }
7639 res->DSPbase = port;
7640 return res;
7641}
7642
7643static int __init ixj_probe_isapnp(int *cnt)
7644{
7645 int probe = 0;
7646 int func = 0x110;
7647 struct pnp_dev *dev = NULL, *old_dev = NULL;
7648
7649 while (1) {
7650 do {
7651 IXJ *j;
7652 int result;
7653
7654 old_dev = dev;
7655 dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
7656 ISAPNP_FUNCTION(func), old_dev);
7657 if (!dev || !dev->card)
7658 break;
7659 result = pnp_device_attach(dev);
7660 if (result < 0) {
7661 printk("pnp attach failed %d \n", result);
7662 break;
7663 }
7664 if (pnp_activate_dev(dev) < 0) {
7665 printk("pnp activate failed (out of resources?)\n");
7666 pnp_device_detach(dev);
7667 return -ENOMEM;
7668 }
7669
7670 if (!pnp_port_valid(dev, 0)) {
7671 pnp_device_detach(dev);
7672 return -ENODEV;
7673 }
7674
7675 j = new_ixj(pnp_port_start(dev, 0));
7676 if (!j)
7677 break;
7678
7679 if (func != 0x110)
7680 j->XILINXbase = pnp_port_start(dev, 1); /* get real port */
7681
7682 switch (func) {
7683 case (0x110):
7684 j->cardtype = QTI_PHONEJACK;
7685 break;
7686 case (0x310):
7687 j->cardtype = QTI_LINEJACK;
7688 break;
7689 case (0x410):
7690 j->cardtype = QTI_PHONEJACK_LITE;
7691 break;
7692 }
7693 j->board = *cnt;
7694 probe = ixj_selfprobe(j);
7695 if(!probe) {
7696 j->serial = dev->card->serial;
7697 j->dev = dev;
7698 switch (func) {
7699 case 0x110:
7700 printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
7701 break;
7702 case 0x310:
7703 printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
7704 break;
7705 case 0x410:
7706 printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
7707 break;
7708 }
7709 }
7710 ++*cnt;
7711 } while (dev);
7712 if (func == 0x410)
7713 break;
7714 if (func == 0x310)
7715 func = 0x410;
7716 if (func == 0x110)
7717 func = 0x310;
7718 dev = NULL;
7719 }
7720 return probe;
7721}
7722
7723static int __init ixj_probe_isa(int *cnt)
7724{
7725 int i, probe;
7726
7727 /* Use passed parameters for older kernels without PnP */
7728 for (i = 0; i < IXJMAX; i++) {
7729 if (dspio[i]) {
7730 IXJ *j = new_ixj(dspio[i]);
7731
7732 if (!j)
7733 break;
7734
7735 j->XILINXbase = xio[i];
7736 j->cardtype = 0;
7737
7738 j->board = *cnt;
7739 probe = ixj_selfprobe(j);
7740 j->dev = NULL;
7741 ++*cnt;
7742 }
7743 }
7744 return 0;
7745}
7746
7747static int __init ixj_probe_pci(int *cnt)
7748{
7749 struct pci_dev *pci = NULL;
7750 int i, probe = 0;
7751 IXJ *j = NULL;
7752
7753 for (i = 0; i < IXJMAX - *cnt; i++) {
7754 pci = pci_find_device(0x15E2, 0x0500, pci);
7755 if (!pci)
7756 break;
7757
7758 if (pci_enable_device(pci))
7759 break;
7760 j = new_ixj(pci_resource_start(pci, 0));
7761 if (!j)
7762 break;
7763
7764 j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
7765 j->XILINXbase = j->DSPbase + 0x10;
7766 j->cardtype = QTI_PHONEJACK_PCI;
7767 j->board = *cnt;
7768 probe = ixj_selfprobe(j);
7769 if (!probe)
7770 printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
7771 ++*cnt;
7772 }
7773 return probe;
7774}
7775
7776static int __init ixj_init(void)
7777{
7778 int cnt = 0;
7779 int probe = 0;
7780
7781 cnt = 0;
7782
7783 /* These might be no-ops, see above. */
7784 if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
7785 return probe;
7786 }
7787 if ((probe = ixj_probe_isa(&cnt)) < 0) {
7788 return probe;
7789 }
7790 if ((probe = ixj_probe_pci(&cnt)) < 0) {
7791 return probe;
7792 }
Domen Puncerfba478b2005-05-05 16:16:13 -07007793 printk(KERN_INFO "ixj driver initialized.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07007794 create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
7795 return probe;
7796}
7797
7798module_init(ixj_init);
7799module_exit(ixj_exit);
7800
7801static void DAA_Coeff_US(IXJ *j)
7802{
7803 int i;
7804
7805 j->daa_country = DAA_US;
7806 /*----------------------------------------------- */
7807 /* CAO */
7808 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7809 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7810 }
7811
7812/* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7813 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
7814 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
7815 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
7816 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
7817 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
7818 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
7819 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7820 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7821/* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7822 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
7823 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
7824 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7825 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7826 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
7827 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7828 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7829 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7830/* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */
7831 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
7832 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
7833 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
7834 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
7835 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
7836 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
7837 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
7838 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7839/* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */
7840 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
7841 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
7842 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
7843 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
7844 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
7845 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
7846 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
7847 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7848/* Bytes for AX-filter (0A): 16,55,DD,CA */
7849 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
7850 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
7851 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
7852 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
7853/* Bytes for AR-filter (09): 52,D3,11,42 */
7854 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
7855 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
7856 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
7857 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
7858/* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7859 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
7860 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
7861 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
7862 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
7863 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
7864 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
7865 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
7866 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
7867/* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7868 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
7869 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
7870 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
7871 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
7872 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
7873 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
7874 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
7875 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
7876/* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7877 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
7878 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
7879 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
7880 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
7881 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
7882 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
7883 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
7884 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
7885/* ; (10K, 0.68uF) */
7886 /* */
7887 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7888 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
7889 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
7890 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
7891 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
7892 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
7893 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
7894 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
7895 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
7896 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7897 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
7898 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
7899 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
7900 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
7901 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
7902 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
7903 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
7904 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
7905
7906 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7907 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
7908 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
7909 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
7910 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
7911
7912 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7913/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7914/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7915/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7916/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
7917/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
7918/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
7919/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
7920/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
7921 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7922/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
7923/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
7924/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
7925/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
7926/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
7927/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
7928/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
7929/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
7930/* */
7931 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7932/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
7933/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
7934/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
7935/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
7936
7937 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
7938 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
7939 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
7940 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
7941 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
7942 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
7943 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
7944 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
7945 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
7946/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
7947 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
7948 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
7949 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
7950 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
7951 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
7952 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
7953 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
7954 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
7955/* */
7956 /* ;CR Registers */
7957 /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */
7958 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
7959/* Config. Reg. 1 (dialing) (cr1):05 */
7960 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
7961/* Config. Reg. 2 (caller ID) (cr2):04 */
7962 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
7963/* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */
7964 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
7965/* Config. Reg. 4 (analog gain) (cr4):02 */
7966 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
7967 /* Config. Reg. 5 (Version) (cr5):02 */
7968 /* Config. Reg. 6 (Reserved) (cr6):00 */
7969 /* Config. Reg. 7 (Reserved) (cr7):00 */
7970 /* */
7971 /* ;xr Registers */
7972 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
7973
7974 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
7975 /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
7976
7977 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
7978/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
7979 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
7980/* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */
7981 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B; /*0x32; */
7982 /* Ext. Reg. 4 (Cadence) (xr4):00 */
7983
7984 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
7985/* Ext. Reg. 5 (Ring timer) (xr5):22 */
7986 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
7987/* Ext. Reg. 6 (Power State) (xr6):00 */
7988 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
7989/* Ext. Reg. 7 (Vdd) (xr7):40 */
7990 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
7991 /* */
7992 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
7993 /* 12,33,5A,C3 ; 770 Hz */
7994 /* 13,3C,5B,32 ; 852 Hz */
7995 /* 1D,1B,5C,CC ; 941 Hz */
7996
7997 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
7998 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
7999 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8000 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8001/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8002 /* EC,1D,52,22 ; 1336 Hz */
8003 /* AA,AC,51,D2 ; 1477 Hz */
8004 /* 9B,3B,51,25 ; 1633 Hz */
8005 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8006 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8007 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8008 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8009}
8010
8011static void DAA_Coeff_UK(IXJ *j)
8012{
8013 int i;
8014
8015 j->daa_country = DAA_UK;
8016 /*----------------------------------------------- */
8017 /* CAO */
8018 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8019 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8020 }
8021
8022/* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
8023 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8024 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
8025 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8026 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
8027 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
8028 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8029 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8030 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8031/* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
8032 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
8033 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
8034 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8035 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
8036 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
8037 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8038 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8039 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8040/* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */
8041 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8042 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
8043 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
8044 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
8045 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
8046 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
8047 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
8048 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8049/* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */
8050 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8051 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
8052 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
8053 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
8054 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8055 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
8056 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
8057 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8058/* Bytes for AX-filter (0A): 1B,A5,DD,CA */
8059 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
8060 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
8061 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8062 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8063/* Bytes for AR-filter (09): E2,27,10,D6 */
8064 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8065 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
8066 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8067 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8068/* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8069 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8070 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
8071 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
8072 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
8073 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
8074 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
8075 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8076 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8077/* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8078 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8079 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
8080 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
8081 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
8082 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
8083 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
8084 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
8085 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
8086/* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8087 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8088 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8089 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
8090 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
8091 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
8092 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
8093 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
8094 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
8095/* ; idle */
8096 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8097 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8098 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8099 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8100 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8101 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8102 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8103 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8104 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8105/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8106 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8107 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8108 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8109 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8110 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8111 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8112 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8113 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8114/* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */
8115 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8116 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8117 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8118 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8119/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8120 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8121 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8122 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8123 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8124 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8125 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8126 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8127 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8128/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8129 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8130 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8131 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8132 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8133 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8134 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8135 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8136 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8137/* ;CR Registers */
8138 /* Config. Reg. 0 (filters) (cr0):FF */
8139 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8140/* Config. Reg. 1 (dialing) (cr1):05 */
8141 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8142/* Config. Reg. 2 (caller ID) (cr2):04 */
8143 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8144/* Config. Reg. 3 (testloops) (cr3):00 ; */
8145 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8146/* Config. Reg. 4 (analog gain) (cr4):02 */
8147 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8148 /* Config. Reg. 5 (Version) (cr5):02 */
8149 /* Config. Reg. 6 (Reserved) (cr6):00 */
8150 /* Config. Reg. 7 (Reserved) (cr7):00 */
8151 /* ;xr Registers */
8152 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8153
8154 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8155 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8156
8157 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8158 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8159
8160 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8161/* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8162 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8163/* Ext. Reg. 4 (Cadence) (xr4):00 */
8164 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8165/* Ext. Reg. 5 (Ring timer) (xr5):22 */
8166 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8167/* Ext. Reg. 6 (Power State) (xr6):00 */
8168 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8169/* Ext. Reg. 7 (Vdd) (xr7):46 */
8170 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8171 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8172 /* 12,33,5A,C3 ; 770 Hz */
8173 /* 13,3C,5B,32 ; 852 Hz */
8174 /* 1D,1B,5C,CC ; 941 Hz */
8175
8176 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8177 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8178 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8179 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8180/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8181 /* EC,1D,52,22 ; 1336 Hz */
8182 /* AA,AC,51,D2 ; 1477 Hz */
8183 /* 9B,3B,51,25 ; 1633 Hz */
8184 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8185 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8186 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8187 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8188}
8189
8190
8191static void DAA_Coeff_France(IXJ *j)
8192{
8193 int i;
8194
8195 j->daa_country = DAA_FRANCE;
8196 /*----------------------------------------------- */
8197 /* CAO */
8198 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8199 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8200 }
8201
8202/* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8203 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
8204 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
8205 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
8206 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
8207 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
8208 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
8209 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8210 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8211/* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8212 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
8213 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
8214 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8215 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
8216 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
8217 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8218 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8219 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8220/* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */
8221 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8222 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
8223 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
8224 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
8225 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
8226 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
8227 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
8228 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8229/* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */
8230 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8231 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8232 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
8233 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8234 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
8235 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
8236 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8237 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8238/* Bytes for AX-filter (0A): 16,B5,DD,CA */
8239 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
8240 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
8241 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8242 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8243/* Bytes for AR-filter (09): 52,C7,10,D6 */
8244 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8245 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
8246 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8247 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8248/* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8249 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8250 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8251 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8252 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8253 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
8254 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8255 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8256 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8257/* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8258 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8259 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
8260 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8261 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
8262 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
8263 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
8264 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
8265 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
8266/* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8267 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8268 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8269 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8270 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
8271 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
8272 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
8273 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
8274 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
8275/* ; idle */
8276 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8277 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8278 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8279 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8280 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8281 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8282 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8283 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8284 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8285/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8286 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8287 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8288 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8289 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8290 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8291 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8292 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8293 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8294/* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8295 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8296 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8297 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8298 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8299/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8300 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8301 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8302 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8303 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8304 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8305 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8306 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8307 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8308/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8309 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8310 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8311 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8312 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8313 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8314 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8315 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8316 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8317/* ;CR Registers */
8318 /* Config. Reg. 0 (filters) (cr0):FF */
8319 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8320/* Config. Reg. 1 (dialing) (cr1):05 */
8321 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8322/* Config. Reg. 2 (caller ID) (cr2):04 */
8323 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8324/* Config. Reg. 3 (testloops) (cr3):00 ; */
8325 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8326/* Config. Reg. 4 (analog gain) (cr4):02 */
8327 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8328 /* Config. Reg. 5 (Version) (cr5):02 */
8329 /* Config. Reg. 6 (Reserved) (cr6):00 */
8330 /* Config. Reg. 7 (Reserved) (cr7):00 */
8331 /* ;xr Registers */
8332 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8333
8334 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8335 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8336
8337 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8338 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8339
8340 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8341/* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8342 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8343/* Ext. Reg. 4 (Cadence) (xr4):00 */
8344 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8345/* Ext. Reg. 5 (Ring timer) (xr5):22 */
8346 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8347/* Ext. Reg. 6 (Power State) (xr6):00 */
8348 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8349/* Ext. Reg. 7 (Vdd) (xr7):46 */
8350 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8351 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8352 /* 12,33,5A,C3 ; 770 Hz */
8353 /* 13,3C,5B,32 ; 852 Hz */
8354 /* 1D,1B,5C,CC ; 941 Hz */
8355
8356 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8357 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8358 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8359 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8360/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8361 /* EC,1D,52,22 ; 1336 Hz */
8362 /* AA,AC,51,D2 ; 1477 Hz */
8363 /* 9B,3B,51,25 ; 1633 Hz */
8364 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8365 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8366 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8367 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8368}
8369
8370
8371static void DAA_Coeff_Germany(IXJ *j)
8372{
8373 int i;
8374
8375 j->daa_country = DAA_GERMANY;
8376 /*----------------------------------------------- */
8377 /* CAO */
8378 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8379 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8380 }
8381
8382/* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8383 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8384 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
8385 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8386 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
8387 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
8388 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8389 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
8390 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8391/* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8392 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
8393 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
8394 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8395 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
8396 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
8397 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
8398 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
8399 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8400/* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */
8401 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8402 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
8403 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8404 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8405 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
8406 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
8407 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
8408 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8409/* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */
8410 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
8411 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
8412 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
8413 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
8414 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
8415 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
8416 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
8417 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8418/* Bytes for AX-filter (0A): 72,D5,DD,CA */
8419 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
8420 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
8421 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8422 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8423/* Bytes for AR-filter (09): 72,42,13,4B */
8424 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
8425 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
8426 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
8427 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
8428/* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8429 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8430 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8431 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8432 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8433 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
8434 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8435 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8436 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8437/* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8438 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8439 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
8440 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
8441 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8442 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
8443 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
8444 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
8445 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
8446/* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8447 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8448 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8449 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
8450 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
8451 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
8452 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
8453 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
8454 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
8455/* ; (10K, 0.68uF) */
8456 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8457 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8458 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
8459 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
8460 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
8461 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
8462 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
8463 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
8464 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8465/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8466 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
8467 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
8468 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8469 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8470 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
8471 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
8472 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
8473 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8474/* Levelmetering Ringing (0D):B2,45,0F,8E */
8475 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
8476 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8477 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8478 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8479/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8480 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8481 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8482 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8483 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8484 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8485 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8486 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8487 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8488/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8489 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8490 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8491 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8492 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8493 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8494 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8495 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8496 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8497/* ;CR Registers */
8498 /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */
8499 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8500/* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */
8501 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8502/* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */
8503 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8504/* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */
8505 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8506/* Config. Reg. 4 (analog gain) (cr4):02 */
8507 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8508 /* Config. Reg. 5 (Version) (cr5):02 */
8509 /* Config. Reg. 6 (Reserved) (cr6):00 */
8510 /* Config. Reg. 7 (Reserved) (cr7):00 */
8511 /* ;xr Registers */
8512 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8513
8514 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8515 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8516
8517 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8518 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8519
8520 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8521/* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8522 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
8523/* Ext. Reg. 4 (Cadence) (xr4):00 */
8524 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8525/* Ext. Reg. 5 (Ring timer) (xr5):22 */
8526 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8527/* Ext. Reg. 6 (Power State) (xr6):00 */
8528 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8529/* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */
8530 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8531 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8532 /* 12,33,5A,C3 ; 770 Hz */
8533 /* 13,3C,5B,32 ; 852 Hz */
8534 /* 1D,1B,5C,CC ; 941 Hz */
8535
8536 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8537 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8538 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8539 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8540/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8541 /* EC,1D,52,22 ; 1336 Hz */
8542 /* AA,AC,51,D2 ; 1477 Hz */
8543 /* 9B,3B,51,25 ; 1633 Hz */
8544 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8545 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8546 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8547 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8548}
8549
8550
8551static void DAA_Coeff_Australia(IXJ *j)
8552{
8553 int i;
8554
8555 j->daa_country = DAA_AUSTRALIA;
8556 /*----------------------------------------------- */
8557 /* CAO */
8558 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8559 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8560 }
8561
8562/* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8563 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8564 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
8565 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
8566 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
8567 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
8568 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
8569 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
8570 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8571/* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8572 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
8573 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
8574 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8575 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
8576 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
8577 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
8578 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
8579 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8580/* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */
8581 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8582 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
8583 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8584 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8585 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
8586 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
8587 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
8588 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8589/* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */
8590 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8591 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
8592 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
8593 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8594 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
8595 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
8596 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
8597 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8598/* Bytes for AX-filter (0A): CB,45,DD,CA */
8599 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
8600 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
8601 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8602 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8603/* Bytes for AR-filter (09): 1B,67,10,D6 */
8604 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
8605 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
8606 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8607 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8608/* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8609 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8610 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8611 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8612 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8613 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
8614 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8615 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8616 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8617/* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8618 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8619 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
8620 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
8621 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
8622 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
8623 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
8624 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
8625 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
8626/* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8627 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8628 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8629 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
8630 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
8631 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
8632 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
8633 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
8634 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
8635/* ; idle */
8636 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8637 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8638 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8639 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8640 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8641 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8642 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8643 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8644 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8645/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8646 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8647 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8648 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8649 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8650 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8651 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8652 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8653 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8654/* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8655 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8656 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8657 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8658 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8659/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8660 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8661 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8662 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8663 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8664 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8665 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8666 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8667 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8668/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8669 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8670 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8671 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8672 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8673 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8674 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8675 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8676 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8677/* ;CR Registers */
8678 /* Config. Reg. 0 (filters) (cr0):FF */
8679 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8680/* Config. Reg. 1 (dialing) (cr1):05 */
8681 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8682/* Config. Reg. 2 (caller ID) (cr2):04 */
8683 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8684/* Config. Reg. 3 (testloops) (cr3):00 ; */
8685 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8686/* Config. Reg. 4 (analog gain) (cr4):02 */
8687 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8688 /* Config. Reg. 5 (Version) (cr5):02 */
8689 /* Config. Reg. 6 (Reserved) (cr6):00 */
8690 /* Config. Reg. 7 (Reserved) (cr7):00 */
8691 /* ;xr Registers */
8692 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8693
8694 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8695 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8696
8697 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8698 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8699
8700 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8701/* Ext. Reg. 3 (DC Char) (xr3):2B ; */
8702 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
8703/* Ext. Reg. 4 (Cadence) (xr4):00 */
8704 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8705/* Ext. Reg. 5 (Ring timer) (xr5):22 */
8706 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8707/* Ext. Reg. 6 (Power State) (xr6):00 */
8708 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8709/* Ext. Reg. 7 (Vdd) (xr7):40 */
8710 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8711
8712 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8713 /* 12,33,5A,C3 ; 770 Hz */
8714 /* 13,3C,5B,32 ; 852 Hz */
8715 /* 1D,1B,5C,CC ; 941 Hz */
8716 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8717 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8718 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8719 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8720
8721 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8722 /* EC,1D,52,22 ; 1336 Hz */
8723 /* AA,AC,51,D2 ; 1477 Hz */
8724 /* 9B,3B,51,25 ; 1633 Hz */
8725 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8726 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8727 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8728 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8729}
8730
8731static void DAA_Coeff_Japan(IXJ *j)
8732{
8733 int i;
8734
8735 j->daa_country = DAA_JAPAN;
8736 /*----------------------------------------------- */
8737 /* CAO */
8738 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8739 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8740 }
8741
8742/* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8743 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
8744 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
8745 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
8746 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
8747 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
8748 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
8749 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8750 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8751/* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8752 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
8753 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
8754 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8755 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
8756 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
8757 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8758 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8759 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8760/* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */
8761 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
8762 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
8763 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
8764 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
8765 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
8766 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
8767 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
8768 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8769/* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */
8770 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8771 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8772 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
8773 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
8774 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8775 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
8776 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8777 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8778/* Bytes for AX-filter (0A): 51,C5,DD,CA */
8779 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
8780 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
8781 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8782 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8783/* Bytes for AR-filter (09): 25,A7,10,D6 */
8784 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
8785 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
8786 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8787 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8788/* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8789 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8790 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8791 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8792 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8793 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
8794 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8795 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8796 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8797/* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8798 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8799 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
8800 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8801 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8802 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
8803 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
8804 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
8805 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
8806/* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8807 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8808 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8809 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8810 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
8811 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
8812 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
8813 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
8814 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
8815/* ; idle */
8816 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8817 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8818 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8819 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8820 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8821 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8822 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8823 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8824 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8825/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8826 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8827 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8828 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8829 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8830 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8831 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8832 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8833 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8834/* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */
8835 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8836 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8837 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8838 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8839/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8840 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8841 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8842 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8843 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8844 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8845 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8846 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8847 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8848/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8849 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8850 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8851 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8852 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8853 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8854 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8855 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8856 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8857/* ;CR Registers */
8858 /* Config. Reg. 0 (filters) (cr0):FF */
8859 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8860/* Config. Reg. 1 (dialing) (cr1):05 */
8861 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8862/* Config. Reg. 2 (caller ID) (cr2):04 */
8863 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8864/* Config. Reg. 3 (testloops) (cr3):00 ; */
8865 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8866/* Config. Reg. 4 (analog gain) (cr4):02 */
8867 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8868 /* Config. Reg. 5 (Version) (cr5):02 */
8869 /* Config. Reg. 6 (Reserved) (cr6):00 */
8870 /* Config. Reg. 7 (Reserved) (cr7):00 */
8871 /* ;xr Registers */
8872 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8873
8874 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8875 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8876
8877 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8878 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8879
8880 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8881/* Ext. Reg. 3 (DC Char) (xr3):22 ; */
8882 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
8883/* Ext. Reg. 4 (Cadence) (xr4):00 */
8884 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8885/* Ext. Reg. 5 (Ring timer) (xr5):22 */
8886 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8887/* Ext. Reg. 6 (Power State) (xr6):00 */
8888 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8889/* Ext. Reg. 7 (Vdd) (xr7):40 */
8890 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8891 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8892 /* 12,33,5A,C3 ; 770 Hz */
8893 /* 13,3C,5B,32 ; 852 Hz */
8894 /* 1D,1B,5C,CC ; 941 Hz */
8895
8896 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8897 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8898 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8899 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8900/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8901 /* EC,1D,52,22 ; 1336 Hz */
8902 /* AA,AC,51,D2 ; 1477 Hz */
8903 /* 9B,3B,51,25 ; 1633 Hz */
8904 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8905 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8906 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8907 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8908}
8909
8910static s16 tone_table[][19] =
8911{
8912 { /* f20_50[] 11 */
8913 32538, /* A1 = 1.985962 */
8914 -32325, /* A2 = -0.986511 */
8915 -343, /* B2 = -0.010493 */
8916 0, /* B1 = 0 */
8917 343, /* B0 = 0.010493 */
8918 32619, /* A1 = 1.990906 */
8919 -32520, /* A2 = -0.992462 */
8920 19179, /* B2 = 0.585327 */
8921 -19178, /* B1 = -1.170593 */
8922 19179, /* B0 = 0.585327 */
8923 32723, /* A1 = 1.997314 */
8924 -32686, /* A2 = -0.997528 */
8925 9973, /* B2 = 0.304352 */
8926 -9955, /* B1 = -0.607605 */
8927 9973, /* B0 = 0.304352 */
8928 7, /* Internal filter scaling */
8929 159, /* Minimum in-band energy threshold */
8930 21, /* 21/32 in-band to broad-band ratio */
8931 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8932 },
8933 { /* f133_200[] 12 */
8934 32072, /* A1 = 1.95752 */
8935 -31896, /* A2 = -0.973419 */
8936 -435, /* B2 = -0.013294 */
8937 0, /* B1 = 0 */
8938 435, /* B0 = 0.013294 */
8939 32188, /* A1 = 1.9646 */
8940 -32400, /* A2 = -0.98877 */
8941 15139, /* B2 = 0.462036 */
8942 -14882, /* B1 = -0.908356 */
8943 15139, /* B0 = 0.462036 */
8944 32473, /* A1 = 1.981995 */
8945 -32524, /* A2 = -0.992584 */
8946 23200, /* B2 = 0.708008 */
8947 -23113, /* B1 = -1.410706 */
8948 23200, /* B0 = 0.708008 */
8949 7, /* Internal filter scaling */
8950 159, /* Minimum in-band energy threshold */
8951 21, /* 21/32 in-band to broad-band ratio */
8952 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8953 },
8954 { /* f300 13 */
8955 31769, /* A1 = -1.939026 */
8956 -32584, /* A2 = 0.994385 */
8957 -475, /* B2 = -0.014522 */
8958 0, /* B1 = 0.000000 */
8959 475, /* B0 = 0.014522 */
8960 31789, /* A1 = -1.940247 */
8961 -32679, /* A2 = 0.997284 */
8962 17280, /* B2 = 0.527344 */
8963 -16865, /* B1 = -1.029358 */
8964 17280, /* B0 = 0.527344 */
8965 31841, /* A1 = -1.943481 */
8966 -32681, /* A2 = 0.997345 */
8967 543, /* B2 = 0.016579 */
8968 -525, /* B1 = -0.032097 */
8969 543, /* B0 = 0.016579 */
8970 5, /* Internal filter scaling */
8971 159, /* Minimum in-band energy threshold */
8972 21, /* 21/32 in-band to broad-band ratio */
8973 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8974 },
8975 { /* f300_420[] 14 */
8976 30750, /* A1 = 1.876892 */
8977 -31212, /* A2 = -0.952515 */
8978 -804, /* B2 = -0.024541 */
8979 0, /* B1 = 0 */
8980 804, /* B0 = 0.024541 */
8981 30686, /* A1 = 1.872925 */
8982 -32145, /* A2 = -0.980988 */
8983 14747, /* B2 = 0.450043 */
8984 -13703, /* B1 = -0.836395 */
8985 14747, /* B0 = 0.450043 */
8986 31651, /* A1 = 1.931824 */
8987 -32321, /* A2 = -0.986389 */
8988 24425, /* B2 = 0.745422 */
8989 -23914, /* B1 = -1.459595 */
8990 24427, /* B0 = 0.745483 */
8991 7, /* Internal filter scaling */
8992 159, /* Minimum in-band energy threshold */
8993 21, /* 21/32 in-band to broad-band ratio */
8994 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8995 },
8996 { /* f330 15 */
8997 31613, /* A1 = -1.929565 */
8998 -32646, /* A2 = 0.996277 */
8999 -185, /* B2 = -0.005657 */
9000 0, /* B1 = 0.000000 */
9001 185, /* B0 = 0.005657 */
9002 31620, /* A1 = -1.929932 */
9003 -32713, /* A2 = 0.998352 */
9004 19253, /* B2 = 0.587585 */
9005 -18566, /* B1 = -1.133179 */
9006 19253, /* B0 = 0.587585 */
9007 31674, /* A1 = -1.933228 */
9008 -32715, /* A2 = 0.998413 */
9009 2575, /* B2 = 0.078590 */
9010 -2495, /* B1 = -0.152283 */
9011 2575, /* B0 = 0.078590 */
9012 5, /* Internal filter scaling */
9013 159, /* Minimum in-band energy threshold */
9014 21, /* 21/32 in-band to broad-band ratio */
9015 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9016 },
9017 { /* f300_425[] 16 */
9018 30741, /* A1 = 1.876282 */
9019 -31475, /* A2 = -0.960541 */
9020 -703, /* B2 = -0.021484 */
9021 0, /* B1 = 0 */
9022 703, /* B0 = 0.021484 */
9023 30688, /* A1 = 1.873047 */
9024 -32248, /* A2 = -0.984161 */
9025 14542, /* B2 = 0.443787 */
9026 -13523, /* B1 = -0.825439 */
9027 14542, /* B0 = 0.443817 */
9028 31494, /* A1 = 1.922302 */
9029 -32366, /* A2 = -0.987762 */
9030 21577, /* B2 = 0.658508 */
9031 -21013, /* B1 = -1.282532 */
9032 21577, /* B0 = 0.658508 */
9033 7, /* Internal filter scaling */
9034 159, /* Minimum in-band energy threshold */
9035 21, /* 21/32 in-band to broad-band ratio */
9036 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9037 },
9038 { /* f330_440[] 17 */
9039 30627, /* A1 = 1.869324 */
9040 -31338, /* A2 = -0.95636 */
9041 -843, /* B2 = -0.025749 */
9042 0, /* B1 = 0 */
9043 843, /* B0 = 0.025749 */
9044 30550, /* A1 = 1.864685 */
9045 -32221, /* A2 = -0.983337 */
9046 13594, /* B2 = 0.414886 */
9047 -12589, /* B1 = -0.768402 */
9048 13594, /* B0 = 0.414886 */
9049 31488, /* A1 = 1.921936 */
9050 -32358, /* A2 = -0.987518 */
9051 24684, /* B2 = 0.753296 */
9052 -24029, /* B1 = -1.466614 */
9053 24684, /* B0 = 0.753296 */
9054 7, /* Internal filter scaling */
9055 159, /* Minimum in-band energy threshold */
9056 21, /* 21/32 in-band to broad-band ratio */
9057 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9058 },
9059 { /* f340 18 */
9060 31546, /* A1 = -1.925476 */
9061 -32646, /* A2 = 0.996277 */
9062 -445, /* B2 = -0.013588 */
9063 0, /* B1 = 0.000000 */
9064 445, /* B0 = 0.013588 */
9065 31551, /* A1 = -1.925781 */
9066 -32713, /* A2 = 0.998352 */
9067 23884, /* B2 = 0.728882 */
9068 -22979, /* B1 = -1.402527 */
9069 23884, /* B0 = 0.728882 */
9070 31606, /* A1 = -1.929138 */
9071 -32715, /* A2 = 0.998413 */
9072 863, /* B2 = 0.026367 */
9073 -835, /* B1 = -0.050985 */
9074 863, /* B0 = 0.026367 */
9075 5, /* Internal filter scaling */
9076 159, /* Minimum in-band energy threshold */
9077 21, /* 21/32 in-band to broad-band ratio */
9078 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9079 },
9080 { /* f350_400[] 19 */
9081 31006, /* A1 = 1.892517 */
9082 -32029, /* A2 = -0.977448 */
9083 -461, /* B2 = -0.014096 */
9084 0, /* B1 = 0 */
9085 461, /* B0 = 0.014096 */
9086 30999, /* A1 = 1.892029 */
9087 -32487, /* A2 = -0.991455 */
9088 11325, /* B2 = 0.345612 */
9089 -10682, /* B1 = -0.651978 */
9090 11325, /* B0 = 0.345612 */
9091 31441, /* A1 = 1.919067 */
9092 -32526, /* A2 = -0.992615 */
9093 24324, /* B2 = 0.74231 */
9094 -23535, /* B1 = -1.436523 */
9095 24324, /* B0 = 0.74231 */
9096 7, /* Internal filter scaling */
9097 159, /* Minimum in-band energy threshold */
9098 21, /* 21/32 in-band to broad-band ratio */
9099 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9100 },
9101 { /* f350_440[] */
9102 30634, /* A1 = 1.869751 */
9103 -31533, /* A2 = -0.962341 */
9104 -680, /* B2 = -0.020782 */
9105 0, /* B1 = 0 */
9106 680, /* B0 = 0.020782 */
9107 30571, /* A1 = 1.865906 */
9108 -32277, /* A2 = -0.985016 */
9109 12894, /* B2 = 0.393524 */
9110 -11945, /* B1 = -0.729065 */
9111 12894, /* B0 = 0.393524 */
9112 31367, /* A1 = 1.91449 */
9113 -32379, /* A2 = -0.988129 */
9114 23820, /* B2 = 0.726929 */
9115 -23104, /* B1 = -1.410217 */
9116 23820, /* B0 = 0.726929 */
9117 7, /* Internal filter scaling */
9118 159, /* Minimum in-band energy threshold */
9119 21, /* 21/32 in-band to broad-band ratio */
9120 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9121 },
9122 { /* f350_450[] */
9123 30552, /* A1 = 1.864807 */
9124 -31434, /* A2 = -0.95929 */
9125 -690, /* B2 = -0.021066 */
9126 0, /* B1 = 0 */
9127 690, /* B0 = 0.021066 */
9128 30472, /* A1 = 1.859924 */
9129 -32248, /* A2 = -0.984161 */
9130 13385, /* B2 = 0.408478 */
9131 -12357, /* B1 = -0.754242 */
9132 13385, /* B0 = 0.408478 */
9133 31358, /* A1 = 1.914001 */
9134 -32366, /* A2 = -0.987732 */
9135 26488, /* B2 = 0.80835 */
9136 -25692, /* B1 = -1.568176 */
9137 26490, /* B0 = 0.808411 */
9138 7, /* Internal filter scaling */
9139 159, /* Minimum in-band energy threshold */
9140 21, /* 21/32 in-band to broad-band ratio */
9141 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9142 },
9143 { /* f360 */
9144 31397, /* A1 = -1.916321 */
9145 -32623, /* A2 = 0.995605 */
9146 -117, /* B2 = -0.003598 */
9147 0, /* B1 = 0.000000 */
9148 117, /* B0 = 0.003598 */
9149 31403, /* A1 = -1.916687 */
9150 -32700, /* A2 = 0.997925 */
9151 3388, /* B2 = 0.103401 */
9152 -3240, /* B1 = -0.197784 */
9153 3388, /* B0 = 0.103401 */
9154 31463, /* A1 = -1.920410 */
9155 -32702, /* A2 = 0.997986 */
9156 13346, /* B2 = 0.407288 */
9157 -12863, /* B1 = -0.785126 */
9158 13346, /* B0 = 0.407288 */
9159 5, /* Internal filter scaling */
9160 159, /* Minimum in-band energy threshold */
9161 21, /* 21/32 in-band to broad-band ratio */
9162 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9163 },
9164 { /* f380_420[] */
9165 30831, /* A1 = 1.881775 */
9166 -32064, /* A2 = -0.978546 */
9167 -367, /* B2 = -0.01122 */
9168 0, /* B1 = 0 */
9169 367, /* B0 = 0.01122 */
9170 30813, /* A1 = 1.880737 */
9171 -32456, /* A2 = -0.990509 */
9172 11068, /* B2 = 0.337769 */
9173 -10338, /* B1 = -0.631042 */
9174 11068, /* B0 = 0.337769 */
9175 31214, /* A1 = 1.905212 */
9176 -32491, /* A2 = -0.991577 */
9177 16374, /* B2 = 0.499695 */
9178 -15781, /* B1 = -0.963196 */
9179 16374, /* B0 = 0.499695 */
9180 7, /* Internal filter scaling */
9181 159, /* Minimum in-band energy threshold */
9182 21, /* 21/32 in-band to broad-band ratio */
9183 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9184 },
9185 { /* f392 */
9186 31152, /* A1 = -1.901428 */
9187 -32613, /* A2 = 0.995300 */
9188 -314, /* B2 = -0.009605 */
9189 0, /* B1 = 0.000000 */
9190 314, /* B0 = 0.009605 */
9191 31156, /* A1 = -1.901672 */
9192 -32694, /* A2 = 0.997742 */
9193 28847, /* B2 = 0.880371 */
9194 -2734, /* B1 = -0.166901 */
9195 28847, /* B0 = 0.880371 */
9196 31225, /* A1 = -1.905823 */
9197 -32696, /* A2 = 0.997803 */
9198 462, /* B2 = 0.014108 */
9199 -442, /* B1 = -0.027019 */
9200 462, /* B0 = 0.014108 */
9201 5, /* Internal filter scaling */
9202 159, /* Minimum in-band energy threshold */
9203 21, /* 21/32 in-band to broad-band ratio */
9204 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9205 },
9206 { /* f400_425[] */
9207 30836, /* A1 = 1.882141 */
9208 -32296, /* A2 = -0.985596 */
9209 -324, /* B2 = -0.009903 */
9210 0, /* B1 = 0 */
9211 324, /* B0 = 0.009903 */
9212 30825, /* A1 = 1.881409 */
9213 -32570, /* A2 = -0.993958 */
9214 16847, /* B2 = 0.51416 */
9215 -15792, /* B1 = -0.963898 */
9216 16847, /* B0 = 0.51416 */
9217 31106, /* A1 = 1.89856 */
9218 -32584, /* A2 = -0.994415 */
9219 9579, /* B2 = 0.292328 */
9220 -9164, /* B1 = -0.559357 */
9221 9579, /* B0 = 0.292328 */
9222 7, /* Internal filter scaling */
9223 159, /* Minimum in-band energy threshold */
9224 21, /* 21/32 in-band to broad-band ratio */
9225 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9226 },
9227 { /* f400_440[] */
9228 30702, /* A1 = 1.873962 */
9229 -32134, /* A2 = -0.980682 */
9230 -517, /* B2 = -0.015793 */
9231 0, /* B1 = 0 */
9232 517, /* B0 = 0.015793 */
9233 30676, /* A1 = 1.872375 */
9234 -32520, /* A2 = -0.992462 */
9235 8144, /* B2 = 0.24855 */
9236 -7596, /* B1 = -0.463684 */
9237 8144, /* B0 = 0.24855 */
9238 31084, /* A1 = 1.897217 */
9239 -32547, /* A2 = -0.993256 */
9240 22713, /* B2 = 0.693176 */
9241 -21734, /* B1 = -1.326599 */
9242 22713, /* B0 = 0.693176 */
9243 7, /* Internal filter scaling */
9244 159, /* Minimum in-band energy threshold */
9245 21, /* 21/32 in-band to broad-band ratio */
9246 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9247 },
9248 { /* f400_450[] */
9249 30613, /* A1 = 1.86853 */
9250 -32031, /* A2 = -0.977509 */
9251 -618, /* B2 = -0.018866 */
9252 0, /* B1 = 0 */
9253 618, /* B0 = 0.018866 */
9254 30577, /* A1 = 1.866272 */
9255 -32491, /* A2 = -0.991577 */
9256 9612, /* B2 = 0.293335 */
9257 -8935, /* B1 = -0.54541 */
9258 9612, /* B0 = 0.293335 */
9259 31071, /* A1 = 1.896484 */
9260 -32524, /* A2 = -0.992584 */
9261 21596, /* B2 = 0.659058 */
9262 -20667, /* B1 = -1.261414 */
9263 21596, /* B0 = 0.659058 */
9264 7, /* Internal filter scaling */
9265 159, /* Minimum in-band energy threshold */
9266 21, /* 21/32 in-band to broad-band ratio */
9267 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9268 },
9269 { /* f420 */
9270 30914, /* A1 = -1.886841 */
9271 -32584, /* A2 = 0.994385 */
9272 -426, /* B2 = -0.013020 */
9273 0, /* B1 = 0.000000 */
9274 426, /* B0 = 0.013020 */
9275 30914, /* A1 = -1.886841 */
9276 -32679, /* A2 = 0.997314 */
9277 17520, /* B2 = 0.534668 */
9278 -16471, /* B1 = -1.005310 */
9279 17520, /* B0 = 0.534668 */
9280 31004, /* A1 = -1.892334 */
9281 -32683, /* A2 = 0.997406 */
9282 819, /* B2 = 0.025023 */
9283 -780, /* B1 = -0.047619 */
9284 819, /* B0 = 0.025023 */
9285 5, /* Internal filter scaling */
9286 159, /* Minimum in-band energy threshold */
9287 21, /* 21/32 in-band to broad-band ratio */
9288 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9289 },
9290#if 0
9291 { /* f425 */
9292 30881, /* A1 = -1.884827 */
9293 -32603, /* A2 = 0.994965 */
9294 -496, /* B2 = -0.015144 */
9295 0, /* B1 = 0.000000 */
9296 496, /* B0 = 0.015144 */
9297 30880, /* A1 = -1.884766 */
9298 -32692, /* A2 = 0.997711 */
9299 24767, /* B2 = 0.755859 */
9300 -23290, /* B1 = -1.421509 */
9301 24767, /* B0 = 0.755859 */
9302 30967, /* A1 = -1.890076 */
9303 -32694, /* A2 = 0.997772 */
9304 728, /* B2 = 0.022232 */
9305 -691, /* B1 = -0.042194 */
9306 728, /* B0 = 0.022232 */
9307 5, /* Internal filter scaling */
9308 159, /* Minimum in-band energy threshold */
9309 21, /* 21/32 in-band to broad-band ratio */
9310 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9311 },
9312#else
9313 {
9314 30850,
9315 -32534,
9316 -504,
9317 0,
9318 504,
9319 30831,
9320 -32669,
9321 24303,
9322 -22080,
9323 24303,
9324 30994,
9325 -32673,
9326 1905,
9327 -1811,
9328 1905,
9329 5,
9330 129,
9331 17,
9332 0xff5
9333 },
9334#endif
9335 { /* f425_450[] */
9336 30646, /* A1 = 1.870544 */
9337 -32327, /* A2 = -0.986572 */
9338 -287, /* B2 = -0.008769 */
9339 0, /* B1 = 0 */
9340 287, /* B0 = 0.008769 */
9341 30627, /* A1 = 1.869324 */
9342 -32607, /* A2 = -0.995087 */
9343 13269, /* B2 = 0.404968 */
9344 -12376, /* B1 = -0.755432 */
9345 13269, /* B0 = 0.404968 */
9346 30924, /* A1 = 1.887512 */
9347 -32619, /* A2 = -0.995453 */
9348 19950, /* B2 = 0.608826 */
9349 -18940, /* B1 = -1.156006 */
9350 19950, /* B0 = 0.608826 */
9351 7, /* Internal filter scaling */
9352 159, /* Minimum in-band energy threshold */
9353 21, /* 21/32 in-band to broad-band ratio */
9354 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9355 },
9356 { /* f425_475[] */
9357 30396, /* A1 = 1.855225 */
9358 -32014, /* A2 = -0.97699 */
9359 -395, /* B2 = -0.012055 */
9360 0, /* B1 = 0 */
9361 395, /* B0 = 0.012055 */
9362 30343, /* A1 = 1.85199 */
9363 -32482, /* A2 = -0.991302 */
9364 17823, /* B2 = 0.543945 */
9365 -16431, /* B1 = -1.002869 */
9366 17823, /* B0 = 0.543945 */
9367 30872, /* A1 = 1.884338 */
9368 -32516, /* A2 = -0.99231 */
9369 18124, /* B2 = 0.553101 */
9370 -17246, /* B1 = -1.052673 */
9371 18124, /* B0 = 0.553101 */
9372 7, /* Internal filter scaling */
9373 159, /* Minimum in-band energy threshold */
9374 21, /* 21/32 in-band to broad-band ratio */
9375 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9376 },
9377 { /* f435 */
9378 30796, /* A1 = -1.879639 */
9379 -32603, /* A2 = 0.994965 */
9380 -254, /* B2 = -0.007762 */
9381 0, /* B1 = 0.000000 */
9382 254, /* B0 = 0.007762 */
9383 30793, /* A1 = -1.879456 */
9384 -32692, /* A2 = 0.997711 */
9385 18934, /* B2 = 0.577820 */
9386 -17751, /* B1 = -1.083496 */
9387 18934, /* B0 = 0.577820 */
9388 30882, /* A1 = -1.884888 */
9389 -32694, /* A2 = 0.997772 */
9390 1858, /* B2 = 0.056713 */
9391 -1758, /* B1 = -0.107357 */
9392 1858, /* B0 = 0.056713 */
9393 5, /* Internal filter scaling */
9394 159, /* Minimum in-band energy threshold */
9395 21, /* 21/32 in-band to broad-band ratio */
9396 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9397 },
9398 { /* f440_450[] */
9399 30641, /* A1 = 1.870239 */
9400 -32458, /* A2 = -0.99057 */
9401 -155, /* B2 = -0.004735 */
9402 0, /* B1 = 0 */
9403 155, /* B0 = 0.004735 */
9404 30631, /* A1 = 1.869568 */
9405 -32630, /* A2 = -0.995789 */
9406 11453, /* B2 = 0.349548 */
9407 -10666, /* B1 = -0.651001 */
9408 11453, /* B0 = 0.349548 */
9409 30810, /* A1 = 1.880554 */
9410 -32634, /* A2 = -0.995941 */
9411 12237, /* B2 = 0.373474 */
9412 -11588, /* B1 = -0.707336 */
9413 12237, /* B0 = 0.373474 */
9414 7, /* Internal filter scaling */
9415 159, /* Minimum in-band energy threshold */
9416 21, /* 21/32 in-band to broad-band ratio */
9417 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9418 },
9419 { /* f440_480[] */
9420 30367, /* A1 = 1.853455 */
9421 -32147, /* A2 = -0.981079 */
9422 -495, /* B2 = -0.015113 */
9423 0, /* B1 = 0 */
9424 495, /* B0 = 0.015113 */
9425 30322, /* A1 = 1.850769 */
9426 -32543, /* A2 = -0.993134 */
9427 10031, /* B2 = 0.306152 */
9428 -9252, /* B1 = -0.564728 */
9429 10031, /* B0 = 0.306152 */
9430 30770, /* A1 = 1.878052 */
9431 -32563, /* A2 = -0.993774 */
9432 22674, /* B2 = 0.691956 */
9433 -21465, /* B1 = -1.31012 */
9434 22674, /* B0 = 0.691956 */
9435 7, /* Internal filter scaling */
9436 159, /* Minimum in-band energy threshold */
9437 21, /* 21/32 in-band to broad-band ratio */
9438 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9439 },
9440 { /* f445 */
9441 30709, /* A1 = -1.874329 */
9442 -32603, /* A2 = 0.994965 */
9443 -83, /* B2 = -0.002545 */
9444 0, /* B1 = 0.000000 */
9445 83, /* B0 = 0.002545 */
9446 30704, /* A1 = -1.874084 */
9447 -32692, /* A2 = 0.997711 */
9448 10641, /* B2 = 0.324738 */
9449 -9947, /* B1 = -0.607147 */
9450 10641, /* B0 = 0.324738 */
9451 30796, /* A1 = -1.879639 */
9452 -32694, /* A2 = 0.997772 */
9453 10079, /* B2 = 0.307587 */
9454 9513, /* B1 = 0.580688 */
9455 10079, /* B0 = 0.307587 */
9456 5, /* Internal filter scaling */
9457 159, /* Minimum in-band energy threshold */
9458 21, /* 21/32 in-band to broad-band ratio */
9459 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9460 },
9461 { /* f450 */
9462 30664, /* A1 = -1.871643 */
9463 -32603, /* A2 = 0.994965 */
9464 -164, /* B2 = -0.005029 */
9465 0, /* B1 = 0.000000 */
9466 164, /* B0 = 0.005029 */
9467 30661, /* A1 = -1.871399 */
9468 -32692, /* A2 = 0.997711 */
9469 15294, /* B2 = 0.466736 */
9470 -14275, /* B1 = -0.871307 */
9471 15294, /* B0 = 0.466736 */
9472 30751, /* A1 = -1.876953 */
9473 -32694, /* A2 = 0.997772 */
9474 3548, /* B2 = 0.108284 */
9475 -3344, /* B1 = -0.204155 */
9476 3548, /* B0 = 0.108284 */
9477 5, /* Internal filter scaling */
9478 159, /* Minimum in-band energy threshold */
9479 21, /* 21/32 in-band to broad-band ratio */
9480 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9481 },
9482 { /* f452 */
9483 30653, /* A1 = -1.870911 */
9484 -32615, /* A2 = 0.995361 */
9485 -209, /* B2 = -0.006382 */
9486 0, /* B1 = 0.000000 */
9487 209, /* B0 = 0.006382 */
9488 30647, /* A1 = -1.870605 */
9489 -32702, /* A2 = 0.997986 */
9490 18971, /* B2 = 0.578979 */
9491 -17716, /* B1 = -1.081299 */
9492 18971, /* B0 = 0.578979 */
9493 30738, /* A1 = -1.876099 */
9494 -32702, /* A2 = 0.998016 */
9495 2967, /* B2 = 0.090561 */
9496 -2793, /* B1 = -0.170502 */
9497 2967, /* B0 = 0.090561 */
9498 5, /* Internal filter scaling */
9499 159, /* Minimum in-band energy threshold */
9500 21, /* 21/32 in-band to broad-band ratio */
9501 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9502 },
9503 { /* f475 */
9504 30437, /* A1 = -1.857727 */
9505 -32603, /* A2 = 0.994965 */
9506 -264, /* B2 = -0.008062 */
9507 0, /* B1 = 0.000000 */
9508 264, /* B0 = 0.008062 */
9509 30430, /* A1 = -1.857300 */
9510 -32692, /* A2 = 0.997711 */
9511 21681, /* B2 = 0.661682 */
9512 -20082, /* B1 = -1.225708 */
9513 21681, /* B0 = 0.661682 */
9514 30526, /* A1 = -1.863220 */
9515 -32694, /* A2 = 0.997742 */
9516 1559, /* B2 = 0.047600 */
9517 -1459, /* B1 = -0.089096 */
9518 1559, /* B0 = 0.047600 */
9519 5, /* Internal filter scaling */
9520 159, /* Minimum in-band energy threshold */
9521 21, /* 21/32 in-band to broad-band ratio */
9522 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9523 },
9524 { /* f480_620[] */
9525 28975, /* A1 = 1.768494 */
9526 -30955, /* A2 = -0.944672 */
9527 -1026, /* B2 = -0.03133 */
9528 0, /* B1 = 0 */
9529 1026, /* B0 = 0.03133 */
9530 28613, /* A1 = 1.746399 */
9531 -32089, /* A2 = -0.979309 */
9532 14214, /* B2 = 0.433807 */
9533 -12202, /* B1 = -0.744812 */
9534 14214, /* B0 = 0.433807 */
9535 30243, /* A1 = 1.845947 */
9536 -32238, /* A2 = -0.983856 */
9537 24825, /* B2 = 0.757629 */
9538 -23402, /* B1 = -1.428345 */
9539 24825, /* B0 = 0.757629 */
9540 7, /* Internal filter scaling */
9541 159, /* Minimum in-band energy threshold */
9542 21, /* 21/32 in-band to broad-band ratio */
9543 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9544 },
9545 { /* f494 */
9546 30257, /* A1 = -1.846741 */
9547 -32605, /* A2 = 0.995056 */
9548 -249, /* B2 = -0.007625 */
9549 0, /* B1 = 0.000000 */
9550 249, /* B0 = 0.007625 */
9551 30247, /* A1 = -1.846191 */
9552 -32694, /* A2 = 0.997772 */
9553 18088, /* B2 = 0.552002 */
9554 -16652, /* B1 = -1.016418 */
9555 18088, /* B0 = 0.552002 */
9556 30348, /* A1 = -1.852295 */
9557 -32696, /* A2 = 0.997803 */
9558 2099, /* B2 = 0.064064 */
9559 -1953, /* B1 = -0.119202 */
9560 2099, /* B0 = 0.064064 */
9561 5, /* Internal filter scaling */
9562 159, /* Minimum in-band energy threshold */
9563 21, /* 21/32 in-band to broad-band ratio */
9564 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9565 },
9566 { /* f500 */
9567 30202, /* A1 = -1.843431 */
9568 -32624, /* A2 = 0.995622 */
9569 -413, /* B2 = -0.012622 */
9570 0, /* B1 = 0.000000 */
9571 413, /* B0 = 0.012622 */
9572 30191, /* A1 = -1.842721 */
9573 -32714, /* A2 = 0.998364 */
9574 25954, /* B2 = 0.792057 */
9575 -23890, /* B1 = -1.458131 */
9576 25954, /* B0 = 0.792057 */
9577 30296, /* A1 = -1.849172 */
9578 -32715, /* A2 = 0.998397 */
9579 2007, /* B2 = 0.061264 */
9580 -1860, /* B1 = -0.113568 */
9581 2007, /* B0 = 0.061264 */
9582 5, /* Internal filter scaling */
9583 159, /* Minimum in-band energy threshold */
9584 21, /* 21/32 in-band to broad-band ratio */
9585 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9586 },
9587 { /* f520 */
9588 30001, /* A1 = -1.831116 */
9589 -32613, /* A2 = 0.995270 */
9590 -155, /* B2 = -0.004750 */
9591 0, /* B1 = 0.000000 */
9592 155, /* B0 = 0.004750 */
9593 29985, /* A1 = -1.830200 */
9594 -32710, /* A2 = 0.998260 */
9595 6584, /* B2 = 0.200928 */
9596 -6018, /* B1 = -0.367355 */
9597 6584, /* B0 = 0.200928 */
9598 30105, /* A1 = -1.837524 */
9599 -32712, /* A2 = 0.998291 */
9600 23812, /* B2 = 0.726685 */
9601 -21936, /* B1 = -1.338928 */
9602 23812, /* B0 = 0.726685 */
9603 5, /* Internal filter scaling */
9604 159, /* Minimum in-band energy threshold */
9605 21, /* 21/32 in-band to broad-band ratio */
9606 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9607 },
9608 { /* f523 */
9609 29964, /* A1 = -1.828918 */
9610 -32601, /* A2 = 0.994904 */
9611 -101, /* B2 = -0.003110 */
9612 0, /* B1 = 0.000000 */
9613 101, /* B0 = 0.003110 */
9614 29949, /* A1 = -1.827942 */
9615 -32700, /* A2 = 0.997925 */
9616 11041, /* B2 = 0.336975 */
9617 -10075, /* B1 = -0.614960 */
9618 11041, /* B0 = 0.336975 */
9619 30070, /* A1 = -1.835388 */
9620 -32702, /* A2 = 0.997986 */
9621 16762, /* B2 = 0.511536 */
9622 -15437, /* B1 = -0.942230 */
9623 16762, /* B0 = 0.511536 */
9624 5, /* Internal filter scaling */
9625 159, /* Minimum in-band energy threshold */
9626 21, /* 21/32 in-band to broad-band ratio */
9627 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9628 },
9629 { /* f525 */
9630 29936, /* A1 = -1.827209 */
9631 -32584, /* A2 = 0.994415 */
9632 -91, /* B2 = -0.002806 */
9633 0, /* B1 = 0.000000 */
9634 91, /* B0 = 0.002806 */
9635 29921, /* A1 = -1.826233 */
9636 -32688, /* A2 = 0.997559 */
9637 11449, /* B2 = 0.349396 */
9638 -10426, /* B1 = -0.636383 */
9639 11449, /* B0 = 0.349396 */
9640 30045, /* A1 = -1.833862 */
9641 -32688, /* A2 = 0.997589 */
9642 13055, /* B2 = 0.398407 */
9643 -12028, /* B1 = -0.734161 */
9644 13055, /* B0 = 0.398407 */
9645 5, /* Internal filter scaling */
9646 159, /* Minimum in-band energy threshold */
9647 21, /* 21/32 in-band to broad-band ratio */
9648 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9649 },
9650 { /* f540_660[] */
9651 28499, /* A1 = 1.739441 */
9652 -31129, /* A2 = -0.949982 */
9653 -849, /* B2 = -0.025922 */
9654 0, /* B1 = 0 */
9655 849, /* B0 = 0.025922 */
9656 28128, /* A1 = 1.716797 */
9657 -32130, /* A2 = -0.98056 */
9658 14556, /* B2 = 0.444214 */
9659 -12251, /* B1 = -0.747772 */
9660 14556, /* B0 = 0.444244 */
9661 29667, /* A1 = 1.81073 */
9662 -32244, /* A2 = -0.984039 */
9663 23038, /* B2 = 0.703064 */
9664 -21358, /* B1 = -1.303589 */
9665 23040, /* B0 = 0.703125 */
9666 7, /* Internal filter scaling */
9667 159, /* Minimum in-band energy threshold */
9668 21, /* 21/32 in-band to broad-band ratio */
9669 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9670 },
9671 { /* f587 */
9672 29271, /* A1 = -1.786560 */
9673 -32599, /* A2 = 0.994873 */
9674 -490, /* B2 = -0.014957 */
9675 0, /* B1 = 0.000000 */
9676 490, /* B0 = 0.014957 */
9677 29246, /* A1 = -1.785095 */
9678 -32700, /* A2 = 0.997925 */
9679 28961, /* B2 = 0.883850 */
9680 -25796, /* B1 = -1.574463 */
9681 28961, /* B0 = 0.883850 */
9682 29383, /* A1 = -1.793396 */
9683 -32700, /* A2 = 0.997955 */
9684 1299, /* B2 = 0.039650 */
9685 -1169, /* B1 = -0.071396 */
9686 1299, /* B0 = 0.039650 */
9687 5, /* Internal filter scaling */
9688 159, /* Minimum in-band energy threshold */
9689 21, /* 21/32 in-band to broad-band ratio */
9690 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9691 },
9692 { /* f590 */
9693 29230, /* A1 = -1.784058 */
9694 -32584, /* A2 = 0.994415 */
9695 -418, /* B2 = -0.012757 */
9696 0, /* B1 = 0.000000 */
9697 418, /* B0 = 0.012757 */
9698 29206, /* A1 = -1.782593 */
9699 -32688, /* A2 = 0.997559 */
9700 36556, /* B2 = 1.115601 */
9701 -32478, /* B1 = -1.982300 */
9702 36556, /* B0 = 1.115601 */
9703 29345, /* A1 = -1.791077 */
9704 -32688, /* A2 = 0.997589 */
9705 897, /* B2 = 0.027397 */
9706 -808, /* B1 = -0.049334 */
9707 897, /* B0 = 0.027397 */
9708 5, /* Internal filter scaling */
9709 159, /* Minimum in-band energy threshold */
9710 21, /* 21/32 in-band to broad-band ratio */
9711 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9712 },
9713 { /* f600 */
9714 29116, /* A1 = -1.777100 */
9715 -32603, /* A2 = 0.994965 */
9716 -165, /* B2 = -0.005039 */
9717 0, /* B1 = 0.000000 */
9718 165, /* B0 = 0.005039 */
9719 29089, /* A1 = -1.775452 */
9720 -32708, /* A2 = 0.998199 */
9721 6963, /* B2 = 0.212494 */
9722 -6172, /* B1 = -0.376770 */
9723 6963, /* B0 = 0.212494 */
9724 29237, /* A1 = -1.784485 */
9725 -32710, /* A2 = 0.998230 */
9726 24197, /* B2 = 0.738464 */
9727 -21657, /* B1 = -1.321899 */
9728 24197, /* B0 = 0.738464 */
9729 5, /* Internal filter scaling */
9730 159, /* Minimum in-band energy threshold */
9731 21, /* 21/32 in-band to broad-band ratio */
9732 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9733 },
9734 { /* f660 */
9735 28376, /* A1 = -1.731934 */
9736 -32567, /* A2 = 0.993896 */
9737 -363, /* B2 = -0.011102 */
9738 0, /* B1 = 0.000000 */
9739 363, /* B0 = 0.011102 */
9740 28337, /* A1 = -1.729614 */
9741 -32683, /* A2 = 0.997434 */
9742 21766, /* B2 = 0.664246 */
9743 -18761, /* B1 = -1.145081 */
9744 21766, /* B0 = 0.664246 */
9745 28513, /* A1 = -1.740356 */
9746 -32686, /* A2 = 0.997498 */
9747 2509, /* B2 = 0.076584 */
9748 -2196, /* B1 = -0.134041 */
9749 2509, /* B0 = 0.076584 */
9750 5, /* Internal filter scaling */
9751 159, /* Minimum in-band energy threshold */
9752 21, /* 21/32 in-band to broad-band ratio */
9753 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9754 },
9755 { /* f700 */
9756 27844, /* A1 = -1.699463 */
9757 -32563, /* A2 = 0.993744 */
9758 -366, /* B2 = -0.011187 */
9759 0, /* B1 = 0.000000 */
9760 366, /* B0 = 0.011187 */
9761 27797, /* A1 = -1.696655 */
9762 -32686, /* A2 = 0.997498 */
9763 22748, /* B2 = 0.694214 */
9764 -19235, /* B1 = -1.174072 */
9765 22748, /* B0 = 0.694214 */
9766 27995, /* A1 = -1.708740 */
9767 -32688, /* A2 = 0.997559 */
9768 2964, /* B2 = 0.090477 */
9769 -2546, /* B1 = -0.155449 */
9770 2964, /* B0 = 0.090477 */
9771 5, /* Internal filter scaling */
9772 159, /* Minimum in-band energy threshold */
9773 21, /* 21/32 in-band to broad-band ratio */
9774 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9775 },
9776 { /* f740 */
9777 27297, /* A1 = -1.666077 */
9778 -32551, /* A2 = 0.993408 */
9779 -345, /* B2 = -0.010540 */
9780 0, /* B1 = 0.000000 */
9781 345, /* B0 = 0.010540 */
9782 27240, /* A1 = -1.662598 */
9783 -32683, /* A2 = 0.997406 */
9784 22560, /* B2 = 0.688477 */
9785 -18688, /* B1 = -1.140625 */
9786 22560, /* B0 = 0.688477 */
9787 27461, /* A1 = -1.676147 */
9788 -32684, /* A2 = 0.997467 */
9789 3541, /* B2 = 0.108086 */
9790 -2985, /* B1 = -0.182220 */
9791 3541, /* B0 = 0.108086 */
9792 5, /* Internal filter scaling */
9793 159, /* Minimum in-band energy threshold */
9794 21, /* 21/32 in-band to broad-band ratio */
9795 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9796 },
9797 { /* f750 */
9798 27155, /* A1 = -1.657410 */
9799 -32551, /* A2 = 0.993408 */
9800 -462, /* B2 = -0.014117 */
9801 0, /* B1 = 0.000000 */
9802 462, /* B0 = 0.014117 */
9803 27097, /* A1 = -1.653870 */
9804 -32683, /* A2 = 0.997406 */
9805 32495, /* B2 = 0.991699 */
9806 -26776, /* B1 = -1.634338 */
9807 32495, /* B0 = 0.991699 */
9808 27321, /* A1 = -1.667542 */
9809 -32684, /* A2 = 0.997467 */
9810 1835, /* B2 = 0.056007 */
9811 -1539, /* B1 = -0.093948 */
9812 1835, /* B0 = 0.056007 */
9813 5, /* Internal filter scaling */
9814 159, /* Minimum in-band energy threshold */
9815 21, /* 21/32 in-band to broad-band ratio */
9816 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9817 },
9818 { /* f750_1450[] */
9819 19298, /* A1 = 1.177917 */
9820 -24471, /* A2 = -0.746796 */
9821 -4152, /* B2 = -0.126709 */
9822 0, /* B1 = 0 */
9823 4152, /* B0 = 0.126709 */
9824 12902, /* A1 = 0.787476 */
9825 -29091, /* A2 = -0.887817 */
9826 12491, /* B2 = 0.38121 */
9827 -1794, /* B1 = -0.109528 */
9828 12494, /* B0 = 0.381317 */
9829 26291, /* A1 = 1.604736 */
9830 -30470, /* A2 = -0.929901 */
9831 28859, /* B2 = 0.880737 */
9832 -26084, /* B1 = -1.592102 */
9833 28861, /* B0 = 0.880798 */
9834 7, /* Internal filter scaling */
9835 159, /* Minimum in-band energy threshold */
9836 21, /* 21/32 in-band to broad-band ratio */
9837 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9838 },
9839 { /* f770 */
9840 26867, /* A1 = -1.639832 */
9841 -32551, /* A2 = 0.993408 */
9842 -123, /* B2 = -0.003755 */
9843 0, /* B1 = 0.000000 */
9844 123, /* B0 = 0.003755 */
9845 26805, /* A1 = -1.636108 */
9846 -32683, /* A2 = 0.997406 */
9847 17297, /* B2 = 0.527863 */
9848 -14096, /* B1 = -0.860382 */
9849 17297, /* B0 = 0.527863 */
9850 27034, /* A1 = -1.650085 */
9851 -32684, /* A2 = 0.997467 */
9852 12958, /* B2 = 0.395477 */
9853 -10756, /* B1 = -0.656525 */
9854 12958, /* B0 = 0.395477 */
9855 5, /* Internal filter scaling */
9856 159, /* Minimum in-band energy threshold */
9857 21, /* 21/32 in-band to broad-band ratio */
9858 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9859 },
9860 { /* f800 */
9861 26413, /* A1 = -1.612122 */
9862 -32547, /* A2 = 0.993286 */
9863 -223, /* B2 = -0.006825 */
9864 0, /* B1 = 0.000000 */
9865 223, /* B0 = 0.006825 */
9866 26342, /* A1 = -1.607849 */
9867 -32686, /* A2 = 0.997498 */
9868 6391, /* B2 = 0.195053 */
9869 -5120, /* B1 = -0.312531 */
9870 6391, /* B0 = 0.195053 */
9871 26593, /* A1 = -1.623108 */
9872 -32688, /* A2 = 0.997559 */
9873 23681, /* B2 = 0.722717 */
9874 -19328, /* B1 = -1.179688 */
9875 23681, /* B0 = 0.722717 */
9876 5, /* Internal filter scaling */
9877 159, /* Minimum in-band energy threshold */
9878 21, /* 21/32 in-band to broad-band ratio */
9879 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9880 },
9881 { /* f816 */
9882 26168, /* A1 = -1.597209 */
9883 -32528, /* A2 = 0.992706 */
9884 -235, /* B2 = -0.007182 */
9885 0, /* B1 = 0.000000 */
9886 235, /* B0 = 0.007182 */
9887 26092, /* A1 = -1.592590 */
9888 -32675, /* A2 = 0.997192 */
9889 20823, /* B2 = 0.635498 */
9890 -16510, /* B1 = -1.007751 */
9891 20823, /* B0 = 0.635498 */
9892 26363, /* A1 = -1.609070 */
9893 -32677, /* A2 = 0.997253 */
9894 6739, /* B2 = 0.205688 */
9895 -5459, /* B1 = -0.333206 */
9896 6739, /* B0 = 0.205688 */
9897 5, /* Internal filter scaling */
9898 159, /* Minimum in-band energy threshold */
9899 21, /* 21/32 in-band to broad-band ratio */
9900 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9901 },
9902 { /* f850 */
9903 25641, /* A1 = -1.565063 */
9904 -32536, /* A2 = 0.992950 */
9905 -121, /* B2 = -0.003707 */
9906 0, /* B1 = 0.000000 */
9907 121, /* B0 = 0.003707 */
9908 25560, /* A1 = -1.560059 */
9909 -32684, /* A2 = 0.997437 */
9910 18341, /* B2 = 0.559753 */
9911 -14252, /* B1 = -0.869904 */
9912 18341, /* B0 = 0.559753 */
9913 25837, /* A1 = -1.577026 */
9914 -32684, /* A2 = 0.997467 */
9915 16679, /* B2 = 0.509003 */
9916 -13232, /* B1 = -0.807648 */
9917 16679, /* B0 = 0.509003 */
9918 5, /* Internal filter scaling */
9919 159, /* Minimum in-band energy threshold */
9920 21, /* 21/32 in-band to broad-band ratio */
9921 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9922 },
9923 { /* f857_1645[] */
9924 16415, /* A1 = 1.001953 */
9925 -23669, /* A2 = -0.722321 */
9926 -4549, /* B2 = -0.138847 */
9927 0, /* B1 = 0 */
9928 4549, /* B0 = 0.138847 */
9929 8456, /* A1 = 0.516174 */
9930 -28996, /* A2 = -0.884918 */
9931 13753, /* B2 = 0.419724 */
9932 -12, /* B1 = -0.000763 */
9933 13757, /* B0 = 0.419846 */
9934 24632, /* A1 = 1.503418 */
9935 -30271, /* A2 = -0.923828 */
9936 29070, /* B2 = 0.887146 */
9937 -25265, /* B1 = -1.542114 */
9938 29073, /* B0 = 0.887268 */
9939 7, /* Internal filter scaling */
9940 159, /* Minimum in-band energy threshold */
9941 21, /* 21/32 in-band to broad-band ratio */
9942 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9943 },
9944 { /* f900 */
9945 24806, /* A1 = -1.514099 */
9946 -32501, /* A2 = 0.991852 */
9947 -326, /* B2 = -0.009969 */
9948 0, /* B1 = 0.000000 */
9949 326, /* B0 = 0.009969 */
9950 24709, /* A1 = -1.508118 */
9951 -32659, /* A2 = 0.996674 */
9952 20277, /* B2 = 0.618835 */
9953 -15182, /* B1 = -0.926636 */
9954 20277, /* B0 = 0.618835 */
9955 25022, /* A1 = -1.527222 */
9956 -32661, /* A2 = 0.996735 */
9957 4320, /* B2 = 0.131836 */
9958 -3331, /* B1 = -0.203339 */
9959 4320, /* B0 = 0.131836 */
9960 5, /* Internal filter scaling */
9961 159, /* Minimum in-band energy threshold */
9962 21, /* 21/32 in-band to broad-band ratio */
9963 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9964 },
9965 { /* f900_1300[] */
9966 19776, /* A1 = 1.207092 */
9967 -27437, /* A2 = -0.837341 */
9968 -2666, /* B2 = -0.081371 */
9969 0, /* B1 = 0 */
9970 2666, /* B0 = 0.081371 */
9971 16302, /* A1 = 0.995026 */
9972 -30354, /* A2 = -0.926361 */
9973 10389, /* B2 = 0.317062 */
9974 -3327, /* B1 = -0.203064 */
9975 10389, /* B0 = 0.317062 */
9976 24299, /* A1 = 1.483154 */
9977 -30930, /* A2 = -0.943909 */
9978 25016, /* B2 = 0.763428 */
9979 -21171, /* B1 = -1.292236 */
9980 25016, /* B0 = 0.763428 */
9981 7, /* Internal filter scaling */
9982 159, /* Minimum in-band energy threshold */
9983 21, /* 21/32 in-band to broad-band ratio */
9984 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9985 },
9986 { /* f935_1215[] */
9987 20554, /* A1 = 1.254517 */
9988 -28764, /* A2 = -0.877838 */
9989 -2048, /* B2 = -0.062515 */
9990 0, /* B1 = 0 */
9991 2048, /* B0 = 0.062515 */
9992 18209, /* A1 = 1.11145 */
9993 -30951, /* A2 = -0.94458 */
9994 9390, /* B2 = 0.286575 */
9995 -3955, /* B1 = -0.241455 */
9996 9390, /* B0 = 0.286575 */
9997 23902, /* A1 = 1.458923 */
9998 -31286, /* A2 = -0.954803 */
9999 23252, /* B2 = 0.709595 */
10000 -19132, /* B1 = -1.167725 */
10001 23252, /* B0 = 0.709595 */
10002 7, /* Internal filter scaling */
10003 159, /* Minimum in-band energy threshold */
10004 21, /* 21/32 in-band to broad-band ratio */
10005 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10006 },
10007 { /* f941_1477[] */
10008 17543, /* A1 = 1.07074 */
10009 -26220, /* A2 = -0.800201 */
10010 -3298, /* B2 = -0.100647 */
10011 0, /* B1 = 0 */
10012 3298, /* B0 = 0.100647 */
10013 12423, /* A1 = 0.75827 */
10014 -30036, /* A2 = -0.916626 */
10015 12651, /* B2 = 0.386078 */
10016 -2444, /* B1 = -0.14917 */
10017 12653, /* B0 = 0.386154 */
10018 23518, /* A1 = 1.435425 */
10019 -30745, /* A2 = -0.938293 */
10020 27282, /* B2 = 0.832581 */
10021 -22529, /* B1 = -1.375122 */
10022 27286, /* B0 = 0.832703 */
10023 7, /* Internal filter scaling */
10024 159, /* Minimum in-band energy threshold */
10025 21, /* 21/32 in-band to broad-band ratio */
10026 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10027 },
10028 { /* f942 */
10029 24104, /* A1 = -1.471252 */
10030 -32507, /* A2 = 0.992065 */
10031 -351, /* B2 = -0.010722 */
10032 0, /* B1 = 0.000000 */
10033 351, /* B0 = 0.010722 */
10034 23996, /* A1 = -1.464600 */
10035 -32671, /* A2 = 0.997040 */
10036 22848, /* B2 = 0.697266 */
10037 -16639, /* B1 = -1.015564 */
10038 22848, /* B0 = 0.697266 */
10039 24332, /* A1 = -1.485168 */
10040 -32673, /* A2 = 0.997101 */
10041 4906, /* B2 = 0.149727 */
10042 -3672, /* B1 = -0.224174 */
10043 4906, /* B0 = 0.149727 */
10044 5, /* Internal filter scaling */
10045 159, /* Minimum in-band energy threshold */
10046 21, /* 21/32 in-band to broad-band ratio */
10047 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10048 },
10049 { /* f950 */
10050 23967, /* A1 = -1.462830 */
10051 -32507, /* A2 = 0.992065 */
10052 -518, /* B2 = -0.015821 */
10053 0, /* B1 = 0.000000 */
10054 518, /* B0 = 0.015821 */
10055 23856, /* A1 = -1.456055 */
10056 -32671, /* A2 = 0.997040 */
10057 26287, /* B2 = 0.802246 */
10058 -19031, /* B1 = -1.161560 */
10059 26287, /* B0 = 0.802246 */
10060 24195, /* A1 = -1.476746 */
10061 -32673, /* A2 = 0.997101 */
10062 2890, /* B2 = 0.088196 */
10063 -2151, /* B1 = -0.131317 */
10064 2890, /* B0 = 0.088196 */
10065 5, /* Internal filter scaling */
10066 159, /* Minimum in-band energy threshold */
10067 21, /* 21/32 in-band to broad-band ratio */
10068 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10069 },
10070 { /* f950_1400[] */
10071 18294, /* A1 = 1.116638 */
10072 -26962, /* A2 = -0.822845 */
10073 -2914, /* B2 = -0.088936 */
10074 0, /* B1 = 0 */
10075 2914, /* B0 = 0.088936 */
10076 14119, /* A1 = 0.861786 */
10077 -30227, /* A2 = -0.922455 */
10078 11466, /* B2 = 0.349945 */
10079 -2833, /* B1 = -0.172943 */
10080 11466, /* B0 = 0.349945 */
10081 23431, /* A1 = 1.430115 */
10082 -30828, /* A2 = -0.940796 */
10083 25331, /* B2 = 0.773071 */
10084 -20911, /* B1 = -1.276367 */
10085 25331, /* B0 = 0.773071 */
10086 7, /* Internal filter scaling */
10087 159, /* Minimum in-band energy threshold */
10088 21, /* 21/32 in-band to broad-band ratio */
10089 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10090 },
10091 { /* f975 */
10092 23521, /* A1 = -1.435608 */
10093 -32489, /* A2 = 0.991516 */
10094 -193, /* B2 = -0.005915 */
10095 0, /* B1 = 0.000000 */
10096 193, /* B0 = 0.005915 */
10097 23404, /* A1 = -1.428467 */
10098 -32655, /* A2 = 0.996582 */
10099 17740, /* B2 = 0.541412 */
10100 -12567, /* B1 = -0.767029 */
10101 17740, /* B0 = 0.541412 */
10102 23753, /* A1 = -1.449829 */
10103 -32657, /* A2 = 0.996613 */
10104 9090, /* B2 = 0.277405 */
10105 -6662, /* B1 = -0.406647 */
10106 9090, /* B0 = 0.277405 */
10107 5, /* Internal filter scaling */
10108 159, /* Minimum in-band energy threshold */
10109 21, /* 21/32 in-band to broad-band ratio */
10110 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10111 },
10112 { /* f1000 */
10113 23071, /* A1 = -1.408203 */
10114 -32489, /* A2 = 0.991516 */
10115 -293, /* B2 = -0.008965 */
10116 0, /* B1 = 0.000000 */
10117 293, /* B0 = 0.008965 */
10118 22951, /* A1 = -1.400818 */
10119 -32655, /* A2 = 0.996582 */
10120 5689, /* B2 = 0.173645 */
10121 -3951, /* B1 = -0.241150 */
10122 5689, /* B0 = 0.173645 */
10123 23307, /* A1 = -1.422607 */
10124 -32657, /* A2 = 0.996613 */
10125 18692, /* B2 = 0.570435 */
10126 -13447, /* B1 = -0.820770 */
10127 18692, /* B0 = 0.570435 */
10128 5, /* Internal filter scaling */
10129 159, /* Minimum in-band energy threshold */
10130 21, /* 21/32 in-band to broad-band ratio */
10131 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10132 },
10133 { /* f1020 */
10134 22701, /* A1 = -1.385620 */
10135 -32474, /* A2 = 0.991058 */
10136 -292, /* B2 = -0.008933 */
10137 0, /*163840 , B1 = 10.000000 */
10138 292, /* B0 = 0.008933 */
10139 22564, /* A1 = -1.377258 */
10140 -32655, /* A2 = 0.996552 */
10141 20756, /* B2 = 0.633423 */
10142 -14176, /* B1 = -0.865295 */
10143 20756, /* B0 = 0.633423 */
10144 22960, /* A1 = -1.401428 */
10145 -32657, /* A2 = 0.996613 */
10146 6520, /* B2 = 0.198990 */
10147 -4619, /* B1 = -0.281937 */
10148 6520, /* B0 = 0.198990 */
10149 5, /* Internal filter scaling */
10150 159, /* Minimum in-band energy threshold */
10151 21, /* 21/32 in-band to broad-band ratio */
10152 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10153 },
10154 { /* f1050 */
10155 22142, /* A1 = -1.351501 */
10156 -32474, /* A2 = 0.991058 */
10157 -147, /* B2 = -0.004493 */
10158 0, /* B1 = 0.000000 */
10159 147, /* B0 = 0.004493 */
10160 22000, /* A1 = -1.342834 */
10161 -32655, /* A2 = 0.996552 */
10162 15379, /* B2 = 0.469360 */
10163 -10237, /* B1 = -0.624847 */
10164 15379, /* B0 = 0.469360 */
10165 22406, /* A1 = -1.367554 */
10166 -32657, /* A2 = 0.996613 */
10167 17491, /* B2 = 0.533783 */
10168 -12096, /* B1 = -0.738312 */
10169 17491, /* B0 = 0.533783 */
10170 5, /* Internal filter scaling */
10171 159, /* Minimum in-band energy threshold */
10172 21, /* 21/32 in-band to broad-band ratio */
10173 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10174 },
10175 { /* f1100_1750[] */
10176 12973, /* A1 = 0.79184 */
10177 -24916, /* A2 = -0.760376 */
10178 6655, /* B2 = 0.203102 */
10179 367, /* B1 = 0.0224 */
10180 6657, /* B0 = 0.203171 */
10181 5915, /* A1 = 0.361053 */
10182 -29560, /* A2 = -0.90213 */
10183 -7777, /* B2 = -0.23735 */
10184 0, /* B1 = 0 */
10185 7777, /* B0 = 0.23735 */
10186 20510, /* A1 = 1.251892 */
10187 -30260, /* A2 = -0.923462 */
10188 26662, /* B2 = 0.81366 */
10189 -20573, /* B1 = -1.255737 */
10190 26668, /* B0 = 0.813843 */
10191 7, /* Internal filter scaling */
10192 159, /* Minimum in-band energy threshold */
10193 21, /* 21/32 in-band to broad-band ratio */
10194 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10195 },
10196 { /* f1140 */
10197 20392, /* A1 = -1.244629 */
10198 -32460, /* A2 = 0.990601 */
10199 -270, /* B2 = -0.008240 */
10200 0, /* B1 = 0.000000 */
10201 270, /* B0 = 0.008240 */
10202 20218, /* A1 = -1.234009 */
10203 -32655, /* A2 = 0.996582 */
10204 21337, /* B2 = 0.651154 */
10205 -13044, /* B1 = -0.796143 */
10206 21337, /* B0 = 0.651154 */
10207 20684, /* A1 = -1.262512 */
10208 -32657, /* A2 = 0.996643 */
10209 8572, /* B2 = 0.261612 */
10210 -5476, /* B1 = -0.334244 */
10211 8572, /* B0 = 0.261612 */
10212 5, /* Internal filter scaling */
10213 159, /* Minimum in-band energy threshold */
10214 21, /* 21/32 in-band to broad-band ratio */
10215 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10216 },
10217 { /* f1200 */
10218 19159, /* A1 = -1.169373 */
10219 -32456, /* A2 = 0.990509 */
10220 -335, /* B2 = -0.010252 */
10221 0, /* B1 = 0.000000 */
10222 335, /* B0 = 0.010252 */
10223 18966, /* A1 = -1.157593 */
10224 -32661, /* A2 = 0.996735 */
10225 6802, /* B2 = 0.207588 */
10226 -3900, /* B1 = -0.238098 */
10227 6802, /* B0 = 0.207588 */
10228 19467, /* A1 = -1.188232 */
10229 -32661, /* A2 = 0.996765 */
10230 25035, /* B2 = 0.764008 */
10231 -15049, /* B1 = -0.918579 */
10232 25035, /* B0 = 0.764008 */
10233 5, /* Internal filter scaling */
10234 159, /* Minimum in-band energy threshold */
10235 21, /* 21/32 in-band to broad-band ratio */
10236 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10237 },
10238 { /* f1209 */
10239 18976, /* A1 = -1.158264 */
10240 -32439, /* A2 = 0.989990 */
10241 -183, /* B2 = -0.005588 */
10242 0, /* B1 = 0.000000 */
10243 183, /* B0 = 0.005588 */
10244 18774, /* A1 = -1.145874 */
10245 -32650, /* A2 = 0.996429 */
10246 15468, /* B2 = 0.472076 */
10247 -8768, /* B1 = -0.535217 */
10248 15468, /* B0 = 0.472076 */
10249 19300, /* A1 = -1.177979 */
10250 -32652, /* A2 = 0.996490 */
10251 19840, /* B2 = 0.605499 */
10252 -11842, /* B1 = -0.722809 */
10253 19840, /* B0 = 0.605499 */
10254 5, /* Internal filter scaling */
10255 159, /* Minimum in-band energy threshold */
10256 21, /* 21/32 in-band to broad-band ratio */
10257 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10258 },
10259 { /* f1330 */
10260 16357, /* A1 = -0.998413 */
10261 -32368, /* A2 = 0.987793 */
10262 -217, /* B2 = -0.006652 */
10263 0, /* B1 = 0.000000 */
10264 217, /* B0 = 0.006652 */
10265 16107, /* A1 = -0.983126 */
10266 -32601, /* A2 = 0.994904 */
10267 11602, /* B2 = 0.354065 */
10268 -5555, /* B1 = -0.339111 */
10269 11602, /* B0 = 0.354065 */
10270 16722, /* A1 = -1.020630 */
10271 -32603, /* A2 = 0.994965 */
10272 15574, /* B2 = 0.475311 */
10273 -8176, /* B1 = -0.499069 */
10274 15574, /* B0 = 0.475311 */
10275 5, /* Internal filter scaling */
10276 159, /* Minimum in-band energy threshold */
10277 21, /* 21/32 in-band to broad-band ratio */
10278 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10279 },
10280 { /* f1336 */
10281 16234, /* A1 = -0.990875 */
10282 32404, /* A2 = -0.988922 */
10283 -193, /* B2 = -0.005908 */
10284 0, /* B1 = 0.000000 */
10285 193, /* B0 = 0.005908 */
10286 15986, /* A1 = -0.975769 */
10287 -32632, /* A2 = 0.995880 */
10288 18051, /* B2 = 0.550903 */
10289 -8658, /* B1 = -0.528473 */
10290 18051, /* B0 = 0.550903 */
10291 16591, /* A1 = -1.012695 */
10292 -32634, /* A2 = 0.995941 */
10293 15736, /* B2 = 0.480240 */
10294 -8125, /* B1 = -0.495926 */
10295 15736, /* B0 = 0.480240 */
10296 5, /* Internal filter scaling */
10297 159, /* Minimum in-band energy threshold */
10298 21, /* 21/32 in-band to broad-band ratio */
10299 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10300 },
10301 { /* f1366 */
10302 15564, /* A1 = -0.949982 */
10303 -32404, /* A2 = 0.988922 */
10304 -269, /* B2 = -0.008216 */
10305 0, /* B1 = 0.000000 */
10306 269, /* B0 = 0.008216 */
10307 15310, /* A1 = -0.934479 */
10308 -32632, /* A2 = 0.995880 */
10309 10815, /* B2 = 0.330063 */
10310 -4962, /* B1 = -0.302887 */
10311 10815, /* B0 = 0.330063 */
10312 15924, /* A1 = -0.971924 */
10313 -32634, /* A2 = 0.995941 */
10314 18880, /* B2 = 0.576172 */
10315 -9364, /* B1 = -0.571594 */
10316 18880, /* B0 = 0.576172 */
10317 5, /* Internal filter scaling */
10318 159, /* Minimum in-band energy threshold */
10319 21, /* 21/32 in-band to broad-band ratio */
10320 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10321 },
10322 { /* f1380 */
10323 15247, /* A1 = -0.930603 */
10324 -32397, /* A2 = 0.988708 */
10325 -244, /* B2 = -0.007451 */
10326 0, /* B1 = 0.000000 */
10327 244, /* B0 = 0.007451 */
10328 14989, /* A1 = -0.914886 */
10329 -32627, /* A2 = 0.995697 */
10330 18961, /* B2 = 0.578644 */
10331 -8498, /* B1 = -0.518707 */
10332 18961, /* B0 = 0.578644 */
10333 15608, /* A1 = -0.952667 */
10334 -32628, /* A2 = 0.995758 */
10335 11145, /* B2 = 0.340134 */
10336 -5430, /* B1 = -0.331467 */
10337 11145, /* B0 = 0.340134 */
10338 5, /* Internal filter scaling */
10339 159, /* Minimum in-band energy threshold */
10340 21, /* 21/32 in-band to broad-band ratio */
10341 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10342 },
10343 { /* f1400 */
10344 14780, /* A1 = -0.902130 */
10345 -32393, /* A2 = 0.988586 */
10346 -396, /* B2 = -0.012086 */
10347 0, /* B1 = 0.000000 */
10348 396, /* B0 = 0.012086 */
10349 14510, /* A1 = -0.885651 */
10350 -32630, /* A2 = 0.995819 */
10351 6326, /* B2 = 0.193069 */
10352 -2747, /* B1 = -0.167671 */
10353 6326, /* B0 = 0.193069 */
10354 15154, /* A1 = -0.924957 */
10355 -32632, /* A2 = 0.995850 */
10356 23235, /* B2 = 0.709076 */
10357 -10983, /* B1 = -0.670380 */
10358 23235, /* B0 = 0.709076 */
10359 5, /* Internal filter scaling */
10360 159, /* Minimum in-band energy threshold */
10361 21, /* 21/32 in-band to broad-band ratio */
10362 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10363 },
10364 { /* f1477 */
10365 13005, /* A1 = -0.793793 */
10366 -32368, /* A2 = 0.987823 */
10367 -500, /* B2 = -0.015265 */
10368 0, /* B1 = 0.000000 */
10369 500, /* B0 = 0.015265 */
10370 12708, /* A1 = -0.775665 */
10371 -32615, /* A2 = 0.995331 */
10372 11420, /* B2 = 0.348526 */
10373 -4306, /* B1 = -0.262833 */
10374 11420, /* B0 = 0.348526 */
10375 13397, /* A1 = -0.817688 */
10376 -32615, /* A2 = 0.995361 */
10377 9454, /* B2 = 0.288528 */
10378 -3981, /* B1 = -0.243027 */
10379 9454, /* B0 = 0.288528 */
10380 5, /* Internal filter scaling */
10381 159, /* Minimum in-band energy threshold */
10382 21, /* 21/32 in-band to broad-band ratio */
10383 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10384 },
10385 { /* f1600 */
10386 10046, /* A1 = -0.613190 */
10387 -32331, /* A2 = 0.986694 */
10388 -455, /* B2 = -0.013915 */
10389 0, /* B1 = 0.000000 */
10390 455, /* B0 = 0.013915 */
10391 9694, /* A1 = -0.591705 */
10392 -32601, /* A2 = 0.994934 */
10393 6023, /* B2 = 0.183815 */
10394 -1708, /* B1 = -0.104279 */
10395 6023, /* B0 = 0.183815 */
10396 10478, /* A1 = -0.639587 */
10397 -32603, /* A2 = 0.994965 */
10398 22031, /* B2 = 0.672333 */
10399 -7342, /* B1 = -0.448151 */
10400 22031, /* B0 = 0.672333 */
10401 5, /* Internal filter scaling */
10402 159, /* Minimum in-band energy threshold */
10403 21, /* 21/32 in-band to broad-band ratio */
10404 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10405 },
10406 { /* f1633_1638[] */
10407 9181, /* A1 = 0.560394 */
10408 -32256, /* A2 = -0.984375 */
10409 -556, /* B2 = -0.016975 */
10410 0, /* B1 = 0 */
10411 556, /* B0 = 0.016975 */
10412 8757, /* A1 = 0.534515 */
10413 -32574, /* A2 = -0.99408 */
10414 8443, /* B2 = 0.25769 */
10415 -2135, /* B1 = -0.130341 */
10416 8443, /* B0 = 0.25769 */
10417 9691, /* A1 = 0.591522 */
10418 -32574, /* A2 = -0.99411 */
10419 15446, /* B2 = 0.471375 */
10420 -4809, /* B1 = -0.293579 */
10421 15446, /* B0 = 0.471375 */
10422 7, /* Internal filter scaling */
10423 159, /* Minimum in-band energy threshold */
10424 21, /* 21/32 in-band to broad-band ratio */
10425 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10426 },
10427 { /* f1800 */
10428 5076, /* A1 = -0.309875 */
10429 -32304, /* A2 = 0.985840 */
10430 -508, /* B2 = -0.015503 */
10431 0, /* B1 = 0.000000 */
10432 508, /* B0 = 0.015503 */
10433 4646, /* A1 = -0.283600 */
10434 -32605, /* A2 = 0.995026 */
10435 6742, /* B2 = 0.205780 */
10436 -878, /* B1 = -0.053635 */
10437 6742, /* B0 = 0.205780 */
10438 5552, /* A1 = -0.338928 */
10439 -32605, /* A2 = 0.995056 */
10440 23667, /* B2 = 0.722260 */
10441 -4297, /* B1 = -0.262329 */
10442 23667, /* B0 = 0.722260 */
10443 5, /* Internal filter scaling */
10444 159, /* Minimum in-band energy threshold */
10445 21, /* 21/32 in-band to broad-band ratio */
10446 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10447 },
10448 { /* f1860 */
10449 3569, /* A1 = -0.217865 */
10450 -32292, /* A2 = 0.985504 */
10451 -239, /* B2 = -0.007322 */
10452 0, /* B1 = 0.000000 */
10453 239, /* B0 = 0.007322 */
10454 3117, /* A1 = -0.190277 */
10455 -32603, /* A2 = 0.994965 */
10456 18658, /* B2 = 0.569427 */
10457 -1557, /* B1 = -0.095032 */
10458 18658, /* B0 = 0.569427 */
10459 4054, /* A1 = -0.247437 */
10460 -32603, /* A2 = 0.994965 */
10461 18886, /* B2 = 0.576385 */
10462 -2566, /* B1 = -0.156647 */
10463 18886, /* B0 = 0.576385 */
10464 5, /* Internal filter scaling */
10465 159, /* Minimum in-band energy threshold */
10466 21, /* 21/32 in-band to broad-band ratio */
10467 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10468 },
10469};
10470static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
10471{
10472 unsigned short cmd;
10473 int cnt, max;
10474
10475 if (jf->filter > 3) {
10476 return -1;
10477 }
10478 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) /* Select Filter */
10479
10480 return -1;
10481 if (!jf->enable) {
10482 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10483
10484 return -1;
10485 else
10486 return 0;
10487 } else {
10488 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10489
10490 return -1;
10491 /* Select the filter (f0 - f3) to use. */
10492 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
10493 return -1;
10494 }
10495 if (jf->freq < 12 && jf->freq > 3) {
10496 /* Select the frequency for the selected filter. */
10497 if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
10498 return -1;
10499 } else if (jf->freq > 11) {
10500 /* We need to load a programmable filter set for undefined */
10501 /* frequencies. So we will point the filter to a programmable set. */
10502 /* Since there are only 4 filters and 4 programmable sets, we will */
10503 /* just point the filter to the same number set and program it for the */
10504 /* frequency we want. */
10505 if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
10506 return -1;
10507 if (j->ver.low != 0x12) {
10508 cmd = 0x515B;
10509 max = 19;
10510 } else {
10511 cmd = 0x515E;
10512 max = 15;
10513 }
10514 if (ixj_WriteDSPCommand(cmd, j))
10515 return -1;
10516 for (cnt = 0; cnt < max; cnt++) {
10517 if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
10518 return -1;
10519 }
10520 }
10521 j->filter_en[jf->filter] = jf->enable;
10522 return 0;
10523}
10524
10525static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
10526{
10527 unsigned short cmd;
10528 int cnt, max;
10529 if (jfr->filter > 3) {
10530 return -1;
10531 }
10532 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) /* Select Filter */
10533 return -1;
10534
10535 if (!jfr->enable) {
10536 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10537 return -1;
10538 else
10539 return 0;
10540 } else {
10541 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10542 return -1;
10543 /* Select the filter (f0 - f3) to use. */
10544 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
10545 return -1;
10546 }
10547 /* We need to load a programmable filter set for undefined */
10548 /* frequencies. So we will point the filter to a programmable set. */
10549 /* Since there are only 4 filters and 4 programmable sets, we will */
10550 /* just point the filter to the same number set and program it for the */
10551 /* frequency we want. */
10552 if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
10553 return -1;
10554 if (j->ver.low != 0x12) {
10555 cmd = 0x515B;
10556 max = 19;
10557 } else {
10558 cmd = 0x515E;
10559 max = 15;
10560 }
10561 if (ixj_WriteDSPCommand(cmd, j))
10562 return -1;
10563 for (cnt = 0; cnt < max; cnt++) {
10564 if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
10565 return -1;
10566 }
10567 j->filter_en[jfr->filter] = jfr->enable;
10568 return 0;
10569}
10570
10571static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
10572{
10573 int freq0, freq1;
10574 unsigned short data;
10575 if (ti->freq0) {
10576 freq0 = ti->freq0;
10577 } else {
10578 freq0 = 0x7FFF;
10579 }
10580
10581 if (ti->freq1) {
10582 freq1 = ti->freq1;
10583 } else {
10584 freq1 = 0x7FFF;
10585 }
10586
10587 if(ti->tone_index > 12 && ti->tone_index < 28)
10588 {
10589 if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
10590 return -1;
10591 if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
10592 return -1;
10593 data = freq0;
10594 if (ixj_WriteDSPCommand(data, j))
10595 return -1;
10596 data = freq1;
10597 if (ixj_WriteDSPCommand(data, j))
10598 return -1;
10599 }
10600 return freq0;
10601}
10602