Hi Greg, here is the same thing for 2.4.

 speedtch.c |   42 +++++++++++++++++++++++++++---------------
 1 files changed, 27 insertions(+), 15 deletions(-)


diff -Nru a/drivers/usb/speedtch.c b/drivers/usb/speedtch.c
--- a/drivers/usb/speedtch.c    Tue Apr 13 12:32:18 2004
+++ b/drivers/usb/speedtch.c    Tue Apr 13 12:32:18 2004
@@ -298,6 +298,19 @@
 };
 
 
+/***********
+**  misc  **
+***********/
+
+static inline void udsl_pop (struct atm_vcc *vcc, struct sk_buff *skb)
+{
+       if (vcc->pop)
+               vcc->pop (vcc, skb);
+       else
+               dev_kfree_skb (skb);
+}
+
+
 /*************
 **  decode  **
 *************/
@@ -721,10 +734,7 @@
        if (!UDSL_SKB (skb)->num_cells) {
                struct atm_vcc *vcc = UDSL_SKB (skb)->atm_data.vcc;
 
-               if (vcc->pop)
-                       vcc->pop (vcc, skb);
-               else
-                       dev_kfree_skb (skb);
+               udsl_pop (vcc, skb);
                instance->current_skb = NULL;
 
                atomic_inc (&vcc->stats->tx);
@@ -743,10 +753,7 @@
                if (UDSL_SKB (skb)->atm_data.vcc == vcc) {
                        dbg ("udsl_cancel_send: popping skb 0x%p", skb);
                        __skb_unlink (skb, &instance->sndqueue);
-                       if (vcc->pop)
-                               vcc->pop (vcc, skb);
-                       else
-                               dev_kfree_skb (skb);
+                       udsl_pop (vcc, skb);
                }
        spin_unlock_irq (&instance->sndqueue.lock);
 
@@ -754,10 +761,7 @@
        if ((skb = instance->current_skb) && (UDSL_SKB (skb)->atm_data.vcc == vcc)) {
                dbg ("udsl_cancel_send: popping current skb (0x%p)", skb);
                instance->current_skb = NULL;
-               if (vcc->pop)
-                       vcc->pop (vcc, skb);
-               else
-                       dev_kfree_skb (skb);
+               udsl_pop (vcc, skb);
        }
        tasklet_enable (&instance->send_tasklet);
        dbg ("udsl_cancel_send done");
@@ -766,22 +770,26 @@
 static int udsl_atm_send (struct atm_vcc *vcc, struct sk_buff *skb)
 {
        struct udsl_instance_data *instance = vcc->dev->dev_data;
+       int err;
 
        vdbg ("udsl_atm_send called (skb 0x%p, len %u)", skb, skb->len);
 
        if (!instance || !instance->usb_dev) {
                dbg ("udsl_atm_send: NULL data!");
-               return -ENODEV;
+               err = -ENODEV;
+               goto fail;
        }
 
        if (vcc->qos.aal != ATM_AAL5) {
                dbg ("udsl_atm_send: unsupported ATM type %d!", vcc->qos.aal);
-               return -EINVAL;
+               err = -EINVAL;
+               goto fail;
        }
 
        if (skb->len > ATM_MAX_AAL5_PDU) {
                dbg ("udsl_atm_send: packet too long (%d vs %d)!", skb->len, 
ATM_MAX_AAL5_PDU);
-               return -EINVAL;
+               err = -EINVAL;
+               goto fail;
        }
 
        PACKETDEBUG (skb->data, skb->len);
@@ -791,6 +799,10 @@
        tasklet_schedule (&instance->send_tasklet);
 
        return 0;
+
+fail:
+       udsl_pop (vcc, skb);
+       return err;
 }
 
 


-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to