Skip to contentSkip to conversation

omap2 : bug in omap_wait

DISCUSSION Matthieu CASTET 1 participant 1 message Jun 10, 2011 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

Hi,

omap nand driver implement the nand.waitfunc[1] but it is buggy and can lead to
nand write/erase error :
- status = NAND_STATUS_FAIL
- timeo is computed
- thread is preempted
- timeo is expired and we never enter the loop
- we return NAND_STATUS_FAIL, even if the real status is okay.

The correct behavior is to read again the status after the loop like in nand_wait.

BTW why omap2 driver doesn't use nand_wait ?

Matthieu

[1]
static int omap_wait(struct mtd_info *mtd, struct nand_chip *chip)

{
    struct nand_chip *this = mtd->priv;
    struct omap_nand_info *info = container_of(mtd, struct omap_nand_info,
                            mtd);
    unsigned long timeo = jiffies;
    int status = NAND_STATUS_FAIL, state = this->state;

    if (state == FL_ERASING)
        timeo += (HZ * 400) / 1000;
    else
        timeo += (HZ * 20) / 1000;

    gpmc_nand_write(info->gpmc_cs,
            GPMC_NAND_COMMAND, (NAND_CMD_STATUS & 0xFF));
    while (time_before(jiffies, timeo)) {
        status = gpmc_nand_read(info->gpmc_cs, GPMC_NAND_DATA);
        if (status & NAND_STATUS_READY)
            break;
        cond_resched();
    }
    return status;
}