--- linux/drivers/net/eepro100.c.pre13	Thu Mar  9 14:10:39 2000
+++ linux/drivers/net/eepro100.c	Thu Mar 16 15:23:05 2000
@@ -1014,7 +1014,7 @@ speedo_open(struct net_device *dev)
 		sp->advertising = mdio_read(ioaddr, sp->phy[0] & 0x1f, 4);
 
 	if (speedo_debug > 2) {
-		printk(KERN_DEBUG "%s: Done speedo_open(), status %8.8x.\n",
+		printk(KERN_DEBUG "%s: Done speedo_open(), status %4.4x.\n",
 			   dev->name, inw(ioaddr + SCBStatus));
 	}
 
@@ -1189,6 +1189,7 @@ speedo_init_rx_ring(struct net_device *d
 	int i;
 
 	sp->cur_rx = 0;
+	sp->rx_ring_state = 0;
 
 	for (i = 0; i < RX_RING_SIZE; i++) {
 		struct sk_buff *skb;
@@ -1487,13 +1488,13 @@ static void speedo_interrupt(int irq, vo
 	do {
 		status = inw(ioaddr + SCBStatus);
 		/* Acknowledge all of the current interrupt sources ASAP. */
-		outw(status & 0xfc00, ioaddr + SCBStatus);
+		outw(status & 0xfd00, ioaddr + SCBStatus);
 
 		if (speedo_debug > 4)
 			printk(KERN_DEBUG "%s: interrupt  status=%#4.4x.\n",
 				   dev->name, status);
 
-		if ((status & 0xfc00) == 0)
+		if ((status & 0xfd00) == 0)
 			break;
 
 		/* Always check if all rx buffers are allocated.  --SAW */
@@ -1508,8 +1509,9 @@ static void speedo_interrupt(int irq, vo
 			spin_lock(&sp->lock);
 			if ((status & 0x003c) == 0x0028) {		/* No more Rx buffers. */
 				struct RxFD *rxf;
-				printk(KERN_WARNING "%s: card reports no RX buffers.\n",
-						dev->name);
+				printk(KERN_WARNING "%s: card reports no RX buffers, status=%#4.4x, flow control=%s.\n",
+						dev->name, status,
+						sp->flow_ctrl ? "on" : "off");
 				rxf = sp->rx_ringp[sp->cur_rx % RX_RING_SIZE];
 				if (rxf == NULL) {
 					if (speedo_debug > 2)
@@ -1527,8 +1529,9 @@ static void speedo_interrupt(int irq, vo
 					outb(RxResumeNoResources, ioaddr + SCBCmd);
 			} else if ((status & 0x003c) == 0x0008) { /* No resources. */
 				struct RxFD *rxf;
-				printk(KERN_WARNING "%s: card reports no resources.\n",
-						dev->name);
+				printk(KERN_WARNING "%s: card reports no resources, status=%#4.4x, flow control=%s.\n",
+						dev->name, status,
+						sp->flow_ctrl ? "on" : "off");
 				rxf = sp->rx_ringp[sp->cur_rx % RX_RING_SIZE];
 				if (rxf == NULL) {
 					if (speedo_debug > 2)
@@ -1586,7 +1589,7 @@ static void speedo_interrupt(int irq, vo
 			printk(KERN_ERR "%s: Too much work at interrupt, status=0x%4.4x.\n",
 				   dev->name, status);
 			/* Clear all interrupt sources. */
-			outl(0xfc00, ioaddr + SCBStatus);
+			outw(0xfd00, ioaddr + SCBStatus);
 			break;
 		}
 	} while (1);
@@ -1987,7 +1990,16 @@ static void set_rx_mode(struct net_devic
 		config_cmd_data[4] = rxdmacount;
 		config_cmd_data[5] = txdmacount + 0x80;
 		config_cmd_data[15] |= (new_rx_mode & 2) ? 1 : 0;
-		config_cmd_data[19] = sp->flow_ctrl ? 0xBD : 0x80;
+		if (sp->flow_ctrl) {
+			config_cmd_data[16] = 0x1f;
+			config_cmd_data[17] = 0x01;
+			config_cmd_data[19] = 0xb8;
+		}
+		else {
+			config_cmd_data[16] = 0;
+			config_cmd_data[17] = 0x40;
+			config_cmd_data[19] = 0x84;
+		}
 		config_cmd_data[19] |= sp->full_duplex ? 0x40 : 0;
 		config_cmd_data[21] = (new_rx_mode & 1) ? 0x0D : 0x05;
 		if (sp->phy[0] & 0x8000) {			/* Use the AUI port instead. */
