Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2696fbd authored by Cindy H Kao's avatar Cindy H Kao Committed by Inaky Perez-Gonzalez
Browse files

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: default avatarCindy H Kao <cindy.h.kao@intel.com>
Signed-off-by: default avatarInaky Perez-Gonzalez <inaky@linux.intel.com>
parent c3083658
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -81,6 +81,8 @@ enum {
	I2400MS_INIT_SLEEP_INTERVAL = 10,
	/* How long to wait for the device to settle after reset */
	I2400MS_SETTLE_TIME = 40,
	/* The number of msec to wait for IOR after sending IOE */
	IWMC3200_IOR_TIMEOUT = 10,
};


+8 −0
Original line number Diff line number Diff line
@@ -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);