--- linux-2.6.12.2/drivers/usb/storage/transport.c.bak	2005-09-19 20:29:25.000000000 +0000
+++ linux-2.6.12.2/drivers/usb/storage/transport.c	2005-09-20 23:12:16.000000000 +0000
@@ -60,6 +60,60 @@
 #include "scsiglue.h"
 #include "debug.h"
 
+// --- Forward-Ported Linksys Disk 1 & Disk 2 LED Control (Port & Enhancement done by Philipp Kirchhofer - Sept. '05) ---
+// --- Disk LED Activity Blinking Part 1 ---
+#define GPIO_DISK1 	3 	// Bit 3 controls LED 'Disk 1'
+#define GPIO_DISK2 	2 	// Bit 2 controls LED 'Disk 2'
+#define DEVPATH_PORT1 	0x31	// udev->devpath for EHCI Port 1
+#define DEVPATH_PORT2 	0x32	// udev->devpath for EHCI Port 2
+
+#define JIFFIES_BLINKING_TIME 6
+#define ON_LED_INTERVAL 3
+unsigned long turn_on_time;
+
+static struct timer_list usb1_led_timer;    /* ide led switch */
+static struct timer_list usb2_led_timer;    /* ide led switch */
+
+// Turns on Disk 1 LED
+static void turn_on_led_usb1(unsigned long ptr) {
+	// Enable LED 'Disk 1'
+	gpio_line_set(GPIO_DISK1, IXP4XX_GPIO_LOW);
+	return;
+}
+
+// Turns on Disk 2 LED
+static void turn_on_led_usb2(unsigned long ptr) {
+	// Enable LED 'Disk 2'
+	gpio_line_set(GPIO_DISK2, IXP4XX_GPIO_LOW);
+        return;
+}
+
+// Turns on Disk 1 LED after ON_LED_INTERVAL jiffies
+static void usb_1_led_timer(void) {
+	usb1_led_timer.expires = jiffies + ON_LED_INTERVAL;
+	add_timer(&usb1_led_timer);
+	return;
+}
+
+// Turns on Disk 2 LED after ON_LED_INTERVAL jiffies
+static void usb_2_led_timer(void) {
+        usb2_led_timer.expires = jiffies + ON_LED_INTERVAL;
+        add_timer(&usb2_led_timer);
+        return;
+}
+
+// Initializes Timers
+unsigned long initialized_timers = 0;
+static void initializeTimers(void) {
+	if (unlikely(initialized_timers != 1)) {
+		init_timer(&usb1_led_timer);
+		usb1_led_timer.function = turn_on_led_usb1;
+		init_timer(&usb2_led_timer);
+		usb2_led_timer.function = turn_on_led_usb2;
+		initialized_timers = 1;
+	}
+}
+// --- End Disk LED Activity Blinking Part 1 ---
 
 /***********************************************************************
  * Data transfer routines
@@ -499,6 +553,42 @@
 
 	/* are we scatter-gathering? */
 	if (use_sg) {
+		// --- Disk LED Activity Blinking Part 2 ---
+		initializeTimers();
+		if ((jiffies - turn_on_time) >= JIFFIES_BLINKING_TIME) {
+			switch (us->pusb_dev->bus->busnum) {
+				/* EHCI Port 1 + 2 */
+				case 1:
+					if (*us->pusb_dev->devpath == DEVPATH_PORT1) {
+						del_timer_sync(&usb1_led_timer);
+						// Disable LED 'Disk 1'
+						gpio_line_set(GPIO_DISK1, IXP4XX_GPIO_HIGH);
+						usb_1_led_timer();
+					} else if (*us->pusb_dev->devpath == DEVPATH_PORT2) {
+						del_timer_sync(&usb2_led_timer);
+						// Disable LED 'Disk 2'
+						gpio_line_set(GPIO_DISK2, IXP4XX_GPIO_HIGH);
+						usb_2_led_timer();
+					}
+					break;
+				/* OHCI Port 1 */
+				case 2:
+					del_timer_sync(&usb1_led_timer);
+					// Disable LED 'Disk 1'
+					gpio_line_set(GPIO_DISK1, IXP4XX_GPIO_HIGH);
+					usb_1_led_timer();
+					break;
+				/* OHCI Port 2 */
+				case 3:
+					del_timer_sync(&usb2_led_timer);
+					// Disable LED 'Disk 2'
+					gpio_line_set(GPIO_DISK2, IXP4XX_GPIO_HIGH);
+					usb_2_led_timer();
+					break;
+			}
+			turn_on_time = jiffies;
+		}
+		// --- End Disk LED Activity Blinking Part 2 ---
 		/* use the usb core scatter-gather primitives */
 		result = usb_stor_bulk_transfer_sglist(us, pipe,
 				(struct scatterlist *) buf, use_sg,

