Lines Matching refs:c
45 static void ct_hdlc_interrupt (ct_chan_t *c, int imvr);
48 static void ct_e1timer_interrupt (ct_chan_t *c);
67 ct_chan_t *c; in ct_open_board() local
76 for (c=b->chan; c<b->chan+NCHAN; ++c) { in ct_open_board()
77 c->call_on_tx = 0; in ct_open_board()
78 c->call_on_rx = 0; in ct_open_board()
79 c->call_on_msig = 0; in ct_open_board()
80 c->call_on_scc = 0; in ct_open_board()
81 c->call_on_err = 0; in ct_open_board()
85 for (c=b->chan; c<b->chan+NCHAN; ++c) { in ct_open_board()
86 c->sccrx_empty = c->scctx_empty = 1; in ct_open_board()
87 c->sccrx_b = c->sccrx_e = 0; in ct_open_board()
88 c->scctx_b = c->scctx_e = 0; in ct_open_board()
89 c->e1_first_int = 1; in ct_open_board()
144 static void ct_g703_rate (ct_chan_t *c, unsigned long rate) in ct_g703_rate() argument
146 c->gopt.rate = rate; in ct_g703_rate()
147 ct_setup_g703 (c->board); in ct_g703_rate()
153 static void ct_chan_baud (ct_chan_t *c, unsigned long baud) in ct_chan_baud() argument
155 c->baud = baud; in ct_chan_baud()
157 c->hopt.txs = CLK_INT; in ct_chan_baud()
159 ct_set_dpll (c, 0); in ct_chan_baud()
160 c->hopt.txs = CLK_LINE; in ct_chan_baud()
162 ct_update_chan (c); in ct_chan_baud()
165 void ct_set_baud (ct_chan_t *c, unsigned long baud) in ct_set_baud() argument
169 if (c->mode == M_E1) in ct_set_baud()
171 if (c->mode == M_G703) { in ct_set_baud()
178 ct_g703_rate (c, r); in ct_set_baud()
180 ct_chan_baud (c, baud); in ct_set_baud()
231 int ct_set_clk (ct_chan_t *c, int clk) in ct_set_clk() argument
233 if (c->num) in ct_set_clk()
234 c->board->opt.clk1 = clk; in ct_set_clk()
236 c->board->opt.clk0 = clk; in ct_set_clk()
237 if (c->mode == M_E1) { in ct_set_clk()
238 ct_setup_e1 (c->board); in ct_set_clk()
240 } if (c->mode == M_G703) { in ct_set_clk()
241 ct_setup_g703 (c->board); in ct_set_clk()
247 int ct_get_clk (ct_chan_t *c) in ct_get_clk() argument
249 return c->num ? c->board->opt.clk1 : c->board->opt.clk0; in ct_get_clk()
252 int ct_set_ts (ct_chan_t *c, unsigned long ts) in ct_set_ts() argument
254 if (! (c->mode == M_E1)) in ct_set_ts()
256 if (c->num) in ct_set_ts()
257 c->board->opt.s1 = ts; in ct_set_ts()
259 c->board->opt.s0 = ts; in ct_set_ts()
260 ct_setup_e1 (c->board); in ct_set_ts()
273 int ct_set_higain (ct_chan_t *c, int on) in ct_set_higain() argument
275 if (! (c->mode == M_E1)) in ct_set_higain()
277 c->gopt.higain = on ? 1 : 0; in ct_set_higain()
278 ct_setup_e1 (c->board); in ct_set_higain()
285 void ct_start_scc (ct_chan_t *c, char *rxbuf, char *txbuf) in ct_start_scc() argument
287 c->sccrx = rxbuf; in ct_start_scc()
288 c->scctx = txbuf; in ct_start_scc()
291 if (c->board->type != B_TAU_E1 && c->board->type != B_TAU_E1C && in ct_start_scc()
292 c->board->type != B_TAU2_E1) in ct_start_scc()
295 cte_out2 (c->board->port, c->num ? AM_IMR : AM_IMR | AM_A, in ct_start_scc()
297 cte_out2 (c->board->port, AM_MICR, MICR_MIE); in ct_start_scc()
303 void ct_start_chan (ct_chan_t *c, ct_buf_t *cb, unsigned long phys) in ct_start_chan() argument
313 c->tdesc = cb->descbuf; in ct_start_chan()
314 c->tdphys[0] = phys + ((char*)c->tdesc - (char*)cb); in ct_start_chan()
315 bound = ((c->tdphys[0] + 0xffff) & ~(0xffffUL)); in ct_start_chan()
316 if (bound < c->tdphys[0] + 2*NBUF*sizeof(ct_desc_t)) { in ct_start_chan()
317 c->tdesc = (ct_desc_t*) ((char*) c->tdesc + in ct_start_chan()
318 (bound - c->tdphys[0])); in ct_start_chan()
319 c->tdphys[0] = bound; in ct_start_chan()
321 c->rdesc = c->tdesc + NBUF; in ct_start_chan()
325 c->rbuf[i] = cb->rbuffer[i]; in ct_start_chan()
326 c->tbuf[i] = cb->tbuffer[i]; in ct_start_chan()
331 c->rphys[i] = phys + ((char*)c->rbuf[i] - (char*)cb); in ct_start_chan()
332 c->tphys[i] = phys + ((char*)c->tbuf[i] - (char*)cb); in ct_start_chan()
333 c->rdphys[i] = phys + ((char*)(c->rdesc+i) - (char*)cb); in ct_start_chan()
334 c->tdphys[i] = phys + ((char*)(c->tdesc+i) - (char*)cb); in ct_start_chan()
340 B_NEXT (c->rdesc[i]) = c->rdphys[(i+1) % NBUF] & 0xffff; in ct_start_chan()
341 B_PTR (c->rdesc[i]) = c->rphys[i]; in ct_start_chan()
342 B_LEN (c->rdesc[i]) = DMABUFSZ; in ct_start_chan()
343 B_STATUS (c->rdesc[i]) = 0; in ct_start_chan()
347 B_NEXT (c->tdesc[i]) = c->tdphys[(i+1) % NBUF] & 0xffff; in ct_start_chan()
348 B_PTR (c->tdesc[i]) = c->tphys[i]; in ct_start_chan()
349 B_LEN (c->tdesc[i]) = DMABUFSZ; in ct_start_chan()
350 B_STATUS (c->tdesc[i]) = FST_EOM; in ct_start_chan()
351 c->attach[i] = 0; in ct_start_chan()
354 if (c->type & T_E1) { in ct_start_chan()
355 c->mode = M_E1; in ct_start_chan()
356 if (c->num && c->board->opt.cfg == CFG_B) in ct_start_chan()
357 c->mode = M_HDLC; in ct_start_chan()
359 if (c->type & T_G703) { in ct_start_chan()
360 c->mode = M_G703; in ct_start_chan()
361 if (c->num && c->board->opt.cfg == CFG_B) in ct_start_chan()
362 c->mode = M_HDLC; in ct_start_chan()
364 ct_update_chan (c); in ct_start_chan()
367 c->rn = 0; in ct_start_chan()
368 ct_start_receiver (c, 1 , c->rphys[0], DMABUFSZ, c->rdphys[0], in ct_start_chan()
369 c->rdphys[NBUF-1]); in ct_start_chan()
370 outb (c->IE1, inb (c->IE1) | IE1_CDCDE); in ct_start_chan()
371 outb (c->IE0, inb (c->IE0) | IE0_RX_INTE); in ct_start_chan()
372 ier0 = inb (IER0(c->board->port)); in ct_start_chan()
373 ier0 |= c->num ? IER0_RX_INTE_1 : IER0_RX_INTE_0; in ct_start_chan()
374 outb (IER0(c->board->port), ier0); in ct_start_chan()
377 c->tn = 0; in ct_start_chan()
378 c->te = 0; in ct_start_chan()
379 ct_start_transmitter (c, 1 , c->tphys[0], DMABUFSZ, c->tdphys[0], in ct_start_chan()
380 c->tdphys[0]); in ct_start_chan()
381 outb (c->TX.DIR, DIR_CHAIN_EOME | DIR_CHAIN_BOFE | DIR_CHAIN_COFE); in ct_start_chan()
384 ct_set_dtr (c, 0); in ct_start_chan()
385 ct_set_rts (c, 0); in ct_start_chan()
391 void ct_enable_receive (ct_chan_t *c, int on) in ct_enable_receive() argument
395 st3 = inb (c->ST3); in ct_enable_receive()
398 c->rn = 0; in ct_enable_receive()
399 ct_start_receiver (c, 1 , c->rphys[0], DMABUFSZ, c->rdphys[0], in ct_enable_receive()
400 c->rdphys[NBUF-1]); in ct_enable_receive()
402 outb (c->IE1, inb (c->IE1) | IE1_CDCDE); in ct_enable_receive()
403 outb (c->IE0, inb (c->IE0) | IE0_RX_INTE); in ct_enable_receive()
404 ier0 = inb (IER0(c->board->port)); in ct_enable_receive()
405 ier0 |= c->num ? IER0_RX_INTE_1 : IER0_RX_INTE_0; in ct_enable_receive()
406 outb (IER0(c->board->port), ier0); in ct_enable_receive()
407 ct_set_rts (c, 1); in ct_enable_receive()
409 ct_set_rts (c, 0); in ct_enable_receive()
410 outb (c->CMD, CMD_RX_DISABLE); in ct_enable_receive()
412 ier0 = inb (IER0(c->board->port)); in ct_enable_receive()
413 ier0 &= c->num ? ~(IER0_RX_INTE_1 | IER0_RX_RDYE_1) : in ct_enable_receive()
415 outb (IER0(c->board->port), ier0); in ct_enable_receive()
417 ier1 = inb (IER1(c->board->port)); in ct_enable_receive()
418 ier1 &= c->num ? ~(IER1_RX_DMERE_1 | IER1_RX_DME_1) : in ct_enable_receive()
420 outb (IER1(c->board->port), ier1); in ct_enable_receive()
428 void ct_enable_transmit (ct_chan_t *c, int on) in ct_enable_transmit() argument
432 st3 = inb (c->ST3); in ct_enable_transmit()
435 c->tn = 0; in ct_enable_transmit()
436 c->te = 0; in ct_enable_transmit()
437 ct_start_transmitter (c, 1 , c->tphys[0], DMABUFSZ, in ct_enable_transmit()
438 c->tdphys[0], c->tdphys[0]); in ct_enable_transmit()
439 outb (c->TX.DIR, in ct_enable_transmit()
442 outb (c->CMD, CMD_TX_DISABLE); in ct_enable_transmit()
444 ier0 = inb (IER0(c->board->port)); in ct_enable_transmit()
445 ier0 &= c->num ? ~(IER0_TX_INTE_1 | IER0_TX_RDYE_1) : in ct_enable_transmit()
447 outb (IER0(c->board->port), ier0); in ct_enable_transmit()
449 ier1 = inb (IER1(c->board->port)); in ct_enable_transmit()
450 ier1 &= c->num ? ~(IER1_TX_DMERE_1 | IER1_TX_DME_1) : in ct_enable_transmit()
452 outb (IER1(c->board->port), ier1); in ct_enable_transmit()
481 int ct_get_dpll (ct_chan_t *c) in ct_get_dpll() argument
483 return (c->hopt.rxs == CLK_RXS_DPLL_INT); in ct_get_dpll()
486 void ct_set_dpll (ct_chan_t *c, int on) in ct_set_dpll() argument
488 if (on && ct_get_baud (c)) in ct_set_dpll()
489 c->hopt.rxs = CLK_RXS_DPLL_INT; in ct_set_dpll()
491 c->hopt.rxs = CLK_LINE; in ct_set_dpll()
492 ct_update_chan (c); in ct_set_dpll()
495 int ct_get_nrzi (ct_chan_t *c) in ct_get_nrzi() argument
497 return (c->opt.md2.encod == MD2_ENCOD_NRZI); in ct_get_nrzi()
503 void ct_set_nrzi (ct_chan_t *c, int on) in ct_set_nrzi() argument
505 c->opt.md2.encod = on ? MD2_ENCOD_NRZI : MD2_ENCOD_NRZ; in ct_set_nrzi()
506 outb (c->MD2, *(unsigned char*)&c->opt.md2); in ct_set_nrzi()
512 void ct_set_invtxc (ct_chan_t *c, int on) in ct_set_invtxc() argument
514 if (on) c->board->bcr2 |= (c->num ? BCR2_INVTXC1 : BCR2_INVTXC0); in ct_set_invtxc()
515 else c->board->bcr2 &= ~(c->num ? BCR2_INVTXC1 : BCR2_INVTXC0); in ct_set_invtxc()
516 outb (BCR2(c->board->port), c->board->bcr2); in ct_set_invtxc()
519 int ct_get_invtxc (ct_chan_t *c) in ct_get_invtxc() argument
521 return (c->board->bcr2 & (c->num ? BCR2_INVTXC1 : BCR2_INVTXC0)) != 0; in ct_get_invtxc()
527 void ct_set_invrxc (ct_chan_t *c, int on) in ct_set_invrxc() argument
529 if (on) c->board->bcr2 |= (c->num ? BCR2_INVRXC1 : BCR2_INVRXC0); in ct_set_invrxc()
530 else c->board->bcr2 &= ~(c->num ? BCR2_INVRXC1 : BCR2_INVRXC0); in ct_set_invrxc()
531 outb (BCR2(c->board->port), c->board->bcr2); in ct_set_invrxc()
534 int ct_get_invrxc (ct_chan_t *c) in ct_get_invrxc() argument
536 return (c->board->bcr2 & (c->num ? BCR2_INVRXC1 : BCR2_INVRXC0)) != 0; in ct_get_invrxc()
545 ct_chan_t *c; in ct_int_handler() local
558 c = b->chan + (imvr & IMVR_CHAN1 ? 1 : 0); in ct_int_handler()
559 ct_hdlc_interrupt (c, imvr); in ct_int_handler()
579 ct_chan_t *c = b->chan; in ct_scc_interrupt() local
583 ++c, a = 0; /* really channel B */ in ct_scc_interrupt()
587 c->scctx_b = (c->scctx_b + 1) % SCCBUFSZ; in ct_scc_interrupt()
588 if (c->scctx_b == c->scctx_e) { in ct_scc_interrupt()
589 c->scctx_empty = 1; in ct_scc_interrupt()
590 cte_out2c (c, AM_CR | CR_RST_TXINT); in ct_scc_interrupt()
592 cte_out2d (c, c->scctx[c->scctx_b]); in ct_scc_interrupt()
600 if (c->call_on_err) in ct_scc_interrupt()
601 c->call_on_err (c, CT_SCC_OVERRUN); in ct_scc_interrupt()
603 if (c->call_on_err) in ct_scc_interrupt()
604 c->call_on_err (c, CT_SCC_FRAME); in ct_scc_interrupt()
606 c->sccrx[c->sccrx_e] = cte_in2d (c); in ct_scc_interrupt()
607 c->sccrx_e = (c->sccrx_e + 1) % SCCBUFSZ; in ct_scc_interrupt()
608 c->sccrx_empty &= 0; in ct_scc_interrupt()
609 if (c->call_on_scc) in ct_scc_interrupt()
610 c->call_on_scc (c); in ct_scc_interrupt()
611 if (c->sccrx_e == c->sccrx_b && ! c->sccrx_empty) in ct_scc_interrupt()
612 if (c->call_on_err) in ct_scc_interrupt()
613 c->call_on_err (c, CT_SCC_OVERFLOW); in ct_scc_interrupt()
616 cte_out2c (c, CR_RST_ERROR); in ct_scc_interrupt()
621 cte_out2c (c, CR_RST_EXTINT); in ct_scc_interrupt()
630 void ct_g703_timer (ct_chan_t *c) in ct_g703_timer() argument
638 ++c->cursec; in ct_g703_timer()
639 if (c->mode != M_G703) in ct_g703_timer()
641 if (c->totsec + c->cursec <= 1) in ct_g703_timer()
643 c->status = 0; in ct_g703_timer()
645 cd = ct_get_cd (c); in ct_g703_timer()
647 bpv = inb (GERR (c->board->port)) & (c->num ? GERR_BPV1 : GERR_BPV0); in ct_g703_timer()
648 outb (GERR (c->board->port), bpv); in ct_g703_timer()
650 tsterr = inb (GERR (c->board->port)) & (c->num ? GERR_ERR1 : GERR_ERR0); in ct_g703_timer()
651 outb (GERR (c->board->port), tsterr); in ct_g703_timer()
653 tstreq = inb (GLDR (c->board->port)) & in ct_g703_timer()
654 (c->num ? GLDR_LREQ1 : GLDR_LREQ0); in ct_g703_timer()
655 outb (GLDR (c->board->port), tstreq); in ct_g703_timer()
659 ++c->currnt.bpv; /* bipolar violation */ in ct_g703_timer()
661 c->status |= ESTS_LOS; /* loss of signal */ in ct_g703_timer()
663 c->status |= ESTS_TSTERR; /* test error */ in ct_g703_timer()
665 c->status |= ESTS_TSTREQ; /* test code detected */ in ct_g703_timer()
667 if (! c->status) in ct_g703_timer()
668 c->status = ESTS_NOALARM; in ct_g703_timer()
673 ++c->currnt.uas; in ct_g703_timer()
677 ++c->currnt.les; in ct_g703_timer()
681 ++c->degsec; in ct_g703_timer()
683 ++c->degerr; in ct_g703_timer()
687 if (c->cursec / 60 == 0) { in ct_g703_timer()
688 if (c->degerr*2 > c->degsec) in ct_g703_timer()
689 ++c->currnt.dm; in ct_g703_timer()
690 c->degsec = 0; in ct_g703_timer()
691 c->degerr = 0; in ct_g703_timer()
695 if (c->cursec > 15*60) { in ct_g703_timer()
699 c->interval[i] = c->interval[i-1]; in ct_g703_timer()
700 c->interval[0] = c->currnt; in ct_g703_timer()
703 c->total.bpv += c->currnt.bpv; in ct_g703_timer()
704 c->total.fse += c->currnt.fse; in ct_g703_timer()
705 c->total.crce += c->currnt.crce; in ct_g703_timer()
706 c->total.rcrce += c->currnt.rcrce; in ct_g703_timer()
707 c->total.uas += c->currnt.uas; in ct_g703_timer()
708 c->total.les += c->currnt.les; in ct_g703_timer()
709 c->total.es += c->currnt.es; in ct_g703_timer()
710 c->total.bes += c->currnt.bes; in ct_g703_timer()
711 c->total.ses += c->currnt.ses; in ct_g703_timer()
712 c->total.oofs += c->currnt.oofs; in ct_g703_timer()
713 c->total.css += c->currnt.css; in ct_g703_timer()
714 c->total.dm += c->currnt.dm; in ct_g703_timer()
715 memset (&c->currnt, 0, sizeof (c->currnt)); in ct_g703_timer()
717 c->totsec += c->cursec; in ct_g703_timer()
718 c->cursec = 0; in ct_g703_timer()
722 static void ct_e1timer_interrupt (ct_chan_t *c) in ct_e1timer_interrupt() argument
728 port = c->num ? E1CS1(c->board->port) : E1CS0(c->board->port); in ct_e1timer_interrupt()
736 if (c->e1_first_int > 0) { in ct_e1timer_interrupt()
737 c->e1_first_int --; in ct_e1timer_interrupt()
741 ++c->cursec; in ct_e1timer_interrupt()
742 c->status = 0; in ct_e1timer_interrupt()
750 c->status |= ESTS_LOS; /* loss of signal */ in ct_e1timer_interrupt()
752 c->status |= ESTS_AIS; /* receiving all ones */ in ct_e1timer_interrupt()
753 if (c->gopt.cas && (sr1 & SR1_RSA1)) in ct_e1timer_interrupt()
754 c->status |= ESTS_AIS16; /* signaling all ones */ in ct_e1timer_interrupt()
755 if (c->gopt.cas && (sr1 & SR1_RDMA)) in ct_e1timer_interrupt()
756 c->status |= ESTS_FARLOMF; /* alarm in timeslot 16 */ in ct_e1timer_interrupt()
758 c->status |= ESTS_FARLOF; /* far loss of framing */ in ct_e1timer_interrupt()
762 ++c->currnt.css; in ct_e1timer_interrupt()
766 c->status |= ESTS_LOF; /* loss of framing */ in ct_e1timer_interrupt()
769 if ((c->gopt.cas && (ssr & SSR_SYNC_CAS)) || in ct_e1timer_interrupt()
770 (c->gopt.crc4 && (ssr & SSR_SYNC_CRC4))) { in ct_e1timer_interrupt()
771 c->status |= ESTS_LOMF; /* loss of multiframing */ in ct_e1timer_interrupt()
775 if (! c->status) in ct_e1timer_interrupt()
776 c->status = ESTS_NOALARM; in ct_e1timer_interrupt()
784 c->currnt.bpv += bpv; in ct_e1timer_interrupt()
785 c->currnt.fse += fas; in ct_e1timer_interrupt()
786 if (c->gopt.crc4) { in ct_e1timer_interrupt()
787 c->currnt.crce += crc4; in ct_e1timer_interrupt()
788 c->currnt.rcrce += ebit; in ct_e1timer_interrupt()
794 if (c->gopt.crc4) in ct_e1timer_interrupt()
801 ++c->currnt.uas; in ct_e1timer_interrupt()
805 ++c->currnt.les; in ct_e1timer_interrupt()
810 ++c->currnt.es; in ct_e1timer_interrupt()
814 ++c->currnt.oofs; in ct_e1timer_interrupt()
819 ++c->currnt.ses; in ct_e1timer_interrupt()
824 ++c->currnt.bes; in ct_e1timer_interrupt()
828 ++c->degsec; in ct_e1timer_interrupt()
829 c->degerr += bpv + pcv; in ct_e1timer_interrupt()
835 if (c->cursec / 60 == 0) { in ct_e1timer_interrupt()
836 if (c->degerr > c->degsec * 2048 / 1000) in ct_e1timer_interrupt()
837 ++c->currnt.dm; in ct_e1timer_interrupt()
838 c->degsec = 0; in ct_e1timer_interrupt()
839 c->degerr = 0; in ct_e1timer_interrupt()
843 if (c->cursec > 15*60) { in ct_e1timer_interrupt()
847 c->interval[i] = c->interval[i-1]; in ct_e1timer_interrupt()
848 c->interval[0] = c->currnt; in ct_e1timer_interrupt()
851 c->total.bpv += c->currnt.bpv; in ct_e1timer_interrupt()
852 c->total.fse += c->currnt.fse; in ct_e1timer_interrupt()
853 c->total.crce += c->currnt.crce; in ct_e1timer_interrupt()
854 c->total.rcrce += c->currnt.rcrce; in ct_e1timer_interrupt()
855 c->total.uas += c->currnt.uas; in ct_e1timer_interrupt()
856 c->total.les += c->currnt.les; in ct_e1timer_interrupt()
857 c->total.es += c->currnt.es; in ct_e1timer_interrupt()
858 c->total.bes += c->currnt.bes; in ct_e1timer_interrupt()
859 c->total.ses += c->currnt.ses; in ct_e1timer_interrupt()
860 c->total.oofs += c->currnt.oofs; in ct_e1timer_interrupt()
861 c->total.css += c->currnt.css; in ct_e1timer_interrupt()
862 c->total.dm += c->currnt.dm; in ct_e1timer_interrupt()
863 for (i=0; i<sizeof (c->currnt); ++i) in ct_e1timer_interrupt()
864 *(((char *)(&c->currnt))+i)=0; in ct_e1timer_interrupt()
866 c->totsec += c->cursec; in ct_e1timer_interrupt()
867 c->cursec = 0; in ct_e1timer_interrupt()
871 static void ct_hdlc_interrupt (ct_chan_t *c, int imvr) in ct_hdlc_interrupt() argument
877 dsr = inb (c->RX.DSR); in ct_hdlc_interrupt()
878 cda = inw (c->RX.CDA); in ct_hdlc_interrupt()
880 if (cda == (unsigned short) c->rdphys[i]) in ct_hdlc_interrupt()
883 i = c->rn; /* cannot happen */ in ct_hdlc_interrupt()
884 while (c->rn != i) { in ct_hdlc_interrupt()
885 int cst = B_STATUS (c->rdesc[c->rn]); in ct_hdlc_interrupt()
888 if (c->call_on_rx) in ct_hdlc_interrupt()
889 c->call_on_rx (c, c->rbuf[c->rn], in ct_hdlc_interrupt()
890 B_LEN(c->rdesc[c->rn])); in ct_hdlc_interrupt()
891 ++c->ipkts; in ct_hdlc_interrupt()
892 c->ibytes += B_LEN(c->rdesc[c->rn]); in ct_hdlc_interrupt()
895 if (c->call_on_err) in ct_hdlc_interrupt()
896 c->call_on_err (c, CT_OVERRUN); in ct_hdlc_interrupt()
897 ++c->ierrs; in ct_hdlc_interrupt()
901 if (c->call_on_err) in ct_hdlc_interrupt()
902 c->call_on_err (c, CT_FRAME); in ct_hdlc_interrupt()
903 ++c->ierrs; in ct_hdlc_interrupt()
907 if (c->call_on_err) in ct_hdlc_interrupt()
908 c->call_on_err (c, CT_CRC); in ct_hdlc_interrupt()
909 ++c->ierrs; in ct_hdlc_interrupt()
912 if (c->call_on_err) in ct_hdlc_interrupt()
913 c->call_on_err (c, CT_OVERFLOW); in ct_hdlc_interrupt()
914 ++c->ierrs; in ct_hdlc_interrupt()
917 B_NEXT (c->rdesc[c->rn]) = in ct_hdlc_interrupt()
918 c->rdphys[(c->rn+1) % NBUF] & 0xffff; in ct_hdlc_interrupt()
919 B_PTR (c->rdesc[c->rn]) = c->rphys[c->rn]; in ct_hdlc_interrupt()
920 B_LEN (c->rdesc[c->rn]) = DMABUFSZ; in ct_hdlc_interrupt()
921 B_STATUS (c->rdesc[c->rn]) = 0; in ct_hdlc_interrupt()
922 c->rn = (c->rn + 1) % NBUF; in ct_hdlc_interrupt()
924 outw (c->RX.EDA, (unsigned short) c->rdphys[(i+NBUF-1)%NBUF]); in ct_hdlc_interrupt()
926 if (inb (c->RX.DSR) & DSR_DMA_ENABLE) { in ct_hdlc_interrupt()
927 outb (c->RX.DSR, dsr); in ct_hdlc_interrupt()
929 outb (c->RX.DSR, (dsr & 0xfc) | DSR_DMA_ENABLE); in ct_hdlc_interrupt()
931 ++c->rintr; in ct_hdlc_interrupt()
935 st1 = inb (c->ST1); in ct_hdlc_interrupt()
936 st2 = inb (c->ST2); in ct_hdlc_interrupt()
938 if (c->call_on_msig) in ct_hdlc_interrupt()
939 c->call_on_msig (c); in ct_hdlc_interrupt()
940 ++c->mintr; in ct_hdlc_interrupt()
943 outb (c->ST1, st1); in ct_hdlc_interrupt()
944 outb (c->ST2, st2); in ct_hdlc_interrupt()
945 ++c->rintr; in ct_hdlc_interrupt()
949 dsr = inb (c->RX.DSR); in ct_hdlc_interrupt()
951 if (c->call_on_err) in ct_hdlc_interrupt()
952 c->call_on_err (c, CT_OVERFLOW); in ct_hdlc_interrupt()
953 ++c->ierrs; in ct_hdlc_interrupt()
955 B_LEN (c->rdesc[i]) = DMABUFSZ; in ct_hdlc_interrupt()
956 B_STATUS (c->rdesc[i]) = 0; in ct_hdlc_interrupt()
958 ct_start_receiver (c, 1, c->rphys[0], DMABUFSZ, in ct_hdlc_interrupt()
959 c->rdphys[0], c->rdphys[NBUF-1]); in ct_hdlc_interrupt()
960 c->rn = 0; in ct_hdlc_interrupt()
963 outb (c->RX.DSR, dsr); in ct_hdlc_interrupt()
964 ++c->rintr; in ct_hdlc_interrupt()
969 dsr = inb (c->TX.DSR); in ct_hdlc_interrupt()
970 cda = inw (c->TX.CDA); in ct_hdlc_interrupt()
972 for (i=0; i<NBUF && cda != (unsigned short)c->tdphys[i]; ++i) in ct_hdlc_interrupt()
977 if (c->call_on_err) in ct_hdlc_interrupt()
978 c->call_on_err (c, CT_UNDERRUN); in ct_hdlc_interrupt()
979 ++c->oerrs; in ct_hdlc_interrupt()
981 while (c->tn != i) { in ct_hdlc_interrupt()
982 if (c->call_on_tx) in ct_hdlc_interrupt()
983 c->call_on_tx (c, c->attach[c->tn], in ct_hdlc_interrupt()
984 B_LEN(c->tdesc[c->tn])); in ct_hdlc_interrupt()
985 ++c->opkts; in ct_hdlc_interrupt()
986 c->obytes += B_LEN(c->tdesc[c->tn]); in ct_hdlc_interrupt()
988 c->tn = (c->tn + 1) % NBUF; in ct_hdlc_interrupt()
990 outb (c->TX.DSR, DSR_CHAIN_EOM | DSR_DMA_CONTINUE); in ct_hdlc_interrupt()
992 outb (c->TX.DSR, dsr & ~DSR_CHAIN_EOM); in ct_hdlc_interrupt()
993 ++c->tintr; in ct_hdlc_interrupt()
997 st1 = inb (c->ST1); in ct_hdlc_interrupt()
999 if (c->call_on_err) in ct_hdlc_interrupt()
1000 c->call_on_err (c, CT_UNDERRUN); in ct_hdlc_interrupt()
1001 ++c->oerrs; in ct_hdlc_interrupt()
1003 outb (c->ST1, st1); in ct_hdlc_interrupt()
1004 ++c->tintr; in ct_hdlc_interrupt()
1013 int ct_receive_enabled (ct_chan_t *c) in ct_receive_enabled() argument
1017 st3 = inb (c->ST3); in ct_receive_enabled()
1021 int ct_transmit_enabled (ct_chan_t *c) in ct_transmit_enabled() argument
1025 st3 = inb (c->ST3); in ct_transmit_enabled()
1029 int ct_buf_free (ct_chan_t *c) in ct_buf_free() argument
1031 return (NBUF + c->tn - c->te - 1) % NBUF; in ct_buf_free()
1034 int ct_send_packet (ct_chan_t *c, unsigned char *data, int len, in ct_send_packet() argument
1043 ne = (c->te+1) % NBUF; in ct_send_packet()
1044 if (ne == c->tn) in ct_send_packet()
1048 B_LEN (c->tdesc[c->te]) = len; in ct_send_packet()
1049 B_STATUS (c->tdesc[c->te]) = FST_EOM; in ct_send_packet()
1050 c->attach[c->te] = attachment; in ct_send_packet()
1051 if (c->tbuf[c->te] != data) in ct_send_packet()
1052 memcpy (c->tbuf[c->te], data, len); in ct_send_packet()
1055 c->te = ne; in ct_send_packet()
1056 outw (c->TX.EDA, (unsigned short) c->tdphys[ne]); in ct_send_packet()
1057 dsr = inb (c->TX.DSR); in ct_send_packet()
1059 outb (c->TX.DSR, DSR_DMA_ENABLE); in ct_send_packet()
1063 int scc_write (ct_chan_t *c, unsigned char *d, int len) in scc_write() argument
1068 if (c->scctx_empty) in scc_write()
1071 free = (SCCBUFSZ + c->scctx_b - c->scctx_e) % SCCBUFSZ; in scc_write()
1077 c->scctx[c->scctx_e] = d[i]; in scc_write()
1078 c->scctx_e = (c->scctx_e+1) % SCCBUFSZ; in scc_write()
1080 if (c->scctx_empty && len) { in scc_write()
1081 cte_out2d (c, c->scctx[c->scctx_b]); in scc_write()
1082 c->scctx_empty = 0; in scc_write()
1087 int scc_read (ct_chan_t *c, unsigned char *d, int len) in scc_read() argument
1091 if (c->sccrx_empty) in scc_read()
1094 bytes = (SCCBUFSZ + c->sccrx_e - 1 - c->sccrx_b) % in scc_read()
1100 d[i] = c->sccrx[c->sccrx_b]; in scc_read()
1101 c->sccrx_b = (c->sccrx_b+1) % SCCBUFSZ; in scc_read()
1103 if (c->sccrx_b==c->sccrx_e) in scc_read()
1104 c->sccrx_empty = 1; in scc_read()
1108 int sccrx_check (ct_chan_t *c) in sccrx_check() argument
1112 if (c->sccrx_empty) in sccrx_check()
1115 bytes = (SCCBUFSZ + c->sccrx_e - 1 - c->sccrx_b) % in sccrx_check()
1120 int scc_read_byte (ct_chan_t *c) in scc_read_byte() argument
1124 if (scc_read (c, &a, 1) < 0) in scc_read_byte()
1129 int scc_write_byte (ct_chan_t *c, unsigned char b) in scc_write_byte() argument
1131 if (scc_write (c, &b, 1) < 0) in scc_write_byte()
1139 void ct_register_transmit (ct_chan_t *c, void (*func) (ct_chan_t*, void*, int)) in ct_register_transmit() argument
1141 c->call_on_tx = func; in ct_register_transmit()
1144 void ct_register_receive (ct_chan_t *c, void (*func) (ct_chan_t*, char*, int)) in ct_register_receive() argument
1146 c->call_on_rx = func; in ct_register_receive()
1149 void ct_register_error (ct_chan_t *c, void (*func) (ct_chan_t*, int)) in ct_register_error() argument
1151 c->call_on_err = func; in ct_register_error()
1154 void ct_register_scc (ct_chan_t *c, void (*func) (ct_chan_t*)) in ct_register_scc() argument
1156 c->call_on_scc = func; in ct_register_scc()
1159 void ct_register_modem (ct_chan_t *c, void (*func) (ct_chan_t*)) in ct_register_modem() argument
1161 c->call_on_msig = func; in ct_register_modem()