@@ -287,7 +287,12 @@
#define FLASH_PAGESIZE 256 /* In Bytes */
#define FLASH_PAGESIZE_32 (FLASH_PAGESIZE / 4) /* In uint32_t */
-#define FLASH_MAX_BUSY_WAIT (300 * HZ) /* Maximum 'CHIPERASE' time */
+/* Maximum operation times (in ms) */
+#define FLASH_MAX_CHIP_ERASE_MS 500000 /* Chip Erase time */
+#define FLASH_MAX_SEC_ERASE_MS 30000 /* Sector Erase time */
+#define FLASH_MAX_PAGE_WRITE_MS 100 /* Write Page time */
+#define FLASH_MAX_STA_WRITE_MS 4000 /* Write status reg time */
+#define FSM_MAX_WAIT_SEQ_MS 1000 /* FSM execution time */
/*
* Flags to tweak operation of default read/write/erase routines
@@ -1000,7 +1005,7 @@ static int stfsm_enter_32bit_addr(struct stfsm *fsm, int enter)
return 0;
}
-static uint8_t stfsm_wait_busy(struct stfsm *fsm)
+static uint8_t stfsm_wait_busy(struct stfsm *fsm, unsigned int max_time_ms)
{
struct stfsm_seq *seq = &stfsm_seq_read_status_fifo;
unsigned long deadline;
@@ -1018,7 +1023,7 @@ static uint8_t stfsm_wait_busy(struct stfsm *fsm)
/*
* Repeat until busy bit is deasserted, or timeout, or error (S25FLxxxS)
*/
- deadline = jiffies + FLASH_MAX_BUSY_WAIT;
+ deadline = jiffies + msecs_to_jiffies(max_time_ms);
while (!timeout) {
if (time_after_eq(jiffies, deadline))
timeout = 1;
@@ -1097,7 +1102,7 @@ static int stfsm_write_status(struct stfsm *fsm, uint8_t cmd,
stfsm_wait_seq(fsm);
if (wait_busy)
- stfsm_wait_busy(fsm);
+ stfsm_wait_busy(fsm, FLASH_MAX_STA_WRITE_MS);
return 0;
}
@@ -1494,7 +1499,7 @@ static void stfsm_s25fl_write_dyb(struct stfsm *fsm, uint32_t offs, uint8_t dby)
stfsm_load_seq(fsm, &seq);
stfsm_wait_seq(fsm);
- stfsm_wait_busy(fsm);
+ stfsm_wait_busy(fsm, FLASH_MAX_STA_WRITE_MS);
}
static int stfsm_s25fl_clear_status_reg(struct stfsm *fsm)
@@ -1797,7 +1802,7 @@ static int stfsm_write(struct stfsm *fsm, const uint8_t *buf,
stfsm_wait_seq(fsm);
/* Wait for completion */
- ret = stfsm_wait_busy(fsm);
+ ret = stfsm_wait_busy(fsm, FLASH_MAX_PAGE_WRITE_MS);
if (ret && fsm->configuration & CFG_S25FL_CHECK_ERROR_FLAGS)
stfsm_s25fl_clear_status_reg(fsm);
@@ -1869,7 +1874,7 @@ static int stfsm_erase_sector(struct stfsm *fsm, uint32_t offset)
stfsm_wait_seq(fsm);
/* Wait for completion */
- ret = stfsm_wait_busy(fsm);
+ ret = stfsm_wait_busy(fsm, FLASH_MAX_SEC_ERASE_MS);
if (ret && fsm->configuration & CFG_S25FL_CHECK_ERROR_FLAGS)
stfsm_s25fl_clear_status_reg(fsm);
@@ -1899,7 +1904,7 @@ static int stfsm_erase_chip(struct stfsm *fsm)
stfsm_wait_seq(fsm);
- return stfsm_wait_busy(fsm);
+ return stfsm_wait_busy(fsm, FLASH_MAX_CHIP_ERASE_MS);
}
/*