Skip to content

Commit 16b8c7e

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 ad382c5 commit 16b8c7e

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
@@ -321,19 +321,31 @@ static int talitos_submit(struct device *dev, int ch, struct talitos_desc *desc,
321321
return -EINPROGRESS;
322322
}
323323

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

328-
if (!is_sec1)
329+
if (!is_sec1) {
330+
dma_sync_single_for_cpu(dev, request->dma_desc,
331+
TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL);
332+
329333
return request->desc->hdr;
334+
}
330335

331-
if (!request->desc->next_desc)
336+
if (!request->desc->next_desc) {
337+
dma_sync_single_for_cpu(dev, request->dma_desc,
338+
TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL);
332339
return request->desc->hdr1;
340+
} else {
341+
dma_sync_single_for_cpu(dev,
342+
be32_to_cpu(request->desc->next_desc),
343+
TALITOS_DESC_SIZE, DMA_BIDIRECTIONAL);
344+
edesc = container_of(request->desc, struct talitos_edesc, desc);
333345

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

339351
/*
@@ -357,7 +369,7 @@ static void flush_channel(struct device *dev, int ch, int error, int reset_ch)
357369

358370
/* descriptors with their done bits set don't get the error */
359371
rmb();
360-
hdr = get_request_hdr(request, is_sec1);
372+
hdr = get_request_hdr(dev, request, is_sec1);
361373

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

0 commit comments

Comments
 (0)