diff options
Diffstat (limited to 'lib/scatterlist.c')
| -rw-r--r-- | lib/scatterlist.c | 26 | 
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 9ba349e775ef..739dc9fe2c55 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -625,6 +625,32 @@ bool __sg_page_iter_next(struct sg_page_iter *piter)  }  EXPORT_SYMBOL(__sg_page_iter_next); +static int sg_dma_page_count(struct scatterlist *sg) +{ +	return PAGE_ALIGN(sg->offset + sg_dma_len(sg)) >> PAGE_SHIFT; +} + +bool __sg_page_iter_dma_next(struct sg_dma_page_iter *dma_iter) +{ +	struct sg_page_iter *piter = &dma_iter->base; + +	if (!piter->__nents || !piter->sg) +		return false; + +	piter->sg_pgoffset += piter->__pg_advance; +	piter->__pg_advance = 1; + +	while (piter->sg_pgoffset >= sg_dma_page_count(piter->sg)) { +		piter->sg_pgoffset -= sg_dma_page_count(piter->sg); +		piter->sg = sg_next(piter->sg); +		if (!--piter->__nents || !piter->sg) +			return false; +	} + +	return true; +} +EXPORT_SYMBOL(__sg_page_iter_dma_next); +  /**   * sg_miter_start - start mapping iteration over a sg list   * @miter: sg mapping iter to be started  | 
