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 + -
显示快捷键?