1 /******************************************************************************
2  *    ixj.h
3  *
4  *
5  * Device Driver for Quicknet Technologies, Inc.'s Telephony cards
6  * including the Internet PhoneJACK, Internet PhoneJACK Lite,
7  * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and
8  * SmartCABLE
9  *
10  *    (c) Copyright 1999-2001  Quicknet Technologies, Inc.
11  *
12  *    This program is free software; you can redistribute it and/or
13  *    modify it under the terms of the GNU General Public License
14  *    as published by the Free Software Foundation; either version
15  *    2 of the License, or (at your option) any later version.
16  *
17  * Author:          Ed Okerson, <eokerson@quicknet.net>
18  *
19  * Contributors:    Greg Herlein, <gherlein@quicknet.net>
20  *                  David W. Erhart, <derhart@quicknet.net>
21  *                  John Sellers, <jsellers@quicknet.net>
22  *                  Mike Preston, <mpreston@quicknet.net>
23  *
24  * More information about the hardware related to this driver can be found
25  * at our website:    http://www.quicknet.net
26  *
27  * Fixes:
28  *
29  * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
30  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
31  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
32  * TECHNOLOGIES, INC.HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  *
34  * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
35  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
36  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
37  * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
38  * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
39  *
40  *****************************************************************************/
41 #define IXJ_VERSION 3031
42 
43 #include <linux/types.h>
44 
45 #include <linux/ixjuser.h>
46 #include <linux/phonedev.h>
47 
48 typedef __u16 WORD;
49 typedef __u32 DWORD;
50 typedef __u8 BYTE;
51 
52 #ifndef IXJMAX
53 #define IXJMAX 16
54 #endif
55 
56 /******************************************************************************
57 *
58 *  This structure when unioned with the structures below makes simple byte
59 *  access to the registers easier.
60 *
61 ******************************************************************************/
62 typedef struct {
63 	unsigned char low;
64 	unsigned char high;
65 } BYTES;
66 
67 typedef union {
68         BYTES bytes;
69         short word;
70 } IXJ_WORD;
71 
72 typedef struct{
73 	unsigned int b0:1;
74 	unsigned int b1:1;
75 	unsigned int b2:1;
76 	unsigned int b3:1;
77 	unsigned int b4:1;
78 	unsigned int b5:1;
79 	unsigned int b6:1;
80 	unsigned int b7:1;
81 } IXJ_CBITS;
82 
83 typedef union{
84 	IXJ_CBITS cbits;
85 	  char  cbyte;
86 } IXJ_CBYTE;
87 
88 /******************************************************************************
89 *
90 *  This structure represents the Hardware Control Register of the CT8020/8021
91 *  The CT8020 is used in the Internet PhoneJACK, and the 8021 in the
92 *  Internet LineJACK
93 *
94 ******************************************************************************/
95 typedef struct {
96 	unsigned int rxrdy:1;
97 	unsigned int txrdy:1;
98 	unsigned int status:1;
99 	unsigned int auxstatus:1;
100 	unsigned int rxdma:1;
101 	unsigned int txdma:1;
102 	unsigned int rxburst:1;
103 	unsigned int txburst:1;
104 	unsigned int dmadir:1;
105 	unsigned int cont:1;
106 	unsigned int irqn:1;
107 	unsigned int t:5;
108 } HCRBIT;
109 
110 typedef union {
111 	HCRBIT bits;
112 	BYTES bytes;
113 } HCR;
114 
115 /******************************************************************************
116 *
117 *  This structure represents the Hardware Status Register of the CT8020/8021
118 *  The CT8020 is used in the Internet PhoneJACK, and the 8021 in the
119 *  Internet LineJACK
120 *
121 ******************************************************************************/
122 typedef struct {
123 	unsigned int controlrdy:1;
124 	unsigned int auxctlrdy:1;
125 	unsigned int statusrdy:1;
126 	unsigned int auxstatusrdy:1;
127 	unsigned int rxrdy:1;
128 	unsigned int txrdy:1;
129 	unsigned int restart:1;
130 	unsigned int irqn:1;
131 	unsigned int rxdma:1;
132 	unsigned int txdma:1;
133 	unsigned int cohostshutdown:1;
134 	unsigned int t:5;
135 } HSRBIT;
136 
137 typedef union {
138 	HSRBIT bits;
139 	BYTES bytes;
140 } HSR;
141 
142 /******************************************************************************
143 *
144 *  This structure represents the General Purpose IO Register of the CT8020/8021
145 *  The CT8020 is used in the Internet PhoneJACK, and the 8021 in the
146 *  Internet LineJACK
147 *
148 ******************************************************************************/
149 typedef struct {
150 	unsigned int x:1;
151 	unsigned int gpio1:1;
152 	unsigned int gpio2:1;
153 	unsigned int gpio3:1;
154 	unsigned int gpio4:1;
155 	unsigned int gpio5:1;
156 	unsigned int gpio6:1;
157 	unsigned int gpio7:1;
158 	unsigned int xread:1;
159 	unsigned int gpio1read:1;
160 	unsigned int gpio2read:1;
161 	unsigned int gpio3read:1;
162 	unsigned int gpio4read:1;
163 	unsigned int gpio5read:1;
164 	unsigned int gpio6read:1;
165 	unsigned int gpio7read:1;
166 } GPIOBIT;
167 
168 typedef union {
169 	GPIOBIT bits;
170 	BYTES bytes;
171 	unsigned short word;
172 } GPIO;
173 
174 /******************************************************************************
175 *
176 *  This structure represents the Line Monitor status response
177 *
178 ******************************************************************************/
179 typedef struct {
180 	unsigned int digit:4;
181 	unsigned int cpf_valid:1;
182 	unsigned int dtmf_valid:1;
183 	unsigned int peak:1;
184 	unsigned int z:1;
185 	unsigned int f0:1;
186 	unsigned int f1:1;
187 	unsigned int f2:1;
188 	unsigned int f3:1;
189 	unsigned int frame:4;
190 } LMON;
191 
192 typedef union {
193 	LMON bits;
194 	BYTES bytes;
195 } DTMF;
196 
197 typedef struct {
198 	unsigned int z:7;
199 	unsigned int dtmf_en:1;
200 	unsigned int y:4;
201 	unsigned int F3:1;
202 	unsigned int F2:1;
203 	unsigned int F1:1;
204 	unsigned int F0:1;
205 } CP;
206 
207 typedef union {
208 	CP bits;
209 	BYTES bytes;
210 } CPTF;
211 
212 /******************************************************************************
213 *
214 *  This structure represents the Status Control Register on the Internet
215 *  LineJACK
216 *
217 ******************************************************************************/
218 typedef struct {
219 	unsigned int c0:1;
220 	unsigned int c1:1;
221 	unsigned int stereo:1;
222 	unsigned int daafsyncen:1;
223 	unsigned int led1:1;
224 	unsigned int led2:1;
225 	unsigned int led3:1;
226 	unsigned int led4:1;
227 } PSCRWI;			/* Internet LineJACK and Internet PhoneJACK Lite */
228 
229 typedef struct {
230 	unsigned int eidp:1;
231 	unsigned int eisd:1;
232 	unsigned int x:6;
233 } PSCRWP;			/* Internet PhoneJACK PCI */
234 
235 typedef union {
236 	PSCRWI bits;
237 	PSCRWP pcib;
238 	char byte;
239 } PLD_SCRW;
240 
241 typedef struct {
242 	unsigned int c0:1;
243 	unsigned int c1:1;
244 	unsigned int x:1;
245 	unsigned int d0ee:1;
246 	unsigned int mixerbusy:1;
247 	unsigned int sci:1;
248 	unsigned int dspflag:1;
249 	unsigned int daaflag:1;
250 } PSCRRI;
251 
252 typedef struct {
253 	unsigned int eidp:1;
254 	unsigned int eisd:1;
255 	unsigned int x:4;
256 	unsigned int dspflag:1;
257 	unsigned int det:1;
258 } PSCRRP;
259 
260 typedef union {
261 	PSCRRI bits;
262 	PSCRRP pcib;
263 	char byte;
264 } PLD_SCRR;
265 
266 /******************************************************************************
267 *
268 *  These structures represents the SLIC Control Register on the
269 *  Internet LineJACK
270 *
271 ******************************************************************************/
272 typedef struct {
273 	unsigned int c1:1;
274 	unsigned int c2:1;
275 	unsigned int c3:1;
276 	unsigned int b2en:1;
277 	unsigned int spken:1;
278 	unsigned int rly1:1;
279 	unsigned int rly2:1;
280 	unsigned int rly3:1;
281 } PSLICWRITE;
282 
283 typedef struct {
284 	unsigned int state:3;
285 	unsigned int b2en:1;
286 	unsigned int spken:1;
287 	unsigned int c3:1;
288 	unsigned int potspstn:1;
289 	unsigned int det:1;
290 } PSLICREAD;
291 
292 typedef struct {
293 	unsigned int c1:1;
294 	unsigned int c2:1;
295 	unsigned int c3:1;
296 	unsigned int b2en:1;
297 	unsigned int e1:1;
298 	unsigned int mic:1;
299 	unsigned int spk:1;
300 	unsigned int x:1;
301 } PSLICPCI;
302 
303 typedef union {
304 	PSLICPCI pcib;
305 	PSLICWRITE bits;
306 	PSLICREAD slic;
307 	char byte;
308 } PLD_SLICW;
309 
310 typedef union {
311 	PSLICPCI pcib;
312 	PSLICREAD bits;
313 	char byte;
314 } PLD_SLICR;
315 
316 /******************************************************************************
317 *
318 *  These structures represents the Clock Control Register on the
319 *  Internet LineJACK
320 *
321 ******************************************************************************/
322 typedef struct {
323 	unsigned int clk0:1;
324 	unsigned int clk1:1;
325 	unsigned int clk2:1;
326 	unsigned int x0:1;
327 	unsigned int slic_e1:1;
328 	unsigned int x1:1;
329 	unsigned int x2:1;
330 	unsigned int x3:1;
331 } PCLOCK;
332 
333 typedef union {
334 	PCLOCK bits;
335 	char byte;
336 } PLD_CLOCK;
337 
338 /******************************************************************************
339 *
340 *  These structures deal with the mixer on the Internet LineJACK
341 *
342 ******************************************************************************/
343 
344 typedef struct {
345 	unsigned short vol[10];
346 	unsigned int recsrc;
347 	unsigned int modcnt;
348 	unsigned short micpreamp;
349 } MIX;
350 
351 /******************************************************************************
352 *
353 *  These structures deal with the control logic on the Internet PhoneCARD
354 *
355 ******************************************************************************/
356 typedef struct {
357 	unsigned int x0:4;	/* unused bits */
358 
359 	unsigned int ed:1;	/* Event Detect */
360 
361 	unsigned int drf:1;	/* SmartCABLE Removal Flag 1=no cable */
362 
363 	unsigned int dspf:1;	/* DSP Flag 1=DSP Ready */
364 
365 	unsigned int crr:1;	/* Control Register Ready */
366 
367 } COMMAND_REG1;
368 
369 typedef union {
370 	COMMAND_REG1 bits;
371 	unsigned char byte;
372 } PCMCIA_CR1;
373 
374 typedef struct {
375 	unsigned int x0:4;	/* unused bits */
376 
377 	unsigned int rstc:1;	/* SmartCABLE Reset */
378 
379 	unsigned int pwr:1;	/* SmartCABLE Power */
380 
381 	unsigned int x1:2;	/* unused bits */
382 
383 } COMMAND_REG2;
384 
385 typedef union {
386 	COMMAND_REG2 bits;
387 	unsigned char byte;
388 } PCMCIA_CR2;
389 
390 typedef struct {
391 	unsigned int addr:5;	/* R/W SmartCABLE Register Address */
392 
393 	unsigned int rw:1;	/* Read / Write flag */
394 
395 	unsigned int dev:2;	/* 2 bit SmartCABLE Device Address */
396 
397 } CONTROL_REG;
398 
399 typedef union {
400 	CONTROL_REG bits;
401 	unsigned char byte;
402 } PCMCIA_SCCR;
403 
404 typedef struct {
405 	unsigned int hsw:1;
406 	unsigned int det:1;
407 	unsigned int led2:1;
408 	unsigned int led1:1;
409 	unsigned int ring1:1;
410 	unsigned int ring0:1;
411 	unsigned int x:1;
412 	unsigned int powerdown:1;
413 } PCMCIA_SLIC_REG;
414 
415 typedef union {
416 	PCMCIA_SLIC_REG bits;
417 	unsigned char byte;
418 } PCMCIA_SLIC;
419 
420 typedef struct {
421 	unsigned int cpd:1;	/* Chip Power Down */
422 
423 	unsigned int mpd:1;	/* MIC Bias Power Down */
424 
425 	unsigned int hpd:1;	/* Handset Drive Power Down */
426 
427 	unsigned int lpd:1;	/* Line Drive Power Down */
428 
429 	unsigned int spd:1;	/* Speaker Drive Power Down */
430 
431 	unsigned int x:2;	/* unused bits */
432 
433 	unsigned int sr:1;	/* Software Reset */
434 
435 } Si3CONTROL1;
436 
437 typedef union {
438 	Si3CONTROL1 bits;
439 	unsigned char byte;
440 } Si3C1;
441 
442 typedef struct {
443 	unsigned int al:1;	/* Analog Loopback DAC analog -> ADC analog */
444 
445 	unsigned int dl2:1;	/* Digital Loopback DAC -> ADC one bit */
446 
447 	unsigned int dl1:1;	/* Digital Loopback ADC -> DAC one bit */
448 
449 	unsigned int pll:1;	/* 1 = div 10, 0 = div 5 */
450 
451 	unsigned int hpd:1;	/* HPF disable */
452 
453 	unsigned int x:3;	/* unused bits */
454 
455 } Si3CONTROL2;
456 
457 typedef union {
458 	Si3CONTROL2 bits;
459 	unsigned char byte;
460 } Si3C2;
461 
462 typedef struct {
463 	unsigned int iir:1;	/* 1 enables IIR, 0 enables FIR */
464 
465 	unsigned int him:1;	/* Handset Input Mute */
466 
467 	unsigned int mcm:1;	/* MIC In Mute */
468 
469 	unsigned int mcg:2;	/* MIC In Gain */
470 
471 	unsigned int lim:1;	/* Line In Mute */
472 
473 	unsigned int lig:2;	/* Line In Gain */
474 
475 } Si3RXGAIN;
476 
477 typedef union {
478 	Si3RXGAIN bits;
479 	unsigned char byte;
480 } Si3RXG;
481 
482 typedef struct {
483 	unsigned int hom:1;	/* Handset Out Mute */
484 
485 	unsigned int lom:1;	/* Line Out Mute */
486 
487 	unsigned int rxg:5;	/* RX PGA Gain */
488 
489 	unsigned int x:1;	/* unused bit */
490 
491 } Si3ADCVOLUME;
492 
493 typedef union {
494 	Si3ADCVOLUME bits;
495 	unsigned char byte;
496 } Si3ADC;
497 
498 typedef struct {
499 	unsigned int srm:1;	/* Speaker Right Mute */
500 
501 	unsigned int slm:1;	/* Speaker Left Mute */
502 
503 	unsigned int txg:5;	/* TX PGA Gain */
504 
505 	unsigned int x:1;	/* unused bit */
506 
507 } Si3DACVOLUME;
508 
509 typedef union {
510 	Si3DACVOLUME bits;
511 	unsigned char byte;
512 } Si3DAC;
513 
514 typedef struct {
515 	unsigned int x:5;	/* unused bit */
516 
517 	unsigned int losc:1;	/* Line Out Short Circuit */
518 
519 	unsigned int srsc:1;	/* Speaker Right Short Circuit */
520 
521 	unsigned int slsc:1;	/* Speaker Left Short Circuit */
522 
523 } Si3STATUSREPORT;
524 
525 typedef union {
526 	Si3STATUSREPORT bits;
527 	unsigned char byte;
528 } Si3STAT;
529 
530 typedef struct {
531 	unsigned int sot:2;	/* Speaker Out Attenuation */
532 
533 	unsigned int lot:2;	/* Line Out Attenuation */
534 
535 	unsigned int x:4;	/* unused bits */
536 
537 } Si3ANALOGATTN;
538 
539 typedef union {
540 	Si3ANALOGATTN bits;
541 	unsigned char byte;
542 } Si3AATT;
543 
544 /******************************************************************************
545 *
546 *  These structures deal with the DAA on the Internet LineJACK
547 *
548 ******************************************************************************/
549 
550 typedef struct _DAA_REGS {
551 	/*----------------------------------------------- */
552 	/* SOP Registers */
553 	/* */
554 	BYTE bySOP;
555 
556 	union _SOP_REGS {
557 		struct _SOP {
558 			union	/* SOP - CR0 Register */
559 			 {
560 				BYTE reg;
561 				struct _CR0_BITREGS {
562 					BYTE CLK_EXT:1;		/* cr0[0:0] */
563 
564 					BYTE RIP:1;	/* cr0[1:1] */
565 
566 					BYTE AR:1;	/* cr0[2:2] */
567 
568 					BYTE AX:1;	/* cr0[3:3] */
569 
570 					BYTE FRR:1;	/* cr0[4:4] */
571 
572 					BYTE FRX:1;	/* cr0[5:5] */
573 
574 					BYTE IM:1;	/* cr0[6:6] */
575 
576 					BYTE TH:1;	/* cr0[7:7] */
577 
578 				} bitreg;
579 			} cr0;
580 
581 			union	/* SOP - CR1 Register */
582 			 {
583 				BYTE reg;
584 				struct _CR1_REGS {
585 					BYTE RM:1;	/* cr1[0:0] */
586 
587 					BYTE RMR:1;	/* cr1[1:1] */
588 
589 					BYTE No_auto:1;		/* cr1[2:2] */
590 
591 					BYTE Pulse:1;	/* cr1[3:3] */
592 
593 					BYTE P_Tone1:1;		/* cr1[4:4] */
594 
595 					BYTE P_Tone2:1;		/* cr1[5:5] */
596 
597 					BYTE E_Tone1:1;		/* cr1[6:6] */
598 
599 					BYTE E_Tone2:1;		/* cr1[7:7] */
600 
601 				} bitreg;
602 			} cr1;
603 
604 			union	/* SOP - CR2 Register */
605 			 {
606 				BYTE reg;
607 				struct _CR2_REGS {
608 					BYTE Call_II:1;		/* CR2[0:0] */
609 
610 					BYTE Call_I:1;	/* CR2[1:1] */
611 
612 					BYTE Call_en:1;		/* CR2[2:2] */
613 
614 					BYTE Call_pon:1;	/* CR2[3:3] */
615 
616 					BYTE IDR:1;	/* CR2[4:4] */
617 
618 					BYTE COT_R:3;	/* CR2[5:7] */
619 
620 				} bitreg;
621 			} cr2;
622 
623 			union	/* SOP - CR3 Register */
624 			 {
625 				BYTE reg;
626 				struct _CR3_REGS {
627 					BYTE DHP_X:1;	/* CR3[0:0] */
628 
629 					BYTE DHP_R:1;	/* CR3[1:1] */
630 
631 					BYTE Cal_pctl:1;	/* CR3[2:2] */
632 
633 					BYTE SEL:1;	/* CR3[3:3] */
634 
635 					BYTE TestLoops:4;	/* CR3[4:7] */
636 
637 				} bitreg;
638 			} cr3;
639 
640 			union	/* SOP - CR4 Register */
641 			 {
642 				BYTE reg;
643 				struct _CR4_REGS {
644 					BYTE Fsc_en:1;	/* CR4[0:0] */
645 
646 					BYTE Int_en:1;	/* CR4[1:1] */
647 
648 					BYTE AGX:2;	/* CR4[2:3] */
649 
650 					BYTE AGR_R:2;	/* CR4[4:5] */
651 
652 					BYTE AGR_Z:2;	/* CR4[6:7] */
653 
654 				} bitreg;
655 			} cr4;
656 
657 			union	/* SOP - CR5 Register */
658 			 {
659 				BYTE reg;
660 				struct _CR5_REGS {
661 					BYTE V_0:1;	/* CR5[0:0] */
662 
663 					BYTE V_1:1;	/* CR5[1:1] */
664 
665 					BYTE V_2:1;	/* CR5[2:2] */
666 
667 					BYTE V_3:1;	/* CR5[3:3] */
668 
669 					BYTE V_4:1;	/* CR5[4:4] */
670 
671 					BYTE V_5:1;	/* CR5[5:5] */
672 
673 					BYTE V_6:1;	/* CR5[6:6] */
674 
675 					BYTE V_7:1;	/* CR5[7:7] */
676 
677 				} bitreg;
678 			} cr5;
679 
680 			union	/* SOP - CR6 Register */
681 			 {
682 				BYTE reg;
683 				struct _CR6_REGS {
684 					BYTE reserved:8;	/* CR6[0:7] */
685 
686 				} bitreg;
687 			} cr6;
688 
689 			union	/* SOP - CR7 Register */
690 			 {
691 				BYTE reg;
692 				struct _CR7_REGS {
693 					BYTE reserved:8;	/* CR7[0:7] */
694 
695 				} bitreg;
696 			} cr7;
697 		} SOP;
698 
699 		BYTE ByteRegs[sizeof(struct _SOP)];
700 
701 	} SOP_REGS;
702 
703 	/* DAA_REGS.SOP_REGS.SOP.CR5.reg */
704 	/* DAA_REGS.SOP_REGS.SOP.CR5.bitreg */
705 	/* DAA_REGS.SOP_REGS.SOP.CR5.bitreg.V_2 */
706 	/* DAA_REGS.SOP_REGS.ByteRegs[5] */
707 
708 	/*----------------------------------------------- */
709 	/* XOP Registers */
710 	/* */
711 	BYTE byXOP;
712 
713 	union _XOP_REGS {
714 		struct _XOP {
715 			union	XOPXR0/* XOP - XR0 Register - Read values */
716 			 {
717 				BYTE reg;
718 				struct _XR0_BITREGS {
719 					BYTE SI_0:1;	/* XR0[0:0] - Read */
720 
721 					BYTE SI_1:1;	/* XR0[1:1] - Read */
722 
723 					BYTE VDD_OK:1;	/* XR0[2:2] - Read */
724 
725 					BYTE Caller_ID:1;	/* XR0[3:3] - Read */
726 
727 					BYTE RING:1;	/* XR0[4:4] - Read */
728 
729 					BYTE Cadence:1;		/* XR0[5:5] - Read */
730 
731 					BYTE Wake_up:1;		/* XR0[6:6] - Read */
732 
733 					BYTE RMR:1;	/* XR0[7:7] - Read */
734 
735 				} bitreg;
736 			} xr0;
737 
738 			union	/* XOP - XR1 Register */
739 			 {
740 				BYTE reg;
741 				struct _XR1_BITREGS {
742 					BYTE M_SI_0:1;	/* XR1[0:0] */
743 
744 					BYTE M_SI_1:1;	/* XR1[1:1] */
745 
746 					BYTE M_VDD_OK:1;	/* XR1[2:2] */
747 
748 					BYTE M_Caller_ID:1;	/* XR1[3:3] */
749 
750 					BYTE M_RING:1;	/* XR1[4:4] */
751 
752 					BYTE M_Cadence:1;	/* XR1[5:5] */
753 
754 					BYTE M_Wake_up:1;	/* XR1[6:6] */
755 
756 					BYTE unused:1;	/* XR1[7:7] */
757 
758 				} bitreg;
759 			} xr1;
760 
761 			union	/* XOP - XR2 Register */
762 			 {
763 				BYTE reg;
764 				struct _XR2_BITREGS {
765 					BYTE CTO0:1;	/* XR2[0:0] */
766 
767 					BYTE CTO1:1;	/* XR2[1:1] */
768 
769 					BYTE CTO2:1;	/* XR2[2:2] */
770 
771 					BYTE CTO3:1;	/* XR2[3:3] */
772 
773 					BYTE CTO4:1;	/* XR2[4:4] */
774 
775 					BYTE CTO5:1;	/* XR2[5:5] */
776 
777 					BYTE CTO6:1;	/* XR2[6:6] */
778 
779 					BYTE CTO7:1;	/* XR2[7:7] */
780 
781 				} bitreg;
782 			} xr2;
783 
784 			union	/* XOP - XR3 Register */
785 			 {
786 				BYTE reg;
787 				struct _XR3_BITREGS {
788 					BYTE DCR0:1;	/* XR3[0:0] */
789 
790 					BYTE DCR1:1;	/* XR3[1:1] */
791 
792 					BYTE DCI:1;	/* XR3[2:2] */
793 
794 					BYTE DCU0:1;	/* XR3[3:3] */
795 
796 					BYTE DCU1:1;	/* XR3[4:4] */
797 
798 					BYTE B_off:1;	/* XR3[5:5] */
799 
800 					BYTE AGB0:1;	/* XR3[6:6] */
801 
802 					BYTE AGB1:1;	/* XR3[7:7] */
803 
804 				} bitreg;
805 			} xr3;
806 
807 			union	/* XOP - XR4 Register */
808 			 {
809 				BYTE reg;
810 				struct _XR4_BITREGS {
811 					BYTE C_0:1;	/* XR4[0:0] */
812 
813 					BYTE C_1:1;	/* XR4[1:1] */
814 
815 					BYTE C_2:1;	/* XR4[2:2] */
816 
817 					BYTE C_3:1;	/* XR4[3:3] */
818 
819 					BYTE C_4:1;	/* XR4[4:4] */
820 
821 					BYTE C_5:1;	/* XR4[5:5] */
822 
823 					BYTE C_6:1;	/* XR4[6:6] */
824 
825 					BYTE C_7:1;	/* XR4[7:7] */
826 
827 				} bitreg;
828 			} xr4;
829 
830 			union	/* XOP - XR5 Register */
831 			 {
832 				BYTE reg;
833 				struct _XR5_BITREGS {
834 					BYTE T_0:1;	/* XR5[0:0] */
835 
836 					BYTE T_1:1;	/* XR5[1:1] */
837 
838 					BYTE T_2:1;	/* XR5[2:2] */
839 
840 					BYTE T_3:1;	/* XR5[3:3] */
841 
842 					BYTE T_4:1;	/* XR5[4:4] */
843 
844 					BYTE T_5:1;	/* XR5[5:5] */
845 
846 					BYTE T_6:1;	/* XR5[6:6] */
847 
848 					BYTE T_7:1;	/* XR5[7:7] */
849 
850 				} bitreg;
851 			} xr5;
852 
853 			union	/* XOP - XR6 Register - Read Values */
854 			 {
855 				BYTE reg;
856 				struct _XR6_BITREGS {
857 					BYTE CPS0:1;	/* XR6[0:0] */
858 
859 					BYTE CPS1:1;	/* XR6[1:1] */
860 
861 					BYTE unused1:2;		/* XR6[2:3] */
862 
863 					BYTE CLK_OFF:1;		/* XR6[4:4] */
864 
865 					BYTE unused2:3;		/* XR6[5:7] */
866 
867 				} bitreg;
868 			} xr6;
869 
870 			union	/* XOP - XR7 Register */
871 			 {
872 				BYTE reg;
873 				struct _XR7_BITREGS {
874 					BYTE unused1:1;		/* XR7[0:0] */
875 
876 					BYTE Vdd0:1;	/* XR7[1:1] */
877 
878 					BYTE Vdd1:1;	/* XR7[2:2] */
879 
880 					BYTE unused2:5;		/* XR7[3:7] */
881 
882 				} bitreg;
883 			} xr7;
884 		} XOP;
885 
886 		BYTE ByteRegs[sizeof(struct _XOP)];
887 
888 	} XOP_REGS;
889 
890 	/* DAA_REGS.XOP_REGS.XOP.XR7.reg */
891 	/* DAA_REGS.XOP_REGS.XOP.XR7.bitreg */
892 	/* DAA_REGS.XOP_REGS.XOP.XR7.bitreg.Vdd0 */
893 	/* DAA_REGS.XOP_REGS.ByteRegs[7] */
894 
895 	/*----------------------------------------------- */
896 	/* COP Registers */
897 	/* */
898 	BYTE byCOP;
899 
900 	union _COP_REGS {
901 		struct _COP {
902 			BYTE THFilterCoeff_1[8];	/* COP - TH Filter Coefficients,      CODE=0, Part 1 */
903 
904 			BYTE THFilterCoeff_2[8];	/* COP - TH Filter Coefficients,      CODE=1, Part 2 */
905 
906 			BYTE THFilterCoeff_3[8];	/* COP - TH Filter Coefficients,      CODE=2, Part 3 */
907 
908 			BYTE RingerImpendance_1[8];	/* COP - Ringer Impendance Coefficients,  CODE=3, Part 1 */
909 
910 			BYTE IMFilterCoeff_1[8];	/* COP - IM Filter Coefficients,      CODE=4, Part 1 */
911 
912 			BYTE IMFilterCoeff_2[8];	/* COP - IM Filter Coefficients,      CODE=5, Part 2 */
913 
914 			BYTE RingerImpendance_2[8];	/* COP - Ringer Impendance Coefficients,  CODE=6, Part 2 */
915 
916 			BYTE FRRFilterCoeff[8];		/* COP - FRR Filter Coefficients,      CODE=7 */
917 
918 			BYTE FRXFilterCoeff[8];		/* COP - FRX Filter Coefficients,      CODE=8 */
919 
920 			BYTE ARFilterCoeff[4];	/* COP - AR Filter Coefficients,      CODE=9 */
921 
922 			BYTE AXFilterCoeff[4];	/* COP - AX Filter Coefficients,      CODE=10  */
923 
924 			BYTE Tone1Coeff[4];	/* COP - Tone1 Coefficients,        CODE=11 */
925 
926 			BYTE Tone2Coeff[4];	/* COP - Tone2 Coefficients,        CODE=12 */
927 
928 			BYTE LevelmeteringRinging[4];	/* COP - Levelmetering Ringing,        CODE=13 */
929 
930 			BYTE CallerID1stTone[8];	/* COP - Caller ID 1st Tone,        CODE=14 */
931 
932 			BYTE CallerID2ndTone[8];	/* COP - Caller ID 2nd Tone,        CODE=15 */
933 
934 		} COP;
935 
936 		BYTE ByteRegs[sizeof(struct _COP)];
937 
938 	} COP_REGS;
939 
940 	/* DAA_REGS.COP_REGS.COP.XR7.Tone1Coeff[3] */
941 	/* DAA_REGS.COP_REGS.COP.XR7.bitreg */
942 	/* DAA_REGS.COP_REGS.COP.XR7.bitreg.Vdd0 */
943 	/* DAA_REGS.COP_REGS.ByteRegs[57] */
944 
945 	/*----------------------------------------------- */
946 	/* CAO Registers */
947 	/* */
948 	BYTE byCAO;
949 
950 	union _CAO_REGS {
951 		struct _CAO {
952 			BYTE CallerID[512];	/* CAO - Caller ID Bytes */
953 
954 		} CAO;
955 
956 		BYTE ByteRegs[sizeof(struct _CAO)];
957 	} CAO_REGS;
958 
959 	union			/* XOP - XR0 Register - Write values */
960 	 {
961 		BYTE reg;
962 		struct _XR0_BITREGSW {
963 			BYTE SO_0:1;	/* XR1[0:0] - Write */
964 
965 			BYTE SO_1:1;	/* XR1[1:1] - Write */
966 
967 			BYTE SO_2:1;	/* XR1[2:2] - Write */
968 
969 			BYTE unused:5;	/* XR1[3:7] - Write */
970 
971 		} bitreg;
972 	} XOP_xr0_W;
973 
974 	union			/* XOP - XR6 Register - Write values */
975 	 {
976 		BYTE reg;
977 		struct _XR6_BITREGSW {
978 			BYTE unused1:4;		/* XR6[0:3] */
979 
980 			BYTE CLK_OFF:1;		/* XR6[4:4] */
981 
982 			BYTE unused2:3;		/* XR6[5:7] */
983 
984 		} bitreg;
985 	} XOP_xr6_W;
986 
987 } DAA_REGS;
988 
989 #define ALISDAA_ID_BYTE      0x81
990 #define ALISDAA_CALLERID_SIZE  512
991 
992 /*------------------------------ */
993 /* */
994 /*  Misc definitions */
995 /* */
996 
997 /* Power Up Operation */
998 #define SOP_PU_SLEEP    0
999 #define SOP_PU_RINGING    1
1000 #define SOP_PU_CONVERSATION  2
1001 #define SOP_PU_PULSEDIALING  3
1002 #define SOP_PU_RESET    4
1003 
1004 #define ALISDAA_CALLERID_SIZE 512
1005 
1006 #define PLAYBACK_MODE_COMPRESSED	0	/*        Selects: Compressed modes, TrueSpeech 8.5-4.1, G.723.1, G.722, G.728, G.729 */
1007 #define PLAYBACK_MODE_TRUESPEECH_V40	0	/*        Selects: TrueSpeech 8.5, 6.3, 5.3, 4.8 or 4.1 Kbps */
1008 #define PLAYBACK_MODE_TRUESPEECH	8	/*        Selects: TrueSpeech 8.5, 6.3, 5.3, 4.8 or 4.1 Kbps Version 5.1 */
1009 #define PLAYBACK_MODE_ULAW		2	/*        Selects: 64 Kbit/sec MuA-law PCM */
1010 #define PLAYBACK_MODE_ALAW		10	/*        Selects: 64 Kbit/sec A-law PCM */
1011 #define PLAYBACK_MODE_16LINEAR		6	/*        Selects: 128 Kbit/sec 16-bit linear */
1012 #define PLAYBACK_MODE_8LINEAR		4	/*        Selects: 64 Kbit/sec 8-bit signed linear */
1013 #define PLAYBACK_MODE_8LINEAR_WSS	5	/*        Selects: 64 Kbit/sec WSS 8-bit unsigned linear */
1014 
1015 #define RECORD_MODE_COMPRESSED		0	/*        Selects: Compressed modes, TrueSpeech 8.5-4.1, G.723.1, G.722, G.728, G.729 */
1016 #define RECORD_MODE_TRUESPEECH		0	/*        Selects: TrueSpeech 8.5, 6.3, 5.3, 4.8 or 4.1 Kbps */
1017 #define RECORD_MODE_ULAW		4	/*        Selects: 64 Kbit/sec Mu-law PCM */
1018 #define RECORD_MODE_ALAW		12	/*        Selects: 64 Kbit/sec A-law PCM */
1019 #define RECORD_MODE_16LINEAR		5	/*        Selects: 128 Kbit/sec 16-bit linear */
1020 #define RECORD_MODE_8LINEAR		6	/*        Selects: 64 Kbit/sec 8-bit signed linear */
1021 #define RECORD_MODE_8LINEAR_WSS		7	/*        Selects: 64 Kbit/sec WSS 8-bit unsigned linear */
1022 
1023 enum SLIC_STATES {
1024 	PLD_SLIC_STATE_OC = 0,
1025 	PLD_SLIC_STATE_RINGING,
1026 	PLD_SLIC_STATE_ACTIVE,
1027 	PLD_SLIC_STATE_OHT,
1028 	PLD_SLIC_STATE_TIPOPEN,
1029 	PLD_SLIC_STATE_STANDBY,
1030 	PLD_SLIC_STATE_APR,
1031 	PLD_SLIC_STATE_OHTPR
1032 };
1033 
1034 enum SCI_CONTROL {
1035 	SCI_End = 0,
1036 	SCI_Enable_DAA,
1037 	SCI_Enable_Mixer,
1038 	SCI_Enable_EEPROM
1039 };
1040 
1041 enum Mode {
1042 	T63, T53, T48, T40
1043 };
1044 enum Dir {
1045 	V3_TO_V4, V4_TO_V3, V4_TO_V5, V5_TO_V4
1046 };
1047 
1048 typedef struct Proc_Info_Tag {
1049 	enum Mode convert_mode;
1050 	enum Dir convert_dir;
1051 	int Prev_Frame_Type;
1052 	int Current_Frame_Type;
1053 } Proc_Info_Type;
1054 
1055 enum PREVAL {
1056 	NORMAL = 0,
1057 	NOPOST,
1058 	POSTONLY,
1059 	PREERROR
1060 };
1061 
1062 enum IXJ_EXTENSIONS {
1063 	G729LOADER = 0,
1064 	TS85LOADER,
1065 	PRE_READ,
1066 	POST_READ,
1067 	PRE_WRITE,
1068 	POST_WRITE,
1069 	PRE_IOCTL,
1070 	POST_IOCTL
1071 };
1072 
1073 typedef struct {
1074 	char enable;
1075 	char en_filter;
1076 	unsigned int filter;
1077 	unsigned int state;	/* State 0 when cadence has not started. */
1078 
1079 	unsigned int on1;	/* State 1 */
1080 
1081 	unsigned long on1min;	/* State 1 - 10% + jiffies */
1082  	unsigned long on1dot;	/* State 1 + jiffies */
1083 
1084 	unsigned long on1max;	/* State 1 + 10% + jiffies */
1085 
1086 	unsigned int off1;	/* State 2 */
1087 
1088 	unsigned long off1min;
1089  	unsigned long off1dot;	/* State 2 + jiffies */
1090 	unsigned long off1max;
1091 	unsigned int on2;	/* State 3 */
1092 
1093 	unsigned long on2min;
1094 	unsigned long on2dot;
1095 	unsigned long on2max;
1096 	unsigned int off2;	/* State 4 */
1097 
1098 	unsigned long off2min;
1099  	unsigned long off2dot;	/* State 4 + jiffies */
1100 	unsigned long off2max;
1101 	unsigned int on3;	/* State 5 */
1102 
1103 	unsigned long on3min;
1104 	unsigned long on3dot;
1105 	unsigned long on3max;
1106 	unsigned int off3;	/* State 6 */
1107 
1108 	unsigned long off3min;
1109  	unsigned long off3dot;	/* State 6 + jiffies */
1110 	unsigned long off3max;
1111 } IXJ_CADENCE_F;
1112 
1113 typedef struct {
1114 	unsigned int busytone:1;
1115 	unsigned int dialtone:1;
1116 	unsigned int ringback:1;
1117 	unsigned int ringing:1;
1118 	unsigned int playing:1;
1119 	unsigned int recording:1;
1120 	unsigned int cringing:1;
1121 	unsigned int play_first_frame:1;
1122 	unsigned int pstn_present:1;
1123 	unsigned int pstn_ringing:1;
1124 	unsigned int pots_correct:1;
1125 	unsigned int pots_pstn:1;
1126 	unsigned int g729_loaded:1;
1127 	unsigned int ts85_loaded:1;
1128 	unsigned int dtmf_oob:1;	/* DTMF Out-Of-Band */
1129 
1130 	unsigned int pcmciascp:1;	/* SmartCABLE Present */
1131 
1132 	unsigned int pcmciasct:2;	/* SmartCABLE Type */
1133 
1134 	unsigned int pcmciastate:3;	/* SmartCABLE Init State */
1135 
1136 	unsigned int inwrite:1;	/* Currently writing */
1137 
1138 	unsigned int inread:1;	/* Currently reading */
1139 
1140 	unsigned int incheck:1;	/* Currently checking the SmartCABLE */
1141 
1142 	unsigned int cidplay:1; /* Currently playing Caller ID */
1143 
1144 	unsigned int cidring:1; /* This is the ring for Caller ID */
1145 
1146 	unsigned int cidsent:1; /* Caller ID has been sent */
1147 
1148 	unsigned int cidcw_ack:1; /* Caller ID CW ACK (from CPE) */
1149 	unsigned int firstring:1; /* First ring cadence is complete */
1150 	unsigned int pstncheck:1;	/* Currently checking the PSTN Line */
1151 	unsigned int pstn_rmr:1;
1152 	unsigned int x:3;	/* unused bits */
1153 
1154 } IXJ_FLAGS;
1155 
1156 /******************************************************************************
1157 *
1158 *  This structure holds the state of all of the Quicknet cards
1159 *
1160 ******************************************************************************/
1161 
1162 typedef struct {
1163 	int elements_used;
1164 	IXJ_CADENCE_TERM termination;
1165 	IXJ_CADENCE_ELEMENT *ce;
1166 } ixj_cadence;
1167 
1168 typedef struct {
1169 	struct phone_device p;
1170 	struct timer_list timer;
1171 	unsigned int board;
1172 	unsigned int DSPbase;
1173 	unsigned int XILINXbase;
1174 	unsigned int serial;
1175 	atomic_t DSPWrite;
1176 	struct phone_capability caplist[30];
1177 	unsigned int caps;
1178 	struct pnp_dev *dev;
1179 	unsigned int cardtype;
1180 	unsigned int rec_codec;
1181 	unsigned int cid_rec_codec;
1182 	unsigned int cid_rec_volume;
1183 	unsigned char cid_rec_flag;
1184 	signed char rec_mode;
1185 	unsigned int play_codec;
1186 	unsigned int cid_play_codec;
1187 	unsigned int cid_play_volume;
1188 	unsigned char cid_play_flag;
1189 	signed char play_mode;
1190 	IXJ_FLAGS flags;
1191 	unsigned long busyflags;
1192 	unsigned int rec_frame_size;
1193 	unsigned int play_frame_size;
1194 	unsigned int cid_play_frame_size;
1195 	unsigned int cid_base_frame_size;
1196 	unsigned long cidcw_wait;
1197 	int aec_level;
1198 	int cid_play_aec_level;
1199 	int readers, writers;
1200         wait_queue_head_t poll_q;
1201         wait_queue_head_t read_q;
1202 	char *read_buffer, *read_buffer_end;
1203 	char *read_convert_buffer;
1204 	size_t read_buffer_size;
1205 	unsigned int read_buffer_ready;
1206         wait_queue_head_t write_q;
1207 	char *write_buffer, *write_buffer_end;
1208 	char *write_convert_buffer;
1209 	size_t write_buffer_size;
1210 	unsigned int write_buffers_empty;
1211 	unsigned long drybuffer;
1212 	char *write_buffer_rp, *write_buffer_wp;
1213 	char dtmfbuffer[80];
1214 	char dtmf_current;
1215 	int dtmf_wp, dtmf_rp, dtmf_state, dtmf_proc;
1216 	int tone_off_time, tone_on_time;
1217 	struct fasync_struct *async_queue;
1218 	unsigned long tone_start_jif;
1219 	char tone_index;
1220 	char tone_state;
1221 	char maxrings;
1222 	ixj_cadence *cadence_t;
1223 	ixj_cadence *cadence_r;
1224 	int tone_cadence_state;
1225 	IXJ_CADENCE_F cadence_f[6];
1226 	DTMF dtmf;
1227 	CPTF cptf;
1228 	BYTES dsp;
1229 	BYTES ver;
1230 	BYTES scr;
1231 	BYTES ssr;
1232 	BYTES baseframe;
1233 	HSR hsr;
1234 	GPIO gpio;
1235 	PLD_SCRR pld_scrr;
1236 	PLD_SCRW pld_scrw;
1237 	PLD_SLICW pld_slicw;
1238 	PLD_SLICR pld_slicr;
1239 	PLD_CLOCK pld_clock;
1240 	PCMCIA_CR1 pccr1;
1241 	PCMCIA_CR2 pccr2;
1242 	PCMCIA_SCCR psccr;
1243 	PCMCIA_SLIC pslic;
1244 	char pscdd;
1245 	Si3C1 sic1;
1246 	Si3C2 sic2;
1247 	Si3RXG sirxg;
1248 	Si3ADC siadc;
1249 	Si3DAC sidac;
1250 	Si3STAT sistat;
1251 	Si3AATT siaatt;
1252 	MIX mix;
1253 	unsigned short ring_cadence;
1254 	int ring_cadence_t;
1255 	unsigned long ring_cadence_jif;
1256 	unsigned long checkwait;
1257 	int intercom;
1258 	int m_hook;
1259 	int r_hook;
1260 	int p_hook;
1261 	char pstn_envelope;
1262 	char pstn_cid_intr;
1263 	unsigned char fskz;
1264 	unsigned char fskphase;
1265 	unsigned char fskcnt;
1266         unsigned int cidsize;
1267 	unsigned int cidcnt;
1268 	unsigned long pstn_cid_received;
1269 	PHONE_CID cid;
1270 	PHONE_CID cid_send;
1271 	unsigned long pstn_ring_int;
1272 	unsigned long pstn_ring_start;
1273 	unsigned long pstn_ring_stop;
1274 	unsigned long pstn_winkstart;
1275 	unsigned long pstn_last_rmr;
1276 	unsigned long pstn_prev_rmr;
1277 	unsigned long pots_winkstart;
1278 	unsigned int winktime;
1279 	unsigned long flash_end;
1280 	char port;
1281 	char hookstate;
1282 	union telephony_exception ex;
1283 	union telephony_exception ex_sig;
1284 	int ixj_signals[35];
1285 	IXJ_SIGDEF sigdef;
1286 	char daa_mode;
1287 	char daa_country;
1288 	unsigned long pstn_sleeptil;
1289 	DAA_REGS m_DAAShadowRegs;
1290 	Proc_Info_Type Info_read;
1291 	Proc_Info_Type Info_write;
1292 	unsigned short frame_count;
1293 	unsigned int filter_hist[4];
1294 	unsigned char filter_en[6];
1295 	unsigned short proc_load;
1296 	unsigned long framesread;
1297 	unsigned long frameswritten;
1298 	unsigned long read_wait;
1299 	unsigned long write_wait;
1300 	unsigned long timerchecks;
1301 	unsigned long txreadycheck;
1302 	unsigned long rxreadycheck;
1303 	unsigned long statuswait;
1304 	unsigned long statuswaitfail;
1305 	unsigned long pcontrolwait;
1306 	unsigned long pcontrolwaitfail;
1307 	unsigned long iscontrolready;
1308 	unsigned long iscontrolreadyfail;
1309 	unsigned long pstnstatecheck;
1310 #ifdef IXJ_DYN_ALLOC
1311 	short *fskdata;
1312 #else
1313 	short fskdata[8000];
1314 #endif
1315 	int fsksize;
1316 	int fskdcnt;
1317 } IXJ;
1318 
1319 typedef int (*IXJ_REGFUNC) (IXJ * j, unsigned long arg);
1320 
1321 extern IXJ *ixj_pcmcia_probe(unsigned long, unsigned long);
1322 
1323