Commit 114e2ccd authored by Gary R Hook's avatar Gary R Hook Committed by Herbert Xu

crypto: ccp - Clean up and exit correctly on allocation failure

Return and fail driver initialization if a DMA pool or coherent memory
can't be allocated. Be sure to clean up allocated memory.

Fixes: 4b394a23 ("crypto: ccp - Let a v5 CCP provide the same function as v3")
Signed-off-by: default avatarGary R Hook <gary.hook@amd.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 514838e9
...@@ -803,6 +803,7 @@ static int ccp5_init(struct ccp_device *ccp) ...@@ -803,6 +803,7 @@ static int ccp5_init(struct ccp_device *ccp)
if (!dma_pool) { if (!dma_pool) {
dev_err(dev, "unable to allocate dma pool\n"); dev_err(dev, "unable to allocate dma pool\n");
ret = -ENOMEM; ret = -ENOMEM;
goto e_pool;
} }
cmd_q = &ccp->cmd_q[ccp->cmd_q_count]; cmd_q = &ccp->cmd_q[ccp->cmd_q_count];
...@@ -816,9 +817,9 @@ static int ccp5_init(struct ccp_device *ccp) ...@@ -816,9 +817,9 @@ static int ccp5_init(struct ccp_device *ccp)
/* Page alignment satisfies our needs for N <= 128 */ /* Page alignment satisfies our needs for N <= 128 */
BUILD_BUG_ON(COMMANDS_PER_QUEUE > 128); BUILD_BUG_ON(COMMANDS_PER_QUEUE > 128);
cmd_q->qsize = Q_SIZE(Q_DESC_SIZE); cmd_q->qsize = Q_SIZE(Q_DESC_SIZE);
cmd_q->qbase = dma_alloc_coherent(dev, cmd_q->qsize, cmd_q->qbase = dmam_alloc_coherent(dev, cmd_q->qsize,
&cmd_q->qbase_dma, &cmd_q->qbase_dma,
GFP_KERNEL); GFP_KERNEL);
if (!cmd_q->qbase) { if (!cmd_q->qbase) {
dev_err(dev, "unable to allocate command queue\n"); dev_err(dev, "unable to allocate command queue\n");
ret = -ENOMEM; ret = -ENOMEM;
...@@ -994,7 +995,6 @@ static int ccp5_init(struct ccp_device *ccp) ...@@ -994,7 +995,6 @@ static int ccp5_init(struct ccp_device *ccp)
static void ccp5_destroy(struct ccp_device *ccp) static void ccp5_destroy(struct ccp_device *ccp)
{ {
struct device *dev = ccp->dev;
struct ccp_cmd_queue *cmd_q; struct ccp_cmd_queue *cmd_q;
struct ccp_cmd *cmd; struct ccp_cmd *cmd;
unsigned int i; unsigned int i;
...@@ -1037,12 +1037,6 @@ static void ccp5_destroy(struct ccp_device *ccp) ...@@ -1037,12 +1037,6 @@ static void ccp5_destroy(struct ccp_device *ccp)
sp_free_ccp_irq(ccp->sp, ccp); sp_free_ccp_irq(ccp->sp, ccp);
for (i = 0; i < ccp->cmd_q_count; i++) {
cmd_q = &ccp->cmd_q[i];
dma_free_coherent(dev, cmd_q->qsize, cmd_q->qbase,
cmd_q->qbase_dma);
}
/* Flush the cmd and backlog queue */ /* Flush the cmd and backlog queue */
while (!list_empty(&ccp->cmd)) { while (!list_empty(&ccp->cmd)) {
/* Invoke the callback directly with an error code */ /* Invoke the callback directly with an error code */
......
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