Commit 1f4c894d authored by Kalle Valo's avatar Kalle Valo

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: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 66b693c3
...@@ -117,8 +117,8 @@ int ath6kl_bmi_read(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) ...@@ -117,8 +117,8 @@ int ath6kl_bmi_read(struct ath6kl *ar, u32 addr, u8 *buf, u32 len)
return -EACCES; return -EACCES;
} }
size = BMI_DATASZ_MAX + sizeof(cid) + sizeof(addr) + sizeof(len); size = ar->bmi.max_data_size + sizeof(cid) + sizeof(addr) + sizeof(len);
if (size > MAX_BMI_CMDBUF_SZ) { if (size > ar->bmi.max_cmd_size) {
WARN_ON(1); WARN_ON(1);
return -EINVAL; return -EINVAL;
} }
...@@ -131,8 +131,8 @@ int ath6kl_bmi_read(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) ...@@ -131,8 +131,8 @@ int ath6kl_bmi_read(struct ath6kl *ar, u32 addr, u8 *buf, u32 len)
len_remain = len; len_remain = len;
while (len_remain) { while (len_remain) {
rx_len = (len_remain < BMI_DATASZ_MAX) ? rx_len = (len_remain < ar->bmi.max_data_size) ?
len_remain : BMI_DATASZ_MAX; len_remain : ar->bmi.max_data_size;
offset = 0; offset = 0;
memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid));
offset += sizeof(cid); offset += sizeof(cid);
...@@ -167,7 +167,7 @@ int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) ...@@ -167,7 +167,7 @@ int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len)
u32 offset; u32 offset;
u32 len_remain, tx_len; u32 len_remain, tx_len;
const u32 header = sizeof(cid) + sizeof(addr) + sizeof(len); const u32 header = sizeof(cid) + sizeof(addr) + sizeof(len);
u8 aligned_buf[BMI_DATASZ_MAX]; u8 aligned_buf[400];
u8 *src; u8 *src;
if (ar->bmi.done_sent) { if (ar->bmi.done_sent) {
...@@ -175,12 +175,15 @@ int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) ...@@ -175,12 +175,15 @@ int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len)
return -EACCES; return -EACCES;
} }
if ((BMI_DATASZ_MAX + header) > MAX_BMI_CMDBUF_SZ) { if ((ar->bmi.max_data_size + header) > ar->bmi.max_cmd_size) {
WARN_ON(1); WARN_ON(1);
return -EINVAL; return -EINVAL;
} }
memset(ar->bmi.cmd_buf, 0, BMI_DATASZ_MAX + header); if (WARN_ON(ar->bmi.max_data_size > sizeof(aligned_buf)))
return -E2BIG;
memset(ar->bmi.cmd_buf, 0, ar->bmi.max_data_size + header);
ath6kl_dbg(ATH6KL_DBG_BMI, ath6kl_dbg(ATH6KL_DBG_BMI,
"bmi write memory: addr: 0x%x, len: %d\n", addr, len); "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,7 +192,7 @@ int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len)
while (len_remain) { while (len_remain) {
src = &buf[len - len_remain]; src = &buf[len - len_remain];
if (len_remain < (BMI_DATASZ_MAX - header)) { if (len_remain < (ar->bmi.max_data_size - header)) {
if (len_remain & 3) { if (len_remain & 3) {
/* align it with 4 bytes */ /* align it with 4 bytes */
len_remain = len_remain + len_remain = len_remain +
...@@ -199,7 +202,7 @@ int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len) ...@@ -199,7 +202,7 @@ int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len)
} }
tx_len = len_remain; tx_len = len_remain;
} else { } else {
tx_len = (BMI_DATASZ_MAX - header); tx_len = (ar->bmi.max_data_size - header);
} }
offset = 0; offset = 0;
...@@ -237,7 +240,7 @@ int ath6kl_bmi_execute(struct ath6kl *ar, u32 addr, u32 *param) ...@@ -237,7 +240,7 @@ int ath6kl_bmi_execute(struct ath6kl *ar, u32 addr, u32 *param)
} }
size = sizeof(cid) + sizeof(addr) + sizeof(param); size = sizeof(cid) + sizeof(addr) + sizeof(param);
if (size > MAX_BMI_CMDBUF_SZ) { if (size > ar->bmi.max_cmd_size) {
WARN_ON(1); WARN_ON(1);
return -EINVAL; return -EINVAL;
} }
...@@ -284,7 +287,7 @@ int ath6kl_bmi_set_app_start(struct ath6kl *ar, u32 addr) ...@@ -284,7 +287,7 @@ int ath6kl_bmi_set_app_start(struct ath6kl *ar, u32 addr)
} }
size = sizeof(cid) + sizeof(addr); size = sizeof(cid) + sizeof(addr);
if (size > MAX_BMI_CMDBUF_SZ) { if (size > ar->bmi.max_cmd_size) {
WARN_ON(1); WARN_ON(1);
return -EINVAL; return -EINVAL;
} }
...@@ -320,7 +323,7 @@ int ath6kl_bmi_reg_read(struct ath6kl *ar, u32 addr, u32 *param) ...@@ -320,7 +323,7 @@ int ath6kl_bmi_reg_read(struct ath6kl *ar, u32 addr, u32 *param)
} }
size = sizeof(cid) + sizeof(addr); size = sizeof(cid) + sizeof(addr);
if (size > MAX_BMI_CMDBUF_SZ) { if (size > ar->bmi.max_cmd_size) {
WARN_ON(1); WARN_ON(1);
return -EINVAL; return -EINVAL;
} }
...@@ -363,7 +366,7 @@ int ath6kl_bmi_reg_write(struct ath6kl *ar, u32 addr, u32 param) ...@@ -363,7 +366,7 @@ int ath6kl_bmi_reg_write(struct ath6kl *ar, u32 addr, u32 param)
} }
size = sizeof(cid) + sizeof(addr) + sizeof(param); size = sizeof(cid) + sizeof(addr) + sizeof(param);
if (size > MAX_BMI_CMDBUF_SZ) { if (size > ar->bmi.max_cmd_size) {
WARN_ON(1); WARN_ON(1);
return -EINVAL; return -EINVAL;
} }
...@@ -404,8 +407,8 @@ int ath6kl_bmi_lz_data(struct ath6kl *ar, u8 *buf, u32 len) ...@@ -404,8 +407,8 @@ int ath6kl_bmi_lz_data(struct ath6kl *ar, u8 *buf, u32 len)
return -EACCES; return -EACCES;
} }
size = BMI_DATASZ_MAX + header; size = ar->bmi.max_data_size + header;
if (size > MAX_BMI_CMDBUF_SZ) { if (size > ar->bmi.max_cmd_size) {
WARN_ON(1); WARN_ON(1);
return -EINVAL; return -EINVAL;
} }
...@@ -416,8 +419,8 @@ int ath6kl_bmi_lz_data(struct ath6kl *ar, u8 *buf, u32 len) ...@@ -416,8 +419,8 @@ int ath6kl_bmi_lz_data(struct ath6kl *ar, u8 *buf, u32 len)
len_remain = len; len_remain = len;
while (len_remain) { while (len_remain) {
tx_len = (len_remain < (BMI_DATASZ_MAX - header)) ? tx_len = (len_remain < (ar->bmi.max_data_size - header)) ?
len_remain : (BMI_DATASZ_MAX - header); len_remain : (ar->bmi.max_data_size - header);
offset = 0; offset = 0;
memcpy(&(ar->bmi.cmd_buf[offset]), &cid, sizeof(cid)); 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,7 +457,7 @@ int ath6kl_bmi_lz_stream_start(struct ath6kl *ar, u32 addr)
} }
size = sizeof(cid) + sizeof(addr); size = sizeof(cid) + sizeof(addr);
if (size > MAX_BMI_CMDBUF_SZ) { if (size > ar->bmi.max_cmd_size) {
WARN_ON(1); WARN_ON(1);
return -EINVAL; return -EINVAL;
} }
...@@ -518,8 +521,13 @@ void ath6kl_bmi_reset(struct ath6kl *ar) ...@@ -518,8 +521,13 @@ void ath6kl_bmi_reset(struct ath6kl *ar)
int ath6kl_bmi_init(struct ath6kl *ar) int ath6kl_bmi_init(struct ath6kl *ar)
{ {
ar->bmi.cmd_buf = kzalloc(MAX_BMI_CMDBUF_SZ, GFP_ATOMIC); if (WARN_ON(ar->bmi.max_data_size == 0))
return -EINVAL;
/* cmd + addr + len + data_size */
ar->bmi.max_cmd_size = ar->bmi.max_data_size + (sizeof(u32) * 3);
ar->bmi.cmd_buf = kzalloc(ar->bmi.max_cmd_size, GFP_ATOMIC);
if (!ar->bmi.cmd_buf) if (!ar->bmi.cmd_buf)
return -ENOMEM; return -ENOMEM;
......
...@@ -44,12 +44,6 @@ ...@@ -44,12 +44,6 @@
* BMI handles all required Target-side cache flushing. * BMI handles all required Target-side cache flushing.
*/ */
#define MAX_BMI_CMDBUF_SZ (BMI_DATASZ_MAX + \
(sizeof(u32) * 3 /* cmd + addr + len */))
/* Maximum data size used for BMI transfers */
#define BMI_DATASZ_MAX 256
/* BMI Commands */ /* BMI Commands */
#define BMI_NO_COMMAND 0 #define BMI_NO_COMMAND 0
......
...@@ -272,6 +272,8 @@ struct ath6kl_bmi { ...@@ -272,6 +272,8 @@ struct ath6kl_bmi {
u32 cmd_credits; u32 cmd_credits;
bool done_sent; bool done_sent;
u8 *cmd_buf; u8 *cmd_buf;
u32 max_data_size;
u32 max_cmd_size;
}; };
struct target_stats { struct target_stats {
......
...@@ -1139,6 +1139,7 @@ static int ath6kl_sdio_probe(struct sdio_func *func, ...@@ -1139,6 +1139,7 @@ static int ath6kl_sdio_probe(struct sdio_func *func,
ar_sdio->ar = ar; ar_sdio->ar = ar;
ar->hif_priv = ar_sdio; ar->hif_priv = ar_sdio;
ar->hif_ops = &ath6kl_sdio_ops; ar->hif_ops = &ath6kl_sdio_ops;
ar->bmi.max_data_size = 256;
ath6kl_sdio_set_mbox_info(ar); ath6kl_sdio_set_mbox_info(ar);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment