diff --git a/linux-2.6.29/drivers/usb/gadget/adb_ums_acm_mtp_rndis.c b/linux-2.6.29/drivers/usb/gadget/adb_ums_acm_mtp_rndis.c
--- a/linux-2.6.29/drivers/usb/gadget/adb_ums_acm_mtp_rndis.c
+++ b/linux-2.6.29/drivers/usb/gadget/adb_ums_acm_mtp_rndis.c
@@ -609,6 +609,7 @@
 int ums_mount_status = 0;
 int askonstatus = 0;
 static int prev_status_before_adb;  // previous USB setting before using ADB
+static int prev_status_before_rndis;  // previous USB setting before using RNDIS
 static int prev_enable_status;  // previous USB setting
 extern int usb_on;
 
@@ -688,6 +689,13 @@
 				prev_enable_status = prev_status_before_adb = 0; //reset
 				goto recheck;
 				}
+			if(prev_enable_status == USBSTATUS_RNDIS && prev_status_before_rndis != USBSTATUS_UMS) {
+				printk("[USB] %s - prev_status(0x%02x), prev_status_before_rndis setting(0x%02x)\n",
+						__func__, prev_enable_status, prev_status_before_rndis);
+				enable = prev_status_before_rndis;  // set previous status
+				prev_enable_status = prev_status_before_rndis = 0; //reset
+				goto recheck;
+				}
 
 			ret = usb_change_config(dev->cdev, &ums_only_config);
 			if (ret) {
@@ -704,6 +712,15 @@
 			}
 			dev->adb_enabled = enable;
 		}
+		else if(enable == USBSTATUS_RNDIS)
+		{
+			prev_status_before_rndis = prev_enable_status;
+			ret = usb_change_config(dev->cdev, &rndis_only_config);
+			if (ret) {
+				printk("[%s] Fail to rndis_only_config()\n", __func__);
+			}
+			dev->adb_enabled = enable;
+		}
 
 /*
 	for reenumeration in case of booting-up connected with host
diff --git a/linux-2.6.29/drivers/usb/gadget/fsa9480_i2c.c b/linux-2.6.29/drivers/usb/gadget/fsa9480_i2c.c
--- a/linux-2.6.29/drivers/usb/gadget/fsa9480_i2c.c
+++ b/linux-2.6.29/drivers/usb/gadget/fsa9480_i2c.c
@@ -1060,6 +1060,33 @@
 static DEVICE_ATTR(SwitchingInitValue, S_IRUGO, get_SwitchingInitValue, NULL);
 
 
+static ssize_t rndis_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+	unsigned long val;
+	int res;
+
+	if ((res = strict_strtoul(buf, 10, &val)) < 0)
+		return res;
+
+	switch (val) {
+	case 0:
+		if ((res = usb_switch_select(USBSTATUS_UMS)) < 0)
+			return res;
+		break;
+	case 1:
+		if ((res = usb_switch_select(USBSTATUS_RNDIS)) < 0)
+			return res;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return count;
+}
+
+static DEVICE_ATTR(rndis_enable, S_IRUGO | S_IWUSR, NULL, rndis_enable_store);
+
+
 int  FSA9480_PMIC_CP_USB(void)
 {
 	int switch_sel;
@@ -1921,6 +1948,9 @@
 		pr_err("Failed to create device file(%s)!\n", dev_attr_wimax_usb_state.attr.name);		
 #endif
 
+	if (device_create_file(switch_dev, &dev_attr_rndis_enable) < 0)
+		pr_err("Failed to create device file(%s)!\n", dev_attr_rndis_enable.attr.name);
+
 #if 1 //20100605_inchul
 		wake_lock_init(&cable_wake_lock, WAKE_LOCK_SUSPEND, "wimax_cable_connected");
 #endif
diff --git a/linux-2.6.29/drivers/usb/gadget/fsa9480_i2c.h b/linux-2.6.29/drivers/usb/gadget/fsa9480_i2c.h
--- a/linux-2.6.29/drivers/usb/gadget/fsa9480_i2c.h
+++ b/linux-2.6.29/drivers/usb/gadget/fsa9480_i2c.h
@@ -184,6 +184,7 @@
 #define USBSTATUS_ADB					0x10
 #define USBSTATUS_DM					0x20
 #define USBSTATUS_ACM					0x30
+#define USBSTATUS_RNDIS					0x40
 
 //#define VODA
 
