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);
 }