mmc: mxcmmc: handle highmem pages
authorChristoph Hellwig <hch@lst.de>
Fri, 18 May 2018 17:18:44 +0000 (19:18 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 21 May 2018 13:49:20 +0000 (15:49 +0200)
Use kmap_atomic to map the scatterlist entry before using it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/mxcmmc.c

index 5ff8ef7223cc484814b5221b1758fd839def27c5..150fbdba777d7e4ce718438ab63e1d48e79ce4bd 100644 (file)
@@ -291,8 +291,10 @@ static void mxcmci_swap_buffers(struct mmc_data *data)
        struct scatterlist *sg;
        int i;
 
-       for_each_sg(data->sg, sg, data->sg_len, i)
-               buffer_swap32(sg_virt(sg), sg->length);
+       for_each_sg(data->sg, sg, data->sg_len, i) {
+               void *buf = kmap_atomic(sg_page(sg) + sg->offset;
+               buffer_swap32(buf, sg->length);
+               kunmap_atomic(buf);
 }
 #else
 static inline void mxcmci_swap_buffers(struct mmc_data *data) {}
@@ -609,6 +611,7 @@ static int mxcmci_transfer_data(struct mxcmci_host *host)
 {
        struct mmc_data *data = host->req->data;
        struct scatterlist *sg;
+       void *buf;
        int stat, i;
 
        host->data = data;
@@ -616,14 +619,18 @@ static int mxcmci_transfer_data(struct mxcmci_host *host)
 
        if (data->flags & MMC_DATA_READ) {
                for_each_sg(data->sg, sg, data->sg_len, i) {
-                       stat = mxcmci_pull(host, sg_virt(sg), sg->length);
+                       buf = kmap_atomic(sg_page(sg) + sg->offset);
+                       stat = mxcmci_pull(host, buf, sg->length);
+                       kunmap(buf);
                        if (stat)
                                return stat;
                        host->datasize += sg->length;
                }
        } else {
                for_each_sg(data->sg, sg, data->sg_len, i) {
-                       stat = mxcmci_push(host, sg_virt(sg), sg->length);
+                       buf = kmap_atomic(sg_page(sg) + sg->offset);
+                       stat = mxcmci_push(host, buf, sg->length);
+                       kunmap(buf);
                        if (stat)
                                return stat;
                        host->datasize += sg->length;