crypto: talitos - adaptation of talitos_submit() for SEC1
authorLEROY Christophe <christophe.leroy@c-s.fr>
Fri, 17 Apr 2015 14:32:09 +0000 (16:32 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 21 Apr 2015 01:14:42 +0000 (09:14 +0800)
SEC1 descriptor is a bit different to SEC2+ descriptor.
talitos_submit() will have to copy hdr field into hdr1 field and
send the descriptor starting at hdr1 up to next_desc.
For SEC2, it remains unchanged and next_desc is just ignored.

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/talitos.c
drivers/crypto/talitos.h

index 678b5280e7a8112f58bead3dc38096c49664c104..e6ea6510d8f28ca32897665e4b070b50bb88a107 100644 (file)
@@ -236,6 +236,7 @@ int talitos_submit(struct device *dev, int ch, struct talitos_desc *desc,
        struct talitos_request *request;
        unsigned long flags;
        int head;
+       bool is_sec1 = has_ftr_sec1(priv);
 
        spin_lock_irqsave(&priv->chan[ch].head_lock, flags);
 
@@ -249,8 +250,17 @@ int talitos_submit(struct device *dev, int ch, struct talitos_desc *desc,
        request = &priv->chan[ch].fifo[head];
 
        /* map descriptor and save caller data */
-       request->dma_desc = dma_map_single(dev, desc, sizeof(*desc),
-                                          DMA_BIDIRECTIONAL);
+       if (is_sec1) {
+               desc->hdr1 = desc->hdr;
+               desc->next_desc = 0;
+               request->dma_desc = dma_map_single(dev, &desc->hdr1,
+                                                  TALITOS_DESC_SIZE,
+                                                  DMA_BIDIRECTIONAL);
+       } else {
+               request->dma_desc = dma_map_single(dev, desc,
+                                                  TALITOS_DESC_SIZE,
+                                                  DMA_BIDIRECTIONAL);
+       }
        request->callback = callback;
        request->context = context;
 
@@ -282,16 +292,21 @@ static void flush_channel(struct device *dev, int ch, int error, int reset_ch)
        struct talitos_request *request, saved_req;
        unsigned long flags;
        int tail, status;
+       bool is_sec1 = has_ftr_sec1(priv);
 
        spin_lock_irqsave(&priv->chan[ch].tail_lock, flags);
 
        tail = priv->chan[ch].tail;
        while (priv->chan[ch].fifo[tail].desc) {
+               __be32 hdr;
+
                request = &priv->chan[ch].fifo[tail];
 
                /* descriptors with their done bits set don't get the error */
                rmb();
-               if ((request->desc->hdr & DESC_HDR_DONE) == DESC_HDR_DONE)
+               hdr = is_sec1 ? request->desc->hdr1 : request->desc->hdr;
+
+               if ((hdr & DESC_HDR_DONE) == DESC_HDR_DONE)
                        status = 0;
                else
                        if (!error)
@@ -300,7 +315,7 @@ static void flush_channel(struct device *dev, int ch, int error, int reset_ch)
                                status = error;
 
                dma_unmap_single(dev, request->dma_desc,
-                                sizeof(struct talitos_desc),
+                                TALITOS_DESC_SIZE,
                                 DMA_BIDIRECTIONAL);
 
                /* copy entries so we can call callback outside lock */
index b0bdb4ec79fc4784a68a656f2495dc8f632170fb..f827c04a6d1afa09f4b4f5515d1c7596508c06b5 100644 (file)
@@ -69,6 +69,8 @@ struct talitos_desc {
        __be32 next_desc;               /* next descriptor (SEC1) */
 };
 
+#define TALITOS_DESC_SIZE      (sizeof(struct talitos_desc) - sizeof(__be32))
+
 /**
  * talitos_request - descriptor submission request
  * @desc: descriptor pointer (kernel virtual)