Retry twice on CRC errors, as a hack for the Unipro tunnel.
diff --git a/drivers/net/wireless/wl12xx/sdio.c b/drivers/net/wireless/wl12xx/sdio.c
index 516a898..4bad66a 100644
--- a/drivers/net/wireless/wl12xx/sdio.c
+++ b/drivers/net/wireless/wl12xx/sdio.c
@@ -21,6 +21,8 @@
*
*/
+#define BROKEN_TUNNEL_CRC_ERRORS
+
#include <linux/irq.h>
#include <linux/module.h>
#include <linux/vmalloc.h>
@@ -111,7 +113,11 @@
{
int ret;
struct sdio_func *func = wl_to_func(wl);
+#ifdef BROKEN_TUNNEL_CRC_ERRORS
+ int tries = 3;
+hack:
+#endif
if (unlikely(addr == HW_ACCESS_ELP_CTRL_REG_ADDR)) {
((u8 *)buf)[0] = sdio_f0_readb(func, addr, &ret);
wl1271_debug(DEBUG_SDIO, "sdio read 52 addr 0x%x, byte 0x%02x",
@@ -127,6 +133,10 @@
wl1271_dump_ascii(DEBUG_SDIO, "data: ", buf, len);
}
+#ifdef BROKEN_TUNNEL_CRC_ERRORS
+ if (ret == -EILSEQ && --tries)
+ goto hack;
+#endif
if (ret)
wl1271_error("sdio read failed (%d)", ret);
}
@@ -136,7 +146,11 @@
{
int ret;
struct sdio_func *func = wl_to_func(wl);
+#ifdef BROKEN_TUNNEL_CRC_ERRORS
+ int tries = 3;
+hack:
+#endif
if (unlikely(addr == HW_ACCESS_ELP_CTRL_REG_ADDR)) {
sdio_f0_writeb(func, ((u8 *)buf)[0], addr, &ret);
wl1271_debug(DEBUG_SDIO, "sdio write 52 addr 0x%x, byte 0x%02x",
@@ -152,6 +166,10 @@
ret = sdio_memcpy_toio(func, addr, buf, len);
}
+#ifdef BROKEN_TUNNEL_CRC_ERRORS
+ if (ret == -EILSEQ && --tries)
+ goto hack;
+#endif
if (ret)
wl1271_error("sdio write failed (%d)", ret);
}