Skip to content

Commit 3d1d944

Browse files
noctuellesgregkh
authored andcommitted
crypto: talitos - use dma_sync_single_for_cpu() before reading descriptor header
commit e17ff3d upstream. In order to know if a descriptor has been processed by the device, the driver polls the FIFO to see if DESC_HDR_DONE is set on a descriptor header to confirm completion. The current code does not make sure that the CPU gets up to date data before reading the descriptor. Fix this by calling dma_sync_single_for_cpu() before reading memory written by the device. Cc: stable@vger.kernel.org Fixes: 58cdbc6 ("crypto: talitos - fix hash on SEC1.") Signed-off-by: Paul Louvel <paul.louvel@bootlin.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 5003198 commit 3d1d944

1 file changed

Lines changed: 19 additions & 7 deletions

File tree

drivers/crypto/talitos.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -322,19 +322,31 @@ static int talitos_submit(struct device *dev, int ch, struct talitos_desc *desc,
322322
return -EINPROGRESS;
323323
}
324324

325-
static __be32 get_request_hdr(struct talitos_request *request, bool is_sec1)
325+
static __be32 get_request_hdr(struct device *dev,
326+
struct talitos_request *request, bool is_sec1)
326327
{
327328
struct talitos_edesc *edesc;
328329

329-
if (!is_sec1)
330+
if (!is_sec1) {
331+
dma_sync_single_for_cpu(dev, request->dma_desc,
332+
TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL);
333+
330334
return request->desc->hdr;
335+
}
331336

332-
if (!request->desc->next_desc)
337+
if (!request->desc->next_desc) {
338+
dma_sync_single_for_cpu(dev, request->dma_desc,
339+
TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL);
333340
return request->desc->hdr1;
341+
} else {
342+
dma_sync_single_for_cpu(dev,
343+
be32_to_cpu(request->desc->next_desc),
344+
TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL);
345+
edesc = container_of(request->desc, struct talitos_edesc, desc);
334346

335-
edesc = container_of(request->desc, struct talitos_edesc, desc);
336-
337-
return ((struct talitos_desc *)(edesc->buf + edesc->dma_len))->hdr1;
347+
return ((struct talitos_desc *)(edesc->buf + edesc->dma_len))
348+
->hdr1;
349+
}
338350
}
339351

340352
/*
@@ -358,7 +370,7 @@ static void flush_channel(struct device *dev, int ch, int error, int reset_ch)
358370

359371
/* descriptors with their done bits set don't get the error */
360372
rmb();
361-
hdr = get_request_hdr(request, is_sec1);
373+
hdr = get_request_hdr(dev, request, is_sec1);
362374

363375
if ((hdr & DESC_HDR_DONE) == DESC_HDR_DONE)
364376
status = 0;

0 commit comments

Comments
 (0)