diff options
-rw-r--r-- | drivers/mtd/ubi/build.c | 14 | ||||
-rw-r--r-- | drivers/mtd/ubi/kapi.c | 1 | ||||
-rw-r--r-- | drivers/mtd/ubi/ubi.h | 3 | ||||
-rw-r--r-- | include/linux/mtd/ubi.h | 19 |
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 | */ |
127 | struct ubi_device_info { | 145 | struct 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 | }; |