Hi Greg,

will you please use this pegasus.c.diff instead of the previous
one...  another memory leak was found by Oliver.
It is funny how such a small driver can leak so much :-)


                Petko


Petko Manolov wrote:

>     Hi Greg,
> 
> two things this time:
>     - suppress string concatenate with __FUNCTION__ macro warning
>     (gcc-3.0.3 and above);
>     - 2 vendors (Compaq and Hawking) and 3 more devices added;
> 
> the patch is against 2.5.3.

--- linux-2.5.3/drivers/usb/pegasus.c.orig      Fri Feb  1 15:02:38 2002
+++ linux-2.5.3/drivers/usb/pegasus.c   Fri Feb  1 15:58:48 2002
@@ -53,7 +53,7 @@
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v0.4.22 (2001/12/07)"
+#define DRIVER_VERSION "v0.4.23 (2002/02/01)"
 #define DRIVER_AUTHOR "Petko Manolov <[EMAIL PROTECTED]>"
 #define DRIVER_DESC "Pegasus/Pegasus II USB Ethernet driver"
 
@@ -115,7 +115,7 @@
                case -ENOENT:
                        break;
                default:
-                       warn( __FUNCTION__ " status %d", urb->status);
+                       warn("%s: status %d", __FUNCTION__, urb->status);
        }
        pegasus->flags &= ~ETH_REGS_CHANGED;
        wake_up(&pegasus->ctrl_wait );
@@ -158,7 +158,7 @@
        set_current_state( TASK_UNINTERRUPTIBLE );
 
        if ( (ret = usb_submit_urb( pegasus->ctrl_urb )) ) {
-               err( __FUNCTION__ " BAD CTRLs %d", ret);
+               err("%s: BAD CTRLs %d", __FUNCTION__, ret);
                goto out;
        }
 
@@ -208,7 +208,7 @@
        set_current_state( TASK_UNINTERRUPTIBLE );
 
        if ( (ret = usb_submit_urb( pegasus->ctrl_urb )) ) {
-               err( __FUNCTION__ " BAD CTRL %d", ret);
+               err("%s: BAD CTRL %d", __FUNCTION__, ret);
                goto out;
        }
        
@@ -258,7 +258,7 @@
        set_current_state( TASK_UNINTERRUPTIBLE );
 
        if ( (ret = usb_submit_urb( pegasus->ctrl_urb )) ) {
-               err( __FUNCTION__ " BAD CTRL %d", ret);
+               err("%s: BAD CTRL %d", __FUNCTION__, ret);
                goto out;
        }
 
@@ -288,7 +288,7 @@
                          pegasus->eth_regs, 3, ctrl_callback, pegasus );
 
        if ( (ret = usb_submit_urb( pegasus->ctrl_urb )) )
-               err( __FUNCTION__ " BAD CTRL %d, flags %x",ret,pegasus->flags );
+               err("%s: BAD CTRL %d, flgs %x",__FUNCTION__,ret,pegasus->flags);
 
        return  ret;
 }
@@ -313,7 +313,7 @@
                *regd = le16_to_cpu(regdi);
                return  0;
        }
-       warn( __FUNCTION__ " failed" );
+       warn("%s: failed", __FUNCTION__);
        
        return 1;
 }
@@ -335,7 +335,7 @@
        }
        if ( i < REG_TIMEOUT )
                return  0;
-       warn( __FUNCTION__ " failed" );
+       warn("%s: failed", __FUNCTION__);
 
        return 1;
 }
@@ -361,7 +361,7 @@
                *retdata = le16_to_cpu (retdatai);
                return  0;
        }
-       warn( __FUNCTION__ " failed" );
+       warn("%s: failed", __FUNCTION__);
 
        return -1;
 }
@@ -405,7 +405,7 @@
        disable_eprom_write( pegasus );
        if ( i < REG_TIMEOUT )
                return  0;
-       warn( __FUNCTION__ " failed" );
+       warn("%s: failed", __FUNCTION__);
        return  -1;
 }
 #endif /* PEGASUS_WRITE_EEPROM */
@@ -574,7 +574,7 @@
                        pegasus->rx_buff, PEGASUS_MAX_MTU, 
                        read_bulk_callback, pegasus );
        if ( (res = usb_submit_urb(pegasus->rx_urb)) )
-               warn( __FUNCTION__ " failed submint rx_urb %d", res);
+               warn("%s: failed submint rx_urb %d", __FUNCTION__, res);
        pegasus->flags &= ~PEGASUS_RX_BUSY;
 }
 
@@ -722,14 +722,14 @@
                        pegasus->rx_buff, PEGASUS_MAX_MTU, 
                        read_bulk_callback, pegasus );
        if ( (res = usb_submit_urb(pegasus->rx_urb)) )
-               warn( __FUNCTION__ " failed rx_urb %d", res );
+               warn("%s: failed rx_urb %d", __FUNCTION__, res);
 #ifdef PEGASUS_USE_INTR
        FILL_INT_URB( pegasus->intr_urb, pegasus->usb,
                        usb_rcvintpipe(pegasus->usb, 3),
                        pegasus->intr_buff, sizeof(pegasus->intr_buff),
                        intr_callback, pegasus, pegasus->intr_interval );
        if ( (res = usb_submit_urb(pegasus->intr_urb)) )
-               warn( __FUNCTION__ " failed intr_urb %d", res);
+               warn("%s: failed intr_urb %d", __FUNCTION__, res);
 #endif
        netif_start_queue( net );
        pegasus->flags |= PEGASUS_RUNNING;
@@ -885,6 +885,9 @@
 
        net = init_etherdev( NULL, 0 );
        if ( !net ) {
+               usb_free_urb (pegasus->tx_urb);
+               usb_free_urb (pegasus->rx_urb);
+               usb_free_urb (pegasus->ctrl_urb);
                kfree( pegasus );
                return  NULL;
        }
@@ -910,6 +913,9 @@
        if ( reset_mac(pegasus) ) {
                err("can't reset MAC");
                unregister_netdev( pegasus->net );
+               usb_free_urb (pegasus->tx_urb);
+               usb_free_urb (pegasus->rx_urb);
+               usb_free_urb (pegasus->ctrl_urb);
                kfree(pegasus->net);
                kfree(pegasus);
                pegasus = NULL;
@@ -947,10 +953,14 @@
        pegasus->flags |= PEGASUS_UNPLUG;
        unregister_netdev( pegasus->net );
        usb_dec_dev_use( dev );
-       usb_free_urb (pegasus->intr_urb);
-       usb_free_urb (pegasus->tx_urb);
-       usb_free_urb (pegasus->rx_urb);
-       usb_free_urb (pegasus->ctrl_urb);
+       usb_unlink_urb(pegasus->intr_urb);
+       usb_unlink_urb(pegasus->tx_urb);
+       usb_unlink_urb(pegasus->rx_urb);
+       usb_unlink_urb(pegasus->ctrl_urb);
+       usb_free_urb(pegasus->intr_urb);
+       usb_free_urb(pegasus->tx_urb);
+       usb_free_urb(pegasus->rx_urb);
+       usb_free_urb(pegasus->ctrl_urb);
        kfree( pegasus->net );
        kfree( pegasus );
        pegasus = NULL;

Reply via email to