• Home
  • Raw
  • Download

Lines Matching refs:isac

47 ph_command(struct isac_hw *isac, u8 command)  in ph_command()  argument
49 pr_debug("%s: ph_command %x\n", isac->name, command); in ph_command()
50 if (isac->type & IPAC_TYPE_ISACX) in ph_command()
51 WriteISAC(isac, ISACX_CIX0, (command << 4) | 0xE); in ph_command()
53 WriteISAC(isac, ISAC_CIX0, (command << 2) | 3); in ph_command()
57 isac_ph_state_change(struct isac_hw *isac) in isac_ph_state_change() argument
59 switch (isac->state) { in isac_ph_state_change()
62 ph_command(isac, ISAC_CMD_DUI); in isac_ph_state_change()
64 schedule_event(&isac->dch, FLG_PHCHANGE); in isac_ph_state_change()
70 struct isac_hw *isac = container_of(dch, struct isac_hw, dch); in isac_ph_state_bh() local
72 switch (isac->state) { in isac_ph_state_bh()
112 pr_debug("%s: TE newstate %x\n", isac->name, dch->state); in isac_ph_state_bh()
116 isac_empty_fifo(struct isac_hw *isac, int count) in isac_empty_fifo() argument
120 pr_debug("%s: %s %d\n", isac->name, __func__, count); in isac_empty_fifo()
122 if (!isac->dch.rx_skb) { in isac_empty_fifo()
123 isac->dch.rx_skb = mI_alloc_skb(isac->dch.maxlen, GFP_ATOMIC); in isac_empty_fifo()
124 if (!isac->dch.rx_skb) { in isac_empty_fifo()
125 pr_info("%s: D receive out of memory\n", isac->name); in isac_empty_fifo()
126 WriteISAC(isac, ISAC_CMDR, 0x80); in isac_empty_fifo()
130 if ((isac->dch.rx_skb->len + count) >= isac->dch.maxlen) { in isac_empty_fifo()
131 pr_debug("%s: %s overrun %d\n", isac->name, __func__, in isac_empty_fifo()
132 isac->dch.rx_skb->len + count); in isac_empty_fifo()
133 WriteISAC(isac, ISAC_CMDR, 0x80); in isac_empty_fifo()
136 ptr = skb_put(isac->dch.rx_skb, count); in isac_empty_fifo()
137 isac->read_fifo(isac->dch.hw, isac->off, ptr, count); in isac_empty_fifo()
138 WriteISAC(isac, ISAC_CMDR, 0x80); in isac_empty_fifo()
139 if (isac->dch.debug & DEBUG_HW_DFIFO) { in isac_empty_fifo()
143 isac->name, count); in isac_empty_fifo()
149 isac_fill_fifo(struct isac_hw *isac) in isac_fill_fifo() argument
154 if (!isac->dch.tx_skb) in isac_fill_fifo()
156 count = isac->dch.tx_skb->len - isac->dch.tx_idx; in isac_fill_fifo()
165 pr_debug("%s: %s %d\n", isac->name, __func__, count); in isac_fill_fifo()
166 ptr = isac->dch.tx_skb->data + isac->dch.tx_idx; in isac_fill_fifo()
167 isac->dch.tx_idx += count; in isac_fill_fifo()
168 isac->write_fifo(isac->dch.hw, isac->off, ptr, count); in isac_fill_fifo()
169 WriteISAC(isac, ISAC_CMDR, more ? 0x8 : 0xa); in isac_fill_fifo()
170 if (test_and_set_bit(FLG_BUSY_TIMER, &isac->dch.Flags)) { in isac_fill_fifo()
171 pr_debug("%s: %s dbusytimer running\n", isac->name, __func__); in isac_fill_fifo()
172 del_timer(&isac->dch.timer); in isac_fill_fifo()
174 init_timer(&isac->dch.timer); in isac_fill_fifo()
175 isac->dch.timer.expires = jiffies + ((DBUSY_TIMER_VALUE * HZ)/1000); in isac_fill_fifo()
176 add_timer(&isac->dch.timer); in isac_fill_fifo()
177 if (isac->dch.debug & DEBUG_HW_DFIFO) { in isac_fill_fifo()
181 isac->name, count); in isac_fill_fifo()
187 isac_rme_irq(struct isac_hw *isac) in isac_rme_irq() argument
191 val = ReadISAC(isac, ISAC_RSTA); in isac_rme_irq()
194 pr_debug("%s: ISAC RDO\n", isac->name); in isac_rme_irq()
196 isac->dch.err_rx++; in isac_rme_irq()
200 pr_debug("%s: ISAC CRC error\n", isac->name); in isac_rme_irq()
202 isac->dch.err_crc++; in isac_rme_irq()
205 WriteISAC(isac, ISAC_CMDR, 0x80); in isac_rme_irq()
206 if (isac->dch.rx_skb) in isac_rme_irq()
207 dev_kfree_skb(isac->dch.rx_skb); in isac_rme_irq()
208 isac->dch.rx_skb = NULL; in isac_rme_irq()
210 count = ReadISAC(isac, ISAC_RBCL) & 0x1f; in isac_rme_irq()
213 isac_empty_fifo(isac, count); in isac_rme_irq()
214 recv_Dchannel(&isac->dch); in isac_rme_irq()
219 isac_xpr_irq(struct isac_hw *isac) in isac_xpr_irq() argument
221 if (test_and_clear_bit(FLG_BUSY_TIMER, &isac->dch.Flags)) in isac_xpr_irq()
222 del_timer(&isac->dch.timer); in isac_xpr_irq()
223 if (isac->dch.tx_skb && isac->dch.tx_idx < isac->dch.tx_skb->len) { in isac_xpr_irq()
224 isac_fill_fifo(isac); in isac_xpr_irq()
226 if (isac->dch.tx_skb) in isac_xpr_irq()
227 dev_kfree_skb(isac->dch.tx_skb); in isac_xpr_irq()
228 if (get_next_dframe(&isac->dch)) in isac_xpr_irq()
229 isac_fill_fifo(isac); in isac_xpr_irq()
234 isac_retransmit(struct isac_hw *isac) in isac_retransmit() argument
236 if (test_and_clear_bit(FLG_BUSY_TIMER, &isac->dch.Flags)) in isac_retransmit()
237 del_timer(&isac->dch.timer); in isac_retransmit()
238 if (test_bit(FLG_TX_BUSY, &isac->dch.Flags)) { in isac_retransmit()
240 isac->dch.tx_idx = 0; in isac_retransmit()
241 isac_fill_fifo(isac); in isac_retransmit()
242 } else if (isac->dch.tx_skb) { /* should not happen */ in isac_retransmit()
243 pr_info("%s: tx_skb exist but not busy\n", isac->name); in isac_retransmit()
244 test_and_set_bit(FLG_TX_BUSY, &isac->dch.Flags); in isac_retransmit()
245 isac->dch.tx_idx = 0; in isac_retransmit()
246 isac_fill_fifo(isac); in isac_retransmit()
248 pr_info("%s: ISAC XDU no TX_BUSY\n", isac->name); in isac_retransmit()
249 if (get_next_dframe(&isac->dch)) in isac_retransmit()
250 isac_fill_fifo(isac); in isac_retransmit()
255 isac_mos_irq(struct isac_hw *isac) in isac_mos_irq() argument
260 val = ReadISAC(isac, ISAC_MOSR); in isac_mos_irq()
261 pr_debug("%s: ISAC MOSR %02x\n", isac->name, val); in isac_mos_irq()
264 if (!isac->mon_rx) { in isac_mos_irq()
265 isac->mon_rx = kmalloc(MAX_MON_FRAME, GFP_ATOMIC); in isac_mos_irq()
266 if (!isac->mon_rx) { in isac_mos_irq()
268 isac->name); in isac_mos_irq()
269 isac->mocr &= 0xf0; in isac_mos_irq()
270 isac->mocr |= 0x0a; in isac_mos_irq()
271 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
274 isac->mon_rxp = 0; in isac_mos_irq()
276 if (isac->mon_rxp >= MAX_MON_FRAME) { in isac_mos_irq()
277 isac->mocr &= 0xf0; in isac_mos_irq()
278 isac->mocr |= 0x0a; in isac_mos_irq()
279 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
280 isac->mon_rxp = 0; in isac_mos_irq()
281 pr_debug("%s: ISAC MON RX overflow!\n", isac->name); in isac_mos_irq()
284 isac->mon_rx[isac->mon_rxp++] = ReadISAC(isac, ISAC_MOR0); in isac_mos_irq()
285 pr_debug("%s: ISAC MOR0 %02x\n", isac->name, in isac_mos_irq()
286 isac->mon_rx[isac->mon_rxp - 1]); in isac_mos_irq()
287 if (isac->mon_rxp == 1) { in isac_mos_irq()
288 isac->mocr |= 0x04; in isac_mos_irq()
289 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
294 if (!isac->mon_rx) { in isac_mos_irq()
295 isac->mon_rx = kmalloc(MAX_MON_FRAME, GFP_ATOMIC); in isac_mos_irq()
296 if (!isac->mon_rx) { in isac_mos_irq()
298 isac->name); in isac_mos_irq()
299 isac->mocr &= 0x0f; in isac_mos_irq()
300 isac->mocr |= 0xa0; in isac_mos_irq()
301 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
304 isac->mon_rxp = 0; in isac_mos_irq()
306 if (isac->mon_rxp >= MAX_MON_FRAME) { in isac_mos_irq()
307 isac->mocr &= 0x0f; in isac_mos_irq()
308 isac->mocr |= 0xa0; in isac_mos_irq()
309 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
310 isac->mon_rxp = 0; in isac_mos_irq()
311 pr_debug("%s: ISAC MON RX overflow!\n", isac->name); in isac_mos_irq()
314 isac->mon_rx[isac->mon_rxp++] = ReadISAC(isac, ISAC_MOR1); in isac_mos_irq()
315 pr_debug("%s: ISAC MOR1 %02x\n", isac->name, in isac_mos_irq()
316 isac->mon_rx[isac->mon_rxp - 1]); in isac_mos_irq()
317 isac->mocr |= 0x40; in isac_mos_irq()
318 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
322 isac->mocr &= 0xf0; in isac_mos_irq()
323 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
324 isac->mocr |= 0x0a; in isac_mos_irq()
325 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
326 if (isac->monitor) { in isac_mos_irq()
327 ret = isac->monitor(isac->dch.hw, MONITOR_RX_0, in isac_mos_irq()
328 isac->mon_rx, isac->mon_rxp); in isac_mos_irq()
330 kfree(isac->mon_rx); in isac_mos_irq()
333 isac->name, isac->mon_rxp); in isac_mos_irq()
334 kfree(isac->mon_rx); in isac_mos_irq()
336 isac->mon_rx = NULL; in isac_mos_irq()
337 isac->mon_rxp = 0; in isac_mos_irq()
340 isac->mocr &= 0x0f; in isac_mos_irq()
341 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
342 isac->mocr |= 0xa0; in isac_mos_irq()
343 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
344 if (isac->monitor) { in isac_mos_irq()
345 ret = isac->monitor(isac->dch.hw, MONITOR_RX_1, in isac_mos_irq()
346 isac->mon_rx, isac->mon_rxp); in isac_mos_irq()
348 kfree(isac->mon_rx); in isac_mos_irq()
351 isac->name, isac->mon_rxp); in isac_mos_irq()
352 kfree(isac->mon_rx); in isac_mos_irq()
354 isac->mon_rx = NULL; in isac_mos_irq()
355 isac->mon_rxp = 0; in isac_mos_irq()
358 if ((!isac->mon_tx) || (isac->mon_txc && in isac_mos_irq()
359 (isac->mon_txp >= isac->mon_txc) && !(val & 0x08))) { in isac_mos_irq()
360 isac->mocr &= 0xf0; in isac_mos_irq()
361 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
362 isac->mocr |= 0x0a; in isac_mos_irq()
363 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
364 if (isac->mon_txc && (isac->mon_txp >= isac->mon_txc)) { in isac_mos_irq()
365 if (isac->monitor) in isac_mos_irq()
366 ret = isac->monitor(isac->dch.hw, in isac_mos_irq()
369 kfree(isac->mon_tx); in isac_mos_irq()
370 isac->mon_tx = NULL; in isac_mos_irq()
371 isac->mon_txc = 0; in isac_mos_irq()
372 isac->mon_txp = 0; in isac_mos_irq()
375 if (isac->mon_txc && (isac->mon_txp >= isac->mon_txc)) { in isac_mos_irq()
376 if (isac->monitor) in isac_mos_irq()
377 ret = isac->monitor(isac->dch.hw, in isac_mos_irq()
379 kfree(isac->mon_tx); in isac_mos_irq()
380 isac->mon_tx = NULL; in isac_mos_irq()
381 isac->mon_txc = 0; in isac_mos_irq()
382 isac->mon_txp = 0; in isac_mos_irq()
385 WriteISAC(isac, ISAC_MOX0, isac->mon_tx[isac->mon_txp++]); in isac_mos_irq()
386 pr_debug("%s: ISAC %02x -> MOX0\n", isac->name, in isac_mos_irq()
387 isac->mon_tx[isac->mon_txp - 1]); in isac_mos_irq()
391 if ((!isac->mon_tx) || (isac->mon_txc && in isac_mos_irq()
392 (isac->mon_txp >= isac->mon_txc) && !(val & 0x80))) { in isac_mos_irq()
393 isac->mocr &= 0x0f; in isac_mos_irq()
394 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
395 isac->mocr |= 0xa0; in isac_mos_irq()
396 WriteISAC(isac, ISAC_MOCR, isac->mocr); in isac_mos_irq()
397 if (isac->mon_txc && (isac->mon_txp >= isac->mon_txc)) { in isac_mos_irq()
398 if (isac->monitor) in isac_mos_irq()
399 ret = isac->monitor(isac->dch.hw, in isac_mos_irq()
402 kfree(isac->mon_tx); in isac_mos_irq()
403 isac->mon_tx = NULL; in isac_mos_irq()
404 isac->mon_txc = 0; in isac_mos_irq()
405 isac->mon_txp = 0; in isac_mos_irq()
408 if (isac->mon_txc && (isac->mon_txp >= isac->mon_txc)) { in isac_mos_irq()
409 if (isac->monitor) in isac_mos_irq()
410 ret = isac->monitor(isac->dch.hw, in isac_mos_irq()
412 kfree(isac->mon_tx); in isac_mos_irq()
413 isac->mon_tx = NULL; in isac_mos_irq()
414 isac->mon_txc = 0; in isac_mos_irq()
415 isac->mon_txp = 0; in isac_mos_irq()
418 WriteISAC(isac, ISAC_MOX1, isac->mon_tx[isac->mon_txp++]); in isac_mos_irq()
419 pr_debug("%s: ISAC %02x -> MOX1\n", isac->name, in isac_mos_irq()
420 isac->mon_tx[isac->mon_txp - 1]); in isac_mos_irq()
428 isac_cisq_irq(struct isac_hw *isac) { in isac_cisq_irq() argument
431 val = ReadISAC(isac, ISAC_CIR0); in isac_cisq_irq()
432 pr_debug("%s: ISAC CIR0 %02X\n", isac->name, val); in isac_cisq_irq()
434 pr_debug("%s: ph_state change %x->%x\n", isac->name, in isac_cisq_irq()
435 isac->state, (val >> 2) & 0xf); in isac_cisq_irq()
436 isac->state = (val >> 2) & 0xf; in isac_cisq_irq()
437 isac_ph_state_change(isac); in isac_cisq_irq()
440 val = ReadISAC(isac, ISAC_CIR1); in isac_cisq_irq()
441 pr_debug("%s: ISAC CIR1 %02X\n", isac->name, val); in isac_cisq_irq()
446 isacsx_cic_irq(struct isac_hw *isac) in isacsx_cic_irq() argument
450 val = ReadISAC(isac, ISACX_CIR0); in isacsx_cic_irq()
451 pr_debug("%s: ISACX CIR0 %02X\n", isac->name, val); in isacsx_cic_irq()
453 pr_debug("%s: ph_state change %x->%x\n", isac->name, in isacsx_cic_irq()
454 isac->state, val >> 4); in isacsx_cic_irq()
455 isac->state = val >> 4; in isacsx_cic_irq()
456 isac_ph_state_change(isac); in isacsx_cic_irq()
461 isacsx_rme_irq(struct isac_hw *isac) in isacsx_rme_irq() argument
466 val = ReadISAC(isac, ISACX_RSTAD); in isacsx_rme_irq()
472 pr_debug("%s: RSTAD %#x, dropped\n", isac->name, val); in isacsx_rme_irq()
475 isac->dch.err_rx++; in isacsx_rme_irq()
477 isac->dch.err_crc++; in isacsx_rme_irq()
479 WriteISAC(isac, ISACX_CMDRD, ISACX_CMDRD_RMC); in isacsx_rme_irq()
480 if (isac->dch.rx_skb) in isacsx_rme_irq()
481 dev_kfree_skb(isac->dch.rx_skb); in isacsx_rme_irq()
482 isac->dch.rx_skb = NULL; in isacsx_rme_irq()
484 count = ReadISAC(isac, ISACX_RBCLD) & 0x1f; in isacsx_rme_irq()
487 isac_empty_fifo(isac, count); in isacsx_rme_irq()
488 if (isac->dch.rx_skb) { in isacsx_rme_irq()
489 skb_trim(isac->dch.rx_skb, isac->dch.rx_skb->len - 1); in isacsx_rme_irq()
490 pr_debug("%s: dchannel received %d\n", isac->name, in isacsx_rme_irq()
491 isac->dch.rx_skb->len); in isacsx_rme_irq()
492 recv_Dchannel(&isac->dch); in isacsx_rme_irq()
498 mISDNisac_irq(struct isac_hw *isac, u8 val) in mISDNisac_irq() argument
502 pr_debug("%s: ISAC interrupt %02x\n", isac->name, val); in mISDNisac_irq()
503 if (isac->type & IPAC_TYPE_ISACX) { in mISDNisac_irq()
505 isacsx_cic_irq(isac); in mISDNisac_irq()
507 val = ReadISAC(isac, ISACX_ISTAD); in mISDNisac_irq()
508 pr_debug("%s: ISTAD %02x\n", isac->name, val); in mISDNisac_irq()
510 pr_debug("%s: ISAC XDU\n", isac->name); in mISDNisac_irq()
512 isac->dch.err_tx++; in mISDNisac_irq()
514 isac_retransmit(isac); in mISDNisac_irq()
517 pr_debug("%s: ISAC XMR\n", isac->name); in mISDNisac_irq()
519 isac->dch.err_tx++; in mISDNisac_irq()
521 isac_retransmit(isac); in mISDNisac_irq()
524 isac_xpr_irq(isac); in mISDNisac_irq()
526 pr_debug("%s: ISAC RFO\n", isac->name); in mISDNisac_irq()
527 WriteISAC(isac, ISACX_CMDRD, ISACX_CMDRD_RMC); in mISDNisac_irq()
530 isacsx_rme_irq(isac); in mISDNisac_irq()
532 isac_empty_fifo(isac, 0x20); in mISDNisac_irq()
536 isac_rme_irq(isac); in mISDNisac_irq()
538 isac_empty_fifo(isac, 32); in mISDNisac_irq()
540 isac_xpr_irq(isac); in mISDNisac_irq()
542 isac_cisq_irq(isac); in mISDNisac_irq()
544 pr_debug("%s: ISAC RSC interrupt\n", isac->name); in mISDNisac_irq()
546 pr_debug("%s: ISAC SIN interrupt\n", isac->name); in mISDNisac_irq()
548 val = ReadISAC(isac, ISAC_EXIR); in mISDNisac_irq()
549 pr_debug("%s: ISAC EXIR %02x\n", isac->name, val); in mISDNisac_irq()
551 pr_debug("%s: ISAC XMR\n", isac->name); in mISDNisac_irq()
553 pr_debug("%s: ISAC XDU\n", isac->name); in mISDNisac_irq()
555 isac->dch.err_tx++; in mISDNisac_irq()
557 isac_retransmit(isac); in mISDNisac_irq()
560 isac_mos_irq(isac); in mISDNisac_irq()
572 struct isac_hw *isac = container_of(dch, struct isac_hw, dch); in isac_l1hw() local
580 spin_lock_irqsave(isac->hwlock, flags); in isac_l1hw()
584 isac_fill_fifo(isac); in isac_l1hw()
586 spin_unlock_irqrestore(isac->hwlock, flags); in isac_l1hw()
589 spin_unlock_irqrestore(isac->hwlock, flags); in isac_l1hw()
606 isac_ctrl(struct isac_hw *isac, u32 cmd, unsigned long para) in isac_ctrl() argument
614 spin_lock_irqsave(isac->hwlock, flags); in isac_ctrl()
615 if (!(isac->type & IPAC_TYPE_ISACX)) { in isac_ctrl()
622 WriteISAC(isac, ISAC_SPCR, tl); in isac_ctrl()
624 WriteISAC(isac, ISAC_ADF1, 0x8); in isac_ctrl()
626 WriteISAC(isac, ISAC_ADF1, 0x0); in isac_ctrl()
628 spin_unlock_irqrestore(isac->hwlock, flags); in isac_ctrl()
631 ret = l1_event(isac->dch.l1, HW_TIMER3_VALUE | (para & 0xff)); in isac_ctrl()
634 pr_debug("%s: %s unknown command %x %lx\n", isac->name, in isac_ctrl()
644 struct isac_hw *isac = container_of(dch, struct isac_hw, dch); in isac_l1cmd() local
647 pr_debug("%s: cmd(%x) state(%02x)\n", isac->name, cmd, isac->state); in isac_l1cmd()
650 spin_lock_irqsave(isac->hwlock, flags); in isac_l1cmd()
651 ph_command(isac, ISAC_CMD_AR8); in isac_l1cmd()
652 spin_unlock_irqrestore(isac->hwlock, flags); in isac_l1cmd()
655 spin_lock_irqsave(isac->hwlock, flags); in isac_l1cmd()
656 ph_command(isac, ISAC_CMD_AR10); in isac_l1cmd()
657 spin_unlock_irqrestore(isac->hwlock, flags); in isac_l1cmd()
660 spin_lock_irqsave(isac->hwlock, flags); in isac_l1cmd()
661 if ((isac->state == ISAC_IND_EI) || in isac_l1cmd()
662 (isac->state == ISAC_IND_DR) || in isac_l1cmd()
663 (isac->state == ISAC_IND_RS)) in isac_l1cmd()
664 ph_command(isac, ISAC_CMD_TIM); in isac_l1cmd()
666 ph_command(isac, ISAC_CMD_RS); in isac_l1cmd()
667 spin_unlock_irqrestore(isac->hwlock, flags); in isac_l1cmd()
685 spin_lock_irqsave(isac->hwlock, flags); in isac_l1cmd()
686 ph_command(isac, ISAC_CMD_TIM); in isac_l1cmd()
687 spin_unlock_irqrestore(isac->hwlock, flags); in isac_l1cmd()
700 pr_debug("%s: %s unknown command %x\n", isac->name, in isac_l1cmd()
708 isac_release(struct isac_hw *isac) in isac_release() argument
710 if (isac->type & IPAC_TYPE_ISACX) in isac_release()
711 WriteISAC(isac, ISACX_MASK, 0xff); in isac_release()
713 WriteISAC(isac, ISAC_MASK, 0xff); in isac_release()
714 if (isac->dch.timer.function != NULL) { in isac_release()
715 del_timer(&isac->dch.timer); in isac_release()
716 isac->dch.timer.function = NULL; in isac_release()
718 kfree(isac->mon_rx); in isac_release()
719 isac->mon_rx = NULL; in isac_release()
720 kfree(isac->mon_tx); in isac_release()
721 isac->mon_tx = NULL; in isac_release()
722 if (isac->dch.l1) in isac_release()
723 l1_event(isac->dch.l1, CLOSE_CHANNEL); in isac_release()
724 mISDN_freedchannel(&isac->dch); in isac_release()
728 dbusy_timer_handler(struct isac_hw *isac) in dbusy_timer_handler() argument
733 if (test_bit(FLG_BUSY_TIMER, &isac->dch.Flags)) { in dbusy_timer_handler()
734 spin_lock_irqsave(isac->hwlock, flags); in dbusy_timer_handler()
735 rbch = ReadISAC(isac, ISAC_RBCH); in dbusy_timer_handler()
736 star = ReadISAC(isac, ISAC_STAR); in dbusy_timer_handler()
738 isac->name, rbch, star); in dbusy_timer_handler()
740 test_and_set_bit(FLG_L1_BUSY, &isac->dch.Flags); in dbusy_timer_handler()
743 test_and_clear_bit(FLG_BUSY_TIMER, &isac->dch.Flags); in dbusy_timer_handler()
744 if (isac->dch.tx_idx) in dbusy_timer_handler()
745 isac->dch.tx_idx = 0; in dbusy_timer_handler()
748 isac->name); in dbusy_timer_handler()
750 WriteISAC(isac, ISAC_CMDR, 0x01); in dbusy_timer_handler()
752 spin_unlock_irqrestore(isac->hwlock, flags); in dbusy_timer_handler()
757 open_dchannel_caller(struct isac_hw *isac, struct channel_req *rq, void *caller) in open_dchannel_caller() argument
759 pr_debug("%s: %s dev(%d) open from %p\n", isac->name, __func__, in open_dchannel_caller()
760 isac->dch.dev.id, caller); in open_dchannel_caller()
766 rq->ch = &isac->dch.dev.D; in open_dchannel_caller()
768 if (isac->dch.state == 7) in open_dchannel_caller()
775 open_dchannel(struct isac_hw *isac, struct channel_req *rq) in open_dchannel() argument
777 return open_dchannel_caller(isac, rq, __builtin_return_address(0)); in open_dchannel()
785 isac_init(struct isac_hw *isac) in isac_init() argument
790 if (!isac->dch.l1) { in isac_init()
791 err = create_l1(&isac->dch, isac_l1cmd); in isac_init()
795 isac->mon_tx = NULL; in isac_init()
796 isac->mon_rx = NULL; in isac_init()
797 isac->dch.timer.function = (void *) dbusy_timer_handler; in isac_init()
798 isac->dch.timer.data = (long)isac; in isac_init()
799 init_timer(&isac->dch.timer); in isac_init()
800 isac->mocr = 0xaa; in isac_init()
801 if (isac->type & IPAC_TYPE_ISACX) { in isac_init()
803 WriteISAC(isac, ISACX_MASK, 0xff); in isac_init()
804 val = ReadISAC(isac, ISACX_STARD); in isac_init()
805 pr_debug("%s: ISACX STARD %x\n", isac->name, val); in isac_init()
806 val = ReadISAC(isac, ISACX_ISTAD); in isac_init()
807 pr_debug("%s: ISACX ISTAD %x\n", isac->name, val); in isac_init()
808 val = ReadISAC(isac, ISACX_ISTA); in isac_init()
809 pr_debug("%s: ISACX ISTA %x\n", isac->name, val); in isac_init()
811 WriteISAC(isac, ISACX_TR_CONF0, 0x00); in isac_init()
813 WriteISAC(isac, ISACX_TR_CONF2, 0x00); in isac_init()
815 WriteISAC(isac, ISACX_MODED, 0xc9); in isac_init()
817 val = ReadISAC(isac, ISACX_ID); in isac_init()
818 if (isac->dch.debug & DEBUG_HW) in isac_init()
820 isac->name, val & 0x3f); in isac_init()
821 val = ReadISAC(isac, ISACX_CIR0); in isac_init()
822 pr_debug("%s: ISACX CIR0 %02X\n", isac->name, val); in isac_init()
823 isac->state = val >> 4; in isac_init()
824 isac_ph_state_change(isac); in isac_init()
825 ph_command(isac, ISAC_CMD_RS); in isac_init()
826 WriteISAC(isac, ISACX_MASK, IPACX__ON); in isac_init()
827 WriteISAC(isac, ISACX_MASKD, 0x00); in isac_init()
829 WriteISAC(isac, ISAC_MASK, 0xff); in isac_init()
830 val = ReadISAC(isac, ISAC_STAR); in isac_init()
831 pr_debug("%s: ISAC STAR %x\n", isac->name, val); in isac_init()
832 val = ReadISAC(isac, ISAC_MODE); in isac_init()
833 pr_debug("%s: ISAC MODE %x\n", isac->name, val); in isac_init()
834 val = ReadISAC(isac, ISAC_ADF2); in isac_init()
835 pr_debug("%s: ISAC ADF2 %x\n", isac->name, val); in isac_init()
836 val = ReadISAC(isac, ISAC_ISTA); in isac_init()
837 pr_debug("%s: ISAC ISTA %x\n", isac->name, val); in isac_init()
839 val = ReadISAC(isac, ISAC_EXIR); in isac_init()
840 pr_debug("%s: ISAC EXIR %x\n", isac->name, val); in isac_init()
842 val = ReadISAC(isac, ISAC_RBCH); in isac_init()
843 if (isac->dch.debug & DEBUG_HW) in isac_init()
844 pr_notice("%s: ISAC version (%x): %s\n", isac->name, in isac_init()
846 isac->type |= ((val >> 5) & 3); in isac_init()
847 if (!isac->adf2) in isac_init()
848 isac->adf2 = 0x80; in isac_init()
849 if (!(isac->adf2 & 0x80)) { /* only IOM 2 Mode */ in isac_init()
851 isac->name, isac->adf2); in isac_init()
852 isac_release(isac); in isac_init()
855 WriteISAC(isac, ISAC_ADF2, isac->adf2); in isac_init()
856 WriteISAC(isac, ISAC_SQXR, 0x2f); in isac_init()
857 WriteISAC(isac, ISAC_SPCR, 0x00); in isac_init()
858 WriteISAC(isac, ISAC_STCR, 0x70); in isac_init()
859 WriteISAC(isac, ISAC_MODE, 0xc9); in isac_init()
860 WriteISAC(isac, ISAC_TIMR, 0x00); in isac_init()
861 WriteISAC(isac, ISAC_ADF1, 0x00); in isac_init()
862 val = ReadISAC(isac, ISAC_CIR0); in isac_init()
863 pr_debug("%s: ISAC CIR0 %x\n", isac->name, val); in isac_init()
864 isac->state = (val >> 2) & 0xf; in isac_init()
865 isac_ph_state_change(isac); in isac_init()
866 ph_command(isac, ISAC_CMD_RS); in isac_init()
867 WriteISAC(isac, ISAC_MASK, 0); in isac_init()
873 mISDNisac_init(struct isac_hw *isac, void *hw) in mISDNisac_init() argument
875 mISDN_initdchannel(&isac->dch, MAX_DFRAME_LEN_L1, isac_ph_state_bh); in mISDNisac_init()
876 isac->dch.hw = hw; in mISDNisac_init()
877 isac->dch.dev.D.send = isac_l1hw; in mISDNisac_init()
878 isac->init = isac_init; in mISDNisac_init()
879 isac->release = isac_release; in mISDNisac_init()
880 isac->ctrl = isac_ctrl; in mISDNisac_init()
881 isac->open = open_dchannel; in mISDNisac_init()
882 isac->dch.dev.Dprotocols = (1 << ISDN_P_TE_S0); in mISDNisac_init()
883 isac->dch.dev.nrbchan = 2; in mISDNisac_init()
1169 struct isac_hw *isac = &ipac->isac; in mISDNipac_irq() local
1180 mISDNisac_irq(&ipac->isac, ista); in mISDNipac_irq()
1188 istad = ReadISAC(isac, ISAC_ISTA); in mISDNipac_irq()
1194 mISDNisac_irq(isac, istad); in mISDNipac_irq()
1208 istad = ReadISAC(isac, ISAC_ISTA); in mISDNipac_irq()
1211 mISDNisac_irq(isac, istad); in mISDNipac_irq()
1438 isac_release(&ipac->isac); in free_ipac()
1493 return isac_init(&ipac->isac); in ipac_init()
1532 ret = ipac->isac.ctrl(&ipac->isac, HW_TIMER3_VALUE, cq->p1); in channel_ctrl()
1547 struct isac_hw *isac = container_of(dch, struct isac_hw, dch); in ipac_dctrl() local
1548 struct ipac_hw *ipac = container_of(isac, struct ipac_hw, isac); in ipac_dctrl()
1557 err = open_dchannel_caller(isac, rq, __builtin_return_address(0)); in ipac_dctrl()
1587 if (ipac->isac.dch.debug & DEBUG_HW) in mISDNipac_init()
1590 ipac->isac.type = IPAC_TYPE_ISAC; in mISDNipac_init()
1596 ipac->isac.type = IPAC_TYPE_IPAC | IPAC_TYPE_ISAC; in mISDNipac_init()
1602 ipac->isac.type = IPAC_TYPE_IPACX | IPAC_TYPE_ISACX; in mISDNipac_init()
1610 mISDNisac_init(&ipac->isac, hw); in mISDNipac_init()
1612 ipac->isac.dch.dev.D.ctrl = ipac_dctrl; in mISDNipac_init()
1616 set_channelmap(i + 1, ipac->isac.dch.dev.channelmap); in mISDNipac_init()
1618 &ipac->isac.dch.dev.bchannels); in mISDNipac_init()