VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / mtd / chips / cfi_cmdset_0020.c
index 98e58b4..326eaf7 100644 (file)
@@ -4,6 +4,7 @@
  *
  * (C) 2000 Red Hat. GPL'd
  *
+ * $Id: cfi_cmdset_0020.c,v 1.15 2004/08/09 13:19:43 dwmw2 Exp $
  * 
  * 10/10/2000  Nicolas Pitre <nico@cam.org>
  *     - completely revamped method functions so they are aware and
@@ -38,7 +39,7 @@
 
 static int cfi_staa_read(struct mtd_info *, loff_t, size_t, size_t *, u_char *);
 static int cfi_staa_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
-static int cfi_staa_writev(struct mtd_info *mtd, const struct iovec *vecs,
+static int cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,
                unsigned long count, loff_t to, size_t *retlen);
 static int cfi_staa_erase_varsize(struct mtd_info *, struct erase_info *);
 static void cfi_staa_sync (struct mtd_info *);
@@ -116,7 +117,6 @@ struct mtd_info *cfi_cmdset_0020(struct map_info *map, int primary)
 {
        struct cfi_private *cfi = map->fldrv_priv;
        int i;
-       __u32 base = cfi->chips[0].start;
 
        if (cfi->cfi_mode) {
                /* 
@@ -126,36 +126,11 @@ struct mtd_info *cfi_cmdset_0020(struct map_info *map, int primary)
                 */
                __u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;
                struct cfi_pri_intelext *extp;
-               int ofs_factor = cfi->interleave * cfi->device_type;
 
-                printk(" ST Microelectronics Extended Query Table at 0x%4.4X\n", adr);
-               if (!adr)
+               extp = (struct cfi_pri_intelext*)cfi_read_pri(map, adr, sizeof(*extp), "ST Microelectronics");
+               if (!extp)
                        return NULL;
 
-               /* Switch it into Query Mode */
-               cfi_send_gen_cmd(0x98, 0x55, base, map, cfi, cfi->device_type, NULL);
-
-               extp = kmalloc(sizeof(*extp), GFP_KERNEL);
-               if (!extp) {
-                       printk(KERN_ERR "Failed to allocate memory\n");
-                       return NULL;
-               }
-               
-               /* Read in the Extended Query Table */
-               for (i=0; i<sizeof(*extp); i++) {
-                       ((unsigned char *)extp)[i] = 
-                               cfi_read_query(map, (base+((adr+i)*ofs_factor)));
-               }
-               
-               if (extp->MajorVersion != '1' || 
-                    (extp->MinorVersion < '0' || extp->MinorVersion > '2')) {
-                    printk(KERN_WARNING "  Unknown staa Extended Query "
-                           "version %c.%c.\n",  extp->MajorVersion,
-                           extp->MinorVersion);
-                    kfree(extp);
-                    return NULL;
-               }
-               
                /* Do some byteswapping if necessary */
                extp->FeatureSupport = cfi32_to_cpu(extp->FeatureSupport);
                extp->BlkStatusRegMask = cfi32_to_cpu(extp->BlkStatusRegMask);
@@ -175,8 +150,6 @@ struct mtd_info *cfi_cmdset_0020(struct map_info *map, int primary)
                cfi->chips[i].erase_time = 1024;
        }               
 
-       /* Make sure it's in read mode */
-       cfi_send_gen_cmd(0xff, 0x55, base, map, cfi, cfi->device_type, NULL);
        return cfi_staa_setup(map);
 }
 
