]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/mtd/sm_ftl.c
mtd: nand: atmel: Add ->setup_data_interface() hooks
[karo-tx-linux.git] / drivers / mtd / sm_ftl.c
1 /*
2  * Copyright © 2009 - Maxim Levitsky
3  * SmartMedia/xD translation layer
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  */
9
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/random.h>
13 #include <linux/hdreg.h>
14 #include <linux/kthread.h>
15 #include <linux/freezer.h>
16 #include <linux/sysfs.h>
17 #include <linux/bitops.h>
18 #include <linux/slab.h>
19 #include <linux/mtd/nand_ecc.h>
20 #include "nand/sm_common.h"
21 #include "sm_ftl.h"
22
23
24
25 static struct workqueue_struct *cache_flush_workqueue;
26
27 static int cache_timeout = 1000;
28 module_param(cache_timeout, int, S_IRUGO);
29 MODULE_PARM_DESC(cache_timeout,
30         "Timeout (in ms) for cache flush (1000 ms default");
31
32 static int debug;
33 module_param(debug, int, S_IRUGO | S_IWUSR);
34 MODULE_PARM_DESC(debug, "Debug level (0-2)");
35
36
37 /* ------------------- sysfs attributes ---------------------------------- */
38 struct sm_sysfs_attribute {
39         struct device_attribute dev_attr;
40         char *data;
41         int len;
42 };
43
44 static ssize_t sm_attr_show(struct device *dev, struct device_attribute *attr,
45                      char *buf)
46 {
47         struct sm_sysfs_attribute *sm_attr =
48                 container_of(attr, struct sm_sysfs_attribute, dev_attr);
49
50         strncpy(buf, sm_attr->data, sm_attr->len);
51         return sm_attr->len;
52 }
53
54
55 #define NUM_ATTRIBUTES 1
56 #define SM_CIS_VENDOR_OFFSET 0x59
57 static struct attribute_group *sm_create_sysfs_attributes(struct sm_ftl *ftl)
58 {
59         struct attribute_group *attr_group;
60         struct attribute **attributes;
61         struct sm_sysfs_attribute *vendor_attribute;
62         char *vendor;
63
64         vendor = kstrndup(ftl->cis_buffer + SM_CIS_VENDOR_OFFSET,
65                           SM_SMALL_PAGE - SM_CIS_VENDOR_OFFSET, GFP_KERNEL);
66         if (!vendor)
67                 goto error1;
68
69         /* Initialize sysfs attributes */
70         vendor_attribute =
71                 kzalloc(sizeof(struct sm_sysfs_attribute), GFP_KERNEL);
72         if (!vendor_attribute)
73                 goto error2;
74
75         sysfs_attr_init(&vendor_attribute->dev_attr.attr);
76
77         vendor_attribute->data = vendor;
78         vendor_attribute->len = strlen(vendor);
79         vendor_attribute->dev_attr.attr.name = "vendor";
80         vendor_attribute->dev_attr.attr.mode = S_IRUGO;
81         vendor_attribute->dev_attr.show = sm_attr_show;
82
83
84         /* Create array of pointers to the attributes */
85         attributes = kzalloc(sizeof(struct attribute *) * (NUM_ATTRIBUTES + 1),
86                                                                 GFP_KERNEL);
87         if (!attributes)
88                 goto error3;
89         attributes[0] = &vendor_attribute->dev_attr.attr;
90
91         /* Finally create the attribute group */
92         attr_group = kzalloc(sizeof(struct attribute_group), GFP_KERNEL);
93         if (!attr_group)
94                 goto error4;
95         attr_group->attrs = attributes;
96         return attr_group;
97 error4:
98         kfree(attributes);
99 error3:
100         kfree(vendor_attribute);
101 error2:
102         kfree(vendor);
103 error1:
104         return NULL;
105 }
106
107 static void sm_delete_sysfs_attributes(struct sm_ftl *ftl)
108 {
109         struct attribute **attributes = ftl->disk_attributes->attrs;
110         int i;
111
112         for (i = 0; attributes[i] ; i++) {
113
114                 struct device_attribute *dev_attr = container_of(attributes[i],
115                         struct device_attribute, attr);
116
117                 struct sm_sysfs_attribute *sm_attr =
118                         container_of(dev_attr,
119                                 struct sm_sysfs_attribute, dev_attr);
120
121                 kfree(sm_attr->data);
122                 kfree(sm_attr);
123         }
124
125         kfree(ftl->disk_attributes->attrs);
126         kfree(ftl->disk_attributes);
127 }
128
129
130 /* ----------------------- oob helpers -------------------------------------- */
131
132 static int sm_get_lba(uint8_t *lba)
133 {
134         /* check fixed bits */
135         if ((lba[0] & 0xF8) != 0x10)
136                 return -2;
137
138         /* check parity - endianness doesn't matter */
139         if (hweight16(*(uint16_t *)lba) & 1)
140                 return -2;
141
142         return (lba[1] >> 1) | ((lba[0] & 0x07) << 7);
143 }
144
145
146 /*
147  * Read LBA associated with block
148  * returns -1, if block is erased
149  * returns -2 if error happens
150  */
151 static int sm_read_lba(struct sm_oob *oob)
152 {
153         static const uint32_t erased_pattern[4] = {
154                 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
155
156         uint16_t lba_test;
157         int lba;
158
159         /* First test for erased block */
160         if (!memcmp(oob, erased_pattern, SM_OOB_SIZE))
161                 return -1;
162
163         /* Now check is both copies of the LBA differ too much */
164         lba_test = *(uint16_t *)oob->lba_copy1 ^ *(uint16_t*)oob->lba_copy2;
165         if (lba_test && !is_power_of_2(lba_test))
166                 return -2;
167
168         /* And read it */
169         lba = sm_get_lba(oob->lba_copy1);
170
171         if (lba == -2)
172                 lba = sm_get_lba(oob->lba_copy2);
173
174         return lba;
175 }
176
177 static void sm_write_lba(struct sm_oob *oob, uint16_t lba)
178 {
179         uint8_t tmp[2];
180
181         WARN_ON(lba >= 1000);
182
183         tmp[0] = 0x10 | ((lba >> 7) & 0x07);
184         tmp[1] = (lba << 1) & 0xFF;
185
186         if (hweight16(*(uint16_t *)tmp) & 0x01)
187                 tmp[1] |= 1;
188
189         oob->lba_copy1[0] = oob->lba_copy2[0] = tmp[0];
190         oob->lba_copy1[1] = oob->lba_copy2[1] = tmp[1];
191 }
192
193
194 /* Make offset from parts */
195 static loff_t sm_mkoffset(struct sm_ftl *ftl, int zone, int block, int boffset)
196 {
197         WARN_ON(boffset & (SM_SECTOR_SIZE - 1));
198         WARN_ON(zone < 0 || zone >= ftl->zone_count);
199         WARN_ON(block >= ftl->zone_size);
200         WARN_ON(boffset >= ftl->block_size);
201
202         if (block == -1)
203                 return -1;
204
205         return (zone * SM_MAX_ZONE_SIZE + block) * ftl->block_size + boffset;
206 }
207
208 /* Breaks offset into parts */
209 static void sm_break_offset(struct sm_ftl *ftl, loff_t loffset,
210                             int *zone, int *block, int *boffset)
211 {
212         u64 offset = loffset;
213         *boffset = do_div(offset, ftl->block_size);
214         *block = do_div(offset, ftl->max_lba);
215         *zone = offset >= ftl->zone_count ? -1 : offset;
216 }
217
218 /* ---------------------- low level IO ------------------------------------- */
219
220 static int sm_correct_sector(uint8_t *buffer, struct sm_oob *oob)
221 {
222         uint8_t ecc[3];
223
224         __nand_calculate_ecc(buffer, SM_SMALL_PAGE, ecc);
225         if (__nand_correct_data(buffer, ecc, oob->ecc1, SM_SMALL_PAGE) < 0)
226                 return -EIO;
227
228         buffer += SM_SMALL_PAGE;
229
230         __nand_calculate_ecc(buffer, SM_SMALL_PAGE, ecc);
231         if (__nand_correct_data(buffer, ecc, oob->ecc2, SM_SMALL_PAGE) < 0)
232                 return -EIO;
233         return 0;
234 }
235
236 /* Reads a sector + oob*/
237 static int sm_read_sector(struct sm_ftl *ftl,
238                           int zone, int block, int boffset,
239                           uint8_t *buffer, struct sm_oob *oob)
240 {
241         struct mtd_info *mtd = ftl->trans->mtd;
242         struct mtd_oob_ops ops;
243         struct sm_oob tmp_oob;
244         int ret = -EIO;
245         int try = 0;
246
247         /* FTL can contain -1 entries that are by default filled with bits */
248         if (block == -1) {
249                 memset(buffer, 0xFF, SM_SECTOR_SIZE);
250                 return 0;
251         }
252
253         /* User might not need the oob, but we do for data verification */
254         if (!oob)
255                 oob = &tmp_oob;
256
257         ops.mode = ftl->smallpagenand ? MTD_OPS_RAW : MTD_OPS_PLACE_OOB;
258         ops.ooboffs = 0;
259         ops.ooblen = SM_OOB_SIZE;
260         ops.oobbuf = (void *)oob;
261         ops.len = SM_SECTOR_SIZE;
262         ops.datbuf = buffer;
263
264 again:
265         if (try++) {
266                 /* Avoid infinite recursion on CIS reads, sm_recheck_media
267                         won't help anyway */
268                 if (zone == 0 && block == ftl->cis_block && boffset ==
269                         ftl->cis_boffset)
270                         return ret;
271
272                 /* Test if media is stable */
273                 if (try == 3 || sm_recheck_media(ftl))
274                         return ret;
275         }
276
277         /* Unfortunately, oob read will _always_ succeed,
278                 despite card removal..... */
279         ret = mtd_read_oob(mtd, sm_mkoffset(ftl, zone, block, boffset), &ops);
280
281         /* Test for unknown errors */
282         if (ret != 0 && !mtd_is_bitflip_or_eccerr(ret)) {
283                 dbg("read of block %d at zone %d, failed due to error (%d)",
284                         block, zone, ret);
285                 goto again;
286         }
287
288         /* Do a basic test on the oob, to guard against returned garbage */
289         if (oob->reserved != 0xFFFFFFFF && !is_power_of_2(~oob->reserved))
290                 goto again;
291
292         /* This should never happen, unless there is a bug in the mtd driver */
293         WARN_ON(ops.oobretlen != SM_OOB_SIZE);
294         WARN_ON(buffer && ops.retlen != SM_SECTOR_SIZE);
295
296         if (!buffer)
297                 return 0;
298
299         /* Test if sector marked as bad */
300         if (!sm_sector_valid(oob)) {
301                 dbg("read of block %d at zone %d, failed because it is marked"
302                         " as bad" , block, zone);
303                 goto again;
304         }
305
306         /* Test ECC*/
307         if (mtd_is_eccerr(ret) ||
308                 (ftl->smallpagenand && sm_correct_sector(buffer, oob))) {
309
310                 dbg("read of block %d at zone %d, failed due to ECC error",
311                         block, zone);
312                 goto again;
313         }
314
315         return 0;
316 }
317
318 /* Writes a sector to media */
319 static int sm_write_sector(struct sm_ftl *ftl,
320                            int zone, int block, int boffset,
321                            uint8_t *buffer, struct sm_oob *oob)
322 {
323         struct mtd_oob_ops ops;
324         struct mtd_info *mtd = ftl->trans->mtd;
325         int ret;
326
327         BUG_ON(ftl->readonly);
328
329         if (zone == 0 && (block == ftl->cis_block || block == 0)) {
330                 dbg("attempted to write the CIS!");
331                 return -EIO;
332         }
333
334         if (ftl->unstable)
335                 return -EIO;
336
337         ops.mode = ftl->smallpagenand ? MTD_OPS_RAW : MTD_OPS_PLACE_OOB;
338         ops.len = SM_SECTOR_SIZE;
339         ops.datbuf = buffer;
340         ops.ooboffs = 0;
341         ops.ooblen = SM_OOB_SIZE;
342         ops.oobbuf = (void *)oob;
343
344         ret = mtd_write_oob(mtd, sm_mkoffset(ftl, zone, block, boffset), &ops);
345
346         /* Now we assume that hardware will catch write bitflip errors */
347
348         if (ret) {
349                 dbg("write to block %d at zone %d, failed with error %d",
350                         block, zone, ret);
351
352                 sm_recheck_media(ftl);
353                 return ret;
354         }
355
356         /* This should never happen, unless there is a bug in the driver */
357         WARN_ON(ops.oobretlen != SM_OOB_SIZE);
358         WARN_ON(buffer && ops.retlen != SM_SECTOR_SIZE);
359
360         return 0;
361 }
362
363 /* ------------------------ block IO ------------------------------------- */
364
365 /* Write a block using data and lba, and invalid sector bitmap */
366 static int sm_write_block(struct sm_ftl *ftl, uint8_t *buf,
367                           int zone, int block, int lba,
368                           unsigned long invalid_bitmap)
369 {
370         struct sm_oob oob;
371         int boffset;
372         int retry = 0;
373
374         /* Initialize the oob with requested values */
375         memset(&oob, 0xFF, SM_OOB_SIZE);
376         sm_write_lba(&oob, lba);
377 restart:
378         if (ftl->unstable)
379                 return -EIO;
380
381         for (boffset = 0; boffset < ftl->block_size;
382                                 boffset += SM_SECTOR_SIZE) {
383
384                 oob.data_status = 0xFF;
385
386                 if (test_bit(boffset / SM_SECTOR_SIZE, &invalid_bitmap)) {
387
388                         sm_printk("sector %d of block at LBA %d of zone %d"
389                                 " couldn't be read, marking it as invalid",
390                                 boffset / SM_SECTOR_SIZE, lba, zone);
391
392                         oob.data_status = 0;
393                 }
394
395                 if (ftl->smallpagenand) {
396                         __nand_calculate_ecc(buf + boffset,
397                                                 SM_SMALL_PAGE, oob.ecc1);
398
399                         __nand_calculate_ecc(buf + boffset + SM_SMALL_PAGE,
400                                                 SM_SMALL_PAGE, oob.ecc2);
401                 }
402                 if (!sm_write_sector(ftl, zone, block, boffset,
403                                                         buf + boffset, &oob))
404                         continue;
405
406                 if (!retry) {
407
408                         /* If write fails. try to erase the block */
409                         /* This is safe, because we never write in blocks
410                                 that contain valuable data.
411                         This is intended to repair block that are marked
412                         as erased, but that isn't fully erased*/
413
414                         if (sm_erase_block(ftl, zone, block, 0))
415                                 return -EIO;
416
417                         retry = 1;
418                         goto restart;
419                 } else {
420                         sm_mark_block_bad(ftl, zone, block);
421                         return -EIO;
422                 }
423         }
424         return 0;
425 }
426
427
428 /* Mark whole block at offset 'offs' as bad. */
429 static void sm_mark_block_bad(struct sm_ftl *ftl, int zone, int block)
430 {
431         struct sm_oob oob;
432         int boffset;
433
434         memset(&oob, 0xFF, SM_OOB_SIZE);
435         oob.block_status = 0xF0;
436
437         if (ftl->unstable)
438                 return;
439
440         if (sm_recheck_media(ftl))
441                 return;
442
443         sm_printk("marking block %d of zone %d as bad", block, zone);
444
445         /* We aren't checking the return value, because we don't care */
446         /* This also fails on fake xD cards, but I guess these won't expose
447                 any bad blocks till fail completely */
448         for (boffset = 0; boffset < ftl->block_size; boffset += SM_SECTOR_SIZE)
449                 sm_write_sector(ftl, zone, block, boffset, NULL, &oob);
450 }
451
452 /*
453  * Erase a block within a zone
454  * If erase succeeds, it updates free block fifo, otherwise marks block as bad
455  */
456 static int sm_erase_block(struct sm_ftl *ftl, int zone_num, uint16_t block,
457                           int put_free)
458 {
459         struct ftl_zone *zone = &ftl->zones[zone_num];
460         struct mtd_info *mtd = ftl->trans->mtd;
461         struct erase_info erase;
462
463         erase.mtd = mtd;
464         erase.callback = sm_erase_callback;
465         erase.addr = sm_mkoffset(ftl, zone_num, block, 0);
466         erase.len = ftl->block_size;
467         erase.priv = (u_long)ftl;
468
469         if (ftl->unstable)
470                 return -EIO;
471
472         BUG_ON(ftl->readonly);
473
474         if (zone_num == 0 && (block == ftl->cis_block || block == 0)) {
475                 sm_printk("attempted to erase the CIS!");
476                 return -EIO;
477         }
478
479         if (mtd_erase(mtd, &erase)) {
480                 sm_printk("erase of block %d in zone %d failed",
481                                                         block, zone_num);
482                 goto error;
483         }
484
485         if (erase.state == MTD_ERASE_PENDING)
486                 wait_for_completion(&ftl->erase_completion);
487
488         if (erase.state != MTD_ERASE_DONE) {
489                 sm_printk("erase of block %d in zone %d failed after wait",
490                         block, zone_num);
491                 goto error;
492         }
493
494         if (put_free)
495                 kfifo_in(&zone->free_sectors,
496                         (const unsigned char *)&block, sizeof(block));
497
498         return 0;
499 error:
500         sm_mark_block_bad(ftl, zone_num, block);
501         return -EIO;
502 }
503
504 static void sm_erase_callback(struct erase_info *self)
505 {
506         struct sm_ftl *ftl = (struct sm_ftl *)self->priv;
507         complete(&ftl->erase_completion);
508 }
509
510 /* Thoroughly test that block is valid. */
511 static int sm_check_block(struct sm_ftl *ftl, int zone, int block)
512 {
513         int boffset;
514         struct sm_oob oob;
515         int lbas[] = { -3, 0, 0, 0 };
516         int i = 0;
517         int test_lba;
518
519
520         /* First just check that block doesn't look fishy */
521         /* Only blocks that are valid or are sliced in two parts, are
522                 accepted */
523         for (boffset = 0; boffset < ftl->block_size;
524                                         boffset += SM_SECTOR_SIZE) {
525
526                 /* This shouldn't happen anyway */
527                 if (sm_read_sector(ftl, zone, block, boffset, NULL, &oob))
528                         return -2;
529
530                 test_lba = sm_read_lba(&oob);
531
532                 if (lbas[i] != test_lba)
533                         lbas[++i] = test_lba;
534
535                 /* If we found three different LBAs, something is fishy */
536                 if (i == 3)
537                         return -EIO;
538         }
539
540         /* If the block is sliced (partially erased usually) erase it */
541         if (i == 2) {
542                 sm_erase_block(ftl, zone, block, 1);
543                 return 1;
544         }
545
546         return 0;
547 }
548
549 /* ----------------- media scanning --------------------------------- */
550 static const struct chs_entry chs_table[] = {
551         { 1,    125,  4,  4  },
552         { 2,    125,  4,  8  },
553         { 4,    250,  4,  8  },
554         { 8,    250,  4,  16 },
555         { 16,   500,  4,  16 },
556         { 32,   500,  8,  16 },
557         { 64,   500,  8,  32 },
558         { 128,  500,  16, 32 },
559         { 256,  1000, 16, 32 },
560         { 512,  1015, 32, 63 },
561         { 1024, 985,  33, 63 },
562         { 2048, 985,  33, 63 },
563         { 0 },
564 };
565
566
567 static const uint8_t cis_signature[] = {
568         0x01, 0x03, 0xD9, 0x01, 0xFF, 0x18, 0x02, 0xDF, 0x01, 0x20
569 };
570 /* Find out media parameters.
571  * This ideally has to be based on nand id, but for now device size is enough */
572 static int sm_get_media_info(struct sm_ftl *ftl, struct mtd_info *mtd)
573 {
574         int i;
575         int size_in_megs = mtd->size / (1024 * 1024);
576
577         ftl->readonly = mtd->type == MTD_ROM;
578
579         /* Manual settings for very old devices */
580         ftl->zone_count = 1;
581         ftl->smallpagenand = 0;
582
583         switch (size_in_megs) {
584         case 1:
585                 /* 1 MiB flash/rom SmartMedia card (256 byte pages)*/
586                 ftl->zone_size = 256;
587                 ftl->max_lba = 250;
588                 ftl->block_size = 8 * SM_SECTOR_SIZE;
589                 ftl->smallpagenand = 1;
590
591                 break;
592         case 2:
593                 /* 2 MiB flash SmartMedia (256 byte pages)*/
594                 if (mtd->writesize == SM_SMALL_PAGE) {
595                         ftl->zone_size = 512;
596                         ftl->max_lba = 500;
597                         ftl->block_size = 8 * SM_SECTOR_SIZE;
598                         ftl->smallpagenand = 1;
599                 /* 2 MiB rom SmartMedia */
600                 } else {
601
602                         if (!ftl->readonly)
603                                 return -ENODEV;
604
605                         ftl->zone_size = 256;
606                         ftl->max_lba = 250;
607                         ftl->block_size = 16 * SM_SECTOR_SIZE;
608                 }
609                 break;
610         case 4:
611                 /* 4 MiB flash/rom SmartMedia device */
612                 ftl->zone_size = 512;
613                 ftl->max_lba = 500;
614                 ftl->block_size = 16 * SM_SECTOR_SIZE;
615                 break;
616         case 8:
617                 /* 8 MiB flash/rom SmartMedia device */
618                 ftl->zone_size = 1024;
619                 ftl->max_lba = 1000;
620                 ftl->block_size = 16 * SM_SECTOR_SIZE;
621         }
622
623         /* Minimum xD size is 16MiB. Also, all xD cards have standard zone
624            sizes. SmartMedia cards exist up to 128 MiB and have same layout*/
625         if (size_in_megs >= 16) {
626                 ftl->zone_count = size_in_megs / 16;
627                 ftl->zone_size = 1024;
628                 ftl->max_lba = 1000;
629                 ftl->block_size = 32 * SM_SECTOR_SIZE;
630         }
631
632         /* Test for proper write,erase and oob sizes */
633         if (mtd->erasesize > ftl->block_size)
634                 return -ENODEV;
635
636         if (mtd->writesize > SM_SECTOR_SIZE)
637                 return -ENODEV;
638
639         if (ftl->smallpagenand && mtd->oobsize < SM_SMALL_OOB_SIZE)
640                 return -ENODEV;
641
642         if (!ftl->smallpagenand && mtd->oobsize < SM_OOB_SIZE)
643                 return -ENODEV;
644
645         /* We use OOB */
646         if (!mtd_has_oob(mtd))
647                 return -ENODEV;
648
649         /* Find geometry information */
650         for (i = 0 ; i < ARRAY_SIZE(chs_table) ; i++) {
651                 if (chs_table[i].size == size_in_megs) {
652                         ftl->cylinders = chs_table[i].cyl;
653                         ftl->heads = chs_table[i].head;
654                         ftl->sectors = chs_table[i].sec;
655                         return 0;
656                 }
657         }
658
659         sm_printk("media has unknown size : %dMiB", size_in_megs);
660         ftl->cylinders = 985;
661         ftl->heads =  33;
662         ftl->sectors = 63;
663         return 0;
664 }
665
666 /* Validate the CIS */
667 static int sm_read_cis(struct sm_ftl *ftl)
668 {
669         struct sm_oob oob;
670
671         if (sm_read_sector(ftl,
672                 0, ftl->cis_block, ftl->cis_boffset, ftl->cis_buffer, &oob))
673                         return -EIO;
674
675         if (!sm_sector_valid(&oob) || !sm_block_valid(&oob))
676                 return -EIO;
677
678         if (!memcmp(ftl->cis_buffer + ftl->cis_page_offset,
679                         cis_signature, sizeof(cis_signature))) {
680                 return 0;
681         }
682
683         return -EIO;
684 }
685
686 /* Scan the media for the CIS */
687 static int sm_find_cis(struct sm_ftl *ftl)
688 {
689         struct sm_oob oob;
690         int block, boffset;
691         int block_found = 0;
692         int cis_found = 0;
693
694         /* Search for first valid block */
695         for (block = 0 ; block < ftl->zone_size - ftl->max_lba ; block++) {
696
697                 if (sm_read_sector(ftl, 0, block, 0, NULL, &oob))
698                         continue;
699
700                 if (!sm_block_valid(&oob))
701                         continue;
702                 block_found = 1;
703                 break;
704         }
705
706         if (!block_found)
707                 return -EIO;
708
709         /* Search for first valid sector in this block */
710         for (boffset = 0 ; boffset < ftl->block_size;
711                                                 boffset += SM_SECTOR_SIZE) {
712
713                 if (sm_read_sector(ftl, 0, block, boffset, NULL, &oob))
714                         continue;
715
716                 if (!sm_sector_valid(&oob))
717                         continue;
718                 break;
719         }
720
721         if (boffset == ftl->block_size)
722                 return -EIO;
723
724         ftl->cis_block = block;
725         ftl->cis_boffset = boffset;
726         ftl->cis_page_offset = 0;
727
728         cis_found = !sm_read_cis(ftl);
729
730         if (!cis_found) {
731                 ftl->cis_page_offset = SM_SMALL_PAGE;
732                 cis_found = !sm_read_cis(ftl);
733         }
734
735         if (cis_found) {
736                 dbg("CIS block found at offset %x",
737                         block * ftl->block_size +
738                                 boffset + ftl->cis_page_offset);
739                 return 0;
740         }
741         return -EIO;
742 }
743
744 /* Basic test to determine if underlying mtd device if functional */
745 static int sm_recheck_media(struct sm_ftl *ftl)
746 {
747         if (sm_read_cis(ftl)) {
748
749                 if (!ftl->unstable) {
750                         sm_printk("media unstable, not allowing writes");
751                         ftl->unstable = 1;
752                 }
753                 return -EIO;
754         }
755         return 0;
756 }
757
758 /* Initialize a FTL zone */
759 static int sm_init_zone(struct sm_ftl *ftl, int zone_num)
760 {
761         struct ftl_zone *zone = &ftl->zones[zone_num];
762         struct sm_oob oob;
763         uint16_t block;
764         int lba;
765         int i = 0;
766         int len;
767
768         dbg("initializing zone %d", zone_num);
769
770         /* Allocate memory for FTL table */
771         zone->lba_to_phys_table = kmalloc(ftl->max_lba * 2, GFP_KERNEL);
772
773         if (!zone->lba_to_phys_table)
774                 return -ENOMEM;
775         memset(zone->lba_to_phys_table, -1, ftl->max_lba * 2);
776
777
778         /* Allocate memory for free sectors FIFO */
779         if (kfifo_alloc(&zone->free_sectors, ftl->zone_size * 2, GFP_KERNEL)) {
780                 kfree(zone->lba_to_phys_table);
781                 return -ENOMEM;
782         }
783
784         /* Now scan the zone */
785         for (block = 0 ; block < ftl->zone_size ; block++) {
786
787                 /* Skip blocks till the CIS (including) */
788                 if (zone_num == 0 && block <= ftl->cis_block)
789                         continue;
790
791                 /* Read the oob of first sector */
792                 if (sm_read_sector(ftl, zone_num, block, 0, NULL, &oob))
793                         return -EIO;
794
795                 /* Test to see if block is erased. It is enough to test
796                         first sector, because erase happens in one shot */
797                 if (sm_block_erased(&oob)) {
798                         kfifo_in(&zone->free_sectors,
799                                 (unsigned char *)&block, 2);
800                         continue;
801                 }
802
803                 /* If block is marked as bad, skip it */
804                 /* This assumes we can trust first sector*/
805                 /* However the way the block valid status is defined, ensures
806                         very low probability of failure here */
807                 if (!sm_block_valid(&oob)) {
808                         dbg("PH %04d <-> <marked bad>", block);
809                         continue;
810                 }
811
812
813                 lba = sm_read_lba(&oob);
814
815                 /* Invalid LBA means that block is damaged. */
816                 /* We can try to erase it, or mark it as bad, but
817                         lets leave that to recovery application */
818                 if (lba == -2 || lba >= ftl->max_lba) {
819                         dbg("PH %04d <-> LBA %04d(bad)", block, lba);
820                         continue;
821                 }
822
823
824                 /* If there is no collision,
825                         just put the sector in the FTL table */
826                 if (zone->lba_to_phys_table[lba] < 0) {
827                         dbg_verbose("PH %04d <-> LBA %04d", block, lba);
828                         zone->lba_to_phys_table[lba] = block;
829                         continue;
830                 }
831
832                 sm_printk("collision"
833                         " of LBA %d between blocks %d and %d in zone %d",
834                         lba, zone->lba_to_phys_table[lba], block, zone_num);
835
836                 /* Test that this block is valid*/
837                 if (sm_check_block(ftl, zone_num, block))
838                         continue;
839
840                 /* Test now the old block */
841                 if (sm_check_block(ftl, zone_num,
842                                         zone->lba_to_phys_table[lba])) {
843                         zone->lba_to_phys_table[lba] = block;
844                         continue;
845                 }
846
847                 /* If both blocks are valid and share same LBA, it means that
848                         they hold different versions of same data. It not
849                         known which is more recent, thus just erase one of them
850                 */
851                 sm_printk("both blocks are valid, erasing the later");
852                 sm_erase_block(ftl, zone_num, block, 1);
853         }
854
855         dbg("zone initialized");
856         zone->initialized = 1;
857
858         /* No free sectors, means that the zone is heavily damaged, write won't
859                 work, but it can still can be (partially) read */
860         if (!kfifo_len(&zone->free_sectors)) {
861                 sm_printk("no free blocks in zone %d", zone_num);
862                 return 0;
863         }
864
865         /* Randomize first block we write to */
866         get_random_bytes(&i, 2);
867         i %= (kfifo_len(&zone->free_sectors) / 2);
868
869         while (i--) {
870                 len = kfifo_out(&zone->free_sectors,
871                                         (unsigned char *)&block, 2);
872                 WARN_ON(len != 2);
873                 kfifo_in(&zone->free_sectors, (const unsigned char *)&block, 2);
874         }
875         return 0;
876 }
877
878 /* Get and automatically initialize an FTL mapping for one zone */
879 static struct ftl_zone *sm_get_zone(struct sm_ftl *ftl, int zone_num)
880 {
881         struct ftl_zone *zone;
882         int error;
883
884         BUG_ON(zone_num >= ftl->zone_count);
885         zone = &ftl->zones[zone_num];
886
887         if (!zone->initialized) {
888                 error = sm_init_zone(ftl, zone_num);
889
890                 if (error)
891                         return ERR_PTR(error);
892         }
893         return zone;
894 }
895
896
897 /* ----------------- cache handling ------------------------------------------*/
898
899 /* Initialize the one block cache */
900 static void sm_cache_init(struct sm_ftl *ftl)
901 {
902         ftl->cache_data_invalid_bitmap = 0xFFFFFFFF;
903         ftl->cache_clean = 1;
904         ftl->cache_zone = -1;
905         ftl->cache_block = -1;
906         /*memset(ftl->cache_data, 0xAA, ftl->block_size);*/
907 }
908
909 /* Put sector in one block cache */
910 static void sm_cache_put(struct sm_ftl *ftl, char *buffer, int boffset)
911 {
912         memcpy(ftl->cache_data + boffset, buffer, SM_SECTOR_SIZE);
913         clear_bit(boffset / SM_SECTOR_SIZE, &ftl->cache_data_invalid_bitmap);
914         ftl->cache_clean = 0;
915 }
916
917 /* Read a sector from the cache */
918 static int sm_cache_get(struct sm_ftl *ftl, char *buffer, int boffset)
919 {
920         if (test_bit(boffset / SM_SECTOR_SIZE,
921                 &ftl->cache_data_invalid_bitmap))
922                         return -1;
923
924         memcpy(buffer, ftl->cache_data + boffset, SM_SECTOR_SIZE);
925         return 0;
926 }
927
928 /* Write the cache to hardware */
929 static int sm_cache_flush(struct sm_ftl *ftl)
930 {
931         struct ftl_zone *zone;
932
933         int sector_num;
934         uint16_t write_sector;
935         int zone_num = ftl->cache_zone;
936         int block_num;
937
938         if (ftl->cache_clean)
939                 return 0;
940
941         if (ftl->unstable)
942                 return -EIO;
943
944         BUG_ON(zone_num < 0);
945         zone = &ftl->zones[zone_num];
946         block_num = zone->lba_to_phys_table[ftl->cache_block];
947
948
949         /* Try to read all unread areas of the cache block*/
950         for_each_set_bit(sector_num, &ftl->cache_data_invalid_bitmap,
951                 ftl->block_size / SM_SECTOR_SIZE) {
952
953                 if (!sm_read_sector(ftl,
954                         zone_num, block_num, sector_num * SM_SECTOR_SIZE,
955                         ftl->cache_data + sector_num * SM_SECTOR_SIZE, NULL))
956                                 clear_bit(sector_num,
957                                         &ftl->cache_data_invalid_bitmap);
958         }
959 restart:
960
961         if (ftl->unstable)
962                 return -EIO;
963
964         /* If there are no spare blocks, */
965         /* we could still continue by erasing/writing the current block,
966                 but for such worn out media it doesn't worth the trouble,
967                         and the dangers */
968         if (kfifo_out(&zone->free_sectors,
969                                 (unsigned char *)&write_sector, 2) != 2) {
970                 dbg("no free sectors for write!");
971                 return -EIO;
972         }
973
974
975         if (sm_write_block(ftl, ftl->cache_data, zone_num, write_sector,
976                 ftl->cache_block, ftl->cache_data_invalid_bitmap))
977                         goto restart;
978
979         /* Update the FTL table */
980         zone->lba_to_phys_table[ftl->cache_block] = write_sector;
981
982         /* Write succesfull, so erase and free the old block */
983         if (block_num > 0)
984                 sm_erase_block(ftl, zone_num, block_num, 1);
985
986         sm_cache_init(ftl);
987         return 0;
988 }
989
990
991 /* flush timer, runs a second after last write */
992 static void sm_cache_flush_timer(unsigned long data)
993 {
994         struct sm_ftl *ftl = (struct sm_ftl *)data;
995         queue_work(cache_flush_workqueue, &ftl->flush_work);
996 }
997
998 /* cache flush work, kicked by timer */
999 static void sm_cache_flush_work(struct work_struct *work)
1000 {
1001         struct sm_ftl *ftl = container_of(work, struct sm_ftl, flush_work);
1002         mutex_lock(&ftl->mutex);
1003         sm_cache_flush(ftl);
1004         mutex_unlock(&ftl->mutex);
1005         return;
1006 }
1007
1008 /* ---------------- outside interface -------------------------------------- */
1009
1010 /* outside interface: read a sector */
1011 static int sm_read(struct mtd_blktrans_dev *dev,
1012                    unsigned long sect_no, char *buf)
1013 {
1014         struct sm_ftl *ftl = dev->priv;
1015         struct ftl_zone *zone;
1016         int error = 0, in_cache = 0;
1017         int zone_num, block, boffset;
1018
1019         sm_break_offset(ftl, sect_no << 9, &zone_num, &block, &boffset);
1020         mutex_lock(&ftl->mutex);
1021
1022
1023         zone = sm_get_zone(ftl, zone_num);
1024         if (IS_ERR(zone)) {
1025                 error = PTR_ERR(zone);
1026                 goto unlock;
1027         }
1028
1029         /* Have to look at cache first */
1030         if (ftl->cache_zone == zone_num && ftl->cache_block == block) {
1031                 in_cache = 1;
1032                 if (!sm_cache_get(ftl, buf, boffset))
1033                         goto unlock;
1034         }
1035
1036         /* Translate the block and return if doesn't exist in the table */
1037         block = zone->lba_to_phys_table[block];
1038
1039         if (block == -1) {
1040                 memset(buf, 0xFF, SM_SECTOR_SIZE);
1041                 goto unlock;
1042         }
1043
1044         if (sm_read_sector(ftl, zone_num, block, boffset, buf, NULL)) {
1045                 error = -EIO;
1046                 goto unlock;
1047         }
1048
1049         if (in_cache)
1050                 sm_cache_put(ftl, buf, boffset);
1051 unlock:
1052         mutex_unlock(&ftl->mutex);
1053         return error;
1054 }
1055
1056 /* outside interface: write a sector */
1057 static int sm_write(struct mtd_blktrans_dev *dev,
1058                                 unsigned long sec_no, char *buf)
1059 {
1060         struct sm_ftl *ftl = dev->priv;
1061         struct ftl_zone *zone;
1062         int error = 0, zone_num, block, boffset;
1063
1064         BUG_ON(ftl->readonly);
1065         sm_break_offset(ftl, sec_no << 9, &zone_num, &block, &boffset);
1066
1067         /* No need in flush thread running now */
1068         del_timer(&ftl->timer);
1069         mutex_lock(&ftl->mutex);
1070
1071         zone = sm_get_zone(ftl, zone_num);
1072         if (IS_ERR(zone)) {
1073                 error = PTR_ERR(zone);
1074                 goto unlock;
1075         }
1076
1077         /* If entry is not in cache, flush it */
1078         if (ftl->cache_block != block || ftl->cache_zone != zone_num) {
1079
1080                 error = sm_cache_flush(ftl);
1081                 if (error)
1082                         goto unlock;
1083
1084                 ftl->cache_block = block;
1085                 ftl->cache_zone = zone_num;
1086         }
1087
1088         sm_cache_put(ftl, buf, boffset);
1089 unlock:
1090         mod_timer(&ftl->timer, jiffies + msecs_to_jiffies(cache_timeout));
1091         mutex_unlock(&ftl->mutex);
1092         return error;
1093 }
1094
1095 /* outside interface: flush everything */
1096 static int sm_flush(struct mtd_blktrans_dev *dev)
1097 {
1098         struct sm_ftl *ftl = dev->priv;
1099         int retval;
1100
1101         mutex_lock(&ftl->mutex);
1102         retval =  sm_cache_flush(ftl);
1103         mutex_unlock(&ftl->mutex);
1104         return retval;
1105 }
1106
1107 /* outside interface: device is released */
1108 static void sm_release(struct mtd_blktrans_dev *dev)
1109 {
1110         struct sm_ftl *ftl = dev->priv;
1111
1112         mutex_lock(&ftl->mutex);
1113         del_timer_sync(&ftl->timer);
1114         cancel_work_sync(&ftl->flush_work);
1115         sm_cache_flush(ftl);
1116         mutex_unlock(&ftl->mutex);
1117 }
1118
1119 /* outside interface: get geometry */
1120 static int sm_getgeo(struct mtd_blktrans_dev *dev, struct hd_geometry *geo)
1121 {
1122         struct sm_ftl *ftl = dev->priv;
1123         geo->heads = ftl->heads;
1124         geo->sectors = ftl->sectors;
1125         geo->cylinders = ftl->cylinders;
1126         return 0;
1127 }
1128
1129 /* external interface: main initialization function */
1130 static void sm_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
1131 {
1132         struct mtd_blktrans_dev *trans;
1133         struct sm_ftl *ftl;
1134
1135         /* Allocate & initialize our private structure */
1136         ftl = kzalloc(sizeof(struct sm_ftl), GFP_KERNEL);
1137         if (!ftl)
1138                 goto error1;
1139
1140
1141         mutex_init(&ftl->mutex);
1142         setup_timer(&ftl->timer, sm_cache_flush_timer, (unsigned long)ftl);
1143         INIT_WORK(&ftl->flush_work, sm_cache_flush_work);
1144         init_completion(&ftl->erase_completion);
1145
1146         /* Read media information */
1147         if (sm_get_media_info(ftl, mtd)) {
1148                 dbg("found unsupported mtd device, aborting");
1149                 goto error2;
1150         }
1151
1152
1153         /* Allocate temporary CIS buffer for read retry support */
1154         ftl->cis_buffer = kzalloc(SM_SECTOR_SIZE, GFP_KERNEL);
1155         if (!ftl->cis_buffer)
1156                 goto error2;
1157
1158         /* Allocate zone array, it will be initialized on demand */
1159         ftl->zones = kzalloc(sizeof(struct ftl_zone) * ftl->zone_count,
1160                                                                 GFP_KERNEL);
1161         if (!ftl->zones)
1162                 goto error3;
1163
1164         /* Allocate the cache*/
1165         ftl->cache_data = kzalloc(ftl->block_size, GFP_KERNEL);
1166
1167         if (!ftl->cache_data)
1168                 goto error4;
1169
1170         sm_cache_init(ftl);
1171
1172
1173         /* Allocate upper layer structure and initialize it */
1174         trans = kzalloc(sizeof(struct mtd_blktrans_dev), GFP_KERNEL);
1175         if (!trans)
1176                 goto error5;
1177
1178         ftl->trans = trans;
1179         trans->priv = ftl;
1180
1181         trans->tr = tr;
1182         trans->mtd = mtd;
1183         trans->devnum = -1;
1184         trans->size = (ftl->block_size * ftl->max_lba * ftl->zone_count) >> 9;
1185         trans->readonly = ftl->readonly;
1186
1187         if (sm_find_cis(ftl)) {
1188                 dbg("CIS not found on mtd device, aborting");
1189                 goto error6;
1190         }
1191
1192         ftl->disk_attributes = sm_create_sysfs_attributes(ftl);
1193         if (!ftl->disk_attributes)
1194                 goto error6;
1195         trans->disk_attributes = ftl->disk_attributes;
1196
1197         sm_printk("Found %d MiB xD/SmartMedia FTL on mtd%d",
1198                 (int)(mtd->size / (1024 * 1024)), mtd->index);
1199
1200         dbg("FTL layout:");
1201         dbg("%d zone(s), each consists of %d blocks (+%d spares)",
1202                 ftl->zone_count, ftl->max_lba,
1203                 ftl->zone_size - ftl->max_lba);
1204         dbg("each block consists of %d bytes",
1205                 ftl->block_size);
1206
1207
1208         /* Register device*/
1209         if (add_mtd_blktrans_dev(trans)) {
1210                 dbg("error in mtdblktrans layer");
1211                 goto error6;
1212         }
1213         return;
1214 error6:
1215         kfree(trans);
1216 error5:
1217         kfree(ftl->cache_data);
1218 error4:
1219         kfree(ftl->zones);
1220 error3:
1221         kfree(ftl->cis_buffer);
1222 error2:
1223         kfree(ftl);
1224 error1:
1225         return;
1226 }
1227
1228 /* main interface: device {surprise,} removal */
1229 static void sm_remove_dev(struct mtd_blktrans_dev *dev)
1230 {
1231         struct sm_ftl *ftl = dev->priv;
1232         int i;
1233
1234         del_mtd_blktrans_dev(dev);
1235         ftl->trans = NULL;
1236
1237         for (i = 0 ; i < ftl->zone_count; i++) {
1238
1239                 if (!ftl->zones[i].initialized)
1240                         continue;
1241
1242                 kfree(ftl->zones[i].lba_to_phys_table);
1243                 kfifo_free(&ftl->zones[i].free_sectors);
1244         }
1245
1246         sm_delete_sysfs_attributes(ftl);
1247         kfree(ftl->cis_buffer);
1248         kfree(ftl->zones);
1249         kfree(ftl->cache_data);
1250         kfree(ftl);
1251 }
1252
1253 static struct mtd_blktrans_ops sm_ftl_ops = {
1254         .name           = "smblk",
1255         .major          = 0,
1256         .part_bits      = SM_FTL_PARTN_BITS,
1257         .blksize        = SM_SECTOR_SIZE,
1258         .getgeo         = sm_getgeo,
1259
1260         .add_mtd        = sm_add_mtd,
1261         .remove_dev     = sm_remove_dev,
1262
1263         .readsect       = sm_read,
1264         .writesect      = sm_write,
1265
1266         .flush          = sm_flush,
1267         .release        = sm_release,
1268
1269         .owner          = THIS_MODULE,
1270 };
1271
1272 static __init int sm_module_init(void)
1273 {
1274         int error = 0;
1275
1276         cache_flush_workqueue = create_freezable_workqueue("smflush");
1277         if (!cache_flush_workqueue)
1278                 return -ENOMEM;
1279
1280         error = register_mtd_blktrans(&sm_ftl_ops);
1281         if (error)
1282                 destroy_workqueue(cache_flush_workqueue);
1283         return error;
1284
1285 }
1286
1287 static void __exit sm_module_exit(void)
1288 {
1289         destroy_workqueue(cache_flush_workqueue);
1290         deregister_mtd_blktrans(&sm_ftl_ops);
1291 }
1292
1293 module_init(sm_module_init);
1294 module_exit(sm_module_exit);
1295
1296 MODULE_LICENSE("GPL");
1297 MODULE_AUTHOR("Maxim Levitsky <maximlevitsky@gmail.com>");
1298 MODULE_DESCRIPTION("Smartmedia/xD mtd translation layer");