Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.5 2977 lines 68 kB view raw
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 for (i = 0; i < ARRAY_SIZE(mmc_test_cases); i++) 2833 seq_printf(sf, "%d:\t%s\n", i+1, mmc_test_cases[i].name); 2834 2835 mutex_unlock(&mmc_test_lock); 2836 2837 return 0; 2838} 2839 2840static int mtf_testlist_open(struct inode *inode, struct file *file) 2841{ 2842 return single_open(file, mtf_testlist_show, inode->i_private); 2843} 2844 2845static const struct file_operations mmc_test_fops_testlist = { 2846 .open = mtf_testlist_open, 2847 .read = seq_read, 2848 .llseek = seq_lseek, 2849 .release = single_release, 2850}; 2851 2852static void mmc_test_free_dbgfs_file(struct mmc_card *card) 2853{ 2854 struct mmc_test_dbgfs_file *df, *dfs; 2855 2856 mutex_lock(&mmc_test_lock); 2857 2858 list_for_each_entry_safe(df, dfs, &mmc_test_file_test, link) { 2859 if (card && df->card != card) 2860 continue; 2861 debugfs_remove(df->file); 2862 list_del(&df->link); 2863 kfree(df); 2864 } 2865 2866 mutex_unlock(&mmc_test_lock); 2867} 2868 2869static int __mmc_test_register_dbgfs_file(struct mmc_card *card, 2870 const char *name, umode_t mode, const struct file_operations *fops) 2871{ 2872 struct dentry *file = NULL; 2873 struct mmc_test_dbgfs_file *df; 2874 2875 if (card->debugfs_root) 2876 file = debugfs_create_file(name, mode, card->debugfs_root, 2877 card, fops); 2878 2879 if (IS_ERR_OR_NULL(file)) { 2880 dev_err(&card->dev, 2881 "Can't create %s. Perhaps debugfs is disabled.\n", 2882 name); 2883 return -ENODEV; 2884 } 2885 2886 df = kmalloc(sizeof(struct mmc_test_dbgfs_file), GFP_KERNEL); 2887 if (!df) { 2888 debugfs_remove(file); 2889 dev_err(&card->dev, 2890 "Can't allocate memory for internal usage.\n"); 2891 return -ENOMEM; 2892 } 2893 2894 df->card = card; 2895 df->file = file; 2896 2897 list_add(&df->link, &mmc_test_file_test); 2898 return 0; 2899} 2900 2901static int mmc_test_register_dbgfs_file(struct mmc_card *card) 2902{ 2903 int ret; 2904 2905 mutex_lock(&mmc_test_lock); 2906 2907 ret = __mmc_test_register_dbgfs_file(card, "test", S_IWUSR | S_IRUGO, 2908 &mmc_test_fops_test); 2909 if (ret) 2910 goto err; 2911 2912 ret = __mmc_test_register_dbgfs_file(card, "testlist", S_IRUGO, 2913 &mmc_test_fops_testlist); 2914 if (ret) 2915 goto err; 2916 2917err: 2918 mutex_unlock(&mmc_test_lock); 2919 2920 return ret; 2921} 2922 2923static int mmc_test_probe(struct mmc_card *card) 2924{ 2925 int ret; 2926 2927 if (!mmc_card_mmc(card) && !mmc_card_sd(card)) 2928 return -ENODEV; 2929 2930 ret = mmc_test_register_dbgfs_file(card); 2931 if (ret) 2932 return ret; 2933 2934 dev_info(&card->dev, "Card claimed for testing.\n"); 2935 2936 return 0; 2937} 2938 2939static void mmc_test_remove(struct mmc_card *card) 2940{ 2941 mmc_test_free_result(card); 2942 mmc_test_free_dbgfs_file(card); 2943} 2944 2945static void mmc_test_shutdown(struct mmc_card *card) 2946{ 2947} 2948 2949static struct mmc_driver mmc_driver = { 2950 .drv = { 2951 .name = "mmc_test", 2952 }, 2953 .probe = mmc_test_probe, 2954 .remove = mmc_test_remove, 2955 .shutdown = mmc_test_shutdown, 2956}; 2957 2958static int __init mmc_test_init(void) 2959{ 2960 return mmc_register_driver(&mmc_driver); 2961} 2962 2963static void __exit mmc_test_exit(void) 2964{ 2965 /* Clear stalled data if card is still plugged */ 2966 mmc_test_free_result(NULL); 2967 mmc_test_free_dbgfs_file(NULL); 2968 2969 mmc_unregister_driver(&mmc_driver); 2970} 2971 2972module_init(mmc_test_init); 2973module_exit(mmc_test_exit); 2974 2975MODULE_LICENSE("GPL"); 2976MODULE_DESCRIPTION("Multimedia Card (MMC) host test driver"); 2977MODULE_AUTHOR("Pierre Ossman");