--- linux-source-2.6.14/include/linux/usbdevice_fs.h~	2005-10-28 09:02:08.000000000 +0900
+++ linux-source-2.6.14/include/linux/usbdevice_fs.h	2006-01-11 20:15:34.000000000 +0900
@@ -123,6 +123,12 @@ struct usbdevfs_hub_portinfo {
 	char port [127];	/* e.g. port 3 connects to device 27 */
 };
 
+struct usbdevfs_hub_portctrl {
+	char cmd;		/* LED or POWER */
+	char port;
+	char value;
+};
+
 #ifdef CONFIG_COMPAT
 #include <linux/compat.h>
 struct usbdevfs_urb32 {
@@ -165,4 +171,5 @@ struct usbdevfs_urb32 {
 #define USBDEVFS_CLEAR_HALT        _IOR('U', 21, unsigned int)
 #define USBDEVFS_DISCONNECT        _IO('U', 22)
 #define USBDEVFS_CONNECT           _IO('U', 23)
+#define USBDEVFS_HUB_PORTCTRL      _IOW('U', 24, struct usbdevfs_hub_portctrl)
 #endif /* _LINUX_USBDEVICE_FS_H */
--- linux-source-2.6.14/drivers/usb/core/hub.c~	2005-10-28 09:02:08.000000000 +0900
+++ linux-source-2.6.14/drivers/usb/core/hub.c	2006-01-11 20:39:52.000000000 +0900
@@ -907,7 +907,33 @@ hub_ioctl(struct usb_interface *intf, un
 
 		return info->nports + 1;
 		}
+	case USBDEVFS_HUB_PORTCTRL: {
+		struct usb_hub *hub = usb_get_intfdata (intf);
+		struct usbdevfs_hub_portctrl *ctrl = user_data;
 
+		if (hdev->devnum <= 0)
+			return -ENODEV;
+
+		if (ctrl->port < 1 || ctrl->port > hdev->maxchild)
+			return -EINVAL;
+
+		if (hdev->children[ctrl->port - 1] != NULL)
+			/* Something connected */
+			return -EBUSY;
+
+		if (ctrl->cmd == 0)
+			if (ctrl->value < HUB_LED_AUTO
+			    || ctrl->value > HUB_LED_OFF)
+				return -EINVAL;
+			else
+				set_port_led (hub, ctrl->port, ctrl->value);
+		else
+			if (ctrl->value)
+				set_port_feature(hdev, ctrl->port, USB_PORT_FEAT_POWER);
+			else
+				clear_port_feature(hdev, ctrl->port, USB_PORT_FEAT_POWER);
+		return 0;
+	}
 	default:
 		return -ENOSYS;
 	}
