diff options
Diffstat (limited to 'drivers/dma/ioat/dma_v2.c')
| -rw-r--r-- | drivers/dma/ioat/dma_v2.c | 13 | 
1 files changed, 6 insertions, 7 deletions
diff --git a/drivers/dma/ioat/dma_v2.c b/drivers/dma/ioat/dma_v2.c index b925e1b1d13..8d1058085ee 100644 --- a/drivers/dma/ioat/dma_v2.c +++ b/drivers/dma/ioat/dma_v2.c @@ -148,7 +148,7 @@ static void __cleanup(struct ioat2_dma_chan *ioat, dma_addr_t phys_complete)  		tx = &desc->txd;  		dump_desc_dbg(ioat, desc);  		if (tx->cookie) { -			ioat_dma_unmap(chan, tx->flags, desc->len, desc->hw); +			dma_descriptor_unmap(tx);  			dma_cookie_complete(tx);  			if (tx->callback) {  				tx->callback(tx->callback_param); @@ -190,8 +190,11 @@ static void ioat2_cleanup(struct ioat2_dma_chan *ioat)  void ioat2_cleanup_event(unsigned long data)  {  	struct ioat2_dma_chan *ioat = to_ioat2_chan((void *) data); +	struct ioat_chan_common *chan = &ioat->base;  	ioat2_cleanup(ioat); +	if (!test_bit(IOAT_RUN, &chan->state)) +		return;  	writew(IOAT_CHANCTRL_RUN, ioat->base.reg_base + IOAT_CHANCTRL_OFFSET);  } @@ -553,10 +556,10 @@ int ioat2_alloc_chan_resources(struct dma_chan *c)  	ioat->issued = 0;  	ioat->tail = 0;  	ioat->alloc_order = order; +	set_bit(IOAT_RUN, &chan->state);  	spin_unlock_bh(&ioat->prep_lock);  	spin_unlock_bh(&chan->cleanup_lock); -	tasklet_enable(&chan->cleanup_task);  	ioat2_start_null_desc(ioat);  	/* check that we got off the ground */ @@ -566,7 +569,6 @@ int ioat2_alloc_chan_resources(struct dma_chan *c)  	} while (i++ < 20 && !is_ioat_active(status) && !is_ioat_idle(status));  	if (is_ioat_active(status) || is_ioat_idle(status)) { -		set_bit(IOAT_RUN, &chan->state);  		return 1 << ioat->alloc_order;  	} else {  		u32 chanerr = readl(chan->reg_base + IOAT_CHANERR_OFFSET); @@ -809,11 +811,8 @@ void ioat2_free_chan_resources(struct dma_chan *c)  	if (!ioat->ring)  		return; -	tasklet_disable(&chan->cleanup_task); -	del_timer_sync(&chan->timer); -	device->cleanup_fn((unsigned long) c); +	ioat_stop(chan);  	device->reset_hw(chan); -	clear_bit(IOAT_RUN, &chan->state);  	spin_lock_bh(&chan->cleanup_lock);  	spin_lock_bh(&ioat->prep_lock);  | 
