diff options
author | Ashutosh Patel <ashutoshp@nvidia.com> | 2013-06-20 16:19:58 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 13:32:06 -0700 |
commit | 104f6dac5d16c2fbd6ba00b821a1dbd484bbdaaf (patch) | |
tree | e8b32261caf2c54ee36d236f0bebb5a156df0e32 /drivers/char | |
parent | 268cf76a7f3f4014afc4ef32a47980f3e087d802 (diff) |
efshlp:Corrected remaining pdma size logic
Changes :
- Corrected remaining pdma size logic in mmap_dma function
bug 1308180
Change-Id: I69331783cb4d0b710c64ac4cd7e74175baa53e41
Reviewed-on: http://git-master/r/239672
Signed-off-by: Ashutosh Patel <ashutoshp@nvidia.com>
(cherry picked from commit b3901d71865f4021c67b48055663d122a6f2319f)
Reviewed-on: http://git-master/r/249069
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/tegra-efshlp.c | 44 |
1 files changed, 18 insertions, 26 deletions
diff --git a/drivers/char/tegra-efshlp.c b/drivers/char/tegra-efshlp.c index b75b2a634134..1baeb2c8a005 100644 --- a/drivers/char/tegra-efshlp.c +++ b/drivers/char/tegra-efshlp.c @@ -138,6 +138,7 @@ static int efs_handle_mmap_dma(struct efshlp_dma *pdma, unsigned long curaddr, virtaddr, offset; unsigned int i; unsigned long kernvirtaddr; + long pdma_size = pdma->size; struct map_info *map; pr_debug("%s\n", __func__); @@ -160,49 +161,40 @@ static int efs_handle_mmap_dma(struct efshlp_dma *pdma, virtaddr = kernvirtaddr; offset = pdma->offset; map = get_map_info(pdma->bank); - - if (pdma->size >= PAGE_SIZE) { - - virtaddr = ((unsigned long)kernvirtaddr + - PAGE_SIZE) & ~(PAGE_SIZE-1); + if (pdma_size >= PAGE_SIZE) { + virtaddr = (unsigned long)(kernvirtaddr + + (PAGE_SIZE - (kernvirtaddr % PAGE_SIZE))); tegra_nor_copy_from(map, (void *)(curaddr + (kernvirtaddr % PAGE_SIZE)), pdma->offset, PAGE_SIZE - (kernvirtaddr % PAGE_SIZE)); - offset = pdma->offset + PAGE_SIZE - (kernvirtaddr % PAGE_SIZE); + pdma_size = pdma_size - + (PAGE_SIZE - (kernvirtaddr % PAGE_SIZE)); + offset = pdma->offset + PAGE_SIZE - (kernvirtaddr % PAGE_SIZE); } - for (i = PAGE_SIZE; - i < (pdma->size-PAGE_SIZE) && pdma->size > PAGE_SIZE; - i += PAGE_SIZE) { + for (i = 0; i < (pdma_size / PAGE_SIZE); i++) { - curaddr = virtaddr; - virtaddr += PAGE_SIZE; - map = get_map_info(pdma->bank); + curaddr = virtaddr; + virtaddr += PAGE_SIZE; + map = get_map_info(pdma->bank); - tegra_nor_copy_from(map, (void *)curaddr, - offset, PAGE_SIZE); + tegra_nor_copy_from(map, (void *)curaddr, + offset, PAGE_SIZE); + pdma_size = pdma_size - PAGE_SIZE; - offset += PAGE_SIZE; + offset += PAGE_SIZE; } curaddr = virtaddr; map = get_map_info(pdma->bank); - if (PAGE_SIZE - (pdma->size % PAGE_SIZE ? - (pdma->size % PAGE_SIZE) : PAGE_SIZE) > 0 - && pdma->size >= PAGE_SIZE) - + if (pdma_size > 0) { tegra_nor_copy_from(map, (void *) curaddr, offset, - PAGE_SIZE - (pdma->size % PAGE_SIZE ? - (pdma->size % PAGE_SIZE) : PAGE_SIZE)); - - else - tegra_nor_copy_from(map, (void *) curaddr, - offset, pdma->size % PAGE_SIZE); - + pdma_size); + } return pdma->size; } |