]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/telephony/ixj.c
drivers/net/: all drivers/net/ cleanup with ARRAY_SIZE
[mirror_ubuntu-bionic-kernel.git] / drivers / telephony / ixj.c
CommitLineData
1da177e4
LT
1/****************************************************************************
2 * ixj.c
3 *
4 * Device Driver for Quicknet Technologies, Inc.'s Telephony cards
5 * including the Internet PhoneJACK, Internet PhoneJACK Lite,
6 * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and
7 * SmartCABLE
8 *
9 * (c) Copyright 1999-2001 Quicknet Technologies, Inc.
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version
14 * 2 of the License, or (at your option) any later version.
15 *
16 * Author: Ed Okerson, <eokerson@quicknet.net>
17 *
18 * Contributors: Greg Herlein, <gherlein@quicknet.net>
19 * David W. Erhart, <derhart@quicknet.net>
20 * John Sellers, <jsellers@quicknet.net>
21 * Mike Preston, <mpreston@quicknet.net>
22 *
23 * Fixes: David Huggins-Daines, <dhd@cepstral.com>
24 * Fabio Ferrari, <fabio.ferrari@digitro.com.br>
25 * Artis Kugevics, <artis@mt.lv>
26 * Daniele Bellucci, <bellucda@tiscali.it>
27 *
28 * More information about the hardware related to this driver can be found
29 * at our website: http://www.quicknet.net
30 *
31 * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
32 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
33 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
34 * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 *
36 * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
37 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
38 * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
39 * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
40 * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
41 *
42 ***************************************************************************/
43
1da177e4
LT
44/*
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
d77f09e5
BC
287static struct pci_device_id ixj_pci_tbl[] __devinitdata = {
288 { PCI_VENDOR_ID_QUICKNET, PCI_DEVICE_ID_QUICKNET_XJ,
289 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
290 { }
291};
292
293MODULE_DEVICE_TABLE(pci, ixj_pci_tbl);
294
1da177e4
LT
295/************************************************************************
296*
297* ixjdebug meanings are now bit mapped instead of level based
298* Values can be or'ed together to turn on multiple messages
299*
300* bit 0 (0x0001) = any failure
301* bit 1 (0x0002) = general messages
302* bit 2 (0x0004) = POTS ringing related
303* bit 3 (0x0008) = PSTN events
304* bit 4 (0x0010) = PSTN Cadence state details
305* bit 5 (0x0020) = Tone detection triggers
306* bit 6 (0x0040) = Tone detection cadence details
307* bit 7 (0x0080) = ioctl tracking
308* bit 8 (0x0100) = signal tracking
309* bit 9 (0x0200) = CallerID generation details
310*
311************************************************************************/
312
313#ifdef IXJ_DYN_ALLOC
314
315static IXJ *ixj[IXJMAX];
316#define get_ixj(b) ixj[(b)]
317
318/*
319 * Allocate a free IXJ device
320 */
321
322static IXJ *ixj_alloc()
323{
324 for(cnt=0; cnt<IXJMAX; cnt++)
325 {
326 if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
327 {
328 j = kmalloc(sizeof(IXJ), GFP_KERNEL);
329 if (j == NULL)
330 return NULL;
331 ixj[cnt] = j;
332 return j;
333 }
334 }
335 return NULL;
336}
337
338static void ixj_fsk_free(IXJ *j)
339{
0159f76d
JJ
340 kfree(j->fskdata);
341 j->fskdata = NULL;
1da177e4
LT
342}
343
344static void ixj_fsk_alloc(IXJ *j)
345{
346 if(!j->fskdata) {
347 j->fskdata = kmalloc(8000, GFP_KERNEL);
348 if (!j->fskdata) {
349 if(ixjdebug & 0x0200) {
350 printk("IXJ phone%d - allocate failed\n", j->board);
351 }
352 return;
353 } else {
354 j->fsksize = 8000;
355 if(ixjdebug & 0x0200) {
356 printk("IXJ phone%d - allocate succeded\n", j->board);
357 }
358 }
359 }
360}
361
362#else
363
364static IXJ ixj[IXJMAX];
365#define get_ixj(b) (&ixj[(b)])
366
367/*
368 * Allocate a free IXJ device
369 */
370
371static IXJ *ixj_alloc(void)
372{
373 int cnt;
374 for(cnt=0; cnt<IXJMAX; cnt++) {
375 if(!ixj[cnt].DSPbase)
376 return &ixj[cnt];
377 }
378 return NULL;
379}
380
381static inline void ixj_fsk_free(IXJ *j) {;}
382
383static inline void ixj_fsk_alloc(IXJ *j)
384{
385 j->fsksize = 8000;
386}
387
388#endif
389
390#ifdef PERFMON_STATS
391#define ixj_perfmon(x) ((x)++)
392#else
393#define ixj_perfmon(x) do { } while(0)
394#endif
395
396static int ixj_convert_loaded;
397
398static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
399
400/************************************************************************
401*
402* These are function definitions to allow external modules to register
403* enhanced functionality call backs.
404*
405************************************************************************/
406
407static int Stub(IXJ * J, unsigned long arg)
408{
409 return 0;
410}
411
412static IXJ_REGFUNC ixj_PreRead = &Stub;
413static IXJ_REGFUNC ixj_PostRead = &Stub;
414static IXJ_REGFUNC ixj_PreWrite = &Stub;
415static IXJ_REGFUNC ixj_PostWrite = &Stub;
416
417static void ixj_read_frame(IXJ *j);
418static void ixj_write_frame(IXJ *j);
419static void ixj_init_timer(IXJ *j);
420static void ixj_add_timer(IXJ * j);
421static void ixj_timeout(unsigned long ptr);
422static int read_filters(IXJ *j);
423static int LineMonitor(IXJ *j);
424static int ixj_fasync(int fd, struct file *, int mode);
425static int ixj_set_port(IXJ *j, int arg);
426static int ixj_set_pots(IXJ *j, int arg);
427static int ixj_hookstate(IXJ *j);
428static int ixj_record_start(IXJ *j);
429static void ixj_record_stop(IXJ *j);
430static void set_rec_volume(IXJ *j, int volume);
431static int get_rec_volume(IXJ *j);
432static int set_rec_codec(IXJ *j, int rate);
433static void ixj_vad(IXJ *j, int arg);
434static int ixj_play_start(IXJ *j);
435static void ixj_play_stop(IXJ *j);
436static int ixj_set_tone_on(unsigned short arg, IXJ *j);
437static int ixj_set_tone_off(unsigned short, IXJ *j);
438static int ixj_play_tone(IXJ *j, char tone);
439static void ixj_aec_start(IXJ *j, int level);
440static int idle(IXJ *j);
441static void ixj_ring_on(IXJ *j);
442static void ixj_ring_off(IXJ *j);
443static void aec_stop(IXJ *j);
444static void ixj_ringback(IXJ *j);
445static void ixj_busytone(IXJ *j);
446static void ixj_dialtone(IXJ *j);
447static void ixj_cpt_stop(IXJ *j);
448static char daa_int_read(IXJ *j);
449static char daa_CR_read(IXJ *j, int cr);
450static int daa_set_mode(IXJ *j, int mode);
451static int ixj_linetest(IXJ *j);
452static int ixj_daa_write(IXJ *j);
453static int ixj_daa_cid_read(IXJ *j);
454static void DAA_Coeff_US(IXJ *j);
455static void DAA_Coeff_UK(IXJ *j);
456static void DAA_Coeff_France(IXJ *j);
457static void DAA_Coeff_Germany(IXJ *j);
458static void DAA_Coeff_Australia(IXJ *j);
459static void DAA_Coeff_Japan(IXJ *j);
460static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
461static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
462static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
463static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp);
464static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp);
465/* Serial Control Interface funtions */
466static int SCI_Control(IXJ *j, int control);
467static int SCI_Prepare(IXJ *j);
468static int SCI_WaitHighSCI(IXJ *j);
469static int SCI_WaitLowSCI(IXJ *j);
470static DWORD PCIEE_GetSerialNumber(WORD wAddress);
471static int ixj_PCcontrol_wait(IXJ *j);
472static void ixj_pre_cid(IXJ *j);
473static void ixj_write_cid(IXJ *j);
474static void ixj_write_cid_bit(IXJ *j, int bit);
475static int set_base_frame(IXJ *j, int size);
476static int set_play_codec(IXJ *j, int rate);
477static void set_rec_depth(IXJ *j, int depth);
478static int ixj_mixer(long val, IXJ *j);
479
480/************************************************************************
481CT8020/CT8021 Host Programmers Model
482Host address Function Access
483DSPbase +
4840-1 Aux Software Status Register (reserved) Read Only
4852-3 Software Status Register Read Only
4864-5 Aux Software Control Register (reserved) Read Write
4876-7 Software Control Register Read Write
4888-9 Hardware Status Register Read Only
489A-B Hardware Control Register Read Write
490C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
491E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
492************************************************************************/
493
494static inline void ixj_read_HSR(IXJ *j)
495{
496 j->hsr.bytes.low = inb_p(j->DSPbase + 8);
497 j->hsr.bytes.high = inb_p(j->DSPbase + 9);
498}
499
500static inline int IsControlReady(IXJ *j)
501{
502 ixj_read_HSR(j);
503 return j->hsr.bits.controlrdy ? 1 : 0;
504}
505
506static inline int IsPCControlReady(IXJ *j)
507{
508 j->pccr1.byte = inb_p(j->XILINXbase + 3);
509 return j->pccr1.bits.crr ? 1 : 0;
510}
511
512static inline int IsStatusReady(IXJ *j)
513{
514 ixj_read_HSR(j);
515 return j->hsr.bits.statusrdy ? 1 : 0;
516}
517
518static inline int IsRxReady(IXJ *j)
519{
520 ixj_read_HSR(j);
521 ixj_perfmon(j->rxreadycheck);
522 return j->hsr.bits.rxrdy ? 1 : 0;
523}
524
525static inline int IsTxReady(IXJ *j)
526{
527 ixj_read_HSR(j);
528 ixj_perfmon(j->txreadycheck);
529 return j->hsr.bits.txrdy ? 1 : 0;
530}
531
532static inline void set_play_volume(IXJ *j, int volume)
533{
534 if (ixjdebug & 0x0002)
535 printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
536 ixj_WriteDSPCommand(0xCF02, j);
537 ixj_WriteDSPCommand(volume, j);
538}
539
540static int set_play_volume_linear(IXJ *j, int volume)
541{
542 int newvolume, dspplaymax;
543
544 if (ixjdebug & 0x0002)
545 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
546 if(volume > 100 || volume < 0) {
547 return -1;
548 }
549
550 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
551 switch (j->cardtype) {
552 case QTI_PHONEJACK:
553 dspplaymax = 0x380;
554 break;
555 case QTI_LINEJACK:
556 if(j->port == PORT_PSTN) {
557 dspplaymax = 0x48;
558 } else {
559 dspplaymax = 0x100;
560 }
561 break;
562 case QTI_PHONEJACK_LITE:
563 dspplaymax = 0x380;
564 break;
565 case QTI_PHONEJACK_PCI:
566 dspplaymax = 0x6C;
567 break;
568 case QTI_PHONECARD:
569 dspplaymax = 0x50;
570 break;
571 default:
572 return -1;
573 }
574 newvolume = (dspplaymax * volume) / 100;
575 set_play_volume(j, newvolume);
576 return 0;
577}
578
579static inline void set_play_depth(IXJ *j, int depth)
580{
581 if (depth > 60)
582 depth = 60;
583 if (depth < 0)
584 depth = 0;
585 ixj_WriteDSPCommand(0x5280 + depth, j);
586}
587
588static inline int get_play_volume(IXJ *j)
589{
590 ixj_WriteDSPCommand(0xCF00, j);
591 return j->ssr.high << 8 | j->ssr.low;
592}
593
594static int get_play_volume_linear(IXJ *j)
595{
596 int volume, newvolume, dspplaymax;
597
598 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
599 switch (j->cardtype) {
600 case QTI_PHONEJACK:
601 dspplaymax = 0x380;
602 break;
603 case QTI_LINEJACK:
604 if(j->port == PORT_PSTN) {
605 dspplaymax = 0x48;
606 } else {
607 dspplaymax = 0x100;
608 }
609 break;
610 case QTI_PHONEJACK_LITE:
611 dspplaymax = 0x380;
612 break;
613 case QTI_PHONEJACK_PCI:
614 dspplaymax = 0x6C;
615 break;
616 case QTI_PHONECARD:
617 dspplaymax = 100;
618 break;
619 default:
620 return -1;
621 }
622 volume = get_play_volume(j);
623 newvolume = (volume * 100) / dspplaymax;
624 if(newvolume > 100)
625 newvolume = 100;
626 return newvolume;
627}
628
629static inline BYTE SLIC_GetState(IXJ *j)
630{
631 if (j->cardtype == QTI_PHONECARD) {
632 j->pccr1.byte = 0;
633 j->psccr.bits.dev = 3;
634 j->psccr.bits.rw = 1;
635 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
636 ixj_PCcontrol_wait(j);
637 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
638 ixj_PCcontrol_wait(j);
639 if (j->pslic.bits.powerdown)
640 return PLD_SLIC_STATE_OC;
641 else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
642 return PLD_SLIC_STATE_ACTIVE;
643 else
644 return PLD_SLIC_STATE_RINGING;
645 } else {
646 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
647 }
648 return j->pld_slicr.bits.state;
649}
650
e13df2c5 651static bool SLIC_SetState(BYTE byState, IXJ *j)
1da177e4 652{
e13df2c5 653 bool fRetVal = false;
1da177e4
LT
654
655 if (j->cardtype == QTI_PHONECARD) {
656 if (j->flags.pcmciasct) {
657 switch (byState) {
658 case PLD_SLIC_STATE_TIPOPEN:
659 case PLD_SLIC_STATE_OC:
660 j->pslic.bits.powerdown = 1;
661 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
e13df2c5 662 fRetVal = true;
1da177e4
LT
663 break;
664 case PLD_SLIC_STATE_RINGING:
665 if (j->readers || j->writers) {
666 j->pslic.bits.powerdown = 0;
667 j->pslic.bits.ring0 = 1;
668 j->pslic.bits.ring1 = 0;
e13df2c5 669 fRetVal = true;
1da177e4
LT
670 }
671 break;
672 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
673
674 case PLD_SLIC_STATE_STANDBY:
675 case PLD_SLIC_STATE_ACTIVE:
676 if (j->readers || j->writers) {
677 j->pslic.bits.powerdown = 0;
678 } else {
679 j->pslic.bits.powerdown = 1;
680 }
681 j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
e13df2c5 682 fRetVal = true;
1da177e4
LT
683 break;
684 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
685
686 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
687
688 default:
e13df2c5 689 fRetVal = false;
1da177e4
LT
690 break;
691 }
692 j->psccr.bits.dev = 3;
693 j->psccr.bits.rw = 0;
694 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
695 ixj_PCcontrol_wait(j);
696 }
697 } else {
698 /* Set the C1, C2, C3 & B2EN signals. */
699 switch (byState) {
700 case PLD_SLIC_STATE_OC:
701 j->pld_slicw.bits.c1 = 0;
702 j->pld_slicw.bits.c2 = 0;
703 j->pld_slicw.bits.c3 = 0;
704 j->pld_slicw.bits.b2en = 0;
705 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
e13df2c5 706 fRetVal = true;
1da177e4
LT
707 break;
708 case PLD_SLIC_STATE_RINGING:
709 j->pld_slicw.bits.c1 = 1;
710 j->pld_slicw.bits.c2 = 0;
711 j->pld_slicw.bits.c3 = 0;
712 j->pld_slicw.bits.b2en = 1;
713 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
e13df2c5 714 fRetVal = true;
1da177e4
LT
715 break;
716 case PLD_SLIC_STATE_ACTIVE:
717 j->pld_slicw.bits.c1 = 0;
718 j->pld_slicw.bits.c2 = 1;
719 j->pld_slicw.bits.c3 = 0;
720 j->pld_slicw.bits.b2en = 0;
721 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
e13df2c5 722 fRetVal = true;
1da177e4
LT
723 break;
724 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
725
726 j->pld_slicw.bits.c1 = 1;
727 j->pld_slicw.bits.c2 = 1;
728 j->pld_slicw.bits.c3 = 0;
729 j->pld_slicw.bits.b2en = 0;
730 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
e13df2c5 731 fRetVal = true;
1da177e4
LT
732 break;
733 case PLD_SLIC_STATE_TIPOPEN:
734 j->pld_slicw.bits.c1 = 0;
735 j->pld_slicw.bits.c2 = 0;
736 j->pld_slicw.bits.c3 = 1;
737 j->pld_slicw.bits.b2en = 0;
738 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
e13df2c5 739 fRetVal = true;
1da177e4
LT
740 break;
741 case PLD_SLIC_STATE_STANDBY:
742 j->pld_slicw.bits.c1 = 1;
743 j->pld_slicw.bits.c2 = 0;
744 j->pld_slicw.bits.c3 = 1;
745 j->pld_slicw.bits.b2en = 1;
746 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
e13df2c5 747 fRetVal = true;
1da177e4
LT
748 break;
749 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
750
751 j->pld_slicw.bits.c1 = 0;
752 j->pld_slicw.bits.c2 = 1;
753 j->pld_slicw.bits.c3 = 1;
754 j->pld_slicw.bits.b2en = 0;
755 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
e13df2c5 756 fRetVal = true;
1da177e4
LT
757 break;
758 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
759
760 j->pld_slicw.bits.c1 = 1;
761 j->pld_slicw.bits.c2 = 1;
762 j->pld_slicw.bits.c3 = 1;
763 j->pld_slicw.bits.b2en = 0;
764 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
e13df2c5 765 fRetVal = true;
1da177e4
LT
766 break;
767 default:
e13df2c5 768 fRetVal = false;
1da177e4
LT
769 break;
770 }
771 }
772
773 return fRetVal;
774}
775
776static int ixj_wink(IXJ *j)
777{
778 BYTE slicnow;
779
780 slicnow = SLIC_GetState(j);
781
782 j->pots_winkstart = jiffies;
783 SLIC_SetState(PLD_SLIC_STATE_OC, j);
784
f4c9925c 785 msleep(jiffies_to_msecs(j->winktime));
1da177e4
LT
786
787 SLIC_SetState(slicnow, j);
788 return 0;
789}
790
791static void ixj_init_timer(IXJ *j)
792{
793 init_timer(&j->timer);
794 j->timer.function = ixj_timeout;
795 j->timer.data = (unsigned long)j;
796}
797
798static void ixj_add_timer(IXJ *j)
799{
800 j->timer.expires = jiffies + (hertz / samplerate);
801 add_timer(&j->timer);
802}
803
804static void ixj_tone_timeout(IXJ *j)
805{
806 IXJ_TONE ti;
807
808 j->tone_state++;
809 if (j->tone_state == 3) {
810 j->tone_state = 0;
811 if (j->cadence_t) {
812 j->tone_cadence_state++;
813 if (j->tone_cadence_state >= j->cadence_t->elements_used) {
814 switch (j->cadence_t->termination) {
815 case PLAY_ONCE:
816 ixj_cpt_stop(j);
817 break;
818 case REPEAT_LAST_ELEMENT:
819 j->tone_cadence_state--;
820 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
821 break;
822 case REPEAT_ALL:
823 j->tone_cadence_state = 0;
824 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
825 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
826 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
827 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
828 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
829 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
830 ixj_init_tone(j, &ti);
831 }
832 ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
833 ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
834 ixj_play_tone(j, j->cadence_t->ce[0].index);
835 break;
836 }
837 } else {
838 if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
839 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
840 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
841 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
842 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
843 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
844 ixj_init_tone(j, &ti);
845 }
846 ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
847 ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
848 ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
849 }
850 }
851 }
852}
853
854static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
855{
856 if(j->ixj_signals[event]) {
857 if(ixjdebug & 0x0100)
858 printk("Sending signal for event %d\n", event);
859 /* Send apps notice of change */
860 /* see config.h for macro definition */
861 kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
862 }
863}
864
865static void ixj_pstn_state(IXJ *j)
866{
867 int var;
868 union XOPXR0 XR0, daaint;
869
870 var = 10;
871
872 XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
873 daaint.reg = 0;
874 XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
875
876 j->pld_scrr.byte = inb_p(j->XILINXbase);
877 if (j->pld_scrr.bits.daaflag) {
878 daa_int_read(j);
879 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
880 if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
881 daaint.bitreg.RING = 1;
882 if(ixjdebug & 0x0008) {
883 printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
884 }
885 } else {
886 daa_set_mode(j, SOP_PU_RESET);
887 }
888 }
889 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
890 daaint.bitreg.Caller_ID = 1;
891 j->pstn_cid_intr = 1;
892 j->pstn_cid_received = jiffies;
893 if(ixjdebug & 0x0008) {
894 printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
895 }
896 }
897 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
898 daaint.bitreg.Cadence = 1;
899 if(ixjdebug & 0x0008) {
900 printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
901 }
902 }
903 if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
904 daaint.bitreg.VDD_OK = 1;
905 daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
906 }
907 }
908 daa_CR_read(j, 1);
909 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)) {
910 daaint.bitreg.RMR = 1;
911 daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
912 if(ixjdebug & 0x0008) {
913 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);
914 }
915 j->pstn_prev_rmr = j->pstn_last_rmr;
916 j->pstn_last_rmr = jiffies;
917 }
918 switch(j->daa_mode) {
919 case SOP_PU_SLEEP:
920 if (daaint.bitreg.RING) {
921 if (!j->flags.pstn_ringing) {
922 if (j->daa_mode != SOP_PU_RINGING) {
923 j->pstn_ring_int = jiffies;
924 daa_set_mode(j, SOP_PU_RINGING);
925 }
926 }
927 }
928 break;
929 case SOP_PU_RINGING:
930 if (daaint.bitreg.RMR) {
931 if (ixjdebug & 0x0008) {
932 printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
933 }
934 if (daaint.bitreg.SI_1) { /* Rising edge of RMR */
935 j->flags.pstn_rmr = 1;
936 j->pstn_ring_start = jiffies;
937 j->pstn_ring_stop = 0;
938 j->ex.bits.pstn_ring = 0;
939 if (j->cadence_f[4].state == 0) {
940 j->cadence_f[4].state = 1;
941 j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
942 j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
943 j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
944 } else if (j->cadence_f[4].state == 2) {
945 if((time_after(jiffies, j->cadence_f[4].off1min) &&
946 time_before(jiffies, j->cadence_f[4].off1max))) {
947 if (j->cadence_f[4].on2) {
948 j->cadence_f[4].state = 3;
949 j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
950 j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
951 j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
952 } else {
953 j->cadence_f[4].state = 7;
954 }
955 } else {
956 if (ixjdebug & 0x0008) {
957 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
958 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
959 j->cadence_f[4].off1);
960 }
961 j->cadence_f[4].state = 0;
962 }
963 } else if (j->cadence_f[4].state == 4) {
964 if((time_after(jiffies, j->cadence_f[4].off2min) &&
965 time_before(jiffies, j->cadence_f[4].off2max))) {
966 if (j->cadence_f[4].on3) {
967 j->cadence_f[4].state = 5;
968 j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
969 j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
970 j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
971 } else {
972 j->cadence_f[4].state = 7;
973 }
974 } else {
975 if (ixjdebug & 0x0008) {
976 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
977 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
978 j->cadence_f[4].off2);
979 }
980 j->cadence_f[4].state = 0;
981 }
982 } else if (j->cadence_f[4].state == 6) {
983 if((time_after(jiffies, j->cadence_f[4].off3min) &&
984 time_before(jiffies, j->cadence_f[4].off3max))) {
985 j->cadence_f[4].state = 7;
986 } else {
987 if (ixjdebug & 0x0008) {
988 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
989 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
990 j->cadence_f[4].off3);
991 }
992 j->cadence_f[4].state = 0;
993 }
994 } else {
995 j->cadence_f[4].state = 0;
996 }
997 } else { /* Falling edge of RMR */
998 j->pstn_ring_start = 0;
999 j->pstn_ring_stop = jiffies;
1000 if (j->cadence_f[4].state == 1) {
1001 if(!j->cadence_f[4].on1) {
1002 j->cadence_f[4].state = 7;
1003 } else if((time_after(jiffies, j->cadence_f[4].on1min) &&
1004 time_before(jiffies, j->cadence_f[4].on1max))) {
1005 if (j->cadence_f[4].off1) {
1006 j->cadence_f[4].state = 2;
1007 j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
1008 j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
1009 j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
1010 } else {
1011 j->cadence_f[4].state = 7;
1012 }
1013 } else {
1014 if (ixjdebug & 0x0008) {
1015 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1016 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1017 j->cadence_f[4].on1);
1018 }
1019 j->cadence_f[4].state = 0;
1020 }
1021 } else if (j->cadence_f[4].state == 3) {
1022 if((time_after(jiffies, j->cadence_f[4].on2min) &&
1023 time_before(jiffies, j->cadence_f[4].on2max))) {
1024 if (j->cadence_f[4].off2) {
1025 j->cadence_f[4].state = 4;
1026 j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
1027 j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
1028 j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
1029 } else {
1030 j->cadence_f[4].state = 7;
1031 }
1032 } else {
1033 if (ixjdebug & 0x0008) {
1034 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1035 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1036 j->cadence_f[4].on2);
1037 }
1038 j->cadence_f[4].state = 0;
1039 }
1040 } else if (j->cadence_f[4].state == 5) {
1041 if((time_after(jiffies, j->cadence_f[4].on3min) &&
1042 time_before(jiffies, j->cadence_f[4].on3max))) {
1043 if (j->cadence_f[4].off3) {
1044 j->cadence_f[4].state = 6;
1045 j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
1046 j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
1047 j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
1048 } else {
1049 j->cadence_f[4].state = 7;
1050 }
1051 } else {
1052 j->cadence_f[4].state = 0;
1053 }
1054 } else {
1055 if (ixjdebug & 0x0008) {
1056 printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
1057 j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
1058 j->cadence_f[4].on3);
1059 }
1060 j->cadence_f[4].state = 0;
1061 }
1062 }
1063 if (ixjdebug & 0x0010) {
1064 printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
1065 }
1066 if (ixjdebug & 0x0010) {
1067 switch(j->cadence_f[4].state) {
1068 case 1:
1069 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1070 j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
1071 break;
1072 case 2:
1073 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1074 j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
1075 break;
1076 case 3:
1077 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1078 j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
1079 break;
1080 case 4:
1081 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1082 j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
1083 break;
1084 case 5:
1085 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1086 j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
1087 break;
1088 case 6:
1089 printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
1090 j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
1091 break;
1092 }
1093 }
1094 }
1095 if (j->cadence_f[4].state == 7) {
1096 j->cadence_f[4].state = 0;
1097 j->pstn_ring_stop = jiffies;
1098 j->ex.bits.pstn_ring = 1;
1099 ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
1100 if(ixjdebug & 0x0008) {
1101 printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
1102 }
1103 }
1104 if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
1105 (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
1106 if(ixjdebug & 0x0008) {
1107 printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
1108 printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
1109 printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
1110 }
1111 j->pstn_ring_stop = j->pstn_ring_int = 0;
1112 daa_set_mode(j, SOP_PU_SLEEP);
1113 }
1114 outb_p(j->pld_scrw.byte, j->XILINXbase);
1115 if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
1116 ixj_daa_cid_read(j);
1117 j->ex.bits.caller_id = 1;
1118 ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
1119 j->pstn_cid_intr = 0;
1120 }
1121 if (daaint.bitreg.Cadence) {
1122 if(ixjdebug & 0x0008) {
1123 printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
1124 }
1125 daa_set_mode(j, SOP_PU_SLEEP);
1126 j->ex.bits.pstn_ring = 0;
1127 }
1128 break;
1129 case SOP_PU_CONVERSATION:
1130 if (daaint.bitreg.VDD_OK) {
1131 if(!daaint.bitreg.SI_0) {
1132 if (!j->pstn_winkstart) {
1133 if(ixjdebug & 0x0008) {
1134 printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
1135 }
1136 j->pstn_winkstart = jiffies;
1137 }
1138 } else {
1139 if (j->pstn_winkstart) {
1140 if(ixjdebug & 0x0008) {
1141 printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
1142 }
1143 j->pstn_winkstart = 0;
1144 }
1145 }
1146 }
1147 if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
1148 if(ixjdebug & 0x0008) {
1149 printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
1150 }
1151 daa_set_mode(j, SOP_PU_SLEEP);
1152 j->pstn_winkstart = 0;
1153 j->ex.bits.pstn_wink = 1;
1154 ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
1155 }
1156 break;
1157 }
1158}
1159
1160static void ixj_timeout(unsigned long ptr)
1161{
1162 int board;
1163 unsigned long jifon;
1164 IXJ *j = (IXJ *)ptr;
1165 board = j->board;
1166
1167 if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
1168 ixj_perfmon(j->timerchecks);
1169 j->hookstate = ixj_hookstate(j);
1170 if (j->tone_state) {
1171 if (!(j->hookstate)) {
1172 ixj_cpt_stop(j);
1173 if (j->m_hook) {
1174 j->m_hook = 0;
1175 j->ex.bits.hookstate = 1;
1176 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1177 }
1178 clear_bit(board, &j->busyflags);
1179 ixj_add_timer(j);
1180 return;
1181 }
1182 if (j->tone_state == 1)
1183 jifon = ((hertz * j->tone_on_time) * 25 / 100000);
1184 else
1185 jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
1186 if (time_before(jiffies, j->tone_start_jif + jifon)) {
1187 if (j->tone_state == 1) {
1188 ixj_play_tone(j, j->tone_index);
1189 if (j->dsp.low == 0x20) {
1190 clear_bit(board, &j->busyflags);
1191 ixj_add_timer(j);
1192 return;
1193 }
1194 } else {
1195 ixj_play_tone(j, 0);
1196 if (j->dsp.low == 0x20) {
1197 clear_bit(board, &j->busyflags);
1198 ixj_add_timer(j);
1199 return;
1200 }
1201 }
1202 } else {
1203 ixj_tone_timeout(j);
1204 if (j->flags.dialtone) {
1205 ixj_dialtone(j);
1206 }
1207 if (j->flags.busytone) {
1208 ixj_busytone(j);
1209 if (j->dsp.low == 0x20) {
1210 clear_bit(board, &j->busyflags);
1211 ixj_add_timer(j);
1212 return;
1213 }
1214 }
1215 if (j->flags.ringback) {
1216 ixj_ringback(j);
1217 if (j->dsp.low == 0x20) {
1218 clear_bit(board, &j->busyflags);
1219 ixj_add_timer(j);
1220 return;
1221 }
1222 }
1223 if (!j->tone_state) {
1224 ixj_cpt_stop(j);
1225 }
1226 }
1227 }
1228 if (!(j->tone_state && j->dsp.low == 0x20)) {
1229 if (IsRxReady(j)) {
1230 ixj_read_frame(j);
1231 }
1232 if (IsTxReady(j)) {
1233 ixj_write_frame(j);
1234 }
1235 }
1236 if (j->flags.cringing) {
1237 if (j->hookstate & 1) {
1238 j->flags.cringing = 0;
1239 ixj_ring_off(j);
1240 } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
1241 switch(j->cadence_f[5].state) {
1242 case 0:
1243 j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
1244 if (time_before(jiffies, j->cadence_f[5].on1dot)) {
1245 if(ixjdebug & 0x0004) {
1246 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1247 }
1248 ixj_ring_on(j);
1249 }
1250 j->cadence_f[5].state = 1;
1251 break;
1252 case 1:
1253 if (time_after(jiffies, j->cadence_f[5].on1dot)) {
1254 j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
1255 if(ixjdebug & 0x0004) {
1256 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1257 }
1258 ixj_ring_off(j);
1259 j->cadence_f[5].state = 2;
1260 }
1261 break;
1262 case 2:
1263 if (time_after(jiffies, j->cadence_f[5].off1dot)) {
1264 if(ixjdebug & 0x0004) {
1265 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1266 }
1267 ixj_ring_on(j);
1268 if (j->cadence_f[5].on2) {
1269 j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
1270 j->cadence_f[5].state = 3;
1271 } else {
1272 j->cadence_f[5].state = 7;
1273 }
1274 }
1275 break;
1276 case 3:
1277 if (time_after(jiffies, j->cadence_f[5].on2dot)) {
1278 if(ixjdebug & 0x0004) {
1279 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1280 }
1281 ixj_ring_off(j);
1282 if (j->cadence_f[5].off2) {
1283 j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
1284 j->cadence_f[5].state = 4;
1285 } else {
1286 j->cadence_f[5].state = 7;
1287 }
1288 }
1289 break;
1290 case 4:
1291 if (time_after(jiffies, j->cadence_f[5].off2dot)) {
1292 if(ixjdebug & 0x0004) {
1293 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1294 }
1295 ixj_ring_on(j);
1296 if (j->cadence_f[5].on3) {
1297 j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
1298 j->cadence_f[5].state = 5;
1299 } else {
1300 j->cadence_f[5].state = 7;
1301 }
1302 }
1303 break;
1304 case 5:
1305 if (time_after(jiffies, j->cadence_f[5].on3dot)) {
1306 if(ixjdebug & 0x0004) {
1307 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1308 }
1309 ixj_ring_off(j);
1310 if (j->cadence_f[5].off3) {
1311 j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
1312 j->cadence_f[5].state = 6;
1313 } else {
1314 j->cadence_f[5].state = 7;
1315 }
1316 }
1317 break;
1318 case 6:
1319 if (time_after(jiffies, j->cadence_f[5].off3dot)) {
1320 if(ixjdebug & 0x0004) {
1321 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1322 }
1323 j->cadence_f[5].state = 7;
1324 }
1325 break;
1326 case 7:
1327 if(ixjdebug & 0x0004) {
1328 printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
1329 }
1330 j->flags.cidring = 1;
1331 j->cadence_f[5].state = 0;
1332 break;
1333 }
1334 if (j->flags.cidring && !j->flags.cidsent) {
1335 j->flags.cidsent = 1;
1336 if(j->fskdcnt) {
1337 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1338 ixj_pre_cid(j);
1339 }
1340 j->flags.cidring = 0;
1341 }
1342 clear_bit(board, &j->busyflags);
1343 ixj_add_timer(j);
1344 return;
1345 } else {
1346 if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
1347 if (j->flags.cidring && !j->flags.cidsent) {
1348 j->flags.cidsent = 1;
1349 if(j->fskdcnt) {
1350 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
1351 ixj_pre_cid(j);
1352 }
1353 j->flags.cidring = 0;
1354 }
1355 j->ring_cadence_t--;
1356 if (j->ring_cadence_t == -1)
1357 j->ring_cadence_t = 15;
1358 j->ring_cadence_jif = jiffies;
1359
1360 if (j->ring_cadence & 1 << j->ring_cadence_t) {
1361 if(j->flags.cidsent && j->cadence_f[5].en_filter)
1362 j->flags.firstring = 1;
1363 else
1364 ixj_ring_on(j);
1365 } else {
1366 ixj_ring_off(j);
1367 if(!j->flags.cidsent)
1368 j->flags.cidring = 1;
1369 }
1370 }
1371 clear_bit(board, &j->busyflags);
1372 ixj_add_timer(j);
1373 return;
1374 }
1375 }
1376 if (!j->flags.ringing) {
1377 if (j->hookstate) { /* & 1) { */
1378 if (j->dsp.low != 0x20 &&
1379 SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
1380 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1381 }
1382 LineMonitor(j);
1383 read_filters(j);
1384 ixj_WriteDSPCommand(0x511B, j);
1385 j->proc_load = j->ssr.high << 8 | j->ssr.low;
1386 if (!j->m_hook && (j->hookstate & 1)) {
1387 j->m_hook = j->ex.bits.hookstate = 1;
1388 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1389 }
1390 } else {
1391 if (j->ex.bits.dtmf_ready) {
1392 j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
1393 }
1394 if (j->m_hook) {
1395 j->m_hook = 0;
1396 j->ex.bits.hookstate = 1;
1397 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1398 }
1399 }
1400 }
1401 if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
1402 ixj_pstn_state(j);
1403 }
1404 if (j->ex.bytes) {
1405 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
1406 }
1407 clear_bit(board, &j->busyflags);
1408 }
1409 ixj_add_timer(j);
1410}
1411
1412static int ixj_status_wait(IXJ *j)
1413{
1414 unsigned long jif;
1415
1416 jif = jiffies + ((60 * hertz) / 100);
1417 while (!IsStatusReady(j)) {
1418 ixj_perfmon(j->statuswait);
1419 if (time_after(jiffies, jif)) {
1420 ixj_perfmon(j->statuswaitfail);
1421 return -1;
1422 }
1423 }
1424 return 0;
1425}
1426
1427static int ixj_PCcontrol_wait(IXJ *j)
1428{
1429 unsigned long jif;
1430
1431 jif = jiffies + ((60 * hertz) / 100);
1432 while (!IsPCControlReady(j)) {
1433 ixj_perfmon(j->pcontrolwait);
1434 if (time_after(jiffies, jif)) {
1435 ixj_perfmon(j->pcontrolwaitfail);
1436 return -1;
1437 }
1438 }
1439 return 0;
1440}
1441
1442static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
1443{
1444 BYTES bytes;
1445 unsigned long jif;
1446
1447 atomic_inc(&j->DSPWrite);
1448 if(atomic_read(&j->DSPWrite) > 1) {
1449 printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
1450 return -1;
1451 }
1452 bytes.high = (cmd & 0xFF00) >> 8;
1453 bytes.low = cmd & 0x00FF;
1454 jif = jiffies + ((60 * hertz) / 100);
1455 while (!IsControlReady(j)) {
1456 ixj_perfmon(j->iscontrolready);
1457 if (time_after(jiffies, jif)) {
1458 ixj_perfmon(j->iscontrolreadyfail);
1459 atomic_dec(&j->DSPWrite);
1460 if(atomic_read(&j->DSPWrite) > 0) {
1461 printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
1462 while(atomic_read(&j->DSPWrite) > 0) {
1463 atomic_dec(&j->DSPWrite);
1464 }
1465 }
1466 return -1;
1467 }
1468 }
1469 outb(bytes.low, j->DSPbase + 6);
1470 outb(bytes.high, j->DSPbase + 7);
1471
1472 if (ixj_status_wait(j)) {
1473 j->ssr.low = 0xFF;
1474 j->ssr.high = 0xFF;
1475 atomic_dec(&j->DSPWrite);
1476 if(atomic_read(&j->DSPWrite) > 0) {
1477 printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
1478 while(atomic_read(&j->DSPWrite) > 0) {
1479 atomic_dec(&j->DSPWrite);
1480 }
1481 }
1482 return -1;
1483 }
1484/* Read Software Status Register */
1485 j->ssr.low = inb_p(j->DSPbase + 2);
1486 j->ssr.high = inb_p(j->DSPbase + 3);
1487 atomic_dec(&j->DSPWrite);
1488 if(atomic_read(&j->DSPWrite) > 0) {
1489 printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
1490 while(atomic_read(&j->DSPWrite) > 0) {
1491 atomic_dec(&j->DSPWrite);
1492 }
1493 }
1494 return 0;
1495}
1496
1497/***************************************************************************
1498*
1499* General Purpose IO Register read routine
1500*
1501***************************************************************************/
1502static inline int ixj_gpio_read(IXJ *j)
1503{
1504 if (ixj_WriteDSPCommand(0x5143, j))
1505 return -1;
1506
1507 j->gpio.bytes.low = j->ssr.low;
1508 j->gpio.bytes.high = j->ssr.high;
1509
1510 return 0;
1511}
1512
1513static inline void LED_SetState(int state, IXJ *j)
1514{
1515 if (j->cardtype == QTI_LINEJACK) {
1516 j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
1517 j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
1518 j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
1519 j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
1520
1521 outb(j->pld_scrw.byte, j->XILINXbase);
1522 }
1523}
1524
1525/*********************************************************************
1526* GPIO Pins are configured as follows on the Quicknet Internet
1527* PhoneJACK Telephony Cards
1528*
1529* POTS Select GPIO_6=0 GPIO_7=0
1530* Mic/Speaker Select GPIO_6=0 GPIO_7=1
1531* Handset Select GPIO_6=1 GPIO_7=0
1532*
1533* SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0
1534* SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0
1535* SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0
1536*
1537* Hook Switch changes reported on GPIO_3
1538*********************************************************************/
1539static int ixj_set_port(IXJ *j, int arg)
1540{
1541 if (j->cardtype == QTI_PHONEJACK_LITE) {
1542 if (arg != PORT_POTS)
1543 return 10;
1544 else
1545 return 0;
1546 }
1547 switch (arg) {
1548 case PORT_POTS:
1549 j->port = PORT_POTS;
1550 switch (j->cardtype) {
1551 case QTI_PHONECARD:
1552 if (j->flags.pcmciasct == 1)
1553 SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
1554 else
1555 return 11;
1556 break;
1557 case QTI_PHONEJACK_PCI:
1558 j->pld_slicw.pcib.mic = 0;
1559 j->pld_slicw.pcib.spk = 0;
1560 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1561 break;
1562 case QTI_LINEJACK:
1563 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1564 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1565 Software Control Register */
1566 return 2;
1567 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1568
1569 outb(j->pld_scrw.byte, j->XILINXbase);
1570 j->pld_clock.byte = 0;
1571 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1572 j->pld_slicw.bits.rly1 = 1;
1573 j->pld_slicw.bits.spken = 0;
1574 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1575 ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */
1576 ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */
1577 ixj_mixer(0x1300, j); /* Turn Off MIC switch on mixer right */
1578 ixj_mixer(0x1501, j); /* Turn On Mono1 switch on mixer right */
1579 ixj_mixer(0x0E80, j); /*Mic mute */
1580 ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */
1581 ixj_mixer(0x0080, j); /* Mute Master Left volume */
1582 ixj_mixer(0x0180, j); /* Mute Master Right volume */
1583 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
1584/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
1585 break;
1586 case QTI_PHONEJACK:
1587 j->gpio.bytes.high = 0x0B;
1588 j->gpio.bits.gpio6 = 0;
1589 j->gpio.bits.gpio7 = 0;
1590 ixj_WriteDSPCommand(j->gpio.word, j);
1591 break;
1592 }
1593 break;
1594 case PORT_PSTN:
1595 if (j->cardtype == QTI_LINEJACK) {
1596 ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */
1597
1598 j->pld_slicw.bits.rly3 = 0;
1599 j->pld_slicw.bits.rly1 = 1;
1600 j->pld_slicw.bits.spken = 0;
1601 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1602 j->port = PORT_PSTN;
1603 } else {
1604 return 4;
1605 }
1606 break;
1607 case PORT_SPEAKER:
1608 j->port = PORT_SPEAKER;
1609 switch (j->cardtype) {
1610 case QTI_PHONECARD:
1611 if (j->flags.pcmciasct) {
1612 SLIC_SetState(PLD_SLIC_STATE_OC, j);
1613 }
1614 break;
1615 case QTI_PHONEJACK_PCI:
1616 j->pld_slicw.pcib.mic = 1;
1617 j->pld_slicw.pcib.spk = 1;
1618 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1619 break;
1620 case QTI_LINEJACK:
1621 ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
1622 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
1623 Software Control Register */
1624 return 2;
1625 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
1626
1627 outb(j->pld_scrw.byte, j->XILINXbase);
1628 j->pld_clock.byte = 0;
1629 outb(j->pld_clock.byte, j->XILINXbase + 0x04);
1630 j->pld_slicw.bits.rly1 = 1;
1631 j->pld_slicw.bits.spken = 1;
1632 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1633 ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */
1634 ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */
1635 ixj_mixer(0x1301, j); /* Turn On MIC switch on mixer right */
1636 ixj_mixer(0x1500, j); /* Turn Off Mono1 switch on mixer right */
1637 ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */
1638 ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */
1639 ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */
1640 ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */
1641 break;
1642 case QTI_PHONEJACK:
1643 j->gpio.bytes.high = 0x0B;
1644 j->gpio.bits.gpio6 = 0;
1645 j->gpio.bits.gpio7 = 1;
1646 ixj_WriteDSPCommand(j->gpio.word, j);
1647 break;
1648 }
1649 break;
1650 case PORT_HANDSET:
1651 if (j->cardtype != QTI_PHONEJACK) {
1652 return 5;
1653 } else {
1654 j->gpio.bytes.high = 0x0B;
1655 j->gpio.bits.gpio6 = 1;
1656 j->gpio.bits.gpio7 = 0;
1657 ixj_WriteDSPCommand(j->gpio.word, j);
1658 j->port = PORT_HANDSET;
1659 }
1660 break;
1661 default:
1662 return 6;
1663 break;
1664 }
1665 return 0;
1666}
1667
1668static int ixj_set_pots(IXJ *j, int arg)
1669{
1670 if (j->cardtype == QTI_LINEJACK) {
1671 if (arg) {
1672 if (j->port == PORT_PSTN) {
1673 j->pld_slicw.bits.rly1 = 0;
1674 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1675 j->flags.pots_pstn = 1;
1676 return 1;
1677 } else {
1678 j->flags.pots_pstn = 0;
1679 return 0;
1680 }
1681 } else {
1682 j->pld_slicw.bits.rly1 = 1;
1683 outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
1684 j->flags.pots_pstn = 0;
1685 return 1;
1686 }
1687 } else {
1688 return 0;
1689 }
1690}
1691
1692static void ixj_ring_on(IXJ *j)
1693{
1694 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
1695 {
1696 if (ixjdebug & 0x0004)
1697 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1698
1699 j->gpio.bytes.high = 0x0B;
1700 j->gpio.bytes.low = 0x00;
1701 j->gpio.bits.gpio1 = 1;
1702 j->gpio.bits.gpio2 = 1;
1703 j->gpio.bits.gpio5 = 0;
1704 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring signal */
1705 } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
1706 {
1707 if (ixjdebug & 0x0004)
1708 printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
1709
1710 SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
1711 }
1712}
1713
1714static int ixj_siadc(IXJ *j, int val)
1715{
1716 if(j->cardtype == QTI_PHONECARD){
1717 if(j->flags.pcmciascp){
1718 if(val == -1)
1719 return j->siadc.bits.rxg;
1720
1721 if(val < 0 || val > 0x1F)
1722 return -1;
1723
1724 j->siadc.bits.hom = 0; /* Handset Out Mute */
1725 j->siadc.bits.lom = 0; /* Line Out Mute */
1726 j->siadc.bits.rxg = val; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */
1727 j->psccr.bits.addr = 6; /* R/W Smart Cable Register Address */
1728 j->psccr.bits.rw = 0; /* Read / Write flag */
1729 j->psccr.bits.dev = 0;
1730 outb(j->siadc.byte, j->XILINXbase + 0x00);
1731 outb(j->psccr.byte, j->XILINXbase + 0x01);
1732 ixj_PCcontrol_wait(j);
1733 return j->siadc.bits.rxg;
1734 }
1735 }
1736 return -1;
1737}
1738
1739static int ixj_sidac(IXJ *j, int val)
1740{
1741 if(j->cardtype == QTI_PHONECARD){
1742 if(j->flags.pcmciascp){
1743 if(val == -1)
1744 return j->sidac.bits.txg;
1745
1746 if(val < 0 || val > 0x1F)
1747 return -1;
1748
1749 j->sidac.bits.srm = 1; /* Speaker Right Mute */
1750 j->sidac.bits.slm = 1; /* Speaker Left Mute */
1751 j->sidac.bits.txg = val; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */
1752 j->psccr.bits.addr = 7; /* R/W Smart Cable Register Address */
1753 j->psccr.bits.rw = 0; /* Read / Write flag */
1754 j->psccr.bits.dev = 0;
1755 outb(j->sidac.byte, j->XILINXbase + 0x00);
1756 outb(j->psccr.byte, j->XILINXbase + 0x01);
1757 ixj_PCcontrol_wait(j);
1758 return j->sidac.bits.txg;
1759 }
1760 }
1761 return -1;
1762}
1763
1764static int ixj_pcmcia_cable_check(IXJ *j)
1765{
1766 j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
1767 if (!j->flags.pcmciastate) {
1768 j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
1769 if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
1770 j->flags.pcmciastate = 4;
1771 return 0;
1772 }
1773 if (j->pccr1.bits.ed) {
1774 j->pccr1.bits.ed = 0;
1775 j->psccr.bits.dev = 3;
1776 j->psccr.bits.rw = 1;
1777 outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
1778 ixj_PCcontrol_wait(j);
1779 j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
1780 j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
1781 j->psccr.bits.dev = 3;
1782 j->psccr.bits.rw = 0;
1783 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1784 ixj_PCcontrol_wait(j);
1785 return j->pslic.bits.led2 ? 1 : 0;
1786 } else if (j->flags.pcmciasct) {
1787 return j->r_hook;
1788 } else {
1789 return 1;
1790 }
1791 } else if (j->flags.pcmciastate == 4) {
1792 if (!j->pccr1.bits.drf) {
1793 j->flags.pcmciastate = 3;
1794 }
1795 return 0;
1796 } else if (j->flags.pcmciastate == 3) {
1797 j->pccr2.bits.pwr = 0;
1798 j->pccr2.bits.rstc = 1;
1799 outb(j->pccr2.byte, j->XILINXbase + 0x02);
1800 j->checkwait = jiffies + (hertz * 2);
1801 j->flags.incheck = 1;
1802 j->flags.pcmciastate = 2;
1803 return 0;
1804 } else if (j->flags.pcmciastate == 2) {
1805 if (j->flags.incheck) {
1806 if (time_before(jiffies, j->checkwait)) {
1807 return 0;
1808 } else {
1809 j->flags.incheck = 0;
1810 }
1811 }
1812 j->pccr2.bits.pwr = 0;
1813 j->pccr2.bits.rstc = 0;
1814 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1815 j->flags.pcmciastate = 1;
1816 return 0;
1817 } else if (j->flags.pcmciastate == 1) {
1818 j->flags.pcmciastate = 0;
1819 if (!j->pccr1.bits.drf) {
1820 j->psccr.bits.dev = 3;
1821 j->psccr.bits.rw = 1;
1822 outb_p(j->psccr.byte, j->XILINXbase + 0x01);
1823 ixj_PCcontrol_wait(j);
1824 j->flags.pcmciascp = 1; /* Set Cable Present Flag */
1825
1826 j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03; /* Get Cable Type */
1827
1828 if (j->flags.pcmciasct == 3) {
1829 j->flags.pcmciastate = 4;
1830 return 0;
1831 } else if (j->flags.pcmciasct == 0) {
1832 j->pccr2.bits.pwr = 1;
1833 j->pccr2.bits.rstc = 0;
1834 outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
1835 j->port = PORT_SPEAKER;
1836 } else {
1837 j->port = PORT_POTS;
1838 }
1839 j->sic1.bits.cpd = 0; /* Chip Power Down */
1840 j->sic1.bits.mpd = 0; /* MIC Bias Power Down */
1841 j->sic1.bits.hpd = 0; /* Handset Bias Power Down */
1842 j->sic1.bits.lpd = 0; /* Line Bias Power Down */
1843 j->sic1.bits.spd = 1; /* Speaker Drive Power Down */
1844 j->psccr.bits.addr = 1; /* R/W Smart Cable Register Address */
1845 j->psccr.bits.rw = 0; /* Read / Write flag */
1846 j->psccr.bits.dev = 0;
1847 outb(j->sic1.byte, j->XILINXbase + 0x00);
1848 outb(j->psccr.byte, j->XILINXbase + 0x01);
1849 ixj_PCcontrol_wait(j);
1850
1851 j->sic2.bits.al = 0; /* Analog Loopback DAC analog -> ADC analog */
1852 j->sic2.bits.dl2 = 0; /* Digital Loopback DAC -> ADC one bit */
1853 j->sic2.bits.dl1 = 0; /* Digital Loopback ADC -> DAC one bit */
1854 j->sic2.bits.pll = 0; /* 1 = div 10, 0 = div 5 */
1855 j->sic2.bits.hpd = 0; /* HPF disable */
1856 j->psccr.bits.addr = 2; /* R/W Smart Cable Register Address */
1857 j->psccr.bits.rw = 0; /* Read / Write flag */
1858 j->psccr.bits.dev = 0;
1859 outb(j->sic2.byte, j->XILINXbase + 0x00);
1860 outb(j->psccr.byte, j->XILINXbase + 0x01);
1861 ixj_PCcontrol_wait(j);
1862
1863 j->psccr.bits.addr = 3; /* R/W Smart Cable Register Address */
1864 j->psccr.bits.rw = 0; /* Read / Write flag */
1865 j->psccr.bits.dev = 0;
1866 outb(0x00, j->XILINXbase + 0x00); /* PLL Divide N1 */
1867 outb(j->psccr.byte, j->XILINXbase + 0x01);
1868 ixj_PCcontrol_wait(j);
1869
1870 j->psccr.bits.addr = 4; /* R/W Smart Cable Register Address */
1871 j->psccr.bits.rw = 0; /* Read / Write flag */
1872 j->psccr.bits.dev = 0;
1873 outb(0x09, j->XILINXbase + 0x00); /* PLL Multiply M1 */
1874 outb(j->psccr.byte, j->XILINXbase + 0x01);
1875 ixj_PCcontrol_wait(j);
1876
1877 j->sirxg.bits.lig = 1; /* Line In Gain */
1878 j->sirxg.bits.lim = 1; /* Line In Mute */
1879 j->sirxg.bits.mcg = 0; /* MIC In Gain was 3 */
1880 j->sirxg.bits.mcm = 0; /* MIC In Mute */
1881 j->sirxg.bits.him = 0; /* Handset In Mute */
1882 j->sirxg.bits.iir = 1; /* IIR */
1883 j->psccr.bits.addr = 5; /* R/W Smart Cable Register Address */
1884 j->psccr.bits.rw = 0; /* Read / Write flag */
1885 j->psccr.bits.dev = 0;
1886 outb(j->sirxg.byte, j->XILINXbase + 0x00);
1887 outb(j->psccr.byte, j->XILINXbase + 0x01);
1888 ixj_PCcontrol_wait(j);
1889
1890 ixj_siadc(j, 0x17);
1891 ixj_sidac(j, 0x1D);
1892
1893 j->siaatt.bits.sot = 0;
1894 j->psccr.bits.addr = 9; /* R/W Smart Cable Register Address */
1895 j->psccr.bits.rw = 0; /* Read / Write flag */
1896 j->psccr.bits.dev = 0;
1897 outb(j->siaatt.byte, j->XILINXbase + 0x00);
1898 outb(j->psccr.byte, j->XILINXbase + 0x01);
1899 ixj_PCcontrol_wait(j);
1900
1901 if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
1902 j->psccr.byte = j->pslic.byte = 0;
1903 j->pslic.bits.powerdown = 1;
1904 j->psccr.bits.dev = 3;
1905 j->psccr.bits.rw = 0;
1906 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
1907 ixj_PCcontrol_wait(j);
1908 }
1909 }
1910 return 0;
1911 } else {
1912 j->flags.pcmciascp = 0;
1913 return 0;
1914 }
1915 return 0;
1916}
1917
1918static int ixj_hookstate(IXJ *j)
1919{
1da177e4
LT
1920 int fOffHook = 0;
1921
1922 switch (j->cardtype) {
1923 case QTI_PHONEJACK:
1924 ixj_gpio_read(j);
1925 fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
1926 break;
1927 case QTI_LINEJACK:
1928 case QTI_PHONEJACK_LITE:
1929 case QTI_PHONEJACK_PCI:
1930 SLIC_GetState(j);
1931 if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
1932 fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
1933 if(fOffHook != j->p_hook) {
1934 if(!j->checkwait) {
1935 j->checkwait = jiffies;
1936 }
1937 if(time_before(jiffies, j->checkwait + 2)) {
1938 fOffHook ^= 1;
1939 } else {
1940 j->checkwait = 0;
1941 }
1942 j->p_hook = fOffHook;
1943 printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
1944 }
1945 } else {
1946 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
1947 j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
1948 if (j->flags.ringing || j->flags.cringing) {
1949 if (!in_interrupt()) {
f4c9925c 1950 msleep(20);
1da177e4
LT
1951 }
1952 SLIC_GetState(j);
1953 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
1954 ixj_ring_on(j);
1955 }
1956 }
1957 if (j->cardtype == QTI_PHONEJACK_PCI) {
1958 j->pld_scrr.byte = inb_p(j->XILINXbase);
1959 fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
1960 } else
1961 fOffHook = j->pld_slicr.bits.det ? 1 : 0;
1962 }
1963 }
1964 break;
1965 case QTI_PHONECARD:
1966 fOffHook = ixj_pcmcia_cable_check(j);
1967 break;
1968 }
1969 if (j->r_hook != fOffHook) {
1970 j->r_hook = fOffHook;
1971 if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
1972 j->ex.bits.hookstate = 1;
1973 ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
1974 } else if (!fOffHook) {
1975 j->flash_end = jiffies + ((60 * hertz) / 100);
1976 }
1977 }
1978 if (fOffHook) {
1979 if(time_before(jiffies, j->flash_end)) {
1980 j->ex.bits.flash = 1;
1981 j->flash_end = 0;
1982 ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
1983 }
1984 } else {
1985 if(time_before(jiffies, j->flash_end)) {
1986 fOffHook = 1;
1987 }
1988 }
1989
1990 if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
1991 fOffHook |= 2;
1992
1993 if (j->port == PORT_SPEAKER) {
1994 if(j->cardtype == QTI_PHONECARD) {
1995 if(j->flags.pcmciascp && j->flags.pcmciasct) {
1996 fOffHook |= 2;
1997 }
1998 } else {
1999 fOffHook |= 2;
2000 }
2001 }
2002
2003 if (j->port == PORT_HANDSET)
2004 fOffHook |= 2;
2005
2006 return fOffHook;
2007}
2008
2009static void ixj_ring_off(IXJ *j)
2010{
2011 if (j->dsp.low == 0x20) /* Internet PhoneJACK */
2012 {
2013 if (ixjdebug & 0x0004)
2014 printk(KERN_INFO "IXJ Ring Off\n");
2015 j->gpio.bytes.high = 0x0B;
2016 j->gpio.bytes.low = 0x00;
2017 j->gpio.bits.gpio1 = 0;
2018 j->gpio.bits.gpio2 = 1;
2019 j->gpio.bits.gpio5 = 0;
2020 ixj_WriteDSPCommand(j->gpio.word, j);
2021 } else /* Internet LineJACK */
2022 {
2023 if (ixjdebug & 0x0004)
2024 printk(KERN_INFO "IXJ Ring Off\n");
2025
2026 if(!j->flags.cidplay)
2027 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
2028
2029 SLIC_GetState(j);
2030 }
2031}
2032
2033static void ixj_ring_start(IXJ *j)
2034{
2035 j->flags.cringing = 1;
2036 if (ixjdebug & 0x0004)
2037 printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
2038 if (ixj_hookstate(j) & 1) {
2039 if (j->port == PORT_POTS)
2040 ixj_ring_off(j);
2041 j->flags.cringing = 0;
2042 if (ixjdebug & 0x0004)
2043 printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
2044 } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
2045 j->ring_cadence_jif = jiffies;
2046 j->flags.cidsent = j->flags.cidring = 0;
2047 j->cadence_f[5].state = 0;
2048 if(j->cadence_f[5].on1)
2049 ixj_ring_on(j);
2050 } else {
2051 j->ring_cadence_jif = jiffies;
2052 j->ring_cadence_t = 15;
2053 if (j->ring_cadence & 1 << j->ring_cadence_t) {
2054 ixj_ring_on(j);
2055 } else {
2056 ixj_ring_off(j);
2057 }
2058 j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
2059 }
2060}
2061
2062static int ixj_ring(IXJ *j)
2063{
2064 char cntr;
f4c9925c 2065 unsigned long jif;
1da177e4
LT
2066
2067 j->flags.ringing = 1;
2068 if (ixj_hookstate(j) & 1) {
2069 ixj_ring_off(j);
2070 j->flags.ringing = 0;
2071 return 1;
2072 }
1da177e4
LT
2073 for (cntr = 0; cntr < j->maxrings; cntr++) {
2074 jif = jiffies + (1 * hertz);
2075 ixj_ring_on(j);
2076 while (time_before(jiffies, jif)) {
2077 if (ixj_hookstate(j) & 1) {
2078 ixj_ring_off(j);
2079 j->flags.ringing = 0;
2080 return 1;
2081 }
1e63bc73 2082 schedule_timeout_interruptible(1);
1da177e4
LT
2083 if (signal_pending(current))
2084 break;
2085 }
2086 jif = jiffies + (3 * hertz);
2087 ixj_ring_off(j);
2088 while (time_before(jiffies, jif)) {
2089 if (ixj_hookstate(j) & 1) {
f4c9925c 2090 msleep(10);
1da177e4
LT
2091 if (ixj_hookstate(j) & 1) {
2092 j->flags.ringing = 0;
2093 return 1;
2094 }
2095 }
1e63bc73 2096 schedule_timeout_interruptible(1);
1da177e4
LT
2097 if (signal_pending(current))
2098 break;
2099 }
2100 }
2101 ixj_ring_off(j);
2102 j->flags.ringing = 0;
2103 return 0;
2104}
2105
2106static int ixj_open(struct phone_device *p, struct file *file_p)
2107{
2108 IXJ *j = get_ixj(p->board);
2109 file_p->private_data = j;
2110
2111 if (!j->DSPbase)
2112 return -ENODEV;
2113
2114 if (file_p->f_mode & FMODE_READ) {
2115 if(!j->readers) {
2116 j->readers++;
2117 } else {
2118 return -EBUSY;
2119 }
2120 }
2121
2122 if (file_p->f_mode & FMODE_WRITE) {
2123 if(!j->writers) {
2124 j->writers++;
2125 } else {
2126 if (file_p->f_mode & FMODE_READ){
2127 j->readers--;
2128 }
2129 return -EBUSY;
2130 }
2131 }
2132
2133 if (j->cardtype == QTI_PHONECARD) {
2134 j->pslic.bits.powerdown = 0;
2135 j->psccr.bits.dev = 3;
2136 j->psccr.bits.rw = 0;
2137 outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
2138 ixj_PCcontrol_wait(j);
2139 }
2140
2141 j->flags.cidplay = 0;
2142 j->flags.cidcw_ack = 0;
2143
2144 if (ixjdebug & 0x0002)
2145 printk(KERN_INFO "Opening board %d\n", p->board);
2146
2147 j->framesread = j->frameswritten = 0;
2148 return 0;
2149}
2150
2151static int ixj_release(struct inode *inode, struct file *file_p)
2152{
2153 IXJ_TONE ti;
2154 int cnt;
2155 IXJ *j = file_p->private_data;
2156 int board = j->p.board;
2157
2158 /*
2159 * Set up locks to ensure that only one process is talking to the DSP at a time.
2160 * This is necessary to keep the DSP from locking up.
2161 */
1e63bc73
NA
2162 while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
2163 schedule_timeout_interruptible(1);
1da177e4
LT
2164 if (ixjdebug & 0x0002)
2165 printk(KERN_INFO "Closing board %d\n", NUM(inode));
2166
2167 if (j->cardtype == QTI_PHONECARD)
2168 ixj_set_port(j, PORT_SPEAKER);
2169 else
2170 ixj_set_port(j, PORT_POTS);
2171
2172 aec_stop(j);
2173 ixj_play_stop(j);
2174 ixj_record_stop(j);
2175 set_play_volume(j, 0x100);
2176 set_rec_volume(j, 0x100);
2177 ixj_ring_off(j);
2178
2179 /* Restore the tone table to default settings. */
2180 ti.tone_index = 10;
2181 ti.gain0 = 1;
2182 ti.freq0 = hz941;
2183 ti.gain1 = 0;
2184 ti.freq1 = hz1209;
2185 ixj_init_tone(j, &ti);
2186 ti.tone_index = 11;
2187 ti.gain0 = 1;
2188 ti.freq0 = hz941;
2189 ti.gain1 = 0;
2190 ti.freq1 = hz1336;
2191 ixj_init_tone(j, &ti);
2192 ti.tone_index = 12;
2193 ti.gain0 = 1;
2194 ti.freq0 = hz941;
2195 ti.gain1 = 0;
2196 ti.freq1 = hz1477;
2197 ixj_init_tone(j, &ti);
2198 ti.tone_index = 13;
2199 ti.gain0 = 1;
2200 ti.freq0 = hz800;
2201 ti.gain1 = 0;
2202 ti.freq1 = 0;
2203 ixj_init_tone(j, &ti);
2204 ti.tone_index = 14;
2205 ti.gain0 = 1;
2206 ti.freq0 = hz1000;
2207 ti.gain1 = 0;
2208 ti.freq1 = 0;
2209 ixj_init_tone(j, &ti);
2210 ti.tone_index = 15;
2211 ti.gain0 = 1;
2212 ti.freq0 = hz1250;
2213 ti.gain1 = 0;
2214 ti.freq1 = 0;
2215 ixj_init_tone(j, &ti);
2216 ti.tone_index = 16;
2217 ti.gain0 = 1;
2218 ti.freq0 = hz950;
2219 ti.gain1 = 0;
2220 ti.freq1 = 0;
2221 ixj_init_tone(j, &ti);
2222 ti.tone_index = 17;
2223 ti.gain0 = 1;
2224 ti.freq0 = hz1100;
2225 ti.gain1 = 0;
2226 ti.freq1 = 0;
2227 ixj_init_tone(j, &ti);
2228 ti.tone_index = 18;
2229 ti.gain0 = 1;
2230 ti.freq0 = hz1400;
2231 ti.gain1 = 0;
2232 ti.freq1 = 0;
2233 ixj_init_tone(j, &ti);
2234 ti.tone_index = 19;
2235 ti.gain0 = 1;
2236 ti.freq0 = hz1500;
2237 ti.gain1 = 0;
2238 ti.freq1 = 0;
2239 ixj_init_tone(j, &ti);
2240 ti.tone_index = 20;
2241 ti.gain0 = 1;
2242 ti.freq0 = hz1600;
2243 ti.gain1 = 0;
2244 ti.freq1 = 0;
2245 ixj_init_tone(j, &ti);
2246 ti.tone_index = 21;
2247 ti.gain0 = 1;
2248 ti.freq0 = hz1800;
2249 ti.gain1 = 0;
2250 ti.freq1 = 0;
2251 ixj_init_tone(j, &ti);
2252 ti.tone_index = 22;
2253 ti.gain0 = 1;
2254 ti.freq0 = hz2100;
2255 ti.gain1 = 0;
2256 ti.freq1 = 0;
2257 ixj_init_tone(j, &ti);
2258 ti.tone_index = 23;
2259 ti.gain0 = 1;
2260 ti.freq0 = hz1300;
2261 ti.gain1 = 0;
2262 ti.freq1 = 0;
2263 ixj_init_tone(j, &ti);
2264 ti.tone_index = 24;
2265 ti.gain0 = 1;
2266 ti.freq0 = hz2450;
2267 ti.gain1 = 0;
2268 ti.freq1 = 0;
2269 ixj_init_tone(j, &ti);
2270 ti.tone_index = 25;
2271 ti.gain0 = 1;
2272 ti.freq0 = hz350;
2273 ti.gain1 = 0;
2274 ti.freq1 = hz440;
2275 ixj_init_tone(j, &ti);
2276 ti.tone_index = 26;
2277 ti.gain0 = 1;
2278 ti.freq0 = hz440;
2279 ti.gain1 = 0;
2280 ti.freq1 = hz480;
2281 ixj_init_tone(j, &ti);
2282 ti.tone_index = 27;
2283 ti.gain0 = 1;
2284 ti.freq0 = hz480;
2285 ti.gain1 = 0;
2286 ti.freq1 = hz620;
2287 ixj_init_tone(j, &ti);
2288
2289 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
2290
2291 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
2292
2293 j->ex.bits.dtmf_ready = 0;
2294 j->dtmf_state = 0;
2295 j->dtmf_wp = j->dtmf_rp = 0;
2296 j->rec_mode = j->play_mode = -1;
2297 j->flags.ringing = 0;
2298 j->maxrings = MAXRINGS;
2299 j->ring_cadence = USA_RING_CADENCE;
2300 if(j->cadence_f[5].enable) {
2301 j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
2302 }
2303 j->drybuffer = 0;
2304 j->winktime = 320;
2305 j->flags.dtmf_oob = 0;
2306 for (cnt = 0; cnt < 4; cnt++)
2307 j->cadence_f[cnt].enable = 0;
2308
2309 idle(j);
2310
2311 if(j->cardtype == QTI_PHONECARD) {
2312 SLIC_SetState(PLD_SLIC_STATE_OC, j);
2313 }
2314
2315 if (file_p->f_mode & FMODE_READ)
2316 j->readers--;
2317 if (file_p->f_mode & FMODE_WRITE)
2318 j->writers--;
2319
2320 if (j->read_buffer && !j->readers) {
2321 kfree(j->read_buffer);
2322 j->read_buffer = NULL;
2323 j->read_buffer_size = 0;
2324 }
2325 if (j->write_buffer && !j->writers) {
2326 kfree(j->write_buffer);
2327 j->write_buffer = NULL;
2328 j->write_buffer_size = 0;
2329 }
2330 j->rec_codec = j->play_codec = 0;
2331 j->rec_frame_size = j->play_frame_size = 0;
2332 j->flags.cidsent = j->flags.cidring = 0;
2333 ixj_fasync(-1, file_p, 0); /* remove from list of async notification */
2334
2335 if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
2336 ixj_set_port(j, PORT_PSTN);
2337 daa_set_mode(j, SOP_PU_SLEEP);
2338 ixj_set_pots(j, 1);
2339 }
2340 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
2341
2342 /* Set up the default signals for events */
2343 for (cnt = 0; cnt < 35; cnt++)
2344 j->ixj_signals[cnt] = SIGIO;
2345
2346 /* Set the excetion signal enable flags */
2347 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
2348 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 =
2349 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;
2350
2351 file_p->private_data = NULL;
2352 clear_bit(board, &j->busyflags);
2353 return 0;
2354}
2355
2356static int read_filters(IXJ *j)
2357{
2358 unsigned short fc, cnt, trg;
2359 int var;
2360
2361 trg = 0;
2362 if (ixj_WriteDSPCommand(0x5144, j)) {
2363 if(ixjdebug & 0x0001) {
2364 printk(KERN_INFO "Read Frame Counter failed!\n");
2365 }
2366 return -1;
2367 }
2368 fc = j->ssr.high << 8 | j->ssr.low;
2369 if (fc == j->frame_count)
2370 return 1;
2371
2372 j->frame_count = fc;
2373
2374 if (j->dtmf_proc)
2375 return 1;
2376
2377 var = 10;
2378
2379 for (cnt = 0; cnt < 4; cnt++) {
2380 if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
2381 if(ixjdebug & 0x0001) {
2382 printk(KERN_INFO "Select Filter %d failed!\n", cnt);
2383 }
2384 return -1;
2385 }
2386 if (ixj_WriteDSPCommand(0x515C, j)) {
2387 if(ixjdebug & 0x0001) {
2388 printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
2389 }
2390 return -1;
2391 }
2392 j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
2393
2394 if (j->cadence_f[cnt].enable) {
2395 if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
2396 if (j->cadence_f[cnt].state == 0) {
2397 j->cadence_f[cnt].state = 1;
2398 j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
2399 j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
2400 j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
2401 } else if (j->cadence_f[cnt].state == 2 &&
2402 (time_after(jiffies, j->cadence_f[cnt].off1min) &&
2403 time_before(jiffies, j->cadence_f[cnt].off1max))) {
2404 if (j->cadence_f[cnt].on2) {
2405 j->cadence_f[cnt].state = 3;
2406 j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
2407 j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
2408 j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
2409 } else {
2410 j->cadence_f[cnt].state = 7;
2411 }
2412 } else if (j->cadence_f[cnt].state == 4 &&
2413 (time_after(jiffies, j->cadence_f[cnt].off2min) &&
2414 time_before(jiffies, j->cadence_f[cnt].off2max))) {
2415 if (j->cadence_f[cnt].on3) {
2416 j->cadence_f[cnt].state = 5;
2417 j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
2418 j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
2419 j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
2420 } else {
2421 j->cadence_f[cnt].state = 7;
2422 }
2423 } else {
2424 j->cadence_f[cnt].state = 0;
2425 }
2426 } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
2427 if (j->cadence_f[cnt].state == 1) {
2428 if(!j->cadence_f[cnt].on1) {
2429 j->cadence_f[cnt].state = 7;
2430 } else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
2431 time_before(jiffies, j->cadence_f[cnt].on1max))) {
2432 if(j->cadence_f[cnt].off1) {
2433 j->cadence_f[cnt].state = 2;
2434 j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
2435 j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
2436 j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
2437 } else {
2438 j->cadence_f[cnt].state = 7;
2439 }
2440 } else {
2441 j->cadence_f[cnt].state = 0;
2442 }
2443 } else if (j->cadence_f[cnt].state == 3) {
2444 if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
2445 time_before(jiffies, j->cadence_f[cnt].on2max))) {
2446 if(j->cadence_f[cnt].off2) {
2447 j->cadence_f[cnt].state = 4;
2448 j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
2449 j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
2450 j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
2451 } else {
2452 j->cadence_f[cnt].state = 7;
2453 }
2454 } else {
2455 j->cadence_f[cnt].state = 0;
2456 }
2457 } else if (j->cadence_f[cnt].state == 5) {
2458 if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
2459 time_before(jiffies, j->cadence_f[cnt].on3max))) {
2460 if(j->cadence_f[cnt].off3) {
2461 j->cadence_f[cnt].state = 6;
2462 j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
2463 j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
2464 j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
2465 } else {
2466 j->cadence_f[cnt].state = 7;
2467 }
2468 } else {
2469 j->cadence_f[cnt].state = 0;
2470 }
2471 } else {
2472 j->cadence_f[cnt].state = 0;
2473 }
2474 } else {
2475 switch(j->cadence_f[cnt].state) {
2476 case 1:
2477 if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
2478 !j->cadence_f[cnt].off1 &&
2479 !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
2480 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2481 j->cadence_f[cnt].state = 7;
2482 }
2483 break;
2484 case 3:
2485 if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
2486 !j->cadence_f[cnt].off2 &&
2487 !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
2488 j->cadence_f[cnt].state = 7;
2489 }
2490 break;
2491 case 5:
2492 if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
2493 !j->cadence_f[cnt].off3) {
2494 j->cadence_f[cnt].state = 7;
2495 }
2496 break;
2497 }
2498 }
2499
2500 if (ixjdebug & 0x0040) {
2501 printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
2502 switch(j->cadence_f[cnt].state) {
2503 case 0:
2504 printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
2505 break;
2506 case 1:
2507 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
2508 j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
2509 break;
2510 case 2:
2511 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
2512 j->cadence_f[cnt].off1max);
2513 break;
2514 case 3:
2515 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
2516 j->cadence_f[cnt].on2max);
2517 break;
2518 case 4:
2519 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
2520 j->cadence_f[cnt].off2max);
2521 break;
2522 case 5:
2523 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
2524 j->cadence_f[cnt].on3max);
2525 break;
2526 case 6:
2527 printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
2528 j->cadence_f[cnt].off3max);
2529 break;
2530 }
2531 }
2532 }
2533 if (j->cadence_f[cnt].state == 7) {
2534 j->cadence_f[cnt].state = 0;
2535 if (j->cadence_f[cnt].enable == 1)
2536 j->cadence_f[cnt].enable = 0;
2537 switch (cnt) {
2538 case 0:
2539 if(ixjdebug & 0x0020) {
2540 printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
2541 }
2542 j->ex.bits.fc0 = 1;
2543 ixj_kill_fasync(j, SIG_FC0, POLL_IN);
2544 break;
2545 case 1:
2546 if(ixjdebug & 0x0020) {
2547 printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
2548 }
2549 j->ex.bits.fc1 = 1;
2550 ixj_kill_fasync(j, SIG_FC1, POLL_IN);
2551 break;
2552 case 2:
2553 if(ixjdebug & 0x0020) {
2554 printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
2555 }
2556 j->ex.bits.fc2 = 1;
2557 ixj_kill_fasync(j, SIG_FC2, POLL_IN);
2558 break;
2559 case 3:
2560 if(ixjdebug & 0x0020) {
2561 printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
2562 }
2563 j->ex.bits.fc3 = 1;
2564 ixj_kill_fasync(j, SIG_FC3, POLL_IN);
2565 break;
2566 }
2567 }
2568 if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
2569 (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
2570 if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
2571 trg = 1;
2572 } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
2573 trg = 0;
2574 }
2575 switch (cnt) {
2576 case 0:
2577 if(ixjdebug & 0x0020) {
2578 printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
2579 }
2580 j->ex.bits.f0 = 1;
2581 ixj_kill_fasync(j, SIG_F0, POLL_IN);
2582 break;
2583 case 1:
2584 if(ixjdebug & 0x0020) {
2585 printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
2586 }
2587 j->ex.bits.f1 = 1;
2588 ixj_kill_fasync(j, SIG_F1, POLL_IN);
2589 break;
2590 case 2:
2591 if(ixjdebug & 0x0020) {
2592 printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
2593 }
2594 j->ex.bits.f2 = 1;
2595 ixj_kill_fasync(j, SIG_F2, POLL_IN);
2596 break;
2597 case 3:
2598 if(ixjdebug & 0x0020) {
2599 printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
2600 }
2601 j->ex.bits.f3 = 1;
2602 ixj_kill_fasync(j, SIG_F3, POLL_IN);
2603 break;
2604 }
2605 }
2606 }
2607 return 0;
2608}
2609
2610static int LineMonitor(IXJ *j)
2611{
2612 if (j->dtmf_proc) {
2613 return -1;
2614 }
2615 j->dtmf_proc = 1;
2616
2617 if (ixj_WriteDSPCommand(0x7000, j)) /* Line Monitor */
2618 return -1;
2619
2620 j->dtmf.bytes.high = j->ssr.high;
2621 j->dtmf.bytes.low = j->ssr.low;
2622 if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
2623 j->dtmf_state = 1;
2624 j->dtmf_current = j->dtmf.bits.digit;
2625 }
2626 if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) /* && j->dtmf_wp != j->dtmf_rp) */
2627 {
2628 if(!j->cidcw_wait) {
2629 j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
2630 j->dtmf_wp++;
2631 if (j->dtmf_wp == 79)
2632 j->dtmf_wp = 0;
2633 j->ex.bits.dtmf_ready = 1;
2634 if(j->ex_sig.bits.dtmf_ready) {
2635 ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
2636 }
2637 }
2638 else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
2639 if(ixjdebug & 0x0020) {
2640 printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
2641 }
2642 j->flags.cidcw_ack = 1;
2643 }
2644 j->dtmf_state = 0;
2645 }
2646 j->dtmf_proc = 0;
2647
2648 return 0;
2649}
2650
2651/************************************************************************
2652*
2653* Functions to allow alaw <-> ulaw conversions.
2654*
2655************************************************************************/
2656
2657static void ulaw2alaw(unsigned char *buff, unsigned long len)
2658{
2659 static unsigned char table_ulaw2alaw[] =
2660 {
2661 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
2662 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
2663 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
2664 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
2665 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
2666 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
2667 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
2668 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
2669 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
2670 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
2671 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
2672 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
2673 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
2674 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
2675 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
2676 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
2677 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
2678 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
2679 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
2680 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
2681 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
2682 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
2683 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
2684 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
2685 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
2686 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
2687 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
2688 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
2689 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
2690 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
2691 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
2692 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
2693 };
2694
2695 while (len--)
2696 {
2697 *buff = table_ulaw2alaw[*(unsigned char *)buff];
2698 buff++;
2699 }
2700}
2701
2702static void alaw2ulaw(unsigned char *buff, unsigned long len)
2703{
2704 static unsigned char table_alaw2ulaw[] =
2705 {
2706 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
2707 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
2708 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
2709 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
2710 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
2711 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
2712 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
2713 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
2714 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
2715 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
2716 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
2717 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
2718 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
2719 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
2720 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
2721 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
2722 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
2723 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
2724 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
2725 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
2726 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
2727 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
2728 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
2729 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
2730 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
2731 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
2732 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
2733 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
2734 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
2735 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
2736 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
2737 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
2738 };
2739
2740 while (len--)
2741 {
2742 *buff = table_alaw2ulaw[*(unsigned char *)buff];
2743 buff++;
2744 }
2745}
2746
2747static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos)
2748{
2749 unsigned long i = *ppos;
d1f22974 2750 IXJ * j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
1da177e4
LT
2751
2752 DECLARE_WAITQUEUE(wait, current);
2753
2754 if (j->flags.inread)
2755 return -EALREADY;
2756
2757 j->flags.inread = 1;
2758
2759 add_wait_queue(&j->read_q, &wait);
2760 set_current_state(TASK_INTERRUPTIBLE);
2761 mb();
2762
2763 while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
2764 ++j->read_wait;
2765 if (file_p->f_flags & O_NONBLOCK) {
2766 set_current_state(TASK_RUNNING);
2767 remove_wait_queue(&j->read_q, &wait);
2768 j->flags.inread = 0;
2769 return -EAGAIN;
2770 }
2771 if (!ixj_hookstate(j)) {
2772 set_current_state(TASK_RUNNING);
2773 remove_wait_queue(&j->read_q, &wait);
2774 j->flags.inread = 0;
2775 return 0;
2776 }
2777 interruptible_sleep_on(&j->read_q);
2778 if (signal_pending(current)) {
2779 set_current_state(TASK_RUNNING);
2780 remove_wait_queue(&j->read_q, &wait);
2781 j->flags.inread = 0;
2782 return -EINTR;
2783 }
2784 }
2785
2786 remove_wait_queue(&j->read_q, &wait);
2787 set_current_state(TASK_RUNNING);
2788 /* Don't ever copy more than the user asks */
2789 if(j->rec_codec == ALAW)
2790 ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
2791 i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
2792 j->read_buffer_ready = 0;
2793 if (i) {
2794 j->flags.inread = 0;
2795 return -EFAULT;
2796 } else {
2797 j->flags.inread = 0;
2798 return min(length, j->read_buffer_size);
2799 }
2800}
2801
2802static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length,
2803 loff_t * ppos)
2804{
2805 int pre_retval;
2806 ssize_t read_retval = 0;
d1f22974 2807 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
1da177e4
LT
2808
2809 pre_retval = ixj_PreRead(j, 0L);
2810 switch (pre_retval) {
2811 case NORMAL:
2812 read_retval = ixj_read(file_p, buf, length, ppos);
2813 ixj_PostRead(j, 0L);
2814 break;
2815 case NOPOST:
2816 read_retval = ixj_read(file_p, buf, length, ppos);
2817 break;
2818 case POSTONLY:
2819 ixj_PostRead(j, 0L);
2820 break;
2821 default:
2822 read_retval = pre_retval;
2823 }
2824 return read_retval;
2825}
2826
2827static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos)
2828{
2829 unsigned long i = *ppos;
2830 IXJ *j = file_p->private_data;
2831
2832 DECLARE_WAITQUEUE(wait, current);
2833
2834 if (j->flags.inwrite)
2835 return -EALREADY;
2836
2837 j->flags.inwrite = 1;
2838
2839 add_wait_queue(&j->write_q, &wait);
2840 set_current_state(TASK_INTERRUPTIBLE);
2841 mb();
2842
2843
2844 while (!j->write_buffers_empty) {
2845 ++j->write_wait;
2846 if (file_p->f_flags & O_NONBLOCK) {
2847 set_current_state(TASK_RUNNING);
2848 remove_wait_queue(&j->write_q, &wait);
2849 j->flags.inwrite = 0;
2850 return -EAGAIN;
2851 }
2852 if (!ixj_hookstate(j)) {
2853 set_current_state(TASK_RUNNING);
2854 remove_wait_queue(&j->write_q, &wait);
2855 j->flags.inwrite = 0;
2856 return 0;
2857 }
2858 interruptible_sleep_on(&j->write_q);
2859 if (signal_pending(current)) {
2860 set_current_state(TASK_RUNNING);
2861 remove_wait_queue(&j->write_q, &wait);
2862 j->flags.inwrite = 0;
2863 return -EINTR;
2864 }
2865 }
2866 set_current_state(TASK_RUNNING);
2867 remove_wait_queue(&j->write_q, &wait);
2868 if (j->write_buffer_wp + count >= j->write_buffer_end)
2869 j->write_buffer_wp = j->write_buffer;
2870 i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
2871 if (i) {
2872 j->flags.inwrite = 0;
2873 return -EFAULT;
2874 }
2875 if(j->play_codec == ALAW)
2876 alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
2877 j->flags.inwrite = 0;
2878 return min(count, j->write_buffer_size);
2879}
2880
2881static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos)
2882{
2883 int pre_retval;
2884 ssize_t write_retval = 0;
2885
d1f22974 2886 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
1da177e4
LT
2887
2888 pre_retval = ixj_PreWrite(j, 0L);
2889 switch (pre_retval) {
2890 case NORMAL:
2891 write_retval = ixj_write(file_p, buf, count, ppos);
2892 if (write_retval > 0) {
2893 ixj_PostWrite(j, 0L);
2894 j->write_buffer_wp += write_retval;
2895 j->write_buffers_empty--;
2896 }
2897 break;
2898 case NOPOST:
2899 write_retval = ixj_write(file_p, buf, count, ppos);
2900 if (write_retval > 0) {
2901 j->write_buffer_wp += write_retval;
2902 j->write_buffers_empty--;
2903 }
2904 break;
2905 case POSTONLY:
2906 ixj_PostWrite(j, 0L);
2907 break;
2908 default:
2909 write_retval = pre_retval;
2910 }
2911 return write_retval;
2912}
2913
2914static void ixj_read_frame(IXJ *j)
2915{
2916 int cnt, dly;
2917
2918 if (j->read_buffer) {
2919 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2920 if (!(cnt % 16) && !IsRxReady(j)) {
2921 dly = 0;
2922 while (!IsRxReady(j)) {
2923 if (dly++ > 5) {
2924 dly = 0;
2925 break;
2926 }
2927 udelay(10);
2928 }
2929 }
2930 /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
2931 if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
2932 inb_p(j->DSPbase + 0x0E);
2933 inb_p(j->DSPbase + 0x0F);
2934 }
2935 *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
2936 *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
2937 }
2938 ++j->framesread;
2939 if (j->intercom != -1) {
2940 if (IsTxReady(get_ixj(j->intercom))) {
2941 for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
2942 if (!(cnt % 16) && !IsTxReady(j)) {
2943 dly = 0;
2944 while (!IsTxReady(j)) {
2945 if (dly++ > 5) {
2946 dly = 0;
2947 break;
2948 }
2949 udelay(10);
2950 }
2951 }
2952 outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
2953 outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
2954 }
2955 get_ixj(j->intercom)->frameswritten++;
2956 }
2957 } else {
2958 j->read_buffer_ready = 1;
2959 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
2960
2961 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
2962
2963 if(j->ixj_signals[SIG_READ_READY])
2964 ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
2965 }
2966 }
2967}
2968
2969static short fsk[][6][20] =
2970{
2971 {
2972 {
2973 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
2974 -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
2975 },
2976 {
2977 -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
2978 -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
2979 },
2980 {
2981 -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
2982 -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
2983 },
2984 {
2985 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
2986 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
2987 },
2988 {
2989 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
2990 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
2991 },
2992 {
2993 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
2994 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
2995 }
2996 },
2997 {
2998 {
2999 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
3000 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
3001 },
3002 {
3003 -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
3004 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
3005 },
3006 {
3007 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
3008 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
3009 },
3010 {
3011 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
3012 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
3013 },
3014 {
3015 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
3016 -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
3017 },
3018 {
3019 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
3020 -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
3021 }
3022 }
3023};
3024
3025
3026static void ixj_write_cid_bit(IXJ *j, int bit)
3027{
3028 while (j->fskcnt < 20) {
3029 if(j->fskdcnt < (j->fsksize - 1))
3030 j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
3031
3032 j->fskcnt += 3;
3033 }
3034 j->fskcnt %= 20;
3035
3036 if (!bit)
3037 j->fskz++;
3038 if (j->fskz >= 6)
3039 j->fskz = 0;
3040
3041}
3042
3043static void ixj_write_cid_byte(IXJ *j, char byte)
3044{
3045 IXJ_CBYTE cb;
3046
3047 cb.cbyte = byte;
3048 ixj_write_cid_bit(j, 0);
3049 ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
3050 ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
3051 ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
3052 ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
3053 ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
3054 ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
3055 ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
3056 ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
3057 ixj_write_cid_bit(j, 1);
3058}
3059
3060static void ixj_write_cid_seize(IXJ *j)
3061{
3062 int cnt;
3063
3064 for (cnt = 0; cnt < 150; cnt++) {
3065 ixj_write_cid_bit(j, 0);
3066 ixj_write_cid_bit(j, 1);
3067 }
3068 for (cnt = 0; cnt < 180; cnt++) {
3069 ixj_write_cid_bit(j, 1);
3070 }
3071}
3072
3073static void ixj_write_cidcw_seize(IXJ *j)
3074{
3075 int cnt;
3076
3077 for (cnt = 0; cnt < 80; cnt++) {
3078 ixj_write_cid_bit(j, 1);
3079 }
3080}
3081
3082static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
3083{
3084 int cnt;
3085
3086 for (cnt = 0; cnt < strlen(s); cnt++) {
3087 ixj_write_cid_byte(j, s[cnt]);
3088 checksum = (checksum + s[cnt]);
3089 }
3090 return checksum;
3091}
3092
3093static void ixj_pad_fsk(IXJ *j, int pad)
3094{
3095 int cnt;
3096
3097 for (cnt = 0; cnt < pad; cnt++) {
3098 if(j->fskdcnt < (j->fsksize - 1))
3099 j->fskdata[j->fskdcnt++] = 0x0000;
3100 }
3101 for (cnt = 0; cnt < 720; cnt++) {
3102 if(j->fskdcnt < (j->fsksize - 1))
3103 j->fskdata[j->fskdcnt++] = 0x0000;
3104 }
3105}
3106
3107static void ixj_pre_cid(IXJ *j)
3108{
3109 j->cid_play_codec = j->play_codec;
3110 j->cid_play_frame_size = j->play_frame_size;
3111 j->cid_play_volume = get_play_volume(j);
3112 j->cid_play_flag = j->flags.playing;
3113
3114 j->cid_rec_codec = j->rec_codec;
3115 j->cid_rec_volume = get_rec_volume(j);
3116 j->cid_rec_flag = j->flags.recording;
3117
3118 j->cid_play_aec_level = j->aec_level;
3119
3120 switch(j->baseframe.low) {
3121 case 0xA0:
3122 j->cid_base_frame_size = 20;
3123 break;
3124 case 0x50:
3125 j->cid_base_frame_size = 10;
3126 break;
3127 case 0xF0:
3128 j->cid_base_frame_size = 30;
3129 break;
3130 }
3131
3132 ixj_play_stop(j);
3133 ixj_cpt_stop(j);
3134
3135 j->flags.cidplay = 1;
3136
3137 set_base_frame(j, 30);
3138 set_play_codec(j, LINEAR16);
3139 set_play_volume(j, 0x1B);
3140 ixj_play_start(j);
3141}
3142
3143static void ixj_post_cid(IXJ *j)
3144{
3145 ixj_play_stop(j);
3146
3147 if(j->cidsize > 5000) {
3148 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
3149 }
3150 j->flags.cidplay = 0;
3151 if(ixjdebug & 0x0200) {
3152 printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
3153 }
3154
3155 ixj_fsk_free(j);
3156
3157 j->fskdcnt = 0;
3158 set_base_frame(j, j->cid_base_frame_size);
3159 set_play_codec(j, j->cid_play_codec);
3160 ixj_aec_start(j, j->cid_play_aec_level);
3161 set_play_volume(j, j->cid_play_volume);
3162
3163 set_rec_codec(j, j->cid_rec_codec);
3164 set_rec_volume(j, j->cid_rec_volume);
3165
3166 if(j->cid_rec_flag)
3167 ixj_record_start(j);
3168
3169 if(j->cid_play_flag)
3170 ixj_play_start(j);
3171
3172 if(j->cid_play_flag) {
3173 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3174 }
3175}
3176
3177static void ixj_write_cid(IXJ *j)
3178{
3179 char sdmf1[50];
3180 char sdmf2[50];
3181 char sdmf3[80];
3182 char mdmflen, len1, len2, len3;
3183 int pad;
3184
3185 int checksum = 0;
3186
3187 if (j->dsp.low == 0x20 || j->flags.cidplay)
3188 return;
3189
3190 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3191 j->cidsize = j->cidcnt = 0;
3192
3193 ixj_fsk_alloc(j);
3194
3195 strcpy(sdmf1, j->cid_send.month);
3196 strcat(sdmf1, j->cid_send.day);
3197 strcat(sdmf1, j->cid_send.hour);
3198 strcat(sdmf1, j->cid_send.min);
3199 strcpy(sdmf2, j->cid_send.number);
3200 strcpy(sdmf3, j->cid_send.name);
3201
3202 len1 = strlen(sdmf1);
3203 len2 = strlen(sdmf2);
3204 len3 = strlen(sdmf3);
3205 mdmflen = len1 + len2 + len3 + 6;
3206
3207 while(1){
3208 ixj_write_cid_seize(j);
3209
3210 ixj_write_cid_byte(j, 0x80);
3211 checksum = 0x80;
3212 ixj_write_cid_byte(j, mdmflen);
3213 checksum = checksum + mdmflen;
3214
3215 ixj_write_cid_byte(j, 0x01);
3216 checksum = checksum + 0x01;
3217 ixj_write_cid_byte(j, len1);
3218 checksum = checksum + len1;
3219 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3220 if(ixj_hookstate(j) & 1)
3221 break;
3222
3223 ixj_write_cid_byte(j, 0x02);
3224 checksum = checksum + 0x02;
3225 ixj_write_cid_byte(j, len2);
3226 checksum = checksum + len2;
3227 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3228 if(ixj_hookstate(j) & 1)
3229 break;
3230
3231 ixj_write_cid_byte(j, 0x07);
3232 checksum = checksum + 0x07;
3233 ixj_write_cid_byte(j, len3);
3234 checksum = checksum + len3;
3235 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3236 if(ixj_hookstate(j) & 1)
3237 break;
3238
3239 checksum %= 256;
3240 checksum ^= 0xFF;
3241 checksum += 1;
3242
3243 ixj_write_cid_byte(j, (char) checksum);
3244
3245 pad = j->fskdcnt % 240;
3246 if (pad) {
3247 pad = 240 - pad;
3248 }
3249 ixj_pad_fsk(j, pad);
3250 break;
3251 }
3252
3253 ixj_write_frame(j);
3254}
3255
3256static void ixj_write_cidcw(IXJ *j)
3257{
3258 IXJ_TONE ti;
3259
3260 char sdmf1[50];
3261 char sdmf2[50];
3262 char sdmf3[80];
3263 char mdmflen, len1, len2, len3;
3264 int pad;
3265
3266 int checksum = 0;
3267
3268 if (j->dsp.low == 0x20 || j->flags.cidplay)
3269 return;
3270
3271 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3272 j->cidsize = j->cidcnt = 0;
3273
3274 ixj_fsk_alloc(j);
3275
3276 j->flags.cidcw_ack = 0;
3277
3278 ti.tone_index = 23;
3279 ti.gain0 = 1;
3280 ti.freq0 = hz440;
3281 ti.gain1 = 0;
3282 ti.freq1 = 0;
3283 ixj_init_tone(j, &ti);
3284
3285 ixj_set_tone_on(1500, j);
3286 ixj_set_tone_off(32, j);
3287 if(ixjdebug & 0x0200) {
3288 printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
3289 }
3290 ixj_play_tone(j, 23);
3291
3292 clear_bit(j->board, &j->busyflags);
1e63bc73
NA
3293 while(j->tone_state)
3294 schedule_timeout_interruptible(1);
3295 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3296 schedule_timeout_interruptible(1);
1da177e4
LT
3297 if(ixjdebug & 0x0200) {
3298 printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
3299 }
3300
3301 ti.tone_index = 24;
3302 ti.gain0 = 1;
3303 ti.freq0 = hz2130;
3304 ti.gain1 = 0;
3305 ti.freq1 = hz2750;
3306 ixj_init_tone(j, &ti);
3307
3308 ixj_set_tone_off(10, j);
3309 ixj_set_tone_on(600, j);
3310 if(ixjdebug & 0x0200) {
3311 printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
3312 }
3313 ixj_play_tone(j, 24);
3314
3315 clear_bit(j->board, &j->busyflags);
1e63bc73
NA
3316 while(j->tone_state)
3317 schedule_timeout_interruptible(1);
3318 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3319 schedule_timeout_interruptible(1);
1da177e4
LT
3320 if(ixjdebug & 0x0200) {
3321 printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
3322 }
3323
3324 j->cidcw_wait = jiffies + ((50 * hertz) / 100);
3325
3326 clear_bit(j->board, &j->busyflags);
1e63bc73
NA
3327 while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait))
3328 schedule_timeout_interruptible(1);
3329 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3330 schedule_timeout_interruptible(1);
1da177e4
LT
3331 j->cidcw_wait = 0;
3332 if(!j->flags.cidcw_ack) {
3333 if(ixjdebug & 0x0200) {
3334 printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
3335 }
3336 ixj_post_cid(j);
3337 if(j->cid_play_flag) {
3338 wake_up_interruptible(&j->write_q); /* Wake any blocked readers */
3339 }
3340 return;
3341 } else {
3342 ixj_pre_cid(j);
3343 }
3344 j->flags.cidcw_ack = 0;
3345 strcpy(sdmf1, j->cid_send.month);
3346 strcat(sdmf1, j->cid_send.day);
3347 strcat(sdmf1, j->cid_send.hour);
3348 strcat(sdmf1, j->cid_send.min);
3349 strcpy(sdmf2, j->cid_send.number);
3350 strcpy(sdmf3, j->cid_send.name);
3351
3352 len1 = strlen(sdmf1);
3353 len2 = strlen(sdmf2);
3354 len3 = strlen(sdmf3);
3355 mdmflen = len1 + len2 + len3 + 6;
3356
3357 ixj_write_cidcw_seize(j);
3358
3359 ixj_write_cid_byte(j, 0x80);
3360 checksum = 0x80;
3361 ixj_write_cid_byte(j, mdmflen);
3362 checksum = checksum + mdmflen;
3363
3364 ixj_write_cid_byte(j, 0x01);
3365 checksum = checksum + 0x01;
3366 ixj_write_cid_byte(j, len1);
3367 checksum = checksum + len1;
3368 checksum = ixj_write_cid_string(j, sdmf1, checksum);
3369
3370 ixj_write_cid_byte(j, 0x02);
3371 checksum = checksum + 0x02;
3372 ixj_write_cid_byte(j, len2);
3373 checksum = checksum + len2;
3374 checksum = ixj_write_cid_string(j, sdmf2, checksum);
3375
3376 ixj_write_cid_byte(j, 0x07);
3377 checksum = checksum + 0x07;
3378 ixj_write_cid_byte(j, len3);
3379 checksum = checksum + len3;
3380 checksum = ixj_write_cid_string(j, sdmf3, checksum);
3381
3382 checksum %= 256;
3383 checksum ^= 0xFF;
3384 checksum += 1;
3385
3386 ixj_write_cid_byte(j, (char) checksum);
3387
3388 pad = j->fskdcnt % 240;
3389 if (pad) {
3390 pad = 240 - pad;
3391 }
3392 ixj_pad_fsk(j, pad);
3393 if(ixjdebug & 0x0200) {
3394 printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
3395 }
3396}
3397
3398static void ixj_write_vmwi(IXJ *j, int msg)
3399{
3400 char mdmflen;
3401 int pad;
3402
3403 int checksum = 0;
3404
3405 if (j->dsp.low == 0x20 || j->flags.cidplay)
3406 return;
3407
3408 j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
3409 j->cidsize = j->cidcnt = 0;
3410
3411 ixj_fsk_alloc(j);
3412
3413 mdmflen = 3;
3414
3415 if (j->port == PORT_POTS)
3416 SLIC_SetState(PLD_SLIC_STATE_OHT, j);
3417
3418 ixj_write_cid_seize(j);
3419
3420 ixj_write_cid_byte(j, 0x82);
3421 checksum = 0x82;
3422 ixj_write_cid_byte(j, mdmflen);
3423 checksum = checksum + mdmflen;
3424
3425 ixj_write_cid_byte(j, 0x0B);
3426 checksum = checksum + 0x0B;
3427 ixj_write_cid_byte(j, 1);
3428 checksum = checksum + 1;
3429
3430 if(msg) {
3431 ixj_write_cid_byte(j, 0xFF);
3432 checksum = checksum + 0xFF;
3433 }
3434 else {
3435 ixj_write_cid_byte(j, 0x00);
3436 checksum = checksum + 0x00;
3437 }
3438
3439 checksum %= 256;
3440 checksum ^= 0xFF;
3441 checksum += 1;
3442
3443 ixj_write_cid_byte(j, (char) checksum);
3444
3445 pad = j->fskdcnt % 240;
3446 if (pad) {
3447 pad = 240 - pad;
3448 }
3449 ixj_pad_fsk(j, pad);
3450}
3451
3452static void ixj_write_frame(IXJ *j)
3453{
3454 int cnt, frame_count, dly;
3455 IXJ_WORD dat;
1da177e4
LT
3456
3457 frame_count = 0;
3458 if(j->flags.cidplay) {
3459 for(cnt = 0; cnt < 480; cnt++) {
3460 if (!(cnt % 16) && !IsTxReady(j)) {
3461 dly = 0;
3462 while (!IsTxReady(j)) {
3463 if (dly++ > 5) {
3464 dly = 0;
3465 break;
3466 }
3467 udelay(10);
3468 }
3469 }
3470 dat.word = j->fskdata[j->cidcnt++];
3471 outb_p(dat.bytes.low, j->DSPbase + 0x0C);
3472 outb_p(dat.bytes.high, j->DSPbase + 0x0D);
3473 cnt++;
3474 }
3475 if(j->cidcnt >= j->fskdcnt) {
3476 ixj_post_cid(j);
3477 }
3478 /* This may seem rude, but if we just played one frame of FSK data for CallerID
3479 and there is real audio data in the buffer, we need to throw it away because
3480 we just used it's time slot */
3481 if (j->write_buffer_rp > j->write_buffer_wp) {
3482 j->write_buffer_rp += j->cid_play_frame_size * 2;
3483 if (j->write_buffer_rp >= j->write_buffer_end) {
3484 j->write_buffer_rp = j->write_buffer;
3485 }
3486 j->write_buffers_empty++;
3487 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3488
3489 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3490 }
3491 } else if (j->write_buffer && j->write_buffers_empty < 1) {
3492 if (j->write_buffer_wp > j->write_buffer_rp) {
3493 frame_count =
3494 (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
3495 }
3496 if (j->write_buffer_rp > j->write_buffer_wp) {
3497 frame_count =
3498 (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
3499 (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
3500 }
3501 if (frame_count >= 1) {
3502 if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
0d480db8
JG
3503 BYTES blankword;
3504
1da177e4
LT
3505 switch (j->play_mode) {
3506 case PLAYBACK_MODE_ULAW:
3507 case PLAYBACK_MODE_ALAW:
3508 blankword.low = blankword.high = 0xFF;
3509 break;
3510 case PLAYBACK_MODE_8LINEAR:
3511 case PLAYBACK_MODE_16LINEAR:
0d480db8 3512 default:
1da177e4
LT
3513 blankword.low = blankword.high = 0x00;
3514 break;
3515 case PLAYBACK_MODE_8LINEAR_WSS:
3516 blankword.low = blankword.high = 0x80;
3517 break;
3518 }
3519 for (cnt = 0; cnt < 16; cnt++) {
3520 if (!(cnt % 16) && !IsTxReady(j)) {
3521 dly = 0;
3522 while (!IsTxReady(j)) {
3523 if (dly++ > 5) {
3524 dly = 0;
3525 break;
3526 }
3527 udelay(10);
3528 }
3529 }
3530 outb_p((blankword.low), j->DSPbase + 0x0C);
3531 outb_p((blankword.high), j->DSPbase + 0x0D);
3532 }
3533 j->flags.play_first_frame = 0;
3534 } else if (j->play_codec == G723_63 && j->flags.play_first_frame) {
3535 for (cnt = 0; cnt < 24; cnt++) {
0d480db8
JG
3536 BYTES blankword;
3537
1da177e4
LT
3538 if(cnt == 12) {
3539 blankword.low = 0x02;
3540 blankword.high = 0x00;
3541 }
3542 else {
3543 blankword.low = blankword.high = 0x00;
3544 }
3545 if (!(cnt % 16) && !IsTxReady(j)) {
3546 dly = 0;
3547 while (!IsTxReady(j)) {
3548 if (dly++ > 5) {
3549 dly = 0;
3550 break;
3551 }
3552 udelay(10);
3553 }
3554 }
3555 outb_p((blankword.low), j->DSPbase + 0x0C);
3556 outb_p((blankword.high), j->DSPbase + 0x0D);
3557 }
3558 j->flags.play_first_frame = 0;
3559 }
3560 for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
3561 if (!(cnt % 16) && !IsTxReady(j)) {
3562 dly = 0;
3563 while (!IsTxReady(j)) {
3564 if (dly++ > 5) {
3565 dly = 0;
3566 break;
3567 }
3568 udelay(10);
3569 }
3570 }
3571 /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */
3572 if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
66ac5a29
AD
3573 if (j->write_buffer_rp[cnt] == 0 &&
3574 j->write_buffer_rp[cnt + 1] == 0 &&
3575 j->write_buffer_rp[cnt + 2] == 0 &&
3576 j->write_buffer_rp[cnt + 3] == 0 &&
3577 j->write_buffer_rp[cnt + 4] == 0 &&
3578 j->write_buffer_rp[cnt + 5] == 0 &&
3579 j->write_buffer_rp[cnt + 6] == 0 &&
3580 j->write_buffer_rp[cnt + 7] == 0 &&
3581 j->write_buffer_rp[cnt + 8] == 0 &&
3582 j->write_buffer_rp[cnt + 9] == 0) {
1da177e4
LT
3583 /* someone is trying to write silence lets make this a type 0 frame. */
3584 outb_p(0x00, j->DSPbase + 0x0C);
3585 outb_p(0x00, j->DSPbase + 0x0D);
3586 } else {
3587 /* so all other frames are type 1. */
3588 outb_p(0x01, j->DSPbase + 0x0C);
3589 outb_p(0x00, j->DSPbase + 0x0D);
3590 }
3591 }
3592 outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
3593 outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
3594 *(j->write_buffer_rp + cnt) = 0;
3595 *(j->write_buffer_rp + cnt + 1) = 0;
3596 }
3597 j->write_buffer_rp += j->play_frame_size * 2;
3598 if (j->write_buffer_rp >= j->write_buffer_end) {
3599 j->write_buffer_rp = j->write_buffer;
3600 }
3601 j->write_buffers_empty++;
3602 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
3603
3604 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
3605
3606 ++j->frameswritten;
3607 }
3608 } else {
3609 j->drybuffer++;
3610 }
3611 if(j->ixj_signals[SIG_WRITE_READY]) {
3612 ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
3613 }
3614}
3615
3616static int idle(IXJ *j)
3617{
3618 if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */
3619
3620 return 0;
3621
3622 if (j->ssr.high || j->ssr.low) {
3623 return 0;
3624 } else {
3625 j->play_mode = -1;
3626 j->flags.playing = 0;
3627 j->rec_mode = -1;
3628 j->flags.recording = 0;
3629 return 1;
3630 }
3631}
3632
3633static int set_base_frame(IXJ *j, int size)
3634{
3635 unsigned short cmd;
3636 int cnt;
3637
3638 idle(j);
3639 j->cid_play_aec_level = j->aec_level;
3640 aec_stop(j);
3641 for (cnt = 0; cnt < 10; cnt++) {
3642 if (idle(j))
3643 break;
3644 }
3645 if (j->ssr.high || j->ssr.low)
3646 return -1;
3647 if (j->dsp.low != 0x20) {
3648 switch (size) {
3649 case 30:
3650 cmd = 0x07F0;
3651 /* Set Base Frame Size to 240 pg9-10 8021 */
3652 break;
3653 case 20:
3654 cmd = 0x07A0;
3655 /* Set Base Frame Size to 160 pg9-10 8021 */
3656 break;
3657 case 10:
3658 cmd = 0x0750;
3659 /* Set Base Frame Size to 80 pg9-10 8021 */
3660 break;
3661 default:
3662 return -1;
3663 }
3664 } else {
3665 if (size == 30)
3666 return size;
3667 else
3668 return -1;
3669 }
3670 if (ixj_WriteDSPCommand(cmd, j)) {
3671 j->baseframe.high = j->baseframe.low = 0xFF;
3672 return -1;
3673 } else {
3674 j->baseframe.high = j->ssr.high;
3675 j->baseframe.low = j->ssr.low;
3676 /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
3677 if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
3678 return -1;
3679 }
3680 }
3681 ixj_aec_start(j, j->cid_play_aec_level);
3682 return size;
3683}
3684
3685static int set_rec_codec(IXJ *j, int rate)
3686{
3687 int retval = 0;
3688
3689 j->rec_codec = rate;
3690
3691 switch (rate) {
3692 case G723_63:
3693 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3694 j->rec_frame_size = 12;
3695 j->rec_mode = 0;
3696 } else {
3697 retval = 1;
3698 }
3699 break;
3700 case G723_53:
3701 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3702 j->rec_frame_size = 10;
3703 j->rec_mode = 0;
3704 } else {
3705 retval = 1;
3706 }
3707 break;
3708 case TS85:
3709 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
3710 j->rec_frame_size = 16;
3711 j->rec_mode = 0;
3712 } else {
3713 retval = 1;
3714 }
3715 break;
3716 case TS48:
3717 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3718 j->rec_frame_size = 9;
3719 j->rec_mode = 0;
3720 } else {
3721 retval = 1;
3722 }
3723 break;
3724 case TS41:
3725 if (j->ver.low != 0x12 || ixj_convert_loaded) {
3726 j->rec_frame_size = 8;
3727 j->rec_mode = 0;
3728 } else {
3729 retval = 1;
3730 }
3731 break;
3732 case G728:
3733 if (j->dsp.low != 0x20) {
3734 j->rec_frame_size = 48;
3735 j->rec_mode = 0;
3736 } else {
3737 retval = 1;
3738 }
3739 break;
3740 case G729:
3741 if (j->dsp.low != 0x20) {
3742 if (!j->flags.g729_loaded) {
3743 retval = 1;
3744 break;
3745 }
3746 switch (j->baseframe.low) {
3747 case 0xA0:
3748 j->rec_frame_size = 10;
3749 break;
3750 case 0x50:
3751 j->rec_frame_size = 5;
3752 break;
3753 default:
3754 j->rec_frame_size = 15;
3755 break;
3756 }
3757 j->rec_mode = 0;
3758 } else {
3759 retval = 1;
3760 }
3761 break;
3762 case G729B:
3763 if (j->dsp.low != 0x20) {
3764 if (!j->flags.g729_loaded) {
3765 retval = 1;
3766 break;
3767 }
3768 switch (j->baseframe.low) {
3769 case 0xA0:
3770 j->rec_frame_size = 12;
3771 break;
3772 case 0x50:
3773 j->rec_frame_size = 6;
3774 break;
3775 default:
3776 j->rec_frame_size = 18;
3777 break;
3778 }
3779 j->rec_mode = 0;
3780 } else {
3781 retval = 1;
3782 }
3783 break;
3784 case ULAW:
3785 switch (j->baseframe.low) {
3786 case 0xA0:
3787 j->rec_frame_size = 80;
3788 break;
3789 case 0x50:
3790 j->rec_frame_size = 40;
3791 break;
3792 default:
3793 j->rec_frame_size = 120;
3794 break;
3795 }
3796 j->rec_mode = 4;
3797 break;
3798 case ALAW:
3799 switch (j->baseframe.low) {
3800 case 0xA0:
3801 j->rec_frame_size = 80;
3802 break;
3803 case 0x50:
3804 j->rec_frame_size = 40;
3805 break;
3806 default:
3807 j->rec_frame_size = 120;
3808 break;
3809 }
3810 j->rec_mode = 4;
3811 break;
3812 case LINEAR16:
3813 switch (j->baseframe.low) {
3814 case 0xA0:
3815 j->rec_frame_size = 160;
3816 break;
3817 case 0x50:
3818 j->rec_frame_size = 80;
3819 break;
3820 default:
3821 j->rec_frame_size = 240;
3822 break;
3823 }
3824 j->rec_mode = 5;
3825 break;
3826 case LINEAR8:
3827 switch (j->baseframe.low) {
3828 case 0xA0:
3829 j->rec_frame_size = 80;
3830 break;
3831 case 0x50:
3832 j->rec_frame_size = 40;
3833 break;
3834 default:
3835 j->rec_frame_size = 120;
3836 break;
3837 }
3838 j->rec_mode = 6;
3839 break;
3840 case WSS:
3841 switch (j->baseframe.low) {
3842 case 0xA0:
3843 j->rec_frame_size = 80;
3844 break;
3845 case 0x50:
3846 j->rec_frame_size = 40;
3847 break;
3848 default:
3849 j->rec_frame_size = 120;
3850 break;
3851 }
3852 j->rec_mode = 7;
3853 break;
3854 default:
0159f76d 3855 kfree(j->read_buffer);
1da177e4
LT
3856 j->rec_frame_size = 0;
3857 j->rec_mode = -1;
0159f76d
JJ
3858 j->read_buffer = NULL;
3859 j->read_buffer_size = 0;
1da177e4
LT
3860 retval = 1;
3861 break;
3862 }
3863 return retval;
3864}
3865
3866static int ixj_record_start(IXJ *j)
3867{
3868 unsigned short cmd = 0x0000;
3869
3870 if (j->read_buffer) {
3871 ixj_record_stop(j);
3872 }
3873 j->flags.recording = 1;
3874 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
3875
3876 if(ixjdebug & 0x0002)
3877 printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3878
3879 if (!j->rec_mode) {
3880 switch (j->rec_codec) {
3881 case G723_63:
3882 cmd = 0x5131;
3883 break;
3884 case G723_53:
3885 cmd = 0x5132;
3886 break;
3887 case TS85:
3888 cmd = 0x5130; /* TrueSpeech 8.5 */
3889
3890 break;
3891 case TS48:
3892 cmd = 0x5133; /* TrueSpeech 4.8 */
3893
3894 break;
3895 case TS41:
3896 cmd = 0x5134; /* TrueSpeech 4.1 */
3897
3898 break;
3899 case G728:
3900 cmd = 0x5135;
3901 break;
3902 case G729:
3903 case G729B:
3904 cmd = 0x5136;
3905 break;
3906 default:
3907 return 1;
3908 }
3909 if (ixj_WriteDSPCommand(cmd, j))
3910 return -1;
3911 }
3912 if (!j->read_buffer) {
3913 if (!j->read_buffer)
3914 j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
3915 if (!j->read_buffer) {
3916 printk("Read buffer allocation for ixj board %d failed!\n", j->board);
3917 return -ENOMEM;
3918 }
3919 }
3920 j->read_buffer_size = j->rec_frame_size * 2;
3921
3922 if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */
3923
3924 return -1;
3925
3926 switch (j->rec_mode) {
3927 case 0:
3928 cmd = 0x1C03; /* Record C1 */
3929
3930 break;
3931 case 4:
3932 if (j->ver.low == 0x12) {
3933 cmd = 0x1E03; /* Record C1 */
3934
3935 } else {
3936 cmd = 0x1E01; /* Record C1 */
3937
3938 }
3939 break;
3940 case 5:
3941 if (j->ver.low == 0x12) {
3942 cmd = 0x1E83; /* Record C1 */
3943
3944 } else {
3945 cmd = 0x1E81; /* Record C1 */
3946
3947 }
3948 break;
3949 case 6:
3950 if (j->ver.low == 0x12) {
3951 cmd = 0x1F03; /* Record C1 */
3952
3953 } else {
3954 cmd = 0x1F01; /* Record C1 */
3955
3956 }
3957 break;
3958 case 7:
3959 if (j->ver.low == 0x12) {
3960 cmd = 0x1F83; /* Record C1 */
3961 } else {
3962 cmd = 0x1F81; /* Record C1 */
3963 }
3964 break;
3965 }
3966 if (ixj_WriteDSPCommand(cmd, j))
3967 return -1;
3968
3969 if (j->flags.playing) {
3970 ixj_aec_start(j, j->aec_level);
3971 }
3972 return 0;
3973}
3974
3975static void ixj_record_stop(IXJ *j)
3976{
0159f76d 3977 if (ixjdebug & 0x0002)
1da177e4
LT
3978 printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
3979
0159f76d
JJ
3980 kfree(j->read_buffer);
3981 j->read_buffer = NULL;
3982 j->read_buffer_size = 0;
1da177e4
LT
3983 if (j->rec_mode > -1) {
3984 ixj_WriteDSPCommand(0x5120, j);
3985 j->rec_mode = -1;
3986 }
3987 j->flags.recording = 0;
3988}
3989static void ixj_vad(IXJ *j, int arg)
3990{
3991 if (arg)
3992 ixj_WriteDSPCommand(0x513F, j);
3993 else
3994 ixj_WriteDSPCommand(0x513E, j);
3995}
3996
3997static void set_rec_depth(IXJ *j, int depth)
3998{
3999 if (depth > 60)
4000 depth = 60;
4001 if (depth < 0)
4002 depth = 0;
4003 ixj_WriteDSPCommand(0x5180 + depth, j);
4004}
4005
4006static void set_dtmf_prescale(IXJ *j, int volume)
4007{
4008 ixj_WriteDSPCommand(0xCF07, j);
4009 ixj_WriteDSPCommand(volume, j);
4010}
4011
4012static int get_dtmf_prescale(IXJ *j)
4013{
4014 ixj_WriteDSPCommand(0xCF05, j);
4015 return j->ssr.high << 8 | j->ssr.low;
4016}
4017
4018static void set_rec_volume(IXJ *j, int volume)
4019{
4020 if(j->aec_level == AEC_AGC) {
4021 if (ixjdebug & 0x0002)
4022 printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
4023 ixj_WriteDSPCommand(0xCF96, j);
4024 ixj_WriteDSPCommand(volume, j);
4025 } else {
4026 if (ixjdebug & 0x0002)
4027 printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
4028 ixj_WriteDSPCommand(0xCF03, j);
4029 ixj_WriteDSPCommand(volume, j);
4030 }
4031}
4032
4033static int set_rec_volume_linear(IXJ *j, int volume)
4034{
4035 int newvolume, dsprecmax;
4036
4037 if (ixjdebug & 0x0002)
4038 printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
4039 if(volume > 100 || volume < 0) {
4040 return -1;
4041 }
4042
4043 /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
4044 switch (j->cardtype) {
4045 case QTI_PHONEJACK:
4046 dsprecmax = 0x440;
4047 break;
4048 case QTI_LINEJACK:
4049 dsprecmax = 0x180;
4050 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
4051 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
4052 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
4053 break;
4054 case QTI_PHONEJACK_LITE:
4055 dsprecmax = 0x4C0;
4056 break;
4057 case QTI_PHONEJACK_PCI:
4058 dsprecmax = 0x100;
4059 break;
4060 case QTI_PHONECARD:
4061 dsprecmax = 0x400;
4062 break;
4063 default:
4064 return -1;
4065 }
4066 newvolume = (dsprecmax * volume) / 100;
4067 set_rec_volume(j, newvolume);
4068 return 0;
4069}
4070
4071static int get_rec_volume(IXJ *j)
4072{
4073 if(j->aec_level == AEC_AGC) {
4074 if (ixjdebug & 0x0002)
4075 printk(KERN_INFO "Getting AGC Threshold\n");
4076 ixj_WriteDSPCommand(0xCF86, j);
4077 if (ixjdebug & 0x0002)
4078 printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
4079 return j->ssr.high << 8 | j->ssr.low;
4080 } else {
4081 if (ixjdebug & 0x0002)
4082 printk(KERN_INFO "Getting Record Volume\n");
4083 ixj_WriteDSPCommand(0xCF01, j);
4084 return j->ssr.high << 8 | j->ssr.low;
4085 }
4086}
4087
4088static int get_rec_volume_linear(IXJ *j)
4089{
4090 int volume, newvolume, dsprecmax;
4091
4092 switch (j->cardtype) {
4093 case QTI_PHONEJACK:
4094 dsprecmax = 0x440;
4095 break;
4096 case QTI_LINEJACK:
4097 dsprecmax = 0x180;
4098 break;
4099 case QTI_PHONEJACK_LITE:
4100 dsprecmax = 0x4C0;
4101 break;
4102 case QTI_PHONEJACK_PCI:
4103 dsprecmax = 0x100;
4104 break;
4105 case QTI_PHONECARD:
4106 dsprecmax = 0x400;
4107 break;
4108 default:
4109 return -1;
4110 }
4111 volume = get_rec_volume(j);
4112 newvolume = (volume * 100) / dsprecmax;
4113 if(newvolume > 100)
4114 newvolume = 100;
4115 return newvolume;
4116}
4117
4118static int get_rec_level(IXJ *j)
4119{
4120 int retval;
4121
4122 ixj_WriteDSPCommand(0xCF88, j);
4123
4124 retval = j->ssr.high << 8 | j->ssr.low;
4125 retval = (retval * 256) / 240;
4126 return retval;
4127}
4128
4129static void ixj_aec_start(IXJ *j, int level)
4130{
4131 j->aec_level = level;
4132 if (ixjdebug & 0x0002)
4133 printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
4134 if (!level) {
4135 aec_stop(j);
4136 } else {
4137 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4138 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
4139
4140 ixj_WriteDSPCommand(0x0300, j);
4141 }
4142 ixj_WriteDSPCommand(0xB001, j); /* AEC On */
4143
4144 ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
4145
4146 switch (level) {
4147 case AEC_LOW:
4148 ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
4149
4150 ixj_WriteDSPCommand(0xE011, j);
4151 ixj_WriteDSPCommand(0xFFFF, j);
4152
4153 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4154 ixj_WriteDSPCommand(0x0000, j); /* to off */
4155
4156 break;
4157
4158 case AEC_MED:
4159 ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
4160
4161 ixj_WriteDSPCommand(0xE011, j);
4162 ixj_WriteDSPCommand(0x0080, j);
4163
4164 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4165 ixj_WriteDSPCommand(0x0000, j); /* to off */
4166
4167 break;
4168
4169 case AEC_HIGH:
4170 ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
4171
4172 ixj_WriteDSPCommand(0xE011, j);
4173 ixj_WriteDSPCommand(0x0080, j);
4174
4175 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4176 ixj_WriteDSPCommand(0x0000, j); /* to off */
4177
4178 break;
4179
4180 case AEC_AGC:
4181 /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
4182 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4183
4184 ixj_WriteDSPCommand(0xE011, j);
4185 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4186
4187 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4188
4189 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4190 ixj_WriteDSPCommand(0x0224, j);
4191 else
4192 ixj_WriteDSPCommand(0x1224, j);
4193
4194 ixj_WriteDSPCommand(0xE014, j);
4195 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4196
4197 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4198
4199 /* Now we can set the AGC initial parameters and turn it on */
4200 ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */
4201 ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
4202
4203 ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
4204 ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
4205
4206 ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
4207 ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
4208
4209 ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
4210 ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
4211
4212 ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
4213 ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
4214
4215 ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
4216 ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
4217
4218 ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
4219 ixj_WriteDSPCommand(0x1200, j); /* to 25% */
4220
4221 ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
4222 ixj_WriteDSPCommand(0x0001, j); /* to on */
4223
4224 break;
4225
4226 case AEC_AUTO:
4227 ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
4228
4229 ixj_WriteDSPCommand(0xE011, j);
4230 ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
4231
4232 ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
4233
4234 if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
4235 ixj_WriteDSPCommand(0x0224, j);
4236 else
4237 ixj_WriteDSPCommand(0x1224, j);
4238
4239 ixj_WriteDSPCommand(0xE014, j);
4240 ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
4241
4242 ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
4243
4244 break;
4245 }
4246 }
4247}
4248
4249static void aec_stop(IXJ *j)
4250{
4251 j->aec_level = AEC_OFF;
4252 if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
4253 ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
4254
4255 ixj_WriteDSPCommand(0x0700, j);
4256 }
4257 if (j->play_mode != -1 && j->rec_mode != -1)
4258 {
4259 ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
4260 }
4261}
4262
4263static int set_play_codec(IXJ *j, int rate)
4264{
4265 int retval = 0;
4266
4267 j->play_codec = rate;
4268
4269 switch (rate) {
4270 case G723_63:
4271 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4272 j->play_frame_size = 12;
4273 j->play_mode = 0;
4274 } else {
4275 retval = 1;
4276 }
4277 break;
4278 case G723_53:
4279 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4280 j->play_frame_size = 10;
4281 j->play_mode = 0;
4282 } else {
4283 retval = 1;
4284 }
4285 break;
4286 case TS85:
4287 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
4288 j->play_frame_size = 16;
4289 j->play_mode = 0;
4290 } else {
4291 retval = 1;
4292 }
4293 break;
4294 case TS48:
4295 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4296 j->play_frame_size = 9;
4297 j->play_mode = 0;
4298 } else {
4299 retval = 1;
4300 }
4301 break;
4302 case TS41:
4303 if (j->ver.low != 0x12 || ixj_convert_loaded) {
4304 j->play_frame_size = 8;
4305 j->play_mode = 0;
4306 } else {
4307 retval = 1;
4308 }
4309 break;
4310 case G728:
4311 if (j->dsp.low != 0x20) {
4312 j->play_frame_size = 48;
4313 j->play_mode = 0;
4314 } else {
4315 retval = 1;
4316 }
4317 break;
4318 case G729:
4319 if (j->dsp.low != 0x20) {
4320 if (!j->flags.g729_loaded) {
4321 retval = 1;
4322 break;
4323 }
4324 switch (j->baseframe.low) {
4325 case 0xA0:
4326 j->play_frame_size = 10;
4327 break;
4328 case 0x50:
4329 j->play_frame_size = 5;
4330 break;
4331 default:
4332 j->play_frame_size = 15;
4333 break;
4334 }
4335 j->play_mode = 0;
4336 } else {
4337 retval = 1;
4338 }
4339 break;
4340 case G729B:
4341 if (j->dsp.low != 0x20) {
4342 if (!j->flags.g729_loaded) {
4343 retval = 1;
4344 break;
4345 }
4346 switch (j->baseframe.low) {
4347 case 0xA0:
4348 j->play_frame_size = 12;
4349 break;
4350 case 0x50:
4351 j->play_frame_size = 6;
4352 break;
4353 default:
4354 j->play_frame_size = 18;
4355 break;
4356 }
4357 j->play_mode = 0;
4358 } else {
4359 retval = 1;
4360 }
4361 break;
4362 case ULAW:
4363 switch (j->baseframe.low) {
4364 case 0xA0:
4365 j->play_frame_size = 80;
4366 break;
4367 case 0x50:
4368 j->play_frame_size = 40;
4369 break;
4370 default:
4371 j->play_frame_size = 120;
4372 break;
4373 }
4374 j->play_mode = 2;
4375 break;
4376 case ALAW:
4377 switch (j->baseframe.low) {
4378 case 0xA0:
4379 j->play_frame_size = 80;
4380 break;
4381 case 0x50:
4382 j->play_frame_size = 40;
4383 break;
4384 default:
4385 j->play_frame_size = 120;
4386 break;
4387 }
4388 j->play_mode = 2;
4389 break;
4390 case LINEAR16:
4391 switch (j->baseframe.low) {
4392 case 0xA0:
4393 j->play_frame_size = 160;
4394 break;
4395 case 0x50:
4396 j->play_frame_size = 80;
4397 break;
4398 default:
4399 j->play_frame_size = 240;
4400 break;
4401 }
4402 j->play_mode = 6;
4403 break;
4404 case LINEAR8:
4405 switch (j->baseframe.low) {
4406 case 0xA0:
4407 j->play_frame_size = 80;
4408 break;
4409 case 0x50:
4410 j->play_frame_size = 40;
4411 break;
4412 default:
4413 j->play_frame_size = 120;
4414 break;
4415 }
4416 j->play_mode = 4;
4417 break;
4418 case WSS:
4419 switch (j->baseframe.low) {
4420 case 0xA0:
4421 j->play_frame_size = 80;
4422 break;
4423 case 0x50:
4424 j->play_frame_size = 40;
4425 break;
4426 default:
4427 j->play_frame_size = 120;
4428 break;
4429 }
4430 j->play_mode = 5;
4431 break;
4432 default:
0159f76d 4433 kfree(j->write_buffer);
1da177e4
LT
4434 j->play_frame_size = 0;
4435 j->play_mode = -1;
0159f76d
JJ
4436 j->write_buffer = NULL;
4437 j->write_buffer_size = 0;
1da177e4
LT
4438 retval = 1;
4439 break;
4440 }
4441 return retval;
4442}
4443
4444static int ixj_play_start(IXJ *j)
4445{
4446 unsigned short cmd = 0x0000;
4447
4448 if (j->write_buffer) {
4449 ixj_play_stop(j);
4450 }
4451
4452 if(ixjdebug & 0x0002)
4453 printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4454
4455 j->flags.playing = 1;
4456 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
4457
4458 j->flags.play_first_frame = 1;
4459 j->drybuffer = 0;
4460
4461 if (!j->play_mode) {
4462 switch (j->play_codec) {
4463 case G723_63:
4464 cmd = 0x5231;
4465 break;
4466 case G723_53:
4467 cmd = 0x5232;
4468 break;
4469 case TS85:
4470 cmd = 0x5230; /* TrueSpeech 8.5 */
4471
4472 break;
4473 case TS48:
4474 cmd = 0x5233; /* TrueSpeech 4.8 */
4475
4476 break;
4477 case TS41:
4478 cmd = 0x5234; /* TrueSpeech 4.1 */
4479
4480 break;
4481 case G728:
4482 cmd = 0x5235;
4483 break;
4484 case G729:
4485 case G729B:
4486 cmd = 0x5236;
4487 break;
4488 default:
4489 return 1;
4490 }
4491 if (ixj_WriteDSPCommand(cmd, j))
4492 return -1;
4493 }
4494 j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
4495 if (!j->write_buffer) {
4496 printk("Write buffer allocation for ixj board %d failed!\n", j->board);
4497 return -ENOMEM;
4498 }
4499/* j->write_buffers_empty = 2; */
4500 j->write_buffers_empty = 1;
4501 j->write_buffer_size = j->play_frame_size * 2;
4502 j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
4503 j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
4504
4505 if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */
4506
4507 return -1;
4508
4509 switch (j->play_mode) {
4510 case 0:
4511 cmd = 0x2C03;
4512 break;
4513 case 2:
4514 if (j->ver.low == 0x12) {
4515 cmd = 0x2C23;
4516 } else {
4517 cmd = 0x2C21;
4518 }
4519 break;
4520 case 4:
4521 if (j->ver.low == 0x12) {
4522 cmd = 0x2C43;
4523 } else {
4524 cmd = 0x2C41;
4525 }
4526 break;
4527 case 5:
4528 if (j->ver.low == 0x12) {
4529 cmd = 0x2C53;
4530 } else {
4531 cmd = 0x2C51;
4532 }
4533 break;
4534 case 6:
4535 if (j->ver.low == 0x12) {
4536 cmd = 0x2C63;
4537 } else {
4538 cmd = 0x2C61;
4539 }
4540 break;
4541 }
4542 if (ixj_WriteDSPCommand(cmd, j))
4543 return -1;
4544
4545 if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */
4546 return -1;
4547
4548 if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */
4549 return -1;
4550
4551 if (j->flags.recording) {
4552 ixj_aec_start(j, j->aec_level);
4553 }
4554
4555 return 0;
4556}
4557
4558static void ixj_play_stop(IXJ *j)
4559{
0159f76d 4560 if (ixjdebug & 0x0002)
1da177e4
LT
4561 printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
4562
0159f76d
JJ
4563 kfree(j->write_buffer);
4564 j->write_buffer = NULL;
4565 j->write_buffer_size = 0;
1da177e4
LT
4566 if (j->play_mode > -1) {
4567 ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers. 8022 reference page 9-40 */
4568
4569 j->play_mode = -1;
4570 }
4571 j->flags.playing = 0;
4572}
4573
4574static inline int get_play_level(IXJ *j)
4575{
4576 int retval;
4577
4578 ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
4579 return j->ssr.high << 8 | j->ssr.low;
4580 retval = j->ssr.high << 8 | j->ssr.low;
4581 retval = (retval * 256) / 240;
4582 return retval;
4583}
4584
4585static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
4586{
4587 unsigned int mask = 0;
4588
d1f22974 4589 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
1da177e4
LT
4590
4591 poll_wait(file_p, &(j->poll_q), wait);
4592 if (j->read_buffer_ready > 0)
4593 mask |= POLLIN | POLLRDNORM; /* readable */
4594 if (j->write_buffers_empty > 0)
4595 mask |= POLLOUT | POLLWRNORM; /* writable */
4596 if (j->ex.bytes)
4597 mask |= POLLPRI;
4598 return mask;
4599}
4600
4601static int ixj_play_tone(IXJ *j, char tone)
4602{
4603 if (!j->tone_state) {
4604 if(ixjdebug & 0x0002) {
4605 printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
4606 }
4607 if (j->dsp.low == 0x20) {
4608 idle(j);
4609 }
4610 j->tone_start_jif = jiffies;
4611
4612 j->tone_state = 1;
4613 }
4614
4615 j->tone_index = tone;
4616 if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
4617 return -1;
4618
4619 return 0;
4620}
4621
4622static int ixj_set_tone_on(unsigned short arg, IXJ *j)
4623{
4624 j->tone_on_time = arg;
4625
4626 if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */
4627
4628 return -1;
4629
4630 if (ixj_WriteDSPCommand(arg, j))
4631 return -1;
4632
4633 return 0;
4634}
4635
4636static int SCI_WaitHighSCI(IXJ *j)
4637{
4638 int cnt;
4639
4640 j->pld_scrr.byte = inb_p(j->XILINXbase);
4641 if (!j->pld_scrr.bits.sci) {
4642 for (cnt = 0; cnt < 10; cnt++) {
4643 udelay(32);
4644 j->pld_scrr.byte = inb_p(j->XILINXbase);
4645
4646 if ((j->pld_scrr.bits.sci))
4647 return 1;
4648 }
4649 if (ixjdebug & 0x0001)
4650 printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
4651 return 0;
4652 } else
4653 return 1;
4654}
4655
4656static int SCI_WaitLowSCI(IXJ *j)
4657{
4658 int cnt;
4659
4660 j->pld_scrr.byte = inb_p(j->XILINXbase);
4661 if (j->pld_scrr.bits.sci) {
4662 for (cnt = 0; cnt < 10; cnt++) {
4663 udelay(32);
4664 j->pld_scrr.byte = inb_p(j->XILINXbase);
4665
4666 if (!(j->pld_scrr.bits.sci))
4667 return 1;
4668 }
4669 if (ixjdebug & 0x0001)
4670 printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
4671 return 0;
4672 } else
4673 return 1;
4674}
4675
4676static int SCI_Control(IXJ *j, int control)
4677{
4678 switch (control) {
4679 case SCI_End:
4680 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4681
4682 j->pld_scrw.bits.c1 = 0; /* to no selection */
4683
4684 break;
4685 case SCI_Enable_DAA:
4686 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4687
4688 j->pld_scrw.bits.c1 = 0; /* to write to DAA */
4689
4690 break;
4691 case SCI_Enable_Mixer:
4692 j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
4693
4694 j->pld_scrw.bits.c1 = 1; /* to write to mixer */
4695
4696 break;
4697 case SCI_Enable_EEPROM:
4698 j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
4699
4700 j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */
4701
4702 break;
4703 default:
4704 return 0;
4705 break;
4706 }
4707 outb_p(j->pld_scrw.byte, j->XILINXbase);
4708
4709 switch (control) {
4710 case SCI_End:
4711 return 1;
4712 break;
4713 case SCI_Enable_DAA:
4714 case SCI_Enable_Mixer:
4715 case SCI_Enable_EEPROM:
4716 if (!SCI_WaitHighSCI(j))
4717 return 0;
4718 break;
4719 default:
4720 return 0;
4721 break;
4722 }
4723 return 1;
4724}
4725
4726static int SCI_Prepare(IXJ *j)
4727{
4728 if (!SCI_Control(j, SCI_End))
4729 return 0;
4730
4731 if (!SCI_WaitLowSCI(j))
4732 return 0;
4733
4734 return 1;
4735}
4736
4737static int ixj_get_mixer(long val, IXJ *j)
4738{
4739 int reg = (val & 0x1F00) >> 8;
4740 return j->mix.vol[reg];
4741}
4742
4743static int ixj_mixer(long val, IXJ *j)
4744{
4745 BYTES bytes;
4746
4747 bytes.high = (val & 0x1F00) >> 8;
4748 bytes.low = val & 0x00FF;
4749
4750 /* save mixer value so we can get back later on */
4751 j->mix.vol[bytes.high] = bytes.low;
4752
4753 outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */
4754
4755 outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */
4756
4757 SCI_Control(j, SCI_Enable_Mixer);
4758
4759 SCI_Control(j, SCI_End);
4760
4761 return 0;
4762}
4763
4764static int daa_load(BYTES * p_bytes, IXJ *j)
4765{
4766 outb_p(p_bytes->high, j->XILINXbase + 0x03);
4767 outb_p(p_bytes->low, j->XILINXbase + 0x02);
4768 if (!SCI_Control(j, SCI_Enable_DAA))
4769 return 0;
4770 else
4771 return 1;
4772}
4773
4774static int ixj_daa_cr4(IXJ *j, char reg)
4775{
4776 BYTES bytes;
4777
4778 switch (j->daa_mode) {
4779 case SOP_PU_SLEEP:
4780 bytes.high = 0x14;
4781 break;
4782 case SOP_PU_RINGING:
4783 bytes.high = 0x54;
4784 break;
4785 case SOP_PU_CONVERSATION:
4786 bytes.high = 0x94;
4787 break;
4788 case SOP_PU_PULSEDIALING:
4789 bytes.high = 0xD4;
4790 break;
4791 }
4792
4793 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
4794
4795 switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
4796 case 0:
4797 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
4798 break;
4799 case 1:
4800 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
4801 break;
4802 case 2:
4803 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
4804 break;
4805 case 3:
4806 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
4807 break;
4808 }
4809
4810 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
4811
4812 if (!daa_load(&bytes, j))
4813 return 0;
4814
4815 if (!SCI_Prepare(j))
4816 return 0;
4817
4818 return 1;
4819}
4820
4821static char daa_int_read(IXJ *j)
4822{
4823 BYTES bytes;
4824
4825 if (!SCI_Prepare(j))
4826 return 0;
4827
4828 bytes.high = 0x38;
4829 bytes.low = 0x00;
4830 outb_p(bytes.high, j->XILINXbase + 0x03);
4831 outb_p(bytes.low, j->XILINXbase + 0x02);
4832
4833 if (!SCI_Control(j, SCI_Enable_DAA))
4834 return 0;
4835
4836 bytes.high = inb_p(j->XILINXbase + 0x03);
4837 bytes.low = inb_p(j->XILINXbase + 0x02);
4838 if (bytes.low != ALISDAA_ID_BYTE) {
4839 if (ixjdebug & 0x0001)
4840 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4841 return 0;
4842 }
4843 if (!SCI_Control(j, SCI_Enable_DAA))
4844 return 0;
4845 if (!SCI_Control(j, SCI_End))
4846 return 0;
4847
4848 bytes.high = inb_p(j->XILINXbase + 0x03);
4849 bytes.low = inb_p(j->XILINXbase + 0x02);
4850
4851 j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
4852
4853 return 1;
4854}
4855
4856static char daa_CR_read(IXJ *j, int cr)
4857{
4858 IXJ_WORD wdata;
4859 BYTES bytes;
4860
4861 if (!SCI_Prepare(j))
4862 return 0;
4863
4864 switch (j->daa_mode) {
4865 case SOP_PU_SLEEP:
4866 bytes.high = 0x30 + cr;
4867 break;
4868 case SOP_PU_RINGING:
4869 bytes.high = 0x70 + cr;
4870 break;
4871 case SOP_PU_CONVERSATION:
4872 bytes.high = 0xB0 + cr;
4873 break;
4874 case SOP_PU_PULSEDIALING:
0d480db8 4875 default:
1da177e4
LT
4876 bytes.high = 0xF0 + cr;
4877 break;
4878 }
4879
4880 bytes.low = 0x00;
4881
4882 outb_p(bytes.high, j->XILINXbase + 0x03);
4883 outb_p(bytes.low, j->XILINXbase + 0x02);
4884
4885 if (!SCI_Control(j, SCI_Enable_DAA))
4886 return 0;
4887
4888 bytes.high = inb_p(j->XILINXbase + 0x03);
4889 bytes.low = inb_p(j->XILINXbase + 0x02);
4890 if (bytes.low != ALISDAA_ID_BYTE) {
4891 if (ixjdebug & 0x0001)
4892 printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
4893 return 0;
4894 }
4895 if (!SCI_Control(j, SCI_Enable_DAA))
4896 return 0;
4897 if (!SCI_Control(j, SCI_End))
4898 return 0;
4899
4900 wdata.word = inw_p(j->XILINXbase + 0x02);
4901
4902 switch(cr){
4903 case 5:
4904 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
4905 break;
4906 case 4:
4907 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
4908 break;
4909 case 3:
4910 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
4911 break;
4912 case 2:
4913 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
4914 break;
4915 case 1:
4916 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
4917 break;
4918 case 0:
4919 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
4920 break;
4921 default:
4922 return 0;
4923 }
4924 return 1;
4925}
4926
4927static int ixj_daa_cid_reset(IXJ *j)
4928{
4929 int i;
4930 BYTES bytes;
4931
4932 if (ixjdebug & 0x0002)
4933 printk("DAA Clearing CID ram\n");
4934
4935 if (!SCI_Prepare(j))
4936 return 0;
4937
4938 bytes.high = 0x58;
4939 bytes.low = 0x00;
4940 outb_p(bytes.high, j->XILINXbase + 0x03);
4941 outb_p(bytes.low, j->XILINXbase + 0x02);
4942
4943 if (!SCI_Control(j, SCI_Enable_DAA))
4944 return 0;
4945
4946 if (!SCI_WaitHighSCI(j))
4947 return 0;
4948
4949 for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
4950 bytes.high = bytes.low = 0x00;
4951 outb_p(bytes.high, j->XILINXbase + 0x03);
4952
4953 if (i < ALISDAA_CALLERID_SIZE - 1)
4954 outb_p(bytes.low, j->XILINXbase + 0x02);
4955
4956 if (!SCI_Control(j, SCI_Enable_DAA))
4957 return 0;
4958
4959 if (!SCI_WaitHighSCI(j))
4960 return 0;
4961
4962 }
4963
4964 if (!SCI_Control(j, SCI_End))
4965 return 0;
4966
4967 if (ixjdebug & 0x0002)
4968 printk("DAA CID ram cleared\n");
4969
4970 return 1;
4971}
4972
4973static int ixj_daa_cid_read(IXJ *j)
4974{
4975 int i;
4976 BYTES bytes;
e13df2c5
RK
4977 char CID[ALISDAA_CALLERID_SIZE];
4978 bool mContinue;
1da177e4
LT
4979 char *pIn, *pOut;
4980
4981 if (!SCI_Prepare(j))
4982 return 0;
4983
4984 bytes.high = 0x78;
4985 bytes.low = 0x00;
4986 outb_p(bytes.high, j->XILINXbase + 0x03);
4987 outb_p(bytes.low, j->XILINXbase + 0x02);
4988
4989 if (!SCI_Control(j, SCI_Enable_DAA))
4990 return 0;
4991
4992 if (!SCI_WaitHighSCI(j))
4993 return 0;
4994
4995 bytes.high = inb_p(j->XILINXbase + 0x03);
4996 bytes.low = inb_p(j->XILINXbase + 0x02);
4997 if (bytes.low != ALISDAA_ID_BYTE) {
4998 if (ixjdebug & 0x0001)
4999 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5000 return 0;
5001 }
5002 for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
5003 bytes.high = bytes.low = 0x00;
5004 outb_p(bytes.high, j->XILINXbase + 0x03);
5005 outb_p(bytes.low, j->XILINXbase + 0x02);
5006
5007 if (!SCI_Control(j, SCI_Enable_DAA))
5008 return 0;
5009
5010 if (!SCI_WaitHighSCI(j))
5011 return 0;
5012
5013 CID[i + 0] = inb_p(j->XILINXbase + 0x03);
5014 CID[i + 1] = inb_p(j->XILINXbase + 0x02);
5015 }
5016
5017 if (!SCI_Control(j, SCI_End))
5018 return 0;
5019
5020 pIn = CID;
5021 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
e13df2c5 5022 mContinue = true;
1da177e4
LT
5023 while (mContinue) {
5024 if ((pIn[1] & 0x03) == 0x01) {
5025 pOut[0] = pIn[0];
5026 }
5027 if ((pIn[2] & 0x0c) == 0x04) {
5028 pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
5029 }
5030 if ((pIn[3] & 0x30) == 0x10) {
5031 pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
5032 }
5033 if ((pIn[4] & 0xc0) == 0x40) {
5034 pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
5035 } else {
e13df2c5 5036 mContinue = false;
1da177e4
LT
5037 }
5038 pIn += 5, pOut += 4;
5039 }
5040 memset(&j->cid, 0, sizeof(PHONE_CID));
5041 pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5042 pOut += 4;
5043 strncpy(j->cid.month, pOut, 2);
5044 pOut += 2;
5045 strncpy(j->cid.day, pOut, 2);
5046 pOut += 2;
5047 strncpy(j->cid.hour, pOut, 2);
5048 pOut += 2;
5049 strncpy(j->cid.min, pOut, 2);
5050 pOut += 3;
5051 j->cid.numlen = *pOut;
5052 pOut += 1;
5053 strncpy(j->cid.number, pOut, j->cid.numlen);
5054 pOut += j->cid.numlen + 1;
5055 j->cid.namelen = *pOut;
5056 pOut += 1;
5057 strncpy(j->cid.name, pOut, j->cid.namelen);
5058
5059 ixj_daa_cid_reset(j);
5060 return 1;
5061}
5062
5063static char daa_get_version(IXJ *j)
5064{
5065 BYTES bytes;
5066
5067 if (!SCI_Prepare(j))
5068 return 0;
5069
5070 bytes.high = 0x35;
5071 bytes.low = 0x00;
5072 outb_p(bytes.high, j->XILINXbase + 0x03);
5073 outb_p(bytes.low, j->XILINXbase + 0x02);
5074
5075 if (!SCI_Control(j, SCI_Enable_DAA))
5076 return 0;
5077
5078 bytes.high = inb_p(j->XILINXbase + 0x03);
5079 bytes.low = inb_p(j->XILINXbase + 0x02);
5080 if (bytes.low != ALISDAA_ID_BYTE) {
5081 if (ixjdebug & 0x0001)
5082 printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
5083 return 0;
5084 }
5085 if (!SCI_Control(j, SCI_Enable_DAA))
5086 return 0;
5087
5088 if (!SCI_Control(j, SCI_End))
5089 return 0;
5090
5091 bytes.high = inb_p(j->XILINXbase + 0x03);
5092 bytes.low = inb_p(j->XILINXbase + 0x02);
5093 if (ixjdebug & 0x0002)
5094 printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
5095 j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
5096 return bytes.high;
5097}
5098
5099static int daa_set_mode(IXJ *j, int mode)
5100{
5101 /* NOTE:
5102 The DAA *MUST* be in the conversation mode if the
5103 PSTN line is to be seized (PSTN line off-hook).
5104 Taking the PSTN line off-hook while the DAA is in
5105 a mode other than conversation mode will cause a
5106 hardware failure of the ALIS-A part.
5107
5108 NOTE:
5109 The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
5110 if the PSTN line is on-hook. Failure to have the PSTN line
5111 in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
5112 ALIS-A part.
5113 */
5114
5115 BYTES bytes;
5116
5117 j->flags.pstn_rmr = 0;
5118
5119 if (!SCI_Prepare(j))
5120 return 0;
5121
5122 switch (mode) {
5123 case SOP_PU_RESET:
5124 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5125
5126 outb_p(j->pld_scrw.byte, j->XILINXbase);
5127 j->pld_slicw.bits.rly2 = 0;
5128 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5129 bytes.high = 0x10;
5130 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5131 daa_load(&bytes, j);
5132 if (!SCI_Prepare(j))
5133 return 0;
5134
5135 j->daa_mode = SOP_PU_SLEEP;
5136 break;
5137 case SOP_PU_SLEEP:
5138 if(j->daa_mode == SOP_PU_SLEEP)
5139 {
5140 break;
5141 }
5142 if (ixjdebug & 0x0008)
5143 printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
5144/* if(j->daa_mode == SOP_PU_CONVERSATION) */
5145 {
5146 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5147
5148 outb_p(j->pld_scrw.byte, j->XILINXbase);
5149 j->pld_slicw.bits.rly2 = 0;
5150 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5151 bytes.high = 0x10;
5152 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5153 daa_load(&bytes, j);
5154 if (!SCI_Prepare(j))
5155 return 0;
5156 }
5157 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5158
5159 outb_p(j->pld_scrw.byte, j->XILINXbase);
5160 j->pld_slicw.bits.rly2 = 0;
5161 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5162 bytes.high = 0x10;
5163 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5164 daa_load(&bytes, j);
5165 if (!SCI_Prepare(j))
5166 return 0;
5167
5168 j->daa_mode = SOP_PU_SLEEP;
5169 j->flags.pstn_ringing = 0;
5170 j->ex.bits.pstn_ring = 0;
5171 j->pstn_sleeptil = jiffies + (hertz / 4);
5172 wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
5173 wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
5174 wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
5175 break;
5176 case SOP_PU_RINGING:
5177 if (ixjdebug & 0x0008)
5178 printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
5179 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5180
5181 outb_p(j->pld_scrw.byte, j->XILINXbase);
5182 j->pld_slicw.bits.rly2 = 0;
5183 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5184 bytes.high = 0x50;
5185 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5186 daa_load(&bytes, j);
5187 if (!SCI_Prepare(j))
5188 return 0;
5189 j->daa_mode = SOP_PU_RINGING;
5190 break;
5191 case SOP_PU_CONVERSATION:
5192 if (ixjdebug & 0x0008)
5193 printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
5194 bytes.high = 0x90;
5195 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5196 daa_load(&bytes, j);
5197 if (!SCI_Prepare(j))
5198 return 0;
5199 j->pld_slicw.bits.rly2 = 1;
5200 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5201 j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */
5202
5203 outb_p(j->pld_scrw.byte, j->XILINXbase);
5204 j->daa_mode = SOP_PU_CONVERSATION;
5205 j->flags.pstn_ringing = 0;
5206 j->ex.bits.pstn_ring = 0;
5207 j->pstn_sleeptil = jiffies;
5208 j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
5209 break;
5210 case SOP_PU_PULSEDIALING:
5211 if (ixjdebug & 0x0008)
5212 printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
5213 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
5214
5215 outb_p(j->pld_scrw.byte, j->XILINXbase);
5216 j->pld_slicw.bits.rly2 = 0;
5217 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
5218 bytes.high = 0xD0;
5219 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5220 daa_load(&bytes, j);
5221 if (!SCI_Prepare(j))
5222 return 0;
5223 j->daa_mode = SOP_PU_PULSEDIALING;
5224 break;
5225 default:
5226 break;
5227 }
5228 return 1;
5229}
5230
5231static int ixj_daa_write(IXJ *j)
5232{
5233 BYTES bytes;
5234
5235 j->flags.pstncheck = 1;
5236
5237 daa_set_mode(j, SOP_PU_SLEEP);
5238
5239 if (!SCI_Prepare(j))
5240 return 0;
5241
5242 outb_p(j->pld_scrw.byte, j->XILINXbase);
5243
5244 bytes.high = 0x14;
5245 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
5246 if (!daa_load(&bytes, j))
5247 return 0;
5248
5249 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
5250 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
5251 if (!daa_load(&bytes, j))
5252 return 0;
5253
5254 bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
5255 bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
5256 if (!daa_load(&bytes, j))
5257 return 0;
5258
5259 if (!SCI_Prepare(j))
5260 return 0;
5261
5262 bytes.high = 0x1F;
5263 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
5264 if (!daa_load(&bytes, j))
5265 return 0;
5266
5267 bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
5268 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
5269 if (!daa_load(&bytes, j))
5270 return 0;
5271
5272 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
5273 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
5274 if (!daa_load(&bytes, j))
5275 return 0;
5276
5277 bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
5278 bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
5279 if (!daa_load(&bytes, j))
5280 return 0;
5281
5282 bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
5283 bytes.low = 0x00;
5284 if (!daa_load(&bytes, j))
5285 return 0;
5286
5287 if (!SCI_Prepare(j))
5288 return 0;
5289
5290 bytes.high = 0x00;
5291 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
5292 if (!daa_load(&bytes, j))
5293 return 0;
5294
5295 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
5296 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
5297 if (!daa_load(&bytes, j))
5298 return 0;
5299
5300 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
5301 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
5302 if (!daa_load(&bytes, j))
5303 return 0;
5304
5305 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
5306 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
5307 if (!daa_load(&bytes, j))
5308 return 0;
5309
5310 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
5311 bytes.low = 0x00;
5312 if (!daa_load(&bytes, j))
5313 return 0;
5314
5315 if (!SCI_Control(j, SCI_End))
5316 return 0;
5317 if (!SCI_WaitLowSCI(j))
5318 return 0;
5319
5320 bytes.high = 0x01;
5321 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
5322 if (!daa_load(&bytes, j))
5323 return 0;
5324
5325 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
5326 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
5327 if (!daa_load(&bytes, j))
5328 return 0;
5329
5330 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
5331 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
5332 if (!daa_load(&bytes, j))
5333 return 0;
5334
5335 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
5336 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
5337 if (!daa_load(&bytes, j))
5338 return 0;
5339
5340 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
5341 bytes.low = 0x00;
5342 if (!daa_load(&bytes, j))
5343 return 0;
5344
5345 if (!SCI_Control(j, SCI_End))
5346 return 0;
5347 if (!SCI_WaitLowSCI(j))
5348 return 0;
5349
5350 bytes.high = 0x02;
5351 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
5352 if (!daa_load(&bytes, j))
5353 return 0;
5354
5355 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
5356 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
5357 if (!daa_load(&bytes, j))
5358 return 0;
5359
5360 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
5361 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
5362 if (!daa_load(&bytes, j))
5363 return 0;
5364
5365 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
5366 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
5367 if (!daa_load(&bytes, j))
5368 return 0;
5369
5370 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
5371 bytes.low = 0x00;
5372 if (!daa_load(&bytes, j))
5373 return 0;
5374
5375 if (!SCI_Control(j, SCI_End))
5376 return 0;
5377 if (!SCI_WaitLowSCI(j))
5378 return 0;
5379
5380 bytes.high = 0x03;
5381 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
5382 if (!daa_load(&bytes, j))
5383 return 0;
5384
5385 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
5386 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
5387 if (!daa_load(&bytes, j))
5388 return 0;
5389
5390 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
5391 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
5392 if (!daa_load(&bytes, j))
5393 return 0;
5394
5395 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
5396 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
5397 if (!daa_load(&bytes, j))
5398 return 0;
5399
5400 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
5401 bytes.low = 0x00;
5402 if (!daa_load(&bytes, j))
5403 return 0;
5404
5405 if (!SCI_Control(j, SCI_End))
5406 return 0;
5407 if (!SCI_WaitLowSCI(j))
5408 return 0;
5409
5410 bytes.high = 0x04;
5411 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
5412 if (!daa_load(&bytes, j))
5413 return 0;
5414
5415 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
5416 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
5417 if (!daa_load(&bytes, j))
5418 return 0;
5419
5420 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
5421 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
5422 if (!daa_load(&bytes, j))
5423 return 0;
5424
5425 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
5426 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
5427 if (!daa_load(&bytes, j))
5428 return 0;
5429
5430 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
5431 bytes.low = 0x00;
5432 if (!daa_load(&bytes, j))
5433 return 0;
5434
5435 if (!SCI_Control(j, SCI_End))
5436 return 0;
5437 if (!SCI_WaitLowSCI(j))
5438 return 0;
5439
5440 bytes.high = 0x05;
5441 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
5442 if (!daa_load(&bytes, j))
5443 return 0;
5444
5445 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
5446 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
5447 if (!daa_load(&bytes, j))
5448 return 0;
5449
5450 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
5451 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
5452 if (!daa_load(&bytes, j))
5453 return 0;
5454
5455 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
5456 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
5457 if (!daa_load(&bytes, j))
5458 return 0;
5459
5460 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
5461 bytes.low = 0x00;
5462 if (!daa_load(&bytes, j))
5463 return 0;
5464
5465 if (!SCI_Control(j, SCI_End))
5466 return 0;
5467 if (!SCI_WaitLowSCI(j))
5468 return 0;
5469
5470 bytes.high = 0x06;
5471 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
5472 if (!daa_load(&bytes, j))
5473 return 0;
5474
5475 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
5476 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
5477 if (!daa_load(&bytes, j))
5478 return 0;
5479
5480 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
5481 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
5482 if (!daa_load(&bytes, j))
5483 return 0;
5484
5485 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
5486 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
5487 if (!daa_load(&bytes, j))
5488 return 0;
5489
5490 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
5491 bytes.low = 0x00;
5492 if (!daa_load(&bytes, j))
5493 return 0;
5494
5495 if (!SCI_Control(j, SCI_End))
5496 return 0;
5497 if (!SCI_WaitLowSCI(j))
5498 return 0;
5499
5500 bytes.high = 0x07;
5501 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
5502 if (!daa_load(&bytes, j))
5503 return 0;
5504
5505 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
5506 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
5507 if (!daa_load(&bytes, j))
5508 return 0;
5509
5510 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
5511 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
5512 if (!daa_load(&bytes, j))
5513 return 0;
5514
5515 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
5516 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
5517 if (!daa_load(&bytes, j))
5518 return 0;
5519
5520 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
5521 bytes.low = 0x00;
5522 if (!daa_load(&bytes, j))
5523 return 0;
5524
5525 if (!SCI_Control(j, SCI_End))
5526 return 0;
5527 if (!SCI_WaitLowSCI(j))
5528 return 0;
5529
5530 bytes.high = 0x08;
5531 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
5532 if (!daa_load(&bytes, j))
5533 return 0;
5534
5535 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
5536 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
5537 if (!daa_load(&bytes, j))
5538 return 0;
5539
5540 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
5541 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
5542 if (!daa_load(&bytes, j))
5543 return 0;
5544
5545 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
5546 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
5547 if (!daa_load(&bytes, j))
5548 return 0;
5549
5550 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
5551 bytes.low = 0x00;
5552 if (!daa_load(&bytes, j))
5553 return 0;
5554
5555 if (!SCI_Control(j, SCI_End))
5556 return 0;
5557 if (!SCI_WaitLowSCI(j))
5558 return 0;
5559
5560 bytes.high = 0x09;
5561 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
5562 if (!daa_load(&bytes, j))
5563 return 0;
5564
5565 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
5566 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
5567 if (!daa_load(&bytes, j))
5568 return 0;
5569
5570 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
5571 bytes.low = 0x00;
5572 if (!daa_load(&bytes, j))
5573 return 0;
5574
5575 if (!SCI_Control(j, SCI_End))
5576 return 0;
5577 if (!SCI_WaitLowSCI(j))
5578 return 0;
5579
5580 bytes.high = 0x0A;
5581 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
5582 if (!daa_load(&bytes, j))
5583 return 0;
5584
5585 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
5586 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
5587 if (!daa_load(&bytes, j))
5588 return 0;
5589
5590 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
5591 bytes.low = 0x00;
5592 if (!daa_load(&bytes, j))
5593 return 0;
5594
5595 if (!SCI_Control(j, SCI_End))
5596 return 0;
5597 if (!SCI_WaitLowSCI(j))
5598 return 0;
5599
5600 bytes.high = 0x0B;
5601 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
5602 if (!daa_load(&bytes, j))
5603 return 0;
5604
5605 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
5606 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
5607 if (!daa_load(&bytes, j))
5608 return 0;
5609
5610 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
5611 bytes.low = 0x00;
5612 if (!daa_load(&bytes, j))
5613 return 0;
5614
5615 if (!SCI_Control(j, SCI_End))
5616 return 0;
5617 if (!SCI_WaitLowSCI(j))
5618 return 0;
5619
5620 bytes.high = 0x0C;
5621 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
5622 if (!daa_load(&bytes, j))
5623 return 0;
5624
5625 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
5626 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
5627 if (!daa_load(&bytes, j))
5628 return 0;
5629
5630 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
5631 bytes.low = 0x00;
5632 if (!daa_load(&bytes, j))
5633 return 0;
5634
5635 if (!SCI_Control(j, SCI_End))
5636 return 0;
5637 if (!SCI_WaitLowSCI(j))
5638 return 0;
5639
5640 bytes.high = 0x0D;
5641 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
5642 if (!daa_load(&bytes, j))
5643 return 0;
5644
5645 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
5646 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
5647 if (!daa_load(&bytes, j))
5648 return 0;
5649
5650 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
5651 bytes.low = 0x00;
5652 if (!daa_load(&bytes, j))
5653 return 0;
5654
5655 if (!SCI_Control(j, SCI_End))
5656 return 0;
5657 if (!SCI_WaitLowSCI(j))
5658 return 0;
5659
5660 bytes.high = 0x0E;
5661 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
5662 if (!daa_load(&bytes, j))
5663 return 0;
5664
5665 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
5666 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
5667 if (!daa_load(&bytes, j))
5668 return 0;
5669
5670 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
5671 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
5672 if (!daa_load(&bytes, j))
5673 return 0;
5674
5675 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
5676 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
5677 if (!daa_load(&bytes, j))
5678 return 0;
5679
5680 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
5681 bytes.low = 0x00;
5682 if (!daa_load(&bytes, j))
5683 return 0;
5684
5685 if (!SCI_Control(j, SCI_End))
5686 return 0;
5687 if (!SCI_WaitLowSCI(j))
5688 return 0;
5689
5690 bytes.high = 0x0F;
5691 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
5692 if (!daa_load(&bytes, j))
5693 return 0;
5694
5695 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
5696 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
5697 if (!daa_load(&bytes, j))
5698 return 0;
5699
5700 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
5701 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
5702 if (!daa_load(&bytes, j))
5703 return 0;
5704
5705 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
5706 bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
5707 if (!daa_load(&bytes, j))
5708 return 0;
5709
5710 bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
5711 bytes.low = 0x00;
5712 if (!daa_load(&bytes, j))
5713 return 0;
5714
5715 udelay(32);
5716 j->pld_scrr.byte = inb_p(j->XILINXbase);
5717 if (!SCI_Control(j, SCI_End))
5718 return 0;
5719
5720 outb_p(j->pld_scrw.byte, j->XILINXbase);
5721
5722 if (ixjdebug & 0x0002)
5723 printk("DAA Coefficients Loaded\n");
5724
5725 j->flags.pstncheck = 0;
5726 return 1;
5727}
5728
bc940c40 5729static int ixj_set_tone_off(unsigned short arg, IXJ *j)
1da177e4
LT
5730{
5731 j->tone_off_time = arg;
5732 if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */
5733
5734 return -1;
5735 if (ixj_WriteDSPCommand(arg, j))
5736 return -1;
5737 return 0;
5738}
5739
5740static int ixj_get_tone_on(IXJ *j)
5741{
5742 if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */
5743
5744 return -1;
5745 return 0;
5746}
5747
5748static int ixj_get_tone_off(IXJ *j)
5749{
5750 if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */
5751
5752 return -1;
5753 return 0;
5754}
5755
5756static void ixj_busytone(IXJ *j)
5757{
5758 j->flags.ringback = 0;
5759 j->flags.dialtone = 0;
5760 j->flags.busytone = 1;
5761 ixj_set_tone_on(0x07D0, j);
5762 ixj_set_tone_off(0x07D0, j);
5763 ixj_play_tone(j, 27);
5764}
5765
5766static void ixj_dialtone(IXJ *j)
5767{
5768 j->flags.ringback = 0;
5769 j->flags.dialtone = 1;
5770 j->flags.busytone = 0;
5771 if (j->dsp.low == 0x20) {
5772 return;
5773 } else {
5774 ixj_set_tone_on(0xFFFF, j);
5775 ixj_set_tone_off(0x0000, j);
5776 ixj_play_tone(j, 25);
5777 }
5778}
5779
5780static void ixj_cpt_stop(IXJ *j)
5781{
5782 if(j->tone_state || j->tone_cadence_state)
5783 {
5784 j->flags.dialtone = 0;
5785 j->flags.busytone = 0;
5786 j->flags.ringback = 0;
5787 ixj_set_tone_on(0x0001, j);
5788 ixj_set_tone_off(0x0000, j);
5789 ixj_play_tone(j, 0);
5790 j->tone_state = j->tone_cadence_state = 0;
5791 if (j->cadence_t) {
0159f76d 5792 kfree(j->cadence_t->ce);
1da177e4
LT
5793 kfree(j->cadence_t);
5794 j->cadence_t = NULL;
5795 }
5796 }
5797 if (j->play_mode == -1 && j->rec_mode == -1)
5798 idle(j);
5799 if (j->play_mode != -1 && j->dsp.low == 0x20)
5800 ixj_play_start(j);
5801 if (j->rec_mode != -1 && j->dsp.low == 0x20)
5802 ixj_record_start(j);
5803}
5804
5805static void ixj_ringback(IXJ *j)
5806{
5807 j->flags.busytone = 0;
5808 j->flags.dialtone = 0;
5809 j->flags.ringback = 1;
5810 ixj_set_tone_on(0x0FA0, j);
5811 ixj_set_tone_off(0x2EE0, j);
5812 ixj_play_tone(j, 26);
5813}
5814
5815static void ixj_testram(IXJ *j)
5816{
5817 ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
5818}
5819
5820static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
5821{
5822 ixj_cadence *lcp;
5823 IXJ_CADENCE_ELEMENT __user *cep;
5824 IXJ_CADENCE_ELEMENT *lcep;
5825 IXJ_TONE ti;
5826 int err;
5827
5828 lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
5829 if (lcp == NULL)
5830 return -ENOMEM;
5831
5832 err = -EFAULT;
5833 if (copy_from_user(&lcp->elements_used,
5834 &cp->elements_used, sizeof(int)))
5835 goto out;
5836 if (copy_from_user(&lcp->termination,
5837 &cp->termination, sizeof(IXJ_CADENCE_TERM)))
5838 goto out;
5839 if (get_user(cep, &cp->ce))
5840 goto out;
5841
5842 err = -EINVAL;
5843 if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
5844 goto out;
5845
5846 err = -ENOMEM;
5847 lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
5848 if (!lcep)
5849 goto out;
5850
5851 err = -EFAULT;
5852 if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
5853 goto out1;
5854
5855 if (j->cadence_t) {
5856 kfree(j->cadence_t->ce);
5857 kfree(j->cadence_t);
5858 }
5859 lcp->ce = (void *) lcep;
5860 j->cadence_t = lcp;
5861 j->tone_cadence_state = 0;
5862 ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
5863 ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
5864 if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
5865 ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
5866 ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
5867 ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
5868 ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
5869 ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
5870 ixj_init_tone(j, &ti);
5871 }
5872 ixj_play_tone(j, lcp->ce[0].index);
5873 return 1;
5874out1:
5875 kfree(lcep);
5876out:
5877 kfree(lcp);
5878 return err;
5879}
5880
5881static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
5882{
5883 IXJ_FILTER_CADENCE *lcp;
5884 lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
5885 if (lcp == NULL) {
5886 if(ixjdebug & 0x0001) {
5887 printk(KERN_INFO "Could not allocate memory for cadence\n");
5888 }
5889 return -ENOMEM;
5890 }
5891 if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) {
5892 if(ixjdebug & 0x0001) {
5893 printk(KERN_INFO "Could not copy cadence to kernel\n");
5894 }
5895 kfree(lcp);
5896 return -EFAULT;
5897 }
5898 if (lcp->filter > 5) {
5899 if(ixjdebug & 0x0001) {
5900 printk(KERN_INFO "Cadence out of range\n");
5901 }
5902 kfree(lcp);
5903 return -1;
5904 }
5905 j->cadence_f[lcp->filter].state = 0;
5906 j->cadence_f[lcp->filter].enable = lcp->enable;
5907 j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
5908 j->cadence_f[lcp->filter].on1 = lcp->on1;
5909 j->cadence_f[lcp->filter].on1min = 0;
5910 j->cadence_f[lcp->filter].on1max = 0;
5911 j->cadence_f[lcp->filter].off1 = lcp->off1;
5912 j->cadence_f[lcp->filter].off1min = 0;
5913 j->cadence_f[lcp->filter].off1max = 0;
5914 j->cadence_f[lcp->filter].on2 = lcp->on2;
5915 j->cadence_f[lcp->filter].on2min = 0;
5916 j->cadence_f[lcp->filter].on2max = 0;
5917 j->cadence_f[lcp->filter].off2 = lcp->off2;
5918 j->cadence_f[lcp->filter].off2min = 0;
5919 j->cadence_f[lcp->filter].off2max = 0;
5920 j->cadence_f[lcp->filter].on3 = lcp->on3;
5921 j->cadence_f[lcp->filter].on3min = 0;
5922 j->cadence_f[lcp->filter].on3max = 0;
5923 j->cadence_f[lcp->filter].off3 = lcp->off3;
5924 j->cadence_f[lcp->filter].off3min = 0;
5925 j->cadence_f[lcp->filter].off3max = 0;
5926 if(ixjdebug & 0x0002) {
5927 printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
5928 }
5929 kfree(lcp);
5930 return 0;
5931}
5932
5933static void add_caps(IXJ *j)
5934{
5935 j->caps = 0;
5936 j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
5937 strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
5938 j->caplist[j->caps].captype = vendor;
5939 j->caplist[j->caps].handle = j->caps++;
5940 j->caplist[j->caps].captype = device;
5941 switch (j->cardtype) {
5942 case QTI_PHONEJACK:
5943 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
5944 break;
5945 case QTI_LINEJACK:
5946 strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
5947 break;
5948 case QTI_PHONEJACK_LITE:
5949 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
5950 break;
5951 case QTI_PHONEJACK_PCI:
5952 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
5953 break;
5954 case QTI_PHONECARD:
5955 strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
5956 break;
5957 }
5958 j->caplist[j->caps].cap = j->cardtype;
5959 j->caplist[j->caps].handle = j->caps++;
5960 strcpy(j->caplist[j->caps].desc, "POTS");
5961 j->caplist[j->caps].captype = port;
5962 j->caplist[j->caps].cap = pots;
5963 j->caplist[j->caps].handle = j->caps++;
5964
5965 /* add devices that can do speaker/mic */
5966 switch (j->cardtype) {
5967 case QTI_PHONEJACK:
5968 case QTI_LINEJACK:
5969 case QTI_PHONEJACK_PCI:
5970 case QTI_PHONECARD:
5971 strcpy(j->caplist[j->caps].desc, "SPEAKER");
5972 j->caplist[j->caps].captype = port;
5973 j->caplist[j->caps].cap = speaker;
5974 j->caplist[j->caps].handle = j->caps++;
5975 default:
5976 break;
5977 }
5978
5979 /* add devices that can do handset */
5980 switch (j->cardtype) {
5981 case QTI_PHONEJACK:
5982 strcpy(j->caplist[j->caps].desc, "HANDSET");
5983 j->caplist[j->caps].captype = port;
5984 j->caplist[j->caps].cap = handset;
5985 j->caplist[j->caps].handle = j->caps++;
5986 break;
5987 default:
5988 break;
5989 }
5990
5991 /* add devices that can do PSTN */
5992 switch (j->cardtype) {
5993 case QTI_LINEJACK:
5994 strcpy(j->caplist[j->caps].desc, "PSTN");
5995 j->caplist[j->caps].captype = port;
5996 j->caplist[j->caps].cap = pstn;
5997 j->caplist[j->caps].handle = j->caps++;
5998 break;
5999 default:
6000 break;
6001 }
6002
6003 /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
6004 strcpy(j->caplist[j->caps].desc, "ULAW");
6005 j->caplist[j->caps].captype = codec;
6006 j->caplist[j->caps].cap = ULAW;
6007 j->caplist[j->caps].handle = j->caps++;
6008
6009 strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
6010 j->caplist[j->caps].captype = codec;
6011 j->caplist[j->caps].cap = LINEAR16;
6012 j->caplist[j->caps].handle = j->caps++;
6013
6014 strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
6015 j->caplist[j->caps].captype = codec;
6016 j->caplist[j->caps].cap = LINEAR8;
6017 j->caplist[j->caps].handle = j->caps++;
6018
6019 strcpy(j->caplist[j->caps].desc, "Windows Sound System");
6020 j->caplist[j->caps].captype = codec;
6021 j->caplist[j->caps].cap = WSS;
6022 j->caplist[j->caps].handle = j->caps++;
6023
6024 /* software ALAW codec, made from ULAW */
6025 strcpy(j->caplist[j->caps].desc, "ALAW");
6026 j->caplist[j->caps].captype = codec;
6027 j->caplist[j->caps].cap = ALAW;
6028 j->caplist[j->caps].handle = j->caps++;
6029
6030 /* version 12 of the 8020 does the following codecs in a broken way */
6031 if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
6032 strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
6033 j->caplist[j->caps].captype = codec;
6034 j->caplist[j->caps].cap = G723_63;
6035 j->caplist[j->caps].handle = j->caps++;
6036
6037 strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
6038 j->caplist[j->caps].captype = codec;
6039 j->caplist[j->caps].cap = G723_53;
6040 j->caplist[j->caps].handle = j->caps++;
6041
6042 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
6043 j->caplist[j->caps].captype = codec;
6044 j->caplist[j->caps].cap = TS48;
6045 j->caplist[j->caps].handle = j->caps++;
6046
6047 strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
6048 j->caplist[j->caps].captype = codec;
6049 j->caplist[j->caps].cap = TS41;
6050 j->caplist[j->caps].handle = j->caps++;
6051 }
6052
6053 /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
6054 if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
6055 strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
6056 j->caplist[j->caps].captype = codec;
6057 j->caplist[j->caps].cap = TS85;
6058 j->caplist[j->caps].handle = j->caps++;
6059 }
6060
6061 /* 8021 chips can do G728 */
6062 if (j->dsp.low == 0x21) {
6063 strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
6064 j->caplist[j->caps].captype = codec;
6065 j->caplist[j->caps].cap = G728;
6066 j->caplist[j->caps].handle = j->caps++;
6067 }
6068
6069 /* 8021/8022 chips can do G729 if loaded */
6070 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6071 strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
6072 j->caplist[j->caps].captype = codec;
6073 j->caplist[j->caps].cap = G729;
6074 j->caplist[j->caps].handle = j->caps++;
6075 }
6076 if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
6077 strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
6078 j->caplist[j->caps].captype = codec;
6079 j->caplist[j->caps].cap = G729B;
6080 j->caplist[j->caps].handle = j->caps++;
6081 }
6082}
6083
6084static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
6085{
6086 int cnt;
6087 int retval = 0;
6088 for (cnt = 0; cnt < j->caps; cnt++) {
6089 if (pcreq->captype == j->caplist[cnt].captype
6090 && pcreq->cap == j->caplist[cnt].cap) {
6091 retval = 1;
6092 break;
6093 }
6094 }
6095 return retval;
6096}
6097
6098static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
6099{
6100 IXJ_TONE ti;
6101 IXJ_FILTER jf;
6102 IXJ_FILTER_RAW jfr;
6103 void __user *argp = (void __user *)arg;
6104
6105 unsigned int raise, mant;
6106 unsigned int minor = iminor(inode);
6107 int board = NUM(inode);
6108
6109 IXJ *j = get_ixj(NUM(inode));
6110
6111 int retval = 0;
6112
6113 /*
6114 * Set up locks to ensure that only one process is talking to the DSP at a time.
6115 * This is necessary to keep the DSP from locking up.
6116 */
1e63bc73
NA
6117 while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
6118 schedule_timeout_interruptible(1);
1da177e4
LT
6119 if (ixjdebug & 0x0040)
6120 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6121 if (minor >= IXJMAX) {
6122 clear_bit(board, &j->busyflags);
6123 return -ENODEV;
6124 }
6125 /*
6126 * Check ioctls only root can use.
6127 */
6128 if (!capable(CAP_SYS_ADMIN)) {
6129 switch (cmd) {
6130 case IXJCTL_TESTRAM:
6131 case IXJCTL_HZ:
6132 retval = -EPERM;
6133 }
6134 }
6135 switch (cmd) {
6136 case IXJCTL_TESTRAM:
6137 ixj_testram(j);
6138 retval = (j->ssr.high << 8) + j->ssr.low;
6139 break;
6140 case IXJCTL_CARDTYPE:
6141 retval = j->cardtype;
6142 break;
6143 case IXJCTL_SERIAL:
6144 retval = j->serial;
6145 break;
6146 case IXJCTL_VERSION:
fba478b1
DP
6147 {
6148 char arg_str[100];
6149 snprintf(arg_str, sizeof(arg_str),
6150 "\nDriver version %i.%i.%i", IXJ_VER_MAJOR,
6151 IXJ_VER_MINOR, IXJ_BLD_VER);
6152 if (copy_to_user(argp, arg_str, strlen(arg_str)))
6153 retval = -EFAULT;
6154 }
1da177e4
LT
6155 break;
6156 case PHONE_RING_CADENCE:
6157 j->ring_cadence = arg;
6158 break;
6159 case IXJCTL_CIDCW:
6160 if(arg) {
6161 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6162 retval = -EFAULT;
6163 break;
6164 }
6165 } else {
6166 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6167 }
6168 ixj_write_cidcw(j);
6169 break;
6170 /* Binary compatbility */
6171 case OLD_PHONE_RING_START:
6172 arg = 0;
6173 /* Fall through */
6174 case PHONE_RING_START:
6175 if(arg) {
6176 if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
6177 retval = -EFAULT;
6178 break;
6179 }
6180 ixj_write_cid(j);
6181 } else {
6182 memset(&j->cid_send, 0, sizeof(PHONE_CID));
6183 }
6184 ixj_ring_start(j);
6185 break;
6186 case PHONE_RING_STOP:
6187 j->flags.cringing = 0;
6188 if(j->cadence_f[5].enable) {
6189 j->cadence_f[5].state = 0;
6190 }
6191 ixj_ring_off(j);
6192 break;
6193 case PHONE_RING:
6194 retval = ixj_ring(j);
6195 break;
6196 case PHONE_EXCEPTION:
6197 retval = j->ex.bytes;
6198 if(j->ex.bits.flash) {
6199 j->flash_end = 0;
6200 j->ex.bits.flash = 0;
6201 }
6202 j->ex.bits.pstn_ring = 0;
6203 j->ex.bits.caller_id = 0;
6204 j->ex.bits.pstn_wink = 0;
6205 j->ex.bits.f0 = 0;
6206 j->ex.bits.f1 = 0;
6207 j->ex.bits.f2 = 0;
6208 j->ex.bits.f3 = 0;
6209 j->ex.bits.fc0 = 0;
6210 j->ex.bits.fc1 = 0;
6211 j->ex.bits.fc2 = 0;
6212 j->ex.bits.fc3 = 0;
6213 j->ex.bits.reserved = 0;
6214 break;
6215 case PHONE_HOOKSTATE:
6216 j->ex.bits.hookstate = 0;
6217 retval = j->hookstate; //j->r_hook;
6218 break;
6219 case IXJCTL_SET_LED:
6220 LED_SetState(arg, j);
6221 break;
6222 case PHONE_FRAME:
6223 retval = set_base_frame(j, arg);
6224 break;
6225 case PHONE_REC_CODEC:
6226 retval = set_rec_codec(j, arg);
6227 break;
6228 case PHONE_VAD:
6229 ixj_vad(j, arg);
6230 break;
6231 case PHONE_REC_START:
6232 ixj_record_start(j);
6233 break;
6234 case PHONE_REC_STOP:
6235 ixj_record_stop(j);
6236 break;
6237 case PHONE_REC_DEPTH:
6238 set_rec_depth(j, arg);
6239 break;
6240 case PHONE_REC_VOLUME:
6241 if(arg == -1) {
6242 retval = get_rec_volume(j);
6243 }
6244 else {
6245 set_rec_volume(j, arg);
6246 retval = arg;
6247 }
6248 break;
6249 case PHONE_REC_VOLUME_LINEAR:
6250 if(arg == -1) {
6251 retval = get_rec_volume_linear(j);
6252 }
6253 else {
6254 set_rec_volume_linear(j, arg);
6255 retval = arg;
6256 }
6257 break;
6258 case IXJCTL_DTMF_PRESCALE:
6259 if(arg == -1) {
6260 retval = get_dtmf_prescale(j);
6261 }
6262 else {
6263 set_dtmf_prescale(j, arg);
6264 retval = arg;
6265 }
6266 break;
6267 case PHONE_REC_LEVEL:
6268 retval = get_rec_level(j);
6269 break;
6270 case IXJCTL_SC_RXG:
6271 retval = ixj_siadc(j, arg);
6272 break;
6273 case IXJCTL_SC_TXG:
6274 retval = ixj_sidac(j, arg);
6275 break;
6276 case IXJCTL_AEC_START:
6277 ixj_aec_start(j, arg);
6278 break;
6279 case IXJCTL_AEC_STOP:
6280 aec_stop(j);
6281 break;
6282 case IXJCTL_AEC_GET_LEVEL:
6283 retval = j->aec_level;
6284 break;
6285 case PHONE_PLAY_CODEC:
6286 retval = set_play_codec(j, arg);
6287 break;
6288 case PHONE_PLAY_START:
6289 retval = ixj_play_start(j);
6290 break;
6291 case PHONE_PLAY_STOP:
6292 ixj_play_stop(j);
6293 break;
6294 case PHONE_PLAY_DEPTH:
6295 set_play_depth(j, arg);
6296 break;
6297 case PHONE_PLAY_VOLUME:
6298 if(arg == -1) {
6299 retval = get_play_volume(j);
6300 }
6301 else {
6302 set_play_volume(j, arg);
6303 retval = arg;
6304 }
6305 break;
6306 case PHONE_PLAY_VOLUME_LINEAR:
6307 if(arg == -1) {
6308 retval = get_play_volume_linear(j);
6309 }
6310 else {
6311 set_play_volume_linear(j, arg);
6312 retval = arg;
6313 }
6314 break;
6315 case PHONE_PLAY_LEVEL:
6316 retval = get_play_level(j);
6317 break;
6318 case IXJCTL_DSP_TYPE:
6319 retval = (j->dsp.high << 8) + j->dsp.low;
6320 break;
6321 case IXJCTL_DSP_VERSION:
6322 retval = (j->ver.high << 8) + j->ver.low;
6323 break;
6324 case IXJCTL_HZ:
6325 hertz = arg;
6326 break;
6327 case IXJCTL_RATE:
6328 if (arg > hertz)
6329 retval = -1;
6330 else
6331 samplerate = arg;
6332 break;
6333 case IXJCTL_DRYBUFFER_READ:
6334 put_user(j->drybuffer, (unsigned long __user *) argp);
6335 break;
6336 case IXJCTL_DRYBUFFER_CLEAR:
6337 j->drybuffer = 0;
6338 break;
6339 case IXJCTL_FRAMES_READ:
6340 put_user(j->framesread, (unsigned long __user *) argp);
6341 break;
6342 case IXJCTL_FRAMES_WRITTEN:
6343 put_user(j->frameswritten, (unsigned long __user *) argp);
6344 break;
6345 case IXJCTL_READ_WAIT:
6346 put_user(j->read_wait, (unsigned long __user *) argp);
6347 break;
6348 case IXJCTL_WRITE_WAIT:
6349 put_user(j->write_wait, (unsigned long __user *) argp);
6350 break;
6351 case PHONE_MAXRINGS:
6352 j->maxrings = arg;
6353 break;
6354 case PHONE_SET_TONE_ON_TIME:
6355 ixj_set_tone_on(arg, j);
6356 break;
6357 case PHONE_SET_TONE_OFF_TIME:
6358 ixj_set_tone_off(arg, j);
6359 break;
6360 case PHONE_GET_TONE_ON_TIME:
6361 if (ixj_get_tone_on(j)) {
6362 retval = -1;
6363 } else {
6364 retval = (j->ssr.high << 8) + j->ssr.low;
6365 }
6366 break;
6367 case PHONE_GET_TONE_OFF_TIME:
6368 if (ixj_get_tone_off(j)) {
6369 retval = -1;
6370 } else {
6371 retval = (j->ssr.high << 8) + j->ssr.low;
6372 }
6373 break;
6374 case PHONE_PLAY_TONE:
6375 if (!j->tone_state)
6376 retval = ixj_play_tone(j, arg);
6377 else
6378 retval = -1;
6379 break;
6380 case PHONE_GET_TONE_STATE:
6381 retval = j->tone_state;
6382 break;
6383 case PHONE_DTMF_READY:
6384 retval = j->ex.bits.dtmf_ready;
6385 break;
6386 case PHONE_GET_DTMF:
6387 if (ixj_hookstate(j)) {
6388 if (j->dtmf_rp != j->dtmf_wp) {
6389 retval = j->dtmfbuffer[j->dtmf_rp];
6390 j->dtmf_rp++;
6391 if (j->dtmf_rp == 79)
6392 j->dtmf_rp = 0;
6393 if (j->dtmf_rp == j->dtmf_wp) {
6394 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6395 }
6396 }
6397 }
6398 break;
6399 case PHONE_GET_DTMF_ASCII:
6400 if (ixj_hookstate(j)) {
6401 if (j->dtmf_rp != j->dtmf_wp) {
6402 switch (j->dtmfbuffer[j->dtmf_rp]) {
6403 case 10:
6404 retval = 42; /* '*'; */
6405
6406 break;
6407 case 11:
6408 retval = 48; /*'0'; */
6409
6410 break;
6411 case 12:
6412 retval = 35; /*'#'; */
6413
6414 break;
6415 case 28:
6416 retval = 65; /*'A'; */
6417
6418 break;
6419 case 29:
6420 retval = 66; /*'B'; */
6421
6422 break;
6423 case 30:
6424 retval = 67; /*'C'; */
6425
6426 break;
6427 case 31:
6428 retval = 68; /*'D'; */
6429
6430 break;
6431 default:
6432 retval = 48 + j->dtmfbuffer[j->dtmf_rp];
6433 break;
6434 }
6435 j->dtmf_rp++;
6436 if (j->dtmf_rp == 79)
6437 j->dtmf_rp = 0;
6438 if(j->dtmf_rp == j->dtmf_wp)
6439 {
6440 j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
6441 }
6442 }
6443 }
6444 break;
6445 case PHONE_DTMF_OOB:
6446 j->flags.dtmf_oob = arg;
6447 break;
6448 case PHONE_DIALTONE:
6449 ixj_dialtone(j);
6450 break;
6451 case PHONE_BUSY:
6452 ixj_busytone(j);
6453 break;
6454 case PHONE_RINGBACK:
6455 ixj_ringback(j);
6456 break;
6457 case PHONE_WINK:
6458 if(j->cardtype == QTI_PHONEJACK)
6459 retval = -1;
6460 else
6461 retval = ixj_wink(j);
6462 break;
6463 case PHONE_CPT_STOP:
6464 ixj_cpt_stop(j);
6465 break;
6466 case PHONE_QUERY_CODEC:
6467 {
6468 struct phone_codec_data pd;
6469 int val;
6470 int proto_size[] = {
6471 -1,
6472 12, 10, 16, 9, 8, 48, 5,
6473 40, 40, 80, 40, 40, 6
6474 };
6475 if(copy_from_user(&pd, argp, sizeof(pd))) {
6476 retval = -EFAULT;
6477 break;
6478 }
6479 if(pd.type<1 || pd.type>13) {
6480 retval = -EPROTONOSUPPORT;
6481 break;
6482 }
6483 if(pd.type<G729)
6484 val=proto_size[pd.type];
6485 else switch(j->baseframe.low)
6486 {
6487 case 0xA0:val=2*proto_size[pd.type];break;
6488 case 0x50:val=proto_size[pd.type];break;
6489 default:val=proto_size[pd.type]*3;break;
6490 }
6491 pd.buf_min=pd.buf_max=pd.buf_opt=val;
6492 if(copy_to_user(argp, &pd, sizeof(pd)))
6493 retval = -EFAULT;
6494 break;
6495 }
6496 case IXJCTL_DSP_IDLE:
6497 idle(j);
6498 break;
6499 case IXJCTL_MIXER:
6500 if ((arg & 0xff) == 0xff)
6501 retval = ixj_get_mixer(arg, j);
6502 else
6503 ixj_mixer(arg, j);
6504 break;
6505 case IXJCTL_DAA_COEFF_SET:
6506 switch (arg) {
6507 case DAA_US:
6508 DAA_Coeff_US(j);
6509 retval = ixj_daa_write(j);
6510 break;
6511 case DAA_UK:
6512 DAA_Coeff_UK(j);
6513 retval = ixj_daa_write(j);
6514 break;
6515 case DAA_FRANCE:
6516 DAA_Coeff_France(j);
6517 retval = ixj_daa_write(j);
6518 break;
6519 case DAA_GERMANY:
6520 DAA_Coeff_Germany(j);
6521 retval = ixj_daa_write(j);
6522 break;
6523 case DAA_AUSTRALIA:
6524 DAA_Coeff_Australia(j);
6525 retval = ixj_daa_write(j);
6526 break;
6527 case DAA_JAPAN:
6528 DAA_Coeff_Japan(j);
6529 retval = ixj_daa_write(j);
6530 break;
6531 default:
6532 retval = 1;
6533 break;
6534 }
6535 break;
6536 case IXJCTL_DAA_AGAIN:
6537 ixj_daa_cr4(j, arg | 0x02);
6538 break;
6539 case IXJCTL_PSTN_LINETEST:
6540 retval = ixj_linetest(j);
6541 break;
6542 case IXJCTL_VMWI:
6543 ixj_write_vmwi(j, arg);
6544 break;
6545 case IXJCTL_CID:
6546 if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID)))
6547 retval = -EFAULT;
6548 j->ex.bits.caller_id = 0;
6549 break;
6550 case IXJCTL_WINK_DURATION:
6551 j->winktime = arg;
6552 break;
6553 case IXJCTL_PORT:
6554 if (arg)
6555 retval = ixj_set_port(j, arg);
6556 else
6557 retval = j->port;
6558 break;
6559 case IXJCTL_POTS_PSTN:
6560 retval = ixj_set_pots(j, arg);
6561 break;
6562 case PHONE_CAPABILITIES:
6563 add_caps(j);
6564 retval = j->caps;
6565 break;
6566 case PHONE_CAPABILITIES_LIST:
6567 add_caps(j);
6568 if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps))
6569 retval = -EFAULT;
6570 break;
6571 case PHONE_CAPABILITIES_CHECK:
6572 {
6573 struct phone_capability cap;
6574 if (copy_from_user(&cap, argp, sizeof(cap)))
6575 retval = -EFAULT;
6576 else {
6577 add_caps(j);
6578 retval = capabilities_check(j, &cap);
6579 }
6580 }
6581 break;
6582 case PHONE_PSTN_SET_STATE:
6583 daa_set_mode(j, arg);
6584 break;
6585 case PHONE_PSTN_GET_STATE:
6586 retval = j->daa_mode;
6587 j->ex.bits.pstn_ring = 0;
6588 break;
6589 case IXJCTL_SET_FILTER:
6590 if (copy_from_user(&jf, argp, sizeof(jf)))
6591 retval = -EFAULT;
6592 retval = ixj_init_filter(j, &jf);
6593 break;
6594 case IXJCTL_SET_FILTER_RAW:
6595 if (copy_from_user(&jfr, argp, sizeof(jfr)))
6596 retval = -EFAULT;
6597 else
6598 retval = ixj_init_filter_raw(j, &jfr);
6599 break;
6600 case IXJCTL_GET_FILTER_HIST:
6601 if(arg<0||arg>3)
6602 retval = -EINVAL;
6603 else
6604 retval = j->filter_hist[arg];
6605 break;
6606 case IXJCTL_INIT_TONE:
6607 if (copy_from_user(&ti, argp, sizeof(ti)))
6608 retval = -EFAULT;
6609 else
6610 retval = ixj_init_tone(j, &ti);
6611 break;
6612 case IXJCTL_TONE_CADENCE:
6613 retval = ixj_build_cadence(j, argp);
6614 break;
6615 case IXJCTL_FILTER_CADENCE:
6616 retval = ixj_build_filter_cadence(j, argp);
6617 break;
6618 case IXJCTL_SIGCTL:
6619 if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
6620 retval = -EFAULT;
6621 break;
6622 }
6623 j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
6624 if(j->sigdef.event < 33) {
6625 raise = 1;
6626 for(mant = 0; mant < j->sigdef.event; mant++){
6627 raise *= 2;
6628 }
6629 if(j->sigdef.signal)
6630 j->ex_sig.bytes |= raise;
6631 else
6632 j->ex_sig.bytes &= (raise^0xffff);
6633 }
6634 break;
6635 case IXJCTL_INTERCOM_STOP:
6636 if(arg < 0 || arg >= IXJMAX)
6637 return -EINVAL;
6638 j->intercom = -1;
6639 ixj_record_stop(j);
6640 ixj_play_stop(j);
6641 idle(j);
6642 get_ixj(arg)->intercom = -1;
6643 ixj_record_stop(get_ixj(arg));
6644 ixj_play_stop(get_ixj(arg));
6645 idle(get_ixj(arg));
6646 break;
6647 case IXJCTL_INTERCOM_START:
6648 if(arg < 0 || arg >= IXJMAX)
6649 return -EINVAL;
6650 j->intercom = arg;
6651 ixj_record_start(j);
6652 ixj_play_start(j);
6653 get_ixj(arg)->intercom = board;
6654 ixj_play_start(get_ixj(arg));
6655 ixj_record_start(get_ixj(arg));
6656 break;
6657 }
6658 if (ixjdebug & 0x0040)
6659 printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6660 clear_bit(board, &j->busyflags);
6661 return retval;
6662}
6663
6664static int ixj_fasync(int fd, struct file *file_p, int mode)
6665{
d1f22974 6666 IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
1da177e4
LT
6667
6668 return fasync_helper(fd, file_p, mode, &j->async_queue);
6669}
6670
00977a59 6671static const struct file_operations ixj_fops =
1da177e4
LT
6672{
6673 .owner = THIS_MODULE,
6674 .read = ixj_enhanced_read,
6675 .write = ixj_enhanced_write,
6676 .poll = ixj_poll,
6677 .ioctl = ixj_ioctl,
6678 .release = ixj_release,
6679 .fasync = ixj_fasync
6680};
6681
6682static int ixj_linetest(IXJ *j)
6683{
1da177e4
LT
6684 j->flags.pstncheck = 1; /* Testing */
6685 j->flags.pstn_present = 0; /* Assume the line is not there */
6686
6687 daa_int_read(j); /*Clear DAA Interrupt flags */
6688 /* */
6689 /* Hold all relays in the normally de-energized position. */
6690 /* */
6691
6692 j->pld_slicw.bits.rly1 = 0;
6693 j->pld_slicw.bits.rly2 = 0;
6694 j->pld_slicw.bits.rly3 = 0;
6695 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6696 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6697
6698 outb_p(j->pld_scrw.byte, j->XILINXbase);
6699 j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6700 if (j->pld_slicr.bits.potspstn) {
6701 j->flags.pots_pstn = 1;
6702 j->flags.pots_correct = 0;
6703 LED_SetState(0x4, j);
6704 } else {
6705 j->flags.pots_pstn = 0;
6706 j->pld_slicw.bits.rly1 = 0;
6707 j->pld_slicw.bits.rly2 = 0;
6708 j->pld_slicw.bits.rly3 = 1;
6709 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6710 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6711
6712 outb_p(j->pld_scrw.byte, j->XILINXbase);
6713 daa_set_mode(j, SOP_PU_CONVERSATION);
f4c9925c 6714 msleep(1000);
1da177e4
LT
6715 daa_int_read(j);
6716 daa_set_mode(j, SOP_PU_RESET);
6717 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6718 j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */
6719 LED_SetState(0x4, j);
6720 j->pld_slicw.bits.rly3 = 0;
6721 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6722 } else {
6723 j->flags.pots_correct = 1;
6724 LED_SetState(0x8, j);
6725 j->pld_slicw.bits.rly1 = 1;
6726 j->pld_slicw.bits.rly2 = 0;
6727 j->pld_slicw.bits.rly3 = 0;
6728 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6729 }
6730 }
6731 j->pld_slicw.bits.rly3 = 0;
6732 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6733 daa_set_mode(j, SOP_PU_CONVERSATION);
f4c9925c 6734 msleep(1000);
1da177e4
LT
6735 daa_int_read(j);
6736 daa_set_mode(j, SOP_PU_RESET);
6737 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
6738 j->pstn_sleeptil = jiffies + (hertz / 4);
6739 j->flags.pstn_present = 1;
6740 } else {
6741 j->flags.pstn_present = 0;
6742 }
6743 if (j->flags.pstn_present) {
6744 if (j->flags.pots_correct) {
6745 LED_SetState(0xA, j);
6746 } else {
6747 LED_SetState(0x6, j);
6748 }
6749 } else {
6750 if (j->flags.pots_correct) {
6751 LED_SetState(0x9, j);
6752 } else {
6753 LED_SetState(0x5, j);
6754 }
6755 }
6756 j->flags.pstncheck = 0; /* Testing */
6757 return j->flags.pstn_present;
6758}
6759
6760static int ixj_selfprobe(IXJ *j)
6761{
6762 unsigned short cmd;
1da177e4
LT
6763 int cnt;
6764 BYTES bytes;
6765
6766 init_waitqueue_head(&j->poll_q);
6767 init_waitqueue_head(&j->read_q);
6768 init_waitqueue_head(&j->write_q);
6769
6770 while(atomic_read(&j->DSPWrite) > 0)
6771 atomic_dec(&j->DSPWrite);
6772 if (ixjdebug & 0x0002)
6773 printk(KERN_INFO "Write IDLE to Software Control Register\n");
6774 ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
6775
6776 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
6777 return -1;
6778/* The read values of the SSR should be 0x00 for the IDLE command */
6779 if (j->ssr.low || j->ssr.high)
6780 return -1;
6781 if (ixjdebug & 0x0002)
6782 printk(KERN_INFO "Get Device ID Code\n");
6783 if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */
6784 return -1;
6785 j->dsp.low = j->ssr.low;
6786 j->dsp.high = j->ssr.high;
6787 if (ixjdebug & 0x0002)
6788 printk(KERN_INFO "Get Device Version Code\n");
6789 if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */
6790 return -1;
6791 j->ver.low = j->ssr.low;
6792 j->ver.high = j->ssr.high;
6793 if (!j->cardtype) {
6794 if (j->dsp.low == 0x21) {
6795 bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
6796 outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
6797/* Test for Internet LineJACK or Internet PhoneJACK Lite */
6798 bytes.low = inb_p(j->XILINXbase + 0x02);
6799 if (bytes.low == bytes.high) /* Register is read only on */
6800 /* Internet PhoneJack Lite */
6801 {
6802 j->cardtype = QTI_PHONEJACK_LITE;
6803 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6804 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6805 return -1;
6806 }
6807 j->pld_slicw.pcib.e1 = 1;
6808 outb_p(j->pld_slicw.byte, j->XILINXbase);
6809 } else {
6810 j->cardtype = QTI_LINEJACK;
6811
6812 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6813 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6814 return -1;
6815 }
6816 }
6817 } else if (j->dsp.low == 0x22) {
6818 j->cardtype = QTI_PHONEJACK_PCI;
6819 request_region(j->XILINXbase, 4, "ixj control");
6820 j->pld_slicw.pcib.e1 = 1;
6821 outb_p(j->pld_slicw.byte, j->XILINXbase);
6822 } else
6823 j->cardtype = QTI_PHONEJACK;
6824 } else {
6825 switch (j->cardtype) {
6826 case QTI_PHONEJACK:
6827 if (!j->dsp.low != 0x20) {
6828 j->dsp.high = 0x80;
6829 j->dsp.low = 0x20;
6830 ixj_WriteDSPCommand(0x3800, j);
6831 j->ver.low = j->ssr.low;
6832 j->ver.high = j->ssr.high;
6833 }
6834 break;
6835 case QTI_LINEJACK:
6836 if (!request_region(j->XILINXbase, 8, "ixj control")) {
6837 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6838 return -1;
6839 }
6840 break;
6841 case QTI_PHONEJACK_LITE:
6842 case QTI_PHONEJACK_PCI:
6843 if (!request_region(j->XILINXbase, 4, "ixj control")) {
6844 printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
6845 return -1;
6846 }
6847 j->pld_slicw.pcib.e1 = 1;
6848 outb_p(j->pld_slicw.byte, j->XILINXbase);
6849 break;
6850 case QTI_PHONECARD:
6851 break;
6852 }
6853 }
6854 if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
6855 if (ixjdebug & 0x0002)
6856 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6857 if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */
6858 return -1;
6859 if (ixjdebug & 0x0002)
6860 printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
6861 if (j->cardtype == QTI_PHONEJACK) {
6862 cmd = 0x9FF2;
6863 } else {
6864 cmd = 0x9FF5;
6865 }
6866 if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */
6867 return -1;
6868 } else {
6869 if (set_base_frame(j, 30) != 30)
6870 return -1;
6871 if (ixjdebug & 0x0002)
6872 printk(KERN_INFO "Write CODEC config to Software Control Register\n");
6873 if (j->cardtype == QTI_PHONECARD) {
6874 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6875 return -1;
6876 }
6877 if (j->cardtype == QTI_LINEJACK) {
6878 if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
6879 return -1;
6880 if (ixjdebug & 0x0002)
6881 printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
6882 j->pld_clock.byte = 0;
6883 outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
6884 }
6885 }
6886
6887 if (j->dsp.low == 0x20) {
6888 if (ixjdebug & 0x0002)
6889 printk(KERN_INFO "Configure GPIO pins\n");
6890 j->gpio.bytes.high = 0x09;
6891/* bytes.low = 0xEF; 0xF7 */
6892 j->gpio.bits.gpio1 = 1;
6893 j->gpio.bits.gpio2 = 1;
6894 j->gpio.bits.gpio3 = 0;
6895 j->gpio.bits.gpio4 = 1;
6896 j->gpio.bits.gpio5 = 1;
6897 j->gpio.bits.gpio6 = 1;
6898 j->gpio.bits.gpio7 = 1;
6899 ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */
6900 if (ixjdebug & 0x0002)
6901 printk(KERN_INFO "Enable SLIC\n");
6902 j->gpio.bytes.high = 0x0B;
6903 j->gpio.bytes.low = 0x00;
6904 j->gpio.bits.gpio1 = 0;
6905 j->gpio.bits.gpio2 = 1;
6906 j->gpio.bits.gpio5 = 0;
6907 ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */
6908 j->port = PORT_POTS;
6909 } else {
6910 if (j->cardtype == QTI_LINEJACK) {
6911 LED_SetState(0x1, j);
f4c9925c 6912 msleep(100);
1da177e4 6913 LED_SetState(0x2, j);
f4c9925c 6914 msleep(100);
1da177e4 6915 LED_SetState(0x4, j);
f4c9925c 6916 msleep(100);
1da177e4 6917 LED_SetState(0x8, j);
f4c9925c 6918 msleep(100);
1da177e4
LT
6919 LED_SetState(0x0, j);
6920 daa_get_version(j);
6921 if (ixjdebug & 0x0002)
6922 printk("Loading DAA Coefficients\n");
6923 DAA_Coeff_US(j);
6924 if (!ixj_daa_write(j)) {
6925 printk("DAA write failed on board %d\n", j->board);
6926 return -1;
6927 }
6928 if(!ixj_daa_cid_reset(j)) {
6929 printk("DAA CID reset failed on board %d\n", j->board);
6930 return -1;
6931 }
6932 j->flags.pots_correct = 0;
6933 j->flags.pstn_present = 0;
6934 ixj_linetest(j);
6935 if (j->flags.pots_correct) {
6936 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
6937
6938 outb_p(j->pld_scrw.byte, j->XILINXbase);
6939 j->pld_slicw.bits.rly1 = 1;
6940 j->pld_slicw.bits.spken = 1;
6941 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6942 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
6943/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
6944 j->port = PORT_POTS;
6945 }
6946 ixj_set_port(j, PORT_PSTN);
6947 ixj_set_pots(j, 1);
6948 if (ixjdebug & 0x0002)
6949 printk(KERN_INFO "Enable Mixer\n");
6950 ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */
6951 ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */
6952
6953 ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
6954 ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
6955
6956 ixj_mixer(0x0480, j); /*FM Left mute */
6957 ixj_mixer(0x0580, j); /*FM Right mute */
6958
6959 ixj_mixer(0x0680, j); /*CD Left mute */
6960 ixj_mixer(0x0780, j); /*CD Right mute */
6961
6962 ixj_mixer(0x0880, j); /*Line Left mute */
6963 ixj_mixer(0x0980, j); /*Line Right mute */
6964
6965 ixj_mixer(0x0A80, j); /*Aux left mute */
6966 ixj_mixer(0x0B80, j); /*Aux right mute */
6967
6968 ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
6969 ixj_mixer(0x0D80, j); /*Mono2 mute */
6970
6971 ixj_mixer(0x0E80, j); /*Mic mute */
6972
6973 ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */
6974
6975 ixj_mixer(0x1000, j); /*Voice Left and Right out only */
6976 ixj_mixer(0x110C, j);
6977
6978
6979 ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */
6980 ixj_mixer(0x1401, j);
6981
6982 ixj_mixer(0x1300, j); /*Mono1 switch on mixer right */
6983 ixj_mixer(0x1501, j);
6984
6985 ixj_mixer(0x1700, j); /*Clock select */
6986
6987 ixj_mixer(0x1800, j); /*ADC input from mixer */
6988
6989 ixj_mixer(0x1901, j); /*Mic gain 30db */
6990
6991 if (ixjdebug & 0x0002)
6992 printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
6993 j->cadence_f[4].state = 0;
6994 j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */
6995 j->cadence_f[4].off1 = 0;
6996 j->cadence_f[4].on2 = 0;
6997 j->cadence_f[4].off2 = 0;
6998 j->cadence_f[4].on3 = 0;
6999 j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */
7000 j->pstn_last_rmr = jiffies;
7001
7002 } else {
7003 if (j->cardtype == QTI_PHONECARD) {
7004 ixj_WriteDSPCommand(0xCF07, j);
7005 ixj_WriteDSPCommand(0x00B0, j);
7006 ixj_set_port(j, PORT_SPEAKER);
7007 } else {
7008 ixj_set_port(j, PORT_POTS);
7009 SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
7010/* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
7011 }
7012 }
7013 }
7014
7015 j->intercom = -1;
7016 j->framesread = j->frameswritten = 0;
7017 j->read_wait = j->write_wait = 0;
7018 j->rxreadycheck = j->txreadycheck = 0;
7019
7020 /* initialise the DTMF prescale to a sensible value */
7021 if (j->cardtype == QTI_LINEJACK) {
7022 set_dtmf_prescale(j, 0x10);
7023 } else {
7024 set_dtmf_prescale(j, 0x40);
7025 }
7026 set_play_volume(j, 0x100);
7027 set_rec_volume(j, 0x100);
7028
7029 if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
7030 return -1;
7031/* The read values of the SSR should be 0x00 for the IDLE command */
7032 if (j->ssr.low || j->ssr.high)
7033 return -1;
7034
7035 if (ixjdebug & 0x0002)
7036 printk(KERN_INFO "Enable Line Monitor\n");
7037
7038 if (ixjdebug & 0x0002)
7039 printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
7040
7041 if (ixj_WriteDSPCommand(0x7E01, j)) /* Asynchronous Line Monitor */
7042 return -1;
7043
7044 if (ixjdebug & 0x002)
7045 printk(KERN_INFO "Enable DTMF Detectors\n");
7046
7047 if (ixj_WriteDSPCommand(0x5151, j)) /* Enable DTMF detection */
7048 return -1;
7049
7050 if (ixj_WriteDSPCommand(0x6E01, j)) /* Set Asyncronous Tone Generation */
7051 return -1;
7052
7053 set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
7054
7055 set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
7056
7057 j->ex.bits.dtmf_ready = 0;
7058 j->dtmf_state = 0;
7059 j->dtmf_wp = j->dtmf_rp = 0;
7060 j->rec_mode = j->play_mode = -1;
7061 j->flags.ringing = 0;
7062 j->maxrings = MAXRINGS;
7063 j->ring_cadence = USA_RING_CADENCE;
7064 j->drybuffer = 0;
7065 j->winktime = 320;
7066 j->flags.dtmf_oob = 0;
7067 for (cnt = 0; cnt < 4; cnt++)
7068 j->cadence_f[cnt].enable = 0;
7069 /* must be a device on the specified address */
7070 ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
7071
7072 /* Set up the default signals for events */
7073 for (cnt = 0; cnt < 35; cnt++)
7074 j->ixj_signals[cnt] = SIGIO;
7075
7076 /* Set the excetion signal enable flags */
7077 j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
7078 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 =
7079 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;
7080#ifdef IXJ_DYN_ALLOC
7081 j->fskdata = NULL;
7082#endif
7083 j->fskdcnt = 0;
7084 j->cidcw_wait = 0;
7085
7086 /* Register with the Telephony for Linux subsystem */
7087 j->p.f_op = &ixj_fops;
7088 j->p.open = ixj_open;
7089 j->p.board = j->board;
7090 phone_register_device(&j->p, PHONE_UNIT_ANY);
7091
7092 ixj_init_timer(j);
7093 ixj_add_timer(j);
7094 return 0;
7095}
7096
7097/*
7098 * Exported service for pcmcia card handling
7099 */
7100
7101IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
7102{
7103 IXJ *j = ixj_alloc();
7104
7105 j->board = 0;
7106
7107 j->DSPbase = dsp;
7108 j->XILINXbase = xilinx;
7109 j->cardtype = QTI_PHONECARD;
7110 ixj_selfprobe(j);
7111 return j;
7112}
7113
7114EXPORT_SYMBOL(ixj_pcmcia_probe); /* Fpr PCMCIA */
7115
7116static int ixj_get_status_proc(char *buf)
7117{
7118 int len;
7119 int cnt;
7120 IXJ *j;
7121 len = 0;
1da177e4
LT
7122 len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
7123 len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
7124 len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
7125 len += sprintf(buf + len, "\nUsing old telephony API");
7126 len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
7127
7128 for (cnt = 0; cnt < IXJMAX; cnt++) {
7129 j = get_ixj(cnt);
7130 if(j==NULL)
7131 continue;
7132 if (j->DSPbase) {
7133 len += sprintf(buf + len, "\nCard Num %d", cnt);
7134 len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
7135 if (j->cardtype != QTI_PHONEJACK)
7136 len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
7137 len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
7138 len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
7139 len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
7140 switch (j->cardtype) {
7141 case (QTI_PHONEJACK):
7142 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
7143 break;
7144 case (QTI_LINEJACK):
7145 len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
7146 if (j->flags.g729_loaded)
7147 len += sprintf(buf + len, " w/G.729 A/B");
7148 len += sprintf(buf + len, " Country = %d", j->daa_country);
7149 break;
7150 case (QTI_PHONEJACK_LITE):
7151 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
7152 if (j->flags.g729_loaded)
7153 len += sprintf(buf + len, " w/G.729 A/B");
7154 break;
7155 case (QTI_PHONEJACK_PCI):
7156 len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
7157 if (j->flags.g729_loaded)
7158 len += sprintf(buf + len, " w/G.729 A/B");
7159 break;
7160 case (QTI_PHONECARD):
7161 len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
7162 if (j->flags.g729_loaded)
7163 len += sprintf(buf + len, " w/G.729 A/B");
7164 len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
7165 if (!j->pccr1.bits.drf)
7166 len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
7167 len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
7168 break;
7169 default:
7170 len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
7171 break;
7172 }
7173 len += sprintf(buf + len, "\nReaders %d", j->readers);
7174 len += sprintf(buf + len, "\nWriters %d", j->writers);
7175 add_caps(j);
7176 len += sprintf(buf + len, "\nCapabilities %d", j->caps);
7177 if (j->dsp.low != 0x20)
7178 len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
7179 if (j->flags.cidsent)
7180 len += sprintf(buf + len, "\nCaller ID data sent");
7181 else
7182 len += sprintf(buf + len, "\nCaller ID data not sent");
7183
7184 len += sprintf(buf + len, "\nPlay CODEC ");
7185 switch (j->play_codec) {
7186 case G723_63:
7187 len += sprintf(buf + len, "G.723.1 6.3");
7188 break;
7189 case G723_53:
7190 len += sprintf(buf + len, "G.723.1 5.3");
7191 break;
7192 case TS85:
7193 len += sprintf(buf + len, "TrueSpeech 8.5");
7194 break;
7195 case TS48:
7196 len += sprintf(buf + len, "TrueSpeech 4.8");
7197 break;
7198 case TS41:
7199 len += sprintf(buf + len, "TrueSpeech 4.1");
7200 break;
7201 case G728:
7202 len += sprintf(buf + len, "G.728");
7203 break;
7204 case G729:
7205 len += sprintf(buf + len, "G.729");
7206 break;
7207 case G729B:
7208 len += sprintf(buf + len, "G.729B");
7209 break;
7210 case ULAW:
7211 len += sprintf(buf + len, "uLaw");
7212 break;
7213 case ALAW:
7214 len += sprintf(buf + len, "aLaw");
7215 break;
7216 case LINEAR16:
7217 len += sprintf(buf + len, "16 bit Linear");
7218 break;
7219 case LINEAR8:
7220 len += sprintf(buf + len, "8 bit Linear");
7221 break;
7222 case WSS:
7223 len += sprintf(buf + len, "Windows Sound System");
7224 break;
7225 default:
7226 len += sprintf(buf + len, "NO CODEC CHOSEN");
7227 break;
7228 }
7229 len += sprintf(buf + len, "\nRecord CODEC ");
7230 switch (j->rec_codec) {
7231 case G723_63:
7232 len += sprintf(buf + len, "G.723.1 6.3");
7233 break;
7234 case G723_53:
7235 len += sprintf(buf + len, "G.723.1 5.3");
7236 break;
7237 case TS85:
7238 len += sprintf(buf + len, "TrueSpeech 8.5");
7239 break;
7240 case TS48:
7241 len += sprintf(buf + len, "TrueSpeech 4.8");
7242 break;
7243 case TS41:
7244 len += sprintf(buf + len, "TrueSpeech 4.1");
7245 break;
7246 case G728:
7247 len += sprintf(buf + len, "G.728");
7248 break;
7249 case G729:
7250 len += sprintf(buf + len, "G.729");
7251 break;
7252 case G729B:
7253 len += sprintf(buf + len, "G.729B");
7254 break;
7255 case ULAW:
7256 len += sprintf(buf + len, "uLaw");
7257 break;
7258 case ALAW:
7259 len += sprintf(buf + len, "aLaw");
7260 break;
7261 case LINEAR16:
7262 len += sprintf(buf + len, "16 bit Linear");
7263 break;
7264 case LINEAR8:
7265 len += sprintf(buf + len, "8 bit Linear");
7266 break;
7267 case WSS:
7268 len += sprintf(buf + len, "Windows Sound System");
7269 break;
7270 default:
7271 len += sprintf(buf + len, "NO CODEC CHOSEN");
7272 break;
7273 }
7274 len += sprintf(buf + len, "\nAEC ");
7275 switch (j->aec_level) {
7276 case AEC_OFF:
7277 len += sprintf(buf + len, "Off");
7278 break;
7279 case AEC_LOW:
7280 len += sprintf(buf + len, "Low");
7281 break;
7282 case AEC_MED:
7283 len += sprintf(buf + len, "Med");
7284 break;
7285 case AEC_HIGH:
7286 len += sprintf(buf + len, "High");
7287 break;
7288 case AEC_AUTO:
7289 len += sprintf(buf + len, "Auto");
7290 break;
7291 case AEC_AGC:
7292 len += sprintf(buf + len, "AEC/AGC");
7293 break;
7294 default:
7295 len += sprintf(buf + len, "unknown(%i)", j->aec_level);
7296 break;
7297 }
7298
7299 len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
7300 len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
7301 len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
7302
7303 len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook); */
7304
7305 if (j->cardtype == QTI_LINEJACK) {
7306 len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
7307 len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
7308 len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
7309 len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
7310 switch (j->daa_mode) {
7311 case SOP_PU_SLEEP:
7312 len += sprintf(buf + len, "\nDAA PSTN On Hook");
7313 break;
7314 case SOP_PU_RINGING:
7315 len += sprintf(buf + len, "\nDAA PSTN Ringing");
7316 len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
7317 break;
7318 case SOP_PU_CONVERSATION:
7319 len += sprintf(buf + len, "\nDAA PSTN Off Hook");
7320 break;
7321 case SOP_PU_PULSEDIALING:
7322 len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
7323 break;
7324 }
7325 len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
7326 len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
7327 len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
7328 len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
7329 len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
7330 len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
7331 len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
7332 len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
7333 len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
7334 len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
7335 }
7336 switch (j->port) {
7337 case PORT_POTS:
7338 len += sprintf(buf + len, "\nPort POTS");
7339 break;
7340 case PORT_PSTN:
7341 len += sprintf(buf + len, "\nPort PSTN");
7342 break;
7343 case PORT_SPEAKER:
7344 len += sprintf(buf + len, "\nPort SPEAKER/MIC");
7345 break;
7346 case PORT_HANDSET:
7347 len += sprintf(buf + len, "\nPort HANDSET");
7348 break;
7349 }
7350 if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
7351 len += sprintf(buf + len, "\nSLIC state ");
7352 switch (SLIC_GetState(j)) {
7353 case PLD_SLIC_STATE_OC:
7354 len += sprintf(buf + len, "OC");
7355 break;
7356 case PLD_SLIC_STATE_RINGING:
7357 len += sprintf(buf + len, "RINGING");
7358 break;
7359 case PLD_SLIC_STATE_ACTIVE:
7360 len += sprintf(buf + len, "ACTIVE");
7361 break;
7362 case PLD_SLIC_STATE_OHT: /* On-hook transmit */
7363 len += sprintf(buf + len, "OHT");
7364 break;
7365 case PLD_SLIC_STATE_TIPOPEN:
7366 len += sprintf(buf + len, "TIPOPEN");
7367 break;
7368 case PLD_SLIC_STATE_STANDBY:
7369 len += sprintf(buf + len, "STANDBY");
7370 break;
7371 case PLD_SLIC_STATE_APR: /* Active polarity reversal */
7372 len += sprintf(buf + len, "APR");
7373 break;
7374 case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
7375 len += sprintf(buf + len, "OHTPR");
7376 break;
7377 default:
7378 len += sprintf(buf + len, "%d", SLIC_GetState(j));
7379 break;
7380 }
7381 }
7382 len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
7383 len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
7384#ifdef PERFMON_STATS
7385 len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
7386 len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
7387 len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
7388 len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
7389 len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
7390 len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
7391 len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
7392 len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
7393 len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
7394 len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
7395 len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
7396 len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
7397 len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
7398 len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
7399
7400#endif
7401 len += sprintf(buf + len, "\n");
7402 }
7403 }
7404 return len;
7405}
7406
7407static int ixj_read_proc(char *page, char **start, off_t off,
7408 int count, int *eof, void *data)
7409{
7410 int len = ixj_get_status_proc(page);
7411 if (len <= off+count) *eof = 1;
7412 *start = page + off;
7413 len -= off;
7414 if (len>count) len = count;
7415 if (len<0) len = 0;
7416 return len;
7417}
7418
7419
7420static void cleanup(void)
7421{
7422 int cnt;
7423 IXJ *j;
7424
7425 for (cnt = 0; cnt < IXJMAX; cnt++) {
7426 j = get_ixj(cnt);
7427 if(j != NULL && j->DSPbase) {
7428 if (ixjdebug & 0x0002)
7429 printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
7430 del_timer(&j->timer);
7431 if (j->cardtype == QTI_LINEJACK) {
7432 j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
7433
7434 outb_p(j->pld_scrw.byte, j->XILINXbase);
7435 j->pld_slicw.bits.rly1 = 0;
7436 j->pld_slicw.bits.rly2 = 0;
7437 j->pld_slicw.bits.rly3 = 0;
7438 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
7439 LED_SetState(0x0, j);
7440 if (ixjdebug & 0x0002)
7441 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7442 release_region(j->XILINXbase, 8);
7443 } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
7444 if (ixjdebug & 0x0002)
7445 printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
7446 release_region(j->XILINXbase, 4);
7447 }
0159f76d
JJ
7448 kfree(j->read_buffer);
7449 kfree(j->write_buffer);
1da177e4
LT
7450 if (j->dev)
7451 pnp_device_detach(j->dev);
7452 if (ixjdebug & 0x0002)
7453 printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
7454 phone_unregister_device(&j->p);
7455 if (ixjdebug & 0x0002)
7456 printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
7457 release_region(j->DSPbase, 16);
7458#ifdef IXJ_DYN_ALLOC
7459 if (ixjdebug & 0x0002)
7460 printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
7461 kfree(j);
7462 ixj[cnt] = NULL;
7463#endif
7464 }
7465 }
7466 if (ixjdebug & 0x0002)
7467 printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
7468 remove_proc_entry ("ixj", NULL);
7469}
7470
7471/* Typedefs */
7472typedef struct {
7473 BYTE length;
7474 DWORD bits;
7475} DATABLOCK;
7476
7477static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
7478{
7479 lastLCC = lastLCC & 0xfb;
7480 lastLCC = lastLCC | (byData ? 4 : 0);
7481 outb(lastLCC, wEEPROMAddress); /*set data out bit as appropriate */
7482
7483 mdelay(1);
7484 lastLCC = lastLCC | 0x01;
7485 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7486
7487 byData = byData << 1;
7488 lastLCC = lastLCC & 0xfe;
7489 mdelay(1);
7490 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7491
7492}
7493
7494static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
7495{
7496 mdelay(1);
7497 lastLCC = lastLCC | 0x01;
7498 outb(lastLCC, wEEPROMAddress); /*SK rising edge */
7499
7500 lastLCC = lastLCC & 0xfe;
7501 mdelay(1);
7502 outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
7503
7504 return ((inb(wEEPROMAddress) >> 3) & 1);
7505}
7506
e13df2c5 7507static bool PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
1da177e4
LT
7508{
7509 BYTE lastLCC;
7510 WORD wEEPROMAddress = wAddress + 3;
7511 DWORD i;
7512 BYTE byResult;
7513 *pwResult = 0;
7514 lastLCC = inb(wEEPROMAddress);
7515 lastLCC = lastLCC | 0x02;
7516 lastLCC = lastLCC & 0xfe;
7517 outb(lastLCC, wEEPROMAddress); /* CS hi, SK lo */
7518
7519 mdelay(1); /* delay */
7520
7521 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7522 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
7523 PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
7524 for (i = 0; i < 8; i++) {
7525 PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
7526 wLoc <<= 1;
7527 }
7528
7529 for (i = 0; i < 16; i++) {
7530 byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
7531 *pwResult = (*pwResult << 1) | byResult;
7532 }
7533
7534 mdelay(1); /* another delay */
7535
7536 lastLCC = lastLCC & 0xfd;
7537 outb(lastLCC, wEEPROMAddress); /* negate CS */
7538
7539 return 0;
7540}
7541
7542static DWORD PCIEE_GetSerialNumber(WORD wAddress)
7543{
7544 WORD wLo, wHi;
7545 if (PCIEE_ReadWord(wAddress, 62, &wLo))
7546 return 0;
7547 if (PCIEE_ReadWord(wAddress, 63, &wHi))
7548 return 0;
7549 return (((DWORD) wHi << 16) | wLo);
7550}
7551
7552static int dspio[IXJMAX + 1] =
7553{
7554 0,
7555};
7556static int xio[IXJMAX + 1] =
7557{
7558 0,
7559};
7560
7561module_param_array(dspio, int, NULL, 0);
7562module_param_array(xio, int, NULL, 0);
7563MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
7564MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
7565MODULE_LICENSE("GPL");
7566
7567static void __exit ixj_exit(void)
7568{
7569 cleanup();
7570}
7571
7572static IXJ *new_ixj(unsigned long port)
7573{
7574 IXJ *res;
7575 if (!request_region(port, 16, "ixj DSP")) {
7576 printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
7577 return NULL;
7578 }
7579 res = ixj_alloc();
7580 if (!res) {
7581 release_region(port, 16);
7582 printk(KERN_INFO "ixj: out of memory\n");
7583 return NULL;
7584 }
7585 res->DSPbase = port;
7586 return res;
7587}
7588
7589static int __init ixj_probe_isapnp(int *cnt)
7590{
7591 int probe = 0;
7592 int func = 0x110;
7593 struct pnp_dev *dev = NULL, *old_dev = NULL;
7594
7595 while (1) {
7596 do {
7597 IXJ *j;
7598 int result;
7599
7600 old_dev = dev;
7601 dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
7602 ISAPNP_FUNCTION(func), old_dev);
7603 if (!dev || !dev->card)
7604 break;
7605 result = pnp_device_attach(dev);
7606 if (result < 0) {
7607 printk("pnp attach failed %d \n", result);
7608 break;
7609 }
7610 if (pnp_activate_dev(dev) < 0) {
7611 printk("pnp activate failed (out of resources?)\n");
7612 pnp_device_detach(dev);
7613 return -ENOMEM;
7614 }
7615
7616 if (!pnp_port_valid(dev, 0)) {
7617 pnp_device_detach(dev);
7618 return -ENODEV;
7619 }
7620
7621 j = new_ixj(pnp_port_start(dev, 0));
7622 if (!j)
7623 break;
7624
7625 if (func != 0x110)
7626 j->XILINXbase = pnp_port_start(dev, 1); /* get real port */
7627
7628 switch (func) {
7629 case (0x110):
7630 j->cardtype = QTI_PHONEJACK;
7631 break;
7632 case (0x310):
7633 j->cardtype = QTI_LINEJACK;
7634 break;
7635 case (0x410):
7636 j->cardtype = QTI_PHONEJACK_LITE;
7637 break;
7638 }
7639 j->board = *cnt;
7640 probe = ixj_selfprobe(j);
7641 if(!probe) {
7642 j->serial = dev->card->serial;
7643 j->dev = dev;
7644 switch (func) {
7645 case 0x110:
7646 printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
7647 break;
7648 case 0x310:
7649 printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
7650 break;
7651 case 0x410:
7652 printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
7653 break;
7654 }
7655 }
7656 ++*cnt;
7657 } while (dev);
7658 if (func == 0x410)
7659 break;
7660 if (func == 0x310)
7661 func = 0x410;
7662 if (func == 0x110)
7663 func = 0x310;
7664 dev = NULL;
7665 }
7666 return probe;
7667}
7668
7669static int __init ixj_probe_isa(int *cnt)
7670{
7671 int i, probe;
7672
7673 /* Use passed parameters for older kernels without PnP */
7674 for (i = 0; i < IXJMAX; i++) {
7675 if (dspio[i]) {
7676 IXJ *j = new_ixj(dspio[i]);
7677
7678 if (!j)
7679 break;
7680
7681 j->XILINXbase = xio[i];
7682 j->cardtype = 0;
7683
7684 j->board = *cnt;
7685 probe = ixj_selfprobe(j);
7686 j->dev = NULL;
7687 ++*cnt;
7688 }
7689 }
7690 return 0;
7691}
7692
7693static int __init ixj_probe_pci(int *cnt)
7694{
7695 struct pci_dev *pci = NULL;
7696 int i, probe = 0;
7697 IXJ *j = NULL;
7698
7699 for (i = 0; i < IXJMAX - *cnt; i++) {
6de2d202 7700 pci = pci_get_device(PCI_VENDOR_ID_QUICKNET,
d77f09e5 7701 PCI_DEVICE_ID_QUICKNET_XJ, pci);
1da177e4
LT
7702 if (!pci)
7703 break;
7704
7705 if (pci_enable_device(pci))
7706 break;
7707 j = new_ixj(pci_resource_start(pci, 0));
7708 if (!j)
7709 break;
7710
7711 j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
7712 j->XILINXbase = j->DSPbase + 0x10;
7713 j->cardtype = QTI_PHONEJACK_PCI;
7714 j->board = *cnt;
7715 probe = ixj_selfprobe(j);
7716 if (!probe)
7717 printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
7718 ++*cnt;
7719 }
6de2d202 7720 pci_dev_put(pci);
1da177e4
LT
7721 return probe;
7722}
7723
7724static int __init ixj_init(void)
7725{
7726 int cnt = 0;
7727 int probe = 0;
7728
7729 cnt = 0;
7730
7731 /* These might be no-ops, see above. */
7732 if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
7733 return probe;
7734 }
7735 if ((probe = ixj_probe_isa(&cnt)) < 0) {
7736 return probe;
7737 }
7738 if ((probe = ixj_probe_pci(&cnt)) < 0) {
7739 return probe;
7740 }
fba478b1 7741 printk(KERN_INFO "ixj driver initialized.\n");
1da177e4
LT
7742 create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
7743 return probe;
7744}
7745
7746module_init(ixj_init);
7747module_exit(ixj_exit);
7748
7749static void DAA_Coeff_US(IXJ *j)
7750{
7751 int i;
7752
7753 j->daa_country = DAA_US;
7754 /*----------------------------------------------- */
7755 /* CAO */
7756 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7757 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7758 }
7759
7760/* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
7761 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
7762 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
7763 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
7764 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
7765 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
7766 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
7767 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7768 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7769/* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
7770 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
7771 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
7772 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7773 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7774 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
7775 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7776 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7777 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7778/* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */
7779 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
7780 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
7781 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
7782 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
7783 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
7784 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
7785 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
7786 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7787/* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */
7788 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
7789 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
7790 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
7791 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
7792 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
7793 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
7794 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
7795 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
7796/* Bytes for AX-filter (0A): 16,55,DD,CA */
7797 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
7798 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
7799 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
7800 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
7801/* Bytes for AR-filter (09): 52,D3,11,42 */
7802 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
7803 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
7804 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
7805 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
7806/* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
7807 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
7808 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
7809 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
7810 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
7811 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
7812 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
7813 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
7814 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
7815/* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
7816 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
7817 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
7818 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
7819 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
7820 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
7821 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
7822 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
7823 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
7824/* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
7825 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
7826 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
7827 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
7828 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
7829 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
7830 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
7831 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
7832 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
7833/* ; (10K, 0.68uF) */
7834 /* */
7835 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7836 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
7837 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
7838 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
7839 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
7840 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
7841 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
7842 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
7843 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
7844 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7845 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
7846 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
7847 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
7848 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
7849 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
7850 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
7851 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
7852 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
7853
7854 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7855 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
7856 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
7857 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
7858 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
7859
7860 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
7861/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
7862/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
7863/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
7864/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
7865/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
7866/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
7867/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
7868/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
7869 /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
7870/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
7871/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
7872/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
7873/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
7874/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
7875/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
7876/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
7877/* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
7878/* */
7879 /* Levelmetering Ringing (0D):B2,45,0F,8E */
7880/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
7881/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
7882/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
7883/* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
7884
7885 /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
7886 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
7887 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
7888 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
7889 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
7890 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
7891 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
7892 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
7893 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
7894/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
7895 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
7896 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
7897 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
7898 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
7899 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
7900 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
7901 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
7902 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
7903/* */
7904 /* ;CR Registers */
7905 /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */
7906 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
7907/* Config. Reg. 1 (dialing) (cr1):05 */
7908 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
7909/* Config. Reg. 2 (caller ID) (cr2):04 */
7910 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
7911/* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */
7912 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
7913/* Config. Reg. 4 (analog gain) (cr4):02 */
7914 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
7915 /* Config. Reg. 5 (Version) (cr5):02 */
7916 /* Config. Reg. 6 (Reserved) (cr6):00 */
7917 /* Config. Reg. 7 (Reserved) (cr7):00 */
7918 /* */
7919 /* ;xr Registers */
7920 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
7921
7922 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
7923 /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
7924
7925 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
7926/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
7927 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
7928/* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */
7929 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B; /*0x32; */
7930 /* Ext. Reg. 4 (Cadence) (xr4):00 */
7931
7932 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
7933/* Ext. Reg. 5 (Ring timer) (xr5):22 */
7934 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
7935/* Ext. Reg. 6 (Power State) (xr6):00 */
7936 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
7937/* Ext. Reg. 7 (Vdd) (xr7):40 */
7938 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
7939 /* */
7940 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
7941 /* 12,33,5A,C3 ; 770 Hz */
7942 /* 13,3C,5B,32 ; 852 Hz */
7943 /* 1D,1B,5C,CC ; 941 Hz */
7944
7945 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
7946 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
7947 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
7948 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
7949/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
7950 /* EC,1D,52,22 ; 1336 Hz */
7951 /* AA,AC,51,D2 ; 1477 Hz */
7952 /* 9B,3B,51,25 ; 1633 Hz */
7953 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
7954 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
7955 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
7956 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
7957}
7958
7959static void DAA_Coeff_UK(IXJ *j)
7960{
7961 int i;
7962
7963 j->daa_country = DAA_UK;
7964 /*----------------------------------------------- */
7965 /* CAO */
7966 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
7967 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
7968 }
7969
7970/* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
7971 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
7972 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
7973 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
7974 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
7975 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
7976 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
7977 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
7978 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
7979/* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
7980 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
7981 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
7982 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
7983 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
7984 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
7985 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
7986 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
7987 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
7988/* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */
7989 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
7990 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
7991 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
7992 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
7993 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
7994 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
7995 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
7996 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
7997/* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */
7998 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
7999 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
8000 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
8001 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
8002 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8003 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
8004 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
8005 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8006/* Bytes for AX-filter (0A): 1B,A5,DD,CA */
8007 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
8008 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
8009 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8010 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8011/* Bytes for AR-filter (09): E2,27,10,D6 */
8012 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8013 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
8014 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8015 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8016/* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
8017 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8018 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
8019 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
8020 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
8021 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
8022 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
8023 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8024 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8025/* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
8026 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8027 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
8028 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
8029 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
8030 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
8031 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
8032 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
8033 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
8034/* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
8035 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8036 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8037 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
8038 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
8039 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
8040 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
8041 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
8042 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
8043/* ; idle */
8044 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8045 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8046 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8047 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8048 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8049 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8050 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8051 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8052 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8053/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8054 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8055 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8056 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8057 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8058 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8059 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8060 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8061 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8062/* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */
8063 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8064 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8065 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8066 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8067/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8068 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8069 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8070 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8071 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8072 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8073 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8074 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8075 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8076/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8077 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8078 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8079 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8080 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8081 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8082 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8083 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8084 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8085/* ;CR Registers */
8086 /* Config. Reg. 0 (filters) (cr0):FF */
8087 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8088/* Config. Reg. 1 (dialing) (cr1):05 */
8089 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8090/* Config. Reg. 2 (caller ID) (cr2):04 */
8091 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8092/* Config. Reg. 3 (testloops) (cr3):00 ; */
8093 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8094/* Config. Reg. 4 (analog gain) (cr4):02 */
8095 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8096 /* Config. Reg. 5 (Version) (cr5):02 */
8097 /* Config. Reg. 6 (Reserved) (cr6):00 */
8098 /* Config. Reg. 7 (Reserved) (cr7):00 */
8099 /* ;xr Registers */
8100 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8101
8102 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8103 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8104
8105 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8106 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8107
8108 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8109/* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8110 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8111/* Ext. Reg. 4 (Cadence) (xr4):00 */
8112 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8113/* Ext. Reg. 5 (Ring timer) (xr5):22 */
8114 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8115/* Ext. Reg. 6 (Power State) (xr6):00 */
8116 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8117/* Ext. Reg. 7 (Vdd) (xr7):46 */
8118 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8119 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8120 /* 12,33,5A,C3 ; 770 Hz */
8121 /* 13,3C,5B,32 ; 852 Hz */
8122 /* 1D,1B,5C,CC ; 941 Hz */
8123
8124 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8125 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8126 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8127 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8128/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8129 /* EC,1D,52,22 ; 1336 Hz */
8130 /* AA,AC,51,D2 ; 1477 Hz */
8131 /* 9B,3B,51,25 ; 1633 Hz */
8132 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8133 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8134 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8135 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8136}
8137
8138
8139static void DAA_Coeff_France(IXJ *j)
8140{
8141 int i;
8142
8143 j->daa_country = DAA_FRANCE;
8144 /*----------------------------------------------- */
8145 /* CAO */
8146 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8147 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8148 }
8149
8150/* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
8151 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
8152 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
8153 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
8154 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
8155 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
8156 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
8157 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8158 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8159/* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
8160 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
8161 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
8162 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8163 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
8164 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
8165 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8166 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8167 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8168/* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */
8169 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8170 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
8171 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
8172 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
8173 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
8174 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
8175 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
8176 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8177/* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */
8178 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8179 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8180 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
8181 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8182 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
8183 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
8184 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8185 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8186/* Bytes for AX-filter (0A): 16,B5,DD,CA */
8187 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
8188 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
8189 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8190 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8191/* Bytes for AR-filter (09): 52,C7,10,D6 */
8192 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
8193 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
8194 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8195 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8196/* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
8197 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8198 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8199 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8200 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8201 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
8202 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8203 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8204 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8205/* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
8206 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8207 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
8208 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8209 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
8210 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
8211 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
8212 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
8213 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
8214/* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
8215 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8216 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8217 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8218 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
8219 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
8220 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
8221 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
8222 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
8223/* ; idle */
8224 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8225 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8226 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8227 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8228 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8229 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8230 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8231 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8232 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8233/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8234 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8235 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8236 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8237 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8238 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8239 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8240 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8241 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8242/* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8243 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8244 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8245 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8246 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8247/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8248 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8249 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8250 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8251 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8252 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8253 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8254 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8255 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8256/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8257 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8258 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8259 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8260 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8261 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8262 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8263 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8264 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8265/* ;CR Registers */
8266 /* Config. Reg. 0 (filters) (cr0):FF */
8267 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8268/* Config. Reg. 1 (dialing) (cr1):05 */
8269 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8270/* Config. Reg. 2 (caller ID) (cr2):04 */
8271 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8272/* Config. Reg. 3 (testloops) (cr3):00 ; */
8273 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8274/* Config. Reg. 4 (analog gain) (cr4):02 */
8275 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8276 /* Config. Reg. 5 (Version) (cr5):02 */
8277 /* Config. Reg. 6 (Reserved) (cr6):00 */
8278 /* Config. Reg. 7 (Reserved) (cr7):00 */
8279 /* ;xr Registers */
8280 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8281
8282 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8283 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8284
8285 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8286 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8287
8288 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8289/* Ext. Reg. 3 (DC Char) (xr3):36 ; */
8290 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
8291/* Ext. Reg. 4 (Cadence) (xr4):00 */
8292 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8293/* Ext. Reg. 5 (Ring timer) (xr5):22 */
8294 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8295/* Ext. Reg. 6 (Power State) (xr6):00 */
8296 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8297/* Ext. Reg. 7 (Vdd) (xr7):46 */
8298 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
8299 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8300 /* 12,33,5A,C3 ; 770 Hz */
8301 /* 13,3C,5B,32 ; 852 Hz */
8302 /* 1D,1B,5C,CC ; 941 Hz */
8303
8304 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8305 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8306 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8307 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8308/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8309 /* EC,1D,52,22 ; 1336 Hz */
8310 /* AA,AC,51,D2 ; 1477 Hz */
8311 /* 9B,3B,51,25 ; 1633 Hz */
8312 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8313 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8314 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8315 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8316}
8317
8318
8319static void DAA_Coeff_Germany(IXJ *j)
8320{
8321 int i;
8322
8323 j->daa_country = DAA_GERMANY;
8324 /*----------------------------------------------- */
8325 /* CAO */
8326 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8327 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8328 }
8329
8330/* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
8331 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8332 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
8333 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
8334 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
8335 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
8336 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
8337 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
8338 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8339/* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
8340 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
8341 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
8342 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8343 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
8344 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
8345 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
8346 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
8347 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8348/* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */
8349 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8350 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
8351 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8352 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8353 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
8354 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
8355 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
8356 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8357/* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */
8358 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
8359 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
8360 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
8361 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
8362 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
8363 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
8364 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
8365 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8366/* Bytes for AX-filter (0A): 72,D5,DD,CA */
8367 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
8368 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
8369 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8370 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8371/* Bytes for AR-filter (09): 72,42,13,4B */
8372 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
8373 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
8374 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
8375 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
8376/* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
8377 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8378 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8379 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8380 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8381 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
8382 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8383 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8384 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8385/* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
8386 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8387 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
8388 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
8389 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8390 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
8391 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
8392 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
8393 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
8394/* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
8395 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8396 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8397 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
8398 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
8399 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
8400 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
8401 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
8402 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
8403/* ; (10K, 0.68uF) */
8404 /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
8405 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8406 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
8407 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
8408 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
8409 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
8410 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
8411 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
8412 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8413/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
8414 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
8415 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
8416 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8417 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8418 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
8419 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
8420 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
8421 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8422/* Levelmetering Ringing (0D):B2,45,0F,8E */
8423 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
8424 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8425 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8426 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8427/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8428 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8429 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8430 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8431 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8432 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8433 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8434 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8435 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8436/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8437 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8438 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8439 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8440 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8441 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8442 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8443 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8444 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8445/* ;CR Registers */
8446 /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */
8447 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8448/* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */
8449 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8450/* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */
8451 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8452/* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */
8453 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8454/* Config. Reg. 4 (analog gain) (cr4):02 */
8455 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8456 /* Config. Reg. 5 (Version) (cr5):02 */
8457 /* Config. Reg. 6 (Reserved) (cr6):00 */
8458 /* Config. Reg. 7 (Reserved) (cr7):00 */
8459 /* ;xr Registers */
8460 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8461
8462 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8463 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
8464
8465 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8466 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8467
8468 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8469/* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
8470 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
8471/* Ext. Reg. 4 (Cadence) (xr4):00 */
8472 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8473/* Ext. Reg. 5 (Ring timer) (xr5):22 */
8474 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8475/* Ext. Reg. 6 (Power State) (xr6):00 */
8476 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8477/* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */
8478 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8479 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8480 /* 12,33,5A,C3 ; 770 Hz */
8481 /* 13,3C,5B,32 ; 852 Hz */
8482 /* 1D,1B,5C,CC ; 941 Hz */
8483
8484 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8485 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8486 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8487 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8488/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8489 /* EC,1D,52,22 ; 1336 Hz */
8490 /* AA,AC,51,D2 ; 1477 Hz */
8491 /* 9B,3B,51,25 ; 1633 Hz */
8492 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8493 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8494 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8495 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8496}
8497
8498
8499static void DAA_Coeff_Australia(IXJ *j)
8500{
8501 int i;
8502
8503 j->daa_country = DAA_AUSTRALIA;
8504 /*----------------------------------------------- */
8505 /* CAO */
8506 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8507 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8508 }
8509
8510/* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
8511 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
8512 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
8513 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
8514 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
8515 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
8516 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
8517 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
8518 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8519/* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
8520 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
8521 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
8522 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8523 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
8524 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
8525 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
8526 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
8527 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8528/* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */
8529 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
8530 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
8531 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
8532 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
8533 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
8534 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
8535 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
8536 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8537/* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */
8538 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
8539 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
8540 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
8541 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
8542 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
8543 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
8544 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
8545 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8546/* Bytes for AX-filter (0A): CB,45,DD,CA */
8547 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
8548 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
8549 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8550 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8551/* Bytes for AR-filter (09): 1B,67,10,D6 */
8552 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
8553 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
8554 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8555 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8556/* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
8557 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
8558 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
8559 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8560 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8561 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
8562 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8563 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8564 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8565/* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
8566 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8567 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
8568 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
8569 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
8570 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
8571 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
8572 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
8573 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
8574/* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
8575 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8576 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8577 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
8578 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
8579 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
8580 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
8581 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
8582 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
8583/* ; idle */
8584 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8585 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8586 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8587 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8588 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8589 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8590 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8591 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8592 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8593/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8594 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8595 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8596 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8597 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8598 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8599 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8600 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8601 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8602/* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
8603 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
8604 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
8605 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
8606 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
8607/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8608 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8609 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8610 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8611 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8612 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8613 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8614 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8615 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8616/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8617 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8618 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8619 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8620 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8621 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8622 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8623 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8624 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8625/* ;CR Registers */
8626 /* Config. Reg. 0 (filters) (cr0):FF */
8627 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8628/* Config. Reg. 1 (dialing) (cr1):05 */
8629 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8630/* Config. Reg. 2 (caller ID) (cr2):04 */
8631 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8632/* Config. Reg. 3 (testloops) (cr3):00 ; */
8633 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8634/* Config. Reg. 4 (analog gain) (cr4):02 */
8635 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8636 /* Config. Reg. 5 (Version) (cr5):02 */
8637 /* Config. Reg. 6 (Reserved) (cr6):00 */
8638 /* Config. Reg. 7 (Reserved) (cr7):00 */
8639 /* ;xr Registers */
8640 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8641
8642 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8643 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8644
8645 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8646 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8647
8648 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8649/* Ext. Reg. 3 (DC Char) (xr3):2B ; */
8650 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
8651/* Ext. Reg. 4 (Cadence) (xr4):00 */
8652 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8653/* Ext. Reg. 5 (Ring timer) (xr5):22 */
8654 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8655/* Ext. Reg. 6 (Power State) (xr6):00 */
8656 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8657/* Ext. Reg. 7 (Vdd) (xr7):40 */
8658 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8659
8660 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8661 /* 12,33,5A,C3 ; 770 Hz */
8662 /* 13,3C,5B,32 ; 852 Hz */
8663 /* 1D,1B,5C,CC ; 941 Hz */
8664 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8665 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8666 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8667 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8668
8669 /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8670 /* EC,1D,52,22 ; 1336 Hz */
8671 /* AA,AC,51,D2 ; 1477 Hz */
8672 /* 9B,3B,51,25 ; 1633 Hz */
8673 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8674 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8675 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8676 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8677}
8678
8679static void DAA_Coeff_Japan(IXJ *j)
8680{
8681 int i;
8682
8683 j->daa_country = DAA_JAPAN;
8684 /*----------------------------------------------- */
8685 /* CAO */
8686 for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
8687 j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
8688 }
8689
8690/* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
8691 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
8692 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
8693 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
8694 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
8695 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
8696 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
8697 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
8698 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
8699/* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
8700 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
8701 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
8702 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
8703 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
8704 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
8705 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
8706 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
8707 j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
8708/* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */
8709 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
8710 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
8711 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
8712 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
8713 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
8714 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
8715 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
8716 j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
8717/* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */
8718 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
8719 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
8720 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
8721 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
8722 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
8723 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
8724 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
8725 j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
8726/* Bytes for AX-filter (0A): 51,C5,DD,CA */
8727 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
8728 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
8729 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
8730 j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
8731/* Bytes for AR-filter (09): 25,A7,10,D6 */
8732 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
8733 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
8734 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
8735 j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
8736/* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
8737 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
8738 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
8739 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
8740 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
8741 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
8742 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
8743 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
8744 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
8745/* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
8746 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
8747 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
8748 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
8749 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
8750 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
8751 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
8752 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
8753 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
8754/* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
8755 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
8756 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
8757 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
8758 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
8759 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
8760 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
8761 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
8762 j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
8763/* ; idle */
8764 /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
8765 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
8766 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
8767 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
8768 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
8769 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
8770 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
8771 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
8772 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
8773/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
8774 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
8775 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
8776 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
8777 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
8778 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
8779 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
8780 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
8781 j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
8782/* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */
8783 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
8784 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
8785 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
8786 j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
8787/* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
8788 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
8789 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
8790 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
8791 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
8792 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
8793 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
8794 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
8795 j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
8796/* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
8797 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
8798 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
8799 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
8800 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
8801 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
8802 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
8803 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
8804 j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
8805/* ;CR Registers */
8806 /* Config. Reg. 0 (filters) (cr0):FF */
8807 j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
8808/* Config. Reg. 1 (dialing) (cr1):05 */
8809 j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
8810/* Config. Reg. 2 (caller ID) (cr2):04 */
8811 j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
8812/* Config. Reg. 3 (testloops) (cr3):00 ; */
8813 j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
8814/* Config. Reg. 4 (analog gain) (cr4):02 */
8815 j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
8816 /* Config. Reg. 5 (Version) (cr5):02 */
8817 /* Config. Reg. 6 (Reserved) (cr6):00 */
8818 /* Config. Reg. 7 (Reserved) (cr7):00 */
8819 /* ;xr Registers */
8820 /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
8821
8822 j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
8823 /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
8824
8825 j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
8826 /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
8827
8828 j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
8829/* Ext. Reg. 3 (DC Char) (xr3):22 ; */
8830 j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
8831/* Ext. Reg. 4 (Cadence) (xr4):00 */
8832 j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
8833/* Ext. Reg. 5 (Ring timer) (xr5):22 */
8834 j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
8835/* Ext. Reg. 6 (Power State) (xr6):00 */
8836 j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
8837/* Ext. Reg. 7 (Vdd) (xr7):40 */
8838 j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
8839 /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
8840 /* 12,33,5A,C3 ; 770 Hz */
8841 /* 13,3C,5B,32 ; 852 Hz */
8842 /* 1D,1B,5C,CC ; 941 Hz */
8843
8844 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
8845 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
8846 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
8847 j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
8848/* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
8849 /* EC,1D,52,22 ; 1336 Hz */
8850 /* AA,AC,51,D2 ; 1477 Hz */
8851 /* 9B,3B,51,25 ; 1633 Hz */
8852 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
8853 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
8854 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
8855 j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
8856}
8857
8858static s16 tone_table[][19] =
8859{
8860 { /* f20_50[] 11 */
8861 32538, /* A1 = 1.985962 */
8862 -32325, /* A2 = -0.986511 */
8863 -343, /* B2 = -0.010493 */
8864 0, /* B1 = 0 */
8865 343, /* B0 = 0.010493 */
8866 32619, /* A1 = 1.990906 */
8867 -32520, /* A2 = -0.992462 */
8868 19179, /* B2 = 0.585327 */
8869 -19178, /* B1 = -1.170593 */
8870 19179, /* B0 = 0.585327 */
8871 32723, /* A1 = 1.997314 */
8872 -32686, /* A2 = -0.997528 */
8873 9973, /* B2 = 0.304352 */
8874 -9955, /* B1 = -0.607605 */
8875 9973, /* B0 = 0.304352 */
8876 7, /* Internal filter scaling */
8877 159, /* Minimum in-band energy threshold */
8878 21, /* 21/32 in-band to broad-band ratio */
8879 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8880 },
8881 { /* f133_200[] 12 */
8882 32072, /* A1 = 1.95752 */
8883 -31896, /* A2 = -0.973419 */
8884 -435, /* B2 = -0.013294 */
8885 0, /* B1 = 0 */
8886 435, /* B0 = 0.013294 */
8887 32188, /* A1 = 1.9646 */
8888 -32400, /* A2 = -0.98877 */
8889 15139, /* B2 = 0.462036 */
8890 -14882, /* B1 = -0.908356 */
8891 15139, /* B0 = 0.462036 */
8892 32473, /* A1 = 1.981995 */
8893 -32524, /* A2 = -0.992584 */
8894 23200, /* B2 = 0.708008 */
8895 -23113, /* B1 = -1.410706 */
8896 23200, /* B0 = 0.708008 */
8897 7, /* Internal filter scaling */
8898 159, /* Minimum in-band energy threshold */
8899 21, /* 21/32 in-band to broad-band ratio */
8900 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8901 },
8902 { /* f300 13 */
8903 31769, /* A1 = -1.939026 */
8904 -32584, /* A2 = 0.994385 */
8905 -475, /* B2 = -0.014522 */
8906 0, /* B1 = 0.000000 */
8907 475, /* B0 = 0.014522 */
8908 31789, /* A1 = -1.940247 */
8909 -32679, /* A2 = 0.997284 */
8910 17280, /* B2 = 0.527344 */
8911 -16865, /* B1 = -1.029358 */
8912 17280, /* B0 = 0.527344 */
8913 31841, /* A1 = -1.943481 */
8914 -32681, /* A2 = 0.997345 */
8915 543, /* B2 = 0.016579 */
8916 -525, /* B1 = -0.032097 */
8917 543, /* B0 = 0.016579 */
8918 5, /* Internal filter scaling */
8919 159, /* Minimum in-band energy threshold */
8920 21, /* 21/32 in-band to broad-band ratio */
8921 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8922 },
8923 { /* f300_420[] 14 */
8924 30750, /* A1 = 1.876892 */
8925 -31212, /* A2 = -0.952515 */
8926 -804, /* B2 = -0.024541 */
8927 0, /* B1 = 0 */
8928 804, /* B0 = 0.024541 */
8929 30686, /* A1 = 1.872925 */
8930 -32145, /* A2 = -0.980988 */
8931 14747, /* B2 = 0.450043 */
8932 -13703, /* B1 = -0.836395 */
8933 14747, /* B0 = 0.450043 */
8934 31651, /* A1 = 1.931824 */
8935 -32321, /* A2 = -0.986389 */
8936 24425, /* B2 = 0.745422 */
8937 -23914, /* B1 = -1.459595 */
8938 24427, /* B0 = 0.745483 */
8939 7, /* Internal filter scaling */
8940 159, /* Minimum in-band energy threshold */
8941 21, /* 21/32 in-band to broad-band ratio */
8942 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8943 },
8944 { /* f330 15 */
8945 31613, /* A1 = -1.929565 */
8946 -32646, /* A2 = 0.996277 */
8947 -185, /* B2 = -0.005657 */
8948 0, /* B1 = 0.000000 */
8949 185, /* B0 = 0.005657 */
8950 31620, /* A1 = -1.929932 */
8951 -32713, /* A2 = 0.998352 */
8952 19253, /* B2 = 0.587585 */
8953 -18566, /* B1 = -1.133179 */
8954 19253, /* B0 = 0.587585 */
8955 31674, /* A1 = -1.933228 */
8956 -32715, /* A2 = 0.998413 */
8957 2575, /* B2 = 0.078590 */
8958 -2495, /* B1 = -0.152283 */
8959 2575, /* B0 = 0.078590 */
8960 5, /* Internal filter scaling */
8961 159, /* Minimum in-band energy threshold */
8962 21, /* 21/32 in-band to broad-band ratio */
8963 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8964 },
8965 { /* f300_425[] 16 */
8966 30741, /* A1 = 1.876282 */
8967 -31475, /* A2 = -0.960541 */
8968 -703, /* B2 = -0.021484 */
8969 0, /* B1 = 0 */
8970 703, /* B0 = 0.021484 */
8971 30688, /* A1 = 1.873047 */
8972 -32248, /* A2 = -0.984161 */
8973 14542, /* B2 = 0.443787 */
8974 -13523, /* B1 = -0.825439 */
8975 14542, /* B0 = 0.443817 */
8976 31494, /* A1 = 1.922302 */
8977 -32366, /* A2 = -0.987762 */
8978 21577, /* B2 = 0.658508 */
8979 -21013, /* B1 = -1.282532 */
8980 21577, /* B0 = 0.658508 */
8981 7, /* Internal filter scaling */
8982 159, /* Minimum in-band energy threshold */
8983 21, /* 21/32 in-band to broad-band ratio */
8984 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
8985 },
8986 { /* f330_440[] 17 */
8987 30627, /* A1 = 1.869324 */
8988 -31338, /* A2 = -0.95636 */
8989 -843, /* B2 = -0.025749 */
8990 0, /* B1 = 0 */
8991 843, /* B0 = 0.025749 */
8992 30550, /* A1 = 1.864685 */
8993 -32221, /* A2 = -0.983337 */
8994 13594, /* B2 = 0.414886 */
8995 -12589, /* B1 = -0.768402 */
8996 13594, /* B0 = 0.414886 */
8997 31488, /* A1 = 1.921936 */
8998 -32358, /* A2 = -0.987518 */
8999 24684, /* B2 = 0.753296 */
9000 -24029, /* B1 = -1.466614 */
9001 24684, /* B0 = 0.753296 */
9002 7, /* Internal filter scaling */
9003 159, /* Minimum in-band energy threshold */
9004 21, /* 21/32 in-band to broad-band ratio */
9005 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9006 },
9007 { /* f340 18 */
9008 31546, /* A1 = -1.925476 */
9009 -32646, /* A2 = 0.996277 */
9010 -445, /* B2 = -0.013588 */
9011 0, /* B1 = 0.000000 */
9012 445, /* B0 = 0.013588 */
9013 31551, /* A1 = -1.925781 */
9014 -32713, /* A2 = 0.998352 */
9015 23884, /* B2 = 0.728882 */
9016 -22979, /* B1 = -1.402527 */
9017 23884, /* B0 = 0.728882 */
9018 31606, /* A1 = -1.929138 */
9019 -32715, /* A2 = 0.998413 */
9020 863, /* B2 = 0.026367 */
9021 -835, /* B1 = -0.050985 */
9022 863, /* B0 = 0.026367 */
9023 5, /* Internal filter scaling */
9024 159, /* Minimum in-band energy threshold */
9025 21, /* 21/32 in-band to broad-band ratio */
9026 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9027 },
9028 { /* f350_400[] 19 */
9029 31006, /* A1 = 1.892517 */
9030 -32029, /* A2 = -0.977448 */
9031 -461, /* B2 = -0.014096 */
9032 0, /* B1 = 0 */
9033 461, /* B0 = 0.014096 */
9034 30999, /* A1 = 1.892029 */
9035 -32487, /* A2 = -0.991455 */
9036 11325, /* B2 = 0.345612 */
9037 -10682, /* B1 = -0.651978 */
9038 11325, /* B0 = 0.345612 */
9039 31441, /* A1 = 1.919067 */
9040 -32526, /* A2 = -0.992615 */
9041 24324, /* B2 = 0.74231 */
9042 -23535, /* B1 = -1.436523 */
9043 24324, /* B0 = 0.74231 */
9044 7, /* Internal filter scaling */
9045 159, /* Minimum in-band energy threshold */
9046 21, /* 21/32 in-band to broad-band ratio */
9047 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9048 },
9049 { /* f350_440[] */
9050 30634, /* A1 = 1.869751 */
9051 -31533, /* A2 = -0.962341 */
9052 -680, /* B2 = -0.020782 */
9053 0, /* B1 = 0 */
9054 680, /* B0 = 0.020782 */
9055 30571, /* A1 = 1.865906 */
9056 -32277, /* A2 = -0.985016 */
9057 12894, /* B2 = 0.393524 */
9058 -11945, /* B1 = -0.729065 */
9059 12894, /* B0 = 0.393524 */
9060 31367, /* A1 = 1.91449 */
9061 -32379, /* A2 = -0.988129 */
9062 23820, /* B2 = 0.726929 */
9063 -23104, /* B1 = -1.410217 */
9064 23820, /* B0 = 0.726929 */
9065 7, /* Internal filter scaling */
9066 159, /* Minimum in-band energy threshold */
9067 21, /* 21/32 in-band to broad-band ratio */
9068 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9069 },
9070 { /* f350_450[] */
9071 30552, /* A1 = 1.864807 */
9072 -31434, /* A2 = -0.95929 */
9073 -690, /* B2 = -0.021066 */
9074 0, /* B1 = 0 */
9075 690, /* B0 = 0.021066 */
9076 30472, /* A1 = 1.859924 */
9077 -32248, /* A2 = -0.984161 */
9078 13385, /* B2 = 0.408478 */
9079 -12357, /* B1 = -0.754242 */
9080 13385, /* B0 = 0.408478 */
9081 31358, /* A1 = 1.914001 */
9082 -32366, /* A2 = -0.987732 */
9083 26488, /* B2 = 0.80835 */
9084 -25692, /* B1 = -1.568176 */
9085 26490, /* B0 = 0.808411 */
9086 7, /* Internal filter scaling */
9087 159, /* Minimum in-band energy threshold */
9088 21, /* 21/32 in-band to broad-band ratio */
9089 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9090 },
9091 { /* f360 */
9092 31397, /* A1 = -1.916321 */
9093 -32623, /* A2 = 0.995605 */
9094 -117, /* B2 = -0.003598 */
9095 0, /* B1 = 0.000000 */
9096 117, /* B0 = 0.003598 */
9097 31403, /* A1 = -1.916687 */
9098 -32700, /* A2 = 0.997925 */
9099 3388, /* B2 = 0.103401 */
9100 -3240, /* B1 = -0.197784 */
9101 3388, /* B0 = 0.103401 */
9102 31463, /* A1 = -1.920410 */
9103 -32702, /* A2 = 0.997986 */
9104 13346, /* B2 = 0.407288 */
9105 -12863, /* B1 = -0.785126 */
9106 13346, /* B0 = 0.407288 */
9107 5, /* Internal filter scaling */
9108 159, /* Minimum in-band energy threshold */
9109 21, /* 21/32 in-band to broad-band ratio */
9110 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9111 },
9112 { /* f380_420[] */
9113 30831, /* A1 = 1.881775 */
9114 -32064, /* A2 = -0.978546 */
9115 -367, /* B2 = -0.01122 */
9116 0, /* B1 = 0 */
9117 367, /* B0 = 0.01122 */
9118 30813, /* A1 = 1.880737 */
9119 -32456, /* A2 = -0.990509 */
9120 11068, /* B2 = 0.337769 */
9121 -10338, /* B1 = -0.631042 */
9122 11068, /* B0 = 0.337769 */
9123 31214, /* A1 = 1.905212 */
9124 -32491, /* A2 = -0.991577 */
9125 16374, /* B2 = 0.499695 */
9126 -15781, /* B1 = -0.963196 */
9127 16374, /* B0 = 0.499695 */
9128 7, /* Internal filter scaling */
9129 159, /* Minimum in-band energy threshold */
9130 21, /* 21/32 in-band to broad-band ratio */
9131 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9132 },
9133 { /* f392 */
9134 31152, /* A1 = -1.901428 */
9135 -32613, /* A2 = 0.995300 */
9136 -314, /* B2 = -0.009605 */
9137 0, /* B1 = 0.000000 */
9138 314, /* B0 = 0.009605 */
9139 31156, /* A1 = -1.901672 */
9140 -32694, /* A2 = 0.997742 */
9141 28847, /* B2 = 0.880371 */
9142 -2734, /* B1 = -0.166901 */
9143 28847, /* B0 = 0.880371 */
9144 31225, /* A1 = -1.905823 */
9145 -32696, /* A2 = 0.997803 */
9146 462, /* B2 = 0.014108 */
9147 -442, /* B1 = -0.027019 */
9148 462, /* B0 = 0.014108 */
9149 5, /* Internal filter scaling */
9150 159, /* Minimum in-band energy threshold */
9151 21, /* 21/32 in-band to broad-band ratio */
9152 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9153 },
9154 { /* f400_425[] */
9155 30836, /* A1 = 1.882141 */
9156 -32296, /* A2 = -0.985596 */
9157 -324, /* B2 = -0.009903 */
9158 0, /* B1 = 0 */
9159 324, /* B0 = 0.009903 */
9160 30825, /* A1 = 1.881409 */
9161 -32570, /* A2 = -0.993958 */
9162 16847, /* B2 = 0.51416 */
9163 -15792, /* B1 = -0.963898 */
9164 16847, /* B0 = 0.51416 */
9165 31106, /* A1 = 1.89856 */
9166 -32584, /* A2 = -0.994415 */
9167 9579, /* B2 = 0.292328 */
9168 -9164, /* B1 = -0.559357 */
9169 9579, /* B0 = 0.292328 */
9170 7, /* Internal filter scaling */
9171 159, /* Minimum in-band energy threshold */
9172 21, /* 21/32 in-band to broad-band ratio */
9173 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9174 },
9175 { /* f400_440[] */
9176 30702, /* A1 = 1.873962 */
9177 -32134, /* A2 = -0.980682 */
9178 -517, /* B2 = -0.015793 */
9179 0, /* B1 = 0 */
9180 517, /* B0 = 0.015793 */
9181 30676, /* A1 = 1.872375 */
9182 -32520, /* A2 = -0.992462 */
9183 8144, /* B2 = 0.24855 */
9184 -7596, /* B1 = -0.463684 */
9185 8144, /* B0 = 0.24855 */
9186 31084, /* A1 = 1.897217 */
9187 -32547, /* A2 = -0.993256 */
9188 22713, /* B2 = 0.693176 */
9189 -21734, /* B1 = -1.326599 */
9190 22713, /* B0 = 0.693176 */
9191 7, /* Internal filter scaling */
9192 159, /* Minimum in-band energy threshold */
9193 21, /* 21/32 in-band to broad-band ratio */
9194 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9195 },
9196 { /* f400_450[] */
9197 30613, /* A1 = 1.86853 */
9198 -32031, /* A2 = -0.977509 */
9199 -618, /* B2 = -0.018866 */
9200 0, /* B1 = 0 */
9201 618, /* B0 = 0.018866 */
9202 30577, /* A1 = 1.866272 */
9203 -32491, /* A2 = -0.991577 */
9204 9612, /* B2 = 0.293335 */
9205 -8935, /* B1 = -0.54541 */
9206 9612, /* B0 = 0.293335 */
9207 31071, /* A1 = 1.896484 */
9208 -32524, /* A2 = -0.992584 */
9209 21596, /* B2 = 0.659058 */
9210 -20667, /* B1 = -1.261414 */
9211 21596, /* B0 = 0.659058 */
9212 7, /* Internal filter scaling */
9213 159, /* Minimum in-band energy threshold */
9214 21, /* 21/32 in-band to broad-band ratio */
9215 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9216 },
9217 { /* f420 */
9218 30914, /* A1 = -1.886841 */
9219 -32584, /* A2 = 0.994385 */
9220 -426, /* B2 = -0.013020 */
9221 0, /* B1 = 0.000000 */
9222 426, /* B0 = 0.013020 */
9223 30914, /* A1 = -1.886841 */
9224 -32679, /* A2 = 0.997314 */
9225 17520, /* B2 = 0.534668 */
9226 -16471, /* B1 = -1.005310 */
9227 17520, /* B0 = 0.534668 */
9228 31004, /* A1 = -1.892334 */
9229 -32683, /* A2 = 0.997406 */
9230 819, /* B2 = 0.025023 */
9231 -780, /* B1 = -0.047619 */
9232 819, /* B0 = 0.025023 */
9233 5, /* Internal filter scaling */
9234 159, /* Minimum in-band energy threshold */
9235 21, /* 21/32 in-band to broad-band ratio */
9236 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9237 },
9238#if 0
9239 { /* f425 */
9240 30881, /* A1 = -1.884827 */
9241 -32603, /* A2 = 0.994965 */
9242 -496, /* B2 = -0.015144 */
9243 0, /* B1 = 0.000000 */
9244 496, /* B0 = 0.015144 */
9245 30880, /* A1 = -1.884766 */
9246 -32692, /* A2 = 0.997711 */
9247 24767, /* B2 = 0.755859 */
9248 -23290, /* B1 = -1.421509 */
9249 24767, /* B0 = 0.755859 */
9250 30967, /* A1 = -1.890076 */
9251 -32694, /* A2 = 0.997772 */
9252 728, /* B2 = 0.022232 */
9253 -691, /* B1 = -0.042194 */
9254 728, /* B0 = 0.022232 */
9255 5, /* Internal filter scaling */
9256 159, /* Minimum in-band energy threshold */
9257 21, /* 21/32 in-band to broad-band ratio */
9258 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9259 },
9260#else
9261 {
9262 30850,
9263 -32534,
9264 -504,
9265 0,
9266 504,
9267 30831,
9268 -32669,
9269 24303,
9270 -22080,
9271 24303,
9272 30994,
9273 -32673,
9274 1905,
9275 -1811,
9276 1905,
9277 5,
9278 129,
9279 17,
9280 0xff5
9281 },
9282#endif
9283 { /* f425_450[] */
9284 30646, /* A1 = 1.870544 */
9285 -32327, /* A2 = -0.986572 */
9286 -287, /* B2 = -0.008769 */
9287 0, /* B1 = 0 */
9288 287, /* B0 = 0.008769 */
9289 30627, /* A1 = 1.869324 */
9290 -32607, /* A2 = -0.995087 */
9291 13269, /* B2 = 0.404968 */
9292 -12376, /* B1 = -0.755432 */
9293 13269, /* B0 = 0.404968 */
9294 30924, /* A1 = 1.887512 */
9295 -32619, /* A2 = -0.995453 */
9296 19950, /* B2 = 0.608826 */
9297 -18940, /* B1 = -1.156006 */
9298 19950, /* B0 = 0.608826 */
9299 7, /* Internal filter scaling */
9300 159, /* Minimum in-band energy threshold */
9301 21, /* 21/32 in-band to broad-band ratio */
9302 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9303 },
9304 { /* f425_475[] */
9305 30396, /* A1 = 1.855225 */
9306 -32014, /* A2 = -0.97699 */
9307 -395, /* B2 = -0.012055 */
9308 0, /* B1 = 0 */
9309 395, /* B0 = 0.012055 */
9310 30343, /* A1 = 1.85199 */
9311 -32482, /* A2 = -0.991302 */
9312 17823, /* B2 = 0.543945 */
9313 -16431, /* B1 = -1.002869 */
9314 17823, /* B0 = 0.543945 */
9315 30872, /* A1 = 1.884338 */
9316 -32516, /* A2 = -0.99231 */
9317 18124, /* B2 = 0.553101 */
9318 -17246, /* B1 = -1.052673 */
9319 18124, /* B0 = 0.553101 */
9320 7, /* Internal filter scaling */
9321 159, /* Minimum in-band energy threshold */
9322 21, /* 21/32 in-band to broad-band ratio */
9323 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9324 },
9325 { /* f435 */
9326 30796, /* A1 = -1.879639 */
9327 -32603, /* A2 = 0.994965 */
9328 -254, /* B2 = -0.007762 */
9329 0, /* B1 = 0.000000 */
9330 254, /* B0 = 0.007762 */
9331 30793, /* A1 = -1.879456 */
9332 -32692, /* A2 = 0.997711 */
9333 18934, /* B2 = 0.577820 */
9334 -17751, /* B1 = -1.083496 */
9335 18934, /* B0 = 0.577820 */
9336 30882, /* A1 = -1.884888 */
9337 -32694, /* A2 = 0.997772 */
9338 1858, /* B2 = 0.056713 */
9339 -1758, /* B1 = -0.107357 */
9340 1858, /* B0 = 0.056713 */
9341 5, /* Internal filter scaling */
9342 159, /* Minimum in-band energy threshold */
9343 21, /* 21/32 in-band to broad-band ratio */
9344 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9345 },
9346 { /* f440_450[] */
9347 30641, /* A1 = 1.870239 */
9348 -32458, /* A2 = -0.99057 */
9349 -155, /* B2 = -0.004735 */
9350 0, /* B1 = 0 */
9351 155, /* B0 = 0.004735 */
9352 30631, /* A1 = 1.869568 */
9353 -32630, /* A2 = -0.995789 */
9354 11453, /* B2 = 0.349548 */
9355 -10666, /* B1 = -0.651001 */
9356 11453, /* B0 = 0.349548 */
9357 30810, /* A1 = 1.880554 */
9358 -32634, /* A2 = -0.995941 */
9359 12237, /* B2 = 0.373474 */
9360 -11588, /* B1 = -0.707336 */
9361 12237, /* B0 = 0.373474 */
9362 7, /* Internal filter scaling */
9363 159, /* Minimum in-band energy threshold */
9364 21, /* 21/32 in-band to broad-band ratio */
9365 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9366 },
9367 { /* f440_480[] */
9368 30367, /* A1 = 1.853455 */
9369 -32147, /* A2 = -0.981079 */
9370 -495, /* B2 = -0.015113 */
9371 0, /* B1 = 0 */
9372 495, /* B0 = 0.015113 */
9373 30322, /* A1 = 1.850769 */
9374 -32543, /* A2 = -0.993134 */
9375 10031, /* B2 = 0.306152 */
9376 -9252, /* B1 = -0.564728 */
9377 10031, /* B0 = 0.306152 */
9378 30770, /* A1 = 1.878052 */
9379 -32563, /* A2 = -0.993774 */
9380 22674, /* B2 = 0.691956 */
9381 -21465, /* B1 = -1.31012 */
9382 22674, /* B0 = 0.691956 */
9383 7, /* Internal filter scaling */
9384 159, /* Minimum in-band energy threshold */
9385 21, /* 21/32 in-band to broad-band ratio */
9386 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9387 },
9388 { /* f445 */
9389 30709, /* A1 = -1.874329 */
9390 -32603, /* A2 = 0.994965 */
9391 -83, /* B2 = -0.002545 */
9392 0, /* B1 = 0.000000 */
9393 83, /* B0 = 0.002545 */
9394 30704, /* A1 = -1.874084 */
9395 -32692, /* A2 = 0.997711 */
9396 10641, /* B2 = 0.324738 */
9397 -9947, /* B1 = -0.607147 */
9398 10641, /* B0 = 0.324738 */
9399 30796, /* A1 = -1.879639 */
9400 -32694, /* A2 = 0.997772 */
9401 10079, /* B2 = 0.307587 */
9402 9513, /* B1 = 0.580688 */
9403 10079, /* B0 = 0.307587 */
9404 5, /* Internal filter scaling */
9405 159, /* Minimum in-band energy threshold */
9406 21, /* 21/32 in-band to broad-band ratio */
9407 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9408 },
9409 { /* f450 */
9410 30664, /* A1 = -1.871643 */
9411 -32603, /* A2 = 0.994965 */
9412 -164, /* B2 = -0.005029 */
9413 0, /* B1 = 0.000000 */
9414 164, /* B0 = 0.005029 */
9415 30661, /* A1 = -1.871399 */
9416 -32692, /* A2 = 0.997711 */
9417 15294, /* B2 = 0.466736 */
9418 -14275, /* B1 = -0.871307 */
9419 15294, /* B0 = 0.466736 */
9420 30751, /* A1 = -1.876953 */
9421 -32694, /* A2 = 0.997772 */
9422 3548, /* B2 = 0.108284 */
9423 -3344, /* B1 = -0.204155 */
9424 3548, /* B0 = 0.108284 */
9425 5, /* Internal filter scaling */
9426 159, /* Minimum in-band energy threshold */
9427 21, /* 21/32 in-band to broad-band ratio */
9428 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9429 },
9430 { /* f452 */
9431 30653, /* A1 = -1.870911 */
9432 -32615, /* A2 = 0.995361 */
9433 -209, /* B2 = -0.006382 */
9434 0, /* B1 = 0.000000 */
9435 209, /* B0 = 0.006382 */
9436 30647, /* A1 = -1.870605 */
9437 -32702, /* A2 = 0.997986 */
9438 18971, /* B2 = 0.578979 */
9439 -17716, /* B1 = -1.081299 */
9440 18971, /* B0 = 0.578979 */
9441 30738, /* A1 = -1.876099 */
9442 -32702, /* A2 = 0.998016 */
9443 2967, /* B2 = 0.090561 */
9444 -2793, /* B1 = -0.170502 */
9445 2967, /* B0 = 0.090561 */
9446 5, /* Internal filter scaling */
9447 159, /* Minimum in-band energy threshold */
9448 21, /* 21/32 in-band to broad-band ratio */
9449 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9450 },
9451 { /* f475 */
9452 30437, /* A1 = -1.857727 */
9453 -32603, /* A2 = 0.994965 */
9454 -264, /* B2 = -0.008062 */
9455 0, /* B1 = 0.000000 */
9456 264, /* B0 = 0.008062 */
9457 30430, /* A1 = -1.857300 */
9458 -32692, /* A2 = 0.997711 */
9459 21681, /* B2 = 0.661682 */
9460 -20082, /* B1 = -1.225708 */
9461 21681, /* B0 = 0.661682 */
9462 30526, /* A1 = -1.863220 */
9463 -32694, /* A2 = 0.997742 */
9464 1559, /* B2 = 0.047600 */
9465 -1459, /* B1 = -0.089096 */
9466 1559, /* B0 = 0.047600 */
9467 5, /* Internal filter scaling */
9468 159, /* Minimum in-band energy threshold */
9469 21, /* 21/32 in-band to broad-band ratio */
9470 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9471 },
9472 { /* f480_620[] */
9473 28975, /* A1 = 1.768494 */
9474 -30955, /* A2 = -0.944672 */
9475 -1026, /* B2 = -0.03133 */
9476 0, /* B1 = 0 */
9477 1026, /* B0 = 0.03133 */
9478 28613, /* A1 = 1.746399 */
9479 -32089, /* A2 = -0.979309 */
9480 14214, /* B2 = 0.433807 */
9481 -12202, /* B1 = -0.744812 */
9482 14214, /* B0 = 0.433807 */
9483 30243, /* A1 = 1.845947 */
9484 -32238, /* A2 = -0.983856 */
9485 24825, /* B2 = 0.757629 */
9486 -23402, /* B1 = -1.428345 */
9487 24825, /* B0 = 0.757629 */
9488 7, /* Internal filter scaling */
9489 159, /* Minimum in-band energy threshold */
9490 21, /* 21/32 in-band to broad-band ratio */
9491 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9492 },
9493 { /* f494 */
9494 30257, /* A1 = -1.846741 */
9495 -32605, /* A2 = 0.995056 */
9496 -249, /* B2 = -0.007625 */
9497 0, /* B1 = 0.000000 */
9498 249, /* B0 = 0.007625 */
9499 30247, /* A1 = -1.846191 */
9500 -32694, /* A2 = 0.997772 */
9501 18088, /* B2 = 0.552002 */
9502 -16652, /* B1 = -1.016418 */
9503 18088, /* B0 = 0.552002 */
9504 30348, /* A1 = -1.852295 */
9505 -32696, /* A2 = 0.997803 */
9506 2099, /* B2 = 0.064064 */
9507 -1953, /* B1 = -0.119202 */
9508 2099, /* B0 = 0.064064 */
9509 5, /* Internal filter scaling */
9510 159, /* Minimum in-band energy threshold */
9511 21, /* 21/32 in-band to broad-band ratio */
9512 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9513 },
9514 { /* f500 */
9515 30202, /* A1 = -1.843431 */
9516 -32624, /* A2 = 0.995622 */
9517 -413, /* B2 = -0.012622 */
9518 0, /* B1 = 0.000000 */
9519 413, /* B0 = 0.012622 */
9520 30191, /* A1 = -1.842721 */
9521 -32714, /* A2 = 0.998364 */
9522 25954, /* B2 = 0.792057 */
9523 -23890, /* B1 = -1.458131 */
9524 25954, /* B0 = 0.792057 */
9525 30296, /* A1 = -1.849172 */
9526 -32715, /* A2 = 0.998397 */
9527 2007, /* B2 = 0.061264 */
9528 -1860, /* B1 = -0.113568 */
9529 2007, /* B0 = 0.061264 */
9530 5, /* Internal filter scaling */
9531 159, /* Minimum in-band energy threshold */
9532 21, /* 21/32 in-band to broad-band ratio */
9533 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9534 },
9535 { /* f520 */
9536 30001, /* A1 = -1.831116 */
9537 -32613, /* A2 = 0.995270 */
9538 -155, /* B2 = -0.004750 */
9539 0, /* B1 = 0.000000 */
9540 155, /* B0 = 0.004750 */
9541 29985, /* A1 = -1.830200 */
9542 -32710, /* A2 = 0.998260 */
9543 6584, /* B2 = 0.200928 */
9544 -6018, /* B1 = -0.367355 */
9545 6584, /* B0 = 0.200928 */
9546 30105, /* A1 = -1.837524 */
9547 -32712, /* A2 = 0.998291 */
9548 23812, /* B2 = 0.726685 */
9549 -21936, /* B1 = -1.338928 */
9550 23812, /* B0 = 0.726685 */
9551 5, /* Internal filter scaling */
9552 159, /* Minimum in-band energy threshold */
9553 21, /* 21/32 in-band to broad-band ratio */
9554 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9555 },
9556 { /* f523 */
9557 29964, /* A1 = -1.828918 */
9558 -32601, /* A2 = 0.994904 */
9559 -101, /* B2 = -0.003110 */
9560 0, /* B1 = 0.000000 */
9561 101, /* B0 = 0.003110 */
9562 29949, /* A1 = -1.827942 */
9563 -32700, /* A2 = 0.997925 */
9564 11041, /* B2 = 0.336975 */
9565 -10075, /* B1 = -0.614960 */
9566 11041, /* B0 = 0.336975 */
9567 30070, /* A1 = -1.835388 */
9568 -32702, /* A2 = 0.997986 */
9569 16762, /* B2 = 0.511536 */
9570 -15437, /* B1 = -0.942230 */
9571 16762, /* B0 = 0.511536 */
9572 5, /* Internal filter scaling */
9573 159, /* Minimum in-band energy threshold */
9574 21, /* 21/32 in-band to broad-band ratio */
9575 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9576 },
9577 { /* f525 */
9578 29936, /* A1 = -1.827209 */
9579 -32584, /* A2 = 0.994415 */
9580 -91, /* B2 = -0.002806 */
9581 0, /* B1 = 0.000000 */
9582 91, /* B0 = 0.002806 */
9583 29921, /* A1 = -1.826233 */
9584 -32688, /* A2 = 0.997559 */
9585 11449, /* B2 = 0.349396 */
9586 -10426, /* B1 = -0.636383 */
9587 11449, /* B0 = 0.349396 */
9588 30045, /* A1 = -1.833862 */
9589 -32688, /* A2 = 0.997589 */
9590 13055, /* B2 = 0.398407 */
9591 -12028, /* B1 = -0.734161 */
9592 13055, /* B0 = 0.398407 */
9593 5, /* Internal filter scaling */
9594 159, /* Minimum in-band energy threshold */
9595 21, /* 21/32 in-band to broad-band ratio */
9596 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9597 },
9598 { /* f540_660[] */
9599 28499, /* A1 = 1.739441 */
9600 -31129, /* A2 = -0.949982 */
9601 -849, /* B2 = -0.025922 */
9602 0, /* B1 = 0 */
9603 849, /* B0 = 0.025922 */
9604 28128, /* A1 = 1.716797 */
9605 -32130, /* A2 = -0.98056 */
9606 14556, /* B2 = 0.444214 */
9607 -12251, /* B1 = -0.747772 */
9608 14556, /* B0 = 0.444244 */
9609 29667, /* A1 = 1.81073 */
9610 -32244, /* A2 = -0.984039 */
9611 23038, /* B2 = 0.703064 */
9612 -21358, /* B1 = -1.303589 */
9613 23040, /* B0 = 0.703125 */
9614 7, /* Internal filter scaling */
9615 159, /* Minimum in-band energy threshold */
9616 21, /* 21/32 in-band to broad-band ratio */
9617 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9618 },
9619 { /* f587 */
9620 29271, /* A1 = -1.786560 */
9621 -32599, /* A2 = 0.994873 */
9622 -490, /* B2 = -0.014957 */
9623 0, /* B1 = 0.000000 */
9624 490, /* B0 = 0.014957 */
9625 29246, /* A1 = -1.785095 */
9626 -32700, /* A2 = 0.997925 */
9627 28961, /* B2 = 0.883850 */
9628 -25796, /* B1 = -1.574463 */
9629 28961, /* B0 = 0.883850 */
9630 29383, /* A1 = -1.793396 */
9631 -32700, /* A2 = 0.997955 */
9632 1299, /* B2 = 0.039650 */
9633 -1169, /* B1 = -0.071396 */
9634 1299, /* B0 = 0.039650 */
9635 5, /* Internal filter scaling */
9636 159, /* Minimum in-band energy threshold */
9637 21, /* 21/32 in-band to broad-band ratio */
9638 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9639 },
9640 { /* f590 */
9641 29230, /* A1 = -1.784058 */
9642 -32584, /* A2 = 0.994415 */
9643 -418, /* B2 = -0.012757 */
9644 0, /* B1 = 0.000000 */
9645 418, /* B0 = 0.012757 */
9646 29206, /* A1 = -1.782593 */
9647 -32688, /* A2 = 0.997559 */
9648 36556, /* B2 = 1.115601 */
9649 -32478, /* B1 = -1.982300 */
9650 36556, /* B0 = 1.115601 */
9651 29345, /* A1 = -1.791077 */
9652 -32688, /* A2 = 0.997589 */
9653 897, /* B2 = 0.027397 */
9654 -808, /* B1 = -0.049334 */
9655 897, /* B0 = 0.027397 */
9656 5, /* Internal filter scaling */
9657 159, /* Minimum in-band energy threshold */
9658 21, /* 21/32 in-band to broad-band ratio */
9659 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9660 },
9661 { /* f600 */
9662 29116, /* A1 = -1.777100 */
9663 -32603, /* A2 = 0.994965 */
9664 -165, /* B2 = -0.005039 */
9665 0, /* B1 = 0.000000 */
9666 165, /* B0 = 0.005039 */
9667 29089, /* A1 = -1.775452 */
9668 -32708, /* A2 = 0.998199 */
9669 6963, /* B2 = 0.212494 */
9670 -6172, /* B1 = -0.376770 */
9671 6963, /* B0 = 0.212494 */
9672 29237, /* A1 = -1.784485 */
9673 -32710, /* A2 = 0.998230 */
9674 24197, /* B2 = 0.738464 */
9675 -21657, /* B1 = -1.321899 */
9676 24197, /* B0 = 0.738464 */
9677 5, /* Internal filter scaling */
9678 159, /* Minimum in-band energy threshold */
9679 21, /* 21/32 in-band to broad-band ratio */
9680 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9681 },
9682 { /* f660 */
9683 28376, /* A1 = -1.731934 */
9684 -32567, /* A2 = 0.993896 */
9685 -363, /* B2 = -0.011102 */
9686 0, /* B1 = 0.000000 */
9687 363, /* B0 = 0.011102 */
9688 28337, /* A1 = -1.729614 */
9689 -32683, /* A2 = 0.997434 */
9690 21766, /* B2 = 0.664246 */
9691 -18761, /* B1 = -1.145081 */
9692 21766, /* B0 = 0.664246 */
9693 28513, /* A1 = -1.740356 */
9694 -32686, /* A2 = 0.997498 */
9695 2509, /* B2 = 0.076584 */
9696 -2196, /* B1 = -0.134041 */
9697 2509, /* B0 = 0.076584 */
9698 5, /* Internal filter scaling */
9699 159, /* Minimum in-band energy threshold */
9700 21, /* 21/32 in-band to broad-band ratio */
9701 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9702 },
9703 { /* f700 */
9704 27844, /* A1 = -1.699463 */
9705 -32563, /* A2 = 0.993744 */
9706 -366, /* B2 = -0.011187 */
9707 0, /* B1 = 0.000000 */
9708 366, /* B0 = 0.011187 */
9709 27797, /* A1 = -1.696655 */
9710 -32686, /* A2 = 0.997498 */
9711 22748, /* B2 = 0.694214 */
9712 -19235, /* B1 = -1.174072 */
9713 22748, /* B0 = 0.694214 */
9714 27995, /* A1 = -1.708740 */
9715 -32688, /* A2 = 0.997559 */
9716 2964, /* B2 = 0.090477 */
9717 -2546, /* B1 = -0.155449 */
9718 2964, /* B0 = 0.090477 */
9719 5, /* Internal filter scaling */
9720 159, /* Minimum in-band energy threshold */
9721 21, /* 21/32 in-band to broad-band ratio */
9722 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9723 },
9724 { /* f740 */
9725 27297, /* A1 = -1.666077 */
9726 -32551, /* A2 = 0.993408 */
9727 -345, /* B2 = -0.010540 */
9728 0, /* B1 = 0.000000 */
9729 345, /* B0 = 0.010540 */
9730 27240, /* A1 = -1.662598 */
9731 -32683, /* A2 = 0.997406 */
9732 22560, /* B2 = 0.688477 */
9733 -18688, /* B1 = -1.140625 */
9734 22560, /* B0 = 0.688477 */
9735 27461, /* A1 = -1.676147 */
9736 -32684, /* A2 = 0.997467 */
9737 3541, /* B2 = 0.108086 */
9738 -2985, /* B1 = -0.182220 */
9739 3541, /* B0 = 0.108086 */
9740 5, /* Internal filter scaling */
9741 159, /* Minimum in-band energy threshold */
9742 21, /* 21/32 in-band to broad-band ratio */
9743 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9744 },
9745 { /* f750 */
9746 27155, /* A1 = -1.657410 */
9747 -32551, /* A2 = 0.993408 */
9748 -462, /* B2 = -0.014117 */
9749 0, /* B1 = 0.000000 */
9750 462, /* B0 = 0.014117 */
9751 27097, /* A1 = -1.653870 */
9752 -32683, /* A2 = 0.997406 */
9753 32495, /* B2 = 0.991699 */
9754 -26776, /* B1 = -1.634338 */
9755 32495, /* B0 = 0.991699 */
9756 27321, /* A1 = -1.667542 */
9757 -32684, /* A2 = 0.997467 */
9758 1835, /* B2 = 0.056007 */
9759 -1539, /* B1 = -0.093948 */
9760 1835, /* B0 = 0.056007 */
9761 5, /* Internal filter scaling */
9762 159, /* Minimum in-band energy threshold */
9763 21, /* 21/32 in-band to broad-band ratio */
9764 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9765 },
9766 { /* f750_1450[] */
9767 19298, /* A1 = 1.177917 */
9768 -24471, /* A2 = -0.746796 */
9769 -4152, /* B2 = -0.126709 */
9770 0, /* B1 = 0 */
9771 4152, /* B0 = 0.126709 */
9772 12902, /* A1 = 0.787476 */
9773 -29091, /* A2 = -0.887817 */
9774 12491, /* B2 = 0.38121 */
9775 -1794, /* B1 = -0.109528 */
9776 12494, /* B0 = 0.381317 */
9777 26291, /* A1 = 1.604736 */
9778 -30470, /* A2 = -0.929901 */
9779 28859, /* B2 = 0.880737 */
9780 -26084, /* B1 = -1.592102 */
9781 28861, /* B0 = 0.880798 */
9782 7, /* Internal filter scaling */
9783 159, /* Minimum in-band energy threshold */
9784 21, /* 21/32 in-band to broad-band ratio */
9785 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9786 },
9787 { /* f770 */
9788 26867, /* A1 = -1.639832 */
9789 -32551, /* A2 = 0.993408 */
9790 -123, /* B2 = -0.003755 */
9791 0, /* B1 = 0.000000 */
9792 123, /* B0 = 0.003755 */
9793 26805, /* A1 = -1.636108 */
9794 -32683, /* A2 = 0.997406 */
9795 17297, /* B2 = 0.527863 */
9796 -14096, /* B1 = -0.860382 */
9797 17297, /* B0 = 0.527863 */
9798 27034, /* A1 = -1.650085 */
9799 -32684, /* A2 = 0.997467 */
9800 12958, /* B2 = 0.395477 */
9801 -10756, /* B1 = -0.656525 */
9802 12958, /* B0 = 0.395477 */
9803 5, /* Internal filter scaling */
9804 159, /* Minimum in-band energy threshold */
9805 21, /* 21/32 in-band to broad-band ratio */
9806 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9807 },
9808 { /* f800 */
9809 26413, /* A1 = -1.612122 */
9810 -32547, /* A2 = 0.993286 */
9811 -223, /* B2 = -0.006825 */
9812 0, /* B1 = 0.000000 */
9813 223, /* B0 = 0.006825 */
9814 26342, /* A1 = -1.607849 */
9815 -32686, /* A2 = 0.997498 */
9816 6391, /* B2 = 0.195053 */
9817 -5120, /* B1 = -0.312531 */
9818 6391, /* B0 = 0.195053 */
9819 26593, /* A1 = -1.623108 */
9820 -32688, /* A2 = 0.997559 */
9821 23681, /* B2 = 0.722717 */
9822 -19328, /* B1 = -1.179688 */
9823 23681, /* B0 = 0.722717 */
9824 5, /* Internal filter scaling */
9825 159, /* Minimum in-band energy threshold */
9826 21, /* 21/32 in-band to broad-band ratio */
9827 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9828 },
9829 { /* f816 */
9830 26168, /* A1 = -1.597209 */
9831 -32528, /* A2 = 0.992706 */
9832 -235, /* B2 = -0.007182 */
9833 0, /* B1 = 0.000000 */
9834 235, /* B0 = 0.007182 */
9835 26092, /* A1 = -1.592590 */
9836 -32675, /* A2 = 0.997192 */
9837 20823, /* B2 = 0.635498 */
9838 -16510, /* B1 = -1.007751 */
9839 20823, /* B0 = 0.635498 */
9840 26363, /* A1 = -1.609070 */
9841 -32677, /* A2 = 0.997253 */
9842 6739, /* B2 = 0.205688 */
9843 -5459, /* B1 = -0.333206 */
9844 6739, /* B0 = 0.205688 */
9845 5, /* Internal filter scaling */
9846 159, /* Minimum in-band energy threshold */
9847 21, /* 21/32 in-band to broad-band ratio */
9848 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9849 },
9850 { /* f850 */
9851 25641, /* A1 = -1.565063 */
9852 -32536, /* A2 = 0.992950 */
9853 -121, /* B2 = -0.003707 */
9854 0, /* B1 = 0.000000 */
9855 121, /* B0 = 0.003707 */
9856 25560, /* A1 = -1.560059 */
9857 -32684, /* A2 = 0.997437 */
9858 18341, /* B2 = 0.559753 */
9859 -14252, /* B1 = -0.869904 */
9860 18341, /* B0 = 0.559753 */
9861 25837, /* A1 = -1.577026 */
9862 -32684, /* A2 = 0.997467 */
9863 16679, /* B2 = 0.509003 */
9864 -13232, /* B1 = -0.807648 */
9865 16679, /* B0 = 0.509003 */
9866 5, /* Internal filter scaling */
9867 159, /* Minimum in-band energy threshold */
9868 21, /* 21/32 in-band to broad-band ratio */
9869 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9870 },
9871 { /* f857_1645[] */
9872 16415, /* A1 = 1.001953 */
9873 -23669, /* A2 = -0.722321 */
9874 -4549, /* B2 = -0.138847 */
9875 0, /* B1 = 0 */
9876 4549, /* B0 = 0.138847 */
9877 8456, /* A1 = 0.516174 */
9878 -28996, /* A2 = -0.884918 */
9879 13753, /* B2 = 0.419724 */
9880 -12, /* B1 = -0.000763 */
9881 13757, /* B0 = 0.419846 */
9882 24632, /* A1 = 1.503418 */
9883 -30271, /* A2 = -0.923828 */
9884 29070, /* B2 = 0.887146 */
9885 -25265, /* B1 = -1.542114 */
9886 29073, /* B0 = 0.887268 */
9887 7, /* Internal filter scaling */
9888 159, /* Minimum in-band energy threshold */
9889 21, /* 21/32 in-band to broad-band ratio */
9890 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9891 },
9892 { /* f900 */
9893 24806, /* A1 = -1.514099 */
9894 -32501, /* A2 = 0.991852 */
9895 -326, /* B2 = -0.009969 */
9896 0, /* B1 = 0.000000 */
9897 326, /* B0 = 0.009969 */
9898 24709, /* A1 = -1.508118 */
9899 -32659, /* A2 = 0.996674 */
9900 20277, /* B2 = 0.618835 */
9901 -15182, /* B1 = -0.926636 */
9902 20277, /* B0 = 0.618835 */
9903 25022, /* A1 = -1.527222 */
9904 -32661, /* A2 = 0.996735 */
9905 4320, /* B2 = 0.131836 */
9906 -3331, /* B1 = -0.203339 */
9907 4320, /* B0 = 0.131836 */
9908 5, /* Internal filter scaling */
9909 159, /* Minimum in-band energy threshold */
9910 21, /* 21/32 in-band to broad-band ratio */
9911 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9912 },
9913 { /* f900_1300[] */
9914 19776, /* A1 = 1.207092 */
9915 -27437, /* A2 = -0.837341 */
9916 -2666, /* B2 = -0.081371 */
9917 0, /* B1 = 0 */
9918 2666, /* B0 = 0.081371 */
9919 16302, /* A1 = 0.995026 */
9920 -30354, /* A2 = -0.926361 */
9921 10389, /* B2 = 0.317062 */
9922 -3327, /* B1 = -0.203064 */
9923 10389, /* B0 = 0.317062 */
9924 24299, /* A1 = 1.483154 */
9925 -30930, /* A2 = -0.943909 */
9926 25016, /* B2 = 0.763428 */
9927 -21171, /* B1 = -1.292236 */
9928 25016, /* B0 = 0.763428 */
9929 7, /* Internal filter scaling */
9930 159, /* Minimum in-band energy threshold */
9931 21, /* 21/32 in-band to broad-band ratio */
9932 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9933 },
9934 { /* f935_1215[] */
9935 20554, /* A1 = 1.254517 */
9936 -28764, /* A2 = -0.877838 */
9937 -2048, /* B2 = -0.062515 */
9938 0, /* B1 = 0 */
9939 2048, /* B0 = 0.062515 */
9940 18209, /* A1 = 1.11145 */
9941 -30951, /* A2 = -0.94458 */
9942 9390, /* B2 = 0.286575 */
9943 -3955, /* B1 = -0.241455 */
9944 9390, /* B0 = 0.286575 */
9945 23902, /* A1 = 1.458923 */
9946 -31286, /* A2 = -0.954803 */
9947 23252, /* B2 = 0.709595 */
9948 -19132, /* B1 = -1.167725 */
9949 23252, /* B0 = 0.709595 */
9950 7, /* Internal filter scaling */
9951 159, /* Minimum in-band energy threshold */
9952 21, /* 21/32 in-band to broad-band ratio */
9953 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9954 },
9955 { /* f941_1477[] */
9956 17543, /* A1 = 1.07074 */
9957 -26220, /* A2 = -0.800201 */
9958 -3298, /* B2 = -0.100647 */
9959 0, /* B1 = 0 */
9960 3298, /* B0 = 0.100647 */
9961 12423, /* A1 = 0.75827 */
9962 -30036, /* A2 = -0.916626 */
9963 12651, /* B2 = 0.386078 */
9964 -2444, /* B1 = -0.14917 */
9965 12653, /* B0 = 0.386154 */
9966 23518, /* A1 = 1.435425 */
9967 -30745, /* A2 = -0.938293 */
9968 27282, /* B2 = 0.832581 */
9969 -22529, /* B1 = -1.375122 */
9970 27286, /* B0 = 0.832703 */
9971 7, /* Internal filter scaling */
9972 159, /* Minimum in-band energy threshold */
9973 21, /* 21/32 in-band to broad-band ratio */
9974 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9975 },
9976 { /* f942 */
9977 24104, /* A1 = -1.471252 */
9978 -32507, /* A2 = 0.992065 */
9979 -351, /* B2 = -0.010722 */
9980 0, /* B1 = 0.000000 */
9981 351, /* B0 = 0.010722 */
9982 23996, /* A1 = -1.464600 */
9983 -32671, /* A2 = 0.997040 */
9984 22848, /* B2 = 0.697266 */
9985 -16639, /* B1 = -1.015564 */
9986 22848, /* B0 = 0.697266 */
9987 24332, /* A1 = -1.485168 */
9988 -32673, /* A2 = 0.997101 */
9989 4906, /* B2 = 0.149727 */
9990 -3672, /* B1 = -0.224174 */
9991 4906, /* B0 = 0.149727 */
9992 5, /* Internal filter scaling */
9993 159, /* Minimum in-band energy threshold */
9994 21, /* 21/32 in-band to broad-band ratio */
9995 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
9996 },
9997 { /* f950 */
9998 23967, /* A1 = -1.462830 */
9999 -32507, /* A2 = 0.992065 */
10000 -518, /* B2 = -0.015821 */
10001 0, /* B1 = 0.000000 */
10002 518, /* B0 = 0.015821 */
10003 23856, /* A1 = -1.456055 */
10004 -32671, /* A2 = 0.997040 */
10005 26287, /* B2 = 0.802246 */
10006 -19031, /* B1 = -1.161560 */
10007 26287, /* B0 = 0.802246 */
10008 24195, /* A1 = -1.476746 */
10009 -32673, /* A2 = 0.997101 */
10010 2890, /* B2 = 0.088196 */
10011 -2151, /* B1 = -0.131317 */
10012 2890, /* B0 = 0.088196 */
10013 5, /* Internal filter scaling */
10014 159, /* Minimum in-band energy threshold */
10015 21, /* 21/32 in-band to broad-band ratio */
10016 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10017 },
10018 { /* f950_1400[] */
10019 18294, /* A1 = 1.116638 */
10020 -26962, /* A2 = -0.822845 */
10021 -2914, /* B2 = -0.088936 */
10022 0, /* B1 = 0 */
10023 2914, /* B0 = 0.088936 */
10024 14119, /* A1 = 0.861786 */
10025 -30227, /* A2 = -0.922455 */
10026 11466, /* B2 = 0.349945 */
10027 -2833, /* B1 = -0.172943 */
10028 11466, /* B0 = 0.349945 */
10029 23431, /* A1 = 1.430115 */
10030 -30828, /* A2 = -0.940796 */
10031 25331, /* B2 = 0.773071 */
10032 -20911, /* B1 = -1.276367 */
10033 25331, /* B0 = 0.773071 */
10034 7, /* Internal filter scaling */
10035 159, /* Minimum in-band energy threshold */
10036 21, /* 21/32 in-band to broad-band ratio */
10037 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10038 },
10039 { /* f975 */
10040 23521, /* A1 = -1.435608 */
10041 -32489, /* A2 = 0.991516 */
10042 -193, /* B2 = -0.005915 */
10043 0, /* B1 = 0.000000 */
10044 193, /* B0 = 0.005915 */
10045 23404, /* A1 = -1.428467 */
10046 -32655, /* A2 = 0.996582 */
10047 17740, /* B2 = 0.541412 */
10048 -12567, /* B1 = -0.767029 */
10049 17740, /* B0 = 0.541412 */
10050 23753, /* A1 = -1.449829 */
10051 -32657, /* A2 = 0.996613 */
10052 9090, /* B2 = 0.277405 */
10053 -6662, /* B1 = -0.406647 */
10054 9090, /* B0 = 0.277405 */
10055 5, /* Internal filter scaling */
10056 159, /* Minimum in-band energy threshold */
10057 21, /* 21/32 in-band to broad-band ratio */
10058 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10059 },
10060 { /* f1000 */
10061 23071, /* A1 = -1.408203 */
10062 -32489, /* A2 = 0.991516 */
10063 -293, /* B2 = -0.008965 */
10064 0, /* B1 = 0.000000 */
10065 293, /* B0 = 0.008965 */
10066 22951, /* A1 = -1.400818 */
10067 -32655, /* A2 = 0.996582 */
10068 5689, /* B2 = 0.173645 */
10069 -3951, /* B1 = -0.241150 */
10070 5689, /* B0 = 0.173645 */
10071 23307, /* A1 = -1.422607 */
10072 -32657, /* A2 = 0.996613 */
10073 18692, /* B2 = 0.570435 */
10074 -13447, /* B1 = -0.820770 */
10075 18692, /* B0 = 0.570435 */
10076 5, /* Internal filter scaling */
10077 159, /* Minimum in-band energy threshold */
10078 21, /* 21/32 in-band to broad-band ratio */
10079 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10080 },
10081 { /* f1020 */
10082 22701, /* A1 = -1.385620 */
10083 -32474, /* A2 = 0.991058 */
10084 -292, /* B2 = -0.008933 */
10085 0, /*163840 , B1 = 10.000000 */
10086 292, /* B0 = 0.008933 */
10087 22564, /* A1 = -1.377258 */
10088 -32655, /* A2 = 0.996552 */
10089 20756, /* B2 = 0.633423 */
10090 -14176, /* B1 = -0.865295 */
10091 20756, /* B0 = 0.633423 */
10092 22960, /* A1 = -1.401428 */
10093 -32657, /* A2 = 0.996613 */
10094 6520, /* B2 = 0.198990 */
10095 -4619, /* B1 = -0.281937 */
10096 6520, /* B0 = 0.198990 */
10097 5, /* Internal filter scaling */
10098 159, /* Minimum in-band energy threshold */
10099 21, /* 21/32 in-band to broad-band ratio */
10100 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10101 },
10102 { /* f1050 */
10103 22142, /* A1 = -1.351501 */
10104 -32474, /* A2 = 0.991058 */
10105 -147, /* B2 = -0.004493 */
10106 0, /* B1 = 0.000000 */
10107 147, /* B0 = 0.004493 */
10108 22000, /* A1 = -1.342834 */
10109 -32655, /* A2 = 0.996552 */
10110 15379, /* B2 = 0.469360 */
10111 -10237, /* B1 = -0.624847 */
10112 15379, /* B0 = 0.469360 */
10113 22406, /* A1 = -1.367554 */
10114 -32657, /* A2 = 0.996613 */
10115 17491, /* B2 = 0.533783 */
10116 -12096, /* B1 = -0.738312 */
10117 17491, /* B0 = 0.533783 */
10118 5, /* Internal filter scaling */
10119 159, /* Minimum in-band energy threshold */
10120 21, /* 21/32 in-band to broad-band ratio */
10121 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10122 },
10123 { /* f1100_1750[] */
10124 12973, /* A1 = 0.79184 */
10125 -24916, /* A2 = -0.760376 */
10126 6655, /* B2 = 0.203102 */
10127 367, /* B1 = 0.0224 */
10128 6657, /* B0 = 0.203171 */
10129 5915, /* A1 = 0.361053 */
10130 -29560, /* A2 = -0.90213 */
10131 -7777, /* B2 = -0.23735 */
10132 0, /* B1 = 0 */
10133 7777, /* B0 = 0.23735 */
10134 20510, /* A1 = 1.251892 */
10135 -30260, /* A2 = -0.923462 */
10136 26662, /* B2 = 0.81366 */
10137 -20573, /* B1 = -1.255737 */
10138 26668, /* B0 = 0.813843 */
10139 7, /* Internal filter scaling */
10140 159, /* Minimum in-band energy threshold */
10141 21, /* 21/32 in-band to broad-band ratio */
10142 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10143 },
10144 { /* f1140 */
10145 20392, /* A1 = -1.244629 */
10146 -32460, /* A2 = 0.990601 */
10147 -270, /* B2 = -0.008240 */
10148 0, /* B1 = 0.000000 */
10149 270, /* B0 = 0.008240 */
10150 20218, /* A1 = -1.234009 */
10151 -32655, /* A2 = 0.996582 */
10152 21337, /* B2 = 0.651154 */
10153 -13044, /* B1 = -0.796143 */
10154 21337, /* B0 = 0.651154 */
10155 20684, /* A1 = -1.262512 */
10156 -32657, /* A2 = 0.996643 */
10157 8572, /* B2 = 0.261612 */
10158 -5476, /* B1 = -0.334244 */
10159 8572, /* B0 = 0.261612 */
10160 5, /* Internal filter scaling */
10161 159, /* Minimum in-band energy threshold */
10162 21, /* 21/32 in-band to broad-band ratio */
10163 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10164 },
10165 { /* f1200 */
10166 19159, /* A1 = -1.169373 */
10167 -32456, /* A2 = 0.990509 */
10168 -335, /* B2 = -0.010252 */
10169 0, /* B1 = 0.000000 */
10170 335, /* B0 = 0.010252 */
10171 18966, /* A1 = -1.157593 */
10172 -32661, /* A2 = 0.996735 */
10173 6802, /* B2 = 0.207588 */
10174 -3900, /* B1 = -0.238098 */
10175 6802, /* B0 = 0.207588 */
10176 19467, /* A1 = -1.188232 */
10177 -32661, /* A2 = 0.996765 */
10178 25035, /* B2 = 0.764008 */
10179 -15049, /* B1 = -0.918579 */
10180 25035, /* B0 = 0.764008 */
10181 5, /* Internal filter scaling */
10182 159, /* Minimum in-band energy threshold */
10183 21, /* 21/32 in-band to broad-band ratio */
10184 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10185 },
10186 { /* f1209 */
10187 18976, /* A1 = -1.158264 */
10188 -32439, /* A2 = 0.989990 */
10189 -183, /* B2 = -0.005588 */
10190 0, /* B1 = 0.000000 */
10191 183, /* B0 = 0.005588 */
10192 18774, /* A1 = -1.145874 */
10193 -32650, /* A2 = 0.996429 */
10194 15468, /* B2 = 0.472076 */
10195 -8768, /* B1 = -0.535217 */
10196 15468, /* B0 = 0.472076 */
10197 19300, /* A1 = -1.177979 */
10198 -32652, /* A2 = 0.996490 */
10199 19840, /* B2 = 0.605499 */
10200 -11842, /* B1 = -0.722809 */
10201 19840, /* B0 = 0.605499 */
10202 5, /* Internal filter scaling */
10203 159, /* Minimum in-band energy threshold */
10204 21, /* 21/32 in-band to broad-band ratio */
10205 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10206 },
10207 { /* f1330 */
10208 16357, /* A1 = -0.998413 */
10209 -32368, /* A2 = 0.987793 */
10210 -217, /* B2 = -0.006652 */
10211 0, /* B1 = 0.000000 */
10212 217, /* B0 = 0.006652 */
10213 16107, /* A1 = -0.983126 */
10214 -32601, /* A2 = 0.994904 */
10215 11602, /* B2 = 0.354065 */
10216 -5555, /* B1 = -0.339111 */
10217 11602, /* B0 = 0.354065 */
10218 16722, /* A1 = -1.020630 */
10219 -32603, /* A2 = 0.994965 */
10220 15574, /* B2 = 0.475311 */
10221 -8176, /* B1 = -0.499069 */
10222 15574, /* B0 = 0.475311 */
10223 5, /* Internal filter scaling */
10224 159, /* Minimum in-band energy threshold */
10225 21, /* 21/32 in-band to broad-band ratio */
10226 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10227 },
10228 { /* f1336 */
10229 16234, /* A1 = -0.990875 */
10230 32404, /* A2 = -0.988922 */
10231 -193, /* B2 = -0.005908 */
10232 0, /* B1 = 0.000000 */
10233 193, /* B0 = 0.005908 */
10234 15986, /* A1 = -0.975769 */
10235 -32632, /* A2 = 0.995880 */
10236 18051, /* B2 = 0.550903 */
10237 -8658, /* B1 = -0.528473 */
10238 18051, /* B0 = 0.550903 */
10239 16591, /* A1 = -1.012695 */
10240 -32634, /* A2 = 0.995941 */
10241 15736, /* B2 = 0.480240 */
10242 -8125, /* B1 = -0.495926 */
10243 15736, /* B0 = 0.480240 */
10244 5, /* Internal filter scaling */
10245 159, /* Minimum in-band energy threshold */
10246 21, /* 21/32 in-band to broad-band ratio */
10247 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10248 },
10249 { /* f1366 */
10250 15564, /* A1 = -0.949982 */
10251 -32404, /* A2 = 0.988922 */
10252 -269, /* B2 = -0.008216 */
10253 0, /* B1 = 0.000000 */
10254 269, /* B0 = 0.008216 */
10255 15310, /* A1 = -0.934479 */
10256 -32632, /* A2 = 0.995880 */
10257 10815, /* B2 = 0.330063 */
10258 -4962, /* B1 = -0.302887 */
10259 10815, /* B0 = 0.330063 */
10260 15924, /* A1 = -0.971924 */
10261 -32634, /* A2 = 0.995941 */
10262 18880, /* B2 = 0.576172 */
10263 -9364, /* B1 = -0.571594 */
10264 18880, /* B0 = 0.576172 */
10265 5, /* Internal filter scaling */
10266 159, /* Minimum in-band energy threshold */
10267 21, /* 21/32 in-band to broad-band ratio */
10268 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10269 },
10270 { /* f1380 */
10271 15247, /* A1 = -0.930603 */
10272 -32397, /* A2 = 0.988708 */
10273 -244, /* B2 = -0.007451 */
10274 0, /* B1 = 0.000000 */
10275 244, /* B0 = 0.007451 */
10276 14989, /* A1 = -0.914886 */
10277 -32627, /* A2 = 0.995697 */
10278 18961, /* B2 = 0.578644 */
10279 -8498, /* B1 = -0.518707 */
10280 18961, /* B0 = 0.578644 */
10281 15608, /* A1 = -0.952667 */
10282 -32628, /* A2 = 0.995758 */
10283 11145, /* B2 = 0.340134 */
10284 -5430, /* B1 = -0.331467 */
10285 11145, /* B0 = 0.340134 */
10286 5, /* Internal filter scaling */
10287 159, /* Minimum in-band energy threshold */
10288 21, /* 21/32 in-band to broad-band ratio */
10289 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10290 },
10291 { /* f1400 */
10292 14780, /* A1 = -0.902130 */
10293 -32393, /* A2 = 0.988586 */
10294 -396, /* B2 = -0.012086 */
10295 0, /* B1 = 0.000000 */
10296 396, /* B0 = 0.012086 */
10297 14510, /* A1 = -0.885651 */
10298 -32630, /* A2 = 0.995819 */
10299 6326, /* B2 = 0.193069 */
10300 -2747, /* B1 = -0.167671 */
10301 6326, /* B0 = 0.193069 */
10302 15154, /* A1 = -0.924957 */
10303 -32632, /* A2 = 0.995850 */
10304 23235, /* B2 = 0.709076 */
10305 -10983, /* B1 = -0.670380 */
10306 23235, /* B0 = 0.709076 */
10307 5, /* Internal filter scaling */
10308 159, /* Minimum in-band energy threshold */
10309 21, /* 21/32 in-band to broad-band ratio */
10310 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10311 },
10312 { /* f1477 */
10313 13005, /* A1 = -0.793793 */
10314 -32368, /* A2 = 0.987823 */
10315 -500, /* B2 = -0.015265 */
10316 0, /* B1 = 0.000000 */
10317 500, /* B0 = 0.015265 */
10318 12708, /* A1 = -0.775665 */
10319 -32615, /* A2 = 0.995331 */
10320 11420, /* B2 = 0.348526 */
10321 -4306, /* B1 = -0.262833 */
10322 11420, /* B0 = 0.348526 */
10323 13397, /* A1 = -0.817688 */
10324 -32615, /* A2 = 0.995361 */
10325 9454, /* B2 = 0.288528 */
10326 -3981, /* B1 = -0.243027 */
10327 9454, /* B0 = 0.288528 */
10328 5, /* Internal filter scaling */
10329 159, /* Minimum in-band energy threshold */
10330 21, /* 21/32 in-band to broad-band ratio */
10331 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10332 },
10333 { /* f1600 */
10334 10046, /* A1 = -0.613190 */
10335 -32331, /* A2 = 0.986694 */
10336 -455, /* B2 = -0.013915 */
10337 0, /* B1 = 0.000000 */
10338 455, /* B0 = 0.013915 */
10339 9694, /* A1 = -0.591705 */
10340 -32601, /* A2 = 0.994934 */
10341 6023, /* B2 = 0.183815 */
10342 -1708, /* B1 = -0.104279 */
10343 6023, /* B0 = 0.183815 */
10344 10478, /* A1 = -0.639587 */
10345 -32603, /* A2 = 0.994965 */
10346 22031, /* B2 = 0.672333 */
10347 -7342, /* B1 = -0.448151 */
10348 22031, /* B0 = 0.672333 */
10349 5, /* Internal filter scaling */
10350 159, /* Minimum in-band energy threshold */
10351 21, /* 21/32 in-band to broad-band ratio */
10352 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10353 },
10354 { /* f1633_1638[] */
10355 9181, /* A1 = 0.560394 */
10356 -32256, /* A2 = -0.984375 */
10357 -556, /* B2 = -0.016975 */
10358 0, /* B1 = 0 */
10359 556, /* B0 = 0.016975 */
10360 8757, /* A1 = 0.534515 */
10361 -32574, /* A2 = -0.99408 */
10362 8443, /* B2 = 0.25769 */
10363 -2135, /* B1 = -0.130341 */
10364 8443, /* B0 = 0.25769 */
10365 9691, /* A1 = 0.591522 */
10366 -32574, /* A2 = -0.99411 */
10367 15446, /* B2 = 0.471375 */
10368 -4809, /* B1 = -0.293579 */
10369 15446, /* B0 = 0.471375 */
10370 7, /* Internal filter scaling */
10371 159, /* Minimum in-band energy threshold */
10372 21, /* 21/32 in-band to broad-band ratio */
10373 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10374 },
10375 { /* f1800 */
10376 5076, /* A1 = -0.309875 */
10377 -32304, /* A2 = 0.985840 */
10378 -508, /* B2 = -0.015503 */
10379 0, /* B1 = 0.000000 */
10380 508, /* B0 = 0.015503 */
10381 4646, /* A1 = -0.283600 */
10382 -32605, /* A2 = 0.995026 */
10383 6742, /* B2 = 0.205780 */
10384 -878, /* B1 = -0.053635 */
10385 6742, /* B0 = 0.205780 */
10386 5552, /* A1 = -0.338928 */
10387 -32605, /* A2 = 0.995056 */
10388 23667, /* B2 = 0.722260 */
10389 -4297, /* B1 = -0.262329 */
10390 23667, /* B0 = 0.722260 */
10391 5, /* Internal filter scaling */
10392 159, /* Minimum in-band energy threshold */
10393 21, /* 21/32 in-band to broad-band ratio */
10394 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10395 },
10396 { /* f1860 */
10397 3569, /* A1 = -0.217865 */
10398 -32292, /* A2 = 0.985504 */
10399 -239, /* B2 = -0.007322 */
10400 0, /* B1 = 0.000000 */
10401 239, /* B0 = 0.007322 */
10402 3117, /* A1 = -0.190277 */
10403 -32603, /* A2 = 0.994965 */
10404 18658, /* B2 = 0.569427 */
10405 -1557, /* B1 = -0.095032 */
10406 18658, /* B0 = 0.569427 */
10407 4054, /* A1 = -0.247437 */
10408 -32603, /* A2 = 0.994965 */
10409 18886, /* B2 = 0.576385 */
10410 -2566, /* B1 = -0.156647 */
10411 18886, /* B0 = 0.576385 */
10412 5, /* Internal filter scaling */
10413 159, /* Minimum in-band energy threshold */
10414 21, /* 21/32 in-band to broad-band ratio */
10415 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
10416 },
10417};
10418static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
10419{
10420 unsigned short cmd;
10421 int cnt, max;
10422
10423 if (jf->filter > 3) {
10424 return -1;
10425 }
10426 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) /* Select Filter */
10427
10428 return -1;
10429 if (!jf->enable) {
10430 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10431
10432 return -1;
10433 else
10434 return 0;
10435 } else {
10436 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10437
10438 return -1;
10439 /* Select the filter (f0 - f3) to use. */
10440 if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
10441 return -1;
10442 }
10443 if (jf->freq < 12 && jf->freq > 3) {
10444 /* Select the frequency for the selected filter. */
10445 if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
10446 return -1;
10447 } else if (jf->freq > 11) {
10448 /* We need to load a programmable filter set for undefined */
10449 /* frequencies. So we will point the filter to a programmable set. */
10450 /* Since there are only 4 filters and 4 programmable sets, we will */
10451 /* just point the filter to the same number set and program it for the */
10452 /* frequency we want. */
10453 if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
10454 return -1;
10455 if (j->ver.low != 0x12) {
10456 cmd = 0x515B;
10457 max = 19;
10458 } else {
10459 cmd = 0x515E;
10460 max = 15;
10461 }
10462 if (ixj_WriteDSPCommand(cmd, j))
10463 return -1;
10464 for (cnt = 0; cnt < max; cnt++) {
10465 if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
10466 return -1;
10467 }
10468 }
10469 j->filter_en[jf->filter] = jf->enable;
10470 return 0;
10471}
10472
10473static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
10474{
10475 unsigned short cmd;
10476 int cnt, max;
10477 if (jfr->filter > 3) {
10478 return -1;
10479 }
10480 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) /* Select Filter */
10481 return -1;
10482
10483 if (!jfr->enable) {
10484 if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
10485 return -1;
10486 else
10487 return 0;
10488 } else {
10489 if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
10490 return -1;
10491 /* Select the filter (f0 - f3) to use. */
10492 if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
10493 return -1;
10494 }
10495 /* We need to load a programmable filter set for undefined */
10496 /* frequencies. So we will point the filter to a programmable set. */
10497 /* Since there are only 4 filters and 4 programmable sets, we will */
10498 /* just point the filter to the same number set and program it for the */
10499 /* frequency we want. */
10500 if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
10501 return -1;
10502 if (j->ver.low != 0x12) {
10503 cmd = 0x515B;
10504 max = 19;
10505 } else {
10506 cmd = 0x515E;
10507 max = 15;
10508 }
10509 if (ixj_WriteDSPCommand(cmd, j))
10510 return -1;
10511 for (cnt = 0; cnt < max; cnt++) {
10512 if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
10513 return -1;
10514 }
10515 j->filter_en[jfr->filter] = jfr->enable;
10516 return 0;
10517}
10518
10519static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
10520{
10521 int freq0, freq1;
10522 unsigned short data;
10523 if (ti->freq0) {
10524 freq0 = ti->freq0;
10525 } else {
10526 freq0 = 0x7FFF;
10527 }
10528
10529 if (ti->freq1) {
10530 freq1 = ti->freq1;
10531 } else {
10532 freq1 = 0x7FFF;
10533 }
10534
10535 if(ti->tone_index > 12 && ti->tone_index < 28)
10536 {
10537 if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
10538 return -1;
10539 if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
10540 return -1;
10541 data = freq0;
10542 if (ixj_WriteDSPCommand(data, j))
10543 return -1;
10544 data = freq1;
10545 if (ixj_WriteDSPCommand(data, j))
10546 return -1;
10547 }
10548 return freq0;
10549}
10550