diff options
Diffstat (limited to 'drivers/dma/ioat_dma.c')
| -rw-r--r-- | drivers/dma/ioat_dma.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c index b0438c4f0c3..6607fdd00b1 100644 --- a/drivers/dma/ioat_dma.c +++ b/drivers/dma/ioat_dma.c @@ -525,7 +525,7 @@ static dma_cookie_t ioat1_tx_submit(struct dma_async_tx_descriptor *tx)  	}  	hw->ctl = IOAT_DMA_DESCRIPTOR_CTL_CP_STS; -	if (new->async_tx.callback) { +	if (first->async_tx.callback) {  		hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_INT_GN;  		if (first != new) {  			/* move callback into to last desc */ @@ -617,7 +617,7 @@ static dma_cookie_t ioat2_tx_submit(struct dma_async_tx_descriptor *tx)  	}  	hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_CP_STS; -	if (new->async_tx.callback) { +	if (first->async_tx.callback) {  		hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_INT_GN;  		if (first != new) {  			/* move callback into to last desc */ @@ -807,6 +807,12 @@ static void ioat_dma_free_chan_resources(struct dma_chan *chan)  	struct ioat_desc_sw *desc, *_desc;  	int in_use_descs = 0; +	/* Before freeing channel resources first check +	 * if they have been previously allocated for this channel. +	 */ +	if (ioat_chan->desccount == 0) +		return; +  	tasklet_disable(&ioat_chan->cleanup_task);  	ioat_dma_memcpy_cleanup(ioat_chan); @@ -869,6 +875,7 @@ static void ioat_dma_free_chan_resources(struct dma_chan *chan)  	ioat_chan->last_completion = ioat_chan->completion_addr = 0;  	ioat_chan->pending = 0;  	ioat_chan->dmacount = 0; +	ioat_chan->desccount = 0;  	ioat_chan->watchdog_completion = 0;  	ioat_chan->last_compl_desc_addr_hw = 0;  	ioat_chan->watchdog_tcp_cookie = @@ -1334,10 +1341,12 @@ static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan)   */  #define IOAT_TEST_SIZE 2000 +DECLARE_COMPLETION(test_completion);  static void ioat_dma_test_callback(void *dma_async_param)  {  	printk(KERN_ERR "ioatdma: ioat_dma_test_callback(%p)\n",  		dma_async_param); +	complete(&test_completion);  }  /** @@ -1403,7 +1412,8 @@ static int ioat_dma_self_test(struct ioatdma_device *device)  		goto free_resources;  	}  	device->common.device_issue_pending(dma_chan); -	msleep(1); + +	wait_for_completion_timeout(&test_completion, msecs_to_jiffies(3000));  	if (device->common.device_is_tx_complete(dma_chan, cookie, NULL, NULL)  					!= DMA_SUCCESS) {  |