aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/isdn/hardware
diff options
context:
space:
mode:
authorKarsten Keil <kkeil@linux-pingi.de>2012-05-15 19:51:08 -0400
committerDavid S. Miller <davem@davemloft.net>2012-05-16 15:24:36 -0400
commitc27b46e7f1cbf3be95a4cf5840c76a7b7d54b26f (patch)
treedb406c5ceb174b3b41a0085929fe85c5e6951bb6 /drivers/isdn/hardware
parent6d1ee48fd0d8d2586aaeda24dacffc426c2be44a (diff)
mISDN: Implement MISDN_CTRL_RX_OFF for more drivers
MISDN_CTRL_RX_OFF is a meachanism to discard RX data in the driver if the data is not needed by the application. It can be used when playing mesages, but not recording or with unidirectional protocols. Signed-off-by: Karsten Keil <kkeil@linux-pingi.de> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/isdn/hardware')
-rw-r--r--drivers/isdn/hardware/mISDN/avmfritz.c25
-rw-r--r--drivers/isdn/hardware/mISDN/hfcmulti.c9
-rw-r--r--drivers/isdn/hardware/mISDN/hfcpci.c5
-rw-r--r--drivers/isdn/hardware/mISDN/hfcsusb.c5
-rw-r--r--drivers/isdn/hardware/mISDN/mISDNipac.c5
-rw-r--r--drivers/isdn/hardware/mISDN/mISDNisar.c5
-rw-r--r--drivers/isdn/hardware/mISDN/netjet.c4
-rw-r--r--drivers/isdn/hardware/mISDN/w6692.c5
8 files changed, 51 insertions, 12 deletions
diff --git a/drivers/isdn/hardware/mISDN/avmfritz.c b/drivers/isdn/hardware/mISDN/avmfritz.c
index c6fa505a1d1b..c08fc605e56b 100644
--- a/drivers/isdn/hardware/mISDN/avmfritz.c
+++ b/drivers/isdn/hardware/mISDN/avmfritz.c
@@ -408,13 +408,18 @@ hdlc_empty_fifo(struct bchannel *bch, int count)
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 cnt = bchannel_get_rxbuf(bch, count); 411 if (test_bit(FLG_RX_OFF, &bch->Flags)) {
412 if (cnt < 0) { 412 p = NULL;
413 pr_warning("%s.B%d: No bufferspace for %d bytes\n", 413 bch->dropcnt += count;
414 fc->name, bch->nr, count); 414 } else {
415 return; 415 cnt = bchannel_get_rxbuf(bch, count);
416 if (cnt < 0) {
417 pr_warning("%s.B%d: No bufferspace for %d bytes\n",
418 fc->name, bch->nr, count);
419 return;
420 }
421 p = skb_put(bch->rx_skb, count);
416 } 422 }
417 p = skb_put(bch->rx_skb, count);
418 ptr = (u32 *)p; 423 ptr = (u32 *)p;
419 if (fc->type == AVM_FRITZ_PCIV2) 424 if (fc->type == AVM_FRITZ_PCIV2)
420 addr = fc->addr + (bch->nr == 2 ? 425 addr = fc->addr + (bch->nr == 2 ?
@@ -426,11 +431,13 @@ hdlc_empty_fifo(struct bchannel *bch, int count)
426 cnt = 0; 431 cnt = 0;
427 while (cnt < count) { 432 while (cnt < count) {
428 val = le32_to_cpu(inl(addr)); 433 val = le32_to_cpu(inl(addr));
429 put_unaligned(val, ptr); 434 if (p) {
430 ptr++; 435 put_unaligned(val, ptr);
436 ptr++;
437 }
431 cnt += 4; 438 cnt += 4;
432 } 439 }
433 if (debug & DEBUG_HW_BFIFO) { 440 if (p && (debug & DEBUG_HW_BFIFO)) {
434 snprintf(fc->log, LOG_SIZE, "B%1d-recv %s %d ", 441 snprintf(fc->log, LOG_SIZE, "B%1d-recv %s %d ",
435 bch->nr, fc->name, count); 442 bch->nr, fc->name, count);
436 print_hex_dump_bytes(fc->log, DUMP_PREFIX_OFFSET, p, count); 443 print_hex_dump_bytes(fc->log, DUMP_PREFIX_OFFSET, p, count);
diff --git a/drivers/isdn/hardware/mISDN/hfcmulti.c b/drivers/isdn/hardware/mISDN/hfcmulti.c
index db9b04519829..5e402cf2e795 100644
--- a/drivers/isdn/hardware/mISDN/hfcmulti.c
+++ b/drivers/isdn/hardware/mISDN/hfcmulti.c
@@ -2224,8 +2224,11 @@ next_frame:
2224 HFC_wait_nodebug(hc); 2224 HFC_wait_nodebug(hc);
2225 2225
2226 /* ignore if rx is off BUT change fifo (above) to start pending TX */ 2226 /* ignore if rx is off BUT change fifo (above) to start pending TX */
2227 if (hc->chan[ch].rx_off) 2227 if (hc->chan[ch].rx_off) {
2228 if (bch)
2229 bch->dropcnt += poll; /* not exact but fair enough */
2228 return; 2230 return;
2231 }
2229 2232
2230 if (dch || test_bit(FLG_HDLC, &bch->Flags)) { 2233 if (dch || test_bit(FLG_HDLC, &bch->Flags)) {
2231 f1 = HFC_inb_nodebug(hc, A_F1); 2234 f1 = HFC_inb_nodebug(hc, A_F1);
@@ -3575,10 +3578,10 @@ channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)
3575 switch (cq->op) { 3578 switch (cq->op) {
3576 case MISDN_CTRL_GETOP: 3579 case MISDN_CTRL_GETOP:
3577 ret = mISDN_ctrl_bchannel(bch, cq); 3580 ret = mISDN_ctrl_bchannel(bch, cq);
3578 cq->op |= MISDN_CTRL_HFC_OP | MISDN_CTRL_HW_FEATURES_OP | 3581 cq->op |= MISDN_CTRL_HFC_OP | MISDN_CTRL_HW_FEATURES_OP;
3579 MISDN_CTRL_RX_OFF;
3580 break; 3582 break;
3581 case MISDN_CTRL_RX_OFF: /* turn off / on rx stream */ 3583 case MISDN_CTRL_RX_OFF: /* turn off / on rx stream */
3584 ret = mISDN_ctrl_bchannel(bch, cq);
3582 hc->chan[bch->slot].rx_off = !!cq->p1; 3585 hc->chan[bch->slot].rx_off = !!cq->p1;
3583 if (!hc->chan[bch->slot].rx_off) { 3586 if (!hc->chan[bch->slot].rx_off) {
3584 /* reset fifo on rx on */ 3587 /* reset fifo on rx on */
diff --git a/drivers/isdn/hardware/mISDN/hfcpci.c b/drivers/isdn/hardware/mISDN/hfcpci.c
index 1bd8bc7eb5c7..81363ffa5357 100644
--- a/drivers/isdn/hardware/mISDN/hfcpci.c
+++ b/drivers/isdn/hardware/mISDN/hfcpci.c
@@ -572,6 +572,11 @@ hfcpci_empty_fifo_trans(struct bchannel *bch, struct bzfifo *rxbz,
572 fcnt_tx = B_FIFO_SIZE - fcnt_tx; 572 fcnt_tx = B_FIFO_SIZE - fcnt_tx;
573 /* remaining bytes to send (bytes in tx-fifo) */ 573 /* remaining bytes to send (bytes in tx-fifo) */
574 574
575 if (test_bit(FLG_RX_OFF, &bch->Flags)) {
576 bch->dropcnt += fcnt_rx;
577 *z2r = cpu_to_le16(new_z2);
578 return;
579 }
575 maxlen = bchannel_get_rxbuf(bch, fcnt_rx); 580 maxlen = bchannel_get_rxbuf(bch, fcnt_rx);
576 if (maxlen < 0) { 581 if (maxlen < 0) {
577 pr_warning("B%d: No bufferspace for %d bytes\n", 582 pr_warning("B%d: No bufferspace for %d bytes\n",
diff --git a/drivers/isdn/hardware/mISDN/hfcsusb.c b/drivers/isdn/hardware/mISDN/hfcsusb.c
index b539b10d6f3e..83206e453d4e 100644
--- a/drivers/isdn/hardware/mISDN/hfcsusb.c
+++ b/drivers/isdn/hardware/mISDN/hfcsusb.c
@@ -842,6 +842,11 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
842 hdlc = 1; 842 hdlc = 1;
843 } 843 }
844 if (fifo->bch) { 844 if (fifo->bch) {
845 if (test_bit(FLG_RX_OFF, &fifo->bch->Flags)) {
846 fifo->bch->dropcnt += len;
847 spin_unlock(&hw->lock);
848 return;
849 }
845 maxlen = bchannel_get_rxbuf(fifo->bch, len); 850 maxlen = bchannel_get_rxbuf(fifo->bch, len);
846 rx_skb = fifo->bch->rx_skb; 851 rx_skb = fifo->bch->rx_skb;
847 if (maxlen < 0) { 852 if (maxlen < 0) {
diff --git a/drivers/isdn/hardware/mISDN/mISDNipac.c b/drivers/isdn/hardware/mISDN/mISDNipac.c
index 374a17751ffb..752e0825591f 100644
--- a/drivers/isdn/hardware/mISDN/mISDNipac.c
+++ b/drivers/isdn/hardware/mISDN/mISDNipac.c
@@ -936,6 +936,11 @@ hscx_empty_fifo(struct hscx_hw *hscx, u8 count)
936 int maxlen; 936 int maxlen;
937 937
938 pr_debug("%s: B%1d %d\n", hscx->ip->name, hscx->bch.nr, count); 938 pr_debug("%s: B%1d %d\n", hscx->ip->name, hscx->bch.nr, count);
939 if (test_bit(FLG_RX_OFF, &hscx->bch.Flags)) {
940 hscx->bch.dropcnt += count;
941 hscx_cmdr(hscx, 0x80); /* RMC */
942 return;
943 }
939 maxlen = bchannel_get_rxbuf(&hscx->bch, count); 944 maxlen = bchannel_get_rxbuf(&hscx->bch, count);
940 if (maxlen < 0) { 945 if (maxlen < 0) {
941 hscx_cmdr(hscx, 0x80); /* RMC */ 946 hscx_cmdr(hscx, 0x80); /* RMC */
diff --git a/drivers/isdn/hardware/mISDN/mISDNisar.c b/drivers/isdn/hardware/mISDN/mISDNisar.c
index 901be3257a7b..be5973ded6d6 100644
--- a/drivers/isdn/hardware/mISDN/mISDNisar.c
+++ b/drivers/isdn/hardware/mISDN/mISDNisar.c
@@ -429,6 +429,11 @@ isar_rcv_frame(struct isar_ch *ch)
429 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0); 429 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
430 return; 430 return;
431 } 431 }
432 if (test_bit(FLG_RX_OFF, &ch->bch.Flags)) {
433 ch->bch.dropcnt += ch->is->clsb;
434 ch->is->write_reg(ch->is->hw, ISAR_IIA, 0);
435 return;
436 }
432 switch (ch->bch.state) { 437 switch (ch->bch.state) {
433 case ISDN_P_NONE: 438 case ISDN_P_NONE:
434 pr_debug("%s: ISAR protocol 0 spurious IIS_RDATA %x/%x/%x\n", 439 pr_debug("%s: ISAR protocol 0 spurious IIS_RDATA %x/%x/%x\n",
diff --git a/drivers/isdn/hardware/mISDN/netjet.c b/drivers/isdn/hardware/mISDN/netjet.c
index aa95cc7d32f9..c3e3e7686273 100644
--- a/drivers/isdn/hardware/mISDN/netjet.c
+++ b/drivers/isdn/hardware/mISDN/netjet.c
@@ -386,6 +386,10 @@ read_dma(struct tiger_ch *bc, u32 idx, int cnt)
386 bc->bch.nr, idx); 386 bc->bch.nr, idx);
387 } 387 }
388 bc->lastrx = idx; 388 bc->lastrx = idx;
389 if (test_bit(FLG_RX_OFF, &bc->bch.Flags)) {
390 bc->bch.dropcnt += cnt;
391 return;
392 }
389 stat = bchannel_get_rxbuf(&bc->bch, cnt); 393 stat = bchannel_get_rxbuf(&bc->bch, cnt);
390 /* only transparent use the count here, HDLC overun is detected later */ 394 /* only transparent use the count here, HDLC overun is detected later */
391 if (stat == ENOMEM) { 395 if (stat == ENOMEM) {
diff --git a/drivers/isdn/hardware/mISDN/w6692.c b/drivers/isdn/hardware/mISDN/w6692.c
index 183181f01927..26a86b846099 100644
--- a/drivers/isdn/hardware/mISDN/w6692.c
+++ b/drivers/isdn/hardware/mISDN/w6692.c
@@ -475,6 +475,11 @@ W6692_empty_Bfifo(struct w6692_ch *wch, int count)
475 skb_trim(wch->bch.rx_skb, 0); 475 skb_trim(wch->bch.rx_skb, 0);
476 return; 476 return;
477 } 477 }
478 if (test_bit(FLG_RX_OFF, &wch->bch.Flags)) {
479 wch->bch.dropcnt += count;
480 WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK | W_B_CMDR_RACT);
481 return;
482 }
478 maxlen = bchannel_get_rxbuf(&wch->bch, count); 483 maxlen = bchannel_get_rxbuf(&wch->bch, count);
479 if (maxlen < 0) { 484 if (maxlen < 0) {
480 WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK | W_B_CMDR_RACT); 485 WriteW6692B(wch, W_B_CMDR, W_B_CMDR_RACK | W_B_CMDR_RACT);