aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-01-30 11:37:33 -0500
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2011-03-08 03:12:48 -0500
commit30b542ef453e6832ff682170b2db95d7bca2fe70 (patch)
treea74ccffb6a4eebb6ec8f9d3aa2d152700f995830
parent10ac27970274e9094aee84a6452a25bf1b7e59e1 (diff)
UBI: incorporate maximum write size
Incorporate MTD write buffer size into UBI device information because UBIFS needs this field. UBI does not use it ATM, just provides to upper layers in 'struct ubi_device_info'. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
-rw-r--r--drivers/mtd/ubi/build.c14
-rw-r--r--drivers/mtd/ubi/kapi.c1
-rw-r--r--drivers/mtd/ubi/ubi.h3
-rw-r--r--include/linux/mtd/ubi.h19
4 files changed, 37 insertions, 0 deletions
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c
index 5ebe280225d6..f38e8de81811 100644
--- a/drivers/mtd/ubi/build.c
+++ b/drivers/mtd/ubi/build.c
@@ -690,11 +690,25 @@ static int io_init(struct ubi_device *ubi)
690 ubi_assert(ubi->hdrs_min_io_size <= ubi->min_io_size); 690 ubi_assert(ubi->hdrs_min_io_size <= ubi->min_io_size);
691 ubi_assert(ubi->min_io_size % ubi->hdrs_min_io_size == 0); 691 ubi_assert(ubi->min_io_size % ubi->hdrs_min_io_size == 0);
692 692
693 ubi->max_write_size = ubi->mtd->writebufsize;
694 /*
695 * Maximum write size has to be greater or equivalent to min. I/O
696 * size, and be multiple of min. I/O size.
697 */
698 if (ubi->max_write_size < ubi->min_io_size ||
699 ubi->max_write_size % ubi->min_io_size ||
700 !is_power_of_2(ubi->max_write_size)) {
701 ubi_err("bad write buffer size %d for %d min. I/O unit",
702 ubi->max_write_size, ubi->min_io_size);
703 return -EINVAL;
704 }
705
693 /* Calculate default aligned sizes of EC and VID headers */ 706 /* Calculate default aligned sizes of EC and VID headers */
694 ubi->ec_hdr_alsize = ALIGN(UBI_EC_HDR_SIZE, ubi->hdrs_min_io_size); 707 ubi->ec_hdr_alsize = ALIGN(UBI_EC_HDR_SIZE, ubi->hdrs_min_io_size);
695 ubi->vid_hdr_alsize = ALIGN(UBI_VID_HDR_SIZE, ubi->hdrs_min_io_size); 708 ubi->vid_hdr_alsize = ALIGN(UBI_VID_HDR_SIZE, ubi->hdrs_min_io_size);
696 709
697 dbg_msg("min_io_size %d", ubi->min_io_size); 710 dbg_msg("min_io_size %d", ubi->min_io_size);
711 dbg_msg("max_write_size %d", ubi->max_write_size);
698 dbg_msg("hdrs_min_io_size %d", ubi->hdrs_min_io_size); 712 dbg_msg("hdrs_min_io_size %d", ubi->hdrs_min_io_size);
699 dbg_msg("ec_hdr_alsize %d", ubi->ec_hdr_alsize); 713 dbg_msg("ec_hdr_alsize %d", ubi->ec_hdr_alsize);
700 dbg_msg("vid_hdr_alsize %d", ubi->vid_hdr_alsize); 714 dbg_msg("vid_hdr_alsize %d", ubi->vid_hdr_alsize);
diff --git a/drivers/mtd/ubi/kapi.c b/drivers/mtd/ubi/kapi.c
index 69fa4ef03c53..701df4f848f6 100644
--- a/drivers/mtd/ubi/kapi.c
+++ b/drivers/mtd/ubi/kapi.c
@@ -41,6 +41,7 @@ void ubi_do_get_device_info(struct ubi_device *ubi, struct ubi_device_info *di)
41 di->ubi_num = ubi->ubi_num; 41 di->ubi_num = ubi->ubi_num;
42 di->leb_size = ubi->leb_size; 42 di->leb_size = ubi->leb_size;
43 di->min_io_size = ubi->min_io_size; 43 di->min_io_size = ubi->min_io_size;
44 di->max_write_size = ubi->max_write_size;
44 di->ro_mode = ubi->ro_mode; 45 di->ro_mode = ubi->ro_mode;
45 di->cdev = ubi->cdev.dev; 46 di->cdev = ubi->cdev.dev;
46} 47}
diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h
index 0b0149c41fe3..b78994330ebc 100644
--- a/drivers/mtd/ubi/ubi.h
+++ b/drivers/mtd/ubi/ubi.h
@@ -381,6 +381,8 @@ struct ubi_wl_entry;
381 * @bad_allowed: whether the MTD device admits of bad physical eraseblocks or 381 * @bad_allowed: whether the MTD device admits of bad physical eraseblocks or
382 * not 382 * not
383 * @nor_flash: non-zero if working on top of NOR flash 383 * @nor_flash: non-zero if working on top of NOR flash
384 * @max_write_size: maximum amount of bytes the underlying flash can write at a
385 * time (MTD write buffer size)
384 * @mtd: MTD device descriptor 386 * @mtd: MTD device descriptor
385 * 387 *
386 * @peb_buf1: a buffer of PEB size used for different purposes 388 * @peb_buf1: a buffer of PEB size used for different purposes
@@ -464,6 +466,7 @@ struct ubi_device {
464 int vid_hdr_shift; 466 int vid_hdr_shift;
465 unsigned int bad_allowed:1; 467 unsigned int bad_allowed:1;
466 unsigned int nor_flash:1; 468 unsigned int nor_flash:1;
469 int max_write_size;
467 struct mtd_info *mtd; 470 struct mtd_info *mtd;
468 471
469 void *peb_buf1; 472 void *peb_buf1;
diff --git a/include/linux/mtd/ubi.h b/include/linux/mtd/ubi.h
index b31bd9e9bca3..36c70593ae62 100644
--- a/include/linux/mtd/ubi.h
+++ b/include/linux/mtd/ubi.h
@@ -117,17 +117,36 @@ struct ubi_volume_info {
117 * @ubi_num: ubi device number 117 * @ubi_num: ubi device number
118 * @leb_size: logical eraseblock size on this UBI device 118 * @leb_size: logical eraseblock size on this UBI device
119 * @min_io_size: minimal I/O unit size 119 * @min_io_size: minimal I/O unit size
120 * @max_write_size: maximum amount of bytes the underlying flash can write at a
121 * time (MTD write buffer size)
120 * @ro_mode: if this device is in read-only mode 122 * @ro_mode: if this device is in read-only mode
121 * @cdev: UBI character device major and minor numbers 123 * @cdev: UBI character device major and minor numbers
122 * 124 *
123 * Note, @leb_size is the logical eraseblock size offered by the UBI device. 125 * Note, @leb_size is the logical eraseblock size offered by the UBI device.
124 * Volumes of this UBI device may have smaller logical eraseblock size if their 126 * Volumes of this UBI device may have smaller logical eraseblock size if their
125 * alignment is not equivalent to %1. 127 * alignment is not equivalent to %1.
128 *
129 * The @max_write_size field describes flash write maximum write unit. For
130 * example, NOR flash allows for changing individual bytes, so @min_io_size is
131 * %1. However, it does not mean than NOR flash has to write data byte-by-byte.
132 * Instead, CFI NOR flashes have a write-buffer of, e.g., 64 bytes, and when
133 * writing large chunks of data, they write 64-bytes at a time. Obviously, this
134 * improves write throughput.
135 *
136 * Also, the MTD device may have N interleaved (striped) flash chips
137 * underneath, in which case @min_io_size can be physical min. I/O size of
138 * single flash chip, while @max_write_size can be N * @min_io_size.
139 *
140 * The @max_write_size field is always greater or equivalent to @min_io_size.
141 * E.g., some NOR flashes may have (@min_io_size = 1, @max_write_size = 64). In
142 * contrast, NAND flashes usually have @min_io_size = @max_write_size = NAND
143 * page size.
126 */ 144 */
127struct ubi_device_info { 145struct ubi_device_info {
128 int ubi_num; 146 int ubi_num;
129 int leb_size; 147 int leb_size;
130 int min_io_size; 148 int min_io_size;
149 int max_write_size;
131 int ro_mode; 150 int ro_mode;
132 dev_t cdev; 151 dev_t cdev;
133}; 152};