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>
This commit is contained in:
parent
66b693c3b8
commit
1f4c894d3a
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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 @@
|
|||||||
* 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 {
|
|||||||
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,
|
|||||||
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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user