Commit 42c5675c authored by Eric Biggers's avatar Eric Biggers Committed by Herbert Xu
Browse files

crypto: omap - switch from scatter_walk to plain offset



The omap driver was using struct scatter_walk, but only to maintain an
offset, rather than iterating through the virtual addresses of the data
contained in the scatterlist which is what scatter_walk is intended for.
Make it just use a plain offset instead.  This is simpler and avoids
using struct scatter_walk in a way that is not well supported.

Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent ee3c9c7e
Loading
Loading
Loading
Loading
+14 −20
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@
#include <crypto/internal/aead.h>
#include <crypto/internal/engine.h>
#include <crypto/internal/skcipher.h>
#include <crypto/scatterwalk.h>
#include <linux/dma-mapping.h>
#include <linux/dmaengine.h>
#include <linux/err.h>
@@ -272,9 +271,9 @@ static int omap_aes_crypt_dma(struct omap_aes_dev *dd,
	int ret;

	if (dd->pio_only) {
		scatterwalk_start(&dd->in_walk, dd->in_sg);
		dd->in_sg_offset = 0;
		if (out_sg_len)
			scatterwalk_start(&dd->out_walk, dd->out_sg);
			dd->out_sg_offset = 0;

		/* Enable DATAIN interrupt and let it take
		   care of the rest */
@@ -871,21 +870,18 @@ static irqreturn_t omap_aes_irq(int irq, void *dev_id)

		BUG_ON(!dd->in_sg);

		BUG_ON(_calc_walked(in) > dd->in_sg->length);
		BUG_ON(dd->in_sg_offset > dd->in_sg->length);

		src = sg_virt(dd->in_sg) + _calc_walked(in);
		src = sg_virt(dd->in_sg) + dd->in_sg_offset;

		for (i = 0; i < AES_BLOCK_WORDS; i++) {
			omap_aes_write(dd, AES_REG_DATA_N(dd, i), *src);

			scatterwalk_advance(&dd->in_walk, 4);
			if (dd->in_sg->length == _calc_walked(in)) {
			dd->in_sg_offset += 4;
			if (dd->in_sg_offset == dd->in_sg->length) {
				dd->in_sg = sg_next(dd->in_sg);
				if (dd->in_sg) {
					scatterwalk_start(&dd->in_walk,
							  dd->in_sg);
					src = sg_virt(dd->in_sg) +
					      _calc_walked(in);
					dd->in_sg_offset = 0;
					src = sg_virt(dd->in_sg);
				}
			} else {
				src++;
@@ -904,20 +900,18 @@ static irqreturn_t omap_aes_irq(int irq, void *dev_id)

		BUG_ON(!dd->out_sg);

		BUG_ON(_calc_walked(out) > dd->out_sg->length);
		BUG_ON(dd->out_sg_offset > dd->out_sg->length);

		dst = sg_virt(dd->out_sg) + _calc_walked(out);
		dst = sg_virt(dd->out_sg) + dd->out_sg_offset;

		for (i = 0; i < AES_BLOCK_WORDS; i++) {
			*dst = omap_aes_read(dd, AES_REG_DATA_N(dd, i));
			scatterwalk_advance(&dd->out_walk, 4);
			if (dd->out_sg->length == _calc_walked(out)) {
			dd->out_sg_offset += 4;
			if (dd->out_sg_offset == dd->out_sg->length) {
				dd->out_sg = sg_next(dd->out_sg);
				if (dd->out_sg) {
					scatterwalk_start(&dd->out_walk,
							  dd->out_sg);
					dst = sg_virt(dd->out_sg) +
					      _calc_walked(out);
					dd->out_sg_offset = 0;
					dst = sg_virt(dd->out_sg);
				}
			} else {
				dst++;
+2 −4
Original line number Diff line number Diff line
@@ -14,8 +14,6 @@
#define DST_MAXBURST			4
#define DMA_MIN				(DST_MAXBURST * sizeof(u32))

#define _calc_walked(inout) (dd->inout##_walk.offset - dd->inout##_sg->offset)

/*
 * OMAP TRM gives bitfields as start:end, where start is the higher bit
 * number. For example 7:0
@@ -186,8 +184,8 @@ struct omap_aes_dev {
	struct scatterlist		out_sgl;
	struct scatterlist		*orig_out;

	struct scatter_walk		in_walk;
	struct scatter_walk		out_walk;
	unsigned int		in_sg_offset;
	unsigned int		out_sg_offset;
	struct dma_chan		*dma_lch_in;
	struct dma_chan		*dma_lch_out;
	int			in_sg_len;
+16 −24
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@
#include <crypto/engine.h>
#include <crypto/internal/des.h>
#include <crypto/internal/skcipher.h>
#include <crypto/scatterwalk.h>
#include <linux/dma-mapping.h>
#include <linux/dmaengine.h>
#include <linux/err.h>
@@ -40,8 +39,6 @@

#define DES_BLOCK_WORDS		(DES_BLOCK_SIZE >> 2)

#define _calc_walked(inout) (dd->inout##_walk.offset - dd->inout##_sg->offset)

#define DES_REG_KEY(dd, x)		((dd)->pdata->key_ofs - \
						((x ^ 0x01) * 0x04))

@@ -152,8 +149,8 @@ struct omap_des_dev {
	struct scatterlist		out_sgl;
	struct scatterlist		*orig_out;

	struct scatter_walk		in_walk;
	struct scatter_walk		out_walk;
	unsigned int		in_sg_offset;
	unsigned int		out_sg_offset;
	struct dma_chan		*dma_lch_in;
	struct dma_chan		*dma_lch_out;
	int			in_sg_len;
@@ -379,8 +376,8 @@ static int omap_des_crypt_dma(struct crypto_tfm *tfm,
	int ret;

	if (dd->pio_only) {
		scatterwalk_start(&dd->in_walk, dd->in_sg);
		scatterwalk_start(&dd->out_walk, dd->out_sg);
		dd->in_sg_offset = 0;
		dd->out_sg_offset = 0;

		/* Enable DATAIN interrupt and let it take
		   care of the rest */
@@ -836,21 +833,18 @@ static irqreturn_t omap_des_irq(int irq, void *dev_id)

		BUG_ON(!dd->in_sg);

		BUG_ON(_calc_walked(in) > dd->in_sg->length);
		BUG_ON(dd->in_sg_offset > dd->in_sg->length);

		src = sg_virt(dd->in_sg) + _calc_walked(in);
		src = sg_virt(dd->in_sg) + dd->in_sg_offset;

		for (i = 0; i < DES_BLOCK_WORDS; i++) {
			omap_des_write(dd, DES_REG_DATA_N(dd, i), *src);

			scatterwalk_advance(&dd->in_walk, 4);
			if (dd->in_sg->length == _calc_walked(in)) {
			dd->in_sg_offset += 4;
			if (dd->in_sg_offset == dd->in_sg->length) {
				dd->in_sg = sg_next(dd->in_sg);
				if (dd->in_sg) {
					scatterwalk_start(&dd->in_walk,
							  dd->in_sg);
					src = sg_virt(dd->in_sg) +
					      _calc_walked(in);
					dd->in_sg_offset = 0;
					src = sg_virt(dd->in_sg);
				}
			} else {
				src++;
@@ -869,20 +863,18 @@ static irqreturn_t omap_des_irq(int irq, void *dev_id)

		BUG_ON(!dd->out_sg);

		BUG_ON(_calc_walked(out) > dd->out_sg->length);
		BUG_ON(dd->out_sg_offset > dd->out_sg->length);

		dst = sg_virt(dd->out_sg) + _calc_walked(out);
		dst = sg_virt(dd->out_sg) + dd->out_sg_offset;

		for (i = 0; i < DES_BLOCK_WORDS; i++) {
			*dst = omap_des_read(dd, DES_REG_DATA_N(dd, i));
			scatterwalk_advance(&dd->out_walk, 4);
			if (dd->out_sg->length == _calc_walked(out)) {
			dd->out_sg_offset += 4;
			if (dd->out_sg_offset == dd->out_sg->length) {
				dd->out_sg = sg_next(dd->out_sg);
				if (dd->out_sg) {
					scatterwalk_start(&dd->out_walk,
							  dd->out_sg);
					dst = sg_virt(dd->out_sg) +
					      _calc_walked(out);
					dd->out_sg_offset = 0;
					dst = sg_virt(dd->out_sg);
				}
			} else {
				dst++;