2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-26 22:24:09 +08:00

ASoC: Intel: Allocate for the mailbox with max size

Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Subhransu S. Prusty 2015-05-19 15:00:40 +05:30 committed by Mark Brown
parent edd8ed496b
commit 859c34bd3c
2 changed files with 30 additions and 3 deletions

View File

@ -129,11 +129,31 @@ static int msg_empty_list_init(struct sst_generic_ipc *ipc)
return -ENOMEM; return -ENOMEM;
for (i = 0; i < IPC_EMPTY_LIST_SIZE; i++) { for (i = 0; i < IPC_EMPTY_LIST_SIZE; i++) {
ipc->msg[i].tx_data = kzalloc(ipc->tx_data_max_size, GFP_KERNEL);
if (ipc->msg[i].tx_data == NULL)
goto free_mem;
ipc->msg[i].rx_data = kzalloc(ipc->rx_data_max_size, GFP_KERNEL);
if (ipc->msg[i].rx_data == NULL) {
kfree(ipc->msg[i].tx_data);
goto free_mem;
}
init_waitqueue_head(&ipc->msg[i].waitq); init_waitqueue_head(&ipc->msg[i].waitq);
list_add(&ipc->msg[i].list, &ipc->empty_list); list_add(&ipc->msg[i].list, &ipc->empty_list);
} }
return 0; return 0;
free_mem:
while (i > 0) {
kfree(ipc->msg[i-1].tx_data);
kfree(ipc->msg[i-1].rx_data);
--i;
}
kfree(ipc->msg);
return -ENOMEM;
} }
static void ipc_tx_msgs(struct kthread_work *work) static void ipc_tx_msgs(struct kthread_work *work)
@ -279,11 +299,18 @@ EXPORT_SYMBOL_GPL(sst_ipc_init);
void sst_ipc_fini(struct sst_generic_ipc *ipc) void sst_ipc_fini(struct sst_generic_ipc *ipc)
{ {
int i;
if (ipc->tx_thread) if (ipc->tx_thread)
kthread_stop(ipc->tx_thread); kthread_stop(ipc->tx_thread);
if (ipc->msg) if (ipc->msg) {
for (i = 0; i < IPC_EMPTY_LIST_SIZE; i++) {
kfree(ipc->msg[i].tx_data);
kfree(ipc->msg[i].rx_data);
}
kfree(ipc->msg); kfree(ipc->msg);
}
} }
EXPORT_SYMBOL_GPL(sst_ipc_fini); EXPORT_SYMBOL_GPL(sst_ipc_fini);

View File

@ -32,9 +32,9 @@ struct ipc_message {
u64 header; u64 header;
/* direction wrt host CPU */ /* direction wrt host CPU */
char tx_data[IPC_MAX_MAILBOX_BYTES]; char *tx_data;
size_t tx_size; size_t tx_size;
char rx_data[IPC_MAX_MAILBOX_BYTES]; char *rx_data;
size_t rx_size; size_t rx_size;
wait_queue_head_t waitq; wait_queue_head_t waitq;