# 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.538   -> 1.539  
#	drivers/usb/net/rtl8150.c	1.6     -> 1.7    
#	drivers/usb/net/pegasus.c	1.24    -> 1.25   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/04/22	petkan@mastika.lnxw.com	1.539
# USB pegasus and rtl8150
# 
# Rx tasklet cleanups for both pegasus and rtl8150
# --------------------------------------------
#
diff -Nru a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c
--- a/drivers/usb/net/pegasus.c	Mon Apr 22 14:28:15 2002
+++ b/drivers/usb/net/pegasus.c	Mon Apr 22 14:28:15 2002
@@ -469,20 +469,11 @@
 
 static int enable_net_traffic(struct net_device *dev, struct usb_device *usb)
 {
-	__u16 linkpart, bmsr;
+	__u16 linkpart;
 	__u8 data[4];
 	pegasus_t *pegasus = dev->priv;
 
-	read_mii_word(pegasus, pegasus->phy, MII_BMSR, &bmsr);
-	read_mii_word(pegasus, pegasus->phy, MII_BMSR, &bmsr);
-	if (!(bmsr & BMSR_LSTATUS) && !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;
-	if (!(linkpart & 1))
-		warn("link partner stat %x", linkpart);
-
+	read_mii_word(pegasus, pegasus->phy, MII_LPA, &linkpart);
 	data[0] = 0xc9;
 	data[1] = 0;
 	if (linkpart & (ADVERTISE_100FULL | ADVERTISE_10FULL))
@@ -529,6 +520,8 @@
 		dbg("reset MAC");
 		pegasus->flags &= ~PEGASUS_RX_BUSY;
 		break;
+	case -ENOENT:
+		return;
 	default:
 		dbg("%s: RX status %d", net->name, urb->status);
 		goto goon;
@@ -551,10 +544,8 @@
 	}
 	pkt_len = (rx_status & 0xfff) - 8;
 
-	tasklet_schedule(&pegasus->rx_tl);
-
 	if (!pegasus->rx_skb)
-		return;
+		goto tl_sched;
 
 	skb_put(pegasus->rx_skb, pkt_len);
 	pegasus->rx_skb->protocol = eth_type_trans(pegasus->rx_skb, net);
@@ -562,7 +553,7 @@
 
 	if (!(skb = dev_alloc_skb(PEGASUS_MTU + 2))) {
 		pegasus->rx_skb = NULL;
-		return;
+		goto tl_sched;
 	}
 	
 	skb->dev = net;
@@ -575,10 +566,17 @@
 		      usb_rcvbulkpipe(pegasus->usb, 1),
 		      pegasus->rx_skb->data, PEGASUS_MTU + 8,
 		      read_bulk_callback, pegasus);
-	if (usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC))
+	if (usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC)) {
 		pegasus->flags |= PEGASUS_RX_URB_FAIL;
-	else
+		goto tl_sched;
+	} else {
 		pegasus->flags &= ~PEGASUS_RX_URB_FAIL;
+	}
+	
+	return;
+	
+tl_sched:
+	tasklet_schedule(&pegasus->rx_tl);
 }
 
 static void rx_fixup(unsigned long data)
@@ -587,11 +585,10 @@
 
 	pegasus = (pegasus_t *)data;
 
-	if (pegasus->flags & PEGASUS_RX_URB_FAIL) {
-		goto try_again;
-	}
-	if (pegasus->rx_skb)
-		return;
+	if (pegasus->flags & PEGASUS_RX_URB_FAIL)
+		if (pegasus->rx_skb)
+			goto try_again;
+
 	if (!(pegasus->rx_skb = dev_alloc_skb(PEGASUS_MTU + 2))) {
 		tasklet_schedule(&pegasus->rx_tl);
 		return;
@@ -655,8 +652,12 @@
 			pegasus->stats.tx_aborted_errors++;
 		if (d[0] & LATE_COL)
 			pegasus->stats.tx_window_errors++;
-		if (d[0] & (NO_CARRIER | LOSS_CARRIER))
+		if (d[0] & (NO_CARRIER | LOSS_CARRIER)) {
 			pegasus->stats.tx_carrier_errors++;
+			netif_carrier_off(net);
+		} else {
+			netif_carrier_on(net);
+		}
 	}
 }
 #endif
diff -Nru a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c
--- a/drivers/usb/net/rtl8150.c	Mon Apr 22 14:28:15 2002
+++ b/drivers/usb/net/rtl8150.c	Mon Apr 22 14:28:15 2002
@@ -309,7 +309,7 @@
 	case 0:
 		break;
 	case -ENOENT:
-		return;	/* urb's in unlink state */
+		return;	/* the urb is in unlink state */
 	case -ETIMEDOUT:
 		warn("reset needed may be?..");
 		goto goon;
@@ -318,12 +318,8 @@
 		goto goon;
 	}
 
-	tasklet_schedule(&dev->tl);
-
-	if (!dev->rx_skb) {
-		/* lost packets++ */
-		return;
-	}
+	if (!dev->rx_skb)
+		goto resched;
 
 	res = urb->actual_length;
 	rx_stat = le16_to_cpu(*(short *)(urb->transfer_buffer + res - 4));
@@ -336,10 +332,8 @@
 	dev->stats.rx_bytes += pkt_len;
 	
 	skb = pull_skb(dev);
-	if (!skb) {
-		dev->rx_skb = NULL;
-		return;
-	}
+	if (!skb)
+		goto resched;
 
 	skb->dev = netdev;
 	skb_reserve(skb, 2);
@@ -347,10 +341,16 @@
 goon:
 	FILL_BULK_URB(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1),
 		      dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev);
-	if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC))
+	if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) {
 		set_bit(RX_URB_FAIL, &dev->flags);
-	else
+		goto resched;
+	} else {
 		clear_bit(RX_URB_FAIL, &dev->flags);
+	}
+
+	return;
+resched:
+	tasklet_schedule(&dev->tl);
 }
 
 static void rx_fixup(unsigned long data)
@@ -362,22 +362,24 @@
 
 	fill_skb_pool(dev);
 	if (test_bit(RX_URB_FAIL, &dev->flags))
-		goto try_again;
-	if (dev->rx_skb)
-		return;
-	if (!(skb = pull_skb(dev))) {
-		tasklet_schedule(&dev->tl);
-		return;
-	}
+		if (dev->rx_skb)
+			goto try_again;
+	if (!(skb = pull_skb(dev)))
+		goto tlsched;
 	dev->rx_skb = skb;
 	FILL_BULK_URB(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1),
 		      dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev);
 try_again:
 	if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) {
 		set_bit(RX_URB_FAIL, &dev->flags);
-		tasklet_schedule(&dev->tl);
-	 } else
+		goto tlsched;
+	 } else {
 		clear_bit(RX_URB_FAIL, &dev->flags);
+	}
+
+	return;
+tlsched:
+	tasklet_schedule(&dev->tl);
 }
 
 static void write_bulk_callback(struct urb *urb)
