The patch titled Emagic USB firmware loading fixes has been added to the -mm tree. Its filename is emagic-usb-firmware-loading-fixes.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this From: Monty <xiphmont@xxxxxxxx> It's become apparent as machines get faster that the emagic kernel firmware loaders (based on the ezusb loader) have a reset race. a 400MHz TiBook never tripped it, but a 2GHz Pentium M seems to hit it about 30% of the time. The bug is seen as a hung USB box and the kernel error: drivers/usb/misc/emi62.c: emi62_load_firmware - error loading firmware: error = -110 The patch below inserts a delay after deasserting reset to allow the box to settle before a new command is issued. This affects only device startup. It's against 2.6.27-rc3, but should apply to any 2.6 kernel; I don't think the loader has changed for a long time. (A side note; I notice the firmware loader is using a rather old firmware version for both devices. Several relatively harmless but annoying bugs have since been fixed... how was the firmware from this device originally extracted? Was it taken from a device driver belonging to another OS, or was it provided as a hexdump from emagic?) Cc: Greg KH <greg@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- drivers/usb/misc/emi26.c | 4 ++++ drivers/usb/misc/emi62.c | 4 ++++ 2 files changed, 8 insertions(+) diff -puN drivers/usb/misc/emi26.c~emagic-usb-firmware-loading-fixes drivers/usb/misc/emi26.c --- 25/drivers/usb/misc/emi26.c~emagic-usb-firmware-loading-fixes Tue May 9 12:35:04 2006 +++ 25-akpm/drivers/usb/misc/emi26.c Tue May 9 12:36:24 2006 @@ -15,6 +15,7 @@ #include <linux/module.h> #include <linux/init.h> #include <linux/usb.h> +#include <linux/delay.h> #define MAX_INTEL_HEX_RECORD_LENGTH 16 typedef struct _INTEL_HEX_RECORD @@ -114,6 +115,7 @@ static int emi26_load_firmware (struct u /* De-assert reset (let the CPU run) */ err = emi26_set_reset(dev,0); + msleep(250); /* let device settle */ /* 2. We upload the FPGA firmware into the EMI * Note: collect up to 1023 (yes!) bytes and send them with @@ -150,6 +152,7 @@ static int emi26_load_firmware (struct u goto wraperr; } } + msleep(250); /* let device settle */ /* De-assert reset (let the CPU run) */ err = emi26_set_reset(dev,0); @@ -192,6 +195,7 @@ static int emi26_load_firmware (struct u err("%s - error loading firmware: error = %d", __FUNCTION__, err); goto wraperr; } + msleep(250); /* let device settle */ /* return 1 to fail the driver inialization * and give real driver change to load */ diff -puN drivers/usb/misc/emi62.c~emagic-usb-firmware-loading-fixes drivers/usb/misc/emi62.c --- 25/drivers/usb/misc/emi62.c~emagic-usb-firmware-loading-fixes Tue May 9 12:35:04 2006 +++ 25-akpm/drivers/usb/misc/emi62.c Tue May 9 12:36:52 2006 @@ -15,6 +15,7 @@ #include <linux/init.h> #include <linux/module.h> #include <linux/usb.h> +#include <linux/delay.h> #define MAX_INTEL_HEX_RECORD_LENGTH 16 typedef struct _INTEL_HEX_RECORD @@ -123,6 +124,7 @@ static int emi62_load_firmware (struct u /* De-assert reset (let the CPU run) */ err = emi62_set_reset(dev,0); + msleep(250); /* let device settle */ /* 2. We upload the FPGA firmware into the EMI * Note: collect up to 1023 (yes!) bytes and send them with @@ -166,6 +168,7 @@ static int emi62_load_firmware (struct u err("%s - error loading firmware: error = %d", __FUNCTION__, err); goto wraperr; } + msleep(250); /* let device settle */ /* 4. We put the part of the firmware that lies in the external RAM into the EZ-USB */ @@ -228,6 +231,7 @@ static int emi62_load_firmware (struct u err("%s - error loading firmware: error = %d", __FUNCTION__, err); goto wraperr; } + msleep(250); /* let device settle */ kfree(buf); _ Patches currently in -mm which might be from xiphmont@xxxxxxxx are emagic-usb-firmware-loading-fixes.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html