Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933741AbbLOUfW (ORCPT ); Tue, 15 Dec 2015 15:35:22 -0500 Received: from mail-bn1on0134.outbound.protection.outlook.com ([157.56.110.134]:5214 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932286AbbLOUfT (ORCPT ); Tue, 15 Dec 2015 15:35:19 -0500 Authentication-Results: spf=permerror (sender IP is 192.88.168.50) smtp.mailfrom=freescale.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=freescale.com; Date: Tue, 15 Dec 2015 14:22:17 -0600 From: Han Xu To: Michal Suchanek CC: Heiner Kallweit , David Woodhouse , Brian Norris , Mark Brown , Boris Brezillon , Javier Martinez Canillas , Rafal Milecki , Jagan Teki , "Andrew F. Davis" , Mika Westerberg , Gabor Juhos , Bean Huo , Furquan Shaikh , , , Subject: Re: [PATCH v6 06/10] mtd: spi-nor: simplify write loop Message-ID: <20151215202216.GA11742@chopperman.am.freescale.net> References: <2236d87ad516f118f58eb5df232d441f970c4499.1449052427.git.hramrach@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <2236d87ad516f118f58eb5df232d441f970c4499.1449052427.git.hramrach@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD042;1:zEWbVxO+LNMONlFF2bty9Hohoubwc+iiFShilUMtLHFvpJWdjUYTfHIazC/Vpjno3fRgcmS2cOFnC3xHAek5Kl9GobwJ7t5T9GxHltgxSPGpbc5ecaAsWJ2PWazRufuZLr4k4k7pv7wlHC40YWELrXUA9q+2CDcXVnN8f4A60+/2cshf4zqByGR2JHGOpBC4cLNCrIYvYMezowetr/hqBWoGRIgRtn5uNSPve4+xc4pwL5WxvdxxOkORt1S+J4dSRIGFo3F0vtOwG5tKQX/bOAuezxHwLct2ZWZ6T28yX4EFvDG07w6+/hhaE4wFmQgKQLtyI7PYj6gsmF33aX6y/ugTsnV3Elj4mIQtNUT4I0/kyNEkiDxM1+vJ2EVrJ4vScS0l0hGzsjaAXFI77zveZBFNGCNK2ZZFiI3NXm3XJQI= X-Forefront-Antispam-Report: CIP:192.88.168.50;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(448002)(189002)(24454002)(199003)(50466002)(19580405001)(46406003)(87936001)(5008740100001)(1076002)(97756001)(106466001)(86362001)(19580395003)(50986999)(54356999)(110136002)(92566002)(104016004)(85326001)(1220700001)(189998001)(81156007)(83506001)(6806005)(11100500001)(47776003)(5003600100002)(33656002)(586003)(97736004)(23726003)(77096005)(1411001)(2950100001)(4001350100001)(76176999)(1096002)(5001960100002);DIR:OUT;SFP:1102;SCL:1;SRVR:BLUPR03MB603;H:tx30smr01.am.freescale.net;FPR:;SPF:PermError;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB603;2:+BGkyz8XtlaVdxlAEFxBCBa9lkWEYHYjprtzsDSTPCEFsSl4tCM9QhtJDNLP6IYPEIaorZdl1x5BBmRbAXWJlK70n+iLuPGar9aonVDf1fWhE/vzt6t+y7fz17189xYA/yxy0DP596SorC47ahmIaQ==;3:Wp7IN8XQkg41c4maiTq7WiVq+Ho7K86yekbbdz01fPJhOsCK951Rcphlag98SB/s9luHUiba9cYnprEGZICgo6MTaE0KxYMjr/pgNCGhXrzlktPVrJHz9qoWHzLxZIeE1sErx8k4tmvi8RMHTB0veDkqsrsB0ITpPitqUyvdBFoqA/W0u27T+xuHrhsEAMCvCsHjogpm5Otqg2n/M0mhgh1NzzgLqvnrFAQxtUM9D2g=;25:NtyODI5OvvihD+YMHJbS+Q4CO4gqr1BEG7uhec36nVDHcWRQOXfkiJMRJ3JgK4B9EFSwXo52OnZ8b7JNnNtb7bcEMEzx3zyN5tsk1YauBpwSxwT6d0q49sywQjn15vE5Z86Q94d0PtLPst+O0pI4YcZH8Yr8UgfAy+i8X/k8yIiZcqQpZn3XGbjvdQSLfScEkWq+OhXqbHO4tbXq7/a9JqVbyz7AUwrKe+f5JqmhqPtjWfKolSlZ7LjfOkmilooqcLSh8wD/MYql0H7QkrUegg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB603; X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB603;20:X69DD/hOZCEdXcraJBEqHA2Wwg2k/3S6r65jAshfBwt3wkWe5LpGw1x0cU4epFSnS0eGMH/8SQkT0FkqSHVX4xdrV3oHwD3YExUn1ojev1mIpcTo2wpCEDLGjLa0WAmbzLxOffP2UOVi9zl6h2mytxrN0wUrPnduvZNY81+M4KLmXa+/Aau5jSNSNQLDiCOo55nMcKO3q+QzFcn1CGmCWFcE3OoKniZCjHOX0O9dk3/jBU/GY56EAoMJa2Nfh8jsvxMbzzXKuRMtCcHRYTScH1eM2xdVdbqZq3a1BpGi5tM7NDPRZPFcFDz+os4CqF1BqyegdoRIkAmwmiRh4+kHTtAWz0JsW2u36ikY2FNYN8c=;4:K4XoYwUxzOTPV+tu4CoRGO1hiSEQkuN6peCknu0IKijVBKqyRzGXpL5EE6FFn9g89szauFQyjFf9eBW+PoPLV0XwTuZzPsWo8OCupJ6RhPK38If3+ldxycNyDDcd2MOcZGHi2R7AfiPON95j4fdY9EKh+kzT6tbyZQDBPRfhhpOs+Ey+9Pph1WStVZ0X8XCEsMnmGGvzKv7rKPH3wEXgIXK9bZiQinDlL6lSi1Wj+E8MX1CuX3sI6AHTMsLzGSAECW4liabKM81hahQYbLPxf0cgccYnSl+wM3FgZdrUT+lFtS2TXxHFAx9ckZnLeRc5bg0Sm56smPYlfDvQWxzm2lCdbb9QqJC6mR90WHbbClELPqKJDauMvHfcVJHXjLWO X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(8121501046)(5005006)(3002001)(10201501046);SRVR:BLUPR03MB603;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB603; X-Forefront-PRVS: 07915F544A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BLUPR03MB603;23:e7KV3KeN/7ulHlOmW/9nievMZqE77TUPnojoMm54gg?= =?us-ascii?Q?grHpKIlbnUBB3URm26YUwQ17ei8KuW9aM+bqhFemsNTJgb7dlbandCxFYAtk?= =?us-ascii?Q?4LSPlyXDRwalja9Fr0fCCd7reHgwayG4lWcCX7efkmvw91FlQ0SPBdzBvAld?= =?us-ascii?Q?6LnywTLNugdR7zoejuQesDoPj6s999Y5rQf9KD58qNl6ozD7riyfWLoNlkZ1?= =?us-ascii?Q?crz/8ZZzelB6jVkSpqUevKLw+PKtvPu3rpU9m3++lZ28mZFIecygUq3O7fOp?= =?us-ascii?Q?9TqKRXWoyxSaVtk4uDUMO41DfHOnbnS9nTa+x7UlS6OIEQIy+6ihGL2f9sXn?= =?us-ascii?Q?TMPPqx3kKKKBj3sWcefoWK+FcdYtxCmpaD0Beu1//LJFZnNP/ovkhJAJ9RjS?= =?us-ascii?Q?WZOCRba1eTGlKBkc++zoMZS0d1rvwgdhOaRwZhd1ZB3FHHMRZNlswsYGDVBY?= =?us-ascii?Q?FYt59dG5KYuNrT9amf731FXoQnAtonc+SXkgaY/dwxZdeHMYr/NjzL5sNQpM?= =?us-ascii?Q?rBLkoRDxj9fJ7EsBmguJNt06QAB39qfbaugwxZ2ASfMt0/xEPSeUvST97PD2?= =?us-ascii?Q?yejKELBXOK40JuAQgO7pJlkSi3agnZKcFtpzG0HSbENcMMqoz6YDHxkK1RXb?= =?us-ascii?Q?QZmJs2teDiZEQyKrevmwpzaTTtNEDeVIn83yUQqpsn1wo8qRImTsoAMDyLEm?= =?us-ascii?Q?hep5/mLiH2uHOn0ty2l+KmQtvJlJ3pHo9x5zQkF592cCEvIeccvCclPCpDR0?= =?us-ascii?Q?mOXjpyRrS7obR3OQilZ+kGQOqdwfjYo3whX5vIwT7rWOW12As00yCUiZaiMW?= =?us-ascii?Q?aEOpPGJH1s/jXNLBDNSnxbIWjr6DOgr8auJwCNN5WCtqzO+m0jROZBChqYqE?= =?us-ascii?Q?BUeEF9vpsUAzVj7gTHbRkwFp4wt1DoTQENnBfu7s9yCCIf2BxsLLY+Lx3l98?= =?us-ascii?Q?u7D1m43VZV1LSXs7v22GF5tW3sbaX7JvlKjFYYEGzY0XgJa7QH/wpRLZZ9O8?= =?us-ascii?Q?y+3tzO9pN1vk5kXTBclY0UkOH/QSihzB2Rx/Zi7UvCcmbV/vSA7A7PSDTZim?= =?us-ascii?Q?CJGcdeEChU4dlpaHZ0/ArosmDO9UktMyDYLdEWA87JW4KxEg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB603;5:QSMrALn3kqcqfVLDA7Pj9Sc8cC8JMwYIhcmkJG8E3BUjOBd6Ywavk0YiVUJS3at/W/fh5wLHvsSQLZc+bXxjLiKRZB1GHlZtb4/oegmyUXfW62+3UXoF+kWdwqoZCkFjl89WQDLkG0NTYLZ7A1oWrg==;24:I5e/oHFy2BT5CtdAYC18epeogRV+R5T0UddIfyn3rFYyTjgPUoZepuF3K7P3h32m9/kSb8cSQspD1KprETIG8UXkP/6JbhOAqD8ezr1JxpQ= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Dec 2015 20:35:16.6421 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR03MB603 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3778 Lines: 123 On Wed, Dec 02, 2015 at 10:38:20AM +0000, Michal Suchanek wrote: > The spi-nor write loop assumes that what is passed to the hardware > driver write() is what gets written. > > When write() writes less than page size at once data is dropped on the > floor. Check the amount of data writen and exit if it does not match > requested amount. > > Signed-off-by: Michal Suchanek > > --- > > - add warning when writing incomplete pages > - refuse to continue writing when full page was not written > --- > drivers/mtd/spi-nor/spi-nor.c | 58 +++++++++++++++++++------------------------ > 1 file changed, 25 insertions(+), 33 deletions(-) > > diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c > index 3d02803..115c123 100644 > --- a/drivers/mtd/spi-nor/spi-nor.c > +++ b/drivers/mtd/spi-nor/spi-nor.c > @@ -1005,8 +1005,8 @@ static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len, > size_t *retlen, const u_char *buf) > { > struct spi_nor *nor = mtd_to_spi_nor(mtd); > - u32 page_offset, page_size, i; > - int ret; > + size_t page_offset, page_remain, i; > + ssize_t ret; > > dev_dbg(nor->dev, "to 0x%08x, len %zd\n", (u32)to, len); > > @@ -1014,45 +1014,37 @@ static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len, > if (ret) > return ret; > > - write_enable(nor); > - > - page_offset = to & (nor->page_size - 1); > + for (i = 0; i < len; ) { > + ssize_t written; > > - /* do all the bytes fit onto one page? */ > - if (page_offset + len <= nor->page_size) { > - ret = nor->write(nor, to, len, buf); > - if (ret < 0) > - goto write_err; > - *retlen += ret; > - } else { > + page_offset = to & (nor->page_size - 1); > + WARN_ONCE(page_offset, > + "Writing at offset %zu into a NOR page. Writing partial pages may decrease reliability and increase wear of NOR flash.", > + page_offset); > /* the size of data remaining on the first page */ > - page_size = nor->page_size - page_offset; > - ret = nor->write(nor, to, page_size, buf); > + page_remain = min_t(size_t, > + nor->page_size - page_offset, len - i); > + > + write_enable(nor); > + ret = nor->write(nor, to + i, page_remain, buf + i); Previous implementation was trying to write nor->page_size byte data in each loop, except the first and last loop, if possible. But this change may write only (nor->page_size - page_offset) in each loop, for the worst case, if page_offset equals nor->page_size -1, it writes byte by byte. > if (ret < 0) > goto write_err; > - *retlen += ret; > - > - /* write everything in nor->page_size chunks */ > - for (i = ret; i < len; ) { > - page_size = len - i; > - if (page_size > nor->page_size) > - page_size = nor->page_size; > - > - ret = spi_nor_wait_till_ready(nor); > - if (ret) > - goto write_err; > + written = ret; > > - write_enable(nor); > - > - ret = nor->write(nor, to + i, page_size, buf + i); > - if (ret < 0) > - goto write_err; > - *retlen += ret; > - i += ret; > + ret = spi_nor_wait_till_ready(nor); > + if (ret) > + goto write_err; > + *retlen += written; > + i += written; > + if (written != page_remain) { > + dev_err(nor->dev, > + "While writing %zu bytes written %zd bytes\n", > + page_remain, written); > + ret = -EIO; > + goto write_err; > } > } > > - ret = spi_nor_wait_till_ready(nor); > write_err: > spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_WRITE); > return ret; > -- > 2.6.2 > -- Best Regards, Han "Allen" Xu -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/