mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 16:44:58 +02:00
x86/amd_gart: return error code from gart_map_sg()
The .map_sg() op now expects an error code instead of zero on failure. So make __dma_map_cont() return a valid errno (which is then propagated to gart_map_sg() via dma_map_cont()) and return it in case of failure. Also, return -EINVAL in case of invalid nents. Signed-off-by: Martin Oliveira <martin.oliveira@eideticom.com> Signed-off-by: Logan Gunthorpe <logang@deltatee.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Niklas Schnelle <schnelle@linux.ibm.com> Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Cc: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
2c647ebe17
commit
fcacc8a614
|
|
@ -331,7 +331,7 @@ static int __dma_map_cont(struct device *dev, struct scatterlist *start,
|
|||
int i;
|
||||
|
||||
if (iommu_start == -1)
|
||||
return -1;
|
||||
return -ENOMEM;
|
||||
|
||||
for_each_sg(start, s, nelems, i) {
|
||||
unsigned long pages, addr;
|
||||
|
|
@ -380,13 +380,13 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
|||
enum dma_data_direction dir, unsigned long attrs)
|
||||
{
|
||||
struct scatterlist *s, *ps, *start_sg, *sgmap;
|
||||
int need = 0, nextneed, i, out, start;
|
||||
int need = 0, nextneed, i, out, start, ret;
|
||||
unsigned long pages = 0;
|
||||
unsigned int seg_size;
|
||||
unsigned int max_seg_size;
|
||||
|
||||
if (nents == 0)
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
|
||||
out = 0;
|
||||
start = 0;
|
||||
|
|
@ -414,8 +414,9 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
|||
if (!iommu_merge || !nextneed || !need || s->offset ||
|
||||
(s->length + seg_size > max_seg_size) ||
|
||||
(ps->offset + ps->length) % PAGE_SIZE) {
|
||||
if (dma_map_cont(dev, start_sg, i - start,
|
||||
sgmap, pages, need) < 0)
|
||||
ret = dma_map_cont(dev, start_sg, i - start,
|
||||
sgmap, pages, need);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
out++;
|
||||
|
||||
|
|
@ -432,7 +433,8 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
|||
pages += iommu_num_pages(s->offset, s->length, PAGE_SIZE);
|
||||
ps = s;
|
||||
}
|
||||
if (dma_map_cont(dev, start_sg, i - start, sgmap, pages, need) < 0)
|
||||
ret = dma_map_cont(dev, start_sg, i - start, sgmap, pages, need);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
out++;
|
||||
flush_gart();
|
||||
|
|
@ -458,7 +460,7 @@ static int gart_map_sg(struct device *dev, struct scatterlist *sg, int nents,
|
|||
iommu_full(dev, pages << PAGE_SHIFT, dir);
|
||||
for_each_sg(sg, s, nents, i)
|
||||
s->dma_address = DMA_MAPPING_ERROR;
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* allocate and map a coherent mapping */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user