@@ -266,7 +239,7 @@ static struct mtd_info *cfi_staa_setup(struct map_info *map)
 
 static inline int do_read_onechip(struct map_info *map, struct flchip *chip, loff_t adr, size_t len, u_char *buf)
 {
-       __u32 status, status_OK;
+       map_word status, status_OK;
        unsigned long timeo;
        DECLARE_WAITQUEUE(wait, current);
        int suspended = 0;
@@ -276,7 +249,7 @@ static inline int do_read_onechip(struct map_info *map, struct flchip *chip, lof
        adr += chip->start;
 
        /* Ensure cmd read/writes are aligned. */ 
-       cmd_addr = adr & ~(CFIDEV_BUSWIDTH-1); 
+       cmd_addr = adr & ~(map_bankwidth(map)-1); 
 
        /* Let's determine this according to the interleave only once */
        status_OK = CMD(0x80);
@@ -290,33 +263,33 @@ static inline int do_read_onechip(struct map_info *map, struct flchip *chip, lof
         */
        switch (chip->state) {
        case FL_ERASING:
-               if (!((struct cfi_pri_intelext *)cfi->cmdset_priv)->FeatureSupport & 2)
+               if (!(((struct cfi_pri_intelext *)cfi->cmdset_priv)->FeatureSupport & 2))
                        goto sleep; /* We don't support erase suspend */
                
-               cfi_write (map, CMD(0xb0), cmd_addr);
+               map_write (map, CMD(0xb0), cmd_addr);
                /* If the flash has finished erasing, then 'erase suspend'
                 * appears to make some (28F320) flash devices switch to
                 * 'read' mode.  Make sure that we switch to 'read status'
                 * mode so we get the right data. --rmk
                 */
-               cfi_write(map, CMD(0x70), cmd_addr);
+               map_write(map, CMD(0x70), cmd_addr);
                chip->oldstate = FL_ERASING;
                chip->state = FL_ERASE_SUSPENDING;
                //              printk("Erase suspending at 0x%lx\n", cmd_addr);
                for (;;) {
-                       status = cfi_read(map, cmd_addr);
-                       if ((status & status_OK) == status_OK)
+                       status = map_read(map, cmd_addr);
+                       if (map_word_andequal(map, status, status_OK, status_OK))
                                break;
                        
                        if (time_after(jiffies, timeo)) {
                                /* Urgh */
-                               cfi_write(map, CMD(0xd0), cmd_addr);
+                               map_write(map, CMD(0xd0), cmd_addr);
                                /* make sure we're in 'read status' mode */
-                               cfi_write(map, CMD(0x70), cmd_addr);
+                               map_write(map, CMD(0x70), cmd_addr);
                                chip->state = FL_ERASING;
                                spin_unlock_bh(chip->mutex);
                                printk(KERN_ERR "Chip not ready after erase "
-                                      "suspended: status = 0x%x\n", status);
+                                      "suspended: status = 0x%lx\n", status.x[0]);
                                return -EIO;
                        }
                        
@@ -326,7 +299,7 @@ static inline int do_read_onechip(struct map_info *map, struct flchip *chip, lof
                }
                
                suspended = 1;
-               cfi_write(map, CMD(0xff), cmd_addr);
+               map_write(map, CMD(0xff), cmd_addr);
                chip->state = FL_READY;
                break;
        
@@ -340,13 +313,13 @@ static inline int do_read_onechip(struct map_info *map, struct flchip *chip, lof
 
        case FL_CFI_QUERY:
        case FL_JEDEC_QUERY:
-               cfi_write(map, CMD(0x70), cmd_addr);
+               map_write(map, CMD(0x70), cmd_addr);
                chip->state = FL_STATUS;
 
        case FL_STATUS:
-               status = cfi_read(map, cmd_addr);
-               if ((status & status_OK) == status_OK) {
-                       cfi_write(map, CMD(0xff), cmd_addr);
+               status = map_read(map, cmd_addr);
+               if (map_word_andequal(map, status, status_OK, status_OK)) {
+                       map_write(map, CMD(0xff), cmd_addr);
                        chip->state = FL_READY;
                        break;
                }
@@ -354,7 +327,7 @@ static inline int do_read_onechip(struct map_info *map, struct flchip *chip, lof
                /* Urgh. Chip not yet ready to talk to us. */
                if (time_after(jiffies, timeo)) {
                        spin_unlock_bh(chip->mutex);
-                       printk(KERN_ERR "waiting for chip to be ready timed out in read. WSM status = %x\n", status);
+                       printk(KERN_ERR "waiting for chip to be ready timed out in read. WSM status = %lx\n", status.x[0]);
                        return -EIO;
                }
 
@@ -389,8 +362,8 @@ static inline int do_read_onechip(struct map_info *map, struct flchip *chip, lof
                   sending the 0x70 (Read Status) command to an erasing
                   chip and expecting it to be ignored, that's what we 
                   do. */
-               cfi_write(map, CMD(0xd0), cmd_addr);
-               cfi_write(map, CMD(0x70), cmd_addr);            
+               map_write(map, CMD(0xd0), cmd_addr);
+               map_write(map, CMD(0x70), cmd_addr);            
        }
 
        wake_up(&chip->wq);
@@ -441,16 +414,16 @@ static inline int do_write_buffer(struct map_info *map, struct flchip *chip,
                                  unsigned long adr, const u_char *buf, int len)
 {
        struct cfi_private *cfi = map->fldrv_priv;
-       __u32 status, status_OK;
+       map_word status, status_OK;
        unsigned long cmd_adr, timeo;
        DECLARE_WAITQUEUE(wait, current);
        int wbufsize, z;
         
         /* M58LW064A requires bus alignment for buffer wriets -- saw */
-        if (adr & (CFIDEV_BUSWIDTH-1))
+        if (adr & (map_bankwidth(map)-1))
             return -EINVAL;
 
-        wbufsize = CFIDEV_INTERLEAVE << cfi->cfiq->MaxBufWriteSize;
+        wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
         adr += chip->start;
        cmd_adr = adr & ~(wbufsize-1);
        
@@ -476,21 +449,21 @@ static inline int do_write_buffer(struct map_info *map, struct flchip *chip,
                
        case FL_CFI_QUERY:
        case FL_JEDEC_QUERY:
-               cfi_write(map, CMD(0x70), cmd_adr);
+               map_write(map, CMD(0x70), cmd_adr);
                 chip->state = FL_STATUS;
 #ifdef DEBUG_CFI_FEATURES
-        printk("%s: 1 status[%x]\n", __FUNCTION__, cfi_read(map, cmd_adr));
+        printk("%s: 1 status[%x]\n", __FUNCTION__, map_read(map, cmd_adr));
 #endif
 
        case FL_STATUS:
-               status = cfi_read(map, cmd_adr);
-               if ((status & status_OK) == status_OK)
+               status = map_read(map, cmd_adr);
+               if (map_word_andequal(map, status, status_OK, status_OK))
                        break;
                /* Urgh. Chip not yet ready to talk to us. */
                if (time_after(jiffies, timeo)) {
                        spin_unlock_bh(chip->mutex);
-                        printk(KERN_ERR "waiting for chip to be ready timed out in buffer write Xstatus = %x, status = %x\n",
-                               status, cfi_read(map, cmd_adr));
+                        printk(KERN_ERR "waiting for chip to be ready timed out in buffer write Xstatus = %lx, status = %lx\n",
+                               status.x[0], map_read(map, cmd_adr).x[0]);
                        return -EIO;
                }
 
@@ -512,13 +485,13 @@ static inline int do_write_buffer(struct map_info *map, struct flchip *chip,
        }
 
        ENABLE_VPP(map);
-       cfi_write(map, CMD(0xe8), cmd_adr);
+       map_write(map, CMD(0xe8), cmd_adr);
        chip->state = FL_WRITING_TO_BUFFER;
 
        z = 0;
        for (;;) {
-               status = cfi_read(map, cmd_adr);
-               if ((status & status_OK) == status_OK)
+               status = map_read(map, cmd_adr);
+               if (map_word_andequal(map, status, status_OK, status_OK))
                        break;
 
                spin_unlock_bh(chip->mutex);
@@ -528,41 +501,26 @@ static inline int do_write_buffer(struct map_info *map, struct flchip *chip,
                if (++z > 100) {
                        /* Argh. Not ready for write to buffer */
                        DISABLE_VPP(map);
-                        cfi_write(map, CMD(0x70), cmd_adr);
+                        map_write(map, CMD(0x70), cmd_adr);
                        chip->state = FL_STATUS;
                        spin_unlock_bh(chip->mutex);
-                       printk(KERN_ERR "Chip not ready for buffer write. Xstatus = %x\n", status);
+                       printk(KERN_ERR "Chip not ready for buffer write. Xstatus = %lx\n", status.x[0]);
                        return -EIO;
                }
        }
 
        /* Write length of data to come */
-       cfi_write(map, CMD(len/CFIDEV_BUSWIDTH-1), cmd_adr );
+       map_write(map, CMD(len/map_bankwidth(map)-1), cmd_adr );
         
        /* Write data */
-       for (z = 0; z < len; z += CFIDEV_BUSWIDTH) {
-               if (cfi_buswidth_is_1()) {
-                       u8 *b = (u8 *)buf;
-
-                       map_write8 (map, *b++, adr+z);
-                       buf = (const u_char *)b;
-               } else if (cfi_buswidth_is_2()) {
-                       u16 *b = (u16 *)buf;
-
-                       map_write16 (map, *b++, adr+z);
-                       buf = (const u_char *)b;
-               } else if (cfi_buswidth_is_4()) {
-                       u32 *b = (u32 *)buf;
-
-                       map_write32 (map, *b++, adr+z);
-                       buf = (const u_char *)b;
-               } else {
-                       DISABLE_VPP(map);
-                       return -EINVAL;
-               }
+       for (z = 0; z < len;
+            z += map_bankwidth(map), buf += map_bankwidth(map)) {
+               map_word d;
+               d = map_word_load(map, buf);
+               map_write(map, d, adr+z);
        }
        /* GO GO GO */
-       cfi_write(map, CMD(0xd0), cmd_adr);
+       map_write(map, CMD(0xd0), cmd_adr);
        chip->state = FL_WRITING;
 
        spin_unlock_bh(chip->mutex);
@@ -584,16 +542,16 @@ static inline int do_write_buffer(struct map_info *map, struct flchip *chip,
                        continue;
                }
 
-               status = cfi_read(map, cmd_adr);
-               if ((status & status_OK) == status_OK)
+               status = map_read(map, cmd_adr);
+               if (map_word_andequal(map, status, status_OK, status_OK))
                        break;
 
                /* OK Still waiting */
                if (time_after(jiffies, timeo)) {
                         /* clear status */
-                        cfi_write(map, CMD(0x50), cmd_adr);
+                        map_write(map, CMD(0x50), cmd_adr);
                         /* put back into read status register mode */
-                        cfi_write(map, CMD(0x70), adr);
+                        map_write(map, CMD(0x70), adr);
                        chip->state = FL_STATUS;
                        DISABLE_VPP(map);
                        spin_unlock_bh(chip->mutex);
@@ -620,19 +578,18 @@ static inline int do_write_buffer(struct map_info *map, struct flchip *chip,
        chip->state = FL_STATUS;
 
         /* check for errors: 'lock bit', 'VPP', 'dead cell'/'unerased cell' or 'incorrect cmd' -- saw */
-        if ((status & CMD(0x02)) || (status & CMD(0x08)) ||
-            (status & CMD(0x10)) || (status & CMD(0x20))) {
+        if (map_word_bitsset(map, status, CMD(0x3a))) {
 #ifdef DEBUG_CFI_FEATURES
-            printk("%s: 2 status[%x]\n", __FUNCTION__, status);
+               printk("%s: 2 status[%lx]\n", __FUNCTION__, status.x[0]);
 #endif
-            /* clear status */
-            cfi_write(map, CMD(0x50), cmd_adr);
-            /* put back into read status register mode */
-            cfi_write(map, CMD(0x70), adr);
-            wake_up(&chip->wq);
-            spin_unlock_bh(chip->mutex);
-            return (status & CMD(0x02)) ? -EROFS : -EIO;
-        }
+               /* clear status */
+               map_write(map, CMD(0x50), cmd_adr);
+               /* put back into read status register mode */
+               map_write(map, CMD(0x70), adr);
+               wake_up(&chip->wq);
+               spin_unlock_bh(chip->mutex);
+               return map_word_bitsset(map, status, CMD(0x02)) ? -EROFS : -EIO;
+       }
        wake_up(&chip->wq);
        spin_unlock_bh(chip->mutex);
 
@@ -644,7 +601,7 @@ static int cfi_staa_write_buffers (struct mtd_info *mtd, loff_t to,
 {
        struct map_info *map = mtd->priv;
        struct cfi_private *cfi = map->fldrv_priv;
-       int wbufsize = CFIDEV_INTERLEAVE << cfi->cfiq->MaxBufWriteSize;
+       int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
        int ret = 0;
        int chipnum;
        unsigned long ofs;
@@ -657,7 +614,7 @@ static int cfi_staa_write_buffers (struct mtd_info *mtd, loff_t to,
        ofs = to  - (chipnum << cfi->chipshift);
 
 #ifdef DEBUG_CFI_FEATURES
-        printk("%s: CFIDEV_BUSWIDTH[%x]\n", __FUNCTION__, CFIDEV_BUSWIDTH);
+        printk("%s: map_bankwidth(map)[%x]\n", __FUNCTION__, map_bankwidth(map));
         printk("%s: chipnum[%x] wbufsize[%x]\n", __FUNCTION__, chipnum, wbufsize);
         printk("%s: ofs[%x] len[%x]\n", __FUNCTION__, ofs, len);
 #endif
@@ -700,7 +657,7 @@ static int cfi_staa_write_buffers (struct mtd_info *mtd, loff_t to,
 #define ECCBUF_DIV(x) ((x) & ~(ECCBUF_SIZE - 1))
 #define ECCBUF_MOD(x) ((x) &  (ECCBUF_SIZE - 1))
 static int
-cfi_staa_writev(struct mtd_info *mtd, const struct iovec *vecs,
+cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,
                unsigned long count, loff_t to, size_t *retlen)
 {
        unsigned long i;
@@ -769,7 +726,7 @@ write_error:
 static inline int do_erase_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
 {
        struct cfi_private *cfi = map->fldrv_priv;
-       __u32 status, status_OK;
+       map_word status, status_OK;
        unsigned long timeo;
        int retries = 3;
        DECLARE_WAITQUEUE(wait, current);
@@ -789,12 +746,12 @@ retry:
        case FL_CFI_QUERY:
        case FL_JEDEC_QUERY:
        case FL_READY:
-               cfi_write(map, CMD(0x70), adr);
+               map_write(map, CMD(0x70), adr);
                chip->state = FL_STATUS;
 
        case FL_STATUS:
-               status = cfi_read(map, adr);
-               if ((status & status_OK) == status_OK)
+               status = map_read(map, adr);
+               if (map_word_andequal(map, status, status_OK, status_OK))
                        break;
                
                /* Urgh. Chip not yet ready to talk to us. */
@@ -823,11 +780,11 @@ retry:
 
        ENABLE_VPP(map);
        /* Clear the status register first */
-       cfi_write(map, CMD(0x50), adr);
+       map_write(map, CMD(0x50), adr);
 
        /* Now erase */
-       cfi_write(map, CMD(0x20), adr);
-       cfi_write(map, CMD(0xD0), adr);
+       map_write(map, CMD(0x20), adr);
+       map_write(map, CMD(0xD0), adr);
        chip->state = FL_ERASING;
        
        spin_unlock_bh(chip->mutex);
@@ -851,15 +808,15 @@ retry:
                        continue;
                }
 
-               status = cfi_read(map, adr);
-               if ((status & status_OK) == status_OK)
+               status = map_read(map, adr);
+               if (map_word_andequal(map, status, status_OK, status_OK))
                        break;
                
                /* OK Still waiting */
                if (time_after(jiffies, timeo)) {
-                       cfi_write(map, CMD(0x70), adr);
+                       map_write(map, CMD(0x70), adr);
                        chip->state = FL_STATUS;
-                       printk(KERN_ERR "waiting for erase to complete timed out. Xstatus = %x, status = %x.\n", status, cfi_read(map, adr));
+                       printk(KERN_ERR "waiting for erase to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
                        DISABLE_VPP(map);
                        spin_unlock_bh(chip->mutex);
                        return -EIO;
@@ -875,43 +832,46 @@ retry:
        ret = 0;
 
        /* We've broken this before. It doesn't hurt to be safe */
-       cfi_write(map, CMD(0x70), adr);
+       map_write(map, CMD(0x70), adr);
        chip->state = FL_STATUS;
-       status = cfi_read(map, adr);
+       status = map_read(map, adr);
 
        /* check for lock bit */
-       if (status & CMD(0x3a)) {
-               unsigned char chipstatus = status;
-               if (status != CMD(status & 0xff)) {
-                       int i;
-                       for (i = 1; i<CFIDEV_INTERLEAVE; i++) {
-                                     chipstatus |= status >> (cfi->device_type * 8);
+       if (map_word_bitsset(map, status, CMD(0x3a))) {
+               unsigned char chipstatus = status.x[0];
+               if (!map_word_equal(map, status, CMD(chipstatus))) {
+                       int i, w;
+                       for (w=0; w<map_words(map); w++) {
+                               for (i = 0; i<cfi_interleave(cfi); i++) {
+                                       chipstatus |= status.x[w] >> (cfi->device_type * 8);
+                               }
                        }
-                       printk(KERN_WARNING "Status is not identical for all chips: 0x%x. Merging to give 0x%02x\n", status, chipstatus);
+                       printk(KERN_WARNING "Status is not identical for all chips: 0x%lx. Merging to give 0x%02x\n",
+                              status.x[0], chipstatus);
                }
                /* Reset the error bits */
-               cfi_write(map, CMD(0x50), adr);
-               cfi_write(map, CMD(0x70), adr);
+               map_write(map, CMD(0x50), adr);
+               map_write(map, CMD(0x70), adr);
                
                if ((chipstatus & 0x30) == 0x30) {
-                       printk(KERN_NOTICE "Chip reports improper command sequence: status 0x%x\n", status);
+                       printk(KERN_NOTICE "Chip reports improper command sequence: status 0x%x\n", chipstatus);
                        ret = -EIO;
                } else if (chipstatus & 0x02) {
                        /* Protection bit set */
                        ret = -EROFS;
                } else if (chipstatus & 0x8) {
                        /* Voltage */
-                       printk(KERN_WARNING "Chip reports voltage low on erase: status 0x%x\n", status);
+                       printk(KERN_WARNING "Chip reports voltage low on erase: status 0x%x\n", chipstatus);
                        ret = -EIO;
                } else if (chipstatus & 0x20) {
                        if (retries--) {
-                               printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x. Retrying...\n", adr, status);
+                               printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x. Retrying...\n", adr, chipstatus);
                                timeo = jiffies + HZ;
                                chip->state = FL_STATUS;
                                spin_unlock_bh(chip->mutex);
                                goto retry;
                        }
-                       printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x\n", adr, status);
+                       printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x\n", adr, chipstatus);
                        ret = -EIO;
                }
        }
@@ -1006,8 +966,7 @@ int cfi_staa_erase_varsize(struct mtd_info *mtd, struct erase_info *instr)
        }
                
        instr->state = MTD_ERASE_DONE;
-       if (instr->callback)
-               instr->callback(instr);
+       mtd_erase_callback(instr);
        
        return 0;
 }
@@ -1072,7 +1031,7 @@ static void cfi_staa_sync (struct mtd_info *mtd)
 static inline int do_lock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
 {
        struct cfi_private *cfi = map->fldrv_priv;
-       __u32 status, status_OK;
+       map_word status, status_OK;
        unsigned long timeo = jiffies + HZ;
        DECLARE_WAITQUEUE(wait, current);
 
@@ -1090,12 +1049,12 @@ retry:
        case FL_CFI_QUERY:
        case FL_JEDEC_QUERY:
        case FL_READY:
-               cfi_write(map, CMD(0x70), adr);
+               map_write(map, CMD(0x70), adr);
                chip->state = FL_STATUS;
 
        case FL_STATUS:
-               status = cfi_read(map, adr);
-               if ((status & status_OK) == status_OK
+               status = map_read(map, adr);
+               if (map_word_andequal(map, status, status_OK, status_OK)
                        break;
                
                /* Urgh. Chip not yet ready to talk to us. */
@@ -1123,8 +1082,8 @@ retry:
        }
 
        ENABLE_VPP(map);
-       cfi_write(map, CMD(0x60), adr);
-       cfi_write(map, CMD(0x01), adr);
+       map_write(map, CMD(0x60), adr);
+       map_write(map, CMD(0x01), adr);
        chip->state = FL_LOCKING;
        
        spin_unlock_bh(chip->mutex);
@@ -1137,15 +1096,15 @@ retry:
        timeo = jiffies + (HZ*2);
        for (;;) {
 
-               status = cfi_read(map, adr);
-               if ((status & status_OK) == status_OK)
+               status = map_read(map, adr);
+               if (map_word_andequal(map, status, status_OK, status_OK))
                        break;
                
                /* OK Still waiting */
                if (time_after(jiffies, timeo)) {
-                       cfi_write(map, CMD(0x70), adr);
+                       map_write(map, CMD(0x70), adr);
                        chip->state = FL_STATUS;
-                       printk(KERN_ERR "waiting for lock to complete timed out. Xstatus = %x, status = %x.\n", status, cfi_read(map, adr));
+                       printk(KERN_ERR "waiting for lock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
                        DISABLE_VPP(map);
                        spin_unlock_bh(chip->mutex);
                        return -EIO;
@@ -1221,7 +1180,7 @@ static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, size_t len)
 static inline int do_unlock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
 {
        struct cfi_private *cfi = map->fldrv_priv;
-       __u32 status, status_OK;
+       map_word status, status_OK;
        unsigned long timeo = jiffies + HZ;
        DECLARE_WAITQUEUE(wait, current);
 
@@ -1239,12 +1198,12 @@ retry:
        case FL_CFI_QUERY:
        case FL_JEDEC_QUERY:
        case FL_READY:
-               cfi_write(map, CMD(0x70), adr);
+               map_write(map, CMD(0x70), adr);
                chip->state = FL_STATUS;
 
        case FL_STATUS:
-               status = cfi_read(map, adr);
-               if ((status & status_OK) == status_OK)
+               status = map_read(map, adr);
+               if (map_word_andequal(map, status, status_OK, status_OK))
                        break;
                
                /* Urgh. Chip not yet ready to talk to us. */
@@ -1272,8 +1231,8 @@ retry:
        }
 
        ENABLE_VPP(map);
-       cfi_write(map, CMD(0x60), adr);
-       cfi_write(map, CMD(0xD0), adr);
+       map_write(map, CMD(0x60), adr);
+       map_write(map, CMD(0xD0), adr);
        chip->state = FL_UNLOCKING;
        
        spin_unlock_bh(chip->mutex);
@@ -1286,15 +1245,15 @@ retry:
        timeo = jiffies + (HZ*2);
        for (;;) {
 
-               status = cfi_read(map, adr);
-               if ((status & status_OK) == status_OK)
+               status = map_read(map, adr);
+               if (map_word_andequal(map, status, status_OK, status_OK))
                        break;
                
                /* OK Still waiting */
                if (time_after(jiffies, timeo)) {
-                       cfi_write(map, CMD(0x70), adr);
+                       map_write(map, CMD(0x70), adr);
                        chip->state = FL_STATUS;
-                       printk(KERN_ERR "waiting for unlock to complete timed out. Xstatus = %x, status = %x.\n", status, cfi_read(map, adr));
+                       printk(KERN_ERR "waiting for unlock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
                        DISABLE_VPP(map);
                        spin_unlock_bh(chip->mutex);
                        return -EIO;
@@ -1423,7 +1382,7 @@ static void cfi_staa_resume(struct mtd_info *mtd)
                
                /* Go to known state. Chip may have been power cycled */
                if (chip->state == FL_PM_SUSPENDED) {
-                       cfi_write(map, CMD(0xFF), 0);
+                       map_write(map, CMD(0xFF), 0);
                        chip->state = FL_READY;
                        wake_up(&chip->wq);
                }
@@ -1440,11 +1399,6 @@ static void cfi_staa_destroy(struct mtd_info *mtd)
        kfree(cfi);
 }
 
-#if LINUX_VERSION_CODE < 0x20212 && defined(MODULE)
-#define cfi_staa_init init_module
-#define cfi_staa_exit cleanup_module
-#endif
-
 static char im_name[]="cfi_cmdset_0020";
 
 int __init cfi_staa_init(void)