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 --- |