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