{
        int i, len_4align;
        unsigned long *buf = (unsigned long *)&flctl->done_buff[offset];
-       void *fifo_addr = (void *)FLDTFIFO(flctl);
 
        len_4align = (rlen + 3) / 4;
 
        for (i = 0; i < len_4align; i++) {
                wait_rfifo_ready(flctl);
-               buf[i] = readl(fifo_addr);
+               buf[i] = readl(FLDTFIFO(flctl));
                buf[i] = be32_to_cpu(buf[i]);
        }
 }
        }
 }
 
+static void write_ec_fiforeg(struct sh_flctl *flctl, int rlen, int offset)
+{
+       int i, len_4align;
+       unsigned long *data = (unsigned long *)&flctl->done_buff[offset];
+
+       len_4align = (rlen + 3) / 4;
+       for (i = 0; i < len_4align; i++) {
+               wait_wecfifo_ready(flctl);
+               writel(cpu_to_be32(data[i]), FLECFIFO(flctl));
+       }
+}
+
 static void set_cmd_regs(struct mtd_info *mtd, uint32_t cmd, uint32_t flcmcdr_val)
 {
        struct sh_flctl *flctl = mtd_to_flctl(mtd);
                                uint8_t *buf, int oob_required, int page)
 {
        chip->read_buf(mtd, buf, mtd->writesize);
+       chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
        return 0;
 }
 
                                   const uint8_t *buf, int oob_required)
 {
        chip->write_buf(mtd, buf, mtd->writesize);
+       chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
 }
 
 static void execmd_read_page_sector(struct mtd_info *mtd, int page_addr)
 static void execmd_write_page_sector(struct mtd_info *mtd)
 {
        struct sh_flctl *flctl = mtd_to_flctl(mtd);
-       int i, page_addr = flctl->seqin_page_addr;
+       int page_addr = flctl->seqin_page_addr;
        int sector, page_sectors;
 
        page_sectors = flctl->page_size ? 4 : 1;
 
        for (sector = 0; sector < page_sectors; sector++) {
                write_fiforeg(flctl, 512, 512 * sector);
-
-               for (i = 0; i < 4; i++) {
-                       wait_wecfifo_ready(flctl); /* wait for write ready */
-                       writel(0xFFFFFFFF, FLECFIFO(flctl));
-               }
+               write_ec_fiforeg(flctl, 16, mtd->writesize + 16 * sector);
        }
 
        wait_completion(flctl);