summaryrefslogtreecommitdiffstats
path: root/drivers/vme
diff options
context:
space:
mode:
authorDmitry Kalinkin <dmitry.kalinkin@gmail.com>2015-05-28 08:07:00 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-06-12 20:26:57 -0400
commitb2383c90a9d691201b9aee557776694cde86a935 (patch)
tree104fd035675582583bd257cd016e92ab9c7006b8 /drivers/vme
parentf656eaee6368198f596ae5b8754494ec2b179a16 (diff)
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')
-rw-r--r--drivers/vme/bridges/vme_tsi148.c23
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,
1833 /* Add to list */ 1833 /* Add to list */
1834 list_add_tail(&entry->list, &list->entries); 1834 list_add_tail(&entry->list, &list->entries);
1835 1835
1836 entry->dma_handle = dma_map_single(tsi148_bridge->parent,
1837 &entry->descriptor,
1838 sizeof(struct tsi148_dma_descriptor), DMA_TO_DEVICE);
1839 if (dma_mapping_error(tsi148_bridge->parent, entry->dma_handle)) {
1840 dev_err(tsi148_bridge->parent, "DMA mapping error\n");
1841 retval = -EINVAL;
1842 goto err_dma;
1843 }
1844
1836 /* Fill out previous descriptors "Next Address" */ 1845 /* Fill out previous descriptors "Next Address" */
1837 if (entry->list.prev != &list->entries) { 1846 if (entry->list.prev != &list->entries) {
1838 prev = list_entry(entry->list.prev, struct tsi148_dma_entry,
1839 list);
1840 /* We need the bus address for the pointer */
1841 entry->dma_handle = dma_map_single(tsi148_bridge->parent,
1842 &entry->descriptor,
1843 sizeof(struct tsi148_dma_descriptor), DMA_TO_DEVICE);
1844
1845 reg_split((unsigned long long)entry->dma_handle, &address_high, 1847 reg_split((unsigned long long)entry->dma_handle, &address_high,
1846 &address_low); 1848 &address_low);
1849 prev = list_entry(entry->list.prev, struct tsi148_dma_entry,
1850 list);
1847 prev->descriptor.dnlau = cpu_to_be32(address_high); 1851 prev->descriptor.dnlau = cpu_to_be32(address_high);
1848 prev->descriptor.dnlal = cpu_to_be32(address_low); 1852 prev->descriptor.dnlal = cpu_to_be32(address_low);
1849 1853
@@ -1851,6 +1855,7 @@ static int tsi148_dma_list_add(struct vme_dma_list *list,
1851 1855
1852 return 0; 1856 return 0;
1853 1857
1858err_dma:
1854err_dest: 1859err_dest:
1855err_source: 1860err_source:
1856err_align: 1861err_align:
@@ -1921,10 +1926,6 @@ static int tsi148_dma_list_exec(struct vme_dma_list *list)
1921 entry = list_first_entry(&list->entries, struct tsi148_dma_entry, 1926 entry = list_first_entry(&list->entries, struct tsi148_dma_entry,
1922 list); 1927 list);
1923 1928
1924 entry->dma_handle = dma_map_single(tsi148_bridge->parent,
1925 &entry->descriptor,
1926 sizeof(struct tsi148_dma_descriptor), DMA_TO_DEVICE);
1927
1928 mutex_unlock(&ctrlr->mtx); 1929 mutex_unlock(&ctrlr->mtx);
1929 1930
1930 reg_split(entry->dma_handle, &bus_addr_high, &bus_addr_low); 1931 reg_split(entry->dma_handle, &bus_addr_high, &bus_addr_low);