|
@@ -169,6 +169,7 @@ struct omap_aes_dev {
|
|
|
struct dma_chan *dma_lch_out;
|
|
|
int in_sg_len;
|
|
|
int out_sg_len;
|
|
|
+ int pio_only;
|
|
|
const struct omap_aes_pdata *pdata;
|
|
|
};
|
|
|
|
|
@@ -408,6 +409,16 @@ static int omap_aes_crypt_dma(struct crypto_tfm *tfm,
|
|
|
struct dma_slave_config cfg;
|
|
|
int ret;
|
|
|
|
|
|
+ if (dd->pio_only) {
|
|
|
+ scatterwalk_start(&dd->in_walk, dd->in_sg);
|
|
|
+ scatterwalk_start(&dd->out_walk, dd->out_sg);
|
|
|
+
|
|
|
+ /* Enable DATAIN interrupt and let it take
|
|
|
+ care of the rest */
|
|
|
+ omap_aes_write(dd, AES_REG_IRQ_ENABLE(dd), 0x2);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
dma_sync_sg_for_device(dd->dev, dd->in_sg, in_sg_len, DMA_TO_DEVICE);
|
|
|
|
|
|
memset(&cfg, 0, sizeof(cfg));
|
|
@@ -477,21 +488,25 @@ static int omap_aes_crypt_dma_start(struct omap_aes_dev *dd)
|
|
|
|
|
|
pr_debug("total: %d\n", dd->total);
|
|
|
|
|
|
- err = dma_map_sg(dd->dev, dd->in_sg, dd->in_sg_len, DMA_TO_DEVICE);
|
|
|
- if (!err) {
|
|
|
- dev_err(dd->dev, "dma_map_sg() error\n");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
+ if (!dd->pio_only) {
|
|
|
+ err = dma_map_sg(dd->dev, dd->in_sg, dd->in_sg_len,
|
|
|
+ DMA_TO_DEVICE);
|
|
|
+ if (!err) {
|
|
|
+ dev_err(dd->dev, "dma_map_sg() error\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
|
|
|
- err = dma_map_sg(dd->dev, dd->out_sg, dd->out_sg_len, DMA_FROM_DEVICE);
|
|
|
- if (!err) {
|
|
|
- dev_err(dd->dev, "dma_map_sg() error\n");
|
|
|
- return -EINVAL;
|
|
|
+ err = dma_map_sg(dd->dev, dd->out_sg, dd->out_sg_len,
|
|
|
+ DMA_FROM_DEVICE);
|
|
|
+ if (!err) {
|
|
|
+ dev_err(dd->dev, "dma_map_sg() error\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
err = omap_aes_crypt_dma(tfm, dd->in_sg, dd->out_sg, dd->in_sg_len,
|
|
|
dd->out_sg_len);
|
|
|
- if (err) {
|
|
|
+ if (err && !dd->pio_only) {
|
|
|
dma_unmap_sg(dd->dev, dd->in_sg, dd->in_sg_len, DMA_TO_DEVICE);
|
|
|
dma_unmap_sg(dd->dev, dd->out_sg, dd->out_sg_len,
|
|
|
DMA_FROM_DEVICE);
|
|
@@ -594,9 +609,11 @@ static void omap_aes_done_task(unsigned long data)
|
|
|
|
|
|
pr_debug("enter done_task\n");
|
|
|
|
|
|
- dma_sync_sg_for_cpu(dd->dev, dd->in_sg, dd->in_sg_len, DMA_FROM_DEVICE);
|
|
|
-
|
|
|
- omap_aes_crypt_dma_stop(dd);
|
|
|
+ if (!dd->pio_only) {
|
|
|
+ dma_sync_sg_for_device(dd->dev, dd->out_sg, dd->out_sg_len,
|
|
|
+ DMA_FROM_DEVICE);
|
|
|
+ omap_aes_crypt_dma_stop(dd);
|
|
|
+ }
|
|
|
omap_aes_finish_req(dd, 0);
|
|
|
omap_aes_handle_queue(dd, NULL);
|
|
|
|