diff options
author | Dmitry Kalinkin <dmitry.kalinkin@gmail.com> | 2015-05-28 08:07:00 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-06-12 20:26:57 -0400 |
commit | b2383c90a9d691201b9aee557776694cde86a935 (patch) | |
tree | 104fd035675582583bd257cd016e92ab9c7006b8 /drivers/vme | |
parent | f656eaee6368198f596ae5b8754494ec2b179a16 (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.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, | |||
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 | ||
1858 | err_dma: | ||
1854 | err_dest: | 1859 | err_dest: |
1855 | err_source: | 1860 | err_source: |
1856 | err_align: | 1861 | err_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); |