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 now 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 have 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.

Signed-off-by: Sebastian Heutling <heutl...@who-ing.de> 

---
 drivers/misc/eeprom/at25.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/misc/eeprom/at25.c b/drivers/misc/eeprom/at25.c
index 290dbe9..ea83604 100644
--- a/drivers/misc/eeprom/at25.c
+++ b/drivers/misc/eeprom/at25.c
@@ -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",
-- 
1.6.3.2


------------------------------------------------------------------------------
_______________________________________________
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general

Reply via email to