linux/drivers/mtd/chips/cfi_cmdset_0020.c
<<
>>
Prefs
   1/*
   2 * Common Flash Interface support:
   3 *   ST Advanced Architecture Command Set (ID 0x0020)
   4 *
   5 * (C) 2000 Red Hat. GPL'd
   6 *
   7 * 10/10/2000   Nicolas Pitre <nico@fluxnic.net>
   8 *      - completely revamped method functions so they are aware and
   9 *        independent of the flash geometry (buswidth, interleave, etc.)
  10 *      - scalability vs code size is completely set at compile-time
  11 *        (see include/linux/mtd/cfi.h for selection)
  12 *      - optimized write buffer method
  13 * 06/21/2002   Joern Engel <joern@wh.fh-wedel.de> and others
  14 *      - modified Intel Command Set 0x0001 to support ST Advanced Architecture
  15 *        (command set 0x0020)
  16 *      - added a writev function
  17 * 07/13/2005   Joern Engel <joern@wh.fh-wedel.de>
  18 *      - Plugged memory leak in cfi_staa_writev().
  19 */
  20
  21#include <linux/module.h>
  22#include <linux/types.h>
  23#include <linux/kernel.h>
  24#include <linux/sched.h>
  25#include <asm/io.h>
  26#include <asm/byteorder.h>
  27
  28#include <linux/errno.h>
  29#include <linux/slab.h>
  30#include <linux/delay.h>
  31#include <linux/interrupt.h>
  32#include <linux/mtd/map.h>
  33#include <linux/mtd/cfi.h>
  34#include <linux/mtd/mtd.h>
  35
  36
  37static int cfi_staa_read(struct mtd_info *, loff_t, size_t, size_t *, u_char *);
  38static int cfi_staa_write_buffers(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
  39static int cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,
  40                unsigned long count, loff_t to, size_t *retlen);
  41static int cfi_staa_erase_varsize(struct mtd_info *, struct erase_info *);
  42static void cfi_staa_sync (struct mtd_info *);
  43static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
  44static int cfi_staa_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
  45static int cfi_staa_suspend (struct mtd_info *);
  46static void cfi_staa_resume (struct mtd_info *);
  47
  48static void cfi_staa_destroy(struct mtd_info *);
  49
  50struct mtd_info *cfi_cmdset_0020(struct map_info *, int);
  51
  52static struct mtd_info *cfi_staa_setup (struct map_info *);
  53
  54static struct mtd_chip_driver cfi_staa_chipdrv = {
  55        .probe          = NULL, /* Not usable directly */
  56        .destroy        = cfi_staa_destroy,
  57        .name           = "cfi_cmdset_0020",
  58        .module         = THIS_MODULE
  59};
  60
  61/* #define DEBUG_LOCK_BITS */
  62//#define DEBUG_CFI_FEATURES
  63
  64#ifdef DEBUG_CFI_FEATURES
  65static void cfi_tell_features(struct cfi_pri_intelext *extp)
  66{
  67        int i;
  68        printk("  Feature/Command Support: %4.4X\n", extp->FeatureSupport);
  69        printk("     - Chip Erase:         %s\n", extp->FeatureSupport&1?"supported":"unsupported");
  70        printk("     - Suspend Erase:      %s\n", extp->FeatureSupport&2?"supported":"unsupported");
  71        printk("     - Suspend Program:    %s\n", extp->FeatureSupport&4?"supported":"unsupported");
  72        printk("     - Legacy Lock/Unlock: %s\n", extp->FeatureSupport&8?"supported":"unsupported");
  73        printk("     - Queued Erase:       %s\n", extp->FeatureSupport&16?"supported":"unsupported");
  74        printk("     - Instant block lock: %s\n", extp->FeatureSupport&32?"supported":"unsupported");
  75        printk("     - Protection Bits:    %s\n", extp->FeatureSupport&64?"supported":"unsupported");
  76        printk("     - Page-mode read:     %s\n", extp->FeatureSupport&128?"supported":"unsupported");
  77        printk("     - Synchronous read:   %s\n", extp->FeatureSupport&256?"supported":"unsupported");
  78        for (i=9; i<32; i++) {
  79                if (extp->FeatureSupport & (1<<i))
  80                        printk("     - Unknown Bit %X:      supported\n", i);
  81        }
  82
  83        printk("  Supported functions after Suspend: %2.2X\n", extp->SuspendCmdSupport);
  84        printk("     - Program after Erase Suspend: %s\n", extp->SuspendCmdSupport&1?"supported":"unsupported");
  85        for (i=1; i<8; i++) {
  86                if (extp->SuspendCmdSupport & (1<<i))
  87                        printk("     - Unknown Bit %X:               supported\n", i);
  88        }
  89
  90        printk("  Block Status Register Mask: %4.4X\n", extp->BlkStatusRegMask);
  91        printk("     - Lock Bit Active:      %s\n", extp->BlkStatusRegMask&1?"yes":"no");
  92        printk("     - Valid Bit Active:     %s\n", extp->BlkStatusRegMask&2?"yes":"no");
  93        for (i=2; i<16; i++) {
  94                if (extp->BlkStatusRegMask & (1<<i))
  95                        printk("     - Unknown Bit %X Active: yes\n",i);
  96        }
  97
  98        printk("  Vcc Logic Supply Optimum Program/Erase Voltage: %d.%d V\n",
  99               extp->VccOptimal >> 8, extp->VccOptimal & 0xf);
 100        if (extp->VppOptimal)
 101                printk("  Vpp Programming Supply Optimum Program/Erase Voltage: %d.%d V\n",
 102                       extp->VppOptimal >> 8, extp->VppOptimal & 0xf);
 103}
 104#endif
 105
 106/* This routine is made available to other mtd code via
 107 * inter_module_register.  It must only be accessed through
 108 * inter_module_get which will bump the use count of this module.  The
 109 * addresses passed back in cfi are valid as long as the use count of
 110 * this module is non-zero, i.e. between inter_module_get and
 111 * inter_module_put.  Keith Owens <kaos@ocs.com.au> 29 Oct 2000.
 112 */
 113struct mtd_info *cfi_cmdset_0020(struct map_info *map, int primary)
 114{
 115        struct cfi_private *cfi = map->fldrv_priv;
 116        int i;
 117
 118        if (cfi->cfi_mode) {
 119                /*
 120                 * It's a real CFI chip, not one for which the probe
 121                 * routine faked a CFI structure. So we read the feature
 122                 * table from it.
 123                 */
 124                __u16 adr = primary?cfi->cfiq->P_ADR:cfi->cfiq->A_ADR;
 125                struct cfi_pri_intelext *extp;
 126
 127                extp = (struct cfi_pri_intelext*)cfi_read_pri(map, adr, sizeof(*extp), "ST Microelectronics");
 128                if (!extp)
 129                        return NULL;
 130
 131                if (extp->MajorVersion != '1' ||
 132                    (extp->MinorVersion < '0' || extp->MinorVersion > '3')) {
 133                        printk(KERN_ERR "  Unknown ST Microelectronics"
 134                               " Extended Query version %c.%c.\n",
 135                               extp->MajorVersion, extp->MinorVersion);
 136                        kfree(extp);
 137                        return NULL;
 138                }
 139
 140                /* Do some byteswapping if necessary */
 141                extp->FeatureSupport = cfi32_to_cpu(map, extp->FeatureSupport);
 142                extp->BlkStatusRegMask = cfi32_to_cpu(map,
 143                                                extp->BlkStatusRegMask);
 144
 145#ifdef DEBUG_CFI_FEATURES
 146                /* Tell the user about it in lots of lovely detail */
 147                cfi_tell_features(extp);
 148#endif
 149
 150                /* Install our own private info structure */
 151                cfi->cmdset_priv = extp;
 152        }
 153
 154        for (i=0; i< cfi->numchips; i++) {
 155                cfi->chips[i].word_write_time = 128;
 156                cfi->chips[i].buffer_write_time = 128;
 157                cfi->chips[i].erase_time = 1024;
 158                cfi->chips[i].ref_point_counter = 0;
 159                init_waitqueue_head(&(cfi->chips[i].wq));
 160        }
 161
 162        return cfi_staa_setup(map);
 163}
 164EXPORT_SYMBOL_GPL(cfi_cmdset_0020);
 165
 166static struct mtd_info *cfi_staa_setup(struct map_info *map)
 167{
 168        struct cfi_private *cfi = map->fldrv_priv;
 169        struct mtd_info *mtd;
 170        unsigned long offset = 0;
 171        int i,j;
 172        unsigned long devsize = (1<<cfi->cfiq->DevSize) * cfi->interleave;
 173
 174        mtd = kzalloc(sizeof(*mtd), GFP_KERNEL);
 175        //printk(KERN_DEBUG "number of CFI chips: %d\n", cfi->numchips);
 176
 177        if (!mtd) {
 178                kfree(cfi->cmdset_priv);
 179                return NULL;
 180        }
 181
 182        mtd->priv = map;
 183        mtd->type = MTD_NORFLASH;
 184        mtd->size = devsize * cfi->numchips;
 185
 186        mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;
 187        mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info)
 188                        * mtd->numeraseregions, GFP_KERNEL);
 189        if (!mtd->eraseregions) {
 190                kfree(cfi->cmdset_priv);
 191                kfree(mtd);
 192                return NULL;
 193        }
 194
 195        for (i=0; i<cfi->cfiq->NumEraseRegions; i++) {
 196                unsigned long ernum, ersize;
 197                ersize = ((cfi->cfiq->EraseRegionInfo[i] >> 8) & ~0xff) * cfi->interleave;
 198                ernum = (cfi->cfiq->EraseRegionInfo[i] & 0xffff) + 1;
 199
 200                if (mtd->erasesize < ersize) {
 201                        mtd->erasesize = ersize;
 202                }
 203                for (j=0; j<cfi->numchips; j++) {
 204                        mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;
 205                        mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;
 206                        mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;
 207                }
 208                offset += (ersize * ernum);
 209                }
 210
 211                if (offset != devsize) {
 212                        /* Argh */
 213                        printk(KERN_WARNING "Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize);
 214                        kfree(mtd->eraseregions);
 215                        kfree(cfi->cmdset_priv);
 216                        kfree(mtd);
 217                        return NULL;
 218                }
 219
 220                for (i=0; i<mtd->numeraseregions;i++){
 221                        printk(KERN_DEBUG "%d: offset=0x%llx,size=0x%x,blocks=%d\n",
 222                               i, (unsigned long long)mtd->eraseregions[i].offset,
 223                               mtd->eraseregions[i].erasesize,
 224                               mtd->eraseregions[i].numblocks);
 225                }
 226
 227        /* Also select the correct geometry setup too */
 228        mtd->_erase = cfi_staa_erase_varsize;
 229        mtd->_read = cfi_staa_read;
 230        mtd->_write = cfi_staa_write_buffers;
 231        mtd->_writev = cfi_staa_writev;
 232        mtd->_sync = cfi_staa_sync;
 233        mtd->_lock = cfi_staa_lock;
 234        mtd->_unlock = cfi_staa_unlock;
 235        mtd->_suspend = cfi_staa_suspend;
 236        mtd->_resume = cfi_staa_resume;
 237        mtd->flags = MTD_CAP_NORFLASH & ~MTD_BIT_WRITEABLE;
 238        mtd->writesize = 8; /* FIXME: Should be 0 for STMicro flashes w/out ECC */
 239        mtd->writebufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
 240        map->fldrv = &cfi_staa_chipdrv;
 241        __module_get(THIS_MODULE);
 242        mtd->name = map->name;
 243        return mtd;
 244}
 245
 246
 247static inline int do_read_onechip(struct map_info *map, struct flchip *chip, loff_t adr, size_t len, u_char *buf)
 248{
 249        map_word status, status_OK;
 250        unsigned long timeo;
 251        DECLARE_WAITQUEUE(wait, current);
 252        int suspended = 0;
 253        unsigned long cmd_addr;
 254        struct cfi_private *cfi = map->fldrv_priv;
 255
 256        adr += chip->start;
 257
 258        /* Ensure cmd read/writes are aligned. */
 259        cmd_addr = adr & ~(map_bankwidth(map)-1);
 260
 261        /* Let's determine this according to the interleave only once */
 262        status_OK = CMD(0x80);
 263
 264        timeo = jiffies + HZ;
 265 retry:
 266        mutex_lock(&chip->mutex);
 267
 268        /* Check that the chip's ready to talk to us.
 269         * If it's in FL_ERASING state, suspend it and make it talk now.
 270         */
 271        switch (chip->state) {
 272        case FL_ERASING:
 273                if (!(((struct cfi_pri_intelext *)cfi->cmdset_priv)->FeatureSupport & 2))
 274                        goto sleep; /* We don't support erase suspend */
 275
 276                map_write (map, CMD(0xb0), cmd_addr);
 277                /* If the flash has finished erasing, then 'erase suspend'
 278                 * appears to make some (28F320) flash devices switch to
 279                 * 'read' mode.  Make sure that we switch to 'read status'
 280                 * mode so we get the right data. --rmk
 281                 */
 282                map_write(map, CMD(0x70), cmd_addr);
 283                chip->oldstate = FL_ERASING;
 284                chip->state = FL_ERASE_SUSPENDING;
 285                //              printk("Erase suspending at 0x%lx\n", cmd_addr);
 286                for (;;) {
 287                        status = map_read(map, cmd_addr);
 288                        if (map_word_andequal(map, status, status_OK, status_OK))
 289                                break;
 290
 291                        if (time_after(jiffies, timeo)) {
 292                                /* Urgh */
 293                                map_write(map, CMD(0xd0), cmd_addr);
 294                                /* make sure we're in 'read status' mode */
 295                                map_write(map, CMD(0x70), cmd_addr);
 296                                chip->state = FL_ERASING;
 297                                wake_up(&chip->wq);
 298                                mutex_unlock(&chip->mutex);
 299                                printk(KERN_ERR "Chip not ready after erase "
 300                                       "suspended: status = 0x%lx\n", status.x[0]);
 301                                return -EIO;
 302                        }
 303
 304                        mutex_unlock(&chip->mutex);
 305                        cfi_udelay(1);
 306                        mutex_lock(&chip->mutex);
 307                }
 308
 309                suspended = 1;
 310                map_write(map, CMD(0xff), cmd_addr);
 311                chip->state = FL_READY;
 312                break;
 313
 314#if 0
 315        case FL_WRITING:
 316                /* Not quite yet */
 317#endif
 318
 319        case FL_READY:
 320                break;
 321
 322        case FL_CFI_QUERY:
 323        case FL_JEDEC_QUERY:
 324                map_write(map, CMD(0x70), cmd_addr);
 325                chip->state = FL_STATUS;
 326
 327        case FL_STATUS:
 328                status = map_read(map, cmd_addr);
 329                if (map_word_andequal(map, status, status_OK, status_OK)) {
 330                        map_write(map, CMD(0xff), cmd_addr);
 331                        chip->state = FL_READY;
 332                        break;
 333                }
 334
 335                /* Urgh. Chip not yet ready to talk to us. */
 336                if (time_after(jiffies, timeo)) {
 337                        mutex_unlock(&chip->mutex);
 338                        printk(KERN_ERR "waiting for chip to be ready timed out in read. WSM status = %lx\n", status.x[0]);
 339                        return -EIO;
 340                }
 341
 342                /* Latency issues. Drop the lock, wait a while and retry */
 343                mutex_unlock(&chip->mutex);
 344                cfi_udelay(1);
 345                goto retry;
 346
 347        default:
 348        sleep:
 349                /* Stick ourselves on a wait queue to be woken when
 350                   someone changes the status */
 351                set_current_state(TASK_UNINTERRUPTIBLE);
 352                add_wait_queue(&chip->wq, &wait);
 353                mutex_unlock(&chip->mutex);
 354                schedule();
 355                remove_wait_queue(&chip->wq, &wait);
 356                timeo = jiffies + HZ;
 357                goto retry;
 358        }
 359
 360        map_copy_from(map, buf, adr, len);
 361
 362        if (suspended) {
 363                chip->state = chip->oldstate;
 364                /* What if one interleaved chip has finished and the
 365                   other hasn't? The old code would leave the finished
 366                   one in READY mode. That's bad, and caused -EROFS
 367                   errors to be returned from do_erase_oneblock because
 368                   that's the only bit it checked for at the time.
 369                   As the state machine appears to explicitly allow
 370                   sending the 0x70 (Read Status) command to an erasing
 371                   chip and expecting it to be ignored, that's what we
 372                   do. */
 373                map_write(map, CMD(0xd0), cmd_addr);
 374                map_write(map, CMD(0x70), cmd_addr);
 375        }
 376
 377        wake_up(&chip->wq);
 378        mutex_unlock(&chip->mutex);
 379        return 0;
 380}
 381
 382static int cfi_staa_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
 383{
 384        struct map_info *map = mtd->priv;
 385        struct cfi_private *cfi = map->fldrv_priv;
 386        unsigned long ofs;
 387        int chipnum;
 388        int ret = 0;
 389
 390        /* ofs: offset within the first chip that the first read should start */
 391        chipnum = (from >> cfi->chipshift);
 392        ofs = from - (chipnum <<  cfi->chipshift);
 393
 394        while (len) {
 395                unsigned long thislen;
 396
 397                if (chipnum >= cfi->numchips)
 398                        break;
 399
 400                if ((len + ofs -1) >> cfi->chipshift)
 401                        thislen = (1<<cfi->chipshift) - ofs;
 402                else
 403                        thislen = len;
 404
 405                ret = do_read_onechip(map, &cfi->chips[chipnum], ofs, thislen, buf);
 406                if (ret)
 407                        break;
 408
 409                *retlen += thislen;
 410                len -= thislen;
 411                buf += thislen;
 412
 413                ofs = 0;
 414                chipnum++;
 415        }
 416        return ret;
 417}
 418
 419static inline int do_write_buffer(struct map_info *map, struct flchip *chip,
 420                                  unsigned long adr, const u_char *buf, int len)
 421{
 422        struct cfi_private *cfi = map->fldrv_priv;
 423        map_word status, status_OK;
 424        unsigned long cmd_adr, timeo;
 425        DECLARE_WAITQUEUE(wait, current);
 426        int wbufsize, z;
 427
 428        /* M58LW064A requires bus alignment for buffer wriets -- saw */
 429        if (adr & (map_bankwidth(map)-1))
 430            return -EINVAL;
 431
 432        wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
 433        adr += chip->start;
 434        cmd_adr = adr & ~(wbufsize-1);
 435
 436        /* Let's determine this according to the interleave only once */
 437        status_OK = CMD(0x80);
 438
 439        timeo = jiffies + HZ;
 440 retry:
 441
 442#ifdef DEBUG_CFI_FEATURES
 443       printk("%s: chip->state[%d]\n", __func__, chip->state);
 444#endif
 445        mutex_lock(&chip->mutex);
 446
 447        /* Check that the chip's ready to talk to us.
 448         * Later, we can actually think about interrupting it
 449         * if it's in FL_ERASING state.
 450         * Not just yet, though.
 451         */
 452        switch (chip->state) {
 453        case FL_READY:
 454                break;
 455
 456        case FL_CFI_QUERY:
 457        case FL_JEDEC_QUERY:
 458                map_write(map, CMD(0x70), cmd_adr);
 459                chip->state = FL_STATUS;
 460#ifdef DEBUG_CFI_FEATURES
 461        printk("%s: 1 status[%x]\n", __func__, map_read(map, cmd_adr));
 462#endif
 463
 464        case FL_STATUS:
 465                status = map_read(map, cmd_adr);
 466                if (map_word_andequal(map, status, status_OK, status_OK))
 467                        break;
 468                /* Urgh. Chip not yet ready to talk to us. */
 469                if (time_after(jiffies, timeo)) {
 470                        mutex_unlock(&chip->mutex);
 471                        printk(KERN_ERR "waiting for chip to be ready timed out in buffer write Xstatus = %lx, status = %lx\n",
 472                               status.x[0], map_read(map, cmd_adr).x[0]);
 473                        return -EIO;
 474                }
 475
 476                /* Latency issues. Drop the lock, wait a while and retry */
 477                mutex_unlock(&chip->mutex);
 478                cfi_udelay(1);
 479                goto retry;
 480
 481        default:
 482                /* Stick ourselves on a wait queue to be woken when
 483                   someone changes the status */
 484                set_current_state(TASK_UNINTERRUPTIBLE);
 485                add_wait_queue(&chip->wq, &wait);
 486                mutex_unlock(&chip->mutex);
 487                schedule();
 488                remove_wait_queue(&chip->wq, &wait);
 489                timeo = jiffies + HZ;
 490                goto retry;
 491        }
 492
 493        ENABLE_VPP(map);
 494        map_write(map, CMD(0xe8), cmd_adr);
 495        chip->state = FL_WRITING_TO_BUFFER;
 496
 497        z = 0;
 498        for (;;) {
 499                status = map_read(map, cmd_adr);
 500                if (map_word_andequal(map, status, status_OK, status_OK))
 501                        break;
 502
 503                mutex_unlock(&chip->mutex);
 504                cfi_udelay(1);
 505                mutex_lock(&chip->mutex);
 506
 507                if (++z > 100) {
 508                        /* Argh. Not ready for write to buffer */
 509                        DISABLE_VPP(map);
 510                        map_write(map, CMD(0x70), cmd_adr);
 511                        chip->state = FL_STATUS;
 512                        mutex_unlock(&chip->mutex);
 513                        printk(KERN_ERR "Chip not ready for buffer write. Xstatus = %lx\n", status.x[0]);
 514                        return -EIO;
 515                }
 516        }
 517
 518        /* Write length of data to come */
 519        map_write(map, CMD(len/map_bankwidth(map)-1), cmd_adr );
 520
 521        /* Write data */
 522        for (z = 0; z < len;
 523             z += map_bankwidth(map), buf += map_bankwidth(map)) {
 524                map_word d;
 525                d = map_word_load(map, buf);
 526                map_write(map, d, adr+z);
 527        }
 528        /* GO GO GO */
 529        map_write(map, CMD(0xd0), cmd_adr);
 530        chip->state = FL_WRITING;
 531
 532        mutex_unlock(&chip->mutex);
 533        cfi_udelay(chip->buffer_write_time);
 534        mutex_lock(&chip->mutex);
 535
 536        timeo = jiffies + (HZ/2);
 537        z = 0;
 538        for (;;) {
 539                if (chip->state != FL_WRITING) {
 540                        /* Someone's suspended the write. Sleep */
 541                        set_current_state(TASK_UNINTERRUPTIBLE);
 542                        add_wait_queue(&chip->wq, &wait);
 543                        mutex_unlock(&chip->mutex);
 544                        schedule();
 545                        remove_wait_queue(&chip->wq, &wait);
 546                        timeo = jiffies + (HZ / 2); /* FIXME */
 547                        mutex_lock(&chip->mutex);
 548                        continue;
 549                }
 550
 551                status = map_read(map, cmd_adr);
 552                if (map_word_andequal(map, status, status_OK, status_OK))
 553                        break;
 554
 555                /* OK Still waiting */
 556                if (time_after(jiffies, timeo)) {
 557                        /* clear status */
 558                        map_write(map, CMD(0x50), cmd_adr);
 559                        /* put back into read status register mode */
 560                        map_write(map, CMD(0x70), adr);
 561                        chip->state = FL_STATUS;
 562                        DISABLE_VPP(map);
 563                        mutex_unlock(&chip->mutex);
 564                        printk(KERN_ERR "waiting for chip to be ready timed out in bufwrite\n");
 565                        return -EIO;
 566                }
 567
 568                /* Latency issues. Drop the lock, wait a while and retry */
 569                mutex_unlock(&chip->mutex);
 570                cfi_udelay(1);
 571                z++;
 572                mutex_lock(&chip->mutex);
 573        }
 574        if (!z) {
 575                chip->buffer_write_time--;
 576                if (!chip->buffer_write_time)
 577                        chip->buffer_write_time++;
 578        }
 579        if (z > 1)
 580                chip->buffer_write_time++;
 581
 582        /* Done and happy. */
 583        DISABLE_VPP(map);
 584        chip->state = FL_STATUS;
 585
 586        /* check for errors: 'lock bit', 'VPP', 'dead cell'/'unerased cell' or 'incorrect cmd' -- saw */
 587        if (map_word_bitsset(map, status, CMD(0x3a))) {
 588#ifdef DEBUG_CFI_FEATURES
 589                printk("%s: 2 status[%lx]\n", __func__, status.x[0]);
 590#endif
 591                /* clear status */
 592                map_write(map, CMD(0x50), cmd_adr);
 593                /* put back into read status register mode */
 594                map_write(map, CMD(0x70), adr);
 595                wake_up(&chip->wq);
 596                mutex_unlock(&chip->mutex);
 597                return map_word_bitsset(map, status, CMD(0x02)) ? -EROFS : -EIO;
 598        }
 599        wake_up(&chip->wq);
 600        mutex_unlock(&chip->mutex);
 601
 602        return 0;
 603}
 604
 605static int cfi_staa_write_buffers (struct mtd_info *mtd, loff_t to,
 606                                       size_t len, size_t *retlen, const u_char *buf)
 607{
 608        struct map_info *map = mtd->priv;
 609        struct cfi_private *cfi = map->fldrv_priv;
 610        int wbufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
 611        int ret = 0;
 612        int chipnum;
 613        unsigned long ofs;
 614
 615        chipnum = to >> cfi->chipshift;
 616        ofs = to  - (chipnum << cfi->chipshift);
 617
 618#ifdef DEBUG_CFI_FEATURES
 619        printk("%s: map_bankwidth(map)[%x]\n", __func__, map_bankwidth(map));
 620        printk("%s: chipnum[%x] wbufsize[%x]\n", __func__, chipnum, wbufsize);
 621        printk("%s: ofs[%x] len[%x]\n", __func__, ofs, len);
 622#endif
 623
 624        /* Write buffer is worth it only if more than one word to write... */
 625        while (len > 0) {
 626                /* We must not cross write block boundaries */
 627                int size = wbufsize - (ofs & (wbufsize-1));
 628
 629                if (size > len)
 630                    size = len;
 631
 632                ret = do_write_buffer(map, &cfi->chips[chipnum],
 633                                      ofs, buf, size);
 634                if (ret)
 635                        return ret;
 636
 637                ofs += size;
 638                buf += size;
 639                (*retlen) += size;
 640                len -= size;
 641
 642                if (ofs >> cfi->chipshift) {
 643                        chipnum ++;
 644                        ofs = 0;
 645                        if (chipnum == cfi->numchips)
 646                                return 0;
 647                }
 648        }
 649
 650        return 0;
 651}
 652
 653/*
 654 * Writev for ECC-Flashes is a little more complicated. We need to maintain
 655 * a small buffer for this.
 656 * XXX: If the buffer size is not a multiple of 2, this will break
 657 */
 658#define ECCBUF_SIZE (mtd->writesize)
 659#define ECCBUF_DIV(x) ((x) & ~(ECCBUF_SIZE - 1))
 660#define ECCBUF_MOD(x) ((x) &  (ECCBUF_SIZE - 1))
 661static int
 662cfi_staa_writev(struct mtd_info *mtd, const struct kvec *vecs,
 663                unsigned long count, loff_t to, size_t *retlen)
 664{
 665        unsigned long i;
 666        size_t   totlen = 0, thislen;
 667        int      ret = 0;
 668        size_t   buflen = 0;
 669        static char *buffer;
 670
 671        if (!ECCBUF_SIZE) {
 672                /* We should fall back to a general writev implementation.
 673                 * Until that is written, just break.
 674                 */
 675                return -EIO;
 676        }
 677        buffer = kmalloc(ECCBUF_SIZE, GFP_KERNEL);
 678        if (!buffer)
 679                return -ENOMEM;
 680
 681        for (i=0; i<count; i++) {
 682                size_t elem_len = vecs[i].iov_len;
 683                void *elem_base = vecs[i].iov_base;
 684                if (!elem_len) /* FIXME: Might be unnecessary. Check that */
 685                        continue;
 686                if (buflen) { /* cut off head */
 687                        if (buflen + elem_len < ECCBUF_SIZE) { /* just accumulate */
 688                                memcpy(buffer+buflen, elem_base, elem_len);
 689                                buflen += elem_len;
 690                                continue;
 691                        }
 692                        memcpy(buffer+buflen, elem_base, ECCBUF_SIZE-buflen);
 693                        ret = mtd_write(mtd, to, ECCBUF_SIZE, &thislen,
 694                                        buffer);
 695                        totlen += thislen;
 696                        if (ret || thislen != ECCBUF_SIZE)
 697                                goto write_error;
 698                        elem_len -= thislen-buflen;
 699                        elem_base += thislen-buflen;
 700                        to += ECCBUF_SIZE;
 701                }
 702                if (ECCBUF_DIV(elem_len)) { /* write clean aligned data */
 703                        ret = mtd_write(mtd, to, ECCBUF_DIV(elem_len),
 704                                        &thislen, elem_base);
 705                        totlen += thislen;
 706                        if (ret || thislen != ECCBUF_DIV(elem_len))
 707                                goto write_error;
 708                        to += thislen;
 709                }
 710                buflen = ECCBUF_MOD(elem_len); /* cut off tail */
 711                if (buflen) {
 712                        memset(buffer, 0xff, ECCBUF_SIZE);
 713                        memcpy(buffer, elem_base + thislen, buflen);
 714                }
 715        }
 716        if (buflen) { /* flush last page, even if not full */
 717                /* This is sometimes intended behaviour, really */
 718                ret = mtd_write(mtd, to, buflen, &thislen, buffer);
 719                totlen += thislen;
 720                if (ret || thislen != ECCBUF_SIZE)
 721                        goto write_error;
 722        }
 723write_error:
 724        if (retlen)
 725                *retlen = totlen;
 726        kfree(buffer);
 727        return ret;
 728}
 729
 730
 731static inline int do_erase_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
 732{
 733        struct cfi_private *cfi = map->fldrv_priv;
 734        map_word status, status_OK;
 735        unsigned long timeo;
 736        int retries = 3;
 737        DECLARE_WAITQUEUE(wait, current);
 738        int ret = 0;
 739
 740        adr += chip->start;
 741
 742        /* Let's determine this according to the interleave only once */
 743        status_OK = CMD(0x80);
 744
 745        timeo = jiffies + HZ;
 746retry:
 747        mutex_lock(&chip->mutex);
 748
 749        /* Check that the chip's ready to talk to us. */
 750        switch (chip->state) {
 751        case FL_CFI_QUERY:
 752        case FL_JEDEC_QUERY:
 753        case FL_READY:
 754                map_write(map, CMD(0x70), adr);
 755                chip->state = FL_STATUS;
 756
 757        case FL_STATUS:
 758                status = map_read(map, adr);
 759                if (map_word_andequal(map, status, status_OK, status_OK))
 760                        break;
 761
 762                /* Urgh. Chip not yet ready to talk to us. */
 763                if (time_after(jiffies, timeo)) {
 764                        mutex_unlock(&chip->mutex);
 765                        printk(KERN_ERR "waiting for chip to be ready timed out in erase\n");
 766                        return -EIO;
 767                }
 768
 769                /* Latency issues. Drop the lock, wait a while and retry */
 770                mutex_unlock(&chip->mutex);
 771                cfi_udelay(1);
 772                goto retry;
 773
 774        default:
 775                /* Stick ourselves on a wait queue to be woken when
 776                   someone changes the status */
 777                set_current_state(TASK_UNINTERRUPTIBLE);
 778                add_wait_queue(&chip->wq, &wait);
 779                mutex_unlock(&chip->mutex);
 780                schedule();
 781                remove_wait_queue(&chip->wq, &wait);
 782                timeo = jiffies + HZ;
 783                goto retry;
 784        }
 785
 786        ENABLE_VPP(map);
 787        /* Clear the status register first */
 788        map_write(map, CMD(0x50), adr);
 789
 790        /* Now erase */
 791        map_write(map, CMD(0x20), adr);
 792        map_write(map, CMD(0xD0), adr);
 793        chip->state = FL_ERASING;
 794
 795        mutex_unlock(&chip->mutex);
 796        msleep(1000);
 797        mutex_lock(&chip->mutex);
 798
 799        /* FIXME. Use a timer to check this, and return immediately. */
 800        /* Once the state machine's known to be working I'll do that */
 801
 802        timeo = jiffies + (HZ*20);
 803        for (;;) {
 804                if (chip->state != FL_ERASING) {
 805                        /* Someone's suspended the erase. Sleep */
 806                        set_current_state(TASK_UNINTERRUPTIBLE);
 807                        add_wait_queue(&chip->wq, &wait);
 808                        mutex_unlock(&chip->mutex);
 809                        schedule();
 810                        remove_wait_queue(&chip->wq, &wait);
 811                        timeo = jiffies + (HZ*20); /* FIXME */
 812                        mutex_lock(&chip->mutex);
 813                        continue;
 814                }
 815
 816                status = map_read(map, adr);
 817                if (map_word_andequal(map, status, status_OK, status_OK))
 818                        break;
 819
 820                /* OK Still waiting */
 821                if (time_after(jiffies, timeo)) {
 822                        map_write(map, CMD(0x70), adr);
 823                        chip->state = FL_STATUS;
 824                        printk(KERN_ERR "waiting for erase to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
 825                        DISABLE_VPP(map);
 826                        mutex_unlock(&chip->mutex);
 827                        return -EIO;
 828                }
 829
 830                /* Latency issues. Drop the lock, wait a while and retry */
 831                mutex_unlock(&chip->mutex);
 832                cfi_udelay(1);
 833                mutex_lock(&chip->mutex);
 834        }
 835
 836        DISABLE_VPP(map);
 837        ret = 0;
 838
 839        /* We've broken this before. It doesn't hurt to be safe */
 840        map_write(map, CMD(0x70), adr);
 841        chip->state = FL_STATUS;
 842        status = map_read(map, adr);
 843
 844        /* check for lock bit */
 845        if (map_word_bitsset(map, status, CMD(0x3a))) {
 846                unsigned char chipstatus = status.x[0];
 847                if (!map_word_equal(map, status, CMD(chipstatus))) {
 848                        int i, w;
 849                        for (w=0; w<map_words(map); w++) {
 850                                for (i = 0; i<cfi_interleave(cfi); i++) {
 851                                        chipstatus |= status.x[w] >> (cfi->device_type * 8);
 852                                }
 853                        }
 854                        printk(KERN_WARNING "Status is not identical for all chips: 0x%lx. Merging to give 0x%02x\n",
 855                               status.x[0], chipstatus);
 856                }
 857                /* Reset the error bits */
 858                map_write(map, CMD(0x50), adr);
 859                map_write(map, CMD(0x70), adr);
 860
 861                if ((chipstatus & 0x30) == 0x30) {
 862                        printk(KERN_NOTICE "Chip reports improper command sequence: status 0x%x\n", chipstatus);
 863                        ret = -EIO;
 864                } else if (chipstatus & 0x02) {
 865                        /* Protection bit set */
 866                        ret = -EROFS;
 867                } else if (chipstatus & 0x8) {
 868                        /* Voltage */
 869                        printk(KERN_WARNING "Chip reports voltage low on erase: status 0x%x\n", chipstatus);
 870                        ret = -EIO;
 871                } else if (chipstatus & 0x20) {
 872                        if (retries--) {
 873                                printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x. Retrying...\n", adr, chipstatus);
 874                                timeo = jiffies + HZ;
 875                                chip->state = FL_STATUS;
 876                                mutex_unlock(&chip->mutex);
 877                                goto retry;
 878                        }
 879                        printk(KERN_DEBUG "Chip erase failed at 0x%08lx: status 0x%x\n", adr, chipstatus);
 880                        ret = -EIO;
 881                }
 882        }
 883
 884        wake_up(&chip->wq);
 885        mutex_unlock(&chip->mutex);
 886        return ret;
 887}
 888
 889static int cfi_staa_erase_varsize(struct mtd_info *mtd,
 890                                  struct erase_info *instr)
 891{       struct map_info *map = mtd->priv;
 892        struct cfi_private *cfi = map->fldrv_priv;
 893        unsigned long adr, len;
 894        int chipnum, ret = 0;
 895        int i, first;
 896        struct mtd_erase_region_info *regions = mtd->eraseregions;
 897
 898        /* Check that both start and end of the requested erase are
 899         * aligned with the erasesize at the appropriate addresses.
 900         */
 901
 902        i = 0;
 903
 904        /* Skip all erase regions which are ended before the start of
 905           the requested erase. Actually, to save on the calculations,
 906           we skip to the first erase region which starts after the
 907           start of the requested erase, and then go back one.
 908        */
 909
 910        while (i < mtd->numeraseregions && instr->addr >= regions[i].offset)
 911               i++;
 912        i--;
 913
 914        /* OK, now i is pointing at the erase region in which this
 915           erase request starts. Check the start of the requested
 916           erase range is aligned with the erase size which is in
 917           effect here.
 918        */
 919
 920        if (instr->addr & (regions[i].erasesize-1))
 921                return -EINVAL;
 922
 923        /* Remember the erase region we start on */
 924        first = i;
 925
 926        /* Next, check that the end of the requested erase is aligned
 927         * with the erase region at that address.
 928         */
 929
 930        while (i<mtd->numeraseregions && (instr->addr + instr->len) >= regions[i].offset)
 931                i++;
 932
 933        /* As before, drop back one to point at the region in which
 934           the address actually falls
 935        */
 936        i--;
 937
 938        if ((instr->addr + instr->len) & (regions[i].erasesize-1))
 939                return -EINVAL;
 940
 941        chipnum = instr->addr >> cfi->chipshift;
 942        adr = instr->addr - (chipnum << cfi->chipshift);
 943        len = instr->len;
 944
 945        i=first;
 946
 947        while(len) {
 948                ret = do_erase_oneblock(map, &cfi->chips[chipnum], adr);
 949
 950                if (ret)
 951                        return ret;
 952
 953                adr += regions[i].erasesize;
 954                len -= regions[i].erasesize;
 955
 956                if (adr % (1<< cfi->chipshift) == (((unsigned long)regions[i].offset + (regions[i].erasesize * regions[i].numblocks)) %( 1<< cfi->chipshift)))
 957                        i++;
 958
 959                if (adr >> cfi->chipshift) {
 960                        adr = 0;
 961                        chipnum++;
 962
 963                        if (chipnum >= cfi->numchips)
 964                                break;
 965                }
 966        }
 967
 968        instr->state = MTD_ERASE_DONE;
 969        mtd_erase_callback(instr);
 970
 971        return 0;
 972}
 973
 974static void cfi_staa_sync (struct mtd_info *mtd)
 975{
 976        struct map_info *map = mtd->priv;
 977        struct cfi_private *cfi = map->fldrv_priv;
 978        int i;
 979        struct flchip *chip;
 980        int ret = 0;
 981        DECLARE_WAITQUEUE(wait, current);
 982
 983        for (i=0; !ret && i<cfi->numchips; i++) {
 984                chip = &cfi->chips[i];
 985
 986        retry:
 987                mutex_lock(&chip->mutex);
 988
 989                switch(chip->state) {
 990                case FL_READY:
 991                case FL_STATUS:
 992                case FL_CFI_QUERY:
 993                case FL_JEDEC_QUERY:
 994                        chip->oldstate = chip->state;
 995                        chip->state = FL_SYNCING;
 996                        /* No need to wake_up() on this state change -
 997                         * as the whole point is that nobody can do anything
 998                         * with the chip now anyway.
 999                         */
1000                case FL_SYNCING:
1001                        mutex_unlock(&chip->mutex);
1002                        break;
1003
1004                default:
1005                        /* Not an idle state */
1006                        set_current_state(TASK_UNINTERRUPTIBLE);
1007                        add_wait_queue(&chip->wq, &wait);
1008
1009                        mutex_unlock(&chip->mutex);
1010                        schedule();
1011                        remove_wait_queue(&chip->wq, &wait);
1012
1013                        goto retry;
1014                }
1015        }
1016
1017        /* Unlock the chips again */
1018
1019        for (i--; i >=0; i--) {
1020                chip = &cfi->chips[i];
1021
1022                mutex_lock(&chip->mutex);
1023
1024                if (chip->state == FL_SYNCING) {
1025                        chip->state = chip->oldstate;
1026                        wake_up(&chip->wq);
1027                }
1028                mutex_unlock(&chip->mutex);
1029        }
1030}
1031
1032static inline int do_lock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
1033{
1034        struct cfi_private *cfi = map->fldrv_priv;
1035        map_word status, status_OK;
1036        unsigned long timeo = jiffies + HZ;
1037        DECLARE_WAITQUEUE(wait, current);
1038
1039        adr += chip->start;
1040
1041        /* Let's determine this according to the interleave only once */
1042        status_OK = CMD(0x80);
1043
1044        timeo = jiffies + HZ;
1045retry:
1046        mutex_lock(&chip->mutex);
1047
1048        /* Check that the chip's ready to talk to us. */
1049        switch (chip->state) {
1050        case FL_CFI_QUERY:
1051        case FL_JEDEC_QUERY:
1052        case FL_READY:
1053                map_write(map, CMD(0x70), adr);
1054                chip->state = FL_STATUS;
1055
1056        case FL_STATUS:
1057                status = map_read(map, adr);
1058                if (map_word_andequal(map, status, status_OK, status_OK))
1059                        break;
1060
1061                /* Urgh. Chip not yet ready to talk to us. */
1062                if (time_after(jiffies, timeo)) {
1063                        mutex_unlock(&chip->mutex);
1064                        printk(KERN_ERR "waiting for chip to be ready timed out in lock\n");
1065                        return -EIO;
1066                }
1067
1068                /* Latency issues. Drop the lock, wait a while and retry */
1069                mutex_unlock(&chip->mutex);
1070                cfi_udelay(1);
1071                goto retry;
1072
1073        default:
1074                /* Stick ourselves on a wait queue to be woken when
1075                   someone changes the status */
1076                set_current_state(TASK_UNINTERRUPTIBLE);
1077                add_wait_queue(&chip->wq, &wait);
1078                mutex_unlock(&chip->mutex);
1079                schedule();
1080                remove_wait_queue(&chip->wq, &wait);
1081                timeo = jiffies + HZ;
1082                goto retry;
1083        }
1084
1085        ENABLE_VPP(map);
1086        map_write(map, CMD(0x60), adr);
1087        map_write(map, CMD(0x01), adr);
1088        chip->state = FL_LOCKING;
1089
1090        mutex_unlock(&chip->mutex);
1091        msleep(1000);
1092        mutex_lock(&chip->mutex);
1093
1094        /* FIXME. Use a timer to check this, and return immediately. */
1095        /* Once the state machine's known to be working I'll do that */
1096
1097        timeo = jiffies + (HZ*2);
1098        for (;;) {
1099
1100                status = map_read(map, adr);
1101                if (map_word_andequal(map, status, status_OK, status_OK))
1102                        break;
1103
1104                /* OK Still waiting */
1105                if (time_after(jiffies, timeo)) {
1106                        map_write(map, CMD(0x70), adr);
1107                        chip->state = FL_STATUS;
1108                        printk(KERN_ERR "waiting for lock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
1109                        DISABLE_VPP(map);
1110                        mutex_unlock(&chip->mutex);
1111                        return -EIO;
1112                }
1113
1114                /* Latency issues. Drop the lock, wait a while and retry */
1115                mutex_unlock(&chip->mutex);
1116                cfi_udelay(1);
1117                mutex_lock(&chip->mutex);
1118        }
1119
1120        /* Done and happy. */
1121        chip->state = FL_STATUS;
1122        DISABLE_VPP(map);
1123        wake_up(&chip->wq);
1124        mutex_unlock(&chip->mutex);
1125        return 0;
1126}
1127static int cfi_staa_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
1128{
1129        struct map_info *map = mtd->priv;
1130        struct cfi_private *cfi = map->fldrv_priv;
1131        unsigned long adr;
1132        int chipnum, ret = 0;
1133#ifdef DEBUG_LOCK_BITS
1134        int ofs_factor = cfi->interleave * cfi->device_type;
1135#endif
1136
1137        if (ofs & (mtd->erasesize - 1))
1138                return -EINVAL;
1139
1140        if (len & (mtd->erasesize -1))
1141                return -EINVAL;
1142
1143        chipnum = ofs >> cfi->chipshift;
1144        adr = ofs - (chipnum << cfi->chipshift);
1145
1146        while(len) {
1147
1148#ifdef DEBUG_LOCK_BITS
1149                cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1150                printk("before lock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1151                cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1152#endif
1153
1154                ret = do_lock_oneblock(map, &cfi->chips[chipnum], adr);
1155
1156#ifdef DEBUG_LOCK_BITS
1157                cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1158                printk("after lock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1159                cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1160#endif
1161
1162                if (ret)
1163                        return ret;
1164
1165                adr += mtd->erasesize;
1166                len -= mtd->erasesize;
1167
1168                if (adr >> cfi->chipshift) {
1169                        adr = 0;
1170                        chipnum++;
1171
1172                        if (chipnum >= cfi->numchips)
1173                                break;
1174                }
1175        }
1176        return 0;
1177}
1178static inline int do_unlock_oneblock(struct map_info *map, struct flchip *chip, unsigned long adr)
1179{
1180        struct cfi_private *cfi = map->fldrv_priv;
1181        map_word status, status_OK;
1182        unsigned long timeo = jiffies + HZ;
1183        DECLARE_WAITQUEUE(wait, current);
1184
1185        adr += chip->start;
1186
1187        /* Let's determine this according to the interleave only once */
1188        status_OK = CMD(0x80);
1189
1190        timeo = jiffies + HZ;
1191retry:
1192        mutex_lock(&chip->mutex);
1193
1194        /* Check that the chip's ready to talk to us. */
1195        switch (chip->state) {
1196        case FL_CFI_QUERY:
1197        case FL_JEDEC_QUERY:
1198        case FL_READY:
1199                map_write(map, CMD(0x70), adr);
1200                chip->state = FL_STATUS;
1201
1202        case FL_STATUS:
1203                status = map_read(map, adr);
1204                if (map_word_andequal(map, status, status_OK, status_OK))
1205                        break;
1206
1207                /* Urgh. Chip not yet ready to talk to us. */
1208                if (time_after(jiffies, timeo)) {
1209                        mutex_unlock(&chip->mutex);
1210                        printk(KERN_ERR "waiting for chip to be ready timed out in unlock\n");
1211                        return -EIO;
1212                }
1213
1214                /* Latency issues. Drop the lock, wait a while and retry */
1215                mutex_unlock(&chip->mutex);
1216                cfi_udelay(1);
1217                goto retry;
1218
1219        default:
1220                /* Stick ourselves on a wait queue to be woken when
1221                   someone changes the status */
1222                set_current_state(TASK_UNINTERRUPTIBLE);
1223                add_wait_queue(&chip->wq, &wait);
1224                mutex_unlock(&chip->mutex);
1225                schedule();
1226                remove_wait_queue(&chip->wq, &wait);
1227                timeo = jiffies + HZ;
1228                goto retry;
1229        }
1230
1231        ENABLE_VPP(map);
1232        map_write(map, CMD(0x60), adr);
1233        map_write(map, CMD(0xD0), adr);
1234        chip->state = FL_UNLOCKING;
1235
1236        mutex_unlock(&chip->mutex);
1237        msleep(1000);
1238        mutex_lock(&chip->mutex);
1239
1240        /* FIXME. Use a timer to check this, and return immediately. */
1241        /* Once the state machine's known to be working I'll do that */
1242
1243        timeo = jiffies + (HZ*2);
1244        for (;;) {
1245
1246                status = map_read(map, adr);
1247                if (map_word_andequal(map, status, status_OK, status_OK))
1248                        break;
1249
1250                /* OK Still waiting */
1251                if (time_after(jiffies, timeo)) {
1252                        map_write(map, CMD(0x70), adr);
1253                        chip->state = FL_STATUS;
1254                        printk(KERN_ERR "waiting for unlock to complete timed out. Xstatus = %lx, status = %lx.\n", status.x[0], map_read(map, adr).x[0]);
1255                        DISABLE_VPP(map);
1256                        mutex_unlock(&chip->mutex);
1257                        return -EIO;
1258                }
1259
1260                /* Latency issues. Drop the unlock, wait a while and retry */
1261                mutex_unlock(&chip->mutex);
1262                cfi_udelay(1);
1263                mutex_lock(&chip->mutex);
1264        }
1265
1266        /* Done and happy. */
1267        chip->state = FL_STATUS;
1268        DISABLE_VPP(map);
1269        wake_up(&chip->wq);
1270        mutex_unlock(&chip->mutex);
1271        return 0;
1272}
1273static int cfi_staa_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
1274{
1275        struct map_info *map = mtd->priv;
1276        struct cfi_private *cfi = map->fldrv_priv;
1277        unsigned long adr;
1278        int chipnum, ret = 0;
1279#ifdef DEBUG_LOCK_BITS
1280        int ofs_factor = cfi->interleave * cfi->device_type;
1281#endif
1282
1283        chipnum = ofs >> cfi->chipshift;
1284        adr = ofs - (chipnum << cfi->chipshift);
1285
1286#ifdef DEBUG_LOCK_BITS
1287        {
1288                unsigned long temp_adr = adr;
1289                unsigned long temp_len = len;
1290
1291                cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1292                while (temp_len) {
1293                        printk("before unlock %x: block status register is %x\n",temp_adr,cfi_read_query(map, temp_adr+(2*ofs_factor)));
1294                        temp_adr += mtd->erasesize;
1295                        temp_len -= mtd->erasesize;
1296                }
1297                cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1298        }
1299#endif
1300
1301        ret = do_unlock_oneblock(map, &cfi->chips[chipnum], adr);
1302
1303#ifdef DEBUG_LOCK_BITS
1304        cfi_send_gen_cmd(0x90, 0x55, 0, map, cfi, cfi->device_type, NULL);
1305        printk("after unlock: block status register is %x\n",cfi_read_query(map, adr+(2*ofs_factor)));
1306        cfi_send_gen_cmd(0xff, 0x55, 0, map, cfi, cfi->device_type, NULL);
1307#endif
1308
1309        return ret;
1310}
1311
1312static int cfi_staa_suspend(struct mtd_info *mtd)
1313{
1314        struct map_info *map = mtd->priv;
1315        struct cfi_private *cfi = map->fldrv_priv;
1316        int i;
1317        struct flchip *chip;
1318        int ret = 0;
1319
1320        for (i=0; !ret && i<cfi->numchips; i++) {
1321                chip = &cfi->chips[i];
1322
1323                mutex_lock(&chip->mutex);
1324
1325                switch(chip->state) {
1326                case FL_READY:
1327                case FL_STATUS:
1328                case FL_CFI_QUERY:
1329                case FL_JEDEC_QUERY:
1330                        chip->oldstate = chip->state;
1331                        chip->state = FL_PM_SUSPENDED;
1332                        /* No need to wake_up() on this state change -
1333                         * as the whole point is that nobody can do anything
1334                         * with the chip now anyway.
1335                         */
1336                case FL_PM_SUSPENDED:
1337                        break;
1338
1339                default:
1340                        ret = -EAGAIN;
1341                        break;
1342                }
1343                mutex_unlock(&chip->mutex);
1344        }
1345
1346        /* Unlock the chips again */
1347
1348        if (ret) {
1349                for (i--; i >=0; i--) {
1350                        chip = &cfi->chips[i];
1351
1352                        mutex_lock(&chip->mutex);
1353
1354                        if (chip->state == FL_PM_SUSPENDED) {
1355                                /* No need to force it into a known state here,
1356                                   because we're returning failure, and it didn't
1357                                   get power cycled */
1358                                chip->state = chip->oldstate;
1359                                wake_up(&chip->wq);
1360                        }
1361                        mutex_unlock(&chip->mutex);
1362                }
1363        }
1364
1365        return ret;
1366}
1367
1368static void cfi_staa_resume(struct mtd_info *mtd)
1369{
1370        struct map_info *map = mtd->priv;
1371        struct cfi_private *cfi = map->fldrv_priv;
1372        int i;
1373        struct flchip *chip;
1374
1375        for (i=0; i<cfi->numchips; i++) {
1376
1377                chip = &cfi->chips[i];
1378
1379                mutex_lock(&chip->mutex);
1380
1381                /* Go to known state. Chip may have been power cycled */
1382                if (chip->state == FL_PM_SUSPENDED) {
1383                        map_write(map, CMD(0xFF), 0);
1384                        chip->state = FL_READY;
1385                        wake_up(&chip->wq);
1386                }
1387
1388                mutex_unlock(&chip->mutex);
1389        }
1390}
1391
1392static void cfi_staa_destroy(struct mtd_info *mtd)
1393{
1394        struct map_info *map = mtd->priv;
1395        struct cfi_private *cfi = map->fldrv_priv;
1396        kfree(cfi->cmdset_priv);
1397        kfree(cfi);
1398}
1399
1400MODULE_LICENSE("GPL");
1401