Lines Matching refs:cs
31 void ISACVersion(struct IsdnCardState *cs, char *s) in ISACVersion() argument
35 val = cs->readisac(cs, ISAC_RBCH); in ISACVersion()
40 ph_command(struct IsdnCardState *cs, unsigned int command) in ph_command() argument
42 if (cs->debug & L1_DEB_ISAC) in ph_command()
43 debugl1(cs, "ph_command %x", command); in ph_command()
44 cs->writeisac(cs, ISAC_CIX0, (command << 2) | 3); in ph_command()
49 isac_new_ph(struct IsdnCardState *cs) in isac_new_ph() argument
51 switch (cs->dc.isac.ph_state) { in isac_new_ph()
54 ph_command(cs, ISAC_CMD_DUI); in isac_new_ph()
55 l1_msg(cs, HW_RESET | INDICATION, NULL); in isac_new_ph()
58 l1_msg(cs, HW_DEACTIVATE | CONFIRM, NULL); in isac_new_ph()
61 l1_msg(cs, HW_DEACTIVATE | INDICATION, NULL); in isac_new_ph()
64 l1_msg(cs, HW_POWERUP | CONFIRM, NULL); in isac_new_ph()
67 l1_msg(cs, HW_RSYNC | INDICATION, NULL); in isac_new_ph()
70 l1_msg(cs, HW_INFO2 | INDICATION, NULL); in isac_new_ph()
73 l1_msg(cs, HW_INFO4_P8 | INDICATION, NULL); in isac_new_ph()
76 l1_msg(cs, HW_INFO4_P10 | INDICATION, NULL); in isac_new_ph()
86 struct IsdnCardState *cs = in isac_bh() local
90 if (test_and_clear_bit(D_CLEARBUSY, &cs->event)) { in isac_bh()
91 if (cs->debug) in isac_bh()
92 debugl1(cs, "D-Channel Busy cleared"); in isac_bh()
93 stptr = cs->stlist; in isac_bh()
99 if (test_and_clear_bit(D_L1STATECHANGE, &cs->event)) in isac_bh()
100 isac_new_ph(cs); in isac_bh()
101 if (test_and_clear_bit(D_RCVBUFREADY, &cs->event)) in isac_bh()
102 DChannel_proc_rcv(cs); in isac_bh()
103 if (test_and_clear_bit(D_XMTBUFREADY, &cs->event)) in isac_bh()
104 DChannel_proc_xmt(cs); in isac_bh()
106 if (!test_bit(HW_ARCOFI, &cs->HW_Flags)) in isac_bh()
108 if (test_and_clear_bit(D_RX_MON1, &cs->event)) in isac_bh()
109 arcofi_fsm(cs, ARCOFI_RX_END, NULL); in isac_bh()
110 if (test_and_clear_bit(D_TX_MON1, &cs->event)) in isac_bh()
111 arcofi_fsm(cs, ARCOFI_TX_END, NULL); in isac_bh()
116 isac_empty_fifo(struct IsdnCardState *cs, int count) in isac_empty_fifo() argument
120 if ((cs->debug & L1_DEB_ISAC) && !(cs->debug & L1_DEB_ISAC_FIFO)) in isac_empty_fifo()
121 debugl1(cs, "isac_empty_fifo"); in isac_empty_fifo()
123 if ((cs->rcvidx + count) >= MAX_DFRAME_LEN_L1) { in isac_empty_fifo()
124 if (cs->debug & L1_DEB_WARN) in isac_empty_fifo()
125 debugl1(cs, "isac_empty_fifo overrun %d", in isac_empty_fifo()
126 cs->rcvidx + count); in isac_empty_fifo()
127 cs->writeisac(cs, ISAC_CMDR, 0x80); in isac_empty_fifo()
128 cs->rcvidx = 0; in isac_empty_fifo()
131 ptr = cs->rcvbuf + cs->rcvidx; in isac_empty_fifo()
132 cs->rcvidx += count; in isac_empty_fifo()
133 cs->readisacfifo(cs, ptr, count); in isac_empty_fifo()
134 cs->writeisac(cs, ISAC_CMDR, 0x80); in isac_empty_fifo()
135 if (cs->debug & L1_DEB_ISAC_FIFO) { in isac_empty_fifo()
136 char *t = cs->dlog; in isac_empty_fifo()
140 debugl1(cs, "%s", cs->dlog); in isac_empty_fifo()
145 isac_fill_fifo(struct IsdnCardState *cs) in isac_fill_fifo() argument
150 if ((cs->debug & L1_DEB_ISAC) && !(cs->debug & L1_DEB_ISAC_FIFO)) in isac_fill_fifo()
151 debugl1(cs, "isac_fill_fifo"); in isac_fill_fifo()
153 if (!cs->tx_skb) in isac_fill_fifo()
156 count = cs->tx_skb->len; in isac_fill_fifo()
165 ptr = cs->tx_skb->data; in isac_fill_fifo()
166 skb_pull(cs->tx_skb, count); in isac_fill_fifo()
167 cs->tx_cnt += count; in isac_fill_fifo()
168 cs->writeisacfifo(cs, ptr, count); in isac_fill_fifo()
169 cs->writeisac(cs, ISAC_CMDR, more ? 0x8 : 0xa); in isac_fill_fifo()
170 if (test_and_set_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) { in isac_fill_fifo()
171 debugl1(cs, "isac_fill_fifo dbusytimer running"); in isac_fill_fifo()
172 del_timer(&cs->dbusytimer); in isac_fill_fifo()
174 init_timer(&cs->dbusytimer); in isac_fill_fifo()
175 cs->dbusytimer.expires = jiffies + ((DBUSY_TIMER_VALUE * HZ)/1000); in isac_fill_fifo()
176 add_timer(&cs->dbusytimer); in isac_fill_fifo()
177 if (cs->debug & L1_DEB_ISAC_FIFO) { in isac_fill_fifo()
178 char *t = cs->dlog; in isac_fill_fifo()
182 debugl1(cs, "%s", cs->dlog); in isac_fill_fifo()
187 isac_interrupt(struct IsdnCardState *cs, u_char val) in isac_interrupt() argument
193 if (cs->debug & L1_DEB_ISAC) in isac_interrupt()
194 debugl1(cs, "ISAC interrupt %x", val); in isac_interrupt()
196 exval = cs->readisac(cs, ISAC_RSTA); in isac_interrupt()
199 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
200 debugl1(cs, "ISAC RDO"); in isac_interrupt()
202 cs->err_rx++; in isac_interrupt()
206 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
207 debugl1(cs, "ISAC CRC error"); in isac_interrupt()
209 cs->err_crc++; in isac_interrupt()
212 cs->writeisac(cs, ISAC_CMDR, 0x80); in isac_interrupt()
214 count = cs->readisac(cs, ISAC_RBCL) & 0x1f; in isac_interrupt()
217 isac_empty_fifo(cs, count); in isac_interrupt()
218 if ((count = cs->rcvidx) > 0) { in isac_interrupt()
219 cs->rcvidx = 0; in isac_interrupt()
223 memcpy(skb_put(skb, count), cs->rcvbuf, count); in isac_interrupt()
224 skb_queue_tail(&cs->rq, skb); in isac_interrupt()
228 cs->rcvidx = 0; in isac_interrupt()
229 schedule_event(cs, D_RCVBUFREADY); in isac_interrupt()
232 isac_empty_fifo(cs, 32); in isac_interrupt()
236 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
237 debugl1(cs, "ISAC RSC interrupt"); in isac_interrupt()
240 if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) in isac_interrupt()
241 del_timer(&cs->dbusytimer); in isac_interrupt()
242 if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags)) in isac_interrupt()
243 schedule_event(cs, D_CLEARBUSY); in isac_interrupt()
244 if (cs->tx_skb) { in isac_interrupt()
245 if (cs->tx_skb->len) { in isac_interrupt()
246 isac_fill_fifo(cs); in isac_interrupt()
249 dev_kfree_skb_irq(cs->tx_skb); in isac_interrupt()
250 cs->tx_cnt = 0; in isac_interrupt()
251 cs->tx_skb = NULL; in isac_interrupt()
254 if ((cs->tx_skb = skb_dequeue(&cs->sq))) { in isac_interrupt()
255 cs->tx_cnt = 0; in isac_interrupt()
256 isac_fill_fifo(cs); in isac_interrupt()
258 schedule_event(cs, D_XMTBUFREADY); in isac_interrupt()
262 exval = cs->readisac(cs, ISAC_CIR0); in isac_interrupt()
263 if (cs->debug & L1_DEB_ISAC) in isac_interrupt()
264 debugl1(cs, "ISAC CIR0 %02X", exval); in isac_interrupt()
266 cs->dc.isac.ph_state = (exval >> 2) & 0xf; in isac_interrupt()
267 if (cs->debug & L1_DEB_ISAC) in isac_interrupt()
268 debugl1(cs, "ph_state change %x", cs->dc.isac.ph_state); in isac_interrupt()
269 schedule_event(cs, D_L1STATECHANGE); in isac_interrupt()
272 exval = cs->readisac(cs, ISAC_CIR1); in isac_interrupt()
273 if (cs->debug & L1_DEB_ISAC) in isac_interrupt()
274 debugl1(cs, "ISAC CIR1 %02X", exval); in isac_interrupt()
279 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
280 debugl1(cs, "ISAC SIN interrupt"); in isac_interrupt()
283 exval = cs->readisac(cs, ISAC_EXIR); in isac_interrupt()
284 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
285 debugl1(cs, "ISAC EXIR %02x", exval); in isac_interrupt()
287 debugl1(cs, "ISAC XMR"); in isac_interrupt()
291 debugl1(cs, "ISAC XDU"); in isac_interrupt()
294 cs->err_tx++; in isac_interrupt()
296 if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) in isac_interrupt()
297 del_timer(&cs->dbusytimer); in isac_interrupt()
298 if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags)) in isac_interrupt()
299 schedule_event(cs, D_CLEARBUSY); in isac_interrupt()
300 if (cs->tx_skb) { /* Restart frame */ in isac_interrupt()
301 skb_push(cs->tx_skb, cs->tx_cnt); in isac_interrupt()
302 cs->tx_cnt = 0; in isac_interrupt()
303 isac_fill_fifo(cs); in isac_interrupt()
306 debugl1(cs, "ISAC XDU no skb"); in isac_interrupt()
310 v1 = cs->readisac(cs, ISAC_MOSR); in isac_interrupt()
311 if (cs->debug & L1_DEB_MONITOR) in isac_interrupt()
312 debugl1(cs, "ISAC MOSR %02x", v1); in isac_interrupt()
315 if (!cs->dc.isac.mon_rx) { in isac_interrupt()
316 if (!(cs->dc.isac.mon_rx = kmalloc(MAX_MON_FRAME, GFP_ATOMIC))) { in isac_interrupt()
317 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
318 debugl1(cs, "ISAC MON RX out of memory!"); in isac_interrupt()
319 cs->dc.isac.mocr &= 0xf0; in isac_interrupt()
320 cs->dc.isac.mocr |= 0x0a; in isac_interrupt()
321 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
324 cs->dc.isac.mon_rxp = 0; in isac_interrupt()
326 if (cs->dc.isac.mon_rxp >= MAX_MON_FRAME) { in isac_interrupt()
327 cs->dc.isac.mocr &= 0xf0; in isac_interrupt()
328 cs->dc.isac.mocr |= 0x0a; in isac_interrupt()
329 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
330 cs->dc.isac.mon_rxp = 0; in isac_interrupt()
331 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
332 debugl1(cs, "ISAC MON RX overflow!"); in isac_interrupt()
335 cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp++] = cs->readisac(cs, ISAC_MOR0); in isac_interrupt()
336 if (cs->debug & L1_DEB_MONITOR) in isac_interrupt()
337 debugl1(cs, "ISAC MOR0 %02x", cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp - 1]); in isac_interrupt()
338 if (cs->dc.isac.mon_rxp == 1) { in isac_interrupt()
339 cs->dc.isac.mocr |= 0x04; in isac_interrupt()
340 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
345 if (!cs->dc.isac.mon_rx) { in isac_interrupt()
346 if (!(cs->dc.isac.mon_rx = kmalloc(MAX_MON_FRAME, GFP_ATOMIC))) { in isac_interrupt()
347 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
348 debugl1(cs, "ISAC MON RX out of memory!"); in isac_interrupt()
349 cs->dc.isac.mocr &= 0x0f; in isac_interrupt()
350 cs->dc.isac.mocr |= 0xa0; in isac_interrupt()
351 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
354 cs->dc.isac.mon_rxp = 0; in isac_interrupt()
356 if (cs->dc.isac.mon_rxp >= MAX_MON_FRAME) { in isac_interrupt()
357 cs->dc.isac.mocr &= 0x0f; in isac_interrupt()
358 cs->dc.isac.mocr |= 0xa0; in isac_interrupt()
359 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
360 cs->dc.isac.mon_rxp = 0; in isac_interrupt()
361 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
362 debugl1(cs, "ISAC MON RX overflow!"); in isac_interrupt()
365 cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp++] = cs->readisac(cs, ISAC_MOR1); in isac_interrupt()
366 if (cs->debug & L1_DEB_MONITOR) in isac_interrupt()
367 debugl1(cs, "ISAC MOR1 %02x", cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp - 1]); in isac_interrupt()
368 cs->dc.isac.mocr |= 0x40; in isac_interrupt()
369 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
373 cs->dc.isac.mocr &= 0xf0; in isac_interrupt()
374 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
375 cs->dc.isac.mocr |= 0x0a; in isac_interrupt()
376 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
377 schedule_event(cs, D_RX_MON0); in isac_interrupt()
380 cs->dc.isac.mocr &= 0x0f; in isac_interrupt()
381 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
382 cs->dc.isac.mocr |= 0xa0; in isac_interrupt()
383 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
384 schedule_event(cs, D_RX_MON1); in isac_interrupt()
387 if ((!cs->dc.isac.mon_tx) || (cs->dc.isac.mon_txc && in isac_interrupt()
388 (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc) && in isac_interrupt()
390 cs->dc.isac.mocr &= 0xf0; in isac_interrupt()
391 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
392 cs->dc.isac.mocr |= 0x0a; in isac_interrupt()
393 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
394 if (cs->dc.isac.mon_txc && in isac_interrupt()
395 (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc)) in isac_interrupt()
396 schedule_event(cs, D_TX_MON0); in isac_interrupt()
399 if (cs->dc.isac.mon_txc && (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc)) { in isac_interrupt()
400 schedule_event(cs, D_TX_MON0); in isac_interrupt()
403 cs->writeisac(cs, ISAC_MOX0, in isac_interrupt()
404 cs->dc.isac.mon_tx[cs->dc.isac.mon_txp++]); in isac_interrupt()
405 if (cs->debug & L1_DEB_MONITOR) in isac_interrupt()
406 debugl1(cs, "ISAC %02x -> MOX0", cs->dc.isac.mon_tx[cs->dc.isac.mon_txp - 1]); in isac_interrupt()
410 if ((!cs->dc.isac.mon_tx) || (cs->dc.isac.mon_txc && in isac_interrupt()
411 (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc) && in isac_interrupt()
413 cs->dc.isac.mocr &= 0x0f; in isac_interrupt()
414 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
415 cs->dc.isac.mocr |= 0xa0; in isac_interrupt()
416 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
417 if (cs->dc.isac.mon_txc && in isac_interrupt()
418 (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc)) in isac_interrupt()
419 schedule_event(cs, D_TX_MON1); in isac_interrupt()
422 if (cs->dc.isac.mon_txc && (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc)) { in isac_interrupt()
423 schedule_event(cs, D_TX_MON1); in isac_interrupt()
426 cs->writeisac(cs, ISAC_MOX1, in isac_interrupt()
427 cs->dc.isac.mon_tx[cs->dc.isac.mon_txp++]); in isac_interrupt()
428 if (cs->debug & L1_DEB_MONITOR) in isac_interrupt()
429 debugl1(cs, "ISAC %02x -> MOX1", cs->dc.isac.mon_tx[cs->dc.isac.mon_txp - 1]); in isac_interrupt()
440 struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware; in ISAC_l1hw() local
447 if (cs->debug & DEB_DLOG_HEX) in ISAC_l1hw()
448 LogFrame(cs, skb->data, skb->len); in ISAC_l1hw()
449 if (cs->debug & DEB_DLOG_VERBOSE) in ISAC_l1hw()
450 dlogframe(cs, skb, 0); in ISAC_l1hw()
451 spin_lock_irqsave(&cs->lock, flags); in ISAC_l1hw()
452 if (cs->tx_skb) { in ISAC_l1hw()
453 skb_queue_tail(&cs->sq, skb); in ISAC_l1hw()
455 if (cs->debug & L1_DEB_LAPD) in ISAC_l1hw()
456 Logl2Frame(cs, skb, "PH_DATA Queued", 0); in ISAC_l1hw()
459 cs->tx_skb = skb; in ISAC_l1hw()
460 cs->tx_cnt = 0; in ISAC_l1hw()
462 if (cs->debug & L1_DEB_LAPD) in ISAC_l1hw()
463 Logl2Frame(cs, skb, "PH_DATA", 0); in ISAC_l1hw()
465 isac_fill_fifo(cs); in ISAC_l1hw()
467 spin_unlock_irqrestore(&cs->lock, flags); in ISAC_l1hw()
470 spin_lock_irqsave(&cs->lock, flags); in ISAC_l1hw()
471 if (cs->tx_skb) { in ISAC_l1hw()
472 if (cs->debug & L1_DEB_WARN) in ISAC_l1hw()
473 debugl1(cs, " l2l1 tx_skb exist this shouldn't happen"); in ISAC_l1hw()
474 skb_queue_tail(&cs->sq, skb); in ISAC_l1hw()
476 if (cs->debug & DEB_DLOG_HEX) in ISAC_l1hw()
477 LogFrame(cs, skb->data, skb->len); in ISAC_l1hw()
478 if (cs->debug & DEB_DLOG_VERBOSE) in ISAC_l1hw()
479 dlogframe(cs, skb, 0); in ISAC_l1hw()
480 cs->tx_skb = skb; in ISAC_l1hw()
481 cs->tx_cnt = 0; in ISAC_l1hw()
483 if (cs->debug & L1_DEB_LAPD) in ISAC_l1hw()
484 Logl2Frame(cs, skb, "PH_DATA_PULLED", 0); in ISAC_l1hw()
486 isac_fill_fifo(cs); in ISAC_l1hw()
488 spin_unlock_irqrestore(&cs->lock, flags); in ISAC_l1hw()
492 if (cs->debug & L1_DEB_LAPD) in ISAC_l1hw()
493 debugl1(cs, "-> PH_REQUEST_PULL"); in ISAC_l1hw()
495 if (!cs->tx_skb) { in ISAC_l1hw()
502 spin_lock_irqsave(&cs->lock, flags); in ISAC_l1hw()
503 if ((cs->dc.isac.ph_state == ISAC_IND_EI) || in ISAC_l1hw()
504 (cs->dc.isac.ph_state == ISAC_IND_DR) || in ISAC_l1hw()
505 (cs->dc.isac.ph_state == ISAC_IND_RS)) in ISAC_l1hw()
506 ph_command(cs, ISAC_CMD_TIM); in ISAC_l1hw()
508 ph_command(cs, ISAC_CMD_RS); in ISAC_l1hw()
509 spin_unlock_irqrestore(&cs->lock, flags); in ISAC_l1hw()
512 spin_lock_irqsave(&cs->lock, flags); in ISAC_l1hw()
513 ph_command(cs, ISAC_CMD_TIM); in ISAC_l1hw()
514 spin_unlock_irqrestore(&cs->lock, flags); in ISAC_l1hw()
517 spin_lock_irqsave(&cs->lock, flags); in ISAC_l1hw()
518 ph_command(cs, ISAC_CMD_AR8); in ISAC_l1hw()
519 spin_unlock_irqrestore(&cs->lock, flags); in ISAC_l1hw()
522 spin_lock_irqsave(&cs->lock, flags); in ISAC_l1hw()
528 if (test_bit(HW_IOM1, &cs->HW_Flags)) { in ISAC_l1hw()
531 cs->writeisac(cs, ISAC_SPCR, 0xa); in ISAC_l1hw()
532 cs->writeisac(cs, ISAC_ADF1, 0x2); in ISAC_l1hw()
534 cs->writeisac(cs, ISAC_SPCR, val); in ISAC_l1hw()
535 cs->writeisac(cs, ISAC_ADF1, 0xa); in ISAC_l1hw()
539 cs->writeisac(cs, ISAC_SPCR, val); in ISAC_l1hw()
541 cs->writeisac(cs, ISAC_ADF1, 0x8); in ISAC_l1hw()
543 cs->writeisac(cs, ISAC_ADF1, 0x0); in ISAC_l1hw()
545 spin_unlock_irqrestore(&cs->lock, flags); in ISAC_l1hw()
548 skb_queue_purge(&cs->rq); in ISAC_l1hw()
549 skb_queue_purge(&cs->sq); in ISAC_l1hw()
550 if (cs->tx_skb) { in ISAC_l1hw()
551 dev_kfree_skb_any(cs->tx_skb); in ISAC_l1hw()
552 cs->tx_skb = NULL; in ISAC_l1hw()
554 if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) in ISAC_l1hw()
555 del_timer(&cs->dbusytimer); in ISAC_l1hw()
556 if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags)) in ISAC_l1hw()
557 schedule_event(cs, D_CLEARBUSY); in ISAC_l1hw()
560 if (cs->debug & L1_DEB_WARN) in ISAC_l1hw()
561 debugl1(cs, "isac_l1hw unknown %04x", pr); in ISAC_l1hw()
567 setstack_isac(struct PStack *st, struct IsdnCardState *cs) in setstack_isac() argument
573 DC_Close_isac(struct IsdnCardState *cs) in DC_Close_isac() argument
575 kfree(cs->dc.isac.mon_rx); in DC_Close_isac()
576 cs->dc.isac.mon_rx = NULL; in DC_Close_isac()
577 kfree(cs->dc.isac.mon_tx); in DC_Close_isac()
578 cs->dc.isac.mon_tx = NULL; in DC_Close_isac()
582 dbusy_timer_handler(struct IsdnCardState *cs) in dbusy_timer_handler() argument
587 if (test_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) { in dbusy_timer_handler()
588 rbch = cs->readisac(cs, ISAC_RBCH); in dbusy_timer_handler()
589 star = cs->readisac(cs, ISAC_STAR); in dbusy_timer_handler()
590 if (cs->debug) in dbusy_timer_handler()
591 debugl1(cs, "D-Channel Busy RBCH %02x STAR %02x", in dbusy_timer_handler()
594 test_and_set_bit(FLG_L1_DBUSY, &cs->HW_Flags); in dbusy_timer_handler()
595 stptr = cs->stlist; in dbusy_timer_handler()
602 test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags); in dbusy_timer_handler()
603 if (cs->tx_skb) { in dbusy_timer_handler()
604 dev_kfree_skb_any(cs->tx_skb); in dbusy_timer_handler()
605 cs->tx_cnt = 0; in dbusy_timer_handler()
606 cs->tx_skb = NULL; in dbusy_timer_handler()
609 debugl1(cs, "D-Channel Busy no skb"); in dbusy_timer_handler()
611 cs->writeisac(cs, ISAC_CMDR, 0x01); /* Transmitter reset */ in dbusy_timer_handler()
612 cs->irq_func(cs->irq, cs); in dbusy_timer_handler()
617 void initisac(struct IsdnCardState *cs) in initisac() argument
619 cs->setstack_d = setstack_isac; in initisac()
620 cs->DC_Close = DC_Close_isac; in initisac()
621 cs->dc.isac.mon_tx = NULL; in initisac()
622 cs->dc.isac.mon_rx = NULL; in initisac()
623 cs->writeisac(cs, ISAC_MASK, 0xff); in initisac()
624 cs->dc.isac.mocr = 0xaa; in initisac()
625 if (test_bit(HW_IOM1, &cs->HW_Flags)) { in initisac()
627 cs->writeisac(cs, ISAC_ADF2, 0x0); in initisac()
628 cs->writeisac(cs, ISAC_SPCR, 0xa); in initisac()
629 cs->writeisac(cs, ISAC_ADF1, 0x2); in initisac()
630 cs->writeisac(cs, ISAC_STCR, 0x70); in initisac()
631 cs->writeisac(cs, ISAC_MODE, 0xc9); in initisac()
634 if (!cs->dc.isac.adf2) in initisac()
635 cs->dc.isac.adf2 = 0x80; in initisac()
636 cs->writeisac(cs, ISAC_ADF2, cs->dc.isac.adf2); in initisac()
637 cs->writeisac(cs, ISAC_SQXR, 0x2f); in initisac()
638 cs->writeisac(cs, ISAC_SPCR, 0x00); in initisac()
639 cs->writeisac(cs, ISAC_STCR, 0x70); in initisac()
640 cs->writeisac(cs, ISAC_MODE, 0xc9); in initisac()
641 cs->writeisac(cs, ISAC_TIMR, 0x00); in initisac()
642 cs->writeisac(cs, ISAC_ADF1, 0x00); in initisac()
644 ph_command(cs, ISAC_CMD_RS); in initisac()
645 cs->writeisac(cs, ISAC_MASK, 0x0); in initisac()
648 void clear_pending_isac_ints(struct IsdnCardState *cs) in clear_pending_isac_ints() argument
652 val = cs->readisac(cs, ISAC_STAR); in clear_pending_isac_ints()
653 debugl1(cs, "ISAC STAR %x", val); in clear_pending_isac_ints()
654 val = cs->readisac(cs, ISAC_MODE); in clear_pending_isac_ints()
655 debugl1(cs, "ISAC MODE %x", val); in clear_pending_isac_ints()
656 val = cs->readisac(cs, ISAC_ADF2); in clear_pending_isac_ints()
657 debugl1(cs, "ISAC ADF2 %x", val); in clear_pending_isac_ints()
658 val = cs->readisac(cs, ISAC_ISTA); in clear_pending_isac_ints()
659 debugl1(cs, "ISAC ISTA %x", val); in clear_pending_isac_ints()
661 eval = cs->readisac(cs, ISAC_EXIR); in clear_pending_isac_ints()
662 debugl1(cs, "ISAC EXIR %x", eval); in clear_pending_isac_ints()
664 val = cs->readisac(cs, ISAC_CIR0); in clear_pending_isac_ints()
665 debugl1(cs, "ISAC CIR0 %x", val); in clear_pending_isac_ints()
666 cs->dc.isac.ph_state = (val >> 2) & 0xf; in clear_pending_isac_ints()
667 schedule_event(cs, D_L1STATECHANGE); in clear_pending_isac_ints()
669 cs->writeisac(cs, ISAC_MASK, 0xFF); in clear_pending_isac_ints()
672 void setup_isac(struct IsdnCardState *cs) in setup_isac() argument
674 INIT_WORK(&cs->tqueue, isac_bh); in setup_isac()
675 cs->dbusytimer.function = (void *) dbusy_timer_handler; in setup_isac()
676 cs->dbusytimer.data = (long) cs; in setup_isac()
677 init_timer(&cs->dbusytimer); in setup_isac()