diff options
author | Kalle Valo <kvalo@qca.qualcomm.com> | 2011-11-11 05:17:42 -0500 |
---|---|---|
committer | Kalle Valo <kvalo@qca.qualcomm.com> | 2011-11-13 05:34:29 -0500 |
commit | 1f4c894d3a35e88331c01e681d033a2000c3667b (patch) | |
tree | 7d01064323b5805bf5de0e024218d4b5a3a55da3 | |
parent | 66b693c3b84876d33afd35b9d717d8b9d07384c8 (diff) |
ath6kl: change bmi sizes being configurable by HIF
SDIO and USB have different maximum sizes for BMI commands so make that
configurable.
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
-rw-r--r-- | drivers/net/wireless/ath/ath6kl/bmi.c | 46 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath6kl/bmi.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath6kl/core.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath6kl/sdio.c | 1 |
4 files changed, 30 insertions, 25 deletions
diff --git a/drivers/net/wireless/ath/ath6kl/bmi.c b/drivers/net/wireless/ath/ath6kl/bmi.c index 12f5b57d2dc2..bce3575c310a 100644 --- a/drivers/net/wireless/ath/ath6kl/bmi.c +++ b/drivers/net/wireless/ath/ath6kl/bmi.c | |||
@@ -117,8 +117,8 @@ int ath6kl_bmi_read(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) | |||
117 | return -EACCES; | 117 | return -EACCES; |
118 | } | 118 | } |
119 | 119 | ||
120 | size = BMI_DATASZ_MAX + sizeof(cid) + sizeof(addr) + sizeof(len); | 120 | size = ar->bmi.max_data_size + sizeof(cid) + sizeof(addr) + sizeof(len); |
121 | if (size > MAX_BMI_CMDBUF_SZ) { | 121 | if (size > ar->bmi.max_cmd_size) { |
122 | WARN_ON(1); | 122 | WARN_ON(1); |
123 | return -EINVAL; | 123 | return -EINVAL; |
124 | } | 124 | } |
@@ -131,8 +131,8 @@ int ath6kl_bmi_read(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) | |||
131 | len_remain = len; | 131 | len_remain = len; |
132 | 132 | ||
133 | while (len_remain) { | 133 | while (len_remain) { |
134 | rx_len = (len_remain < BMI_DATASZ_MAX) ? | 134 | rx_len = (len_remain < ar->bmi.max_data_size) ? |
135 | len_remain : BMI_DATASZ_MAX; | 135 | len_remain : ar->bmi.max_data_size; |
136 | offset = 0; | 136 | offset = 0; |
137 | memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); | 137 | memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); |
138 | offset += sizeof(cid); | 138 | offset += sizeof(cid); |
@@ -167,7 +167,7 @@ int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) | |||
167 | u32 offset; | 167 | u32 offset; |
168 | u32 len_remain, tx_len; | 168 | u32 len_remain, tx_len; |
169 | const u32 header = sizeof(cid) + sizeof(addr) + sizeof(len); | 169 | const u32 header = sizeof(cid) + sizeof(addr) + sizeof(len); |
170 | u8 aligned_buf[BMI_DATASZ_MAX]; | 170 | u8 aligned_buf[400]; |
171 | u8 *src; | 171 | u8 *src; |
172 | 172 | ||
173 | if (ar->bmi.done_sent) { | 173 | if (ar->bmi.done_sent) { |
@@ -175,12 +175,15 @@ int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) | |||
175 | return -EACCES; | 175 | return -EACCES; |
176 | } | 176 | } |
177 | 177 | ||
178 | if ((BMI_DATASZ_MAX + header) > MAX_BMI_CMDBUF_SZ) { | 178 | if ((ar->bmi.max_data_size + header) > ar->bmi.max_cmd_size) { |
179 | WARN_ON(1); | 179 | WARN_ON(1); |
180 | return -EINVAL; | 180 | return -EINVAL; |
181 | } | 181 | } |
182 | 182 | ||
183 | memset(ar->bmi.cmd_buf, 0, BMI_DATASZ_MAX + header); | 183 | if (WARN_ON(ar->bmi.max_data_size > sizeof(aligned_buf))) |
184 | return -E2BIG; | ||
185 | |||
186 | memset(ar->bmi.cmd_buf, 0, ar->bmi.max_data_size + header); | ||
184 | 187 | ||
185 | ath6kl_dbg(ATH6KL_DBG_BMI, | 188 | ath6kl_dbg(ATH6KL_DBG_BMI, |
186 | "bmi write memory: addr: 0x%x, len: %d\n", addr, len); | 189 | "bmi write memory: addr: 0x%x, len: %d\n", addr, len); |
@@ -189,7 +192,7 @@ int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) | |||
189 | while (len_remain) { | 192 | while (len_remain) { |
190 | src = &buf[len - len_remain]; | 193 | src = &buf[len - len_remain]; |
191 | 194 | ||
192 | if (len_remain < (BMI_DATASZ_MAX - header)) { | 195 | if (len_remain < (ar->bmi.max_data_size - header)) { |
193 | if (len_remain & 3) { | 196 | if (len_remain & 3) { |
194 | /* align it with 4 bytes */ | 197 | /* align it with 4 bytes */ |
195 | len_remain = len_remain + | 198 | len_remain = len_remain + |
@@ -199,7 +202,7 @@ int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) | |||
199 | } | 202 | } |
200 | tx_len = len_remain; | 203 | tx_len = len_remain; |
201 | } else { | 204 | } else { |
202 | tx_len = (BMI_DATASZ_MAX - header); | 205 | tx_len = (ar->bmi.max_data_size - header); |
203 | } | 206 | } |
204 | 207 | ||
205 | offset = 0; | 208 | offset = 0; |
@@ -237,7 +240,7 @@ int ath6kl_bmi_execute(struct ath6kl *ar, u32 addr, u32 *param) | |||
237 | } | 240 | } |
238 | 241 | ||
239 | size = sizeof(cid) + sizeof(addr) + sizeof(param); | 242 | size = sizeof(cid) + sizeof(addr) + sizeof(param); |
240 | if (size > MAX_BMI_CMDBUF_SZ) { | 243 | if (size > ar->bmi.max_cmd_size) { |
241 | WARN_ON(1); | 244 | WARN_ON(1); |
242 | return -EINVAL; | 245 | return -EINVAL; |
243 | } | 246 | } |
@@ -284,7 +287,7 @@ int ath6kl_bmi_set_app_start(struct ath6kl *ar, u32 addr) | |||
284 | } | 287 | } |
285 | 288 | ||
286 | size = sizeof(cid) + sizeof(addr); | 289 | size = sizeof(cid) + sizeof(addr); |
287 | if (size > MAX_BMI_CMDBUF_SZ) { | 290 | if (size > ar->bmi.max_cmd_size) { |
288 | WARN_ON(1); | 291 | WARN_ON(1); |
289 | return -EINVAL; | 292 | return -EINVAL; |
290 | } | 293 | } |
@@ -320,7 +323,7 @@ int ath6kl_bmi_reg_read(struct ath6kl *ar, u32 addr, u32 *param) | |||
320 | } | 323 | } |
321 | 324 | ||
322 | size = sizeof(cid) + sizeof(addr); | 325 | size = sizeof(cid) + sizeof(addr); |
323 | if (size > MAX_BMI_CMDBUF_SZ) { | 326 | if (size > ar->bmi.max_cmd_size) { |
324 | WARN_ON(1); | 327 | WARN_ON(1); |
325 | return -EINVAL; | 328 | return -EINVAL; |
326 | } | 329 | } |
@@ -363,7 +366,7 @@ int ath6kl_bmi_reg_write(struct ath6kl *ar, u32 addr, u32 param) | |||
363 | } | 366 | } |
364 | 367 | ||
365 | size = sizeof(cid) + sizeof(addr) + sizeof(param); | 368 | size = sizeof(cid) + sizeof(addr) + sizeof(param); |
366 | if (size > MAX_BMI_CMDBUF_SZ) { | 369 | if (size > ar->bmi.max_cmd_size) { |
367 | WARN_ON(1); | 370 | WARN_ON(1); |
368 | return -EINVAL; | 371 | return -EINVAL; |
369 | } | 372 | } |
@@ -404,8 +407,8 @@ int ath6kl_bmi_lz_data(struct ath6kl *ar, u8 *buf, u32 len) | |||
404 | return -EACCES; | 407 | return -EACCES; |
405 | } | 408 | } |
406 | 409 | ||
407 | size = BMI_DATASZ_MAX + header; | 410 | size = ar->bmi.max_data_size + header; |
408 | if (size > MAX_BMI_CMDBUF_SZ) { | 411 | if (size > ar->bmi.max_cmd_size) { |
409 | WARN_ON(1); | 412 | WARN_ON(1); |
410 | return -EINVAL; | 413 | return -EINVAL; |
411 | } | 414 | } |
@@ -416,8 +419,8 @@ int ath6kl_bmi_lz_data(struct ath6kl *ar, u8 *buf, u32 len) | |||
416 | 419 | ||
417 | len_remain = len; | 420 | len_remain = len; |
418 | while (len_remain) { | 421 | while (len_remain) { |
419 | tx_len = (len_remain < (BMI_DATASZ_MAX - header)) ? | 422 | tx_len = (len_remain < (ar->bmi.max_data_size - header)) ? |
420 | len_remain : (BMI_DATASZ_MAX - header); | 423 | len_remain : (ar->bmi.max_data_size - header); |
421 | 424 | ||
422 | offset = 0; | 425 | offset = 0; |
423 | memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); | 426 | memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); |
@@ -454,7 +457,7 @@ int ath6kl_bmi_lz_stream_start(struct ath6kl *ar, u32 addr) | |||
454 | } | 457 | } |
455 | 458 | ||
456 | size = sizeof(cid) + sizeof(addr); | 459 | size = sizeof(cid) + sizeof(addr); |
457 | if (size > MAX_BMI_CMDBUF_SZ) { | 460 | if (size > ar->bmi.max_cmd_size) { |
458 | WARN_ON(1); | 461 | WARN_ON(1); |
459 | return -EINVAL; | 462 | return -EINVAL; |
460 | } | 463 | } |
@@ -518,8 +521,13 @@ void ath6kl_bmi_reset(struct ath6kl *ar) | |||
518 | 521 | ||
519 | int ath6kl_bmi_init(struct ath6kl *ar) | 522 | int ath6kl_bmi_init(struct ath6kl *ar) |
520 | { | 523 | { |
521 | ar->bmi.cmd_buf = kzalloc(MAX_BMI_CMDBUF_SZ, GFP_ATOMIC); | 524 | if (WARN_ON(ar->bmi.max_data_size == 0)) |
525 | return -EINVAL; | ||
526 | |||
527 | /* cmd + addr + len + data_size */ | ||
528 | ar->bmi.max_cmd_size = ar->bmi.max_data_size + (sizeof(u32) * 3); | ||
522 | 529 | ||
530 | ar->bmi.cmd_buf = kzalloc(ar->bmi.max_cmd_size, GFP_ATOMIC); | ||
523 | if (!ar->bmi.cmd_buf) | 531 | if (!ar->bmi.cmd_buf) |
524 | return -ENOMEM; | 532 | return -ENOMEM; |
525 | 533 | ||
diff --git a/drivers/net/wireless/ath/ath6kl/bmi.h b/drivers/net/wireless/ath/ath6kl/bmi.h index 009e8f650ab1..f1ca6812456d 100644 --- a/drivers/net/wireless/ath/ath6kl/bmi.h +++ b/drivers/net/wireless/ath/ath6kl/bmi.h | |||
@@ -44,12 +44,6 @@ | |||
44 | * BMI handles all required Target-side cache flushing. | 44 | * BMI handles all required Target-side cache flushing. |
45 | */ | 45 | */ |
46 | 46 | ||
47 | #define MAX_BMI_CMDBUF_SZ (BMI_DATASZ_MAX + \ | ||
48 | (sizeof(u32) * 3 /* cmd + addr + len */)) | ||
49 | |||
50 | /* Maximum data size used for BMI transfers */ | ||
51 | #define BMI_DATASZ_MAX 256 | ||
52 | |||
53 | /* BMI Commands */ | 47 | /* BMI Commands */ |
54 | 48 | ||
55 | #define BMI_NO_COMMAND 0 | 49 | #define BMI_NO_COMMAND 0 |
diff --git a/drivers/net/wireless/ath/ath6kl/core.h b/drivers/net/wireless/ath/ath6kl/core.h index e7e095e536a7..c08c02e6e050 100644 --- a/drivers/net/wireless/ath/ath6kl/core.h +++ b/drivers/net/wireless/ath/ath6kl/core.h | |||
@@ -272,6 +272,8 @@ struct ath6kl_bmi { | |||
272 | u32 cmd_credits; | 272 | u32 cmd_credits; |
273 | bool done_sent; | 273 | bool done_sent; |
274 | u8 *cmd_buf; | 274 | u8 *cmd_buf; |
275 | u32 max_data_size; | ||
276 | u32 max_cmd_size; | ||
275 | }; | 277 | }; |
276 | 278 | ||
277 | struct target_stats { | 279 | struct target_stats { |
diff --git a/drivers/net/wireless/ath/ath6kl/sdio.c b/drivers/net/wireless/ath/ath6kl/sdio.c index 080be036a27e..46a9bd66b94c 100644 --- a/drivers/net/wireless/ath/ath6kl/sdio.c +++ b/drivers/net/wireless/ath/ath6kl/sdio.c | |||
@@ -1139,6 +1139,7 @@ static int ath6kl_sdio_probe(struct sdio_func *func, | |||
1139 | ar_sdio->ar = ar; | 1139 | ar_sdio->ar = ar; |
1140 | ar->hif_priv = ar_sdio; | 1140 | ar->hif_priv = ar_sdio; |
1141 | ar->hif_ops = &ath6kl_sdio_ops; | 1141 | ar->hif_ops = &ath6kl_sdio_ops; |
1142 | ar->bmi.max_data_size = 256; | ||
1142 | 1143 | ||
1143 | ath6kl_sdio_set_mbox_info(ar); | 1144 | ath6kl_sdio_set_mbox_info(ar); |
1144 | 1145 | ||