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 | } |