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;