|
@@ -330,8 +330,12 @@ static void s5p_aes_tx(struct s5p_aes_dev *dev)
|
|
|
}
|
|
|
|
|
|
s5p_set_dma_outdata(dev, dev->sg_dst);
|
|
|
- } else
|
|
|
+ } else {
|
|
|
s5p_aes_complete(dev, err);
|
|
|
+
|
|
|
+ dev->busy = true;
|
|
|
+ tasklet_schedule(&dev->tasklet);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void s5p_aes_rx(struct s5p_aes_dev *dev)
|
|
@@ -469,10 +473,13 @@ static void s5p_tasklet_cb(unsigned long data)
|
|
|
spin_lock_irqsave(&dev->lock, flags);
|
|
|
backlog = crypto_get_backlog(&dev->queue);
|
|
|
async_req = crypto_dequeue_request(&dev->queue);
|
|
|
- spin_unlock_irqrestore(&dev->lock, flags);
|
|
|
|
|
|
- if (!async_req)
|
|
|
+ if (!async_req) {
|
|
|
+ dev->busy = false;
|
|
|
+ spin_unlock_irqrestore(&dev->lock, flags);
|
|
|
return;
|
|
|
+ }
|
|
|
+ spin_unlock_irqrestore(&dev->lock, flags);
|
|
|
|
|
|
if (backlog)
|
|
|
backlog->complete(backlog, -EINPROGRESS);
|
|
@@ -491,14 +498,13 @@ static int s5p_aes_handle_req(struct s5p_aes_dev *dev,
|
|
|
int err;
|
|
|
|
|
|
spin_lock_irqsave(&dev->lock, flags);
|
|
|
+ err = ablkcipher_enqueue_request(&dev->queue, req);
|
|
|
if (dev->busy) {
|
|
|
- err = -EAGAIN;
|
|
|
spin_unlock_irqrestore(&dev->lock, flags);
|
|
|
goto exit;
|
|
|
}
|
|
|
dev->busy = true;
|
|
|
|
|
|
- err = ablkcipher_enqueue_request(&dev->queue, req);
|
|
|
spin_unlock_irqrestore(&dev->lock, flags);
|
|
|
|
|
|
tasklet_schedule(&dev->tasklet);
|
|
@@ -683,6 +689,7 @@ static int s5p_aes_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ pdata->busy = false;
|
|
|
pdata->variant = variant;
|
|
|
pdata->dev = dev;
|
|
|
platform_set_drvdata(pdev, pdata);
|