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