// SPDX-License-Identifier: GPL-2.0-only /* * Copyright (C) 2007 Nokia Corporation * * Test read and write speed of a MTD device. * * Author: Adrian Hunter <adrian.hunter@nokia.com>
*/
if (dev < 0) {
pr_info("Please specify a valid mtd-device via module parameter\n");
pr_crit("CAREFUL: This test wipes all data on the specified MTD device!\n"); return -EINVAL;
}
bbt = kzalloc(ebcnt, GFP_KERNEL); if (!bbt) goto out;
err = mtdtest_scan_for_bad_eraseblocks(mtd, bbt, 0, ebcnt); if (err) goto out; for (i = 0; i < ebcnt; i++) { if (!bbt[i])
goodebcnt++;
}
err = mtdtest_erase_good_eraseblocks(mtd, bbt, 0, ebcnt); if (err) goto out;
/* Write all eraseblocks, 1 eraseblock at a time */
pr_info("testing eraseblock write speed\n");
start_timing(); for (i = 0; i < ebcnt; ++i) { if (bbt[i]) continue;
err = write_eraseblock(i); if (err) goto out;
err = mtdtest_relax(); if (err) goto out;
}
stop_timing();
speed = calc_speed();
pr_info("eraseblock write speed is %ld KiB/s\n", speed);
/* Read all eraseblocks, 1 eraseblock at a time */
pr_info("testing eraseblock read speed\n");
start_timing(); for (i = 0; i < ebcnt; ++i) { if (bbt[i]) continue;
err = read_eraseblock(i); if (err) goto out;
err = mtdtest_relax(); if (err) goto out;
}
stop_timing();
speed = calc_speed();
pr_info("eraseblock read speed is %ld KiB/s\n", speed);
err = mtdtest_erase_good_eraseblocks(mtd, bbt, 0, ebcnt); if (err) goto out;
/* Write all eraseblocks, 1 page at a time */
pr_info("testing page write speed\n");
start_timing(); for (i = 0; i < ebcnt; ++i) { if (bbt[i]) continue;
err = write_eraseblock_by_page(i); if (err) goto out;
err = mtdtest_relax(); if (err) goto out;
}
stop_timing();
speed = calc_speed();
pr_info("page write speed is %ld KiB/s\n", speed);
/* Read all eraseblocks, 1 page at a time */
pr_info("testing page read speed\n");
start_timing(); for (i = 0; i < ebcnt; ++i) { if (bbt[i]) continue;
err = read_eraseblock_by_page(i); if (err) goto out;
err = mtdtest_relax(); if (err) goto out;
}
stop_timing();
speed = calc_speed();
pr_info("page read speed is %ld KiB/s\n", speed);
err = mtdtest_erase_good_eraseblocks(mtd, bbt, 0, ebcnt); if (err) goto out;
/* Write all eraseblocks, 2 pages at a time */
pr_info("testing 2 page write speed\n");
start_timing(); for (i = 0; i < ebcnt; ++i) { if (bbt[i]) continue;
err = write_eraseblock_by_2pages(i); if (err) goto out;
err = mtdtest_relax(); if (err) goto out;
}
stop_timing();
speed = calc_speed();
pr_info("2 page write speed is %ld KiB/s\n", speed);
/* Read all eraseblocks, 2 pages at a time */
pr_info("testing 2 page read speed\n");
start_timing(); for (i = 0; i < ebcnt; ++i) { if (bbt[i]) continue;
err = read_eraseblock_by_2pages(i); if (err) goto out;
err = mtdtest_relax(); if (err) goto out;
}
stop_timing();
speed = calc_speed();
pr_info("2 page read speed is %ld KiB/s\n", speed);
/* Erase all eraseblocks */
pr_info("Testing erase speed\n");
start_timing();
err = mtdtest_erase_good_eraseblocks(mtd, bbt, 0, ebcnt); if (err) goto out;
stop_timing();
speed = calc_speed();
pr_info("erase speed is %ld KiB/s\n", speed);
/* Multi-block erase all eraseblocks */ for (k = 1; k < 7; k++) {
blocks = 1 << k;
pr_info("Testing %dx multi-block erase speed\n",
blocks);
start_timing(); for (i = 0; i < ebcnt; ) { for (j = 0; j < blocks && (i + j) < ebcnt; j++) if (bbt[i + j]) break; if (j < 1) {
i++; continue;
}
err = multiblock_erase(i, j); if (err) goto out;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.