Commit 16c23f7d authored by Monty's avatar Monty Committed by Greg Kroah-Hartman

[PATCH] USB: Emagic USB firmware loading fixes

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.
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 332bbf61
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/delay.h>
#define MAX_INTEL_HEX_RECORD_LENGTH 16 #define MAX_INTEL_HEX_RECORD_LENGTH 16
typedef struct _INTEL_HEX_RECORD typedef struct _INTEL_HEX_RECORD
...@@ -114,6 +115,7 @@ static int emi26_load_firmware (struct usb_device *dev) ...@@ -114,6 +115,7 @@ static int emi26_load_firmware (struct usb_device *dev)
/* De-assert reset (let the CPU run) */ /* De-assert reset (let the CPU run) */
err = emi26_set_reset(dev,0); err = emi26_set_reset(dev,0);
msleep(250); /* let device settle */
/* 2. We upload the FPGA firmware into the EMI /* 2. We upload the FPGA firmware into the EMI
* Note: collect up to 1023 (yes!) bytes and send them with * Note: collect up to 1023 (yes!) bytes and send them with
...@@ -150,6 +152,7 @@ static int emi26_load_firmware (struct usb_device *dev) ...@@ -150,6 +152,7 @@ static int emi26_load_firmware (struct usb_device *dev)
goto wraperr; goto wraperr;
} }
} }
msleep(250); /* let device settle */
/* De-assert reset (let the CPU run) */ /* De-assert reset (let the CPU run) */
err = emi26_set_reset(dev,0); err = emi26_set_reset(dev,0);
...@@ -192,6 +195,7 @@ static int emi26_load_firmware (struct usb_device *dev) ...@@ -192,6 +195,7 @@ static int emi26_load_firmware (struct usb_device *dev)
err("%s - error loading firmware: error = %d", __FUNCTION__, err); err("%s - error loading firmware: error = %d", __FUNCTION__, err);
goto wraperr; goto wraperr;
} }
msleep(250); /* let device settle */
/* return 1 to fail the driver inialization /* return 1 to fail the driver inialization
* and give real driver change to load */ * and give real driver change to load */
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/delay.h>
#define MAX_INTEL_HEX_RECORD_LENGTH 16 #define MAX_INTEL_HEX_RECORD_LENGTH 16
typedef struct _INTEL_HEX_RECORD typedef struct _INTEL_HEX_RECORD
...@@ -123,6 +124,7 @@ static int emi62_load_firmware (struct usb_device *dev) ...@@ -123,6 +124,7 @@ static int emi62_load_firmware (struct usb_device *dev)
/* De-assert reset (let the CPU run) */ /* De-assert reset (let the CPU run) */
err = emi62_set_reset(dev,0); err = emi62_set_reset(dev,0);
msleep(250); /* let device settle */
/* 2. We upload the FPGA firmware into the EMI /* 2. We upload the FPGA firmware into the EMI
* Note: collect up to 1023 (yes!) bytes and send them with * Note: collect up to 1023 (yes!) bytes and send them with
...@@ -166,6 +168,7 @@ static int emi62_load_firmware (struct usb_device *dev) ...@@ -166,6 +168,7 @@ static int emi62_load_firmware (struct usb_device *dev)
err("%s - error loading firmware: error = %d", __FUNCTION__, err); err("%s - error loading firmware: error = %d", __FUNCTION__, err);
goto wraperr; 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 */ /* 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 usb_device *dev) ...@@ -228,6 +231,7 @@ static int emi62_load_firmware (struct usb_device *dev)
err("%s - error loading firmware: error = %d", __FUNCTION__, err); err("%s - error loading firmware: error = %d", __FUNCTION__, err);
goto wraperr; goto wraperr;
} }
msleep(250); /* let device settle */
kfree(buf); kfree(buf);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment