Lines Matching refs:bcs

57 GetFreeFifoBytes(struct BCState *bcs)  in GetFreeFifoBytes()  argument
61 if (bcs->hw.hfc.f1 == bcs->hw.hfc.f2) in GetFreeFifoBytes()
62 return (bcs->cs->hw.hfc.fifosize); in GetFreeFifoBytes()
63 s = bcs->hw.hfc.send[bcs->hw.hfc.f1] - bcs->hw.hfc.send[bcs->hw.hfc.f2]; in GetFreeFifoBytes()
65 s += bcs->cs->hw.hfc.fifosize; in GetFreeFifoBytes()
66 s = bcs->cs->hw.hfc.fifosize - s; in GetFreeFifoBytes()
71 ReadZReg(struct BCState *bcs, u_char reg) in ReadZReg() argument
75 WaitNoBusy(bcs->cs); in ReadZReg()
76 val = 256 * bcs->cs->BC_Read_Reg(bcs->cs, HFC_DATA, reg | HFC_CIP | HFC_Z_HIGH); in ReadZReg()
77 WaitNoBusy(bcs->cs); in ReadZReg()
78 val += bcs->cs->BC_Read_Reg(bcs->cs, HFC_DATA, reg | HFC_CIP | HFC_Z_LOW); in ReadZReg()
83 hfc_clear_fifo(struct BCState *bcs) in hfc_clear_fifo() argument
85 struct IsdnCardState *cs = bcs->cs; in hfc_clear_fifo()
92 cip = HFC_CIP | HFC_F1 | HFC_REC | HFC_CHANNEL(bcs->channel); in hfc_clear_fifo()
99 cip = HFC_CIP | HFC_F2 | HFC_REC | HFC_CHANNEL(bcs->channel); in hfc_clear_fifo()
102 z1 = ReadZReg(bcs, HFC_Z1 | HFC_REC | HFC_CHANNEL(bcs->channel)); in hfc_clear_fifo()
103 z2 = ReadZReg(bcs, HFC_Z2 | HFC_REC | HFC_CHANNEL(bcs->channel)); in hfc_clear_fifo()
108 bcs->channel, f1, f2); in hfc_clear_fifo()
116 bcs->channel, z1, z2, rcnt); in hfc_clear_fifo()
117 cip = HFC_CIP | HFC_FIFO_OUT | HFC_REC | HFC_CHANNEL(bcs->channel); in hfc_clear_fifo()
126 HFC_CHANNEL(bcs->channel)); in hfc_clear_fifo()
129 cip = HFC_CIP | HFC_F1 | HFC_REC | HFC_CHANNEL(bcs->channel); in hfc_clear_fifo()
132 cip = HFC_CIP | HFC_F2 | HFC_REC | HFC_CHANNEL(bcs->channel); in hfc_clear_fifo()
135 z1 = ReadZReg(bcs, HFC_Z1 | HFC_REC | HFC_CHANNEL(bcs->channel)); in hfc_clear_fifo()
136 z2 = ReadZReg(bcs, HFC_Z2 | HFC_REC | HFC_CHANNEL(bcs->channel)); in hfc_clear_fifo()
144 hfc_empty_fifo(struct BCState *bcs, int count) in hfc_empty_fifo() argument
148 struct IsdnCardState *cs = bcs->cs; in hfc_empty_fifo()
159 cip = HFC_CIP | HFC_FIFO_OUT | HFC_REC | HFC_CHANNEL(bcs->channel); in hfc_empty_fifo()
164 HFC_CHANNEL(bcs->channel)); in hfc_empty_fifo()
168 if ((count < 4) && (bcs->mode != L1_MODE_TRANS)) { in hfc_empty_fifo()
171 cip = HFC_CIP | HFC_FIFO_OUT | HFC_REC | HFC_CHANNEL(bcs->channel); in hfc_empty_fifo()
176 HFC_CHANNEL(bcs->channel)); in hfc_empty_fifo()
179 bcs->err_inv++; in hfc_empty_fifo()
183 if (bcs->mode == L1_MODE_TRANS) in hfc_empty_fifo()
192 cip = HFC_CIP | HFC_FIFO_OUT | HFC_REC | HFC_CHANNEL(bcs->channel); in hfc_empty_fifo()
199 printk(KERN_WARNING "HFC FIFO channel %d BUSY Error\n", bcs->channel); in hfc_empty_fifo()
201 if (bcs->mode != L1_MODE_TRANS) { in hfc_empty_fifo()
204 HFC_CHANNEL(bcs->channel)); in hfc_empty_fifo()
209 if (bcs->mode != L1_MODE_TRANS) { in hfc_empty_fifo()
218 bcs->channel, chksum, stat); in hfc_empty_fifo()
224 bcs->err_crc++; in hfc_empty_fifo()
229 HFC_CHANNEL(bcs->channel)); in hfc_empty_fifo()
237 hfc_fill_fifo(struct BCState *bcs) in hfc_fill_fifo() argument
239 struct IsdnCardState *cs = bcs->cs; in hfc_fill_fifo()
245 if (!bcs->tx_skb) in hfc_fill_fifo()
247 if (bcs->tx_skb->len <= 0) in hfc_fill_fifo()
250 cip = HFC_CIP | HFC_F1 | HFC_SEND | HFC_CHANNEL(bcs->channel); in hfc_fill_fifo()
256 if (bcs->mode != L1_MODE_TRANS) { in hfc_fill_fifo()
257 bcs->hw.hfc.f1 = cs->BC_Read_Reg(cs, HFC_DATA, cip); in hfc_fill_fifo()
258 cip = HFC_CIP | HFC_F2 | HFC_SEND | HFC_CHANNEL(bcs->channel); in hfc_fill_fifo()
260 bcs->hw.hfc.f2 = cs->BC_Read_Reg(cs, HFC_DATA, cip); in hfc_fill_fifo()
261 bcs->hw.hfc.send[bcs->hw.hfc.f1] = ReadZReg(bcs, HFC_Z1 | HFC_SEND | HFC_CHANNEL(bcs->channel)); in hfc_fill_fifo()
264 bcs->channel, bcs->hw.hfc.f1, bcs->hw.hfc.f2, in hfc_fill_fifo()
265 bcs->hw.hfc.send[bcs->hw.hfc.f1]); in hfc_fill_fifo()
266 fcnt = bcs->hw.hfc.f1 - bcs->hw.hfc.f2; in hfc_fill_fifo()
274 count = GetFreeFifoBytes(bcs); in hfc_fill_fifo()
278 z1 = ReadZReg(bcs, HFC_Z1 | HFC_REC | HFC_CHANNEL(bcs->channel)); in hfc_fill_fifo()
279 z2 = ReadZReg(bcs, HFC_Z2 | HFC_REC | HFC_CHANNEL(bcs->channel)); in hfc_fill_fifo()
286 bcs->channel, bcs->tx_skb->len, in hfc_fill_fifo()
288 if (count < bcs->tx_skb->len) { in hfc_fill_fifo()
293 cip = HFC_CIP | HFC_FIFO_IN | HFC_SEND | HFC_CHANNEL(bcs->channel); in hfc_fill_fifo()
295 while ((idx < bcs->tx_skb->len) && WaitNoBusy(cs)) in hfc_fill_fifo()
296 cs->BC_Write_Reg(cs, HFC_DATA_NODEB, cip, bcs->tx_skb->data[idx++]); in hfc_fill_fifo()
297 if (idx != bcs->tx_skb->len) { in hfc_fill_fifo()
299 printk(KERN_WARNING "HFC S FIFO channel %d BUSY Error\n", bcs->channel); in hfc_fill_fifo()
301 count = bcs->tx_skb->len; in hfc_fill_fifo()
302 bcs->tx_cnt -= count; in hfc_fill_fifo()
303 if (PACKET_NOACK == bcs->tx_skb->pkt_type) in hfc_fill_fifo()
305 dev_kfree_skb_any(bcs->tx_skb); in hfc_fill_fifo()
306 bcs->tx_skb = NULL; in hfc_fill_fifo()
307 if (bcs->mode != L1_MODE_TRANS) { in hfc_fill_fifo()
310 cs->BC_Read_Reg(cs, HFC_DATA, HFC_CIP | HFC_F1_INC | HFC_SEND | HFC_CHANNEL(bcs->channel)); in hfc_fill_fifo()
312 if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) && in hfc_fill_fifo()
315 spin_lock_irqsave(&bcs->aclock, flags); in hfc_fill_fifo()
316 bcs->ackcnt += count; in hfc_fill_fifo()
317 spin_unlock_irqrestore(&bcs->aclock, flags); in hfc_fill_fifo()
318 schedule_event(bcs, B_ACKPENDING); in hfc_fill_fifo()
320 test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag); in hfc_fill_fifo()
326 main_irq_hfc(struct BCState *bcs) in main_irq_hfc() argument
328 struct IsdnCardState *cs = bcs->cs; in main_irq_hfc()
336 cip = HFC_CIP | HFC_F1 | HFC_REC | HFC_CHANNEL(bcs->channel); in main_irq_hfc()
343 if (bcs->mode == L1_MODE_HDLC) { in main_irq_hfc()
345 cip = HFC_CIP | HFC_F2 | HFC_REC | HFC_CHANNEL(bcs->channel); in main_irq_hfc()
351 bcs->channel, f1, f2); in main_irq_hfc()
355 if (receive || (bcs->mode == L1_MODE_TRANS)) { in main_irq_hfc()
357 z1 = ReadZReg(bcs, HFC_Z1 | HFC_REC | HFC_CHANNEL(bcs->channel)); in main_irq_hfc()
358 z2 = ReadZReg(bcs, HFC_Z2 | HFC_REC | HFC_CHANNEL(bcs->channel)); in main_irq_hfc()
362 if ((bcs->mode == L1_MODE_HDLC) || (rcnt)) { in main_irq_hfc()
366 bcs->channel, z1, z2, rcnt); in main_irq_hfc()
368 if ((skb = hfc_empty_fifo(bcs, rcnt))) { in main_irq_hfc()
369 skb_queue_tail(&bcs->rqueue, skb); in main_irq_hfc()
370 schedule_event(bcs, B_RCVBUFREADY); in main_irq_hfc()
375 if (bcs->tx_skb) { in main_irq_hfc()
377 test_and_set_bit(BC_FLG_BUSY, &bcs->Flag); in main_irq_hfc()
378 hfc_fill_fifo(bcs); in main_irq_hfc()
379 if (test_bit(BC_FLG_BUSY, &bcs->Flag)) in main_irq_hfc()
382 if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) { in main_irq_hfc()
384 test_and_set_bit(BC_FLG_BUSY, &bcs->Flag); in main_irq_hfc()
385 hfc_fill_fifo(bcs); in main_irq_hfc()
386 if (test_bit(BC_FLG_BUSY, &bcs->Flag)) in main_irq_hfc()
390 schedule_event(bcs, B_XMTBUFREADY); in main_irq_hfc()
399 mode_hfc(struct BCState *bcs, int mode, int bc) in mode_hfc() argument
401 struct IsdnCardState *cs = bcs->cs; in mode_hfc()
405 mode, bc, bcs->channel); in mode_hfc()
406 bcs->mode = mode; in mode_hfc()
407 bcs->channel = bc; in mode_hfc()
423 hfc_clear_fifo(bcs); /* complete fifo clear */ in mode_hfc()
449 hfc_clear_fifo(bcs); in mode_hfc()
455 struct BCState *bcs = st->l1.bcs; in hfc_l2l1() local
461 spin_lock_irqsave(&bcs->cs->lock, flags); in hfc_l2l1()
462 if (bcs->tx_skb) { in hfc_l2l1()
463 skb_queue_tail(&bcs->squeue, skb); in hfc_l2l1()
465 bcs->tx_skb = skb; in hfc_l2l1()
466 test_and_set_bit(BC_FLG_BUSY, &bcs->Flag); in hfc_l2l1()
467 bcs->cs->BC_Send_Data(bcs); in hfc_l2l1()
469 spin_unlock_irqrestore(&bcs->cs->lock, flags); in hfc_l2l1()
472 spin_lock_irqsave(&bcs->cs->lock, flags); in hfc_l2l1()
473 if (bcs->tx_skb) { in hfc_l2l1()
476 test_and_set_bit(BC_FLG_BUSY, &bcs->Flag); in hfc_l2l1()
477 bcs->tx_skb = skb; in hfc_l2l1()
478 bcs->cs->BC_Send_Data(bcs); in hfc_l2l1()
480 spin_unlock_irqrestore(&bcs->cs->lock, flags); in hfc_l2l1()
483 if (!bcs->tx_skb) { in hfc_l2l1()
490 spin_lock_irqsave(&bcs->cs->lock, flags); in hfc_l2l1()
491 test_and_set_bit(BC_FLG_ACTIV, &bcs->Flag); in hfc_l2l1()
492 mode_hfc(bcs, st->l1.mode, st->l1.bc); in hfc_l2l1()
493 spin_unlock_irqrestore(&bcs->cs->lock, flags); in hfc_l2l1()
500 spin_lock_irqsave(&bcs->cs->lock, flags); in hfc_l2l1()
501 test_and_clear_bit(BC_FLG_ACTIV, &bcs->Flag); in hfc_l2l1()
502 test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag); in hfc_l2l1()
503 mode_hfc(bcs, 0, st->l1.bc); in hfc_l2l1()
504 spin_unlock_irqrestore(&bcs->cs->lock, flags); in hfc_l2l1()
512 close_hfcstate(struct BCState *bcs) in close_hfcstate() argument
514 mode_hfc(bcs, 0, bcs->channel); in close_hfcstate()
515 if (test_bit(BC_FLG_INIT, &bcs->Flag)) { in close_hfcstate()
516 skb_queue_purge(&bcs->rqueue); in close_hfcstate()
517 skb_queue_purge(&bcs->squeue); in close_hfcstate()
518 if (bcs->tx_skb) { in close_hfcstate()
519 dev_kfree_skb_any(bcs->tx_skb); in close_hfcstate()
520 bcs->tx_skb = NULL; in close_hfcstate()
521 test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag); in close_hfcstate()
524 test_and_clear_bit(BC_FLG_INIT, &bcs->Flag); in close_hfcstate()
528 open_hfcstate(struct IsdnCardState *cs, struct BCState *bcs) in open_hfcstate() argument
530 if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) { in open_hfcstate()
531 skb_queue_head_init(&bcs->rqueue); in open_hfcstate()
532 skb_queue_head_init(&bcs->squeue); in open_hfcstate()
534 bcs->tx_skb = NULL; in open_hfcstate()
535 test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag); in open_hfcstate()
536 bcs->event = 0; in open_hfcstate()
537 bcs->tx_cnt = 0; in open_hfcstate()
542 setstack_hfc(struct PStack *st, struct BCState *bcs) in setstack_hfc() argument
544 bcs->channel = st->l1.bc; in setstack_hfc()
545 if (open_hfcstate(st->l1.hardware, bcs)) in setstack_hfc()
547 st->l1.bcs = bcs; in setstack_hfc()
550 bcs->st = st; in setstack_hfc()
556 init_send(struct BCState *bcs) in init_send() argument
560 if (!(bcs->hw.hfc.send = kmalloc(32 * sizeof(unsigned int), GFP_ATOMIC))) { in init_send()
566 bcs->hw.hfc.send[i] = 0x1fff; in init_send()
572 init_send(&cs->bcs[0]); in inithfc()
573 init_send(&cs->bcs[1]); in inithfc()
575 cs->bcs[0].BC_SetStack = setstack_hfc; in inithfc()
576 cs->bcs[1].BC_SetStack = setstack_hfc; in inithfc()
577 cs->bcs[0].BC_Close = close_hfcstate; in inithfc()
578 cs->bcs[1].BC_Close = close_hfcstate; in inithfc()
579 mode_hfc(cs->bcs, 0, 0); in inithfc()
580 mode_hfc(cs->bcs + 1, 0, 0); in inithfc()
586 kfree(cs->bcs[0].hw.hfc.send); in releasehfc()
587 cs->bcs[0].hw.hfc.send = NULL; in releasehfc()
588 kfree(cs->bcs[1].hw.hfc.send); in releasehfc()
589 cs->bcs[1].hw.hfc.send = NULL; in releasehfc()