Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
   1/*
   2 *  linux/drivers/mmc/card/mmc_test.c
   3 *
   4 *  Copyright 2007-2008 Pierre Ossman
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2 of the License, or (at
   9 * your option) any later version.
  10 */
  11
  12#include <linux/mmc/core.h>
  13#include <linux/mmc/card.h>
  14#include <linux/mmc/host.h>
  15#include <linux/mmc/mmc.h>
  16#include <linux/slab.h>
  17
  18#include <linux/scatterlist.h>
  19#include <linux/swap.h>		/* For nr_free_buffer_pages() */
  20#include <linux/list.h>
  21
  22#include <linux/debugfs.h>
  23#include <linux/uaccess.h>
  24#include <linux/seq_file.h>
  25#include <linux/module.h>
  26
  27#define RESULT_OK		0
  28#define RESULT_FAIL		1
  29#define RESULT_UNSUP_HOST	2
  30#define RESULT_UNSUP_CARD	3
  31
  32#define BUFFER_ORDER		2
  33#define BUFFER_SIZE		(PAGE_SIZE << BUFFER_ORDER)
  34
  35#define TEST_ALIGN_END		8
  36
  37/*
  38 * Limit the test area size to the maximum MMC HC erase group size.  Note that
  39 * the maximum SD allocation unit size is just 4MiB.
  40 */
  41#define TEST_AREA_MAX_SIZE (128 * 1024 * 1024)
  42
  43/**
  44 * struct mmc_test_pages - pages allocated by 'alloc_pages()'.
  45 * @page: first page in the allocation
  46 * @order: order of the number of pages allocated
  47 */
  48struct mmc_test_pages {
  49	struct page *page;
  50	unsigned int order;
  51};
  52
  53/**
  54 * struct mmc_test_mem - allocated memory.
  55 * @arr: array of allocations
  56 * @cnt: number of allocations
  57 */
  58struct mmc_test_mem {
  59	struct mmc_test_pages *arr;
  60	unsigned int cnt;
  61};
  62
  63/**
  64 * struct mmc_test_area - information for performance tests.
  65 * @max_sz: test area size (in bytes)
  66 * @dev_addr: address on card at which to do performance tests
  67 * @max_tfr: maximum transfer size allowed by driver (in bytes)
  68 * @max_segs: maximum segments allowed by driver in scatterlist @sg
  69 * @max_seg_sz: maximum segment size allowed by driver
  70 * @blocks: number of (512 byte) blocks currently mapped by @sg
  71 * @sg_len: length of currently mapped scatterlist @sg
  72 * @mem: allocated memory
  73 * @sg: scatterlist
  74 */
  75struct mmc_test_area {
  76	unsigned long max_sz;
  77	unsigned int dev_addr;
  78	unsigned int max_tfr;
  79	unsigned int max_segs;
  80	unsigned int max_seg_sz;
  81	unsigned int blocks;
  82	unsigned int sg_len;
  83	struct mmc_test_mem *mem;
  84	struct scatterlist *sg;
  85};
  86
  87/**
  88 * struct mmc_test_transfer_result - transfer results for performance tests.
  89 * @link: double-linked list
  90 * @count: amount of group of sectors to check
  91 * @sectors: amount of sectors to check in one group
  92 * @ts: time values of transfer
  93 * @rate: calculated transfer rate
  94 * @iops: I/O operations per second (times 100)
  95 */
  96struct mmc_test_transfer_result {
  97	struct list_head link;
  98	unsigned int count;
  99	unsigned int sectors;
 100	struct timespec ts;
 101	unsigned int rate;
 102	unsigned int iops;
 103};
 104
 105/**
 106 * struct mmc_test_general_result - results for tests.
 107 * @link: double-linked list
 108 * @card: card under test
 109 * @testcase: number of test case
 110 * @result: result of test run
 111 * @tr_lst: transfer measurements if any as mmc_test_transfer_result
 112 */
 113struct mmc_test_general_result {
 114	struct list_head link;
 115	struct mmc_card *card;
 116	int testcase;
 117	int result;
 118	struct list_head tr_lst;
 119};
 120
 121/**
 122 * struct mmc_test_dbgfs_file - debugfs related file.
 123 * @link: double-linked list
 124 * @card: card under test
 125 * @file: file created under debugfs
 126 */
 127struct mmc_test_dbgfs_file {
 128	struct list_head link;
 129	struct mmc_card *card;
 130	struct dentry *file;
 131};
 132
 133/**
 134 * struct mmc_test_card - test information.
 135 * @card: card under test
 136 * @scratch: transfer buffer
 137 * @buffer: transfer buffer
 138 * @highmem: buffer for highmem tests
 139 * @area: information for performance tests
 140 * @gr: pointer to results of current testcase
 141 */
 142struct mmc_test_card {
 143	struct mmc_card	*card;
 144
 145	u8		scratch[BUFFER_SIZE];
 146	u8		*buffer;
 147#ifdef CONFIG_HIGHMEM
 148	struct page	*highmem;
 149#endif
 150	struct mmc_test_area		area;
 151	struct mmc_test_general_result	*gr;
 152};
 153
 154enum mmc_test_prep_media {
 155	MMC_TEST_PREP_NONE = 0,
 156	MMC_TEST_PREP_WRITE_FULL = 1 << 0,
 157	MMC_TEST_PREP_ERASE = 1 << 1,
 158};
 159
 160struct mmc_test_multiple_rw {
 161	unsigned int *sg_len;
 162	unsigned int *bs;
 163	unsigned int len;
 164	unsigned int size;
 165	bool do_write;
 166	bool do_nonblock_req;
 167	enum mmc_test_prep_media prepare;
 168};
 169
 170struct mmc_test_async_req {
 171	struct mmc_async_req areq;
 172	struct mmc_test_card *test;
 173};
 174
 175/*******************************************************************/
 176/*  General helper functions                                       */
 177/*******************************************************************/
 178
 179/*
 180 * Configure correct block size in card
 181 */
 182static int mmc_test_set_blksize(struct mmc_test_card *test, unsigned size)
 183{
 184	return mmc_set_blocklen(test->card, size);
 185}
 186
 187/*
 188 * Fill in the mmc_request structure given a set of transfer parameters.
 189 */
 190static void mmc_test_prepare_mrq(struct mmc_test_card *test,
 191	struct mmc_request *mrq, struct scatterlist *sg, unsigned sg_len,
 192	unsigned dev_addr, unsigned blocks, unsigned blksz, int write)
 193{
 194	BUG_ON(!mrq || !mrq->cmd || !mrq->data || !mrq->stop);
 195
 196	if (blocks > 1) {
 197		mrq->cmd->opcode = write ?
 198			MMC_WRITE_MULTIPLE_BLOCK : MMC_READ_MULTIPLE_BLOCK;
 199	} else {
 200		mrq->cmd->opcode = write ?
 201			MMC_WRITE_BLOCK : MMC_READ_SINGLE_BLOCK;
 202	}
 203
 204	mrq->cmd->arg = dev_addr;
 205	if (!mmc_card_blockaddr(test->card))
 206		mrq->cmd->arg <<= 9;
 207
 208	mrq->cmd->flags = MMC_RSP_R1 | MMC_CMD_ADTC;
 209
 210	if (blocks == 1)
 211		mrq->stop = NULL;
 212	else {
 213		mrq->stop->opcode = MMC_STOP_TRANSMISSION;
 214		mrq->stop->arg = 0;
 215		mrq->stop->flags = MMC_RSP_R1B | MMC_CMD_AC;
 216	}
 217
 218	mrq->data->blksz = blksz;
 219	mrq->data->blocks = blocks;
 220	mrq->data->flags = write ? MMC_DATA_WRITE : MMC_DATA_READ;
 221	mrq->data->sg = sg;
 222	mrq->data->sg_len = sg_len;
 223
 224	mmc_set_data_timeout(mrq->data, test->card);
 225}
 226
 227static int mmc_test_busy(struct mmc_command *cmd)
 228{
 229	return !(cmd->resp[0] & R1_READY_FOR_DATA) ||
 230		(R1_CURRENT_STATE(cmd->resp[0]) == R1_STATE_PRG);
 231}
 232
 233/*
 234 * Wait for the card to finish the busy state
 235 */
 236static int mmc_test_wait_busy(struct mmc_test_card *test)
 237{
 238	int ret, busy;
 239	struct mmc_command cmd = {0};
 240
 241	busy = 0;
 242	do {
 243		memset(&cmd, 0, sizeof(struct mmc_command));
 244
 245		cmd.opcode = MMC_SEND_STATUS;
 246		cmd.arg = test->card->rca << 16;
 247		cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
 248
 249		ret = mmc_wait_for_cmd(test->card->host, &cmd, 0);
 250		if (ret)
 251			break;
 252
 253		if (!busy && mmc_test_busy(&cmd)) {
 254			busy = 1;
 255			if (test->card->host->caps & MMC_CAP_WAIT_WHILE_BUSY)
 256				pr_info("%s: Warning: Host did not "
 257					"wait for busy state to end.\n",
 258					mmc_hostname(test->card->host));
 259		}
 260	} while (mmc_test_busy(&cmd));
 261
 262	return ret;
 263}
 264
 265/*
 266 * Transfer a single sector of kernel addressable data
 267 */
 268static int mmc_test_buffer_transfer(struct mmc_test_card *test,
 269	u8 *buffer, unsigned addr, unsigned blksz, int write)
 270{
 271	struct mmc_request mrq = {0};
 272	struct mmc_command cmd = {0};
 273	struct mmc_command stop = {0};
 274	struct mmc_data data = {0};
 275
 276	struct scatterlist sg;
 277
 278	mrq.cmd = &cmd;
 279	mrq.data = &data;
 280	mrq.stop = &stop;
 281
 282	sg_init_one(&sg, buffer, blksz);
 283
 284	mmc_test_prepare_mrq(test, &mrq, &sg, 1, addr, 1, blksz, write);
 285
 286	mmc_wait_for_req(test->card->host, &mrq);
 287
 288	if (cmd.error)
 289		return cmd.error;
 290	if (data.error)
 291		return data.error;
 292
 293	return mmc_test_wait_busy(test);
 294}
 295
 296static void mmc_test_free_mem(struct mmc_test_mem *mem)
 297{
 298	if (!mem)
 299		return;
 300	while (mem->cnt--)
 301		__free_pages(mem->arr[mem->cnt].page,
 302			     mem->arr[mem->cnt].order);
 303	kfree(mem->arr);
 304	kfree(mem);
 305}
 306
 307/*
 308 * Allocate a lot of memory, preferably max_sz but at least min_sz.  In case
 309 * there isn't much memory do not exceed 1/16th total lowmem pages.  Also do
 310 * not exceed a maximum number of segments and try not to make segments much
 311 * bigger than maximum segment size.
 312 */
 313static struct mmc_test_mem *mmc_test_alloc_mem(unsigned long min_sz,
 314					       unsigned long max_sz,
 315					       unsigned int max_segs,
 316					       unsigned int max_seg_sz)
 317{
 318	unsigned long max_page_cnt = DIV_ROUND_UP(max_sz, PAGE_SIZE);
 319	unsigned long min_page_cnt = DIV_ROUND_UP(min_sz, PAGE_SIZE);
 320	unsigned long max_seg_page_cnt = DIV_ROUND_UP(max_seg_sz, PAGE_SIZE);
 321	unsigned long page_cnt = 0;
 322	unsigned long limit = nr_free_buffer_pages() >> 4;
 323	struct mmc_test_mem *mem;
 324
 325	if (max_page_cnt > limit)
 326		max_page_cnt = limit;
 327	if (min_page_cnt > max_page_cnt)
 328		min_page_cnt = max_page_cnt;
 329
 330	if (max_seg_page_cnt > max_page_cnt)
 331		max_seg_page_cnt = max_page_cnt;
 332
 333	if (max_segs > max_page_cnt)
 334		max_segs = max_page_cnt;
 335
 336	mem = kzalloc(sizeof(struct mmc_test_mem), GFP_KERNEL);
 337	if (!mem)
 338		return NULL;
 339
 340	mem->arr = kzalloc(sizeof(struct mmc_test_pages) * max_segs,
 341			   GFP_KERNEL);
 342	if (!mem->arr)
 343		goto out_free;
 344
 345	while (max_page_cnt) {
 346		struct page *page;
 347		unsigned int order;
 348		gfp_t flags = GFP_KERNEL | GFP_DMA | __GFP_NOWARN |
 349				__GFP_NORETRY;
 350
 351		order = get_order(max_seg_page_cnt << PAGE_SHIFT);
 352		while (1) {
 353			page = alloc_pages(flags, order);
 354			if (page || !order)
 355				break;
 356			order -= 1;
 357		}
 358		if (!page) {
 359			if (page_cnt < min_page_cnt)
 360				goto out_free;
 361			break;
 362		}
 363		mem->arr[mem->cnt].page = page;
 364		mem->arr[mem->cnt].order = order;
 365		mem->cnt += 1;
 366		if (max_page_cnt <= (1UL << order))
 367			break;
 368		max_page_cnt -= 1UL << order;
 369		page_cnt += 1UL << order;
 370		if (mem->cnt >= max_segs) {
 371			if (page_cnt < min_page_cnt)
 372				goto out_free;
 373			break;
 374		}
 375	}
 376
 377	return mem;
 378
 379out_free:
 380	mmc_test_free_mem(mem);
 381	return NULL;
 382}
 383
 384/*
 385 * Map memory into a scatterlist.  Optionally allow the same memory to be
 386 * mapped more than once.
 387 */
 388static int mmc_test_map_sg(struct mmc_test_mem *mem, unsigned long size,
 389			   struct scatterlist *sglist, int repeat,
 390			   unsigned int max_segs, unsigned int max_seg_sz,
 391			   unsigned int *sg_len, int min_sg_len)
 392{
 393	struct scatterlist *sg = NULL;
 394	unsigned int i;
 395	unsigned long sz = size;
 396
 397	sg_init_table(sglist, max_segs);
 398	if (min_sg_len > max_segs)
 399		min_sg_len = max_segs;
 400
 401	*sg_len = 0;
 402	do {
 403		for (i = 0; i < mem->cnt; i++) {
 404			unsigned long len = PAGE_SIZE << mem->arr[i].order;
 405
 406			if (min_sg_len && (size / min_sg_len < len))
 407				len = ALIGN(size / min_sg_len, 512);
 408			if (len > sz)
 409				len = sz;
 410			if (len > max_seg_sz)
 411				len = max_seg_sz;
 412			if (sg)
 413				sg = sg_next(sg);
 414			else
 415				sg = sglist;
 416			if (!sg)
 417				return -EINVAL;
 418			sg_set_page(sg, mem->arr[i].page, len, 0);
 419			sz -= len;
 420			*sg_len += 1;
 421			if (!sz)
 422				break;
 423		}
 424	} while (sz && repeat);
 425
 426	if (sz)
 427		return -EINVAL;
 428
 429	if (sg)
 430		sg_mark_end(sg);
 431
 432	return 0;
 433}
 434
 435/*
 436 * Map memory into a scatterlist so that no pages are contiguous.  Allow the
 437 * same memory to be mapped more than once.
 438 */
 439static int mmc_test_map_sg_max_scatter(struct mmc_test_mem *mem,
 440				       unsigned long sz,
 441				       struct scatterlist *sglist,
 442				       unsigned int max_segs,
 443				       unsigned int max_seg_sz,
 444				       unsigned int *sg_len)
 445{
 446	struct scatterlist *sg = NULL;
 447	unsigned int i = mem->cnt, cnt;
 448	unsigned long len;
 449	void *base, *addr, *last_addr = NULL;
 450
 451	sg_init_table(sglist, max_segs);
 452
 453	*sg_len = 0;
 454	while (sz) {
 455		base = page_address(mem->arr[--i].page);
 456		cnt = 1 << mem->arr[i].order;
 457		while (sz && cnt) {
 458			addr = base + PAGE_SIZE * --cnt;
 459			if (last_addr && last_addr + PAGE_SIZE == addr)
 460				continue;
 461			last_addr = addr;
 462			len = PAGE_SIZE;
 463			if (len > max_seg_sz)
 464				len = max_seg_sz;
 465			if (len > sz)
 466				len = sz;
 467			if (sg)
 468				sg = sg_next(sg);
 469			else
 470				sg = sglist;
 471			if (!sg)
 472				return -EINVAL;
 473			sg_set_page(sg, virt_to_page(addr), len, 0);
 474			sz -= len;
 475			*sg_len += 1;
 476		}
 477		if (i == 0)
 478			i = mem->cnt;
 479	}
 480
 481	if (sg)
 482		sg_mark_end(sg);
 483
 484	return 0;
 485}
 486
 487/*
 488 * Calculate transfer rate in bytes per second.
 489 */
 490static unsigned int mmc_test_rate(uint64_t bytes, struct timespec *ts)
 491{
 492	uint64_t ns;
 493
 494	ns = ts->tv_sec;
 495	ns *= 1000000000;
 496	ns += ts->tv_nsec;
 497
 498	bytes *= 1000000000;
 499
 500	while (ns > UINT_MAX) {
 501		bytes >>= 1;
 502		ns >>= 1;
 503	}
 504
 505	if (!ns)
 506		return 0;
 507
 508	do_div(bytes, (uint32_t)ns);
 509
 510	return bytes;
 511}
 512
 513/*
 514 * Save transfer results for future usage
 515 */
 516static void mmc_test_save_transfer_result(struct mmc_test_card *test,
 517	unsigned int count, unsigned int sectors, struct timespec ts,
 518	unsigned int rate, unsigned int iops)
 519{
 520	struct mmc_test_transfer_result *tr;
 521
 522	if (!test->gr)
 523		return;
 524
 525	tr = kmalloc(sizeof(struct mmc_test_transfer_result), GFP_KERNEL);
 526	if (!tr)
 527		return;
 528
 529	tr->count = count;
 530	tr->sectors = sectors;
 531	tr->ts = ts;
 532	tr->rate = rate;
 533	tr->iops = iops;
 534
 535	list_add_tail(&tr->link, &test->gr->tr_lst);
 536}
 537
 538/*
 539 * Print the transfer rate.
 540 */
 541static void mmc_test_print_rate(struct mmc_test_card *test, uint64_t bytes,
 542				struct timespec *ts1, struct timespec *ts2)
 543{
 544	unsigned int rate, iops, sectors = bytes >> 9;
 545	struct timespec ts;
 546
 547	ts = timespec_sub(*ts2, *ts1);
 548
 549	rate = mmc_test_rate(bytes, &ts);
 550	iops = mmc_test_rate(100, &ts); /* I/O ops per sec x 100 */
 551
 552	pr_info("%s: Transfer of %u sectors (%u%s KiB) took %lu.%09lu "
 553			 "seconds (%u kB/s, %u KiB/s, %u.%02u IOPS)\n",
 554			 mmc_hostname(test->card->host), sectors, sectors >> 1,
 555			 (sectors & 1 ? ".5" : ""), (unsigned long)ts.tv_sec,
 556			 (unsigned long)ts.tv_nsec, rate / 1000, rate / 1024,
 557			 iops / 100, iops % 100);
 558
 559	mmc_test_save_transfer_result(test, 1, sectors, ts, rate, iops);
 560}
 561
 562/*
 563 * Print the average transfer rate.
 564 */
 565static void mmc_test_print_avg_rate(struct mmc_test_card *test, uint64_t bytes,
 566				    unsigned int count, struct timespec *ts1,
 567				    struct timespec *ts2)
 568{
 569	unsigned int rate, iops, sectors = bytes >> 9;
 570	uint64_t tot = bytes * count;
 571	struct timespec ts;
 572
 573	ts = timespec_sub(*ts2, *ts1);
 574
 575	rate = mmc_test_rate(tot, &ts);
 576	iops = mmc_test_rate(count * 100, &ts); /* I/O ops per sec x 100 */
 577
 578	pr_info("%s: Transfer of %u x %u sectors (%u x %u%s KiB) took "
 579			 "%lu.%09lu seconds (%u kB/s, %u KiB/s, "
 580			 "%u.%02u IOPS, sg_len %d)\n",
 581			 mmc_hostname(test->card->host), count, sectors, count,
 582			 sectors >> 1, (sectors & 1 ? ".5" : ""),
 583			 (unsigned long)ts.tv_sec, (unsigned long)ts.tv_nsec,
 584			 rate / 1000, rate / 1024, iops / 100, iops % 100,
 585			 test->area.sg_len);
 586
 587	mmc_test_save_transfer_result(test, count, sectors, ts, rate, iops);
 588}
 589
 590/*
 591 * Return the card size in sectors.
 592 */
 593static unsigned int mmc_test_capacity(struct mmc_card *card)
 594{
 595	if (!mmc_card_sd(card) && mmc_card_blockaddr(card))
 596		return card->ext_csd.sectors;
 597	else
 598		return card->csd.capacity << (card->csd.read_blkbits - 9);
 599}
 600
 601/*******************************************************************/
 602/*  Test preparation and cleanup                                   */
 603/*******************************************************************/
 604
 605/*
 606 * Fill the first couple of sectors of the card with known data
 607 * so that bad reads/writes can be detected
 608 */
 609static int __mmc_test_prepare(struct mmc_test_card *test, int write)
 610{
 611	int ret, i;
 612
 613	ret = mmc_test_set_blksize(test, 512);
 614	if (ret)
 615		return ret;
 616
 617	if (write)
 618		memset(test->buffer, 0xDF, 512);
 619	else {
 620		for (i = 0;i < 512;i++)
 621			test->buffer[i] = i;
 622	}
 623
 624	for (i = 0;i < BUFFER_SIZE / 512;i++) {
 625		ret = mmc_test_buffer_transfer(test, test->buffer, i, 512, 1);
 626		if (ret)
 627			return ret;
 628	}
 629
 630	return 0;
 631}
 632
 633static int mmc_test_prepare_write(struct mmc_test_card *test)
 634{
 635	return __mmc_test_prepare(test, 1);
 636}
 637
 638static int mmc_test_prepare_read(struct mmc_test_card *test)
 639{
 640	return __mmc_test_prepare(test, 0);
 641}
 642
 643static int mmc_test_cleanup(struct mmc_test_card *test)
 644{
 645	int ret, i;
 646
 647	ret = mmc_test_set_blksize(test, 512);
 648	if (ret)
 649		return ret;
 650
 651	memset(test->buffer, 0, 512);
 652
 653	for (i = 0;i < BUFFER_SIZE / 512;i++) {
 654		ret = mmc_test_buffer_transfer(test, test->buffer, i, 512, 1);
 655		if (ret)
 656			return ret;
 657	}
 658
 659	return 0;
 660}
 661
 662/*******************************************************************/
 663/*  Test execution helpers                                         */
 664/*******************************************************************/
 665
 666/*
 667 * Modifies the mmc_request to perform the "short transfer" tests
 668 */
 669static void mmc_test_prepare_broken_mrq(struct mmc_test_card *test,
 670	struct mmc_request *mrq, int write)
 671{
 672	BUG_ON(!mrq || !mrq->cmd || !mrq->data);
 673
 674	if (mrq->data->blocks > 1) {
 675		mrq->cmd->opcode = write ?
 676			MMC_WRITE_BLOCK : MMC_READ_SINGLE_BLOCK;
 677		mrq->stop = NULL;
 678	} else {
 679		mrq->cmd->opcode = MMC_SEND_STATUS;
 680		mrq->cmd->arg = test->card->rca << 16;
 681	}
 682}
 683
 684/*
 685 * Checks that a normal transfer didn't have any errors
 686 */
 687static int mmc_test_check_result(struct mmc_test_card *test,
 688				 struct mmc_request *mrq)
 689{
 690	int ret;
 691
 692	BUG_ON(!mrq || !mrq->cmd || !mrq->data);
 693
 694	ret = 0;
 695
 696	if (!ret && mrq->cmd->error)
 697		ret = mrq->cmd->error;
 698	if (!ret && mrq->data->error)
 699		ret = mrq->data->error;
 700	if (!ret && mrq->stop && mrq->stop->error)
 701		ret = mrq->stop->error;
 702	if (!ret && mrq->data->bytes_xfered !=
 703		mrq->data->blocks * mrq->data->blksz)
 704		ret = RESULT_FAIL;
 705
 706	if (ret == -EINVAL)
 707		ret = RESULT_UNSUP_HOST;
 708
 709	return ret;
 710}
 711
 712static int mmc_test_check_result_async(struct mmc_card *card,
 713				       struct mmc_async_req *areq)
 714{
 715	struct mmc_test_async_req *test_async =
 716		container_of(areq, struct mmc_test_async_req, areq);
 717
 718	mmc_test_wait_busy(test_async->test);
 719
 720	return mmc_test_check_result(test_async->test, areq->mrq);
 721}
 722
 723/*
 724 * Checks that a "short transfer" behaved as expected
 725 */
 726static int mmc_test_check_broken_result(struct mmc_test_card *test,
 727	struct mmc_request *mrq)
 728{
 729	int ret;
 730
 731	BUG_ON(!mrq || !mrq->cmd || !mrq->data);
 732
 733	ret = 0;
 734
 735	if (!ret && mrq->cmd->error)
 736		ret = mrq->cmd->error;
 737	if (!ret && mrq->data->error == 0)
 738		ret = RESULT_FAIL;
 739	if (!ret && mrq->data->error != -ETIMEDOUT)
 740		ret = mrq->data->error;
 741	if (!ret && mrq->stop && mrq->stop->error)
 742		ret = mrq->stop->error;
 743	if (mrq->data->blocks > 1) {
 744		if (!ret && mrq->data->bytes_xfered > mrq->data->blksz)
 745			ret = RESULT_FAIL;
 746	} else {
 747		if (!ret && mrq->data->bytes_xfered > 0)
 748			ret = RESULT_FAIL;
 749	}
 750
 751	if (ret == -EINVAL)
 752		ret = RESULT_UNSUP_HOST;
 753
 754	return ret;
 755}
 756
 757/*
 758 * Tests nonblock transfer with certain parameters
 759 */
 760static void mmc_test_nonblock_reset(struct mmc_request *mrq,
 761				    struct mmc_command *cmd,
 762				    struct mmc_command *stop,
 763				    struct mmc_data *data)
 764{
 765	memset(mrq, 0, sizeof(struct mmc_request));
 766	memset(cmd, 0, sizeof(struct mmc_command));
 767	memset(data, 0, sizeof(struct mmc_data));
 768	memset(stop, 0, sizeof(struct mmc_command));
 769
 770	mrq->cmd = cmd;
 771	mrq->data = data;
 772	mrq->stop = stop;
 773}
 774static int mmc_test_nonblock_transfer(struct mmc_test_card *test,
 775				      struct scatterlist *sg, unsigned sg_len,
 776				      unsigned dev_addr, unsigned blocks,
 777				      unsigned blksz, int write, int count)
 778{
 779	struct mmc_request mrq1;
 780	struct mmc_command cmd1;
 781	struct mmc_command stop1;
 782	struct mmc_data data1;
 783
 784	struct mmc_request mrq2;
 785	struct mmc_command cmd2;
 786	struct mmc_command stop2;
 787	struct mmc_data data2;
 788
 789	struct mmc_test_async_req test_areq[2];
 790	struct mmc_async_req *done_areq;
 791	struct mmc_async_req *cur_areq = &test_areq[0].areq;
 792	struct mmc_async_req *other_areq = &test_areq[1].areq;
 793	int i;
 794	int ret;
 795
 796	test_areq[0].test = test;
 797	test_areq[1].test = test;
 798
 799	mmc_test_nonblock_reset(&mrq1, &cmd1, &stop1, &data1);
 800	mmc_test_nonblock_reset(&mrq2, &cmd2, &stop2, &data2);
 801
 802	cur_areq->mrq = &mrq1;
 803	cur_areq->err_check = mmc_test_check_result_async;
 804	other_areq->mrq = &mrq2;
 805	other_areq->err_check = mmc_test_check_result_async;
 806
 807	for (i = 0; i < count; i++) {
 808		mmc_test_prepare_mrq(test, cur_areq->mrq, sg, sg_len, dev_addr,
 809				     blocks, blksz, write);
 810		done_areq = mmc_start_req(test->card->host, cur_areq, &ret);
 811
 812		if (ret || (!done_areq && i > 0))
 813			goto err;
 814
 815		if (done_areq) {
 816			if (done_areq->mrq == &mrq2)
 817				mmc_test_nonblock_reset(&mrq2, &cmd2,
 818							&stop2, &data2);
 819			else
 820				mmc_test_nonblock_reset(&mrq1, &cmd1,
 821							&stop1, &data1);
 822		}
 823		swap(cur_areq, other_areq);
 824		dev_addr += blocks;
 825	}
 826
 827	done_areq = mmc_start_req(test->card->host, NULL, &ret);
 828
 829	return ret;
 830err:
 831	return ret;
 832}
 833
 834/*
 835 * Tests a basic transfer with certain parameters
 836 */
 837static int mmc_test_simple_transfer(struct mmc_test_card *test,
 838	struct scatterlist *sg, unsigned sg_len, unsigned dev_addr,
 839	unsigned blocks, unsigned blksz, int write)
 840{
 841	struct mmc_request mrq = {0};
 842	struct mmc_command cmd = {0};
 843	struct mmc_command stop = {0};
 844	struct mmc_data data = {0};
 845
 846	mrq.cmd = &cmd;
 847	mrq.data = &data;
 848	mrq.stop = &stop;
 849
 850	mmc_test_prepare_mrq(test, &mrq, sg, sg_len, dev_addr,
 851		blocks, blksz, write);
 852
 853	mmc_wait_for_req(test->card->host, &mrq);
 854
 855	mmc_test_wait_busy(test);
 856
 857	return mmc_test_check_result(test, &mrq);
 858}
 859
 860/*
 861 * Tests a transfer where the card will fail completely or partly
 862 */
 863static int mmc_test_broken_transfer(struct mmc_test_card *test,
 864	unsigned blocks, unsigned blksz, int write)
 865{
 866	struct mmc_request mrq = {0};
 867	struct mmc_command cmd = {0};
 868	struct mmc_command stop = {0};
 869	struct mmc_data data = {0};
 870
 871	struct scatterlist sg;
 872
 873	mrq.cmd = &cmd;
 874	mrq.data = &data;
 875	mrq.stop = &stop;
 876
 877	sg_init_one(&sg, test->buffer, blocks * blksz);
 878
 879	mmc_test_prepare_mrq(test, &mrq, &sg, 1, 0, blocks, blksz, write);
 880	mmc_test_prepare_broken_mrq(test, &mrq, write);
 881
 882	mmc_wait_for_req(test->card->host, &mrq);
 883
 884	mmc_test_wait_busy(test);
 885
 886	return mmc_test_check_broken_result(test, &mrq);
 887}
 888
 889/*
 890 * Does a complete transfer test where data is also validated
 891 *
 892 * Note: mmc_test_prepare() must have been done before this call
 893 */
 894static int mmc_test_transfer(struct mmc_test_card *test,
 895	struct scatterlist *sg, unsigned sg_len, unsigned dev_addr,
 896	unsigned blocks, unsigned blksz, int write)
 897{
 898	int ret, i;
 899	unsigned long flags;
 900
 901	if (write) {
 902		for (i = 0;i < blocks * blksz;i++)
 903			test->scratch[i] = i;
 904	} else {
 905		memset(test->scratch, 0, BUFFER_SIZE);
 906	}
 907	local_irq_save(flags);
 908	sg_copy_from_buffer(sg, sg_len, test->scratch, BUFFER_SIZE);
 909	local_irq_restore(flags);
 910
 911	ret = mmc_test_set_blksize(test, blksz);
 912	if (ret)
 913		return ret;
 914
 915	ret = mmc_test_simple_transfer(test, sg, sg_len, dev_addr,
 916		blocks, blksz, write);
 917	if (ret)
 918		return ret;
 919
 920	if (write) {
 921		int sectors;
 922
 923		ret = mmc_test_set_blksize(test, 512);
 924		if (ret)
 925			return ret;
 926
 927		sectors = (blocks * blksz + 511) / 512;
 928		if ((sectors * 512) == (blocks * blksz))
 929			sectors++;
 930
 931		if ((sectors * 512) > BUFFER_SIZE)
 932			return -EINVAL;
 933
 934		memset(test->buffer, 0, sectors * 512);
 935
 936		for (i = 0;i < sectors;i++) {
 937			ret = mmc_test_buffer_transfer(test,
 938				test->buffer + i * 512,
 939				dev_addr + i, 512, 0);
 940			if (ret)
 941				return ret;
 942		}
 943
 944		for (i = 0;i < blocks * blksz;i++) {
 945			if (test->buffer[i] != (u8)i)
 946				return RESULT_FAIL;
 947		}
 948
 949		for (;i < sectors * 512;i++) {
 950			if (test->buffer[i] != 0xDF)
 951				return RESULT_FAIL;
 952		}
 953	} else {
 954		local_irq_save(flags);
 955		sg_copy_to_buffer(sg, sg_len, test->scratch, BUFFER_SIZE);
 956		local_irq_restore(flags);
 957		for (i = 0;i < blocks * blksz;i++) {
 958			if (test->scratch[i] != (u8)i)
 959				return RESULT_FAIL;
 960		}
 961	}
 962
 963	return 0;
 964}
 965
 966/*******************************************************************/
 967/*  Tests                                                          */
 968/*******************************************************************/
 969
 970struct mmc_test_case {
 971	const char *name;
 972
 973	int (*prepare)(struct mmc_test_card *);
 974	int (*run)(struct mmc_test_card *);
 975	int (*cleanup)(struct mmc_test_card *);
 976};
 977
 978static int mmc_test_basic_write(struct mmc_test_card *test)
 979{
 980	int ret;
 981	struct scatterlist sg;
 982
 983	ret = mmc_test_set_blksize(test, 512);
 984	if (ret)
 985		return ret;
 986
 987	sg_init_one(&sg, test->buffer, 512);
 988
 989	return mmc_test_simple_transfer(test, &sg, 1, 0, 1, 512, 1);
 990}
 991
 992static int mmc_test_basic_read(struct mmc_test_card *test)
 993{
 994	int ret;
 995	struct scatterlist sg;
 996
 997	ret = mmc_test_set_blksize(test, 512);
 998	if (ret)
 999		return ret;
1000
1001	sg_init_one(&sg, test->buffer, 512);
1002
1003	return mmc_test_simple_transfer(test, &sg, 1, 0, 1, 512, 0);
1004}
1005
1006static int mmc_test_verify_write(struct mmc_test_card *test)
1007{
1008	struct scatterlist sg;
1009
1010	sg_init_one(&sg, test->buffer, 512);
1011
1012	return mmc_test_transfer(test, &sg, 1, 0, 1, 512, 1);
1013}
1014
1015static int mmc_test_verify_read(struct mmc_test_card *test)
1016{
1017	struct scatterlist sg;
1018
1019	sg_init_one(&sg, test->buffer, 512);
1020
1021	return mmc_test_transfer(test, &sg, 1, 0, 1, 512, 0);
1022}
1023
1024static int mmc_test_multi_write(struct mmc_test_card *test)
1025{
1026	unsigned int size;
1027	struct scatterlist sg;
1028
1029	if (test->card->host->max_blk_count == 1)
1030		return RESULT_UNSUP_HOST;
1031
1032	size = PAGE_SIZE * 2;
1033	size = min(size, test->card->host->max_req_size);
1034	size = min(size, test->card->host->max_seg_size);
1035	size = min(size, test->card->host->max_blk_count * 512);
1036
1037	if (size < 1024)
1038		return RESULT_UNSUP_HOST;
1039
1040	sg_init_one(&sg, test->buffer, size);
1041
1042	return mmc_test_transfer(test, &sg, 1, 0, size/512, 512, 1);
1043}
1044
1045static int mmc_test_multi_read(struct mmc_test_card *test)
1046{
1047	unsigned int size;
1048	struct scatterlist sg;
1049
1050	if (test->card->host->max_blk_count == 1)
1051		return RESULT_UNSUP_HOST;
1052
1053	size = PAGE_SIZE * 2;
1054	size = min(size, test->card->host->max_req_size);
1055	size = min(size, test->card->host->max_seg_size);
1056	size = min(size, test->card->host->max_blk_count * 512);
1057
1058	if (size < 1024)
1059		return RESULT_UNSUP_HOST;
1060
1061	sg_init_one(&sg, test->buffer, size);
1062
1063	return mmc_test_transfer(test, &sg, 1, 0, size/512, 512, 0);
1064}
1065
1066static int mmc_test_pow2_write(struct mmc_test_card *test)
1067{
1068	int ret, i;
1069	struct scatterlist sg;
1070
1071	if (!test->card->csd.write_partial)
1072		return RESULT_UNSUP_CARD;
1073
1074	for (i = 1; i < 512;i <<= 1) {
1075		sg_init_one(&sg, test->buffer, i);
1076		ret = mmc_test_transfer(test, &sg, 1, 0, 1, i, 1);
1077		if (ret)
1078			return ret;
1079	}
1080
1081	return 0;
1082}
1083
1084static int mmc_test_pow2_read(struct mmc_test_card *test)
1085{
1086	int ret, i;
1087	struct scatterlist sg;
1088
1089	if (!test->card->csd.read_partial)
1090		return RESULT_UNSUP_CARD;
1091
1092	for (i = 1; i < 512;i <<= 1) {
1093		sg_init_one(&sg, test->buffer, i);
1094		ret = mmc_test_transfer(test, &sg, 1, 0, 1, i, 0);
1095		if (ret)
1096			return ret;
1097	}
1098
1099	return 0;
1100}
1101
1102static int mmc_test_weird_write(struct mmc_test_card *test)
1103{
1104	int ret, i;
1105	struct scatterlist sg;
1106
1107	if (!test->card->csd.write_partial)
1108		return RESULT_UNSUP_CARD;
1109
1110	for (i = 3; i < 512;i += 7) {
1111		sg_init_one(&sg, test->buffer, i);
1112		ret = mmc_test_transfer(test, &sg, 1, 0, 1, i, 1);
1113		if (ret)
1114			return ret;
1115	}
1116
1117	return 0;
1118}
1119
1120static int mmc_test_weird_read(struct mmc_test_card *test)
1121{
1122	int ret, i;
1123	struct scatterlist sg;
1124
1125	if (!test->card->csd.read_partial)
1126		return RESULT_UNSUP_CARD;
1127
1128	for (i = 3; i < 512;i += 7) {
1129		sg_init_one(&sg, test->buffer, i);
1130		ret = mmc_test_transfer(test, &sg, 1, 0, 1, i, 0);
1131		if (ret)
1132			return ret;
1133	}
1134
1135	return 0;
1136}
1137
1138static int mmc_test_align_write(struct mmc_test_card *test)
1139{
1140	int ret, i;
1141	struct scatterlist sg;
1142
1143	for (i = 1; i < TEST_ALIGN_END; i++) {
1144		sg_init_one(&sg, test->buffer + i, 512);
1145		ret = mmc_test_transfer(test, &sg, 1, 0, 1, 512, 1);
1146		if (ret)
1147			return ret;
1148	}
1149
1150	return 0;
1151}
1152
1153static int mmc_test_align_read(struct mmc_test_card *test)
1154{
1155	int ret, i;
1156	struct scatterlist sg;
1157
1158	for (i = 1; i < TEST_ALIGN_END; i++) {
1159		sg_init_one(&sg, test->buffer + i, 512);
1160		ret = mmc_test_transfer(test, &sg, 1, 0, 1, 512, 0);
1161		if (ret)
1162			return ret;
1163	}
1164
1165	return 0;
1166}
1167
1168static int mmc_test_align_multi_write(struct mmc_test_card *test)
1169{
1170	int ret, i;
1171	unsigned int size;
1172	struct scatterlist sg;
1173
1174	if (test->card->host->max_blk_count == 1)
1175		return RESULT_UNSUP_HOST;
1176
1177	size = PAGE_SIZE * 2;
1178	size = min(size, test->card->host->max_req_size);
1179	size = min(size, test->card->host->max_seg_size);
1180	size = min(size, test->card->host->max_blk_count * 512);
1181
1182	if (size < 1024)
1183		return RESULT_UNSUP_HOST;
1184
1185	for (i = 1; i < TEST_ALIGN_END; i++) {
1186		sg_init_one(&sg, test->buffer + i, size);
1187		ret = mmc_test_transfer(test, &sg, 1, 0, size/512, 512, 1);
1188		if (ret)
1189			return ret;
1190	}
1191
1192	return 0;
1193}
1194
1195static int mmc_test_align_multi_read(struct mmc_test_card *test)
1196{
1197	int ret, i;
1198	unsigned int size;
1199	struct scatterlist sg;
1200
1201	if (test->card->host->max_blk_count == 1)
1202		return RESULT_UNSUP_HOST;
1203
1204	size = PAGE_SIZE * 2;
1205	size = min(size, test->card->host->max_req_size);
1206	size = min(size, test->card->host->max_seg_size);
1207	size = min(size, test->card->host->max_blk_count * 512);
1208
1209	if (size < 1024)
1210		return RESULT_UNSUP_HOST;
1211
1212	for (i = 1; i < TEST_ALIGN_END; i++) {
1213		sg_init_one(&sg, test->buffer + i, size);
1214		ret = mmc_test_transfer(test, &sg, 1, 0, size/512, 512, 0);
1215		if (ret)
1216			return ret;
1217	}
1218
1219	return 0;
1220}
1221
1222static int mmc_test_xfersize_write(struct mmc_test_card *test)
1223{
1224	int ret;
1225
1226	ret = mmc_test_set_blksize(test, 512);
1227	if (ret)
1228		return ret;
1229
1230	return mmc_test_broken_transfer(test, 1, 512, 1);
1231}
1232
1233static int mmc_test_xfersize_read(struct mmc_test_card *test)
1234{
1235	int ret;
1236
1237	ret = mmc_test_set_blksize(test, 512);
1238	if (ret)
1239		return ret;
1240
1241	return mmc_test_broken_transfer(test, 1, 512, 0);
1242}
1243
1244static int mmc_test_multi_xfersize_write(struct mmc_test_card *test)
1245{
1246	int ret;
1247
1248	if (test->card->host->max_blk_count == 1)
1249		return RESULT_UNSUP_HOST;
1250
1251	ret = mmc_test_set_blksize(test, 512);
1252	if (ret)
1253		return ret;
1254
1255	return mmc_test_broken_transfer(test, 2, 512, 1);
1256}
1257
1258static int mmc_test_multi_xfersize_read(struct mmc_test_card *test)
1259{
1260	int ret;
1261
1262	if (test->card->host->max_blk_count == 1)
1263		return RESULT_UNSUP_HOST;
1264
1265	ret = mmc_test_set_blksize(test, 512);
1266	if (ret)
1267		return ret;
1268
1269	return mmc_test_broken_transfer(test, 2, 512, 0);
1270}
1271
1272#ifdef CONFIG_HIGHMEM
1273
1274static int mmc_test_write_high(struct mmc_test_card *test)
1275{
1276	struct scatterlist sg;
1277
1278	sg_init_table(&sg, 1);
1279	sg_set_page(&sg, test->highmem, 512, 0);
1280
1281	return mmc_test_transfer(test, &sg, 1, 0, 1, 512, 1);
1282}
1283
1284static int mmc_test_read_high(struct mmc_test_card *test)
1285{
1286	struct scatterlist sg;
1287
1288	sg_init_table(&sg, 1);
1289	sg_set_page(&sg, test->highmem, 512, 0);
1290
1291	return mmc_test_transfer(test, &sg, 1, 0, 1, 512, 0);
1292}
1293
1294static int mmc_test_multi_write_high(struct mmc_test_card *test)
1295{
1296	unsigned int size;
1297	struct scatterlist sg;
1298
1299	if (test->card->host->max_blk_count == 1)
1300		return RESULT_UNSUP_HOST;
1301
1302	size = PAGE_SIZE * 2;
1303	size = min(size, test->card->host->max_req_size);
1304	size = min(size, test->card->host->max_seg_size);
1305	size = min(size, test->card->host->max_blk_count * 512);
1306
1307	if (size < 1024)
1308		return RESULT_UNSUP_HOST;
1309
1310	sg_init_table(&sg, 1);
1311	sg_set_page(&sg, test->highmem, size, 0);
1312
1313	return mmc_test_transfer(test, &sg, 1, 0, size/512, 512, 1);
1314}
1315
1316static int mmc_test_multi_read_high(struct mmc_test_card *test)
1317{
1318	unsigned int size;
1319	struct scatterlist sg;
1320
1321	if (test->card->host->max_blk_count == 1)
1322		return RESULT_UNSUP_HOST;
1323
1324	size = PAGE_SIZE * 2;
1325	size = min(size, test->card->host->max_req_size);
1326	size = min(size, test->card->host->max_seg_size);
1327	size = min(size, test->card->host->max_blk_count * 512);
1328
1329	if (size < 1024)
1330		return RESULT_UNSUP_HOST;
1331
1332	sg_init_table(&sg, 1);
1333	sg_set_page(&sg, test->highmem, size, 0);
1334
1335	return mmc_test_transfer(test, &sg, 1, 0, size/512, 512, 0);
1336}
1337
1338#else
1339
1340static int mmc_test_no_highmem(struct mmc_test_card *test)
1341{
1342	pr_info("%s: Highmem not configured - test skipped\n",
1343	       mmc_hostname(test->card->host));
1344	return 0;
1345}
1346
1347#endif /* CONFIG_HIGHMEM */
1348
1349/*
1350 * Map sz bytes so that it can be transferred.
1351 */
1352static int mmc_test_area_map(struct mmc_test_card *test, unsigned long sz,
1353			     int max_scatter, int min_sg_len)
1354{
1355	struct mmc_test_area *t = &test->area;
1356	int err;
1357
1358	t->blocks = sz >> 9;
1359
1360	if (max_scatter) {
1361		err = mmc_test_map_sg_max_scatter(t->mem, sz, t->sg,
1362						  t->max_segs, t->max_seg_sz,
1363				       &t->sg_len);
1364	} else {
1365		err = mmc_test_map_sg(t->mem, sz, t->sg, 1, t->max_segs,
1366				      t->max_seg_sz, &t->sg_len, min_sg_len);
1367	}
1368	if (err)
1369		pr_info("%s: Failed to map sg list\n",
1370		       mmc_hostname(test->card->host));
1371	return err;
1372}
1373
1374/*
1375 * Transfer bytes mapped by mmc_test_area_map().
1376 */
1377static int mmc_test_area_transfer(struct mmc_test_card *test,
1378				  unsigned int dev_addr, int write)
1379{
1380	struct mmc_test_area *t = &test->area;
1381
1382	return mmc_test_simple_transfer(test, t->sg, t->sg_len, dev_addr,
1383					t->blocks, 512, write);
1384}
1385
1386/*
1387 * Map and transfer bytes for multiple transfers.
1388 */
1389static int mmc_test_area_io_seq(struct mmc_test_card *test, unsigned long sz,
1390				unsigned int dev_addr, int write,
1391				int max_scatter, int timed, int count,
1392				bool nonblock, int min_sg_len)
1393{
1394	struct timespec ts1, ts2;
1395	int ret = 0;
1396	int i;
1397	struct mmc_test_area *t = &test->area;
1398
1399	/*
1400	 * In the case of a maximally scattered transfer, the maximum transfer
1401	 * size is further limited by using PAGE_SIZE segments.
1402	 */
1403	if (max_scatter) {
1404		struct mmc_test_area *t = &test->area;
1405		unsigned long max_tfr;
1406
1407		if (t->max_seg_sz >= PAGE_SIZE)
1408			max_tfr = t->max_segs * PAGE_SIZE;
1409		else
1410			max_tfr = t->max_segs * t->max_seg_sz;
1411		if (sz > max_tfr)
1412			sz = max_tfr;
1413	}
1414
1415	ret = mmc_test_area_map(test, sz, max_scatter, min_sg_len);
1416	if (ret)
1417		return ret;
1418
1419	if (timed)
1420		getnstimeofday(&ts1);
1421	if (nonblock)
1422		ret = mmc_test_nonblock_transfer(test, t->sg, t->sg_len,
1423				 dev_addr, t->blocks, 512, write, count);
1424	else
1425		for (i = 0; i < count && ret == 0; i++) {
1426			ret = mmc_test_area_transfer(test, dev_addr, write);
1427			dev_addr += sz >> 9;
1428		}
1429
1430	if (ret)
1431		return ret;
1432
1433	if (timed)
1434		getnstimeofday(&ts2);
1435
1436	if (timed)
1437		mmc_test_print_avg_rate(test, sz, count, &ts1, &ts2);
1438
1439	return 0;
1440}
1441
1442static int mmc_test_area_io(struct mmc_test_card *test, unsigned long sz,
1443			    unsigned int dev_addr, int write, int max_scatter,
1444			    int timed)
1445{
1446	return mmc_test_area_io_seq(test, sz, dev_addr, write, max_scatter,
1447				    timed, 1, false, 0);
1448}
1449
1450/*
1451 * Write the test area entirely.
1452 */
1453static int mmc_test_area_fill(struct mmc_test_card *test)
1454{
1455	struct mmc_test_area *t = &test->area;
1456
1457	return mmc_test_area_io(test, t->max_tfr, t->dev_addr, 1, 0, 0);
1458}
1459
1460/*
1461 * Erase the test area entirely.
1462 */
1463static int mmc_test_area_erase(struct mmc_test_card *test)
1464{
1465	struct mmc_test_area *t = &test->area;
1466
1467	if (!mmc_can_erase(test->card))
1468		return 0;
1469
1470	return mmc_erase(test->card, t->dev_addr, t->max_sz >> 9,
1471			 MMC_ERASE_ARG);
1472}
1473
1474/*
1475 * Cleanup struct mmc_test_area.
1476 */
1477static int mmc_test_area_cleanup(struct mmc_test_card *test)
1478{
1479	struct mmc_test_area *t = &test->area;
1480
1481	kfree(t->sg);
1482	mmc_test_free_mem(t->mem);
1483
1484	return 0;
1485}
1486
1487/*
1488 * Initialize an area for testing large transfers.  The test area is set to the
1489 * middle of the card because cards may have different charateristics at the
1490 * front (for FAT file system optimization).  Optionally, the area is erased
1491 * (if the card supports it) which may improve write performance.  Optionally,
1492 * the area is filled with data for subsequent read tests.
1493 */
1494static int mmc_test_area_init(struct mmc_test_card *test, int erase, int fill)
1495{
1496	struct mmc_test_area *t = &test->area;
1497	unsigned long min_sz = 64 * 1024, sz;
1498	int ret;
1499
1500	ret = mmc_test_set_blksize(test, 512);
1501	if (ret)
1502		return ret;
1503
1504	/* Make the test area size about 4MiB */
1505	sz = (unsigned long)test->card->pref_erase << 9;
1506	t->max_sz = sz;
1507	while (t->max_sz < 4 * 1024 * 1024)
1508		t->max_sz += sz;
1509	while (t->max_sz > TEST_AREA_MAX_SIZE && t->max_sz > sz)
1510		t->max_sz -= sz;
1511
1512	t->max_segs = test->card->host->max_segs;
1513	t->max_seg_sz = test->card->host->max_seg_size;
1514	t->max_seg_sz -= t->max_seg_sz % 512;
1515
1516	t->max_tfr = t->max_sz;
1517	if (t->max_tfr >> 9 > test->card->host->max_blk_count)
1518		t->max_tfr = test->card->host->max_blk_count << 9;
1519	if (t->max_tfr > test->card->host->max_req_size)
1520		t->max_tfr = test->card->host->max_req_size;
1521	if (t->max_tfr / t->max_seg_sz > t->max_segs)
1522		t->max_tfr = t->max_segs * t->max_seg_sz;
1523
1524	/*
1525	 * Try to allocate enough memory for a max. sized transfer.  Less is OK
1526	 * because the same memory can be mapped into the scatterlist more than
1527	 * once.  Also, take into account the limits imposed on scatterlist
1528	 * segments by the host driver.
1529	 */
1530	t->mem = mmc_test_alloc_mem(min_sz, t->max_tfr, t->max_segs,
1531				    t->max_seg_sz);
1532	if (!t->mem)
1533		return -ENOMEM;
1534
1535	t->sg = kmalloc(sizeof(struct scatterlist) * t->max_segs, GFP_KERNEL);
1536	if (!t->sg) {
1537		ret = -ENOMEM;
1538		goto out_free;
1539	}
1540
1541	t->dev_addr = mmc_test_capacity(test->card) / 2;
1542	t->dev_addr -= t->dev_addr % (t->max_sz >> 9);
1543
1544	if (erase) {
1545		ret = mmc_test_area_erase(test);
1546		if (ret)
1547			goto out_free;
1548	}
1549
1550	if (fill) {
1551		ret = mmc_test_area_fill(test);
1552		if (ret)
1553			goto out_free;
1554	}
1555
1556	return 0;
1557
1558out_free:
1559	mmc_test_area_cleanup(test);
1560	return ret;
1561}
1562
1563/*
1564 * Prepare for large transfers.  Do not erase the test area.
1565 */
1566static int mmc_test_area_prepare(struct mmc_test_card *test)
1567{
1568	return mmc_test_area_init(test, 0, 0);
1569}
1570
1571/*
1572 * Prepare for large transfers.  Do erase the test area.
1573 */
1574static int mmc_test_area_prepare_erase(struct mmc_test_card *test)
1575{
1576	return mmc_test_area_init(test, 1, 0);
1577}
1578
1579/*
1580 * Prepare for large transfers.  Erase and fill the test area.
1581 */
1582static int mmc_test_area_prepare_fill(struct mmc_test_card *test)
1583{
1584	return mmc_test_area_init(test, 1, 1);
1585}
1586
1587/*
1588 * Test best-case performance.  Best-case performance is expected from
1589 * a single large transfer.
1590 *
1591 * An additional option (max_scatter) allows the measurement of the same
1592 * transfer but with no contiguous pages in the scatter list.  This tests
1593 * the efficiency of DMA to handle scattered pages.
1594 */
1595static int mmc_test_best_performance(struct mmc_test_card *test, int write,
1596				     int max_scatter)
1597{
1598	struct mmc_test_area *t = &test->area;
1599
1600	return mmc_test_area_io(test, t->max_tfr, t->dev_addr, write,
1601				max_scatter, 1);
1602}
1603
1604/*
1605 * Best-case read performance.
1606 */
1607static int mmc_test_best_read_performance(struct mmc_test_card *test)
1608{
1609	return mmc_test_best_performance(test, 0, 0);
1610}
1611
1612/*
1613 * Best-case write performance.
1614 */
1615static int mmc_test_best_write_performance(struct mmc_test_card *test)
1616{
1617	return mmc_test_best_performance(test, 1, 0);
1618}
1619
1620/*
1621 * Best-case read performance into scattered pages.
1622 */
1623static int mmc_test_best_read_perf_max_scatter(struct mmc_test_card *test)
1624{
1625	return mmc_test_best_performance(test, 0, 1);
1626}
1627
1628/*
1629 * Best-case write performance from scattered pages.
1630 */
1631static int mmc_test_best_write_perf_max_scatter(struct mmc_test_card *test)
1632{
1633	return mmc_test_best_performance(test, 1, 1);
1634}
1635
1636/*
1637 * Single read performance by transfer size.
1638 */
1639static int mmc_test_profile_read_perf(struct mmc_test_card *test)
1640{
1641	struct mmc_test_area *t = &test->area;
1642	unsigned long sz;
1643	unsigned int dev_addr;
1644	int ret;
1645
1646	for (sz = 512; sz < t->max_tfr; sz <<= 1) {
1647		dev_addr = t->dev_addr + (sz >> 9);
1648		ret = mmc_test_area_io(test, sz, dev_addr, 0, 0, 1);
1649		if (ret)
1650			return ret;
1651	}
1652	sz = t->max_tfr;
1653	dev_addr = t->dev_addr;
1654	return mmc_test_area_io(test, sz, dev_addr, 0, 0, 1);
1655}
1656
1657/*
1658 * Single write performance by transfer size.
1659 */
1660static int mmc_test_profile_write_perf(struct mmc_test_card *test)
1661{
1662	struct mmc_test_area *t = &test->area;
1663	unsigned long sz;
1664	unsigned int dev_addr;
1665	int ret;
1666
1667	ret = mmc_test_area_erase(test);
1668	if (ret)
1669		return ret;
1670	for (sz = 512; sz < t->max_tfr; sz <<= 1) {
1671		dev_addr = t->dev_addr + (sz >> 9);
1672		ret = mmc_test_area_io(test, sz, dev_addr, 1, 0, 1);
1673		if (ret)
1674			return ret;
1675	}
1676	ret = mmc_test_area_erase(test);
1677	if (ret)
1678		return ret;
1679	sz = t->max_tfr;
1680	dev_addr = t->dev_addr;
1681	return mmc_test_area_io(test, sz, dev_addr, 1, 0, 1);
1682}
1683
1684/*
1685 * Single trim performance by transfer size.
1686 */
1687static int mmc_test_profile_trim_perf(struct mmc_test_card *test)
1688{
1689	struct mmc_test_area *t = &test->area;
1690	unsigned long sz;
1691	unsigned int dev_addr;
1692	struct timespec ts1, ts2;
1693	int ret;
1694
1695	if (!mmc_can_trim(test->card))
1696		return RESULT_UNSUP_CARD;
1697
1698	if (!mmc_can_erase(test->card))
1699		return RESULT_UNSUP_HOST;
1700
1701	for (sz = 512; sz < t->max_sz; sz <<= 1) {
1702		dev_addr = t->dev_addr + (sz >> 9);
1703		getnstimeofday(&ts1);
1704		ret = mmc_erase(test->card, dev_addr, sz >> 9, MMC_TRIM_ARG);
1705		if (ret)
1706			return ret;
1707		getnstimeofday(&ts2);
1708		mmc_test_print_rate(test, sz, &ts1, &ts2);
1709	}
1710	dev_addr = t->dev_addr;
1711	getnstimeofday(&ts1);
1712	ret = mmc_erase(test->card, dev_addr, sz >> 9, MMC_TRIM_ARG);
1713	if (ret)
1714		return ret;
1715	getnstimeofday(&ts2);
1716	mmc_test_print_rate(test, sz, &ts1, &ts2);
1717	return 0;
1718}
1719
1720static int mmc_test_seq_read_perf(struct mmc_test_card *test, unsigned long sz)
1721{
1722	struct mmc_test_area *t = &test->area;
1723	unsigned int dev_addr, i, cnt;
1724	struct timespec ts1, ts2;
1725	int ret;
1726
1727	cnt = t->max_sz / sz;
1728	dev_addr = t->dev_addr;
1729	getnstimeofday(&ts1);
1730	for (i = 0; i < cnt; i++) {
1731		ret = mmc_test_area_io(test, sz, dev_addr, 0, 0, 0);
1732		if (ret)
1733			return ret;
1734		dev_addr += (sz >> 9);
1735	}
1736	getnstimeofday(&ts2);
1737	mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2);
1738	return 0;
1739}
1740
1741/*
1742 * Consecutive read performance by transfer size.
1743 */
1744static int mmc_test_profile_seq_read_perf(struct mmc_test_card *test)
1745{
1746	struct mmc_test_area *t = &test->area;
1747	unsigned long sz;
1748	int ret;
1749
1750	for (sz = 512; sz < t->max_tfr; sz <<= 1) {
1751		ret = mmc_test_seq_read_perf(test, sz);
1752		if (ret)
1753			return ret;
1754	}
1755	sz = t->max_tfr;
1756	return mmc_test_seq_read_perf(test, sz);
1757}
1758
1759static int mmc_test_seq_write_perf(struct mmc_test_card *test, unsigned long sz)
1760{
1761	struct mmc_test_area *t = &test->area;
1762	unsigned int dev_addr, i, cnt;
1763	struct timespec ts1, ts2;
1764	int ret;
1765
1766	ret = mmc_test_area_erase(test);
1767	if (ret)
1768		return ret;
1769	cnt = t->max_sz / sz;
1770	dev_addr = t->dev_addr;
1771	getnstimeofday(&ts1);
1772	for (i = 0; i < cnt; i++) {
1773		ret = mmc_test_area_io(test, sz, dev_addr, 1, 0, 0);
1774		if (ret)
1775			return ret;
1776		dev_addr += (sz >> 9);
1777	}
1778	getnstimeofday(&ts2);
1779	mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2);
1780	return 0;
1781}
1782
1783/*
1784 * Consecutive write performance by transfer size.
1785 */
1786static int mmc_test_profile_seq_write_perf(struct mmc_test_card *test)
1787{
1788	struct mmc_test_area *t = &test->area;
1789	unsigned long sz;
1790	int ret;
1791
1792	for (sz = 512; sz < t->max_tfr; sz <<= 1) {
1793		ret = mmc_test_seq_write_perf(test, sz);
1794		if (ret)
1795			return ret;
1796	}
1797	sz = t->max_tfr;
1798	return mmc_test_seq_write_perf(test, sz);
1799}
1800
1801/*
1802 * Consecutive trim performance by transfer size.
1803 */
1804static int mmc_test_profile_seq_trim_perf(struct mmc_test_card *test)
1805{
1806	struct mmc_test_area *t = &test->area;
1807	unsigned long sz;
1808	unsigned int dev_addr, i, cnt;
1809	struct timespec ts1, ts2;
1810	int ret;
1811
1812	if (!mmc_can_trim(test->card))
1813		return RESULT_UNSUP_CARD;
1814
1815	if (!mmc_can_erase(test->card))
1816		return RESULT_UNSUP_HOST;
1817
1818	for (sz = 512; sz <= t->max_sz; sz <<= 1) {
1819		ret = mmc_test_area_erase(test);
1820		if (ret)
1821			return ret;
1822		ret = mmc_test_area_fill(test);
1823		if (ret)
1824			return ret;
1825		cnt = t->max_sz / sz;
1826		dev_addr = t->dev_addr;
1827		getnstimeofday(&ts1);
1828		for (i = 0; i < cnt; i++) {
1829			ret = mmc_erase(test->card, dev_addr, sz >> 9,
1830					MMC_TRIM_ARG);
1831			if (ret)
1832				return ret;
1833			dev_addr += (sz >> 9);
1834		}
1835		getnstimeofday(&ts2);
1836		mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2);
1837	}
1838	return 0;
1839}
1840
1841static unsigned int rnd_next = 1;
1842
1843static unsigned int mmc_test_rnd_num(unsigned int rnd_cnt)
1844{
1845	uint64_t r;
1846
1847	rnd_next = rnd_next * 1103515245 + 12345;
1848	r = (rnd_next >> 16) & 0x7fff;
1849	return (r * rnd_cnt) >> 15;
1850}
1851
1852static int mmc_test_rnd_perf(struct mmc_test_card *test, int write, int print,
1853			     unsigned long sz)
1854{
1855	unsigned int dev_addr, cnt, rnd_addr, range1, range2, last_ea = 0, ea;
1856	unsigned int ssz;
1857	struct timespec ts1, ts2, ts;
1858	int ret;
1859
1860	ssz = sz >> 9;
1861
1862	rnd_addr = mmc_test_capacity(test->card) / 4;
1863	range1 = rnd_addr / test->card->pref_erase;
1864	range2 = range1 / ssz;
1865
1866	getnstimeofday(&ts1);
1867	for (cnt = 0; cnt < UINT_MAX; cnt++) {
1868		getnstimeofday(&ts2);
1869		ts = timespec_sub(ts2, ts1);
1870		if (ts.tv_sec >= 10)
1871			break;
1872		ea = mmc_test_rnd_num(range1);
1873		if (ea == last_ea)
1874			ea -= 1;
1875		last_ea = ea;
1876		dev_addr = rnd_addr + test->card->pref_erase * ea +
1877			   ssz * mmc_test_rnd_num(range2);
1878		ret = mmc_test_area_io(test, sz, dev_addr, write, 0, 0);
1879		if (ret)
1880			return ret;
1881	}
1882	if (print)
1883		mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2);
1884	return 0;
1885}
1886
1887static int mmc_test_random_perf(struct mmc_test_card *test, int write)
1888{
1889	struct mmc_test_area *t = &test->area;
1890	unsigned int next;
1891	unsigned long sz;
1892	int ret;
1893
1894	for (sz = 512; sz < t->max_tfr; sz <<= 1) {
1895		/*
1896		 * When writing, try to get more consistent results by running
1897		 * the test twice with exactly the same I/O but outputting the
1898		 * results only for the 2nd run.
1899		 */
1900		if (write) {
1901			next = rnd_next;
1902			ret = mmc_test_rnd_perf(test, write, 0, sz);
1903			if (ret)
1904				return ret;
1905			rnd_next = next;
1906		}
1907		ret = mmc_test_rnd_perf(test, write, 1, sz);
1908		if (ret)
1909			return ret;
1910	}
1911	sz = t->max_tfr;
1912	if (write) {
1913		next = rnd_next;
1914		ret = mmc_test_rnd_perf(test, write, 0, sz);
1915		if (ret)
1916			return ret;
1917		rnd_next = next;
1918	}
1919	return mmc_test_rnd_perf(test, write, 1, sz);
1920}
1921
1922/*
1923 * Random read performance by transfer size.
1924 */
1925static int mmc_test_random_read_perf(struct mmc_test_card *test)
1926{
1927	return mmc_test_random_perf(test, 0);
1928}
1929
1930/*
1931 * Random write performance by transfer size.
1932 */
1933static int mmc_test_random_write_perf(struct mmc_test_card *test)
1934{
1935	return mmc_test_random_perf(test, 1);
1936}
1937
1938static int mmc_test_seq_perf(struct mmc_test_card *test, int write,
1939			     unsigned int tot_sz, int max_scatter)
1940{
1941	struct mmc_test_area *t = &test->area;
1942	unsigned int dev_addr, i, cnt, sz, ssz;
1943	struct timespec ts1, ts2;
1944	int ret;
1945
1946	sz = t->max_tfr;
1947
1948	/*
1949	 * In the case of a maximally scattered transfer, the maximum transfer
1950	 * size is further limited by using PAGE_SIZE segments.
1951	 */
1952	if (max_scatter) {
1953		unsigned long max_tfr;
1954
1955		if (t->max_seg_sz >= PAGE_SIZE)
1956			max_tfr = t->max_segs * PAGE_SIZE;
1957		else
1958			max_tfr = t->max_segs * t->max_seg_sz;
1959		if (sz > max_tfr)
1960			sz = max_tfr;
1961	}
1962
1963	ssz = sz >> 9;
1964	dev_addr = mmc_test_capacity(test->card) / 4;
1965	if (tot_sz > dev_addr << 9)
1966		tot_sz = dev_addr << 9;
1967	cnt = tot_sz / sz;
1968	dev_addr &= 0xffff0000; /* Round to 64MiB boundary */
1969
1970	getnstimeofday(&ts1);
1971	for (i = 0; i < cnt; i++) {
1972		ret = mmc_test_area_io(test, sz, dev_addr, write,
1973				       max_scatter, 0);
1974		if (ret)
1975			return ret;
1976		dev_addr += ssz;
1977	}
1978	getnstimeofday(&ts2);
1979
1980	mmc_test_print_avg_rate(test, sz, cnt, &ts1, &ts2);
1981
1982	return 0;
1983}
1984
1985static int mmc_test_large_seq_perf(struct mmc_test_card *test, int write)
1986{
1987	int ret, i;
1988
1989	for (i = 0; i < 10; i++) {
1990		ret = mmc_test_seq_perf(test, write, 10 * 1024 * 1024, 1);
1991		if (ret)
1992			return ret;
1993	}
1994	for (i = 0; i < 5; i++) {
1995		ret = mmc_test_seq_perf(test, write, 100 * 1024 * 1024, 1);
1996		if (ret)
1997			return ret;
1998	}
1999	for (i = 0; i < 3; i++) {
2000		ret = mmc_test_seq_perf(test, write, 1000 * 1024 * 1024, 1);
2001		if (ret)
2002			return ret;
2003	}
2004
2005	return ret;
2006}
2007
2008/*
2009 * Large sequential read performance.
2010 */
2011static int mmc_test_large_seq_read_perf(struct mmc_test_card *test)
2012{
2013	return mmc_test_large_seq_perf(test, 0);
2014}
2015
2016/*
2017 * Large sequential write performance.
2018 */
2019static int mmc_test_large_seq_write_perf(struct mmc_test_card *test)
2020{
2021	return mmc_test_large_seq_perf(test, 1);
2022}
2023
2024static int mmc_test_rw_multiple(struct mmc_test_card *test,
2025				struct mmc_test_multiple_rw *tdata,
2026				unsigned int reqsize, unsigned int size,
2027				int min_sg_len)
2028{
2029	unsigned int dev_addr;
2030	struct mmc_test_area *t = &test->area;
2031	int ret = 0;
2032
2033	/* Set up test area */
2034	if (size > mmc_test_capacity(test->card) / 2 * 512)
2035		size = mmc_test_capacity(test->card) / 2 * 512;
2036	if (reqsize > t->max_tfr)
2037		reqsize = t->max_tfr;
2038	dev_addr = mmc_test_capacity(test->card) / 4;
2039	if ((dev_addr & 0xffff0000))
2040		dev_addr &= 0xffff0000; /* Round to 64MiB boundary */
2041	else
2042		dev_addr &= 0xfffff800; /* Round to 1MiB boundary */
2043	if (!dev_addr)
2044		goto err;
2045
2046	if (reqsize > size)
2047		return 0;
2048
2049	/* prepare test area */
2050	if (mmc_can_erase(test->card) &&
2051	    tdata->prepare & MMC_TEST_PREP_ERASE) {
2052		ret = mmc_erase(test->card, dev_addr,
2053				size / 512, MMC_SECURE_ERASE_ARG);
2054		if (ret)
2055			ret = mmc_erase(test->card, dev_addr,
2056					size / 512, MMC_ERASE_ARG);
2057		if (ret)
2058			goto err;
2059	}
2060
2061	/* Run test */
2062	ret = mmc_test_area_io_seq(test, reqsize, dev_addr,
2063				   tdata->do_write, 0, 1, size / reqsize,
2064				   tdata->do_nonblock_req, min_sg_len);
2065	if (ret)
2066		goto err;
2067
2068	return ret;
2069 err:
2070	pr_info("[%s] error\n", __func__);
2071	return ret;
2072}
2073
2074static int mmc_test_rw_multiple_size(struct mmc_test_card *test,
2075				     struct mmc_test_multiple_rw *rw)
2076{
2077	int ret = 0;
2078	int i;
2079	void *pre_req = test->card->host->ops->pre_req;
2080	void *post_req = test->card->host->ops->post_req;
2081
2082	if (rw->do_nonblock_req &&
2083	    ((!pre_req && post_req) || (pre_req && !post_req))) {
2084		pr_info("error: only one of pre/post is defined\n");
2085		return -EINVAL;
2086	}
2087
2088	for (i = 0 ; i < rw->len && ret == 0; i++) {
2089		ret = mmc_test_rw_multiple(test, rw, rw->bs[i], rw->size, 0);
2090		if (ret)
2091			break;
2092	}
2093	return ret;
2094}
2095
2096static int mmc_test_rw_multiple_sg_len(struct mmc_test_card *test,
2097				       struct mmc_test_multiple_rw *rw)
2098{
2099	int ret = 0;
2100	int i;
2101
2102	for (i = 0 ; i < rw->len && ret == 0; i++) {
2103		ret = mmc_test_rw_multiple(test, rw, 512*1024, rw->size,
2104					   rw->sg_len[i]);
2105		if (ret)
2106			break;
2107	}
2108	return ret;
2109}
2110
2111/*
2112 * Multiple blocking write 4k to 4 MB chunks
2113 */
2114static int mmc_test_profile_mult_write_blocking_perf(struct mmc_test_card *test)
2115{
2116	unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
2117			     1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
2118	struct mmc_test_multiple_rw test_data = {
2119		.bs = bs,
2120		.size = TEST_AREA_MAX_SIZE,
2121		.len = ARRAY_SIZE(bs),
2122		.do_write = true,
2123		.do_nonblock_req = false,
2124		.prepare = MMC_TEST_PREP_ERASE,
2125	};
2126
2127	return mmc_test_rw_multiple_size(test, &test_data);
2128};
2129
2130/*
2131 * Multiple non-blocking write 4k to 4 MB chunks
2132 */
2133static int mmc_test_profile_mult_write_nonblock_perf(struct mmc_test_card *test)
2134{
2135	unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
2136			     1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
2137	struct mmc_test_multiple_rw test_data = {
2138		.bs = bs,
2139		.size = TEST_AREA_MAX_SIZE,
2140		.len = ARRAY_SIZE(bs),
2141		.do_write = true,
2142		.do_nonblock_req = true,
2143		.prepare = MMC_TEST_PREP_ERASE,
2144	};
2145
2146	return mmc_test_rw_multiple_size(test, &test_data);
2147}
2148
2149/*
2150 * Multiple blocking read 4k to 4 MB chunks
2151 */
2152static int mmc_test_profile_mult_read_blocking_perf(struct mmc_test_card *test)
2153{
2154	unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
2155			     1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
2156	struct mmc_test_multiple_rw test_data = {
2157		.bs = bs,
2158		.size = TEST_AREA_MAX_SIZE,
2159		.len = ARRAY_SIZE(bs),
2160		.do_write = false,
2161		.do_nonblock_req = false,
2162		.prepare = MMC_TEST_PREP_NONE,
2163	};
2164
2165	return mmc_test_rw_multiple_size(test, &test_data);
2166}
2167
2168/*
2169 * Multiple non-blocking read 4k to 4 MB chunks
2170 */
2171static int mmc_test_profile_mult_read_nonblock_perf(struct mmc_test_card *test)
2172{
2173	unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
2174			     1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
2175	struct mmc_test_multiple_rw test_data = {
2176		.bs = bs,
2177		.size = TEST_AREA_MAX_SIZE,
2178		.len = ARRAY_SIZE(bs),
2179		.do_write = false,
2180		.do_nonblock_req = true,
2181		.prepare = MMC_TEST_PREP_NONE,
2182	};
2183
2184	return mmc_test_rw_multiple_size(test, &test_data);
2185}
2186
2187/*
2188 * Multiple blocking write 1 to 512 sg elements
2189 */
2190static int mmc_test_profile_sglen_wr_blocking_perf(struct mmc_test_card *test)
2191{
2192	unsigned int sg_len[] = {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6,
2193				 1 << 7, 1 << 8, 1 << 9};
2194	struct mmc_test_multiple_rw test_data = {
2195		.sg_len = sg_len,
2196		.size = TEST_AREA_MAX_SIZE,
2197		.len = ARRAY_SIZE(sg_len),
2198		.do_write = true,
2199		.do_nonblock_req = false,
2200		.prepare = MMC_TEST_PREP_ERASE,
2201	};
2202
2203	return mmc_test_rw_multiple_sg_len(test, &test_data);
2204};
2205
2206/*
2207 * Multiple non-blocking write 1 to 512 sg elements
2208 */
2209static int mmc_test_profile_sglen_wr_nonblock_perf(struct mmc_test_card *test)
2210{
2211	unsigned int sg_len[] = {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6,
2212				 1 << 7, 1 << 8, 1 << 9};
2213	struct mmc_test_multiple_rw test_data = {
2214		.sg_len = sg_len,
2215		.size = TEST_AREA_MAX_SIZE,
2216		.len = ARRAY_SIZE(sg_len),
2217		.do_write = true,
2218		.do_nonblock_req = true,
2219		.prepare = MMC_TEST_PREP_ERASE,
2220	};
2221
2222	return mmc_test_rw_multiple_sg_len(test, &test_data);
2223}
2224
2225/*
2226 * Multiple blocking read 1 to 512 sg elements
2227 */
2228static int mmc_test_profile_sglen_r_blocking_perf(struct mmc_test_card *test)
2229{
2230	unsigned int sg_len[] = {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6,
2231				 1 << 7, 1 << 8, 1 << 9};
2232	struct mmc_test_multiple_rw test_data = {
2233		.sg_len = sg_len,
2234		.size = TEST_AREA_MAX_SIZE,
2235		.len = ARRAY_SIZE(sg_len),
2236		.do_write = false,
2237		.do_nonblock_req = false,
2238		.prepare = MMC_TEST_PREP_NONE,
2239	};
2240
2241	return mmc_test_rw_multiple_sg_len(test, &test_data);
2242}
2243
2244/*
2245 * Multiple non-blocking read 1 to 512 sg elements
2246 */
2247static int mmc_test_profile_sglen_r_nonblock_perf(struct mmc_test_card *test)
2248{
2249	unsigned int sg_len[] = {1, 1 << 3, 1 << 4, 1 << 5, 1 << 6,
2250				 1 << 7, 1 << 8, 1 << 9};
2251	struct mmc_test_multiple_rw test_data = {
2252		.sg_len = sg_len,
2253		.size = TEST_AREA_MAX_SIZE,
2254		.len = ARRAY_SIZE(sg_len),
2255		.do_write = false,
2256		.do_nonblock_req = true,
2257		.prepare = MMC_TEST_PREP_NONE,
2258	};
2259
2260	return mmc_test_rw_multiple_sg_len(test, &test_data);
2261}
2262
2263/*
2264 * eMMC hardware reset.
2265 */
2266static int mmc_test_reset(struct mmc_test_card *test)
2267{
2268	struct mmc_card *card = test->card;
2269	struct mmc_host *host = card->host;
2270	int err;
2271
2272	err = mmc_hw_reset(host);
2273	if (!err)
2274		return RESULT_OK;
2275	else if (err == -EOPNOTSUPP)
2276		return RESULT_UNSUP_HOST;
2277
2278	return RESULT_FAIL;
2279}
2280
2281static const struct mmc_test_case mmc_test_cases[] = {
2282	{
2283		.name = "Basic write (no data verification)",
2284		.run = mmc_test_basic_write,
2285	},
2286
2287	{
2288		.name = "Basic read (no data verification)",
2289		.run = mmc_test_basic_read,
2290	},
2291
2292	{
2293		.name = "Basic write (with data verification)",
2294		.prepare = mmc_test_prepare_write,
2295		.run = mmc_test_verify_write,
2296		.cleanup = mmc_test_cleanup,
2297	},
2298
2299	{
2300		.name = "Basic read (with data verification)",
2301		.prepare = mmc_test_prepare_read,
2302		.run = mmc_test_verify_read,
2303		.cleanup = mmc_test_cleanup,
2304	},
2305
2306	{
2307		.name = "Multi-block write",
2308		.prepare = mmc_test_prepare_write,
2309		.run = mmc_test_multi_write,
2310		.cleanup = mmc_test_cleanup,
2311	},
2312
2313	{
2314		.name = "Multi-block read",
2315		.prepare = mmc_test_prepare_read,
2316		.run = mmc_test_multi_read,
2317		.cleanup = mmc_test_cleanup,
2318	},
2319
2320	{
2321		.name = "Power of two block writes",
2322		.prepare = mmc_test_prepare_write,
2323		.run = mmc_test_pow2_write,
2324		.cleanup = mmc_test_cleanup,
2325	},
2326
2327	{
2328		.name = "Power of two block reads",
2329		.prepare = mmc_test_prepare_read,
2330		.run = mmc_test_pow2_read,
2331		.cleanup = mmc_test_cleanup,
2332	},
2333
2334	{
2335		.name = "Weird sized block writes",
2336		.prepare = mmc_test_prepare_write,
2337		.run = mmc_test_weird_write,
2338		.cleanup = mmc_test_cleanup,
2339	},
2340
2341	{
2342		.name = "Weird sized block reads",
2343		.prepare = mmc_test_prepare_read,
2344		.run = mmc_test_weird_read,
2345		.cleanup = mmc_test_cleanup,
2346	},
2347
2348	{
2349		.name = "Badly aligned write",
2350		.prepare = mmc_test_prepare_write,
2351		.run = mmc_test_align_write,
2352		.cleanup = mmc_test_cleanup,
2353	},
2354
2355	{
2356		.name = "Badly aligned read",
2357		.prepare = mmc_test_prepare_read,
2358		.run = mmc_test_align_read,
2359		.cleanup = mmc_test_cleanup,
2360	},
2361
2362	{
2363		.name = "Badly aligned multi-block write",
2364		.prepare = mmc_test_prepare_write,
2365		.run = mmc_test_align_multi_write,
2366		.cleanup = mmc_test_cleanup,
2367	},
2368
2369	{
2370		.name = "Badly aligned multi-block read",
2371		.prepare = mmc_test_prepare_read,
2372		.run = mmc_test_align_multi_read,
2373		.cleanup = mmc_test_cleanup,
2374	},
2375
2376	{
2377		.name = "Correct xfer_size at write (start failure)",
2378		.run = mmc_test_xfersize_write,
2379	},
2380
2381	{
2382		.name = "Correct xfer_size at read (start failure)",
2383		.run = mmc_test_xfersize_read,
2384	},
2385
2386	{
2387		.name = "Correct xfer_size at write (midway failure)",
2388		.run = mmc_test_multi_xfersize_write,
2389	},
2390
2391	{
2392		.name = "Correct xfer_size at read (midway failure)",
2393		.run = mmc_test_multi_xfersize_read,
2394	},
2395
2396#ifdef CONFIG_HIGHMEM
2397
2398	{
2399		.name = "Highmem write",
2400		.prepare = mmc_test_prepare_write,
2401		.run = mmc_test_write_high,
2402		.cleanup = mmc_test_cleanup,
2403	},
2404
2405	{
2406		.name = "Highmem read",
2407		.prepare = mmc_test_prepare_read,
2408		.run = mmc_test_read_high,
2409		.cleanup = mmc_test_cleanup,
2410	},
2411
2412	{
2413		.name = "Multi-block highmem write",
2414		.prepare = mmc_test_prepare_write,
2415		.run = mmc_test_multi_write_high,
2416		.cleanup = mmc_test_cleanup,
2417	},
2418
2419	{
2420		.name = "Multi-block highmem read",
2421		.prepare = mmc_test_prepare_read,
2422		.run = mmc_test_multi_read_high,
2423		.cleanup = mmc_test_cleanup,
2424	},
2425
2426#else
2427
2428	{
2429		.name = "Highmem write",
2430		.run = mmc_test_no_highmem,
2431	},
2432
2433	{
2434		.name = "Highmem read",
2435		.run = mmc_test_no_highmem,
2436	},
2437
2438	{
2439		.name = "Multi-block highmem write",
2440		.run = mmc_test_no_highmem,
2441	},
2442
2443	{
2444		.name = "Multi-block highmem read",
2445		.run = mmc_test_no_highmem,
2446	},
2447
2448#endif /* CONFIG_HIGHMEM */
2449
2450	{
2451		.name = "Best-case read performance",
2452		.prepare = mmc_test_area_prepare_fill,
2453		.run = mmc_test_best_read_performance,
2454		.cleanup = mmc_test_area_cleanup,
2455	},
2456
2457	{
2458		.name = "Best-case write performance",
2459		.prepare = mmc_test_area_prepare_erase,
2460		.run = mmc_test_best_write_performance,
2461		.cleanup = mmc_test_area_cleanup,
2462	},
2463
2464	{
2465		.name = "Best-case read performance into scattered pages",
2466		.prepare = mmc_test_area_prepare_fill,
2467		.run = mmc_test_best_read_perf_max_scatter,
2468		.cleanup = mmc_test_area_cleanup,
2469	},
2470
2471	{
2472		.name = "Best-case write performance from scattered pages",
2473		.prepare = mmc_test_area_prepare_erase,
2474		.run = mmc_test_best_write_perf_max_scatter,
2475		.cleanup = mmc_test_area_cleanup,
2476	},
2477
2478	{
2479		.name = "Single read performance by transfer size",
2480		.prepare = mmc_test_area_prepare_fill,
2481		.run = mmc_test_profile_read_perf,
2482		.cleanup = mmc_test_area_cleanup,
2483	},
2484
2485	{
2486		.name = "Single write performance by transfer size",
2487		.prepare = mmc_test_area_prepare,
2488		.run = mmc_test_profile_write_perf,
2489		.cleanup = mmc_test_area_cleanup,
2490	},
2491
2492	{
2493		.name = "Single trim performance by transfer size",
2494		.prepare = mmc_test_area_prepare_fill,
2495		.run = mmc_test_profile_trim_perf,
2496		.cleanup = mmc_test_area_cleanup,
2497	},
2498
2499	{
2500		.name = "Consecutive read performance by transfer size",
2501		.prepare = mmc_test_area_prepare_fill,
2502		.run = mmc_test_profile_seq_read_perf,
2503		.cleanup = mmc_test_area_cleanup,
2504	},
2505
2506	{
2507		.name = "Consecutive write performance by transfer size",
2508		.prepare = mmc_test_area_prepare,
2509		.run = mmc_test_profile_seq_write_perf,
2510		.cleanup = mmc_test_area_cleanup,
2511	},
2512
2513	{
2514		.name = "Consecutive trim performance by transfer size",
2515		.prepare = mmc_test_area_prepare,
2516		.run = mmc_test_profile_seq_trim_perf,
2517		.cleanup = mmc_test_area_cleanup,
2518	},
2519
2520	{
2521		.name = "Random read performance by transfer size",
2522		.prepare = mmc_test_area_prepare,
2523		.run = mmc_test_random_read_perf,
2524		.cleanup = mmc_test_area_cleanup,
2525	},
2526
2527	{
2528		.name = "Random write performance by transfer size",
2529		.prepare = mmc_test_area_prepare,
2530		.run = mmc_test_random_write_perf,
2531		.cleanup = mmc_test_area_cleanup,
2532	},
2533
2534	{
2535		.name = "Large sequential read into scattered pages",
2536		.prepare = mmc_test_area_prepare,
2537		.run = mmc_test_large_seq_read_perf,
2538		.cleanup = mmc_test_area_cleanup,
2539	},
2540
2541	{
2542		.name = "Large sequential write from scattered pages",
2543		.prepare = mmc_test_area_prepare,
2544		.run = mmc_test_large_seq_write_perf,
2545		.cleanup = mmc_test_area_cleanup,
2546	},
2547
2548	{
2549		.name = "Write performance with blocking req 4k to 4MB",
2550		.prepare = mmc_test_area_prepare,
2551		.run = mmc_test_profile_mult_write_blocking_perf,
2552		.cleanup = mmc_test_area_cleanup,
2553	},
2554
2555	{
2556		.name = "Write performance with non-blocking req 4k to 4MB",
2557		.prepare = mmc_test_area_prepare,
2558		.run = mmc_test_profile_mult_write_nonblock_perf,
2559		.cleanup = mmc_test_area_cleanup,
2560	},
2561
2562	{
2563		.name = "Read performance with blocking req 4k to 4MB",
2564		.prepare = mmc_test_area_prepare,
2565		.run = mmc_test_profile_mult_read_blocking_perf,
2566		.cleanup = mmc_test_area_cleanup,
2567	},
2568
2569	{
2570		.name = "Read performance with non-blocking req 4k to 4MB",
2571		.prepare = mmc_test_area_prepare,
2572		.run = mmc_test_profile_mult_read_nonblock_perf,
2573		.cleanup = mmc_test_area_cleanup,
2574	},
2575
2576	{
2577		.name = "Write performance blocking req 1 to 512 sg elems",
2578		.prepare = mmc_test_area_prepare,
2579		.run = mmc_test_profile_sglen_wr_blocking_perf,
2580		.cleanup = mmc_test_area_cleanup,
2581	},
2582
2583	{
2584		.name = "Write performance non-blocking req 1 to 512 sg elems",
2585		.prepare = mmc_test_area_prepare,
2586		.run = mmc_test_profile_sglen_wr_nonblock_perf,
2587		.cleanup = mmc_test_area_cleanup,
2588	},
2589
2590	{
2591		.name = "Read performance blocking req 1 to 512 sg elems",
2592		.prepare = mmc_test_area_prepare,
2593		.run = mmc_test_profile_sglen_r_blocking_perf,
2594		.cleanup = mmc_test_area_cleanup,
2595	},
2596
2597	{
2598		.name = "Read performance non-blocking req 1 to 512 sg elems",
2599		.prepare = mmc_test_area_prepare,
2600		.run = mmc_test_profile_sglen_r_nonblock_perf,
2601		.cleanup = mmc_test_area_cleanup,
2602	},
2603
2604	{
2605		.name = "Reset test",
2606		.run = mmc_test_reset,
2607	},
2608};
2609
2610static DEFINE_MUTEX(mmc_test_lock);
2611
2612static LIST_HEAD(mmc_test_result);
2613
2614static void mmc_test_run(struct mmc_test_card *test, int testcase)
2615{
2616	int i, ret;
2617
2618	pr_info("%s: Starting tests of card %s...\n",
2619		mmc_hostname(test->card->host), mmc_card_id(test->card));
2620
2621	mmc_claim_host(test->card->host);
2622
2623	for (i = 0;i < ARRAY_SIZE(mmc_test_cases);i++) {
2624		struct mmc_test_general_result *gr;
2625
2626		if (testcase && ((i + 1) != testcase))
2627			continue;
2628
2629		pr_info("%s: Test case %d. %s...\n",
2630			mmc_hostname(test->card->host), i + 1,
2631			mmc_test_cases[i].name);
2632
2633		if (mmc_test_cases[i].prepare) {
2634			ret = mmc_test_cases[i].prepare(test);
2635			if (ret) {
2636				pr_info("%s: Result: Prepare "
2637					"stage failed! (%d)\n",
2638					mmc_hostname(test->card->host),
2639					ret);
2640				continue;
2641			}
2642		}
2643
2644		gr = kzalloc(sizeof(struct mmc_test_general_result),
2645			GFP_KERNEL);
2646		if (gr) {
2647			INIT_LIST_HEAD(&gr->tr_lst);
2648
2649			/* Assign data what we know already */
2650			gr->card = test->card;
2651			gr->testcase = i;
2652
2653			/* Append container to global one */
2654			list_add_tail(&gr->link, &mmc_test_result);
2655
2656			/*
2657			 * Save the pointer to created container in our private
2658			 * structure.
2659			 */
2660			test->gr = gr;
2661		}
2662
2663		ret = mmc_test_cases[i].run(test);
2664		switch (ret) {
2665		case RESULT_OK:
2666			pr_info("%s: Result: OK\n",
2667				mmc_hostname(test->card->host));
2668			break;
2669		case RESULT_FAIL:
2670			pr_info("%s: Result: FAILED\n",
2671				mmc_hostname(test->card->host));
2672			break;
2673		case RESULT_UNSUP_HOST:
2674			pr_info("%s: Result: UNSUPPORTED "
2675				"(by host)\n",
2676				mmc_hostname(test->card->host));
2677			break;
2678		case RESULT_UNSUP_CARD:
2679			pr_info("%s: Result: UNSUPPORTED "
2680				"(by card)\n",
2681				mmc_hostname(test->card->host));
2682			break;
2683		default:
2684			pr_info("%s: Result: ERROR (%d)\n",
2685				mmc_hostname(test->card->host), ret);
2686		}
2687
2688		/* Save the result */
2689		if (gr)
2690			gr->result = ret;
2691
2692		if (mmc_test_cases[i].cleanup) {
2693			ret = mmc_test_cases[i].cleanup(test);
2694			if (ret) {
2695				pr_info("%s: Warning: Cleanup "
2696					"stage failed! (%d)\n",
2697					mmc_hostname(test->card->host),
2698					ret);
2699			}
2700		}
2701	}
2702
2703	mmc_release_host(test->card->host);
2704
2705	pr_info("%s: Tests completed.\n",
2706		mmc_hostname(test->card->host));
2707}
2708
2709static void mmc_test_free_result(struct mmc_card *card)
2710{
2711	struct mmc_test_general_result *gr, *grs;
2712
2713	mutex_lock(&mmc_test_lock);
2714
2715	list_for_each_entry_safe(gr, grs, &mmc_test_result, link) {
2716		struct mmc_test_transfer_result *tr, *trs;
2717
2718		if (card && gr->card != card)
2719			continue;
2720
2721		list_for_each_entry_safe(tr, trs, &gr->tr_lst, link) {
2722			list_del(&tr->link);
2723			kfree(tr);
2724		}
2725
2726		list_del(&gr->link);
2727		kfree(gr);
2728	}
2729
2730	mutex_unlock(&mmc_test_lock);
2731}
2732
2733static LIST_HEAD(mmc_test_file_test);
2734
2735static int mtf_test_show(struct seq_file *sf, void *data)
2736{
2737	struct mmc_card *card = (struct mmc_card *)sf->private;
2738	struct mmc_test_general_result *gr;
2739
2740	mutex_lock(&mmc_test_lock);
2741
2742	list_for_each_entry(gr, &mmc_test_result, link) {
2743		struct mmc_test_transfer_result *tr;
2744
2745		if (gr->card != card)
2746			continue;
2747
2748		seq_printf(sf, "Test %d: %d\n", gr->testcase + 1, gr->result);
2749
2750		list_for_each_entry(tr, &gr->tr_lst, link) {
2751			seq_printf(sf, "%u %d %lu.%09lu %u %u.%02u\n",
2752				tr->count, tr->sectors,
2753				(unsigned long)tr->ts.tv_sec,
2754				(unsigned long)tr->ts.tv_nsec,
2755				tr->rate, tr->iops / 100, tr->iops % 100);
2756		}
2757	}
2758
2759	mutex_unlock(&mmc_test_lock);
2760
2761	return 0;
2762}
2763
2764static int mtf_test_open(struct inode *inode, struct file *file)
2765{
2766	return single_open(file, mtf_test_show, inode->i_private);
2767}
2768
2769static ssize_t mtf_test_write(struct file *file, const char __user *buf,
2770	size_t count, loff_t *pos)
2771{
2772	struct seq_file *sf = (struct seq_file *)file->private_data;
2773	struct mmc_card *card = (struct mmc_card *)sf->private;
2774	struct mmc_test_card *test;
2775	long testcase;
2776	int ret;
2777
2778	ret = kstrtol_from_user(buf, count, 10, &testcase);
2779	if (ret)
2780		return ret;
2781
2782	test = kzalloc(sizeof(struct mmc_test_card), GFP_KERNEL);
2783	if (!test)
2784		return -ENOMEM;
2785
2786	/*
2787	 * Remove all test cases associated with given card. Thus we have only
2788	 * actual data of the last run.
2789	 */
2790	mmc_test_free_result(card);
2791
2792	test->card = card;
2793
2794	test->buffer = kzalloc(BUFFER_SIZE, GFP_KERNEL);
2795#ifdef CONFIG_HIGHMEM
2796	test->highmem = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, BUFFER_ORDER);
2797#endif
2798
2799#ifdef CONFIG_HIGHMEM
2800	if (test->buffer && test->highmem) {
2801#else
2802	if (test->buffer) {
2803#endif
2804		mutex_lock(&mmc_test_lock);
2805		mmc_test_run(test, testcase);
2806		mutex_unlock(&mmc_test_lock);
2807	}
2808
2809#ifdef CONFIG_HIGHMEM
2810	__free_pages(test->highmem, BUFFER_ORDER);
2811#endif
2812	kfree(test->buffer);
2813	kfree(test);
2814
2815	return count;
2816}
2817
2818static const struct file_operations mmc_test_fops_test = {
2819	.open		= mtf_test_open,
2820	.read		= seq_read,
2821	.write		= mtf_test_write,
2822	.llseek		= seq_lseek,
2823	.release	= single_release,
2824};
2825
2826static int mtf_testlist_show(struct seq_file *sf, void *data)
2827{
2828	int i;
2829
2830	mutex_lock(&mmc_test_lock);
2831
2832	seq_printf(sf, "0:\tRun all tests\n");
2833	for (i = 0; i < ARRAY_SIZE(mmc_test_cases); i++)
2834		seq_printf(sf, "%d:\t%s\n", i+1, mmc_test_cases[i].name);
2835
2836	mutex_unlock(&mmc_test_lock);
2837
2838	return 0;
2839}
2840
2841static int mtf_testlist_open(struct inode *inode, struct file *file)
2842{
2843	return single_open(file, mtf_testlist_show, inode->i_private);
2844}
2845
2846static const struct file_operations mmc_test_fops_testlist = {
2847	.open		= mtf_testlist_open,
2848	.read		= seq_read,
2849	.llseek		= seq_lseek,
2850	.release	= single_release,
2851};
2852
2853static void mmc_test_free_dbgfs_file(struct mmc_card *card)
2854{
2855	struct mmc_test_dbgfs_file *df, *dfs;
2856
2857	mutex_lock(&mmc_test_lock);
2858
2859	list_for_each_entry_safe(df, dfs, &mmc_test_file_test, link) {
2860		if (card && df->card != card)
2861			continue;
2862		debugfs_remove(df->file);
2863		list_del(&df->link);
2864		kfree(df);
2865	}
2866
2867	mutex_unlock(&mmc_test_lock);
2868}
2869
2870static int __mmc_test_register_dbgfs_file(struct mmc_card *card,
2871	const char *name, umode_t mode, const struct file_operations *fops)
2872{
2873	struct dentry *file = NULL;
2874	struct mmc_test_dbgfs_file *df;
2875
2876	if (card->debugfs_root)
2877		file = debugfs_create_file(name, mode, card->debugfs_root,
2878			card, fops);
2879
2880	if (IS_ERR_OR_NULL(file)) {
2881		dev_err(&card->dev,
2882			"Can't create %s. Perhaps debugfs is disabled.\n",
2883			name);
2884		return -ENODEV;
2885	}
2886
2887	df = kmalloc(sizeof(struct mmc_test_dbgfs_file), GFP_KERNEL);
2888	if (!df) {
2889		debugfs_remove(file);
2890		dev_err(&card->dev,
2891			"Can't allocate memory for internal usage.\n");
2892		return -ENOMEM;
2893	}
2894
2895	df->card = card;
2896	df->file = file;
2897
2898	list_add(&df->link, &mmc_test_file_test);
2899	return 0;
2900}
2901
2902static int mmc_test_register_dbgfs_file(struct mmc_card *card)
2903{
2904	int ret;
2905
2906	mutex_lock(&mmc_test_lock);
2907
2908	ret = __mmc_test_register_dbgfs_file(card, "test", S_IWUSR | S_IRUGO,
2909		&mmc_test_fops_test);
2910	if (ret)
2911		goto err;
2912
2913	ret = __mmc_test_register_dbgfs_file(card, "testlist", S_IRUGO,
2914		&mmc_test_fops_testlist);
2915	if (ret)
2916		goto err;
2917
2918err:
2919	mutex_unlock(&mmc_test_lock);
2920
2921	return ret;
2922}
2923
2924static int mmc_test_probe(struct mmc_card *card)
2925{
2926	int ret;
2927
2928	if (!mmc_card_mmc(card) && !mmc_card_sd(card))
2929		return -ENODEV;
2930
2931	ret = mmc_test_register_dbgfs_file(card);
2932	if (ret)
2933		return ret;
2934
2935	dev_info(&card->dev, "Card claimed for testing.\n");
2936
2937	return 0;
2938}
2939
2940static void mmc_test_remove(struct mmc_card *card)
2941{
2942	mmc_test_free_result(card);
2943	mmc_test_free_dbgfs_file(card);
2944}
2945
2946static void mmc_test_shutdown(struct mmc_card *card)
2947{
2948}
2949
2950static struct mmc_driver mmc_driver = {
2951	.drv		= {
2952		.name	= "mmc_test",
2953	},
2954	.probe		= mmc_test_probe,
2955	.remove		= mmc_test_remove,
2956	.shutdown	= mmc_test_shutdown,
2957};
2958
2959static int __init mmc_test_init(void)
2960{
2961	return mmc_register_driver(&mmc_driver);
2962}
2963
2964static void __exit mmc_test_exit(void)
2965{
2966	/* Clear stalled data if card is still plugged */
2967	mmc_test_free_result(NULL);
2968	mmc_test_free_dbgfs_file(NULL);
2969
2970	mmc_unregister_driver(&mmc_driver);
2971}
2972
2973module_init(mmc_test_init);
2974module_exit(mmc_test_exit);
2975
2976MODULE_LICENSE("GPL");
2977MODULE_DESCRIPTION("Multimedia Card (MMC) host test driver");
2978MODULE_AUTHOR("Pierre Ossman");