Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b189e758 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Ulf Hansson
Browse files

mmc: mxcmmc: handle highmem pages



Use kmap_atomic to map the scatterlist entry before using it.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 5b427781
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -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;