diff options
author | Karsten Keil <kkeil@linux-pingi.de> | 2012-05-15 19:51:05 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-05-16 15:23:28 -0400 |
commit | 7206e659f689558b41aa058c3040b081cb281d03 (patch) | |
tree | 2be5bdef5a0bbb9c5763b8c1b1e6fe04b7184cc5 /drivers/isdn/hardware/mISDN/avmfritz.c | |
parent | 37952cfa3afdfa5cec39d9d76e80bc3a0e6a910c (diff) |
mISDN: Reduce RX buffer allocation for transparent data
We did allways allocate maxsize buffers, but for transparent data we know
the actual size.
Use a common function to calculate size and detect overflows.
Signed-off-by: Karsten Keil <kkeil@linux-pingi.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/isdn/hardware/mISDN/avmfritz.c')
-rw-r--r-- | drivers/isdn/hardware/mISDN/avmfritz.c | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/drivers/isdn/hardware/mISDN/avmfritz.c b/drivers/isdn/hardware/mISDN/avmfritz.c index cc782646886c..808136735f32 100644 --- a/drivers/isdn/hardware/mISDN/avmfritz.c +++ b/drivers/isdn/hardware/mISDN/avmfritz.c | |||
@@ -404,21 +404,14 @@ hdlc_empty_fifo(struct bchannel *bch, int count) | |||
404 | u32 *ptr; | 404 | u32 *ptr; |
405 | u8 *p; | 405 | u8 *p; |
406 | u32 val, addr; | 406 | u32 val, addr; |
407 | int cnt = 0; | 407 | int cnt; |
408 | struct fritzcard *fc = bch->hw; | 408 | struct fritzcard *fc = bch->hw; |
409 | 409 | ||
410 | pr_debug("%s: %s %d\n", fc->name, __func__, count); | 410 | pr_debug("%s: %s %d\n", fc->name, __func__, count); |
411 | if (!bch->rx_skb) { | 411 | cnt = bchannel_get_rxbuf(bch, count); |
412 | bch->rx_skb = mI_alloc_skb(bch->maxlen, GFP_ATOMIC); | 412 | if (cnt < 0) { |
413 | if (!bch->rx_skb) { | 413 | pr_warning("%s.B%d: No bufferspace for %d bytes\n", |
414 | pr_info("%s: B receive out of memory\n", | 414 | fc->name, bch->nr, count); |
415 | fc->name); | ||
416 | return; | ||
417 | } | ||
418 | } | ||
419 | if ((bch->rx_skb->len + count) > bch->maxlen) { | ||
420 | pr_debug("%s: overrun %d\n", fc->name, | ||
421 | bch->rx_skb->len + count); | ||
422 | return; | 415 | return; |
423 | } | 416 | } |
424 | p = skb_put(bch->rx_skb, count); | 417 | p = skb_put(bch->rx_skb, count); |
@@ -430,6 +423,7 @@ hdlc_empty_fifo(struct bchannel *bch, int count) | |||
430 | addr = fc->addr + CHIP_WINDOW; | 423 | addr = fc->addr + CHIP_WINDOW; |
431 | outl(bch->nr == 2 ? AVM_HDLC_2 : AVM_HDLC_1, fc->addr); | 424 | outl(bch->nr == 2 ? AVM_HDLC_2 : AVM_HDLC_1, fc->addr); |
432 | } | 425 | } |
426 | cnt = 0; | ||
433 | while (cnt < count) { | 427 | while (cnt < count) { |
434 | val = le32_to_cpu(inl(addr)); | 428 | val = le32_to_cpu(inl(addr)); |
435 | put_unaligned(val, ptr); | 429 | put_unaligned(val, ptr); |