diff options
Diffstat (limited to 'drivers/misc/genwqe/card_dev.c')
| -rw-r--r-- | drivers/misc/genwqe/card_dev.c | 44 |
1 files changed, 16 insertions, 28 deletions
diff --git a/drivers/misc/genwqe/card_dev.c b/drivers/misc/genwqe/card_dev.c index 2c2c9cc75231..1d2f163a1906 100644 --- a/drivers/misc/genwqe/card_dev.c +++ b/drivers/misc/genwqe/card_dev.c | |||
| @@ -531,7 +531,9 @@ static int do_flash_update(struct genwqe_file *cfile, | |||
| 531 | case '1': | 531 | case '1': |
| 532 | cmdopts = 0x1C; | 532 | cmdopts = 0x1C; |
| 533 | break; /* download/erase_first/part_1 */ | 533 | break; /* download/erase_first/part_1 */ |
| 534 | case 'v': /* cmdopts = 0x0c (VPD) */ | 534 | case 'v': |
| 535 | cmdopts = 0x0C; | ||
| 536 | break; /* download/erase_first/vpd */ | ||
| 535 | default: | 537 | default: |
| 536 | return -EINVAL; | 538 | return -EINVAL; |
| 537 | } | 539 | } |
| @@ -665,6 +667,8 @@ static int do_flash_read(struct genwqe_file *cfile, | |||
| 665 | cmdopts = 0x1A; | 667 | cmdopts = 0x1A; |
| 666 | break; /* upload/part_1 */ | 668 | break; /* upload/part_1 */ |
| 667 | case 'v': | 669 | case 'v': |
| 670 | cmdopts = 0x0A; | ||
| 671 | break; /* upload/vpd */ | ||
| 668 | default: | 672 | default: |
| 669 | return -EINVAL; | 673 | return -EINVAL; |
| 670 | } | 674 | } |
| @@ -836,15 +840,8 @@ static int ddcb_cmd_cleanup(struct genwqe_file *cfile, struct ddcb_requ *req) | |||
| 836 | __genwqe_del_mapping(cfile, dma_map); | 840 | __genwqe_del_mapping(cfile, dma_map); |
| 837 | genwqe_user_vunmap(cd, dma_map, req); | 841 | genwqe_user_vunmap(cd, dma_map, req); |
| 838 | } | 842 | } |
| 839 | if (req->sgl[i] != NULL) { | 843 | if (req->sgls[i].sgl != NULL) |
| 840 | genwqe_free_sgl(cd, req->sgl[i], | 844 | genwqe_free_sync_sgl(cd, &req->sgls[i]); |
| 841 | req->sgl_dma_addr[i], | ||
| 842 | req->sgl_size[i]); | ||
| 843 | req->sgl[i] = NULL; | ||
| 844 | req->sgl_dma_addr[i] = 0x0; | ||
| 845 | req->sgl_size[i] = 0; | ||
| 846 | } | ||
| 847 | |||
| 848 | } | 845 | } |
| 849 | return 0; | 846 | return 0; |
| 850 | } | 847 | } |
| @@ -913,7 +910,7 @@ static int ddcb_cmd_fixups(struct genwqe_file *cfile, struct ddcb_requ *req) | |||
| 913 | 910 | ||
| 914 | case ATS_TYPE_SGL_RDWR: | 911 | case ATS_TYPE_SGL_RDWR: |
| 915 | case ATS_TYPE_SGL_RD: { | 912 | case ATS_TYPE_SGL_RD: { |
| 916 | int page_offs, nr_pages, offs; | 913 | int page_offs; |
| 917 | 914 | ||
| 918 | u_addr = be64_to_cpu(*((__be64 *) | 915 | u_addr = be64_to_cpu(*((__be64 *) |
| 919 | &cmd->asiv[asiv_offs])); | 916 | &cmd->asiv[asiv_offs])); |
| @@ -951,27 +948,18 @@ static int ddcb_cmd_fixups(struct genwqe_file *cfile, struct ddcb_requ *req) | |||
| 951 | page_offs = 0; | 948 | page_offs = 0; |
| 952 | } | 949 | } |
| 953 | 950 | ||
| 954 | offs = offset_in_page(u_addr); | ||
| 955 | nr_pages = DIV_ROUND_UP(offs + u_size, PAGE_SIZE); | ||
| 956 | |||
| 957 | /* create genwqe style scatter gather list */ | 951 | /* create genwqe style scatter gather list */ |
| 958 | req->sgl[i] = genwqe_alloc_sgl(cd, m->nr_pages, | 952 | rc = genwqe_alloc_sync_sgl(cd, &req->sgls[i], |
| 959 | &req->sgl_dma_addr[i], | 953 | (void __user *)u_addr, |
| 960 | &req->sgl_size[i]); | 954 | u_size); |
| 961 | if (req->sgl[i] == NULL) { | 955 | if (rc != 0) |
| 962 | rc = -ENOMEM; | ||
| 963 | goto err_out; | 956 | goto err_out; |
| 964 | } | 957 | |
| 965 | genwqe_setup_sgl(cd, offs, u_size, | 958 | genwqe_setup_sgl(cd, &req->sgls[i], |
| 966 | req->sgl[i], | 959 | &m->dma_list[page_offs]); |
| 967 | req->sgl_dma_addr[i], | ||
| 968 | req->sgl_size[i], | ||
| 969 | m->dma_list, | ||
| 970 | page_offs, | ||
| 971 | nr_pages); | ||
| 972 | 960 | ||
| 973 | *((__be64 *)&cmd->asiv[asiv_offs]) = | 961 | *((__be64 *)&cmd->asiv[asiv_offs]) = |
| 974 | cpu_to_be64(req->sgl_dma_addr[i]); | 962 | cpu_to_be64(req->sgls[i].sgl_dma_addr); |
| 975 | 963 | ||
| 976 | break; | 964 | break; |
| 977 | } | 965 | } |
