spi: Fix "not ready" timeout after write in at25
Subsystems (2)
PATCH 1/1 spi: Fix "not ready" timeout after write in at25
Under certain circumstances msleep(1) within the loop, which waits for the EEPROM to be finished, might take longer than the timeout. On the next loop the status register might return to be ready and therefore the loop finishes. The following check now tests if a timeout occurred and if so returns an error although the device reported to be finished.
This fix replaces testing the occurrence of the timeout by testing the "not ready" bit in the status register.
The patch is against 2.6.29.2.
--- drivers/misc/eeprom/at25.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/misc/eeprom/at25.c +0 -0
@@ -160,6 +160,7 @@ at25_ee_write(struct at25_data *at25, char *buf,
loff_t off, size_t count)
bounce[0] = AT25_WRITE;
mutex_lock(&at25->lock);
do {
+ int sr;
unsigned long timeout, retries;
unsigned segment;
unsigned offset = (unsigned) off;
@@ -205,7 +206,6 @@ at25_ee_write(struct at25_data *at25, char *buf, loff_t off, size_t count)
timeout = jiffies + msecs_to_jiffies(EE_TIMEOUT); retries = 0;
do {
- int sr;
sr = spi_w8r8(at25->spi, AT25_RDSR);
if (sr < 0 || (sr & AT25_SR_nRDY)) {
@@ -219,7 +219,7 @@ at25_ee_write(struct at25_data *at25, char *buf, loff_t off, size_t count)
break;
} while (retries++ < 3 || time_before_eq(jiffies, timeout));
- if (time_after(jiffies, timeout)) {
+ if ((sr < 0) || (sr & AT25_SR_nRDY)) {
dev_err(&at25->spi->dev,
"write %d bytes offset %d, " "timeout after %u msecs\n",
Signature · 9 lines
1.6.3.2 ------------------------------------------------------------------------------ OpenSolaris 2009.06 is a cutting edge operating system for enterprises looking to deploy the next generation of Solaris that includes the latest innovations from Sun and the OpenSource community. Download a copy and enjoy capabilities such as Networking, Storage and Virtualization. Go to: http://p.sf.net/sfu/opensolaris-get
A message that is not in the archive (sent off-list or not yet received): 4A2CE07F.2060302-U9zb0o/[email protected]
Quoted 9 lines · Sebastian Heutling
Under certain circumstances msleep(1) within the loop, which waits for the EEPROM to be finished, might take longer than the timeout. On the next loop the status register might return to be ready and therefore the loop finishes. The following check now tests if a timeout occurred and if so returns an error although the device reported to be finished.
This fix replaces testing the occurrence of the timeout by testing the "not ready" bit in the status register.
The patch is against 2.6.29.2.
This got badly mangled by your mailer. Care to re-send?
Quoted 39 lines
Signed-off-by Sebastian Heutling <heutling-U9zb0o/[email protected]>--- drivers/misc/eeprom/at25.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)drivers/misc/eeprom/at25.c +1
-0@@ -160,6 +160,7 @@ at25_ee_write(struct at25_data *at25, char *buf, loff_t off, size_t count) bounce[0 ] =AT25_WRITE ;mutex_lock (&at25->lock); do { + int sr; unsigned long timeout, retries; unsigned segment;unsigned offset = (unsigned) off;drivers/misc/eeprom/at25.c +1
-1@@ -205,7 +206,6 @@ at25_ee_write(struct at25_data *at25, char *buf, loff_t off, size_t count) timeout = jiffies +msecs_to_jiffies (EE_TIMEOUT ); retries =0 ; do { - int sr; sr = spi_w8r8(at25->spi, AT25_RDSR); if (sr < 0 || (sr & AT25_SR_nRDY)) {@@ -219,7 +219,7 @@ at25_ee_write(struct at25_data *at25, char *buf, loff_t off, size_t count) break; }while (retries++ <3 ||time_before_eq (jiffies, timeout)); - if (time_after(jiffies, timeout)) { +if ((sr <0 ) || (sr & AT25_SR_nRDY)) { dev_err(&at25->spi->dev, "write %d bytes offset %d, " "timeout after %u msecs\n",Signature · 1 line
1.6.3.2
------------------------------------------------------------------------------