netjet.c (8bfddfbe2100862fd39b97001d0559ccd4c77f19) netjet.c (7206e659f689558b41aa058c3040b081cb281d03)
1/*
2 * NETJet mISDN driver
3 *
4 * Author Karsten Keil <keil@isdn4linux.de>
5 *
6 * Copyright 2009 by Karsten Keil <keil@isdn4linux.de>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 372 unchanged lines hidden (view full) ---

381 u8 *p, *pn;
382
383 if (bc->lastrx == idx) {
384 bc->rxstate |= RX_OVERRUN;
385 pr_info("%s: B%1d overrun at idx %d\n", card->name,
386 bc->bch.nr, idx);
387 }
388 bc->lastrx = idx;
1/*
2 * NETJet mISDN driver
3 *
4 * Author Karsten Keil <keil@isdn4linux.de>
5 *
6 * Copyright 2009 by Karsten Keil <keil@isdn4linux.de>
7 *
8 * This program is free software; you can redistribute it and/or modify

--- 372 unchanged lines hidden (view full) ---

381 u8 *p, *pn;
382
383 if (bc->lastrx == idx) {
384 bc->rxstate |= RX_OVERRUN;
385 pr_info("%s: B%1d overrun at idx %d\n", card->name,
386 bc->bch.nr, idx);
387 }
388 bc->lastrx = idx;
389 if (!bc->bch.rx_skb) {
390 bc->bch.rx_skb = mI_alloc_skb(bc->bch.maxlen, GFP_ATOMIC);
391 if (!bc->bch.rx_skb) {
392 pr_info("%s: B%1d receive out of memory\n",
393 card->name, bc->bch.nr);
394 return;
395 }
389 stat = bchannel_get_rxbuf(&bc->bch, cnt);
390 /* only transparent use the count here, HDLC overun is detected later */
391 if (stat == ENOMEM) {
392 pr_warning("%s.B%d: No memory for %d bytes\n",
393 card->name, bc->bch.nr, cnt);
394 return;
396 }
395 }
397
398 if (test_bit(FLG_TRANSPARENT, &bc->bch.Flags)) {
399 if ((bc->bch.rx_skb->len + cnt) > bc->bch.maxlen) {
400 pr_debug("%s: B%1d overrun %d\n", card->name,
401 bc->bch.nr, bc->bch.rx_skb->len + cnt);
402 skb_trim(bc->bch.rx_skb, 0);
403 return;
404 }
396 if (test_bit(FLG_TRANSPARENT, &bc->bch.Flags))
405 p = skb_put(bc->bch.rx_skb, cnt);
397 p = skb_put(bc->bch.rx_skb, cnt);
406 } else
398 else
407 p = bc->hrbuf;
408
409 for (i = 0; i < cnt; i++) {
410 val = card->recv.start[idx++];
411 if (bc->bch.nr & 2)
412 val >>= 8;
413 if (idx >= card->recv.size)
414 idx = 0;
415 p[i] = val & 0xff;
416 }
399 p = bc->hrbuf;
400
401 for (i = 0; i < cnt; i++) {
402 val = card->recv.start[idx++];
403 if (bc->bch.nr & 2)
404 val >>= 8;
405 if (idx >= card->recv.size)
406 idx = 0;
407 p[i] = val & 0xff;
408 }
409
410 if (test_bit(FLG_TRANSPARENT, &bc->bch.Flags)) {
411 recv_Bchannel(&bc->bch, 0);
412 return;
413 }
414
417 pn = bc->hrbuf;
415 pn = bc->hrbuf;
418next_frame:
419 if (test_bit(FLG_HDLC, &bc->bch.Flags)) {
416 while (cnt > 0) {
420 stat = isdnhdlc_decode(&bc->hrecv, pn, cnt, &i,
421 bc->bch.rx_skb->data, bc->bch.maxlen);
417 stat = isdnhdlc_decode(&bc->hrecv, pn, cnt, &i,
418 bc->bch.rx_skb->data, bc->bch.maxlen);
422 if (stat > 0) /* valid frame received */
419 if (stat > 0) { /* valid frame received */
423 p = skb_put(bc->bch.rx_skb, stat);
420 p = skb_put(bc->bch.rx_skb, stat);
424 else if (stat == -HDLC_CRC_ERROR)
421 if (debug & DEBUG_HW_BFIFO) {
422 snprintf(card->log, LOG_SIZE,
423 "B%1d-recv %s %d ", bc->bch.nr,
424 card->name, stat);
425 print_hex_dump_bytes(card->log,
426 DUMP_PREFIX_OFFSET, p,
427 stat);
428 }
429 recv_Bchannel(&bc->bch, 0);
430 stat = bchannel_get_rxbuf(&bc->bch, bc->bch.maxlen);
431 if (stat < 0) {
432 pr_warning("%s.B%d: No memory for %d bytes\n",
433 card->name, bc->bch.nr, cnt);
434 return;
435 }
436 } else if (stat == -HDLC_CRC_ERROR) {
425 pr_info("%s: B%1d receive frame CRC error\n",
426 card->name, bc->bch.nr);
437 pr_info("%s: B%1d receive frame CRC error\n",
438 card->name, bc->bch.nr);
427 else if (stat == -HDLC_FRAMING_ERROR)
439 } else if (stat == -HDLC_FRAMING_ERROR) {
428 pr_info("%s: B%1d receive framing error\n",
429 card->name, bc->bch.nr);
440 pr_info("%s: B%1d receive framing error\n",
441 card->name, bc->bch.nr);
430 else if (stat == -HDLC_LENGTH_ERROR)
442 } else if (stat == -HDLC_LENGTH_ERROR) {
431 pr_info("%s: B%1d receive frame too long (> %d)\n",
432 card->name, bc->bch.nr, bc->bch.maxlen);
443 pr_info("%s: B%1d receive frame too long (> %d)\n",
444 card->name, bc->bch.nr, bc->bch.maxlen);
433 } else
434 stat = cnt;
435
436 if (stat > 0) {
437 if (debug & DEBUG_HW_BFIFO) {
438 snprintf(card->log, LOG_SIZE, "B%1d-recv %s %d ",
439 bc->bch.nr, card->name, stat);
440 print_hex_dump_bytes(card->log, DUMP_PREFIX_OFFSET,
441 p, stat);
442 }
445 }
443 recv_Bchannel(&bc->bch, 0);
444 }
445 if (test_bit(FLG_HDLC, &bc->bch.Flags)) {
446 pn += i;
447 cnt -= i;
446 pn += i;
447 cnt -= i;
448 if (!bc->bch.rx_skb) {
449 bc->bch.rx_skb = mI_alloc_skb(bc->bch.maxlen,
450 GFP_ATOMIC);
451 if (!bc->bch.rx_skb) {
452 pr_info("%s: B%1d receive out of memory\n",
453 card->name, bc->bch.nr);
454 return;
455 }
456 }
457 if (cnt > 0)
458 goto next_frame;
459 }
460}
461
462static void
463recv_tiger(struct tiger_hw *card, u8 irq_stat)
464{
465 u32 idx;
466 int cnt = card->recv.size / 2;

--- 688 unchanged lines hidden ---
448 }
449}
450
451static void
452recv_tiger(struct tiger_hw *card, u8 irq_stat)
453{
454 u32 idx;
455 int cnt = card->recv.size / 2;

--- 688 unchanged lines hidden ---