Merge tag 'linux-kselftest-kunit-5.15-rc1' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-microblaze.git] / arch / arm / mm / dma-mapping.c
index c4b8df2..4b61541 100644 (file)
@@ -980,7 +980,7 @@ int arm_dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
 {
        const struct dma_map_ops *ops = get_dma_ops(dev);
        struct scatterlist *s;
-       int i, j;
+       int i, j, ret;
 
        for_each_sg(sg, s, nents, i) {
 #ifdef CONFIG_NEED_SG_DMA_LENGTH
@@ -988,15 +988,17 @@ int arm_dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
 #endif
                s->dma_address = ops->map_page(dev, sg_page(s), s->offset,
                                                s->length, dir, attrs);
-               if (dma_mapping_error(dev, s->dma_address))
+               if (dma_mapping_error(dev, s->dma_address)) {
+                       ret = -EIO;
                        goto bad_mapping;
+               }
        }
        return nents;
 
  bad_mapping:
        for_each_sg(sg, s, i, j)
                ops->unmap_page(dev, sg_dma_address(s), sg_dma_len(s), dir, attrs);
-       return 0;
+       return ret;
 }
 
 /**
@@ -1622,7 +1624,7 @@ static int __iommu_map_sg(struct device *dev, struct scatterlist *sg, int nents,
                     bool is_coherent)
 {
        struct scatterlist *s = sg, *dma = sg, *start = sg;
-       int i, count = 0;
+       int i, count = 0, ret;
        unsigned int offset = s->offset;
        unsigned int size = s->offset + s->length;
        unsigned int max = dma_get_max_seg_size(dev);
@@ -1630,12 +1632,13 @@ static int __iommu_map_sg(struct device *dev, struct scatterlist *sg, int nents,
        for (i = 1; i < nents; i++) {
                s = sg_next(s);
 
-               s->dma_address = DMA_MAPPING_ERROR;
                s->dma_length = 0;
 
                if (s->offset || (size & ~PAGE_MASK) || size + s->length > max) {
-                       if (__map_sg_chunk(dev, start, size, &dma->dma_address,
-                           dir, attrs, is_coherent) < 0)
+                       ret = __map_sg_chunk(dev, start, size,
+                                            &dma->dma_address, dir, attrs,
+                                            is_coherent);
+                       if (ret < 0)
                                goto bad_mapping;
 
                        dma->dma_address += offset;
@@ -1648,8 +1651,9 @@ static int __iommu_map_sg(struct device *dev, struct scatterlist *sg, int nents,
                }
                size += s->length;
        }
-       if (__map_sg_chunk(dev, start, size, &dma->dma_address, dir, attrs,
-               is_coherent) < 0)
+       ret = __map_sg_chunk(dev, start, size, &dma->dma_address, dir, attrs,
+                            is_coherent);
+       if (ret < 0)
                goto bad_mapping;
 
        dma->dma_address += offset;
@@ -1660,7 +1664,9 @@ static int __iommu_map_sg(struct device *dev, struct scatterlist *sg, int nents,
 bad_mapping:
        for_each_sg(sg, s, count, i)
                __iommu_remove_mapping(dev, sg_dma_address(s), sg_dma_len(s));
-       return 0;
+       if (ret == -ENOMEM)
+               return ret;
+       return -EINVAL;
 }
 
 /**