Lines Matching +full:cmd +full:- +full:cnt +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0-only
66 char name[MISDN_MAX_IDLEN]; member
95 card->isac.dch.debug = debug; in _set_debug()
96 card->bc[0].bch.debug = debug; in _set_debug()
97 card->bc[1].bch.debug = debug; in _set_debug()
125 outb(0, card->base + NJ_IRQMASK0); in nj_disable_hwirq()
126 outb(0, card->base + NJ_IRQMASK1); in nj_disable_hwirq()
136 card->auxd &= 0xfc; in ReadISAC_nj()
137 card->auxd |= (offset >> 4) & 3; in ReadISAC_nj()
138 outb(card->auxd, card->base + NJ_AUXDATA); in ReadISAC_nj()
139 ret = inb(card->base + NJ_ISAC_OFF + ((offset & 0x0f) << 2)); in ReadISAC_nj()
148 card->auxd &= 0xfc; in WriteISAC_nj()
149 card->auxd |= (offset >> 4) & 3; in WriteISAC_nj()
150 outb(card->auxd, card->base + NJ_AUXDATA); in WriteISAC_nj()
151 outb(value, card->base + NJ_ISAC_OFF + ((offset & 0x0f) << 2)); in WriteISAC_nj()
159 card->auxd &= 0xfc; in ReadFiFoISAC_nj()
160 outb(card->auxd, card->base + NJ_AUXDATA); in ReadFiFoISAC_nj()
161 insb(card->base + NJ_ISAC_OFF, data, size); in ReadFiFoISAC_nj()
169 card->auxd &= 0xfc; in WriteFiFoISAC_nj()
170 outb(card->auxd, card->base + NJ_AUXDATA); in WriteFiFoISAC_nj()
171 outsb(card->base + NJ_ISAC_OFF, data, size); in WriteFiFoISAC_nj()
175 fill_mem(struct tiger_ch *bc, u32 idx, u32 cnt, u32 fill) in fill_mem() argument
177 struct tiger_hw *card = bc->bch.hw; in fill_mem()
180 pr_debug("%s: B%1d fill %02x len %d idx %d/%d\n", card->name, in fill_mem()
181 bc->bch.nr, fill, cnt, idx, card->send.idx); in fill_mem()
182 if (bc->bch.nr & 2) { in fill_mem()
187 while (cnt--) { in fill_mem()
188 val = card->send.start[idx]; in fill_mem()
191 card->send.start[idx++] = val; in fill_mem()
192 if (idx >= card->send.size) in fill_mem()
200 struct tiger_hw *card = bc->bch.hw; in mode_tiger()
202 pr_debug("%s: B%1d protocol %x-->%x\n", card->name, in mode_tiger()
203 bc->bch.nr, bc->bch.state, protocol); in mode_tiger()
206 if (bc->bch.state == ISDN_P_NONE) in mode_tiger()
208 fill_mem(bc, 0, card->send.size, 0xff); in mode_tiger()
209 bc->bch.state = protocol; in mode_tiger()
211 if ((card->bc[0].bch.state == ISDN_P_NONE) && in mode_tiger()
212 (card->bc[1].bch.state == ISDN_P_NONE)) { in mode_tiger()
213 card->dmactrl = 0; in mode_tiger()
214 outb(card->dmactrl, card->base + NJ_DMACTRL); in mode_tiger()
215 outb(0, card->base + NJ_IRQMASK0); in mode_tiger()
217 test_and_clear_bit(FLG_HDLC, &bc->bch.Flags); in mode_tiger()
218 test_and_clear_bit(FLG_TRANSPARENT, &bc->bch.Flags); in mode_tiger()
219 bc->txstate = 0; in mode_tiger()
220 bc->rxstate = 0; in mode_tiger()
221 bc->lastrx = -1; in mode_tiger()
224 test_and_set_bit(FLG_TRANSPARENT, &bc->bch.Flags); in mode_tiger()
225 bc->bch.state = protocol; in mode_tiger()
226 bc->idx = 0; in mode_tiger()
227 bc->free = card->send.size / 2; in mode_tiger()
228 bc->rxstate = 0; in mode_tiger()
229 bc->txstate = TX_INIT | TX_IDLE; in mode_tiger()
230 bc->lastrx = -1; in mode_tiger()
231 if (!card->dmactrl) { in mode_tiger()
232 card->dmactrl = 1; in mode_tiger()
233 outb(card->dmactrl, card->base + NJ_DMACTRL); in mode_tiger()
234 outb(0x0f, card->base + NJ_IRQMASK0); in mode_tiger()
238 test_and_set_bit(FLG_HDLC, &bc->bch.Flags); in mode_tiger()
239 bc->bch.state = protocol; in mode_tiger()
240 bc->idx = 0; in mode_tiger()
241 bc->free = card->send.size / 2; in mode_tiger()
242 bc->rxstate = 0; in mode_tiger()
243 bc->txstate = TX_INIT | TX_IDLE; in mode_tiger()
244 isdnhdlc_rcv_init(&bc->hrecv, 0); in mode_tiger()
245 isdnhdlc_out_init(&bc->hsend, 0); in mode_tiger()
246 bc->lastrx = -1; in mode_tiger()
247 if (!card->dmactrl) { in mode_tiger()
248 card->dmactrl = 1; in mode_tiger()
249 outb(card->dmactrl, card->base + NJ_DMACTRL); in mode_tiger()
250 outb(0x0f, card->base + NJ_IRQMASK0); in mode_tiger()
254 pr_info("%s: %s protocol %x not handled\n", card->name, in mode_tiger()
256 return -ENOPROTOOPT; in mode_tiger()
258 card->send.dmacur = inl(card->base + NJ_DMA_READ_ADR); in mode_tiger()
259 card->recv.dmacur = inl(card->base + NJ_DMA_WRITE_ADR); in mode_tiger()
260 card->send.idx = (card->send.dmacur - card->send.dmastart) >> 2; in mode_tiger()
261 card->recv.idx = (card->recv.dmacur - card->recv.dmastart) >> 2; in mode_tiger()
263 card->name, __func__, in mode_tiger()
264 inb(card->base + NJ_DMACTRL), in mode_tiger()
265 inb(card->base + NJ_IRQMASK0), in mode_tiger()
266 inb(card->base + NJ_IRQSTAT0), in mode_tiger()
267 card->send.idx, in mode_tiger()
268 card->recv.idx); in mode_tiger()
275 outb(0xff, card->base + NJ_CTRL); /* Reset On */ in nj_reset()
280 if (card->typ == NETJET_S_TJ320) /* TJ320 */ in nj_reset()
281 card->ctrlreg = 0x40; /* Reset Off and status read clear */ in nj_reset()
283 card->ctrlreg = 0x00; /* Reset Off and status read clear */ in nj_reset()
284 outb(card->ctrlreg, card->base + NJ_CTRL); in nj_reset()
288 card->auxd = 0; in nj_reset()
289 card->dmactrl = 0; in nj_reset()
290 outb(~NJ_ISACIRQ, card->base + NJ_AUXCTRL); in nj_reset()
291 outb(NJ_ISACIRQ, card->base + NJ_IRQMASK1); in nj_reset()
292 outb(card->auxd, card->base + NJ_AUXDATA); in nj_reset()
300 card->dma_p = dma_alloc_coherent(&card->pdev->dev, NJ_DMA_SIZE, in inittiger()
301 &card->dma, GFP_ATOMIC); in inittiger()
302 if (!card->dma_p) { in inittiger()
303 pr_info("%s: No DMA memory\n", card->name); in inittiger()
304 return -ENOMEM; in inittiger()
306 if ((u64)card->dma > 0xffffffff) { in inittiger()
307 pr_info("%s: DMA outside 32 bit\n", card->name); in inittiger()
308 return -ENOMEM; in inittiger()
311 card->bc[i].hsbuf = kmalloc(NJ_DMA_TXSIZE, GFP_ATOMIC); in inittiger()
312 if (!card->bc[i].hsbuf) { in inittiger()
313 pr_info("%s: no B%d send buffer\n", card->name, i + 1); in inittiger()
314 return -ENOMEM; in inittiger()
316 card->bc[i].hrbuf = kmalloc(NJ_DMA_RXSIZE, GFP_ATOMIC); in inittiger()
317 if (!card->bc[i].hrbuf) { in inittiger()
318 pr_info("%s: no B%d recv buffer\n", card->name, i + 1); in inittiger()
319 return -ENOMEM; in inittiger()
322 memset(card->dma_p, 0xff, NJ_DMA_SIZE); in inittiger()
324 card->send.start = card->dma_p; in inittiger()
325 card->send.dmastart = (u32)card->dma; in inittiger()
326 card->send.dmaend = card->send.dmastart + in inittiger()
327 (4 * (NJ_DMA_TXSIZE - 1)); in inittiger()
328 card->send.dmairq = card->send.dmastart + in inittiger()
329 (4 * ((NJ_DMA_TXSIZE / 2) - 1)); in inittiger()
330 card->send.size = NJ_DMA_TXSIZE; in inittiger()
333 pr_notice("%s: send buffer phy %#x - %#x - %#x virt %p" in inittiger()
334 " size %zu u32\n", card->name, in inittiger()
335 card->send.dmastart, card->send.dmairq, in inittiger()
336 card->send.dmaend, card->send.start, card->send.size); in inittiger()
338 outl(card->send.dmastart, card->base + NJ_DMA_READ_START); in inittiger()
339 outl(card->send.dmairq, card->base + NJ_DMA_READ_IRQ); in inittiger()
340 outl(card->send.dmaend, card->base + NJ_DMA_READ_END); in inittiger()
342 card->recv.start = card->dma_p + (NJ_DMA_SIZE / 2); in inittiger()
343 card->recv.dmastart = (u32)card->dma + (NJ_DMA_SIZE / 2); in inittiger()
344 card->recv.dmaend = card->recv.dmastart + in inittiger()
345 (4 * (NJ_DMA_RXSIZE - 1)); in inittiger()
346 card->recv.dmairq = card->recv.dmastart + in inittiger()
347 (4 * ((NJ_DMA_RXSIZE / 2) - 1)); in inittiger()
348 card->recv.size = NJ_DMA_RXSIZE; in inittiger()
351 pr_notice("%s: recv buffer phy %#x - %#x - %#x virt %p" in inittiger()
352 " size %zu u32\n", card->name, in inittiger()
353 card->recv.dmastart, card->recv.dmairq, in inittiger()
354 card->recv.dmaend, card->recv.start, card->recv.size); in inittiger()
356 outl(card->recv.dmastart, card->base + NJ_DMA_WRITE_START); in inittiger()
357 outl(card->recv.dmairq, card->base + NJ_DMA_WRITE_IRQ); in inittiger()
358 outl(card->recv.dmaend, card->base + NJ_DMA_WRITE_END); in inittiger()
363 read_dma(struct tiger_ch *bc, u32 idx, int cnt) in read_dma() argument
365 struct tiger_hw *card = bc->bch.hw; in read_dma()
370 if (bc->lastrx == idx) { in read_dma()
371 bc->rxstate |= RX_OVERRUN; in read_dma()
372 pr_info("%s: B%1d overrun at idx %d\n", card->name, in read_dma()
373 bc->bch.nr, idx); in read_dma()
375 bc->lastrx = idx; in read_dma()
376 if (test_bit(FLG_RX_OFF, &bc->bch.Flags)) { in read_dma()
377 bc->bch.dropcnt += cnt; in read_dma()
380 stat = bchannel_get_rxbuf(&bc->bch, cnt); in read_dma()
382 if (stat == -ENOMEM) { in read_dma()
384 card->name, bc->bch.nr, cnt); in read_dma()
387 if (test_bit(FLG_TRANSPARENT, &bc->bch.Flags)) in read_dma()
388 p = skb_put(bc->bch.rx_skb, cnt); in read_dma()
390 p = bc->hrbuf; in read_dma()
392 for (i = 0; i < cnt; i++) { in read_dma()
393 val = card->recv.start[idx++]; in read_dma()
394 if (bc->bch.nr & 2) in read_dma()
396 if (idx >= card->recv.size) in read_dma()
401 if (test_bit(FLG_TRANSPARENT, &bc->bch.Flags)) { in read_dma()
402 recv_Bchannel(&bc->bch, 0, false); in read_dma()
406 pn = bc->hrbuf; in read_dma()
407 while (cnt > 0) { in read_dma()
408 stat = isdnhdlc_decode(&bc->hrecv, pn, cnt, &i, in read_dma()
409 bc->bch.rx_skb->data, bc->bch.maxlen); in read_dma()
411 p = skb_put(bc->bch.rx_skb, stat); in read_dma()
413 snprintf(card->log, LOG_SIZE, in read_dma()
414 "B%1d-recv %s %d ", bc->bch.nr, in read_dma()
415 card->name, stat); in read_dma()
416 print_hex_dump_bytes(card->log, in read_dma()
420 recv_Bchannel(&bc->bch, 0, false); in read_dma()
421 stat = bchannel_get_rxbuf(&bc->bch, bc->bch.maxlen); in read_dma()
424 card->name, bc->bch.nr, cnt); in read_dma()
427 } else if (stat == -HDLC_CRC_ERROR) { in read_dma()
429 card->name, bc->bch.nr); in read_dma()
430 } else if (stat == -HDLC_FRAMING_ERROR) { in read_dma()
432 card->name, bc->bch.nr); in read_dma()
433 } else if (stat == -HDLC_LENGTH_ERROR) { in read_dma()
435 card->name, bc->bch.nr, bc->bch.maxlen); in read_dma()
438 cnt -= i; in read_dma()
446 int cnt = card->recv.size / 2; in recv_tiger() local
449 card->last_is0 &= ~NJ_IRQM0_WR_MASK; in recv_tiger()
450 card->last_is0 |= (irq_stat & NJ_IRQM0_WR_MASK); in recv_tiger()
453 idx = cnt - 1; in recv_tiger()
455 idx = card->recv.size - 1; in recv_tiger()
457 if (test_bit(FLG_ACTIVE, &card->bc[0].bch.Flags)) in recv_tiger()
458 read_dma(&card->bc[0], idx, cnt); in recv_tiger()
459 if (test_bit(FLG_ACTIVE, &card->bc[1].bch.Flags)) in recv_tiger()
460 read_dma(&card->bc[1], idx, cnt); in recv_tiger()
467 card->send.dmacur = inl(card->base | NJ_DMA_READ_ADR); in resync()
468 card->send.idx = (card->send.dmacur - card->send.dmastart) >> 2; in resync()
469 if (bc->free > card->send.size / 2) in resync()
470 bc->free = card->send.size / 2; in resync()
475 if (card->send.idx < ((card->send.size / 2) - 1)) in resync()
476 bc->idx = (card->recv.size / 2) - 1; in resync()
478 bc->idx = card->recv.size - 1; in resync()
479 bc->txstate = TX_RUN; in resync()
480 pr_debug("%s: %s B%1d free %d idx %d/%d\n", card->name, in resync()
481 __func__, bc->bch.nr, bc->free, bc->idx, card->send.idx); in resync()
489 struct tiger_hw *card = bc->bch.hw; in fill_hdlc_flag()
494 if (bc->free == 0) in fill_hdlc_flag()
496 pr_debug("%s: %s B%1d %d state %x idx %d/%d\n", card->name, in fill_hdlc_flag()
497 __func__, bc->bch.nr, bc->free, bc->txstate, in fill_hdlc_flag()
498 bc->idx, card->send.idx); in fill_hdlc_flag()
499 if (bc->txstate & (TX_IDLE | TX_INIT | TX_UNDERRUN)) in fill_hdlc_flag()
501 count = isdnhdlc_encode(&bc->hsend, NULL, 0, &i, in fill_hdlc_flag()
502 bc->hsbuf, bc->free); in fill_hdlc_flag()
503 pr_debug("%s: B%1d hdlc encoded %d flags\n", card->name, in fill_hdlc_flag()
504 bc->bch.nr, count); in fill_hdlc_flag()
505 bc->free -= count; in fill_hdlc_flag()
506 p = bc->hsbuf; in fill_hdlc_flag()
507 m = (bc->bch.nr & 1) ? 0xffffff00 : 0xffff00ff; in fill_hdlc_flag()
509 if (bc->idx >= card->send.size) in fill_hdlc_flag()
510 bc->idx = 0; in fill_hdlc_flag()
511 v = card->send.start[bc->idx]; in fill_hdlc_flag()
513 v |= (bc->bch.nr & 1) ? (u32)(p[i]) : ((u32)(p[i])) << 8; in fill_hdlc_flag()
514 card->send.start[bc->idx++] = v; in fill_hdlc_flag()
517 snprintf(card->log, LOG_SIZE, "B%1d-send %s %d ", in fill_hdlc_flag()
518 bc->bch.nr, card->name, count); in fill_hdlc_flag()
519 print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET, p, count); in fill_hdlc_flag()
526 struct tiger_hw *card = bc->bch.hw; in fill_dma()
531 if (bc->free == 0) in fill_dma()
533 if (!bc->bch.tx_skb) { in fill_dma()
534 if (!test_bit(FLG_TX_EMPTY, &bc->bch.Flags)) in fill_dma()
537 count = card->send.size >> 1; in fill_dma()
538 p = bc->bch.fill; in fill_dma()
540 count = bc->bch.tx_skb->len - bc->bch.tx_idx; in fill_dma()
544 card->name, __func__, bc->bch.nr, count, bc->free, in fill_dma()
545 bc->bch.tx_idx, bc->bch.tx_skb->len, bc->txstate, in fill_dma()
546 bc->idx, card->send.idx); in fill_dma()
547 p = bc->bch.tx_skb->data + bc->bch.tx_idx; in fill_dma()
549 if (bc->txstate & (TX_IDLE | TX_INIT | TX_UNDERRUN)) in fill_dma()
551 if (test_bit(FLG_HDLC, &bc->bch.Flags) && !fillempty) { in fill_dma()
552 count = isdnhdlc_encode(&bc->hsend, p, count, &i, in fill_dma()
553 bc->hsbuf, bc->free); in fill_dma()
554 pr_debug("%s: B%1d hdlc encoded %d in %d\n", card->name, in fill_dma()
555 bc->bch.nr, i, count); in fill_dma()
556 bc->bch.tx_idx += i; in fill_dma()
557 bc->free -= count; in fill_dma()
558 p = bc->hsbuf; in fill_dma()
560 if (count > bc->free) in fill_dma()
561 count = bc->free; in fill_dma()
563 bc->bch.tx_idx += count; in fill_dma()
564 bc->free -= count; in fill_dma()
566 m = (bc->bch.nr & 1) ? 0xffffff00 : 0xffff00ff; in fill_dma()
569 if (!(bc->bch.nr & 1)) in fill_dma()
572 if (bc->idx >= card->send.size) in fill_dma()
573 bc->idx = 0; in fill_dma()
574 v = card->send.start[bc->idx]; in fill_dma()
577 card->send.start[bc->idx++] = v; in fill_dma()
581 if (bc->idx >= card->send.size) in fill_dma()
582 bc->idx = 0; in fill_dma()
583 v = card->send.start[bc->idx]; in fill_dma()
586 v |= (bc->bch.nr & 1) ? n : n << 8; in fill_dma()
587 card->send.start[bc->idx++] = v; in fill_dma()
591 snprintf(card->log, LOG_SIZE, "B%1d-send %s %d ", in fill_dma()
592 bc->bch.nr, card->name, count); in fill_dma()
593 print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET, p, count); in fill_dma()
595 if (bc->free) in fill_dma()
605 if (bc->bch.tx_skb && bc->bch.tx_idx < bc->bch.tx_skb->len) { in bc_next_frame()
608 dev_kfree_skb(bc->bch.tx_skb); in bc_next_frame()
609 if (get_next_bframe(&bc->bch)) { in bc_next_frame()
611 test_and_clear_bit(FLG_TX_EMPTY, &bc->bch.Flags); in bc_next_frame()
612 } else if (test_bit(FLG_TX_EMPTY, &bc->bch.Flags)) { in bc_next_frame()
614 } else if (test_bit(FLG_FILLEMPTY, &bc->bch.Flags)) { in bc_next_frame()
615 test_and_set_bit(FLG_TX_EMPTY, &bc->bch.Flags); in bc_next_frame()
629 bc->free += card->send.size / 2; in send_tiger_bc()
630 if (bc->free >= card->send.size) { in send_tiger_bc()
631 if (!(bc->txstate & (TX_UNDERRUN | TX_INIT))) { in send_tiger_bc()
632 pr_info("%s: B%1d TX underrun state %x\n", card->name, in send_tiger_bc()
633 bc->bch.nr, bc->txstate); in send_tiger_bc()
634 bc->txstate |= TX_UNDERRUN; in send_tiger_bc()
636 bc->free = card->send.size; in send_tiger_bc()
640 if (test_bit(FLG_HDLC, &bc->bch.Flags)) { in send_tiger_bc()
644 pr_debug("%s: B%1d TX no data free %d idx %d/%d\n", card->name, in send_tiger_bc()
645 bc->bch.nr, bc->free, bc->idx, card->send.idx); in send_tiger_bc()
646 if (!(bc->txstate & (TX_IDLE | TX_INIT))) { in send_tiger_bc()
647 fill_mem(bc, bc->idx, bc->free, 0xff); in send_tiger_bc()
648 if (bc->free == card->send.size) in send_tiger_bc()
649 bc->txstate |= TX_IDLE; in send_tiger_bc()
660 if ((irq_stat & card->last_is0) & NJ_IRQM0_RD_MASK) { in send_tiger()
662 card->name, irq_stat, card->last_is0); in send_tiger()
665 card->last_is0 &= ~NJ_IRQM0_RD_MASK; in send_tiger()
666 card->last_is0 |= (irq_stat & NJ_IRQM0_RD_MASK); in send_tiger()
669 if (test_bit(FLG_ACTIVE, &card->bc[i].bch.Flags)) in send_tiger()
670 send_tiger_bc(card, &card->bc[i]); in send_tiger()
680 spin_lock(&card->lock); in nj_irq()
681 s0val = inb(card->base | NJ_IRQSTAT0); in nj_irq()
682 s1val = inb(card->base | NJ_IRQSTAT1); in nj_irq()
685 spin_unlock(&card->lock); in nj_irq()
688 pr_debug("%s: IRQSTAT0 %02x IRQSTAT1 %02x\n", card->name, s0val, s1val); in nj_irq()
689 card->irqcnt++; in nj_irq()
693 mISDNisac_irq(&card->isac, val); in nj_irq()
698 outb(s0val, card->base | NJ_IRQSTAT0); in nj_irq()
703 card->recv.dmacur = inl(card->base | NJ_DMA_WRITE_ADR); in nj_irq()
704 card->recv.idx = (card->recv.dmacur - card->recv.dmastart) >> 2; in nj_irq()
705 if (card->recv.dmacur < card->recv.dmairq) in nj_irq()
710 card->send.dmacur = inl(card->base | NJ_DMA_READ_ADR); in nj_irq()
711 card->send.idx = (card->send.dmacur - card->send.dmastart) >> 2; in nj_irq()
712 if (card->send.dmacur < card->send.dmairq) in nj_irq()
717 pr_debug("%s: DMA Status %02x/%02x/%02x %d/%d\n", card->name, in nj_irq()
718 s1val, s0val, card->last_is0, in nj_irq()
719 card->recv.idx, card->send.idx); in nj_irq()
721 if (s0val != card->last_is0) { in nj_irq()
723 (card->last_is0 & NJ_IRQM0_RD_MASK)) in nj_irq()
727 (card->last_is0 & NJ_IRQM0_WR_MASK)) in nj_irq()
732 spin_unlock(&card->lock); in nj_irq()
739 int ret = -EINVAL; in nj_l2l1B()
742 struct tiger_hw *card = bch->hw; in nj_l2l1B()
746 switch (hh->prim) { in nj_l2l1B()
748 spin_lock_irqsave(&card->lock, flags); in nj_l2l1B()
754 spin_unlock_irqrestore(&card->lock, flags); in nj_l2l1B()
757 spin_lock_irqsave(&card->lock, flags); in nj_l2l1B()
758 if (!test_and_set_bit(FLG_ACTIVE, &bch->Flags)) in nj_l2l1B()
759 ret = mode_tiger(bc, ch->protocol); in nj_l2l1B()
762 spin_unlock_irqrestore(&card->lock, flags); in nj_l2l1B()
768 spin_lock_irqsave(&card->lock, flags); in nj_l2l1B()
771 spin_unlock_irqrestore(&card->lock, flags); in nj_l2l1B()
785 return mISDN_ctrl_bchannel(&bc->bch, cq); in channel_bctrl()
789 nj_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg) in nj_bctrl() argument
793 struct tiger_hw *card = bch->hw; in nj_bctrl()
794 int ret = -EINVAL; in nj_bctrl()
797 pr_debug("%s: %s cmd:%x %p\n", card->name, __func__, cmd, arg); in nj_bctrl()
798 switch (cmd) { in nj_bctrl()
800 test_and_clear_bit(FLG_OPEN, &bch->Flags); in nj_bctrl()
801 cancel_work_sync(&bch->workq); in nj_bctrl()
802 spin_lock_irqsave(&card->lock, flags); in nj_bctrl()
805 spin_unlock_irqrestore(&card->lock, flags); in nj_bctrl()
806 ch->protocol = ISDN_P_NONE; in nj_bctrl()
807 ch->peer = NULL; in nj_bctrl()
815 pr_info("%s: %s unknown prim(%x)\n", card->name, __func__, cmd); in nj_bctrl()
825 switch (cq->op) { in channel_ctrl()
827 cq->op = MISDN_CTRL_LOOP | MISDN_CTRL_L1_TIMER3; in channel_ctrl()
830 /* cq->channel: 0 disable, 1 B1 loop 2 B2 loop, 3 both */ in channel_ctrl()
831 if (cq->channel < 0 || cq->channel > 3) { in channel_ctrl()
832 ret = -EINVAL; in channel_ctrl()
835 ret = card->isac.ctrl(&card->isac, HW_TESTLOOP, cq->channel); in channel_ctrl()
838 ret = card->isac.ctrl(&card->isac, HW_TIMER3_VALUE, cq->p1); in channel_ctrl()
841 pr_info("%s: %s unknown Op %x\n", card->name, __func__, cq->op); in channel_ctrl()
842 ret = -EINVAL; in channel_ctrl()
853 if (rq->adr.channel == 0 || rq->adr.channel > 2) in open_bchannel()
854 return -EINVAL; in open_bchannel()
855 if (rq->protocol == ISDN_P_NONE) in open_bchannel()
856 return -EINVAL; in open_bchannel()
857 bch = &card->bc[rq->adr.channel - 1].bch; in open_bchannel()
858 if (test_and_set_bit(FLG_OPEN, &bch->Flags)) in open_bchannel()
859 return -EBUSY; /* b-channel can be only open once */ in open_bchannel()
860 test_and_clear_bit(FLG_FILLEMPTY, &bch->Flags); in open_bchannel()
861 bch->ch.protocol = rq->protocol; in open_bchannel()
862 rq->ch = &bch->ch; in open_bchannel()
870 nj_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg) in nj_dctrl() argument
874 struct tiger_hw *card = dch->hw; in nj_dctrl()
878 pr_debug("%s: %s cmd:%x %p\n", card->name, __func__, cmd, arg); in nj_dctrl()
879 switch (cmd) { in nj_dctrl()
882 if (rq->protocol == ISDN_P_TE_S0) in nj_dctrl()
883 err = card->isac.open(&card->isac, rq); in nj_dctrl()
889 pr_info("%s: cannot get module\n", card->name); in nj_dctrl()
892 pr_debug("%s: dev(%d) close from %p\n", card->name, dch->dev.id, in nj_dctrl()
901 card->name, __func__, cmd); in nj_dctrl()
902 return -EINVAL; in nj_dctrl()
913 spin_lock_irqsave(&card->lock, flags); in nj_init_card()
915 spin_unlock_irqrestore(&card->lock, flags); in nj_init_card()
917 card->irq = card->pdev->irq; in nj_init_card()
918 if (request_irq(card->irq, nj_irq, IRQF_SHARED, card->name, card)) { in nj_init_card()
920 card->name, card->irq); in nj_init_card()
921 card->irq = -1; in nj_init_card()
922 return -EIO; in nj_init_card()
925 spin_lock_irqsave(&card->lock, flags); in nj_init_card()
927 ret = card->isac.init(&card->isac); in nj_init_card()
933 mode_tiger(&card->bc[0], ISDN_P_NONE); in nj_init_card()
934 mode_tiger(&card->bc[1], ISDN_P_NONE); in nj_init_card()
936 spin_unlock_irqrestore(&card->lock, flags); in nj_init_card()
947 if (card->base_s) { in nj_release()
948 spin_lock_irqsave(&card->lock, flags); in nj_release()
950 mode_tiger(&card->bc[0], ISDN_P_NONE); in nj_release()
951 mode_tiger(&card->bc[1], ISDN_P_NONE); in nj_release()
952 spin_unlock_irqrestore(&card->lock, flags); in nj_release()
953 card->isac.release(&card->isac); in nj_release()
954 release_region(card->base, card->base_s); in nj_release()
955 card->base_s = 0; in nj_release()
957 if (card->irq > 0) in nj_release()
958 free_irq(card->irq, card); in nj_release()
959 if (device_is_registered(&card->isac.dch.dev.dev)) in nj_release()
960 mISDN_unregister_device(&card->isac.dch.dev); in nj_release()
963 mISDN_freebchannel(&card->bc[i].bch); in nj_release()
964 kfree(card->bc[i].hsbuf); in nj_release()
965 kfree(card->bc[i].hrbuf); in nj_release()
967 if (card->dma_p) in nj_release()
968 dma_free_coherent(&card->pdev->dev, NJ_DMA_SIZE, card->dma_p, in nj_release()
969 card->dma); in nj_release()
971 list_del(&card->list); in nj_release()
973 pci_disable_device(card->pdev); in nj_release()
974 pci_set_drvdata(card->pdev, NULL); in nj_release()
982 card->base = pci_resource_start(card->pdev, 0); in nj_setup()
983 card->base_s = pci_resource_len(card->pdev, 0); in nj_setup()
984 if (!request_region(card->base, card->base_s, card->name)) { in nj_setup()
985 pr_info("%s: NETjet config port %#x-%#x already in use\n", in nj_setup()
986 card->name, card->base, in nj_setup()
987 (u32)(card->base + card->base_s - 1)); in nj_setup()
988 card->base_s = 0; in nj_setup()
989 return -EIO; in nj_setup()
991 ASSIGN_FUNC(nj, ISAC, card->isac); in nj_setup()
1002 snprintf(card->name, MISDN_MAX_IDLEN - 1, "netjet.%d", nj_cnt + 1); in setup_instance()
1004 list_add_tail(&card->list, &Cards); in setup_instance()
1008 card->isac.name = card->name; in setup_instance()
1009 spin_lock_init(&card->lock); in setup_instance()
1010 card->isac.hwlock = &card->lock; in setup_instance()
1011 mISDNisac_init(&card->isac, card); in setup_instance()
1013 card->isac.dch.dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) | in setup_instance()
1015 card->isac.dch.dev.D.ctrl = nj_dctrl; in setup_instance()
1017 card->bc[i].bch.nr = i + 1; in setup_instance()
1018 set_channelmap(i + 1, card->isac.dch.dev.channelmap); in setup_instance()
1019 mISDN_initbchannel(&card->bc[i].bch, MAX_DATA_MEM, in setup_instance()
1021 card->bc[i].bch.hw = card; in setup_instance()
1022 card->bc[i].bch.ch.send = nj_l2l1B; in setup_instance()
1023 card->bc[i].bch.ch.ctrl = nj_bctrl; in setup_instance()
1024 card->bc[i].bch.ch.nr = i + 1; in setup_instance()
1025 list_add(&card->bc[i].bch.ch.list, in setup_instance()
1026 &card->isac.dch.dev.bchannels); in setup_instance()
1027 card->bc[i].bch.hw = card; in setup_instance()
1032 err = mISDN_register_device(&card->isac.dch.dev, &card->pdev->dev, in setup_instance()
1033 card->name); in setup_instance()
1050 int err = -ENOMEM; in nj_probe()
1054 if (pdev->subsystem_vendor == 0x8086 && in nj_probe()
1055 pdev->subsystem_device == 0x0003) { in nj_probe()
1057 return -ENODEV; in nj_probe()
1060 if (pdev->subsystem_vendor == 0x55 && in nj_probe()
1061 pdev->subsystem_device == 0x02) { in nj_probe()
1063 return -ENODEV; in nj_probe()
1066 if (pdev->subsystem_vendor == 0xb100 && in nj_probe()
1067 pdev->subsystem_device == 0x0003) { in nj_probe()
1069 return -ENODEV; in nj_probe()
1078 card->pdev = pdev; in nj_probe()
1097 card->typ = NETJET_S_TJ320; in nj_probe()
1099 card->typ = NETJET_S_TJ300; in nj_probe()
1101 card->base = pci_resource_start(pdev, 0); in nj_probe()
1123 * known other cards which not work with this driver - see probe function */
1132 .name = "netjet",