# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.563   -> 1.564  
#	drivers/usb/pegasus.c	1.20    -> 1.21   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/03/26	petkan@mastika.lnxw.com	1.564
# USB pegasus driver
# 
# semaphore cleanup and proper link detection
# --------------------------------------------
#
diff -Nru a/drivers/usb/pegasus.c b/drivers/usb/pegasus.c
--- a/drivers/usb/pegasus.c	Wed Apr  3 16:39:34 2002
+++ b/drivers/usb/pegasus.c	Wed Apr  3 16:39:34 2002
@@ -71,7 +71,6 @@
 static int loopback = 0;
 static int mii_mode = 0;
 static int multicast_filter_limit = 32;
-static DECLARE_MUTEX(gsem);
 
 static struct usb_eth_dev usb_dev_id[] = {
 #define	PEGASUS_DEV(pn, vid, pid, flags)	\
@@ -488,10 +487,10 @@
 	pegasus_t *pegasus = dev->priv;
 
 
-	if ( read_mii_word(pegasus, pegasus->phy, MII_BMSR, &bmsr) ) 
-		return 1;
-	if ( !(bmsr & 0x20) && !loopback ) 
-		warn( "%s: link NOT established (0x%x) - check the cable.",
+	read_mii_word(pegasus, pegasus->phy, MII_BMSR, &bmsr);
+	read_mii_word(pegasus, pegasus->phy, MII_BMSR, &bmsr);
+	if ( !(bmsr & 4) && !loopback )
+		warn( "%s: link NOT established (%04x) - check the cable.",
 			dev->name, bmsr );
 	if ( read_mii_word(pegasus, pegasus->phy, MII_LPA, &linkpart) )
 		return 2;
@@ -970,10 +969,9 @@
 		err("usb_set_configuration() failed");
 		return NULL;
 	}
-	down(&gsem);
 	if(!(pegasus = kmalloc(sizeof(struct pegasus), GFP_KERNEL))) {
 		err("out of memory allocating device structure");
-		goto exit;
+		return NULL;
 	}
 
 	usb_inc_dev_use( dev );
@@ -984,23 +982,20 @@
 	pegasus->ctrl_urb = usb_alloc_urb(0, GFP_KERNEL);
 	if (!pegasus->ctrl_urb) {
 		kfree (pegasus);
-		pegasus = NULL;
-		goto exit;
+		return NULL;
 	}
 	pegasus->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
 	if (!pegasus->rx_urb) {
 		usb_free_urb (pegasus->ctrl_urb);
 		kfree (pegasus);
-		pegasus = NULL;
-		goto exit;
+		return NULL;
 	}
 	pegasus->tx_urb = usb_alloc_urb(0, GFP_KERNEL);
 	if (!pegasus->tx_urb) {
 		usb_free_urb (pegasus->rx_urb);
 		usb_free_urb (pegasus->ctrl_urb);
 		kfree (pegasus);
-		pegasus = NULL;
-		goto exit;
+		return NULL;
 	}
 	pegasus->intr_urb = usb_alloc_urb(0, GFP_KERNEL);
 	if (!pegasus->intr_urb) {
@@ -1008,8 +1003,7 @@
 		usb_free_urb (pegasus->rx_urb);
 		usb_free_urb (pegasus->ctrl_urb);
 		kfree (pegasus);
-		pegasus = NULL;
-		goto exit;
+		return NULL;
 	}
 
 	net = init_etherdev( NULL, 0 );
@@ -1018,11 +1012,11 @@
 		usb_free_urb (pegasus->rx_urb);
 		usb_free_urb (pegasus->ctrl_urb);
 		kfree( pegasus );
-		pegasus = NULL;
-		goto exit;
+		return NULL;
 	}
 
 	init_MUTEX(&pegasus->sem);
+	down(&pegasus->sem);
 	pegasus->usb = dev;
 	pegasus->net = net;
 	SET_MODULE_OWNER(net);
@@ -1068,7 +1062,7 @@
 		pegasus->phy = 1;
 	}
 exit:
-	up(&gsem);
+	up(&pegasus->sem);
 	return pegasus;
 }
 
