Add bounce_size under /sys/block/mmcblk0/bouncesz.
Support dynamic adjustment of bounce buffer in run-time (include mounted or
unmounted filesystem).

/sys/block/mmcblk0/bouncesz should be integer multiple of 512, the
value should be range from 4096 to 4194304.

Signed-off-by: Qiang Liu <qiang....@freescale.com>
---
 drivers/mmc/card/block.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index a1cb21f..649bfed 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -59,6 +59,9 @@ MODULE_ALIAS("mmc:block");
 #define INAND_CMD38_ARG_SECTRIM1 0x81
 #define INAND_CMD38_ARG_SECTRIM2 0x88

+#define MMC_MIN_QUEUE_BOUNCESZ 4096
+#define MMC_MAX_QUEUE_BOUNCESZ 4194304
+
 static DEFINE_MUTEX(block_mutex);

 /*
@@ -107,6 +110,7 @@ struct mmc_blk_data {
         */
        unsigned int    part_curr;
        struct device_attribute force_ro;
+       struct device_attribute bouncesz;
 };

 static DEFINE_MUTEX(open_lock);
@@ -1547,6 +1551,7 @@ static void mmc_blk_remove_req(struct mmc_blk_data *md)
                        del_gendisk(md->disk);
                }

+               device_remove_file(disk_to_dev(md->disk), &md->bouncesz);
                /* Then flush out any already in there */
                mmc_cleanup_queue(&md->queue);
                mmc_blk_put(md);
@@ -1609,6 +1614,33 @@ static const struct mmc_fixup blk_fixups[] =
        END_FIXUP
 };

+#ifdef CONFIG_MMC_BLOCK_BOUNCE
+static ssize_t mmc_bouncesz_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+        return sprintf(buf, "%u\n", mmc_queue_bouncesz);
+}
+
+static ssize_t mmc_bouncesz_store(struct device *dev,
+               struct device_attribute *attr,
+               const char *buf, size_t count)
+{
+       unsigned int bouncesz;
+       struct mmc_blk_data *md;
+
+       if ((sscanf(buf, "%d", &bouncesz) != 1) ||
+                       (bouncesz < MMC_MIN_QUEUE_BOUNCESZ) ||
+                       (bouncesz > MMC_MAX_QUEUE_BOUNCESZ) ||
+                       (bouncesz % 512 != 0))
+               return -EINVAL;
+
+       md = mmc_blk_get(dev_to_disk(dev));
+       mmc_reinit_bounce_queue(&md->queue, md->queue.card, bouncesz);
+       mmc_blk_put(md);
+       return mmc_queue_bouncesz;
+}
+#endif
+
 static int mmc_blk_probe(struct mmc_card *card)
 {
        struct mmc_blk_data *md, *part_md;
@@ -1648,6 +1680,18 @@ static int mmc_blk_probe(struct mmc_card *card)
                if (mmc_add_disk(part_md))
                        goto out;
        }
+
+#ifdef CONFIG_MMC_BLOCK_BOUNCE
+       md->bouncesz.show = mmc_bouncesz_show;
+       md->bouncesz.store = mmc_bouncesz_store;
+       sysfs_attr_init(&md->bouncesz.attr);
+       md->bouncesz.attr.name = "bouncesz";
+       md->bouncesz.attr.mode = S_IRUGO | S_IWUSR;
+       err = device_create_file(disk_to_dev(md->disk), &md->bouncesz);
+       if (err)
+               goto out;
+#endif
+
        return 0;

  out:
--
1.6.4


--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to