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 cs->dbusytimer.expires = jiffies + ((DBUSY_TIMER_VALUE * HZ)/1000); in isac_fill_fifo()
175 add_timer(&cs->dbusytimer); in isac_fill_fifo()
176 if (cs->debug & L1_DEB_ISAC_FIFO) { in isac_fill_fifo()
177 char *t = cs->dlog; in isac_fill_fifo()
181 debugl1(cs, "%s", cs->dlog); in isac_fill_fifo()
186 isac_interrupt(struct IsdnCardState *cs, u_char val) in isac_interrupt() argument
192 if (cs->debug & L1_DEB_ISAC) in isac_interrupt()
193 debugl1(cs, "ISAC interrupt %x", val); in isac_interrupt()
195 exval = cs->readisac(cs, ISAC_RSTA); in isac_interrupt()
198 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
199 debugl1(cs, "ISAC RDO"); in isac_interrupt()
201 cs->err_rx++; in isac_interrupt()
205 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
206 debugl1(cs, "ISAC CRC error"); in isac_interrupt()
208 cs->err_crc++; in isac_interrupt()
211 cs->writeisac(cs, ISAC_CMDR, 0x80); in isac_interrupt()
213 count = cs->readisac(cs, ISAC_RBCL) & 0x1f; in isac_interrupt()
216 isac_empty_fifo(cs, count); in isac_interrupt()
217 count = cs->rcvidx; in isac_interrupt()
219 cs->rcvidx = 0; in isac_interrupt()
224 skb_put_data(skb, cs->rcvbuf, count); in isac_interrupt()
225 skb_queue_tail(&cs->rq, skb); in isac_interrupt()
229 cs->rcvidx = 0; in isac_interrupt()
230 schedule_event(cs, D_RCVBUFREADY); in isac_interrupt()
233 isac_empty_fifo(cs, 32); in isac_interrupt()
237 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
238 debugl1(cs, "ISAC RSC interrupt"); in isac_interrupt()
241 if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) in isac_interrupt()
242 del_timer(&cs->dbusytimer); in isac_interrupt()
243 if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags)) in isac_interrupt()
244 schedule_event(cs, D_CLEARBUSY); in isac_interrupt()
245 if (cs->tx_skb) { in isac_interrupt()
246 if (cs->tx_skb->len) { in isac_interrupt()
247 isac_fill_fifo(cs); in isac_interrupt()
250 dev_kfree_skb_irq(cs->tx_skb); in isac_interrupt()
251 cs->tx_cnt = 0; in isac_interrupt()
252 cs->tx_skb = NULL; in isac_interrupt()
255 cs->tx_skb = skb_dequeue(&cs->sq); in isac_interrupt()
256 if (cs->tx_skb) { in isac_interrupt()
257 cs->tx_cnt = 0; in isac_interrupt()
258 isac_fill_fifo(cs); in isac_interrupt()
260 schedule_event(cs, D_XMTBUFREADY); in isac_interrupt()
264 exval = cs->readisac(cs, ISAC_CIR0); in isac_interrupt()
265 if (cs->debug & L1_DEB_ISAC) in isac_interrupt()
266 debugl1(cs, "ISAC CIR0 %02X", exval); in isac_interrupt()
268 cs->dc.isac.ph_state = (exval >> 2) & 0xf; in isac_interrupt()
269 if (cs->debug & L1_DEB_ISAC) in isac_interrupt()
270 debugl1(cs, "ph_state change %x", cs->dc.isac.ph_state); in isac_interrupt()
271 schedule_event(cs, D_L1STATECHANGE); in isac_interrupt()
274 exval = cs->readisac(cs, ISAC_CIR1); in isac_interrupt()
275 if (cs->debug & L1_DEB_ISAC) in isac_interrupt()
276 debugl1(cs, "ISAC CIR1 %02X", exval); in isac_interrupt()
281 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
282 debugl1(cs, "ISAC SIN interrupt"); in isac_interrupt()
285 exval = cs->readisac(cs, ISAC_EXIR); in isac_interrupt()
286 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
287 debugl1(cs, "ISAC EXIR %02x", exval); in isac_interrupt()
289 debugl1(cs, "ISAC XMR"); in isac_interrupt()
293 debugl1(cs, "ISAC XDU"); in isac_interrupt()
296 cs->err_tx++; in isac_interrupt()
298 if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) in isac_interrupt()
299 del_timer(&cs->dbusytimer); in isac_interrupt()
300 if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags)) in isac_interrupt()
301 schedule_event(cs, D_CLEARBUSY); in isac_interrupt()
302 if (cs->tx_skb) { /* Restart frame */ in isac_interrupt()
303 skb_push(cs->tx_skb, cs->tx_cnt); in isac_interrupt()
304 cs->tx_cnt = 0; in isac_interrupt()
305 isac_fill_fifo(cs); in isac_interrupt()
308 debugl1(cs, "ISAC XDU no skb"); in isac_interrupt()
312 v1 = cs->readisac(cs, ISAC_MOSR); in isac_interrupt()
313 if (cs->debug & L1_DEB_MONITOR) in isac_interrupt()
314 debugl1(cs, "ISAC MOSR %02x", v1); in isac_interrupt()
317 if (!cs->dc.isac.mon_rx) { in isac_interrupt()
318 cs->dc.isac.mon_rx = kmalloc(MAX_MON_FRAME, GFP_ATOMIC); in isac_interrupt()
319 if (!cs->dc.isac.mon_rx) { in isac_interrupt()
320 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
321 debugl1(cs, "ISAC MON RX out of memory!"); in isac_interrupt()
322 cs->dc.isac.mocr &= 0xf0; in isac_interrupt()
323 cs->dc.isac.mocr |= 0x0a; in isac_interrupt()
324 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
327 cs->dc.isac.mon_rxp = 0; in isac_interrupt()
329 if (cs->dc.isac.mon_rxp >= MAX_MON_FRAME) { in isac_interrupt()
330 cs->dc.isac.mocr &= 0xf0; in isac_interrupt()
331 cs->dc.isac.mocr |= 0x0a; in isac_interrupt()
332 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
333 cs->dc.isac.mon_rxp = 0; in isac_interrupt()
334 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
335 debugl1(cs, "ISAC MON RX overflow!"); in isac_interrupt()
338 cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp++] = cs->readisac(cs, ISAC_MOR0); in isac_interrupt()
339 if (cs->debug & L1_DEB_MONITOR) in isac_interrupt()
340 debugl1(cs, "ISAC MOR0 %02x", cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp - 1]); in isac_interrupt()
341 if (cs->dc.isac.mon_rxp == 1) { in isac_interrupt()
342 cs->dc.isac.mocr |= 0x04; in isac_interrupt()
343 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
348 if (!cs->dc.isac.mon_rx) { in isac_interrupt()
349 cs->dc.isac.mon_rx = kmalloc(MAX_MON_FRAME, GFP_ATOMIC); in isac_interrupt()
350 if (!cs->dc.isac.mon_rx) { in isac_interrupt()
351 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
352 debugl1(cs, "ISAC MON RX out of memory!"); in isac_interrupt()
353 cs->dc.isac.mocr &= 0x0f; in isac_interrupt()
354 cs->dc.isac.mocr |= 0xa0; in isac_interrupt()
355 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
358 cs->dc.isac.mon_rxp = 0; in isac_interrupt()
360 if (cs->dc.isac.mon_rxp >= MAX_MON_FRAME) { in isac_interrupt()
361 cs->dc.isac.mocr &= 0x0f; in isac_interrupt()
362 cs->dc.isac.mocr |= 0xa0; in isac_interrupt()
363 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
364 cs->dc.isac.mon_rxp = 0; in isac_interrupt()
365 if (cs->debug & L1_DEB_WARN) in isac_interrupt()
366 debugl1(cs, "ISAC MON RX overflow!"); in isac_interrupt()
369 cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp++] = cs->readisac(cs, ISAC_MOR1); in isac_interrupt()
370 if (cs->debug & L1_DEB_MONITOR) in isac_interrupt()
371 debugl1(cs, "ISAC MOR1 %02x", cs->dc.isac.mon_rx[cs->dc.isac.mon_rxp - 1]); in isac_interrupt()
372 cs->dc.isac.mocr |= 0x40; in isac_interrupt()
373 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
377 cs->dc.isac.mocr &= 0xf0; in isac_interrupt()
378 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
379 cs->dc.isac.mocr |= 0x0a; in isac_interrupt()
380 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
381 schedule_event(cs, D_RX_MON0); in isac_interrupt()
384 cs->dc.isac.mocr &= 0x0f; in isac_interrupt()
385 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
386 cs->dc.isac.mocr |= 0xa0; in isac_interrupt()
387 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
388 schedule_event(cs, D_RX_MON1); in isac_interrupt()
391 if ((!cs->dc.isac.mon_tx) || (cs->dc.isac.mon_txc && in isac_interrupt()
392 (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc) && in isac_interrupt()
394 cs->dc.isac.mocr &= 0xf0; in isac_interrupt()
395 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
396 cs->dc.isac.mocr |= 0x0a; in isac_interrupt()
397 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
398 if (cs->dc.isac.mon_txc && in isac_interrupt()
399 (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc)) in isac_interrupt()
400 schedule_event(cs, D_TX_MON0); in isac_interrupt()
403 if (cs->dc.isac.mon_txc && (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc)) { in isac_interrupt()
404 schedule_event(cs, D_TX_MON0); in isac_interrupt()
407 cs->writeisac(cs, ISAC_MOX0, in isac_interrupt()
408 cs->dc.isac.mon_tx[cs->dc.isac.mon_txp++]); in isac_interrupt()
409 if (cs->debug & L1_DEB_MONITOR) in isac_interrupt()
410 debugl1(cs, "ISAC %02x -> MOX0", cs->dc.isac.mon_tx[cs->dc.isac.mon_txp - 1]); in isac_interrupt()
414 if ((!cs->dc.isac.mon_tx) || (cs->dc.isac.mon_txc && in isac_interrupt()
415 (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc) && in isac_interrupt()
417 cs->dc.isac.mocr &= 0x0f; in isac_interrupt()
418 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
419 cs->dc.isac.mocr |= 0xa0; in isac_interrupt()
420 cs->writeisac(cs, ISAC_MOCR, cs->dc.isac.mocr); in isac_interrupt()
421 if (cs->dc.isac.mon_txc && in isac_interrupt()
422 (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc)) in isac_interrupt()
423 schedule_event(cs, D_TX_MON1); in isac_interrupt()
426 if (cs->dc.isac.mon_txc && (cs->dc.isac.mon_txp >= cs->dc.isac.mon_txc)) { in isac_interrupt()
427 schedule_event(cs, D_TX_MON1); in isac_interrupt()
430 cs->writeisac(cs, ISAC_MOX1, in isac_interrupt()
431 cs->dc.isac.mon_tx[cs->dc.isac.mon_txp++]); in isac_interrupt()
432 if (cs->debug & L1_DEB_MONITOR) in isac_interrupt()
433 debugl1(cs, "ISAC %02x -> MOX1", cs->dc.isac.mon_tx[cs->dc.isac.mon_txp - 1]); in isac_interrupt()
444 struct IsdnCardState *cs = (struct IsdnCardState *) st->l1.hardware; in ISAC_l1hw() local
451 if (cs->debug & DEB_DLOG_HEX) in ISAC_l1hw()
452 LogFrame(cs, skb->data, skb->len); in ISAC_l1hw()
453 if (cs->debug & DEB_DLOG_VERBOSE) in ISAC_l1hw()
454 dlogframe(cs, skb, 0); in ISAC_l1hw()
455 spin_lock_irqsave(&cs->lock, flags); in ISAC_l1hw()
456 if (cs->tx_skb) { in ISAC_l1hw()
457 skb_queue_tail(&cs->sq, skb); in ISAC_l1hw()
459 if (cs->debug & L1_DEB_LAPD) in ISAC_l1hw()
460 Logl2Frame(cs, skb, "PH_DATA Queued", 0); in ISAC_l1hw()
463 cs->tx_skb = skb; in ISAC_l1hw()
464 cs->tx_cnt = 0; in ISAC_l1hw()
466 if (cs->debug & L1_DEB_LAPD) in ISAC_l1hw()
467 Logl2Frame(cs, skb, "PH_DATA", 0); in ISAC_l1hw()
469 isac_fill_fifo(cs); in ISAC_l1hw()
471 spin_unlock_irqrestore(&cs->lock, flags); in ISAC_l1hw()
474 spin_lock_irqsave(&cs->lock, flags); in ISAC_l1hw()
475 if (cs->tx_skb) { in ISAC_l1hw()
476 if (cs->debug & L1_DEB_WARN) in ISAC_l1hw()
477 debugl1(cs, " l2l1 tx_skb exist this shouldn't happen"); in ISAC_l1hw()
478 skb_queue_tail(&cs->sq, skb); in ISAC_l1hw()
480 if (cs->debug & DEB_DLOG_HEX) in ISAC_l1hw()
481 LogFrame(cs, skb->data, skb->len); in ISAC_l1hw()
482 if (cs->debug & DEB_DLOG_VERBOSE) in ISAC_l1hw()
483 dlogframe(cs, skb, 0); in ISAC_l1hw()
484 cs->tx_skb = skb; in ISAC_l1hw()
485 cs->tx_cnt = 0; in ISAC_l1hw()
487 if (cs->debug & L1_DEB_LAPD) in ISAC_l1hw()
488 Logl2Frame(cs, skb, "PH_DATA_PULLED", 0); in ISAC_l1hw()
490 isac_fill_fifo(cs); in ISAC_l1hw()
492 spin_unlock_irqrestore(&cs->lock, flags); in ISAC_l1hw()
496 if (cs->debug & L1_DEB_LAPD) in ISAC_l1hw()
497 debugl1(cs, "-> PH_REQUEST_PULL"); in ISAC_l1hw()
499 if (!cs->tx_skb) { in ISAC_l1hw()
506 spin_lock_irqsave(&cs->lock, flags); in ISAC_l1hw()
507 if ((cs->dc.isac.ph_state == ISAC_IND_EI) || in ISAC_l1hw()
508 (cs->dc.isac.ph_state == ISAC_IND_DR) || in ISAC_l1hw()
509 (cs->dc.isac.ph_state == ISAC_IND_RS)) in ISAC_l1hw()
510 ph_command(cs, ISAC_CMD_TIM); in ISAC_l1hw()
512 ph_command(cs, ISAC_CMD_RS); in ISAC_l1hw()
513 spin_unlock_irqrestore(&cs->lock, flags); in ISAC_l1hw()
516 spin_lock_irqsave(&cs->lock, flags); in ISAC_l1hw()
517 ph_command(cs, ISAC_CMD_TIM); in ISAC_l1hw()
518 spin_unlock_irqrestore(&cs->lock, flags); in ISAC_l1hw()
521 spin_lock_irqsave(&cs->lock, flags); in ISAC_l1hw()
522 ph_command(cs, ISAC_CMD_AR8); in ISAC_l1hw()
523 spin_unlock_irqrestore(&cs->lock, flags); in ISAC_l1hw()
526 spin_lock_irqsave(&cs->lock, flags); in ISAC_l1hw()
532 if (test_bit(HW_IOM1, &cs->HW_Flags)) { in ISAC_l1hw()
535 cs->writeisac(cs, ISAC_SPCR, 0xa); in ISAC_l1hw()
536 cs->writeisac(cs, ISAC_ADF1, 0x2); in ISAC_l1hw()
538 cs->writeisac(cs, ISAC_SPCR, val); in ISAC_l1hw()
539 cs->writeisac(cs, ISAC_ADF1, 0xa); in ISAC_l1hw()
543 cs->writeisac(cs, ISAC_SPCR, val); in ISAC_l1hw()
545 cs->writeisac(cs, ISAC_ADF1, 0x8); in ISAC_l1hw()
547 cs->writeisac(cs, ISAC_ADF1, 0x0); in ISAC_l1hw()
549 spin_unlock_irqrestore(&cs->lock, flags); in ISAC_l1hw()
552 skb_queue_purge(&cs->rq); in ISAC_l1hw()
553 skb_queue_purge(&cs->sq); in ISAC_l1hw()
554 if (cs->tx_skb) { in ISAC_l1hw()
555 dev_kfree_skb_any(cs->tx_skb); in ISAC_l1hw()
556 cs->tx_skb = NULL; in ISAC_l1hw()
558 if (test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) in ISAC_l1hw()
559 del_timer(&cs->dbusytimer); in ISAC_l1hw()
560 if (test_and_clear_bit(FLG_L1_DBUSY, &cs->HW_Flags)) in ISAC_l1hw()
561 schedule_event(cs, D_CLEARBUSY); in ISAC_l1hw()
564 if (cs->debug & L1_DEB_WARN) in ISAC_l1hw()
565 debugl1(cs, "isac_l1hw unknown %04x", pr); in ISAC_l1hw()
571 setstack_isac(struct PStack *st, struct IsdnCardState *cs) in setstack_isac() argument
577 DC_Close_isac(struct IsdnCardState *cs) in DC_Close_isac() argument
579 kfree(cs->dc.isac.mon_rx); in DC_Close_isac()
580 cs->dc.isac.mon_rx = NULL; in DC_Close_isac()
581 kfree(cs->dc.isac.mon_tx); in DC_Close_isac()
582 cs->dc.isac.mon_tx = NULL; in DC_Close_isac()
588 struct IsdnCardState *cs = from_timer(cs, t, dbusytimer); in dbusy_timer_handler() local
592 if (test_bit(FLG_DBUSY_TIMER, &cs->HW_Flags)) { in dbusy_timer_handler()
593 rbch = cs->readisac(cs, ISAC_RBCH); in dbusy_timer_handler()
594 star = cs->readisac(cs, ISAC_STAR); in dbusy_timer_handler()
595 if (cs->debug) in dbusy_timer_handler()
596 debugl1(cs, "D-Channel Busy RBCH %02x STAR %02x", in dbusy_timer_handler()
599 test_and_set_bit(FLG_L1_DBUSY, &cs->HW_Flags); in dbusy_timer_handler()
600 stptr = cs->stlist; in dbusy_timer_handler()
607 test_and_clear_bit(FLG_DBUSY_TIMER, &cs->HW_Flags); in dbusy_timer_handler()
608 if (cs->tx_skb) { in dbusy_timer_handler()
609 dev_kfree_skb_any(cs->tx_skb); in dbusy_timer_handler()
610 cs->tx_cnt = 0; in dbusy_timer_handler()
611 cs->tx_skb = NULL; in dbusy_timer_handler()
614 debugl1(cs, "D-Channel Busy no skb"); in dbusy_timer_handler()
616 cs->writeisac(cs, ISAC_CMDR, 0x01); /* Transmitter reset */ in dbusy_timer_handler()
617 cs->irq_func(cs->irq, cs); in dbusy_timer_handler()
622 void initisac(struct IsdnCardState *cs) in initisac() argument
624 cs->setstack_d = setstack_isac; in initisac()
625 cs->DC_Close = DC_Close_isac; in initisac()
626 cs->dc.isac.mon_tx = NULL; in initisac()
627 cs->dc.isac.mon_rx = NULL; in initisac()
628 cs->writeisac(cs, ISAC_MASK, 0xff); in initisac()
629 cs->dc.isac.mocr = 0xaa; in initisac()
630 if (test_bit(HW_IOM1, &cs->HW_Flags)) { in initisac()
632 cs->writeisac(cs, ISAC_ADF2, 0x0); in initisac()
633 cs->writeisac(cs, ISAC_SPCR, 0xa); in initisac()
634 cs->writeisac(cs, ISAC_ADF1, 0x2); in initisac()
635 cs->writeisac(cs, ISAC_STCR, 0x70); in initisac()
636 cs->writeisac(cs, ISAC_MODE, 0xc9); in initisac()
639 if (!cs->dc.isac.adf2) in initisac()
640 cs->dc.isac.adf2 = 0x80; in initisac()
641 cs->writeisac(cs, ISAC_ADF2, cs->dc.isac.adf2); in initisac()
642 cs->writeisac(cs, ISAC_SQXR, 0x2f); in initisac()
643 cs->writeisac(cs, ISAC_SPCR, 0x00); in initisac()
644 cs->writeisac(cs, ISAC_STCR, 0x70); in initisac()
645 cs->writeisac(cs, ISAC_MODE, 0xc9); in initisac()
646 cs->writeisac(cs, ISAC_TIMR, 0x00); in initisac()
647 cs->writeisac(cs, ISAC_ADF1, 0x00); in initisac()
649 ph_command(cs, ISAC_CMD_RS); in initisac()
650 cs->writeisac(cs, ISAC_MASK, 0x0); in initisac()
653 void clear_pending_isac_ints(struct IsdnCardState *cs) in clear_pending_isac_ints() argument
657 val = cs->readisac(cs, ISAC_STAR); in clear_pending_isac_ints()
658 debugl1(cs, "ISAC STAR %x", val); in clear_pending_isac_ints()
659 val = cs->readisac(cs, ISAC_MODE); in clear_pending_isac_ints()
660 debugl1(cs, "ISAC MODE %x", val); in clear_pending_isac_ints()
661 val = cs->readisac(cs, ISAC_ADF2); in clear_pending_isac_ints()
662 debugl1(cs, "ISAC ADF2 %x", val); in clear_pending_isac_ints()
663 val = cs->readisac(cs, ISAC_ISTA); in clear_pending_isac_ints()
664 debugl1(cs, "ISAC ISTA %x", val); in clear_pending_isac_ints()
666 eval = cs->readisac(cs, ISAC_EXIR); in clear_pending_isac_ints()
667 debugl1(cs, "ISAC EXIR %x", eval); in clear_pending_isac_ints()
669 val = cs->readisac(cs, ISAC_CIR0); in clear_pending_isac_ints()
670 debugl1(cs, "ISAC CIR0 %x", val); in clear_pending_isac_ints()
671 cs->dc.isac.ph_state = (val >> 2) & 0xf; in clear_pending_isac_ints()
672 schedule_event(cs, D_L1STATECHANGE); in clear_pending_isac_ints()
674 cs->writeisac(cs, ISAC_MASK, 0xFF); in clear_pending_isac_ints()
677 void setup_isac(struct IsdnCardState *cs) in setup_isac() argument
679 INIT_WORK(&cs->tqueue, isac_bh); in setup_isac()
680 timer_setup(&cs->dbusytimer, dbusy_timer_handler, 0); in setup_isac()