ia64/linux-2.6.18-xen.hg

view drivers/telephony/ixj.h @ 897:329ea0ccb344

balloon: try harder to balloon up under memory pressure.

Currently if the balloon driver is unable to increase the guest's
reservation it assumes the failure was due to reaching its full
allocation, gives up on the ballooning operation and records the limit
it reached as the "hard limit". The driver will not try again until
the target is set again (even to the same value).

However it is possible that ballooning has in fact failed due to
memory pressure in the host and therefore it is desirable to keep
attempting to reach the target in case memory becomes available. The
most likely scenario is that some guests are ballooning down while
others are ballooning up and therefore there is temporary memory
pressure while things stabilise. You would not expect a well behaved
toolstack to ask a domain to balloon to more than its allocation nor
would you expect it to deliberately over-commit memory by setting
balloon targets which exceed the total host memory.

This patch drops the concept of a hard limit and causes the balloon
driver to retry increasing the reservation on a timer in the same
manner as when decreasing the reservation.

Also if we partially succeed in increasing the reservation
(i.e. receive less pages than we asked for) then we may as well keep
those pages rather than returning them to Xen.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
author Keir Fraser <keir.fraser@citrix.com>
date Fri Jun 05 14:01:20 2009 +0100 (2009-06-05)
parents 831230e53067
children
line source
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
43 #include <linux/types.h>
45 #include <linux/ixjuser.h>
46 #include <linux/phonedev.h>
48 typedef __u16 WORD;
49 typedef __u32 DWORD;
50 typedef __u8 BYTE;
51 typedef __u8 BOOL;
53 #ifndef IXJMAX
54 #define IXJMAX 16
55 #endif
57 #define TRUE 1
58 #define FALSE 0
60 /******************************************************************************
61 *
62 * This structure when unioned with the structures below makes simple byte
63 * access to the registers easier.
64 *
65 ******************************************************************************/
66 typedef struct {
67 unsigned char low;
68 unsigned char high;
69 } BYTES;
71 typedef union {
72 BYTES bytes;
73 short word;
74 } IXJ_WORD;
76 typedef struct{
77 unsigned int b0:1;
78 unsigned int b1:1;
79 unsigned int b2:1;
80 unsigned int b3:1;
81 unsigned int b4:1;
82 unsigned int b5:1;
83 unsigned int b6:1;
84 unsigned int b7:1;
85 } IXJ_CBITS;
87 typedef union{
88 IXJ_CBITS cbits;
89 char cbyte;
90 } IXJ_CBYTE;
92 /******************************************************************************
93 *
94 * This structure represents the Hardware Control Register of the CT8020/8021
95 * The CT8020 is used in the Internet PhoneJACK, and the 8021 in the
96 * Internet LineJACK
97 *
98 ******************************************************************************/
99 typedef struct {
100 unsigned int rxrdy:1;
101 unsigned int txrdy:1;
102 unsigned int status:1;
103 unsigned int auxstatus:1;
104 unsigned int rxdma:1;
105 unsigned int txdma:1;
106 unsigned int rxburst:1;
107 unsigned int txburst:1;
108 unsigned int dmadir:1;
109 unsigned int cont:1;
110 unsigned int irqn:1;
111 unsigned int t:5;
112 } HCRBIT;
114 typedef union {
115 HCRBIT bits;
116 BYTES bytes;
117 } HCR;
119 /******************************************************************************
120 *
121 * This structure represents the Hardware Status Register of the CT8020/8021
122 * The CT8020 is used in the Internet PhoneJACK, and the 8021 in the
123 * Internet LineJACK
124 *
125 ******************************************************************************/
126 typedef struct {
127 unsigned int controlrdy:1;
128 unsigned int auxctlrdy:1;
129 unsigned int statusrdy:1;
130 unsigned int auxstatusrdy:1;
131 unsigned int rxrdy:1;
132 unsigned int txrdy:1;
133 unsigned int restart:1;
134 unsigned int irqn:1;
135 unsigned int rxdma:1;
136 unsigned int txdma:1;
137 unsigned int cohostshutdown:1;
138 unsigned int t:5;
139 } HSRBIT;
141 typedef union {
142 HSRBIT bits;
143 BYTES bytes;
144 } HSR;
146 /******************************************************************************
147 *
148 * This structure represents the General Purpose IO Register of the CT8020/8021
149 * The CT8020 is used in the Internet PhoneJACK, and the 8021 in the
150 * Internet LineJACK
151 *
152 ******************************************************************************/
153 typedef struct {
154 unsigned int x:1;
155 unsigned int gpio1:1;
156 unsigned int gpio2:1;
157 unsigned int gpio3:1;
158 unsigned int gpio4:1;
159 unsigned int gpio5:1;
160 unsigned int gpio6:1;
161 unsigned int gpio7:1;
162 unsigned int xread:1;
163 unsigned int gpio1read:1;
164 unsigned int gpio2read:1;
165 unsigned int gpio3read:1;
166 unsigned int gpio4read:1;
167 unsigned int gpio5read:1;
168 unsigned int gpio6read:1;
169 unsigned int gpio7read:1;
170 } GPIOBIT;
172 typedef union {
173 GPIOBIT bits;
174 BYTES bytes;
175 unsigned short word;
176 } GPIO;
178 /******************************************************************************
179 *
180 * This structure represents the Line Monitor status response
181 *
182 ******************************************************************************/
183 typedef struct {
184 unsigned int digit:4;
185 unsigned int cpf_valid:1;
186 unsigned int dtmf_valid:1;
187 unsigned int peak:1;
188 unsigned int z:1;
189 unsigned int f0:1;
190 unsigned int f1:1;
191 unsigned int f2:1;
192 unsigned int f3:1;
193 unsigned int frame:4;
194 } LMON;
196 typedef union {
197 LMON bits;
198 BYTES bytes;
199 } DTMF;
201 typedef struct {
202 unsigned int z:7;
203 unsigned int dtmf_en:1;
204 unsigned int y:4;
205 unsigned int F3:1;
206 unsigned int F2:1;
207 unsigned int F1:1;
208 unsigned int F0:1;
209 } CP;
211 typedef union {
212 CP bits;
213 BYTES bytes;
214 } CPTF;
216 /******************************************************************************
217 *
218 * This structure represents the Status Control Register on the Internet
219 * LineJACK
220 *
221 ******************************************************************************/
222 typedef struct {
223 unsigned int c0:1;
224 unsigned int c1:1;
225 unsigned int stereo:1;
226 unsigned int daafsyncen:1;
227 unsigned int led1:1;
228 unsigned int led2:1;
229 unsigned int led3:1;
230 unsigned int led4:1;
231 } PSCRWI; /* Internet LineJACK and Internet PhoneJACK Lite */
233 typedef struct {
234 unsigned int eidp:1;
235 unsigned int eisd:1;
236 unsigned int x:6;
237 } PSCRWP; /* Internet PhoneJACK PCI */
239 typedef union {
240 PSCRWI bits;
241 PSCRWP pcib;
242 char byte;
243 } PLD_SCRW;
245 typedef struct {
246 unsigned int c0:1;
247 unsigned int c1:1;
248 unsigned int x:1;
249 unsigned int d0ee:1;
250 unsigned int mixerbusy:1;
251 unsigned int sci:1;
252 unsigned int dspflag:1;
253 unsigned int daaflag:1;
254 } PSCRRI;
256 typedef struct {
257 unsigned int eidp:1;
258 unsigned int eisd:1;
259 unsigned int x:4;
260 unsigned int dspflag:1;
261 unsigned int det:1;
262 } PSCRRP;
264 typedef union {
265 PSCRRI bits;
266 PSCRRP pcib;
267 char byte;
268 } PLD_SCRR;
270 /******************************************************************************
271 *
272 * These structures represents the SLIC Control Register on the
273 * Internet LineJACK
274 *
275 ******************************************************************************/
276 typedef struct {
277 unsigned int c1:1;
278 unsigned int c2:1;
279 unsigned int c3:1;
280 unsigned int b2en:1;
281 unsigned int spken:1;
282 unsigned int rly1:1;
283 unsigned int rly2:1;
284 unsigned int rly3:1;
285 } PSLICWRITE;
287 typedef struct {
288 unsigned int state:3;
289 unsigned int b2en:1;
290 unsigned int spken:1;
291 unsigned int c3:1;
292 unsigned int potspstn:1;
293 unsigned int det:1;
294 } PSLICREAD;
296 typedef struct {
297 unsigned int c1:1;
298 unsigned int c2:1;
299 unsigned int c3:1;
300 unsigned int b2en:1;
301 unsigned int e1:1;
302 unsigned int mic:1;
303 unsigned int spk:1;
304 unsigned int x:1;
305 } PSLICPCI;
307 typedef union {
308 PSLICPCI pcib;
309 PSLICWRITE bits;
310 PSLICREAD slic;
311 char byte;
312 } PLD_SLICW;
314 typedef union {
315 PSLICPCI pcib;
316 PSLICREAD bits;
317 char byte;
318 } PLD_SLICR;
320 /******************************************************************************
321 *
322 * These structures represents the Clock Control Register on the
323 * Internet LineJACK
324 *
325 ******************************************************************************/
326 typedef struct {
327 unsigned int clk0:1;
328 unsigned int clk1:1;
329 unsigned int clk2:1;
330 unsigned int x0:1;
331 unsigned int slic_e1:1;
332 unsigned int x1:1;
333 unsigned int x2:1;
334 unsigned int x3:1;
335 } PCLOCK;
337 typedef union {
338 PCLOCK bits;
339 char byte;
340 } PLD_CLOCK;
342 /******************************************************************************
343 *
344 * These structures deal with the mixer on the Internet LineJACK
345 *
346 ******************************************************************************/
348 typedef struct {
349 unsigned short vol[10];
350 unsigned int recsrc;
351 unsigned int modcnt;
352 unsigned short micpreamp;
353 } MIX;
355 /******************************************************************************
356 *
357 * These structures deal with the control logic on the Internet PhoneCARD
358 *
359 ******************************************************************************/
360 typedef struct {
361 unsigned int x0:4; /* unused bits */
363 unsigned int ed:1; /* Event Detect */
365 unsigned int drf:1; /* SmartCABLE Removal Flag 1=no cable */
367 unsigned int dspf:1; /* DSP Flag 1=DSP Ready */
369 unsigned int crr:1; /* Control Register Ready */
371 } COMMAND_REG1;
373 typedef union {
374 COMMAND_REG1 bits;
375 unsigned char byte;
376 } PCMCIA_CR1;
378 typedef struct {
379 unsigned int x0:4; /* unused bits */
381 unsigned int rstc:1; /* SmartCABLE Reset */
383 unsigned int pwr:1; /* SmartCABLE Power */
385 unsigned int x1:2; /* unused bits */
387 } COMMAND_REG2;
389 typedef union {
390 COMMAND_REG2 bits;
391 unsigned char byte;
392 } PCMCIA_CR2;
394 typedef struct {
395 unsigned int addr:5; /* R/W SmartCABLE Register Address */
397 unsigned int rw:1; /* Read / Write flag */
399 unsigned int dev:2; /* 2 bit SmartCABLE Device Address */
401 } CONTROL_REG;
403 typedef union {
404 CONTROL_REG bits;
405 unsigned char byte;
406 } PCMCIA_SCCR;
408 typedef struct {
409 unsigned int hsw:1;
410 unsigned int det:1;
411 unsigned int led2:1;
412 unsigned int led1:1;
413 unsigned int ring1:1;
414 unsigned int ring0:1;
415 unsigned int x:1;
416 unsigned int powerdown:1;
417 } PCMCIA_SLIC_REG;
419 typedef union {
420 PCMCIA_SLIC_REG bits;
421 unsigned char byte;
422 } PCMCIA_SLIC;
424 typedef struct {
425 unsigned int cpd:1; /* Chip Power Down */
427 unsigned int mpd:1; /* MIC Bias Power Down */
429 unsigned int hpd:1; /* Handset Drive Power Down */
431 unsigned int lpd:1; /* Line Drive Power Down */
433 unsigned int spd:1; /* Speaker Drive Power Down */
435 unsigned int x:2; /* unused bits */
437 unsigned int sr:1; /* Software Reset */
439 } Si3CONTROL1;
441 typedef union {
442 Si3CONTROL1 bits;
443 unsigned char byte;
444 } Si3C1;
446 typedef struct {
447 unsigned int al:1; /* Analog Loopback DAC analog -> ADC analog */
449 unsigned int dl2:1; /* Digital Loopback DAC -> ADC one bit */
451 unsigned int dl1:1; /* Digital Loopback ADC -> DAC one bit */
453 unsigned int pll:1; /* 1 = div 10, 0 = div 5 */
455 unsigned int hpd:1; /* HPF disable */
457 unsigned int x:3; /* unused bits */
459 } Si3CONTROL2;
461 typedef union {
462 Si3CONTROL2 bits;
463 unsigned char byte;
464 } Si3C2;
466 typedef struct {
467 unsigned int iir:1; /* 1 enables IIR, 0 enables FIR */
469 unsigned int him:1; /* Handset Input Mute */
471 unsigned int mcm:1; /* MIC In Mute */
473 unsigned int mcg:2; /* MIC In Gain */
475 unsigned int lim:1; /* Line In Mute */
477 unsigned int lig:2; /* Line In Gain */
479 } Si3RXGAIN;
481 typedef union {
482 Si3RXGAIN bits;
483 unsigned char byte;
484 } Si3RXG;
486 typedef struct {
487 unsigned int hom:1; /* Handset Out Mute */
489 unsigned int lom:1; /* Line Out Mute */
491 unsigned int rxg:5; /* RX PGA Gain */
493 unsigned int x:1; /* unused bit */
495 } Si3ADCVOLUME;
497 typedef union {
498 Si3ADCVOLUME bits;
499 unsigned char byte;
500 } Si3ADC;
502 typedef struct {
503 unsigned int srm:1; /* Speaker Right Mute */
505 unsigned int slm:1; /* Speaker Left Mute */
507 unsigned int txg:5; /* TX PGA Gain */
509 unsigned int x:1; /* unused bit */
511 } Si3DACVOLUME;
513 typedef union {
514 Si3DACVOLUME bits;
515 unsigned char byte;
516 } Si3DAC;
518 typedef struct {
519 unsigned int x:5; /* unused bit */
521 unsigned int losc:1; /* Line Out Short Circuit */
523 unsigned int srsc:1; /* Speaker Right Short Circuit */
525 unsigned int slsc:1; /* Speaker Left Short Circuit */
527 } Si3STATUSREPORT;
529 typedef union {
530 Si3STATUSREPORT bits;
531 unsigned char byte;
532 } Si3STAT;
534 typedef struct {
535 unsigned int sot:2; /* Speaker Out Attenuation */
537 unsigned int lot:2; /* Line Out Attenuation */
539 unsigned int x:4; /* unused bits */
541 } Si3ANALOGATTN;
543 typedef union {
544 Si3ANALOGATTN bits;
545 unsigned char byte;
546 } Si3AATT;
548 /******************************************************************************
549 *
550 * These structures deal with the DAA on the Internet LineJACK
551 *
552 ******************************************************************************/
554 typedef struct _DAA_REGS {
555 /*----------------------------------------------- */
556 /* SOP Registers */
557 /* */
558 BYTE bySOP;
560 union _SOP_REGS {
561 struct _SOP {
562 union /* SOP - CR0 Register */
563 {
564 BYTE reg;
565 struct _CR0_BITREGS {
566 BYTE CLK_EXT:1; /* cr0[0:0] */
568 BYTE RIP:1; /* cr0[1:1] */
570 BYTE AR:1; /* cr0[2:2] */
572 BYTE AX:1; /* cr0[3:3] */
574 BYTE FRR:1; /* cr0[4:4] */
576 BYTE FRX:1; /* cr0[5:5] */
578 BYTE IM:1; /* cr0[6:6] */
580 BYTE TH:1; /* cr0[7:7] */
582 } bitreg;
583 } cr0;
585 union /* SOP - CR1 Register */
586 {
587 BYTE reg;
588 struct _CR1_REGS {
589 BYTE RM:1; /* cr1[0:0] */
591 BYTE RMR:1; /* cr1[1:1] */
593 BYTE No_auto:1; /* cr1[2:2] */
595 BYTE Pulse:1; /* cr1[3:3] */
597 BYTE P_Tone1:1; /* cr1[4:4] */
599 BYTE P_Tone2:1; /* cr1[5:5] */
601 BYTE E_Tone1:1; /* cr1[6:6] */
603 BYTE E_Tone2:1; /* cr1[7:7] */
605 } bitreg;
606 } cr1;
608 union /* SOP - CR2 Register */
609 {
610 BYTE reg;
611 struct _CR2_REGS {
612 BYTE Call_II:1; /* CR2[0:0] */
614 BYTE Call_I:1; /* CR2[1:1] */
616 BYTE Call_en:1; /* CR2[2:2] */
618 BYTE Call_pon:1; /* CR2[3:3] */
620 BYTE IDR:1; /* CR2[4:4] */
622 BYTE COT_R:3; /* CR2[5:7] */
624 } bitreg;
625 } cr2;
627 union /* SOP - CR3 Register */
628 {
629 BYTE reg;
630 struct _CR3_REGS {
631 BYTE DHP_X:1; /* CR3[0:0] */
633 BYTE DHP_R:1; /* CR3[1:1] */
635 BYTE Cal_pctl:1; /* CR3[2:2] */
637 BYTE SEL:1; /* CR3[3:3] */
639 BYTE TestLoops:4; /* CR3[4:7] */
641 } bitreg;
642 } cr3;
644 union /* SOP - CR4 Register */
645 {
646 BYTE reg;
647 struct _CR4_REGS {
648 BYTE Fsc_en:1; /* CR4[0:0] */
650 BYTE Int_en:1; /* CR4[1:1] */
652 BYTE AGX:2; /* CR4[2:3] */
654 BYTE AGR_R:2; /* CR4[4:5] */
656 BYTE AGR_Z:2; /* CR4[6:7] */
658 } bitreg;
659 } cr4;
661 union /* SOP - CR5 Register */
662 {
663 BYTE reg;
664 struct _CR5_REGS {
665 BYTE V_0:1; /* CR5[0:0] */
667 BYTE V_1:1; /* CR5[1:1] */
669 BYTE V_2:1; /* CR5[2:2] */
671 BYTE V_3:1; /* CR5[3:3] */
673 BYTE V_4:1; /* CR5[4:4] */
675 BYTE V_5:1; /* CR5[5:5] */
677 BYTE V_6:1; /* CR5[6:6] */
679 BYTE V_7:1; /* CR5[7:7] */
681 } bitreg;
682 } cr5;
684 union /* SOP - CR6 Register */
685 {
686 BYTE reg;
687 struct _CR6_REGS {
688 BYTE reserved:8; /* CR6[0:7] */
690 } bitreg;
691 } cr6;
693 union /* SOP - CR7 Register */
694 {
695 BYTE reg;
696 struct _CR7_REGS {
697 BYTE reserved:8; /* CR7[0:7] */
699 } bitreg;
700 } cr7;
701 } SOP;
703 BYTE ByteRegs[sizeof(struct _SOP)];
705 } SOP_REGS;
707 /* DAA_REGS.SOP_REGS.SOP.CR5.reg */
708 /* DAA_REGS.SOP_REGS.SOP.CR5.bitreg */
709 /* DAA_REGS.SOP_REGS.SOP.CR5.bitreg.V_2 */
710 /* DAA_REGS.SOP_REGS.ByteRegs[5] */
712 /*----------------------------------------------- */
713 /* XOP Registers */
714 /* */
715 BYTE byXOP;
717 union _XOP_REGS {
718 struct _XOP {
719 union XOPXR0/* XOP - XR0 Register - Read values */
720 {
721 BYTE reg;
722 struct _XR0_BITREGS {
723 BYTE SI_0:1; /* XR0[0:0] - Read */
725 BYTE SI_1:1; /* XR0[1:1] - Read */
727 BYTE VDD_OK:1; /* XR0[2:2] - Read */
729 BYTE Caller_ID:1; /* XR0[3:3] - Read */
731 BYTE RING:1; /* XR0[4:4] - Read */
733 BYTE Cadence:1; /* XR0[5:5] - Read */
735 BYTE Wake_up:1; /* XR0[6:6] - Read */
737 BYTE RMR:1; /* XR0[7:7] - Read */
739 } bitreg;
740 } xr0;
742 union /* XOP - XR1 Register */
743 {
744 BYTE reg;
745 struct _XR1_BITREGS {
746 BYTE M_SI_0:1; /* XR1[0:0] */
748 BYTE M_SI_1:1; /* XR1[1:1] */
750 BYTE M_VDD_OK:1; /* XR1[2:2] */
752 BYTE M_Caller_ID:1; /* XR1[3:3] */
754 BYTE M_RING:1; /* XR1[4:4] */
756 BYTE M_Cadence:1; /* XR1[5:5] */
758 BYTE M_Wake_up:1; /* XR1[6:6] */
760 BYTE unused:1; /* XR1[7:7] */
762 } bitreg;
763 } xr1;
765 union /* XOP - XR2 Register */
766 {
767 BYTE reg;
768 struct _XR2_BITREGS {
769 BYTE CTO0:1; /* XR2[0:0] */
771 BYTE CTO1:1; /* XR2[1:1] */
773 BYTE CTO2:1; /* XR2[2:2] */
775 BYTE CTO3:1; /* XR2[3:3] */
777 BYTE CTO4:1; /* XR2[4:4] */
779 BYTE CTO5:1; /* XR2[5:5] */
781 BYTE CTO6:1; /* XR2[6:6] */
783 BYTE CTO7:1; /* XR2[7:7] */
785 } bitreg;
786 } xr2;
788 union /* XOP - XR3 Register */
789 {
790 BYTE reg;
791 struct _XR3_BITREGS {
792 BYTE DCR0:1; /* XR3[0:0] */
794 BYTE DCR1:1; /* XR3[1:1] */
796 BYTE DCI:1; /* XR3[2:2] */
798 BYTE DCU0:1; /* XR3[3:3] */
800 BYTE DCU1:1; /* XR3[4:4] */
802 BYTE B_off:1; /* XR3[5:5] */
804 BYTE AGB0:1; /* XR3[6:6] */
806 BYTE AGB1:1; /* XR3[7:7] */
808 } bitreg;
809 } xr3;
811 union /* XOP - XR4 Register */
812 {
813 BYTE reg;
814 struct _XR4_BITREGS {
815 BYTE C_0:1; /* XR4[0:0] */
817 BYTE C_1:1; /* XR4[1:1] */
819 BYTE C_2:1; /* XR4[2:2] */
821 BYTE C_3:1; /* XR4[3:3] */
823 BYTE C_4:1; /* XR4[4:4] */
825 BYTE C_5:1; /* XR4[5:5] */
827 BYTE C_6:1; /* XR4[6:6] */
829 BYTE C_7:1; /* XR4[7:7] */
831 } bitreg;
832 } xr4;
834 union /* XOP - XR5 Register */
835 {
836 BYTE reg;
837 struct _XR5_BITREGS {
838 BYTE T_0:1; /* XR5[0:0] */
840 BYTE T_1:1; /* XR5[1:1] */
842 BYTE T_2:1; /* XR5[2:2] */
844 BYTE T_3:1; /* XR5[3:3] */
846 BYTE T_4:1; /* XR5[4:4] */
848 BYTE T_5:1; /* XR5[5:5] */
850 BYTE T_6:1; /* XR5[6:6] */
852 BYTE T_7:1; /* XR5[7:7] */
854 } bitreg;
855 } xr5;
857 union /* XOP - XR6 Register - Read Values */
858 {
859 BYTE reg;
860 struct _XR6_BITREGS {
861 BYTE CPS0:1; /* XR6[0:0] */
863 BYTE CPS1:1; /* XR6[1:1] */
865 BYTE unused1:2; /* XR6[2:3] */
867 BYTE CLK_OFF:1; /* XR6[4:4] */
869 BYTE unused2:3; /* XR6[5:7] */
871 } bitreg;
872 } xr6;
874 union /* XOP - XR7 Register */
875 {
876 BYTE reg;
877 struct _XR7_BITREGS {
878 BYTE unused1:1; /* XR7[0:0] */
880 BYTE Vdd0:1; /* XR7[1:1] */
882 BYTE Vdd1:1; /* XR7[2:2] */
884 BYTE unused2:5; /* XR7[3:7] */
886 } bitreg;
887 } xr7;
888 } XOP;
890 BYTE ByteRegs[sizeof(struct _XOP)];
892 } XOP_REGS;
894 /* DAA_REGS.XOP_REGS.XOP.XR7.reg */
895 /* DAA_REGS.XOP_REGS.XOP.XR7.bitreg */
896 /* DAA_REGS.XOP_REGS.XOP.XR7.bitreg.Vdd0 */
897 /* DAA_REGS.XOP_REGS.ByteRegs[7] */
899 /*----------------------------------------------- */
900 /* COP Registers */
901 /* */
902 BYTE byCOP;
904 union _COP_REGS {
905 struct _COP {
906 BYTE THFilterCoeff_1[8]; /* COP - TH Filter Coefficients, CODE=0, Part 1 */
908 BYTE THFilterCoeff_2[8]; /* COP - TH Filter Coefficients, CODE=1, Part 2 */
910 BYTE THFilterCoeff_3[8]; /* COP - TH Filter Coefficients, CODE=2, Part 3 */
912 BYTE RingerImpendance_1[8]; /* COP - Ringer Impendance Coefficients, CODE=3, Part 1 */
914 BYTE IMFilterCoeff_1[8]; /* COP - IM Filter Coefficients, CODE=4, Part 1 */
916 BYTE IMFilterCoeff_2[8]; /* COP - IM Filter Coefficients, CODE=5, Part 2 */
918 BYTE RingerImpendance_2[8]; /* COP - Ringer Impendance Coefficients, CODE=6, Part 2 */
920 BYTE FRRFilterCoeff[8]; /* COP - FRR Filter Coefficients, CODE=7 */
922 BYTE FRXFilterCoeff[8]; /* COP - FRX Filter Coefficients, CODE=8 */
924 BYTE ARFilterCoeff[4]; /* COP - AR Filter Coefficients, CODE=9 */
926 BYTE AXFilterCoeff[4]; /* COP - AX Filter Coefficients, CODE=10 */
928 BYTE Tone1Coeff[4]; /* COP - Tone1 Coefficients, CODE=11 */
930 BYTE Tone2Coeff[4]; /* COP - Tone2 Coefficients, CODE=12 */
932 BYTE LevelmeteringRinging[4]; /* COP - Levelmetering Ringing, CODE=13 */
934 BYTE CallerID1stTone[8]; /* COP - Caller ID 1st Tone, CODE=14 */
936 BYTE CallerID2ndTone[8]; /* COP - Caller ID 2nd Tone, CODE=15 */
938 } COP;
940 BYTE ByteRegs[sizeof(struct _COP)];
942 } COP_REGS;
944 /* DAA_REGS.COP_REGS.COP.XR7.Tone1Coeff[3] */
945 /* DAA_REGS.COP_REGS.COP.XR7.bitreg */
946 /* DAA_REGS.COP_REGS.COP.XR7.bitreg.Vdd0 */
947 /* DAA_REGS.COP_REGS.ByteRegs[57] */
949 /*----------------------------------------------- */
950 /* CAO Registers */
951 /* */
952 BYTE byCAO;
954 union _CAO_REGS {
955 struct _CAO {
956 BYTE CallerID[512]; /* CAO - Caller ID Bytes */
958 } CAO;
960 BYTE ByteRegs[sizeof(struct _CAO)];
961 } CAO_REGS;
963 union /* XOP - XR0 Register - Write values */
964 {
965 BYTE reg;
966 struct _XR0_BITREGSW {
967 BYTE SO_0:1; /* XR1[0:0] - Write */
969 BYTE SO_1:1; /* XR1[1:1] - Write */
971 BYTE SO_2:1; /* XR1[2:2] - Write */
973 BYTE unused:5; /* XR1[3:7] - Write */
975 } bitreg;
976 } XOP_xr0_W;
978 union /* XOP - XR6 Register - Write values */
979 {
980 BYTE reg;
981 struct _XR6_BITREGSW {
982 BYTE unused1:4; /* XR6[0:3] */
984 BYTE CLK_OFF:1; /* XR6[4:4] */
986 BYTE unused2:3; /* XR6[5:7] */
988 } bitreg;
989 } XOP_xr6_W;
991 } DAA_REGS;
993 #define ALISDAA_ID_BYTE 0x81
994 #define ALISDAA_CALLERID_SIZE 512
996 /*------------------------------ */
997 /* */
998 /* Misc definitions */
999 /* */
1001 /* Power Up Operation */
1002 #define SOP_PU_SLEEP 0
1003 #define SOP_PU_RINGING 1
1004 #define SOP_PU_CONVERSATION 2
1005 #define SOP_PU_PULSEDIALING 3
1006 #define SOP_PU_RESET 4
1008 #define ALISDAA_CALLERID_SIZE 512
1010 #define PLAYBACK_MODE_COMPRESSED 0 /* Selects: Compressed modes, TrueSpeech 8.5-4.1, G.723.1, G.722, G.728, G.729 */
1011 #define PLAYBACK_MODE_TRUESPEECH_V40 0 /* Selects: TrueSpeech 8.5, 6.3, 5.3, 4.8 or 4.1 Kbps */
1012 #define PLAYBACK_MODE_TRUESPEECH 8 /* Selects: TrueSpeech 8.5, 6.3, 5.3, 4.8 or 4.1 Kbps Version 5.1 */
1013 #define PLAYBACK_MODE_ULAW 2 /* Selects: 64 Kbit/sec MuA-law PCM */
1014 #define PLAYBACK_MODE_ALAW 10 /* Selects: 64 Kbit/sec A-law PCM */
1015 #define PLAYBACK_MODE_16LINEAR 6 /* Selects: 128 Kbit/sec 16-bit linear */
1016 #define PLAYBACK_MODE_8LINEAR 4 /* Selects: 64 Kbit/sec 8-bit signed linear */
1017 #define PLAYBACK_MODE_8LINEAR_WSS 5 /* Selects: 64 Kbit/sec WSS 8-bit unsigned linear */
1019 #define RECORD_MODE_COMPRESSED 0 /* Selects: Compressed modes, TrueSpeech 8.5-4.1, G.723.1, G.722, G.728, G.729 */
1020 #define RECORD_MODE_TRUESPEECH 0 /* Selects: TrueSpeech 8.5, 6.3, 5.3, 4.8 or 4.1 Kbps */
1021 #define RECORD_MODE_ULAW 4 /* Selects: 64 Kbit/sec Mu-law PCM */
1022 #define RECORD_MODE_ALAW 12 /* Selects: 64 Kbit/sec A-law PCM */
1023 #define RECORD_MODE_16LINEAR 5 /* Selects: 128 Kbit/sec 16-bit linear */
1024 #define RECORD_MODE_8LINEAR 6 /* Selects: 64 Kbit/sec 8-bit signed linear */
1025 #define RECORD_MODE_8LINEAR_WSS 7 /* Selects: 64 Kbit/sec WSS 8-bit unsigned linear */
1027 enum SLIC_STATES {
1028 PLD_SLIC_STATE_OC = 0,
1029 PLD_SLIC_STATE_RINGING,
1030 PLD_SLIC_STATE_ACTIVE,
1031 PLD_SLIC_STATE_OHT,
1032 PLD_SLIC_STATE_TIPOPEN,
1033 PLD_SLIC_STATE_STANDBY,
1034 PLD_SLIC_STATE_APR,
1035 PLD_SLIC_STATE_OHTPR
1036 };
1038 enum SCI_CONTROL {
1039 SCI_End = 0,
1040 SCI_Enable_DAA,
1041 SCI_Enable_Mixer,
1042 SCI_Enable_EEPROM
1043 };
1045 enum Mode {
1046 T63, T53, T48, T40
1047 };
1048 enum Dir {
1049 V3_TO_V4, V4_TO_V3, V4_TO_V5, V5_TO_V4
1050 };
1052 typedef struct Proc_Info_Tag {
1053 enum Mode convert_mode;
1054 enum Dir convert_dir;
1055 int Prev_Frame_Type;
1056 int Current_Frame_Type;
1057 } Proc_Info_Type;
1059 enum PREVAL {
1060 NORMAL = 0,
1061 NOPOST,
1062 POSTONLY,
1063 PREERROR
1064 };
1066 enum IXJ_EXTENSIONS {
1067 G729LOADER = 0,
1068 TS85LOADER,
1069 PRE_READ,
1070 POST_READ,
1071 PRE_WRITE,
1072 POST_WRITE,
1073 PRE_IOCTL,
1074 POST_IOCTL
1075 };
1077 typedef struct {
1078 char enable;
1079 char en_filter;
1080 unsigned int filter;
1081 unsigned int state; /* State 0 when cadence has not started. */
1083 unsigned int on1; /* State 1 */
1085 unsigned long on1min; /* State 1 - 10% + jiffies */
1086 unsigned long on1dot; /* State 1 + jiffies */
1088 unsigned long on1max; /* State 1 + 10% + jiffies */
1090 unsigned int off1; /* State 2 */
1092 unsigned long off1min;
1093 unsigned long off1dot; /* State 2 + jiffies */
1094 unsigned long off1max;
1095 unsigned int on2; /* State 3 */
1097 unsigned long on2min;
1098 unsigned long on2dot;
1099 unsigned long on2max;
1100 unsigned int off2; /* State 4 */
1102 unsigned long off2min;
1103 unsigned long off2dot; /* State 4 + jiffies */
1104 unsigned long off2max;
1105 unsigned int on3; /* State 5 */
1107 unsigned long on3min;
1108 unsigned long on3dot;
1109 unsigned long on3max;
1110 unsigned int off3; /* State 6 */
1112 unsigned long off3min;
1113 unsigned long off3dot; /* State 6 + jiffies */
1114 unsigned long off3max;
1115 } IXJ_CADENCE_F;
1117 typedef struct {
1118 unsigned int busytone:1;
1119 unsigned int dialtone:1;
1120 unsigned int ringback:1;
1121 unsigned int ringing:1;
1122 unsigned int playing:1;
1123 unsigned int recording:1;
1124 unsigned int cringing:1;
1125 unsigned int play_first_frame:1;
1126 unsigned int pstn_present:1;
1127 unsigned int pstn_ringing:1;
1128 unsigned int pots_correct:1;
1129 unsigned int pots_pstn:1;
1130 unsigned int g729_loaded:1;
1131 unsigned int ts85_loaded:1;
1132 unsigned int dtmf_oob:1; /* DTMF Out-Of-Band */
1134 unsigned int pcmciascp:1; /* SmartCABLE Present */
1136 unsigned int pcmciasct:2; /* SmartCABLE Type */
1138 unsigned int pcmciastate:3; /* SmartCABLE Init State */
1140 unsigned int inwrite:1; /* Currently writing */
1142 unsigned int inread:1; /* Currently reading */
1144 unsigned int incheck:1; /* Currently checking the SmartCABLE */
1146 unsigned int cidplay:1; /* Currently playing Caller ID */
1148 unsigned int cidring:1; /* This is the ring for Caller ID */
1150 unsigned int cidsent:1; /* Caller ID has been sent */
1152 unsigned int cidcw_ack:1; /* Caller ID CW ACK (from CPE) */
1153 unsigned int firstring:1; /* First ring cadence is complete */
1154 unsigned int pstncheck:1; /* Currently checking the PSTN Line */
1155 unsigned int pstn_rmr:1;
1156 unsigned int x:3; /* unsed bits */
1158 } IXJ_FLAGS;
1160 /******************************************************************************
1162 * This structure holds the state of all of the Quicknet cards
1164 ******************************************************************************/
1166 typedef struct {
1167 int elements_used;
1168 IXJ_CADENCE_TERM termination;
1169 IXJ_CADENCE_ELEMENT *ce;
1170 } ixj_cadence;
1172 typedef struct {
1173 struct phone_device p;
1174 struct timer_list timer;
1175 unsigned int board;
1176 unsigned int DSPbase;
1177 unsigned int XILINXbase;
1178 unsigned int serial;
1179 atomic_t DSPWrite;
1180 struct phone_capability caplist[30];
1181 unsigned int caps;
1182 struct pnp_dev *dev;
1183 unsigned int cardtype;
1184 unsigned int rec_codec;
1185 unsigned int cid_rec_codec;
1186 unsigned int cid_rec_volume;
1187 unsigned char cid_rec_flag;
1188 signed char rec_mode;
1189 unsigned int play_codec;
1190 unsigned int cid_play_codec;
1191 unsigned int cid_play_volume;
1192 unsigned char cid_play_flag;
1193 signed char play_mode;
1194 IXJ_FLAGS flags;
1195 unsigned long busyflags;
1196 unsigned int rec_frame_size;
1197 unsigned int play_frame_size;
1198 unsigned int cid_play_frame_size;
1199 unsigned int cid_base_frame_size;
1200 unsigned long cidcw_wait;
1201 int aec_level;
1202 int cid_play_aec_level;
1203 int readers, writers;
1204 wait_queue_head_t poll_q;
1205 wait_queue_head_t read_q;
1206 char *read_buffer, *read_buffer_end;
1207 char *read_convert_buffer;
1208 size_t read_buffer_size;
1209 unsigned int read_buffer_ready;
1210 wait_queue_head_t write_q;
1211 char *write_buffer, *write_buffer_end;
1212 char *write_convert_buffer;
1213 size_t write_buffer_size;
1214 unsigned int write_buffers_empty;
1215 unsigned long drybuffer;
1216 char *write_buffer_rp, *write_buffer_wp;
1217 char dtmfbuffer[80];
1218 char dtmf_current;
1219 int dtmf_wp, dtmf_rp, dtmf_state, dtmf_proc;
1220 int tone_off_time, tone_on_time;
1221 struct fasync_struct *async_queue;
1222 unsigned long tone_start_jif;
1223 char tone_index;
1224 char tone_state;
1225 char maxrings;
1226 ixj_cadence *cadence_t;
1227 ixj_cadence *cadence_r;
1228 int tone_cadence_state;
1229 IXJ_CADENCE_F cadence_f[6];
1230 DTMF dtmf;
1231 CPTF cptf;
1232 BYTES dsp;
1233 BYTES ver;
1234 BYTES scr;
1235 BYTES ssr;
1236 BYTES baseframe;
1237 HSR hsr;
1238 GPIO gpio;
1239 PLD_SCRR pld_scrr;
1240 PLD_SCRW pld_scrw;
1241 PLD_SLICW pld_slicw;
1242 PLD_SLICR pld_slicr;
1243 PLD_CLOCK pld_clock;
1244 PCMCIA_CR1 pccr1;
1245 PCMCIA_CR2 pccr2;
1246 PCMCIA_SCCR psccr;
1247 PCMCIA_SLIC pslic;
1248 char pscdd;
1249 Si3C1 sic1;
1250 Si3C2 sic2;
1251 Si3RXG sirxg;
1252 Si3ADC siadc;
1253 Si3DAC sidac;
1254 Si3STAT sistat;
1255 Si3AATT siaatt;
1256 MIX mix;
1257 unsigned short ring_cadence;
1258 int ring_cadence_t;
1259 unsigned long ring_cadence_jif;
1260 unsigned long checkwait;
1261 int intercom;
1262 int m_hook;
1263 int r_hook;
1264 int p_hook;
1265 char pstn_envelope;
1266 char pstn_cid_intr;
1267 unsigned char fskz;
1268 unsigned char fskphase;
1269 unsigned char fskcnt;
1270 unsigned int cidsize;
1271 unsigned int cidcnt;
1272 unsigned long pstn_cid_received;
1273 PHONE_CID cid;
1274 PHONE_CID cid_send;
1275 unsigned long pstn_ring_int;
1276 unsigned long pstn_ring_start;
1277 unsigned long pstn_ring_stop;
1278 unsigned long pstn_winkstart;
1279 unsigned long pstn_last_rmr;
1280 unsigned long pstn_prev_rmr;
1281 unsigned long pots_winkstart;
1282 unsigned int winktime;
1283 unsigned long flash_end;
1284 char port;
1285 char hookstate;
1286 union telephony_exception ex;
1287 union telephony_exception ex_sig;
1288 int ixj_signals[35];
1289 IXJ_SIGDEF sigdef;
1290 char daa_mode;
1291 char daa_country;
1292 unsigned long pstn_sleeptil;
1293 DAA_REGS m_DAAShadowRegs;
1294 Proc_Info_Type Info_read;
1295 Proc_Info_Type Info_write;
1296 unsigned short frame_count;
1297 unsigned int filter_hist[4];
1298 unsigned char filter_en[4];
1299 unsigned short proc_load;
1300 unsigned long framesread;
1301 unsigned long frameswritten;
1302 unsigned long read_wait;
1303 unsigned long write_wait;
1304 unsigned long timerchecks;
1305 unsigned long txreadycheck;
1306 unsigned long rxreadycheck;
1307 unsigned long statuswait;
1308 unsigned long statuswaitfail;
1309 unsigned long pcontrolwait;
1310 unsigned long pcontrolwaitfail;
1311 unsigned long iscontrolready;
1312 unsigned long iscontrolreadyfail;
1313 unsigned long pstnstatecheck;
1314 #ifdef IXJ_DYN_ALLOC
1315 short *fskdata;
1316 #else
1317 short fskdata[8000];
1318 #endif
1319 int fsksize;
1320 int fskdcnt;
1321 } IXJ;
1323 typedef int (*IXJ_REGFUNC) (IXJ * j, unsigned long arg);
1325 extern IXJ *ixj_pcmcia_probe(unsigned long, unsigned long);