Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c94711c authored by Herbert Xu's avatar Herbert Xu
Browse files

crypto: caam - Handle errors in dma_map_sg_chained



Currently dma_map_sg_chained does not handle errors from the
underlying dma_map_sg calls.  This patch adds rollback in case
of an error by simply calling dma_unmap_sg_chained for the ones
that we've already mapped.

All current callers ignore the return value so this should have
no impact on them.

Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 201f28f0
Loading
Loading
Loading
Loading
+21 −14
Original line number Diff line number Diff line
@@ -100,34 +100,41 @@ static inline int sg_count(struct scatterlist *sg_list, int nbytes,
	return sg_nents;
}

static int dma_map_sg_chained(struct device *dev, struct scatterlist *sg,
			      unsigned int nents, enum dma_data_direction dir,
			      bool chained)
static inline void dma_unmap_sg_chained(
	struct device *dev, struct scatterlist *sg, unsigned int nents,
	enum dma_data_direction dir, bool chained)
{
	if (unlikely(chained)) {
		int i;
		for (i = 0; i < nents; i++) {
			dma_map_sg(dev, sg, 1, dir);
			dma_unmap_sg(dev, sg, 1, dir);
			sg = sg_next(sg);
		}
	} else {
		dma_map_sg(dev, sg, nents, dir);
	} else if (nents) {
		dma_unmap_sg(dev, sg, nents, dir);
	}
	return nents;
}

static int dma_unmap_sg_chained(struct device *dev, struct scatterlist *sg,
				unsigned int nents, enum dma_data_direction dir,
				bool chained)
static inline int dma_map_sg_chained(
	struct device *dev, struct scatterlist *sg, unsigned int nents,
	enum dma_data_direction dir, bool chained)
{
	struct scatterlist *first = sg;

	if (unlikely(chained)) {
		int i;
		for (i = 0; i < nents; i++) {
			dma_unmap_sg(dev, sg, 1, dir);
			sg = sg_next(sg);
			if (!dma_map_sg(dev, sg, 1, dir)) {
				dma_unmap_sg_chained(dev, first, i, dir,
						     chained);
				nents = 0;
				break;
			}
	} else {
		dma_unmap_sg(dev, sg, nents, dir);

			sg = sg_next(sg);
		}
	} else
		nents = dma_map_sg(dev, sg, nents, dir);

	return nents;
}