Lines Matching +full:cs +full:- +full:out
3 * low level b-channel stuff for Siemens HSCX
17 waitforCEC(struct IsdnCardState *cs, int hscx) in waitforCEC() argument
21 while ((READHSCX(cs, hscx, HSCX_STAR) & 0x04) && to) { in waitforCEC()
23 to--; in waitforCEC()
31 waitforXFW(struct IsdnCardState *cs, int hscx) in waitforXFW() argument
35 while (((READHSCX(cs, hscx, HSCX_STAR) & 0x44) != 0x40) && to) { in waitforXFW()
37 to--; in waitforXFW()
44 WriteHSCXCMDR(struct IsdnCardState *cs, int hscx, u_char data) in WriteHSCXCMDR() argument
46 waitforCEC(cs, hscx); in WriteHSCXCMDR()
47 WRITEHSCX(cs, hscx, HSCX_CMDR, data); in WriteHSCXCMDR()
56 struct IsdnCardState *cs = bcs->cs; in hscx_empty_fifo() local
58 if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO)) in hscx_empty_fifo()
59 debugl1(cs, "hscx_empty_fifo"); in hscx_empty_fifo()
61 if (bcs->hw.hscx.rcvidx + count > HSCX_BUFMAX) { in hscx_empty_fifo()
62 if (cs->debug & L1_DEB_WARN) in hscx_empty_fifo()
63 debugl1(cs, "hscx_empty_fifo: incoming packet too large"); in hscx_empty_fifo()
64 WriteHSCXCMDR(cs, bcs->hw.hscx.hscx, 0x80); in hscx_empty_fifo()
65 bcs->hw.hscx.rcvidx = 0; in hscx_empty_fifo()
68 ptr = bcs->hw.hscx.rcvbuf + bcs->hw.hscx.rcvidx; in hscx_empty_fifo()
69 bcs->hw.hscx.rcvidx += count; in hscx_empty_fifo()
70 READHSCXFIFO(cs, bcs->hw.hscx.hscx, ptr, count); in hscx_empty_fifo()
71 WriteHSCXCMDR(cs, bcs->hw.hscx.hscx, 0x80); in hscx_empty_fifo()
72 if (cs->debug & L1_DEB_HSCX_FIFO) { in hscx_empty_fifo()
73 char *t = bcs->blog; in hscx_empty_fifo()
76 bcs->hw.hscx.hscx ? 'B' : 'A', count); in hscx_empty_fifo()
78 debugl1(cs, "%s", bcs->blog); in hscx_empty_fifo()
85 struct IsdnCardState *cs = bcs->cs; in hscx_fill_fifo() local
87 int fifo_size = test_bit(HW_IPAC, &cs->HW_Flags) ? 64 : 32; in hscx_fill_fifo()
90 if ((cs->debug & L1_DEB_HSCX) && !(cs->debug & L1_DEB_HSCX_FIFO)) in hscx_fill_fifo()
91 debugl1(cs, "hscx_fill_fifo"); in hscx_fill_fifo()
93 if (!bcs->tx_skb) in hscx_fill_fifo()
95 if (bcs->tx_skb->len <= 0) in hscx_fill_fifo()
98 more = (bcs->mode == L1_MODE_TRANS) ? 1 : 0; in hscx_fill_fifo()
99 if (bcs->tx_skb->len > fifo_size) { in hscx_fill_fifo()
103 count = bcs->tx_skb->len; in hscx_fill_fifo()
105 waitforXFW(cs, bcs->hw.hscx.hscx); in hscx_fill_fifo()
106 ptr = bcs->tx_skb->data; in hscx_fill_fifo()
107 skb_pull(bcs->tx_skb, count); in hscx_fill_fifo()
108 bcs->tx_cnt -= count; in hscx_fill_fifo()
109 bcs->hw.hscx.count += count; in hscx_fill_fifo()
110 WRITEHSCXFIFO(cs, bcs->hw.hscx.hscx, ptr, count); in hscx_fill_fifo()
111 WriteHSCXCMDR(cs, bcs->hw.hscx.hscx, more ? 0x8 : 0xa); in hscx_fill_fifo()
112 if (cs->debug & L1_DEB_HSCX_FIFO) { in hscx_fill_fifo()
113 char *t = bcs->blog; in hscx_fill_fifo()
116 bcs->hw.hscx.hscx ? 'B' : 'A', count); in hscx_fill_fifo()
118 debugl1(cs, "%s", bcs->blog); in hscx_fill_fifo()
123 hscx_interrupt(struct IsdnCardState *cs, u_char val, u_char hscx) in hscx_interrupt() argument
126 struct BCState *bcs = cs->bcs + hscx; in hscx_interrupt()
128 int fifo_size = test_bit(HW_IPAC, &cs->HW_Flags) ? 64 : 32; in hscx_interrupt()
131 if (!test_bit(BC_FLG_INIT, &bcs->Flag)) in hscx_interrupt()
135 r = READHSCX(cs, hscx, HSCX_RSTA); in hscx_interrupt()
138 if (cs->debug & L1_DEB_WARN) in hscx_interrupt()
139 debugl1(cs, "HSCX invalid frame"); in hscx_interrupt()
141 bcs->err_inv++; in hscx_interrupt()
144 if ((r & 0x40) && bcs->mode) { in hscx_interrupt()
145 if (cs->debug & L1_DEB_WARN) in hscx_interrupt()
146 debugl1(cs, "HSCX RDO mode=%d", in hscx_interrupt()
147 bcs->mode); in hscx_interrupt()
149 bcs->err_rdo++; in hscx_interrupt()
153 if (cs->debug & L1_DEB_WARN) in hscx_interrupt()
154 debugl1(cs, "HSCX CRC error"); in hscx_interrupt()
156 bcs->err_crc++; in hscx_interrupt()
159 WriteHSCXCMDR(cs, hscx, 0x80); in hscx_interrupt()
161 count = READHSCX(cs, hscx, HSCX_RBCL) & ( in hscx_interrupt()
162 test_bit(HW_IPAC, &cs->HW_Flags) ? 0x3f : 0x1f); in hscx_interrupt()
166 if ((count = bcs->hw.hscx.rcvidx - 1) > 0) { in hscx_interrupt()
167 if (cs->debug & L1_DEB_HSCX_FIFO) in hscx_interrupt()
168 debugl1(cs, "HX Frame %d", count); in hscx_interrupt()
170 printk(KERN_WARNING "HSCX: receive out of memory\n"); in hscx_interrupt()
172 skb_put_data(skb, bcs->hw.hscx.rcvbuf, in hscx_interrupt()
174 skb_queue_tail(&bcs->rqueue, skb); in hscx_interrupt()
178 bcs->hw.hscx.rcvidx = 0; in hscx_interrupt()
183 if (bcs->mode == L1_MODE_TRANS) { in hscx_interrupt()
186 printk(KERN_WARNING "HiSax: receive out of memory\n"); in hscx_interrupt()
188 skb_put_data(skb, bcs->hw.hscx.rcvbuf, in hscx_interrupt()
190 skb_queue_tail(&bcs->rqueue, skb); in hscx_interrupt()
192 bcs->hw.hscx.rcvidx = 0; in hscx_interrupt()
197 if (bcs->tx_skb) { in hscx_interrupt()
198 if (bcs->tx_skb->len) { in hscx_interrupt()
202 if (test_bit(FLG_LLI_L1WAKEUP, &bcs->st->lli.flag) && in hscx_interrupt()
203 (PACKET_NOACK != bcs->tx_skb->pkt_type)) { in hscx_interrupt()
205 spin_lock_irqsave(&bcs->aclock, flags); in hscx_interrupt()
206 bcs->ackcnt += bcs->hw.hscx.count; in hscx_interrupt()
207 spin_unlock_irqrestore(&bcs->aclock, flags); in hscx_interrupt()
210 dev_kfree_skb_irq(bcs->tx_skb); in hscx_interrupt()
211 bcs->hw.hscx.count = 0; in hscx_interrupt()
212 bcs->tx_skb = NULL; in hscx_interrupt()
215 if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) { in hscx_interrupt()
216 bcs->hw.hscx.count = 0; in hscx_interrupt()
217 test_and_set_bit(BC_FLG_BUSY, &bcs->Flag); in hscx_interrupt()
220 test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag); in hscx_interrupt()
227 hscx_int_main(struct IsdnCardState *cs, u_char val) in hscx_int_main() argument
234 bcs = cs->bcs + 1; in hscx_int_main()
235 exval = READHSCX(cs, 1, HSCX_EXIR); in hscx_int_main()
237 if (bcs->mode == 1) in hscx_int_main()
241 bcs->err_tx++; in hscx_int_main()
246 if (bcs->tx_skb) { in hscx_int_main()
247 skb_push(bcs->tx_skb, bcs->hw.hscx.count); in hscx_int_main()
248 bcs->tx_cnt += bcs->hw.hscx.count; in hscx_int_main()
249 bcs->hw.hscx.count = 0; in hscx_int_main()
251 WriteHSCXCMDR(cs, bcs->hw.hscx.hscx, 0x01); in hscx_int_main()
252 if (cs->debug & L1_DEB_WARN) in hscx_int_main()
253 debugl1(cs, "HSCX B EXIR %x Lost TX", exval); in hscx_int_main()
255 } else if (cs->debug & L1_DEB_HSCX) in hscx_int_main()
256 debugl1(cs, "HSCX B EXIR %x", exval); in hscx_int_main()
259 if (cs->debug & L1_DEB_HSCX) in hscx_int_main()
260 debugl1(cs, "HSCX B interrupt %x", val); in hscx_int_main()
261 hscx_interrupt(cs, val, 1); in hscx_int_main()
264 bcs = cs->bcs; in hscx_int_main()
265 exval = READHSCX(cs, 0, HSCX_EXIR); in hscx_int_main()
267 if (bcs->mode == L1_MODE_TRANS) in hscx_int_main()
274 bcs->err_tx++; in hscx_int_main()
276 if (bcs->tx_skb) { in hscx_int_main()
277 skb_push(bcs->tx_skb, bcs->hw.hscx.count); in hscx_int_main()
278 bcs->tx_cnt += bcs->hw.hscx.count; in hscx_int_main()
279 bcs->hw.hscx.count = 0; in hscx_int_main()
281 WriteHSCXCMDR(cs, bcs->hw.hscx.hscx, 0x01); in hscx_int_main()
282 if (cs->debug & L1_DEB_WARN) in hscx_int_main()
283 debugl1(cs, "HSCX A EXIR %x Lost TX", exval); in hscx_int_main()
285 } else if (cs->debug & L1_DEB_HSCX) in hscx_int_main()
286 debugl1(cs, "HSCX A EXIR %x", exval); in hscx_int_main()
289 exval = READHSCX(cs, 0, HSCX_ISTA); in hscx_int_main()
290 if (cs->debug & L1_DEB_HSCX) in hscx_int_main()
291 debugl1(cs, "HSCX A interrupt %x", exval); in hscx_int_main()
292 hscx_interrupt(cs, exval, 0); in hscx_int_main()