st_smi: Return error in case TFF is not set
authorAmit Virdi <amit.virdi@st.com>
Mon, 7 May 2012 07:30:20 +0000 (13:00 +0530)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Sat, 7 Jul 2012 12:07:38 +0000 (14:07 +0200)
Curently the code makes wrong assumption that the Transfer finished flag shall
be set within the stipulated time. However, there may occur a scenario in which
the TFF flag is not set. Return error in that case.

Signed-off-by: Vipin Kumar <vipin.kumar@st.com>
Signed-off-by: Amit Virdi <amit.virdi@st.com>
Signed-off-by: Stefan Roese <sr@denx.de>
drivers/mtd/st_smi.c

index db08ab9..9769b28 100644 (file)
@@ -58,13 +58,15 @@ static struct flash_dev flash_ids[] = {
  *
  * Wait until TFF is set in status register
  */
-static void smi_wait_xfer_finish(int timeout)
+static int smi_wait_xfer_finish(int timeout)
 {
-       while (timeout--) {
+       do {
                if (readl(&smicntl->smi_sr) & TFF)
-                       break;
+                       return 0;
                udelay(1000);
-       }
+       } while (timeout--);
+
+       return -1;
 }
 
 /*
@@ -83,7 +85,8 @@ static unsigned int smi_read_id(flash_info_t *info, int banknum)
        writel((banknum << BANKSEL_SHIFT) | SEND | TX_LEN_1 | RX_LEN_3,
               &smicntl->smi_cr2);
 
-       smi_wait_xfer_finish(XFER_FINISH_TOUT);
+       if (smi_wait_xfer_finish(XFER_FINISH_TOUT))
+               return -EIO;
 
        value = (readl(&smicntl->smi_rr) & 0x00FFFFFF);
 
@@ -151,7 +154,8 @@ static unsigned int smi_read_sr(int bank)
        /* Performing a RSR instruction in HW mode */
        writel((bank << BANKSEL_SHIFT) | RD_STATUS_REG, &smicntl->smi_cr2);
 
-       smi_wait_xfer_finish(XFER_FINISH_TOUT);
+       if (smi_wait_xfer_finish(XFER_FINISH_TOUT))
+               return -1;
 
        /* Restore the CTRL REG1 state */
        writel(ctrlreg1, &smicntl->smi_cr1);
@@ -211,7 +215,8 @@ static int smi_write_enable(int bank)
        /* Give the Flash, Write Enable command */
        writel((bank << BANKSEL_SHIFT) | WE, &smicntl->smi_cr2);
 
-       smi_wait_xfer_finish(XFER_FINISH_TOUT);
+       if (smi_wait_xfer_finish(XFER_FINISH_TOUT))
+               return -1;
 
        /* Restore the CTRL REG1 state */
        writel(ctrlreg1, &smicntl->smi_cr1);
@@ -292,7 +297,8 @@ static int smi_sector_erase(flash_info_t *info, unsigned int sector)
                writel(instruction, &smicntl->smi_tr);
                writel((bank << BANKSEL_SHIFT) | SEND | TX_LEN_4,
                       &smicntl->smi_cr2);
-               smi_wait_xfer_finish(XFER_FINISH_TOUT);
+               if (smi_wait_xfer_finish(XFER_FINISH_TOUT))
+                       return -EIO;
 
                if (smi_wait_till_ready(bank, CONFIG_SYS_FLASH_ERASE_TOUT))
                        return -EBUSY;