diff options
author | Grazvydas Ignotas <notasas@gmail.com> | 2010-03-11 10:44:57 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-03-15 15:32:03 -0400 |
commit | 3f9e750d130b4a4d9f8226642b46ed17d8357f40 (patch) | |
tree | 761497200ae8a5c2ca0ac3b7ce9b9e44dde23533 /drivers/net/wireless/wl12xx/wl1251_sdio.c | |
parent | 3c9cb9c38a1368b1e3f187f23c1a56883ec656c2 (diff) |
wl1251: fix ELP_CTRL register accesses when using SDIO
For some unknown reason ELP_CTRL can't be accesed using
sdio_memcpy_* functions (any attemts to do so result in timeouts):
wl1251: ERROR sdio write failed (-110)
wl1251: ERROR sdio read failed (-110)
wl1251: WARNING WLAN not ready
To fix this, add special IO functions for ELP_CTRL access that are
using sdio_readb/sdio_writeb. Similar handling is done in TI
reference driver from Android code drop.
Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Cc: Bob Copeland <me@bobcopeland.com>
Acked-by: Kalle Valo <kalle.valo@iki.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/wl12xx/wl1251_sdio.c')
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1251_sdio.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1251_sdio.c b/drivers/net/wireless/wl12xx/wl1251_sdio.c index cfca232dc8cb..2051ef06e9ec 100644 --- a/drivers/net/wireless/wl12xx/wl1251_sdio.c +++ b/drivers/net/wireless/wl12xx/wl1251_sdio.c | |||
@@ -82,6 +82,32 @@ static void wl1251_sdio_write(struct wl1251 *wl, int addr, | |||
82 | sdio_release_host(func); | 82 | sdio_release_host(func); |
83 | } | 83 | } |
84 | 84 | ||
85 | static void wl1251_sdio_read_elp(struct wl1251 *wl, int addr, u32 *val) | ||
86 | { | ||
87 | int ret = 0; | ||
88 | struct sdio_func *func = wl_to_func(wl); | ||
89 | |||
90 | sdio_claim_host(func); | ||
91 | *val = sdio_readb(func, addr, &ret); | ||
92 | sdio_release_host(func); | ||
93 | |||
94 | if (ret) | ||
95 | wl1251_error("sdio_readb failed (%d)", ret); | ||
96 | } | ||
97 | |||
98 | static void wl1251_sdio_write_elp(struct wl1251 *wl, int addr, u32 val) | ||
99 | { | ||
100 | int ret = 0; | ||
101 | struct sdio_func *func = wl_to_func(wl); | ||
102 | |||
103 | sdio_claim_host(func); | ||
104 | sdio_writeb(func, val, addr, &ret); | ||
105 | sdio_release_host(func); | ||
106 | |||
107 | if (ret) | ||
108 | wl1251_error("sdio_writeb failed (%d)", ret); | ||
109 | } | ||
110 | |||
85 | static void wl1251_sdio_reset(struct wl1251 *wl) | 111 | static void wl1251_sdio_reset(struct wl1251 *wl) |
86 | { | 112 | { |
87 | } | 113 | } |
@@ -111,6 +137,8 @@ static void wl1251_sdio_set_power(bool enable) | |||
111 | static const struct wl1251_if_operations wl1251_sdio_ops = { | 137 | static const struct wl1251_if_operations wl1251_sdio_ops = { |
112 | .read = wl1251_sdio_read, | 138 | .read = wl1251_sdio_read, |
113 | .write = wl1251_sdio_write, | 139 | .write = wl1251_sdio_write, |
140 | .write_elp = wl1251_sdio_write_elp, | ||
141 | .read_elp = wl1251_sdio_read_elp, | ||
114 | .reset = wl1251_sdio_reset, | 142 | .reset = wl1251_sdio_reset, |
115 | .enable_irq = wl1251_sdio_enable_irq, | 143 | .enable_irq = wl1251_sdio_enable_irq, |
116 | .disable_irq = wl1251_sdio_disable_irq, | 144 | .disable_irq = wl1251_sdio_disable_irq, |