Lines Matching refs:bcs

45 static void bch_empty_fifo(struct BCState *bcs, int count);
46 static void bch_fill_fifo(struct BCState *bcs);
48 static void bch_mode(struct BCState *bcs, int mode, int bc);
49 static void bch_close_state(struct BCState *bcs);
50 static int bch_open_state(struct IsdnCardState *cs, struct BCState *bcs);
51 static int bch_setstack(struct PStack *st, struct BCState *bcs);
448 struct BCState *bcs = st->l1.bcs;
454 spin_lock_irqsave(&bcs->cs->lock, flags);
455 if (bcs->tx_skb) {
456 skb_queue_tail(&bcs->squeue, skb);
458 bcs->tx_skb = skb;
459 set_bit(BC_FLG_BUSY, &bcs->Flag);
460 bcs->hw.hscx.count = 0;
461 bch_fill_fifo(bcs);
463 spin_unlock_irqrestore(&bcs->cs->lock, flags);
466 spin_lock_irqsave(&bcs->cs->lock, flags);
467 if (bcs->tx_skb) {
470 set_bit(BC_FLG_BUSY, &bcs->Flag);
471 bcs->tx_skb = skb;
472 bcs->hw.hscx.count = 0;
473 bch_fill_fifo(bcs);
475 spin_unlock_irqrestore(&bcs->cs->lock, flags);
478 if (!bcs->tx_skb) {
485 spin_lock_irqsave(&bcs->cs->lock, flags);
486 set_bit(BC_FLG_ACTIV, &bcs->Flag);
487 bch_mode(bcs, st->l1.mode, st->l1.bc);
488 spin_unlock_irqrestore(&bcs->cs->lock, flags);
495 spin_lock_irqsave(&bcs->cs->lock, flags);
496 clear_bit(BC_FLG_ACTIV, &bcs->Flag);
497 clear_bit(BC_FLG_BUSY, &bcs->Flag);
498 bch_mode(bcs, 0, st->l1.bc);
499 spin_unlock_irqrestore(&bcs->cs->lock, flags);
509 bch_empty_fifo(struct BCState *bcs, int count)
515 cs = bcs->cs;
516 hscx = bcs->hw.hscx.hscx;
521 if (bcs->hw.hscx.rcvidx + count > HSCX_BUFMAX) {
525 bcs->hw.hscx.rcvidx = 0;
529 ptr = bcs->hw.hscx.rcvbuf + bcs->hw.hscx.rcvidx;
534 ptr = bcs->hw.hscx.rcvbuf + bcs->hw.hscx.rcvidx;
535 bcs->hw.hscx.rcvidx += count;
538 char *t = bcs->blog;
542 debugl1(cs, "%s", bcs->blog);
550 bch_fill_fifo(struct BCState *bcs)
556 cs = bcs->cs;
560 if (!bcs->tx_skb) return;
561 if (bcs->tx_skb->len <= 0) return;
563 hscx = bcs->hw.hscx.hscx;
564 more = (bcs->mode == L1_MODE_TRANS) ? 1 : 0;
565 if (bcs->tx_skb->len > B_FIFO_SIZE) {
569 count = bcs->tx_skb->len;
573 p = ptr = bcs->tx_skb->data;
574 skb_pull(bcs->tx_skb, count);
575 bcs->tx_cnt -= count;
576 bcs->hw.hscx.count += count;
581 char *t = bcs->blog;
585 debugl1(cs, "%s", bcs->blog);
596 struct BCState *bcs;
601 bcs = cs->bcs + hscx;
606 if (!test_bit(BC_FLG_INIT, &bcs->Flag)) return;
614 if ((rstab & 0x40) && (bcs->mode != L1_MODE_NULL))
616 debugl1(cs, "bch_int() B-%d: RDO mode=%d", hscx, bcs->mode);
625 bch_empty_fifo(bcs, count);
626 if ((count = bcs->hw.hscx.rcvidx - 1) > 0) {
632 memcpy(skb_put(skb, count), bcs->hw.hscx.rcvbuf, count);
633 skb_queue_tail(&bcs->rqueue, skb);
637 bcs->hw.hscx.rcvidx = 0;
638 schedule_event(bcs, B_RCVBUFREADY);
642 bch_empty_fifo(bcs, B_FIFO_SIZE);
644 if (bcs->mode == L1_MODE_TRANS) { // queue every chunk
649 memcpy(skb_put(skb, B_FIFO_SIZE), bcs->hw.hscx.rcvbuf, B_FIFO_SIZE);
650 skb_queue_tail(&bcs->rqueue, skb);
652 bcs->hw.hscx.rcvidx = 0;
653 schedule_event(bcs, B_RCVBUFREADY);
664 if (bcs->tx_skb) {
665 if (bcs->tx_skb->len) {
666 bch_fill_fifo(bcs);
669 if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) &&
670 (PACKET_NOACK != bcs->tx_skb->pkt_type)) {
672 spin_lock_irqsave(&bcs->aclock, flags);
673 bcs->ackcnt += bcs->hw.hscx.count;
674 spin_unlock_irqrestore(&bcs->aclock, flags);
675 schedule_event(bcs, B_ACKPENDING);
678 dev_kfree_skb_irq(bcs->tx_skb);
679 bcs->hw.hscx.count = 0;
680 bcs->tx_skb = NULL;
682 if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
683 bcs->hw.hscx.count = 0;
684 set_bit(BC_FLG_BUSY, &bcs->Flag);
685 bch_fill_fifo(bcs);
687 clear_bit(BC_FLG_BUSY, &bcs->Flag);
688 schedule_event(bcs, B_XMTBUFREADY);
694 if (bcs->mode == L1_MODE_TRANS) {
695 bch_fill_fifo(bcs);
698 if (bcs->tx_skb) { // restart transmitting the whole frame
699 skb_push(bcs->tx_skb, bcs->hw.hscx.count);
700 bcs->tx_cnt += bcs->hw.hscx.count;
701 bcs->hw.hscx.count = 0;
713 bch_mode(struct BCState *bcs, int mode, int bc)
715 struct IsdnCardState *cs = bcs->cs;
716 int hscx = bcs->hw.hscx.hscx;
721 bcs->mode = mode;
722 bcs->channel = bc;
761 bch_close_state(struct BCState *bcs)
763 bch_mode(bcs, 0, bcs->channel);
764 if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) {
765 kfree(bcs->hw.hscx.rcvbuf);
766 bcs->hw.hscx.rcvbuf = NULL;
767 kfree(bcs->blog);
768 bcs->blog = NULL;
769 skb_queue_purge(&bcs->rqueue);
770 skb_queue_purge(&bcs->squeue);
771 if (bcs->tx_skb) {
772 dev_kfree_skb_any(bcs->tx_skb);
773 bcs->tx_skb = NULL;
774 clear_bit(BC_FLG_BUSY, &bcs->Flag);
782 bch_open_state(struct IsdnCardState *cs, struct BCState *bcs)
784 if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
785 if (!(bcs->hw.hscx.rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC))) {
788 clear_bit(BC_FLG_INIT, &bcs->Flag);
791 if (!(bcs->blog = kmalloc(MAX_BLOG_SPACE, GFP_ATOMIC))) {
793 "HiSax open_bchstate: No memory for bcs->blog\n");
794 clear_bit(BC_FLG_INIT, &bcs->Flag);
795 kfree(bcs->hw.hscx.rcvbuf);
796 bcs->hw.hscx.rcvbuf = NULL;
799 skb_queue_head_init(&bcs->rqueue);
800 skb_queue_head_init(&bcs->squeue);
802 bcs->tx_skb = NULL;
803 clear_bit(BC_FLG_BUSY, &bcs->Flag);
804 bcs->event = 0;
805 bcs->hw.hscx.rcvidx = 0;
806 bcs->tx_cnt = 0;
813 bch_setstack(struct PStack *st, struct BCState *bcs)
815 bcs->channel = st->l1.bc;
816 if (bch_open_state(st->l1.hardware, bcs)) return (-1);
817 st->l1.bcs = bcs;
820 bcs->st = st;
830 cs->bcs[hscx].BC_SetStack = bch_setstack;
831 cs->bcs[hscx].BC_Close = bch_close_state;
832 cs->bcs[hscx].hw.hscx.hscx = hscx;
833 cs->bcs[hscx].cs = cs;
834 bch_mode(cs->bcs + hscx, 0, hscx);