Lines Matching refs:bcs

32 static void isar_pump_cmd(struct BCState *bcs, u_char cmd, u_char para);
33 static void ll_deliver_faxstat(struct BCState *bcs, u_char status);
136 struct isar_reg *ir = cs->bcs[0].hw.isar.reg; in waitrecmsg()
177 if (cs->bcs[0].hw.isar.reg->iis == ISAR_IIS_VNR) { in ISARVersion()
198 struct isar_reg *ireg = cs->bcs[0].hw.isar.reg; in isar_load_firmware()
443 struct BCState *bcs = container_of(work, struct BCState, tqueue); in isar_bh() local
446 if (test_and_clear_bit(B_LL_NOCARRIER, &bcs->event)) in isar_bh()
447 ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_NOCARR); in isar_bh()
448 if (test_and_clear_bit(B_LL_CONNECT, &bcs->event)) in isar_bh()
449 ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT); in isar_bh()
450 if (test_and_clear_bit(B_LL_OK, &bcs->event)) in isar_bh()
451 ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_OK); in isar_bh()
455 send_DLE_ETX(struct BCState *bcs) in send_DLE_ETX() argument
462 skb_queue_tail(&bcs->rqueue, skb); in send_DLE_ETX()
463 schedule_event(bcs, B_RCVBUFREADY); in send_DLE_ETX()
491 isar_rcv_frame(struct IsdnCardState *cs, struct BCState *bcs) in isar_rcv_frame() argument
495 struct isar_reg *ireg = bcs->hw.isar.reg; in isar_rcv_frame()
502 switch (bcs->mode) { in isar_rcv_frame()
514 skb_queue_tail(&bcs->rqueue, skb); in isar_rcv_frame()
515 schedule_event(bcs, B_RCVBUFREADY); in isar_rcv_frame()
522 if ((bcs->hw.isar.rcvidx + ireg->clsb) > HSCX_BUFMAX) { in isar_rcv_frame()
526 bcs->hw.isar.rcvidx = 0; in isar_rcv_frame()
533 bcs->err_inv++; in isar_rcv_frame()
535 bcs->err_crc++; in isar_rcv_frame()
537 bcs->hw.isar.rcvidx = 0; in isar_rcv_frame()
541 bcs->hw.isar.rcvidx = 0; in isar_rcv_frame()
542 ptr = bcs->hw.isar.rcvbuf + bcs->hw.isar.rcvidx; in isar_rcv_frame()
543 bcs->hw.isar.rcvidx += ireg->clsb; in isar_rcv_frame()
546 if (bcs->hw.isar.rcvidx < 3) { /* last 2 bytes are the FCS */ in isar_rcv_frame()
549 bcs->hw.isar.rcvidx); in isar_rcv_frame()
550 } else if (!(skb = dev_alloc_skb(bcs->hw.isar.rcvidx - 2))) { in isar_rcv_frame()
553 memcpy(skb_put(skb, bcs->hw.isar.rcvidx - 2), in isar_rcv_frame()
554 bcs->hw.isar.rcvbuf, bcs->hw.isar.rcvidx - 2); in isar_rcv_frame()
555 skb_queue_tail(&bcs->rqueue, skb); in isar_rcv_frame()
556 schedule_event(bcs, B_RCVBUFREADY); in isar_rcv_frame()
558 bcs->hw.isar.rcvidx = 0; in isar_rcv_frame()
563 if (bcs->hw.isar.state != STFAX_ACTIV) { in isar_rcv_frame()
567 bcs->hw.isar.rcvidx = 0; in isar_rcv_frame()
570 if (bcs->hw.isar.cmd == PCTRL_CMD_FRM) { in isar_rcv_frame()
571 rcv_mbox(cs, ireg, bcs->hw.isar.rcvbuf); in isar_rcv_frame()
572 bcs->hw.isar.rcvidx = ireg->clsb + in isar_rcv_frame()
573 dle_count(bcs->hw.isar.rcvbuf, ireg->clsb); in isar_rcv_frame()
576 ireg->clsb, bcs->hw.isar.rcvidx); in isar_rcv_frame()
577 if ((skb = dev_alloc_skb(bcs->hw.isar.rcvidx))) { in isar_rcv_frame()
578 insert_dle((u_char *)skb_put(skb, bcs->hw.isar.rcvidx), in isar_rcv_frame()
579 bcs->hw.isar.rcvbuf, ireg->clsb); in isar_rcv_frame()
580 skb_queue_tail(&bcs->rqueue, skb); in isar_rcv_frame()
581 schedule_event(bcs, B_RCVBUFREADY); in isar_rcv_frame()
585 bcs->hw.isar.rcvidx = 0; in isar_rcv_frame()
586 send_DLE_ETX(bcs); in isar_rcv_frame()
587 sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | in isar_rcv_frame()
590 bcs->hw.isar.state = STFAX_ESCAPE; in isar_rcv_frame()
591 schedule_event(bcs, B_LL_NOCARRIER); in isar_rcv_frame()
598 if (bcs->hw.isar.cmd != PCTRL_CMD_FRH) { in isar_rcv_frame()
601 bcs->hw.isar.cmd); in isar_rcv_frame()
603 bcs->hw.isar.rcvidx = 0; in isar_rcv_frame()
607 if ((bcs->hw.isar.rcvidx + ireg->clsb) > HSCX_BUFMAX) { in isar_rcv_frame()
611 bcs->hw.isar.rcvidx = 0; in isar_rcv_frame()
616 bcs->hw.isar.rcvidx = 0; in isar_rcv_frame()
620 bcs->hw.isar.rcvidx = 0; in isar_rcv_frame()
622 ptr = bcs->hw.isar.rcvbuf + bcs->hw.isar.rcvidx; in isar_rcv_frame()
623 bcs->hw.isar.rcvidx += ireg->clsb; in isar_rcv_frame()
626 int len = bcs->hw.isar.rcvidx + in isar_rcv_frame()
627 dle_count(bcs->hw.isar.rcvbuf, bcs->hw.isar.rcvidx); in isar_rcv_frame()
628 if (bcs->hw.isar.rcvidx < 3) { /* last 2 bytes are the FCS */ in isar_rcv_frame()
631 bcs->hw.isar.rcvidx); in isar_rcv_frame()
633 bcs->hw.isar.rcvidx); in isar_rcv_frame()
638 bcs->hw.isar.rcvbuf, in isar_rcv_frame()
639 bcs->hw.isar.rcvidx); in isar_rcv_frame()
640 skb_queue_tail(&bcs->rqueue, skb); in isar_rcv_frame()
641 schedule_event(bcs, B_RCVBUFREADY); in isar_rcv_frame()
642 send_DLE_ETX(bcs); in isar_rcv_frame()
643 schedule_event(bcs, B_LL_OK); in isar_rcv_frame()
644 test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag); in isar_rcv_frame()
646 bcs->hw.isar.rcvidx = 0; in isar_rcv_frame()
652 bcs->hw.isar.rcvidx = 0; in isar_rcv_frame()
653 sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | in isar_rcv_frame()
655 bcs->hw.isar.state = STFAX_ESCAPE; in isar_rcv_frame()
656 if (test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag)) { in isar_rcv_frame()
657 send_DLE_ETX(bcs); in isar_rcv_frame()
658 schedule_event(bcs, B_LL_NOCARRIER); in isar_rcv_frame()
663 printk(KERN_ERR"isar_rcv_frame mode (%x)error\n", bcs->mode); in isar_rcv_frame()
670 isar_fill_fifo(struct BCState *bcs) in isar_fill_fifo() argument
672 struct IsdnCardState *cs = bcs->cs; in isar_fill_fifo()
679 if (!bcs->tx_skb) in isar_fill_fifo()
681 if (bcs->tx_skb->len <= 0) in isar_fill_fifo()
683 if (!(bcs->hw.isar.reg->bstat & in isar_fill_fifo()
684 (bcs->hw.isar.dpath == 1 ? BSTAT_RDM1 : BSTAT_RDM2))) in isar_fill_fifo()
686 if (bcs->tx_skb->len > bcs->hw.isar.mml) { in isar_fill_fifo()
688 count = bcs->hw.isar.mml; in isar_fill_fifo()
690 count = bcs->tx_skb->len; in isar_fill_fifo()
693 ptr = bcs->tx_skb->data; in isar_fill_fifo()
694 if (!bcs->hw.isar.txcnt) { in isar_fill_fifo()
696 if ((bcs->mode == L1_MODE_FAX) && in isar_fill_fifo()
697 (bcs->hw.isar.cmd == PCTRL_CMD_FTH)) { in isar_fill_fifo()
698 if (bcs->tx_skb->len > 1) { in isar_fill_fifo()
702 &bcs->Flag); in isar_fill_fifo()
706 skb_pull(bcs->tx_skb, count); in isar_fill_fifo()
707 bcs->tx_cnt -= count; in isar_fill_fifo()
708 bcs->hw.isar.txcnt += count; in isar_fill_fifo()
709 switch (bcs->mode) { in isar_fill_fifo()
715 sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA, in isar_fill_fifo()
719 sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA, in isar_fill_fifo()
723 if (bcs->hw.isar.state != STFAX_ACTIV) { in isar_fill_fifo()
726 } else if (bcs->hw.isar.cmd == PCTRL_CMD_FTH) { in isar_fill_fifo()
727 sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA, in isar_fill_fifo()
729 } else if (bcs->hw.isar.cmd == PCTRL_CMD_FTM) { in isar_fill_fifo()
730 sendmsg(cs, SET_DPS(bcs->hw.isar.dpath) | ISAR_HIS_SDATA, in isar_fill_fifo()
739 debugl1(cs, "isar_fill_fifo mode(%x) error", bcs->mode); in isar_fill_fifo()
740 printk(KERN_ERR"isar_fill_fifo mode(%x) error\n", bcs->mode); in isar_fill_fifo()
750 if (cs->bcs[0].hw.isar.dpath == dpath) in sel_bcs_isar()
751 return (&cs->bcs[0]); in sel_bcs_isar()
752 if (cs->bcs[1].hw.isar.dpath == dpath) in sel_bcs_isar()
753 return (&cs->bcs[1]); in sel_bcs_isar()
758 send_frames(struct BCState *bcs) in send_frames() argument
760 if (bcs->tx_skb) { in send_frames()
761 if (bcs->tx_skb->len) { in send_frames()
762 isar_fill_fifo(bcs); in send_frames()
765 if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) && in send_frames()
766 (PACKET_NOACK != bcs->tx_skb->pkt_type)) { in send_frames()
768 spin_lock_irqsave(&bcs->aclock, flags); in send_frames()
769 bcs->ackcnt += bcs->hw.isar.txcnt; in send_frames()
770 spin_unlock_irqrestore(&bcs->aclock, flags); in send_frames()
771 schedule_event(bcs, B_ACKPENDING); in send_frames()
773 if (bcs->mode == L1_MODE_FAX) { in send_frames()
774 if (bcs->hw.isar.cmd == PCTRL_CMD_FTH) { in send_frames()
775 if (test_bit(BC_FLG_LASTDATA, &bcs->Flag)) { in send_frames()
776 test_and_set_bit(BC_FLG_NMD_DATA, &bcs->Flag); in send_frames()
778 } else if (bcs->hw.isar.cmd == PCTRL_CMD_FTM) { in send_frames()
779 if (test_bit(BC_FLG_DLEETX, &bcs->Flag)) { in send_frames()
780 test_and_set_bit(BC_FLG_LASTDATA, &bcs->Flag); in send_frames()
781 test_and_set_bit(BC_FLG_NMD_DATA, &bcs->Flag); in send_frames()
785 dev_kfree_skb_any(bcs->tx_skb); in send_frames()
786 bcs->hw.isar.txcnt = 0; in send_frames()
787 bcs->tx_skb = NULL; in send_frames()
790 if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) { in send_frames()
791 bcs->hw.isar.txcnt = 0; in send_frames()
792 test_and_set_bit(BC_FLG_BUSY, &bcs->Flag); in send_frames()
793 isar_fill_fifo(bcs); in send_frames()
795 if (test_and_clear_bit(BC_FLG_DLEETX, &bcs->Flag)) { in send_frames()
796 if (test_and_clear_bit(BC_FLG_LASTDATA, &bcs->Flag)) { in send_frames()
797 if (test_and_clear_bit(BC_FLG_NMD_DATA, &bcs->Flag)) { in send_frames()
799 sendmsg(bcs->cs, SET_DPS(bcs->hw.isar.dpath) | in send_frames()
802 test_and_set_bit(BC_FLG_LL_OK, &bcs->Flag); in send_frames()
804 schedule_event(bcs, B_LL_CONNECT); in send_frames()
807 test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag); in send_frames()
808 schedule_event(bcs, B_XMTBUFREADY); in send_frames()
815 struct BCState *bcs; in check_send() local
818 if ((bcs = sel_bcs_isar(cs, 1))) { in check_send()
819 if (bcs->mode) { in check_send()
820 send_frames(bcs); in check_send()
825 if ((bcs = sel_bcs_isar(cs, 2))) { in check_send()
826 if (bcs->mode) { in check_send()
827 send_frames(bcs); in check_send()
843 isar_pump_status_rsp(struct BCState *bcs, struct isar_reg *ireg) { in isar_pump_status_rsp() argument
844 struct IsdnCardState *cs = bcs->cs; in isar_pump_status_rsp()
848 if (!test_and_clear_bit(ISAR_RATE_REQ, &bcs->hw.isar.reg->Flags)) in isar_pump_status_rsp()
890 sprintf(bcs->hw.isar.conmsg, "%s %s", dmril[ril], dmrim[rim]); in isar_pump_status_rsp()
891 bcs->conmsg = bcs->hw.isar.conmsg; in isar_pump_status_rsp()
893 debugl1(cs, "pump strsp %s", bcs->conmsg); in isar_pump_status_rsp()
897 isar_pump_statev_modem(struct BCState *bcs, u_char devt) { in isar_pump_statev_modem() argument
898 struct IsdnCardState *cs = bcs->cs; in isar_pump_statev_modem()
899 u_char dps = SET_DPS(bcs->hw.isar.dpath); in isar_pump_statev_modem()
909 l1_msg_b(bcs->st, PH_ACTIVATE | REQUEST, NULL); in isar_pump_statev_modem()
915 l1_msg_b(bcs->st, PH_DEACTIVATE | REQUEST, NULL); in isar_pump_statev_modem()
932 test_and_set_bit(ISAR_RATE_REQ, &bcs->hw.isar.reg->Flags); in isar_pump_statev_modem()
967 ll_deliver_faxstat(struct BCState *bcs, u_char status) in ll_deliver_faxstat() argument
970 struct Channel *chanp = (struct Channel *) bcs->st->lli.userdata; in ll_deliver_faxstat()
972 if (bcs->cs->debug & L1_DEB_HSCX) in ll_deliver_faxstat()
973 debugl1(bcs->cs, "HL->LL FAXIND %x", status); in ll_deliver_faxstat()
974 ic.driver = bcs->cs->myid; in ll_deliver_faxstat()
978 bcs->cs->iif.statcallb(&ic); in ll_deliver_faxstat()
982 isar_pump_statev_fax(struct BCState *bcs, u_char devt) { in isar_pump_statev_fax() argument
983 struct IsdnCardState *cs = bcs->cs; in isar_pump_statev_fax()
984 u_char dps = SET_DPS(bcs->hw.isar.dpath); in isar_pump_statev_fax()
995 bcs->hw.isar.state = STFAX_READY; in isar_pump_statev_fax()
996 l1_msg_b(bcs->st, PH_ACTIVATE | REQUEST, NULL); in isar_pump_statev_fax()
997 if (test_bit(BC_FLG_ORIG, &bcs->Flag)) { in isar_pump_statev_fax()
998 isar_pump_cmd(bcs, ISDN_FAX_CLASS1_FRH, 3); in isar_pump_statev_fax()
1000 isar_pump_cmd(bcs, ISDN_FAX_CLASS1_FTH, 3); in isar_pump_statev_fax()
1004 if (bcs->hw.isar.state == STFAX_LINE) { in isar_pump_statev_fax()
1007 bcs->hw.isar.state = STFAX_CONT; in isar_pump_statev_fax()
1012 bcs->hw.isar.state); in isar_pump_statev_fax()
1016 if (bcs->hw.isar.state == STFAX_LINE) { in isar_pump_statev_fax()
1019 bcs->hw.isar.state = STFAX_CONT; in isar_pump_statev_fax()
1024 bcs->hw.isar.state); in isar_pump_statev_fax()
1028 if (bcs->hw.isar.state == STFAX_LINE) { in isar_pump_statev_fax()
1031 bcs->hw.isar.state = STFAX_CONT; in isar_pump_statev_fax()
1036 bcs->hw.isar.state); in isar_pump_statev_fax()
1040 if (bcs->hw.isar.state == STFAX_LINE) { in isar_pump_statev_fax()
1043 bcs->hw.isar.state = STFAX_CONT; in isar_pump_statev_fax()
1048 bcs->hw.isar.state); in isar_pump_statev_fax()
1052 if (bcs->hw.isar.state == STFAX_CONT) { in isar_pump_statev_fax()
1055 bcs->hw.isar.state = STFAX_ACTIV; in isar_pump_statev_fax()
1056 test_and_set_bit(ISAR_RATE_REQ, &bcs->hw.isar.reg->Flags); in isar_pump_statev_fax()
1058 if (bcs->hw.isar.cmd == PCTRL_CMD_FTH) { in isar_pump_statev_fax()
1060 if (test_and_set_bit(BC_FLG_FTI_RUN, &bcs->Flag)) in isar_pump_statev_fax()
1061 del_timer(&bcs->hw.isar.ftimer); in isar_pump_statev_fax()
1063 bcs->hw.isar.ftimer.expires = in isar_pump_statev_fax()
1066 &bcs->Flag); in isar_pump_statev_fax()
1067 add_timer(&bcs->hw.isar.ftimer); in isar_pump_statev_fax()
1069 schedule_event(bcs, B_LL_CONNECT); in isar_pump_statev_fax()
1074 bcs->hw.isar.state); in isar_pump_statev_fax()
1084 if (bcs->hw.isar.state == STFAX_ESCAPE) { in isar_pump_statev_fax()
1086 switch (bcs->hw.isar.newcmd) { in isar_pump_statev_fax()
1088 bcs->hw.isar.state = STFAX_READY; in isar_pump_statev_fax()
1095 bcs->hw.isar.state = STFAX_SILDET; in isar_pump_statev_fax()
1101 p1 = bcs->hw.isar.mod = bcs->hw.isar.newmod; in isar_pump_statev_fax()
1102 bcs->hw.isar.newmod = 0; in isar_pump_statev_fax()
1103 bcs->hw.isar.cmd = bcs->hw.isar.newcmd; in isar_pump_statev_fax()
1104 bcs->hw.isar.newcmd = 0; in isar_pump_statev_fax()
1106 bcs->hw.isar.cmd, 1, &p1); in isar_pump_statev_fax()
1107 bcs->hw.isar.state = STFAX_LINE; in isar_pump_statev_fax()
1108 bcs->hw.isar.try_mod = 3; in isar_pump_statev_fax()
1112 debugl1(cs, "RSP_DISC unknown newcmd %x", bcs->hw.isar.newcmd); in isar_pump_statev_fax()
1115 } else if (bcs->hw.isar.state == STFAX_ACTIV) { in isar_pump_statev_fax()
1116 if (test_and_clear_bit(BC_FLG_LL_OK, &bcs->Flag)) { in isar_pump_statev_fax()
1117 schedule_event(bcs, B_LL_OK); in isar_pump_statev_fax()
1118 } else if (bcs->hw.isar.cmd == PCTRL_CMD_FRM) { in isar_pump_statev_fax()
1119 send_DLE_ETX(bcs); in isar_pump_statev_fax()
1120 schedule_event(bcs, B_LL_NOCARRIER); in isar_pump_statev_fax()
1122 ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_FCERROR); in isar_pump_statev_fax()
1124 bcs->hw.isar.state = STFAX_READY; in isar_pump_statev_fax()
1126 bcs->hw.isar.state = STFAX_READY; in isar_pump_statev_fax()
1127 ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_FCERROR); in isar_pump_statev_fax()
1133 if (bcs->hw.isar.state == STFAX_SILDET) { in isar_pump_statev_fax()
1134 p1 = bcs->hw.isar.mod = bcs->hw.isar.newmod; in isar_pump_statev_fax()
1135 bcs->hw.isar.newmod = 0; in isar_pump_statev_fax()
1136 bcs->hw.isar.cmd = bcs->hw.isar.newcmd; in isar_pump_statev_fax()
1137 bcs->hw.isar.newcmd = 0; in isar_pump_statev_fax()
1139 bcs->hw.isar.cmd, 1, &p1); in isar_pump_statev_fax()
1140 bcs->hw.isar.state = STFAX_LINE; in isar_pump_statev_fax()
1141 bcs->hw.isar.try_mod = 3; in isar_pump_statev_fax()
1149 if (bcs->hw.isar.state == STFAX_LINE) { in isar_pump_statev_fax()
1152 bcs->hw.isar.try_mod); in isar_pump_statev_fax()
1153 if (bcs->hw.isar.try_mod--) { in isar_pump_statev_fax()
1155 bcs->hw.isar.cmd, 1, in isar_pump_statev_fax()
1156 &bcs->hw.isar.mod); in isar_pump_statev_fax()
1162 bcs->hw.isar.state = STFAX_ESCAPE; in isar_pump_statev_fax()
1164 ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_FCERROR); in isar_pump_statev_fax()
1176 struct isar_reg *ireg = cs->bcs[0].hw.isar.reg; in isar_int_main()
1177 struct BCState *bcs; in isar_int_main() local
1182 if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) { in isar_int_main()
1183 isar_rcv_frame(cs, bcs); in isar_int_main()
1197 if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) { in isar_int_main()
1199 bcs->err_tx++; in isar_int_main()
1201 bcs->err_rdo++; in isar_int_main()
1210 if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) { in isar_int_main()
1212 if (bcs->mode == L1_MODE_V32) { in isar_int_main()
1213 isar_pump_statev_modem(bcs, ireg->cmsb); in isar_int_main()
1214 } else if (bcs->mode == L1_MODE_FAX) { in isar_int_main()
1215 isar_pump_statev_fax(bcs, ireg->cmsb); in isar_int_main()
1222 bcs->mode, ireg->cmsb); in isar_int_main()
1231 if ((bcs = sel_bcs_isar(cs, ireg->iis >> 6))) { in isar_int_main()
1233 isar_pump_status_rsp(bcs, ireg); in isar_int_main()
1270 ftimer_handler(struct BCState *bcs) { in ftimer_handler() argument
1271 if (bcs->cs->debug) in ftimer_handler()
1272 debugl1(bcs->cs, "ftimer flags %04lx", in ftimer_handler()
1273 bcs->Flag); in ftimer_handler()
1274 test_and_clear_bit(BC_FLG_FTI_RUN, &bcs->Flag); in ftimer_handler()
1275 if (test_and_clear_bit(BC_FLG_LL_CONN, &bcs->Flag)) { in ftimer_handler()
1276 schedule_event(bcs, B_LL_CONNECT); in ftimer_handler()
1278 if (test_and_clear_bit(BC_FLG_FTI_FTS, &bcs->Flag)) { in ftimer_handler()
1279 schedule_event(bcs, B_LL_OK); in ftimer_handler()
1284 setup_pump(struct BCState *bcs) { in setup_pump() argument
1285 struct IsdnCardState *cs = bcs->cs; in setup_pump()
1286 u_char dps = SET_DPS(bcs->hw.isar.dpath); in setup_pump()
1289 switch (bcs->mode) { in setup_pump()
1297 if (test_bit(BC_FLG_ORIG, &bcs->Flag)) { in setup_pump()
1313 if (test_bit(BC_FLG_ORIG, &bcs->Flag)) { in setup_pump()
1321 bcs->hw.isar.state = STFAX_NULL; in setup_pump()
1322 bcs->hw.isar.newcmd = 0; in setup_pump()
1323 bcs->hw.isar.newmod = 0; in setup_pump()
1324 test_and_set_bit(BC_FLG_FTI_RUN, &bcs->Flag); in setup_pump()
1333 setup_sart(struct BCState *bcs) { in setup_sart() argument
1334 struct IsdnCardState *cs = bcs->cs; in setup_sart()
1335 u_char dps = SET_DPS(bcs->hw.isar.dpath); in setup_sart()
1338 switch (bcs->mode) { in setup_sart()
1369 setup_iom2(struct BCState *bcs) { in setup_iom2() argument
1370 struct IsdnCardState *cs = bcs->cs; in setup_iom2()
1371 u_char dps = SET_DPS(bcs->hw.isar.dpath); in setup_iom2()
1374 if (bcs->channel) in setup_iom2()
1376 switch (bcs->mode) { in setup_iom2()
1380 msg[1] = msg[3] = bcs->hw.isar.dpath + 2; in setup_iom2()
1397 modeisar(struct BCState *bcs, int mode, int bc) in modeisar() argument
1399 struct IsdnCardState *cs = bcs->cs; in modeisar()
1402 if (bcs->mode == L1_MODE_NULL) { /* New Setup */ in modeisar()
1403 bcs->channel = bc; in modeisar()
1406 if (!bcs->hw.isar.dpath) in modeisar()
1414 &bcs->hw.isar.reg->Flags)) in modeisar()
1415 bcs->hw.isar.dpath = 2; in modeisar()
1417 &bcs->hw.isar.reg->Flags)) in modeisar()
1418 bcs->hw.isar.dpath = 1; in modeisar()
1428 &bcs->hw.isar.reg->Flags)) in modeisar()
1429 bcs->hw.isar.dpath = 1; in modeisar()
1440 bcs->hw.isar.dpath, bcs->mode, mode, bc); in modeisar()
1441 bcs->mode = mode; in modeisar()
1442 setup_pump(bcs); in modeisar()
1443 setup_iom2(bcs); in modeisar()
1444 setup_sart(bcs); in modeisar()
1445 if (bcs->mode == L1_MODE_NULL) { in modeisar()
1447 if (bcs->hw.isar.dpath == 1) in modeisar()
1448 test_and_clear_bit(ISAR_DP1_USE, &bcs->hw.isar.reg->Flags); in modeisar()
1449 else if (bcs->hw.isar.dpath == 2) in modeisar()
1450 test_and_clear_bit(ISAR_DP2_USE, &bcs->hw.isar.reg->Flags); in modeisar()
1451 bcs->hw.isar.dpath = 0; in modeisar()
1457 isar_pump_cmd(struct BCState *bcs, u_char cmd, u_char para) in isar_pump_cmd() argument
1459 struct IsdnCardState *cs = bcs->cs; in isar_pump_cmd()
1460 u_char dps = SET_DPS(bcs->hw.isar.dpath); in isar_pump_cmd()
1465 test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag); in isar_pump_cmd()
1466 if (bcs->hw.isar.state == STFAX_READY) { in isar_pump_cmd()
1470 bcs->hw.isar.state = STFAX_LINE; in isar_pump_cmd()
1471 bcs->hw.isar.cmd = ctrl; in isar_pump_cmd()
1472 bcs->hw.isar.mod = para; in isar_pump_cmd()
1473 bcs->hw.isar.newmod = 0; in isar_pump_cmd()
1474 bcs->hw.isar.newcmd = 0; in isar_pump_cmd()
1475 bcs->hw.isar.try_mod = 3; in isar_pump_cmd()
1476 } else if ((bcs->hw.isar.state == STFAX_ACTIV) && in isar_pump_cmd()
1477 (bcs->hw.isar.cmd == PCTRL_CMD_FTM) && in isar_pump_cmd()
1478 (bcs->hw.isar.mod == para)) { in isar_pump_cmd()
1479 ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT); in isar_pump_cmd()
1481 bcs->hw.isar.newmod = para; in isar_pump_cmd()
1482 bcs->hw.isar.newcmd = PCTRL_CMD_FTM; in isar_pump_cmd()
1485 bcs->hw.isar.state = STFAX_ESCAPE; in isar_pump_cmd()
1489 test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag); in isar_pump_cmd()
1490 if (bcs->hw.isar.state == STFAX_READY) { in isar_pump_cmd()
1494 bcs->hw.isar.state = STFAX_LINE; in isar_pump_cmd()
1495 bcs->hw.isar.cmd = ctrl; in isar_pump_cmd()
1496 bcs->hw.isar.mod = para; in isar_pump_cmd()
1497 bcs->hw.isar.newmod = 0; in isar_pump_cmd()
1498 bcs->hw.isar.newcmd = 0; in isar_pump_cmd()
1499 bcs->hw.isar.try_mod = 3; in isar_pump_cmd()
1500 } else if ((bcs->hw.isar.state == STFAX_ACTIV) && in isar_pump_cmd()
1501 (bcs->hw.isar.cmd == PCTRL_CMD_FTH) && in isar_pump_cmd()
1502 (bcs->hw.isar.mod == para)) { in isar_pump_cmd()
1503 ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT); in isar_pump_cmd()
1505 bcs->hw.isar.newmod = para; in isar_pump_cmd()
1506 bcs->hw.isar.newcmd = PCTRL_CMD_FTH; in isar_pump_cmd()
1509 bcs->hw.isar.state = STFAX_ESCAPE; in isar_pump_cmd()
1513 test_and_clear_bit(BC_FLG_FRH_WAIT, &bcs->Flag); in isar_pump_cmd()
1514 if (bcs->hw.isar.state == STFAX_READY) { in isar_pump_cmd()
1518 bcs->hw.isar.state = STFAX_LINE; in isar_pump_cmd()
1519 bcs->hw.isar.cmd = ctrl; in isar_pump_cmd()
1520 bcs->hw.isar.mod = para; in isar_pump_cmd()
1521 bcs->hw.isar.newmod = 0; in isar_pump_cmd()
1522 bcs->hw.isar.newcmd = 0; in isar_pump_cmd()
1523 bcs->hw.isar.try_mod = 3; in isar_pump_cmd()
1524 } else if ((bcs->hw.isar.state == STFAX_ACTIV) && in isar_pump_cmd()
1525 (bcs->hw.isar.cmd == PCTRL_CMD_FRM) && in isar_pump_cmd()
1526 (bcs->hw.isar.mod == para)) { in isar_pump_cmd()
1527 ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT); in isar_pump_cmd()
1529 bcs->hw.isar.newmod = para; in isar_pump_cmd()
1530 bcs->hw.isar.newcmd = PCTRL_CMD_FRM; in isar_pump_cmd()
1533 bcs->hw.isar.state = STFAX_ESCAPE; in isar_pump_cmd()
1537 test_and_set_bit(BC_FLG_FRH_WAIT, &bcs->Flag); in isar_pump_cmd()
1538 if (bcs->hw.isar.state == STFAX_READY) { in isar_pump_cmd()
1542 bcs->hw.isar.state = STFAX_LINE; in isar_pump_cmd()
1543 bcs->hw.isar.cmd = ctrl; in isar_pump_cmd()
1544 bcs->hw.isar.mod = para; in isar_pump_cmd()
1545 bcs->hw.isar.newmod = 0; in isar_pump_cmd()
1546 bcs->hw.isar.newcmd = 0; in isar_pump_cmd()
1547 bcs->hw.isar.try_mod = 3; in isar_pump_cmd()
1548 } else if ((bcs->hw.isar.state == STFAX_ACTIV) && in isar_pump_cmd()
1549 (bcs->hw.isar.cmd == PCTRL_CMD_FRH) && in isar_pump_cmd()
1550 (bcs->hw.isar.mod == para)) { in isar_pump_cmd()
1551 ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_CONNECT); in isar_pump_cmd()
1553 bcs->hw.isar.newmod = para; in isar_pump_cmd()
1554 bcs->hw.isar.newcmd = PCTRL_CMD_FRH; in isar_pump_cmd()
1557 bcs->hw.isar.state = STFAX_ESCAPE; in isar_pump_cmd()
1561 bcs->hw.isar.state = STFAX_NULL; in isar_pump_cmd()
1582 cs->bcs[i].hw.isar.mml = msg; in isar_setup()
1583 cs->bcs[i].mode = 0; in isar_setup()
1584 cs->bcs[i].hw.isar.dpath = i + 1; in isar_setup()
1585 modeisar(&cs->bcs[i], 0, 0); in isar_setup()
1586 INIT_WORK(&cs->bcs[i].tqueue, isar_bh); in isar_setup()
1593 struct BCState *bcs = st->l1.bcs; in isar_l2l1() local
1600 spin_lock_irqsave(&bcs->cs->lock, flags); in isar_l2l1()
1601 if (bcs->tx_skb) { in isar_l2l1()
1602 skb_queue_tail(&bcs->squeue, skb); in isar_l2l1()
1604 bcs->tx_skb = skb; in isar_l2l1()
1605 test_and_set_bit(BC_FLG_BUSY, &bcs->Flag); in isar_l2l1()
1606 if (bcs->cs->debug & L1_DEB_HSCX) in isar_l2l1()
1607 debugl1(bcs->cs, "DRQ set BC_FLG_BUSY"); in isar_l2l1()
1608 bcs->hw.isar.txcnt = 0; in isar_l2l1()
1609 bcs->cs->BC_Send_Data(bcs); in isar_l2l1()
1611 spin_unlock_irqrestore(&bcs->cs->lock, flags); in isar_l2l1()
1614 spin_lock_irqsave(&bcs->cs->lock, flags); in isar_l2l1()
1615 if (bcs->tx_skb) { in isar_l2l1()
1618 test_and_set_bit(BC_FLG_BUSY, &bcs->Flag); in isar_l2l1()
1619 if (bcs->cs->debug & L1_DEB_HSCX) in isar_l2l1()
1620 debugl1(bcs->cs, "PUI set BC_FLG_BUSY"); in isar_l2l1()
1621 bcs->tx_skb = skb; in isar_l2l1()
1622 bcs->hw.isar.txcnt = 0; in isar_l2l1()
1623 bcs->cs->BC_Send_Data(bcs); in isar_l2l1()
1625 spin_unlock_irqrestore(&bcs->cs->lock, flags); in isar_l2l1()
1628 if (!bcs->tx_skb) { in isar_l2l1()
1635 spin_lock_irqsave(&bcs->cs->lock, flags); in isar_l2l1()
1636 test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag); in isar_l2l1()
1637 bcs->hw.isar.conmsg[0] = 0; in isar_l2l1()
1639 test_and_set_bit(BC_FLG_ORIG, &bcs->Flag); in isar_l2l1()
1641 test_and_clear_bit(BC_FLG_ORIG, &bcs->Flag); in isar_l2l1()
1645 ret = modeisar(bcs, st->l1.mode, st->l1.bc); in isar_l2l1()
1646 spin_unlock_irqrestore(&bcs->cs->lock, flags); in isar_l2l1()
1654 ret = modeisar(bcs, st->l1.mode, st->l1.bc); in isar_l2l1()
1655 spin_unlock_irqrestore(&bcs->cs->lock, flags); in isar_l2l1()
1660 spin_unlock_irqrestore(&bcs->cs->lock, flags); in isar_l2l1()
1668 spin_lock_irqsave(&bcs->cs->lock, flags); in isar_l2l1()
1675 isar_pump_cmd(bcs, ISDN_FAXPUMP_HALT, 0); in isar_l2l1()
1678 test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag); in isar_l2l1()
1679 test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag); in isar_l2l1()
1680 if (bcs->cs->debug & L1_DEB_HSCX) in isar_l2l1()
1681 debugl1(bcs->cs, "PDAC clear BC_FLG_BUSY"); in isar_l2l1()
1682 modeisar(bcs, 0, st->l1.bc); in isar_l2l1()
1683 spin_unlock_irqrestore(&bcs->cs->lock, flags); in isar_l2l1()
1690 close_isarstate(struct BCState *bcs) in close_isarstate() argument
1692 modeisar(bcs, 0, bcs->channel); in close_isarstate()
1693 if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) { in close_isarstate()
1694 kfree(bcs->hw.isar.rcvbuf); in close_isarstate()
1695 bcs->hw.isar.rcvbuf = NULL; in close_isarstate()
1696 skb_queue_purge(&bcs->rqueue); in close_isarstate()
1697 skb_queue_purge(&bcs->squeue); in close_isarstate()
1698 if (bcs->tx_skb) { in close_isarstate()
1699 dev_kfree_skb_any(bcs->tx_skb); in close_isarstate()
1700 bcs->tx_skb = NULL; in close_isarstate()
1701 test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag); in close_isarstate()
1702 if (bcs->cs->debug & L1_DEB_HSCX) in close_isarstate()
1703 debugl1(bcs->cs, "closeisar clear BC_FLG_BUSY"); in close_isarstate()
1706 del_timer(&bcs->hw.isar.ftimer); in close_isarstate()
1710 open_isarstate(struct IsdnCardState *cs, struct BCState *bcs) in open_isarstate() argument
1712 if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) { in open_isarstate()
1713 if (!(bcs->hw.isar.rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC))) { in open_isarstate()
1718 skb_queue_head_init(&bcs->rqueue); in open_isarstate()
1719 skb_queue_head_init(&bcs->squeue); in open_isarstate()
1721 bcs->tx_skb = NULL; in open_isarstate()
1722 test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag); in open_isarstate()
1725 bcs->event = 0; in open_isarstate()
1726 bcs->hw.isar.rcvidx = 0; in open_isarstate()
1727 bcs->tx_cnt = 0; in open_isarstate()
1732 setstack_isar(struct PStack *st, struct BCState *bcs) in setstack_isar() argument
1734 bcs->channel = st->l1.bc; in setstack_isar()
1735 if (open_isarstate(st->l1.hardware, bcs)) in setstack_isar()
1737 st->l1.bcs = bcs; in setstack_isar()
1740 bcs->st = st; in setstack_isar()
1749 struct BCState *bcs; in isar_auxcmd() local
1755 bcs = cs->channel[ic->arg].bcs; in isar_auxcmd()
1763 &bcs->Flag); in isar_auxcmd()
1781 if (bcs->hw.isar.state == STFAX_READY) { in isar_auxcmd()
1788 if (!test_and_set_bit(BC_FLG_FTI_RUN, &bcs->Flag)) { in isar_auxcmd()
1790 bcs->hw.isar.ftimer.expires = in isar_auxcmd()
1792 test_and_set_bit(BC_FLG_FTI_FTS, &bcs->Flag); in isar_auxcmd()
1793 add_timer(&bcs->hw.isar.ftimer); in isar_auxcmd()
1803 ic->parm.aux.para[0], bcs->hw.isar.state); in isar_auxcmd()
1816 "%d", bcs->hw.isar.mod); in isar_auxcmd()
1840 test_bit(BC_FLG_INIT, &bcs->Flag)) { in isar_auxcmd()
1841 isar_pump_cmd(bcs, in isar_auxcmd()
1901 cs->bcs[0].BC_SetStack = setstack_isar; in initisar()
1902 cs->bcs[1].BC_SetStack = setstack_isar; in initisar()
1903 cs->bcs[0].BC_Close = close_isarstate; in initisar()
1904 cs->bcs[1].BC_Close = close_isarstate; in initisar()
1905 cs->bcs[0].hw.isar.ftimer.function = (void *) ftimer_handler; in initisar()
1906 cs->bcs[0].hw.isar.ftimer.data = (long) &cs->bcs[0]; in initisar()
1907 init_timer(&cs->bcs[0].hw.isar.ftimer); in initisar()
1908 cs->bcs[1].hw.isar.ftimer.function = (void *) ftimer_handler; in initisar()
1909 cs->bcs[1].hw.isar.ftimer.data = (long) &cs->bcs[1]; in initisar()
1910 init_timer(&cs->bcs[1].hw.isar.ftimer); in initisar()