[PATCH 17/17] mtd: m25p80: change the m25p80_read to reading page to page

Yang, Wenyou Wenyou.Yang at atmel.com
Fri Nov 16 01:45:29 EST 2012


Hi Baruch,

Thanks a lot for your feedback.
I looked through the drive code carefully again, I think I should fix this bug inside my driver.
I will fix in the next version.

Best Regards
Wenyou Yang

> -----Original Message-----
> From: Baruch Siach [mailto:baruch at tkos.co.il]
> Sent: 2012年11月12日 17:13
> To: Yang, Wenyou
> Cc: linux-arm-kernel at lists.infradead.org; dwmw2 at infradead.org; Lin, JM; Ferre,
> Nicolas; linux-mtd at lists.infradead.org
> Subject: Re: [PATCH 17/17] mtd: m25p80: change the m25p80_read to reading page
> to page
> 
> Hi Wenyou Yang,
> 
> On Mon, Nov 12, 2012 at 04:52:37PM +0800, Wenyou Yang wrote:
> > When run "flashcp /bin/busybox /dev/mtdX", it arised a OOPS. changing to fix the
> [BUG].
> 
> Please post the BUG printout, and include it with the commit log.
> 
> baruch
> 
> > Signed-off-by: Wenyou Yang <wenyou.yang at atmel.com>
> > Cc: dwmw2 at infradead.org
> > Cc: linux-mtd at lists.infradead.org
> > ---
> >  drivers/mtd/devices/m25p80.c |   44
> +++++++++++++++++++++++++++++++++++++++---
> >  1 file changed, 41 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c
> > index 03838ba..73e5fea 100644
> > --- a/drivers/mtd/devices/m25p80.c
> > +++ b/drivers/mtd/devices/m25p80.c
> > @@ -340,6 +340,7 @@ static int m25p80_read(struct mtd_info *mtd, loff_t from,
> size_t len,
> >  	size_t *retlen, u_char *buf)
> >  {
> >  	struct m25p *flash = mtd_to_m25p(mtd);
> > +	u32 page_offset, page_size;
> >  	struct spi_transfer t[2];
> >  	struct spi_message m;
> >
> > @@ -358,7 +359,6 @@ static int m25p80_read(struct mtd_info *mtd, loff_t from,
> size_t len,
> >  	spi_message_add_tail(&t[0], &m);
> >
> >  	t[1].rx_buf = buf;
> > -	t[1].len = len;
> >  	spi_message_add_tail(&t[1], &m);
> >
> >  	mutex_lock(&flash->lock);
> > @@ -379,9 +379,47 @@ static int m25p80_read(struct mtd_info *mtd, loff_t from,
> size_t len,
> >  	flash->command[0] = OPCODE_READ;
> >  	m25p_addr2cmd(flash, from, flash->command);
> >
> > -	spi_sync(flash->spi, &m);
> > +	page_offset = from & (flash->page_size - 1);
> > +
> > +	/* do all the bytes fit onto one page? */
> > +	if (page_offset + len <= flash->page_size) {
> > +		t[1].len = len;
> > +
> > +		spi_sync(flash->spi, &m);
> > +
> > +		*retlen = m.actual_length - m25p_cmdsz(flash)
> > +					- FAST_READ_DUMMY_BYTE;
> > +
> > +	} else {
> > +		u32 i;
> > +
> > +		/* the size of data remaining on the first page */
> > +		page_size = flash->page_size - page_offset;
> > +
> > +		t[1].len = page_size;
> > +		spi_sync(flash->spi, &m);
> > +
> > +		*retlen = m.actual_length - m25p_cmdsz(flash)
> > +					- FAST_READ_DUMMY_BYTE;
> > +
> > +		/* write everything in flash->page_size chunks */
> > +		for (i = page_size; i < len; i += page_size) {
> > +			page_size = len - i;
> > +			if (page_size > flash->page_size)
> > +				page_size = flash->page_size;
> > +
> > +			/* write the next page to flash */
> > +			m25p_addr2cmd(flash, from + i, flash->command);
> > +
> > +			t[1].rx_buf = buf + i;
> > +			t[1].len = page_size;
> > +
> > +			spi_sync(flash->spi, &m);
> >
> > -	*retlen = m.actual_length - m25p_cmdsz(flash) - FAST_READ_DUMMY_BYTE;
> > +			*retlen += m.actual_length - m25p_cmdsz(flash)
> > +						- FAST_READ_DUMMY_BYTE;
> > +		}
> > +	}
> >
> >  	mutex_unlock(&flash->lock);
> >
> > --
> > 1.7.9.5
> 
> --
>      http://baruch.siach.name/blog/                  ~. .~   Tk Open Systems
> =}------------------------------------------------ooO--U--Ooo------------{=
>    - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


More information about the linux-arm-kernel mailing list