Lines Matching refs:isac

243 static inline void D_L1L2(struct isac *isac, int pr, void *arg)  in D_L1L2()  argument
245 struct hisax_if *ifc = (struct hisax_if *) &isac->hisax_d_if; in D_L1L2()
251 static void ph_command(struct isac *isac, unsigned int command) in ph_command() argument
254 switch (isac->type) { in ph_command()
256 isac->write_isac(isac, ISAC_CIX0, (command << 2) | 3); in ph_command()
259 isac->write_isac(isac, ISACSX_CIX0, (command << 4) | (7 << 1)); in ph_command()
268 struct isac *isac = fi->userdata; in l1_di() local
271 ph_command(isac, ISAC_CMD_DI); in l1_di()
276 struct isac *isac = fi->userdata; in l1_di_deact_ind() local
279 D_L1L2(isac, PH_DEACTIVATE | INDICATION, NULL); in l1_di_deact_ind()
280 ph_command(isac, ISAC_CMD_DI); in l1_di_deact_ind()
290 struct isac *isac = fi->userdata; in l1_go_f3pend_deact_ind() local
293 D_L1L2(isac, PH_DEACTIVATE | INDICATION, NULL); in l1_go_f3pend_deact_ind()
294 ph_command(isac, ISAC_CMD_DI); in l1_go_f3pend_deact_ind()
299 struct isac *isac = fi->userdata; in l1_go_f3pend() local
302 ph_command(isac, ISAC_CMD_DI); in l1_go_f3pend()
322 struct isac *isac = fi->userdata; in l1_go_f6_deact_ind() local
325 D_L1L2(isac, PH_DEACTIVATE | INDICATION, NULL); in l1_go_f6_deact_ind()
330 struct isac *isac = fi->userdata; in l1_go_f7_act_ind() local
332 FsmDelTimer(&isac->timer, 0); in l1_go_f7_act_ind()
334 ph_command(isac, ISAC_CMD_AR8); in l1_go_f7_act_ind()
335 D_L1L2(isac, PH_ACTIVATE | INDICATION, NULL); in l1_go_f7_act_ind()
345 struct isac *isac = fi->userdata; in l1_go_f8_deact_ind() local
348 D_L1L2(isac, PH_DEACTIVATE | INDICATION, NULL); in l1_go_f8_deact_ind()
353 struct isac *isac = fi->userdata; in l1_ar8() local
355 FsmRestartTimer(&isac->timer, TIMER3_VALUE, EV_TIMER3, NULL, 2); in l1_ar8()
356 ph_command(isac, ISAC_CMD_AR8); in l1_ar8()
361 struct isac *isac = fi->userdata; in l1_timer3() local
363 ph_command(isac, ISAC_CMD_DI); in l1_timer3()
364 D_L1L2(isac, PH_DEACTIVATE | INDICATION, NULL); in l1_timer3()
442 static void isac_version(struct isac *cs) in isac_version()
450 static void isac_empty_fifo(struct isac *isac, int count) in isac_empty_fifo() argument
458 if ((isac->rcvidx + count) >= MAX_DFRAME_LEN_L1) { in isac_empty_fifo()
459 DBG(DBG_WARN, "overrun %d", isac->rcvidx + count); in isac_empty_fifo()
460 isac->write_isac(isac, ISAC_CMDR, ISAC_CMDR_RMC); in isac_empty_fifo()
461 isac->rcvidx = 0; in isac_empty_fifo()
464 ptr = isac->rcvbuf + isac->rcvidx; in isac_empty_fifo()
465 isac->rcvidx += count; in isac_empty_fifo()
466 isac->read_isac_fifo(isac, ptr, count); in isac_empty_fifo()
467 isac->write_isac(isac, ISAC_CMDR, ISAC_CMDR_RMC); in isac_empty_fifo()
471 static void isac_fill_fifo(struct isac *isac) in isac_fill_fifo() argument
480 BUG_ON(!isac->tx_skb); in isac_fill_fifo()
482 count = isac->tx_skb->len; in isac_fill_fifo()
494 ptr = isac->tx_skb->data; in isac_fill_fifo()
495 skb_pull(isac->tx_skb, count); in isac_fill_fifo()
496 isac->tx_cnt += count; in isac_fill_fifo()
498 isac->write_isac_fifo(isac, ptr, count); in isac_fill_fifo()
499 isac->write_isac(isac, ISAC_CMDR, cmd); in isac_fill_fifo()
502 static void isac_retransmit(struct isac *isac) in isac_retransmit() argument
504 if (!isac->tx_skb) { in isac_retransmit()
508 skb_push(isac->tx_skb, isac->tx_cnt); in isac_retransmit()
509 isac->tx_cnt = 0; in isac_retransmit()
513 static inline void isac_cisq_interrupt(struct isac *isac) in isac_cisq_interrupt() argument
517 val = isac->read_isac(isac, ISAC_CIR0); in isac_cisq_interrupt()
521 FsmEvent(&isac->l1m, (val >> 2) & 0xf, NULL); in isac_cisq_interrupt()
524 val = isac->read_isac(isac, ISAC_CIR1); in isac_cisq_interrupt()
529 static inline void isac_rme_interrupt(struct isac *isac) in isac_rme_interrupt() argument
535 val = isac->read_isac(isac, ISAC_RSTA); in isac_rme_interrupt()
539 isac->write_isac(isac, ISAC_CMDR, ISAC_CMDR_RMC); in isac_rme_interrupt()
543 count = isac->read_isac(isac, ISAC_RBCL) & 0x1f; in isac_rme_interrupt()
548 isac_empty_fifo(isac, count); in isac_rme_interrupt()
549 count = isac->rcvidx; in isac_rme_interrupt()
560 memcpy(skb_put(skb, count), isac->rcvbuf, count); in isac_rme_interrupt()
562 D_L1L2(isac, PH_DATA | INDICATION, skb); in isac_rme_interrupt()
564 isac->rcvidx = 0; in isac_rme_interrupt()
567 static inline void isac_xpr_interrupt(struct isac *isac) in isac_xpr_interrupt() argument
569 if (!isac->tx_skb) in isac_xpr_interrupt()
572 if (isac->tx_skb->len > 0) { in isac_xpr_interrupt()
573 isac_fill_fifo(isac); in isac_xpr_interrupt()
576 dev_kfree_skb_irq(isac->tx_skb); in isac_xpr_interrupt()
577 isac->tx_cnt = 0; in isac_xpr_interrupt()
578 isac->tx_skb = NULL; in isac_xpr_interrupt()
579 D_L1L2(isac, PH_DATA | CONFIRM, NULL); in isac_xpr_interrupt()
582 static inline void isac_exi_interrupt(struct isac *isac) in isac_exi_interrupt() argument
586 val = isac->read_isac(isac, ISAC_EXIR); in isac_exi_interrupt()
591 isac_retransmit(isac); in isac_exi_interrupt()
595 isac_retransmit(isac); in isac_exi_interrupt()
599 val = isac->read_isac(isac, ISAC_MOSR); in isac_exi_interrupt()
604 void isac_irq(struct isac *isac) in isac_irq() argument
608 val = isac->read_isac(isac, ISAC_ISTA); in isac_irq()
613 isac_exi_interrupt(isac); in isac_irq()
617 isac_xpr_interrupt(isac); in isac_irq()
621 isac_rme_interrupt(isac); in isac_irq()
625 isac_empty_fifo(isac, 0x20); in isac_irq()
629 isac_cisq_interrupt(isac); in isac_irq()
637 isac->write_isac(isac, ISAC_MASK, 0xff); in isac_irq()
638 isac->write_isac(isac, ISAC_MASK, 0x00); in isac_irq()
643 static inline void isacsx_cic_interrupt(struct isac *isac) in isacsx_cic_interrupt() argument
647 val = isac->read_isac(isac, ISACSX_CIR0); in isacsx_cic_interrupt()
651 FsmEvent(&isac->l1m, val >> 4, NULL); in isacsx_cic_interrupt()
655 static inline void isacsx_rme_interrupt(struct isac *isac) in isacsx_rme_interrupt() argument
661 val = isac->read_isac(isac, ISACSX_RSTAD); in isacsx_rme_interrupt()
668 isac->write_isac(isac, ISACSX_CMDRD, ISACSX_CMDRD_RMC); in isacsx_rme_interrupt()
672 count = isac->read_isac(isac, ISACSX_RBCLD) & 0x1f; in isacsx_rme_interrupt()
677 isac_empty_fifo(isac, count); in isacsx_rme_interrupt()
679 count = isac->rcvidx - 1; in isacsx_rme_interrupt()
690 memcpy(skb_put(skb, count), isac->rcvbuf, count); in isacsx_rme_interrupt()
692 D_L1L2(isac, PH_DATA | INDICATION, skb); in isacsx_rme_interrupt()
694 isac->rcvidx = 0; in isacsx_rme_interrupt()
697 static inline void isacsx_xpr_interrupt(struct isac *isac) in isacsx_xpr_interrupt() argument
699 if (!isac->tx_skb) in isacsx_xpr_interrupt()
702 if (isac->tx_skb->len > 0) { in isacsx_xpr_interrupt()
703 isac_fill_fifo(isac); in isacsx_xpr_interrupt()
706 dev_kfree_skb_irq(isac->tx_skb); in isacsx_xpr_interrupt()
707 isac->tx_skb = NULL; in isacsx_xpr_interrupt()
708 isac->tx_cnt = 0; in isacsx_xpr_interrupt()
709 D_L1L2(isac, PH_DATA | CONFIRM, NULL); in isacsx_xpr_interrupt()
712 static inline void isacsx_icd_interrupt(struct isac *isac) in isacsx_icd_interrupt() argument
716 val = isac->read_isac(isac, ISACSX_ISTAD); in isacsx_icd_interrupt()
720 isac_retransmit(isac); in isacsx_icd_interrupt()
724 isac_retransmit(isac); in isacsx_icd_interrupt()
728 isacsx_xpr_interrupt(isac); in isacsx_icd_interrupt()
732 isac->write_isac(isac, ISACSX_CMDRD, ISACSX_CMDRD_RMC); in isacsx_icd_interrupt()
736 isacsx_rme_interrupt(isac); in isacsx_icd_interrupt()
740 isac_empty_fifo(isac, 0x20); in isacsx_icd_interrupt()
744 void isacsx_irq(struct isac *isac) in isacsx_irq() argument
748 val = isac->read_isac(isac, ISACSX_ISTA); in isacsx_irq()
752 isacsx_icd_interrupt(isac); in isacsx_irq()
754 isacsx_cic_interrupt(isac); in isacsx_irq()
757 void isac_init(struct isac *isac) in isac_init() argument
759 isac->tx_skb = NULL; in isac_init()
760 isac->l1m.fsm = &l1fsm; in isac_init()
761 isac->l1m.state = ST_L1_RESET; in isac_init()
763 isac->l1m.debug = 1; in isac_init()
765 isac->l1m.debug = 0; in isac_init()
767 isac->l1m.userdata = isac; in isac_init()
768 isac->l1m.printdebug = l1m_debug; in isac_init()
769 FsmInitTimer(&isac->l1m, &isac->timer); in isac_init()
772 void isac_setup(struct isac *isac) in isac_setup() argument
776 isac->type = TYPE_ISAC; in isac_setup()
777 isac_version(isac); in isac_setup()
779 ph_command(isac, ISAC_CMD_RES); in isac_setup()
781 isac->write_isac(isac, ISAC_MASK, 0xff); in isac_setup()
782 isac->mocr = 0xaa; in isac_setup()
783 if (test_bit(ISAC_IOM1, &isac->flags)) { in isac_setup()
785 isac->write_isac(isac, ISAC_ADF2, 0x0); in isac_setup()
786 isac->write_isac(isac, ISAC_SPCR, 0xa); in isac_setup()
787 isac->write_isac(isac, ISAC_ADF1, 0x2); in isac_setup()
788 isac->write_isac(isac, ISAC_STCR, 0x70); in isac_setup()
789 isac->write_isac(isac, ISAC_MODE, 0xc9); in isac_setup()
792 if (!isac->adf2) in isac_setup()
793 isac->adf2 = 0x80; in isac_setup()
794 isac->write_isac(isac, ISAC_ADF2, isac->adf2); in isac_setup()
795 isac->write_isac(isac, ISAC_SQXR, 0x2f); in isac_setup()
796 isac->write_isac(isac, ISAC_SPCR, 0x00); in isac_setup()
797 isac->write_isac(isac, ISAC_STCR, 0x70); in isac_setup()
798 isac->write_isac(isac, ISAC_MODE, 0xc9); in isac_setup()
799 isac->write_isac(isac, ISAC_TIMR, 0x00); in isac_setup()
800 isac->write_isac(isac, ISAC_ADF1, 0x00); in isac_setup()
802 val = isac->read_isac(isac, ISAC_STAR); in isac_setup()
804 val = isac->read_isac(isac, ISAC_MODE); in isac_setup()
806 val = isac->read_isac(isac, ISAC_ADF2); in isac_setup()
808 val = isac->read_isac(isac, ISAC_ISTA); in isac_setup()
811 eval = isac->read_isac(isac, ISAC_EXIR); in isac_setup()
814 val = isac->read_isac(isac, ISAC_CIR0); in isac_setup()
816 FsmEvent(&isac->l1m, (val >> 2) & 0xf, NULL); in isac_setup()
818 isac->write_isac(isac, ISAC_MASK, 0x0); in isac_setup()
820 isac->write_isac(isac, ISAC_CMDR, ISAC_CMDR_XRES | ISAC_CMDR_RRES); in isac_setup()
823 void isacsx_setup(struct isac *isac) in isacsx_setup() argument
825 isac->type = TYPE_ISACSX; in isacsx_setup()
827 isac->write_isac(isac, ISACSX_TR_CONF0, 0x00); in isacsx_setup()
829 isac->write_isac(isac, ISACSX_TR_CONF2, 0x00); in isacsx_setup()
831 isac->write_isac(isac, ISACSX_MODED, 0xc9); in isacsx_setup()
833 isac->write_isac(isac, ISACSX_MASKD, 0x03); in isacsx_setup()
835 isac->write_isac(isac, ISACSX_MASK, in isacsx_setup()
841 struct isac *isac = hisax_d_if->priv; in isac_d_l2l1() local
848 FsmEvent(&isac->l1m, EV_PH_ACTIVATE_REQ, NULL); in isac_d_l2l1()
851 FsmEvent(&isac->l1m, EV_PH_DEACTIVATE_REQ, NULL); in isac_d_l2l1()
856 if (isac->l1m.state != ST_L1_F7) { in isac_d_l2l1()
857 DBG(1, "L1 wrong state %d\n", isac->l1m.state); in isac_d_l2l1()
861 BUG_ON(isac->tx_skb); in isac_d_l2l1()
863 isac->tx_skb = skb; in isac_d_l2l1()
864 isac_fill_fifo(isac); in isac_d_l2l1()