ixj.c

来自「linux 内核源代码」· C语言 代码 · 共 2,169 行 · 第 1/5 页

C
2,169
字号
	var = 10;	XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;	daaint.reg = 0;	XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;	j->pld_scrr.byte = inb_p(j->XILINXbase);	if (j->pld_scrr.bits.daaflag) {		daa_int_read(j);		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {			if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {				daaint.bitreg.RING = 1;				if(ixjdebug & 0x0008) {					printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);				}			} else {				daa_set_mode(j, SOP_PU_RESET);			}		}		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {			daaint.bitreg.Caller_ID = 1;			j->pstn_cid_intr = 1;			j->pstn_cid_received = jiffies;			if(ixjdebug & 0x0008) {				printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);			}		}		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {			daaint.bitreg.Cadence = 1;			if(ixjdebug & 0x0008) {				printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);			}		}		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {			daaint.bitreg.VDD_OK = 1;			daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;		}	}	daa_CR_read(j, 1);	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)) {		daaint.bitreg.RMR = 1;		daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;		if(ixjdebug & 0x0008) {                        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);		}		j->pstn_prev_rmr = j->pstn_last_rmr;		j->pstn_last_rmr = jiffies;	}	switch(j->daa_mode) {		case SOP_PU_SLEEP:			if (daaint.bitreg.RING) {				if (!j->flags.pstn_ringing) {					if (j->daa_mode != SOP_PU_RINGING) {						j->pstn_ring_int = jiffies;						daa_set_mode(j, SOP_PU_RINGING);					}				}			}			break;		case SOP_PU_RINGING:			if (daaint.bitreg.RMR) {				if (ixjdebug & 0x0008) {					printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);				}				if (daaint.bitreg.SI_1) {                /* Rising edge of RMR */					j->flags.pstn_rmr = 1;					j->pstn_ring_start = jiffies;					j->pstn_ring_stop = 0;					j->ex.bits.pstn_ring = 0;					if (j->cadence_f[4].state == 0) {						j->cadence_f[4].state = 1;						j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);						j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);						j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);					} else if (j->cadence_f[4].state == 2) {						if((time_after(jiffies, j->cadence_f[4].off1min) &&						    time_before(jiffies, j->cadence_f[4].off1max))) {							if (j->cadence_f[4].on2) {								j->cadence_f[4].state = 3;								j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));								j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));								j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));							} else {								j->cadence_f[4].state = 7;							}						} else {							if (ixjdebug & 0x0008) {								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,										j->cadence_f[4].off1);							}							j->cadence_f[4].state = 0;						}					} else if (j->cadence_f[4].state == 4) {						if((time_after(jiffies, j->cadence_f[4].off2min) &&						    time_before(jiffies, j->cadence_f[4].off2max))) {							if (j->cadence_f[4].on3) {								j->cadence_f[4].state = 5;								j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));								j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));								j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));							} else {								j->cadence_f[4].state = 7;							}						} else {							if (ixjdebug & 0x0008) {								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,										j->cadence_f[4].off2);							}							j->cadence_f[4].state = 0;						}					} else if (j->cadence_f[4].state == 6) {						if((time_after(jiffies, j->cadence_f[4].off3min) &&						    time_before(jiffies, j->cadence_f[4].off3max))) {							j->cadence_f[4].state = 7;						} else {							if (ixjdebug & 0x0008) {								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,										j->cadence_f[4].off3);							}							j->cadence_f[4].state = 0;						}					} else {						j->cadence_f[4].state = 0;					}				} else {                                /* Falling edge of RMR */					j->pstn_ring_start = 0;					j->pstn_ring_stop = jiffies;					if (j->cadence_f[4].state == 1) {						if(!j->cadence_f[4].on1) {							j->cadence_f[4].state = 7;						} else if((time_after(jiffies, j->cadence_f[4].on1min) &&					          time_before(jiffies, j->cadence_f[4].on1max))) {							if (j->cadence_f[4].off1) {								j->cadence_f[4].state = 2;								j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));								j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));								j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));							} else {								j->cadence_f[4].state = 7;							}						} else {							if (ixjdebug & 0x0008) {								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,										j->cadence_f[4].on1);							}							j->cadence_f[4].state = 0;						}					} else if (j->cadence_f[4].state == 3) {						if((time_after(jiffies, j->cadence_f[4].on2min) &&						    time_before(jiffies, j->cadence_f[4].on2max))) {							if (j->cadence_f[4].off2) {								j->cadence_f[4].state = 4;								j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));								j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));								j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));							} else {								j->cadence_f[4].state = 7;							}						} else {							if (ixjdebug & 0x0008) {								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,										j->cadence_f[4].on2);							}							j->cadence_f[4].state = 0;						}					} else if (j->cadence_f[4].state == 5) {						if((time_after(jiffies, j->cadence_f[4].on3min) &&						    time_before(jiffies, j->cadence_f[4].on3max))) {							if (j->cadence_f[4].off3) {								j->cadence_f[4].state = 6;								j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));								j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));								j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));							} else {								j->cadence_f[4].state = 7;							}						} else {							j->cadence_f[4].state = 0;						}					} else {						if (ixjdebug & 0x0008) {							printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",									j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,									j->cadence_f[4].on3);						}						j->cadence_f[4].state = 0;					}				}				if (ixjdebug & 0x0010) {					printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);				}				if (ixjdebug & 0x0010) {					switch(j->cadence_f[4].state) {						case 1:							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,						j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);							break;						case 2:							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,						j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);							break;						case 3:							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,						j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);							break;						case 4:							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,						j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);							break;						case 5:							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,						j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);							break;						case 6:								printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,						j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);							break;					}				}			}			if (j->cadence_f[4].state == 7) {				j->cadence_f[4].state = 0;				j->pstn_ring_stop = jiffies;				j->ex.bits.pstn_ring = 1;				ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);				if(ixjdebug & 0x0008) {					printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);				}			}			if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||			   (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {				if(ixjdebug & 0x0008) {					printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);					printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);					printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);				}				j->pstn_ring_stop = j->pstn_ring_int = 0;				daa_set_mode(j, SOP_PU_SLEEP);			} 			outb_p(j->pld_scrw.byte, j->XILINXbase);			if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {				ixj_daa_cid_read(j);				j->ex.bits.caller_id = 1;				ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);				j->pstn_cid_intr = 0;			}			if (daaint.bitreg.Cadence) {				if(ixjdebug & 0x0008) {					printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);				}				daa_set_mode(j, SOP_PU_SLEEP);				j->ex.bits.pstn_ring = 0;			}			break;		case SOP_PU_CONVERSATION:			if (daaint.bitreg.VDD_OK) {				if(!daaint.bitreg.SI_0) {					if (!j->pstn_winkstart) {						if(ixjdebug & 0x0008) {							printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);						}						j->pstn_winkstart = jiffies;					} 				} else {					if (j->pstn_winkstart) {						if(ixjdebug & 0x0008) {							printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);						}						j->pstn_winkstart = 0;					}				}			}			if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {				if(ixjdebug & 0x0008) {					printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);				}				daa_set_mode(j, SOP_PU_SLEEP);				j->pstn_winkstart = 0;				j->ex.bits.pstn_wink = 1;				ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);			}			break;	}}static void ixj_timeout(unsigned long ptr){	int board;	unsigned long jifon;	IXJ *j = (IXJ *)ptr;	board = j->board;	if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {		ixj_perfmon(j->timerchecks);		j->hookstate = ixj_hookstate(j);		if (j->tone_state) {			if (!(j->hookstate)) {				ixj_cpt_stop(j);				if (j->m_hook) {					j->m_hook = 0;					j->ex.bits.hookstate = 1;					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);				}				clear_bit(board, &j->busyflags);				ixj_add_timer(j);				return;			}			if (j->tone_state == 1)				jifon = ((hertz * j->tone_on_time) * 25 / 100000);			else				jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);			if (time_before(jiffies, j->tone_start_jif + jifon)) {				if (j->tone_state == 1) {					ixj_play_tone(j, j->tone_index);					if (j->dsp.low == 0x20) {						clear_bit(board, &j->busyflags);						ixj_add_timer(j);						return;					}				} else {					ixj_play_tone(j, 0);					if (j->dsp.low == 0x20) {						clear_bit(board, &j->busyflags);						ixj_add_timer(j);						return;					}				}			} else {				ixj_tone_timeout(j);				if (j->flags.dialtone) {					ixj_dialtone(j);				}				if (j->flags.busytone) {					ixj_busytone(j);					if (j->dsp.low == 0x20) {						clear_bit(board, &j->busyflags);						ixj_add_timer(j);						return;					}				}				if (j->flags.ringback) {					ixj_ringback(j);					if (j->dsp.low == 0x20) {						clear_bit(board, &j->busyflags);						ixj_add_timer(j);						return;					}				}				if (!j->tone_state) {					ixj_cpt_stop(j);				}			}		}		if (!(j->tone_state && j->dsp.low == 0x20)) {			if (IsRxReady(j)) {				ixj_read_frame(j);			}			if (IsTxReady(j)) {				ixj_write_frame(j);			}		}		if (j->flags.cringing) {			if (j->hookstate & 1) {				j->flags.cringing = 0;				ixj_ring_off(j);			} else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {				switch(j->cadence_f[5].state) {					case 0:						j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));						if (time_before(jiffies, j->cadence_f[5].on1dot)) {							if(ixjdebug & 0x0004) {								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);							}							ixj_ring_on(j);						}						j->cadence_f[5].state = 1;						break;					case 1:						if (time_after(jiffies, j->cadence_f[5].on1dot)) {							j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));							if(ixjdebug & 0x0004) {								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);							}							ixj_ring_off(j);							j->cadence_f[5].state = 2;						}						break;					case 2:						if (time_after(jiffies, j->cadence_f[5].off1dot)) {							if(ixjdebug & 0x0004) {								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);							}							ixj_ring_on(j);							if (j->cadence_f[5].on2) {								j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));								j->cadence_f[5].state = 3;							} else {								j->cadence_f[5].state = 7;							}						}						break;					case 3:						if (time_after(jiffies, j->cadence_f[5].on2dot)) {							if(ixjdebug & 0x0004) {								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);							}							ixj_ring_off(j);							if (j->cadence_f[5].off2) {								j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));								j->cadence_f[5].state = 4;							} else {								j->cadence_f[5].state = 7;							}						}						break;					case 4:						if (time_after(jiffies, j->cadence_f[5].off2dot)) {							if(ixjdebug & 0x0004) {								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);							}							ixj_ring_on(j);							if (j->cadence_f[5].on3) {								j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));								j->cadence_f[5].state = 5;							} else {								j->cadence_f[5].state = 7;							}						}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?