linux/drivers/mmc/mmc_block.c
<<
>>
Prefs
   1/*
   2 * Block driver for media (i.e., flash cards)
   3 *
   4 * Copyright 2002 Hewlett-Packard Company
   5 *
   6 * Use consistent with the GNU GPL is permitted,
   7 * provided that this copyright notice is
   8 * preserved in its entirety in all copies and derived works.
   9 *
  10 * HEWLETT-PACKARD COMPANY MAKES NO WARRANTIES, EXPRESSED OR IMPLIED,
  11 * AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS
  12 * FITNESS FOR ANY PARTICULAR PURPOSE.
  13 *
  14 * Many thanks to Alessandro Rubini and Jonathan Corbet!
  15 *
  16 * Author:  Andrew Christian
  17 *          28 May 2002
  18 */
  19#include <linux/moduleparam.h>
  20#include <linux/module.h>
  21#include <linux/init.h>
  22
  23#include <linux/kernel.h>
  24#include <linux/fs.h>
  25#include <linux/errno.h>
  26#include <linux/hdreg.h>
  27#include <linux/kdev_t.h>
  28#include <linux/blkdev.h>
  29#include <linux/mutex.h>
  30#include <linux/scatterlist.h>
  31
  32#include <linux/mmc/card.h>
  33#include <linux/mmc/host.h>
  34#include <linux/mmc/protocol.h>
  35#include <linux/mmc/host.h>
  36
  37#include <asm/system.h>
  38#include <asm/uaccess.h>
  39
  40#include "mmc_queue.h"
  41
  42/*
  43 * max 8 partitions per card
  44 */
  45#define MMC_SHIFT       3
  46
  47static int major;
  48
  49/*
  50 * There is one mmc_blk_data per slot.
  51 */
  52struct mmc_blk_data {
  53        spinlock_t      lock;
  54        struct gendisk  *disk;
  55        struct mmc_queue queue;
  56
  57        unsigned int    usage;
  58        unsigned int    block_bits;
  59        unsigned int    read_only;
  60};
  61
  62static DEFINE_MUTEX(open_lock);
  63
  64static struct mmc_blk_data *mmc_blk_get(struct gendisk *disk)
  65{
  66        struct mmc_blk_data *md;
  67
  68        mutex_lock(&open_lock);
  69        md = disk->private_data;
  70        if (md && md->usage == 0)
  71                md = NULL;
  72        if (md)
  73                md->usage++;
  74        mutex_unlock(&open_lock);
  75
  76        return md;
  77}
  78
  79static void mmc_blk_put(struct mmc_blk_data *md)
  80{
  81        mutex_lock(&open_lock);
  82        md->usage--;
  83        if (md->usage == 0) {
  84                put_disk(md->disk);
  85                kfree(md);
  86        }
  87        mutex_unlock(&open_lock);
  88}
  89
  90static int mmc_blk_open(struct inode *inode, struct file *filp)
  91{
  92        struct mmc_blk_data *md;
  93        int ret = -ENXIO;
  94
  95        md = mmc_blk_get(inode->i_bdev->bd_disk);
  96        if (md) {
  97                if (md->usage == 2)
  98                        check_disk_change(inode->i_bdev);
  99                ret = 0;
 100
 101                if ((filp->f_mode & FMODE_WRITE) && md->read_only)
 102                        ret = -EROFS;
 103        }
 104
 105        return ret;
 106}
 107
 108static int mmc_blk_release(struct inode *inode, struct file *filp)
 109{
 110        struct mmc_blk_data *md = inode->i_bdev->bd_disk->private_data;
 111
 112        mmc_blk_put(md);
 113        return 0;
 114}
 115
 116static int
 117mmc_blk_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 118{
 119        geo->cylinders = get_capacity(bdev->bd_disk) / (4 * 16);
 120        geo->heads = 4;
 121        geo->sectors = 16;
 122        return 0;
 123}
 124
 125static struct block_device_operations mmc_bdops = {
 126        .open                   = mmc_blk_open,
 127        .release                = mmc_blk_release,
 128        .getgeo                 = mmc_blk_getgeo,
 129        .owner                  = THIS_MODULE,
 130};
 131
 132struct mmc_blk_request {
 133        struct mmc_request      mrq;
 134        struct mmc_command      cmd;
 135        struct mmc_command      stop;
 136        struct mmc_data         data;
 137};
 138
 139static int mmc_blk_prep_rq(struct mmc_queue *mq, struct request *req)
 140{
 141        struct mmc_blk_data *md = mq->data;
 142        int stat = BLKPREP_OK;
 143
 144        /*
 145         * If we have no device, we haven't finished initialising.
 146         */
 147        if (!md || !mq->card) {
 148                printk(KERN_ERR "%s: killing request - no device/host\n",
 149                       req->rq_disk->disk_name);
 150                stat = BLKPREP_KILL;
 151        }
 152
 153        return stat;
 154}
 155
 156static u32 mmc_sd_num_wr_blocks(struct mmc_card *card)
 157{
 158        int err;
 159        u32 blocks;
 160
 161        struct mmc_request mrq;
 162        struct mmc_command cmd;
 163        struct mmc_data data;
 164        unsigned int timeout_us;
 165
 166        struct scatterlist sg;
 167
 168        memset(&cmd, 0, sizeof(struct mmc_command));
 169
 170        cmd.opcode = MMC_APP_CMD;
 171        cmd.arg = card->rca << 16;
 172        cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
 173
 174        err = mmc_wait_for_cmd(card->host, &cmd, 0);
 175        if ((err != MMC_ERR_NONE) || !(cmd.resp[0] & R1_APP_CMD))
 176                return (u32)-1;
 177
 178        memset(&cmd, 0, sizeof(struct mmc_command));
 179
 180        cmd.opcode = SD_APP_SEND_NUM_WR_BLKS;
 181        cmd.arg = 0;
 182        cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
 183
 184        memset(&data, 0, sizeof(struct mmc_data));
 185
 186        data.timeout_ns = card->csd.tacc_ns * 100;
 187        data.timeout_clks = card->csd.tacc_clks * 100;
 188
 189        timeout_us = data.timeout_ns / 1000;
 190        timeout_us += data.timeout_clks * 1000 /
 191                (card->host->ios.clock / 1000);
 192
 193        if (timeout_us > 100000) {
 194                data.timeout_ns = 100000000;
 195                data.timeout_clks = 0;
 196        }
 197
 198        data.blksz = 4;
 199        data.blocks = 1;
 200        data.flags = MMC_DATA_READ;
 201        data.sg = &sg;
 202        data.sg_len = 1;
 203
 204        memset(&mrq, 0, sizeof(struct mmc_request));
 205
 206        mrq.cmd = &cmd;
 207        mrq.data = &data;
 208
 209        sg_init_one(&sg, &blocks, 4);
 210
 211        mmc_wait_for_req(card->host, &mrq);
 212
 213        if (cmd.error != MMC_ERR_NONE || data.error != MMC_ERR_NONE)
 214                return (u32)-1;
 215
 216        blocks = ntohl(blocks);
 217
 218        return blocks;
 219}
 220
 221static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
 222{
 223        struct mmc_blk_data *md = mq->data;
 224        struct mmc_card *card = md->queue.card;
 225        struct mmc_blk_request brq;
 226        int ret = 1;
 227
 228        if (mmc_card_claim_host(card))
 229                goto flush_queue;
 230
 231        do {
 232                struct mmc_command cmd;
 233                u32 readcmd, writecmd;
 234
 235                memset(&brq, 0, sizeof(struct mmc_blk_request));
 236                brq.mrq.cmd = &brq.cmd;
 237                brq.mrq.data = &brq.data;
 238
 239                brq.cmd.arg = req->sector;
 240                if (!mmc_card_blockaddr(card))
 241                        brq.cmd.arg <<= 9;
 242                brq.cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
 243                brq.data.blksz = 1 << md->block_bits;
 244                brq.stop.opcode = MMC_STOP_TRANSMISSION;
 245                brq.stop.arg = 0;
 246                brq.stop.flags = MMC_RSP_R1B | MMC_CMD_AC;
 247                brq.data.blocks = req->nr_sectors >> (md->block_bits - 9);
 248                if (brq.data.blocks > card->host->max_blk_count)
 249                        brq.data.blocks = card->host->max_blk_count;
 250
 251                mmc_set_data_timeout(&brq.data, card, rq_data_dir(req) != READ);
 252
 253                /*
 254                 * If the host doesn't support multiple block writes, force
 255                 * block writes to single block. SD cards are excepted from
 256                 * this rule as they support querying the number of
 257                 * successfully written sectors.
 258                 */
 259                if (rq_data_dir(req) != READ &&
 260                    !(card->host->caps & MMC_CAP_MULTIWRITE) &&
 261                    !mmc_card_sd(card))
 262                        brq.data.blocks = 1;
 263
 264                if (brq.data.blocks > 1) {
 265                        brq.data.flags |= MMC_DATA_MULTI;
 266                        brq.mrq.stop = &brq.stop;
 267                        readcmd = MMC_READ_MULTIPLE_BLOCK;
 268                        writecmd = MMC_WRITE_MULTIPLE_BLOCK;
 269                } else {
 270                        brq.mrq.stop = NULL;
 271                        readcmd = MMC_READ_SINGLE_BLOCK;
 272                        writecmd = MMC_WRITE_BLOCK;
 273                }
 274
 275                if (rq_data_dir(req) == READ) {
 276                        brq.cmd.opcode = readcmd;
 277                        brq.data.flags |= MMC_DATA_READ;
 278                } else {
 279                        brq.cmd.opcode = writecmd;
 280                        brq.data.flags |= MMC_DATA_WRITE;
 281                }
 282
 283                brq.data.sg = mq->sg;
 284                brq.data.sg_len = blk_rq_map_sg(req->q, req, brq.data.sg);
 285
 286                mmc_wait_for_req(card->host, &brq.mrq);
 287                if (brq.cmd.error) {
 288                        printk(KERN_ERR "%s: error %d sending read/write command\n",
 289                               req->rq_disk->disk_name, brq.cmd.error);
 290                        goto cmd_err;
 291                }
 292
 293                if (brq.data.error) {
 294                        printk(KERN_ERR "%s: error %d transferring data\n",
 295                               req->rq_disk->disk_name, brq.data.error);
 296                        goto cmd_err;
 297                }
 298
 299                if (brq.stop.error) {
 300                        printk(KERN_ERR "%s: error %d sending stop command\n",
 301                               req->rq_disk->disk_name, brq.stop.error);
 302                        goto cmd_err;
 303                }
 304
 305                if (rq_data_dir(req) != READ) {
 306                        do {
 307                                int err;
 308
 309                                cmd.opcode = MMC_SEND_STATUS;
 310                                cmd.arg = card->rca << 16;
 311                                cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
 312                                err = mmc_wait_for_cmd(card->host, &cmd, 5);
 313                                if (err) {
 314                                        printk(KERN_ERR "%s: error %d requesting status\n",
 315                                               req->rq_disk->disk_name, err);
 316                                        goto cmd_err;
 317                                }
 318                        } while (!(cmd.resp[0] & R1_READY_FOR_DATA));
 319
 320#if 0
 321                        if (cmd.resp[0] & ~0x00000900)
 322                                printk(KERN_ERR "%s: status = %08x\n",
 323                                       req->rq_disk->disk_name, cmd.resp[0]);
 324                        if (mmc_decode_status(cmd.resp))
 325                                goto cmd_err;
 326#endif
 327                }
 328
 329                /*
 330                 * A block was successfully transferred.
 331                 */
 332                spin_lock_irq(&md->lock);
 333                ret = end_that_request_chunk(req, 1, brq.data.bytes_xfered);
 334                if (!ret) {
 335                        /*
 336                         * The whole request completed successfully.
 337                         */
 338                        add_disk_randomness(req->rq_disk);
 339                        blkdev_dequeue_request(req);
 340                        end_that_request_last(req, 1);
 341                }
 342                spin_unlock_irq(&md->lock);
 343        } while (ret);
 344
 345        mmc_card_release_host(card);
 346
 347        return 1;
 348
 349 cmd_err:
 350        /*
 351         * If this is an SD card and we're writing, we can first
 352         * mark the known good sectors as ok.
 353         *
 354         * If the card is not SD, we can still ok written sectors
 355         * if the controller can do proper error reporting.
 356         *
 357         * For reads we just fail the entire chunk as that should
 358         * be safe in all cases.
 359         */
 360        if (rq_data_dir(req) != READ && mmc_card_sd(card)) {
 361                u32 blocks;
 362                unsigned int bytes;
 363
 364                blocks = mmc_sd_num_wr_blocks(card);
 365                if (blocks != (u32)-1) {
 366                        if (card->csd.write_partial)
 367                                bytes = blocks << md->block_bits;
 368                        else
 369                                bytes = blocks << 9;
 370                        spin_lock_irq(&md->lock);
 371                        ret = end_that_request_chunk(req, 1, bytes);
 372                        spin_unlock_irq(&md->lock);
 373                }
 374        } else if (rq_data_dir(req) != READ &&
 375                   (card->host->caps & MMC_CAP_MULTIWRITE)) {
 376                spin_lock_irq(&md->lock);
 377                ret = end_that_request_chunk(req, 1, brq.data.bytes_xfered);
 378                spin_unlock_irq(&md->lock);
 379        }
 380
 381flush_queue:
 382
 383        mmc_card_release_host(card);
 384
 385        spin_lock_irq(&md->lock);
 386        while (ret) {
 387                ret = end_that_request_chunk(req, 0,
 388                                req->current_nr_sectors << 9);
 389        }
 390
 391        add_disk_randomness(req->rq_disk);
 392        blkdev_dequeue_request(req);
 393        end_that_request_last(req, 0);
 394        spin_unlock_irq(&md->lock);
 395
 396        return 0;
 397}
 398
 399#define MMC_NUM_MINORS  (256 >> MMC_SHIFT)
 400
 401static unsigned long dev_use[MMC_NUM_MINORS/(8*sizeof(unsigned long))];
 402
 403static inline int mmc_blk_readonly(struct mmc_card *card)
 404{
 405        return mmc_card_readonly(card) ||
 406               !(card->csd.cmdclass & CCC_BLOCK_WRITE);
 407}
 408
 409static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card)
 410{
 411        struct mmc_blk_data *md;
 412        int devidx, ret;
 413
 414        devidx = find_first_zero_bit(dev_use, MMC_NUM_MINORS);
 415        if (devidx >= MMC_NUM_MINORS)
 416                return ERR_PTR(-ENOSPC);
 417        __set_bit(devidx, dev_use);
 418
 419        md = kmalloc(sizeof(struct mmc_blk_data), GFP_KERNEL);
 420        if (!md) {
 421                ret = -ENOMEM;
 422                goto out;
 423        }
 424
 425        memset(md, 0, sizeof(struct mmc_blk_data));
 426
 427        /*
 428         * Set the read-only status based on the supported commands
 429         * and the write protect switch.
 430         */
 431        md->read_only = mmc_blk_readonly(card);
 432
 433        /*
 434         * Both SD and MMC specifications state (although a bit
 435         * unclearly in the MMC case) that a block size of 512
 436         * bytes must always be supported by the card.
 437         */
 438        md->block_bits = 9;
 439
 440        md->disk = alloc_disk(1 << MMC_SHIFT);
 441        if (md->disk == NULL) {
 442                ret = -ENOMEM;
 443                goto err_kfree;
 444        }
 445
 446        spin_lock_init(&md->lock);
 447        md->usage = 1;
 448
 449        ret = mmc_init_queue(&md->queue, card, &md->lock);
 450        if (ret)
 451                goto err_putdisk;
 452
 453        md->queue.prep_fn = mmc_blk_prep_rq;
 454        md->queue.issue_fn = mmc_blk_issue_rq;
 455        md->queue.data = md;
 456
 457        md->disk->major = major;
 458        md->disk->first_minor = devidx << MMC_SHIFT;
 459        md->disk->fops = &mmc_bdops;
 460        md->disk->private_data = md;
 461        md->disk->queue = md->queue.queue;
 462        md->disk->driverfs_dev = &card->dev;
 463
 464        /*
 465         * As discussed on lkml, GENHD_FL_REMOVABLE should:
 466         *
 467         * - be set for removable media with permanent block devices
 468         * - be unset for removable block devices with permanent media
 469         *
 470         * Since MMC block devices clearly fall under the second
 471         * case, we do not set GENHD_FL_REMOVABLE.  Userspace
 472         * should use the block device creation/destruction hotplug
 473         * messages to tell when the card is present.
 474         */
 475
 476        sprintf(md->disk->disk_name, "mmcblk%d", devidx);
 477
 478        blk_queue_hardsect_size(md->queue.queue, 1 << md->block_bits);
 479
 480        /*
 481         * The CSD capacity field is in units of read_blkbits.
 482         * set_capacity takes units of 512 bytes.
 483         */
 484        set_capacity(md->disk, card->csd.capacity << (card->csd.read_blkbits - 9));
 485        return md;
 486
 487 err_putdisk:
 488        put_disk(md->disk);
 489 err_kfree:
 490        kfree(md);
 491 out:
 492        return ERR_PTR(ret);
 493}
 494
 495static int
 496mmc_blk_set_blksize(struct mmc_blk_data *md, struct mmc_card *card)
 497{
 498        struct mmc_command cmd;
 499        int err;
 500
 501        /* Block-addressed cards ignore MMC_SET_BLOCKLEN. */
 502        if (mmc_card_blockaddr(card))
 503                return 0;
 504
 505        mmc_card_claim_host(card);
 506        cmd.opcode = MMC_SET_BLOCKLEN;
 507        cmd.arg = 1 << md->block_bits;
 508        cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
 509        err = mmc_wait_for_cmd(card->host, &cmd, 5);
 510        mmc_card_release_host(card);
 511
 512        if (err) {
 513                printk(KERN_ERR "%s: unable to set block size to %d: %d\n",
 514                        md->disk->disk_name, cmd.arg, err);
 515                return -EINVAL;
 516        }
 517
 518        return 0;
 519}
 520
 521static int mmc_blk_probe(struct mmc_card *card)
 522{
 523        struct mmc_blk_data *md;
 524        int err;
 525
 526        /*
 527         * Check that the card supports the command class(es) we need.
 528         */
 529        if (!(card->csd.cmdclass & CCC_BLOCK_READ))
 530                return -ENODEV;
 531
 532        md = mmc_blk_alloc(card);
 533        if (IS_ERR(md))
 534                return PTR_ERR(md);
 535
 536        err = mmc_blk_set_blksize(md, card);
 537        if (err)
 538                goto out;
 539
 540        printk(KERN_INFO "%s: %s %s %lluKiB %s\n",
 541                md->disk->disk_name, mmc_card_id(card), mmc_card_name(card),
 542                (unsigned long long)(get_capacity(md->disk) >> 1),
 543                md->read_only ? "(ro)" : "");
 544
 545        mmc_set_drvdata(card, md);
 546        add_disk(md->disk);
 547        return 0;
 548
 549 out:
 550        mmc_blk_put(md);
 551
 552        return err;
 553}
 554
 555static void mmc_blk_remove(struct mmc_card *card)
 556{
 557        struct mmc_blk_data *md = mmc_get_drvdata(card);
 558
 559        if (md) {
 560                int devidx;
 561
 562                /* Stop new requests from getting into the queue */
 563                del_gendisk(md->disk);
 564
 565                /* Then flush out any already in there */
 566                mmc_cleanup_queue(&md->queue);
 567
 568                devidx = md->disk->first_minor >> MMC_SHIFT;
 569                __clear_bit(devidx, dev_use);
 570
 571                mmc_blk_put(md);
 572        }
 573        mmc_set_drvdata(card, NULL);
 574}
 575
 576#ifdef CONFIG_PM
 577static int mmc_blk_suspend(struct mmc_card *card, pm_message_t state)
 578{
 579        struct mmc_blk_data *md = mmc_get_drvdata(card);
 580
 581        if (md) {
 582                mmc_queue_suspend(&md->queue);
 583        }
 584        return 0;
 585}
 586
 587static int mmc_blk_resume(struct mmc_card *card)
 588{
 589        struct mmc_blk_data *md = mmc_get_drvdata(card);
 590
 591        if (md) {
 592                mmc_blk_set_blksize(md, card);
 593                mmc_queue_resume(&md->queue);
 594        }
 595        return 0;
 596}
 597#else
 598#define mmc_blk_suspend NULL
 599#define mmc_blk_resume  NULL
 600#endif
 601
 602static struct mmc_driver mmc_driver = {
 603        .drv            = {
 604                .name   = "mmcblk",
 605        },
 606        .probe          = mmc_blk_probe,
 607        .remove         = mmc_blk_remove,
 608        .suspend        = mmc_blk_suspend,
 609        .resume         = mmc_blk_resume,
 610};
 611
 612static int __init mmc_blk_init(void)
 613{
 614        int res = -ENOMEM;
 615
 616        res = register_blkdev(major, "mmc");
 617        if (res < 0) {
 618                printk(KERN_WARNING "Unable to get major %d for MMC media: %d\n",
 619                       major, res);
 620                goto out;
 621        }
 622        if (major == 0)
 623                major = res;
 624
 625        return mmc_register_driver(&mmc_driver);
 626
 627 out:
 628        return res;
 629}
 630
 631static void __exit mmc_blk_exit(void)
 632{
 633        mmc_unregister_driver(&mmc_driver);
 634        unregister_blkdev(major, "mmc");
 635}
 636
 637module_init(mmc_blk_init);
 638module_exit(mmc_blk_exit);
 639
 640MODULE_LICENSE("GPL");
 641MODULE_DESCRIPTION("Multimedia Card (MMC) block device driver");
 642
 643module_param(major, int, 0444);
 644MODULE_PARM_DESC(major, "specify the major device number for MMC block driver");
 645
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.