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