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