diff options
| author | Monty <xiphmont@xiph.org> | 2006-05-09 15:37:22 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-05-12 14:58:09 -0400 |
| commit | 16c23f7d88cbcce491f9370b2846fad66e8ef319 (patch) | |
| tree | 7e69ad84548acabb0bebcfd594c1986292947d83 | |
| parent | 332bbf613868a5d5938ad9fb7436b2beae72d53d (diff) | |
[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: Andrew Morton <akpm@osdl.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
| -rw-r--r-- | drivers/usb/misc/emi26.c | 4 | ||||
| -rw-r--r-- | drivers/usb/misc/emi62.c | 4 |
2 files changed, 8 insertions, 0 deletions
diff --git a/drivers/usb/misc/emi26.c b/drivers/usb/misc/emi26.c index 3824df33094e..1fd9cb85f4ca 100644 --- a/drivers/usb/misc/emi26.c +++ b/drivers/usb/misc/emi26.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
| 16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
| 17 | #include <linux/usb.h> | 17 | #include <linux/usb.h> |
| 18 | #include <linux/delay.h> | ||
| 18 | 19 | ||
| 19 | #define MAX_INTEL_HEX_RECORD_LENGTH 16 | 20 | #define MAX_INTEL_HEX_RECORD_LENGTH 16 |
| 20 | typedef struct _INTEL_HEX_RECORD | 21 | typedef struct _INTEL_HEX_RECORD |
| @@ -114,6 +115,7 @@ static int emi26_load_firmware (struct usb_device *dev) | |||
| 114 | 115 | ||
| 115 | /* De-assert reset (let the CPU run) */ | 116 | /* De-assert reset (let the CPU run) */ |
| 116 | err = emi26_set_reset(dev,0); | 117 | err = emi26_set_reset(dev,0); |
| 118 | msleep(250); /* let device settle */ | ||
| 117 | 119 | ||
| 118 | /* 2. We upload the FPGA firmware into the EMI | 120 | /* 2. We upload the FPGA firmware into the EMI |
| 119 | * Note: collect up to 1023 (yes!) bytes and send them with | 121 | * 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 | goto wraperr; | 152 | goto wraperr; |
| 151 | } | 153 | } |
| 152 | } | 154 | } |
| 155 | msleep(250); /* let device settle */ | ||
| 153 | 156 | ||
| 154 | /* De-assert reset (let the CPU run) */ | 157 | /* De-assert reset (let the CPU run) */ |
| 155 | err = emi26_set_reset(dev,0); | 158 | err = emi26_set_reset(dev,0); |
| @@ -192,6 +195,7 @@ static int emi26_load_firmware (struct usb_device *dev) | |||
| 192 | err("%s - error loading firmware: error = %d", __FUNCTION__, err); | 195 | err("%s - error loading firmware: error = %d", __FUNCTION__, err); |
| 193 | goto wraperr; | 196 | goto wraperr; |
| 194 | } | 197 | } |
| 198 | msleep(250); /* let device settle */ | ||
| 195 | 199 | ||
| 196 | /* return 1 to fail the driver inialization | 200 | /* return 1 to fail the driver inialization |
| 197 | * and give real driver change to load */ | 201 | * and give real driver change to load */ |
diff --git a/drivers/usb/misc/emi62.c b/drivers/usb/misc/emi62.c index 52fea2e08db8..fe351371f274 100644 --- a/drivers/usb/misc/emi62.c +++ b/drivers/usb/misc/emi62.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
| 16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
| 17 | #include <linux/usb.h> | 17 | #include <linux/usb.h> |
| 18 | #include <linux/delay.h> | ||
| 18 | 19 | ||
| 19 | #define MAX_INTEL_HEX_RECORD_LENGTH 16 | 20 | #define MAX_INTEL_HEX_RECORD_LENGTH 16 |
| 20 | typedef struct _INTEL_HEX_RECORD | 21 | typedef struct _INTEL_HEX_RECORD |
| @@ -123,6 +124,7 @@ static int emi62_load_firmware (struct usb_device *dev) | |||
| 123 | 124 | ||
| 124 | /* De-assert reset (let the CPU run) */ | 125 | /* De-assert reset (let the CPU run) */ |
| 125 | err = emi62_set_reset(dev,0); | 126 | err = emi62_set_reset(dev,0); |
| 127 | msleep(250); /* let device settle */ | ||
| 126 | 128 | ||
| 127 | /* 2. We upload the FPGA firmware into the EMI | 129 | /* 2. We upload the FPGA firmware into the EMI |
| 128 | * Note: collect up to 1023 (yes!) bytes and send them with | 130 | * 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 | err("%s - error loading firmware: error = %d", __FUNCTION__, err); | 168 | err("%s - error loading firmware: error = %d", __FUNCTION__, err); |
| 167 | goto wraperr; | 169 | goto wraperr; |
| 168 | } | 170 | } |
| 171 | msleep(250); /* let device settle */ | ||
| 169 | 172 | ||
| 170 | /* 4. We put the part of the firmware that lies in the external RAM into the EZ-USB */ | 173 | /* 4. We put the part of the firmware that lies in the external RAM into the EZ-USB */ |
| 171 | 174 | ||
| @@ -228,6 +231,7 @@ static int emi62_load_firmware (struct usb_device *dev) | |||
| 228 | err("%s - error loading firmware: error = %d", __FUNCTION__, err); | 231 | err("%s - error loading firmware: error = %d", __FUNCTION__, err); |
| 229 | goto wraperr; | 232 | goto wraperr; |
| 230 | } | 233 | } |
| 234 | msleep(250); /* let device settle */ | ||
| 231 | 235 | ||
| 232 | kfree(buf); | 236 | kfree(buf); |
| 233 | 237 | ||
