Index: linux-2.6.15-rc2/drivers/usb/gadget/ether.c
===================================================================
--- linux-2.6.15-rc2.orig/drivers/usb/gadget/ether.c	2005-11-20 03:25:03.000000000 +0000
+++ linux-2.6.15-rc2/drivers/usb/gadget/ether.c	2006-01-02 01:31:42.000000000 +0000
@@ -984,21 +984,21 @@
 	 * a side effect of setting a packet filter.  Deactivation is
 	 * from REMOTE_NDIS_HALT_MSG, reset from REMOTE_NDIS_RESET_MSG.
 	 */
-	if (!cdc_active(dev)) {
-		result = usb_ep_enable (dev->in_ep, dev->in);
-		if (result != 0) {
-			DEBUG(dev, "enable %s --> %d\n", 
-				dev->in_ep->name, result);
-			goto done;
-		}
-
-		result = usb_ep_enable (dev->out_ep, dev->out);
-		if (result != 0) {
-			DEBUG (dev, "enable %s --> %d\n", 
-				dev->in_ep->name, result);
-			goto done;
-		}
-	}
+//	if (!cdc_active(dev)) {
+//		result = usb_ep_enable (dev->in_ep, dev->in);
+//		if (result != 0) {
+//			DEBUG(dev, "enable %s --> %d\n",
+//				dev->in_ep->name, result);
+//			goto done;
+//		}
+//
+//		result = usb_ep_enable (dev->out_ep, dev->out);
+//		if (result != 0) {
+//			DEBUG (dev, "enable %s --> %d\n",
+//				dev->in_ep->name, result);
+//			goto done;
+//		}
+//	}
 
 done:
 	if (result == 0)
@@ -1013,19 +1013,19 @@
 		(void) usb_ep_disable (dev->out_ep);
 		dev->in = NULL;
 		dev->out = NULL;
-	} else
+	} //else
 
 	/* activate non-CDC configs right away
 	 * this isn't strictly according to the RNDIS spec
 	 */
-	if (!cdc_active (dev)) {
-		netif_carrier_on (dev->net);
-		if (netif_running (dev->net)) {
-			spin_unlock (&dev->lock);
-			eth_start (dev, GFP_ATOMIC);
-			spin_lock (&dev->lock);
-		}
-	}
+//	if (!cdc_active (dev)) {
+//		netif_carrier_on (dev->net);
+//		if (netif_running (dev->net)) {
+//			spin_unlock (&dev->lock);
+//			eth_start (dev, GFP_ATOMIC);
+//			spin_lock (&dev->lock);
+//		}
+//	}
 
 	if (result == 0)
 		DEBUG (dev, "qlen %d\n", qlen (gadget));
@@ -1365,6 +1365,26 @@
 			goto done_set_intf;
 		}
 
+#ifdef CONFIG_USB_ETH_RNDIS
+		if (!cdc_active(dev) && wIndex == 1) {
+			usb_ep_disable (dev->in_ep);
+			usb_ep_disable (dev->out_ep);
+			if(wValue == 1) {
+				usb_ep_enable (dev->in_ep, dev->in);
+				usb_ep_enable (dev->out_ep, dev->out);
+				netif_carrier_on (dev->net);
+				if (netif_running (dev->net)) {
+					spin_unlock (&dev->lock);
+					eth_start (dev, GFP_ATOMIC);
+					spin_lock (&dev->lock);
+				}
+			} else {
+				netif_stop_queue (dev->net);
+				netif_carrier_off (dev->net);
+			}
+		}
+#endif
+
 #ifdef DEV_CONFIG_CDC
 		switch (wIndex) {
 		case 0:		/* control/master intf */
@@ -1970,6 +1990,8 @@
 {
 	struct eth_dev          *dev = ep->driver_data;
 
+	DEBUG (dev, "rndis control ack complete --> %d, %d/%d\n", req->status, req->actual, req->length);
+
 	if (req->status || req->actual != req->length)
 		DEBUG (dev,
 			"rndis control ack complete --> %d, %d/%d\n",
@@ -2002,6 +2024,8 @@
 	/* Send RNDIS RESPONSE_AVAILABLE notification;
 	 * USB_CDC_NOTIFY_RESPONSE_AVAILABLE should work too
 	 */
+
+	printk("Sending RNDIS RESPONSE_AVAILABLE notification\n");
 	resp->length = 8;
 	resp->complete = rndis_control_ack_complete;
 	resp->context = dev;
