summaryrefslogtreecommitdiffstats
path: root/drivers/net/wimax/i2400m/sdio.c
diff options
context:
space:
mode:
authorCindy H Kao <evans@localhost.localdomain>2009-08-18 04:17:58 +0200
committerInaky Perez-Gonzalez <inaky@linux.intel.com>2009-10-19 08:55:41 +0200
commitf2696fbdb623993a9b4c05455df7ae3158a01111 (patch)
tree63dd6e4fbad1d6712bbc58038d4e04f5cfc025b5 /drivers/net/wimax/i2400m/sdio.c
parentwimax/i2400m: Make boot retries a BUS-specific parameter (diff)
downloadlinux-f2696fbdb623993a9b4c05455df7ae3158a01111.tar.xz
linux-f2696fbdb623993a9b4c05455df7ae3158a01111.zip
wimax/iwmc3200: overwrite SDIO IOR timeout value to avoid platform hang
The default SDIO IOE wait timeout returned from iwmc3200-wimax's CCCR is not efficient. This inefficiency will actually cause problems on Moorestown platforms (system hang). This is a sillicon bug that requires a software patch to by overwritting func->enable_timeout. The new value I2400MS_IOR_TIMEOUT is recommended and verified from the system integration results. Future sillicon releases will have this default value corrected in the future. Signed-off-by: Cindy H Kao <cindy.h.kao@intel.com> Signed-off-by: Inaky Perez-Gonzalez <inaky@linux.intel.com>
Diffstat (limited to 'drivers/net/wimax/i2400m/sdio.c')
-rw-r--r--drivers/net/wimax/i2400m/sdio.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/net/wimax/i2400m/sdio.c b/drivers/net/wimax/i2400m/sdio.c
index 1429608164b0..0d64d16bd264 100644
--- a/drivers/net/wimax/i2400m/sdio.c
+++ b/drivers/net/wimax/i2400m/sdio.c
@@ -115,6 +115,14 @@ int i2400ms_enable_function(struct sdio_func *func)
err = -ENODEV;
while (err != 0 && time_before64(get_jiffies_64(), timeout)) {
sdio_claim_host(func);
+ /*
+ * There is a sillicon bug on the IWMC3200, where the
+ * IOE timeout will cause problems on Moorestown
+ * platforms (system hang). We explicitly overwrite
+ * func->enable_timeout here to work around the issue.
+ */
+ if (func->device == SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX)
+ func->enable_timeout = IWMC3200_IOR_TIMEOUT;
err = sdio_enable_func(func);
if (0 == err) {
sdio_release_host(func);