402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. From patchwork Tue Jun 8 04:07:19 2021
  2. Content-Type: text/plain; charset="utf-8"
  3. MIME-Version: 1.0
  4. Content-Transfer-Encoding: 7bit
  5. X-Patchwork-Submitter: John Thomson <[email protected]>
  6. X-Patchwork-Id: 1489105
  7. X-Patchwork-Delegate: [email protected]
  8. Return-Path:
  9. <linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>
  10. X-Original-To: [email protected]
  11. Delivered-To: [email protected]
  12. Authentication-Results: ozlabs.org;
  13. spf=none (no SPF record) smtp.mailfrom=lists.infradead.org
  14. (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org;
  15. envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;
  16. receiver=<UNKNOWN>)
  17. Authentication-Results: ozlabs.org;
  18. dkim=pass (2048-bit key;
  19. secure) header.d=lists.infradead.org [email protected]
  20. header.a=rsa-sha256 header.s=bombadil.20210309 header.b=EMabhVoR;
  21. dkim=fail reason="signature verification failed" (2048-bit key;
  22. unprotected) header.d=fastmail.com.au [email protected]
  23. header.a=rsa-sha256 header.s=fm3 header.b=dLzuZ6dB;
  24. dkim=fail reason="signature verification failed" (2048-bit key;
  25. unprotected) header.d=messagingengine.com [email protected]
  26. header.a=rsa-sha256 header.s=fm3 header.b=nSRGsW+C;
  27. dkim-atps=neutral
  28. Received: from bombadil.infradead.org (bombadil.infradead.org
  29. [IPv6:2607:7c80:54:e::133])
  30. (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
  31. key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest
  32. SHA256)
  33. (No client certificate requested)
  34. by ozlabs.org (Postfix) with ESMTPS id 4FzcFN1j1nz9sW8
  35. for <[email protected]>; Tue, 8 Jun 2021 14:09:28 +1000 (AEST)
  36. DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
  37. d=lists.infradead.org; s=bombadil.20210309; h=Sender:
  38. Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:
  39. List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc
  40. :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:
  41. Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:
  42. List-Owner; bh=6mUWQd71FwsINycGYY1qOhKz+ecWJVNtwDkTebG3XkA=; b=EMabhVoRE3ad89
  43. o3L2AgyKrs+blSofUC3hoSsQe7gi3m4si8S9HW8Z+8SsS5TufUsvGwDl80qSYGlQOytQF+1yRUWvE
  44. 6FJ/+bqv+TwjqZFibgJ6+9OVsQN9dZ/no1R0bBXIpmrf8ORUmv58QK4ZQquaFKbyXKpFeWOC2MSv4
  45. H2MAhyhTU8a3gtooH6G8+KvsJEfVgh6C+aDbwxyh2UY3chHKuw1kvL6AktbfUE2xl4zxi3x3kc70B
  46. Wi3LiJBFokxVdgnROXxTU5tI0XboWYkQV64gLuQNV4XKClcuhVpzloDK8Iok6NTd7b32a7TdEFlCS
  47. lGKsEKmxtUlW2FpfoduA==;
  48. Received: from localhost ([::1] helo=bombadil.infradead.org)
  49. by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux))
  50. id 1lqT1r-006OAW-DX; Tue, 08 Jun 2021 04:07:51 +0000
  51. Received: from new1-smtp.messagingengine.com ([66.111.4.221])
  52. by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux))
  53. id 1lqT1l-006O9b-Fq
  54. for [email protected]; Tue, 08 Jun 2021 04:07:50 +0000
  55. Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
  56. by mailnew.nyi.internal (Postfix) with ESMTP id 4456B580622;
  57. Tue, 8 Jun 2021 00:07:42 -0400 (EDT)
  58. Received: from mailfrontend2 ([10.202.2.163])
  59. by compute2.internal (MEProxy); Tue, 08 Jun 2021 00:07:42 -0400
  60. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastmail.com.au;
  61. h=from:to:cc:subject:date:message-id:mime-version
  62. :content-transfer-encoding; s=fm3; bh=ZXRH+YluM1mHCS1EWUiCY/Sg8O
  63. LccfHe1oW5iAay6y8=; b=dLzuZ6dBYf7ZA8tWLOBFZYLi7ERsGe/4vnMXG+ovvb
  64. dNBO0+SaFGwoqYSFrfq/TeyHfKyvxrA7+LCdopIuT4abpLHxtRwtRiafQcDYCPat
  65. qJIqOZO+wCZC5S9Jc1OP7+t1FviGpgevqIMotci37P+RWc5u3AweMzFljZk90E8C
  66. uorV6rXagD+OssJQzllRnAIK88+rOAC9ZyXv2gWxy4d1HSCwSWgzx2vnV9CNp918
  67. YC/3tiHas9krbrPIaAsdBROr7Bvoe/ShRRzruKRuvZVgg5NN90vX+/5ZjI8u04GM
  68. p2bWCbC62CP6wlcgDaz+c/Sgr5ITd2GPENJsHfqmLRBA==
  69. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
  70. messagingengine.com; h=cc:content-transfer-encoding:date:from
  71. :message-id:mime-version:subject:to:x-me-proxy:x-me-proxy
  72. :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; bh=ZXRH+YluM1mHCS1EW
  73. UiCY/Sg8OLccfHe1oW5iAay6y8=; b=nSRGsW+CQ2Zx1RVpIUu8W/VD/k5P+32BW
  74. 5k2ltd+UhI3dfldBPzHrYiOP/IJqGkNW+V+rHASacW/vFygnaZoxNjRYKnOsu+26
  75. wb2yK3jpl6lsNTg3N1Z4XJrYY2lf9H29DMFbhC67l0PTc050rcZk4XsKTLAlv14Q
  76. VA4WREYSaX/4IN4O+ES4TMq0a/3gKZh6nvbbJXbsXfK0WlSHTGZtZmW3fyrqvbXa
  77. t+R7L8vvqWvwls0pV+Sn8LeQqb7+A69w0UOnuznjkcA3sCc2YehcHbxcUEnMH+9N
  78. bxOjmIDeg9/4X/829tUWUJiLhE5SFmQZ1P6oFtmbWoLrDz0ZJIVBw==
  79. X-ME-Sender: <xms:C-2-YD2uka4HsA6gcdsV2Ia7vebY4Yjp9E8q7KBMb54jnAzGL7-67Q>
  80. <xme:C-2-YCEaxASy5VlcrvNO_jLFpMDGkFCRsuVNuZGEQsiRZygk8jPHWq7unPjeT6uYS
  81. 2pUP6PrTQ2rggjEIg>
  82. X-ME-Received:
  83. <xmr:C-2-YD4exeK49N_YZWWf2BWDhVyCbCY3wwvjTyDOFxeugx7Jg08pzMUToo9oJjrBpcVTaA3kbfk>
  84. X-ME-Proxy-Cause:
  85. gggruggvucftvghtrhhoucdtuddrgeduledrfedtkedgjeduucetufdoteggodetrfdotf
  86. fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen
  87. uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne
  88. cujfgurhephffvufffkffoggfgsedtkeertdertddtnecuhfhrohhmpeflohhhnhcuvfhh
  89. ohhmshhonhcuoehgihhtsehjohhhnhhthhhomhhsohhnrdhfrghsthhmrghilhdrtghomh
  90. drrghuqeenucggtffrrghtthgvrhhnpefffeeihfdukedtuedufeetieeuudfhhefhkefh
  91. tefgtdeuffekffelleetveduieenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh
  92. epmhgrihhlfhhrohhmpehgihhtsehjohhhnhhthhhomhhsohhnrdhfrghsthhmrghilhdr
  93. tghomhdrrghu
  94. X-ME-Proxy: <xmx:C-2-YI0AJZGjcB3wIbI9BoC9X8VNl4i9A7cQnBkvwZ25czWJlkKCLw>
  95. <xmx:C-2-YGGufw99T-O81-FeiSyEruv6_Pr0IHFhspQdxjv5k1VFTZ0lzQ>
  96. <xmx:C-2-YJ8BW7DhSDSCEAPSJWrwh_hHP79qreTZtWh_kOUwSh1c0MMlAg>
  97. <xmx:Du2-YJBeX2Fg9oFZVXGwEJ1ZrZnXHiAqNON8tbpzquYgcm2o_LM48g>
  98. Received: by mail.messagingengine.com (Postfix) with ESMTPA; Tue,
  99. 8 Jun 2021 00:07:35 -0400 (EDT)
  100. From: John Thomson <[email protected]>
  101. To: Miquel Raynal <[email protected]>,
  102. Richard Weinberger <[email protected]>, Vignesh Raghavendra <[email protected]>,
  103. Tudor Ambarus <[email protected]>,
  104. Michael Walle <[email protected]>, Pratyush Yadav <[email protected]>,
  105. [email protected]
  106. Cc: [email protected],
  107. John Thomson <[email protected]>,
  108. kernel test robot <[email protected]>, Dan Carpenter <[email protected]>
  109. Subject: [PATCH] mtd: spi-nor: write support for minor aligned partitions
  110. Date: Tue, 8 Jun 2021 14:07:19 +1000
  111. Message-Id: <[email protected]>
  112. X-Mailer: git-send-email 2.31.1
  113. MIME-Version: 1.0
  114. X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3
  115. X-CRM114-CacheID: sfid-20210607_210745_712053_67A7D864
  116. X-CRM114-Status: GOOD ( 26.99 )
  117. X-Spam-Score: -0.8 (/)
  118. X-Spam-Report: Spam detection software,
  119. running on the system "bombadil.infradead.org",
  120. has NOT identified this incoming email as spam. The original
  121. message has been attached to this so you can view it or label
  122. similar future email. If you have any questions, see
  123. the administrator of that system for details.
  124. Content preview: Do not prevent writing to mtd partitions where a partition
  125. boundary sits on a minor erasesize boundary. This addresses a FIXME that
  126. has been present since the start of the linux git history: /* Doesn' [...]
  127. Content analysis details: (-0.8 points, 5.0 required)
  128. pts rule name description
  129. ---- ----------------------
  130. --------------------------------------------------
  131. -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at https://www.dnswl.org/,
  132. low trust [66.111.4.221 listed in list.dnswl.org]
  133. -0.0 SPF_PASS SPF: sender matches SPF record
  134. -0.0 SPF_HELO_PASS SPF: HELO matches SPF record
  135. 0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3)
  136. [66.111.4.221 listed in wl.mailspike.net]
  137. -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature
  138. 0.1 DKIM_SIGNED Message has a DKIM or DK signature,
  139. not necessarily
  140. valid
  141. -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from
  142. envelope-from domain
  143. 0.0 RCVD_IN_MSPIKE_WL Mailspike good senders
  144. X-BeenThere: [email protected]
  145. X-Mailman-Version: 2.1.34
  146. Precedence: list
  147. List-Id: Linux MTD discussion mailing list <linux-mtd.lists.infradead.org>
  148. List-Unsubscribe: <http://lists.infradead.org/mailman/options/linux-mtd>,
  149. <mailto:[email protected]?subject=unsubscribe>
  150. List-Archive: <http://lists.infradead.org/pipermail/linux-mtd/>
  151. List-Post: <mailto:[email protected]>
  152. List-Help: <mailto:[email protected]?subject=help>
  153. List-Subscribe: <http://lists.infradead.org/mailman/listinfo/linux-mtd>,
  154. <mailto:[email protected]?subject=subscribe>
  155. Sender: "linux-mtd" <[email protected]>
  156. Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org
  157. Do not prevent writing to mtd partitions where a partition boundary sits
  158. on a minor erasesize boundary.
  159. This addresses a FIXME that has been present since the start of the
  160. linux git history:
  161. /* Doesn't start on a boundary of major erase size */
  162. /* FIXME: Let it be writable if it is on a boundary of
  163. * _minor_ erase size though */
  164. Allow a uniform erase region spi-nor device to be configured
  165. to use the non-uniform erase regions code path for an erase with:
  166. CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE=y
  167. On supporting hardware (SECT_4K: majority of current SPI-NOR device)
  168. provide the facility for an erase to use the least number
  169. of SPI-NOR operations, as well as access to 4K erase without
  170. requiring CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
  171. Introduce erasesize_minor to the mtd struct,
  172. the smallest erasesize supported by the device
  173. On existing devices, this is useful where write support is wanted
  174. for data on a 4K partition, such as some u-boot-env partitions,
  175. or RouterBoot soft_config, while still netting the performance
  176. benefits of using 64K sectors
  177. Performance:
  178. time mtd erase firmware
  179. OpenWrt 5.10 ramips MT7621 w25q128jv 0xfc0000 partition length
  180. Without this patch
  181. MTD_SPI_NOR_USE_4K_SECTORS=y |n
  182. real 2m 11.66s |0m 50.86s
  183. user 0m 0.00s |0m 0.00s
  184. sys 1m 56.20s |0m 50.80s
  185. With this patch
  186. MTD_SPI_NOR_USE_VARIABLE_ERASE=n|y |4K_SECTORS=y
  187. real 0m 51.68s |0m 50.85s |2m 12.89s
  188. user 0m 0.00s |0m 0.00s |0m 0.01s
  189. sys 0m 46.94s |0m 50.38s |2m 12.46s
  190. Signed-off-by: John Thomson <[email protected]>
  191. ---
  192. Have not tested on variable erase regions device.
  193. checkpatch does not like the printk(KERN_WARNING
  194. these should be changed separately beforehand?
  195. Changes RFC -> v1:
  196. Fix uninitialized variable smatch warning
  197. Reported-by: kernel test robot <[email protected]>
  198. Reported-by: Dan Carpenter <[email protected]>
  199. ---
  200. drivers/mtd/mtdpart.c | 52 ++++++++++++++++++++++++++++---------
  201. drivers/mtd/spi-nor/Kconfig | 10 +++++++
  202. drivers/mtd/spi-nor/core.c | 10 +++++--
  203. include/linux/mtd/mtd.h | 2 ++
  204. 4 files changed, 60 insertions(+), 14 deletions(-)
  205. --- a/drivers/mtd/mtdpart.c
  206. +++ b/drivers/mtd/mtdpart.c
  207. @@ -40,10 +40,11 @@ static struct mtd_info *allocate_partiti
  208. struct mtd_info *master = mtd_get_master(parent);
  209. int wr_alignment = (parent->flags & MTD_NO_ERASE) ?
  210. master->writesize : master->erasesize;
  211. + int wr_alignment_minor = 0;
  212. u64 parent_size = mtd_is_partition(parent) ?
  213. parent->part.size : parent->size;
  214. struct mtd_info *child;
  215. - u32 remainder;
  216. + u32 remainder, remainder_minor;
  217. char *name;
  218. u64 tmp;
  219. @@ -145,6 +146,7 @@ static struct mtd_info *allocate_partiti
  220. int i, max = parent->numeraseregions;
  221. u64 end = child->part.offset + child->part.size;
  222. struct mtd_erase_region_info *regions = parent->eraseregions;
  223. + uint32_t erasesize_minor = child->erasesize;
  224. /* Find the first erase regions which is part of this
  225. * partition. */
  226. @@ -155,15 +157,24 @@ static struct mtd_info *allocate_partiti
  227. if (i > 0)
  228. i--;
  229. - /* Pick biggest erasesize */
  230. for (; i < max && regions[i].offset < end; i++) {
  231. + /* Pick biggest erasesize */
  232. if (child->erasesize < regions[i].erasesize)
  233. child->erasesize = regions[i].erasesize;
  234. + /* Pick smallest non-zero erasesize */
  235. + if ((erasesize_minor > regions[i].erasesize) && (regions[i].erasesize > 0))
  236. + erasesize_minor = regions[i].erasesize;
  237. }
  238. +
  239. + if (erasesize_minor < child->erasesize)
  240. + child->erasesize_minor = erasesize_minor;
  241. +
  242. BUG_ON(child->erasesize == 0);
  243. } else {
  244. /* Single erase size */
  245. child->erasesize = master->erasesize;
  246. + if (master->erasesize_minor)
  247. + child->erasesize_minor = master->erasesize_minor;
  248. }
  249. /*
  250. @@ -171,26 +182,43 @@ static struct mtd_info *allocate_partiti
  251. * exposes several regions with different erasesize. Adjust
  252. * wr_alignment accordingly.
  253. */
  254. - if (!(child->flags & MTD_NO_ERASE))
  255. + if (!(child->flags & MTD_NO_ERASE)) {
  256. wr_alignment = child->erasesize;
  257. + if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE) && child->erasesize_minor)
  258. + wr_alignment_minor = child->erasesize_minor;
  259. + }
  260. tmp = mtd_get_master_ofs(child, 0);
  261. remainder = do_div(tmp, wr_alignment);
  262. if ((child->flags & MTD_WRITEABLE) && remainder) {
  263. - /* Doesn't start on a boundary of major erase size */
  264. - /* FIXME: Let it be writable if it is on a boundary of
  265. - * _minor_ erase size though */
  266. - child->flags &= ~MTD_WRITEABLE;
  267. - printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n",
  268. - part->name);
  269. + if (wr_alignment_minor) {
  270. + tmp = mtd_get_master_ofs(child, 0);
  271. + remainder_minor = do_div(tmp, wr_alignment_minor);
  272. + if (remainder_minor == 0)
  273. + child->erasesize = child->erasesize_minor;
  274. + }
  275. +
  276. + if ((!wr_alignment_minor) || (wr_alignment_minor && remainder_minor != 0)) {
  277. + child->flags &= ~MTD_WRITEABLE;
  278. + printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n",
  279. + part->name);
  280. + }
  281. }
  282. tmp = mtd_get_master_ofs(child, 0) + child->part.size;
  283. remainder = do_div(tmp, wr_alignment);
  284. if ((child->flags & MTD_WRITEABLE) && remainder) {
  285. - child->flags &= ~MTD_WRITEABLE;
  286. - printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n",
  287. - part->name);
  288. + if (wr_alignment_minor) {
  289. + tmp = mtd_get_master_ofs(child, 0) + child->part.size;
  290. + remainder_minor = do_div(tmp, wr_alignment_minor);
  291. + if (remainder_minor == 0)
  292. + child->erasesize = child->erasesize_minor;
  293. + }
  294. + if ((!wr_alignment_minor) || (wr_alignment_minor && remainder_minor != 0)) {
  295. + child->flags &= ~MTD_WRITEABLE;
  296. + printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n",
  297. + part->name);
  298. + }
  299. }
  300. child->size = child->part.size;
  301. --- a/drivers/mtd/spi-nor/Kconfig
  302. +++ b/drivers/mtd/spi-nor/Kconfig
  303. @@ -10,6 +10,16 @@ menuconfig MTD_SPI_NOR
  304. if MTD_SPI_NOR
  305. +config MTD_SPI_NOR_USE_VARIABLE_ERASE
  306. + bool "Disable uniform_erase to allow use of all hardware supported erasesizes"
  307. + depends on !MTD_SPI_NOR_USE_4K_SECTORS
  308. + default n
  309. + help
  310. + Allow mixed use of all hardware supported erasesizes,
  311. + by forcing spi_nor to use the multiple eraseregions code path.
  312. + For example: A 68K erase will use one 64K erase, and one 4K erase
  313. + on supporting hardware.
  314. +
  315. config MTD_SPI_NOR_USE_4K_SECTORS
  316. bool "Use small 4096 B erase sectors"
  317. default y
  318. --- a/drivers/mtd/spi-nor/core.c
  319. +++ b/drivers/mtd/spi-nor/core.c
  320. @@ -1084,6 +1084,8 @@ static u8 spi_nor_convert_3to4_erase(u8
  321. static bool spi_nor_has_uniform_erase(const struct spi_nor *nor)
  322. {
  323. + if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE))
  324. + return false;
  325. return !!nor->params->erase_map.uniform_erase_type;
  326. }
  327. @@ -2569,6 +2571,7 @@ static int spi_nor_select_erase(struct s
  328. {
  329. struct spi_nor_erase_map *map = &nor->params->erase_map;
  330. const struct spi_nor_erase_type *erase = NULL;
  331. + const struct spi_nor_erase_type *erase_minor = NULL;
  332. struct mtd_info *mtd = &nor->mtd;
  333. u32 wanted_size = nor->info->sector_size;
  334. int i;
  335. @@ -2601,8 +2604,9 @@ static int spi_nor_select_erase(struct s
  336. */
  337. for (i = SNOR_ERASE_TYPE_MAX - 1; i >= 0; i--) {
  338. if (map->erase_type[i].size) {
  339. - erase = &map->erase_type[i];
  340. - break;
  341. + if (!erase)
  342. + erase = &map->erase_type[i];
  343. + erase_minor = &map->erase_type[i];
  344. }
  345. }
  346. @@ -2610,6 +2614,8 @@ static int spi_nor_select_erase(struct s
  347. return -EINVAL;
  348. mtd->erasesize = erase->size;
  349. + if (erase_minor && erase_minor->size < erase->size)
  350. + mtd->erasesize_minor = erase_minor->size;
  351. return 0;
  352. }
  353. --- a/include/linux/mtd/mtd.h
  354. +++ b/include/linux/mtd/mtd.h
  355. @@ -242,6 +242,8 @@ struct mtd_info {
  356. * information below if they desire
  357. */
  358. uint32_t erasesize;
  359. + /* "Minor" (smallest) erase size supported by the whole device */
  360. + uint32_t erasesize_minor;
  361. /* Minimal writable flash unit size. In case of NOR flash it is 1 (even
  362. * though individual bits can be cleared), in case of NAND flash it is
  363. * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR