diff options
author | Kristian Høgsberg <krh@redhat.com> | 2007-02-06 14:49:40 -0500 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2007-03-09 16:02:55 -0500 |
commit | 82eff9db7dc5d8f78898d5051975d14f48be2028 (patch) | |
tree | 4f65c617d165f90cee98d84373452b160be23349 /drivers/firewire/fw-iso.c | |
parent | 27a15e50fb87978d7e1e9f7b561f78692e0b1eb5 (diff) |
firewire: Use dma_mapping_error() for checking for DMA mapping errors.
Pointed out by Pete Zaitcev.
Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire/fw-iso.c')
-rw-r--r-- | drivers/firewire/fw-iso.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/firewire/fw-iso.c b/drivers/firewire/fw-iso.c index 024fab4ef998..6481e3df2c93 100644 --- a/drivers/firewire/fw-iso.c +++ b/drivers/firewire/fw-iso.c | |||
@@ -33,7 +33,7 @@ setup_iso_buffer(struct fw_iso_context *ctx, size_t size, | |||
33 | enum dma_data_direction direction) | 33 | enum dma_data_direction direction) |
34 | { | 34 | { |
35 | struct page *page; | 35 | struct page *page; |
36 | int i; | 36 | int i, j; |
37 | void *p; | 37 | void *p; |
38 | 38 | ||
39 | ctx->buffer_size = PAGE_ALIGN(size); | 39 | ctx->buffer_size = PAGE_ALIGN(size); |
@@ -42,24 +42,33 @@ setup_iso_buffer(struct fw_iso_context *ctx, size_t size, | |||
42 | 42 | ||
43 | ctx->buffer = vmalloc_32_user(ctx->buffer_size); | 43 | ctx->buffer = vmalloc_32_user(ctx->buffer_size); |
44 | if (ctx->buffer == NULL) | 44 | if (ctx->buffer == NULL) |
45 | return -ENOMEM; | 45 | goto fail_buffer_alloc; |
46 | 46 | ||
47 | ctx->page_count = ctx->buffer_size >> PAGE_SHIFT; | 47 | ctx->page_count = ctx->buffer_size >> PAGE_SHIFT; |
48 | ctx->pages = | 48 | ctx->pages = |
49 | kzalloc(ctx->page_count * sizeof(ctx->pages[0]), GFP_KERNEL); | 49 | kzalloc(ctx->page_count * sizeof(ctx->pages[0]), GFP_KERNEL); |
50 | if (ctx->pages == NULL) { | 50 | if (ctx->pages == NULL) |
51 | vfree(ctx->buffer); | 51 | goto fail_pages_alloc; |
52 | return -ENOMEM; | ||
53 | } | ||
54 | 52 | ||
55 | p = ctx->buffer; | 53 | p = ctx->buffer; |
56 | for (i = 0; i < ctx->page_count; i++, p += PAGE_SIZE) { | 54 | for (i = 0; i < ctx->page_count; i++, p += PAGE_SIZE) { |
57 | page = vmalloc_to_page(p); | 55 | page = vmalloc_to_page(p); |
58 | ctx->pages[i] = dma_map_page(ctx->card->device, | 56 | ctx->pages[i] = dma_map_page(ctx->card->device, |
59 | page, 0, PAGE_SIZE, direction); | 57 | page, 0, PAGE_SIZE, direction); |
58 | if (dma_mapping_error(ctx->pages[i])) | ||
59 | goto fail_mapping; | ||
60 | } | 60 | } |
61 | 61 | ||
62 | return 0; | 62 | return 0; |
63 | |||
64 | fail_mapping: | ||
65 | for (j = 0; j < i; j++) | ||
66 | dma_unmap_page(ctx->card->device, ctx->pages[j], | ||
67 | PAGE_SIZE, DMA_TO_DEVICE); | ||
68 | fail_pages_alloc: | ||
69 | vfree(ctx->buffer); | ||
70 | fail_buffer_alloc: | ||
71 | return -ENOMEM; | ||
63 | } | 72 | } |
64 | 73 | ||
65 | static void destroy_iso_buffer(struct fw_iso_context *ctx) | 74 | static void destroy_iso_buffer(struct fw_iso_context *ctx) |