diff options
Diffstat (limited to 'drivers/dma/at_hdmac.c')
| -rw-r--r-- | drivers/dma/at_hdmac.c | 13 | 
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c index 3934fcc4e00..7ab6e26664a 100644 --- a/drivers/dma/at_hdmac.c +++ b/drivers/dma/at_hdmac.c @@ -661,7 +661,7 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,  			flags);  	if (unlikely(!atslave || !sg_len)) { -		dev_dbg(chan2dev(chan), "prep_dma_memcpy: length is zero!\n"); +		dev_dbg(chan2dev(chan), "prep_slave_sg: sg length is zero!\n");  		return NULL;  	} @@ -689,6 +689,11 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,  			mem = sg_dma_address(sg);  			len = sg_dma_len(sg); +			if (unlikely(!len)) { +				dev_dbg(chan2dev(chan), +					"prep_slave_sg: sg(%d) data length is zero\n", i); +				goto err; +			}  			mem_width = 2;  			if (unlikely(mem & 3 || len & 3))  				mem_width = 0; @@ -724,6 +729,11 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,  			mem = sg_dma_address(sg);  			len = sg_dma_len(sg); +			if (unlikely(!len)) { +				dev_dbg(chan2dev(chan), +					"prep_slave_sg: sg(%d) data length is zero\n", i); +				goto err; +			}  			mem_width = 2;  			if (unlikely(mem & 3 || len & 3))  				mem_width = 0; @@ -757,6 +767,7 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,  err_desc_get:  	dev_err(chan2dev(chan), "not enough descriptors available\n"); +err:  	atc_desc_put(atchan, first);  	return NULL;  }  |