diff options
| author | Dmitry Kalinkin <dmitry.kalinkin@gmail.com> | 2015-05-28 15:07:00 +0300 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-06-12 17:26:57 -0700 | 
| commit | b2383c90a9d691201b9aee557776694cde86a935 (patch) | |
| tree | 104fd035675582583bd257cd016e92ab9c7006b8 /drivers/vme/bridges | |
| parent | f656eaee6368198f596ae5b8754494ec2b179a16 (diff) | |
| download | linux-b2383c90a9d691201b9aee557776694cde86a935.tar.bz2 | |
vme: tsi148: fix first DMA item mapping
This moves DMA mapping of the first list element to vme_list_add, the
same place where other elements mappings occur. This prevents extra
mapping or over-unmapping in the cases when vme_list_exec is called more
or less than one time respectively.
Also adds dma_mapping_error check.
Signed-off-by: Dmitry Kalinkin <dmitry.kalinkin@gmail.com>
Cc: Igor Alekseev <igor.alekseev@itep.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/vme/bridges')
| -rw-r--r-- | drivers/vme/bridges/vme_tsi148.c | 23 | 
1 files changed, 12 insertions, 11 deletions
| diff --git a/drivers/vme/bridges/vme_tsi148.c b/drivers/vme/bridges/vme_tsi148.c index 1be41360c9e7..65623481b84c 100644 --- a/drivers/vme/bridges/vme_tsi148.c +++ b/drivers/vme/bridges/vme_tsi148.c @@ -1833,17 +1833,21 @@ static int tsi148_dma_list_add(struct vme_dma_list *list,  	/* Add to list */  	list_add_tail(&entry->list, &list->entries); +	entry->dma_handle = dma_map_single(tsi148_bridge->parent, +		&entry->descriptor, +		sizeof(struct tsi148_dma_descriptor), DMA_TO_DEVICE); +	if (dma_mapping_error(tsi148_bridge->parent, entry->dma_handle)) { +		dev_err(tsi148_bridge->parent, "DMA mapping error\n"); +		retval = -EINVAL; +		goto err_dma; +	} +  	/* Fill out previous descriptors "Next Address" */  	if (entry->list.prev != &list->entries) { -		prev = list_entry(entry->list.prev, struct tsi148_dma_entry, -			list); -		/* We need the bus address for the pointer */ -		entry->dma_handle = dma_map_single(tsi148_bridge->parent, -			&entry->descriptor, -			sizeof(struct tsi148_dma_descriptor), DMA_TO_DEVICE); -  		reg_split((unsigned long long)entry->dma_handle, &address_high,  			&address_low); +		prev = list_entry(entry->list.prev, struct tsi148_dma_entry, +				  list);  		prev->descriptor.dnlau = cpu_to_be32(address_high);  		prev->descriptor.dnlal = cpu_to_be32(address_low); @@ -1851,6 +1855,7 @@ static int tsi148_dma_list_add(struct vme_dma_list *list,  	return 0; +err_dma:  err_dest:  err_source:  err_align: @@ -1921,10 +1926,6 @@ static int tsi148_dma_list_exec(struct vme_dma_list *list)  	entry = list_first_entry(&list->entries, struct tsi148_dma_entry,  		list); -	entry->dma_handle = dma_map_single(tsi148_bridge->parent, -		&entry->descriptor, -		sizeof(struct tsi148_dma_descriptor), DMA_TO_DEVICE); -  	mutex_unlock(&ctrlr->mtx);  	reg_split(entry->dma_handle, &bus_addr_high, &bus_addr_low); |