<div style="padding:10px 7px; font-size:12px; line-height:1.4 font-family:Arial,Sans-serif; text-align:center;"><div><a href="http://www.google.com/calendar/"><img style="border-width:0" src="http://www.google.com/calendar/images/blue_beta_en.gif" alt="Google Calendar"></a></div>
<div style="width:370px; background:#D2E6D2; border-style:solid;       border-color:#ccc; border-width:1px 1px 0 1px; padding:15px 15px 5px 15px;       margin:0 auto"><p style="margin:0;color:#0">u-boot-users@lists.sourceforge.net,
you are invited to</p>
<h2 style="margin:5px 0; font-size:18px; line-height:1.4;color:#0">(No Subject)</h2>
<p style="margin:0 0 .5em;"><span style="color:#0">Sat Jul 12 11am – 12pm</span>
<br>
<span style="color:#676;">(Timezone:
Seoul)</span>
<br>
<span style="color:#0"></span>
<br>
<span style="color:#0">Calendar:
</span></p>
<p style="margin:0 0 1em;color:#0; white-space:pre-wrap !important; white-space:-moz-pre-wrap !important; white-space:-pre-wrap !important; white-space:-o-pre-wrap !important; white-space:pre; word-wrap:break-word;">
<br>
<br>On Sat, Jul 12, 2008 at 6:43 AM, Scott Wood &lt;<a href="mailto:scottwood@freescale.com">scottwood@freescale.com</a>&gt; wrote:
<br>&gt; On Mon, Jul 07, 2008 at 11:22:56AM +0900, Kyungmin Park wrote:
<br>&gt;&gt; +static int part_validate_onenand(struct mtdids *id, struct part_info *part)
<br>&gt;&gt; +{
<br>&gt;&gt; +#if defined(CONFIG_CMD_ONENAND)
<br>&gt;&gt; + &#160; &#160; /* info for OneNAND chips */
<br>&gt;&gt; + &#160; &#160; struct mtd_info *mtd;
<br>&gt;&gt; +
<br>&gt;&gt; + &#160; &#160; mtd = &amp;onenand_mtd;
<br>&gt;&gt; +
<br>&gt;&gt; + &#160; &#160; if ((unsigned long)(part-&gt;offset) % mtd-&gt;erasesize) {
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; printf(&quot;%s%d: partition (%s) start offset&quot;
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &quot;alignment incorrect\n&quot;,
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; MTD_DEV_TYPE(id-&gt;type), id-&gt;num, part-&gt;name);
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; return 1;
<br>&gt;&gt; + &#160; &#160; }
<br>&gt;&gt; +
<br>&gt;&gt; + &#160; &#160; if (part-&gt;size % mtd-&gt;erasesize) {
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; printf(&quot;%s%d: partition (%s) size alignment incorrect\n&quot;,
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; MTD_DEV_TYPE(id-&gt;type), id-&gt;num, part-&gt;name);
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; return 1;
<br>&gt;&gt; + &#160; &#160; }
<br>&gt;&gt; +
<br>&gt;&gt; + &#160; &#160; return 0;
<br>&gt;&gt; +#else
<br>&gt;&gt; + &#160; &#160; return 1;
<br>&gt;&gt; +#endif
<br>&gt;&gt; +}
<br>&gt;
<br>&gt; This looks like a duplicate of part_validate_nand (note that nand_info_t
<br>&gt; is just an obfuscatory alias of struct mtd_info).
<br>&gt;
<br>&gt;&gt; +static int read_onenand_cached(u32 off, u32 size, u_char *buf)
<br>&gt;&gt; +{
<br>&gt;&gt; + &#160; &#160; u32 bytes_read = 0;
<br>&gt;&gt; + &#160; &#160; size_t retlen;
<br>&gt;&gt; + &#160; &#160; int cpy_bytes;
<br>&gt;&gt; +
<br>&gt;&gt; + &#160; &#160; while (bytes_read &lt; size) {
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; if ((off + bytes_read &lt; onenand_cache_off) ||
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; (off + bytes_read &gt;= onenand_cache_off + ONENAND_CACHE_SIZE)) {
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; onenand_cache_off = (off + bytes_read) &amp; ONENAND_PAGE_MASK;
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; if (!onenand_cache) {
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; /* This memory never gets freed but &#39;cause
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;it&#39;s a bootloader, nobody cares */
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; onenand_cache = malloc(ONENAND_CACHE_SIZE);
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; if (!onenand_cache) {
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; printf(&quot;read_onenand_cached: can&#39;t alloc cache size %d bytes\n&quot;,
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;ONENAND_CACHE_SIZE);
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; return -1;
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; }
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; }
<br>&gt;&gt; +
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; retlen = ONENAND_CACHE_SIZE;
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; if (onenand_read(&amp;onenand_mtd, onenand_cache_off, retlen,
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &amp;retlen, onenand_cache) != 0 ||
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; retlen != ONENAND_CACHE_SIZE) {
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; printf(&quot;read_onenand_cached: error reading nand off %#x size %d bytes\n&quot;,
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; onenand_cache_off, ONENAND_CACHE_SIZE);
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; return -1;
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; }
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; }
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; cpy_bytes = onenand_cache_off + ONENAND_CACHE_SIZE - (off + bytes_read);
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; if (cpy_bytes &gt; size - bytes_read)
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; cpy_bytes = size - bytes_read;
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; memcpy(buf + bytes_read,
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;onenand_cache + off + bytes_read - onenand_cache_off,
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;cpy_bytes);
<br>&gt;&gt; + &#160; &#160; &#160; &#160; &#160; &#160; bytes_read += cpy_bytes;
<br>&gt;&gt; + &#160; &#160; }
<br>&gt;&gt; + &#160; &#160; return bytes_read;
<br>&gt;&gt; +}
<br>&gt;
<br>&gt; I really would rather not duplicate all of this, which looks extremely
<br>&gt; similar to regular NAND. &#160;Is there reason why we don&#39;t use the mtd_info
<br>&gt; function pointer interface?
<br>
<br>Agreed, It&#39;s almost same as NAND code.
<br>Now nand code uses two modes, legacy and mtd. Because I don&#39;t want to break the NAND code , I used the duplicated code.
<br>Basically it should be used the common mtd style code except legacy.
<br>
<br>So first it added the current code, next time it tries to use the common interface and some code clean up.
<br>
<br>Thank you,
<br>Kyungmin Park<br><a href="http://www.google.com/calendar/event?action=VIEW&amp;eid=NDlrY25wdnZubGJwdTRtdHJmcjdjZGV0aW8gdS1ib290LXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldA&amp;tok=MjAja3l1bmdtaW43OEBnbWFpbC5jb20zZjU2NzIzMmFjMTNiYmFjNzI3MjcyYTNiM2IzYzM0ZjE5ZTE0ZWZl&amp;ctz=Asia%2FSeoul&amp;hl=en">More event details&raquo;</a></p>
<div style="margin:.5em 0 0; text-align:center;color:#0"><strong>Will you attend?</strong></div>
<div style="margin:4px 0 0; text-align:center;"><span style="background:#fff; border:1px solid #676;              padding:3px 5px; line-height:1.5;"><a href="http://www.google.com/calendar/event?action=RESPOND&amp;eid=NDlrY25wdnZubGJwdTRtdHJmcjdjZGV0aW8gdS1ib290LXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldA&amp;rst=1&amp;tok=MjAja3l1bmdtaW43OEBnbWFpbC5jb20zZjU2NzIzMmFjMTNiYmFjNzI3MjcyYTNiM2IzYzM0ZjE5ZTE0ZWZl&amp;ctz=Asia%2FSeoul&amp;hl=en">Yes</a>
|<a href="http://www.google.com/calendar/event?action=RESPOND&amp;eid=NDlrY25wdnZubGJwdTRtdHJmcjdjZGV0aW8gdS1ib290LXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldA&amp;rst=3&amp;tok=MjAja3l1bmdtaW43OEBnbWFpbC5jb20zZjU2NzIzMmFjMTNiYmFjNzI3MjcyYTNiM2IzYzM0ZjE5ZTE0ZWZl&amp;ctz=Asia%2FSeoul&amp;hl=en">Maybe</a>
|<a href="http://www.google.com/calendar/event?action=RESPOND&amp;eid=NDlrY25wdnZubGJwdTRtdHJmcjdjZGV0aW8gdS1ib290LXVzZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldA&amp;rst=2&amp;tok=MjAja3l1bmdtaW43OEBnbWFpbC5jb20zZjU2NzIzMmFjMTNiYmFjNzI3MjcyYTNiM2IzYzM0ZjE5ZTE0ZWZl&amp;ctz=Asia%2FSeoul&amp;hl=en">No</a></span></div></div>
<div><img src="http://www.google.com/calendar/images/envelope.gif" style="background:#D2E6D2; width:420px height:95px" alt=""></div><p style="margin:-15px 0 0;">&nbsp;</p>
<p style="color:#676;">You are receiving this courtesy email at the account u-boot-users@lists.sourceforge.net because you are an attendee of this event.</p><p style="color:#676;">To stop receiving future notifications for this event, decline this event. Alternatively you can sign up for a Google account at http://www.google.com/calendar/ and control your notification settings for your entire calendar.</p></div>