Lines Matching refs:isac

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