Lines Matching defs:isac
3 * isac.c ISAC specific routines
34 ph_command(struct isac_hw *isac, u8 command)
36 pr_debug("%s: ph_command %x\n", isac->name, command);
37 if (isac->type & IPAC_TYPE_ISACX)
38 WriteISAC(isac, ISACX_CIX0, (command << 4) | 0xE);
40 WriteISAC(isac, ISAC_CIX0, (command << 2) | 3);
44 isac_ph_state_change(struct isac_hw *isac)
46 switch (isac->state) {
49 ph_command(isac, ISAC_CMD_DUI);
51 schedule_event(&isac->dch, FLG_PHCHANGE);
57 struct isac_hw *isac = container_of(dch, struct isac_hw, dch);
59 switch (isac->state) {
100 pr_debug("%s: TE newstate %x\n", isac->name, dch->state);
104 isac_empty_fifo(struct isac_hw *isac, int count)
108 pr_debug("%s: %s %d\n", isac->name, __func__, count);
110 if (!isac->dch.rx_skb) {
111 isac->dch.rx_skb = mI_alloc_skb(isac->dch.maxlen, GFP_ATOMIC);
112 if (!isac->dch.rx_skb) {
113 pr_info("%s: D receive out of memory\n", isac->name);
114 WriteISAC(isac, ISAC_CMDR, 0x80);
118 if ((isac->dch.rx_skb->len + count) >= isac->dch.maxlen) {
119 pr_debug("%s: %s overrun %d\n", isac->name, __func__,
120 isac->dch.rx_skb->len + count);
121 WriteISAC(isac, ISAC_CMDR, 0x80);
124 ptr = skb_put(isac->dch.rx_skb, count);
125 isac->read_fifo(isac->dch.hw, isac->off, ptr, count);
126 WriteISAC(isac, ISAC_CMDR, 0x80);
127 if (isac->dch.debug & DEBUG_HW_DFIFO) {
131 isac->name, count);
137 isac_fill_fifo(struct isac_hw *isac)
142 if (!isac->dch.tx_skb)
144 count = isac->dch.tx_skb->len - isac->dch.tx_idx;
153 pr_debug("%s: %s %d\n", isac->name, __func__, count);
154 ptr = isac->dch.tx_skb->data + isac->dch.tx_idx;
155 isac->dch.tx_idx += count;
156 isac->write_fifo(isac->dch.hw, isac->off, ptr, count);
157 WriteISAC(isac, ISAC_CMDR, more ? 0x8 : 0xa);
158 if (test_and_set_bit(FLG_BUSY_TIMER, &isac->dch.Flags)) {
159 pr_debug("%s: %s dbusytimer running\n", isac->name, __func__);
160 del_timer(&isac->dch.timer);
162 isac->dch.timer.expires = jiffies + ((DBUSY_TIMER_VALUE * HZ)/1000);
163 add_timer(&isac->dch.timer);
164 if (isac->dch.debug & DEBUG_HW_DFIFO) {
168 isac->name, count);
174 isac_rme_irq(struct isac_hw *isac)
178 val = ReadISAC(isac, ISAC_RSTA);
181 pr_debug("%s: ISAC RDO\n", isac->name);
183 isac->dch.err_rx++;
187 pr_debug("%s: ISAC CRC error\n", isac->name);
189 isac->dch.err_crc++;
192 WriteISAC(isac, ISAC_CMDR, 0x80);
193 dev_kfree_skb(isac->dch.rx_skb);
194 isac->dch.rx_skb = NULL;
196 count = ReadISAC(isac, ISAC_RBCL) & 0x1f;
199 isac_empty_fifo(isac, count);
200 recv_Dchannel(&isac->dch);
205 isac_xpr_irq(struct isac_hw *isac)
207 if (test_and_clear_bit(FLG_BUSY_TIMER, &isac->dch.Flags))
208 del_timer(&isac->dch.timer);
209 if (isac->dch.tx_skb && isac->dch.tx_idx < isac->dch.tx_skb->len) {
210 isac_fill_fifo(isac);
212 dev_kfree_skb(isac->dch.tx_skb);
213 if (get_next_dframe(&isac->dch))
214 isac_fill_fifo(isac);
219 isac_retransmit(struct isac_hw *isac)
221 if (test_and_clear_bit(FLG_BUSY_TIMER, &isac->dch.Flags))
222 del_timer(&isac->dch.timer);
223 if (test_bit(FLG_TX_BUSY, &isac->dch.Flags)) {
225 isac->dch.tx_idx = 0;
226 isac_fill_fifo(isac);
227 } else if (isac->dch.tx_skb) { /* should not happen */
228 pr_info("%s: tx_skb exist but not busy\n", isac->name);
229 test_and_set_bit(FLG_TX_BUSY, &isac->dch.Flags);
230 isac->dch.tx_idx = 0;
231 isac_fill_fifo(isac);
233 pr_info("%s: ISAC XDU no TX_BUSY\n", isac->name);
234 if (get_next_dframe(&isac->dch))
235 isac_fill_fifo(isac);
240 isac_mos_irq(struct isac_hw *isac)
245 val = ReadISAC(isac, ISAC_MOSR);
246 pr_debug("%s: ISAC MOSR %02x\n", isac->name, val);
249 if (!isac->mon_rx) {
250 isac->mon_rx = kmalloc(MAX_MON_FRAME, GFP_ATOMIC);
251 if (!isac->mon_rx) {
253 isac->name);
254 isac->mocr &= 0xf0;
255 isac->mocr |= 0x0a;
256 WriteISAC(isac, ISAC_MOCR, isac->mocr);
259 isac->mon_rxp = 0;
261 if (isac->mon_rxp >= MAX_MON_FRAME) {
262 isac->mocr &= 0xf0;
263 isac->mocr |= 0x0a;
264 WriteISAC(isac, ISAC_MOCR, isac->mocr);
265 isac->mon_rxp = 0;
266 pr_debug("%s: ISAC MON RX overflow!\n", isac->name);
269 isac->mon_rx[isac->mon_rxp++] = ReadISAC(isac, ISAC_MOR0);
270 pr_debug("%s: ISAC MOR0 %02x\n", isac->name,
271 isac->mon_rx[isac->mon_rxp - 1]);
272 if (isac->mon_rxp == 1) {
273 isac->mocr |= 0x04;
274 WriteISAC(isac, ISAC_MOCR, isac->mocr);
279 if (!isac->mon_rx) {
280 isac->mon_rx = kmalloc(MAX_MON_FRAME, GFP_ATOMIC);
281 if (!isac->mon_rx) {
283 isac->name);
284 isac->mocr &= 0x0f;
285 isac->mocr |= 0xa0;
286 WriteISAC(isac, ISAC_MOCR, isac->mocr);
289 isac->mon_rxp = 0;
291 if (isac->mon_rxp >= MAX_MON_FRAME) {
292 isac->mocr &= 0x0f;
293 isac->mocr |= 0xa0;
294 WriteISAC(isac, ISAC_MOCR, isac->mocr);
295 isac->mon_rxp = 0;
296 pr_debug("%s: ISAC MON RX overflow!\n", isac->name);
299 isac->mon_rx[isac->mon_rxp++] = ReadISAC(isac, ISAC_MOR1);
300 pr_debug("%s: ISAC MOR1 %02x\n", isac->name,
301 isac->mon_rx[isac->mon_rxp - 1]);
302 isac->mocr |= 0x40;
303 WriteISAC(isac, ISAC_MOCR, isac->mocr);
307 isac->mocr &= 0xf0;
308 WriteISAC(isac, ISAC_MOCR, isac->mocr);
309 isac->mocr |= 0x0a;
310 WriteISAC(isac, ISAC_MOCR, isac->mocr);
311 if (isac->monitor) {
312 ret = isac->monitor(isac->dch.hw, MONITOR_RX_0,
313 isac->mon_rx, isac->mon_rxp);
315 kfree(isac->mon_rx);
318 isac->name, isac->mon_rxp);
319 kfree(isac->mon_rx);
321 isac->mon_rx = NULL;
322 isac->mon_rxp = 0;
325 isac->mocr &= 0x0f;
326 WriteISAC(isac, ISAC_MOCR, isac->mocr);
327 isac->mocr |= 0xa0;
328 WriteISAC(isac, ISAC_MOCR, isac->mocr);
329 if (isac->monitor) {
330 ret = isac->monitor(isac->dch.hw, MONITOR_RX_1,
331 isac->mon_rx, isac->mon_rxp);
333 kfree(isac->mon_rx);
336 isac->name, isac->mon_rxp);
337 kfree(isac->mon_rx);
339 isac->mon_rx = NULL;
340 isac->mon_rxp = 0;
343 if ((!isac->mon_tx) || (isac->mon_txc &&
344 (isac->mon_txp >= isac->mon_txc) && !(val & 0x08))) {
345 isac->mocr &= 0xf0;
346 WriteISAC(isac, ISAC_MOCR, isac->mocr);
347 isac->mocr |= 0x0a;
348 WriteISAC(isac, ISAC_MOCR, isac->mocr);
349 if (isac->mon_txc && (isac->mon_txp >= isac->mon_txc)) {
350 if (isac->monitor)
351 isac->monitor(isac->dch.hw,
354 kfree(isac->mon_tx);
355 isac->mon_tx = NULL;
356 isac->mon_txc = 0;
357 isac->mon_txp = 0;
360 if (isac->mon_txc && (isac->mon_txp >= isac->mon_txc)) {
361 if (isac->monitor)
362 isac->monitor(isac->dch.hw,
364 kfree(isac->mon_tx);
365 isac->mon_tx = NULL;
366 isac->mon_txc = 0;
367 isac->mon_txp = 0;
370 WriteISAC(isac, ISAC_MOX0, isac->mon_tx[isac->mon_txp++]);
371 pr_debug("%s: ISAC %02x -> MOX0\n", isac->name,
372 isac->mon_tx[isac->mon_txp - 1]);
376 if ((!isac->mon_tx) || (isac->mon_txc &&
377 (isac->mon_txp >= isac->mon_txc) && !(val & 0x80))) {
378 isac->mocr &= 0x0f;
379 WriteISAC(isac, ISAC_MOCR, isac->mocr);
380 isac->mocr |= 0xa0;
381 WriteISAC(isac, ISAC_MOCR, isac->mocr);
382 if (isac->mon_txc && (isac->mon_txp >= isac->mon_txc)) {
383 if (isac->monitor)
384 isac->monitor(isac->dch.hw,
387 kfree(isac->mon_tx);
388 isac->mon_tx = NULL;
389 isac->mon_txc = 0;
390 isac->mon_txp = 0;
393 if (isac->mon_txc && (isac->mon_txp >= isac->mon_txc)) {
394 if (isac->monitor)
395 isac->monitor(isac->dch.hw,
397 kfree(isac->mon_tx);
398 isac->mon_tx = NULL;
399 isac->mon_txc = 0;
400 isac->mon_txp = 0;
403 WriteISAC(isac, ISAC_MOX1, isac->mon_tx[isac->mon_txp++]);
404 pr_debug("%s: ISAC %02x -> MOX1\n", isac->name,
405 isac->mon_tx[isac->mon_txp - 1]);
413 isac_cisq_irq(struct isac_hw *isac) {
416 val = ReadISAC(isac, ISAC_CIR0);
417 pr_debug("%s: ISAC CIR0 %02X\n", isac->name, val);
419 pr_debug("%s: ph_state change %x->%x\n", isac->name,
420 isac->state, (val >> 2) & 0xf);
421 isac->state = (val >> 2) & 0xf;
422 isac_ph_state_change(isac);
425 val = ReadISAC(isac, ISAC_CIR1);
426 pr_debug("%s: ISAC CIR1 %02X\n", isac->name, val);
431 isacsx_cic_irq(struct isac_hw *isac)
435 val = ReadISAC(isac, ISACX_CIR0);
436 pr_debug("%s: ISACX CIR0 %02X\n", isac->name, val);
438 pr_debug("%s: ph_state change %x->%x\n", isac->name,
439 isac->state, val >> 4);
440 isac->state = val >> 4;
441 isac_ph_state_change(isac);
446 isacsx_rme_irq(struct isac_hw *isac)
451 val = ReadISAC(isac, ISACX_RSTAD);
457 pr_debug("%s: RSTAD %#x, dropped\n", isac->name, val);
460 isac->dch.err_rx++;
462 isac->dch.err_crc++;
464 WriteISAC(isac, ISACX_CMDRD, ISACX_CMDRD_RMC);
465 dev_kfree_skb(isac->dch.rx_skb);
466 isac->dch.rx_skb = NULL;
468 count = ReadISAC(isac, ISACX_RBCLD) & 0x1f;
471 isac_empty_fifo(isac, count);
472 if (isac->dch.rx_skb) {
473 skb_trim(isac->dch.rx_skb, isac->dch.rx_skb->len - 1);
474 pr_debug("%s: dchannel received %d\n", isac->name,
475 isac->dch.rx_skb->len);
476 recv_Dchannel(&isac->dch);
482 mISDNisac_irq(struct isac_hw *isac, u8 val)
486 pr_debug("%s: ISAC interrupt %02x\n", isac->name, val);
487 if (isac->type & IPAC_TYPE_ISACX) {
489 isacsx_cic_irq(isac);
491 val = ReadISAC(isac, ISACX_ISTAD);
492 pr_debug("%s: ISTAD %02x\n", isac->name, val);
494 pr_debug("%s: ISAC XDU\n", isac->name);
496 isac->dch.err_tx++;
498 isac_retransmit(isac);
501 pr_debug("%s: ISAC XMR\n", isac->name);
503 isac->dch.err_tx++;
505 isac_retransmit(isac);
508 isac_xpr_irq(isac);
510 pr_debug("%s: ISAC RFO\n", isac->name);
511 WriteISAC(isac, ISACX_CMDRD, ISACX_CMDRD_RMC);
514 isacsx_rme_irq(isac);
516 isac_empty_fifo(isac, 0x20);
520 isac_rme_irq(isac);
522 isac_empty_fifo(isac, 32);
524 isac_xpr_irq(isac);
526 isac_cisq_irq(isac);
528 pr_debug("%s: ISAC RSC interrupt\n", isac->name);
530 pr_debug("%s: ISAC SIN interrupt\n", isac->name);
532 val = ReadISAC(isac, ISAC_EXIR);
533 pr_debug("%s: ISAC EXIR %02x\n", isac->name, val);
535 pr_debug("%s: ISAC XMR\n", isac->name);
537 pr_debug("%s: ISAC XDU\n", isac->name);
539 isac->dch.err_tx++;
541 isac_retransmit(isac);
544 isac_mos_irq(isac);
556 struct isac_hw *isac = container_of(dch, struct isac_hw, dch);
564 spin_lock_irqsave(isac->hwlock, flags);
568 isac_fill_fifo(isac);
570 spin_unlock_irqrestore(isac->hwlock, flags);
573 spin_unlock_irqrestore(isac->hwlock, flags);
590 isac_ctrl(struct isac_hw *isac, u32 cmd, unsigned long para)
598 spin_lock_irqsave(isac->hwlock, flags);
599 if (!(isac->type & IPAC_TYPE_ISACX)) {
606 WriteISAC(isac, ISAC_SPCR, tl);
608 WriteISAC(isac, ISAC_ADF1, 0x8);
610 WriteISAC(isac, ISAC_ADF1, 0x0);
612 spin_unlock_irqrestore(isac->hwlock, flags);
615 ret = l1_event(isac->dch.l1, HW_TIMER3_VALUE | (para & 0xff));
618 pr_debug("%s: %s unknown command %x %lx\n", isac->name,
628 struct isac_hw *isac = container_of(dch, struct isac_hw, dch);
631 pr_debug("%s: cmd(%x) state(%02x)\n", isac->name, cmd, isac->state);
634 spin_lock_irqsave(isac->hwlock, flags);
635 ph_command(isac, ISAC_CMD_AR8);
636 spin_unlock_irqrestore(isac->hwlock, flags);
639 spin_lock_irqsave(isac->hwlock, flags);
640 ph_command(isac, ISAC_CMD_AR10);
641 spin_unlock_irqrestore(isac->hwlock, flags);
644 spin_lock_irqsave(isac->hwlock, flags);
645 if ((isac->state == ISAC_IND_EI) ||
646 (isac->state == ISAC_IND_DR) ||
647 (isac->state == ISAC_IND_DR6) ||
648 (isac->state == ISAC_IND_RS))
649 ph_command(isac, ISAC_CMD_TIM);
651 ph_command(isac, ISAC_CMD_RS);
652 spin_unlock_irqrestore(isac->hwlock, flags);
670 spin_lock_irqsave(isac->hwlock, flags);
671 ph_command(isac, ISAC_CMD_TIM);
672 spin_unlock_irqrestore(isac->hwlock, flags);
685 pr_debug("%s: %s unknown command %x\n", isac->name,
693 isac_release(struct isac_hw *isac)
695 if (isac->type & IPAC_TYPE_ISACX)
696 WriteISAC(isac, ISACX_MASK, 0xff);
697 else if (isac->type != 0)
698 WriteISAC(isac, ISAC_MASK, 0xff);
699 if (isac->dch.timer.function != NULL) {
700 del_timer(&isac->dch.timer);
701 isac->dch.timer.function = NULL;
703 kfree(isac->mon_rx);
704 isac->mon_rx = NULL;
705 kfree(isac->mon_tx);
706 isac->mon_tx = NULL;
707 if (isac->dch.l1)
708 l1_event(isac->dch.l1, CLOSE_CHANNEL);
709 mISDN_freedchannel(&isac->dch);
715 struct isac_hw *isac = from_timer(isac, t, dch.timer);
719 if (test_bit(FLG_BUSY_TIMER, &isac->dch.Flags)) {
720 spin_lock_irqsave(isac->hwlock, flags);
721 rbch = ReadISAC(isac, ISAC_RBCH);
722 star = ReadISAC(isac, ISAC_STAR);
724 isac->name, rbch, star);
726 test_and_set_bit(FLG_L1_BUSY, &isac->dch.Flags);
729 test_and_clear_bit(FLG_BUSY_TIMER, &isac->dch.Flags);
730 if (isac->dch.tx_idx)
731 isac->dch.tx_idx = 0;
734 isac->name);
736 WriteISAC(isac, ISAC_CMDR, 0x01);
738 spin_unlock_irqrestore(isac->hwlock, flags);
743 open_dchannel_caller(struct isac_hw *isac, struct channel_req *rq, void *caller)
745 pr_debug("%s: %s dev(%d) open from %p\n", isac->name, __func__,
746 isac->dch.dev.id, caller);
752 rq->ch = &isac->dch.dev.D;
754 if (isac->dch.state == 7)
761 open_dchannel(struct isac_hw *isac, struct channel_req *rq)
763 return open_dchannel_caller(isac, rq, __builtin_return_address(0));
771 isac_init(struct isac_hw *isac)
776 if (!isac->dch.l1) {
777 err = create_l1(&isac->dch, isac_l1cmd);
781 isac->mon_tx = NULL;
782 isac->mon_rx = NULL;
783 timer_setup(&isac->dch.timer, dbusy_timer_handler, 0);
784 isac->mocr = 0xaa;
785 if (isac->type & IPAC_TYPE_ISACX) {
787 WriteISAC(isac, ISACX_MASK, 0xff);
788 val = ReadISAC(isac, ISACX_STARD);
789 pr_debug("%s: ISACX STARD %x\n", isac->name, val);
790 val = ReadISAC(isac, ISACX_ISTAD);
791 pr_debug("%s: ISACX ISTAD %x\n", isac->name, val);
792 val = ReadISAC(isac, ISACX_ISTA);
793 pr_debug("%s: ISACX ISTA %x\n", isac->name, val);
795 WriteISAC(isac, ISACX_TR_CONF0, 0x00);
797 WriteISAC(isac, ISACX_TR_CONF2, 0x00);
799 WriteISAC(isac, ISACX_MODED, 0xc9);
801 val = ReadISAC(isac, ISACX_ID);
802 if (isac->dch.debug & DEBUG_HW)
804 isac->name, val & 0x3f);
805 val = ReadISAC(isac, ISACX_CIR0);
806 pr_debug("%s: ISACX CIR0 %02X\n", isac->name, val);
807 isac->state = val >> 4;
808 isac_ph_state_change(isac);
809 ph_command(isac, ISAC_CMD_RS);
810 WriteISAC(isac, ISACX_MASK, IPACX__ON);
811 WriteISAC(isac, ISACX_MASKD, 0x00);
812 } else { /* old isac */
813 WriteISAC(isac, ISAC_MASK, 0xff);
814 val = ReadISAC(isac, ISAC_STAR);
815 pr_debug("%s: ISAC STAR %x\n", isac->name, val);
816 val = ReadISAC(isac, ISAC_MODE);
817 pr_debug("%s: ISAC MODE %x\n", isac->name, val);
818 val = ReadISAC(isac, ISAC_ADF2);
819 pr_debug("%s: ISAC ADF2 %x\n", isac->name, val);
820 val = ReadISAC(isac, ISAC_ISTA);
821 pr_debug("%s: ISAC ISTA %x\n", isac->name, val);
823 val = ReadISAC(isac, ISAC_EXIR);
824 pr_debug("%s: ISAC EXIR %x\n", isac->name, val);
826 val = ReadISAC(isac, ISAC_RBCH);
827 if (isac->dch.debug & DEBUG_HW)
828 pr_notice("%s: ISAC version (%x): %s\n", isac->name,
830 isac->type |= ((val >> 5) & 3);
831 if (!isac->adf2)
832 isac->adf2 = 0x80;
833 if (!(isac->adf2 & 0x80)) { /* only IOM 2 Mode */
835 isac->name, isac->adf2);
836 isac_release(isac);
839 WriteISAC(isac, ISAC_ADF2, isac->adf2);
840 WriteISAC(isac, ISAC_SQXR, 0x2f);
841 WriteISAC(isac, ISAC_SPCR, 0x00);
842 WriteISAC(isac, ISAC_STCR, 0x70);
843 WriteISAC(isac, ISAC_MODE, 0xc9);
844 WriteISAC(isac, ISAC_TIMR, 0x00);
845 WriteISAC(isac, ISAC_ADF1, 0x00);
846 val = ReadISAC(isac, ISAC_CIR0);
847 pr_debug("%s: ISAC CIR0 %x\n", isac->name, val);
848 isac->state = (val >> 2) & 0xf;
849 isac_ph_state_change(isac);
850 ph_command(isac, ISAC_CMD_RS);
851 WriteISAC(isac, ISAC_MASK, 0);
857 mISDNisac_init(struct isac_hw *isac, void *hw)
859 mISDN_initdchannel(&isac->dch, MAX_DFRAME_LEN_L1, isac_ph_state_bh);
860 isac->dch.hw = hw;
861 isac->dch.dev.D.send = isac_l1hw;
862 isac->init = isac_init;
863 isac->release = isac_release;
864 isac->ctrl = isac_ctrl;
865 isac->open = open_dchannel;
866 isac->dch.dev.Dprotocols = (1 << ISDN_P_TE_S0);
867 isac->dch.dev.nrbchan = 2;
1152 struct isac_hw *isac = &ipac->isac;
1163 mISDNisac_irq(&ipac->isac, ista);
1171 istad = ReadISAC(isac, ISAC_ISTA);
1177 mISDNisac_irq(isac, istad);
1191 istad = ReadISAC(isac, ISAC_ISTA);
1194 mISDNisac_irq(isac, istad);
1420 isac_release(&ipac->isac);
1475 return isac_init(&ipac->isac);
1514 ret = ipac->isac.ctrl(&ipac->isac, HW_TIMER3_VALUE, cq->p1);
1529 struct isac_hw *isac = container_of(dch, struct isac_hw, dch);
1530 struct ipac_hw *ipac = container_of(isac, struct ipac_hw, isac);
1539 err = open_dchannel_caller(isac, rq, __builtin_return_address(0));
1569 if (ipac->isac.dch.debug & DEBUG_HW)
1572 ipac->isac.type = IPAC_TYPE_ISAC;
1578 ipac->isac.type = IPAC_TYPE_IPAC | IPAC_TYPE_ISAC;
1584 ipac->isac.type = IPAC_TYPE_IPACX | IPAC_TYPE_ISACX;
1592 mISDNisac_init(&ipac->isac, hw);
1594 ipac->isac.dch.dev.D.ctrl = ipac_dctrl;
1598 set_channelmap(i + 1, ipac->isac.dch.dev.channelmap);
1600 &ipac->isac.dch.dev.bchannels);