aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKalle Valo <kvalo@qca.qualcomm.com>2011-11-11 05:17:42 -0500
committerKalle Valo <kvalo@qca.qualcomm.com>2011-11-13 05:34:29 -0500
commit1f4c894d3a35e88331c01e681d033a2000c3667b (patch)
tree7d01064323b5805bf5de0e024218d4b5a3a55da3
parent66b693c3b84876d33afd35b9d717d8b9d07384c8 (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.c46
-rw-r--r--drivers/net/wireless/ath/ath6kl/bmi.h6
-rw-r--r--drivers/net/wireless/ath/ath6kl/core.h2
-rw-r--r--drivers/net/wireless/ath/ath6kl/sdio.c1
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
519int ath6kl_bmi_init(struct ath6kl *ar) 522int 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
277struct target_stats { 279struct 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