12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- From f17556101fcff8a54e52e6d88d24555308b9774f Mon Sep 17 00:00:00 2001
- From: Phil Elwell <phil@raspberrypi.org>
- Date: Fri, 20 May 2016 10:11:43 +0100
- Subject: [PATCH] mmc: Add card_quirks module parameter, log quirks
- Use mmc_block.card_quirks to override the quirks for all SD or MMC
- cards. The value is a bitfield using the bit positions defined in
- include/linux/mmc/card.h. If the module parameter is placed in the
- kernel command line (or bootargs) stored on the card then, assuming the
- device only has one SD card interface, the override effectively becomes
- card-specific.
- Signed-off-by: Phil Elwell <phil@raspberrypi.org>
- ---
- drivers/mmc/card/block.c | 28 +++++++++++++++++++++++++---
- 1 file changed, 25 insertions(+), 3 deletions(-)
- --- a/drivers/mmc/card/block.c
- +++ b/drivers/mmc/card/block.c
- @@ -134,6 +134,13 @@ enum {
- module_param(perdev_minors, int, 0444);
- MODULE_PARM_DESC(perdev_minors, "Minors numbers to allocate per device");
-
- +/*
- + * Allow quirks to be overridden for the current card
- + */
- +static char *card_quirks;
- +module_param(card_quirks, charp, 0644);
- +MODULE_PARM_DESC(card_quirks, "Force the use of the indicated quirks (a bitfield)");
- +
- static inline int mmc_blk_part_switch(struct mmc_card *card,
- struct mmc_blk_data *md);
- static int get_card_status(struct mmc_card *card, u32 *status, int retries);
- @@ -2565,6 +2572,7 @@ static int mmc_blk_probe(struct mmc_card
- {
- struct mmc_blk_data *md, *part_md;
- char cap_str[10];
- + char quirk_str[24];
-
- /*
- * Check that the card supports the command class(es) we need.
- @@ -2572,7 +2580,16 @@ static int mmc_blk_probe(struct mmc_card
- if (!(card->csd.cmdclass & CCC_BLOCK_READ))
- return -ENODEV;
-
- - mmc_fixup_device(card, blk_fixups);
- + if (card_quirks) {
- + unsigned long quirks;
- + if (kstrtoul(card_quirks, 0, &quirks) == 0)
- + card->quirks = (unsigned int)quirks;
- + else
- + pr_err("mmc_block: Invalid card_quirks parameter '%s'\n",
- + card_quirks);
- + }
- + else
- + mmc_fixup_device(card, blk_fixups);
-
- md = mmc_blk_alloc(card);
- if (IS_ERR(md))
- @@ -2580,9 +2597,14 @@ static int mmc_blk_probe(struct mmc_card
-
- string_get_size((u64)get_capacity(md->disk), 512, STRING_UNITS_2,
- cap_str, sizeof(cap_str));
- - pr_info("%s: %s %s %s %s\n",
- + if (card->quirks)
- + snprintf(quirk_str, sizeof(quirk_str),
- + " (quirks 0x%08x)", card->quirks);
- + else
- + quirk_str[0] = '\0';
- + pr_info("%s: %s %s %s%s%s\n",
- md->disk->disk_name, mmc_card_id(card), mmc_card_name(card),
- - cap_str, md->read_only ? "(ro)" : "");
- + cap_str, md->read_only ? " (ro)" : "", quirk_str);
-
- if (mmc_blk_alloc_parts(card, md))
- goto out;
|