]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/isdn/mISDN/hwchannel.c
mISDN: Add E-Channel logging features
[linux-2.6-omap-h63xx.git] / drivers / isdn / mISDN / hwchannel.c
index 2596fba4e6145b61e3c442ea483bcd0483ecba41..ab1168a110ae96104c7db2ea8ea12ae214d83fe1 100644 (file)
@@ -50,9 +50,6 @@ bchannel_bh(struct work_struct *ws)
 
        if (test_and_clear_bit(FLG_RECVQUEUE, &bch->Flags)) {
                while ((skb = skb_dequeue(&bch->rqueue))) {
-                       if (bch->rcount >= 64)
-                               printk(KERN_WARNING "B-channel %p receive "
-                                       "queue if full, but empties...\n", bch);
                        bch->rcount--;
                        if (likely(bch->ch.peer)) {
                                err = bch->ch.recv(bch->ch.peer, skb);
@@ -168,6 +165,25 @@ recv_Dchannel(struct dchannel *dch)
 }
 EXPORT_SYMBOL(recv_Dchannel);
 
+void
+recv_Echannel(struct dchannel *ech, struct dchannel *dch)
+{
+       struct mISDNhead *hh;
+
+       if (ech->rx_skb->len < 2) { /* at least 2 for sapi / tei */
+               dev_kfree_skb(ech->rx_skb);
+               ech->rx_skb = NULL;
+               return;
+       }
+       hh = mISDN_HEAD_P(ech->rx_skb);
+       hh->prim = PH_DATA_E_IND;
+       hh->id = get_sapi_tei(ech->rx_skb->data);
+       skb_queue_tail(&dch->rqueue, ech->rx_skb);
+       ech->rx_skb = NULL;
+       schedule_event(dch, FLG_RECVQUEUE);
+}
+EXPORT_SYMBOL(recv_Echannel);
+
 void
 recv_Bchannel(struct bchannel *bch)
 {
@@ -177,8 +193,10 @@ recv_Bchannel(struct bchannel *bch)
        hh->prim = PH_DATA_IND;
        hh->id = MISDN_ID_ANY;
        if (bch->rcount >= 64) {
-               dev_kfree_skb(bch->rx_skb);
-               bch->rx_skb = NULL;
+               printk(KERN_WARNING "B-channel %p receive queue overflow, "
+                       "fushing!\n", bch);
+               skb_queue_purge(&bch->rqueue);
+               bch->rcount = 0;
                return;
        }
        bch->rcount++;
@@ -200,8 +218,10 @@ void
 recv_Bchannel_skb(struct bchannel *bch, struct sk_buff *skb)
 {
        if (bch->rcount >= 64) {
-               dev_kfree_skb(skb);
-               return;
+               printk(KERN_WARNING "B-channel %p receive queue overflow, "
+                       "fushing!\n", bch);
+               skb_queue_purge(&bch->rqueue);
+               bch->rcount = 0;
        }
        bch->rcount++;
        skb_queue_tail(&bch->rqueue, skb);
@@ -245,8 +265,12 @@ confirm_Bsend(struct bchannel *bch)
 {
        struct sk_buff  *skb;
 
-       if (bch->rcount >= 64)
-               return;
+       if (bch->rcount >= 64) {
+               printk(KERN_WARNING "B-channel %p receive queue overflow, "
+                       "fushing!\n", bch);
+               skb_queue_purge(&bch->rqueue);
+               bch->rcount = 0;
+       }
        skb = _alloc_mISDN_skb(PH_DATA_CNF, mISDN_HEAD_ID(bch->tx_skb),
            0, NULL, GFP_ATOMIC);
        if (!skb) {